| Erfan's Notes |
188 subscribers
81 photos
10 videos
102 links
Download Telegram
Channel created
خب سلام، توی این کانال سعی می‌کنم مطالبی رو به صورت راحت و بدون مقدمه و پیچیدگی های مرسوم، منتشر کنم، لزوما هم تمامی مطالب فنی نیستند و با چاشنی سلیقه و اعتقاد شخصی و تعصب هم احتمالا همراه باشه
و مطمئنا تعداد اعضا یا مخاطبین هم اهمیت خاصی در روند و فرایند ایجاد نمی‌کنه، اینجا می‌تونه انباری برای ارشیو یا رفرنس به مطالب باشه
اولین بحثی که باهاش شروع می‌کنم، درمورد گنو/لینوکس هست‌،

اگه با گنو/لینوکس و کاربردش آشنا نیستید این مقاله‌ای که چند سال پیش نوشتم رو می‌تونید بخونید، سایت به لحاظ فنی منسوخ هست ولی محتوا کماکان ولید هست
https://erfanmola.ir/gnu-linux/

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

منتهی قبل از شروع به نصب یک توزیع، یکی از مهم‌ترین مراحل نصب معمولا پارتیشن‌بندی هست و خب به خودی خود خطری نداره، ولی خب حتی قاشق هم دست بچه‌ای که استفاده ازش رو بلد نیست خطرناکه، برای همین توصیه می‌کنم اول با پارتیشن‌ها در گنو/لینوکس اشنا بشید، این پستی که من توی سایت منتشر کرده بودم میتونه نقطه خوبی برای شروع باشه :
https://erfanmola.ir/linux-partitioning/

بعدش می‌تونید برید سراغ نصب یک توزیع معقول

برای اوبونتو می‌تونید از این اموزشی که چند سال پیش ضبط کردم استفاده کنید، کیفیت و صدا خوب نیست ولی محتواش همچنان ولید هست، یا هم که می‌تونید هر آموزش نصب اوبونتویی که دوست دارید رو ببینید و ورژن هم معمولا مهم نیست چون اوبونتو بالای ده سال هست که نحوه نصبش تغییری نداشته
https://erfanmola.ir/install-ubuntu-20-04/

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

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

درمورد دلایل عدم شروع با موارد بالا مفصل صحبت می‌کنیم #بعدا اگر فرصت شد

بعد از طی کردن مراحل بالا، انتظار میره که یک توزیع گنو/لینوکسی نصب کرده باشید و‌ دنبال یادگیری بیشتر باشید

برای اشنایی با فلسلفه و تاریخچه گنو/لینوکس
https://t.me/ErfanMola/472

برای اشنایی با پکیج‌منیجرها در گنو/لینوکس (#بعدا)
https://t.me/ErfanMola/440

و البته سایر مطالبی که می‌تونه براتون مفید باشه :

آموزش نصب آرچ لینوکس (#بعدا)
https://erfanmola.ir/install-arch-linux/

آموزش نصب و شخصی سازی میزکار XFCE
https://erfanmola.ir/install-xfce/

آموزش نصب و شخصی‌سازی میزکار گنوم
https://t.me/ErfanMola/460

آموزش نصب و شخصی‌سازی مدیرپنجره i3
https://t.me/ErfanMola/465
کتابخونه جالبی برای انیمیشن و موشن‌گرافی توی جاوا اسکریپت :

https://mojs.github.io/
| Erfan's Notes |
کتابخونه جالبی برای انیمیشن و موشن‌گرافی توی جاوا اسکریپت : https://mojs.github.io/
This media is not supported in your browser
VIEW IN TELEGRAM
از SVG استفاده میشه و خبری از Canvas نیست، برای همین طرح‌ها وکتور هستند یا به اصطلاح خودش : Retina Ready هستند، جلوه تمیزی داره و به مراتب سریع‌تر از Canvas هست چون مرورگرها معمولا بهینه شدند برای رندر و انیمیت کردن المنت تا Canvas
یکی از مباحث جالبی که همیشه سعی می‌کنم درموردشون یاد بگیرم، ارتباط بین برنامه‌نویسی با سایر علوم هست و همچنین کاربرد برنامه‌نویسی در سایر علوم

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

یکی از پروژه های مفید در این زمینه Z3 هست که یک Theorem Prover هست و SMT Solver ای که از فرمت SMTLib پشتیبانی می‌کنه

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

برای شروع می‌تونید پروژه گیت‌هاب اش رو ببینید و درموردش بخونید، پروژه توسط مایکروسافت توسعه پیدا می‌کنه :

https://github.com/Z3Prover
🔥3
یکی از باحال‌ترین پروژه هایی که وجود داره به نظر من، پروژه Puppeteer هست، چرا ؟ چون گوگل خودش توسعه‌اش میده

کاربردش چیه ؟ باهاش می‌تونید به‌صورت برنامه‌نویسی یک مرورگر کروم رو کنترل کنید

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

یا یه سایتی رو لود کنید و داخلش با کدنویسی لاگین کنید و کار های باحال بکنید

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

مطمئنا فرد عادی انقدر بیکار نیست که وب‌گردی عادی‌اش رو با کد انجام بده، بیشتر جنبه این پروژه برای اتوماسیون کارها هست، مثلا می‌تونید اسکریپت بنویسید که : وقتی پروژه رو پوش کردم، یک کروم بالا بیار و برو سایت Trello و تسکی که برای پوش داشتم رو تیک بزن

نحوه کار اش هم به این شکل هست که یک کروم به‌صورت Headless یا همون CLI بالا میاره و شامل تمامی بخش های مختلف مرورگر میشه، از جمله انجین JS و CSS و‌ DOM و BOM و ...، در کل همون کروم هست صرفا اینکه GUI اش رو به شما نشون نمیده که کم‌مصرف‌تر باشه (:

پروژه های مشابه‌ای هم توی زبان های مختلف وجود داره، مثلا سلنیوم برای پایتون هست، ولی نکته خوب Puppeteer این هست که از طریق خود کروم عادی می‌تونید براش ماکرو رکورد کنید، یک کاری رو انجام بدید و کروم براتون ضبط اش کنه و یک ماکرو قابل استفاده توی کد بهتون بده

در کل خیلی باحال هست و توصیه می‌کنم چک اش کنید

https://github.com/puppeteer/puppeteer
🔥3
یکی از جالب‌ترین فرایند‌ها توی برنامه‌نویسی، مبحث بهینه‌ساز‌ی کد هست، سعی می‌کنم توی یک‌سری پست‌ها نکاتی درمورد کدنویسی بهینه‌تر بگم

و شروعی که می‌کنم با حلقه for هست

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

for ($i = 0; $i <= count($arr); $i++) { }

این کد ظاهرا مشکلی نداره، ولی در 99 درصد مواقع بهینه‌ترین حالت نیست! دلیلش هم این هست که توابع داخل سربرگ حلقه، در هر iteration یا به‌عبارتی‌ در هر چرخش فراخوانی میشن

فرض کنید ارایه $arr دارای یک میلیون ایتم باشه، در این صورت تابع count($arr) به تعداد یک میلیون بار فراخوانی میشه! چون در هر دور چرخش حلقه کال میشه

راه بهینه‌تر این هست که همیشه تا حد‌ امکان، سایز حلقه‌مون یک مقدار استاتیک باشه، نسخه اصلاح شده کد بالا می‌تونه به این شکل باشه :

for ($i = 0, $count = count($arr); $i <= $count; $i++) { }

البته چنین بهینه‌سازی هایی در مقیاس عادی و مثلا برای ۱۰۰۰ ایتم، تفاوت اش در حد میلی‌ثانیه می‌تونه باشه، چرا که ۱۰۰۰ بار شمردن یک ابجکت برای کامپیوتر کار پیچیده‌ای نداره با توجه به کلاک پردازنده های فعلی، ولی در نهایت اگه دیدگاه تون این باشه که دارید ۲ برابر زحمت بیشتری می‌کشید برای نتیجه‌ای ثابت، می‌تونید درک کنید که حتی نانوثانیه‌ها هم مهم هستند، چه برسه میلی‌ثانیه
🔥8
این تصویر Life Cycle هر ریکوئست در PHP هست

ابتدا G INIT و سپس M INIT و بعد وارد فاز ریکوئست می‌شه و R INIT صورت می‌گیره

و بعد اجرای کد و در نهایت Shutdown های مربوطه و بستن پروسس

درمورد هرکدوم از مراحل و روش های حذف/بهینه‌سازی مراحل در آینده سعی می‌کنم صحبت کنم و به هر مرحله به‌صورت دقیق و با جزئیات بپردازم
🔥10
Forwarded from | Erfan Mola |
💠 پارتیشن‌ها و فایل‌سیستم‌ها

⭕️ Eyfan.ir/partitions-and-filesystems

💡 توی این پست درمورد مفهوم پارتیشن‌ها و فایل‌سیستم‌ها حرف می‌زنیم و نحوه ذخیره شدن دیتا روی پارتیشن‌ها در گنو/لینوکس و ویندوز رو بررسی می‌کنیم

💎 @ErfanMola
🔥5
Media is too big
VIEW IN TELEGRAM
توی این ویدیو درمورد مبحث «همزمانی در توسعه نرم‌افزار» توضیح دادم

درمورد مباحث Multi Processing و Multi Threading و Couroutine و Async حرف می‌زنیم و تفاوت های هرکدوم رو بررسی می‌کنیم

این ویدیو رو فعلا توی یوتیوب منتشر نکردم به‌صورت عمومی، هفته های آینده به‌صورت عمومی توی کانال اصلی منتشر می‌کنم

اگر سوالی داشتید کامنت کنید، یا موضوعی برای ویدیو/ویس های بعدی، چون قصد دارم روزانه یک ویس درمورد یک مبحث ضبط کنم و قرار بدم
🔥6
کتابخونه Paper.js که اخیرا باهاش آشنا شدم، یک کتابخونه فوق‌العاده در زمینه سر و کله زدن با SVG و Canvas توی HTML هست، درمورد اینکه کاربردش چیه نمیشه به‌صورت کلامی توضیح داد، بهتره دمو هاش رو ببینید

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

مثال های جالبی هم داره که می‌تونید ببینید :
http://paperjs.org/examples/tadpoles/
🔥5
اگه از PHP استفاده می‌کنید و مثل من روی پرفرمنس وسواس دارید، یک کیت به اسم Zephir وجود داره که با استفاده از اون می‌تونید با یک سینتکس نسبتا جالب و شبیه PHP،‌ اکستنشن هایی برای PHP بنویسید که به‌صورت .so قابل استفاده هستند و به C کامپایل می‌شن

در چه سناریو هایی می‌تونه کاربرد داشته باشه ؟

فرض کنید که ما یک برنامه‌ای با PHP نوشتیم که نیاز به محاسبات پیچیده و عجیب و غریب داره که CPU Bound هستند
مثلا برای بنچمارک، یک فانکشن نوشتیم که ضرب ماتریسی انجام میده و این عملیات ضرب ماتریسی رو به‌تعداد یک میلیون بار، روی دو تا ماتریس 500x500 انجام میدیم

در حالت عادی با خود PHP نتیجه حدود 8 ثانیه طول می‌کشه
در حالتی که فانکشن‌مون رو با Zephir بنویسیم و به اکستنشن PHP با زبان C کامپایلش کنیم، حدود 2 ثانیه طول می‌کشه و این یعنی 4x بهینه‌سازی در زمان اجرا

البته می‌تونید متوجه بشید که، این اعداد و ارقام، توی سناریو های دنیای واقعی ما که معمولا وبسایت‌ها هستند، زیاد نمی‌تونند تفاوت ایجاد کنند، چون معمولا یک وبسایت نیاز نداره که یک میلیون بار دو تا ماتریس 500x500 رو به هم ضرب کنه و گلوگاه ما در وبسایت‌ها معمولا IO هست و نه CPU، ولی خب در حالت کلی، اگر متد یا کلاس یا تابع یا ... ای دارید که به‌صورت انبوه فراخوانی میشه و پرفرمنس جالبی نداره، در مرحله اول الگوریتم‌تون رو بهینه کنید و در مرحله دوم، از چنین ابزار هایی استفاده کنید برای نوشتن و کامپایل کردن اون‌ها به‌صورت اکستنشن

نظر خود من درمورد این قضیه ؟ طبق Use Case های من کاربرد آنچنانی نداره، ولی اگر میکرو ثانیه‌ها براتون مهم هست و می‌خواهید Development Time رو فدای Performance میکرو ثانیه‌ای بکنید، می‌تونه بیارزه، هرچند خودم هم سعی می‌کنم توی یکی از پروژه های واقعی آینده‌مون استفاده کنم و اگر شد نتیجه‌اش رو اینجا بگم

https://zephir-lang.com/en
🔥8
از جمله مفاهیمی که معمولا به‌دلیل درک اشتباه، به‌جای هم به‌صورت اشتباه به‌کار می‌رن، مفاهیم Concurrency و Parallelism هستند

مفهوم Parallelism یعنی اینکه، ما یک CPU داریم و 4 تا هسته داره، پس بهتره یک برنامه‌ای بنویسیم که 4 تا پروسس مختلف ایجاد کنه و از طریق IPC یا همون Inter Process Communication پروسس‌ها با همدیگه حرف بزنند و از پتانسیل کامل CPU استفاده بشه، به‌عبارتی، چهار تا کارگر استخدام کنیم تا کارمون رو پیش ببره

مفهوم Concurrency یعنی اینکه، ما یک CPU داریم که بر فرض مثال، یک هسته داره، پس ما محدود به یک هسته هستیم و باید نهایت استفاده مون رو از این هسته ببریم، نباید اجازه بدیم IO Blocking پیش بیاد، تا حد امکان کدنویسی async و couroutine انجام بدیم تا Thread اصلی برنامه بلاک نشه و همزمان کار های مفید بیشتری رو انجام بده، یا به‌عبارتی، تا حد‌ امکان، لنگ این نباشه که یکی بهش دیتا برسونه
🔥3
کل دنیا و تمامی برنامه‌ها و بازی‌های موجود توی دنیا، از ویندوز گرفته تا مک و اندروید و ...، همگی اوپن سورس هستند!

فقط کافیه که اسمبلی بلد باشید 🚶🏻‍♂️
🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
با استفاده از slidev می‌تونید اسلاید هایی با استفاده از کدنویسی، به جای استفاده از پاورپوینت بسازید

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

محتواش از Markdown هم پشتیبانی می‌کنه

https://github.com/slidevjs/slidev
🔥2
زبان PHP یکی از راحت‌ترین روش‌ها رو برای تعریف آرایه داره، تفاوتی نداره که بخواهیم آرایه ترتیبی تعریف کنیم یا آرایه کلیدی یا آرایه تو در تو یا ...، معمولا همه این‌ها با استفاده از [] تعریف می‌شن که به لحاظ راحتی، راحت هست، ولی به لحاظ پرفرمنس توی مقیاس های میلیونی یا میلیاردی، عالی نیستند

برای حل این مشکل توی اکثر زبان‌ها حتی جاوا اسکریپت، آرایه هایی داریم تحت عنوان ArrayBuffer که یک بافر از Array هست با تایپ ثابت با هدف پرفرمنس بهتر، که این افزونه زیر برای PHP که با C نوشته شده، می‌تونه قابلیت تعریف Array Buffer های پرفرمنس عالی رو برامون فراهم کنه و توی سطوح پایین‌تر هم سر بار(Overhead) کم‌تری داره

تایپ های بافری که ساپورت می‌کنه:
Int8Array
UInt8Array
Int16Array
Uint16Array
Int32Array
UInt32Array
FloatArray
DoubleArray

https://github.com/nikic/buffer
🔥4
سورس کد TDLib حدود نیم میلیون خط کد هست و از حدود ۵۰۰٫۰۰۰ خط کد، فقط و فقط ۲۰٫۰۰۰ خط کد مربوط به پروتکل MTProto و ارسال و دریافت دیتا و اینکریپشن و ... هست

مابقی ۴۰۰٫۰۰۰ خط کد، اکثرا برای ولیدیشن دیتا و پارامتر های دریافتی از کاربر برای متدها هست، که بشه براش پاسخ مناسب داد، مثلا کسی به‌عنوان chat id مقدار bool نده و موارد مشابه

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

دفعه بعدی که کامپایل TDLib تون یک ساعت طول کشید، بدونید که بالای نود درصد تایم مصرفی تون برای کامپایل تعدادی انبوهی if بوده
🔥8