Azad's Programmers
Open in Telegram
کانال آموزش برنامه نویسی دانشگاه آزاد گروه چت پرسش و پاسخ: https://t.me/azad_program
Show more2 105
Subscribers
No data24 hours
-67 days
+430 days
Posts Archive
2 105
نکات مهمی که از نبرد دوازدهروزه سایبری آموختیم:
1. تنوع تهدیدها فراتر از جنگ میدانی بود
این درگیری نشان داد که دشمن فقط با تانک یا توپ حمله نمیکند، بلکه میتواند از روشهای ترکیبی مثل جنگ شناختی و نفوذ اطلاعاتی وارد شود. حملات سایبری علیه سامانههای دفاع هوایی، بانکها و صرافیها نمونهای از این پیچیدگی بود.
2. ضرورت پایان دادن به اعتماد پیشفرض
دیگر نمیتوانیم به فیلتر ابتدایی افراد یا حصارهای شبکه اکتفا کنیم؛ چرا که خطر میتواند از درون سازمان شکل بگیرد. مدل «صفر اعتماد» (Zero Trust) تأکید دارد که هیچ کاربری، حتی مدیران و کارکنان رسمی، بدون احراز هویت مداوم و پایش رفتارشان نباید مجوز دسترسی داشته باشند.
3. رمزگذاری و ثبت همه ارتباطات
در چارچوب Zero Trust، مرز سنتی شبکه بیمعنا میشود؛ تمامی ترافیک باید رمز شود و در لاگها ثبت گردد. همچنین دسترسیها باید بر اساس کمترین امتیاز لازم (Least Privilege) و تقسیمبندی دقیق (Segmentation) تعریف شوند.
4. رفع «چشم بیمناک بیش از حد»
وقتی سازمان صرفاً در حال جستجوی بیوقفه تهدید باشد بدون آنکه روش مشخصی برای قضاوت داشته باشد، بخشهای کمخطر را مورد بازبینی مداوم قرار میدهد و دشمنان اصلی—نفوذگران پنهان داخلی—را نادیده میگیرد.
5. حرکت از رویکرد ایستا به پویا
ابزارهایی مانند UEBA و SIEM باید به شکلی هدفمند به کار گرفته شوند. کنترل دسترسی به هنگام (Just-In-Time) و دسترسی تطبیقی بر پایه ریسک (Risk-Adaptive) میتواند در شناسایی و محدودسازی تهدیدات داخلی بسیار مؤثر باشد.
6. سیاستهای ریسکمحور به جای نقشمحور
به جای تعریف ثابت دسترسیها بر اساس نقش شغلی، باید سیاستهایی تدوین کنیم که سطح ریسک فعالیتها را در نظر بگیرند و اختیارات را بهصورت پویا تغییر دهند.
7. امنیت، محصول اعتماد کورکورانه نیست
امنیت واقعی نتیجهی پایش مداوم، تحلیل دقیق دادهها و تصمیمگیری بیتعارف است، نه اتکای صرف به ابزارها یا افراد.
8. فرهنگسازی و آموزش»، مکمل تکنولوژی
پذیرش مدل Zero Trust تنها با ابزارهای فنی کافی نیست؛ فرهنگسازی، آموزش مستمر و اجرای عملیاتی در همه سطوح سازمانی الزامی است.
با بهکارگیری این درسها در ساختار دفاع سایبری خود، میتوانیم از تکرار اشتباهات گذشته جلوگیری کنیم و تابآوری فضای مجازی کشور را افزایش دهیم.
Group: @azad_program
Channel: @kiau_program
2 105
فرق بین KMeans و DBSCAN توی خوشهبندی (Clustering) چیه؟
کی از کدوم استفاده کنیم؟
خوشهبندی یکی از تکنیکهای مهم توی یادگیری ماشینه، ولی انتخاب الگوریتم مناسب خیلی مهمه. خیلیها از KMeans استفاده میکنن، ولی همیشه بهترین انتخاب نیست!
---
✅ KMeans
تعداد خوشهها رو باید از قبل بدونیم (k)
فرض میکنه خوشهها گرد هستن (spherical)
نویز ها و مقادیر پرت رو شناسایی نمیکنه
سریع و کارآمد برای دادههای بزرگ و خوشرفتار
✅ DBSCAN
نیازی به تعداد خوشهها نیست!
میتونه خوشههایی با شکلهای نامنظم پیدا کنه
به خوبی با نویز و نقاط پرت برخورد میکنه
ممکنه در دادههای با چگالی متغیر خوب عمل نکنه
🎯 پس کی از کدوم استفاده کنیم؟
دادههات تمیزن و شکل خوشهها سادهست؟ → KMeans
دادههات پر از نویزه یا شکل خوشهها پیچیدهست؟ → DBSCAN
🧠 من توی یکی از پروژههام، وقتی KMeans به درستی خوشهبندی نکرد، از DBSCAN استفاده کردم و نتایج خیلی بهتری گرفتم با Silhouette score.
📢 شما بیشتر با کدوم کار کردید؟
#MachineLearning #Clustering #KMeans #DBSCAN #Python #DataScience #AI
Group: @azad_program
Channel: @kiau_program
2 105
+1
در یک حرکت غافلگیر کننده ای فرادرس خیلی از آموزش هاشو تخیف ویژه گذاشته با قیمت 89 تومن میتونین تهیه کنین .
تا فردا مهلت استفادشه گفتم خبرشو بهتون بدم .
قدم به قدم در مسیر برنامه نویسی حرفه ای با آزاد پروگرمرز🫵💻#برنامه_نویسی #آموزش_برنامه_نویسی #آموزش Group: @azad_program Channel: @kiau_program
2 105
تجربهات از برنامهنویسی چیه؟
سلام رفقا!
هرکدوممون توی مسیر برنامهنویسی داستان خاصی داریم.
چی شد که برنامه نویسی یاد گرفتید
📌 اولین زبان؟
📌 اولین پروژه؟
📌 سختترین چالش؟
بیاید توی گروه یا کامنتها تجربهتونو بنویسین.
با هم یاد میگیریم، با هم پیشرفت میکنیم 💪
#برنامهنویسی #تجربه_شخصی #یادگیری_جمعی
Group: @azad_program
Channel: @kiau_program
2 105
تجربهات از برنامهنویسی چیه؟
سلام رفقا!
هرکدوممون توی مسیر برنامهنویسی داستان خاصی داریم.
📌 اولین زبان؟
📌 اولین پروژه؟
📌 سختترین چالش؟
بیاید توی گروه یا کامنتها تجربهتونو بنویسین.
با هم یاد میگیریم، با هم پیشرفت میکنیم 💪
#برنامهنویسی #تجربه_شخصی #یادگیری_جمعی
Group: @azad_program
Channel: @kiau_program
2 105
Repost from انجمن علمی هوش مصنوعی
✨ مسابقه خلاقیت با هوش مصنوعی✨
با استفاده از قدرت هوش مصنوعی و خلاقیت خودتون، داستان شجاعت و مقاومت خرمشهر را به تصویر بکشید! 🕌💔
🖌️📸با موضوعیت “خرمشهر، شهر خون و قیام آزاد شد”
🎁 جوایز ویژه برای برترین آثار!
📅 مهلت ارسال آثار: سه شنبه ۶ خرداد
برای شرکت در مسابقه از طریق اسکن بارکد روی پوستر و یا به سایت مراجعه کنید
همراه با ما باشید و با آثار خود، یاد و خاطره این شهر قهرمان را زنده نگه دارید.
➕ارتباط با ما:
تلگرام l اینستاگرام
2 105
انواع یادگیری در Machine Learning چیه؟
توی یادگیری ماشین (Machine Learning)، ما با سه نوع اصلی یادگیری سر و کار داریم:
1. یادگیری نظارتشده (Supervised Learning):
مدل رو با دادههایی آموزش میدیم که خروجی درست (Label) دارن.
مثل اینکه به مدل بگیم: "این عکس گربهست، اون یکی سگ!"
کاربردها: تشخیص چهره، طبقهبندی ایمیل (Spam / Not Spam)، پیشبینی قیمت.
2. یادگیری بدون نظارت (Unsupervised Learning):
اینجا دادهها خروجی مشخص ندارن. مدل باید خودش الگوها و ساختارها رو کشف کنه.
مثلاً گروهبندی مشتریها بر اساس رفتار خریدشون.
کاربردها: خوشهبندی (Clustering)، کاهش ابعاد (Dimensionality Reduction).
3. یادگیری تقویتی (Reinforcement Learning):
مدل مثل یه بازیکن عمل میکنه: کار انجام میده، بازخورد میگیره (پاداش یا تنبیه)، و یاد میگیره چطور بهتر عمل کنه.
کاربردها: بازیها (مثل AlphaGo)، رباتیک، سیستمهای توصیهگر پویا.
جمعبندی:
اگر میخوای وارد دنیای ML بشی، اول این سه نوع یادگیری رو خوب بشناس. چون پایهی همه چیزن.
#ML #machine_learning #ماشین_لرنینگ #یادگیری_ماشین
Group: @azad_program
Channel: @kiau_program
2 105
#چالش_پایتون
(یخورده سخت تر)
خروجی این کد چیه؟
A) [0, 1, 100]
B) [2, 100]
C) [100]
D) خطا میدهد
2 105
#چالش_پایتونی
خروجی کد در تصویر کدام گزینه است؟
A) [1, 2, 3]
B) ERROR
C) [1, 2, 3, 4]
D) [4]
2 105
دریافت اطلاعات با متد 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_program2 105
محدود کردن قبلِ از کار افتادن سیستم! 💡
...
...
Throttling یکی از روشهای مهم برای مدیریت درخواستها و جلوگیری از فشار بیش از حد روی سرورهاست
تو این پست باهاش آشنا میشیم
تو جنگو میتونیم با استفاده از DRF خیلی راحت Throttling رو پیادهسازی کنیم
این قابلیت بهمون کمک میکنه تعداد درخواست هایی که هر کاربر یا کل سیستم میتونه در یک بازه زمانی مشخص بفرسته رو کنترل کنیم
چجوری از Throttling تو DRF استفاده کنیم؟!
DRF چند نوع Throttle پیشفرض داره:
AnonRateThrottle → برای کاربران ناشناس
UserRateThrottle → برای کاربران لاگین کرده
ScopedRateThrottle → برای محدود کردن درخواستها در سطح API خاص
کافیه این تنظیمات رو توی settings.py اضافه کنیم و مقدار دلخواهمون رو تنظیم کنیم
با این روش از overload شدن سرور هم جلوگیری میکنیم.
بیشتر
Group: @azad_program
Channel: @kiau_program
2 105
🌐 تفاوت نقش ها، 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
2 105
تی ماکس(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
2 105
📌 مدل 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
2 105
✅ آرشیو منابع پایتون ✅
در این کانال فقط به آموزش ها، مطالب و اخبار مربوط به زبان برنامه نویسی " پایتون " پرداخته خواهد شد
کتاب، ویدئو، سورس کد، آموزش های کوتاه، اخبار و غیره
https://t.me/PythonForever
2 105
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
2 105
Merge یا Rebase
مسئله این است
در Git وقتی روی یک پروژه کار میکنیم از برنچها استفاده میکنیم تا تغییرات رو از هم جدا کنیم اما در نهایت باید این تغییرات رو به برنچ اصلی (مثلا main یا develop) اضافه کنیم دو روش اصلی برای انجام این کار Merge و Rebase هستند
ادامه👇
2 105
💠 لیستی از عبارت ها و مخفف های رایجی که ممکنه راجبشون شنیده باشین
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
2 105
اصول 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