<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های میثم زندی</title>
        <link>https://virgool.io/feed/@meysamzandy</link>
        <description>Software Engineer | Technical Lead | Engineering Manager</description>
        <language>fa</language>
        <pubDate>2026-04-14 10:54:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/30202/avatar/SCohYv.jpg?height=120&amp;width=120</url>
            <title>میثم زندی</title>
            <link>https://virgool.io/@meysamzandy</link>
        </image>

                    <item>
                <title>امسال PostgreSQL 18 یکی از بزرگ‌ترین بهبودهای خودش رو معرفی کرده: async I/O.</title>
                <link>https://virgool.io/@meysamzandy/%D8%A7%D9%85%D8%B3%D8%A7%D9%84-postgresql-18-%DB%8C%DA%A9%DB%8C-%D8%A7%D8%B2-%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AA%D8%B1%DB%8C%D9%86-%D8%A8%D9%87%D8%A8%D9%88%D8%AF%D9%87%D8%A7%DB%8C-%D8%AE%D9%88%D8%AF%D8%B4-%D8%B1%D9%88-%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%B1%D8%AF%D9%87-async-io-xxfg8iwfgzng</link>
                <description>اما داستان فقط «سریع‌تر شدن» نیست — بلکه نحوه‌ی تعامل Postgres با سیستم‌عامل تغییر کرده.در نسخه‌ی جدید، دو مدل پیاده‌سازی برای async I/O داریم:1️⃣ برای سیستم‌هایی که هنوز از io_uring پشتیبانی نمی‌کنن2️⃣ و مدل دوم برای لینوکس‌های مدرن با io_uring، جایی که عملیات I/O مستقیماً داخل کرنل صف‌بندی و تکمیل می‌شن — بدون رفت‌وبرگشت اضافه به فضای کاربر (user space).نتیجه؟کاهش latencyافزایش throughputو کاهش context switchبه‌خصوص در queryهای سنگین مثل sequential scan یا writeهای هم‌زمان روی WAL.اما نکته‌ی ظریف اینجاست:این ویژگی به‌صورت جادویی همه‌چیز رو سریع‌تر نمی‌کنه.اجزایی مثل planner، buffer manager و حتی extensionها باید یاد بگیرن چطور ازش استفاده کنن.یه قدم بزرگ به جلو — اما هنوز در مسیر بلوغ.📹 ویدیوی توضیحی حسین نصر🧵 توییت مرتبط📘 مستند رسمی PostgreSQL 18</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Sat, 11 Oct 2025 14:58:27 +0330</pubDate>
            </item>
                    <item>
                <title>تغییر مسیر ذخیره‌سازی داکر در لینوکس</title>
                <link>https://virgool.io/@meysamzandy/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%85%D8%B3%DB%8C%D8%B1-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-tt0vozjcuul9</link>
                <description>تغییر مسیر ذخیره‌سازی داکر در لینوکس🛠 وقتی داکر جا کم میاره، چکار کنیم؟به‌صورت پیش‌فرض، داکر همه‌ی اطلاعاتش رو توی مسیر /var/lib/docker ذخیره می‌کنه. اما اگه فضای دیسک کم بیاد یا بخوای مسیر رو جای دیگه‌ای بذاری، باید این تنظیمات رو تغییر بدی. توی این آموزش، قدم‌ به‌ قدم یاد می‌گیریم که چطور دایرکتوری داکر رو عوض کنیم، بدون اینکه به مشکل بخوریم.چی قراره یاد بگیریم؟✅ چطوری تنظیمات systemd رو تغییر بدیم که داکر از مسیر جدید استفاده کنه✅ چطوری فایل‌های داکر رو بدون دردسر به جای جدید منتقل کنیمقبل از شروع، اینارو داشته باش:🔹 سیستم‌عامل: هر لینوکسی که systemd داشته باشه (مثل اوبونتو، دبیان، سنت‌اواس و ...)🔹 نرم‌افزار: داکر باید نصب باشه🔹 دسترسی: باید root یا sudo داشته باشیقدم‌به‌قدم تغییر مسیر داکر📢 خیلی مهم: مرحله‌ها رو به ترتیب انجام بده، وگرنه ممکنه داکر قاطی کنه و دردسر درست بشه!۱. اول از همه، داکر رو خاموش کننباید موقع تغییر مسیر، داکر در حال اجرا باشه، وگرنه مشکل پیش میاد. پس با این دستورها خاموشش کن:sudo systemctl stop docker.servicesudo systemctl stop docker.socket۲. فایل تنظیمات داکر رو ویرایش کنبعدش باید بریم سراغ systemd و بهش بگیم که داکر رو از مسیر جدید اجرا کنه. این فایل رو باز کن:sudo nano /lib/systemd/system/docker.serviceیه خطی شبیه این پیدا کن:ExecStart=/usr/bin/dockerd -H fd://حالا مسیر جدید رو بهش اضافه کن. مثلا اگه می‌خوای داکر رو ببری توی /new/path/docker، خط رو این‌جوری تغییر بده:ExecStart=/usr/bin/dockerd -g /new/path/docker -H fd://بعدش فایل رو ذخیره کن و ببند.۳. مسیر جدید رو بساز و فایل‌ها رو جابه‌جا کنحالا باید مسیر جدید رو بسازیم و اطلاعات داکر رو منتقل کنیم:sudo mkdir -p /new/path/dockerو حالا با این دستور، تمام فایل‌های داکر رو منتقل کن:sudo rsync -aqxP /var/lib/docker/ /new/path/docker۴. تنظیمات جدید رو به systemd بشناسون و داکر رو راه‌اندازی کنبعد از جابه‌جایی فایل‌ها، باید systemd رو رفرش کنیم و داکر رو دوباره روشن کنیم:sudo systemctl daemon-reloadsudo systemctl start docker۵. مطمئن شو که داکر از مسیر جدید اجرا شدهبا این دستور چک کن که همه‌چیز درست کار می‌کنه:ps aux | grep -i docker | grep -v grepاگه خروجی این دستور مسیر جدید رو نشون داد، یعنی موفق شدی! نتیجه‌گیریتغییر مسیر ذخیره‌سازی داکر خیلی سخت نیست، ولی از اون کاراست که اگه ندونی از کجا شروع کنی، ممکنه اذیت بشی. حالا که مسیر جدید رو تنظیم کردی، می‌تونی اگه خواستی، پوشه قدیمی /var/lib/docker رو حذف کنی. البته اگه یه وقت به مشکل خوردی، همیشه می‌تونی برگردی به حالت قبل.💡 حواست باشه: اگه جایی گیر کردی، اول لاگ‌های داکر رو چک کن و مسیرها رو دوباره بررسی کن. </description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Mon, 10 Feb 2025 21:56:02 +0330</pubDate>
            </item>
                    <item>
                <title>بهینه‌سازی وب سرویس‌ها: راهکارهای عملی برای افزایش سرعت و کارایی</title>
                <link>https://virgool.io/@meysamzandy/%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%D8%A8-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%87%D8%A7-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%B9%D9%85%D9%84%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%88-%DA%A9%D8%A7%D8%B1%D8%A7%DB%8C%DB%8C-e0q9etvshldl</link>
                <description>توی چند سالی که کار کردم، هر وقت بحث بهبود سرعت وبسرویس ها پیش میومد، همیشه اولین قدمم بررسی وضعیت فعلی و پیدا کردن گلوگاهها (همون باتلنکها) بود. از این تجربه ها چند تا نکته کلیدی جمع بندی کردم که میتونه به درد بقیه هم بخوره.توی مسیر بهبود سرعت، همیشه این مراحل رو دنبال میکنم:پیدا کردن باتلنکهای سیستمبهینه سازی کوئری های دیتابیسکاهش تعداد ریکوئست های API خارجیاستفاده از کش (یه سامورایی همیشه یه Redis تو جیبش هست!)حالا بذار یه کم بیشتر باز کنیم:چطور باتلنکها رو پیدا کنیم؟اولین قدم برای بهبود عملکرد، پیدا کردن اون بخشهاییه که بیشترین کندی رو دارن. اینجا قانون ۸۰/۲۰ خیلی کمک میکنه؛ یعنی ۲۰٪ از کدها میتونن مسئول ۸۰٪ از کندی سیستم باشن. با تمرکز روی این ۲۰٪ میتونیم بیشترین بهبود رو بگیریم. البته استفاده از ابزارهای درست مثل New Relic، Prometheus یا حتی Datadog خیلی مهمه. این ابزارها دید خوبی از پروفایلینگ سیستم میدن و دقیقتر بهت میگن کجای سیستم کندی داره.۱. کوئری تو حلقه؟ نکن خواهرم نکن برادرم!فرض کن یه سناریو داری که توش توی حلقه، برای هر آبجکت یه درخواست به دیتابیس میفرستی. مثلاً داری برای هر userID اطلاعات کاربر رو از دیتابیس میگیری. این کار عملاً سیستم رو کند میکنه، چون به ازای هر آیتم یه کوئری جدا میزنی.به جای این کار میتونی همه userIDها رو تو یه درخواست به دیتابیس بفرستی و یه جا جواب بگیری. اینجوری به جای هزار تا کوئری، یه دونه میزنی و کلی سرعت میگیری.مثال دنیای واقعی: فرض کن میخوای لیست کاربرهایی که خرید کردن رو از دیتابیس بگیری. به جای اینکه هر بار توی حلقه یه کوئری بزنی، همه userIDها رو تو یه کوئری با IN بگیری و یه جا پردازش کنی. هم سریعتره، هم منابع کمتری مصرف میشه.۲. درخواستهای همزمان (Concurrency در خدمت تو!)اگه به چند تا سرویس خارجی درخواست میفرستی که به هم وابسته نیستن، بهتره درخواستها رو همزمان بفرستی. این که منتظر بمونی یکی جواب بده و بعد دومی رو بفرستی فقط وقت تلف کردنه.راه حل؟ از Concurrency استفاده کن. با ابزارهایی مثل Goroutines تو Go یا مثلاً Promise تو جاوااسکریپت، میتونی درخواستها رو همزمان بفرستی. منتظر همه میمونی ولی همزمان انجام میشه و کلی زمان میگیری.مثال دنیای واقعی: فرض کن میخوای قیمت یه محصول رو از چند سرویس مختلف بگیری. به جای اینکه یکی یکی درخواست بفرستی، میتونی همه رو همزمان بفرستی و نتایج رو با هم مقایسه کنی. اینجوری کاربر سریعتر جواب میگیره.البته اینجا باید حواست به Timeout و Circuit Breakers هم باشه که اگه یه سرویسی کلاً جواب نداد یا دیر جواب داد، کل اپلیکیشن قفل نشه. Rate Limiting هم یادت نره که فشار زیادی روی سرویسهای خارجی نذاری.۳. کش؛ آخرین جون مرتازوقتی با دادههایی کار میکنی که زیاد تغییر نمیکنن و تکراری هستن، کش کردنشون یه راه نجاته. با این کار از درخواستهای مکرر به دیتابیس و سرویسهای خارجی جلوگیری میکنی و کلی بار سیستم رو کم میکنی.فرض کن هر بار برای گرفتن لیست محصولات پرفروش یه کوئری سنگین به دیتابیس بزنی. به جای اینکه هر بار دیتابیس رو خسته کنی، میتونی نتیجه کوئری رو توی کش ذخیره کنی و دفعه بعدی از همون داده های کش شده استفاده کنی.مثال دنیای واقعی: فرض کن یه اپلیکیشن داری که لیست محصولات پرفروش رو نشون میده. این لیست هر چند ساعت آپدیت میشه. میتونی نتیجه کوئری رو تو کش بذاری و هر وقت کاربر درخواست داد، بهجای کوئری جدید، از همون کش استفاده کنی. هم سرعت بالاتره، هم منابع کمتر مصرف میشه.البته حواست باشه کش باید مدیریت بشه؛ مثلاً Cache Invalidation (باطلسازی کش) یا تنظیم TTL (زمان زنده بودن) خیلی مهمه تا داده های کش همیشه معتبر بمونن. اگه چند لایه کش داشته باشی (مثلاً کش سمت کلاینت، سرور و دیتابیس)، کار خیلی بهتر پیش میره.۴. کاهش درخواستهای API خارجیاگه زیاد با سرویسهای خارجی کار میکنی، بهتره درخواستها رو کاهش بدی. یه راهش Batching درخواستهاست؛ یعنی چند درخواست مرتبط رو یهجا بفرستی. استفاده از GraphQL هم میتونه بهجای چندین درخواست REST کار رو راحتتر کنه و فقط دادههایی که نیاز داری رو بگیری.جمعبندی:این چند تا تکنیک که گفتم، همیشه برای بهبود عملکرد وبسرویسها کارسازه: شناسایی باتلنکها با ابزارهای مناسب، بهینهسازی کوئریها، استفاده از Concurrency و کش کردن دادههای تکراری. هر بار با این روشها کار کنم، تغییرات بزرگی توی سرعت و کارایی سیستم میبینم. در نهایت، بهتره همیشه تستهای Load Testing و Stress Testing رو انجام بدی تا بدونی سیستم چطور زیر بار واقعی کار میکنه و برای مقیاس پذیری آماده باشی.</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Thu, 24 Oct 2024 23:52:11 +0330</pubDate>
            </item>
                    <item>
                <title>چطوری FortiClient رو روی اوبونتو ۲۴.۰۴ نصب کنیم</title>
                <link>https://virgool.io/@meysamzandy/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-forticlient-%D8%B1%D9%88-%D8%B1%D9%88%DB%8C-%D8%A7%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%DB%B2%DB%B4%DB%B0%DB%B4-%D9%86%D8%B5%D8%A8-%DA%A9%D9%86%DB%8C%D9%85-cwzstxcpsoiy</link>
                <description>سلام دوستاناز قضای روزگار مجبور به نصب ابونتو ۲۴ شدیم و از همون قضا مجبور به نصب فورتی کلاینت برای یه ارتباط داخلی هم شدیم.برای نصب فورتی کلاینت نیاز به کتابخونه به اسم libappindicator1 هست که متاسفانه روی نسخه ابونتوی ۲۴ دپریکیت شده و توی ریپازیتوری هاش نیست کلی بگرد و بپرس از چت جی پی تی هم قضیه رو دارک تر کرد تهش برگشت گفت که ابونتو رو دانگرید کن!!! من و برگهایم !!!خلاصه اینکه دست به دامن روش سنتی گوگل کن شدیم اون ته تهای گوگل یه ریپو پیدا کردم که این کتابخونه رو هنوز توی خودش داشت و گفتم که با شما هم به اشتراک بزارم شاید بدرد کسی خورد.اگه میخواید FortiClient رو روی سیستم اوبونتو خودتون راهاندازی کنید، این مراحل ساده رو دنبال کنید:1- آدرس مخزن رو به لیست منابع اضافه کنید.echo &amp;quotdeb http://cz.archive.ubuntu.com/ubuntu jammy main universe&amp;quot | sudo tee -a /etc/apt/sources.list2- لیست کتابخونه ها رو آپدیت کنید.sudo apt update3- وابستگی لازم رو نصب کنید.sudo apt install libappindicator14- FortiClient رو دریافت کنیدfilestore.fortinet.com/forticlient/forticlient_vpn_7.4.0.1636_amd64.deb5- FortiClient رو نصب کنیدsudo dpkg -i forticlient_vpn_7.4.0.1636_amd64.debو کار تمام شد! 🎉 از اتصالات امن با FortiClient لذت ببرید! اگه سوالی دارید، حتما بپرسید!</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Mon, 21 Oct 2024 23:04:12 +0330</pubDate>
            </item>
                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@meysamzandy/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-d6hyuacbgipu</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/vbip8b0jfet8-wmt5P.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۲,۲۴۳ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۲۶ مرتبه پسندیدند و  ۷ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۱۶ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۳۷۹ بار خوانده شدند و ۱۸,۵۴۸ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۰۲۵۴۲۹۱ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۸۳۲ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۰۲۵۴۲۹۱ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Fri, 02 Apr 2021 02:30:41 +0430</pubDate>
            </item>
                    <item>
                <title>لاراول تریک | انتقال کد‌های چاق به لایه مدل | Skinny Controllers, Fat Models</title>
                <link>https://virgool.io/@meysamzandy/%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AA%D8%B1%DB%8C%DA%A9-%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%DA%86%D8%A7%D9%82-%D8%A8%D9%87-%D9%84%D8%A7%DB%8C%D9%87-%D9%85%D8%AF%D9%84-skinny-controllers-fat-models-donvzvlwikpu</link>
                <description>لاراول یکی از فریم ورک های MVC که با زبان PHP نوشته شده و به همین خاطر ، وقتی از اون استفاده می کنیم، مدل ها و کنترل ها، کد‌های زیادی دارند، و این غیر منطقی نیست چونکه برای انجام کارهای پیچیده و عملیات های مختلف به این لایه‌ها نیاز داریم.تا اینجای کار مشکلی نیست.مشکل وقتی بوجود میاد که ما در یکی از لایه ها، کدها و مسئولیت زیادی داشته باشیم. این میتونه به کدهای اصلی ما آسیب بزنه.حجیم شدن هرچیزی همیشه مخالف الگو است، خرد کردن نگرانی ها، به نگهداری و آزمایش بهتر آن کمک می کند.اما وقتی می گیم: « Skinny Controllers, Fat Models » ، کنترلر های لاغر ، مدل های چاق ، منظور اینه که مدل فقط یک کلاس نیست بلکه یک لایه است. داشتن مدل خفن هم همیشه خوب نیست.اجازه بدید باهم بررسی کنیم که چطوری کدهای خودمون در یک ساختار مناسب در لاراول توسعه بدیم.چرا کنترلر لاغر؟خب، وظیفه اصلی کنترلر چی هست؟کنترلر ها تقاضا ها ( ریکوئست ها ) رو دریافت می کنند و پاسخ ( ریسپانس ) های مناسب رو بر میگردونند. به طور کلی مسئولیت های زیر به عهده کنترلر هاست:رسیدگی به یک درخواست و ایجاد پاسخفرم ها را ایجاد و مدیریت کنددریافت و اتصال پارامترها به توابعست کردن و گرفتن آبجکت های یک جلسه ( session )مدیریت تغییر مسیر هاپس منطق های برنامه (business logic ) چی میشه؟ اینها باید در لایه مدل پیاده سازی بشهکنترلر نباید کاری انجام بده بلکه باید کارها رو به کسی که میتونه انجام بده واگذار کنه.اونها باید ساده ، لاغر ، کوتاه ، مختصر و با مسئولیت کمتری باشند.اگر از این قانون پیروی کنیم ، از یکی از anti-pattern های تکراری جلوگیری می کنیم: کنترلر چاق.توجه: شما میتونید حداکثر تعداد خطوطی رو که میخواهید در یک کنترلر داشته باشید رو برای خودتون تعریف کنید. به عنوان مثال ، 10 خط میتونه در بیشتر موارد کافی باشد.و چرا داشتن کنترلرهای چاق بد است؟ اساساً به دو دلیل:کدی که در کنترلر ها قرار میگیره نمیتونه دوباره مورد استفاده قرار بگیره. انجام تست های واحدی ( Unit tests ) برای کنترلر ها خیلی مشکله.البته لایه مدل میتونه از کلاسهای مختلفی تشکیل بشه و نه فقط یک کلاس.مدل فقط یک کلاس نیستباشه، الان کنترلر ما خیلی تمیزتر از قبل شده، اما یه مدل داریم با یه عالمه کد که نگهداریش مشکل شده.ما باید مدل خودمون رو به یک ساختار تقسیم کنیم. این ساختار میتونه درون این لایه های کد باشه:لایه FormRequest: داده ها را تایید میکند.لایه Services: همه منطق تجاری برنامه را در بر میگیرد.لایه Repositories: با پایگاه داده در تعامل است.لایه Models:چیزهایی را که میخواهیم ارائه میدهد.لایه Events: منطقی که به هنگام یک رویداد اجرا می شود را دربر میگیرد.لایه Responsable: فرمت درخواست ها و پاسخ ها را مشخص می کند.لایه  View Composers  تسک های ساده مورد نیاز بخش نمایش، مانند فرمت تاریخ و تبدیل واحد های پولی را در بر میگیرد.لایه FormRequestبرای تأیید سناریوهای پیچیده تر ، می تونیم از FormRequest استفاده کنیم.برای ایجاد کلاس FormRequest کافیه دستور زیر رو اجرا کنید.php artisan make:request StoreBlogPostکلاس ایجاد شده در مسیر app/Http/Requests در دسترس هست.و در آخر میتونیم چند قانون رو به متد rules اضافه کنیم:/** 
* Get the validation rules that apply to the request.
* 
* @return array 
*/
 public function rules() 
{ 
       return [ 
               &#039;title&#039; =&gt; &#039;required|unique:posts|max:255&#039;, 
                &#039;body&#039; =&gt; &#039;required&#039;, 
       ]; 
  }حالا ببینیم تایید میشه یا نه:// Retrieve the validated input data... 
$validated = $request-&gt;validated();لایه Servicesاین لایه راهی برای متمرکز کردن کدها است. با استفاده از service provider  میتونیم کدها را به کنترلر تزریق کنیم. ما میتونیم منطق های چاق خودمون رو ، که روی داده های ورودی اثر میگذارند ، اینجا بزاریم. همچنین ، میتونیم اونها رو با یکی از دو رویکرد زیر توسعه بدیم:این سرویس ها ( service providers ) میتونن به عنوان: سرویس های عمومی ، کدها خام ساده و قدیمی PHP،  کدهای جدا شده از لاراول، و یا انجام کارهایی که نتیجه رو به کنترلر برمیگردونه مورد استفاده واقع شوند.مورد استفاده کنترلر ها جهت ذخیر دیتا با استفاده از مخازن ( repositories ) و سایر وابستگی هایی که می توانیم با لاراول داشته باشیم، واقع شوند.یا اینکه:  سرویسهایی هستند که همه منطق ها رو میتونه در بر بگیره.اونها همه وابستگی هایی که تزریق شده اند رو دارند و وقتی اونها رو فراخوانی میکنیم همه عملیات ها اجرا خواهند شد. بیشتر از این چیزی نیاز نیست.لایه Repositoriesبرای تعاملات با پایگاه داده ، می تونیم از الگوی طراحی Repository استفاده کنیم.این ایده میگه که : مدل ها رو از کنترلر ها جدا کنید و نام های خوانا، برای کوئری ها پیچیده بزارید.لایه Eventsاگر نیاز به اجرای منطقی داشته باشیم که در نتیجه اجرای منطقی دیگه، لازم میشه و همچنین منطق اول وابسته به جواب منطق دوم نباشه از رویداد استفاده میکنیم.و اگه بشه این منطق رو از چند جا فراخوانی کنیم، رویداد بهترین گزینه است.مثال : ارسال ایمیل خوش آمد گویی به کاربر بعد از ثبت نامدر مثال بالا ثبت نام وابسته به نتیجه ارسال ایمیل نیست.لایه Responsableانتشار لاراول 5.5 ، Responsable Interface رو به همراه داشت که اجازه تبدیل آبجکت ها، در یک پاسخ (Response) به HTTP رو میده.میتونید هر پارامتری رو به متد سازنده ( constructor ) پاس بدید و تمام منطق مورد نیاز خودتون رو در متد  ()toResponse پیاده سازی کنید، این متد خودش بقیه کارها رو انجام میده. با این روش لایه مدل ما نیاز نیست نگران فرمت مورد نیاز کلاینت باشه. ما میتونیم این وظیفه رو به لایه Responsable واگذار کنیم.همچنین در استفاده مجدد از این کد به ما کمک میکنه و ما میتونیم یک فرمت کلی و یکسان در خروجی داشته باشیم درحالی که هر عملیات میتونه از Responsable مربوط به خودش استفاده کنه.لایه View Composersیک وظیفه یا تسکی که در بخش نمایش داده ها (فرانت یا view) خیلی بهش نیاز داریم، قالب بندی داده هاست. مثل فرمت تاریخ یا تبدیل نرخ ارز و ...با View Composers میتونید این کارها رو راحت کنید.اینها callbacks یا کلاسهایی هستند که موقع نمایش view فراخوانی میشوند و این به ما کمک میکنه که منطق مورد نیاز در این بخش رو در مکانی واحد سازماندهی کنیم.در نتیجهآیا موافق نیستید که کنترلرها لاغر و مدل های چاق بسیار تمیزتر و ساده تر شدند؟ همچنین کد بیشتر قابل نگهداری و استفاده است؟ما منطق تجاری کدهای خودمون رو در لایه مدل قرار دادیم و به این ترتیب از کدهای تکراری جلوگیری کردیم.مطمئناً، همه مثالهایی که مطرح شد در همه ی موارد راه حل نیست، اما قاعده کلی اینه که:اگر بتوان چیزی را از کنترلر حذف کرد، استفاده مجدد و تست راحت تر است.ممنون که وقتتون رو برای مطالعه این مطلب صرف کردید.اگه نکته و یا نظری دارید از شنیدنش خوشحال میشم.سپاس</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Sun, 13 Dec 2020 15:57:51 +0330</pubDate>
            </item>
                    <item>
                <title>دیتابیس تریک | آشنایی با Stored Procedure و پیاده سازی</title>
                <link>https://virgool.io/@meysamzandy/%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AA%D8%B1%DB%8C%DA%A9-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-stored-procedure-%D9%88-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-myge1ivm1fid</link>
                <description>تعریف Stored Procedure و یا SPیک SP کد ( کوئری ) آماده شده  MYSQL است که ذخیره میشه و در نتیجه می توانید بارها و بارها از کد استفاده کنید.بنابراین اگر یک درخواست MYSQL دارید که بارها و بارها اون را می نویسید ، با روش Stored Procedure  ذخیره کنید و برای اجرا، فقط فراخوانی کنید.SP ها روش هایی هستند که شما میتونید به اونها پارامتر ورودی بدید و کوئری های MySql رو اجرا کنید. به عنوان مثال برای نوشتن دستورات  Select , Update , Delete و … میتونید از SP ها استفاده کنید.استفاده از SP ها به همراه PDO باعث ذخیره کوئری در حافظه می شود و در نتیجه فراخوانی مجدد اون بسیار سریعتر از زمان اولیه اجرای کوئری خواهد بود.در یک SP شما میتونید چندین کوئری رو ذخیره و اجرا کنید و حتی از دستورات شرطی هم استفاده کنید. می توانید در ورودی متغیر تعریف کنید و متغیر ها رو مقدار دهی کنید و در کوئری ها و دستورات شرطی از اونها استفاده کنید.مزایای استفاده از SPسرعت بالا در اجرای کوئری هاامنیت بالا در اجرای کوئری هااجرای چندین کوئری در یک  SPاستفاده از دستورات  IF و  Else در SPاستفاده از متغیرها و ذخیره سازی مقادیر در متغیرهاپیاده سازی کوئریCREATE PROCEDURE store_procedure_name (IN parameter DataType, IN parameter DataType)
BEGIN
    // sql_statement
ENDمثال:CREATE PROCEDURE country (IN con CHAR(20))
BEGIN
    SELECT Name, HeadOfState FROM Country
     WHERE Continent = con;
END //اجرا:CALL store_procedure_name (parameter1, parameter2);</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Wed, 09 Dec 2020 22:31:24 +0330</pubDate>
            </item>
                    <item>
                <title>لاراول تریک | Transaction ها و شیوه استفاده</title>
                <link>https://virgool.io/@meysamzandy/%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AA%D8%B1%DB%8C%DA%A9-transaction-%D9%87%D8%A7-%D9%88-%D8%B4%DB%8C%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-rwnvki58putt</link>
                <description> تراکنش ها یا Transactions عملیاتی است که به شما اجازه می ده تا از صحت انجام یک فرآیند مطمئن و از درج ناقص اطلاعات جلوگیری کنید. به عنوان مثال وقتی قصد انجام یک سری عملیات حساس روی دیتابیس  دارید و باید مطمئن باشید که فرآیند تغییرات در SQL یا دیتابیس شما به درستی انجام شده . مثال ساد تر، وقتی که میخواهید یکسری دیتا را که به هم وابسته نیز هستند رو در تیبل های مختلف وارد کنید و باید مطمئن بشید که یا همه دیتا ها با موفقیت ثبت میشه و یا هیچکدام ثبت نمیشه (Atomic) .لاراول Transactionsبرای اجرای این قابلیت در لاراول، ۲ روش خودکار و دستی وجود داره. روش اول: عملیات Commit و Rollback رو خودکار انجام میشه:use Illuminate\Support\Facades\DB; 
DB::transaction( function () { 
    // example 
     DB::update(&#039;update users set votes = 1&#039;);
     DB::delete(&#039;delete from posts&#039;);
 });روش دوم: عملیات Commit و Rollback بصورت دستی انجام میشه:try { 
      DB::beginTransaction();
      DB::update(&#039;update users set votes = 1&#039;);
      DB::commit();
} catch(Exception $e) {
      DB::rollBack();
}</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Wed, 09 Dec 2020 21:48:26 +0330</pubDate>
            </item>
                    <item>
                <title>پی اچ پی تریک | الگوهای برنامه‌نویسی در PHP</title>
                <link>https://virgool.io/@meysamzandy/%D9%BE%DB%8C-%D8%A7%DA%86-%D9%BE%DB%8C-%D8%AA%D8%B1%DB%8C%DA%A9-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1-php-tcb1q2ruoz8l</link>
                <description>زبان برنامه نویسی PHP، زبانی انعطاف پذیر و پویا است که از تکنیک‌های برنامه‌نویسی مختلفی پشتیبانی می‌کند. طی سال‌ها تغییرات زیادی در آن ایجاد شده است که می‌توان به موارد زیر اشاره کرد مدل شی‌گرا در نسخه‌ی 5.0 (سال ۲۰۰۴)توابع بی‌نام (anonymous function) و فضای‌نام (namespace) در نسخه‌ی 5.3 (سال ۲۰۰۹)ویژگی‌‌های خاص (traits) در نسخه‌ی 5.4 (سال ۲۰۱۲)کلاس های بی‌نام (Anonymous Classes) در نسخه 7 سال (۲۰۱۸)کامپایلر JIT یا (just in time) در نسخه ۸ سال  (۲۰۲۰)در این مقاله سعی شده مقداری اندک از قابلیت ها و الگوریتم های مورد استفاده در این زبان بیان شود.برنامه‌نویسی شی‌گراویژگ‌های بسیاری از مدل برنامه‌نویسی شی‌گرا در PHP پشتیبانی می‌شوند از جمله کلاس‌ها (Classes)، کلاس‌های انتزاعی (Abstract Classes)، رابط‌ها (Interfaces)، وراثت (Inheritance)، سازنده‌ها (Constructors)، کپی‌کردن (Cloning)، استثناها (Exceptions) و بسیاری دیگر.برنامه‌نویسی تابعیزبان PHP از توابعی پشتیبانی می‌کند که می‌توانند به متغیرها انتساب داده شوند. چه توسط کاربر تعریف شده باشند چه داخلی باشند، می‌توانند توسط یک متغیر فراخوانی شوند. توابع می‌توانند به عنوان یک آرگومان به سایر توابع فرستاده شوند (قابلیتی که به آن توابع مرتبه-بالا گفته می‌شود) و هر تابعی می‌تواند توابعی دیگری را به عنوان خروجی بازگرداند.بازگشت (Recursion)، قابلیتی که به یک تابع اجازه می‌دهد خود را فراخوانی کند، توسط زبان پشتیبانی می‌شود اما بیشتر کد PHP روی تکرار (Iteration) تاکید دارد.توابع بی‌نام جدید (که از Closure پشتیبانی می‌کنند) از PHP 5.3 به بعد (۲۰۰۹) وجود دارند.نسخه‌ی 5.4 از PHP قابلیت اتصال Closure به قلمرو شی (Object’s Scope) را اضافه کرده و همچنین پشتیبانی از فراخوانی‌هایی با توابع بی‌نام را بهبود بخشیده است.قابلیت ساخت کلاس بدون نام (Programmer Declared Name) یا کلاس ناشناخته (که در نسخه ۷ ارايه شد) با استفاده از کلمه کلیدی new که می توان آن را در یک متغیر قرار داد. عملکرد آن متغیر نسبت به یک متغیر دیگر که از یک کلاس با نام new شده است تفاوتی ندارد.انواع Union (که در نسخه ۸ ارايه شد) با توجه به ماهیت دینامیک انواع در زبان PHP، موارد زیادی وجود دارند که انواع Union می‌توانند مفید واقع شوند. انواع Union به مجموعه‌هایی از دو یا چند نوع گفته می‌شود که مشخص شده فقط یکی از این دو نوع می‌تواند مورد استفاده قرار گیرد.درباره‌ی فراخوانی‌ها در برنامه نویسی تابعی بیشتر بدانیدبرنامه‌نویسی Metaاز طریق مکانیسم‌هایی مانند Reflection API و Magic Meghods است که PHP از این سبک برنامه‌نویسی پشتیبانی می‌کند. متدهای مختلفی مانند ()get__ و ()set__ و ()clone__ و ()toString__ و ()invoke__ وجود دارند که به توسعه‌دهندگان اجازه می‌دهند رفتار داخلی یک کلاس را تغییر دهند. توسعه‌دهندگان Ruby اغلب می‌گویند PHP از نبود ‘method_missing’ رنج می‌برد در حالی که این عملکرد توسط ()call__ و ()callStatic__ قابل دسترسی است.</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Tue, 08 Dec 2020 09:43:14 +0330</pubDate>
            </item>
                    <item>
                <title>لاراول تریک | ترجمه های آماده لاراول</title>
                <link>https://virgool.io/laravel-community/%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AA%D8%B1%DB%8C%DA%A9-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%85%D8%A7%D8%AF%D9%87-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-ds10th9rv8lu</link>
                <description>سلامتاحالا به این فکر کردید که وقتی یه پروژه برنامه‌ نویسی رو استارت میزنید، چقدر کارهای تکراری نسبت به پروژه قبلی برای انجام دادن دارید؟‌ مثل ترجمه دیکشنری لغات برای لاراولممکنه بگید بله خب موارد تکراری رو از پروژه قبلی کپی میکنم تو پروژه جدید یا یه ماژول ایجاد میکنم و هربار توی پروژه جدید نصب میکنم و یا ...این مطلب به شما یه ریپازیتوری در گیت هاب برای لاراول معرفی میکنه، که با نصب اون می تونید ترجمه کل پروژه شامل خطاها، ولیدیشن ها، تایید هویت و حتی پیام های سمت خروجی ها مثل json رو به زبان های مختلف داشته باشد و برحسب نیاز انون تغییر بدید یا اضافه کنید.لینک ریپازیتوری: langدر این ریپو شما میتونید زبان مورد نظرتون رو برای:  Laravel Framework 4/5/6/7/8, Laravel Jetstream and Laravel Fortifyپیدا کنید و یا حتی در توسعه اون مشارکت داشته باشید.</description>
                <category>میثم زندی</category>
                <author>میثم زندی</author>
                <pubDate>Mon, 07 Dec 2020 09:10:31 +0330</pubDate>
            </item>
            </channel>
</rss>