Azad's Programmers
2.43K subscribers
90 photos
27 videos
18 files
71 links
کانال آموزش برنامه نویسی دانشگاه آزاد

گروه چت پرسش و پاسخ: https://t.me/azad_program
Download Telegram
دقیق ترین رودمپ برای شخصی که میخواد DevOps کار کنه🧑🏻‍💻

Group: @azad_program
Channel: @kiau_program
👍5🔥1
مسئله ی n +1

یکی از مشکلاتی که همیشه در هر زبان و فریمورکی ما باید حواسمون بهش باشه سرعتی هست که داریم توی api ها و مسئله ی n +1 که خارج از بحث جنگو هم هست و یکم با مثال میخوام توضیحش بدم(اینم اضافه میکنم همیشه بهترین راه وجود داره و این قطعا نمیتونه بهترین راه باشه)
جالبه بدونید یکی از مشکلات شرکت یکتانت هم بوده این قضیه
این مسئله توی خیلی از زبان هایی که با orm هاشون کار میکنیم گریبان گیر ما میشن مثل
Django, Node Js, Golang, C# , ...

فرض کنید مدل یا تیبل های ما به این صورت هست
class Post(models.Model):
title = models.CharField(max_length=255)

class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
content = models.TextField()


الان هم وقتشه تمام پست هامون رو با کامنت هاشون بگیریم
posts = Post.objects.all()
for post in posts:
comments = post.comments.all()


این کد ما یک کوئری برای گرفتن تمام پست ها و یک کوئری برای کامنت های اون میزنه
تصور کنید 100پست داریم و با این کار 101 کوئری میزنیم



حالا راه حل یا همون best practice ما اینجا به این شکله


1) select_related
برای روابط ForeignKey یا OneToOne استفاده می‌شه و یک JOIN در همان کوئری اصلی اجرا می‌کنه که کلا 1 کوئری میزنه
#orm
posts = Post.objects.select_related('author').all()

#query
SELECT post.id, post.title, author.id, author.name
FROM post
LEFT JOIN author ON post.author_id = author.id;



2) prefetch_related
برای روابط ManyToOne، ManyToMany، یا هر رابطه‌ای که نیاز به کوئری جداگانه داره استفاده می‌شه. این روش به جای استفاده از JOIN، اول کوئری اصلی را اجرا میکنه و بعد از اون یک کوئری جداگانه برای داده‌های مرتبط می‌زنه و در کل 2 کوئری میزنه به دیتابیس ما

#orm
posts = Post.objects.prefetch_related('comments').all()


#query
SELECT * FROM post;
SELECT * FROM comment WHERE post_id IN (1, 2, 3, ...);


Group: @azad_program
Channel:
@kiau_program
🔥7👍1
💡 Prompt:

"Imagine you're explaining a powerful insight, breakthrough, or personal experience in your field to a curious but non-expert friend. Keep it engaging, valuable, and relatable."

Now, craft your post using this structure:

1️⃣ HOOK (First 1-2 Lines): Grab attention instantly. Use a thought-provoking question, bold statement, or shocking statistic.
Example: "Most people think AI will replace traders. But what if I told you the best traders will be those who master AI?"

2️⃣ STORY / INSIGHT: Share a personal experience, a mistake you learned from, or a fresh perspective on a trending topic. Make it digestible, not technical.
Example: "When I first started trading, I ignored price action and relied only on indicators. My strategy failed. Then I discovered a hybrid approach that changed everything…"

3️⃣ VALUE / LESSON: Offer a takeaway that readers can apply to their own work.
Example: "The key is understanding how AI models work without blindly trusting them. Here’s how I blend AI-driven signals with human intuition…"

4️⃣ CALL TO ACTION (CTA): Encourage engagement—ask a question or invite opinions.
Example: "How do you think AI will impact trading strategies in the next five years? Let’s discuss!"

✨ BONUS TIPS:
✅ Use short, punchy sentences to keep it readable.
✅ Add whitespace (no big text blocks).
✅ Use emojis strategically (sparingly).
✅ Experiment with storytelling, controversial opinions, or behind-the-scenes insights.
✅ Engage with every comment to boost visibility.
❤4🔥1
### 📌 راهنمای جامع درخشش در لینکدین: از ساخت پروفایل تا تولید محتوای حرفه‌ای

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

---

## ✨ ۱. ساخت پروفایل حرفه‌ای

🔹 تصویر پروفایل مناسب: از یک عکس واضح، حرفه‌ای و با پس‌زمینه ساده استفاده کنید.
🔹 هدر جذاب: یک تصویر پس‌زمینه مناسب با زمینه کاری خود انتخاب کنید.
🔹 عنوان شغلی (Headline) قوی: در چند کلمه مشخص کنید که چه کسی هستید و چه ارزشی ارائه می‌دهید.
🔹 بخش درباره من (About): در چند خط توضیح دهید که چه مهارت‌هایی دارید، چه کارهایی انجام داده‌اید و چه اهدافی دنبال می‌کنید.
🔹 تجربه‌های کاری (Experience): سابقه کاری خود را به همراه دستاوردهای کلیدی ذکر کنید.
🔹 مهارت‌ها و تأییدیه‌ها (Skills & Endorsements): حداقل ۵ تا ۱۰ مهارت کلیدی اضافه کنید و از همکاران خود بخواهید آنها را تأیید کنند.

✅ نکته مهم: پروفایل شما درواقع رزومه آنلاین شماست. کامل بودن و حرفه‌ای بودن آن باعث جذب فرصت‌های بهتر می‌شود.

---

## 📢 ۲. استراتژی تولید محتوای حرفه‌ای در لینکدین

### 🟢 چه محتوایی تولید کنیم؟
🔹 تجربیات شخصی و درس‌هایی که گرفته‌اید (مثلاً "چطور اولین شغل خود را گرفتم؟")
🔹 نقد و تحلیل روندهای جدید در حوزه کاری خود (مثلاً "آینده هوش مصنوعی در بازارهای مالی")
🔹 آموزش نکات کاربردی و کوتاه (مثلاً "۵ مهارت ضروری برای موفقیت در فریلنسینگ")
🔹 اشتراک‌گذاری موفقیت‌ها و دستاوردها (اما بدون خودستایی)
🔹 به اشتراک گذاشتن چالش‌ها و مشکلاتی که با آن روبه‌رو شده‌اید و نحوه حل آن‌ها

### 🟡 چگونه پست‌های تأثیرگذار بنویسیم؟
✅ ۱. شروع با یک هوک قوی: اولین جمله پست باید به قدری جذاب باشد که مخاطب را درگیر کند.
✅ ۲. ارائه یک داستان یا تجربه شخصی: مردم با داستان‌ها ارتباط بیشتری برقرار می‌کنند.
✅ ۳. ارائه یک درس یا نکته ارزشمند: محتوای شما باید برای مخاطب مفید باشد.
✅ ۴. دعوت به تعامل (Call to Action): یک سوال بپرسید تا کاربران نظرات خود را به اشتراک بگذارند.
✅ ۵. استفاده از هشتگ‌های مرتبط: بین ۳ تا ۵ هشتگ مناسب اضافه کنید تا پست شما به افراد بیشتری نمایش داده شود.

### 🔵 محتوای فارسی یا انگلیسی؟
✅ اگر بازار هدف شما ایران است، فارسی بنویسید.
✅ اگر به دنبال فرصت‌های بین‌المللی هستید، ترکیبی از فارسی و انگلیسی استفاده کنید.
✅ اگر تمرکز شما فقط روی بازار جهانی است، تمام محتوای خود را به انگلیسی منتشر کنید.

✅ نکته مهم: استفاده از زبان انگلیسی باعث می‌شود محتوای شما در سطح بین‌المللی بیشتر دیده شود، اما در نظر بگیرید که مخاطبان ایرانی ممکن است کمتر درگیر شوند.

---

## 🤝 ۳. شبکه‌سازی و افزایش ارتباطات در لینکدین

🔹 درخواست ارتباط هدفمند بفرستید: روزانه ۱۰ تا ۲۰ درخواست ارتباط برای افراد مرتبط با حوزه کاری خود ارسال کنید.
🔹 پیام کوتاه و شخصی‌سازی شده بنویسید: هنگام ارسال درخواست، یک متن کوتاه اضافه کنید که دلیل ارتباط را توضیح دهد.
🔹 در بخش کامنت‌ها فعال باشید: با نظرات ارزشمند در پست‌های دیگران، توجه بیشتری جلب کنید.
🔹 در گروه‌های تخصصی لینکدین عضو شوید و در بحث‌ها مشارکت داشته باشید.
🔹 افراد تأثیرگذار در حوزه خود را دنبال کنید و با آن‌ها تعامل داشته باشید.

✅ نکته مهم: شبکه‌سازی در لینکدین یک فرایند طولانی‌مدت است، اما اگر به‌طور مستمر روی آن کار کنید، می‌تواند فرصت‌های بی‌نظیری برای شما ایجاد کند.

---

## 🚀 ۴. نکات طلایی برای موفقیت در لینکدین

🔹 ثبات داشته باشید: هفته‌ای حداقل ۲ تا ۳ پست منتشر کنید.
🔹 محتوای خشک و رسمی نگذارید: خودتان باشید و با زبان ساده اما حرفه‌ای بنویسید.
🔹 با افراد متخصص تعامل کنید: جواب کامنت‌ها را بدهید و سعی کنید گفتگوهای ارزشمند ایجاد کنید.
🔹 در پست‌های خود از ترکیب متن، تصویر و ویدئو استفاده کنید: محتواهای بصری تعامل بیشتری ایجاد می‌کنند.
🔹 تحلیل کنید که چه نوع محتوایی بهتر جواب می‌دهد: عملکرد پست‌های خود را بررسی کنید و بر اساس آن، استراتژی خود را تنظیم کنید.
🔹 صبور باشید: رشد در لینکدین زمان می‌برد، اما اگر مداومت داشته باشید، نتایج فوق‌العاده‌ای می‌گیرید.

---

### 🎯 جمع‌بندی و برنامه عملی برای شروع در لینکدین
❤7🔥2
✅ ۱. پروفایل خود را تکمیل کنید (تصویر مناسب، بیوگرافی قوی، مهارت‌ها و تجربه‌ها)
✅ ۲. فعالیت خود را شروع کنید (لایک، کامنت، تعامل)
✅ ۳. محتوای ارزشمند منتشر کنید (داستان‌ها، تجربیات، تحلیل‌ها، نکات آموزشی)
✅ ۴. درخواست ارتباط هدفمند ارسال کنید و شبکه ارتباطی خود را گسترش دهید
✅ ۵. به‌صورت مستمر فعالیت کنید و از الگوریتم لینکدین بهره ببرید

با رعایت این نکات، نه تنها دیده می‌شوید، بلکه می‌توانید یک برند شخصی قوی بسازید و فرصت‌های شغلی و حرفه‌ای فوق‌العاده‌ای برای خود ایجاد کنید.
❤7🔥1
⭕️ تفاوت و اهمیت Soft Skills و Hard Skills

✍🏼 مهارت های نرم یا Soft Skills
مهارت های نرم به قابلیت ها و ویژگی های فردی اشاره داره که به نحوه تعامل و ارتباط شما با افراد دیگه تاثیر میذاره. این مهارت ها معمولا غیر فنی هستن و به طور غریزی در اکثر افراد وجود دارن و منبع مشخصی برای یادگیری اونها وجود نداره اما به مرور میشه تقویتشون کرد.

توانایی هایی مثل:
ارتباطات و فن بیان - همکاری و کار تیمی - حل مسئله - مدیریت زمان - رهبری - انطباق پذیری - انعطاف پذیری - انتقاد پذیری - مذاکره - خلاقیت - اعتماد به نفس - هوش هیجانی - مدیریت استرس و ...

💻 مهارت های سخت یا Hard Skills
مهارت های سخت به توانایی ها و دانش فنی اشاره داره که قابل اندازه گیری و آموزش هستن. این مهارت ها معمولا از طریق دوره های آموزشی مختلف، تجربه، مطالعه و در یک بازه زمانی مشخص به دست میان.

مهارت هایی مثل:
تمامی حوزه های برنامه نویسی - تحلیل داده - مدیریت پروژه - طراحی گرافیک - مهارت های فنی - زبان های خارجی - تحلیل مالی - رانندگی - نواختن ساز و ...

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

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

Group: @azad_program
Channel: @kiau_program
❤5🔥2🤣1
👩‍💻آدا لاولیس (Ada Lovelace) : داستان اولین برنامه نویس جهان، قبل از کامپیوتر

شاید تا الان فکر میکردین که اولین برنامه نویس جهان یک نابغه ریاضیات یا یک پروفسور خیلی کارکشته بوده که با یه جرقه ایده برنامه نویسی به ذهنش اومده🤔

❗️ اما امروز یک داستان جالب براتون داریم.
تصور کنین حدود 200 سال پیش، وقتی نه خبری از کامپیوتر ها بود نه موبایل و تکنولوژی امروزی، یک خانم جوان انگلیسی چیزی رو پیشبینی کرد که دنیای امروز ما رو ساخت!

آدا لاولیس (1852-1815) دختر لرد بایرون شاعر مشهور انگلیسی با وجود زندگی کوتاه 36 ساله اش انقلابی در دنیای محاسبات و تکنولوژی ایجاد کرد.

✨ داستان از جایی شروع میشه که آدا در جوانی با چارلز بَبیج، ریاضیدان برجسته آشنا شد، بَبیج طرح ماشینی به نام “موتور تحلیلی” داشت که میتونست محاسبات پیچیده انجام بده - چیزی شبیه به کامپیوترهای امروزی!

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

اون پیشبینی کرده بود که این ماشین ها می تونن در آینده کارهای بیشتر از یک محاسبات ساده مثل ساخت موسیقی، تصویر و ... کنن.

💡 نکته جالب اینه که مادر آدا برای اینکه دخترش مثل پدرش شاعر نشه، مجبورش کرد علم ریاضیات رو مطالعه کنه ولی همین ترکیب ریاضیات و خلاقیت، آدا رو به یک نابغه تبدیل کرد.

همچنین به احترام نام اون در سال 1983 زبان برنامه نویسی با نام Ada معرفی شد.

Group: @azad_program
Channel: @kiau_program
❤‍🔥6❤3
🦭 آشنایی با عملگر والروس := در پایتون
عملگر والروس از پایتون 3.8 اضافه شد و به شما این امکان را می‌دهد که هم‌زمان مقدار یک متغیر را تعیین کرده و از آن استفاده کنید. این ویژگی باعث کوتاه‌تر شدن کدها می‌شود.

🔹 قبل از والروس:

n = int(input("Enter a number: "))
while n > 0:
print(n)
n = int(input("Enter a number: "))

🔹 بعد از والروس:

while (n := int(input("Enter a number: "))) > 0:
print(n)

✅ کد کوتاه‌تر و خواناتر شده و مقدار n تنها یک بار مقداردهی شده است.

💡 کجا ازش استفاده کنیم؟
🔹 در حلقه‌ها و شرط‌هایی که نیاز به مقداردهی و بررسی مقدار داریم.

📌 خوانایی کد مهم‌تر از کوتاه بودن آن است، پس فقط جایی که مفید باشد از آن استفاده کنید!

#Python #برنامه‌نویسی #کدنویسی
Group: @azad_program
Channel:
@kiau_program
❤6🔥1
اصول SOLID
(1/2) پست دوم با مثال گذاشته میشه


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

تاریخچه SOLID
در اواخر دهه ۱۹۸۰ و اوایل ۱۹۹۰، رابرت سی. مارتین (Robert C. Martin) که به "عمو باب" (Uncle Bob) معروف است روی روش‌های بهتر طراحی شی‌گرا کار می‌کرد در مقاله‌ای که سال ۲۰۰۰ منتشر کرد، پنج اصل مهم را معرفی کرد که به برنامه‌نویسا کمک میکرد کدهای بهتری بنویسن

چند سال بعد مایکل فدرز (Michael Feathers) این پنج اصل را با نام SOLID معرفی کرد که مخفف پنج اصل زیر است:

- Single Responsibility Principle
- Open/Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle

این اصول باعث میشه کدهای ما:
خواناتر و درک‌پذیرتر باشن، کمتر دچار تغییرات غیرمنتظره شوند، تست‌پذیرتر باشن و به راحتی توسعه داده شوند


___________________________
نظر شخصی: همیشه رعایت SOLID خوب نیست و گاهی ممکنه به ضرر خودمون و پروژه تموم شه به چند دلیل :
1) پیچیدگی اضافی توی پروژه هایی که نیازی به پیچیدگی کد ندارند و خیلی ساده با یک کلاس میتونند کار کنند
2) وقتی تازه میخوایم یه پروداکت رو بالا بیاریم و سرعت توسعه مهم تر از کد خیلی اصولی هست
3) از این گزینه به بعد از سواد بنده خارج هست و اگر مشتاق بودید میتونید درموردش سرچ کنید و بیشتر بخونید

___________________________


S - Single Responsibility Principle (SRP)


هر کلاس فقط باید یک وظیفه مشخص داشته باشه یعنی یک کلاس نباید چندین کار مختلف انجام بده

O - Open/Closed Principle (OCP)

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


L - Liskov Substitution Principle (LSP)


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


I - Interface Segregation Principle (ISP)


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

D - Dependency Inversion Principle (DIP)


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



Group: @azad_program
Channel:
@kiau_program
❤12👍2
Azad's Programmers
اصول SOLID (1/2) پست دوم با مثال گذاشته میشه یکی از چالش‌هایی که هر برنامه‌نویس با ان مواجه می‌شه کدهای پیچیده، غیرقابل توسعه و پر از باگ هستش برای اینکه کدهامون تمیز، توسعه‌پذیر و تست‌پذیر باشند باید از یک سری اصول مهندسی نرم‌افزار استفاده کنیم اصول SOLID…
اصول SOLID
(2/2)


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

class Report:
def __init__(self, data):
self.data = data

def generate_report(self):
return f"Report Data: {self.data}"

class ReportPrinter:
@staticmethod
def print(report: Report):
print(report.generate_report())


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




from abc import ABC, abstractmethod

class DiscountStrategy(ABC):
@abstractmethod
def apply(self, price):
pass

class PercentageDiscount(DiscountStrategy):
def apply(self, price):
return price * 0.9

class FixedDiscount(DiscountStrategy):
def apply(self, price):
return price - 10

class DiscountCalculator:
def __init__(self, strategy: DiscountStrategy):
self.strategy = strategy

def calculate(self, price):
return self.strategy.apply(price)


discount = DiscountCalculator(PercentageDiscount())
print(discount.calculate(100))


LSP

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

class Shape:
def area(self):
pass

class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height

def area(self):
return self.width * self.height

class Square(Shape):
def __init__(self, side):
self.side = side

def area(self):
return self.side * self.side


ISP

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

from abc import ABC, abstractmethod

class Printer(ABC):
@abstractmethod
def print(self, document):
pass

class Scanner(ABC):
@abstractmethod
def scan(self, document):
pass

class FaxMachine(ABC):
@abstractmethod
def fax(self, document):
pass

class SimplePrinter(Printer):
def print(self, document):
print(f"Printing: {document}")

class AllInOnePrinter(Printer, Scanner, FaxMachine):
def print(self, document):
print(f"Printing: {document}")

def scan(self, document):
print(f"Scanning: {document}")

def fax(self, document):
print(f"Faxing: {document}")


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

from abc import ABC, abstractmethod

class Database(ABC):
@abstractmethod
def connect(self):
pass

class MySQLDatabase(Database):
def connect(self):
return "Connected to MySQL"

class PostgreSQLDatabase(Database):
def connect(self):
return "Connected to PostgreSQL"

class UserService:
def __init__(self, db: Database):
self.db = db

def get_user(self):
return self.db.connect()


db = PostgreSQLDatabase()
user_service = UserService(db)
print(user_service.get_user())


Group: @azad_program
Channel:
@kiau_program
👍6❤2
💠 لیستی از عبارت ها و مخفف های رایجی که ممکنه راجبشون شنیده باشین

WWW
: World Wide Web
URL: Uniform Resource Locator

HTML: HyperText Markup Language
CSS: Cascading Style Sheets
SASS: Syntactically Awesome Style Sheets

AJAX: Asynchronous JavaScript And Xml
NPM: Node Package Manager
DOM: Document Object Model
SPA: Single Page Application
CSR: Client Side Rendering
SSR: Server Side Rendering

UI: User Interface
UX: User Experience

JSON: JavaScript Object Notation
XML: Extensible Markup Language
CSV: Comma Separated Values
YAML: YAML Ain’t Markup Language

SEO: Search Engine Optimization
IDE: Integrated Development Environment
VCS: Version Control System

CMS: Content Management System
PWA: Progressive Web Application

MVC: Model View Controller
MVVM: Model View ViewModel

API: Application Programming Interface
REST: Representational State Transfer
DDD: Domain-Driven Design
CRUD: Create, Read, Update, Delete
CLI: Command Line Interface
CDN: Content Delivery Network
SDK: Software Development Kit

OOP: Object Oriented Programming

HTTP: HyperText Transfer Protocol
HTTPS: HyperText Transfer Protocol Secure
VPN: Virtual Private Network
OWASP: Open Web Application Security
DNS: Domain Name System
DHCP: Dynamic Host Configuration Protocol
IP: Internet Protocol
LAN: Local Area Network
SOAP: Simple Object Access Protocol
DDoS: Distributed Denial of Service
SSH: Secure Shell
SSL: Secure Sockets Layer
XSS: Cross-Site Scripting
IPS: Intrusion Prevention System

OS: Operating System
VM: Virtual Machine

DB: DataBase
DBA: DataBase Administrator
SQL: Structured Query Language

CI/CD: Continuous Integration/Continuous Delivery
DevOps: Development and Operations
TDD: Test-Driven Development

AI: Artificial Intelligence
ML: Machine Learning
DL: Deep Learning
NLP: Natural Language Processing
LLM: Large Language Model
MLOps: Machine Learning Operations

CPU: Central Processing Unit
GPU: Graphics Processing Unit
HDD: Hard Disk Drive
SSD: Solid-State Drive
RAM: Random Access Memory
ROM: Read-Only Memory

——————————————————
Group: @azad_program
Channel:
@kiau_program
❤9🔥4👍1
Merge یا Rebase
مسئله این است


در Git وقتی روی یک پروژه کار می‌کنیم از برنچ‌ها استفاده می‌کنیم تا تغییرات رو از هم جدا کنیم اما در نهایت باید این تغییرات رو به برنچ اصلی (مثلا main یا develop) اضافه کنیم دو روش اصلی برای انجام این کار Merge و Rebase هستند

ادامه👇
🔥4
Merge و Rebase هر دو یه هدف دارن ادغام تغییرات از یک برنچ به برنچ دیگر
اما این کارو به روش‌های کاملا متفاوتی انجام می‌دهند



Merge – ترکیب تغییرات با حفظ تاریخچه
وقتی از Merge استفاده می‌کنیم تغییرات یک برنچ را بدون تغییر در تاریخچه، به برنچ اصلی اضافه می‌کنیم گیت یک Merge Commit جدید ایجاد می‌کند که نشان می‌دهد این دو برنچ ترکیب شدند
بعد از Merge گیت یک کامیت جدید ایجاد میکنه که ترکیب دو برنچ رو نشون میده

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


Rebase – مرتب کردن تاریخچه تغییرات

ریبیس به جای ادغام مستقیم تغییرات کامیت‌های برنچ فعلی رو روی جدیدترین نسخه برنچی که میخوایم بازنویسی میکنه این کار باعث میشه که تاریخچه تغییرات تمیز و خطی بمونه
در اینجا گیت تمام کامیت‌های feature-branch رو می‌گیره و اونارو روی جدیدترین نسخه main بازنویسی میکنه

تاریخچه تغییرات مرتب‌تر و خطی‌تر میشه
برای پروژه‌هایی که تمیز بودن تاریخچه مهمه مفیده
اگر برنچ روی پابلیک ریپازیتوری باشه و هم‌تیمی‌ها روی آن کار کنن ممکنه باعث مشکلاتی بشه

Merge:
تاریخچه تغییرات به صورت یک درخت باقی میمونه یعنی میشه دید که یک برنچ از کجا اومده
Rebase:
تاریخچه صاف و خطی میشه طوری که انگار تغییرات همیشه روی نسخه به‌روز برنچ اصلی ساخته شده‌


—————————————
کی Merge و کی Rebase؟

Merge زمانی استفاده شود که:
بخوایم تاریخچه تغییرات حفظ شه
با کار تیمی و همکاری روی پابلیک ریپازیتوری سروکار داریم
بخوایم بفهمیم که هر تغییر از کجا اومده

Rebase زمانی استفاده شود که:
بخواهیم تاریخچه گیت تمیز و مرتب باشه
قبل از ادغام با main تغییرات رو روی آخرین ورژن اون اعمال کنیم
روی یک پرایوت ریپازیتوری (feature branch) کار میکنیم و تغییرات هنوز در پابلیک ریپازیتوری منتشر نشده


Group: @azad_program
Channel:
@kiau_program
❤7👍1
✅ آرشیو منابع پایتون ✅

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

کتاب، ویدئو، سورس کد، آموزش های کوتاه، اخبار و غیره

https://t.me/PythonForever
❤1🔥1
📌 مدل OSI چیست؟
مدل OSI (Open Systems Interconnection) یک استاندارد برای شبکه‌های کامپیوتری است که ارتباط بین سیستم‌های مختلف را در 7 لایه تعریف می‌کند. این مدل به درک بهتر نحوه انتقال داده‌ها در شبکه کمک می‌کند و در حل مشکلات شبکه و امنیت بسیار کاربرد دارد.

در ادامه، 7 لایه این مدل رو بررسی می‌کنیم:

🔹 1. لایه فیزیکی (Physical Layer)
📡 این لایه مسئول انتقال داده‌ها به‌صورت سیگنال‌های الکتریکی، نوری یا امواج رادیویی است. در واقع، همه چیز در این لایه به سخت‌افزار و تجهیزات شبکه مربوط می‌شود.
✅ مثال‌ها: کابل شبکه، فیبر نوری، وای‌فای، بلوتوث، هاب

🔹 2. لایه پیوند داده (Data Link Layer)
🔄 در این لایه، داده‌ها به فریم (Frame) تبدیل می‌شوند و ارسال بین دستگاه‌های متصل به یک شبکه محلی (LAN) انجام می‌شود. همچنین وظیفه کنترل خطا و مدیریت دسترسی به رسانه انتقال (MAC Address) را دارد.
✅ مثال‌ها: سوئیچ (Switch)، آدرس‌های MAC، پروتکل ARP

🔹 3. لایه شبکه (Network Layer)
🌍 این لایه مسئول مسیریابی (Routing) و انتقال بسته‌های داده بین شبکه‌های مختلف است.
✅ در این لایه آدرس‌های IP برای شناسایی دستگاه‌ها در شبکه استفاده می‌شود.
✅ مثال‌ها: IP (IPv4/IPv6)، روتر (Router)، پروتکل ICMP (Ping, Traceroute)

🔹 4. لایه انتقال (Transport Layer)
📦 این لایه وظیفه‌ی مدیریت ارتباط بین دو سیستم و کنترل خطا در انتقال داده را بر عهده دارد.
🔹 TCP (اتصال‌گرا): تضمین می‌کند که تمام بسته‌ها به ترتیب و بدون خطا به مقصد می‌رسند.
🔹 UDP (بدون اتصال): سریع است، اما تضمینی برای رسیدن بسته‌ها وجود ندارد (مانند استریم‌های زنده).
✅ مثال‌ها: TCP، UDP، شماره پورت‌ها (مثل HTTP روی پورت 80، HTTPS روی 443)

🔹 5. لایه نشست (Session Layer)
🔄 مسئول ایجاد، مدیریت و پایان دادن به ارتباطات بین دستگاه‌ها است. مثلاً وقتی در یک وب‌سایت لاگین می‌کنید، این لایه مدیریت نشست کاربری شما را انجام می‌دهد.
✅ مثال‌ها: SSL/TLS، RPC (Remote Procedure Call)

🔹 6. لایه ارائه (Presentation Layer)
🔐 این لایه وظیفه رمزگذاری (Encryption)، فشرده‌سازی (Compression) و تبدیل داده‌ها به فرمت مناسب را دارد.
✅ مثال‌ها: SSL/TLS برای رمزگذاری، JSON/XML برای تبادل داده

🔹 7. لایه کاربرد (Application Layer)
👨‍💻 این لایه همان جایی است که کاربران با شبکه تعامل دارند و شامل پروتکل‌های مختلفی برای سرویس‌های اینترنتی است.
✅ مثال‌ها: HTTP/HTTPS (وب‌گردی)، FTP (انتقال فایل)، SMTP/IMAP (ایمیل)، DNS (نام دامنه)

🛡 مدل OSI و امنیت شبکه
بیشتر حملات سایبری در لایه‌های 3، 4 و 7 اتفاق می‌افتند. مثلاً:
🚨 لایه 3: حملات IP Spoofing، ICMP Flood
🚨 لایه 4: حملات SYN Flood، UDP Flood
🚨 لایه 7: حملات DDoS (HTTP Flood)، SQL Injection، Cross-Site Scripting (XSS)

✅ راهکارهای امنیتی:
🔹 استفاده از فایروال‌های لایه 7 (WAF) برای جلوگیری از حملات وب
🔹 CAPTCHA و Rate Limiting برای کاهش حملات DDoS
🔹 استفاده از TLS و VPN برای رمزگذاری داده‌ها

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

Group: @azad_program
Channel:
@kiau_program
👍7❤6👎2🔥1
تی ماکس(tmux) یکی از ابزارهای قدرتمند برای مدیریت چندین ترمینال در یک پنجره است. به کمک tmux می‌تونید پنجره‌های مختلف رو در یک ترمینال داشته باشید و به راحتی بین اون‌ها جابجا بشید. مثلاً می‌تونید چندین اتصال SSH به سرور داشته باشید و بین اون‌ها به سرعت سوئیچ کنید. از مزایای دیگه tmux اینه که می‌تونید به یک محیط کاری باز برگردید حتی اگر ترمینال شما بسته شده باشه یا قطع اتصال اتفاق افتاده باشه. خیلی برای افرادی که کارهای طولانی مدت توی سرور انجام می‌دن یا با پروژه‌های مختلف کار می‌کنن مفیده.
### tmux Cheat Sheet


#### 1️⃣ دستورات اصلی tmux
- tmux : شروع یک محیط کاری جدید tmux
- tmux new -s <name> : شروع محیط کاری جدید با نام دلخواه
- tmux attach -t <name> : اتصال به محیط کاری موجود
- tmux ls : نمایش لیست محیط‌های کاری فعال
- tmux kill-session -t <name> : بستن یک محیط کاری

---

#### 2️⃣ مدیریت پنجره‌ها و پنل‌ها
- Ctrl+b c : ایجاد پنجره جدید
- Ctrl+b n : رفتن به پنجره بعدی
- Ctrl+b p : رفتن به پنجره قبلی
- Ctrl+b <number> : رفتن به پنجره شماره مشخص
- Ctrl+b , : تغییر نام پنجره جاری

تقسیم پنل‌ها:
- Ctrl+b % : تقسیم پنجره به صورت عمودی
- Ctrl+b " : تقسیم پنجره به صورت افقی
- Ctrl+b o : جابجایی بین پنل‌ها
- Ctrl+b ; : سوئیچ به آخرین پنل فعال
- Ctrl+b x : بستن پنل جاری

---

#### 3️⃣ تغییر اندازه پنل‌ها
- Ctrl+b :resize-pane -L 5 : کاهش عرض پنل به اندازه 5 ستون
- Ctrl+b :resize-pane -R 5 : افزایش عرض پنل به اندازه 5 ستون
- Ctrl+b :resize-pane -U 3 : کاهش ارتفاع پنل به اندازه 3 ردیف
- Ctrl+b :resize-pane -D 3 : افزایش ارتفاع پنل به اندازه 3 ردیف

---

#### 4️⃣ حالت کپی و اسکرول
- Ctrl+b [ : ورود به حالت کپی (برای اسکرول و انتخاب متن)
- از کلیدهای جهت‌دار یا PageUp/PageDown برای اسکرول استفاده کنید
- Space : شروع انتخاب متن در حالت کپی
- Enter : کپی کردن متن انتخاب‌شده
- q : خروج از حالت کپی
- Ctrl+b ] : چسباندن متن کپی‌شده

---

#### 5️⃣ جدا شدن و اتصال دوباره
- Ctrl+b d : جدا شدن از محیط کاری (detach)
- برای اتصال دوباره از دستور tmux attach یا tmux attach -t <name> استفاده کنید

---

#### 6️⃣ دستورات عمومی و متفرقه
- Ctrl+b ? : نمایش لیست دستورات و کلیدهای میانبر
- Ctrl+b t : نمایش ساعت در نوار وضعیت
- Ctrl+b r : بارگذاری مجدد تنظیمات (بعد از تغییر در ~/.tmux.conf)
- Ctrl+b . : درخواست شماره پنجره جهت جابجایی مستقیم
- Ctrl+b : : ورود به حالت فرمان برای اجرای دستورات

---

#### 7️⃣ تنظیمات
- فایل ~/.tmux.conf را ویرایش کنید تا کلیدهای میانبر، رنگ‌ها و نوار وضعیت را به دلخواه تنظیم کنید.
- مثال: set -g mouse on برای فعال‌سازی پشتیبانی ماوس
- بعد از تغییر، با Ctrl+b r تنظیمات را بارگذاری مجدد کنید

---

#### 8️⃣ نکات مفید
- از محیط‌های کاری پایداری استفاده کنید؛ به جای بستن، با detach خارج شوید تا بعداً بتوانید به کارهای خود ادامه دهید.
- در صورت تداخل کلیدها، کلید پیش‌فرض را تغییر دهید (مثلاً set -g prefix C-a).
- برای پروژه‌های مختلف، می‌توانید محیط‌های کاری مجزا با پنجره‌ها و پنل‌های متنوع داشته باشید.

---

#### 9️⃣ راهنمای رفع مشکل
- اگر در حالت کپی گیر کردید، با فشار دادن q از آن خارج شوید.
- در صورت نیاز، از tmux kill-server برای بستن تمام محیط‌های کاری استفاده کنید (با احتیاط، چون همه کارهای در حال اجرا بسته می‌شوند).


Group: @azad_program
Channel:
@kiau_program
❤9👍1
🌐 تفاوت نقش ها، Web Designer ،Web Developer یا UI/UX Designer؟

سلام رفقا 👋🏼
توی دنیای وب، نقش‌های UI/UX Designer، Web Designer و Web Developer خیلی به گوش می‌خوره، ولی دقیقا چه فرقی دارن؟ بیاین یه مرور سریع کنیم:

1️⃣ با Web Developer ها یا توسعه دهنده های دنیای وبسایت شروع میکنیم، توسعه‌دهنده‌های واقعی وب! با استفاده از زبان ها و تکنولوژی های مختلف مثل HTML، CSS، JavaScript و ... ، فریم‌ورک‌هایی مثل React، Vue، Angular، Django، Laravel، Asp .NET، Nest و ... سایت رو از صفر تا صد کدنویسی می‌کنن و مطمئن میشن تا Back-End (تمام منطق و رفتار و عملکرد وبسایت در پشت صحنه و Front-End (ظاهر پویا، عملکرد ها و منطقی که کاربر به صورت مستقیم باهاش در ارتباطه) به درستی کار کنه.

2️⃣ میرسیم به Web Designer ها یا طراحان وب که درواقع منظورمون افرادین که بیشتر با CMS هایی مثل وردپرس کار می‌کنن. طراحانی که با Template Design، ابزار ها و پلاگین‌ها، یک وبسایت رو می‌سازن و بدون نیاز به کدنویسی عمیق، یه خروجی شیک تحویل میدن.

3️⃣ و در آخر UI/UX Designer ها، متخصصای رابط و تجربه کاربری! UI (User Interface) روی طراحی بصری مثل Layout، ساختار، رنگ‌ها، آیکون ها و به طور کل جلوه ظاهری طرح برنامه تمرکز داره و UX (User Experience) هم به بهینه‌سازی User Journey، دسترسی پذیری و راحتی کار با برنامه یا نرم افزار اهمیت میده، طراحان رابط و تجربه کاربری برای پیاده سازی دیزاین یا طرح نرم افزار مد نظر از ابزارایی مثل Figma یا Adobe XD استفاده میکنن.

❓تفاوت کلیدی؟
دولوپرها توی عمق کدنویسی صفر تا صد و منطق سایتن، وب دیزاینرها با CMS و خلاقیت سریع عمل می‌کنن، و UI/UX دیزاینر ها روی طراحی کاربرمحور زوم دارن.

شماها چی؟ فکر میکنین به چه فیلدی بیشتر علاقه مندین؟ نظرتون رو بگین

Group: @azad_program
Channel:
@kiau_program
❤4👍1
محدود کردن قبلِ از کار افتادن سیستم! 💡
...

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

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

چجوری از Throttling تو DRF استفاده کنیم؟!
DRF چند نوع Throttle پیش‌فرض داره:
AnonRateThrottle → برای کاربران ناشناس
UserRateThrottle → برای کاربران لاگین کرده
ScopedRateThrottle → برای محدود کردن درخواست‌ها در سطح API خاص
کافیه این تنظیمات رو توی settings.py اضافه کنیم و مقدار دلخواهمون رو تنظیم کنیم
با این روش از overload شدن سرور هم جلوگیری می‌کنیم.

بیشتر


Group: @azad_program
Channel:
@kiau_program
❤9🔥2
دریافت اطلاعات با متد POST

وقتی صحبت از دریافت اطلاعات میشه اولین متدی که به ذهنمون میاد GET هستش, این متد برای دریافت دیتا از سرور بدون ایجاد تغییر در سرور استفاده میشه تو این حالت، دیتامون به طور معمول در URL ارسال میشه و قابل مشاهده هست
ولی نکته جالب اینجاست که حتی با متد POST هم میتونیم اطلاعات را بگیریم, متد POST معمولا برای ارسال دیتا ها به سرور استفاده میشه تا در دیتابیس ذخیره بشه اما هیچ قانونی وجود نداره که این متد فقط برای ارسال دیتا استفاده میشه
(اگه همچین قانونی بود میتونید این زیر بگید که با خیال راحت کار غیرقانونی بکنیم)

توی بعضی از سناریوها سرور میتونه از متد POST برای گرفتن دیتا استفاده کنه به خصوص زمانی که حجم داده‌ها زیاده و نمیخوایم اونارو در URL قرار بدیم به عنوان مثال در ارسال دیتای JSON یا فایل ‌های حجیم بهتره که از POST استفاده کنیم

مثال:
{
"merchantId": "63a69a2d18f9347bd89d5fe6",
"mode": "weekly",
"type": "amount"
}

قاعدتا این اطلاعات اگه توی URL باشه کثیفی به همراه داره و بهتر هستش برای امنیتش توی BODY باشه


چرا از POST برای گرفتن اطلاعات استفاده میشه؟!


حجم بالای دیتا: اطلاعات بزرگتر از اونی خستش که در URL جا میگیره

امنیت بیشتر: اطلاعاتی که در Body ریکوئست ارسال میشه نسبت به URL امنیت بیشتری داره چون به نسبت URL به راحتی مشاهده نمیشه

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



تفاوت GET و POST در این مورد


وقتی دیتا توی URL (متد GET) فرستاده میشه این اتفاق ‌ها میفته:

آدرس کامل توی history ذخیره میشه

توی server logs یا proxy ها ممکنه لاگ بشه

آدرس URL می‌تونه در referrer به سایت‌های دیگه لو بره

محدودیت طول URL هم هستش


وقتی داده‌ها توی BODY (متد POST) فرستاده میشه:

دیتاها توی آدرس URL نمیان پس توی history یا لاگ URL دیده نمیشن

محدودیت طول نیستش میتونی حجم بیشتری از دیتارو ارسال کنیم

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


در نهایت استفاده از متد POST برای دریافت اطلاعات بستگی به نیاز خاص پروژه و شرایط امنیتی داره و هر متدی در جا و زمان خود کاربرد های متفاوتی خواهد داشت و همه ی اینها برای اینه که امن تر بشه نه اینکه کاملا امن بشه

Group: @azad_program
Channel:
@kiau_program
❤10👍4