<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی فخاران قمی نژاد</title>
        <link>https://virgool.io/feed/@m_64403006</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 06:40:34</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>علی فخاران قمی نژاد</title>
            <link>https://virgool.io/@m_64403006</link>
        </image>

                    <item>
                <title>مقایسه ای بین Wagtail CMS و WordPress</title>
                <link>https://virgool.io/@m_64403006/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%A7%DB%8C-%D8%A8%DB%8C%D9%86-wagtail-cms-%D9%88-wordpress-or2nh3jrbf5e</link>
                <description>این موضوع نسبتا بزرگه و من خیلی به بحث کردن راجع به آن مشتاقم. هرcontent management system ای مزایا و معایبی داره، امیدوارم که در انتهای این پست، کمکتون کنم که بتونین بهترین cms رو برای خودتون یا شرکتتون انتخاب کنین.1. Overviewهر cms ای یک هدف رو دنبال می‌کنه: مدیریت محتوا به روشی منطقی و بهینه برای شما یا شرکتتون. انتخاب های بی‌شماری وجود داره که بسته به نیاز شما می‌تونه پیشنهاد بشه. یک cms ممکنه فقط باهاش بتونین مدیریت design و seo رو انجام بدین و دیگری فقط برای نوشتن محتوا مناسب باشه.وگتیل، cms زبان پایتون هست و وردپرس نیز برای زبان برنامه نویسی php عه. تفاوت اینجا مشخص میشه که وردپرس سهم حدود ۴۰ درصد بازار وب رو گرفته و با در نظر گرفتن این موضوع، وردپرس از پیش برنده هست. با این حال هدف بنده اینه که به شما عزیزان کمک کنم تا برای use case خاص خودتون یا شرکتتون بهترین cms رو انتخاب کنید.استفاده از وردپرس برای تهیه وبسایت به صورت سریع و موقت به همراه وبسایت های marketing جایی که تیم marketing شما به انعطاف پذیری زیادی نیازمنده، بی‌نظیره. در حالی که wagtail ماندگار و پایداره ولی میشه زمان کمتری برای توسعه‌اش صرف کرد، با این حال نیاز های شما و شرکتتون رو برای طولانی مدت برطرف می‌کنه.هر دوی cms های ذکر شده میتونن یک سرمایه‌ خوب برای شما یا شرکتتون باشن. ولی در این مقاله، قصد دارم این موضوع را مطرح کنم که چرا ممکنه بخواهید وگتیل رو انتخاب کنین. البته که این بسته به تیم شما، رویکرد شما و best practice های داخل تیمتان هنگامی که روی یک وبسایت کار می‌کنید داره.2. Differences at a glanceوگتیل و وردپرس در موارد زیادی تفاوت دارن. اینجا یک لیست کوتاهی از آنها را عرض می‌کنم:وگتیل از پایتون استفاده می‌کنه. وردپرس از php.وگتیل از پکیج های پایتون استفاده می‌کنه که برای نصب، به یک برنامه‌نویس نیاز دارن. وردپرس از پلاگین ها استفاده می‌کنه.وگتیل در کنار فریم‌ورکی به نام جنگو قرار می‌گیره. وردپرس قبل از توسعه بسیاری از فریم‌ورک های back-end توسعه داده شده و از معماری یا arcitecture خودش پیروی می‌کنه.وگتیل تم از پیش ساخته شده نداره. وردپرس تعداد بسیار زیادی تم آماده داره.وگتیل نیاز به برنامه‌نویس داره. وردپرس میتونه بدونه هیچ برنامه نویسی راه‌اندازی بشه.وگتیل فیچر هایی مانند workflow و reports و language translation و permission را به صورت built-in تو خودش جا داده. وردپرس برای این فیچر ها نیازمند پلاگینه که پلاگین های خوب هم معمولا premium هستن.وگتیل هدفش اینه که محتوای شما رو مدیریت کنه، وردپرس می‌خواهد کل سایت شما رو مدیریت کنه.وگتیل بین یک website و یک web app با یک دیتابیس قابل انتخاب که میتونه I/O رو خیلی خوب کنترل کنه قرار می‌گیره. وردپرس به سمت website-only بودن میره که یک ساختار دیتابیس دیفالت داره که read-only friendly هست.بین این دو، تفاوت های زیادی وجود داره به خاطر اینکه اهداف متفاوتی دارن. وگتیل می‌خواد محتوا و داده های شما رو در مسیر درستی یا اصطلاحا به طور clean way مدیریت کنه.وردپرس به clean data practice کمتر توجه می‌کنه، اما از تم های زیادی ساپورت می‌کند.3. Extendabilityاینکه بتونی cms ات رو extend کنی یا گسترش بدی این روزا خیلی مهمه. چه برنامه نویس باشی چه نباشی احتمالا وارد یک سناریویی که بخوای functionality سایتت رو توسعه بدی میشی. هم با wagtail و هم با wordpress میتونی به راحتی این کارو انجام بدی و default functionality هارو extend کنی. ولی با این حال تفاوت هایی هم وجود داره.وگتیل به طور معمول به یک برنامه نویس نیاز داره که شخصا این موضوع رو نقطه قوت اون میدونم به این خاطر که تو میتونی از تخصص فردی که تو حوزه tech فعالیت کرده کمک بگیری. در حالی که وردپرس اکوسیستم پلاگین هاش رو داره که خیلی بزرگ هم هست و با چند تا کلید هم میتونی نصبشون کنی که برای خودش یک فیچر قدرتمنده.در ابتدا، استفاده از وردپرس به نظر میاد که بهترین انتخاب برای شرکتت بوده ولی خب در طولانی مدت نمیشه بهش تکیه کرد. مخصوصا وقتی که تعداد پلاگین هات زیاد میشه و همچنین انعطاف پذیریت تو extend کردن functionality ات کم میشه. به علاوه، این همه پلاگین ممکنه سرعت سایتت رو هم بشدت پایین بیاره.با wagtail، ماجرا یکم فرق داره. شما نیاز به یک برنامه نویس برای نصب package های مختلف داری ولی extend کردن functionality ها با کد نویسی خیلی راحت تره و بعد از سال ها هم سخت‌تر و اسپاگتی نمیشه. وگتیل همچنین enterprise-level feature های خوبی داره که با یکی دو خط کد میتونن functionality های پیشرفته ای رو مثل translate کردن صفحات یا گرفتن یک گزارش دلخواه برای صفحه مورد نظر شما اجرا کنن. اون همچنین page history و group level permission داره که از قبل توش ساخته شده و به راحتی استفاده و مدیریت میشه.4. Scalabilityو scale کردن یک سایت معمولا سخته و در بیشتر موارد به این معنیه که شما نیاز به متخصص DevOps داری تا کمکت کنه server infrastructure ات رو مدیریت کنی. این موضوع برای هر نوع وبسایتی صادقه. معروف ترین راه‌حل اینه که بیای تعداد سرور هاتو افزایش بدی و از load balancer استفاده کنی تا ترافیکت رو بینشون توزیع کنی.با این حال، قبل از اینکه به این نقطه برسیم. ممکنه بخواهیم یک نگاهی به optimize کردن وبسایتمون بندازیم تا سریعترش کنیم و اون بتونه تعداد زیادی از web request ها رو تو تایم کمی کنترل کنه. تعداد کمتر سرور ها به معنی هزینه کمتر ماهانه هم میتونه باشه. برخی cms ها تنها موارد ضروری رو ارائه میدن و موارد دیگه در قالب add-on میتونن اضافه شن. خلاصه که هر کدوم از این دو روش مزایا و معایبی خودشونو دارن.وگتیل بشدت scalable هست. روی جنگو ساخته شده که توسط اینستاگرام و پینترست استفاده میشه و خیالتون از این موضوع راحت باشه. اگر به اندازه کافی خوش‌شانس باشید که ترافیک زیادی داشته باشین میتونین راحت functionalityتون رو گسترش بدین تا وبسایتتون سریع تر لود شه. و این موضوع میتونه با جنگو و وگتیل خیلی راحت باشه. همانطور برای performance، وگتیل تنها چند تا کوئری بیشتر از جنگو به دیتابیس اضافه میکنه.این موضوع خیلی مهمه که سایتت در سریع ترین حالت ممکن اجرا شه تا کاربر هاتو با response time سریع راضی نگه داری.با وردپرس، عجیب نیست اگه ده ها پلاگین داشته باشی و وقتی ۵۰ تا کاربر همزمان request ارسال میکنن سایتت جواب نده. حتی با مشخصات یکسان سرور برای هر دو cms، یکیشون از اون یکی خیلی بهتره.با وگتیل شما به طور معمول یک برنامه نویس دارید که میتونه codebaeتون رو optimize کنه در حالی که وردپرس نیاز به برنامه‌نویس نداره که این موضوع به این معنیه که تیمت ممکنه پلاگین های غیر ضروری اضافه کنه که این کار منجر به کند شدن سایتتون میشه.5. Securityامنیت باید موضوعی باشه که هر کسی بهش فکر کنه. اگه یک کاربر مخرب به وبسایتتون نفوذ کنه ممکنه کل دیتاتون رو از دست بدین یا سایتتون خراب شه و تمام تلاش هایی که برای رشد برندتون انجام دادین از بین بره.با وگتیل شما امنیت خیلی بالای دارین چرا که در واقع وگتیل از تمام فیچر های امنیتی جنگو نیز پشتیبانی می‌کنه. وقتی یک نسخه با فیچر امنیتی جدید موجود بشه، بشدت آسونه و در حد نوشتن یک خط کده تا آخرین آپدیت امنیتی رو دریافت کنین.در سمت دیگه، وردپرس زیاد اوضاع خوبی تو این موضوع نداره و تاریخچه خوبی از خودش تو مسائل امنیتی به جا نذاشته، و چیزیه که منو از وردپرس میترسونه، پلاگین ها اغلب نقص امنیتی دارن. مهمترین مورد: SQL injection vulnerabilitiesتعداد زیادی از پلاگین های وردپرس با نوشتن database query ها توسط برنامه نویس ها نوشته شدن، که میتونه اجرای سریعی داشته باشه ولی ایمن نباشه. در حالی که wagtail از ابزاری به نام ORM استفاده میکنه که با برنامه نویسی database query ها رو میسازه و اونا رو در صد درصد موارد ایمن میکنه. تو اکوسیستم وگتیل و جنگو، اگه یک توسعه دهنده raw Sql برای ارتباط گرفتن با دیتابیس ببینه، اون یک باگ امنیتی بزرگه که بیشتر افراد میتونن بلافاصله تشخیصش بدن.صرف نظر از اینکه چه cms ای استفاده کنی، همیشه به موضوعات امنیتی توجه کن.6. Designتقریبا design هر وبسایتی متعلق به خودشه و منحصر به فرده، حتی اگه شبیه رقباش به نظر بیاد. ولی معمولا شما یک حرکتی میزنید که نسبت به  رقیباتون متفاوت بشید. برای بیشتر سازمان ها یا شرکت ها، هویت بصری، استراتژی کلیدی‌شون تو حوزه برندینگ‌شونه. ضمن همه موارد، تصور کنید یکی از رقبای شما خرید کنه فقط به این دلیل که وبسایت رقیبتون رو با وبسایت شما اشتباه گرفته :)با وگتیل، تم های از پیش ساخته شده دستتون رو نبستن و آزادی عمل دارین، وگتیل فقط میخواد محتواتون رو مدیریت کنه و اون رو ارزیابی کنه که برای شما و شرکتتون خیلی کارو راحت می‌کنه. وگتیل هیچ نظری درباره فرانت سایتتون نداره و اجبارتون نمی‌کنه و طراحی اون بستگی به خودتون داره، شخصا فکر می‌کنم که این موضوع یک مزیت بزرگ برای اکوسیستم cms به شمار میاد. من کاملا آزادم که دیزاین و فیچر دلخواهم رو پیاده کنم و همچنین مطمئنم که وبسایتم حتما منحصر به فرد و در حوزه خودش بی‌نظیر میمونه و وبسایت دیگه ای شبیه‌اش به وجود نمیاد. با این حال این موضوع به این معنیه که شما باید تم خودتون رو با وگتیل بسازید در حالی که وردپرس هزاران تم آماده داره که میتونین با چند کلیک ساده انتخابشون کنید.با وردپرس هم میتونین همین کارو کنید ولی خیلی نادره که دیزاین یک وبسایت وردپرس کاملا unique و منحصر به فرد باشه. معمولا تم ها با اکوسیستم پلاگین موجود در وردپرس نصب میشن. و حتی اگه پولم پای تم بدی با توجه به شهرت زیاد وردپرس تو میتونی مطمئن باشی که اگه نگیم هزار تا، حداقل صد ها وبسایت دیگه وجود داره که دقیقا مثل وبسایت شماست.7. Get more but don’t pay moreوقتی شما می‌خوای یک فیچر پیشرفته ای مثل پشتیبانی دو زبانه رو به سایتت اضافه کنی، تو وردپرس باید افزونه نصب کنی که احتمال زیاد بین افزونه های رایگان چیز بدرد بخوری پیدا نمیکنی و مجبور میشی برای یک افزونه خوب بازم خرج کنی :)این موضوع برای اکثر پلاگین های پیشرفته صادقه (مثل انتقال دیتا بین سایتا یا A/B split testing و ...)7.1. Internationalizationوگتیل از قابلیت چند زبانه به صورت built in پشتیبانی می‌کنه. و برای گسترش functionality میتونی از wagtail-localize استفاده کنی که یدونه 3rd party package عه که توسط تیم اصلی وگتیل پشتیبانی میشه.وردپرس مشخصا قابلیت internationalization یا به طور کلی چند زبانه شدنو داره ولی باید بازم سر کیسه رو شل کنی و برای پلاگینش پول پرداخت کنی.7.2. Reportsوگتیل قابلیت اینو داره که هر اتفاقی تو صفحه های مختلفت افتاد رو گزارش بده که این قابلیت هم واسه خود وگتیله و نیاز به نصب پکیجی نداره. وردپرس هم همونطور که احتمالا حدس زدین چنین قابلیتی رو به صورت پیش فرض نداره لکن پلاگین هایی برای این موضوع وجود داره.7.3. Headlessو headless cms یک سیستم مدیریت محتواست که دیگه تمپلیت خودشو استفاده نمیکنه، بلکه داده های api رو در اختیار تکنولوژی های فرانت مثل react js یا vue js قرار میده تا ازش استفاده کنن، وگتیل هم قابلیت api رو داره که با چند خط کد فعال میشه.نه wagtail و نه wordpress تو این حوزه شماره یک نیستن ولی هردوشون میتونن به راحتی گسترش پیدا کنن تا از api endpoint ها پشتیبانی کنن.7.4. Workflowsتو یک سطح سازمانی، ممکنه تجربه مفهوم workflow رو داشته باشین. workflow مجموعه ای از task های مختلفه که باید قبل از یک action خاص انجام بشن. برای مثال ممکنه بخوای یک مقاله بنویسین، برای همین از seo کارتون می‌خواهید کلمات کلیدی مقاله‌تون رو چک کنه. اصلاحشون کنه، ترجمه ‌شون کنه و بعدش هم مقاله رو منتشر کنه.برای استفاده سازمان ها و شرکت های بزرگ، wagtail‌ به صورت built in قابلیت workflow رو داره که بشدت منعطف هست و بسته به نیاز سازمانتون میتونین راه اندازی اش کنید.با این حال نمیدونم که وردپرس چنین پلاگینی برای این مورد داره یا نه، ولی مطمئنم یک جایی یک پلاگینی برای چنین user case ای هست.7.5. Extendabilityاگه وگتیل پکیجی که نیاز داری رو نداشته باشه تو میتونی بری سمت پکیج های جنگو و پایتون تا functionality پیشرفته ای که خودت یا شرکتت میخواهید رو پیاده کنی. ولی وردپرس به اکوسیستم پلاگین هاش محدود شده اما خب، بازم هزاران پلاگین داره که احتمالا میتونه نیازتون رو برطرف کنه.8. User permissionsمجوز ها بخش بزرگی از کار تیمی شما رو در بر میگیرن و برای اهداف امنیتی کاربردین، مخصوصا برای تیم های بزرگ تر یا تیمایی که پیمان‌کار یا اصطلاحا سرمایه گذار دارن. تو ممکنه بخوای تیمتو محدود کنی که چه کاری بتونن انجام بدن و چه کاری نتونن، این ایده خوبی بنظر میرسه چرا که تعداد زیادی از وبسایت ها از طریق تیم خودشون و به واسطه کارمند های ناراضی ای که داشتن هک شدن، همچنین این محدودیت، دید کارمندان رو محدود به حوزه ای میکنه که باید کارشون رو به نحو احسن تو اون قسمت انجام بدن، مثلا نوشتن محتوا و نه تغییر تنظیمات پروژه.با وگتیل شما میتونین به راحتی این کار رو انجام بدین، شما میتونین گروه بسازین و کاربر هاتون رو تو این گروه ها عضو کنین، همچنین میتونین ویژگی های خاصی رو براشون فعال کنین و قابلیت اضافه کردن یا ویرایش کردن یا حتی حذف کردن انواع صفحات مختلف رو براشون غیر فعال کنین. مثل تمام چیز های مختلف تو دنیای وگتیل، این موضوع هم اختیاریه. اگر هم میخواهید اکانت ادمین برای ادیتوراتون بسازین تا دسترسی کامل داشته باشن، همچنان می‌تونین اینکارو انجام بدین.با cms ای مثل وردپرس تو معمولا به پلاگین نیاز داری تا اینکارو برات انجام بده، یعنی باید یک افزونه دیگه هم به لیست پرشمار افزونه هات اضافه کنی :(  ضمن اینکه اون پلاگین فقط به بخش های محدودی از وردپرس دسترسی داره چرا که خب، اون یک اکستنشنه و فیچر built in برای اون cms نیست.ولی permission ها کاربرد بیشتری دارن تا اینکه فقط برای امنیت یا محدود کردن کاربران استفاده بشن، اونا همچنین برای تمرکز روی یک بخش خاص و کار تیمی نیز کاربرد دارن، تو وگتیل شما گزارش ها و workflow ها رو برای نوشتن یک مقاله پیشرفته دارین. بجای مدیریت تیمتون به صورت سنتی ( تسک بشون بدی و پیگیرشون باشی )، پیگیری محتواتون و پیگیری اینکه چه کسی باید روی این محتوا تو مراحل مختلف کار کنه، میتونین یک workflow دلخواه بسازید که مخصوص شما و شرکتتونه. برای مثال، بیاید بگیم مثلا میخواهید یک پست بلاگ توسط تیم حقوقی شرکت بزاری بعدش از طریق تیم seo هم باید بررسی بشه و شایدم یک کاری که مخصوص شرکت شماست قبل از انتشار بلاگ بخوای انجام بشه، مشکلی نیست، وگتیل به صورت رایگان اینکارو برات انجام میده. این کار کمکتون میکنه تیمتون رو خیلی خوب سازمان بندی کنید.علاوه بر این، شما حتی میتونین کامنت هم برای هر پیج بزارین تا ادیتور های دیگه ببینن و reply اش کنن (Google Docs).9. Reusable contentتا حالا شده بخوای یه تغییر کوچولو روی وبسایتت انجام بدی و بعدش بفهمی که این تغییرو باید روی کل پیج هایی که داری هم اعمال کنی؟ با قابلیت reusable content وگتیل که بهش snippet میگن شما میتونین تغییر مد نظرتون رو اعمال کنین و روی هر بخشی از سایتت که دوست داری پیادش کنی.بیشتر cms ها چنین ویژگی ای دارن، ولی تو وگتیل به صورت explicit این موضوع برای محتوای قابل استفاده‌ی مجدد طراحی شده، برای مثال، اگه شما یک وبسایت آشپزی داشته باشین و سازنده پست هاتون همگی سرآشپز بودن و متوجه شدین که یک غلط املایی تو نام یکی از اونا وجود داره، شما میتونین نام طرفو تو author snippet آپدیت کنین و با این کار سریعا تو کل وبسایت شما اسم سرآشپز مدنظرتون آپدیت میشه.به هر حال این concept جدیدی نیست، بیشتر cms ها چیزی شبیه به اینو دارن، تو وردپرس کار با چنین داده هایی یکم دشواره، ولی با wordpress flexible taxonomies ممکنه، اما خب تو وگتیل شما یک منو اختصاصی برای این کار دارین که حتی میتونین بین انواع snippet هاتون سرچ و فیلتر کنین. رابط کاربری تمیزی داره و ویراش محتواهاتون رو بشدت friendly میکنه.10. Choosing the right CMSانتخاب cms باید فراتر از دیدن ویژگی های suerface-level یا سطحی باشه. در حالی که وردپرس کاربرد خفن خودشو داره، کسایی که آینده وبسایتشون رو بیشتر از ۶ ماه میبینن متوجه میشن که وردپرس دیگه پاسخگو نیاز هاشون نیست و در آینده تصمیم می‌گیرن که یک وبسایت جدید بسازن و سعی میکنن دیتا هاشون رو از وردپرس به یک cms دیگه انتقال بدن.امیدوارم این بلاگ بتونه کمکتون کنه تا از برخی تفاوت های اصلی بین wagtail و wordpress آگاه بشین، یا حداقل، امیدوارم توانسته باشم کمکتون کنم تا درباره طول عمر آینده وبسایتتون فکر کنید، حتی اگه هیچکدوم از این دو گزینه را انتخاب نکنید.در این بلاگ، فقط به تعداد محدودی از فیچر هایی که وگتیل داره اشاره کردم، چیزای خیلی بیشتری وجود داره، مثل:built in language support multilingual supportreportspage revisionsaudit loggingmulti-site supportheadless APIsimage croppingو بسیاری از ویژگی های خفن دیگه.اگه وگتیل نتونه کاری رو که می‌خواهید انجام بده، جنگو میتونه، و اگه جنگو نتونه، پایتون قطعا می‌تونه.با استفاده از این پشتوانه قدرت این رو دارید که هر چیزی رو که میتونید تصور کنید رو، روی وبسایتتون پیاده کنید.11. Summaryمن هیچوقت نمیگم از وردپرس استفاده نکن و همچنین نمیگم وگتیل برای شما یا شرکتی که دارین بی‌نظیره، بلکه این دو cms کاملا متفاوتن و اهداف متفاوتی هم دارن.وردپرس یه عالمه قابلیت خفن بهت میده بدون اینکه یک خط کد بنویسی. ولی خب این موضوع هم با یک سری نقطه ضعف ها همراهه. در حالی که وگتیل فیچر های built in زیادی داره و تو به یک برنامه نویس نیاز داری تا سایتتو راه بندازه.به صورت خلاصه، چند تا تفاوت کلیدی وجود داره که ممکنه بخوای قبل از انتخاب cms بعدیت بهشون توجه کنی:وگتیل در کنار فریم‌ورکی به نام جنگو قرار می‌گیره. وردپرس قبل از توسعه بسیاری از فریم‌ورک های back-end توسعه داده شده و از معماری یا arcitecture خودش پیروی می‌کنه.وگتیل نیاز به برنامه نویس داره. وردپرس نیاز به برنامه نویس نداره.وگتیل منعطفه و میتونه هر کاری رو که بخوای با کمک یک برنامه نویس انجام بده، وردپرس منعطفه تا جایی که اکوسیستم پلاگین هاش راه بیان.وگتیل میتونه خیلی  scalable باشه چون تو یک برنامه نویس داری تا کمکت کنه. وردپرس ممکنه نیاز به چندین پلاگین داشته باشه تا وقتی سایتت در طول زمان scale میشه سریع نگه‌اش داره.وگتیل امنیت بی‌نظیری داره. وردپرس هم امنه ولی خب، پلاگین هاش :(وگتیل تم آماده نداره. وردپرس هزاران تم آماده داره که میتونی انتخابشون کنی.وگتیل فیچر های built in خفنی مثل پشتیبانی از multilingual، workflow، permission، groups و reports داره. وردپرس هم میتونه این کار هارو انجام بده ولی خب، نیاز به چندین پلاگین داره که اغلبشونم پولین.وگتیل و وردپرس هر دوشون reusable content دارن که بهشون snippet و taxonomy میگن.منبعالتماس دعا</description>
                <category>علی فخاران قمی نژاد</category>
                <author>علی فخاران قمی نژاد</author>
                <pubDate>Sat, 27 Apr 2024 06:05:00 +0330</pubDate>
            </item>
                    <item>
                <title>چطور Commit Message های بهتری بنویسیم</title>
                <link>https://virgool.io/codenevis/%DA%86%D8%B7%D9%88%D8%B1-commit-message-%D9%87%D8%A7%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%85-bnn3zklul7xj</link>
                <description>Photo by Roman Synkevych on Unsplash1.  یک Commit Message دقیقا چیه؟یک commit message بخشی از متنیه که کارایی که کردی رو توصیف می‌کنه و توسط برنامه نویسی که کامیت رو میزنه تو commit object اضافه میشه.2. چرا باید Commit Message هامون رو خوب و با دقت بنویسیم؟چند تا از کاربرد های commit message ها:خواننده های که در آینده commit ها رو review میکنند، دیگه مشکلی تو درک اینکه چیا تغییر کرده و چرا تغییر کرده ندارن.تسهیل undo کردن برخی تغییراتایجاد تغییرات تو release note هاهر کدوم از این کاربرد ها نیاز به سبک ثابت commit message ها داره.3. Commit options-m (برای اضافه کردن commit message)git commit -m &amp;quotyour commit message here&amp;quot-a یا --all (add و commit کردن در یک دستور)git commit -a -m &amp;quotyour commit message here&amp;quot--amend (بهت اجازه میده آخرین کامیتت رو اصلاح کنی و تغییرش بدی)git commit --amendنکته: استفاده از amend برای تمیز کردن کامیت های local عالیه و وقتی کارتو انجام دادی، میتونی ورژن آپدیت شده اش رو push کنی. با این حال، بهتره که از تغییر دادن کامیت هایی که قبلا پابلیش کردی، اجتناب کنی.4. چطور commit message های خوبی بنویسم؟اینجا یک تمپلیت عالی برای یک commit message خوب وجود دارد.[optional Ticket-Id] &lt;type&gt;[optional scope]: &lt;description&gt;

[optional body](JIRA-231) feat (dashboard): add sign-out button

----or----

build: update version 

----or----

(JIRA-333) fix (profile): dummy commit

IMPORTANT CHANGE
to show how to add body in the commit5. The commit type can befeat:کامیت هایی که feature جدید اضافه می‌کنند.fix:کامیت هایی که یک باگ رو fix می‌کنند.refactor:کامیت هایی که کد رو باز سازی (یعنی تغییر ساختارش) یا باز نویسی می‌کنند، با این حال تو رفتار و logic کد تغییری ایجاد نمی‌کنند.perf:کامیت هایی که به نوعی میتوان گفت از نوع ویژه refactor commit ها می‌باشند و performance رو بهتر می‌کنند.style:کامیت هایی که رو معنی کد و دستورها تاثیری ندارند (white space, formatting, missing semi-colons, etc)test:کامیت هایی که تست اضافه می‌کنند یا اینکه تست های موجود رو اصلاح می‌کنند.docs:کامیت هایی که فقط برای documentation هستن.build:کامیت هایی که فقط برای فرایند و اجزای ساخت یک پروژه هستند مثل dependency هاش یا مثل ورژن پروژه و ...ops:کامیت هایی که برای اجزای operational یا عملیاتی مثل infrastructure، deployment, backup, recovery و ... هستند.chore :کامیت های متفرقه، مثلا اصلاح کردن gitignore و از این قبیل.6. The commit scope can beیک scope باید از یک نام که توصیف کننده مکان یا section ای هست که کدت رو در اون بخش تغییر دادی، تشکیل بشه و این نام داخل پرانتز قرار بگیره.feat(profile): add button for update call7. تو میتونی از این قوانین برای طراحی کامیت هات استفاده کنیخط subject ات رو به 50 کاراکتر محدود کن.با حروف بزرگ بنویس خطه subject یا description ات رو.آخر خط subject ات نقطه نزارخط subject رو با body به وسیله یک خط خالی جدا کن.تو خط subject ات از افعال امری استفاده کن، برای مثال به‌جای Added feature، بنویس Add featureبخش body ات رو با ۷۲ کاراکتر محدود کن.از body برای توضیح دادن اینکه چیو تغییر دادی و چرا تغییر دادی استفاده کن.8. Final Noteمهمترین بخش یک commit message اینه که اون باید واضح و با معنی باشه.امیدوارم از خوندن این مقاله لذت برده باشید، لطفا با دوستان و همکارانتان به اشتراک بگذارید. همچنین اگر منبعی دارید که به همراه نکات بالا میتونه به شما کمک کنه، لطفا تو کامنت ها باهامون به اشتراک بگذار.منبعالتماس دعا، بسیار سپاسگذارم.</description>
                <category>علی فخاران قمی نژاد</category>
                <author>علی فخاران قمی نژاد</author>
                <pubDate>Sat, 13 Apr 2024 23:21:40 +0330</pubDate>
            </item>
                    <item>
                <title>UUID vs. Sequential ID as Primary Key</title>
                <link>https://virgool.io/codenevis/uuid-vs-sequential-id-as-primary-key-ekcaciznoo3m</link>
                <description>1. Overview:در این آموزش، قصد داریم به تفاوت های بین UUID و Sequential ID به عنوان primary key بپردازیم.هنگام طراحی و چیدن یک دیتابیس، انتخاب نوع primary key مناسب برای performance، scalability، و یکپارچگی داده های آن سیستم حیاتیه.جداول درون دیتابیس باید یک ستون primary key داشته باشن که هم unique باشه و هم null نشه. به این ترتیب، مقدار primary key میتونه به عنوان مقداری منحصر به فرد برای هر ردیف شناخته بشه.یک از تصمیمات اولیه (primary) در انتخاب یک primary key اینه که از UUID استفاده کنیم یا از sequential ID. از آنجا که هر دو رویکرد مزایا و معایبی داره، بهترین گزینه بستگی به use case و هدف مشخص آن سیستم داره.2. UUID:تعریف شده توسط استاندارد RFC 4122، یک UUID (Universally Unique IDentifier) مقدار bit 128 را نشان می‌دهد.امروزه، بیشتر relational database (RDB) ها از تایپ UUID پشتیبانی میکنند:Oracle - the RAW(16) typeSQL Server - the NEWID() functionPostgreSQL - the UUID typeMySQL - the BINARY(16) type or the UUID() functionبا این حال، اگر database چنین تایپی رو ساپورت نکنه، باید آن را به عنوان تایپ BINARY(16) معرفی کنیم. (CHAR(32) هم میتونه به خوبی کار کنه. ولی اون فضای اضافی و غیر ضروری برای ذخیره کردن مقادیر می‌خواد)حالا. بیاید بپردازیم به مزایا و معایب استفاده از UUID به عنوان primary key.2.1. Distributed Systems:یک UUID میتونه تو کار با distributed system ها که database ها را به اشتراک می‌گذارند، کاربردی و مفید باشه.هدف اصلی وجود UUID به عنوان primary key، توانایی انتقال دیتا بین distributed system ها هست.با UUID به عنوان primary key، میتونیم گارانتی کنیم که تصادفی بین primary key ها اتفاق نمی‌افته و نیاز نیست یک سیستم هماهنگی مرکزی برای مدیریت unique بودن primary key ها بسازیم.به علاوه، استفاده از UUID، پیچیدگی integrate کردن بین دیتابیس ها رو کاهش میده.دیتابیس های Distributed و NoSQL (یعنی MongoDB یا CouchDB) از UUID به جای مقادیر عددی برای key هاشون استفاده می‌کنند.2.2. Uniqueness:و UUID ها به صورت global منحصر به فرد هستند. یعنی میتونیم هر ردیف دیتابیسمون رو با یک ID که بین table هامون، دیتابیس هامون و سیستم هامون unique هست تعریف کنیم. مورد دوم خیلی تو distributed system ها مهمه، جایی که ممکنه node ها رو به صورت dynamic حذف یا اضافه کنیم.به علاوه، آنها امنیت بیشتری ارائه میدن چرا که پیش‌بینی مقدار بعدیشون خیلی سخته، بنابراین، این موضوع باعث میشه که حدس زدن ID برای user های مخرب تقریبا غیر‌ممکن باشه.علاوه بر این، آنها اطلاعاتی در مورد business data را در معرض نمایش قرار نمی‌دهند. پس میتونیم به صورت امن ازشون به عنوان بخشی از آدرس URL استفاده کنیم.2.3. Generating the Value:یکی از مزایای دیگر UUID اینه که میتونه توسط اپلیکیشن یا دیتابیس به طور خودکار تولید بشه.معمولا هنگام داشتن sequential ID به دیتابیس سیستممان برای تولید آن و افزایش مقدار primary key به طور خودکار، تکیه می‌کنیم. در غیر این صورت، پیدا کردن مقدار بعدی ای که باید استفاده کنیم (مثلا اینکه بعد از ID یک باید ID دو باشه) کمی پیچیده خواهد بود.با این حال، کنار گذاشتن مسئولیت تولید sequential primary key یک جنبه منفی داره، اونم اینه که ما مقدار ID ردیف جدید رو بعد از اجرا کردن دستور insert می‌گیریم.در حالی که بر عکس می‌تونیم UUID رو تو کدمون بسازیم جای اینکه به دیتابیس بگیم برامون بسازه و از اونجایی که UUID منحصر به فرد و unique هست و به صورت توالی نیست، نیازی نیست که نگران مقادیر قبلی باشیم.بنابراین، میتونیم بلافاصله مقدار primary key رو داشته باشیم و نمی‌خواد صبر کنیم تا کوئری insert اجرا بشه.2.4. Memory Usage:سایز UUID صد و بیست و هشت بیت هست، که دو برابر سایز یک BIGINT و چهار برابر سایز INTEGER میشه.تو RDB ها معمولا از BIGINT برای ذخیره کردن شناسه های عددی استفاده می‌کنیم، و این کار ممکنه تفاوت بزرگی رقم نزنه چرا که UUID تنها دو برابر بزرگ تره.با این حال، داشتن یک primary key بزرگ ممکنه منجر به مشکلات performance بشه، به خصوص وقتی که صحبت از query های select و indexing میشه.2.5. Readability:یک UUID از سی و دو hex digit که با چهار تا dash از هم جدا شدن تشکیل شده، که حفظ کردنش رو مشکل می‌کنه.بنابراین، نمایش یک UUID ممکنه user-friendly در نظر گرفته نشه و ممکنه به سختی قابل بیان باشه و خواندن و به خاطر سپردن آن راحت نیست.از طرف دیگه، sequential ID ها خوندن و حفظ کردنشون راحته.با این حال، این سؤال جای بحث داره که آیا مقدار ID باید قابل خوندن برای انسان ها باشه یا نه.2.6. Sorting:یک عیب دیگر این است که ما نمی‌توانیم به طور طبیعی UUID ها رو sort کنیم.به خاطر محدودیتشون، ممکنه مجبور شیم از یک column دیگه هم استفاده کنیم. برای مثال، ستون   created_at که نشانگر زمان ساخت آن آیتم می باشد، می‌تونه برای دستیابی به آیتم های sort شده استفاده بشه. بنابراین، این امکان وجود داره که زمان اجرای هر query افزایش پیدا کنه.3. Sequential ID:و sequence به نوع مشخصی از یک شی، که مقادیر unique و مرتب شده ای ایجاد می کند، اشاره دارد. که معمولا به عنوان شناسه‌ی هر رکورد در دیتابیس استفاده می‌شود.به علاوه، ما میتونیم فقط از شناسه های عددی در sequence استفاده کنیم که هر بار که تولید میشن مقدارشون افزایش پیدا کنه، روندی که برای تایپ UUID متفاوته و آنها ذاتا مرتب و sequential نیستند و معمولا با استفاده از الگوریتم هایی که تضمین می‌کند یک UUID در سراسر دیتابیس unique هست تولید می‌شوند. به همین دلیل دنباله ها برای تولید مقادیر عددی مرتب طراحی شده اند و آنها برای تولید UUID ها به دلیل ماهیت غیر مرتبشان مناسب نیستند.sequential ID ها معمولا به UUID ها ترجیح داده میشن چرا که اونا به فضای کمتری نیاز دارند.دیتابیس ها به طور طبیعی از sequential ID پشتیبانی می‌کنند:PostgreSQL – SERIALSQL Server – IDENTITYMySQL – AUTO_INCREMENTSQLite – AUTOINCREMENTبیاید یک نگاهی به مزایا و معایب استفاده از sequential ID به عنوان primary key، بیندازیم.3.1. Readability:بر خلاف مقادیر UUID، شناسه های عددی، خواندن و به خاطر سپردنشان راحت تر است.با شناسه های عددی میتونیم به راحتی ترتیب رکورد ها در دیتابیس را بیابیم.به علاوه، میتونیم سریعا رابطه بین رکورد ها رو بر اساس ID هاشون شناسایی کنیم.3.2. Indexing:ما اغلب از index های primary key ها و foreign key ها استفاده میکنیم تا query های select و join رو سریع تر کنیم.بعضی از دیتابیس ها از ساختار B+Tree برای index گذاری کردن استفاده می‌کنند. در حالی که برخی دیگر مانند SQL و MySQL، از clustered indexe ها بهره می‌گیرند.علاوه بر این، مقادیر UUID به خوبی index بندی نمی‌شوند. هر چه کلید ها طولانی تر باشند، این امر، رم بیشتری اشغال می‌کند.به علاوه، UUID ها از آنجا که مقادیرشون رندوم هست، فاکتور های کمی برای index گذاری شدن را دارند. هر وقت که یک جدول را اصلاح می‌کنیم، index های آن باید آپدیت شوند. که این موضوع میتونه روی performance سیستممون مؤثر باشه و بیهوده از رم استفاده کنه.افزون بر این موضوع، ما همچنین میتونیم foreign key ها را هم برای جداول join شده index گذاری کنیم. که اگر این کار را با UUID ها بکنیم یک ضربه دیگری به performanceمون میخوره.3.3. Batch Actionsو Batch actions ها به پروسه اجرای چندین عملیات دیتابیس به عنوان single unit of work (به این معنا که تمام عملیات دیتابیس در batch به عنوان یک موجودیت منسجم رفتار می‌کند که به این معنی است که یا همه عملیات ها با موفقیت انجام می‌شوند یا هیچکدام از آنها انجام نمی‌شود) اشاره دارند.یکی از دلایل اینکه چرا batch action ها با sequential ID ها بهتر کار میکنن اینه که اونا به شکل یک دنباله‌ی قابل پیش‌بینی تولید میشن و چندین عملیات دیتابیس میتونه در قالب یک batch اجرا بشه. که performance سیستم رو بهینه می‌کنه.primary key ها به ترتیبی قابل پیش‌بینی تولید میشن و رکورد های جدید به انتهای دنباله آن اضافه می‌شوند. این موضوع این امکان را فراهم میکنه که بتونیم از انواع مشخص query ها استفاده کنیم. مثل range query ها که نیاز دارند رکورد ها با primery keyشون sort شده باشند.به علاوه، sequential ID ها به مراتب کوتاه تر و کم حجم تر از UUID ها هستند که این موضوع باعث بهبود performance سیستم با کاهش مقدار حافظه‌ی مورد نیاز، می‌شود.با این حال، اینم مهمه که احتمال زیاد تداخل در دنباله را هنگام استفاده از sequential ID ها درdistributed system ها در نظر بگیری. در این سناریو، استفاده از UUID ها به عنوان primary key میتونه گزینه بهتری باشه.3.4. Predictableشناسه های دنباله از یک ساختار مشخص که آنها را قابل پیش‌بینی می‌سازد پیروی می‌کنند.این ممکنه به کاربران مخرب این اجازه رو بده که اطلاعاتی رو بخونن که نباید در اختیارشون باشه.ما ممکنه در نهایت برخی private data ها و business logic رو به طور غیر عمدی در معرض نمایش قرار دهیم. برای مثال، اخرین ID میتونه نشان دهنده تعداد کل فاکتور های ساخته شده توسط یک کاربر باشه که میتونه اطلاعات درآمد رو آشکار کنه.3.5. Concurrencyهمانطور که پیش‌تر ذکر کردم، تولید sequntial ID توسط app میتونه پیچیده باشه. برای ساخت ID، ما باید از دیتابیس بخواهیم تا مقدار موجود بعدی رو پیدا کنه.در distributed system ها، جایی که بیش از یک system دیتا رو به دیتابیس insert می‌کنه، این مسئله به این معناس که ما ممکنه در نهایت تو دیتاهامون تداخل داشته باشیم و این احتمال وجود داره که سیستم های مختلف یک key مشابه بسازن.برای حل این مشکل، ما نیاز داریم سرویس های مختلفی برای تولید sequential value بسازیم. به علاوه، همان سرویس میتونه به تنها نقطه ضعف تبدیل بشه.3.6. Size Limit:در آخر، sequential ID ها محدودیت اندازه دارند، گر چه مقدار max آنها خیلی بزرگه، ولی بازم احتمال تموم شدنشون وجود داره.اگر ما داریم از INT به عنوان primary key استفاده میکنیم، در نهایت، میتونیم به عدد 2.147.483.647 برسیم.که میتونه دلیل ارور های بی سرو صدای زیادی باشه. بنابراین، میتونیم در نهایت مقادیر منفی به عنوان primary key داشته باشیم.4. Difference Between UUID and Sequential ID:برای جمع‌بندی، جدول زیر تفاوت بین UUID و Sequential ID را نشون میده:تفاوت بین UUID و Sequential ID5. Conclusion:در این آموزش، ما تفاوت بین UUID و Sequential ID ها رو یاد گرفتیم.در نتیجه، استفاده از UUID یا sequential ID به عنوان primary key بستگی به use case و هدف مشخص سیستمت داره.اگر ما با distributed system ها کار می‌کنیم و به global uniquness نیاز داریم، UUID ممکنه بهترین انتخاب باشه. در سمت دیگر، اگر ما محدودیت حافظه داریم و performance اجرای query ها حیاتیه، بهترین گزینه میتونه sequential ID ها باشه.در نهایت، انتخاب primary key باید با ارزیابی دقیق  الزامات و محدودیت های سیستممان انجام شود.با مقداری تاخیر، عیدتان مبارک.حقیر را از دعای خیرتان بی‌نصیب نکنید.اگر سوالی داشتید، در کامنت ها عرض کنید. بنده در خدمتم.منبع</description>
                <category>علی فخاران قمی نژاد</category>
                <author>علی فخاران قمی نژاد</author>
                <pubDate>Thu, 11 Apr 2024 17:04:02 +0330</pubDate>
            </item>
                    <item>
                <title>10 مورد از برجسته ترین کاربرد های Redis</title>
                <link>https://virgool.io/sabertabatabaee/10-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B2-%D8%A8%D8%B1%D8%AC%D8%B3%D8%AA%D9%87-%D8%AA%D8%B1%DB%8C%D9%86-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-%D9%87%D8%A7%DB%8C-redis-quvukzbqnjfi</link>
                <description>ردیس یک پایگاه داده هدفمنده که دیتا رو تو مموری یا رم ذخیره می‌کنه که این ذخیره‌سازی رو در قالب key و value انجام میده. اغلب به عنوان کش یا message broker یا برای آنالیز های real-time استفاده میشه.یک از مزایای اصلی ردیس performance خوب اونه. و این کارایی خوب به این دلیله که دیتا رو به‌جای دیسک روی رم ذخیره می‌کنه و میتونه خیلی سریع دیتا رو retrieve یا write کنه. ردیس برای use case هایی که نیاز به دسترسی سریع به دیتا دارن خیلی مناسبه. مثل آنالیز real-time یا cache بودن برای database.Redisردیس همچنین یک گستره بزرگی از انواع داده ها رو هم support می‌کنه که شامل string ها، هش ها، لیست ها، مجموعه ها و مجموعه های مرتب شده میشه. این باعث میشه که اونو منعطف کنه به طوری که بشه از اون تو طیف وسیعی از اپلیکیشن های مختلف استفاده کرد.علاوه بر توانایی ذخیره دیتا روی مموری یا رم، ردیس persistence هست. یعنی اون میتونه دیتا رو روی disk save کنه تا حتی بعد از restart یا crash هم دیتا رو بازیابی کنه.در کل، ردیس یک ابزار سریع و قدرتمنده که به طور گسترده در توسعه اپلیکیشن های مدرن استفاده میشه.اگر می‌خوای تو stack خودت از ردیس استفاده کنی، اینجا ۱۰ تا از کاربرد های مفیدش وجود داره:Caching:ردیس اغلب به عنوان کش استفاده میشه تا دسترسی به  دیتای ذخیره شده روی database یا سرویس backend رو سریع تر کنه.Real-time analytics:ردیس میتونه برای ذخیره یا پردازش مقدار عظیمی از دیتا در لحظه استفاده بشه که برای استفاده تو اپلیکیشن هایی که نیازمند آنالیز سریع هستند مناسبه.Queuing:ردیس میتونه به عنوان یک message queue استفاده بشه تا ارتباط بین بخش های مختلف یک اپلیکیشن یا ارتباط بین اپلیکیشن های مختلف رو تسهیل کنه.Leaderboards:پشتیبانی ردیس از performance بالای مجموعه های sort شده باعث میشه اون برای ساخت leaderboard ها یا دیگر ranking system ها مناسب باشه.Full-text search:ردیس میتونه برای ذخیره کردن و index بندی کردن حجم وسیعی از دیتا های متنی واسه‌ی جستجو سریع متن استفاده بشه.Geospatial data:ردیس از ذخیره کردن و query زدن به داده های جغرافیایی پشتیبانی میکنه که این موضوع اون رو برای اپلیکیشن هایی که نیاز به کار با دیتا های جغرافیایی دارن کارآمد میکنه.Pub/sub:فانکشنالیتی publish/subscribe ردیس میتونه برای ایجاد نوتیفیکیشن های real-time یا سیستم های پیامرسان استفاده بشه.Session storage:ردیس میتونه برای ذخیره دیتای session کاربر تو web application ها استفاده بشه که به شما اجازه مدیریت session ها به شکل سریع و scalable رو میده.Data expiry:پشتیبانی ردیس از ایجاد key هایی با تاریخ انقضا، اونو برای ذخیره کردن موقت دیتایی که باید به طور   automatic بعد از یک مدتی دیلیت شه، کارآمد میکنه.Distributed locks:ردیس میتونه برای اجرای distributed lock ها هم استفاده بشه که به شما این اجازه رو میده که فعالیت های بخش های مختلف یک اپلیکیشن رو هماهنگ و سینک کنی.وبسایت رسمی ردیس: https://redis.io</description>
                <category>علی فخاران قمی نژاد</category>
                <author>علی فخاران قمی نژاد</author>
                <pubDate>Tue, 09 Apr 2024 01:22:07 +0330</pubDate>
            </item>
            </channel>
</rss>