| Erfan's Notes |
188 subscribers
81 photos
10 videos
102 links
Download Telegram
| 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
This media is not supported in your browser
VIEW IN TELEGRAM
با استفاده از این کتابخونه می‌تونید توی پروژه‌های وب‌تون با کم‌ترین تعداد خط ممکن، یک Easter Egg برای ساعت های هوشمند بزارید

https://github.com/ramonszo/watchface.js
ظاهرا توی نسخه 9 از PHP که در حال توسعه هست و اواخر 2023 لانچ میشه، قراره سیستم JIT Compile جدیدی معرفی بشه

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

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

https://github.com/dstogov/ir
🔥3
با استفاده از این کتابخونه می‌تونید توی PHP یک سند HTML رو به PDF تبدیل کنید

کاربردش بیشتر می‌تونه برای ایجاد فاکتور قابل چاپ یا ... باشه

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

درمورد CSS هم که چیزی نگم بهتره

https://github.com/dompdf/dompdf
🔥2
| Erfan's Notes |
یکی از جالب‌ترین فرایند‌ها توی برنامه‌نویسی، مبحث بهینه‌ساز‌ی کد هست، سعی می‌کنم توی یک‌سری پست‌ها نکاتی درمورد کدنویسی بهینه‌تر بگم و شروعی که می‌کنم با حلقه for هست احتمالا توی تمامی زبان های برنامه‌نویسی‌ای که استفاده کردید، کدی مشابه کد زیر برای حلقه…
در ادامه مباحث بهینه‌سازی کد، گاهی اوقات پیش میاد که نیاز داریم بررسی کنیم و ببینیم که آیا یک آرایه خالی هست یا دارای عضو

مرسوم‌ترین روشی که به ذهن می‌رسه چنین چیزی هست :
if (count($arr) > 0) { }

یا اگر کاربر قدیمی باشیم، به جای count از اسم دیگه‌اش sizeof استفاده می‌کنیم

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

(البته PHP لزوما همیشه تعداد ایتم ها رو نمی‌شماره، در اکثر اوقات تعداد رو به صورت یک مقدار در کنار خود هش تیبل داره مگر اینکه دچار تغییرات عجیب بشه)

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

کد بالا به این شکل بهینه می‌شه :
if (isset($arr[0])) { }

به همین سادگی، به جای اینکه تعداد ایتم های یک ارایه رو بشماریم، صرفا چک می‌کنیم که ایا اندیس صفر داره یا نه

و البته این روش روی ارایه‌ها جواب میده، نه روی دیکشنری های key value based

برای دیکشنری‌ها می‌تونیم از این تکنیک استفاده کنیم :
if ($arr !== []) { }

به‌صورت خلاصه، اولویت با isset هست و در مرحله بعدی مقایسه با ارایه خالی و در مرحله بعد هم استفاده از count و …

البته مطمئنا تفاوت این متد ها در حدی نیست که ما متوجه بشیم، ولی در مقیاسی که تعداد ایتم ها میلیونی باشه، تفاوت‌شون در حد میلی‌ثانیه نمایان می‌شه

و البته باز هم ذکر می‌کنم که الزاما PHP با صدا کردن count نمیاد ارایه یا ابجکت رو بشمره، بلکه معمولا این تعداد رو از قبل توی مموری در کنار متا دیتا های متغیر ذخیره کرده و صرفا پوینتر روی بخش مربوطه ست می‌کنه و می‌خونه و تحویل میده
🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
با استفاده از کتابخونه Vanta.js می‌تونید بدون داشتن دانش یا حرفه‌ خاص، پس‌زمینه های سه‌بعدی متحرک به وبسایت‌تون اضافه کنید

⭕️ نمایش در گیت‌هاب
⭕️ نمایش وبسایت
🔥4
Grafana + Prometheus
🔥8
| Erfan's Notes |
Grafana + Prometheus
یکی از ابزار هایی که در طول سال های اخیر شنیده بودم، ولی به‌دلایل عدم تمایل تغییر یا استفاده از چیز جدید، ازش استفاده نمی‌کردم پروژه Prometheus بود که امروز امتحانش کردم و نتیجه استفاده ازش واقعا لذت‌بخش بود

ابزار Prometheus در واقع یک سیستم جامع جمع‌آوری آمار هست، حالا چه آماری ؟ هر آماری که فکرش رو بکنید

در واقع یک Query Language مخصوص داره برای اینکه شما بتونید بهش آمار پاس بدید، یا ازش آمار پس بگیرید، بدون اینکه وارد پیچیدگی های خاصی بشید

این ابزار به خودی خودش صرفا یه ابزار و سرویس آمارگیر هست و می‌تونید Interval هایی رو تعریف کنید که در زمان های مشخص، به تعدادی Job که تعریف می‌کنید (و خودش Exporter نام‌گذاری می‌کنه) درخواست بزنید و بگید که بهم آمار بده!

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

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

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

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

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

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

⭕️ prometheus.io
⭕️ grafana.com
🔥8