فعالیت های هر روزه ای که به شما کمک میکند، توسعه دهنده بهتری باشید

هر روز بهتر شدن یکی از اهداف مهم توسعه دهندگان است. برای رسیدن به این هدف انجام آموزش ها و خواندن مستندات باید بخشی از کارهای روزمره شما باشد. شاید شما فکر کنید این موارد کافی نیست و به ایده های بیشتری نیاز دارید.

در این مقاله لیستی از فعالیت های جانبی آورده شده است که میتواند در راه تبدیل شدن به یک توسعه دهنده بهتر به شما کمک کند. پس تا پایان مقاله همراه ما باشید.

فعالیت هایی که میتوانید از همین امروز شروع کنید

میخواهیم از این نکته شروع کنیم که بهتر است به طور موازی روی چندین فعالیت کار کنیم. انجام یک فعالیت یکسان برای مدت طولانی می تواند خسته کننده باشد، که به نظر من خود این باعث میشود بهره وری شما پایین بیاید. جابه جایی میان فعالیت ها و پروژه های مختلف به شما امکان می دهد که هنگام خسته شدن، کاری دیگری انجام دهید.

۱. چالش های کدنویسی الگوریتم ها

انجام یک چالش کدنویسی الگوریتم ها یکی از کارهای مهمی است که میتوانید انجام دهید. مهم نیست که در چه سطحی هستید، همیشه چالش‌هایی برای مقابله با مهارت‌های شما وجود دارد. توصیه من این است که با همکاران خود مشورت کنید.

من این کار را با همکارانم در شرکت قبلی ام انجام دادم. صبح ها، ما یک چالش را انتخاب میکردیم و برای حل آن  ۱۵ دقیقه فکر میکردیم. پس از آن کدهای همدیگر را بررسی میکردیم و کد بهینه تر را انتخاب میکردیم. این چالش ها همیشه بحث های جذابی را برای ما به وجود می آورد.

شما می‌توانید به طور متناوب بین چالش‌های ساده و پروژه‌های پیچیده ‌تری قرار بگیرید. هدف از این چالش‌ها، رسیدن به راه‌حل بهینه است. برای آنهایی که دشوار هستند، اگر به جواب نرسید، حداقل تلاش خود را انجام داده اید.

۲. در پروژه‌های منبع باز مشارکت کنید

من مطمئنم که همیشه یک پروژه منبع باز وجود دارد که شما آن را دوست داشته باشید. شما میتوانید برای بالابردن توانایی های خود در آنها مشارکت کنید و از کدهای دیگران مطلع شده و ویژگی های پروژه را ارتقا دهید.

فواید بسیاری برای این کار وجود دارد، از جمله اینکه با پروژه های واقعی آشنا میشوید. علاوه بر این ، شما با توسعه دهندگانی کار خواهید کرد که آنها را نمیشناسید، ولی میتوانید با آنها ارتباط داشته و تجربه های ارزشمندی را بدست آورید. اگر مشارکت در پروژه های منبع باز ترسناک به نظر می‌رسد، نگران نباشید – راه‌حل هایی در این زمینه وجود دارد :

  • پروژه First Contributions با هدف ارائه راهنمایی به مبتدیانی که می خواهند اولین مشارکت خود را انجام دهند، ایجاد شده است.
  • GitHub Help Wanted برنامه ای است که به شما امکان می دهد تا پروژه ها را براساس میزان دشواری فیلتر کنید تا به پروژه مورد نظر دست پیدا کنید. معمولا پروژه هایی که برای افراد مبتدی آسان تر است با برچسب های easy نشان گذاری میشوند.

۳. یک پکیج ایجاد کنید

ایجاد یک پکیج، یک روش دیگر برای مشارکت در پروژه های منبع باز است. توسعه دهندگان بسیاری پکیج هایی را در اختیار عموم قرار میدهند که میتواند بسیار مفید باشد. پس چرا شما این کار را انجام ندهید. من چندی پیش اولین پروژه منبع باز خود را در گیت هاب به اشتراک گذاشتم، این پروژه مربوط به محصولی بود که در شرکت در حال کار روی آن بودیم.

در حالی که سرکار نهایت تلاش خود را انجام داده ام که پروژه بدون باگ باشد، قرار دادن آن در میان بسته های npm باعث شد که وارسی بیشتری در کدهای انجام دهم.. زیرا در هر حال این کدها قرار است که در پروژه های دیگران نیز استفاده شود.

کار دیگری که انجام دادم تهیه مستندات برای هر خط کدی بود که نوشته بودم. این کار مشارکت دیگران در بهینه کردن کدهای مرا آسان تر کرد. من از میزان دانلودی که این بسته داشته ام بسیار راضی ام و امیدوارم بتوانم پروژهای بیشتری را به اشتراک بگذارم.

۴. محصول خود را راه‌اندازی کنید

این کار یک فعالیت مهم و خوب برای توسعه دهندگان و افراد کارآفرین است. ما توسعه دهندگان می‌توانیم تقریبا ً هرچیزی را که می‌خواهیم بسازیم. من شخصا ً دوست دارم یک روز یک محصول موفق را راه‌اندازی کنم. احتمالا این مهترین کاری است که میتوانید انجام دهید، کار بر روی یک پروژه واقعی همه چیز را به شما آموزش خواهد داد. در زمان تولید یک محصول باید موارد زیر را در نظر بگیرید :

  • محصول شما باید چه ویژگی هایی داشته باشد و شما باید چطور آنها را توسعه دهید؟
  • چطور باید محصول خود را بازاریابی کنید و برای آن مشتری پیدا کنید؟

این کار تجربه بسیار ارزشمندی را در اختیار شما قرار میدهد که می‌توانید بدون هیچ ریسکی از آن بهره‌مند شوید. من عاشق کار روی محصولات در زمان های فراغت خود هستم . اگرچه همه آن‌ها تا الان شکست‌خورده اند، اما به واسطه آنها چیزهای زیادی یادگرفته ام. هر وقت که روی یک محصول کار می‌کنم، انقدر هیجان‌زده هستم که می‌توانم ۲۴ ساعت روز را روی آن کار کنم.

۵. سعی کنید دانش خود را با نوشتن مقالات در اختیار دیگران قرار دهد

این کار بیشترین زمان را از من میگیرد. نمی‌دانید چقدر سخت است که دانش خود را به اشتراک بگذارید. زمان زیادی طول می‌کشد تا یک چیز را به شیوه‌ای جالب بنویسید و دوباره آن را بررسی کنید تا مطمئن شوید که اطلاعات نادرست را به اشتراک نگذارید. باید مطمئن شوید که خوانندگان از چیزی که نوشته اید راضی هستند. نوشتن مقالات و یاددادن به دیگران میتواند مطالب را در ذهن شما ثبیت کند.

۶. سعی کنید یکی از مطالبی را که یادگرفته اید به صورت ویدویی آموزش دهید

توانایی توضیح آنچه ما هنگام انجام برنامه نویسی انجام می دهیم یک مهارت فوق العاده است. به عنوان یک توسعه دهنده، همه ما در مصاحبه های فنی بوده ایم و از ما خواسته شده است كه مشكلی را در تخته سفید یا روی یک کاغذ حل کنیم.
باهوش بودن بسیار جالب است اما اگر بتوانید در مورد آنچه انجام میدهید توضیح دهید حتی بهتر است! توانایی توصیف نحوه حل مسئله می تواند رزومه شما را در بالای دیگران قرار دهد. یکی از کارهای مهم در این زمینه ضبط ویدئوهای آموزشی است که بسیار ارزشمند است..

منبع : لرن سورس

نوشته فعالیت های هر روزه ای که به شما کمک میکند، توسعه دهنده بهتری باشید اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

مقاله ی nginx

سلام به همگی

خب کار ما شروع شد(((:

اولین کار ما یه مقاله خیلی خیلی باحال در مورد nginx هستش که به کمک دوست خوبم بردیا اکبری اونو نوشتیم و خیلی خوش حال میشیم به پیچ زیر برید و اونو مطالعه کنید و نظرتو بگید!

مرسی از همه!

https://vrgl.ir/BSIHC

نوشته مقاله ی nginx اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

راهنمای نصب Git برای مبتدیان

Git by Linus Torvalds

گیت یک سیستم کنترل نسخه برای نظارت بر روی تغییرات اعمال شده در طول توسعه نرم افزار می‌باشد. این سیستم برای هماهنگی برنامه نویس ها طراحی شده است اما می‌توان از آن برای دنبال کردن تغییرات در هر گونه نوع فایل یا پروژه ای استفاده کرد. هدف گیت فراهم کردن سرعت (Speed)، یکپارچگی داده (Data integrity)، محیط‌ کار غیرخطی (Non-linear) و توزیع شده (Distributed) می باشد.

پیشنهاد می‌شود که ابتدا برنامه ویژال استودیو کُد را نصب کنید:

https://vrgl.ir/ZN61w

در ادامه به نحوه نصب گیت می پردازیم. برای دانلود به وبسایت زیر مراجعه کنید:

https://git-scm.com/

ظاهر وب سایت git-scm

بر روی Download 2.27.0 for Windows کلیک کنید. در زمان نوشتن این مطلب 2.27 آخرین نسخه منتشر شده می‌باشد و کسانی که در آینده این مطلب را مطالعه می‌کنند نسخه جدیدتری را دانلود خواهند کرد.

پیام دانلود در مرورگر Edge

صبر کنید تا پیام دانلود نمایان شود و پس از دانلود آن را اجرا کنید.

توافق نامه

با انتخاب دکمه Next توافق نامه را بپذیرید.

محل نصب

در این صفحه می توانید محل نصب را تغییر دهید. پیشنهاد می شود محل نصب را تغییر ندهید.

جزئیات نصب

پیشنهاد می‌شود مطابق عکس موارد را انتخاب کنید. توضیح هرکدام:

  • گزینه Additional icons بر روی صفحه دسکتاپ شما یک میانبر می سازد.
  • گزینه Windows Explorer integration به شما این امکان را می‌دهد تا با کلیک راست بتوانید Git را در مسیر جاری اجرا کنید. Git Bash محیط تحت خط‌ فرمان و Git GUI محیط گرافیکی می‌باشد.
  • گزینه Git LFS یا Large File Support برای کار کردن با فایل های حجیم طراحی شده است و از دانلود چندباره آن ها با جایگزینی پوینتر جلوگیری می‌کند.
  • گزینه Associate .git* configuration files with the default text editor قابلیت شناسایی پسوند git و باز کردن آن با ویرایشگر پیش فرض (مانند VSCode) را به سیستم عامل شناسایی می‌کند. تنظیمات این گزینه جلوتر توضیح داده خواهد شد.
  • گزینه Associate .sh files to be run with Bash قابلیت شناسایی پسوند sh (اسکریپت Unix Shell) با محیط خط فرمان Bash را به سیستم عامل شناسایی می‌کند. اگر مایل هستید از خط فرمان های Bash دیگری مانند Cygwin به جای MSYS تعبیه شده استفاده کنید این گزینه را انتخاب نکنید.
  • گزینه Use a TrueType font in all console windows پشتیبانی بهتر از کاراکتر های Unicode در محیط خط فرمان را فراهم می‌کند. استفاده از این قابلیت لزومی ندارد.
  • گزینه Check daily for Git for Windows updates بطور روزانه بروزرسانی های گیت را اعلام می‌کند.
نام پوشه منوی استارت

نام پوشه برنامه در منوی استارت ویندوز را می توانید تعیین کنید. این صفحه حائز اهمیت نیست و می توانید با انتخاب Next از آن عبور کنید.

انتخاب ویرایشگر

در این بخش ویرایشگر برای git انتخاب می‌شود. همانطور که مشاهده می‌کنید انتخاب پیش فرض Vim می‌باشد. Vim یک ویرایشگر محبوب در ترمینال است اما کار با آن نسبت به ویرایشگر های دیگر سخت بوده و برای افراد که تجربه کار با آن را ندارند، پیشنهاد نمی‌شود.

انتخاب Visual Studio Code

پس مطابق تصویر Use Visual Studio Code as Git’s default editor را انتخاب و سپس بر روی Next کلیک کنید. اگر مراحل نصب VSCode را در هین نصب گیت انجام داده‌اید باید Git Setup را کاملا ببندید و مراحل نصب را از ابتدا تکرار کنید. در صورت نیاز، ویراشگر پیش فرض از طریق خط فرمان قابل تغییر است. مثال تغییر به ویرایشگر ++Notepad:

$ git config --global core.editor &quot'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin&quot
تعریف PATH

مقادیر PATH به شما این امکان را می‌دهند که بتوانید به ابزار مورد نیاز در سیستم عامل دسترسی داشته باشید مانند استفاده از دستور git در PowerShell یا Command Prompt که با انتخاب مطابق تصویر امکان پذیر است. توضیح هر مورد:

  • گزینه Use Git from Git Bash Only: تغییری در آدرس PATH ایجاد نخواهد شد و ابزار git تنها از طریق Git Bash قابل دسترس خواهد بود.
  • گزینه Git from the command line and also from 3rd-party software: دسترسی به git از هر برنامه سیستم عامل علاوه بر Git Bash فراهم خواهد شد.
  • گزینه Use Git and optional Unix tools from the Command Prompt: تمام ابزار Unix و دستورات git از خط فرمان ویندوز قابل دسترس بوده و جایگزین ابزار های سیستم عامل خواهند شد.
پروتکل امن لایه انتقال

برای اتصال HTTPS از کتابخانه OpenSSL استفاده کنید.

تنظیم autocrlf

این بخش برای مشخص کردن کنترل کاراکتر و نوع پایان یافتن دستورات در فایل های متنی است. سیستم عامل ویندوز از CRLF (مخفف Carriage Return Line Feed) استفاده می‌کند پس در نتیجه گزینه Checkout Windows-style, commit Unix-style line ending پیشنهاد می‌شود.

انتخاب خط فرمان اجرایی

سپس نوبت به انتخاب خط فرمان می‌رسد. گزینه اول برای اجرای Git Bash به همراه یک ترمینال شبیه سازی شده یونیکس (MinGW) و گزینه دوم برای اجرا Git Bash به داخل خط فرمان ویندوز (cmd) است. استفاده از گزینه دوم مخصوصا در نسخه های قدیمی‌تر ویندوز توصیه نمی‌شود. گزینه Use MinTTY را انتخاب کنید.

تنظیم git pull

یکی از دستورات git عمل pull برای فراخوانی کد منبع از گیت می‌باشد که با آن آشنا خواهید شد. در این بخش رفتار عمل pull مشخص می‌شود که بطور پیش فرض fast-forward or merge است. در نسخه های قدیمی‌تر Git Setup این بخش قابل تنظیم نیست.

تنظیمات ویژگی های اضافی

امکانات دیگر git را در این بخش برای نصب فعال کنید. ویژگی استفاده از symbolic link ها کاربرد زیادی ندارد.

تنظیمات ویژگی های آزمایشی

بخش تنظیمات ویژگی های آزمایشی در هر نسخه گیت متفاوت است اما استفاده از آن ها لزومی ندارد. برای ادامه گزینه Install را انتخاب کنید.

در حال نصب

صبر کنید تا نصب به پایان برسد.

پایان نصب

گیت با موفقیت بر روی سیستم شما نصب شده است. با انتخاب Launch Git Bash و سپس Next آن را اجرا کنید.

گیت Bash

با اجرای Git Bash پنجره‌ای مانند محیط ترمینال لینوکس نمایان خواهد شد که نام کاربر به همراه @ و سپس نام سیستم را نمایش می‌دهد. گیت آماده استفاده می‌باشد.


برای استفاده از گیت، علاوه بر git bash نرم افزار های زیادی وجود دارد، در ادامه با شیوه استفاده از دستورات git در vscode آشنا خواهید شد.

اجرای vscode

برنامه Visual Studio Code را اجرا کنید.

Ctrl + Shift + `

از سربرگ Terminal گزینه New Terminal یک ترمینال جدید باز کنید.

git version

دستور زیر را وارد کنید:

git version

این دستور نسخه فعلی نصب شده گیت را نمایش می‌دهد. برای بروزرسانی گیت می‌توانید از دستور زیر استفاده کنید:

git update-git-for-windows
git update

در صورت بروز بودن پیام Up to date و در غیر این صورت پیام Download and install ظاهر شده و با وارد کردن کاراکتر Y مراحل دانلود آغاز می‌شود.

Up to date

پس از اتمام دانلود، دیالوگ Git Setup اجرا و مراحل نصب گیت دوباره تکرار می‌شود.


تبریک می‌گویم گیت آماده صرفه جویی در زمان شما است! 🙌

نوشته راهنمای نصب Git برای مبتدیان اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

حمله Arp Cache Poisoning با استفاده Python

شرح و پیاده سازی حمله Arp Cache Poisoning با استفاده از زبان برنامه نویسی Python

  • این حمله با استفاده از ماژول Scapy در پایتون انجام می شود

نحوه نصب Scapy:

sudo pip install scapy 

نحوه اجرای آن به این صورت است که کافیست در Terminal خود کلمه scapy را وارد کنید تا مفسر آن اجرا شود

همچنین به شکل زیر هم میتوانید آن را نصب و اجرا کنید

git clone https://github.com/secdev/scapy
cd scapy
sudo ./run_scapy

ویدیو این آموزش در آپارات از طریق لینک زیرقابل تماشا می‌باشد

http://www.aparat.com/v/qT21b

نوشته حمله Arp Cache Poisoning با استفاده Python اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

که عشق آسان نمود اول، ولی افتاد مشکل‌ها

یکی از اولین توانایی‌هایی که یک برنامه‌نویس فرا می‌گیرد، توانایی حل مساله است. از حل مسایل ساده تا مسایل بسیار پیچیده. اما چیزی که در این‌جا می‌خوام مطرح کنم حل مسایل بسیار ساده است که در نگاه اول، بسیار بدیهی و آسان به نظر می‌رسند ولی در عمل و در شرایط خاص، حل آن‌ها بسیار سخت و مشکل خواهد بود و برنامه‌نویسان باید بتوانند از پس این مسایل بربیان.

منظورم از مسایل ساده، مسایلی از این دست است:

  • بررسی عضویت یک عنصر در مجموعه داده (membership)، به عنوان مثال، پاسخ به این سوال که آیا یک عدد در یک آرایه وجود داره یا نداره؟
  • شمارش تعداد عناصر متمایز در یک مجموعه داده (cardinality)، به عنوان مثال، در یک آرایه چند نوع عدد متفاوت وجود داره
  • محاسبه تعداد دفعات تکرار یک عنصر در یک مجموعه، یا شناسایی عناصر پرتکرار (frequency)، به عنوان مثال عدد ۴۲ چندبار در یک آرایه تکرار شده

و یا مسایل ساده‌ی دیگری از این جنس.

حل این مسایل بسیار ساده در بعضی شرایط بسیار سخت می‌شود.

  1. حجم (Volume) بسیار زیاد داده‌ها
  2. سرعت (Velocity) تولید و پردازش داده‌ها
  3. تنوع (Variety) و گوناگونی داده‌ها

در حل مسایلِ دنیای واقعی، ممکن است تمامی این شرایط یا بعضی از آن‌ها وجود داشته باشند و وجود همین شرایط باعث سخت شدن حل مسایل ساده‌ای خواهد شد که گفتم. وجود این شرایط همان چیزیه که ما با عنوان Big Data یا کلان داده می‌شناسیم.

داده‌ها از همه جا سرازیر می‌شوند، از شبکه‌های مجازی، از سنسورها، از تراکنش‌های مالی و …. از طرفی هم شرکت‌ها می‌خواهند که از داده‌ها سر در بیارن و از آن‌ها ارزش تولید کنند. این عوامل باعث رشد بسیار سریعِ بازارِ نرم‌افزارهای مرتبط با کلان داده شده است و به عنوان یک برنامه‌نویس در این بازار باید الگوریتم‌ها و داده‌ساختارهای مورد نیاز برای حل این مسایل را فرا بگیریم.

مرورگر امن

فرض کنید برنامه‌نویس یک مرورگر هستم، مثلا گوگل کروم! و قراره یک امکان به مرورگر اضافه کنم که از ورود به سایت‌های مشکوک جلوگیری کنه. به عبارت دیگه یک لیست چند میلیونی (معمولا بیش از ۲ میلیون) از آدرس‌های مربوط به این سایت‌ها دارم و برای هر آدرسی که کاربر در نوار آدرس مرورگر وارد می‌کنه، برنامه باید در این لیست چند میلیونی جستجو کنه و در صورتی که در این لیست وجود داشته باشد به کاربر اخطار بده. آیا برای این کار می‌توانم تمامی آدرس‌ها را در حافظه نگهداری کنم و به ازای هر درخواست در بین آن‌ها جستجو کنم؟

یا مثلا برای همین مرورگر، لیستی از تمامی رمزعبورهای لو رفته دارم (معمولا در حد چند میلیارد) و می‌خواهم در زمان‌هایی که کاربر، در سایتی رمز عبور وارد می‌کند، با این لیست مقایسه شود و در صورت استفاده از این رمز عبورها به کاربر اخطار داده شود. آیا برای این کار می‌توانم تمام رمزعبورها را در حافظه نگهداری کنم و در هر ورودِ رمزعبوری، در این لیست میلیاردی جستجو کنم؟ اصلا کار درستی است که پسور‌دها به صورت خام ذخیره شوند؟

پیشنهادها

فرض کنید که برنامه نویس سایت Medium یا ویرگول هستم! و قرار است که به هر کاربر چندین مقاله برای مطالعه پیشنهاد بدم، ولی می‌خوام مطمئن باشم که کاربر این مقاله را قبلا مطالعه نکرده باشه. به عبارت دیگر بعد از این‌که به کمک الگوریتم‌های توصیه‌گر، مجموعه‌ای از مقاله‌ها را برای کاربر ایجاد کردم، مقاله‌هایی که قبلا مطالعه کرده را از آن حذف کنم. بر اساس توئیت ویرگول در سال ۹۸ بیش از ۱۸ میلیون کاربر از ویرگول استفاده کرده‌اند. آیا برای این کار می‌توانم مقاله‌هایی که هر کاربر مطالعه کرده را در دیتابیس ذخیره کنم و برای حذف مقاله‌های قبلا خوانده شده از این دیتابیس استفاده کنم؟

توزیع محتوا

فرض کنید من برنامه نویس Akamai یا ابرآروان هستم! و قرار است که الگوریتمی برای مسیردهی درخواست‌ها ایجاد کنم به طوری که درخواست‌ها به کَش سروری مسیردهی شوند که پاسخ این درخواست در آن وجود دارد، و برای این کار باید تمامی کَش سرورها از اطلاعات کَش شده در دیگر کَش سرورها اطلاع داشته باشند (Cache Sharing)، آیا درست است که برای این کار، هر کَش سرور، آدرس درخواست‌هایی را که کَش کرده است را به تمامی کَش‌سرورها ارسال کند؟

سهام عدالت

فرض کنید من برنامه نویس سامانه سهام عدالت هستم!! و قرار است که وب‌سایتی راه‌اندازی کنم که ۸۰ میلیون ایرانی جستجو کنند که آیا سهام عدالت دارند یا نه. آیا راه درستیه که به ازای هر درخواست من در دیتابیس چند ده میلیونی دارندگان سهام عدالت جستجو کنم؟

فایروال

فرض کنید من برنامه نویس Fortigate یا یک شرکت ایرانی در این زمینه هستم! و قرار است بر روی یک پهنای باند ۱۰ گیگابیت در ثانیه، تمامی بسته‌ها (Packets) را بررسی کنم و لیستی از آی‌پی‌های پرتکرار بسازم. آیا می‌توانم به ازای هر بسته، در لیست آی‌پی‌ها جستجو کنم و شمارنده این آی‌پی را افزایش بدهم و در انتها با مرتب کردن تمامی این لیست، آی‌پی‌های پرتکرار را بسازم؟

توییتر

فرض کنید من برنامه نویس توییتر هستم! و قرار است قسمت هشتگ‌های ترند شده را بسازم. به عبارت دیگر به ازای هر توییتی که می‌شود، هشتگ‌ها را استخراج کنم و در لیست احتمالا چند میلیاردی آن هشتگ را پیدا کنم و شمارنده‌اش را افزایش بدهم و هر چند دقیقه این لیست را مرتب کنم و هشتگ‌های ترند شده را بسازم. البته قرار است که این کار را به تفکیک برای ۱۰۰ کشور مختلط هم انجام دهم! آیا این راه درستی است؟

خوب فکر کنم مثال‌ها کافی هستند، برای اینکه نشان دهند که حل مسایل راحت در تولید سرویس‌ها و محصولات واقعی به راحتی امکان پذیر نیستند.

داده‌ساختارهای احتمالاتی

یکی از راه‌کارها برای حل این مسایل در دنیای واقعی استفاده از داده‌ساختارهای احتمالاتی است. داده‌ساختارهایی که برخی از آن‌ها در یکی دو سال گذشته معرفی شده‌اند و صد البته در سال‌های آینده می‌توانیم منتظر داده‌ساختارهای بهتری هم باشیم.

داده ساختارهای احتمالاتی، مانند دیگر داده‌ساختارها جواب قطعی نمی‌دهند و با یک احتمال قابل محاسبه‌ای می‌توان خطاهای احتمالی را تخمین زد و خوشبختانه خطاها و کمبودهای این داده‌ساختارها به واسطه حافظه کمی که اشغال می‌کنند، زمان پرس‌وجوی ثابتی که دارند و مقیاس پذیری آن‌ها قابل چشم پوشی هستند.

به عنوان مثال به کمک فیلتر کوکو (Cuckoo Filter) که یک داده‌ساختار احتمالاتی برای حل مساله عضویت (membership) در یک مجموعه است، برای پردازش یک میلیارد اِلِمان مجزا به کمی کمتر از یک گیگابایت حافظه نیاز دارد، پیچیدگی زمانی حذف و اضافه و جستجو O(1)‎ است.

چشم‌پوشی

آیا خطا در داده‌ساختار قابل چشم پوشی است؟ در بسیاری از موارد بله، قابل چشم پوشی‌است، به عنوان نمونه داده‌ساختارهایی که برای حل مساله عضویت وجود دارند، مانند فیلتر کوکو، یا فیلتر بلوم؛ دارای خطای «مثبت کاذب» (False-Positive) هستند ولی خطای «منفی کاذب» ندارند.

به عنوان مثال، برای حل رمزعبورهای لو رفته، می‌توانیم از فیلتر بلوم استفاده کنیم به صورتی که فقط ۱ درصد خطای «مثبت کاذب» داشته باشد. یعنی ۱ درصد احتمال دارد رمزعبوری را لو رفته حساب کند در صورتی که رمزعبور امنی است و هیچ خطایی در شناسایی رمزعبوری که لو رفته است یعنی خطای «منفی کاذب» ندارد و در یک مرورگر این خطا قابل چشم‌پوشی است.

در داده‌ساختارهای احتمالاتی می‌توان، احتمال وقوع خطا را با بالابردن فضای اشغالی و بیشتر کردن پردازش کمتر کرد و به عبارتی قابل تنظیم است. به عنوان نمونه می‌توانید ماشین حساب فیلتر بلوم را ببینید.

درهم‌سازی

پایه و اساس تمامی داده‌ساختارهای احتمالاتی توابع درهم‌ساز یا همان توابع هَش (Hash Functions) است.

توابع درهم‌سازی در دو دسته قرار می‌گیرند:

  1. توابع درهم‌ساز رمزنگارانه (Cryptographic Hash Functions)
  2. توابع درهم‌ساز غیررمزنگارانه

دسته اول برای استفاده در حوزه امنیت و رمزنگاری کاربرد دارند و معمولا به خاطر ویژگی‌هایی که دارند سرعت پردازشی کمتری به نسبت توابع درهم‌ساز دسته دوم دارند. به عنوان مثال SHA1-32 توانایی پردازش تقریبا ۳۰۰ مگابایت در ثانیه را دارد ولی MurMurHash3 توانایی پردازش نزدیک به ۳ گیگابایت در ثانیه، یا xxHash قدرت پردازشی نزدیک به 5.5 گیگابایت در ثانیه را دارد.

همانطور که حدس زده‌اید، در داده‌ساختارهای احتمالاتی از توابع درهم‌ساز غیر رمزنگارانه استفاده می‌شود که نرخ برخورد ( Collision Rate) کم و سرعت بسیار بالا دارند.

پیاده‌سازی

یکی از پیاده‌سازی‌های داده‌ساختارهای احتمالاتی که البته متعلق به نویسنده همین مطلب هم هست 🙂 در گیت‌هاب (github.com/zaghaghi/pdstl) قابل دسترس است. البته پیاده‌سازی‌های دیگری نیز به صورت متن‌باز وجود دارد ولی سعی شده و خواهد شد که در این پیاده‌سازی تقریبا بیشتر داده‌ساختارهای احتمالاتی به صورت یک‌جا و یک شکل پیاده‌سازی شود.

به عنوان مثال برای استفاده از فیلتر بلوم (Bloom Filter) به کمک کتابخانه PDSTL می‌توان به شکل زیر عمل کرد.

#include <membership/bloom_filter.h>
#include <vector>
#include <string>
#include <iostream>

int main() {
    // Read all urls from file or database into urls 
    std::vector<std::string> urls;
    // Define bloom filter with 11 hash functions and 16M memory bits
    bloom_filter<11, 16000000> url_bloom_filter;
    std::for_each(urls.begin(), urls.end(), [&url_bloom_filter](auto& item) {
        // Insert items into bloom filter
        url_bloom_filter.insert(item);
    });

    // Check that bloom filter contains an item or not
    if (url_bloom_filter.contains(&quothttps://gmail.com&quot)) {
        std::cout << &quotFOUND!!!!!&quot << std::endl;
    } else {
        std::cout << &quotNOT FOUND&quot << std::endl;
    }
}

بیشتر بخوانیم

یکی از مراجعی که برای خواندن در مورد این داده‌ساختارها وجود دارد، ویکی‌پدیا است. همچنین بهترین مرجع خود مقالات داده‌ساختارهاست و البته کتابی در سال ۲۰۱۹ منتشر شده که این داده‌ساختارها را یکجا جمع‌آوری کرده:

Probabilistic Data Structures and Algorithms for Big Data Applications by Andrii Gakhov, 2019, ISBN: 978-3748190486 (paperback) ASIN: B07MYKTY8W (e-book)

نوشته که عشق آسان نمود اول، ولی افتاد مشکل‌ها اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

ارتقا رابط کاربری با کمک طرح های آماده

تا حالا در مورد طراحی رابط کاربری مطلبی ننوشته بودم و الان بنظرم فرصت خوبی میاد تا یه مطلب در این باره بنویسم و تجربه خودم رو با شما در میون بزارم.

من قبلا برای کنترل ListBox یه استایل نوشته بودم که یجورایی مدرن و به سبک ویندوز 10 بود به این صورت که وقتی ایتم انتخاب میشد کنارش یه لیبل عمودی رنگی نمایش داده میشد اوایل که این استایل رو نوشتم خیلی جذاب بود و کلی حال کردم😁

استایلی که باهاش قبلا حال میکردم

اما خب زیاد بدلم ننشست و منم دیگه فرصت نکردم که ارتقاش بدم تا اینکه امروز صب یه طرح چینی پیدا کردم که خیلی نظرم رو جلب کرد

طرح چینی

و توی نیم ساعت استایلش رو پیاده کردم.

استایلی که جدیدا باهاش حال میکنم

البته یسری اپشن هارو خودم اضافه کردم مثل لیبل new، استایل جدید مزایای خیلی زیادی داره، پخته تره، به این زودی ها کاربر زده نمیشه، تجربه کاربریش بهتره و رنگ بندی بهتری داره.

من برای پیاده سازی این استایل کار خاصی نکردم به جز چند مورد که باهم بررسی میکنیم:

  • استفاده از رنگ مناسب که چشم رو اذیت و خسته نکنه
  • استفاده از رنگ های کمتر (منظور تعداد رنگ ها) و ترکیب مناسب رنگ ها
  • استفاده مناسب از فاصله بین ایتم ها (چپ، بالا، راست، پایین)
  • گرد کردن گوشه ها
  • تغییر اندازه ارتفاع ایتم

با تغییر همین 5 مورد طرح من زمین تا اسمون فرق کرد و حالت بهتری به خودش گرفت. طرح های آماده نقطه شروع خیلی خوبی هستن و میتونن باعث بشن که خلاقیت شما فعال بشه.

امیدوارم که مفید بوده باشه اگر تجربه ای مشابه دارید در نظرات برام بنویسید.

نوشته ارتقا رابط کاربری با کمک طرح های آماده اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

یک دانشجو ترم ۲ در قرنطینه ۲

اینروزا که دانشگاه نیست واقعا احساس میکنم دارم عقب میمونم هر چند توی این دوران بازدهی بیشتری داشتم و بیشتر وقت گذاشتم واسه درسا و کارام.

انگار اون توی جَو بودن واقعا لازمه واسم. دلم میخواد از فضای فرزند خونه بودن باز فاصله بگیرم و برم بوشهر و دانشجویی زندگی کنم. دیروز واسه بردن وسایلام از خوابگاه رفتم و دیدم وقتی با دوستام اونجام چقدر همه چیز فرق میکنه! چقدر زندگی مستقل بهم ساخته! شاید یه عده میگن بخاطر آزادی و این است ولی احتمالا بدونین هرجا باشی میتونی کار که بخوای رو بکنی فقط روشش فرق داره ولی خب من آدمش نیستم.

یه جورایی خوشحالم که تونستم تو زندگیم مستقل زندگی کردنو تجربه کنم و عاشقش بشم. اینکه تو اون مدت نه میتونی به کسی اعتماد کنی و نه غرورت میزاره جا بزنی این سختیا همش باعش میشه قوی بشی. خودتو بشناسی و بفهمی آره یه کارایی ازت برمیاد که قبلا جرعت فکر کردن بهش رو هم نداشتی!اینکه خودت به آرزوهات برسی واسش قدم برداری نه اینکه فقط بهش فکر کنی واسش تلاش کنی !

خانوادم با شهر دیگه موافق نبودن ولی بنظرم همه خانواده ها بهتره موافقت کنن چون چشمای آدم باز میشه.دید آدم عوض میشه.

دانشگاهم خیلی تاثیر داره تو این موضوع اینکه آدمای جدیدی میشناسی و حرکت و رشد هم سن و سالان میبینی و تو هم ترغیب میشی.

این روزا مشغولم زیاده و خوشحالم.خوشحالن که دارم تلاش میکنم خوشحالم که افسرده و بیحال ننشستم بگم این چه زندگی ایه.

هفته ای دوتا مقاله مینویسم واسه یه سایت و دارم سعی میکنم توی کارای انجمن علمی رشتم کمک کنم.امتحانامم میدم و درسام و کلاسامم میرم.

دغدغه اصلیم پروژه جاواست ، میگم شاید لازم باشه حذفش کنم و بهتر بخونمش ولی هنوز مطمعن نیستم. انگیزمو از حرکت کردن بدست آوردم. راکد نمونین تو مسیری که دوسدارین حرکت کنین و از حرکتتون لذت ببرین.

نوشته یک دانشجو ترم ۲ در قرنطینه ۲ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

پیروزی به سبک اسکرام‌بازها

اگر هر اسپرینت را یک نبرد کوچک در نظر بگیریم، پس می‌توان گفت که حاصل پیروزی در این نبردهای کوچک، محصولی که در نهایت از طرف استارت‌آپ ما به بازار می‌رسد.

برای اینکه بتوانید در رقابت با بازیگران اصلی بازار پیروز شوید، به یک نقشه راه احتیاج دارید.

در این مسیر اسکرام می‌تواند به شما کمک زیادی کند.

رویدادهای اسکرام به‌گونه‌ای طرح‌ریزی شده که می‌تواند همیشه و در هر نقطه‌ای شما را به مسیر اصلی برگرداند.

برای اینکه بیشتر با این نقشه راه پیروزی آشنا شوید، از اولین رویداد اسکرام، یعنی پلنینگ شروع می‌کنیم.

پلنینگ یا رویداد برنامه‌ریزی اسپرینت «Sprint Planning» یکی از رویدادهای اصلی اسکرام است.

چهار رویداد اصلی عبارتند از:

اسکرام روزانه «Daily Scrum»

بازنگری «Sprint Review»

پلنینگ «Sprint Planning»

رترو «Sprint Retrospective»

پلنینگ، رویداد شروع اسپرینت است. جایی که بک‌لاگ در آن بررسی و اولویت‌بندی شده و اعضای تیم برای چگونگی انجام آن برنامه‌ریزی می‌کنند.

هدف پلنینگ این است که تیم را برای حرکت به سمت هدفی مشترک و از پیش تعیین شده آماده کند.

براساس راهنمای رسمی اسکرام، مدت زمان رویداد پلنینگ از روش زیر قابل محاسبه است:

حداکثر زمان پلنینگ = ۲ ساعت * تعداد هفته‌های اسپرینت

مثلا ۲*۲ =۴ ساعت برای یک اسپرینت دو هفته‌ای

البته در کنار این فرمول مواردی مانند میزان بلوغ تیم و وضعیت بک‌لاگ نیز در مدت زمان پلنینگ اثر دارد.

اگر تیم به بلوغ کامل رسیده و بک‌لاگ نیز در شرایط ایده‌آل قرار داشته باشد، می‌توان اسپرینت یک هفته‌ای را در ۳۰ دقیقه برنامه‌ریزی کرد.

سعی کنید زمان پلنینگ را بیشتر از آنچه در فرمول آمده طولانی نکنید و یادتان نرود که هیچ رویداد‌ای نباید بیش از حد طول بکشد، اصلا رویدادها هرچه کوتاه‌تر، بهتر!

نقش‌های حاضر در پلنینگ (نقش‌های اسکرام)

در اسکرام سه نقش اصلی اسکرام مستر «Scrum Master»، مالک محصول «Product Owner» و تیم توسعه وجود دارد. هر کدام از این نقش‌ها در طول اسپرینت اهداف و مسئولیت‌هایی دارند. انجام این مسئولیت‌ها در نهایت باعث رسیدن هدف نهایی و پیروزی بزرگ یعنی توسعه محصول می‌شود.

این سه نقش در برپایی رویداد پلنینگ نیز نقش اصلی را دارند.

اسکرام مستر

اسکرام مستر، مسئول موفقیت پروژه و در خدمت تیم است. او برگزاری رویدادها را تسهیل می‌کند، وظیفه رسیدگی به اعضای تیم را دارد تا از مهیا بودن آنچه که برای انجام وظایف ‌افراد لازم است، مطمئن شود و مراقب اجرای پروژه در مسیر مطلوب باشد.

در رویدادی مانند پلنینگ اسکرام‌ مستر سازماندهی رویداد پلنینگ را بر عهده دارد. اگر فرض کنیم رویداد پلنینگ یک مهمانی است، اسکرام مستر میزبان این مهمانی به شمار می‌آید. او محل برپایی را پیدا می‌کند، بقیه را دعوت می‌کند و سعی می‌کند روند برپایی رویداد را در مسیر درست هدایت کند.

مالک محصول

مالک محصول پل ارتباط میان تیم توسعه و مشتری است.

در میان اعضای تیم توسعه مالک محصول نماینده مشتری به حساب می‌آید و باید به سوالات تیم توسعه درباره ویژگی‌های محصول مورد نظر پاسخ دهد.

در برابر مشتری، مالک محصول نماینده تیم فنی است و باید درباره وضعیت آماده‌سازی محصول توضیح دهد.

مالک محصول بک‌لاگ را آماده می‌کند و آن‌ها را به‌ترتیب اولویت تولید به دست تیم توسعه می‌رساند.

نقش مالک محصول در رویدادی مانند پلنینگ شفاف‌سازی بک‌لاگ و توضیح تسک‌های مورد نیاز است.

تیم توسعه

تیم توسعه شامل طراحان، برنامه‌نویسان و مهندسانی است که قرار است محصول را تولید کنند.

در پلنینگ تیم توسعه باید با بررسی بک‌لاگ، درباره انجام کارها در طول اسپرینت تخمین بزنند و زمان تحویل آن برنامه‌ریزی کنند.

تخمین اسپرینت

اگر یادتان باشد، گفتیم که در پلنینگ تیم فنی بک‌لاگ را بررسی می‌کند و تخمینی از انجام کارها (استوری کاربر) ارائه می‌دهد.

معمولا پیشنهاد می‌شود برای تخمین استوری کاربر از اعداد قراردادی استفاده کنید و بسته به حجم و سختی کار به آن عددی اختصاص دهید.

شما می‌توانید اعداد فیبوناچی ۱.۲، ۱، ۲، ۳، ۵، ۸، ۱۳، ۲۱ و … را روی کارت‌هایی مانند کارت پوکر بنویسید و یک سری از هر کدام را به دست اعضای تیم توسعه دهید.

در روز پلنینگ اعضای تیم توسعه با مشورت یکدیگر باید به استوری کاربر بر اساس میزان کار و سختی آن امتیاز بدهند. این امتیازها باید مورد توافق تمام اعضای تیم توسعه باشد.

نکته: این اعداد ربطی به زمان ندارند و به‌صورت قراردادی مشخص می‌شوند. مثلا شما می‌گویید اگر ساخت استوری الف ۲ امتیاز دارد، پس ساختن استوری ب به دلیل حجم کار بیشتر ۵ پوینت امتیاز دارد.

وقتی مجموع امتیازهای استوری‌های کاربر با ظرفیت تیم توسعه در اسپرینت برابر شد، جلسه پلنینگ به پایان می‌رسد.

ظرفیت تیم توسعه در اسپرینت

برای برپایی رویداد پلنینگ پیش از هرچیز باید ظرفیت تیم توسعه مشخص شود.

هر شرکتی بر اساس تجربه‌ عددی را به عنوان ظرفیت اعضای تیم توسعه در نظر می‌گیرد.

مثلا می‌گویید ما به تجربه فهمیدیم یک برنامه‌نویس در یک اسپرینت دو هفته‌ای ۳۵ پوینت را انجام می‌دهد.

عدد مورد نظر ضرب در تعداد اعضای تیم توسعه می‌شود، سپس حاصل آن از تعداد روزهای مرخصی افراد یا روزهای تعطیل رسمی کم می‌شود و ظرفیت اولیه به دست می‌آید.

هشت مزیت برپایی رویداد پلنینگ

تیم توسعه با تسک‌ها آشنا می‌شود.

ارتباطات و همکاری تیمی افزایش می‌یابد.

اعضای تیم به فهم مشترکی از محصول می‌رسند.

مشکلات پیچیده توسط تیم حل می‌شود.

همه به سمت یک مسیر مشترک حرکت می‌کنند.

اعضای تیم متعهد به ارائه نتایج هستند.

انتقال دانش صورت می‌گیرد.

دیدگاه‌های مختلفی اعضای تیم مطرح می‌شود.

سخن آخر: رویدادهای اسکرام واقعا موثر هستند؟

در نگاه اول برپایی رویدادهای اسکرام از دور، کاری خسته‌کننده و اتلاف وقت به‌نظر می‌رسد، اما واقعیت این است که صرف زمانی مشخص برای برنامه‌ریزی و ترسیم چشم‌انداز برای تولید محصول، باعث می‌شود اعضای تیم توسعه مدام در حال لمس فیل در تاریکی نباشند و از همان ابتدا با چشمان باز به سراغ کد زدن بروند.

این کار در نهایت شما را از پرسش و پاسخ مداوم در طول روز و اتلاف وقت نجات می‌دهد.

هرچقدر که تجربه شما در اجرای اسکرام بیشتر شود، کارآیی آن بر کمیت و کیفیت محصول بیشتر به‌ چشم می‌خورد.

برپایی رویدادی مانند پلنینگ باعث می‌شود تیم تخمینی از ظرفیت خود به دست بیاورد و متعهد می‌شود در پایان اسپرینت به این تخمین دست پیدا کند. این باعث می‌شود شما با اطمینان خاطر بیشتری با مشتری روبه‌رو شوید و از زمان تولید و توسعه محصول تخمین بهتری داشته باشید.

نوشته پیروزی به سبک اسکرام‌بازها اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

پیاده سازی Feature toggle در سوئیفت

اگر تصمیم دارید از Feature toggle در پروژه های ios خود استفاده کنید، حتما این مقاله رو بخونید. چند وقت پیش تصمیم گرفته شد که از این امکان در پروژه استفاده بشه. امروز فرصت کردم تا بررسی کنم و سایت هایی رو بخونم. گفتم نتیجه اشو برای شما بنویسم. نتیجه ای که قطعا در اجرای شما تاثیر خواهد داشت.

وقتی میخواهید شروع کنید به پیاده سازی، باید به این فکر کنید که بهترین روش برای توسعه یک امکان جدید چیه؟ در این موارد یک مثال ساده بهترین راه برای رسید به بهترین روش هست.

در گیف زیر تکه کدی از یک کلاس رو دیدم که خیلی گویا هست.

در تصویر بالا جابجایی بین دو اکشن مختلف، با true یا false بودن یک مقدار صورت میگیره. با بررسی این مثال ساده میتونید مشکلات پیاده سازی استخراج کنیم.

اول اینکه استفاده از if-else در فایل ها و کلاس های مختلف باعث میشه فهم و خوانایی کد پایین بیاد.

دوم اینکه اگر فرض کنیم شرط Toggles.Vehicle.carsCanFly در بیش از یک فایل و کلاس استفاده بشه، چون Feature toggle باید به راحتی از سورس حذف بشه بدون اینکه به سایر بخش لطمه ای بزنه، پس بایستی به گونه ای طراحی و پیاده سازی بشه که این نوع مشکلات رو ایجاد نکنه.

یکی از راه هایی که میتونه دو نکته ی بالا رو حل کنه استفاده از پروتکل (POP) برای پیاده سازی Feature toggle هست. به تکه کد زیر توجه کنید:

protocol CarFleetFeatureToggleLogic {
var fuelToUse: Fuel { get }
func transport(car: Car, to position: Position)
}

extension CarFleetFeatureToggleLogic where Self: CarFleet {
/**
Get the fuel to be used on cars.
– Toggle Options:
– Toggle on: return fuel type for rockets.
– Toggle off: return fuel type for cars.
*/
var fuelToUse: Fuel {
switch Toggles.Vehicle.carsCanFly.enabled {
case true : Fuel.rocket
case false : Fuel.car
}
}

/**
Transport cars to their destination.
– Toggle Options:
– Toggle on: Fly cars to destination.
– Toggle off: Drive cars to destination.
*/
func transport(car: Car, to position: Position) {
switch Toggles.Vehicle.carsCanFly.enabled {
case true : fly(to: location)
case false : drive(to: location)
}
}
}

به اکستنشن بخش دوم کد بالا دقت کنید. هر وقت از اکستنشنی به صورت where Self: x استفاده می کنید، یعنی برای کلاس x به صورت پیش فرض توسعه یا پیاده سازی انجام شده است.

اصلاح شده ی مثال اول به صورت کد زیر پیاده سازی می شود:

class CarFleet{

//init class

}

extension CarFleet: CarFleetFeatureToggleLogic {
func moveCarsToPosition(cars: [Car], position: Position) {
cars.forEach({ transport(car: $0, to: position) })
}

func refuel(cars: [Car]) {
cars.forEach({ refuel(car: $0, using: fuelToUse) })
}

func refuel(car: Car, using: Fuel) {
}
}

برای حذف این Feature toggle کافیه این extension و پروتکل را از پروژه حذف کنید.


نتیجه گیری

برای استفاده از این امکان حتما به قابلیت حذفش در کمترین زمان از کدتون هم فکر کنید. چون پیاده سازی اگر درست نباشه تبدیل به یک معضل جدی میشه.

از دوستان تقاضا دارم اگر تجربیاتی در این خصوص دارن حتما کامنت بذارن و به همه منتقل کنند.

نوشته پیاده سازی Feature toggle در سوئیفت اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

سیستم api برای تاریخ شمسی

H

سلام امروز تو یک پروژه ای دنبال یه API بودم که تاریخ شمسی بعد از چندتا سرچ کردم یک api سر راست پیدا کردم که کار باهاش خیلی راحته تقریبا همه چی از ساعت و اینها هم داشت برای همین گفتم بزارم شاید بدرد یکی خورد. امیدوارم ازش استفاده کنید

https://api.keybit.ir/time/

به API بالا که درخواست بزنید یه خروجی جیسون بهتون میده مثل عکس زیر

یکم عکس بزرگه برای همین برای دیدن نوشته های باید زوم کنید

راستی لینک زیر رو هم ببینید api های جالب و رایگانی گزاشته

https://github.com/public-apis/public-apis

نوشته سیستم api برای تاریخ شمسی اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی