<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های جعفر آخوندعلی</title>
        <link>https://virgool.io/feed/@jafar.akhondali</link>
        <description>یه برنامه نویس دیگه، که استاد از این شاخه به اون شاخه پریدن توی زمینه های مختلفه https://akhondali.ir</description>
        <language>fa</language>
        <pubDate>2026-06-10 13:08:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/242298/avatar/utUtnw.png?height=120&amp;width=120</url>
            <title>جعفر آخوندعلی</title>
            <link>https://virgool.io/@jafar.akhondali</link>
        </image>

                    <item>
                <title>نیمه‌ی تاریک MongoDB - نکاتی که بهتره قبل از استفاده بدونید.</title>
                <link>https://virgool.io/@jafar.akhondali/%D9%86%DB%8C%D9%85%D9%87-%DB%8C-%D8%AA%D8%A7%D8%B1%DB%8C%DA%A9-mongodb-%D9%86%DA%A9%D8%A7%D8%AA%DB%8C-%DA%A9%D9%87-%D8%A8%D9%87%D8%AA%D8%B1%D9%87-%D9%82%D8%A8%D9%84-%D8%A7%D8%B2-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A8%D8%AF%D9%88%D9%86%DB%8C%D8%AF-wnp0rxobfrul</link>
                <description>این مقاله رو اول در  Medium نوشتم و با توجه به بازخورد در Reddit و درخواست دوستان تصمیم گرفتم به زبان فارسی هم منتشر کنم.خب قضیه اینطوریه که همین الان شما عبارت Top web stacks 2021 رو گوگل کنید چندینجا پیشنهاد  میدن از دیتابیس Mongo استفاده کنید‌ که این استک ها با اسم های MERN-MEAN-MEVN بیشتر شناخته شده هستن. قطعا Mongo کلی نکته باحال داره و اگر درجای درست استفاده بشه میتونه خیلی هم مفید باشه، اما ایراد اینجاست که اکثرا متوجه نیستن اگر این دیتابیس به عنوان دیتابیس اصلی یک برنامه استفاده بشه چه مشکلاتی میتونه ایجاد کنه. همونطور که میدونید، Mongo یک نوع دیتابیس NOSQL مبتنی بر document هست. معنی مبتنی بر document اینه که شما لزوما نیازی نیست برای داده ها رابطه تعریف کنید. میتونید دیتای مربوط به یک موجودیت رو داخل یک json درهم ذخیره کنین. این خاصیت، که تقریبا به عنوان ذخیره سازی de-normalized هم شناخته میشه یکی از خاصیت های اصلی Mongo هست. البته Mongo به شما این اجازه رو میده که دیتا رو به صورت normalized (مثل دیتابیس های sql ای) ذخیره کنید، ولی خب این راه هم مشکلات خودش رو داره.سوال: چرا روش denormalized میتونه بد باشه؟مثال از روش denormalized ذخیره دیتا از سایت mongoمعمولا هدف اصلی از ذخیره داده بصورت de-normalize بهینه سازی کوئری های خوندن با حذف کردن در خواست های join هست. اما خب این روش زمانی مناسب هست که فیلد های داخلی (مثل contact و address در مثال بالا) رو تنها زمانی نیاز داشته باشیم که کل موجودیت کاربر رو بگیریم. پس اگر بخوایم فیلد های داخلی رو جداگونه دریافت کنیم، دریافتشون کمی مشکلزا میشه.سوال: اگه فیلد های داخلی یک موجودیت رو بصورت مجزا نیاز داشتیم چیکا کنیم؟توی این حالت، Mongo توصیه میکنه که از روش normalized استفاده کنین، که دقیقا مثل دیتابیس های sql ای ساده شهرستانی میشه.مثال از روش normalized ذخیره دیتا از سایت رسمی Mongo توی یک محیط واقعی، اکثر اوقات شما نیاز دارین به این کالکشن ها بصورت مجزا دسترسی داشته باشین، که در این حالت Mongo هیچ برتری ای نسبت به یک پایگاه داده Sql ای به شما نمیده، اما این اتمام ماجرا نیست. اگر شما از روش normalized استفاده کنین، بازدهی دیتابیس هم پایین تر میاد! چراکه استفاده از Join چیزی هست که دیتابیس های SQL ای براش ساخته شده و Mongo قابلیت $lookup رو در ورژن ۳.۲ معرفی کرده که در sharding هم محدودیت هایی داره.بازدهیخیلی از توسعه دهنده ها فکر میکنن بازدهی Mongo خیلی خیلی بالاست. هرچند که مفهوم بازدهی خودش جای بحث داره و شاید مقایسه درست نباشه، ۲ تا از benchmark های معروف رو اینجا میزارم.اینجا arangoDB یک سری دیتابیس رو باهم مقایسه کرده:و اینجا هم یک مقایسه دیگه از سایت enterpriseDB که بازدهی خوندن دیتا توی Mongo و Postgres رو با thread های موازی مقایسه کرده:همونطور که میبینید، اگر بازدهی خیلی براتون مهم هست، ممکنه Mongo براتون انتخاب مناسبی نباشه.Transactions: ACID (Atomicity, Consistency, Isolation, Durability)(هرچقدر تلاش کردم عنوان بالا رو فارسی کنم نشد، به بزرگی خودتون ببخشین )مدیریت Transaction که اجازه میده دیتا رو به حالت قبل برگردونین و از RC جلوگیری کنین و .... یکی از قابلیت های خیلی واجب برای هردیتابیسی هست که به شدت در نرمافزار های تجاری استفاده میشه و وقتی دیتا ارزشمند هست، کاملا بهش نیازمند میشیم.دیتابیس Mongo از ورژن ۴ قابلیت Transactions API رو اضافه کرد، که در نگاه اول خیلی جذاب بود. اما خیلی هشدار بزرگ قرمز رنگ توی داکیومنت Mongo وجود داره که میگه:مهم: در اکثر حالات، نوشتن در transaction هایی که شامل چند document میشن باعث پایین اومدن بازدهی نسب به دیتا های تک document ای میشه. همچنین نباید دردسترس بودن transaction هایی که شامل چند داکیومنت هستن برای طراحی بهینه الگو دیتا جایگزین بشه....ولی این اتمام ماجرا نیست!شما برای استفاده از Transcations API به Replicaset هم نیاز دارید !! یعنی اگر از transaction روی یک سرور از Mongo استفاده کنید به خطا میخورید !‌ محدودیت های زیادی هست که باعث میشه شما در استفاده از Transcations API به‌کل پشیمون بشید.طراحی منعطفیکی دیگه از مواردی که Mongo خیلی بهش مینازه، طراحی داکیومنت ها بدون ساختار محدودیت هست که خب زمانی که بخوایم از ساختار de-normalized استفاده کنیم، میتونه جذاب باشه. اما این قابلیت باعث میشه هر نوع دیتا ای خواستین بتونین وارد کنین. با این فیچر (یا باگ؟) شما صحت سنجی داده در لایه دیتابیس رو از دست میدین و هرچیزی باید دوبار د لایه اپلیکیشن چک بشه.به ازای هر تغییر در ساختار دیتا، توصیه میشه یک migration ایجاد بشه که کل دیتا یک ساختار رو بگیره، درغیر اینصورت مجبور میشید کلی if-else کثیف توی کد جاساز کنین که یکم فاجعه میشه.واقعا Mongo انقد بده؟نه،  Mongo هم مثل هر تکنولوژی(یا هرچیزی) معایب و مزایا خودش رو داره. نمیشه بگیم پایگاه داده بدی هست، اما بنظر من، Mongo نباید به عنوان دیتابیس اصلی یک نرم افزار استفاده بشه مگر اینکه توسعه دهنده دقیقا بدونه اپلیکیشن اش قراره چیکار کنه و از تمام نقاط ضعف Mongo آگاه باشه.بقیه درمورد Mongo چه فکری میکنن؟خیلی از بلاگ های خوشکل توسعه دهنده پسند، میگن عالیه و خوراکه ME*N استکه. خیلی وقتا هم میگن چون کل استک جاوا اسکریپت هست و همجا میشه جاوا اسکریپت استفاده کرد، باید دیتابیس هم جاوا اسکریپت باشه!! این حرف مثل این میمونه که بگیم چون رابطه روی تمام جنسیت ها قابل انجام هست، حتما باید داشته باشیمش.هرچیزی جای خودش رو داره و نمیشه برای هر نرم افزاری یه نسخه پیچید. انتخاب تکنولوژی استک،  حکم پی ساختمون رو داره و خیلی مهمه بر اساس چه پارامتر های تعیین بشه. هدف پروژه، نیروی انسانی موجود، بودجه، زمان پیاده سازی و ... پارامتر های مهمی هستن که حتما باید در شروع پروژه خوب بررسی بشن.در آخر، چند تجربه از کسانی که درد مشترک استفاده از Mongo رو چشیدن رو اینجا میزارم:Why you should never, ever, ever use MongoDBWhich companies have moved away from MongoDB and why? What did they move to?PostgreSQL vs MongoDBWhy we Moved From NoSQL MongoDB to PostgreSQL</description>
                <category>جعفر آخوندعلی</category>
                <author>جعفر آخوندعلی</author>
                <pubDate>Mon, 05 Apr 2021 12:39:50 +0430</pubDate>
            </item>
                    <item>
                <title>بهینه سازی سریع عکس ها در ترمینال گنو/لینوکس</title>
                <link>https://virgool.io/@jafar.akhondali/%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%B9%DA%A9%D8%B3-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84-%DA%AF%D9%86%D9%88%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-of1vmbxjxg1p</link>
                <description>سلام، با یه پست شیرازی دیگه در خدمت شما هستممعمولا عکس ها بیشترین حجم توی وبسایت هارو میگیرن. با پر حجم بودن عکس ها هم لود سایت میاد پایین، هم برای سئو بد میشه و هم بار روی سرور بیشتر میشه.من قبلا از سرویس هایی مثل tinypng برای بهینه سازی عکس استفاده میکردم، ولی عیبش اینه که هم محدودیت داره، هم اینکه باید دونه دونه فایل هارو آپلود و دانلود کنیم.برای حل این مشکل، حدود ۱۰ تا ابزار مختلف رو روی فرمت های  png و jpg تست کردم و بهترین ابزار برای هر فرمت رو پیدا کردم. یه مشکلی این ابزار ها داشتن این بود که نمیشد روی هر تمام فایل های یه مسیر اجراشون کنم و باید دستی انجام میدادم، پس اومدم با استفاده از دستور parallel، یه اسکریپت کوچیک bash نوشتم که روی تمام عکس ها با استفاده از تمام هسته های CPU، کاره فشرده سازی رو انجام بده.برای مثال، عکس زیر با ابعاد 1920x1080 قبل از فشرده سازی 863kb حجم داشت:قبل از عمل - اندازه 863kbو بعد از فشرده سازی با انتخاب ۷۰٪ کیفیت (که هنوز هم محسوس نیست) در 0.06 ثانیه، فقط 304kb حجم گرفت:بعد از عمل - انداره 304kbکار کردن با این برنامه هم شیرازی آماده شده با چندتا آپشن کوچولو:Usage: tapnesh [-q|--quality &lt;arg&gt;] [-R|--(no-)recursive] [-v|--(no-)verbose] [-k|--(no-)keep] [-h|--help] &lt;path&gt;        &lt;path&gt;: Path to directory for optimization        -q, --quality: Sets quality for optimized images, can be a value from 1 to 100. (100 means lossless optimization) (default: &#x27;80&#x27;)        -R, --recursive, --no-recursive: Do recursive (off by default)        -v, --verbose, --no-verbose: Be verbose (off by default)        -k, --keep, --no-keep: Keep old files (off by default)        -h, --help: Prints helpکد برنامه به همراه روش نصب و مثال های بیشتر رو گذاشتم توی گیتهاب:https://github.com/JafarAkhondali/Tapneshاگر به کارتون اومد یک ستاره به گیتهاب این حقیر عنایت بفرمایید</description>
                <category>جعفر آخوندعلی</category>
                <author>جعفر آخوندعلی</author>
                <pubDate>Sun, 13 Sep 2020 19:17:59 +0430</pubDate>
            </item>
                    <item>
                <title>چطوری به ریش سامانه دانشگاهی سما بخندیم؟</title>
                <link>https://virgool.io/@jafar.akhondali/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B1%DB%8C%D8%B4-%D8%B3%D8%A7%D9%85%D8%A7%D9%86%D9%87-%D8%AF%D8%A7%D9%86%D8%B4%DA%AF%D8%A7%D9%87%DB%8C-%D8%B3%D9%85%D8%A7-%D8%A8%D8%AE%D9%86%D8%AF%DB%8C%D9%85-t39xdkegm5lo</link>
                <description>اگه دانشگاه شما هم از سامانه سما برای مثلا اتوماسیون اش استفاده میکنه، ما با هم همدردیم.جدای از سرعت فوق العاده وحشتناک پایینش، ۲ تا ایراد خیلی بزرگ داشت که واقعا روی مخم بود:آخر ترم باید بصورت اجباری فرم نظر سنجی اساتید رو پر کنیم.نمیشه برنامه هفتگی کلاسا به تفکیک روز ببینیم.این نظر سنجی اساتید خیلی ظلم بود، باید کلی سوال چهارگزینه ای رو برای کلی استاد دونه دونه انتخاب میکردیم!!!  از اونجایی که من اصالتا اهوازیم ولی صفتا شیرازی، تصمیم گرفتم یه افزونه برای مرورگر بنویسم که این کار هارو برام انجام بده‌.کار باهاش خیلی کشکه، برای اینکه نظرسنجی اساتید رو پر کنید کافی برید توی صفحه سوالات، و فقط بگید چند درصد با این استاد حل میکنین و تامام.برای دیدن برنامه درسیتون کافیه برید توی بخش درس هایی که گرفتین، و از منو مرورگر روی آیکون افزونه کلیک کنین و گزینه ساخت برنامه درسی رو بزنید.اگه بهم اعتماد دارین، میتونین اینشکلی نصبش کنین:برای نصب روی مرورگر کروم ( یا اونایی که از کروم گرفته شدن مثل Opera، brave یا Chromium) میتونید مستقیم از store دانلود کنید.برای نصب توی مرورگر فایرفاکس هم میتونید این فایل رو مستقیم بندازین توی مرورگر.اگرم بهم اعتماد ندارین کدش رو گذاشتم توی گیتهاب و میتونید مستقیم توی مرورگر هاتون فراخوانی اش کنید.برای حمایت یادتون نره ستاره بدین پی نوشت: کد این برنامه حدود ۳ سال پیش نوشته شده و فقط برای دانشگاه شهید چمران اهواز تست شده. اگر با سیستم دانشگاهی شما سازگار نبود لطفا یه issue روی گیتهاب بزنید و یا خودتون زحمت فیکسش رو بکشید. فقط تکرار میکنم، کد ماله بیش از ۳ سال پیشه‌ :))</description>
                <category>جعفر آخوندعلی</category>
                <author>جعفر آخوندعلی</author>
                <pubDate>Mon, 07 Sep 2020 12:13:22 +0430</pubDate>
            </item>
                    <item>
                <title>رمزنگاری چیست، که بود و چه کرد؟</title>
                <link>https://virgool.io/@jafar.akhondali/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D8%A7%D8%AA-%D8%B1%D9%85%D8%B2%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-g0k60qjouppk</link>
                <description>مباحث امنیت و رمزنگاری از جمله مباحثی هستن که اگر توسعه دهنده باشید حتما باهاشون درگیر میشین، ولی ممکنه زمان کافی برای جستجو دربارش نداشته باشین. هدفم اینه که سعی کنم توی یک سری پست ابتدا مفاهیم اولیه اش رو باهم بررسی کنیم و بدون اینکه درگیر ریاضیات خیلی پیچیده بشیم، کم کم با مسائل، حملات و کاربردهاش دست و پنجه نرم کنیم.این مطالب به درد کیا میخوره؟برای توسعه دهنده ها، مخصوصا Backend کاراافرادی که به رمزنگاری علاقه دارنافرادی که میخوان توی مسابقات CTF شرکت کننبچه ها Pentesterتعاریف (در تعاریف برای سادگی فرض میکنیم داده ها متن هستن):رمزنگاری | Cryptography:تبدیل متن از حالت خوانا به حالت رمزشده با استفاده از کلید بطوری که بدون کلید به راحتی نتونیم به حالت خوانا دسترسی پیدا کنیم.متن آشکار | حالت خوانا |‌ PlainText:حالت عادی و خوانای اصلی متن. یعنی متنی که هیچ گونه عملیات رمزنگاری ای روش انجام نشدهمتن رمز شده | حالت ناخوانا |‌ CipherText:حالت رمزشده و ناخوانای متن بعد از رمزنگاری. یعنی متنی اصلی ای که با استفاده از کلید، عملیات رمزنگاری ای روش انجام شده.کلید |‌ Key | Secret:رمزی که برای تبدیل متن خوانا به متن ناخوانا و یا برعکس استفاده میشه. معمولا کلید باید تنها بخش نامعلوم الگوریتم باشه.کدگزاری‌ |‌ Encoding:مشابه رمزنگاری، اما بدون استفاده از کلید‌ (در ادامه بیشتر صحبت میکنیم).کدگشایی |‌ Decoding:مشابه رمزگشایی، اما بدون استفاده از کلید‌ (در ادامه بیشتر صحبت میکنیم).درهم سازی |‌ Hashing:یک نوع روش رمزنگاریه یک طرفه، که میتونه برای اهداف مختلف بدون کلید هم استفاده بشه.پنهان نگاری |‌ Steganography:بر خلاف رمزنگاری که هدف ناخوانا کردن متن هست، در پنهان نگاری هدف مخفی کردن متن توی یه چیزه دیگه هست،‌ به شکلی که اگر یکی اون چیز رو ببینه متوجه وجود (یا متن اصلی) متن مخفی شده نشه!مطالعات رمز |‌Cryptoanalysis:به علم رسیدن به متن خوانا، بدون تست کردن تمام حالت های کلید مطالعات رمز میگن. معمولا اینکار بر اساس پیدا کردن نقطه ضعف در روش الگوریتم رمزنگاری انجام میشه.کرک |‌ شکستن رمز | Crack | Brute force:به روش رسیدن به متن خوانا، با تلاش برای تست کردن تمام حالت های کلید کرک کردن میگن. بعضی وقت ها توی این روش سعی میشه از یک سری کلماتی که احتمال استفادشون بیشتر هست استفاده بشه.مبهم سازی |‌ Obfuscation:در مبهم سازی معمولا هدف اینه که نحوه انجام یک کاری رو، به قدری پیچیده کنیم که مشخص نشه هدف و نحوه انجامش چطوری بوده. البته در رمزنگاری، مبهم سازی الگوریتم حرام است که بعدا بیشتر توضیح میدیم.فرق بین رمزنگاری و کدگزاری چیه ؟!کدگزاری معمولا با رمزنگاری اشتباه گرفته میشه که کاملا متفاوت هست. توی رمزنگاری معمولا هدف، ناخوانا کردن متن با کلید هست بطوری که دیگران بدون دونستن کلید نتونن به متن اصلی برسن. اما توی کدگزاری از هیچ کلیدی استفاده نمیشه چون معمولا هدف، کد کردن متن به روش دیگه ای هست که برای فضای دیگه ای قابل فهم باشه. مثلا اگر یک متن رو از فارسی به انگلیسی ترجمه کنیم، یک کدگزاری انجام شده. چون هدف مخفی کردن کلید نبوده و میخواستیم برای کسایی که انگلیسی متوجه میشن متن رو بنویسیم،‌ هرچند ممکنه بقیه که انگلیسی بلد نیستن فکر کنن متن رمز شده هست!تاریخچه‌:رمزنگاری معمولا برای مخفی کردن پیام های سری بود، یعنی تغییر ظاهر پیام جوری که هیچکس بدون داشتن کلید مورد نظر نتونه به متن اصلی برسه. بخاطر طولانی نشدن مطلب خیلی در مورد تاریخ صحبت نمیکنم و یک مثال ساده رو بررسی میکنیم.معمولا اولین مثالی که توی رمزنگاری های قدیمی مطرح میشه، مثال رمزنگاری سزار هست. سزار برای اینکه پیام های مهمش رو ارسال کنه، همیشه اونها رو با روش ابداعی خودش رمز میکرد. اینکار باعث میشد که اگر پیامش به دشمناش برسه و اونها فکر کنن پیام به یک زبان خارجی نوشته شده که اونها بلد نیستن.رمزنگاری سزار خیلی خیلی ساده هست. برای رمزنگاری کافیه که شماره هر حرف در زبان انگلیسی رو ۳ حرف شیفت بدین. مثلا هروقت حرف A رو دیدید، بجاش حرف D بزارید. هر وقت B دیدید، E بزارید و .... اینجا کلید در توی عملیات ما ۳ هست. که میتونه عوض بشه. برای ۳ حرف آخر هم بر میگردیم از اول حرف رو انتخاب میکنیم. یعنی رمز کردن حرف X با کلید ۳ میشه حرف A.tutorialspoint.comس از رمزگشایی هم که بدیهیه، کافیه معکوس عملیات انجام بشه. یعنی بجای D، حرف A رو قرار بدید و ...در ادامه سعی میکنیم هر مبحثی که گفته شد رو با مثال و سوال های رمزنگاری بر اساس مسابقات Ctf و مباحث مورد نیاز توی توسعه نرم افزار بررسی کنیم.این نوشته اولین در بلاگ شخصی من منتشر شد.</description>
                <category>جعفر آخوندعلی</category>
                <author>جعفر آخوندعلی</author>
                <pubDate>Mon, 03 Aug 2020 23:33:39 +0430</pubDate>
            </item>
            </channel>
</rss>