Ninja Learn | نینجا لرن
1.26K subscribers
96 photos
36 videos
11 files
307 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
خب خب خب ارایه ها

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

چطوری یه آرایه بسازیم؟ 🤔
تو بیشتر زبان‌های برنامه‌نویسی، آرایه‌ها باید نوع داده‌ی یکسانی داشته باشن و معمولا موقع تعریف، نوع داده‌شون مشخص می‌شه. اما تو پایتون این محدودیت وجود نداره و می‌تونیم آرایه‌ای کاملا داینامیک بسازیم:
my_array = [] # آرایه خالی در پایتون 

مثال از C/C++:
int my_array[4]; // آرایه‌ای از ۴ عدد صحیح 

در واقع، لیست‌های پایتون جایگزینی برای آرایه‌ها هستن ولی برای راحتی، بهشون آرایه می‌گیم.

چطور به داده‌های آرایه دسترسی داشته باشیم؟ 👀
در بیشتر زبان‌ها این کار خودکار هندل می‌شه و می‌تونیم به کمک ایندکس داده‌ی موردنظرمون رو بخونیم:
my_array = [1, 2, 3]
print(my_array[2]) # خروجی: 3

ولی به‌طور کلی، آدرس یک عنصر در حافظه این‌جوری حساب می‌شه:
Loc = (سایز هر عنصر × ایندکس) + آدرس شروع آرایه

چطور مقدار آرایه رو تغییر بدیم؟ 🔄

🔹 اضافه کردن مقدار جدید:
my_array.append(4) # اضافه کردن مقدار ۴ به آخر آرایه 

🔹 حذف مقدار خاصی از آرایه:
del my_array[2] # حذف مقدار سوم آرایه

🔹 تغییر مقدار یک خانه:
my_array[0] = 6 # مقدار اولین عنصر رو ۶ می‌کنیم 

سرعت اجرای عملیات‌ها

🔹 خواندن یک مقدار از آرایه:
دسترسی به آرایه‌ها با توجه به فرمول بالا O(1) یعنی ثابت هست، چون مستقیماً به آدرسش توی حافظه دسترسی داریم و با تغییر تعداد داده ها هیج تغییری ایجاد نمیشه.

🔹 اضافه و حذف کردن مقدار:
اگر مقدار رو به آخر آرایه اضافه یا حذف کنیم → O(1)
ولی اگر بخوایم مقدار رو از وسط یا اول آرایه حذف کنیم یا جابه‌جا کنیم، باید همه‌ی مقدارهای بعدی هم جابجا شن که وابسته به تعداد ایتم هامون هست و هر چی بیشتر باشه سرعت پایینتری داریم → O(n)

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

#️⃣ #programming #software



🥷 CHANNEL | GROUP
👍112
چرا میگن بگیم "گنو/لینوکس" و نگیم "لینوکس"؟

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

لینوکس بلکه باید بگیم گنو/لینوکس.
خب چرا؟
بیاید برگردیم به 1983، زمانی که گنو (GNU) به عنوان یه پروژه اوپن سورس توسط ریچارد استالمن ایجاد شد. هدف اصلیشونم ساخت سیستم عاملی بود که سورس کد مشخص داشته باشه همچنین متن باز، آزاد، سریع و ایمنی باشه.
پروژه گنو شروع کرد به ساختن بخش‌های مختلف سیستم عامل، و خیلی از ابزارها و چیزای مهمی که هنوز بسیار بسیار مهم هستن، مثلا GCC، Bash، emacs، coreutils
اینایی که گفتیم چنتا نمونه از چیزایی بودن که پروژه گنو ساخت.
مثلا coreutils کامندها و دستورات بیسیکی کار با فایل‌ها رو شامل میشه. کامند ls و cp و rm و ... از همین coreutils هستن.
خلاصه که خیلی چیزا ساختن، ولی همچنان یه مشکلی بود...
کرنل که عملا هسته سیستم عامل بود رو نداشتن و کرنل‌های موجود رو هم استفاده نکردن به دلایل دیگه.

میرسیم به 1991، یه دانشجوی فنلاندی به اسم لینوس توروالدز میاد و یه کرنل میسازه و توجه پروژه گنو جمع میشه به این کرنل، یه کرنل اوپن سورس و رایگان که همین قضیه هم باعث میشه جای خالی کرنل توسظ لینوکس پر بشه.

وایسا ببینم، مگه لینوکس سیستم عامل نبود؟
خب باید بگم نه :)))
لینوکس در اصل یه کرنله.

در نهایت ابزارهای گنو و کرنل لینوکس ترکیب میشن و گنو/لینوکس متولد میشه.
با ترکیب این دوتا، اولین توزیع گنو/لینوکسی به وجود میاد تو سال 1993 و اسمشم میشه Slackware
احتمالا خیلیا نمیشناسنش ولی یه نام آشنا در همین زمان به وجود میاد که قطعا میدونم میشناسید :)

و دبیان متولد میشه 😄
پس اگر بگیم لینوکس، عملا داریم بخش عظیمی از سیستم عامل رو که گنو تشکیل میده رو زیر سوال میبریم و بیخیال زحماتش میشیم.
یه سوال دیگه هم پیش میاد:

چرا گنو خودش کرنل ننوشت؟
در اصل گنو هم یه کرنل داره!!
یه میکرو کرنل به اسم Mach که فانکشنالیتی‌های اصلی و هسته رو انجام میده و hurd هم در اصل چیزای high level تر رو انجام میده.

اما خب باید بگم که اگه پشت گوشتون رو دیدید کرنل کامل hurd رو هم خواهید دید 😁
حدود 30 ساله که داره توسعه پیدا میکنه و هنوزم بدرد استفاده نمیخوره و جای کار داره.
و این بود داستان توسعه لینوکس، گنو، و قضیه نامگذاری گنو/لینوکس که بهش پرداختیم.

امیدوارم روز و شب خوبی داشته باشید
با یه قلب خوشگل خوشحالمون کن 🫡❤️

#⃣#gnome #linux



🐧 CHANNEL | GROUP
14👍5👌1
عید نزدیکه و منم میخوام بهتون یه عیدی خفن بدم
بنظرتون چیه ؟ (اونایی مه بهشون گفتم هیچی نگن) 🤫
14
Ninja Learn | نینجا لرن
عید نزدیکه و منم میخوام بهتون یه عیدی خفن بدم بنظرتون چیه ؟ (اونایی مه بهشون گفتم هیچی نگن) 🤫
بزار بگم
قراره کتاب
Boost your DjangoDX


که ادام جانسون نوشته رو براتون بزارم 😁

پ.ن: رایگانشو هیچ جای وب مجاز پیدا نمیکنید 😬
👍26❤‍🔥82👎1🔥1👏1👌1
خب خب خب SMTP چیه؟ 📩

امروز می‌خوام درباره‌ی یه چیز خیلی مهم تو دنیای وب حرف بزنم: SMTP یا همون Simple Mail Transfer Protocol. شاید تا حالا اسمش رو شنیده باشین، ولی دقیقا چیه و چطور کار می‌کنه؟

📨 ‏SMTP چیه؟
‏SMTP یه پروتکل استاندارده که مسئول ارسال ایمیل‌ ها‌هست. اگه ایمیل رو مثل یه نامه در نظر بگیریم، SMTP همون پیک‌پستی‌ایه که نامه‌ت رو از صندوق تو به مقصد می‌رسونه.
این پروتکل تعیین می‌کنه که ایمیل از کجا بیاد، کجا بره و چجوری به درستی تحویل داده بشه.

🛠 چجوری کار می‌کنه؟
وقتی یه ایمیل می‌فرستی، پشت صحنه این اتفاقات میفته:
1️⃣ اتصال به سرور:
کلاینت ایمیل (مثل Gmail یا Outlook) به یه سرور SMTP متصل می‌شه تا ایمیل رو ارسال کنه.


2️⃣ دستورات ارسال می‌شن:

دستوراتی مثل HELO (یا EHLO) اجرا می‌شن تا ارتباط برقرار بشه. بعد، MAIL FROM و RCPT TO مشخص می‌کنن ایمیل از کجا اومده و قراره به کجا بره.

3️⃣ متن ایمیل ارسال می‌شه:
با دستور DATA، متن و جزئیات ایمیل به سرور فرستاده می‌شه. درست مثل وقتی که نامه‌ت رو به پیک‌پست تحویل می‌دی.


4️⃣ تأیید و پایان ارتباط:
بعد از ارسال، سرور یه تأییدیه می‌فرسته و ارتباط قطع می‌شه. این یعنی ایمیل با موفقیت ارسال شده.


🔒 نکات مهم درباره‌ی SMTP
🔹 استاندارد جهانی:
تقریباً همه‌ی سرویس‌های ایمیل از SMTP استفاده می‌کنن، پس یه پروتکل مشترکه.


🔹 امنیت بالا:
بیشتر سرورها از TLS/SSL استفاده می‌کنن تا ایمیل‌ها رمزنگاری بشن و کسی نتونه تو مسیر ارسال، اطلاعات رو بدزده.


🔹 دستورات مهم:
‏HELO, MAIL FROM, RCPT TO, DATA از دستورات کلیدی SMTP هستن که تو پروسه‌ی ارسال اجرا می‌شن.


🔹 احراز هویت SMTP AUTH:
بیشتر سرورها برای جلوگیری از سوءاستفاده، قبل از ارسال ایمیل، ازت می‌خوان که لاگین کنی. این باعث می‌شه اسپمرها نتونن از سرور سوءاستفاده کنن.
🎯 چرا SMTP مهمه؟
ما وقتی یه ایمیل می‌فرستیم، معمولا حواسمون به این نیست که چجوری ارسال می‌شه. اما پشت پرده، SMTP داره حسابی کار می‌کنه تا مطمئن بشه ایمیل سالم و بدون مشکل می‌رسه. بدون این پروتکل، ارسال ایمیل کلی دردسر داشت و ممکن بود پیام‌ها گم بشن یا به درستی تحویل داده نشن.

جمع‌بندی
‏SMTP همون پیک‌پست دیجیتاله که ایمیل‌های ما رو جابه‌جا می‌کنه. با یه سری دستورات استاندارد و نکات امنیتی مثل TLS/SSL و SMTP AUTH، ایمیل‌ها رو با امنیت و اطمینان کامل ارسال می‌کنه.

#️⃣ #programming #web #backend



🥷 CHANNEL | GROUP
10👍2🔥1👌1
توزیع های لینوکس اگه دانش آموز/آدم بودن:

#⃣ #meme #arch #ubuntu



🐧 CHANNEL | GROUP
🤣81👌1
بزودی لینوکس یوزر میشم 🌚🤟
🤩12👍1
راستی مایک گروهم داریم که توش فعالیم و میتونید هر سوالی دارید یا درمورد هرچی که میخواید رو مطرح کنید. 😁

گروه 👇
https://t.iss.one/programming_city_ir
4
🟢 خب دوستان فایل‌های تکراری یکی از مشکلاتیه که خیلی از ما باهاش مواجهیم. این فایل‌ها نه‌تنها فضای اضافی می‌گیرن، بلکه سیستم رو شلوغ و نامرتب می‌کنن.
مثال فایل‌های تکراری مثل venv یا node_modules که چندین بار کپی شدن و فضای هارد رو اشغال کردن. (برای خودم نیم گیگ فضا اشغال کرده بود)


ما برای حل مشکل یه اسکریپت ساده نوشتیم که فایل‌های تکراری رو پیدا میکنه، اون‌ها رو حذف میکنه و به جای هر کدوم یه symlink (لینک نمادین) ایجاد میکنه تا ساختار فایل ها حفظ بشه و مشکلی توی اجرای برنامه ها نباشه

به عنوان ارگومنت یه path دریافت میکنه (اگر ندادی محل اجرای اسکریپت رو در نظر میگیره) و تمام زیر فولدر هارو برای فایل تکراری اسکن میکنه

🔗 این اسکریپت رو از این لینک میتونی دانلود کنی

💬 هر نظر و سوال یا بهبود کد مدنظرته باهامون به اشتراک بزار 😊


#️⃣ #script #suggest



🐧 CHANNEL | GROUP
👍7
پست بعدی ؟ 🧐
3
خب خب خب WSO Web Shell چیه؟ 🕵️‍♂️

امروز می‌خوام درباره‌ی یه چیز خطرناک و مهم تو دنیای وب حرف بزنم: WSO Web Shell. شاید اسمش رو شنیده باشی، ولی دقیقا چیه و چرا باید حواست بهش باشه؟ بیا با هم ببینیم!

📡WSO Web Shell چیه؟
‏WSO Web Shell یه اسکریپت کوچیکه (معمولا با PHP نوشته می‌شه) که هکرها مثل یه در مخفی روی سرور سایتت می‌ذارن. وقتی این اسکریپت اونجاست، هکر می‌تونه هر وقت دلش خواست از راه در برگرده، دستور بده، فایل آپلود کنه یا حتی کل سایتت رو به هم بریزه. انگار یه کلید سایتتو دستش داره که هر موقع بخواد در سایتت رو باز می‌کنه.

🛠 چجوری کار می‌کنه؟
پشت صحنه این ماجرا اینجوری پیش می‌ره:

1️⃣ نقطه ورود:
هکرها دنبال یه راه نفوذ می‌گردن. مثلا اگه سایتت یه بخش آپلود فایل داره (مثل عکس پروفایل) و درست امن نشده(درواقع درست اعتبار سنجی نشده)، به جای عکس، این اسکریپت رو آپلود می‌کنن. یا از باگ‌هایی مثل SQL Injection و XSS سوءاستفاده می‌کنن تا این فایل رو روی سرورت بذارن.

2️⃣ دسترسی مخفی:
بعد از آپلود، فقط کافیه هکر یه آدرس خاص مثل
www.siteto.com/uploads/wso.php

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

3️⃣ کنترل کامل:
حالا هکر می‌تونه فایلات رو ببینه، تغییر بده، اطلاعاتت رو بدزده یا حتی سایتت رو قفل کنه. مثل اینه که کلید خونه‌ت رو به یه غریبه داده باشی و اون تو خونت هرکاری بکنه.

🔒 نکات مهم درباره‌ی WSO Web Shell

🔹 کوچیک ولی خطرناک:
این اسکریپت خیلی ساده‌ست، ولی چون دسترسی کامل به سرور می‌ده، یه تهدید بزرگه.

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

🔹 استفاده همیشگی:
هکرا اینو می‌ذارن که هر وقت خواستن برگردن، بدون دردسر دوباره وارد بشن.

🎯 چطور جلوشو بگیری؟
برای اینکه سایتت از دست این در مخفی در امان بمونه، این کارا رو بکن:

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

رمز قوی:
رمزهای پیچیده بذار و احراز هویت دو مرحله‌ای رو فعال کن.

فایل‌ها رو چک کن:
هر چند وقت یه بار سرورت رو نگاه کن، ببین فایل مشکوکی مثل wso.php اونجا نیست.

فایروال وب (WAF):
این ابزار ترافیک مشکوک رو قبل از رسیدن به سرورت بلاک می‌کنه.

کدنویسی امن:

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


جمع‌بندی
‏WSO Web Shell همون در پشتی مخفیه که هکرا تو سرورت کار می‌ذارن تا هر وقت دلشون خواست برگردن و خرابکاری کنن. ولی با یه کم دقت، آپدیت نگه داشتن سایت و رعایت نکات امنیتی، می‌تونی جلوی این دردسر رو بگیری.

#️⃣ #security #backend


🥷 CHANNEL | GROUP
👍5❤‍🔥1🔥1👌1
فقط برنامه نویسا درکش میکنن :)

https://youtu.be/EFmxPMdBqmU?si=dkT-Ry9K_-5m8DxY

#️⃣ #video


🥷 CHANNEL | GROUP
👍6
خب خب خب Design Patterns 🏗

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

🧠 ‏Design Patterns چیه؟

Design Patterns یا الگوهای طراحی، راه‌حل‌های استاندارد و امتحان‌شده‌ای هستن برای مشکلات رایجی که تو طراحی نرم‌افزار بهشون برمی‌خوریم. این الگوها مثل یه نقشه‌ی راهن که به شما نشون می‌دن چطور یه مسئله‌ی خاص رو به بهترین شکل ممکن حل کنین. این مفهوم اولین بار تو کتاب معروف Gang of Four یا GoF
معرفی شد. این کتاب سال ۱۹۹۴ منتشر شد و هنوزم یه منبع معتبر و مرجع به حساب میاد.

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

📚 انواع Design Patterns
طبق دسته‌بندی Gang of Four، الگوهای طراحی به سه دسته‌ی اصلی تقسیم می‌شن:

1⃣Creational Patterns (الگوهای ساختاری):
این الگوها با نحوه‌ی ساختن اشیاء (Objects) سر و کار دارن و به شما کمک می‌کنن که اشیاء رو به روش‌های انعطاف‌پذیر و بهینه بسازین.

2⃣Structural Patterns (الگوهای ساختاری):
این الگوها درباره‌ی سازمان‌دهی و ارتباط بین کلاس‌ها و اشیاء هستن تا ساختار کِدتون منظم‌تر بشه.

3⃣Behavioral Patterns (الگوهای رفتاری):
این الگوها روی تعاملات و مسئولیت‌های بین اشیاء تمرکز دارن و باعث می‌شن ارتباط بین بخش‌های مختلف برنامه‌تون بهتر بشه.

حالا بریم سراغ یه مثال پایتونی از هر دسته تا دقیق ببینین چطور کار می‌کنن.

1️⃣ ‏Creational Pattern: Singleton (تک‌تون)

الگوی Singleton مطمئن می‌شه که از یه کلاس فقط یه نمونه (Instance) ساخته بشه و همه‌جای برنامه به همون یه نمونه دسترسی داشته باشن.

مثال:
فرض کنین می‌خواین یه سیستم لاگ داشته باشین که فقط یه شیء ازش وجود داشته باشه:
class SingletonLogger:
# متغیر استاتیک برای ذخیره‌ی نمونه
_instance = None

# بازنویسی متد __new__ برای کنترل ساخت نمونه
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance

def log(self, message):
print(f"Log: {message}")

# تست کردن
logger1 = SingletonLogger()
logger2 = SingletonLogger()

# چک می‌کنیم که آیا هر دو متغیر به یه شیء اشاره می‌کنن
print(logger1 is logger2) # خروجی: True
logger1.log("سلام دنیا") # خروجی: Log: سلام دنیا
logger2.log("تست دوم") # خروجی: Log: تست دوم

توی متد new چک می‌کنیم که آیا _instance قبلاً ساخته شده یا نه. اگه نشده باشه، یه نمونه جدید می‌سازیم.

چون logger1 و logger2 به یه شیء اشاره می‌کنن، هر تغییری که با یکی بدین، روی اون یکی هم اعمال می‌شه.

خروجی True نشون می‌ده که فقط یه نمونه از SingletonLogger وجود داره.


2️⃣Structural Pattern: Adapter (آداپتور)
الگوی Adapter مثل یه پل عمل می‌کنه که دو کلاس با رابط‌های (Interface) متفاوت رو به هم وصل می‌کنه.

مثال:
فرض کنین یه کلاس قدیمی به اسم OldPrinter دارین که متد print_text داره، ولی سیستم جدیدتون از متد print پشتیبانی می‌کنه:
# کلاس قدیمی
class OldPrinter:
def print_text(self, text):
print(f"Old Printer: {text}")

# آداپتور
class PrinterAdapter:
def __init__(self, old_printer):
self.old_printer = old_printer

def print(self, text):
self.old_printer.print_text(text)

# تست کردن
old_printer = OldPrinter()
adapter = PrinterAdapter(old_printer)

adapter.print("سلام از سیستم جدید") # خروجی: Old Printer: سلام از سیستم جدید

کلاس OldPrinter یه متد قدیمی داره به اسم print_text.
کلاس PrinterAdapter یه نمونه از OldPrinter رو می‌گیره و متد print رو به print_text وصل می‌کنه.
حالا سیستم جدیدتون می‌تونه با adapter.print() کار کنه، بدون اینکه OldPrinter رو تغییر بدین.

3️⃣Behavioral Pattern: Observer (ناظر)
الگوی Observer یه رابطه‌ی یک‌به‌چند بین اشیاء تعریف می‌کنه. یه شیء اصلی (Subject) وقتی وضعیتش تغییر می‌کنه، به‌طور خودکار به همه‌ی ناظرها (Observers) خبر میده

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

ادامه, پست بعد
8👍2
class Subject:
def __init__(self):
self._observers = [] # لیست ناظرها

def attach(self, observer):
self._observers.append(observer)

def notify(self, message):
for observer in self._observers:
observer.update(message)

class Observer:
def __init__(self, name):
self.name = name

def update(self, message):
print(f"{self.name} received: {message}")

# تست کردن
subject = Subject()
observer1 = Observer("کاربر ۱")
observer2 = Observer("کاربر ۲")

subject.attach(observer1)
subject.attach(observer2)
subject.notify("پیام جدید اومد!")

Subject لیستی از ناظرها رو نگه می‌داره و با attach می‌تونین ناظر جدید اضافه کنین.
وقتی notify صدا زده می‌شه، متد update همه‌ی ناظرها اجرا می‌شه و پیام رو دریافت می‌کنن.
این الگو باعث می‌شه ارتباط بین اشیاء پویا و منعطف باشه.

🔍 چرا Design Patterns مهم هستن؟
کد تمیزتر:
با استفاده از الگوها، کدتون ساختارمند و قابل‌فهم‌تر می‌شه.

نگهداری آسون‌تر:
چون از راه‌حل‌های استاندارد استفاده می‌کنین، بعداً تغییر دادن یا گسترش کد راحت‌تره.

ارتباط بهتر:
برنامه‌نویس‌ها با اسم الگوها می‌تونن سریع منظور همدیگه رو بفهمن.

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


جمع‌بندی
Design Patterns مثل یه جعبه‌ابزار برای برنامه‌نویس‌ها هستن. این الگوها فقط یه بخش کوچیک از دنیای بزرگ Design Patterns هستن و تو کتاب Gang of Four، ۲۳ الگوی مختلف معرفی شده که هر کدوم کاربرد خاص خودشون رو دارن.

#️⃣ #programming #software


🥷 CHANNEL | GROUP
7
پست بعدی go باشه؟
👎22👍171
دوستان توی X (توئیتر سابق) اکانت باز کردم و احتمالا اونجاهم پست بزارم
دوست داشتید میتونید فالو داشته باشید که اگه پست گذاشتم استفاده کنید.

لینک اکانت:👇
https://x.com/mohammad_stdout?t=cU6VCDqEQhyU2SO5AtqkGw&s=09

#️⃣ #link


🥷 CHANNEL | GROUP
👍9👎2
خب خب خب WebSocket در Fastapi 🌀

امروز می‌خوام درباره‌ی یه موضوع باحال و کاربردی تو دنیای وب حرف بزنم: پیاده‌سازی WebSocket در FastAPI اگه دنبال ساخت اپلیکیشن‌های realtime مثل چت، داشبوردهای زنده یا بازی‌های آنلاین هستین، این پست براتون خیلی مفیده. پس با من همراه باشین تا با هم یاد بگیریم WebSocket چیه و چطور می‌تونیم تو FastAPI ازش استفاده کنیم.

🧠 WebSocket چیه و چرا مهمه؟
‏ WebSocket یه پروتکل ارتباطیه که به کلاینت (مثل مرورگر) و سرور اجازه می‌ده یه ارتباط دوطرفه و همیشگی داشته باشن. برعکس HTTP که فقط یه درخواست می‌فرستی و یه پاسخ می‌گیری، WebSocket این امکان رو می‌ده که هر دو طرف هر وقت خواستن پیام بفرستن و بگیرن، بدون اینکه نیاز باشه کلاینت مدام درخواست بفرسته. این برای اپلیکیشن‌هایی که نیاز به آپدیت‌های زنده دارن، مثل چت روم‌ها، اعلان‌های realtime یا بازی‌های آنلاین، عالیه

🚀 FastAPI و WebSocket

FastAPI یه فریم‌ورک وب مدرن و سریع برای پایتونه. یکی از قابلیت‌های باحالش هم پشتیبانی از WebSocketه. FastAPI از Starlette استفاده می‌کنه (یه فریم‌ورک ASGI سبک و قدرتمند)، و همین باعث می‌شه بتونیم به راحتی WebSocket رو پیاده‌سازی کنیم.

🛠 چطوری WebSocket رو تو FastAPI پیاده‌سازی کنیم؟

برای شروع، باید از کلاس WebSocket تو FastAPI استفاده کنیم. بیاین با یه مثال ساده شروع کنیم:
from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"پیامت این بود: {data}")

تو این کد:
یه endpoint به اسم /ws ساختیم.

وقتی کلاینت بهش وصل می‌شه، سرور با accept() ارتباط رو قبول می‌کنه.

بعدش تو یه حلقه پیام‌های کلاینت رو می‌گیره و همونو برمی‌گردونه.


به این می‌گن یه Echo Server ساده هر چی کلاینت بفرسته، سرور عینشو برمی‌گردونه.

📡 یه مثال پیشرفته‌تر: چت روم با WebSocket

حالا بیاین یه چیز باحال‌تر بسازیم، مثلاً یه چت روم که چندتا کلاینت بتونن بهش وصل بشن و پیام‌هاشون رو به هم بفرستن. برای این کار، باید اتصال‌های فعال رو مدیریت کنیم. یه کلاس به اسم ConnectionManager می‌سازیم که لیست اتصال‌ها رو نگه داره و بتونیم بهشون پیام بفرستیم یا به همه broadcast کنیم.
from fastapi import FastAPI, WebSocket
from typing import List

app = FastAPI()

class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []

async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)

def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)

async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)

async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.send_personal_message(f"تو نوشتی: {data}", websocket)
await manager.broadcast(f"یکی گفت: {data}")
except Exception as e:
print(f"خطا: {e}")
finally:
manager.disconnect(websocket)

اینجا چی داریم؟
‏ConnectionManager یه کلاسه که اتصال‌های فعال رو تو یه لیست نگه می‌داره.
وقتی کلاینت وصل می‌شه، به لیست اضافه می‌شه (connect) و وقتی قطع می‌شه، حذف می‌شه (disconnect).

‏send_personal_message به یه کلاینت خاص پیام می‌فرسته.

‏broadcast به همه کلاینت‌های وصل‌شده پیام رو می‌فرسته.

تو endpoint، پیام کلاینت رو می‌گیریم، به خودش یه جواب شخصی می‌دیم و به بقیه هم broadcast می‌کنیم.

جمع‌بندی

‏WebSocket تو FastAPI به شما این امکان رو می‌ده که اپلیکیشن‌های realtime و جذاب بسازین. از چت روم‌ها گرفته تا داشبوردهای زنده و بازی‌های آنلاین.

خب اینم از این امید وارم مفید بوده باشه :]

#️⃣  #fastapi #backend #python


🥷 CHANNEL | GROUP
👍11👌53🔥2👏1🤩1
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️کاربرهای سیستم عامل های مختلف:

تجربه ی کار با سیستم عامل های دیگه مثل BSD رو داشتین؟🤔

#️⃣ #linux #bsd #meme


🐧 CHANNEL | GROUP
🤣8
دوستان کدوم پلتفرم ها رو برای گذاشتن مقاله پیشنهاد میدید؟
👍7
Ninja Learn | نینجا لرن
دوستان کدوم پلتفرم ها رو برای گذاشتن مقاله پیشنهاد میدید؟
احتمالا مقاله هم بزارم
بیشتر راجب تکنولوژی های بروزه که محتوای زیادی براشون نیست.
👍7👎1