سلام دوستان عزیزم
این مدت درگیر اومدن به تهران و شروع بکار با شرکت جدید بودم.
البته هنوز مشکل ی جای مناسب برای سکونت رو دارم.
اما باید با قدرت و بدون مقصر دونستن شرایط به سمت جلو رفت
خیلی فاصله افتاد بین فعالیت کانال
سعی میکنم به زودی با مطالب و تجربیات جدیدتری کانال رو بروز نگه دارم
پس باهام همراه باشید ❤️🌱
@osmanmakhtoomdev
این مدت درگیر اومدن به تهران و شروع بکار با شرکت جدید بودم.
البته هنوز مشکل ی جای مناسب برای سکونت رو دارم.
اما باید با قدرت و بدون مقصر دونستن شرایط به سمت جلو رفت
خیلی فاصله افتاد بین فعالیت کانال
سعی میکنم به زودی با مطالب و تجربیات جدیدتری کانال رو بروز نگه دارم
پس باهام همراه باشید ❤️🌱
@osmanmakhtoomdev
🕊3👍1
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
* مفهوم ضربان قلب در علم کامپیوتر چیست؟
اون قدیمترها من وقتی که تازهکار بودم و وبسرور راه مینداختم و API مینوشتم، یه کاری رو میکردم که مطمئن بشم سروری که راه انداختم داره بدون اشکال کار میکنه، اونم این بود که با یه برنامه زماندار (کرونجاب/cronjob) هر چند دقیقه سرور رو پینگ میکردم که مطمئن بشم هنوز داره کار میکنه...
اما پبینگ کردن کافی نبود، شما میتونی برنامهای بنویسی که هر چند وقت (زمانش بستگی به شما داره) به سرور بگه که من ادمین هستم، بگو ببینم وضعیتت چطوره؟
* بگو دیسکت چقدر جا داره
* بگو آپتایمت چقدره
* بگو آمپر CPUت روی چند درصده
* بگو چقدر رمت پره و چقدر خالیه
هر چند دقیقه اینارو از سرور بپرسه...
و هر بار چک کنه همه چی نرمال باشه، اگه رشد غیر طبیعی ببینه یا اتفاقی بیفته دیسک پر بشه یا سرور جواب نده یا هرچی، یه بوقی بزنه یا یه ایمیلی بده یا خیلی دیگه خفن باشه بهت یه sms بده که یه مشکلی توی سرور هست، مثلا دیسک شده 90 درصد... برو رسیدگی کن✨
این میشه مفهوم ضربان قلب که الان تخصصیتر میگم*
=+=+=+=+=+=+=+=
مانیتور کردن سیستم خیلی بحث مهمیه،
فرض کنین یه API ثالث (ثرد-پارتی) که توی سرورتون استفاده کردین بنا به دلایلی داون میشه، سرور ازش ریسپانس نمیگیره و به ارور میخوره... اما به کارش ادامه میده، چون شما زرنگ بودی و ارور هارو با ترای-کچ هندل کردی:
▪️فرق بین ارور و اکسپشن و وارنینگ و نوتیس چیه؟
▪️فلسفه ترای-کچ چیه؟
سیستم به کارش ادامه میده و شروع میکنه به لاگ انداختن که توی ساعت فلان، ثانیه فلان من این ریکوئست روبه API زدم منتهی داون بود و جواب نداد...
1 بار لاگ میندازه 2 بار لاگ میندازه 3 بار لاگ میندازه...
ایــــــــنقدر لاگ میندازه که یهو فایل لاگ میشه 60 گیگ، دیسک ددیکیتشده شما پر میشه و سرورتون داون میشه.
این یه مثال عملی بود از اینکه سرورها ممکنه به چه مشکلاتی بخورن...
اگه سیستمادمین باشین این سناریوها براتون به کرات اتفاق میافته.
همیشه هم شما نمیتونی مطمئن باشی چه چیزی ممکنه مشکل ایجاد کنه،
پس یکی از راهکارهای پیشگیری از فاجعه برای سرور، مانیتور کردن سرور در طول زمان هست...
برنامهنویسا عموما تنبلن و حوصله ندارن هی مستقیم سرور رو مانیتور کنن، پس به یه برنامه میگن که این کار رو براشون انجام بده😬 عقلانیش هم همینه.
مثلا من یه برنامه داشتم که یه رکوئست HTTP میزد (با پست) و به سرور میگفت من ادمینم اینم توکنم، بهم بگو علائم حیاتیت چیه...؟
سرور جواب میداد که:
* آپتایم 24 روز و 8 ساعت
* سیپییو 7 درصد
* رم 1 گیگ
* دیسک 128 گیگ خالی دارم
* سرعت پینگم هم 60 میلی ثانیهست
برنامه اینارو چک میکرد و اگه چیز آنرمالی میدید به من خبر میداد.
شما اگه خیلی خفن بودین میتونستین برنامه رو جوری بنویسین که مثلا بصورت نمایی، اطلاعات چندتا ضربان قلب قبلی سرور رو ذخیره کرده باشه و کنار هم بذاره و رشد خاصی رو برونیابی کنه و اگه حدس میزنه چیزی در حال تغییر غیر عادیه خبر بده...،
مثلا 5 ساعت پیش دیسک 128 گیگ خالی داشته،
4 ساعت پیش 128 گیک خالی داشته،
3 ساعت پیش 120 گیگ خالی داشته،
2 ساعت پیش 89 گیگ،
حالا هم 24 گیگ،
خب این یه تغییر غیر طبیعیه، فرمولهای ساده ریاضیاتی هستن که میتونن نسبت بگیرن و تغییرات ناخواستهای مثل این رو دیتکت کنن، برنامه به شما سریع sms بده که زود باش SSH کن به سرور که یه اتفاقی افتاده دیسک داره پر میشه...
شما سریع میری و مثلا میبینین که یه I/O اکسپشنی رخ داده یه فایل بسته نشده و هی داره توش داده نوشته میشه...،
قبل از اینکه دیسک پر بشه و سرور داون بشه و محاسباتتون دچار مشکل بشه و یا اطلاعات خاصیتون بپره، فیکسش میکنین*-*
اما،
امــــا،...
بعدا که رفتم ارشد، توی یه درسی همینو به ما درس دادن و فهمیدم این حرکت اصلا یه قسمت از علم کامپیوتره که بهش میگن کاندیشن مانیتورینگ
* Condition Monitoring
و اصلا یه پرتکل شبکهای وجود داره به اسم SNMP:
Simple Network Management Protocol
که روی UDP ران میشه و کارش مدیریت کردن خودکار یه دستگاه شبکهای هست و این پرتکل بای دیفالت مثلا روی روترها و سوئیچها پشتیبانی میشه....
اگه میخواین بیشتر بخونین:
https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol
=+=+=+=+=+=+=+=
حالا شما میتونین خودتون یه پرتکل ضربان قلب پیاده کنین...
کتابخونهها و پرتکلهای آماده ای هم براین این موضوع هستن،
اگه سرورتون بزرگ و حساس هم هست میتونین بازه زمانی ضربان قلب گرفتن رو کمتر کنین، مثلا هر 1 دقیقه سیستم رو مانیتور کنین.
اگه میخواین ضربان قلب یا heartbeat رو تخصصی مطالعه کنین:
https://en.wikipedia.org/wiki/Heartbeat_(computing)
اون قدیمترها من وقتی که تازهکار بودم و وبسرور راه مینداختم و API مینوشتم، یه کاری رو میکردم که مطمئن بشم سروری که راه انداختم داره بدون اشکال کار میکنه، اونم این بود که با یه برنامه زماندار (کرونجاب/cronjob) هر چند دقیقه سرور رو پینگ میکردم که مطمئن بشم هنوز داره کار میکنه...
اما پبینگ کردن کافی نبود، شما میتونی برنامهای بنویسی که هر چند وقت (زمانش بستگی به شما داره) به سرور بگه که من ادمین هستم، بگو ببینم وضعیتت چطوره؟
* بگو دیسکت چقدر جا داره
* بگو آپتایمت چقدره
* بگو آمپر CPUت روی چند درصده
* بگو چقدر رمت پره و چقدر خالیه
هر چند دقیقه اینارو از سرور بپرسه...
و هر بار چک کنه همه چی نرمال باشه، اگه رشد غیر طبیعی ببینه یا اتفاقی بیفته دیسک پر بشه یا سرور جواب نده یا هرچی، یه بوقی بزنه یا یه ایمیلی بده یا خیلی دیگه خفن باشه بهت یه sms بده که یه مشکلی توی سرور هست، مثلا دیسک شده 90 درصد... برو رسیدگی کن✨
این میشه مفهوم ضربان قلب که الان تخصصیتر میگم*
=+=+=+=+=+=+=+=
مانیتور کردن سیستم خیلی بحث مهمیه،
فرض کنین یه API ثالث (ثرد-پارتی) که توی سرورتون استفاده کردین بنا به دلایلی داون میشه، سرور ازش ریسپانس نمیگیره و به ارور میخوره... اما به کارش ادامه میده، چون شما زرنگ بودی و ارور هارو با ترای-کچ هندل کردی:
▪️فرق بین ارور و اکسپشن و وارنینگ و نوتیس چیه؟
▪️فلسفه ترای-کچ چیه؟
سیستم به کارش ادامه میده و شروع میکنه به لاگ انداختن که توی ساعت فلان، ثانیه فلان من این ریکوئست روبه API زدم منتهی داون بود و جواب نداد...
1 بار لاگ میندازه 2 بار لاگ میندازه 3 بار لاگ میندازه...
ایــــــــنقدر لاگ میندازه که یهو فایل لاگ میشه 60 گیگ، دیسک ددیکیتشده شما پر میشه و سرورتون داون میشه.
این یه مثال عملی بود از اینکه سرورها ممکنه به چه مشکلاتی بخورن...
اگه سیستمادمین باشین این سناریوها براتون به کرات اتفاق میافته.
همیشه هم شما نمیتونی مطمئن باشی چه چیزی ممکنه مشکل ایجاد کنه،
پس یکی از راهکارهای پیشگیری از فاجعه برای سرور، مانیتور کردن سرور در طول زمان هست...
برنامهنویسا عموما تنبلن و حوصله ندارن هی مستقیم سرور رو مانیتور کنن، پس به یه برنامه میگن که این کار رو براشون انجام بده😬 عقلانیش هم همینه.
مثلا من یه برنامه داشتم که یه رکوئست HTTP میزد (با پست) و به سرور میگفت من ادمینم اینم توکنم، بهم بگو علائم حیاتیت چیه...؟
سرور جواب میداد که:
* آپتایم 24 روز و 8 ساعت
* سیپییو 7 درصد
* رم 1 گیگ
* دیسک 128 گیگ خالی دارم
* سرعت پینگم هم 60 میلی ثانیهست
برنامه اینارو چک میکرد و اگه چیز آنرمالی میدید به من خبر میداد.
شما اگه خیلی خفن بودین میتونستین برنامه رو جوری بنویسین که مثلا بصورت نمایی، اطلاعات چندتا ضربان قلب قبلی سرور رو ذخیره کرده باشه و کنار هم بذاره و رشد خاصی رو برونیابی کنه و اگه حدس میزنه چیزی در حال تغییر غیر عادیه خبر بده...،
مثلا 5 ساعت پیش دیسک 128 گیگ خالی داشته،
4 ساعت پیش 128 گیک خالی داشته،
3 ساعت پیش 120 گیگ خالی داشته،
2 ساعت پیش 89 گیگ،
حالا هم 24 گیگ،
خب این یه تغییر غیر طبیعیه، فرمولهای ساده ریاضیاتی هستن که میتونن نسبت بگیرن و تغییرات ناخواستهای مثل این رو دیتکت کنن، برنامه به شما سریع sms بده که زود باش SSH کن به سرور که یه اتفاقی افتاده دیسک داره پر میشه...
شما سریع میری و مثلا میبینین که یه I/O اکسپشنی رخ داده یه فایل بسته نشده و هی داره توش داده نوشته میشه...،
قبل از اینکه دیسک پر بشه و سرور داون بشه و محاسباتتون دچار مشکل بشه و یا اطلاعات خاصیتون بپره، فیکسش میکنین*-*
اما،
امــــا،...
بعدا که رفتم ارشد، توی یه درسی همینو به ما درس دادن و فهمیدم این حرکت اصلا یه قسمت از علم کامپیوتره که بهش میگن کاندیشن مانیتورینگ
* Condition Monitoring
و اصلا یه پرتکل شبکهای وجود داره به اسم SNMP:
Simple Network Management Protocol
که روی UDP ران میشه و کارش مدیریت کردن خودکار یه دستگاه شبکهای هست و این پرتکل بای دیفالت مثلا روی روترها و سوئیچها پشتیبانی میشه....
اگه میخواین بیشتر بخونین:
https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol
=+=+=+=+=+=+=+=
حالا شما میتونین خودتون یه پرتکل ضربان قلب پیاده کنین...
کتابخونهها و پرتکلهای آماده ای هم براین این موضوع هستن،
اگه سرورتون بزرگ و حساس هم هست میتونین بازه زمانی ضربان قلب گرفتن رو کمتر کنین، مثلا هر 1 دقیقه سیستم رو مانیتور کنین.
اگه میخواین ضربان قلب یا heartbeat رو تخصصی مطالعه کنین:
https://en.wikipedia.org/wiki/Heartbeat_(computing)
❤1
Forwarded from Django Expert (Boby Cloud)
✅ برنامه نویسی تدافعی (Defensive Programming) در پایتون مساله مهمی هست، متاسفانه بخاطر EAFP در پایتون، خیلی از برنامه نویسهای پایتون با تکنیکهای برنامه نویسی تدافعی برای افزایش پایداری و اطمینان نرم افزارها و همچنین کاهش باگها و اتفاقات غیرمنتظره، آشنا نیستند. اگر به ساخت نرم افزارهای قابل اطمینان و پایدار با پایتون علاقمند هستید این ویدیو رو از دست ندید.
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/wNiQwj9qKvc?si=MHlWs0iTPn3ddYZH
〰️〰️〰️〰️〰️〰️
@DjangoEx | @BobyDotCloud
🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/wNiQwj9qKvc?si=MHlWs0iTPn3ddYZH
〰️〰️〰️〰️〰️〰️
@DjangoEx | @BobyDotCloud
❤1
نتیجه این کد چی میشه؟
my_list = [['_'] * 3] * 3
my_list[1][0] = 'X' print(my_list)
my_list = [['_'] * 3] * 3
my_list[1][0] = 'X' print(my_list)
Anonymous Quiz
63%
[['_', '_', '_'], ['X', '_', '_'], ['_', '_', '_']]
4%
[['X', '_', '_'], ['X', '_', '_'], ['_', '_', '_']]
25%
[['X', '_', '_'], ['X', '_', '_'], ['X', '_', '_']]
8%
[['_', '_', '_'], ['X', '_', '_'], ['X', '_', '_']]
نتیجه این کد چی میشه؟
my_list = [['_']] * 3
my_list[1][0] = 'X' print(my_list)
my_list = [['_']] * 3
my_list[1][0] = 'X' print(my_list)
Anonymous Quiz
52%
[['_', '_', '_'], ['X', '_', '_'], ['_', '_', '_']]
7%
[['X', '_', '_'], ['X', '_', '_'], ['_', '_', '_']]
11%
[['_', '_', '_'], ['X', '_', '_'], ['X', '_', '_']]
5%
[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
24%
[['X', '_', '_'], ['X', '_', '_'], ['X', '_', '_']]
دوستان میخام وبلاگ شخصی راه بندازم، پیشنهادتون کدومه؟
Final Results
49%
نوشتن پروژه با جنگو و آنگولار (رزومه میشه 😄)
43%
وردپرس ۵ دقیقهای
9%
کامنت میذارم
خب دوستان درمورد نظرسنجی که بالا درمورد انتخاب پلتفرم بلاگ نویسی گذاشتم ی سری پوینتها رو مناسب دیدم بنویسم.
چرا وبلاگ داشتن برای ی برنامهنویس مهمه؟
تو کتاب Soft skills نوشته Sonmez چند فصل و چندین صفحه درمورد ضرورت داشتن ی وبلاگ برای برنامهنویس ها صحبت کرده و یکی از دلایل خوبی که آورده اینه:
رزومه شما فقط ی صفحه است و باید بصورت خیلی خلاصه فقط نکات مهم رو اونجا درج کنید و شما برای جلب توجه ریکروتر نهایت نهایتش فقط ۶ ثانیه فرصت دارید و این زمان خیلی کمیه.
در اینترویو هم طرف نمیتونه با ی برخورد درمورد عمق تخصص یا شخصیت شما مطمئن بشه، پس شما باید از طریق دیگهای مهارتهای خودتونو به نمایش بذارید تا شخصی که میخاد شما رو استخدام کنه بتونه بهش مراجعه کنه و نسبت به شما شناخت کافی پیدا کنه و این محل میتونه وبلاگ شخصی شما باشه.
چه پلتفرمهایی برای شروع بلاگ نویسی وجود دارن؟
طبق چیزی که من تحقیق کردم میشه گفت ۳ نوع پلتفرم برای بلاگ نویسی وجود داره:
۱- سایتهای اشتراک مقاله مثل مدیوم یا نسخه وطنی اون ویرگول.
اینا خوبن، شناخته شده هستن، کاربر زیاد دارن و افراد متعددی میتونن مقالات شما رو دنبال کنن.
اما اون کاربرها در واقع کاربر شما نیستن بلکه برای همون پلتفرم هستن.
شما نمیتونید اونجا اقدام به تبلیغ یا اتصال درگاه پرداخت برای فروش محصولات کنید.
و اگه روزی اون پلتفرم تصمیم بگیره اکانت شما رو ببنده یا پستهای شما رو پاک کنه کاری از دست شما برنمیاد و این اتفاقیه که به کرات افتاده.
۲- اپ اختصاصی:
ی برنامهنویس میتونه خودش برای خودش ی پروژه شروع کنه و ی اپ وبلاگ بنویسه.
اینکار میتونه باعث بشه شخص کد خودش رو تو گیتهابش منتشر کنه و ی پوینت اضافه کنه به خودش.
حتی میتونه مراحل ایجادش رو ضبط و بعنوان آموزش پروژه محور منتشر کنه.
اما خودش باید تمام موارد از جمله تکنولوژی هایی که لازمه برای پیادهسازی و دیپلوی پروژه رو بلد باشه یا یاد بگیره، سئو و بهینهسازی برای موتورهای جستجو رو باید بلد باشه، بحث امنیت رو باید بلد باشه و رعایت کنه، اگه فیچری نیاز داشت باید خودش بشینه کد بنویسه و اضافه کنه، کلی باگ و دیباگ و... و به این ترتیب با اینکه اینجا دستش بازه و هر کاری خاست میتونه بکنه اما از اونطرف هم کلی زمان از دست میده و فکر نکنم بعدش برای بلاگ نویسی انگیزهای براش بمونه(چون دائم در حال دیباگه 😂)
۳- اپهای آماده مثل وردپرس و جوملا و...
و در آخر اگه هدف شخص تنها شروع بلاگ نویسیه میتونه از اپهای رایگان آماده مثل وردپرس استفاده کنه که مثلا در بحث سئو رو دست نداره، تست شده است و کامیونیتی فعال و قوی داره، هر فیچر یا تمی خاست اضافه کنه براحتی میتونه با نصب ی پلاگین در ی لحظه انجامش بده و کلی کار خفن دیگه.
چه موضوعی بنویسم؟
برای شروع جواب اینه که فقط شروع کن به نوشتن و پیش برو، ممکنه از بعضی مقالاتی که نوشتی خودت خوشت نیاد ولی تجربه شده که همون مقالات بارها و بارها خونده شدن و حتی اشتراک گذاری انجام شده 😊
به مرور غلق کار دستت میاد و شروع میکنی به دسته بندی و ترتیب بندی مطالب.
اما برای انتشار مقالات حتما ی برنامه داشته باش، مثلا برای خودت کلندر ست کن که هفتهای ی مقاله منتشر کنی و این تبدیل به ی عادت بشه تا فالوورها بدونن دقیقا چه تایمی مقالهات منتشر میشه.
این نکات رو تو این چند روز کلی مقاله و ویدیو مرور کردم و بدست آوردم و خوشحالم تو اشتراک گذاریش کمکم کنی، دمت گرم 🫠
@osmanmakhtoomdev
چرا وبلاگ داشتن برای ی برنامهنویس مهمه؟
تو کتاب Soft skills نوشته Sonmez چند فصل و چندین صفحه درمورد ضرورت داشتن ی وبلاگ برای برنامهنویس ها صحبت کرده و یکی از دلایل خوبی که آورده اینه:
رزومه شما فقط ی صفحه است و باید بصورت خیلی خلاصه فقط نکات مهم رو اونجا درج کنید و شما برای جلب توجه ریکروتر نهایت نهایتش فقط ۶ ثانیه فرصت دارید و این زمان خیلی کمیه.
در اینترویو هم طرف نمیتونه با ی برخورد درمورد عمق تخصص یا شخصیت شما مطمئن بشه، پس شما باید از طریق دیگهای مهارتهای خودتونو به نمایش بذارید تا شخصی که میخاد شما رو استخدام کنه بتونه بهش مراجعه کنه و نسبت به شما شناخت کافی پیدا کنه و این محل میتونه وبلاگ شخصی شما باشه.
چه پلتفرمهایی برای شروع بلاگ نویسی وجود دارن؟
طبق چیزی که من تحقیق کردم میشه گفت ۳ نوع پلتفرم برای بلاگ نویسی وجود داره:
۱- سایتهای اشتراک مقاله مثل مدیوم یا نسخه وطنی اون ویرگول.
اینا خوبن، شناخته شده هستن، کاربر زیاد دارن و افراد متعددی میتونن مقالات شما رو دنبال کنن.
اما اون کاربرها در واقع کاربر شما نیستن بلکه برای همون پلتفرم هستن.
شما نمیتونید اونجا اقدام به تبلیغ یا اتصال درگاه پرداخت برای فروش محصولات کنید.
و اگه روزی اون پلتفرم تصمیم بگیره اکانت شما رو ببنده یا پستهای شما رو پاک کنه کاری از دست شما برنمیاد و این اتفاقیه که به کرات افتاده.
۲- اپ اختصاصی:
ی برنامهنویس میتونه خودش برای خودش ی پروژه شروع کنه و ی اپ وبلاگ بنویسه.
اینکار میتونه باعث بشه شخص کد خودش رو تو گیتهابش منتشر کنه و ی پوینت اضافه کنه به خودش.
حتی میتونه مراحل ایجادش رو ضبط و بعنوان آموزش پروژه محور منتشر کنه.
اما خودش باید تمام موارد از جمله تکنولوژی هایی که لازمه برای پیادهسازی و دیپلوی پروژه رو بلد باشه یا یاد بگیره، سئو و بهینهسازی برای موتورهای جستجو رو باید بلد باشه، بحث امنیت رو باید بلد باشه و رعایت کنه، اگه فیچری نیاز داشت باید خودش بشینه کد بنویسه و اضافه کنه، کلی باگ و دیباگ و... و به این ترتیب با اینکه اینجا دستش بازه و هر کاری خاست میتونه بکنه اما از اونطرف هم کلی زمان از دست میده و فکر نکنم بعدش برای بلاگ نویسی انگیزهای براش بمونه(چون دائم در حال دیباگه 😂)
۳- اپهای آماده مثل وردپرس و جوملا و...
و در آخر اگه هدف شخص تنها شروع بلاگ نویسیه میتونه از اپهای رایگان آماده مثل وردپرس استفاده کنه که مثلا در بحث سئو رو دست نداره، تست شده است و کامیونیتی فعال و قوی داره، هر فیچر یا تمی خاست اضافه کنه براحتی میتونه با نصب ی پلاگین در ی لحظه انجامش بده و کلی کار خفن دیگه.
چه موضوعی بنویسم؟
برای شروع جواب اینه که فقط شروع کن به نوشتن و پیش برو، ممکنه از بعضی مقالاتی که نوشتی خودت خوشت نیاد ولی تجربه شده که همون مقالات بارها و بارها خونده شدن و حتی اشتراک گذاری انجام شده 😊
به مرور غلق کار دستت میاد و شروع میکنی به دسته بندی و ترتیب بندی مطالب.
اما برای انتشار مقالات حتما ی برنامه داشته باش، مثلا برای خودت کلندر ست کن که هفتهای ی مقاله منتشر کنی و این تبدیل به ی عادت بشه تا فالوورها بدونن دقیقا چه تایمی مقالهات منتشر میشه.
این نکات رو تو این چند روز کلی مقاله و ویدیو مرور کردم و بدست آوردم و خوشحالم تو اشتراک گذاریش کمکم کنی، دمت گرم 🫠
@osmanmakhtoomdev
❤1
Forwarded from Sadra Codes
یه نکته اضافه کنم، همونطور که عثمان اشاره کرده، حتما کلندر ست کنید. اگه دنبال impression و فالوور و دیدهشدن هستین، نیازه که یه روتین رو واسه نوشتن دنبال کنید. مثلا هر n روز یه مقاله پابلیش کنید. (کیفیت و حجم مقاله بسیار مهمه)
یه مورد دیگه، همیشه حداقل ۱۰ تا مقاله درفت داشته باشین. (یعنی مقالهای که صرفا تایتل و چندتا سکشن داره و تکمیل نشده)
واسه خواننده مهم نیست چندتا مقاله راجع به تستینگ خونده. دوست داره نظر تورو هم بدونه. اگه نویسنده خوبی باشین، خود خالق pytest هم میتونه از مقالتون متوجه بینشهای متفاوت و خاصی راجع به unit testing بشه و ارزش مقاله نوشتن اینجاست که خودش رو نشون میده.
اگرم دوست دارید چیزی رو یاد بگیرید، بنظرم از ابزارهای نوتبرداری آنلاین استفاده نکنید و سعی کنید بصورت فیزیکی، روی کاغذ یادداشت کنید. نوشتن با دست کمک میکنه تا راحتتر به خاطر بیارید و موقع بازخوانیش، حداقل میزان حواسپرتی (distraction) رو خواهید داشت. واسه یادگیری، (تاجایی که ممکنه) از اینترنت و دیوایسهای هوشمند دوری کنید و سعی کنید آفلاین یادبگیرید. همین که ذهن شما عادت کنه که الان دسترسی به اینترنت نداری، کلی از دغدغههای ناخودآگاهت برطرف میشه و مغز میدونه راه چارهای برای رسیدن به اون دوپامین حاصل از اسکرول کردن اکسپلور اینستا وجود نداره، پس سعی میکنه با یادگرفتن اون حس رو واسه خودش شبیهسازی کنه.
یه مورد دیگه، همیشه حداقل ۱۰ تا مقاله درفت داشته باشین. (یعنی مقالهای که صرفا تایتل و چندتا سکشن داره و تکمیل نشده)
واسه خواننده مهم نیست چندتا مقاله راجع به تستینگ خونده. دوست داره نظر تورو هم بدونه. اگه نویسنده خوبی باشین، خود خالق pytest هم میتونه از مقالتون متوجه بینشهای متفاوت و خاصی راجع به unit testing بشه و ارزش مقاله نوشتن اینجاست که خودش رو نشون میده.
اگرم دوست دارید چیزی رو یاد بگیرید، بنظرم از ابزارهای نوتبرداری آنلاین استفاده نکنید و سعی کنید بصورت فیزیکی، روی کاغذ یادداشت کنید. نوشتن با دست کمک میکنه تا راحتتر به خاطر بیارید و موقع بازخوانیش، حداقل میزان حواسپرتی (distraction) رو خواهید داشت. واسه یادگیری، (تاجایی که ممکنه) از اینترنت و دیوایسهای هوشمند دوری کنید و سعی کنید آفلاین یادبگیرید. همین که ذهن شما عادت کنه که الان دسترسی به اینترنت نداری، کلی از دغدغههای ناخودآگاهت برطرف میشه و مغز میدونه راه چارهای برای رسیدن به اون دوپامین حاصل از اسکرول کردن اکسپلور اینستا وجود نداره، پس سعی میکنه با یادگرفتن اون حس رو واسه خودش شبیهسازی کنه.
👍2
ی بار برام پیش اومد که تو ی branch گیت ی فایل ایجاد کردم و کامیت هم زدم ولی بعدش متوجه شدم که اون فایل رو نباید رو این برنچ میساختم.
یا برام پیش اومده بود کلی چنج رو ی برنچ داشتم که فقط چند تا فایل و پوشه از اون برنچ رو فقط نیاز داشتم و چنجهای دیگه رو اصلا نمیتونستم مرج کنم.
راه حلی که برای همچین مواقعی وجود داره باز هم دستور checkout گیت هست که به این صورته:
مثلا فرض کنیم برنچی به اسم feature/new_wizard داریم که پوشهای به آدرس apps/ipg رو تو اون داریم.
حالا دستور ما تو برنچی که میخایم این پوشه رو بهش منتقل کنیم به این صورت خواهد بود:
به این ترتیب میتونیم این پوشه رو کاملا استاندارد ببریم به برنچی که بهش نیاز داریم.
@osmanmakhtoomdev
یا برام پیش اومده بود کلی چنج رو ی برنچ داشتم که فقط چند تا فایل و پوشه از اون برنچ رو فقط نیاز داشتم و چنجهای دیگه رو اصلا نمیتونستم مرج کنم.
راه حلی که برای همچین مواقعی وجود داره باز هم دستور checkout گیت هست که به این صورته:
git checkout destination_branch_name -- destination_file_or_directoryمثلا فرض کنیم برنچی به اسم feature/new_wizard داریم که پوشهای به آدرس apps/ipg رو تو اون داریم.
حالا دستور ما تو برنچی که میخایم این پوشه رو بهش منتقل کنیم به این صورت خواهد بود:
git checkout feature/new_wizard -- apps/ipgبه این ترتیب میتونیم این پوشه رو کاملا استاندارد ببریم به برنچی که بهش نیاز داریم.
@osmanmakhtoomdev
🔥1
Learn with Osman
ی بار برام پیش اومد که تو ی branch گیت ی فایل ایجاد کردم و کامیت هم زدم ولی بعدش متوجه شدم که اون فایل رو نباید رو این برنچ میساختم. یا برام پیش اومده بود کلی چنج رو ی برنچ داشتم که فقط چند تا فایل و پوشه از اون برنچ رو فقط نیاز داشتم و چنجهای دیگه رو اصلا…
دوست خوبم @AmirSoroushh عزیز لطف کردن و زیر این پست ی کامنت گذاشتن و دستور restore رو در گیت مطرح کردن که تو ورژنهای بعدی گیت ارائه شده و این وظیفه رو به دوش گرفته در واقع.
تو این لینک میتونید بحث خوبی رو درمورد تفاوت این دو دستور پیدا کنید:
https://stackoverflow.com/questions/61130412/what-is-the-difference-between-git-checkout-vs-git-restore-for-reverting-un
تو این لینک میتونید بحث خوبی رو درمورد تفاوت این دو دستور پیدا کنید:
https://stackoverflow.com/questions/61130412/what-is-the-difference-between-git-checkout-vs-git-restore-for-reverting-un
Stack Overflow
What is the difference between "git checkout" vs. "git restore" for reverting uncommitted file changes?
Say I have a git repo with a modified file named readme.txt, and I want to undo the modifications I've made and set it back to the state of the most recent commit. It seems there are two commands t...
Learn with Osman
Yusuf Dikec 😁
عکسی که وایرال شده Yusuf Dikeç تیرانداز ۵۱ ساله ترکیه است که مدال نقره المپیک رو بدون استفاده از تجهیزات تیراندازی و دقیقا با همین حالت برده
❤1
Forwarded from جنگولرن
علی شریفی زارچی: دانشگاه شریف سال گذشته دورهی «برنامهنویسی پایتون و خلاقیت الگوریتمی» را برای هزاران دانشآموز متوسطهی سراسر کشور برگزار کرد.
تمام محتوای این دوره شامل ویدئوی کلاسها، تمرینهای نظری و عملی «به صورت رایگان» به همهی دانشآموزان ایران تقدیم میشود:
https://learn-python.ir
بیش از ۱۱۰ استاد، دانشجو و دانشآموختهی دانشگاه شریف و سایر دانشگاههای داخل و خارج ایران در تهیهی محتوا و برگزاری آن مشارکت داشتند.
علاوه بر دانشآموزان متوسطه، این دوره مناسب همهی افرادی است که میخواهند برای نخستین بار برنامهنویسی یاد بگیرند و از چالشهای زیبا لذت ببرند.
گذراندن این دوره و انجام تمرینهای نظری و عملی آن با تلفن همراه امکانپذیر است و نیازی به استفاده از لپتاپ یا کامپیوتر نیست.
صمیمانه پیشنهاد میکنیم اگر دانشآموز دبیرستان یا فردی علاقمند به یادگیری برنامهنویسی میشناسید، دوره را به او معرفی فرمایید.
تمام محتوای این دوره شامل ویدئوی کلاسها، تمرینهای نظری و عملی «به صورت رایگان» به همهی دانشآموزان ایران تقدیم میشود:
https://learn-python.ir
بیش از ۱۱۰ استاد، دانشجو و دانشآموختهی دانشگاه شریف و سایر دانشگاههای داخل و خارج ایران در تهیهی محتوا و برگزاری آن مشارکت داشتند.
علاوه بر دانشآموزان متوسطه، این دوره مناسب همهی افرادی است که میخواهند برای نخستین بار برنامهنویسی یاد بگیرند و از چالشهای زیبا لذت ببرند.
گذراندن این دوره و انجام تمرینهای نظری و عملی آن با تلفن همراه امکانپذیر است و نیازی به استفاده از لپتاپ یا کامپیوتر نیست.
صمیمانه پیشنهاد میکنیم اگر دانشآموز دبیرستان یا فردی علاقمند به یادگیری برنامهنویسی میشناسید، دوره را به او معرفی فرمایید.
❤3
ی اپلیکیشن خوب آندرویدی برای آپدیت بودن و در دسترس داشتن مقالات جدید:
https://play.google.com/store/apps/details?id=com.substack.app
اینم ی اپ خوب برای گزارشگیری screen time که میتونیم با استفاده از اون متوجه بشیم چقدر از زمانمون رو صرف چه کارهایی با گوشی کردیم.
خیلی وقتا ممکنه ساعتها درگیر گوشی باشیم در حالیکه خودمون ندونیم، این اپ میتونه کمکمون کنه متوجه بشیم چقدر تونستیم از زمانمون به درستی استفاده کنیم.
https://play.google.com/store/apps/details?id=com.burockgames.timeclocker
@osmanmakhtoomdev
https://play.google.com/store/apps/details?id=com.substack.app
اینم ی اپ خوب برای گزارشگیری screen time که میتونیم با استفاده از اون متوجه بشیم چقدر از زمانمون رو صرف چه کارهایی با گوشی کردیم.
خیلی وقتا ممکنه ساعتها درگیر گوشی باشیم در حالیکه خودمون ندونیم، این اپ میتونه کمکمون کنه متوجه بشیم چقدر تونستیم از زمانمون به درستی استفاده کنیم.
https://play.google.com/store/apps/details?id=com.burockgames.timeclocker
@osmanmakhtoomdev
Google Play
Substack - Apps on Google Play
Videos, writing, podcasts & more
پست جدید من تو لینکداین در خصوص RabbitMQ
خوشحال میشم حمایت کنید و کمک کنید به دست بقیه هم برسه.
https://www.linkedin.com/posts/osman-makhtoom_rabbitmq-messaging-techtalk-activity-7226960744251043840-Eq0u?utm_source=share&utm_medium=member_android
@osmanmakhtoomdev
خوشحال میشم حمایت کنید و کمک کنید به دست بقیه هم برسه.
https://www.linkedin.com/posts/osman-makhtoom_rabbitmq-messaging-techtalk-activity-7226960744251043840-Eq0u?utm_source=share&utm_medium=member_android
@osmanmakhtoomdev
Linkedin
Why Message Acknowledgment in RabbitMQ is essential | Osman Makhtoomnejad posted on the topic | LinkedIn
Exploring Message Acknowledgment in RabbitMQ
As many of you know, reliable message delivery is a cornerstone of robust asynchronous systems. RabbitMQ, one of…
As many of you know, reliable message delivery is a cornerstone of robust asynchronous systems. RabbitMQ, one of…
❤1
Depends on doesn't mean imports or calls, necessarily, but rather a more general idea that one module knows about or needs another module.Architecture patterns with Python. xxii introduction
نکته مهمی که اینجا بیان شده خیلی جالبه:
میخاد بگه که منظور از وابستگی الزاما این نیست که ماژول B بیاد ماژول A رو import یا call کنه، بلکه مسئله یکم کلی تره و به این معنیه که اصلا ماژول B درمورد ماژول A چیزی میدونه یا بهش نیاز داره.
خب این توضیح همون اصل پنجم SOLID که میشه D یعنی Dependency inversion هست.
اما من میخام اینو بیارم تو بحث communication روزانه با تیم بیزینس که خودم اون اوایل خیلی مشکل داشتم روش.
اول ی توضیح کلی درمورد این اصل:
میگه که ما دو لایه داریم، یکی لایه سطح بالا و اون یکی لایه سطح پایین.
لایه سطح بالا همون لایه است که بیزینس باهاش سر و کار داره، مثل نشون دادن نمودار سود و زیان و... که در واقع میشه گفت کلیات.
لایه سطح پایین که میشه اون لایه که مثلا دیتاها رو میریزه تو ردیس، تو دیتابیس و... یا ی سری سرویسهای خارجی رو کال میکنه و... که میشه جزییات.
حالا لایه سطح بالا براش مهم نیست که اون اطلاعات چطور محاسبه شدن و به دستش رسیدن، اون فقط نتیجه براش مهمه و درست بودنش، یعنی به جزییات کاری نداره، فقط میخاد لیست سود و زیان هر ماه رو داشته باشه.
حالا برای اینکه ما بتونیم این دو لایه رو جوری بچینیم که بتونن اطلاعات رو با هم رد و بدل کنن بدون اینکه لایه سطح بالا به لایه سطح پایین وابستگی داشته باشه(بدونه که چکار داره میکنه یا مجبور باشه فقط از همون جزییات استفاده کنه) نیاز به ی واسط داریم که بهشون میگیم interface این لایه میانی در واقع کاملا انتزاعیه و به هیچکدوم از دو لایه سطح بالا و پایین وابستگی نداره.
حالا بیایم ببینیم تو مکالمات روزمره با بیزینس چجوریه:
ما ی دولوپر داریم
ی پروداکت داریم
دولوپر همون لایه سطح پایین هست که جزییات رو میدونه و اون نیازمندی که بیزینس میخاد رو بهش میرسونه.
پروداکت هم اون لایه بالاست که نتیجه کار براش مهمه و نمیخاد سرشو با جزییات درد بیاره.
اگر دولوپر نمیتونست اون لایه میانی رو خودش ایجاد کنه برای انتزاع، پس این وسط نیاز به ی تک لید پیدا میشه که میتونه اون سطح انتزاع رو ایجاد کنه.
از کامنتهای شما استقبال میکنم.
@osmanmakhtoomdev
سعی کن تو کدت پنجره شکستهای بجا نذاری
احتمالا نظریه پنجره شکسته رو شنیدید که تو علوم جرم شناسی و اقتصاد مطرحه و میگه که اگه ی خونه یا کارخونهای پنجره شکسته داشته باشه باعث میشه مردم بگن اونجا صاحاب نداره و خودبخود جرأت پیدا کنن بهش تجاوز کنن، خرابکاری کنن و حتی اونجا رو اشغال کنن.
کاری به درستی یا نادرستی این نظریه و پیامدهایی که داشته و انتقاداتی که بهش وارد شده ندارم؛ چون مفهوم این نظریه درسته و قطعا ی چیز نادرست تو ی مجموعه میتونه سبب شول کردن افراد تو باقی موارد بشه.
حالا فکر کن کدی که مینویسی تا ی جایی تمیز باشه و ی قسمتی شول کنی و بیخیال بشی، همون ی بار شول کردنه میتونه باعث بشه هم خودت بهش عادت کنی و هم بقیه که دارن رو پروژه کار میکنن شول کنن و اونا هم شت کد بزنن و این روند ادامه پیدا میکنه تا جایی که ی شت کد گنده رو دستت میمونه.
پس مراقب اون پنجره شکسته باش و زودی تعمیرش کن تا زحماتت هدر نرن.
@osmanmakhtoomdev
احتمالا نظریه پنجره شکسته رو شنیدید که تو علوم جرم شناسی و اقتصاد مطرحه و میگه که اگه ی خونه یا کارخونهای پنجره شکسته داشته باشه باعث میشه مردم بگن اونجا صاحاب نداره و خودبخود جرأت پیدا کنن بهش تجاوز کنن، خرابکاری کنن و حتی اونجا رو اشغال کنن.
کاری به درستی یا نادرستی این نظریه و پیامدهایی که داشته و انتقاداتی که بهش وارد شده ندارم؛ چون مفهوم این نظریه درسته و قطعا ی چیز نادرست تو ی مجموعه میتونه سبب شول کردن افراد تو باقی موارد بشه.
حالا فکر کن کدی که مینویسی تا ی جایی تمیز باشه و ی قسمتی شول کنی و بیخیال بشی، همون ی بار شول کردنه میتونه باعث بشه هم خودت بهش عادت کنی و هم بقیه که دارن رو پروژه کار میکنن شول کنن و اونا هم شت کد بزنن و این روند ادامه پیدا میکنه تا جایی که ی شت کد گنده رو دستت میمونه.
پس مراقب اون پنجره شکسته باش و زودی تعمیرش کن تا زحماتت هدر نرن.
@osmanmakhtoomdev
👍1
حالا اگه ی کد از قبل پنجره شکسته داشت چی؟
ببین، از قدیم گفتن سنگ بزرگ نشانه نزدن است.
بذار دو تا استراتژی تفکر جلو روت بذارم تفاوتشون رو بهم بگو.
روش اول اینه که اینجوری فکر کنی که من باید زبان انگلیسی رو یاد بگیرم و بتونم صحبت کنم و شروع کنی و بخای از همون هفته اول هم نتیجه رو ببینی🥶
روش دوم اینه که اینجوری فکر کنی که من باید زبان انگلیسی رو یاد بگیرم و بتونم صحبت کنم و شروع کنی و هر روزت رو با روز قبلت و هر هفته رو با هفته قبل مقایسه کنی و پیش بری 🤓
تو روش اول چون نگاهت به هدفه و باهاش فاصله داری جا میزنی، اما تو روش دوم چون مسافتی که طی کردی رو میبینی به خودت انگیزه میدی و میری جلو( گرچه داری خودتو گول میزنی 😁 و کلی با هدف فاصله داری، ولی مجبوری )
تو تعمیر و تمیزکاری شت کدها(پنجرههای شکسته) هم همین مسئله وجود داره، ی شت گنده جلوت میذارن و تو مجبوری هم کارایی بالا( انجام کار بیشتر) و هم اثر بخشی بالا( انجام کار درست) داشته باشی.
اگه ذهنتو درگیر این کنی من باید کل این شت رو درست کنم، نه میتونی کارایی داشته باشی و نه میتونی اثربخش باشی.
اما اگه ی پلن برای خود بچینی و اون شت رو به بخشهای کوچیک تقسیم کنی و تو هر اسپرینت سر هر تسکی که بهت اساین میشه قسمت مربوط به اون رو تمیز کنی در آخر میبینی که ی گلستان(بخون شت تمیز) از اون شت کثیف درست کردی.
پس یادت باشه ی پلن داشته باش و نقطه شروع و نقطه پایان رو تو ذهنت داشته باش اما قدمهای کوچیک بردار و مسافتی که رفتی رو با نقطه شروع مقایسه کن نه نقطه پایان!
@osmanmakhtoomdev
ببین، از قدیم گفتن سنگ بزرگ نشانه نزدن است.
بذار دو تا استراتژی تفکر جلو روت بذارم تفاوتشون رو بهم بگو.
روش اول اینه که اینجوری فکر کنی که من باید زبان انگلیسی رو یاد بگیرم و بتونم صحبت کنم و شروع کنی و بخای از همون هفته اول هم نتیجه رو ببینی🥶
روش دوم اینه که اینجوری فکر کنی که من باید زبان انگلیسی رو یاد بگیرم و بتونم صحبت کنم و شروع کنی و هر روزت رو با روز قبلت و هر هفته رو با هفته قبل مقایسه کنی و پیش بری 🤓
تو روش اول چون نگاهت به هدفه و باهاش فاصله داری جا میزنی، اما تو روش دوم چون مسافتی که طی کردی رو میبینی به خودت انگیزه میدی و میری جلو( گرچه داری خودتو گول میزنی 😁 و کلی با هدف فاصله داری، ولی مجبوری )
تو تعمیر و تمیزکاری شت کدها(پنجرههای شکسته) هم همین مسئله وجود داره، ی شت گنده جلوت میذارن و تو مجبوری هم کارایی بالا( انجام کار بیشتر) و هم اثر بخشی بالا( انجام کار درست) داشته باشی.
اگه ذهنتو درگیر این کنی من باید کل این شت رو درست کنم، نه میتونی کارایی داشته باشی و نه میتونی اثربخش باشی.
اما اگه ی پلن برای خود بچینی و اون شت رو به بخشهای کوچیک تقسیم کنی و تو هر اسپرینت سر هر تسکی که بهت اساین میشه قسمت مربوط به اون رو تمیز کنی در آخر میبینی که ی گلستان(بخون شت تمیز) از اون شت کثیف درست کردی.
پس یادت باشه ی پلن داشته باش و نقطه شروع و نقطه پایان رو تو ذهنت داشته باش اما قدمهای کوچیک بردار و مسافتی که رفتی رو با نقطه شروع مقایسه کن نه نقطه پایان!
@osmanmakhtoomdev
👍3
بخون بیا تا پایین ی چیزی بهت بگم
دیروز درگیر ی پروژه بودم که باید بیسش رو میاوردم بالا با داکر.
خب من همیشه عادت داشتم فقط بکند رو داکرایز کنم و اونم تمام نیازمندیاش مثل nginx, elk, postgres, redis, rabbit و... رو همه رو داخل همون docker-compose پروژه میذاشتم و ی نتورک بریج هم میزدم و تمام.
اما این بار گفتم بیام و اینکارو نکنم.
بجاش اومدم ردیس و ربیت و انجین ایکس و پستگرس رو جدا بالا آوردم تو داکر و تو فایل داکر کمپوز فقط بکند و فرانت و ورکر سلری رو کانفیگ کردم.
حتی ساخت دیتابیس و یوزر رو تو پستگرس و grant permission رو رفتم اول تو شل کانتینر پستگرس دستی انجام دادم قبل ران کردن بکند.
و تو شل ربیت هم رفتم یوزر و vhost رو دستی ایجاد کردم و دسترسیا رو ست کردم.
بعد دیدم انجین ایکس نه بکند رو میشناسه نه فرانت رو و دوباره ی نتورک ایجاد کردم و همه سرویسا رو وصل کردم بهش.
حالا سر سرو کردن استتیک فایلهای بکند دوباره مشکل داشت انجین ایکس و درگیر اون بودم 😢
و الی آخر....
همه اینا رو تعریف کردم تا برسم به این که:
دوستان لطفا قبل شروع ی کار اول مطالعه کنید، اون چیزایی که یاد گرفتید رو تیک بزنید و قدم به قدم طبق اونا به ترتیب پیش برید، تا وقتی یکی رو تموم نکردید سراغ بعدی نرید، مثلا اولا ردیس اوکی بشه بعد ربیت و... و سعی کنید با شل اسکریپت دوست بشید و ازش برای اتومات کردن کارا استفاده کنید.
هر چالشی برخوردید یادداشت کنید چون قطعا دوباره بهش برمیخورید.
اگه رعایت نکنید کلی تایم هدر میدید.
@osmanmakhtoomdev
دیروز درگیر ی پروژه بودم که باید بیسش رو میاوردم بالا با داکر.
خب من همیشه عادت داشتم فقط بکند رو داکرایز کنم و اونم تمام نیازمندیاش مثل nginx, elk, postgres, redis, rabbit و... رو همه رو داخل همون docker-compose پروژه میذاشتم و ی نتورک بریج هم میزدم و تمام.
اما این بار گفتم بیام و اینکارو نکنم.
بجاش اومدم ردیس و ربیت و انجین ایکس و پستگرس رو جدا بالا آوردم تو داکر و تو فایل داکر کمپوز فقط بکند و فرانت و ورکر سلری رو کانفیگ کردم.
حتی ساخت دیتابیس و یوزر رو تو پستگرس و grant permission رو رفتم اول تو شل کانتینر پستگرس دستی انجام دادم قبل ران کردن بکند.
و تو شل ربیت هم رفتم یوزر و vhost رو دستی ایجاد کردم و دسترسیا رو ست کردم.
بعد دیدم انجین ایکس نه بکند رو میشناسه نه فرانت رو و دوباره ی نتورک ایجاد کردم و همه سرویسا رو وصل کردم بهش.
حالا سر سرو کردن استتیک فایلهای بکند دوباره مشکل داشت انجین ایکس و درگیر اون بودم 😢
و الی آخر....
همه اینا رو تعریف کردم تا برسم به این که:
هر چالشی برخوردید یادداشت کنید چون قطعا دوباره بهش برمیخورید.
اگه رعایت نکنید کلی تایم هدر میدید.
@osmanmakhtoomdev
👍2