<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فرهاد</title>
        <link>https://virgool.io/feed/@farhadm</link>
        <description>علاقه‌مند به مهندسی نرم‌افزار، هوش مصنوعی و موسیقی  
coffeete.ir/farhadm</description>
        <language>fa</language>
        <pubDate>2026-06-16 12:57:54</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/6948/avatar/s0qWVV.png?height=120&amp;width=120</url>
            <title>فرهاد</title>
            <link>https://virgool.io/@farhadm</link>
        </image>

                    <item>
                <title>مقایسه Self-Contained App با Native AOT دات نت</title>
                <link>https://virgool.io/@farhadm/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-self-contained-app-%D8%A8%D8%A7-native-aot-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-o9zjzj2yy8p5</link>
                <description>در دات‌نت، دو روش مهم برای انتشار (publishing) یک برنامه مستقل وجود دارد:1. روش Self-Contained Applicationدر این روش، تمامی وابستگی‌های دات‌نت (مانند runtime و کتابخانه‌های مورد نیاز) همراه برنامه منتشر می‌شوند. این یعنی کاربر نهایی نیازی به نصب .NET Runtime ندارد. اما همچنان برنامه به JIT (Just-In-Time) Compilation وابسته است، یعنی کد در زمان اجرا کامپایل می‌شود.ویژگی‌های مهم:✅ عدم نیاز به نصب .NET Runtime روی سیستم مقصد✅ پشتیبانی از چندین سیستم‌عامل و معماری⚠️ حجم بالاتر فایل اجرایی نسبت به حالت معمولی (Framework-Dependent)⚠️ اجرای برنامه همچنان به JIT متکی است، که ممکن است در برخی سناریوها عملکرد را کاهش دهد2. روش Native AOT (Ahead-Of-Time Compilation)در این روش، کد برنامه به صورت کامل و از قبل (Ahead-Of-Time) کامپایل می‌شود و یک فایل باینری مستقل و بهینه برای سیستم مقصد تولید می‌کند. در نتیجه، برنامه نیازی به JIT ندارد و سریع‌تر اجرا می‌شود.ویژگی‌های مهم:✅ اجرای سریع‌تر به دلیل حذف JIT✅ کاهش مصرف حافظه و بهینه‌سازی عملکرد✅ خروجی یک فایل اجرایی مستقل و سبک‌تر از Self-Contained⚠️ پشتیبانی محدود از برخی ویژگی‌های دات‌نت مانند Reflection و Dynamic Code Generation⚠️ عدم امکان Cross-Compilation؛ یعنی باید برای هر پلتفرم جداگانه کامپایل شودمقایسه کلینتیجه‌گیری:اگر به انعطاف‌پذیری و استفاده از ویژگی‌های کامل دات‌نت (مانند Reflection) نیاز دارید، Self-Contained مناسب‌تر است.اگر برنامه شما نیاز به اجرای سریع، حجم کمتر و مصرف بهینه حافظه دارد (مانند برنامه‌های CLI یا پردازش‌های حساس به عملکرد)، Native AOT گزینه بهتری است.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Fri, 07 Mar 2025 19:04:01 +0330</pubDate>
            </item>
                    <item>
                <title>نصب و مدیریت PostgreSQL با استفاده از pgenv</title>
                <link>https://virgool.io/@farhadm/%D9%86%D8%B5%D8%A8-%D9%88-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-postgresql-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-pgenv-pn9fr6oz0qr1</link>
                <description>اگر شما هم از توسعه دهندگان یا مدیران پایگاه داده هستید و نیاز دارید نسخه های مختلف PostgreSQL را روی یک سیستم مدیریت و تست کنید، pgenv ابزاری است که کار شما را بسیار ساده میکند.𝐩𝐠𝐞𝐧𝐯 چیست؟یک ابزار کوچک و کاربردی است که به شما امکان می دهد چندین نسخه ی مختلف از PostgreSQL را روی یک سیستم مدیریت و اجرا کنید. این ابزار برای محیط های توسعه و تست طراحی شده است و هدف اصلی آن، تسهیل کار توسعه دهندگان و مدیران پایگاه داده (DBA) در بررسی و آزمایش نسخه های مختلف PostgreSQL است.نصب 𝗽𝗴𝗲𝗻𝘃نصب pgenv بسیار ساده است. این ابزار تنها شامل یک Bash اسکریپت است و میتوانید آن را به راحتی با دستورات زیر نصب کنید:git clone https://github.com/theory/pgenv  
export PATH=$PATH:./pgenv/binپس از نصب، دستور pgenv در دسترس شما قرار می گیرد و میتوانید با اجرای آن، راهنمای دستورات را مشاهده کنید.نحوهی کارکرد 𝗽𝗴𝗲𝗻𝘃این ابزار برای خودکارسازی کارهای تکراری مانند دانلود، کامپایل، نصب و راه اندازی یا متوقف کردن یک کلاستر PostgreSQL طراحی شده است.برای مدیریت یک نسخه ی خاص از PostgreSQL، کافی است آن را با دستور use انتخاب کنید. pgenv به طور هوشمندانه بررسی میکند که آیا این نسخه قبلاً مقداردهی اولیه شده است یا خیر و در صورت نیاز، این کار را به طور خودکار انجام میدهد.نصب نسخه های مختلف 𝗣𝗼𝘀𝘁𝗴𝗿𝗲𝗦𝗤𝗟برای نصب نسخه های مختلف PostgreSQL، مثلاً نسخه های 16.0 و 15.1، کافی است دستورات زیر را اجرا کنید:pgenv build 16.0
pgenv build 15.1این دستورات، نسخه های موردنظر را دانلود، کامپایل و نصب میکنند. مدت زمان انجام این عملیات به توان پردازشی و سرعت سیستم شما بستگی دارد.استفاده از نسخه ی دلخواه 𝗣𝗼𝘀𝘁𝗴𝗿𝗲𝗦𝗤𝗟پس از نصب، میتوانید نسخه ی موردنظر خود را با دستور use اجرا کنید:pgenv use 16.0این ابزار بررسی میکند که آیا این نسخه قبلاً مقداردهی اولیه شده است یا نه و در صورت نیاز، این کار را انجام میدهد.تغییر نسخه ی در حال اجرااگر بخواهید نسخه ی PostgreSQL را تغییر دهید، ابتدا نسخه ی فعلی را متوقف کرده و سپس نسخه ی جدید را اجرا کنید. به عنوان مثال:pgenv stop
pgenv use 15.1سایر امکانات 𝗽𝗴𝗲𝗻𝘃این ابزار دارای دستورات متعددی است که به شما امکان میدهد اطلاعاتی درباره ی نسخه های نصب شده، نسخه ی در حال اجرا و سایر جزئیات مرتبط را دریافت کنید. اگر به دنبال یک روش سریع و ساده برای آزمایش و اجرای نسخه های مختلف PostgreSQL روی یک سیستم هستید، pgenv ابزاری بسیار مفید است.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Tue, 18 Feb 2025 12:30:18 +0330</pubDate>
            </item>
                    <item>
                <title>دات نت 9.0 نهایی منتشر شد</title>
                <link>https://virgool.io/@farhadm/%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-90-%D9%86%D9%87%D8%A7%DB%8C%DB%8C-%D9%85%D9%86%D8%AA%D8%B4%D8%B1-%D8%B4%D8%AF-s8rhbsvdy4ns</link>
                <description>مایکروسافت نسخه نهایی دات‌نت ۹ را در ۱۲ نوامبر ۲۰۲۴ منتشر کرد. این نسخه با تمرکز بر بهبود توسعه برنامه‌های مبتنی بر ابر، پشتیبانی از هوش مصنوعی و افزایش بهره‌وری معرفی شده است. دات‌نت ۹ ویژگی‌های مهمی برای پردازش داده‌ها و توسعه مدل‌های یادگیری ماشینی ارائه می‌دهد. یکی از این ویژگی‌ها، بهبود کتابخانه‌ System.Numerics.Tensors است که انواع جدید را برای محاسبات چندبُعدی و بهینه‌سازی پردازش داده‌های پیچیده فراهم می‌کند​.از دیگر تغییرات مهم این نسخه، بهبودهایی در ASP.NET Core و .NET MAUI است. در ASP.NET Core ویژگی‌های جدیدی مانند نسخه‌بندی خودکار فایل‌های ایستا، قالب‌های جدید برای برنامه‌های Blazor، و پشتیبانی قوی‌تر از کامپایل زمان اجرا اضافه شده‌اند. این تغییرات باعث افزایش امنیت و کارایی برنامه‌ها شده است. همچنین، .NET MAUI در نسخه ۹ از کارایی بالاتری برخوردار است و کنترل‌های جدیدی برای توسعه برنامه‌های موبایل و دسکتاپ ارائه می‌دهد​.همچنین نسخه جدید C# 13 به همراه دات‌نت ۹ منتشر شده که قابلیت‌هایی جدید مانند ویژگی‌های جدید در مدیریت حافظه و بهینه‌سازی کارایی را به زبان C# اضافه می‌کند و توسعه‌دهندگان را در توسعه برنامه‌های سریع‌تر و بهینه‌تر یاری می‌دهد.در نسخه‌ی جدید دات‌نت ۹، مایکروسافت قابلیت‌های متنوعی برای توسعه‌دهندگان فراهم کرده که در چندین بخش مهم از جمله توسعه برنامه‌های هوش مصنوعی، وب، اپلیکیشن‌های موبایل و دسکتاپ، و بهبود کارایی و امنیت، به چشم می‌خورد. در ادامه برخی از این ویژگی‌ها را توضیح می‌دهم:۱. پشتیبانی پیشرفته از هوش مصنوعی و یادگیری ماشیندات‌نت ۹ امکانات قدرتمندی برای توسعه برنامه‌های هوش مصنوعی فراهم کرده است. یکی از مهم‌ترین تغییرات، بهبود در پکیج System.Numerics.Tensors است که از انواع جدید مانند TensorPrimitives و Tensor&lt;T&gt; پشتیبانی می‌کند. این ویژگی‌ها عملیات محاسباتی پیچیده را ساده و سریع می‌کنند و امکان استفاده بهینه از SIMD برای پردازش‌های سنگین را فراهم می‌آورند​.در همین راستا، نسخه‌ی جدید ML.NET (ورژن ۴) نیز بهبودهایی همچون پشتیبانی بهتر از مدل‌های ONNX، قابلیت‌های جدید در مدیریت داده‌ها و پیش‌پردازش متن (مانند tokenizerها)، و همچنین پشتیبانی از مدل‌های کدجنریشن و پردازش زبان طبیعی را شامل می‌شود. این ابزار به توسعه‌دهندگان اجازه می‌دهد تا مدل‌های یادگیری ماشینی سفارشی را به راحتی در برنامه‌های دات‌نت پیاده‌سازی کنند.۲. بهبودهای ASP.NET Coreدر ASP.NET Core، ویژگی‌های جدیدی به منظور بهبود کارایی و امنیت اضافه شده‌اند. از جمله این ویژگی‌ها می‌توان به بهبود نسخه‌بندی خودکار فایل‌های استاتیک مانند JavaScript و CSS، پشتیبانی از کامپایل از پیش (Ahead-of-Time Compilation)، و بهینه‌سازی استفاده از حافظه و زمان شروع برنامه‌ها اشاره کرد. همچنین، Blazor که چارچوب محبوب دات‌نت برای توسعه وب است، اکنون قالب‌های جدیدی برای برنامه‌های هیبرید و وب و ویژگی‌های دیگری مانند مدیریت بهتر رندر کامپوننت‌ها و تجربه بهتر در اتصال مجدد به سرور دارد​.۳. بهبودهای .NET MAUI برای اپلیکیشن‌های موبایل و دسکتاپا .NET MAUI که برای توسعه اپلیکیشن‌های چندسکویی (cross-platform) به‌کار می‌رود، در نسخه‌ی ۹ بهینه‌سازی‌های قابل توجهی داشته است. این تغییرات شامل بهبود در کنترل‌های موجود، اضافه‌شدن کنترل‌های جدید مانند TitleBar برای دسکتاپ، و HybridWebView برای نمایش محتوای جاوا اسکریپت است. همچنین ویژگی Native AOT و trimming، که به کاهش حجم برنامه‌ها و افزایش سرعت شروع آنها کمک می‌کند، نیز در MAUI بهبود یافته‌اند​.۴. ارتقا در Entity Framework Core و پایگاه‌های دادهدر Entity Framework Core، دات‌نت ۹ پشتیبانی بهتری از بانک‌های اطلاعاتی مانند Azure Cosmos DB برای NoSQL و AOT Compilation فراهم کرده است. این تغییرات باعث می‌شوند که برنامه‌های دات‌نت با عملکرد بهتری از پایگاه‌های داده استفاده کنند و انعطاف‌پذیری بیشتری در کار با داده‌های پیچیده داشته باشند​.۵. ویژگی‌های جدید در C# 13همزمان با دات‌نت ۹، نسخه جدیدی از زبان C# یعنی C# 13 منتشر شده که امکانات جدیدی مانند بهبودهای در مدیریت حافظه و سینتکس برای ایجاد کدهای بهینه‌تر ارائه می‌دهد. این نسخه تلاش می‌کند کدهای امن‌تر و بهینه‌تری تولید کند که به کاهش خطاهای احتمالی کمک می‌کند​.این تغییرات همگی در جهت بهبود تجربه کاربری توسعه‌دهندگان، افزایش کارایی، و ایجاد محیطی امن‌تر و بهینه‌تر برای توسعه اپلیکیشن‌ها صورت گرفته‌اند و نشان‌دهنده تمرکز مایکروسافت بر ارائه ابزارهای مدرن برای توسعه‌ی اپلیکیشن‌های هوشمند و مبتنی بر ابر است.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 13 Nov 2024 09:56:15 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه فایل ویدئو و صدا را ترکیب کنیم؟</title>
                <link>https://virgool.io/@farhadm/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%81%D8%A7%DB%8C%D9%84-%D9%88%DB%8C%D8%AF%D8%A6%D9%88-%D9%88-%D8%B5%D8%AF%D8%A7-%D8%B1%D8%A7-%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-%DA%A9%D9%86%DB%8C%D9%85-n3nmkp6kuhox</link>
                <description>دو فایل webm داشتم، یکی فقط حاوی ویدئو بود (بدون صدا) و یکی شامل صدا بود (بدون تصویر) می خواستم این دو فایل را با هم ترکیب کنم به‌طوری که فقط یک فایل داشته باشم که شامل صدا و تصویر باشد.وب‌ام (به انگلیسی: WebM) یک قالب چندرسانه‌ای است که برای ارائه یک فرمت ویدئویی آزاد و با کیفیت بالا برای استفاده در اچ‌تی‌ام‌ال ۵ ارائه شده‌است. این پروژه توسط شرکت گوگل حمایت می‌شود.دنبال راهی بودم که خیلی سریع و بدون نصب ابزارهای سنگین این کار را انجام دهم تا اینکه به ffmpeg رسیدم.یک ابزار قدرتمند کراس پلتفرم خط فرمان برای کار با فایل‌های صوتی و تصویری است. در ادامه نحوه انجام این کار با FFmpeg را توضیح می‌دهم:مراحل:به سایت FFmpeg مراجعه کنید.نسخه مناسب سیستم عامل را دانلود و طبق دستورالعمل نصب کنید.فرض کنید فایل ویدیویی شما به نام video.webm و فایل صوتی شما به نام audio.webm است.اجرای دستور FFmpeg:خط فرمان را باز کنید.به مسیری که فایل‌های WebM قرار دارند بروید یا مستقیماً مسیر فایل‌ها را در دستور ذکر کنید.از دستور زیر برای ترکیب فایل‌های صوتی و تصویری استفاده کنید:ffmpeg -i video.webm -i audio.webm -c:v copy -c:a copy output.webmاین دستور، فایل ویدیویی و صوتی را با هم ترکیب کرده و نتیجه را در فایل output.webm ذخیره می‌کند.نکات:اگر فایل‌های شما فرمت‌های متفاوتی دارند (به عنوان مثال، ویدیو MP4 و صدا MP3 است)، باز هم می‌توانید از FFmpeg برای این کار استفاده کنید، فقط ممکن است نیاز به تغییر کدک‌ها داشته باشید.پارامتر i: ورودی فایل‌ها (ویدیو و صدا)پارامتر c:v copy: کپی مستقیم داده‌های ویدیویی بدون تغییر (بدون کدگذاری مجدد)پارامتر c:a copy: کپی مستقیم داده‌های صوتی بدون تغییر (بدون کدگذاری مجدد)این دستور از کدگذاری مجدد جلوگیری می‌کند و فقط محتوای ویدیو و صدا را ترکیب می‌کند، که این باعث می‌شود فرایند بسیار سریع باشد.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 14 Sep 2024 12:44:59 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش نصب processmaker با docker</title>
                <link>https://virgool.io/@farhadm/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-processmaker-%D8%A8%D8%A7-docker-xmchy6c1macs</link>
                <description>پلتفرم processmaker برای مدیریت فرآیندهای کسب و کار (BPM) است که به سازمان‌ها کمک می‌کند تا فرآیندهای کاری خود را بهینه‌سازی و اتوماسیون کنند. با استفاده از این پلتفرم، کاربران می‌توانند جریان‌های کاری پیچیده را طراحی، مدل‌سازی، اجرا و نظارت کنند. این نرم‌افزار با ارائه ابزارهای گرافیکی و کاربرپسند، امکان طراحی فرآیندها بدون نیاز به دانش برنامه‌نویسی را فراهم می‌کند. همچنین، ProcessMaker قابلیت یکپارچگی با سایر سیستم‌های سازمانی را دارد و با ارائه گزارش‌ها و تحلیل‌های جامع، به مدیران کمک می‌کند تا بهره‌وری و کارآیی فرآیندهای سازمانی را بهبود بخشند.در این آموزش فرض بر این است که با داکر آشنایید و آنرا همراه با docker compose را روی سیستم داریددر وبسایت رسمی ProcessMaker دو ایمیج داکر برای این نرم‌افزار وجود دارد:ایمیج متن‌باز غیرتجاریایمیج تجاری (با پرداخت هزینه)در این آموزش نحوه راه‌اندازی نسخه متن‌باز غیرتجاری را یاد خواهیم گرفت.ایمیج های داکر:غیرتجاری: https://github.com/ProcessMaker/pm4core-dockerتجاری: https://hub.docker.com/r/processmaker/pm4-coreشروع نصبابتدا یک فولدر به نام processmaker بسازید و وارد آن شوید.فایل زیر را در آن قرار دهید: https://gist.github.com/farhadmpr/3820f4bfa99ed248793b8b485e1af32b توضیح فایلاین فایل Docker Compose برای اجرای دو سرویس (MySQL و ProcessMaker) در کانتینرهای Docker طراحی شده است.   mysql:   
نام سرویس را مشخص می‌کند
    image: mysql:5.6   
ایمیجی که برای ساخت کانتینر استفاده می‌شود را مشخص می‌کند
    restart: always   
تنظیم می‌کند که کانتینر در صورت توقف، دوباره راه‌اندازی شود
    environment:   
متغیرهای محیطی برای کانتینر را تعریف می‌کند
      MYSQL_ROOT_PASSWORD: PM-DBPassw0rd
    networks:   
شبکه‌ای که این سرویس به آن متصل می‌شود را مشخص می‌کند
      - pm-net
    ports:   
پورت‌هایی که از کانتینر به میزبان مپ می‌شوند را مشخص می‌کند
      - 3306:3306    depends_on:
      - mysql
    image: eltercera/docker-processmakerوابستگی این سرویس به سرویس دیگر را مشخص می‌کند. در اینجا سرویس processmaker به mysql وابسته است، یعنی mysql باید قبل از processmaker اجرا شود.بخش networks تنظیمات شبکه‌ها را تعریف می‌کند.حالا در همان فولدر دستورات زیر را وارد کنید:docker network prune
docker-compose up -dمرورگر خود را باز کنید و به آدرس https://localhost:8091 برید و مراحل را طبق تصاویر ادامه دهیدتوجه: اتصال به دیتابیس به درستی انجام نشده است، زیرا نام میزبان پیدا نشد. بنابراین، اکنون باید به شناسایی شناسه یا نام کانتینر mysql پرداخته و &quot;IPAddress&quot;: &quot;172.16.150.2&quot; را از بخش Network دریافت کنید.docker ps
docker inspect [396319b4c448]
یا
docker inspect [processmaker-docker_mysql_1]پسورد را بصورت زیر وارد کنید:PM-DBPassw0rdدکمه تست کانکشن را بزنید و اگر همه چیز را خوب جلو رفته باشید باید پیغام موفقیت آمیز را دریافت کنیداگر پس از نصب پروسس میکر در همان اولین ورود خود خطای منقضی شدن کلمه عبور یا به عبارتی &quot;User&#x27;s account has expired&quot; را دریافت کردید علت این خطا این است که تاریخ انقضای کاربری اصلی برنامه یعنی admin در پیش فرض نصبی برنامه به تاریخ 01-01-2020 ست شده است. بنابراین برای رفع این خطا کافیست تاریخ انقضای کاربر admin به روز رسانی شود.برای این امر باید پایگاه داده اصلی برنامه را باز کنید که نام کاربری پیش فرض root و کلمه عبور آن همان کلمه عبوری است که در فایل بالا ست شده است. سپس پایگاه داده اصلی برنامه یعنی wf_workflow را باز کنید و به تب SQL بروید، سپس کوئری زیر را کپی و اجرا کنید:UPDATE `RBAC_USERS` SET `USR_DUE_DATE` = &#039;2030-01-01&#039; WHERE `RBAC_USERS`.`USR_UID` = &#039;00000000000000000000000000000001&#039;;

UPDATE `USERS` SET `USR_DUE_DATE` = &#039;2030-01-01&#039; WHERE `USERS`.`USR_UID` = &#039;00000000000000000000000000000001&#039;;با این کار شما تاریخ انقضای کاربر اصلی برنامه را به روز رسانی و مشکل را رفع می کنید.بروزرسانی:بعد از نصب چگونه تنظیمات دیتابیس را تغییر دهیم و مثلا مقدار DB_HOST را تغییر دهیم؟وارد کانتینر مربوط به پروسس میکر می شویم:sudo docker exec -it processmaker-docker_processmaker_1 bin/bash  به مسیر /opt/pm/processmaker/shared/sites/workflow میریم و فایل db.php را ویرایش میکنیم.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 10 Jul 2024 09:33:15 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم طراحی نرم افزار و DDD</title>
                <link>https://virgool.io/@farhadm/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D9%88-ddd-y34dmay2t9zp</link>
                <description>گپی در مورد طراحی نرم‌افزار با ChatGPT داشتم که خلاصه مفاهیم مطرح شده در آن را اینجا می نویسم. مطالب در مورد DDD، Aggregate، Aggregate Root، Value Object، Bounded Context، زبان فراگیر و Entity است.درباره Aggregate و Aggregate Rootدر طراحی نرم‌افزار، Aggregate مجموعه‌ای از اشیاء (objects) است که با هم در ارتباطند و معمولاً یکی از آنها به عنوان Aggregate Root انتخاب می‌شود. فرض کنید یک خرید آنلاین دارید. Aggregate ممکن است شامل شیئ‌هایی مانند سبد خرید، محصولات در سبد، اطلاعات مشتری و غیره باشد. در این مثال، سبد خرید می‌تواند به عنوان Aggregate Root انتخاب شود که بقیه اشیاء (محصولات، اطلاعات مشتری و ...) به طور مستقیم یا غیرمستقیم با آن در ارتباط هستند.درباره Value Object شیء‌ای است که ارزش خود را بر اساس خصوصیت‌های خود دارد و توسط مقدار آن تشخیص داده می‌شود، نه با شناسه‌ای که به آن اختصاص داده شده باشد. یک Value Object می‌تواند تاریخ، مختصات مکانی، آدرس و غیره باشد. برای مثال، تاریخ تولد یک فرد به عنوان Value Object در نظر گرفته می‌شود؛ زیرا مقدار تاریخ تولد بر اساس خصوصیات خود (سال، ماه، روز) تشخیص داده می‌شود و معمولاً به شناسه نیازی ندارد. یک Value Object می‌تواند مجموعه‌ای از چندین خصوصیت (مقدار) باشد، اما اگر مقداری که مد نظر است، به تنهایی یک مقدار معین باشد، همچنان می‌توان آن را به عنوان Value Object مدل‌سازی کرد. بنابراین، هر چند که Value Object معمولاً ترکیبی از چندین مقدار است، اما می‌تواند به عنوان مدل‌سازی برای مقادیر تکی نیز استفاده شود.درباره Bounded Contextاین مفهوم نشان دهندهٔ محدوده‌ای از دامنه‌ی مسئله و مفهوم‌های مشخص در آن است. فرض کنید شما یک سیستم فروش آنلاین دارید. Bounded Context ممکن است شامل قسمت‌هایی مانند مدیریت محصولات، مدیریت سفارش‌ها، مدیریت مشتریان و غیره باشد. هر کدام از این بخش‌ها می‌توانند یک Bounded Context جداگانه باشند که در آنها مفاهیم و قوانین خاص خود را دارند و ارتباطات خود را با بخش‌های دیگر دارند.برای ایجاد یک سفارش جدید، بخش مدیریت سفارش‌ها نیاز به دسترسی به اطلاعات محصولات دارد.ارتباط بین این دو Bounded Context به این صورت است که بخش مدیریت سفارش‌ها از خدماتی که توسط بخش مدیریت محصولات ارائه می‌شود برای دریافت اطلاعات محصولات (مانند نام، قیمت، و ...) استفاده می‌کند.بخش مدیریت محصولات خودش اطلاعات محصولات را مدیریت می‌کند و نیازی به دسترسی به جزئیات سفارش‌ها ندارد.در اینجا، هر Bounded Context دارای مفاهیم و قوانین خود است و تمرکز مختص به خود را دارد. ارتباطات بین این Bounded Context ها به منظور انجام عملیات‌هایی مانند ساختن سفارش‌ها است که هر کدام از این Bounded Context ها مسئولیت‌های خود را برعهده دارند و با استفاده از رابط‌های مشخص با یکدیگر ارتباط برقرار می‌کنند.مزیت اصلی DDD این است که به توسعه‌دهندگان کمک می‌کند تا مسائل دامنه مسئله را به بهترین شکل ممکن مدل‌سازی کنند و با استفاده از آن مدل‌ها، سیستم‌های نرم‌افزاری ایجاد کنند که با دامنه مسئله همگام و سازگار هستند.درباره Ubiquitous Languageاین مفهوم به زبان مشترکی اشاره دارد که بین تیم توسعه نرم‌افزار و متخصصان دامنه مسئله (Domain Experts) تعریف می‌شود. این زبان باید برای همه اعضای تیم قابل فهم و قابل استفاده باشد. زبان فراگیر باید مفاهیم و اصطلاحات مرتبط با دامنه مسئله را به صورت دقیق و یکسان تعریف کند و از طریق آن، ارتباط و هماهنگی بین اعضای تیم تضمین شود. این زبان باید در تمامی مستندات مربوط به پروژه (مانند مستندات موردی، کد، مدل‌های دامنه و ...) استفاده شود تا ابهامات درکی حل شده و دامنه مسئله به خوبی مدل‌سازی شود.درباره Entityیک Entity به یک واقعیت معین در دامنه مسئله اشاره دارد که دارای هویت مدیریتی است. به عبارت دیگر، هر Entity دارای یک شناسه منحصربه‌فرد است که آن را از دیگر موجودیت‌ها تمایز می‌دهد. Entity معمولاً دارای ویژگی‌ها (attributes) و روابط (relationships) با سایر موجودیت‌ها است. برای مثال، در یک سیستم مدیریت فروشگاه، مشتریان، محصولات و سفارش‌ها می‌توانند به عنوان Entity مدل‌سازی شوند.یک Aggregate مجموعه‌ای از موجودیت‌ها است که با هم در یک واحد معنایی گردآوری شده‌اند و توسط یک Aggregate Root مدیریت می‌شوند. Aggregate معمولاً برای کنترل یکدستی عملیات‌های مرتبط با یک یا چند موجودیت استفاده می‌شود و ممکن است شامل محدودیت‌ها و قوانین دامنه‌ای خاص باشد.یک Aggregate می‌تواند تنها شامل یک موجودیت باشد. این اغلب در مواردی رخ می‌دهد که نیاز باشد یک موجودیت خاص به تنهایی قوانین و محدودیت‌های دامنه‌ای را اعمال کند، یا اینکه طراحی سیستم به گونه‌ای باشد که انتظار می‌رود در آینده موجودیت‌ها یا Value Objects بیشتری به آن Aggregate اضافه شوند.از Value Object ها به عنوان مقادیر کمکی و یا جزئیاتی که به Entity ها یا سایر موجودیت‌ها ارتباط مستقیمی ندارند، استفاده می‌شود.برای روشن‌تر شدن این تفاوت، بیایید به این مثال نگاه کنیم:در یک سیستم مدیریت کتابخانه، کتاب می‌تواند به عنوان یک Entity مدل‌سازی شود. هر کتاب دارای یک شناسه یکتا (مانند شماره شابک) است و ممکن است ویژگی‌هایی مانند عنوان، نویسنده و تعداد در دسترس را داشته باشد. اما، اگر به مفهوم مقداری مانند &quot;تاریخ انتشار&quot; فکر کنید، این یک مثال از یک Value Object است. تاریخ انتشار یک مقدار است که ممکن است در بسیاری از موجودیت‌ها مانند کتاب‌ها، مقالات، فیلم‌ها و ... استفاده شود. این مقدار همیشه به تنهایی مفهومی معنی‌داری ندارد.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Tue, 02 Apr 2024 11:35:59 +0330</pubDate>
            </item>
                    <item>
                <title>قدرت شبه کلاس has در CSS</title>
                <link>https://virgool.io/@farhadm/%D9%82%D8%AF%D8%B1%D8%AA-%D8%B4%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%D8%B3-has-%D8%AF%D8%B1-css-ydvxe2n8vlff</link>
                <description>فرض کنید در صفحه‌ای که لیستی از پست‌های وبلاگ را نشان می‌دهد، یک عنوان اصلی (h1) دارید که بلافاصله بعد از آن، یک عنوان فرعی (h2) قرار دارد. اگر این عنوان فرعی (h2) وجود داشته باشد و مهم باشد، ممکن است بخواهید عنوان اصلی (h1) را بیشتر برجسته کنید. قبلاً برای انجام این کار باید یک تابع جاوا اسکریپت می‌نوشتید.این HTML را در نظر بگیرید
تابع جاوا اسکریپت زیر به دنبال همه h1‌ هایی است که یک h2 بلافاصله پس از آن قرار دارد و یک کلاس به نام highlight-content را برای برجسته سازی h1 به عنوان یک مقاله مهم به آن اعمال می‌کند.راه حل قدیمی (جاوا اسکریپت)اکنون می‌توانید از :has() برای دستیابی به همان کاری که تابع JS انجام می‌داد استفاده کنید. CSS زیر دنبال هر h1 می‌گردد و با استفاده از sibling combinator بررسی می‌کند که آیا یک h2 بلافاصله پس از آن وجود دارد تا رنگ متن آن (h1) را آبی کند. راه حل جدید has در cssخروجی کد بالا به‌صورت زیر خواهد بود:خروجیچه مرورگر هایی از این قابلیت پشتیبانی می کنند؟ اینجا را ببینیدنکتهنمی‌توان :has() را درون یک :has() دیگر قرار داد.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 30 Mar 2024 10:53:35 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه پیکربندی PostgreSQL برای اتصال از شبکه</title>
                <link>https://virgool.io/@farhadm/%D9%86%D8%AD%D9%88%D9%87-%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C-postgresql-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A7%D8%B2-%D8%B4%D8%A8%DA%A9%D9%87-g6pdefct5yz1</link>
                <description>پیش‌فرض PostgreSQL فقط اتصالات از دستگاه محلی را امکان‌پذیر می‌کند، که می‌تواند در بسیاری از موقعیت‌ها یک محدودیت باشد. اتصال به پایگاه داده از راه دور به کاربران این امکان را می دهد که به پایگاه داده که در ماشین یا شبکه دیگری قرار دارد دسترسی داشته باشند. اتصال پایگاه داده از راه دور را می توان از طریق پروتکل ها و فن آوری های مختلف مانند TCP/IP، SSH ایجاد کرد و می تواند برای سیستم های مدیریت پایگاه داده های مختلف از جمله PostgreSQL پیکربندی شود. دسترسی از راه دور به Postgres را فعال کنیدفایل پیکربندی postgresql.conf را با استفاده از ویرایشگر متن دلخواه خود باز کنید. این فایل معمولاً در دایرکتوری /etc/postgresql/14/main قرار دارد. برای باز کردن فایل از ترمینال لینوکس، دستور زیر را اجرا کنید: sudo nano /etc/postgresql/14/main/postgresql.confسپس، خط زیر را بیابید و کاراکتر # را در ابتدای خط حذف کنید:#listen_addresses = &#039;localhost&#039; سپس مقدار localhost را به * تغییر دهید. این به PostgreSQL اجازه می دهد تا به تمام آدرس های IP موجود گوش دهد. همچنین، می‌توانید یک آدرس IP خاص یا محدوده‌ای از آدرس‌های IP را که مجاز به اتصال به سرور هستند، مشخص کنید.فایل pg_hba.conf را با استفاده از ویرایشگر متن دلخواه خود باز کنید. این فایل معمولاً در دایرکتوری /etc/postgresql/12/main قرار دارد. برای باز کردن فایل از ترمینال لینوکس، دستور زیر را اجرا کنید: sudo nano /etc/postgresql/14/main/pg_hba.conبخش IPv4 local connections را به‌صورت زیر تغییر دهید:host    all             all             0.0.0.0/0            md5 این خط اتصال از هر آدرس IP (0.0.0.0/0) را امکان‌پذیر می کند و برای احراز هویت به رمز عبور (md5) نیاز دارد.دستور زیر را برای راه‌اندازی مجدد PostgreSQL اجرا کنید: sudo service postgresql restart</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 21 Feb 2024 13:45:47 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از UUID برای کلید اصلی در پستگرس</title>
                <link>https://virgool.io/@farhadm/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-uuid-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%B3%D8%AA%DA%AF%D8%B1%D8%B3-nm3fsh83gkrn</link>
                <description>گاهی اوقات به دلایل مختلف از UUID به جای کلیدهای اصلی استفاده می شود. در اینجا نحوه استفاده از UUID به جای سریال یا IDENTITY توضیح داده می شود:CREATE EXTENSION IF NOT EXISTS &#039;uuid-ossp&#039;;

CREATE TABLE items (
    id    uuid DEFAULT uuid_generate_v4(),
    name  text NOT NULL
);

INSERT INTO items (name)
     VALUES (&#039;one&#039;),
            (&#039;two&#039;),
            (&#039;three&#039;)
  RETURNING id, name;خط اول فعال سازی اکستنشن uuid-ossp برای تولید uuid می باشد که ابتدا بررسی می کند که آیا قبلا فعال شده است یا نه، اگر فعال نبود آن را فعال می کند.در خط بعدی جدولی با نام items ایجاد می کنیم که یک ستون به نام id و با نوع uuid دارد که مقدار پیش فرض آن با uuid_generate_v4 تولید خواهد شد.در انتهای دستور insert از returning استفاده شده است به این دلیل که مقادیری که به صورت خودکار با ساختارهای DEFAULT/Serial/IDENTITY تولید می شوند را می توان با دستور INSERT با استفاده از عبارت RETURNING برگرداند. از منظر کد برنامه، مانند یک SELECT اجرا می شود که مجموعه رکورد ایجاد شده را برمی گرداند. یعنی منظورمان این است که بعد از insert کردن مقادیر id و name را که تولید و اضافه شده اند را برگردان.خروجی:-- returns:
--                   id                  |     name
-- --------------------------------------+--------------
--  1cfaae8c-61ff-4e82-a656-99263b7dd0ae | one
--  be043a89-a51b-4d8b-8378-699847113d46 | two
--  927d52eb-c175-4a97-a0b2-7b7e81d9bc8e | three</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 15 Nov 2023 12:01:29 +0330</pubDate>
            </item>
                    <item>
                <title>رفرنس معلق در حلقه foreach زبان php</title>
                <link>https://virgool.io/@farhadm/dangling-reference-in-php-lxzr5lnyhwdv</link>
                <description>عکس تزئینیاگر میخواهید روی هر عنصر آرایه‌ای که در حال foreach روی آن هستید عملیاتی انجام دهید، استفاده از مراجع (reference) مفید خواهد بود. به عنوان مثال:$arr = array(1, 2, 3, 4);
foreach ($arr as &amp;$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)مشکل این است که، اگر مراقب نباشید می تواند عوارض و عواقب نامطلوبی داشته باشد. در مثال بالا، پس از اجرای کد، $value در اسکوپ باقی می‌ماند و به آخرین عنصر آرایه اشاره می‌کند. بنابراین اگر در ادامه از $value استفاده کنیم، ناخواسته آخرین عنصر آرایه را تغییر می یابد.به یاد داشته باشید: حلقه foreach ، اسکوپ (محدوده) ایجاد نمی کندمثال:$array = [1, 2, 3];
echo implode(&#039;,&#039;, $array), &amp;quot\n&amp;quot

foreach ($array as &amp;$value) {}    // by reference
echo implode(&#039;,&#039;, $array), &amp;quot\n&amp;quot

foreach ($array as $value) {}     // by value (i.e., copy)
echo implode(&#039;,&#039;, $array), &amp;quot\n&amp;quotکد بالا خروجی زیر را خواهد داشت:1,2,3
1,2,3
1,2,2آخرین مقدار در خط سوم در واقع 2 است، نه 3.چرا؟پس از اجرای اولین حلقه foreach، آرایه بدون تغییر باقی می ماند، اما، همانطور که در بالا توضیح داده شد، $value به عنوان یک dangling reference به آخرین عنصر در آرایه اشاره می کند و باقی می ماند (بعد از اتمام حلقه ، از بین نمی رود).در نتیجه، هنگامی که حلقه دوم اجرا می شود، به نظر می رسد چیزهای عجیب و غریب اتفاق می افتد. از آنجایی که $value اکنون با مقدار (یعنی با کپی) دسترسی می یابد، foreach هر عنصر آرایه را توی $value در هر مرحله کپی می کند.مرحله اول: مقدار array[0] یعنی عدد 1 کپی می شود به $value اما توجه داشته باشید که $value از اتمام حلقه قبلی به array[2] رفرنس شده است پس array[2] مقدار 1 را دریافت می کند. اکنون $array بدین صورت می شود [1, 2, 1]مرحله دوم: مقدار array[1] یعنی عدد 2 کپی می شود به $value (که رفرنس شده به array[2]) پس array[2] الان مقدار 2 را دریافت می کند. اکنون $array بدین صورت می شود [2, 2, 1]مرحله سوم: مقدار array[2] یعنی عدد 2 کپی می شود به $value (که رفرنس شده به array[2]) پس array[2] الان مقدار 2 را دریافت می کند. اکنون $array بدین صورت می شود [2, 2, 1]راه حل:برای اینکه reference در حلقه‌های foreach بدون این نوع مشکلات استفاده کنیم، باید تابع unset را روی متغیر، بلافاصله پس از حلقه فراخوانی کنیم تا reference حذف شود. به عنوان مثال:$arr = array(1, 2, 3, 4);
foreach ($arr as &amp;$value) {
    $value = $value * 2;
}
unset($value);   // $value no longer references $arr[3]</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 28 Oct 2023 15:04:58 +0330</pubDate>
            </item>
                    <item>
                <title>لغو آخرین تغییرات کامیت شده در Git</title>
                <link>https://virgool.io/@farhadm/%D9%84%D8%BA%D9%88-%D8%A2%D8%AE%D8%B1%DB%8C%D9%86-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1%D8%A7%D8%AA-%DA%A9%D8%A7%D9%85%DB%8C%D8%AA-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-git-xhfojkmctpo3</link>
                <description>یک نام مستعار Git ایجاد می کنیم که می توانید از آن برای لغو آخرین commit خود استفاده کنید.git config --global alias.uncommit &#039;reset --soft HEAD~1&#039;این دستور یک نام مستعار گلوبال به نام uncommit ایجاد می کند که آخرین commit مخزن فعلی را با استفاده از soft reset برمی گرداند و تغییرات را دوباره در ناحیه staging قرار می دهد.نواحی مختلف گیتبنابراین بعد از ساخت نام مستعار اگر می‌خواهید آخرین کامیت خود را لغو کنید، می‌توانید آن را به صورت زیر انجام دهید:git uncommitمی‌توانید تمام نام‌های مستعار Git را که ایجاد کرده‌اید با دستور زیر ببینید:git config --list | grep alias</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 14 Oct 2023 14:03:53 +0330</pubDate>
            </item>
                    <item>
                <title>دسترسی به اعضای خصوصی آبجکت های مشابه در php</title>
                <link>https://virgool.io/@farhadm/%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%A7%D8%B9%D8%B6%D8%A7%DB%8C-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C-%D8%A2%D8%A8%D8%AC%DA%A9%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-%D8%AF%D8%B1-php-dyh45jtl1kvp</link>
                <description>در زبان PHP، سطح دسترسی private به عنوان یکی از سطوح دسترسی می‌تواند برای متغیرها، توابع و ثابت ها استفاده شود. وقتی یک عضو با سطح دسترسی private تعریف می‌شود، به معنی این است که تنها از داخل آن آبجکت قابل دسترسی است و نمی‌توان به آن از خارج دسترسی داشت.یکی از مزایای استفاده از سطح دسترسی private ، این است که اطمینان حاصل می‌شود که داده‌ها و متدهایی که تنها باید در داخل آبجکت استفاده شوند، از داخل آن قابل دسترسی هستند و از خارج قابل دسترسی نیستند.اما یک نکته جالب یا غیر عادی در زبان php برای این حالت وجود داردآبجکت هایی از نوع یک کلاس می توانند به اعضای private و protected هم دیگر دسترسی داشته باشند حتی اگر آن ها یک نمونه برابر نباشند!!!کلاس زیر را ببینید، دارای پراپرتی foo و متد bar که هر دو به‌صورت private هستند. این کلاس یک متد پابلیک به نام baz دارد که یک آبجکت از نوع همین کلاس Test می گیرد و چون آبجکت دریافت شده از نوع خود همین کلاسی است که متد baz در آن قرار دارد (یعنی کلاس Test) پس به راحتی می تواند به اعضای خصوصی آبجکت other دسترسی داشته باشد.خروجی مثال بالا به صورت زیر خواهد بود:string(5) hello
Accessed the private method.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Mon, 03 Jul 2023 12:06:04 +0330</pubDate>
            </item>
                    <item>
                <title>فرق self با static یا late static binding در php</title>
                <link>https://virgool.io/@farhadm/late-static-binding-in-php-wq3iaeaqxldb</link>
                <description>bindingکلاس زیر را در نظر بگیرید:متغیر x آبجکتی از کلاس Foo استزمانی که شما از new self داخل فانکشن کلاسی (class&#x27;s member function) استفاده می کنید، یک نمونه از آن کلاس را دریافت خواهید کرد. حتی اگر ارث بری داشته باشید و با کلاس فرزند (derived class) آن را فراخوانی کنید.متغیر z آبجکتی از کلاس Foo است در حالی که انتظار داشتیم از نوع Bar باشددر مثال بالا اگر بخواهیم متغیری از نوع کلاس Bar داشته باشیم باید به‌جای کلمه کلیدی self از کلمه static استفاده کنیم.متغیر wow آبجکتی از کلاس Bar استاین حالت در php توسط ویژگی به نام late static binding امکان می پذیرد.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Mon, 26 Jun 2023 08:01:34 +0330</pubDate>
            </item>
                    <item>
                <title>جایگزینی switch case با match expression در php</title>
                <link>https://virgool.io/@farhadm/%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86%DB%8C-switch-case-%D8%A8%D8%A7-match-expression-%D8%AF%D8%B1-php-c40apohfljl0</link>
                <description>استفاده از match expression شکل مدرن تر و ساده تری از switch case قدیمی است و حالت استفاده از آن بسیار شبیه آرایه ها می باشد که در آن key ها آیتمی است که باید تطبیق یابد و value عبارتی است که باید اجرا شود. توجه داشته باشید که php شما باید حداقل ورژن 8 باشدعبارت ها می توانند یکی از حالت های زیر باشند:مقدار به‌خصوص مثلا &quot;text&quot;عملیات مثلا a + bیک anonymous function یا classتنها محدودیتی که وجود دارد این است که expression باید به‌صورت تک خطی باشدجدول مقایسه بین match و switchدر هر دو حالت match و case می توان case aggrigation و default داشتمثال استفاده از switchهمان مثال با استفاده از match expressionخروجی هر دو مثال به‌صورت زیر خواهد بود:</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sun, 07 May 2023 15:01:27 +0330</pubDate>
            </item>
                    <item>
                <title>تعریف پراپرتی در پارامتر تابع سازنده PHP</title>
                <link>https://virgool.io/@farhadm/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D9%BE%D8%B1%D8%A7%D9%BE%D8%B1%D8%AA%DB%8C-%D8%AF%D8%B1-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%B3%D8%A7%D8%B2%D9%86%D8%AF%D9%87-php-yoi8kadmc62i</link>
                <description>یکی از ویژگی های خوب معرفی شده در php 8 ویژگی constructor property promotion می باشد.این ویژگی باعث می شود تا بتوانیم تعریف پراپرتی های یک کلاس را با لیست پارامتر های متد سازنده آن کلاس ترکیب کنیم. یعنی به جای اینکه داخل کلاس به‌صورت جداگانه پراپرتی تعریف کنیم و بعد داخل متد سازنده، آنها را مقدار دهی کنیم با پارامتر های دریافت شده، می توانیم از این ویژگی کمک بگیریم که باعث کاهش خطوط برنامه خواهد شد.مثال استفاده از این ویژگی:به نحوه تعریف پارامتر های متد سازنده دقت کنیدتوجه: هنگام تعریف پارامتر های متد سازنده باید visibility level آنها را مشخص کنیدخروجی:</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 29 Apr 2023 14:32:01 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه branch گیت را تغییر نام دهیم؟</title>
                <link>https://virgool.io/@farhadm/%DA%86%DA%AF%D9%88%D9%86%D9%87-branch-%DA%AF%DB%8C%D8%AA-%D8%B1%D8%A7-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%86%D8%A7%D9%85-%D8%AF%D9%87%DB%8C%D9%85-gtyntc6jba6t</link>
                <description>فرض بر این است که شما با گیت آشنا هستید.به عنوان مثال فرض کنید روی برنچی در گیت کار کرده ایم و آن را به ریموت پوش کرده ایم. الان متوجه شدیم که نام برنچ را اشتباه وارد کرده ایم یا غلط املایی دارد.برای اصلاح آن باید مراحل زیر را انجام دهیم:تغییر نام برنچ روی لوکالپوش کردن برنچ با نام جدیدحذف برنچ قبلی از ریموتمرحله تغییر نام برنچ روی لوکالابتدا میریم روی برنچ مورد نظر:$ git checkout my-branch-to-renameتغییر نام برنچ روی لوکال:$ git branch -m my-new-branch-nameآپشن m- برای تغییر نام برنچ استفاده می شود و میتواند به‌صورت زیر نیز به کار رود:git branch (-m | -M) [&lt;oldbranch&gt;] &lt;newbranch&gt;مرحله پوش کردن برنچ با نام جدید$ git push -u origin my-new-branch-nameمرحله حذف برنچ قبلی از ریموت$ git push origin --delete my-branch-to-rename</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 01 Feb 2023 09:55:50 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه تنظیمات nginx را اتوماتیک reload کنیم؟</title>
                <link>https://virgool.io/@farhadm/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA-nginx-%D8%B1%D8%A7-%D8%A7%D8%AA%D9%88%D9%85%D8%A7%D8%AA%DB%8C%DA%A9-reload-%DA%A9%D9%86%DB%8C%D9%85-wn1s5mi3a1ex</link>
                <description>nginxهمانطور که می‌دانید تنظیمات nginx در etc/nginx/nginx.conf/ قرار دارد و اگر تغییری در آن فایل انجام شود باید nginx را با دستور nginx -s reload از این تغییرات آگاه سازیم درغیر اینصورت تغییرات اعمال نخواهد شد.حال میخواهیم کاری کنیم که این کامند به‌صورت خودکار با تغییر یافتن فایل تنظیمات اجرا شود.پس باید از تغییرات فایل nginx.conf آگاه شویم، این کار با استفاده از inotify امکان‌پذیر است. این inotify (inode notify) یک زیرسیستم هسته لینوکس است که توسط John McCutchan ایجاد شده است تا تغییرات سیستم فایل را نظارت کند و آن را به برنامه ها گزارش دهد. (monitoring filesystem events)برای استفاده از inotify ابتدا tools آنرا نصب می کنیم:sudo apt update
sudo apt install inotify-toolsبعد از تکمیل نصب، یک فایل در مسیر دلخواه و با نام nginx_reloader.sh ایجاد کنید و داخل آن اینها را قرار دهید:#!/bin/bash
while true
do
    inotifywait --exclude .swp -e create -e modify -e delete -e move /etc/nginx/nginx.conf
    nginx -t
    if [ $? -eq 0 ]
    then
        echo &amp;quotDetected Nginx Configuration Change&amp;quot
        echo &amp;quotExecuting: nginx -s reload&amp;quot
        nginx -s reload
    fi
doneاین اسکریپت در یک حلقه نامتناهی با استفاده از inotify تغییرات فایل nginx.conf را رصد می کند و در صورتی که تغییرات را دید ابتدا با کامند nginx -t سینتکس فایل را چک می کند تا خطایی نداشته باشد. اگر اوکی بود، با چاپ پیغام، کامند reload را اجرا می کند.الان به این فایل باید مجوز اجرا را بدهیم:chmod +x nginx_reloader.shحال کافیست این فایل را اجرا کنیم:sudo ./nginx_reloader.shالان کافیست فایل تنظیمات nginx تغییر کند، خودش reload خواهد شد.</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Mon, 07 Nov 2022 14:38:35 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه در لینوکس پکیج snap را بروز کنیم</title>
                <link>https://virgool.io/@farhadm/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D9%BE%DA%A9%DB%8C%D8%AC-snap-%D8%B1%D8%A7-%D8%A8%D8%B1%D9%88%D8%B2-%DA%A9%D9%86%DB%8C%D9%85-gkbo8trbsyg0</link>
                <description>Snap packageاگر نمی دانید snap چیست اینجا را بخوانید.بسته های اسنپ مانند سایر بسته ها به روز می شوند. مشابه همان روشی که می توانیم APT ها را از ترمینال بروز کنیم.sudo snap refresh APLICACIONاگر آپدیت APLICACION وجود داشته باشد آنرا نصب می کند.برای مثال اگر بخواهیم فایرفاکس را بروز کنیم:sudo snap refresh firefoxاگر بخواهم همه پکیج های نصب شده با اسنپ را بروز رسانی کنیم:sudo snap refreshکامند بالا معادل:sudo apt update + upgradeبروز رسانی لیست بدون نصب کردن آنها:sudo snap refresh --list</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Wed, 12 Oct 2022 11:38:13 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه پسورد sa دیتابیس sql server را ریست کنیم؟</title>
                <link>https://virgool.io/@farhadm/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B3%D9%88%D8%B1%D8%AF-sa-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-sql-server-%D8%B1%D8%A7-%D8%B1%DB%8C%D8%B3%D8%AA-%DA%A9%D9%86%DB%8C%D9%85-j9n6c2qy9ayq</link>
                <description>آیا تا به حال نیاز به تغییر یا حتی فراموش کردن رمز عبور حساب کاربری SQL Server System Administrator (SA) داشته اید؟ شاید رمز عبور گم شده باشد یا مسئول نگهداری آن شرکت را ترک کرده است؟ در این مقاله سه روش متداول برای تغییر رمز عبور و بازگرداندن شما به حساب SQL SA را معرفی خواهم کرد.اولین روش استفاده از رمز عبور SA فعلی برای ورود به SQL Server Management Studio و تغییر آن است. روش دوم استفاده از حساب windows authentication برای ورود و بازنشانی رمز عبور است. روش سوم استفاده از خط فرمان برای راه‌اندازی مجدد سرویس SQL در حالت تک کاربر، بازنشانی رمز عبور، و سپس راه‌اندازی مجدد سرویس SQL در حالت چند کاربره است.روش اول و دوم بسیار ساده است و اکثرا روش انجام آنرا میدانید. در این نوشته روش سوم را توضیح خواهم داد.روش سوم زمانی کاربرد دارد که نتوانیم از طریق روش های اول و دوم وارد شویم.1- ابتدا command propmpt را بصورت administrator اجرا کنید2- با استفاده از دستور زیر، سرویس sql server را stop می کنیم:net stop MSSQLSERVER3- الان sql server را با درستور زیر در حالت Single-User mode استارت می کنیم:net start MSSQLSERVER /m&amp;quotSQLCMD&amp;quot4- با استفاده از کامند زیر در command prompt به sql server وصل میشیم:sqlcmd 5- با استفاده از دستور T-SQL زیر یوزر جدیدی ایجاد میکنیم:Create LOGIN &lt;name&gt; WITH PASSWORD=&#039;&lt;password&gt;&#039;GOنام و پسورد دلخواه خود را در دستور بالا جایگزین کنید6- مجوز administrator را به یوزر ایجاد شده تخصیص می دهیم:SP_ADDSRVROLEMEMBER &lt;name&gt;,&#039;SYSADMIN&#039;GO7- حالا از cmd خارج میشیم:exit8- سرویس sql server را در حالت عادی استارت می کنیم:net stop MSSQLSERVER &amp;&amp; net start MSSQLSERVER9- حال به SQL Server Management Studio میریم و با یوزر جدید لاگین میشیم10- الان میتونیم در قسمت زیر رمز یوزر sa را تغییر دهیم:Object Explorer -&gt; Security -&gt; Logins</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sun, 28 Aug 2022 12:26:11 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با Corepack در Node.js</title>
                <link>https://virgool.io/@farhadm/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-corepack-%D8%AF%D8%B1-nodejs-titd04dug1tj</link>
                <description>با انتشار Node.js 16.9.0 ابزار جدیدی به نام Corepack عرضه شد و به عنوان یک اسکریپت Node با عنوان zero-runtime-dependency توصیف می شود که پلی بین پروژه های Node و package manager هایی مانند Yarn و Pnpm است.عکس تزئینی نود جی اس دارای یک مدیریت بسته به نام NPM است که وقتی Node.js روی سیستم نصب می شود، با آن نصب می شود. Corepack به ما امکان می‌دهد تا از package manager های دیگری، بدون نیاز به نصب آن‌ها به صورت global بر روی سیستم استفاده کنیم.کورپک یک اسکریپت در خود Node.js است و با خط فرمان قابل دسترسی است. دارای دستوراتی برای فعال کردن، غیرفعال کردن و آماده‌سازی package manager می‌باشد و از آنجایی که هنوز یک ویژگی آزمایشی در نظر گرفته می شود، به طور پیش فرض غیرفعال است.برای فعال کردن Corepack کافیست دستور زیر را در ترمینال خود تایپ کنید.corepack enableهمچنین می‌توانید مدیریت بسته خاصی را با قرار دادن نام آن در جلوی دستور فعال کنید. corepack enable yarnاگر می‌خواهید corepack را غیرفعال کنید، می‌توانید با استفاده از دستور زیر آن را غیرفعال کنید.corepack disableدر مثال زیر قصد داریم تا yarn package manager را فعال کنم.توجه: با Corepack می توانید یک یا بیشتر از یک مدیر بسته یا یک نسخه خاص از آن را فعال کنید.corepack prepare yarn@1.22.11 --activateهنگامی که مدیر بسته خود را فعال کردیم، می توانیم دستورات موجود را با استفاده از Corepack اجرا کنیم:corepack yarn add axiosاگر به فایل package.json نگاه کنیم، یک وابستگی برای axios خواهد داشت. همچنین یک تنظیم packageManager در آن داریم که فهرستی از مدیران بسته که می‌خواهیم برای پروژه استفاده کنیم را نشان می دهد:{
  &amp;quotname&amp;quot: &amp;quotsampleproject&amp;quot,
  &amp;quotversion&amp;quot: &amp;quot1.0.0&amp;quot,
  &amp;quotmain&amp;quot: &amp;quotindex.js&amp;quot,
  &amp;quottype&amp;quot: &amp;quotmodule&amp;quot,
  &amp;quotlicense&amp;quot: &amp;quotMIT&amp;quot,
  &amp;quotscripts&amp;quot: {
    &amp;quotstart&amp;quot: &amp;quotnode index.js&amp;quot
  },
  &amp;quotpackageManager&amp;quot: &amp;quotyarn@1.22.11&amp;quot,
  &amp;quotdependencies&amp;quot: {
    &amp;quotaxios&amp;quot: &amp;quot^0.21.4&amp;quot
  }
}منبع و توضیحات بیشتر</description>
                <category>فرهاد</category>
                <author>فرهاد</author>
                <pubDate>Sat, 07 May 2022 12:38:28 +0430</pubDate>
            </item>
            </channel>
</rss>