<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های متین تلخابی</title>
        <link>https://virgool.io/feed/@MatinTalkhabi</link>
        <description>Full-Stack Developer (Django, React) | Computer Engineering | Passionate About Tech &amp; Self-Improvement</description>
        <language>fa</language>
        <pubDate>2026-04-15 06:55:38</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3379611/avatar/zkpIBx.jpg?height=120&amp;width=120</url>
            <title>متین تلخابی</title>
            <link>https://virgool.io/@MatinTalkhabi</link>
        </image>

                    <item>
                <title>آسیب پذیری جدید MongoDB</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A2%D8%B3%DB%8C%D8%A8-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-mongodb-nvs69zkriurh</link>
                <description>یه هشدار امنیتی برای کسایی که با MongoDB کار می‌کننچند وقتیه یه آسیب‌پذیری مهم توی MongoDB با اسم CVE-2025-14847 (یا همون MongoBleed) سر و صدا کرده.طبق اعلام رسمی CISA، این باگ الان داره به‌صورت فعال توسط هکرها سوءاستفاده می‌شه.داستان از این قراره که توی یه شرایط خاص، مهاجم می‌تونه بدون احراز هویت، از راه دور به حافظه سرور دسترسی پیدا کنه و اطلاعات حساسی مثل رمز عبور، توکن‌ها یا کلیدهای امنیتی رو بیرون بکشه🛠️ اگه از MongoDB استفاده می‌کنید:حتماً نسخه‌هاتون رو به Patchهای جدید آپدیت کنیددسترسی دیتابیس از اینترنت عمومی رو محدود کنیدتنظیمات مربوط به compression (zlib) رو بررسی کنیدلاگ‌ها و رفتارهای مشکوک قبل از لاگین رو زیر نظر داشته باشیدامنیت چیزیه که معمولاً وقتی جدی می‌گیریمش، دیر شده!شاید بد نباشه همین الان یه نگاهی به تنظیمات MongoDBهاتون بندازید 👀#CyberSecurity #MongoDB #SecurityAwareness #CVE #DevOps #InfoSec</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 01 Jan 2026 00:51:03 +0330</pubDate>
            </item>
                    <item>
                <title>همه‌ی پروژه‌ها نیاز به سرور ندارن! (پروژه های الگوریتمی رو منظورمونه)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D9%87%D9%85%D9%87-%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-%D9%86%D8%AF%D8%A7%D8%B1%D9%86-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85%DB%8C-%D8%B1%D9%88-%D9%85%D9%86%D8%B8%D9%88%D8%B1%D9%85%D9%88%D9%86-cv61hio7woam</link>
                <description>همه‌ی پروژه‌ها نیاز به سرور ندارن! 💡خیلی از پروژه‌ها—به‌خصوص پروژه‌های الگوریتمی و زمان‌بر—اصلاً لازم نیست براشون سرور جداگانه بخرید.اگه بتونید پروژه‌تون رو Dockerize کنید، می‌تونید خیلی تمیز و بدون دردسر روی سیستم شخصی خودتون اجراش کنید.منظورم از &quot;بدون اختلال مصرف منابع&quot; این نیست که از CPU , RAM سیستمتون استفاده نمی شهبلکه Docker طوری کانفیگ می‌شه که اولویت همیشه با شماست و فقط وقتی سیستم بیکاره، از منابع استفاده می‌کنه.در نتیجه:سیستم‌تون کند نمی‌شههمیشه منابع در دسترس‌انپروژه آروم‌آروم جلو می‌رهبرای این کار معمولاً کافیه:یه docker-compose درست بنویسیدبا چند پارامتر ساده (CPU / Memory limit) پروژه رو کانفیگ کنیدفقط یه چیزی رو فراموش نکنید که باعث مشکل میشهحتماً برای الگوریتم‌تون Checkpoint در نظر بگیرید،که اگه سیستم ریستارت شد، محاسبات از اول شروع نشن.از طرفی Docker به‌صورت سرویسی بالا میادیعنی هر بار سیستم روشن می‌شه، پروژه‌تون خودکار اجرا می‌شه و لازم نیست هر روز دستی Run کنید.اگر هم براتون سخت بود یا مشکلی داشتید میتونید از ChatGPT کمک بگیرید ( ماشاالله دیگه همه واردن... )چون یه مقدار دانش Linux و DevOps می‌خواد، ولی کاملاً قابل حله.اگه تجربه مشابهی دارید یا اینکه روش بهتری برای اجرای این جور چیزا بدون هزینه سراغ دارید خوشحال میشم توی کامنت ها به اشتراک بذارید#Docker #DevOps #Linux #Backend #Algorithm #SoftwareEngineering #TechTips</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sun, 28 Dec 2025 06:46:51 +0330</pubDate>
            </item>
                    <item>
                <title>از URL تا Render | پشت‌صحنه لود شدن یک صفحه وب</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B2-url-%D8%AA%D8%A7-render-%D9%BE%D8%B4%D8%AA-%D8%B5%D8%AD%D9%86%D9%87-%D9%84%D9%88%D8%AF-%D8%B4%D8%AF%D9%86-%DB%8C%DA%A9-%D8%B5%D9%81%D8%AD%D9%87-%D9%88%D8%A8-kzoqpfzsfcfo</link>
                <description>اولین سوالی که توی سری &quot; سؤال‌های فنی مصاحبه‌ها &quot; میریم دنبالش اینه سوال : وقتی توی مرورگر یه URL وارد می‌کنیم و Enter می‌زنیم، دقیقاً چه اتفاق‌هایی می‌افته تا صفحه لود بشه؟(فرایند طی شده از DNS Resolution تا Render شدن صفحه)سعی کردم از پایه ای ترین سوال شروع کنم------خب اینجا مراحل رو سعی کردم به ترتیب بیارم - DNS Resolutionطبیعتا مرورگر باید اول بفهمه که این url به چه ip ای اشاره داره ----- TCP Handshakeتوی درخواست اول یه همچین اتفاقی می افته اولی بخش SYN :مرورگر یه بسته برای سرور میفرسته برای شروع ارتباط (فلگ SYN)دومی بخش SYN-ACK :سرور جواب میده که &quot; اره پیام رو گرفتم و آمادم &quot; (فلگ SYN + ACK)سومین بخش هم ACK:مرورگر یه پیام میفرسته که پیام دریافت شده و ارتباط هم برقرار میشهتوی درخواست های بعدی یه چیزی از قبل هست و با همون اتصال قبلی متصل میشه ---- TLS Handshakeگواهی مربوط به SSL بررسی میشهارتباط رمزنگاری میشه----- HTTP Requestحالا مرورگر می تونه درخواست هایی با متد های GET / POST برای سرور بفرسته و جواب بگیره ----- Backend Processing- Routerمشخص می‌کنه درخواست برای کدوم مسیر و با چه متدی اومده (مسیر اشتباه → احتمالاً 404)- View / Controllerورودی‌ها بررسی می‌شن لاگین بودن کاربر، سطح دسترسی و معتبر بودن درخواست اینجا چک می‌شه---- Business Logicقوانین سیستم:- کاربر می‌تونه خرید کنه؟- تخفیف شاملش می‌شه؟- وضعیت سفارش چیه؟معمولاً پیشنهاد می‌شه این بخش جدا باشه، ولی توی عمل بسته به پروژه می‌تونه جاهای مختلفی پیاده‌سازی بشه.----- Databaseحالا داده هایی که لازم داریم رو از دیتابیس میگیرم ( یا داخلش میریزیم )----- Responseدر اخر بخش بک اند جوابش رو به سمت کاربر میفرسته----خب بیاین این سوال رو همینجا به پایان برسونیم اگه توضیحاتم مشکلی داشت، یا نظری داشتید خوشحال میشم راهنماییم کنید#Backend#Python#Django#Career#مصاحبه_شغلی</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Wed, 24 Dec 2025 21:52:33 +0330</pubDate>
            </item>
                    <item>
                <title>تحلیل سؤال‌های فنی مصاحبه برای Backend Developers</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%D8%B3%D8%A4%D8%A7%D9%84-%D9%87%D8%A7%DB%8C-%D9%81%D9%86%DB%8C-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-backend-developers-dwomy7dwqdnr</link>
                <description>مدت‌ها بود توی ذهنم این ایده شکل گرفته بود کهسؤال‌های فنی مصاحبه‌های کاری رو یه‌جا جمع کنم ودونه‌دونه، عمیق و اصولی بهشون جواب بدم.به‌خصوص سؤال‌هایی که توی سطح Mid-level و Senior پرسیده می‌شن؛نه سؤال‌های حفظی و صرفاً تئوریک،بلکه اون‌هایی که طرز فکر مهندسی و نحوه‌ی تصمیم‌گیری ما رو می‌سنجن.این مسیر برای خودم هم یه چالشه:سنجش دانشی که تا امروز جمع کردمو تمرکز روی چیزهایی که واقعاً توی بازار کار کاربرد دارنتصمیم گرفتم فعلاً از Backend شروع کنمو به‌طور مشخص سراغ Python و Django برمو سؤال‌های فنی این حوزه رو بررسی کنم.ساختار این سری پست‌ها این‌طوریه:اول خودِ سؤال رو مطرح می‌کنمبعد دیدگاه و تحلیل شخصی‌ام رو درباره‌ش می‌نویسمسعی می‌کنم سؤال‌ها رو از سطح پایه شروع کنمو کم‌کم بریم سراغ مباحث عمیق‌تر و چالشی‌تر.اگر توی این مسیر همراه باشید،خوشحال می‌شم از نظرات و تجربه‌هاتون هم یاد بگیرم 🌱#مصاحبه_شغلی#Backend#Python#Django#Career</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Wed, 24 Dec 2025 21:46:49 +0330</pubDate>
            </item>
                    <item>
                <title>راهکار شخصی‌سازی‌شده برای Sync Obsidian</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D8%B4%D8%AE%D8%B5%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%B4%D8%AF%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-sync-obsidian-gymmelyrkbrd</link>
                <description>یکی از مشکلاتی که هنگام استفاده از Obsidian با آن مواجه بودم، دسترسی به نوتها روی موبایل بود. Obsidian به صورت پیشفرض فایل ها را فقط به صورت محلی ذخیره می کند و راه حل رسمی برای همگام سازی بین دستگاه ها فقط در نسخه پولی (Obsidian Sync) ارائه شده. دنبال راهکاری بودم که بدون هزینه و وابستگی به سرویس های خارجی مثل Dropbox یا iCloud، بتونم از نوت هام هم روی ویندوز و هم روی گوشی استفاده کنم.در نهایت با ترکیب افزونه Remotely Save و فضای ذخیرهسازی S3-compatible مثل لیارا تونستم این مشکل رو حل کنم. مراحل کلی این کار به صورت زیره:1. راه اندازی فضای ذخیره سازی ابرییک حساب در لیارا ایجاد کردم و وارد بخش &quot;ذخیره سازی ابری&quot; شدم.یک باکت جدید ساختم.از بخش تنظیمات باکت، Access Key و Secret Key گرفتم (فقط یکبار نمایش داده میشن).اطلاعات bucket name و endpoint رو هم یادداشت کردم.2. نصب و تنظیم افزونه Remotely Save در Obsidianافزونه Remotely Save رو نصب کردم.در بخش تنظیمات، اطلاعات بالا رو وارد کردم.گزینه &quot;Check Connectivity&quot; رو زدم و مطمئن شدم اتصال برقرار شده.هر تنظیمی که مربوط به سینک کردن فایل ها بود و به دردم میخورد، فعال کردم (برای مثال، &quot;Sync on Save&quot; و &quot;Bidirectional Sync&quot;).3. اتصال موبایلروی گوشی:افزونه Remotely Save رو نصب و با اطلاعات همون باکت قبلی تنظیم کردم.سینک رو اجرا کردم و نوت هام روی موبایل اومدن.چند نکته فنیبرای سینک شدن تنظیمات و پلاگینها، باید گزینه Sync Config Dir رو در تنظیمات افزونه فعال کنید.میتونید رمزنگاری رو هم فعال کنید تا فایل ها به صورت امن در فضای ابری ذخیره بشن.حتما حواستون باشه که یه backup بگیرید از اطلاعاتتوندر کل اگه سوالی داشتید همنیجا بگید</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 08 May 2025 18:40:25 +0330</pubDate>
            </item>
                    <item>
                <title>چند تا توصیه برای حل مشکل به روزرسانی لحظه ای در اپلیکیشن ها : راه حل و توصیه ها</title>
                <link>https://virgool.io/@MatinTalkhabi/%DA%86%D9%86%D8%AF-%D8%AA%D8%A7-%D8%AA%D9%88%D8%B5%DB%8C%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AD%D9%84-%D9%85%D8%B4%DA%A9%D9%84-%D8%A8%D9%87-%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%DB%8C-%D9%84%D8%AD%D8%B8%D9%87-%D8%A7%DB%8C-%D8%AF%D8%B1-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7-%D8%B1%D8%A7%D9%87-%D8%AD%D9%84-%D9%88-%D8%AA%D9%88%D8%B5%DB%8C%D9%87-%D9%87%D8%A7-ea4bkhavrvmu</link>
                <description>### چطور مشکل بهروزرسانی لحظهای رو در اپلیکیشنها حل کنیم؟اگه شما هم تا حالا با نرمافزارهایی کار کرده باشید که بعد از ثبت داده جدید، مجبور شید چند بار صفحه رو رفرش کنید تا تغییرات رو ببینید، حتماً میدونید این موضوع چقدر میتونه اذیتکننده باشه. این مشکل بیشتر به این خاطر پیش میاد که برنامه نمیفهمه دیتابیس آپدیت شده و فقط وقتی رفرش میکنید، اطلاعات جدید رو نشون میده. خب، حالا میخوایم چند تا راهحل برای حل این مشکل بررسی کنیم.### چرا این مشکل پیش میاد؟وقتی برنامه نتونه با دیتابیس خودش هماهنگ باشه، مشکل از همین جا شروع میشه. خیلی وقتها برنامه منتظر میمونه که کاربر خودش صفحه رو رفرش کنه تا تغییرات جدید رو ببینه. برای اینکه بتونیم این مشکل رو حل کنیم، باید روشی پیدا کنیم که برنامه بفهمه دیتابیس بهروز شده و بتونه اطلاعات جدید رو نمایش بده.### راهحلهای مختلف برای بهروزرسانی لحظهای#### 1. استفاده از Polling (پولینگ)پولینگ یکی از سادهترین راههاست. توی این روش، یه تایمر میذاریم که هر چند ثانیه یه بار از سرور بپرسه «چیزی جدید داری؟» و اگه اطلاعات جدید بود، نمایش بده.**خوبیهاش**:- راحت و سریع پیاده میشه.- اگه دنبال یه راهحل فوری باشیم، خوبه.**بدیهاش**:- سرور کلی درخواست اضافه دریافت میکنه که میتونه منابع سرور رو بخوره.- ممکنه یه تأخیر بین آپدیتها باشه و اون تجربه سریع و روون رو به کاربر نده.**مناسب برای**: پروژههای کوچیک و وقتی که نمیخوایم زمان زیادی رو برای پیادهسازی راهحلهای پیچیدهتر صرف کنیم.#### 2. استفاده از وبسوکتها (WebSockets)وبسوکتها یه راهحل حرفهایتر هستن. با استفاده از اونا، یه ارتباط مستقیم و مداوم بین برنامه و سرور ایجاد میکنیم. یعنی اگه دیتابیس آپدیت بشه، سرور بدون اینکه کلاینت بخواد چیزی بپرسه، بهش اطلاع میده.**خوبیهاش**:- ارتباط دوطرفه و سریع.- درخواستهای غیرضروری حذف میشن و منابع سرور بهتر مدیریت میشن.**بدیهاش**:- پیادهسازیش یه کم پیچیدهتره.- نیاز به تغییرات هم در سمت سرور و هم در سمت کلاینت داره.**مناسب برای**: اپلیکیشنهایی که نیاز به آپدیت لحظهای دارن مثل چتها، داشبوردهای زنده، یا سیستمهای مالی.#### 3. استفاده از Server-Sent Events (SSE)SSE هم یه راه دیگه برای بهروزرسانی لحظهایه. با این روش، سرور میتونه بهصورت یکطرفه اطلاعات رو به برنامه بفرسته، بدون اینکه کلاینت هی درخواست بفرسته.**خوبیهاش**:- پیادهسازی سادهتر نسبت به وبسوکتها.- اگه اتصال قطع بشه، مرورگر خودش دوباره وصل میشه.**بدیهاش**:- فقط میتونه اطلاعات رو از سرور به کلاینت بفرسته و نه برعکس.- بعضی مرورگرهای قدیمی شاید خوب پشتیبانی نکنن.**مناسب برای**: برنامههایی که فقط نیاز دارن اطلاعات جدید رو از سرور بگیرن، مثل نمایش اعلانها یا بهروزرسانیهای خبری.### چطور انتخاب کنیم؟انتخاب بهترین روش به این بستگی داره که پروژهتون چقدر بزرگه و چه منابعی در دسترس دارید. اگه نیاز به راهحل فوری دارید، پولینگ میتونه گزینهای سریع باشه. اما اگه دنبال یه تجربه بهتر برای کاربر هستید و میخواید سیستمتون سریع و بهروز باشه، حتماً به وبسوکتها فکر کنید. برای پروژههایی که فقط ارسال اطلاعات از سرور کافیه، SSE گزینه خوبیه.### جمعبندیهر کدوم از این روشها مزایا و معایب خودشون رو دارن. برای حل مشکل بهروزرسانی لحظهای باید ببینید نیاز شما چیه و کدوم روش با شرایط پروژه شما سازگارتره. با انتخاب درست، میتونید تجربه کاربری بهتری رو ارائه بدید و مطمئن بشید که کاربرهاتون همیشه آخرین اطلاعات رو میبینن.### 1. نمونه پیادهسازی Pollingتوی این روش، یه تایمر ساده توی فرانت اند تنظیم میکنیم که هر چند ثانیه یکبار یه درخواست AJAX به سرور میفرسته و دادهها رو چک میکنه.**نمونه کد با JavaScript (فرانت اند)**:&#x60;&#x60;&#x60;javascriptfunction fetchData() {    fetch(&#x27;/api/data&#x27;)        .then(response =&gt; response.json())        .then(data =&gt; {            console.log(&#x27;دادههای جدید:&#x27;, data);            // دادهها رو توی صفحه نمایش بده        })        .catch(error =&gt; console.error(&#x27;خطا در گرفتن دادهها:&#x27;, error));}// هر ۵ ثانیه یک بار دادهها رو بهروز کنsetInterval&#40;fetchData, 5000&#41;;&#x60;&#x60;&#x60;**توضیح**: این کد هر ۵ ثانیه یکبار درخواست میفرسته و دادهها رو از سرور میگیره.### 2. نمونه پیادهسازی WebSocketsبرای پیادهسازی وبسوکتها، باید هم در سمت سرور و هم در سمت کلاینت تغییرات انجام بشه.**نمونه کد سرور با Node.js (استفاده از Socket.IO)**:&#x60;&#x60;&#x60;javascriptconst express = require(&#x27;express&#x27;);const http = require(&#x27;http&#x27;);const { Server } = require(&#x27;socket.io&#x27;);const app = express();const server = http.createServer(app);const io = new Server(server);io.on(&#x27;connection&#x27;, (socket) =&gt; {    console.log(&#x27;یک کاربر وصل شد&#x27;);    // ارسال پیام به کلاینت در هر زمان دلخواه    setInterval&#40;(&#41; =&gt; {        socket.emit(&#x27;update&#x27;, { message: &#x27;دادههای جدید اینجاست!&#x27; });    }, 5000);    socket.on(&#x27;disconnect&#x27;, () =&gt; {        console.log(&#x27;کاربر قطع شد&#x27;);    });});server.listen(3000, () =&gt; {    console.log(&#x27;سرور در حال اجراست&#x27;);});&#x60;&#x60;&#x60;**نمونه کد کلاینت با JavaScript**:&#x60;&#x60;&#x60;javascriptconst socket = io(&#x27;http://localhost:3000&#x27;);socket.on(&#x27;update&#x27;, (data) =&gt; {    console.log(&#x27;پیام از سرور:&#x27;, data.message);    // دادهها رو توی صفحه نمایش بده});&#x60;&#x60;&#x60;**توضیح**: توی این مثال، هر ۵ ثانیه یه پیام از سرور به کلاینت فرستاده میشه و کلاینت هم اون رو نمایش میده.### 3. نمونه پیادهسازی Server-Sent Events (SSE)توی این روش سرور مستقیماً دادهها رو به کلاینت ارسال میکنه و کلاینت بهطور خودکار منتظر دریافت اونها میمونه.**نمونه کد سرور با Node.js**:&#x60;&#x60;&#x60;javascriptconst express = require(&#x27;express&#x27;);const app = express();app.get(&#x27;/events&#x27;, (req, res) =&gt; {    res.setHeader(&#x27;Content-Type&#x27;, &#x27;text/event-stream&#x27;);    res.setHeader(&#x27;Cache-Control&#x27;, &#x27;no-cache&#x27;);    res.setHeader(&#x27;Connection&#x27;, &#x27;keep-alive&#x27;);    res.flushHeaders();    setInterval&#40;(&#41; =&gt; {        res.write(&#x60;data: ${new Date().toLocaleTimeString()}\n\n&#x60;);    }, 5000);});app.listen(3000, () =&gt; {    console.log(&#x27;سرور SSE در حال اجراست&#x27;);});&#x60;&#x60;&#x60;**نمونه کد کلاینت با JavaScript**:&#x60;&#x60;&#x60;javascriptconst eventSource = new EventSource(&#x27;/events&#x27;);eventSource.onmessage = (event) =&gt; {    console.log(&#x27;پیام جدید:&#x27;, event.data);    // دادهها رو توی صفحه نمایش بده};&#x60;&#x60;&#x60;**توضیح**: توی این مثال، هر ۵ ثانیه سرور یه پیام جدید میفرسته و کلاینت اونو دریافت و پردازش میکنه.### نتیجهگیریهر کدوم از این روشها بسته به نیاز پروژهتون میتونن مفید باشن. پولینگ ساده و سریع پیاده میشه ولی منابع بیشتری مصرف میکنه. وبسوکتها برای ارتباطات دوطرفه و لحظهای عالی هستن و SSE برای ارتباط یکطرفه و سبک خوبه. با توجه به نیاز و شرایط پروژهتون، میتونید یکی از این روشها رو انتخاب و پیادهسازی کنید.</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sun, 03 Nov 2024 20:28:37 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه الگوریتم</title>
                <link>https://virgool.io/@MatinTalkhabi/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-vivk8gypzmtb</link>
                <description>بسم الله الرحمن الرحیمسلام خوش امدین به پست مقدمه الگوریتم :)این پست به مرور زمان اپدیت می شه و بحث هایی که مربوط به الگوریتم قراره بزارم مستقیم روی اینجا لینک می کنمخوب به صورتی کلی فرق یه برنامه نویس تازه کار با یه برنامه نویس سینیور توی همین الگوریتمی هست که استفاده می کنن وقتی یکم نیاز هایی که داشتی سطحش بالاتر رفت تازه اون موقع می فهمی قبلا داشتی چه گندی می زدی برای اینکه بخوایم یه الگوریتم رو برای نوشتن انتخاب کنیم چیز های مختلفی رو باید در نظر بگیریم از همه مهم تر اینکه الگوریتمی که می خوایم انتخاب کنیم در راستای هدفمون باشه ( مثلا کاهش استفاده از منابع )راستی بیشتر مطالب گفته شده الهام گرفته شده از دوره الگوریتم کوئرا هستش اگه توی یه زبان مسلط هستید حتما بهتون پیشنهاد می کنم یه سر برید سر بزنیدخوب حالا که یه مقدمه رفتیم وقتشه سری مون رو شروع کنیممرتبه زمانی چیه؟ https://virgool.io/@KMmatin/%D9%85%D8%B1%D8%AA%D8%A8%D9%87-%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%A7%D8%B1%D8%AF%D8%B1-%DA%86%DB%8C%D9%87-oy4jkrfjau6t یه مثال ساده برای شروع الگوریتم https://virgool.io/@KMmatin/%DB%8C%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AF%D8%B1%DA%A9-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-wxqycan9xw9o امیدوارم هر کاری که می کنیم باعث بشه تا حتی شده یک قدم هم به ظهور اقامون نزدیک تر بشیم...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sun, 03 Nov 2024 20:17:20 +0330</pubDate>
            </item>
                    <item>
                <title>یه مثال برای درک بهتر الگوریتم</title>
                <link>https://virgool.io/@MatinTalkhabi/%DB%8C%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AF%D8%B1%DA%A9-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-wxqycan9xw9o</link>
                <description>خوب اول از همه از یه مثال معروف شروع می کنیم حالت اول جوریه که می خوای منابع سیستم رو نابود کنیم (منظورم اینه که بیشتر از حدی که احتیاج هست داریم استفاده می کنیم)( اگه یه وقت صورت سواله به نظرتون مشکل بود یه وقت نگران نشید کلا خاصیت این نوع مسائل ترس اولیست که از صورت سوال به وجود میاد وگرنه خودشون هیچی ندارن )سوال : فرض کنید یک دنباله از اعداد صحیح داریم که شامل n عدد مثل a1,a2,a3,...an است.(منظورم همون یه دنبالست توی ویرگول یکم سخته نوشتنش)اول از همه من یه توضیح کلی راجب به سوال میدم سوال از ما می خواد که به چند تا سوال جواب بدیم (بهش می گیم q) سوال ها اینطورین که چند تا عدد از دنباله از چیزی که سوال پرسیده کوچیکتر هستن همین ....بخش جزئی سوال رو می تونی پایین تر ببینیما می‌خواهیم به q تا سؤال جواب بدهیم. در هر سؤال i-ام، یک عدد صحیح به نام xi​ به ما داده می‌شود و باید تعداد اعدادی که در دنباله a1,a2,a3,...an​ کمتر از xi​ هستند را پیدا کنیم و چاپ کنیم.ورودیدر خط اول ورودی، دو عدد n و q می‌آید. که هر دو عدد بین ۱ و ۱۰۰۰ هستند.در خط دوم، n عدد صحیح به ترتیب آمده‌اند که با فاصله از هم جدا شده‌اند و هر عدد بین ۱ و ۱٬۰۰۰٬۰۰۰ است.در q خط بعدی، در هر خط یک عدد xi​ مربوط به سؤال i-ام داده شده که این عدد هم بین ۱ و ۱٬۰۰۰٬۰۰۰ است.خروجیخروجی شامل q خط است. در هر خط باید تعداد اعدادی که در دنباله از عدد xi​ کمتر هستند را چاپ کنیم.مثالورودی نمونه ۱Copy code
2 3
 1 2
 1
 2
 3خروجی نمونه ۱Copy code
 0
 1
 2هیچ عددی در دنباله 1,2 از عدد 1 کمتر نیست، بنابراین پاسخ برابر ۰ است.تنها عدد 1 در دنباله 1,2 از عدد 2 کمتر است، بنابراین پاسخ برابر ۱ است.همه اعداد در دنباله 1,2 از عدد 3 کمتر هستند، بنابراین پاسخ برابر ۲ است.راه حل اول :می تونیم برای هر سوال به صورت جدا گونه جوابش رو بدست بیاریم اینطوری اول باید n ( تعداد دنباله) و q (تعداد سوال ها رو از کاربر بگیریم)بعد از اون یه لیست تعریف کنیم که  اعداد دنباله رو بتونیم بریزیم داخلش حالا باید یه حلقه فور بزنیم ( به تعداد سوال هایی که قراره بپرسه همون q) یه مقدار شمارش گر تعریف کنیم که مقدار اولیش صفر باشه بعد یه حلقه دیگه داخلش بزنیم که روی دنباله حرکت می کنه اگه عدد از سوال کوچیکتر بود یدونه به شمارش گر اضافه بشه و در اخر جواب چاپ بشهاینم کدش :راه حل دوم :خوب الان می خوایم کد رو با یه الگوریتم ساده حل کنیماول به صورت ساده توضیح میدم بعد از رو کد احتمالا متوجه بشید :)اول باید فکر کنیم که لازمه برای هر سوال یه بار بیایم کل دنباله رو چک کنیم ببینم که چند تا از سوال ما بزرگتره و ما جواب رو بدیم برای 10 تا اوکیه ،برای 100 تا اوکیه، برای 100000 چی؟خو معلومه که نه ! (چرایی این قضیه رو توی این مقاله توضیح دادم) https://virgool.io/@KMmatin/%D9%85%D8%B1%D8%AA%D8%A8%D9%87-%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%A7%D8%B1%D8%AF%D8%B1-%DA%86%DB%8C%D9%87-oy4jkrfjau6t برای راحتی کار یه مجموعه مثال می زنم :   2-4-5-2-3-2-4خوب ما اول بزرگترین عدد مجموعه رو پیدا می کنیم بعدش یه دنباله به طول اون عدد بزرگه می سازیم و توی هر خونه ش تعداد اعدادی که توی اون دنباله تکرار شدن رو می نویسیم مثلا برای نمونه مجموعه ما (شماره خونه پایین و تعداد بالاش)003121012345(یدونه 5 داریم دو تا 4 داریم و ...)حالا دوباره یه لیست می سازیم به طول بزرگترین عدد مجموعه ( همون 5) و داخل اون به صورت بازگشتی لیست قبلی رو جمع می کنیم می شه این003467012345دلیل این حرکتمون اینه که این لیست اخریه در اصل جواب اینه که چند تا عدد بزرگترن از اون خونه ای که عدده توش هست الان اگه دقت کنید اگه سوال ما 3 باشه توی خونه ی سوم ( به شماره لیست می شه دوم ) همون جوابه یعنی ما سه تا عدد تو دنباله داریم که از 3 کمترن اینم کدش :خوب فکر کنم برای این پست کافی باشهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ... </description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 12 Sep 2024 15:36:12 +0330</pubDate>
            </item>
                    <item>
                <title>مرتبه زمانی (اردر) چیه ؟</title>
                <link>https://virgool.io/@MatinTalkhabi/%D9%85%D8%B1%D8%AA%D8%A8%D9%87-%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%A7%D8%B1%D8%AF%D8%B1-%DA%86%DB%8C%D9%87-oy4jkrfjau6t</link>
                <description>مرتبه زمانی در اصل یه تخمینی از این هست که کدی که نوشتی قراره چقدر طول بکشه؟ آیا توی طولانی مدت راه تو درسته ؟ کارامده ؟ ....به صورت کلی برای اینکه یه راه حلی بهترین باشه باید کمترین میزارن از حافظه رو اشغال کنه و سریع باشه که جفت اینا با یه الگوریتم خوب اوکی می شه برای اینکه بتونید مرتبه زمانی یه الگوریتم رو بدست بیارین باید یه ورودی برای الگوریتم بزارید ما اسمش رو میزاریم n حالا باید تعداد عملیات ها رو پیدا کنیمعملیات هایی مثل جمع ، ضرب ، تقسیم و... کلا می تونیم یه عملیات حسابش کنیماز طرفی وقتی یه عدد توی لوپ قرار می گیره بار اول به اندازه ورودی و توی لوپ دوم به توان دو می رسه یعنی می شه n^2 همونطور که واضحه وقتی این عدد یه مقدار بزرگ بشه کلا اون عملیات های کوچیک که دونه ای بودن به حساب نمیاد برای همین فقط عملیات هایی که n رو به عنوان ضریب دارن رو ما نگه می داریمخوب بریم برای مثال:این کد رو در نظر داشته باشیدcnt = 0
for i from 1 to n:
    for j from 1 to n:
        cnt = cnt + i * jتعداد عملیات های کد بالا n^2 هستcnt = 0
for i from 1 to n:
    for j from 1 to m:
        cnt = cnt + 1
    for g from 1 to k:
        cnt = cnt + 1تعداد عملیات های این کد n(m+k) هستشحالا بیاید کاربر این نوع شمارش رو توی نمودار و مقایسه ببینیم بیاین فرض کنیم که دو تا عملایت داریم که یکیشون n هست و (n^2 - n - 30 )/30 هم عملیات دوم هستهمونطور که می بینید عملیات دوم تا عدد  30 کمتر از عملیات اول مصرفشه برای همین برای اعداد کمتر از 30 عملیات دوم مناسب تره از جهتی بعد از 30 عملیات دوم به صورت نمایی بالا میره و عملیات اول به صورت خطی برای همینه الگوریتم بهینه تر الگوریتم اوله چون کمتر مصرف می کنه اینم یه نمونه برای مقایسه کرن اردر ها خوب فکر کنم برای این پست کافی باشه اگه چیزی دیدی که من اشاره نکردم توی کامنت ها بگو ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 12 Sep 2024 15:32:51 +0330</pubDate>
            </item>
                    <item>
                <title>تعریف Box Model</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-box-model-swkjuhawftns</link>
                <description>توی این پست یه توضیح کلی درباره Box Model میدم...هر کی تا حالا یکم هم css کار کرده باشه حتما از padding , margin , border استفاده کردهاگه یکم هم حرفه ای تر باشه توی کنسول حتما باهاشون کار کرده(توی کنسول روی هر عنصر از سایت کلیک کنید می تونید box model اون عنصر رو مشاهده کنید)این شکلیه:عکسی که گذاشتم خودش گویای همه چیه ولی یکم هم توضیح کار رو بهتره می کنه-_- محتویات داخل عنصر توی بخش content قرار می گیره همون وسطبخش بعدی در اصل border عنصر هست همون خطی که دور عنصر رو میگیرهبخش داخلی border اسمش padding هست که مقدار فاصله content تا border رو نشون میدهبخش خارجی border اسمش margin هست که مقدار فاصله border تا عنصر بیرونی رو نشون میده(در اصل این تعریفی که کردم کامل نیست می تونید تصور کنید که فاصله بیرون از border تا بخش که خودتون می گید رو عنصر اشغال می کنه)خوب فکر کنم برای این پست کافی باشهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...منبع : ditty</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Tue, 06 Aug 2024 22:55:45 +0330</pubDate>
            </item>
                    <item>
                <title>هدف اتریبیوت های *-data توی HTML چیه؟</title>
                <link>https://virgool.io/@MatinTalkhabi/%D9%87%D8%AF%D9%81-%D8%A7%D8%AA%D8%B1%DB%8C%D8%A8%DB%8C%D9%88%D8%AA-%D9%87%D8%A7%DB%8C-data-%D8%AA%D9%88%DB%8C-html-%DA%86%DB%8C%D9%87-oieadibb5fwt</link>
                <description>توی این پست اتریبیوت *-data رو به صورت کلی معرفی می کنیم...اتریـبـیوت‌های دلخواهی هستن که روی تگ‌های HTML قرار می‌گیرن تا اطلاعات اضافه و بیشتری رو درباره اون تگ منتقل کننمی تونستیم بدون اینکه از این نوع اتریبیوت استفاده کنیم با استفاده ار عنصر های دیگه این نوع داده رو به صفحه مون اضافه کنیم ولی این  روش، روش درستی نیست و ممکنه باعث تداخل بشهو اتریبیوت هایی که بدون -data شروع میشه به این معنی که این اتریبیوت داخل اون تگ از HTML تعریف شدست مثل name توی &lt;input&gt; اگه برای یه اتریبیوت دلخواه از -data استفاده نکنیم علاوه بر اینکه اعتبار صفحه کاهش پیدا می کنه ممکنه باعث رفتار های غیر قابل پیش بینی توی مرورگر بشهاین نکته رو هم در نظر داشته باشید که اطلاعاتی که توسط *-data ذخیره می کنیم توسط ابزار های کمکی موتور های جستجو ممکنه نادیده گرفته بشنبرای همین بهتره زمانی از این نوع اتریبیوت استفاده کنیم که می خوایم از مقدار اون ها توی جاوااسکریپت استفاده کنیمروش استفاده از این نوع اتریبیوت هم داخل عکس مشخصهD:خوب فکر کنم برای این پست کافی باشهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...منبع : ditty</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Mon, 05 Aug 2024 16:46:33 +0330</pubDate>
            </item>
                    <item>
                <title>preload vs prefetch (HTML)</title>
                <link>https://virgool.io/@MatinTalkhabi/preload-vs-prefetch-html-log1r0uppqzj</link>
                <description>توی این پست به تفاوت دو مقدار preload , prefetch می پردازیم...تفاوت این دو مقدار توی اولویتی هست که به عنصر ما میدنبرای مثال اگه ما بخوایم یه فونت رو که تقریبا همه عناصر سایت ما با اون ارتباط دارن رو سریعتر از بقیه لود کنیم می تونیم بهش preload رو اضافه کنیم &lt;link rel=&amp;quotpreload&amp;quot href=&amp;quot/font.woff&amp;quot as=&amp;quotfont&amp;quot /&gt;و بلعکسش اگه یه فایلی که قراره لود بشه با عناصر زیادی ارتباط نداره و زیاد مهم نیست که الان بخواد لود بشه یا اخر کار می تونیم اولیت لود اون رو با prefetch پایین بیاریم &lt;link rel=&amp;quotprefetch&amp;quot href=&amp;quot/prism.js&amp;quot as=&amp;quotscript&amp;quot /&gt;از این نوع حرکت ها اگه روی وبسایت خودتون پیاده کنید سرعت لود صفحه رو می تونید بالاتر بیاریدخوب فکر کنم برای این پست کافی باشهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...منبع : ditty</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sun, 04 Aug 2024 18:42:38 +0330</pubDate>
            </item>
                    <item>
                <title>اصول مهم برنامه نویسی نرم افزار</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%88%D9%84-%D9%85%D9%87%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-na43kqcheuuw</link>
                <description>توی این درسنامه به ویژگی های کلی اصول نرم افزار می پردازیماصل Sepration of concernsبرنامه رو باید به طوری به قسمت های مجزا تقسیم کرد که هر بخش مسئولیت قابل فهم خودش رو داشته باشه مشخصه اگه اینطوری کد بنویسیم درک و توسعه برنامه خیلی راحت ترهاصل DRY (Don&#x27;t Repeat Yourself)سعی کن کد ها رو طوری بنویسی بجای اینکه کد جدید وارد برنامه کنی از کد های قبلی استفاده کنیالبته برای رعایت کردن این اصل باید تابع ها و کلاس ها رو طوری بنویسی که قابلیت Reusability داشته باشه (قابلیت استفاده مجدد)البته حواستون باشه Reusability بیش از حد هم باعث گنگ شدن برنامه می شه باید این اصل رو تا جایی رعایت کنیم که کارایی یک عضو مشخص و قابل فهم باشهیه مثال ساده از پایتون بزنیم:تابع add یک عدد به نام x را می‌گیرد و یک تابع داخلی به نام add_y را برمی‌گرداند.تابع add_y عدد دوم y را می‌گیرد و مجموع x و y را برمی‌گرداند.وقتی add(5) را صدا می‌زنیم، تابع add_y را با x برابر با 5 برمی‌گرداند.وقتی add_5(10) را صدا می‌زنیم، تابع add_y با y برابر با 10 فراخوانی می‌شود و نتیجه‌ی مجموع 5 و 10که برابر با 15 است را برمی‌گرداند.یه مثال بهتر بزنیم :توضیحات این مثال رو خوب بخونید برای درک کد های آینده :ابتدا تابعی به نام curry تعریف می‌کنیم که یک تابع را به عنوان ورودی می‌گیرد و آن را به صورت curried بازمی‌گرداند.سپس یک تابع ساده add داریم که دو عدد را با هم جمع می‌کند.این تابع add را با استفاده از curry به تابعی curried تبدیل می‌کنیم.حالا می‌توانیم از تابع curried استفاده کنیم. به عنوان مثال، curried_add(5) یک تابع جدید بازمی‌گرداند که یک عدد را به 5 اضافه می‌کند.خب برگردیم به ادامه اصولاصل SOLID1. اصل تک مسئولیتی (Single Responsibility Principle)2. اصل باز - بسته (Open/Closed Principle)3. اصل جایگزینی لیسکوف (Liskov Substitution Principle)4. اصل جداسازی اینترفیس‌ها (Interface Segregation Principle)5. اصل وارونگی وابستگی (Dependency Inversion Principle)اگه خواستید کل اصول SOLID رو مطالعه کنید: https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-solid-kilmqrbhi29u اصل YAGIN (you ain&#x27;t gonna need it)خلاصه اینکه چیزی که الان بهش نیازی نداری رو انجام ندهیهو یه تابع به ذهنت رسید ننویس تو برنام که &quot;شاید یه زمانی بدردم خورد&quot;اقا بدرد نمی خوره اگه قرار شد بدرد بخوره بعدا دوباره می نویسی اصل ایده رو یادت نگه دار الکی برنامه رو شلوغ نکن بعدا که برگشتی توسعش بدی مجبور شی همه رو از اول بنویسی اصل KISS (Keep It Simple, Stupid)بله این اصل هم که مشخصه -_-سعی کن سادگی رو پیش بگیری و به پیچیدگی ترجیح بدیاینطوری کد همیشه سادگی و تاثیرگذاری خودشو دارهمشخصا سادگی باعث خوانایی و خوانایی باعث توسعه پذیرتر بودن کدت می شهاگه به برنامه های توسعه پذیر علاقه مندی می تونی این مقاله رو هم بخونی https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-maintainable-%D9%87%D8%B3%D8%AA%D9%86-%DA%86%DB%8C%D9%87-pedowvehetyn خوب فکر کنم برای این پست کافی باشه اگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...منبع : ditty</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Mon, 29 Jul 2024 15:06:44 +0330</pubDate>
            </item>
                    <item>
                <title>اصول برنامه نویسی شیء گرا</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%DB%8C%D8%A1-%DA%AF%D8%B1%D8%A7-xse873qxggs4</link>
                <description>توضیح ساختار کلی برنامه نویسی شیء گرا: https://virgool.io/codenevis/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-tb6rpc4mwtmn توضیح کامل ویژگی های برنامه نویسی شیء گرا: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-t1fvwuelmnv6 ریز می شیم توی کلاس ها با مثال عملی: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-hsl5iiaklfxp ریز می شیم توی متد ها،پراپرتی ها،سازنده ها و مخرب ها به همراه مثال عملی : https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-kz93qotmrrad ریز می شیم توی Encapsulation به همراه توضیحات عملی: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85-encapsulation-jxtog3lqe69o ریز می شیم توی اصول مهم ارث بری به همراه مثال عملی: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D8%B4%D8%B4%D9%85-inheritance-hkijwkmg18wu ریز می شیم توی اصل چند ریختی: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D9%81%D8%AA%D9%85-%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C-polymorphism-yocczop4jcih ریز می شیم توی اصل ترکیب: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D8%B4%D8%AA%D9%85%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-composition-cv3oxsi3rxfo امیدوارم از این سری از پست ها خوشتون امده باشه و به کارتون بیادتوی نوشتن این سری از کد ها از سایت های w3schools ، realpython ، techtarget و کانال تلگرامی کد اکسپلور و کلیپ https://www.youtube.com/watch?v=-pEs-Bss8Wc استفاده شدهان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sun, 28 Jul 2024 01:36:50 +0330</pubDate>
            </item>
                    <item>
                <title>سری OOP قسمت هشتم(ترکیب Composition)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D8%B4%D8%AA%D9%85%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-composition-cv3oxsi3rxfo</link>
                <description>توی این اصل به جای ارث بری از  کلاس ها یک کلاس رو به یه کلاس دیگه به عنوان اعضا یا فیلد خودش ارجاع می دهبرای درک بیشتر موضوع می تونی کد زیر رو بخونیکلاس Engine:این کلاس نمایانگر یک موتور است و شامل متد start برای شروع موتور می‌باشد.کلاس Wheel:این کلاس نمایانگر یک چرخ است و شامل متد rotate برای چرخش چرخ می‌باشد.کلاس Car:این کلاس نمایانگر یک ماشین است که از ترکیب استفاده می‌کند. در اینجا، Car شامل یک شیء از نوع Engine و یک لیست از اشیاء Wheel به عنوان فیلدهای خود است. این به ما این امکان را می‌دهد که ماشین را با موتور و چرخ‌های مختلف پیکربندی کنیم.استفاده از کلاس‌ها:ابتدا یک شیء Engine با مشخصات مورد نظر ایجاد می‌کنیم. سپس چهار چرخ (Wheel) با سایز مشخص ایجاد کرده و آن‌ها را به یک لیست تبدیل می‌کنیم. سپس یک شیء Car با موتور و چرخ‌ها ایجاد می‌کنیم و متد start_car را فراخوانی می‌کنیم که وضعیت موتور و چرخ‌ها را به نمایش می‌گذارد.مزایای ترکیب:مدیریت بهتر وابستگی‌ها: از ترکیب به جای ارث‌بری استفاده می‌شود، که به کاهش وابستگی‌های مستقیم و افزایش انعطاف‌پذیری کمک می‌کند.پیکربندی مجدد آسان: می‌توان به راحتی اشیاء را تغییر داد یا جایگزین کرد بدون نیاز به تغییر در کلاس‌های دیگر.قابلیت استفاده مجدد: می‌توان از کلاس‌های ساده مانند Engine و Wheel در کلاس‌های دیگر استفاده کرد.اگه خواستی کل سری اصول برنامه نویسی شیء گرایی رو یه جا داشته باشی پیشنهاد می کنم این پست رو هم ببینی: https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%DB%8C%D8%A1-%DA%AF%D8%B1%D8%A7-xse873qxggs4 خوب برای این پست کافیهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Sat, 27 Jul 2024 10:28:33 +0330</pubDate>
            </item>
                    <item>
                <title>سری OOP قسمت هفتم (چندریختی Polymorphism)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D9%81%D8%AA%D9%85-%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C-polymorphism-yocczop4jcih</link>
                <description>چندریختی یکی از پایه های اصلی برنامه نویسی شیء گراستخلاصش اینطوریه که یه شیء می تونی رفتار های متفاوتی برای یه متد داشته باشهبرای مثال کد زیر رو داشته:کلاس پایه (Animal):این کلاس یک متد به نام make_sound دارد که برای کلاس‌های مشتق شده باید پیاده‌سازی شود. ما در اینجا NotImplementedError را برای نشان دادن این که این متد باید در کلاس‌های مشتق شده پیاده‌سازی شود، قرار داده‌ایم.کلاس‌های مشتق شده (Dog, Cat, Cow):هر کدام از این کلاس‌ها متد make_sound را به‌صورت جداگانه پیاده‌سازی می‌کنند تا صداهای مخصوص به خود را تولید کنند.تابع animal_sound:این تابع یک شی از نوع Animal دریافت می‌کند و متد make_sound را برای آن فراخوانی می‌کند. به دلیل استفاده از چندریختی، متد صحیح بر اساس نوع شیء که به تابع ارسال شده است، اجرا می‌شود.اگه خواستی کل سری اصول برنامه نویسی شیء گرایی رو یه جا داشته باشی پیشنهاد می کنم این پست رو هم ببینی: https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%DB%8C%D8%A1-%DA%AF%D8%B1%D8%A7-xse873qxggs4 خوب برای این پست کافیهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...راستی اینم اخرین قسمت از این سری: https://virgool.io/@KMmatin/%D8%B3%D8%B1%DB%8C-oop-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D8%B4%D8%AA%D9%85%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-composition-cv3oxsi3rxfo ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Fri, 26 Jul 2024 14:18:00 +0330</pubDate>
            </item>
                    <item>
                <title>اصول SOLID</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%88%D9%84-solid-kilmqrbhi29u</link>
                <description>توی این پست به صورت کلی به اصول SOLID می پردازیمدر اصل SOLID یک کلمه مخفف شده برای 5 اصلههدف این نوع اصول اینه که برنامه هایی که می نویسیم قابل درک تر، انعطاف پذیرتر و بیشتر قابل نگهداری باشن.به عنوان یه توسعه دهنده و برنامه نویس حتما باید این اصول رو بلد باشیدهمونطور که همون اول گفتم SOLID بر پایه پنج اصل زیر هست برای هر کدوم اول یه توضیح کلی میدم برای یادگیری بیشتر می تونید به پست زیرش بریداصل تک مسئولیتی (Single Responsibility Principle)هر کلاسی که توی برنامه ما وجود داره باید یه مسئولیت خاص داشته باشه https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%84-%D8%AA%DA%A9-%D9%85%D8%B3%D8%A6%D9%88%D9%84%DB%8C%D8%AA%DB%8C-single-responsibility-principle-xjlgiuf6tqkv اصل باز - بسته (Open/Closed Principle)موجودیت های یک نرم افزار (کلاس ها ، ماژول ها ، توابع و...) باید برای  توسعه داده شدن باز برای تغییر داده شدن بسته باشن https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%84-%D8%A8%D8%A7%D8%B2-%D8%A8%D8%B3%D8%AA%D9%87-openclosed-principle-fnxr0essib8j اصل جایگزینی لیسکوف (Liskov Substitution Principle)برنامه باید طوری باشه که زیر کلاس بتونه به صورت کامل با کلاس پایه جایگزین بشه بدون اینکه تغییری توی کد لازم باشه ایجاد کنیم https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%84-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86%DB%8C-liskov-substitution-%D8%B3%D8%B1%DB%8C-%D8%A7%D8%B5%D9%88%D9%84-solid-evgxuawvaw9l اصل جداسازی اینترفیس‌ها (Interface Segregation Principle)کلاس ها نباید مجبور باشن متد هایی که احتیاج ندارن رو پیاده سازی کنن https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%84-%D8%AC%D8%AF%D8%A7%D8%B3%D8%A7%D8%B2%DB%8C-interface-segregation-principle-qtzoqp4ryydc اصل وارونگی وابستگی (Dependency Inversion Principle)کلاس های سطح بالا نباید به کلاس های سطح پایین وابستگی داشته باشه https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%84-%D9%88%D8%A7%D8%B1%D9%88%D9%86%DA%AF%DB%8C-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C-dependency-inversion-principle-ufxksjxyeciv اکثر الگوهای طراحی که وجود دارن تلاش می کنن اصول سالید رو پیاده سازی کنن مخصوصا اصول اول و دومبرنامه های خیلی کمی وجود دارن که همه پنج اصل رو همزمان پیاده سازی کرده باشن برای همین نمی خواد به خودتون سخت بگیریدهر اصلی رو که می خوایید پیاده کنید حواستون باشه یه وقت برای درست کردن ابرو چشم برنامه رو کور نکنیدحواستون باشه اصول SOLID برای شرکت ها به شدت مهمه و توی مصاحبه ها حتما ازش سوال میشهامیدوارم این مباحث کمکتون کرده باشهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان...یکی از منابعی که خیلی توی نوشتن این سری پست ها کمکم کرد سایت ditty بود اگه سوالی توی زمنیه JavaScript داشتید حتما از این سایت استفاده کنید</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 25 Jul 2024 12:01:06 +0330</pubDate>
            </item>
                    <item>
                <title>اصل تک مسئولیتی (Single Responsibility Principle)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%84-%D8%AA%DA%A9-%D9%85%D8%B3%D8%A6%D9%88%D9%84%DB%8C%D8%AA%DB%8C-single-responsibility-principle-xjlgiuf6tqkv</link>
                <description>توی این پست ریز می شیم توی اصل اول SOLID یعنی اصل تک مسئولیتیخود داکیومنت این توضیح رو دادهیک کلاس فقط باید به یک دلیل تغییر کنهیعنی چی ؟هر کلاس که توی برنامه ما وجود داره فقط باید یه مسئولیت خاص داشته باشه در واقع این کلاس فقط باید یه عملکرد توی برنامه داشته باشهبرای درک بهتر به مثال زیر از زبان پایتون توجه کنید:توضیحات کد :کلاس Order مسئولیت ذخیره و مدیریت اطلاعات سفارشات را دارد.کلاس OrderCalculator مسئولیت محاسبه قیمت کل سفارشات را دارد.کلاس OrderPrinter مسئولیت چاپ فاکتور سفارشات را دارد.با این رویکرد، هر کلاس تنها یک مسئولیت دارد و تغییرات در یکی از بخش‌ها نیازی به تغییر در بخش‌های دیگر ندارد. مثلاً اگر بخواهیم نحوه محاسبه قیمت کل سفارش را تغییر دهیم، فقط نیاز به تغییر در کلاس OrderCalculator داریم و نیازی به تغییر در کلاس‌های Order و OrderPrinter نیست.اینم یه مثال مثل کد بالا که اصل تک مسئولیتی رعایت نشدهمشکلات کد بالا :کلاس Order چندین مسئولیت دارد: مدیریت اطلاعات سفارش، محاسبه قیمت کل و چاپ فاکتور.تغییر در یکی از وظایف باعث تغییر در کل کلاس می‌شود: مثلاً اگر بخواهیم نحوه چاپ فاکتور را تغییر دهیم، باید کلاس Order را تغییر دهیم.کلاس پیچیده و سخت‌تر برای نگهداری می‌شود: با افزایش تعداد وظایف، کد خوانایی و نگهداری آن دشوارتر می‌شود.امیدوارم منظور اصلی رو رسونده باشماگه خواستی همه اصول SOLID رو یه جا داشته باشی: https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-solid-kilmqrbhi29u اگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگو امیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ...منبع : ditty</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 25 Jul 2024 11:44:18 +0330</pubDate>
            </item>
                    <item>
                <title>اصل باز - بسته (Open/Closed Principle)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%84-%D8%A8%D8%A7%D8%B2-%D8%A8%D8%B3%D8%AA%D9%87-openclosed-principle-fnxr0essib8j</link>
                <description>خوب توی این پست به اصل باز و بسته اشاره می کنیماول از همه باید بدونیم منظور از باز و بسته چیه؟چه زمانی به یه کلاس می گیم باز؟وقتی یه کلاس رو می شه توسعه داد بهش می گن کلاس باز (متد ها و پراپرتی های جدید اضافه کرد)چه زمانی به یه کلاس می گیم بسته؟وقتی یه کلاس کامل شد(یعنی به طور کامل تست شده و بتونه توسط بقیه کلاس ها استفاده بشه و پایدار باشه)خب حالا چطوری باید استفاده کنیم؟اصل OpenClosePrinciple (از این به بعد بهش می گیم OCP) می گه که :اقا کد رو طوری بنویس که وقتی می خوایم ویژگی های جدید اضافه کنیم مجبور نشیم کلاس رو دستکاری کنیمطبق این چیزی که داکیومنت گفته کلاس ها هم باید باز باشن هم بسته! ولی خب چطوری بیاین یه مثال بزنیم:مثلا می خواین توی برنامه به زبان های مختلف بگید &quot;سلام&quot; می تونیم از این روش بریم:خوب این روش به نظر جالب می رسه ولی اگه تعداد زبان ها بشه 150 تا ما فقط باید توی کلاس اصلی دست ببریمخیلی مسخره می شه کد هم خیلی بهم ریختست اینجاست که OCP به کارمون میاداینطوری تابع اصلی که &quot;Hello&quot; باشه ثابت می مونه و می تونیم برای هر زبان مختلف کلاس خودش رو بنویسم اینطوری کد تمیزترهیا به صورت کلی کلاس &quot;Hello&quot; بستست(کلاس اصلی و متدش دستکاری نمی شن)این پست جزو یه سری از پست های مفهوم طراحی SOLID هست اگه علاقه داری می تونی از اینجا به بقیه مقاله ها دسترسی داشته باشی https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-solid-kilmqrbhi29u خوب برای این پست کافیهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان ... </description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 25 Jul 2024 11:43:59 +0330</pubDate>
            </item>
                    <item>
                <title>اصل جایگزینی (Liskov Substitution)</title>
                <link>https://virgool.io/@MatinTalkhabi/%D8%A7%D8%B5%D9%84-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86%DB%8C-liskov-substitution-%D8%B3%D8%B1%DB%8C-%D8%A7%D8%B5%D9%88%D9%84-solid-evgxuawvaw9l</link>
                <description>توی این پست به توضیح اصل جایگزینی از سری اصول SOLID می پردازیمخلاصه اصل جایگزینی اینکه:اگه من یه کلاسی دارم به اسم S(جایگزین) که زیرکلاس M(اصلی) هست شیء های نوع M باید بدون تغییر دادن کد با شیء های نوع S جابه جا بشنحالا پایین تر با کد توضیح میدماول یه مثال میزنیم که این اصل داخلش به کار رفته شده باشه (حواستون باشه به صورت خلاصه ما باید بتونیم زیر کلاس ها رو جای کلاس اصلی بزاریم لازم نیست سخت بگیرید~_~)کلاس Bird: یک کلاس پایه با یک متد fly که هیچ پیاده‌سازی‌ای ندارد.کلاس Sparrow: این کلاس از Bird ارث‌بری می‌کند و متد fly را پیاده‌سازی کرده است که پیامی مبنی بر پرواز گنجشک نمایش می‌دهد.کلاس Eagle: این کلاس نیز از Bird ارث‌بری می‌کند و متد fly را پیاده‌سازی کرده است که پیامی مبنی بر پرواز عقاب نمایش می‌دهد.تابع make_bird_fly: این تابع یک شئ از نوع Bird دریافت می‌کند و متد fly آن را فراخوانی می‌کند.خوب به صورت کلی اگه من هر کدوم از زیرکلاس های Bird رو به جاش بزارم برنامه درست کار می کنه حالا اگه یه زیر کلاسی باشه که بخواد خطا درست کنه یا چیزی غیر منتظره برگردونه وقتی جایگزین میشه می گن که اصل LSP درست اجرا نشدهکلی سری SOLID رو توی این پست گذاشتم اگه خواستی یه سر بزن https://virgool.io/@KMmatin/%D8%A7%D8%B5%D9%88%D9%84-solid-kilmqrbhi29u خوب برای این پست کافیهاگه خودت نکته ای رو میشناسی که من اشاره نکردم توی کامنت بگوامیدوارم این پست به دردتون خورده باشهموفق و پیروز باشید ...ان شاء الله راهی که میریم ختم بشه به ظهور سریعتر آقا امام زمان...</description>
                <category>متین تلخابی</category>
                <author>متین تلخابی</author>
                <pubDate>Thu, 25 Jul 2024 11:43:55 +0330</pubDate>
            </item>
            </channel>
</rss>