| کانال توسعه‌دهندگان |
1.75K subscribers
55 photos
1 video
30 links
⭕️ کانال توسعه‌دهندگان دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🤔 چرا کد تمیز؟
کد تمیز باعث افزایش بهره‌وری، کاهش هزینه‌های نگهداری و تسهیل توسعه پروژه‌ها در بلندمدت شود. پس رعایت اصول در کدنویسی نه تنها به سرعت توسعه پروژه‌مان کمک می‌کند، بلکه هزینه‌های اضافی و خطرات مربوط به کدهای پیچیده را نیز به حداقل می‌رساند.


❓اما کد تمیز دقیقا چیست؟
هر برنامه‌نویس باتجربه‌ای ممکن است تعریف خاص خود را از کد تمیز داشته باشد. بیایید بهترین تعاریف را از زبان بزرگان بشنویم:
•  بی‌یارنه استراس‌تروپ(Bjarne Stroustrup):
کد تمیز کار را به کارآمدترین شکل انجام می‌دهد.

•  گریدی بوچ(Grady Booch):
کد تمیز ساده و مستقیم است، داستانی را روایت می‌کند و هیچ‌گاه مقصود نویسنده را پنهان نمی‌کند.

•  رون جفریز(Ron Jeffries):
کد تمیز هر چیزی را که انتظار دارید انجام می‌دهد و شما را شگفت‌زده می‌کند.


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


❌ مگر یک کد بد چه دردسرهایی می‌تواند ایجاد کند؟
کدهای بد، مشکلات بسیاری را برای پروژه‌ها به وجود می‌آورند:
🌀 افزایش پیچیدگی و مشکلات در هر تغییر کوچک

📉 کاهش شدید بهره‌وری تیم توسعه

⚠️ ایجاد "تله" برای تیم توسعه

🔄 انباشت کدهای بد و گرفتار شدن توسعه در یک چرخه منفی

و خسارت‌هایی بزرگ در نتیجه نوشتن کد غیراصولی و ضعیف:
💸 هزینه‌های پنهانی (The Total Cost of Owning a Mess)
هزینه‌های پنهانی که به مرور زمان در اثر انباشت کدهای بد ایجاد می‌شوند شامل زمانی که صرف رفع باگ‌ها، درک کد و اصلاح آن می‌شود.

♻️ طراحی مجدد (The Grand Redesign in the Sky)
تصمیم به بازنویسی کامل سیستم که معمولاً نتیجه انباشت کدهای بد است. این فرآیند هزینه‌بر و زمان‌بر است و اغلب منجر به تکرار مشکلات قبلی در سیستم جدید می‌شود و مسئله اینجاست که در بسیاری از موارد این بازنویسی نه تنها مشکل را حل نمی‌کند، بلکه مشکلات جدیدی را نیز به همراه دارد.


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

📑 چگونه تمیز کد بزنیم؟
برای تبدیل شدن به یک کدنویس هنرمند باید به این نکات توجه کنیم:
۱. نام‌گذاری‌های معنادار (Meaningful Naming)

انتخاب نام‌های گویا، رسمی و قابل تلفظ با مفهوم مثبت و به شیوه نامگذاری مناسب(Naming convention) برای متغیرها، توابع و کلاس‌ها

۲. پرهیز از تکرار (Avoid Duplication)

تکرار کد یا یک منطق در برنامه، یکی از بدترین مشکلات در نگهداری و توسعه برنامه

۳. توجه به جزئیات (Attention to Details)
مواردی مانند تورفتگی(Indentation)، فاصله‌ها(Spacing)، کامنت‌گذاری‌ها و حذف کدهای بلااستفاده، هرچند جزئی اما بسیار تاثیرگذار در بهبود خوانایی و کیفیت کد.

۴. وابستگی‌ حداقلی (Minimal Dependencies)

وابستگی‌های اضافی بین ماژول‌ها و کلاس‌ها باعث و بانی پیچیدگی و کاهش انعطاف‌پذیری

۵. کد گویا (Expressive Code)

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

۶. تست‌پذیری (Testability)

سرعت و سادگی در بررسی توابع و کلاس‌ها با تست‌های واحد(Unit Tests)

قوانین طلایی در کدنویسی اصولی:
⏳ قانون LeBlanc's Law: Later Equals Never
بسیاری از توسعه‌دهندگان، کدهای خود را به صورت سریع و بدون رعایت اصول تمیزنویسی می‌نویسند ومی‌گویند "بعدا" آن را تمیز خواهند کرد. اما معمولا
این "بعدا" هیچگاه فرا نمی‌رسد.

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

🏕 قانون The Boy Scout Rule
اصل مهم دیگری که در بحث نوشتن کد تمیز مطرح می‌شود، قانون پیشاهنگ است:
همیشه کمپ را تمیزتر از زمانی که وارد آن شدید، ترک کنید.

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


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

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
👍8🔥2❤1
💠 تعریفی ساده Multi Threading

قبل از اینکه بدانیم multi thread چیست، ابتدا باید درک کنیم که اصلا چرا باید از multi thread استفاده کنیم؟ چرا باید multi thread رو یاد بگیریم؟
بهتون میگم.

شرکت ها، ساختمان ها، فروشگاه ها، بانک ها و ... همه این مشاغل ممکنه با یک نیرو کارشون راه بیوفته اما همگی چند کارمند دارند؛ چرا؟ برای اینکه "مراجعه کننده" منتظر نمونه و کار ها سریع تر پیش بره.
پس با افزایش نیرو سرعت انجام کار ها بیشتر میشه و ارباب رجوع در صف نمی‌ایسته و همگی خوش‌وخرم کارشونو انجام میدن.
در این مثال هر "کارمند" معادل با یک thread هست و "مراجعه کننده" همان تسک های ما هستند.

با استفاده از multi thread توی برنامه task ها توی نوبت نمیمونن و باهم پردازش میشن.
تِرد ها کوچک‌ترین واحد پردازش در سیستم عامل هستند و هر process میتونه حداقل یک ترد و حداکثر بی نهایت ترد داشته باشه.

پی نوشت: این یک تعریف ساده و کاملا کلی از multi threading بود و هدف از این توضیحات صرفا آشنا شدن شما با این معماری بود.

🔖 #Programming, #برنامه_نویسی

👤 Yasin

💎 Channel: @DevelopixChannel
❤3👍2
Forwarded from Developix Support
سلام
پرسشنامه‌ پیش رو با هدف درک بهتر رفتار و نیازهای کسب‌وکارهای اینترنتی ایرانی در استفاده از ابزارهای پرداخت توسط یک تیم پژوهشی مستقل طراحی شده است. نتایج این پژوهش به ما کمک می‌کند تا ابزارهایی کارآمدتر و منطبق با نیازهای واقعی شما ارائه دهیم. تکمیل این پرسشنامه کاملاً بی‌نام است و هیچ اطلاعات شخصی از شما ذخیره نخواهد شد. پاسخ‌های شما نقش کلیدی در بهبود خدمات ابزارهای پرداختی اینترنتی در کشور دارد، بنابراین از شما خواهشمندیم با دقت و صداقت به سوالات پاسخ دهید. زمان لازم برای تکمیل: حدود 5 دقیقه لطفاً برای شروع پرسشنامه، روی لینک زیر کلیک کنید و ما را در این مسیر همراهی کنید.
.
https://survey.porsline.ir/s/lEtAnSw8
.
سپاس فراوان از همکاری صمیمانه شما
پارادایم‌های برنامه‌نویسی: جهان‌های متفاوت توسعه برنامه 🌌
پارادایم‌های برنامه‌نویسی، چهارچوب‌های فکری حل مسائل و مجموعه‌ای از مفاهیم و روش‌ها برای ساختاردهی کدها هستند. در اینجا به بررسی مهم‌ترین پارادایم‌ها، مزایا، معایب و کاربردهای آن‌ها می‌پردازیم.


برنامه‌نویسی دستوری (Imperative) 🔧

بر اساس ارائه دستورات گام‌به‌گام به ماشین عمل می‌کند و بر تغییر وضعیت سیستم تمرکز دارد.

مزایا:
-سادگی درک: به‌دلیل گام‌به‌گام بودن، درک و پیاده‌سازی آن آسان است.
-کنترل کامل: توسعه‌دهنده کنترل دقیق بر روی جریان اجرای برنامه دارد.
معایب:
-مدیریت دشوار کدهای بزرگ: با افزایش حجم کد، مدیریت و دیباگ آن دشوار می‌شود.
-مستعد خطا: تغییرات کوچک می‌تواند خطاهای بزرگی ایجاد کند.
زبان‌/فریمورک‌های رایج: C ،Express.js و Matlab

برنامه‌نویسی شیءگرا (Object-Oriented) 🧬
بر پایه مفهوم اشیاء است که داده‌ها و رفتارها را در قالب کلاس‌ها ترکیب می‌کند.

مزایا:
-استفاده مجدد از کد: کلاس‌ها و اشیاء امکان استفاده مجدد از کد را فراهم می‌کنند.
-مدیریت بهتر پیچیدگی: ویژگی‌هایی مانند کپسوله‌سازی(Encapsulation)، وراثت(Inheritance) و چندریختی(Polymorphism) ساختاردهی و مدیریت پروژه‌ها را آسان می‌کند.
معایب:
-مصرف منابع: نسبت به برخی پارادایم‌ها منابع بیشتری مصرف می‌کند.
-پیچیدگی طراحی: طراحی سیستم‌های بزرگ شیءگرا نیازمند معماری پیچیده‌ای است.
زبان‌ها/فریمورک‌های رایج: C# ،CPP و Java

برنامه‌نویسی تابعی (Functional) 🛠
تمرکز آن بر روی توابع خالص(Pure Functions) و داده‌های تغییرناپذیر(Immutable Data) است. توابع به‌عنوان ورودی یا خروجی سایر توابع استفاده شده و رفتارهای پیش‌بینی‌پذیری دارند. می‌توان از این پارادایم برای پردازش داده‌های بزرگ و الگوریتم‌های پیچیده استفاده کرد.

مزایا:
-کاهش خطا: به کاهش خطاها و ساده‌سازی Unit Testing کمک می‌کند.
-ماژولار بودن: ترکیب توابع ساده به ساخت عملیات‌های پیچیده کمک می‌کند.
معایب:
-پیچیدگی در استفاده: مفاهیم آن برای تازه‌کاران کمی سخت است و محدودیت در کار با داده‌های غیرقابل تغییر ممکن است نیاز به تفکر خاصی داشته باشد.
زبان‌/فریمورک‌های رایج: JavaScript، Haskell و Kotlin

برنامه‌نویسی اعلانی (Declarative) 📜

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

مزایا:
-ساده و مستقیم: توسعه‌دهنده تنها نیاز به بیان نتیجه دارد.
-افزایش سرعت: کد کمتر، توسعه سریع‌تر.
معایب:
-کنترل کمتر: نمی‌توان جزئیات اجرای کد را مدیریت کرد.
-عیب‌یابی دشوار: پیدا کردن خطاها ممکن است پیچیده باشد.
زبان‌/فریمورک‌های رایج: SQL و Prolog

برنامه‌نویسی منطقی (Logic) 🧠

بر مبنای منطق ریاضی و تعریف اصل‌ها و قاعده‌هایی برای حل مسائل سوار شده است. نتیجه با پرسش از سیستم به دست می‌آید. از برنامه‌نویسی منطقی در توسعه سیستم‌های هوش مصنوعی و پردازش زبان طبیعی(NLP) استفاده می‌شود.

مزایا:
وضوح کد: قواعد منطقی باعث خوانایی و شفافیت کد می‌شوند.
کاربرد در مسائل پیچیده با ساختار مشخص: مانند اثبات قضایا، حل مسائل محدودیت‌ها(CSPs) و سیستم‌های خبره(Expert Systems).
معایب:
کندی در پردازش مسائل با فضای جستجوی بزرگ: برای مسائل با تعداد زیادی متغیر یا راه‌حل‌های احتمالی ممکن است کارآمد نباشد.
محدودیت در پیاده‌سازی عملیات ورودی/خروجی (I/O): زبان‌های برنامه‌نویسی منطقی معمولاً برای انجام عملیات I/O، نیازمند راهکارهای پیچیده یا کتابخانه‌های خاص هستند.
زبان‌/فریمورک‌های رایج: Absys و Prolog

برنامه‌نویسی واکنشی (Reactive) ⚡️

بر اساس جریان داده‌(Data Streams) و گسترش رویداد(Event Propagation) کار می‌کند. مناسب برای اپلیکیشن‌های real-time مانند چت و سیستم‌های مالی.

مزایا:
-واکنش خودکار و سریع به تغییرات: سیستم به طور پویا به رویدادهای لحظه‌ای پاسخ می‌دهد و جریان داده‌ها را بدون نیاز به مدیریت دستی به‌روزرسانی می‌کند.
-کاهش پیچیدگی مدیریت همزمانی: مناسب برای برنامه‌هایی که نیازمند مدیریت چندین رویداد به صورت همزمان و بدون ایجاد اختلال در عملکرد هستند.
معایب:
-پیچیدگی طراحی: طراحی سیستم‌های واکنشی ممکن است چالش‌برانگیز باشد.
-نیاز به دانش تخصصی: درک عمیق از مفاهیم واکنشی ضروری است.
زبان‌/فریمورک‌های رایج: Spring WebFlux و RxJs

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

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
❤4👍2
پارادایم شی‌گرایی 🧩

۴ مورد از مهم‌ترین اصل‌های برنامه‌نویسی شی‌گرا(OOP) عبارتند از:
Inheritance 🧬
وراثت به اشیا اجازه می‌دهد ویژگی‌ها و رفتارهای اشیا دیگر را به ارث ببرند.

Encapsulation 💊
کپسوله‌سازی به پنهان‌سازی جزئیات یک class از دیگر classها و ارائه رابط عمومی برای تعامل با آن اشاره دارد که موجب می‌شود تغییرات داخلی بر روی کدهای دیگر تأثیر نگذارند.

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

Abstraction 🔎
انتزاع فرآیند ساده‌سازی پیچیدگی‌ها از طریق تمرکز بر ویژگی‌های ضروری و مخفی کردن جزئیات است.

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

🎯 تسلط بر اصول OOP برای توسعه‌دهندگان وب، نرم‌افزار موبایل، بازی‌، تحلیل سیستم و به خصوص برنامه‌نویسان ++C و Java و C# و Python بسیار مفید است.

🔗 اطلاعات بیشتر

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
👍8❤2
پاردایم تابعی 🏗

مفاهیم مهم برنامه‌نویسی تابعی(FP):
Pure Functions ⚙️
هر تابع فقط به ورودی‌هایش وابسته است.

Stateless 📊
سیستم یا تابع اطلاعاتی مربوط به وضعیت(state) قبلی خود نگه نمی‌دارد.

Composability 🧩
توابع را می‌توان ترکیب کرد تا توابع بزرگ‌تر ساخت.

Lazy Evaluation 🛌
محاسبات فقط زمانی انجام می‌شوند که واقعاً نیاز باشد.

Higher-Order Functions 🔄
توابع می‌توانند به‌عنوان ورودی یا خروجی توابع دیگر عمل کنند؛ مانند Map.

Immutable Data 🔒
تغییرپذیری داده‌ها در این رویکرد کنار گذاشته می‌شود که از تغییر ناخواسته آن‌ها جلوگیری می‌کند.

🏆 برخی مزایای این الگوی برنامه‌نویسی:
مناسب بودن برای پردازش موازی(Parallelism)
مدیریت آسان Infinite Streams
عدم وجود خطاهای جانبی(Side Effects)
افزایش قابلیت Traceability و دیباگ ساده‌تر
پیش‌بینی دقیق‌تر و ساده‌تر رفتار

🔧 زبان‌های Elixir و Haskell تابعی هستند. همچنین Redux و Scala و Python و JavaScript و React.js و Kotlin و Clojure نیز از این پارادایم پشتیبانی می‌کنند.

🔗 اطلاعات بیشتر

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
👍7
پارادایم رویه‌ای 🛠
مهم‌ترین مفاهیم برنامه‌نویسی رویه‌ای(Procedural Programming)، از بنیادین‌ترین پارادایم‌ها، عبارت‌اند از:
Procedural Calls 🗂
کد به مجموعه‌ای از رویه‌ها یا توابع تقسیم می‌شود که وظیفه خاصی را انجام می‌دهند.

Linear Program Flow ➡️
دستورات به صورت خطی و در یک ترتیب مشخص اجرا می‌شوند.

Parameter Passing 📬
ارسال داده‌ها به توابع به دو شکل Pass by Value(ارسال کپی مقدار) و Pass by Reference(ارسال آدرس متغیر) انجام می‌شود.

Top-Down Design ⬇️
مشکلات پیچیده به زیرمسئله‌های کوچکتر تقسیم می‌شوند و هر زیرمسئله با یک رویه خاص حل می‌شود.

Global/Local Variables 🌐
از متغیرهای محلی و جهانی برای ذخیره‌سازی داده‌ها استفاده می‌شود.

⚡️ مزایای برنامه‌نویسی رویه‌ای:
دسترسی ساده به داده‌ها در داخل یا بین رویه‌ها
مدیریت بهتر و فهم آسان‌تر جریان برنامه
قابلیت استفاده مجدد و نگهداری بالا
دیباگ و تست ساده

💡 از جمله زبان‌های برنامه‌نویسی که از این رویکرد پشتیبانی می‌کنند، می‌توان به C و Pascal و Python و ALGOL اشاره کرد.

🔗 اطلاعات بیشتر

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
👍4
✨ بُرِش اول: معرفی یک دوست قدیمی؛ Vim

ادیتور Vim (مخفف "Vi IMproved") یک ویرایشگر متن screen-based قدرتمند، انعطاف‌پذیر، open source و رایگان است که در سال ۱۹۹۱ توسط برام مولینار (Bram Moolenaar) ساخته شد. Vim بر اساس ویرایشگر Vi طراحی شده و در ابتدا برای ویرایش متن در سیستم‌های مبتنی بر یونیکس (Unix) ایجاد شد.
این ادیتور امروزه با امکانات پیشرفته‌تر و قابلیت شخصی‌سازی بیشتر، به یکی از ابزارهای محبوب در میان توسعه‌دهندگان تبدیل شده است.

✍ در ادامه به معرفی کامل Vim می‌پردازیم. سپس نحوه نصب/کانفیگ را آموزش داده و دستورات و ویژگی‌های مختلف آن را با هم کشف می‌کنیم. پیشنهاد میکنم اگر در مقابل این ادیتور گارد خاصی دارید یا به چشم یک هیولا به آن نگاه می‌کنید، این سری پست‌ها را از دست ندهید!


🏆 برتری‌ها نسبت رقبا
⚡️ سرعت بالا: بسیار سبک بوده و طراحی ساده‌ای دارد که آن را نسبت به IDEها و ویرایشگرهای دیگر سریع‌تر می‌کند.
🎨 کانفیگ گسترده: از طریق فایل .vimrc، محیط کاری خود را به شکلی که دوست دارید تنظیم می‌کنید.
📦 پشتیبانی از پلاگین‌ها: پلاگین‌های متنوعی وجود دارند که می‌توانند قابلیت‌های Vim را گسترش دهند.
🖥 مناسب برای محیط‌های CLI: اگر با سرور یا محیط‌های command line کار می‌کنید، Vim ابزاری ایده‌آل برای ویرایش فایل‌ها است.

⚠️ معایب و چالش‌ها
👨‍🦯 نبود رابط گرافیکی: برخی کاربران ترجیح می‌دهند از ابزارهایی دارای رابط گرافیکی (GUI) استفاده کنند؛ که این ویژگی در Vim وجود ندارد.
🛣 منحنی یادگیری تند: کار در modeهای مختلف و یادگیری دستورات ممکن است برای تازه‌کارها سخت باشد.
🌀 پیچیدگی تنظیمات: پیکربندی Vim زمان‌بر و استفاده از پلاگین‌ها در آن نسبتا سخت است.


💡 چرا باید برویم سراغ Vim؟

برای ویرایش فایل‌های کانفیگ و اسکریپت‌های Bash استفاده از Vim بسیار مناسب است. همچنین Vim ویژگی‌های متنوعی از جمله syntax highlighting و bracket matching یا split window را در عین سادگی به شما ارائه می‌دهد و ابزارهای خوبی هم برای جستجو و جایگزینی متن در فایل‌های بزرگ دارد.
❗️ البته Vim در درجه اول یک ادیتور ساده بوده و هر چه هم خوب باشد، باز گزینه مناسبی برای پروژه‌های بزرگ نیست. هر چند می‌توانید با نصب پلاگین‌هایی مثل NERDTree یا Airline، به آن امکانات متنوعی اضافه کرده و مانند یک IDE تنظیمش کنید 🛠

🔥 تاثیر در بهره‌وری
⏱️ سرعت: با تسلط بر دستورات، قابلیت‌های پیشرفته مثل macro و حالت‌های مختلف خواندن و نوشتن فایل‌‌‌‌‌ها، زمان زیادی را در ویرایش داکیومنت‌ها و کدنویسی صرفه‌جویی می‌کنید.
🔄 جریان کاری بی‌وقفه: نیازی به ماوس ندارید و تمام عملیات‌ها را با کیبورد انجام می‌دهید.

🌐 استفاده در سیستم عامل‌های مختلف
🐧 لینوکس و یونیکس: نصب شده به طور پیش‌فرض.
🍎 مک و ویندوز: قابل نصب و راه‌اندازی به راحتی هر چه تمام‌تر.


🖼 تعامل راحت‌تر؛ GVim و MacVim
اگر نبود رابط گرافیکی اذیتتان می‌کند، راه حل GVim/MacVim است. ورژن‌هایی از Vim که GUI را به کاربران هدیه می‌دهند. اگر به استفاده از ماوس و تجربه بصری عادت دارید، این نسخه‌ها گزینه‌های جذاب‌تری برای شما هستند. نگران هم نباشید؛ بیشتر امکانات و ویژگی‌های اصلی Vim در این نسخه‌ها نیز وجود دارند.

🔍 قابلیت‌های بیشتر؛ Neovim
ادیتور Neovim نسخه‌ای مدرن و بهبود‌یافته از Vim است که از مشکلات و محدودیت‌های Vim کم کرده است:
➕ معماری پلاگین‌ها: Neovim با API مدرن خود، امکان توسعه پلاگین‌های پیشرفته‌تر با زبان‌های برنامه‌نویسی مختلف را فراهم می‌کند.
🚀 قابلیت multithreading: وظایف سنگین به صورت هم‌زمان انجام می‌شوند؛ در واقع با استفاده از job control چندین فرایند در پس‌زمینه اجرا می‌شوند که تجربه کاربری بهتری را ارائه می‌دهد.
⚙ پشتیبانی از LSP: با استفاده از language server، ویژگی‌هایی مانند تکمیل خودکار (code completion) و شناسایی ارورها حین نوشتن کد را فراهم می‌کند.
🌍 پشتیبانی و کامیونیتی فعال: به طور منظم به‌روزرسانی شده و ویژگی‌های جدیدی به آن اضافه می‌شود.
🔗 و چندین ویژگی خوب دیگر

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
❤7👍2🔥1
Forwarded from | Erfan's Notes | via @DevelopixBot
⭕️ دوره آموزش برنامه‌نویسی مینی اپ تلگرام

💠 در این دوره به آموزش برنامه‌نویسی مینی اپ تلگرام می‌پردازیم، از مباحث پایه و عمومی شروع می‌کنیم و مفاهیم رو یاد می‌گیریم.
👍4
✨ برش دوم: نصب و کانفیگ Vim و Neovim

🪟 ویندوز:
🔸از صفحه اصلی Vim یا ریپازتوری آن فایل نصبی GVim را دانلود کنید.
زمان نصب، در مرحله Choose Components، گزینه Full را برای استفاده از تمام ویژگی‌های Vim انتخاب کنید. در مراحل بعدی نیز چیزی را تغییر ندهید. هم‌اکنون شما Vim و یک نسخه گرافیکی از آن را به همراه یک کانفیگ پیش‌فرض نصب کردید.

🔸برای نصب Neovim نیز از این صفحه، در آخرین Release، فایل‌های msi. یا zip. را دانلود کنید. (bin/nvim.exe در zip. فایل اجرایی برنامه است)


🐧 لینوکس:
برای دانلود فایل‌های AppImage به ریپازتوری Vim و Neovim مراجعه کنید.


Ubuntu:
sudo apt update
sudo apt install vim


sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim



Fedora/RHEL/CentOS:
sudo dnf install -y vim-enhanced


sudo dnf install -y neovim



Arch:
sudo pacman -Syu vim


sudo pacman -Syu neovim



🍏 مک:
به سادگی با استفاده از Homebrew:
brew install vim


brew install neovim


و به همین ترتیب برای نصب MacVim (یک نسخه دارای GUI و امکانات اضافی):
brew install macvim



🛠 کانفیگ Vim:
برای فعال‌سازی برخی امکانات، شخصی‌سازی ظاهری و تنظیم بخشی از رفتارها، به سراغ فایل vimrc. در لینوکس و مک یا vimrc_ در ویندوز می‌رویم که با زبان VimScript نوشته می‌شود.
می‌توانید از کانفیگ زیر برای بهبود تجربه کاربری خود استفاده کنید:
" Show line numbers
set number

" Enable syntax highlighting
syntax on

" Disable compatibility with vi which can cause unexpected issues
set nocompatible

" Highlight cursor line underneath the cursor horizontally
set cursorline

" Show the command being typed
set showcmd

" Show the mode you are on the last line
set showmode

" Show cursor position in the status line
set ruler

" Highlight matching parentheses or brackets
set showmatch

" Enable auto completion menu after pressing TAB
set wildmenu

" Show suggestions as a list and complete up to the longest match
set wildmode=list:longest

" Wildmenu will ignore files with these extensions
set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx

" Enable type file detection
filetype on

" Enable plugins and load plugin for the detected file type
filetype plugin on

" Load an indent file for the detected file type
filetype indent on

" Set the number of spaces for a tab
set tabstop=2

" Set the number of spaces for auto-indentation
set shiftwidth=2

" Automatically maintain indentation on new lines
set autoindent

" Improve tab behavior for smarter indentation
set smarttab

" Convert tabs to spaces
set expandtab

" Enable backup files
set backup

" Enable undo history persistence
set undofile

" Directory for backup files
set backupdir=~/.vim/backups

" Directory for undo files
set undodir=~/.vim/undo

" Ignore case in search patterns
set ignorecase

" Override ignorecase if search includes uppercase letters
set smartcase

" Highlight matching words during incremental search
set incsearch

" Highlight search results
set hlsearch

" Use the system clipboard for copy/paste
set clipboard=unnamedplus

" Show special characters like tabs and trailing spaces
set list

" Define symbols for tabs and trailing spaces
set listchars=tab:▸\ ,trail:·


" STATUS LINE ========================================

" Clear status line when vimrc is reloaded
set statusline=

" Left section of the status line: show file name, modified status, file type, and readonly flag
set statusline+=\ %F\ %M\ %Y\ %R

" Add a divider to separate left and right sections
set statusline+=%=

" Right section of the status line: show file details
set statusline+=\ ascii:\ %b\ hex:\ 0x%B\ row:\ %l\ col:\ %c\ percent:\ %p%%

" Display the status line on the second to last line of the screen
set laststatus=2


🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
🔥4👍1
⚙️ کانفیگ Neovim:
در NVim علاوه بر VimScript برای کانفیگ، از زبان خوب Lua نیز پشتیبانی می‌شود و فایل آن init.lua نام دارد. برای شروع، پیشنهاد می‌کنیم محیط ادیتور خود را مانند ما کانفیگ کنید:
-- General settings
vim.o.number = true -- Show line numbers
vim.o.relativenumber = true -- Show relative line numbers
vim.o.syntax = 'on' -- Enable syntax highlighting
vim.o.clipboard = 'unnamedplus' -- Use system clipboard for copy/paste
vim.o.wrap = true -- Enable line wrapping
vim.o.ignorecase = true -- Ignore case while searching
vim.o.smartcase = true -- Override ignorecase if search includes uppercase letters
vim.o.hlsearch = true -- Highlight search results
vim.o.incsearch = true -- Incremental search
vim.o.smartindent = true -- Smart indentation
vim.o.expandtab = true -- Convert tabs to spaces
vim.o.tabstop = 4 -- Set tab width to 4 spaces
vim.o.shiftwidth = 4 -- Set indent width to 4 spaces
vim.o.softtabstop = 4 -- Set soft tab width to 4 spaces
vim.o.autoindent = true -- Automatically maintain indentation
vim.o.showmatch = true -- Highlight matching brackets
vim.o.cursorline = true -- Highlight the current line
vim.o.scrolloff = 8 -- Keep 8 lines visible when scrolling
vim.o.termguicolors = true -- Enable true color support

-- Set up a better status line
vim.o.statusline = '%F %y %l/%L %p%%' -- Show file path, type, and line info

-- File type settings
vim.cmd('filetype plugin indent on') -- Enable file type detection, plugins, and indentation

-- Key mappings (keybindings)
vim.api.nvim_set_keymap('n', '<leader>w', ':w<CR>', { noremap = true, silent = true }) -- Save file with \w
vim.api.nvim_set_keymap('n', '<leader>q', ':q<CR>', { noremap = true, silent = true }) -- Quit Vim with \q


🎯 به نظر می‌آید همین‌ها برای شروع کافی باشند. در ادامه به سراغ کامندهای این ادیتور و کار در modeهای مختلف آن خواهیم رفت و سپس بهترین پلاگین‌های Vim و Neovim را نصب و راه‌اندازی می‌کنیم.

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
🔥5❤3👍3👎3
Forwarded from | Erfan's Notes |
حدودا یک ماه از ریلیز شدن نسخه 3.0 وب‌اسمبلی (WASM) می‌گذره و الان فرصت کردم درموردش بخونم، تغییرات مهمی که داشته رو پایین می‌نویسم.

💠 پشتیبانی از Address Space های 64 بیت
تا قبل از این نسخه، وب‌اسمبلی محدود به آدرس‌های i32 بود و نمی‌تونست بیشتر از 4GB رو آدرس‌دهی کنه، ولی پشتیبانی از i64 اضافه شده و این محدودیت عملا بی‌نهایت شده، هرچند که همچنان مرورگرها حداکثر اجازه allocate کردن 16GB رو می‌دن.

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

💠 پشتیبانی از Garbage Collection
در این نسخه یک افزونه با عنوان wasm-gc اضافه شده که در سطوح پایین می‌تونه مموری رو به‌صورت خودکار مدیریت کنه، کامپایلرها می‌تونند Struct ها و آرایه‌ها و بعضی Integer ها رو به صورت تگ شده تعریف کنند و خود wasm وظیفه allocation و lifetime شون رو برعهده بگیره.

💠 پشتیبانی از Tail Call ها
قابلیت Tail Call به وب‌اسمبلی اضافه شده، این ویژگی از زبان‌های فانکشنال الگو گرفته، به این معنی که فانکشن‌ها می‌تونند در آخرین اکشن‌شون یک فانکشن دیگه‌ای رو کال کنند بدون اینکه فضایی از Stack رو اشغال کنند، این موضوع در کال های Recursive اهمیت زیادی داره.

💠 پشتیبانی از Exception ها
پشتیبانی از Exception های try و catch در وب‌اسمبلی اضافه شده، تا قبل از این برای چنین کاری باید از JS استفاده می‌شد.

💠 پشتیبانی از String های جاوا اسکریپت
قابلیت رد و بدل کردن مستقیم String های جاوا اسکریپت بدون نیاز به تبدیل دو طرفه اضافه شده، می‌تونید مقادر String رو به صورت مستقیم به‌عنوان externref پاس بدید و سمت wasm تغییرات لازم رو روش اعمال کنید و سمت JS تحویل بگیرید.

و البته کلی قابلیت دیگه که اگر دوست داشتید می‌تونید اینجا بخونید.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👎3👍1
سیستم توصیه‌گر - Recommendation System 💡

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

‏Recommenderها یا موتورهای پیشنهاددهنده مجموعه الگوریتم‌هایی هستند که با بررسی رفتار کاربران یا ویژگی‌های آیتم‌ها به‌صورت خودکار مواردی به آن‌ها پیشنهاد می‌دهند — سیستم‌هایی که به طور گسترده در پلتفرم‌هایی مانند آمازون، نتفلیکس، لینکدین و یکتانت(!) استفاده می‌شوند. در اینگونه سیستم‌ها هدف، دادن پیشنهادهای مفید و مرتبط است؛ نه درک کامل سلیقه کاربر.

⚡️ سیستم‌های Recommendation شامل 4 نوع اصلی هستند:
‏Collaborative: استفاده مستقیم از رفتار کاربران.

‏Content-Based: بر مبنای خصوصیات مشترک بین آیتم‌ها. مثلا دو فیلم که هر دو ژانر کمدی دارند مشابه محسوب می‌شوند.

‏Hybrid: ترکیب دو روش قبلی.

‏Knowledge-Based: بر اساس قوانین از پیش تعریف‌شده و ویژگی‌های صریح. مثلا دستیار خرید می‌پرسد «بودجه‌تان چقدر است؟» یا «هدفتان عکاسی حرفه‌ای است؟». سپس بر اساس پاسختان پیشنهاداتی ارائه می‌دهد.

در این پست تنها به معرفی معروف‌ترین نوع یعنی Collaborative Filtering و روش‌های رایج در آن می‌پردازیم.

اما اجازه دهید قبل از شروع، به تعریف چند مفهوم بپردازیم.

0️⃣ متغیرها در این زمینه به دو شکل بررسی می‌شوند:
‏Explicit یا صریح: کاربر عمدا نظر می‌دهد؛ مثلا برای اپلیکیشنی بازخورد مثبت ثبت کرده یا یک ویدیو را دیس‌لایک می‌کند.

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


1️⃣ اساس کار این روش‌ها استفاده از ماتریسی دو بعدی به نام Utility Matrix یا User–Item Interaction Matrix (ماتریس تعامل کاربر×آیتم) می‎‌باشد. در این ماتریس سطرها نشان‌دهنده کاربران و ستون‌ها نشان‌دهنده آیتم‌ها (مثل فیلم و کالا) هستند.
خانه‌های این ماتریس مقدار تعامل کاربر با آیتم را نگه می‌دارند این مقدار می‌تواند امتیاز داده شده به سریال، کلیک روی پست، خرید کالا و... باشد.

اکثر خانه‌های این ماتریس خالی هستند و هدف الگوریتم‌ها پر کردن آن‌ها با یک پیش‌بینی منطقی است.
یعنی هدف نهایی رسیدن به عددی به نام Predicted Rating می‌باشد. نمره‌ای که توسط سیستم به چند آیتم، تعلق می‌گیرد که احتمالا کاربر به آن‌ها علاقه‌مند است. آیتم‌ها بر این اساس اولویت‌بندی شده و پیشنهاد می‌شوند.


2️⃣ هر کاربر و هر آیتم به صورت یک بردار عددی (لیستی از اعداد) نمایش داده می‌شود.
مثلا شما می‌توانید برداری شبیه [0.8, 0.2-, 0.5] داشته باشید. یک پست می‌تواند به صورت بردار [0.6-, 0.3, 0.6] باشد.
حاصل ضرب داخلی این دو بردار یا میزان شباهت و هم‌جهتی آن‌ها نشان می‌دهد که با چه احتمالی شما به این پست علاقه دارید.


۱) الگوریتم‌های مبتنی بر کاربر — User-based
👥

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


این روش در سرویس‌های موسیقی اولیه مثل Last.fm دیده می‌شد اما امروزه به ندرت استفاده می‌شود. چرا که محاسبه شباهت‌ها بین میلیون‌ها کاربر سخت بوده و از طرف دیگر، آیتم‌های جدید اطلاعات کمی دارند (مسئله Cold Start).

برای پیاده‌سازی این سیستم ابتدا یک Utility Matrix می‌سازیم. حال برای هر کاربر یک بردار رفتار داریم. با محاسبه شباهت بین بردارهای کاربران، همسایه‌های نزدیک را می‌یابیم و میانگین وزن‌دار امتیازات همان همسایه‌ها را به دست می‌آوریم تا به Predicted Rating برسیم. وزن‌ها بر اساس شباهت بین کاربران محاسبه می‌شود.


۲) الگوریتم‌های مبتنی بر آیتم — Item-based
🧩

اگر تعدادی از کاربرها دو چیز را با هم پسندیده‌اند، آن دو چیز شبیه هم‌اند.


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

در اینجا نیز از ساخت یک ماتریس تعامل شروع می‌کنیم اما این بار برای هر آیتم یک بردار در نظر می‌گیریم تحت این عنوان که «چه کسانی با این آیتم تعامل داشته‌اند». با محاسبه شباهت یا هم‌رخدادی (Co-occurrence) بین این بردارها، یک ماتریس شباهت آیتم×آیتم می‌سازیم که معمولا از قبل محاسبه شده و کش می‌شود. در نهایت نمرات آیتم‌های مطلوب را جمع وزن‌دار می‌کنیم. حاصل همان Predicted Rating ‌می‌باشد.

ادامه در پست بعدی...

💎 Channel: @DevelopixChannel
👍14👎3❤1
۳) الگوریتم‌های مبتنی بر تجزیه ماتریس و عوامل پنهان — Matrix Factorization / Latent-factor ✨

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

برای مثال یک Latent Variable می‌تواند نشان‌دهنده الگویی باشد که طبق آن گروهی از کاربران به مجموعه‌ای خاص از سریال‎ها امتیاز بالایی داده‌اند — سیستم هرگز نمی‌داند این عامل دقیقا به ژانر سریال مربوط می‌شود یا بازیگران برجسته و سطح کارگردانی آن. او تنها رابطه‌ای را در قالب بردارهای عددی پیدا می‌کند.

مثلا کاربرانی با بردار کاربری [0.9,0.3,0.1] و سریال‌هایی با بردار آیتمی [0.7,0.2-,0.4] به ‌هم مرتبط می‌شوند.

مدل‌هایی که در مسابقه Netflix Prize مطرح شدند و کیفیت پیشنهاد فیلم را به‌طرز چشم‌گیری بهتر کردند از این روش استفاده می‌کنند.

طبق این الگوریتم ماتریس تعامل را به‌ دو ماتریس کوچک‌تر "کاربران" و "آیتم‌ها" تجزیه می‌کنیم. هر سطر از ماتریس کاربران یک بردار برای کاربرها و هر سطر ماتریس آیتم‌ها نیز یک بردار برای آیتم‌ها محسوب می‌شود. این بردارها به‌وسیله بهینه‌سازی یک Loss Function (تابع خطا) و با استفاده از روش‌هایی مانند SGD یا ALS استخراج می‌شوند. حاصل‌ضرب داخلی این بردارها Predicted Rating را می‌سازد.


‏۴) الگوریتم‌های مبتنی بر شبکه عصبی - Deep Learning / Neural Models
🧠

در نسخه‌های جدیدتر سیستم‌های پیشنهاددهی، از Deep Learning (یادگیری عمیق) استفاده می‌شود تا الگوهای پیچیده‌تری بین کاربران و آیتم‌ها را شناسایی شود — روابطی که مدل Matrix Factorization هم قادر به درک کامل آن‌ها نیست.

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

در این مدل‌ها، هر کاربر و آیتم با یک Learned Embedding یا Trainable Embedding Vector (بردار قابل آموزش) نمایش داده می‌شود. این بردارها وارد شبکه عصبی می‌شوند تا مدل بتواند الگوهای غیرخطی و ترکیب‌های پنهان بین کاربرها و آیتم‌ها را کشف کند، بردارها را تغییر داده و دقیق‌ترین نتیجه را ارائه دهد.

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

در عمل، خروجی مدل معمولا برای تعیین Predicted Rating یا Re-ranking آیتم‌ها استفاده می‌شود.
‏Re-Ranking همان فرایندی است که در پلتفرم‌های بزرگی مثل یوتیوب انجام می‌شود. ابتدا مدل نسبتا ساده‌ای از بین میلیون‌ها ویدیو چند صد کاندید اولیه انتخاب می‌کند و سپس یک مدل پیشرفته‌تر با دقت بالا آن‌ها را مجددا مرتب می‌کند.


🎯 ‏Recommenderها از الگوریتم‌های ساده‌ به مدل‌های پیچیده‌ای تبدیل شده‌اند که عمیق‌ترین الگوها را به سرعت استخراج می‌کنند. هرچند این سیستم‌ها هنوز کامل نیستند و با چالش‌هایی مثل Filter Bubble (حباب فیلتر) مواجهند، اما بی‌شک به بخش جدایی‌ناپذیر تجربه دیجیتال تبدیل شده‌اند.
موتورهایی که در پس‌زمینه، ذهنمان را می‌خوانند و سلیقه‌مان را به زبان ریاضی ترجمه می‌کنند.

🔖 #Programming, #برنامه_نویسی

👤 Soheil

💎 Channel: @DevelopixChannel
❤13🔥7👍3
FastAPI — فریم‌ورک وب سریع برای Python

FastAPI برای ساخت APIهای سریع، تایپ‌ایمن و قابل مقیاس طراحی شده. مشکل ولیدیشن دستی، مستندسازی و کار با async را با Pydantic و طراحی مبتنی بر نوع حل می‌کند.

ویژگی‌ها:
- پشتیبانی async/await
- اعتبارسنجی و تبدیل داده با Pydantic
- مستندات خودکار OpenAPI/Swagger
- عملکرد بالا و کم‌کد

نمونه نصب و استفاده:
pip install fastapi uvicorn

# main.py
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def read_root():
return {"hello": "world"}

# اجرا: uvicorn main:app --reload


موارد کاربرد: میکروسرویس‌ها، APIهای REST، پروتوتایپ سریع و بک‌اند سرویس‌های تحت ترافیک بالا. مستندات و سورس:
Docs — GitHub

نظرتون و تجربه‌هاتون با FastAPI رو بنویسید؛ استقبال می‌کنیم.

🔖 #Programming #برنامه_نویسی #python #fastapi #api #web #pydantic

👤 Developix

💎 Channel: @DevelopixChannel
👍6
استفاده از print برای دیباگ ساده و وسوسه‌برانگیز است، اما در پروژه‌های واقعی مشکلات متعددی ایجاد می‌کند: خروجی‌های نامنظم، فقدان سطح‌بندی (info/debug/error)، و مشکل در خاموش/روشن کردن لاگها. استفاده از ماژول استاندارد logging در پایتون یک تغییر کوچک ولی بسیار اثربخش است. ✅

توضیح کوتاه و کاربردی:
- در هر ماژول یک logger با نام ماژول بسازید و لاگینگ را در نقطه ورود برنامه (مثلاً main) پیکربندی کنید.
- از logger.debug/info/warning/error/exception استفاده کنید تا سطح و فرمت را کنترل کنید.

نمونهٔ کوچک و عملی:
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)s [%(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

def divide(a, b):
try:
return a / b
except Exception:
logger.exception("error dividing %s by %s", a, b)
return None

if __name__ == "__main__":
logger.info("start")
print(divide(10, 0))


چرا مفید است و نکات عملی:
- می‌توانید سطح لاگ (DEBUG/INFO/ERROR) را بدون تغییر کد تغییر دهید. ⚙️
- لاگ‌ها قابل هدایت به فایل، کنسول یا سرویس‌های خارجی هستند. 📁
- در except از logger.exception() استفاده کنید تا استک‌تریس ثبت شود. 🧾
- اجتناب از فراخوانی basicConfig در کتابخانه‌ها؛ فقط در برنامهٔ اصلی پیکربندی کنید.

پایانی کوتاه: این تغییر ساده کیفیت دیباگ و نگهداری کد را سریعاً بالا می‌برد — چند دقیقه وقت بذارید و لاگینگ را در پروژه‌هایتان جایگزین print کنید. 🔧

منبع معتبر: Python logging — official docs

#python #logging #دیباگ

🔖 #Programming #برنامه_نویسی #python #logging #debug #دیباگ #best_practices

👤 Developix

💎 Channel: @DevelopixChannel
👍4🔥1