| Erfan's Notes |
188 subscribers
81 photos
10 videos
102 links
Download Telegram
این تصویر 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
اگر با ابزار curl آشنا باشید و کار کرده باشید، احتمالا ابزار جدید trurl هم براتون جالب باشه، یکی از ابزار هایی که جای خالی‌اش واقعا حس می‌شد و جدیدا توسعه داده شده و معرفی شده

ابزار trurl رو سازنده curl نوشته و در واقع بخش زیادی از کدش هم از libcurl استفاده شده و در عمل، یک ابزار همه کاره برای ساخت/تجزیه انواع مختلف URL با پروتکل های مختلف هست

در واقع مثل ابزار tr روی url هست و البته که استفاده اش صرفا به tr محدود نمی‌شه، یک ابزار قدرتمند همه کاره که می‌تونید بهش هرنوع url ای بدید و بهتون به‌شکل های مختلف parse کنه و مقادیری مثل scheme و domain و query و port و protocol و ... بده

یا می‌تونید برعکس اینکار رو انجام بدید و بهش مقادیر مختلف رو بدید تا براتون کار یک URL Builder رو انجام بده

معمولا ما برای هندل کردن URL هامون از Regex استفاده می‌کنیم در زبان های مختلف، که تا حدودی هم جواب می‌ده ولی خب URL ها خیلی خیلی می‌تونند پیچیده باشند،‌ برای همین چنین ابزاری واقعا جای خالی‌اش حس می‌شد

مثلا برای یک IP می‌تونیم رجکس بنویسیم که 127.0.0.1 رو تشخیص بده، ولی آی‌پی بالا در واقع معادل 127.1 هست و کاملا هم ولید هست، ولی کم‌تر جایی پیدا می‌شه که آی‌پی دو بخشی رو هندل کرده باشه، این ابزار می‌تونه چنین کار هایی رو برامون آسون‌تر کنه

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

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

https://github.com/curl/trurl
🔥6
یکی از علایق من توی دنیای PHP به اکستنشن OpenSwoole هست که به‌عبارتی یک تقویت‌کننده یا SuperCharger یا انرژی‌زا برای PHP هست، ولی متاسفانه این اکستنشن توسط یک عده حرفه‌ای بی‌حوصله نوشته شده و Maintain می‌شه و راهنما و مستندات درست و حسابی نداره، حتی مستنداتش هم زود به زود منسوخ می‌شن

در اصل یک فورک از Swoole هست، که خب باز Swoole مستندات بهتری داره ولی اکثرا به زبون نقاشی خرچنگ و قورباغه‌ای هست (نمی‌دونم چینیه یا ژاپنی یا کره‌ای)

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

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

طبق گفته خودش، از کد NumPy الگو گرفته و برای محاسبات روی آرایه های عددی گزینه خیلی خیلی سریع‌تر و با Memory Footprint کم‌تری هست

https://github.com/phpsci/phpsci-carray
🔥4