اتاق برنامه نویسی </>
405 subscribers
63 photos
1 video
7 links
📌 کانال آموزش لاراول
@PapiDon_state
Download Telegram
اتاق برنامه نویسی </>
Learn things that don't change یادگیری چیزهایی که تغییر نمی‌کنند. در این پست، تلاش می‌کنیم بفهمیم چرا باید اصول پایه را به جای فریم‌ورک‌ها یاد بگیریم و این موضوع چه تاثیری دارد. 🤔 آیا تاکنون به این فکر کرده‌اید که چرا برخی تکنولوژی‌ها هنوز با ما هستند…
🤓 کتاب‌هایی که هر مهندس نرم‌افزاری باید در سال ۲۰۲۴ بخواند ...

🔖The Pragmatic Programmer The Pragmatic Programmer
David Thomas and Andrew Hunt

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

🔖The Pragmatic Programmer Modern Software Engineering
David Farley

این کتاب بر ساخت نرم‌افزار عالی تمرکز دارد و نویسنده یک چارچوب محکم برای اتصال بهترین شیوه‌ها مانند Continuous Delivery (CD)، معماری شش ضلعی و Test-Driven Development به ایده‌های اصلی در مهندسی نرم‌افزار ارائه می‌دهد. او همچنین در مورد تاریخچه توسعه نرم‌افزار و ایده‌هایی که صنعت را تغییر داده‌اند، می‌نویسد.

🔖The Pragmatic Programmer Code Complete: A Practical Handbook of Software Construction
Steve McConnell

یکی از کتاب‌هایی که بیش از ۱۵ سال پیش نوشته شده و هنوز معتبر است. این کتاب به طراحی، کدنویسی، اشکال‌زدایی و تست می‌پردازد. در بیش از ۹۰۰ صفحه، نویسندگان نحوه نوشتن برنامه‌ها برای مردم اول و سپس برای کامپیوترها، چگونگی تقسیم کد به دامنه‌ها و چگونگی تسلط بر ویژگی‌های انسانی بهترین برنامه‌نویسان (تواضع، کنجکاوی و مهم‌تر از همه، کنترل اگو) را توضیح می‌دهند.

🔖The Pragmatic Programmer Software Engineering at Google
Titus Winters, Tom Manshreck, and Hyrum Wright

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

🔖The Pragmatic Programmer Head First Design Patterns
Eric Freeman

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

🔖The Pragmatic Programmer Grokking Algorithms
Aditya Bhargava

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

🔖The Pragmatic Programmer Designing Data-Intensive Applications
Martin Kleppman

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

🔖The Pragmatic Programmer Growing Object-Oriented Software by Tests
Steve Freeman

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

🔖The Pragmatic Programmer A Philosophy of Software Design
John Ousterhout

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


📁 #Skills

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
اتاق برنامه نویسی </>
Photo
🎓 تفاوت بین تعریف Volume در Dockerfile و استفاده از v- هنگام اجرای کانتینر

سلام دوستان ! 👋

امروز می‌خواهیم درباره یکی از مفاهیم مهم در داکر صحبت کنیم: Volume. شاید این سوال برای شما پیش آمده باشد که وقتی می‌توانیم Volume را هم در Dockerfile و هم هنگام اجرای کانتینر با استفاده از v- تعریف کنیم، تفاوت بین این دو روش چیست؟ 🤔

🔍 تعریف Volume در Dockerfile

وقتی شما یک Volume را در داخل Dockerfile تعریف می‌کنید، در حقیقت دارید به داکر می‌گویید که این دایرکتوری‌ها باید به عنوان نقاط ذخیره‌سازی پایدار (Persistent Storage) عمل کنند. به عبارت دیگر، وقتی یک کانتینر از روی این ایمیج ساخته می‌شود، آن دایرکتوری‌هایی که به عنوان Volume تعریف کرده‌اید، از کانتینر جدا شده و داده‌های آنها حفظ می‌شود، حتی اگر کانتینر متوقف شود یا از بین برود.

🔧 مثال:

FROM ubuntu:latest
VOLUME /data


در اینجا، وقتی کانتینر از این ایمیج ساخته می‌شود، دایرکتوری /data به طور خودکار به یک Volume تبدیل می‌شود. اگر فایل یا داده‌ای در این دایرکتوری قرار دهید، حتی بعد از حذف کانتینر، این داده‌ها باقی می‌مانند.

مزیت :

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

🔍 استفاده از v- هنگام اجرای کانتینر

حالا فرض کنید شما یک ایمیج داکر دارید و می‌خواهید هنگام اجرای کانتینر، یک دایرکتوری خاص از سیستم فایل میزبان (Host) خود را به داخل کانتینر Mount کنید. اینجاست که v- به کار می‌آید. این گزینه به شما اجازه می‌دهد یک Volume را دینامیک (در زمان اجرا) ایجاد کنید و یک دایرکتوری میزبان را به دایرکتوری کانتینر متصل کنید.

🔧 مثال:

docker run -v /path/on/host:/path/in/container myimage


در اینجا، /path/on/host
(که روی سیستم میزبان است) به /path/in/container (که داخل کانتینر است) متصل می‌شود. هر تغییری که در این مسیرها رخ دهد، بین میزبان و کانتینر به اشتراک گذاشته می‌شود.


مزیت:

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

🎯 نتیجه‌گیری: تفاوت کلیدی

- تعریف Volume در Dockerfile بیشتر به معنای تعیین مکان‌های پیش‌فرض برای ذخیره‌سازی پایدار در هنگام ساخت ایمیج است.

- استفاده از v- به شما اجازه می‌دهد در زمان اجرا، به صورت پویا دایرکتوری‌های میزبان و کانتینر را به یکدیگر متصل کنید.

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


📌 توجه داشته باشید که تعریف VOLUME در Dockerfile الزاما به معنای این نیست که این مسیرها به طور خودکار به بیرون (میزبان) پاس داده می‌شوند یا به اشتراک گذاشته می‌شوند. این تنها به داکر اعلام می‌کند که این مسیرها باید به صورت پایدار و مستقل از چرخه زندگی کانتینر ذخیره شوند. اینکه این Volume‌ها به یک دایرکتوری در میزبان متصل شوند یا نه، به زمان اجرای کانتینر و نحوه استفاده از v- بستگی دارد.


📁 #Docker

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍1🔥1
اتاق برنامه نویسی </>
Photo
🎓 تفاوت بین CMD و ENTRYPOINT در Dockerfile

امروز می‌خواهیم به یکی از موضوعات پرکاربرد در دنیای داکر بپردازیم: تفاوت بین دو دستور مهم CMD و ENTRYPOINT. اگر تا به حال با Dockerfile کار کرده باشید، احتمالاً با این دو دستور مواجه شده‌اید و شاید برایتان سوال شده باشد که تفاوت آنها در چیست و چه زمانی باید از هرکدام استفاده کرد. بیایید این موضوع را با چند مثال واقعی و ملموس بررسی کنیم.

🔍 CMD: تنظیم فرمان پیش‌فرض (قابل تغییر)

CMD در Dockerfile برای تعیین یک فرمان پیش‌فرض به کار می‌رود که کانتینر شما اجرا خواهد کرد، مگر اینکه در زمان اجرای کانتینر فرمان دیگری را مشخص کنید. به عبارت دیگر، CMD به شما اجازه می‌دهد یک رفتار پیش‌فرض برای کانتینر تعریف کنید که در صورت نیاز، قابل تغییر است.

🔧 مثال

فرض کنید شما یک Dockerfile برای اجرای یک وب‌سرور ساده با Python می‌نویسید:


FROM python:3.9-slim
WORKDIR /app
COPY . /app
CMD ["python", "-m", "http.server", "8080"]



در این مثال، فرمان CMD به طور پیش‌فرض وب‌سرور پایتون را روی پورت 8080 اجرا می‌کند. حالا اگر کسی کانتینر شما را بدون هیچ فرمان اضافه‌ای اجرا کند، این وب‌سرور راه‌اندازی خواهد شد. اما اگر کاربر بخواهد یک فرمان متفاوت (مثلاً اجرای یک اسکریپت پایتون دیگر) را اجرا کند، می‌تواند این فرمان را هنگام اجرای کانتینر مشخص کند و فرمان جدید جایگزین CMD خواهد شد:


docker run myimage python my_script.py



ویژگی کلیدی: CMD به شما امکان می‌دهد یک فرمان پیش‌فرض تنظیم کنید که کاربر در صورت نیاز می‌تواند آن را تغییر دهد.

🔍 ENTRYPOINT: فرمان اصلی و ثابت (غیرقابل تغییر)

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

🔧 مثال :

فرض کنید شما یک Dockerfile برای یک ابزار خط فرمان (CLI) می‌نویسید که همیشه باید از یک دستور خاص برای اجرا استفاده شود:


FROM ubuntu:20.04
WORKDIR /app
COPY . /app
ENTRYPOINT ["curl"]



در اینجا، ENTRYPOINT فرمان curl را به عنوان فرمان اصلی تنظیم می‌کند. هر چیزی که کاربر در زمان اجرای کانتینر وارد کند، به عنوان آرگومان به curl اضافه می‌شود. مثلاً:


docker run mycurlimage https://example.com



این دستور باعث می‌شود کانتینر curl https://example.com را اجرا کند.


ویژگی کلیدی: ENTRYPOINT به شما اجازه می‌دهد یک فرمان اصلی تنظیم کنید که همیشه اجرا می‌شود و فرمان‌های دیگر به عنوان آرگومان به آن اضافه می‌شوند.


🎯 ترکیب CMD و ENTRYPOINT: ایجاد فرمان‌های قابل تنظیم

گاهی اوقات می‌خواهید یک فرمان اصلی ثابت داشته باشید، اما به کاربران اجازه دهید آرگومان‌های پیش‌فرض را تغییر دهند. در این حالت، می‌توانید ENTRYPOINT و CMD را با هم ترکیب کنید.


🔧 مثال:

فرض کنید یک Dockerfile برای یک اسکریپت پایتون دارید که به طور پیش‌فرض باید با یک آرگومان خاص اجرا شود، اما کاربر می‌تواند آن آرگومان را تغییر دهد:


FROM python:3.9-slim
WORKDIR /app
COPY . /app
ENTRYPOINT ["python", "my_script.py"]
CMD ["--default-arg"]



در این حالت، وقتی کانتینر را بدون فرمان اضافی اجرا می‌کنید، اسکریپت my_script.py با آرگومان --default-arg اجرا می‌شود:


docker run myimage



اما اگر کاربر بخواهد آرگومان را تغییر دهد:


docker run myimage --custom-arg



در این حالت، اسکریپت با آرگومان --custom-arg اجرا می‌شود.


🎯 نتیجه‌گیری: تفاوت کلیدی

🔹CMD:
برای تنظیم یک فرمان پیش‌فرض که در صورت عدم تعیین فرمان در زمان اجرا، اجرا می‌شود. این فرمان قابل تغییر است و می‌تواند توسط کاربر در زمان اجرا با فرمان دیگری جایگزین شود.

🔸ENTRYPOINT:
برای تنظیم یک فرمان اصلی و غیرقابل تغییر که همیشه اجرا می‌شود. فرمان‌های دیگر به عنوان آرگومان به این فرمان اضافه می‌شوند.

با دانستن این تفاوت‌ها، می‌توانید بهتر تصمیم بگیرید که در هر سناریو از کدام دستور استفاده کنید. اگر نیاز دارید فرمان اصلی همیشه اجرا شود، از ENTRYPOINT استفاده کنید؛ و اگر می‌خواهید یک فرمان پیش‌فرض داشته باشید که در صورت نیاز قابل تغییر باشد، CMD را انتخاب کنید.




📁 #Docker

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍2🔥1🙏1
اتاق برنامه نویسی </>
Photo
🎓 SaaS / Software as a Service


امروز می‌خواهیم مفهوم SaaS یا Software as a Service را بررسی کنیم. این یک مدل ارائه نرم‌افزار است که در آن نرم‌افزارها به صورت آنلاین و از طریق اینترنت به کاربران ارائه می‌شوند. در این مدل، شما به جای خرید و نصب نرم‌افزار روی کامپیوتر خود، به آن از طریق یک مرورگر وب دسترسی پیدا می‌کنید.

🔍 منظور از SaaS یعنی چه؟

به معنای نرم‌افزار به عنوان سرویس است. در این مدل، نرم‌افزارها روی سرورهای شرکت ارائه‌دهنده میزبانی می‌شوند و کاربران می‌توانند از طریق اینترنت به آن‌ها دسترسی پیدا کنند. شما نیازی به نصب، مدیریت یا به‌روزرسانی نرم‌افزار ندارید؛ همه چیز توسط شرکت ارائه‌دهنده مدیریت می‌شود.

🔧 مثال:

تصور کنید شما از یک نرم‌افزار حسابداری مانند QuickBooks Online یا یک ابزار مدیریت پروژه مثل Trello استفاده می‌کنید. این‌ها نمونه‌هایی از SaaS هستند که شما می‌توانید از طریق مرورگر وب به آن‌ها دسترسی پیدا کنید، بدون نیاز به نصب یا مدیریت نرم‌افزار روی کامپیوتر خود.

🎯 مزایای SaaS

🔸بدون نیاز به نصب و به‌روزرسانی: شما نیازی به نصب نرم‌افزار روی کامپیوتر خود ندارید. همه چیز از طریق مرورگر وب انجام می‌شود و به‌روزرسانی‌ها به‌طور خودکار توسط ارائه‌دهنده مدیریت می‌شوند.

🔹دسترسی از هر کجا: شما می‌توانید از هر جایی که اینترنت دارید به نرم‌افزار دسترسی پیدا کنید. این یعنی می‌توانید از لپ‌تاپ، تبلت، یا حتی موبایل خود استفاده کنید.

🔸هزینه‌های کمتر: به جای خرید نرم‌افزار و پرداخت یک هزینه بزرگ اولیه، معمولاً با مدل اشتراک پرداخت می‌کنید. این باعث می‌شود هزینه‌های شما قابل پیش‌بینی‌تر باشد و نیاز به سرمایه‌گذاری اولیه کمتر باشد.

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

🔍 چه زمانی SaaS مناسب است؟

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

🎯 نتیجه‌گیری

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



📁 #cloud_computing


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
2👍1🔥1
اتاق برنامه نویسی </>
Photo
بررسی Docker: containerd، runc و shim

🐳 داکر دیمون (Docker Daemon) :

- داکر دیمون فرآیند اصلی‌ای است که وظیفه مدیریت کانتینرها را برعهده دارد. این دیمون درخواست‌هایی را که از طریق رابط خط فرمان (CLI) یا API دریافت می‌کند، اجرا می‌کند.

🛠 وظایف:
🔸 مدیریت چرخه زندگی کانتینرها شامل ایجاد، توقف، راه‌اندازی مجدد و حذف کانتینرها.

🔹 مدیریت image کانتینر (کپی کردن، کش کردن و بارگذاری).

🔸کنترل منابع شبکه و ذخیره‌سازی مرتبط با هر کانتینر.

🔹 مدیریت وضعیت (State) هر کانتینر و ارتباط آن با سیستم.


📦 سیستم مدیریت کانتینر containerd :

- ابزار containerd برای مدیریت چرخه زندگی کانتینرها طراحی شده است. این سیستم به‌طور مستقیم با Docker کار می‌کند و درخواست‌ها را از Docker Daemon دریافت و پردازش می‌کند.

🛠 وظایف:
- مدیریت چرخه زندگی کانتینرها شامل عملیات‌هایی مانند اجرا، توقف، راه‌اندازی مجدد و مکث کانتینرها.

- مدیریت و کش کردن تصاویر کانتینرها برای بهبود عملکرد سیستم.

- کنترل منابع شبکه و ذخیره‌سازی مرتبط با کانتینرها برای عملکرد بهینه‌تر.

ارتباط با داکر:
- این ابزار به‌عنوان لایه مدیریتی زیر داکر دیمون عمل می‌کند تا وظایف مدیریتی کانتینرها را به‌صورت مستقیم انجام دهد.


⚙️ اجرای کانتینر با runc :

- ابزاری برای اجرای مستقیم کانتینرها است که با استفاده از ویژگی‌های هسته لینوکس مانند cgroups و namespaces، کانتینرها را ایزوله کرده و اجرا می‌کند.

🛠 وظایف:
- ایزوله‌سازی کانتینرها از طریق مدیریت منابع (با استفاده از cgroups) و جداسازی فرآیندها (با استفاده از namespaces) .

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

ارتباط با containerd:
- سیستم containerd درخواست‌های اجرایی کانتینرها را به runc ارسال می‌کند تا این ابزار کانتینرها را به‌صورت واقعی اجرا کند.

🔗 واسط مدیریتی containerd-shim:

- به‌عنوان یک واسطه بین containerd و runc عمل می‌کند. این واسطه بعد از اجرای کانتینر توسط runc، مدیریت کانتینر را به‌عهده می‌گیرد تا منابع سیستم بهینه‌تر مصرف شود.

🛠وظایف:
- مدیریت ورودی و خروجی کانتینرها (I/O) شامل استانداردهای ورودی و خروجی (stdin، stdout و stderr).

- مدیریت فرآیندهای کانتینر به‌صورت مستقل پس از اجرا و بدون نیاز به نظارت مستقیم containerd.

مزایا:
- کاهش مصرف منابع به دلیل انتقال مدیریت کانتینرها به shim پس از اجرا.

- حفظ استقلال کانتینرها حتی در صورت توقف containerd، کانتینرها همچنان به‌کار خود ادامه می‌دهند.

🚀 فرآیند کامل اجرای کانتینر :

1️⃣ Docker Daemon
دستور اجرای یک کانتینر را از طریق CLI یا API دریافت می‌کند.

2️⃣ containerd
درخواست را پردازش می‌کند و وضعیت چرخه زندگی کانتینر را مدیریت می‌کند (ایجاد، اجرا، توقف و غیره).

3️⃣ runc
کانتینر را با استفاده از cgroups و namespaces اجرا می‌کند.

4️⃣ پس از اجرای کانتینر، shim مدیریت ورودی و خروجی و فرآیندهای کانتینر را برعهده می‌گیرد و کانتینر به‌صورت مستقل از containerd عمل می‌کند.


نتیجه‌گیری 📌:

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



📁 #Docker


کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
1👍1🔥1
اتاق برنامه نویسی </>
Photo
🔥 درسگفتار کامل درباره Spread Syntax و Rest Operator در جاوااسکریپت

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

🔸 Spread Syntax

🔹 Rest Operator



هر دو از سه نقطه (...) استفاده می‌کنن، اما تفاوت اصلی اینه که:

- Spread Syntax برای باز کردن (پخش کردن) داده‌ها استفاده می‌شه.
- Rest Operator برای جمع کردن (گروه‌بندی کردن) داده‌ها استفاده می‌شه.

حالا بریم سراغ توضیح دقیق و ساده برای هرکدوم.

🟢 Spread Syntax → باز کردن محتوا

کاربرد اصلی:

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

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

مثال ۱: کپی کردن آرایه

const numbers = [1, 2, 3];
const newNumbers = [...numbers]; // کپی آرایه اصلی

console.log(newNumbers); // [1, 2, 3]


این روش به جای تغییر آرایه اصلی، یک نسخه جدید می‌سازه که باعث جلوگیری از تغییرات ناخواسته می‌شه.


مثال ۲: ترکیب دو آرایه

const numbers1 = [1, 2, 3];
const numbers2 = [4, 5, 6];

const combined = [...numbers1, ...numbers2];

console.log(combined); // [1, 2, 3, 4, 5, 6]


این روش یک روش تمیز و سریع برای ترکیب آرایه‌هاست، بدون نیاز به ()concat.


مثال ۳: ارسال آرایه به عنوان آرگومان‌های یک تابع

const numbers = [1, 2, 3];

function sum(a, b, c) {
return a + b + c;
}

console.log(sum(...numbers)); // 6


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



مثال ۴: کپی کردن و ترکیب آبجکت‌ها

const person = { name: "Ali", age: 30 };
const newPerson = { ...person, city: "Tehran" };

console.log(newPerson);
// { name: "Ali", age: 30, city: "Tehran" }


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



🔴 Rest Operator → جمع کردن مقادیر

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

برخلاف Spread Syntax که "باز" می‌کنه، Rest Operator مقدارها رو "جمع" می‌کنه و داخل یک آرایه می‌ذاره.

مثال ۱: گرفتن چند آرگومان در تابع

function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4, 5)); // 15


این روش همه‌ی ورودی‌ها رو جمع می‌کنه و داخل یک آرایه numbers ذخیره می‌کنه.


مثال ۲: جداسازی اولین مقدار و جمع‌آوری بقیه

const [first, ...rest] = [10, 20, 30, 40];

console.log(first); // 10
console.log(rest); // [20, 30, 40]


و `first` مقدار اول رو دریافت کرده، و `rest` بقیه‌ی مقدارها رو درون آرایه ذخیره کرده.

مثال ۳: دریافت مقادیر باقی‌مانده در آبجکت
const person = { name: "Ali", age: 30, city: "Tehran" };

const { name, ...rest } = person;

console.log(name); // "Ali"
console.log(rest); // { age: 30, city: "Tehran" }


و name مقدار Ali رو دریافت کرده، و rest بقیه‌ی ویژگی‌ها رو جمع‌آوری کرده.


جمع‌بندی نهایی

🔹 اگر می‌خواهی داده‌ها را از داخل یک آرایه یا آبجکت بیرون بکشی و در جاهای مختلف استفاده کنی → `Spread Syntax`

🔹 اگر می‌خواهی چندین مقدار را به عنوان یک مجموعه بگیری و در قالب یک آرایه نگه داری → `Rest Operator`


📁 #javascript

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍52🔥1
اتاق برنامه نویسی </>
Photo
⚜️ مدل‌های نوین در هوش مصنوعی: LLM، VLM و Diffusion و مدل‌های چندوجهی Multimodal Models

در این توضیح، سه نوع مدل هوش مصنوعی پیشرفته یعنی مدل‌های زبانی بزرگ (LLM)، مدل‌های بینایی-زبانی (VLM) و مدل‌های انتشار (Diffusion Models) را بررسی می‌کنیم. همچنین به مدل‌های چندوجهی (Multimodal Models) می‌پردازیم.


🔸 ۱. مدل‌های زبانی بزرگ (LLM - Large Language Models)

مدل‌های زبانی بزرگ (LLM) مانند GPT-4، BERT و LLaMA، نوعی از مدل‌های یادگیری عمیق هستند که توانایی پردازش و تولید زبان طبیعی را دارند.

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

مثال:
🔹 وقتی از یک LLM مثل GPT بپرسید: "آیا می‌توانی یک متن کوتاه درباره گربه‌ها بنویسی؟"
🔹 مدل بر اساس داده‌هایی که قبلاً یاد گرفته، متنی درباره گربه‌ها تولید می‌کند.


🔸 ۲. مدل‌های بینایی-زبانی (VLM - Vision-Language Models)

مدل‌های VLM ترکیبی از بینایی (تصویر) و زبان (متن) هستند و می‌توانند ورودی‌هایی مانند تصویر و متن را همزمان پردازش کنند. مدل‌هایی مانند CLIP، BLIP و GPT-4V نمونه‌های معروفی از این دسته هستند.

چگونه کار می‌کنند؟
- این مدل‌ها با استفاده از ترکیب شبکه‌های عصبی بینایی (مانند CNN یا ViT) و مدل‌های زبانی (LLM) ساخته می‌شوند.
- می‌توانند یک تصویر را توصیف کنند، متن را در تصویر پیدا کنند، یا به سوالاتی درباره تصویر پاسخ دهند.

مثال:
🔹 اگر یک عکس از یک سگ را به مدل بدهید و بپرسید "این چه نژادی است؟"، مدل با تطبیق تصویر و متن پاسخ مناسب می‌دهد.
🔹 در ChatGPT با قابلیت بینایی (GPT-4V) می‌توان عکسی ارسال کرد و از مدل درباره آن سوال پرسید.



🔸 ۳. مدل‌های انتشار (Diffusion Models)
مدل‌های انتشار، نوعی از مدل‌های مولد هستند که در تولید تصاویر، ویدیو و حتی صدا استفاده می‌شوند. مدل‌هایی مانند Stable Diffusion، DALL·E و Midjourney نمونه‌های مشهور هستند.

چگونه کار می‌کنند؟
- این مدل‌ها ابتدا با اضافه کردن نویز به تصاویر و سپس یادگیری چگونگی بازگردانی آن‌ها آموزش داده می‌شوند.
- این فرآیند باعث می‌شود که مدل بتواند تصاویر واقعی از متن تولید کند.

مثال:
🔹 اگر به مدل Stable Diffusion دستور دهید "یک گربه در حال خواندن کتاب در کنار شومینه" را تولید کن، مدلی که از انتشار استفاده می‌کند تصویری جدید بر اساس این توضیح ایجاد می‌کند.


🔸 ۴. مدل‌های چندوجهی (Multimodal Models)
مدل‌های چندوجهی قادر به پردازش چندین نوع ورودی مانند تصویر، ویدیو، صدا و متن به طور همزمان هستند. این مدل‌ها ترکیبی از LLM، VLM و سایر فناوری‌ها هستند.

چگونه کار می‌کنند؟
- این مدل‌ها داده‌های چندوجهی (Multi-Modal) را با هم ترکیب می‌کنند.
- می‌توانند سوالات متنی را با ترکیب تصویر و صدا پاسخ دهند.

مثال:
🔹مدل‌های هوش مصنوعی در خودروهای خودران که همزمان اطلاعات دوربین (تصویر)، رادار (داده سنسور) و متن (فرمان‌ها) را پردازش می‌کنند.
🔹 مدل‌های هوش مصنوعی در پزشکی که می‌توانندعکس رادیولوژی و توضیحات پزشک را همزمان تحلیل کنند.


اگر فقط با متن کار داریم؟ LLM بهترین گزینه است.
اگر تصویر و متن را می‌خواهیم؟ VLM را انتخاب می‌کنیم.
اگر نیاز به تولید تصاویر جدید از متن داریم؟ Diffusion مناسب است.
اگر چندین نوع ورودی (صوت، تصویر، متن) را ترکیب می‌کنیم؟ از Multimodal استفاده می‌کنیم.



📁 #AI

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍6🔥1
اتاق برنامه نویسی </>
Photo
شرکت OpenAI امروز یک سری ابزار جدید منتشر کرده است که کمک می‌کند برنامه‌نویسان راحت‌تر بتوانند «ایجنت» (Agent) بسازند.

🧐 حالا «ایجنت» یعنی چی؟

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

حالا OpenAI سه ابزار جدید برای ساده کردن ساختن چنین برنامه‌هایی ارائه کرده است:

⚙️ (رابط برنامه‌نویسی جدید) Responses API

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

حالا OpenAI یک ابزار جدید درست کرده که از هر دوی آن‌ها بهتر و آسان‌تر است.

ویژگی این ابزار این است که خودش می‌تواند به شکل خودکار کارهایی مثل جستجو یا استفاده از ابزارهای دیگر را انجام بدهد و جواب آن‌ها را سریعاً به گفتگوی شما اضافه کند.

- تصور کن به یک دستیار هوشمند می‌گویی: «قیمت گوشی آیفون امروز چنده؟». دستیار از این ابزار استفاده می‌کند، در اینترنت جستجو می‌کند و جواب دقیق و سریع به تو می‌دهد.

1️⃣ (جستجوی وب) Web Search

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

- تو از دستیار هوشمندت می‌پرسی: «آب و هوای فردا در تهران چطور است؟». دستیار با این ابزار در اینترنت جستجو می‌کند و دقیق‌ترین جواب را پیدا می‌کند و به تو نشان می‌دهد.

2️⃣ (جستجو در فایل‌ها) File Search

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

- فرض کن صدها فایل PDF یا Word داری و به دنبال یک جمله یا کلمه خاص می‌گردی. به جای اینکه خودت تک تک آن‌ها را بگردی، «ایجنت» یا برنامه تو با این ابزار به سرعت همه فایل‌ها را می‌گردد و دقیقاً اطلاعاتی که می‌خواهی را برایت پیدا می‌کند.


3️⃣ (ابزار ساخت و مدیریت ایجنت‌ها) Agents SDK

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

- اگر بخواهی ایجنتی بسازی که پاسخگوی خودکار مشتریان باشد (مثل یک دستیار خودکار برای پاسخ به سوالات کاربران)، با این ابزار می‌توانی راحت‌تر این کار را انجام دهی و حتی بررسی کنی که دستیار چقدر خوب کارش را انجام می‌دهد و کجاها باید بهتر شود.




📁 #AI

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍75🔥1
اتاق برنامه نویسی </>
Photo
نحوه عملکرد ارسال و دریافت درخواست‌ها در SPA + چرخه‌ی حیات (Lifecycle)


1️⃣ (درخواست اولیه) Initial Request – ورود به سایت برای اولین بار

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

🔸 توی SPA این یعنی:

1. مرورگر کاربر درخواست (Request) رو به سرور می‌فرسته تا کل ساختار برنامه (HTML, CSS, JavaScript) رو دریافت کنه.

2. سرور فایل اصلی HTML رو ارسال می‌کنه (معمولاً یه صفحه‌ی ساده که فقط یه <div id="app"> داخلشه).

3. بعد از اینکه صفحه‌ی HTML لود شد، مرورگر می‌ره سراغ فایل‌های جاوااسکریپت که شامل React, Vue یا Angular هستن.

4. جاوااسکریپت اجرا می‌شه و کل اپلیکیشن روی مرورگر کاربر ساخته می‌شه بدون اینکه صفحه دوباره لود بشه.

2️⃣ (جابجایی بین صفحات بدون رفرش) Routing

خب، حالا که صفحه‌ی اولیه لود شد، کاربر می‌خواد روی یه لینک کلیک کنه (مثلاً بره به صفحه‌ی پروفایل خودش).

💡 در MPA این یعنی درخواست جدید به سرور و لود شدن یک صفحه‌ی جدید، اما در SPA ما اینو هوشمندانه‌تر مدیریت می‌کنیم.

🔸 اینجا اتفاقی که می‌افته اینه:

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

2. React Router / Vue Router / Angular
تشخیص می‌ده Router که کاربر کدوم صفحه رو می‌خواد ببینه.

3. اگر اطلاعات جدیدی نیاز باشه، یه درخواست AJAX یا Fetch API به سرور فرستاده می‌شه.

4. داده‌های جدید به‌صورت JSON برمی‌گردن و کامپوننت‌ها آپدیت می‌شن.

3️⃣ (دریافت اطلاعات از سرور) Fetching Data

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

🔸 توی این مرحله:

1. جاوااسکریپت یه درخواست به سرور ارسال می‌کنه (معمولاً با ()fetch یا axios).

2. سرور اطلاعات رو از دیتابیس می‌گیره و به‌صورت JSON به مرورگر می‌فرسته.

3. بعد از دریافت داده‌ها، React/Vue/Angular کامپوننت‌ها رو با اطلاعات جدید آپدیت می‌کنن.

4️⃣ (مدیریت وضعیت) State Management

اینجا زمانی پیش میاد که داده‌های برنامه باید توی حافظه نگه داشته بشن تا تجربه‌ی کاربری بهتر بشه.

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

🔸 توی SPA معمولاً از یکی از این روش‌ها استفاده می‌شه:

1. LocalStorage یا SessionStorage:
اطلاعات در مرورگر ذخیره می‌شه.

2. State Management Libraries مثل Redux, Vuex, یا Zustand:
یه بخش مرکزی برای ذخیره‌ی وضعیت (State) داریم.

3. React Context یا useState:
برای نگه‌داشتن داده‌های کوچک در سطح کامپوننت.

5️⃣ (آپدیت شدن رابط کاربری بدون رفرش) Updating UI

یکی از جذاب‌ترین بخش‌های SPA اینه که وقتی چیزی تغییر می‌کنه، فقط همون بخش آپدیت می‌شه، نه کل صفحه!

مثلاً وقتی یه پیام جدید توی چت واتساپ می‌گیری، فقط همون پیام اضافه می‌شه، نه اینکه کل صفحه رفرش بشه.

🔸 نحوه‌ی کار:

1. داده‌های جدید از سرور میاد.
2. در واقع در React/Vue فقط همون بخش صفحه رو تغییر می‌ده.
3. کاربر هیچ تغییری حس نمی‌کنه جز اینکه محتوا آپدیت شده.

6️⃣ (بستن و تمیزکاری) Unmounting & Cleanup

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

مثلاً توی React وقتی یه کامپوننت بسته می‌شه، باید از useEffect یا componentWillUnmount برای حذف رویدادهای غیرضروری استفاده کرد.




📁#javascript

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
👍2👏1
اتاق برنامه نویسی </>
Photo
در دنیای مدیریت پکیج‌ها و مخازن (ریپازیتوری‌ها) در ابزارهایی مثل Nexus Repository Manager یا Artifactory، سه نوع اصلی ریپازیتوری وجود دارد:

1️⃣ (میزبان‌شده) Hosted

2️⃣ (پراکسی) Proxy

3️⃣ (گروهی) Group

🔥حالا هرکدام را خیلی ساده توضیح می‌دهم و می‌گویم در چه زمانی باید از آن‌ها استفاده کنیم.

1️⃣ (ریپازیتوری میزبان‌شده) Hosted Repository

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

🔹چه زمانی استفاده می‌شود؟

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

وقتی نیاز دارید از یک فضای امن برای ذخیره‌ی artifactها (خروجی‌های بیلد، مثل فایل‌های jar یا Docker images) استفاده کنید.

اگر تیم شما پکیج‌های داخلی دارد که نمی‌خواهید در اینترنت عمومی منتشر شوند.

🔹 مثال کاربردی:
فرض کنید شما در شرکت خودتان یک کتابخانه‌ی PHP یا جاوا اسکریپت نوشته‌اید که فقط اعضای شرکت باید از آن استفاده کنند. می‌توانید این کتابخانه را در یک Hosted Repository قرار دهید تا فقط همکارانتان به آن دسترسی داشته باشند.

2️⃣ (ریپازیتوری پراکسی) Proxy Repository

این نوع ریپازیتوری مثل یک واسطه عمل می‌کند. یعنی هر درخواست برای دریافت یک پکیج از یک ریپازیتوری عمومی (مثلاً Maven Central یا Docker Hub) را دریافت کرده، آن را دانلود و ذخیره می‌کند. بعداً اگر دوباره به همان پکیج نیاز داشتید، به‌جای دانلود مجدد از اینترنت، از کش (cache) خود استفاده می‌کند.

🔹 چه زمانی استفاده می‌شود؟

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

وقتی می‌خواهید از تغییرات ناگهانی یا حذف شدن پکیج‌ها در ریپازیتوری‌های عمومی جلوگیری کنید.

اگر در سازمان خودتان اینترنت محدود یا کندی دارید و می‌خواهید حجم دانلودهای اینترنتی را کاهش دهید.

🔹مثال کاربردی:

فرض کنید تیم شما دائماً از npm برای دانلود پکیج‌های جاوا اسکریپت استفاده می‌کند. اگر هر توسعه‌دهنده هر بار همه‌ی پکیج‌ها را مستقیماً از اینترنت دانلود کند، هم زمان زیادی هدر می‌رود و هم اینترنت زیادی مصرف می‌شود. اما اگر یک Proxy Repository برای npmjs.com داشته باشید، فقط اولین درخواست از اینترنت دریافت می‌شود و بعداً برای همه‌ی افراد داخل شرکت از نسخه‌ی کش‌شده استفاده می‌شود.

3️⃣ (ریپازیتوری گروهی) Group Repository

این نوع ریپازیتوری ترکیبی از چند ریپازیتوری مختلف (Hosted، Proxy، یا حتی دیگر Groupها) است و آن‌ها را در یک نقطه‌ی دسترسی واحد ارائه می‌دهد.

🔹چه زمانی استفاده می‌شود؟

وقتی می‌خواهید همه‌ی کاربران فقط یک URL را بدانند، بدون اینکه بدانند یک پکیج از Hosted می‌آید یا از Proxy.

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

🔹مثال کاربردی:

فرض کنید در یک شرکت کار می‌کنید که توسعه‌دهندگان از Maven Central، یک ریپازیتوری خصوصی داخلی (Hosted)، و یک Proxy Repository برای یک منبع خارجی دیگر استفاده می‌کنند. به‌جای اینکه سه مسیر مختلف تنظیم کنید، یک Group Repository می‌سازید که شامل هر سه ریپازیتوری باشد. حالا کاربران فقط با یک آدرس به همه‌ی این ریپازیتوری‌ها دسترسی دارند.


این سه نوع ریپازیتوری در کنار هم یک اکوسیستم کامل را برای مدیریت بسته‌ها فراهم می‌کنند. مثلاً شما ممکن است یک Proxy برای دانلود پکیج‌های عمومی، یک Hosted برای بسته‌های اختصاصی، و یک Group برای ترکیب این دو داشته باشید.




📁#Docker

کانال تخصصی لاراول
📌 @PapiDon_state

☕️ اتاق برنامه‌نویسی
📌 @PapiDon_coding
🔥2👍1👏1
سلام رفقا
قبل اینکه وارد بحث موضوعات و مفاهیم هوش مصنوعی بشیم
می‌خوام بدونم بطور کلی آیا شما از هوش مصنوعی در زندگی یا کارتون استفاده میکنید ؟ ( حالا هر مدلی با هر اینترفیسی )
Anonymous Poll
59%
آره خیلی زیاد
29%
تا حدی
12%
نه هنوز
🔥2
اتاق برنامه نویسی </> pinned «سلام رفقا
قبل اینکه وارد بحث موضوعات و مفاهیم هوش مصنوعی بشیم
می‌خوام بدونم بطور کلی آیا شما از هوش مصنوعی در زندگی یا کارتون استفاده میکنید ؟ ( حالا هر مدلی با هر اینترفیسی )
»