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

گروه چت پرسش و پاسخ: https://t.me/azad_program
Download Telegram
Django Honeypot🍯

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


مزایا:
ردیابی حملات: شما میتونین هر کسی که سعی داره بدون اجازه وارد پنل ادمین بشه رو شناسایی کنین

کاهش ریسک حملات: هکرها به اشتباه فکر میکنن وارد صفحه اصلی شدن و شما میتونین از این فرصت استفاده کنین تا حمله رو مدیریت کنین

سادگی استفاده: بدون نیاز به تغییرات پیچیده توی پروژه تون به راحتی میتونید این پکیج رو نصب و استفاده کنین.


چطور از django honeypot استفاده کنیم؟

1) اول از همه باید پکیج رو نصب کنی
pip install django-admin-honeypot


2) بعد از نصب باید django honeypot رو به تنظیمات پروژه اضافه کنی توی فایل settings.py خط زیر رو

اضافه کنید

‏INSTALLED_APPS = [
#another_apps
'admin_honeypot',‏

]


.3) حالا باید به مسیر جعلی برای پنل ادمین بسازید توی فایل urls.py این تغییرات رو اعمال کنید:
from django.urls import path, include‏

‏import admin_honeypot.urls‏

‏urlpatterns = [‏

‏path('admin/', include('admin_honeypot.urls',‏ namespace='admin_honeypot')),‏

‏path('real-admin/', admin.site.urls)

]

مسیر /admin/ حالا صفحه جعلی ادمینه که تله ی شماست .

مسیر real-admin / هم مسیر واقعی پنل ادمین شماست که فقط خودتون میدونید.


محدودیت‌ها:

این روش ممکن است برای ربات‌های پیشرفته که فیلدهای مخفی را نادیده می‌گیرند، مؤثر نباشد.
برای امنیت بهتر، می‌توان از Honeypot همراه با سایر روش‌ها مانند CAPTCHA یا Rate Limiting استفاده کرد.

جمع‌بندی:

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

Group: @azad_program
Channel: @kiau_program
👍8❤4
🌐 اولین وب‌سایت دنیا: داستان شروع اینترنت!

دنیای اینترنت و صفحات وب که امروزه باهاش در ارتباطیم، 34 سال پیش از یه سایت ساده شروع شد. این سایت توسط تیم برنرز-لی (Tim Berners-Lee)، دانشمند بریتانیایی، در سال 1991 در دسترس عموم قرار گرفت.

در 29 آذر 1369، برنرز-لی در مرکز تحقیقات هسته‌ای اروپا (CERN) متوجه شد دانشمندان برای اشتراک اطلاعات به سیستمی ساده نیاز دارن. اون شبکه‌ای جهانی طراحی کرد که بعدها به World Wide Web (WWW) معروف شد. ابتدا این وب‌سایت فقط برای کارمندان CERN قابل دسترسی بود اما در مرداد 1370 عمومی شد.

از اونجایی که مفهوم Server تازه بود، تیم یادداشتی با جوهر قرمز روی کامپیوتر NeXT (میزبان پروژه) نوشت: "این دستگاه یک سرور است؛ آن را خاموش نکنید!"

آدرس وب‌سایت:
http://info.cern.ch

این سایت ساده توضیح می‌داد وب چیه و چطور می‌شه ازش استفاده کرد. بدون عکس، صرفاً با HTML، پروتکل HTTP و یک URL ساخته شده بود.

Group: @azad_program
Channel:
@kiau_program
👍7❤3
🌐 مفهوم REST Api و RESTful API!
امروز میخوایم درمورد یک ساختار و معماری مهم در API ها به اسم REST و REST Api صحبت کنیم.

⁉️ اما API اصلا چیه؟
ببینید، API مثل یه جور پل ارتباطی میمونه بین دو برنامه یا Server و Client، به زبان ساده تر، API یسری قوانین و دستورالعمله که به برنامه ها میگه چطوری باهم حرف بزنن و اطلاعات رد و بدل کنن.
فرض کنین شما یه اپلیکیشن هواشناسی دارید. این اپلیکیشن برای اینکه اطلاعات هوا رو نشون بده باید با یه سرویس هواشناسی ارتباط برقرار کنه. این ارتباط از طریق API انجام میشه.

⭕️ اول از همه REST Api چیه؟
یه REST API در واقع یه راه ارتباطی بین دو تا نرم‌افزاره که از اصول REST پیروی میکنه. به زبان ساده‌تر، یه سری قوانین و استانداردهایی رو رعایت می‌کنه تا نرم‌افزارها بتونن به راحتی با هم حرف بزنن و اطلاعات رد و بدل کنن.

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

چطوری کار میکنه؟
از پروتکل HTTP برای ارتباط استفاده میکنه (همون پروتکلی که مرورگرها برای باز کردن صفحات وب استفاده میکنن).

چه شکلیه؟
معمولاً از فرمت‌هایی مثل JSON یا XML برای انتقال داده‌ها استفاده میکنه.

‼️ تفاوت REST Api با RESTful API
یک REST Api از پروتکل HTTP استفاده میکنه و یکسری از عملیات CRUD (ایجاد، خواندن، بروزرسانی، حذف) رو انجام میده اما ممکنه همه اصول REST رو رعایت نکنه.

وقتی که یک REST Api به طور کامل به اصول، قواعد، قوانین و ساختار معماری REST پایبند باشه و تمامی عملیات رو به طول کامل انجام بده به یک RESTful API تبدیل میشه

🔸 مفاهیم کلیدی در REST API:
منابع (Resources): هر چیزی که تو یه برنامه میخوایم بهش دسترسی داشته باشیم یه منبع حساب میشه. مثلاً کاربرها، پست ها، محصولات و …

درخواست ها (Requests): درخواست ها مثل دستوراتی هستن که به API میدیم. مثلاً میگیم “همه کاربرهارو بده” یا “یه کاربر جدید اضافه کن”.

پاسخ ها (Responses): پاسخ ها هم مثل جواب هایی هستن که API به ما میده. مثلاً یه لیست از کاربرها یا یه پیام که میگه “کاربر با موفقیت اضافه شد”.

متدهای HTTP: برای اینکه مشخص کنیم چه کاری می خوایم انجام بدیم، از یه سری متدها استفاده میکنیم،

مثل:
GET: برای گرفتن اطلاعات
POST: برای اضافه کردن اطلاعات
PUT: برای ویرایش اطلاعات
DELETE: برای حذف اطلاعات

🔸 یه مثال ساده از REST API:
فرض کنید یه اپلیکیشن داریم که لیست کتاب ها رو نشون میده.

درخواست GET /books: یعنی “همه کتاب ها رو بده”.
پاسخ: یه لیست از همه کتاب ها برمیگرده.

درخواست POST /books: یعنی “یه کتاب جدید اضافه کن”.
پاسخ: یه پیام میاد که میگه “کتاب با موفقیت اضافه شد”.

Group: @azad_program
Channel:
@kiau_program
👍5❤2
🎉 به مناسبت سالروز گروه Azad's Programmer، سرور دیسکورد ما راه‌اندازی شد! 🎉

برای تعامل بیشتر و بهره‌گیری از امکانات جدید، به ما در سرور دیسکورد بپیوندید:
https://discord.gg/y8xd5dYC

منتظرتون هستیم! 🚀
5❤‍🔥5👍1👎1
دقیق ترین رودمپ برای شخصی که میخواد 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