<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mahdi Razavi</title>
        <link>https://virgool.io/feed/@m-razavi</link>
        <description>A software developer who enjoys technical challenges. An inquisitive mind with a thirst for knowledge…</description>
        <language>fa</language>
        <pubDate>2026-04-14 18:35:34</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/9249/avatar/yn7sWI.png?height=120&amp;width=120</url>
            <title>Mahdi Razavi</title>
            <link>https://virgool.io/@m-razavi</link>
        </image>

                    <item>
                <title>راه اندازی MacBook  برای برنامه نویسی</title>
                <link>https://virgool.io/codenevis/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-macbook-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-wrlklf8i6ekx</link>
                <description>قبلا چند نوشته ای برای سفارشی سازی Ubuntu به عنوان محیط توسعه جدید نوشته بودم که استقبال خوبی هم شده بود. اخیرا استفاده از Macbook به خاطر پرفورمنس فوق العاده پردازنده های سری M به عنوان محیط توسعه در ایران بیشتر شده و خوب جای خالی یک راهنمای کاربردی برای شروع حس میشه. البته فرض میکنم که تنظیمات اولیه مثل ساخت user و اتصال به WIFI و  وارد شدن به appleID فعال کردن  FindMy و FileVault  و ... را انجام دادید. از آخرین نوشته ام در ویرگول چند سالی میگذره و احتمالا این هم آخرینش باشه، ولی میتونین من را در medium دنبال کنید چون معمولا اونجا مینویسم.محیط گرافیکی  و ابزارهافرض را بر این میگذارم که از محیط ویندوز مهاجرت میکنید. پس بهتره با تغییرات ظاهری محیط جدید آشنا بشیم:نوار بالای صفحه یا Menu Barدر بالای صفحه نمایش، نوار منو قرار دارد که شامل منوهای مربوط به برنامههای باز شده و همچنین منوهای سیستمی مانند ساعت، وضعیت وایفای، باتری و غیره میباشد.مرکز کنترل (Control Center)  برای دسترسی سریع به تنظیماتی مانند روشنایی صفحه، حالت هواپیما، وایفای و بلوتوث، کافی است روی نماد مرکز کنترل در نوار منو سمت چپ کلیک کنید.مرکز اعلانها (Notification Center)تمام اعلانهای برنامهها و هشدارهای سیستم در مرکز اعلانها نمایش داده میشوند که با کلیک روی ساعت/تاریخ  باز میشود.نوار پایین صفحه یا The Dockداک یک نوار کناری است که آیکون برنامههای در حال اجرا و دیگر برنامههای منتخب را نمایش میدهد. میتوانید برنامهها را از آنجا اجرا کنید.نوار سرچ یا (Spotlight)اسپاتلایت یک ابزار جستجوی قدرتمند است که با فشردن کلیدهای Command+Space فعال میشود. میتوانید در فایلها، برنامهها، تنظیمات سیستم و اینترنت جستجو کنید.دستیار صوتی اپل یا Siri یکی از نقاط قوت سیستم عاملهای اپل همین دستیار صوتی یعنی سیری  بوده است. عملکرد این دستیار صوتی دقیقا مانند ایفون است و شما از طریق  ایفون سیری در بالا سمت راست منو بار میتوانید به این دستیار صوتی دسترسی  داشته باشید.برنامه ها برای  دسترسی به اپلیکیشنهای نصب شده خود باید وارد پوشه Applications در Finder شوید یا Launchpad را  در dock باز کنید.  اکثر برنامه های macOS برعکس ویندوز فقط دارای یک آیکون هستند و همراه با  پوشه های مختلف نیستند. برای باز کردن برنامه ها کافیست به روی آنها کلیک  کنید.فایندر (Finder)  فایندر یک مدیر فایل  است که به شما امکان مرور، جستجو، سازماندهی و مدیریت فایلها و پوشهها را میدهد.برای move کردن  باید مشابه کپی عمل کنید و در هنگام paste  کلید Option  را هم نگه دارید. یعنی اول فایلها را انتخاب کرده و ⌘C بعد در مکانی که میخواهید فایلها را منتقل کنید ⌘⌥Vبرای نمایش فایلهای مخفی کلید های Shift + ⌘ + . را بزنید.برای حذف یک فایل یا دایرکتوری آن را انتخاب و کلیدهای Command + Delete را بزنید.مدیریت برنامه ها یا Activity Monitorمشابه Task Manager در ویندوز  Activity Monitor در مک وجود دارد.. برای دسترسی به این بخش کافیست  مسیر Applications &gt; Utilities را بروید و یا عبارت Activity Monitor  را در Spotlight جستجو کنید.تنظیمات کاربردیکلیک راستدر مک بوکهای قدیمی تر کلیک راست وجود نداشت و برای استفاده از این  قابلیت مجبور بودید که Ctrl را نگه دارید و از طریق کلیک چپ موس همان عمل  کلیک راست را انجام دهید. البته در حال حاضر کلیک راست به مک بوک اضافه شده  و دیگر نیازی به انجام این کار نیست. اگر magic mouse  دارید، کلیک راست در ابتدا فعال نیست و باید در تنظیمات mouse آنرا فعال کنید.ژستهای حرکتی ترکپد شما از طریق  این ترکپد بدون نیاز به موس با ژستهای حرکتی مختلف میتوانید دستورات  مختلف را انتقال دهید، از زوم کردن گرفته تا اسکرول کردن و سوییچ کردن بین  برنامه ها. برای تنظیم دقیقتر ترکپد به مسیر System Preferences &gt;  Trackpad بروید. مثلا من ترجیح میدم که tap را به عنوان کلیک در نظر بگیره که نیاز به فشار بیشتر واسه کلیک نباشه و کلیک راست هم با دو انگشت باشه.ترفندهای کاربردی در مک بوککلیدهاکلیدها مشابه ویندوز است ولی  ALT اینجا Option و به جای کلید Win کلید Command وجود دارد. کلید fn هم قابل تعریف برای کاربرد های مختلف است مثلا تغییر زبان یا با ترکیب F1,...ها برای کم و زیاد کردن ولوم صدا و نور و ...⌃ Control⌥ Option⇧ Shift⌘ Command⏎ Returnاسکرین شات و اسکرین ریکوردمک بوک به صورت پیش فرض قابلیت ثبت اسکرین شات و اسکرین ریکورد را در  اختیار شما قرار میدهند و فایل آنرا در Desktop ذخیره میکند.با فشردن Cmd + Shift + 3 اسکرین شات از کل صفحه ثبت میشود؛با فشردن Cmd + Shift + 4 از بخشی از صفحه اسکرین شات ثبت میشود؛با فشردن Cmd + Shift + 4 بهعلاوه Control فایلی ذخیره نمی شود و فقط در حافظه کپی میشود؛با فشردن Cmd + Shift + 4 بهعلاوه Space میتوانید بین برنامهها برای ثبت اسکرین شات جابجا شوید؛فشردن Cmd + Shift + 5 باعث میشود تا برنامه اسکرین شات باز شود.متوقف کردن برنامهها برای Force Stop برنامه ای به دلیل باگهای نرم افزاری  نمیتواند به حالت نرمال بسته شود میتوانید با فشردن دکمههای Cmd  + Opt + Esc وارد یک منو شوید و آنرا ببندید. ( ویا در activity monitor آن پروسه را انتخاب و Force Stop کنید.ابزارهای کمکیبرنامه Rectangleمتاسفانه مدیریت پنجره یکی از نقاط قوت macOS نیست و در استفاده از چند پنجره باز  کنار هم اصلا خوب عمل نمیکند. خوشبختانه، یک برنامه رایگان به نام Rectangle وجود دارد که مدیریت پنجره ها را به کمک کلیدهای ترکیبی خیلی راحت میکند.ابزارهای برنامه نویسی Xcodeمجحوعه xcode شامل یکسری  ابزارهای ترمینال هستند که برای توسعه نرم افزار در macOS ضروری هستند را دانلود و نصب کند. مهمترین آنها شامل موارد زیر است:- gcc- g++- make- git- linker- debugger- profilerبرای نصب آن این دستور را در ترمینال بزنید. xcode-select--install مدیریت بسته (Package Manager)برای مدیریت بستهها در macOS، انتخاب محبوب من همچنان Homebrew است و اولویت اول من همیشه CLI است.ولی  اگر شما یک رابط گرافیکی خوب برای Homebrew میخواهید  Cakebrew را هم میتونید نصب کنید./bin/bash -c &amp;quot$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quotویرایشگر متن (Text Editor) بیشک VS Code یکی از بهترین IDEهای موجود است و مسلما یک IDE قابل اعتماد برای برنامهنویسان ضروری است پس بریم که با Homebrew نصبش کنیم:brew install --cask visual-studio-code با تم مورد علاقه ام  Catppuccin که چهار حالت از روشن تا تاریک دارد.افزونههای های پیشنهادی:Codeium: این افزونه مشابه GitHub Copilot اما برای کاربران فردی رایگان است.Error Lens: قابلیت دید خطای &quot;TODO&quot; و خطاهای IDE را بهبود میبخشد و آنها را واضحتر نشان میدهد.change-case. امکان تغییر سریع نام متغیر بین camelCase، snake_case و موارد دیگر را فراهم می کند.filesize. نمایش اندازه فایل جاری در نوار وضعیت.GitLens. ابزار کاربری برای مدیریت git. indent-rainbow. تورفتگی ها را واضح تر و قابل خواندن تر می کند.Prettier. فرمت کننده کد برای برخی زبان ها.Sort JSON objects. نیازی به توضیح ندارد، درست است؟ترمینال (Terminal)در چند سال گذشته از  iTerm2 استفاده میکردم به همراه  تم Powerlevel10k .brew install --cask iterm2علاوه بر این،  ZIM (Zsh IMproved) را که ادعا میکند نسبت به oh-my-zsh سریعتر است، را هم نصب کرده ام .برای نصب ZIMcurl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zshو برای نصب تم Powerlevel10k روی آن این راهنما را دنبال کنیدابزار SDKManاین ابزار محبوب من از سالها قبل بوده است. به کمک SDKMan به راحتی هر sdk و یا ابزارهای مشابه را میتونین نصب کنید و یا حتی چند نسخه مختلف از هر sdk روی سیستمتون داشته باشه و sdkman  اونها را مدیریت میکنه و با یه کامند نسخه پیشفرض را عوض میکنه. curl -s &amp;quothttps://get.sdkman.io&amp;quot | bashو همانطوری که در تصویر زیر میبینید میتونید ورژن ها مختلف مثلا JDK را لیست کنید و هر کدام را خواستید نصب کنید. سعی کردم مواردی که واسه همه میتونه کاربری باشه را بگم و نصب ابزارها و تنیظمات دیگه بنا به نیاز شما میتونه متفاوت باشه.</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Sun, 21 Apr 2024 02:34:31 +0330</pubDate>
            </item>
                    <item>
                <title>آخرین کتاب فنی که خوندین؟؟</title>
                <link>https://virgool.io/coderlife/must-read-book-nmsrsxiee622</link>
                <description>آخرین باری که کتاب فنی که خوندین کی بوده؟؟ چه کتابی بوده؟؟ چی ازش یاد گرفتید؟آیا کتابهای زبان اصلی را میخوانید؟؟- - - - - - - - - - - این سوالات را من همیشه در مصاحبه ها میپرسم! چرا؟؟امروزه استفاده از سایتهایی مثل Stackoverflow و Github دیگه جز ضروریات کار ما حساب میشه ولی کافی نیست. مشکلی که گاها در مهندسان و توسعه دهنده های نرم افزار در ایران وجود داره، عدم مطالعه است، خصوصا کتابهایی به روز و به زبان انگلیسی.زمانی که برای حل مشکل سرچ می کنید، جوابهای مختصر و مفیدی پیدا می کنید که کارتون را راه بندازه ولی در اکثر موارد، نکات مهمی که باید در خصوص اون مسئله بدونین ذکر نمیشه. اینطوری پروژه تون میشه مجموعه از تکه کدها و روشهایی که از جاهای مختلف استفاده کردین و ممکنه حتی با هم سازگار هم نباشه.نخوندن کتاب دلایل مختلفی داره، مثلا عدم تسلط به زبان انگلیسی، نداشتن وقت کافی، نشناختن کتابهای مناسب و ...  قصد دارم که به صورت ویدیویی کتابهایی که برای سطح متوسط و حرفه ای در زمینه مهندسی نرم افزار و برنامه نویسی هست را بررسی کنم و در یک فایل ویدویی به صورت خلاصه، نکات مهم اون را ذکر کنم. اینطوری واسه کسانی که هنوز فرصت خوندن اون کتاب را پیدا نکردند، به راحتی به نکات اصلی اون دست پیدا می کنند.اولین کتابی که رفتم سراغش کتاب Effective Java است. هر برنامه‌نویس حرفه‌ای جاوا که می‌خواد کد حرفه ای، کارامد و قابل نگهداری بنویسد باید کتاب Effective Java را خوانده باشد. ویرایش سوم این کتاب با پوشش Java 9 نکات مهمی را مطرح میکنه که همه برنامه نویسان جاوا باید اونها از بر باشند.کانال Level Up در یوتیوب :https://www.youtube.com/channel/UCJPp6qBgryyQTxG1GVVzfIg </description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Mon, 18 May 2020 13:57:23 +0430</pubDate>
            </item>
                    <item>
                <title>Java Performance Tools -  هشت نوع ابزار که باید بشناسید</title>
                <link>https://virgool.io/javacup/java-performance-tools-%D9%87%D8%B4%D8%AA-%D9%86%D9%88%D8%B9-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%DA%A9%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A8%D8%B4%D9%86%D8%A7%D8%B3%DB%8C%D8%AF-dzynvfebi4by</link>
                <description>بررسی کارایی و عملکرد نرم افزار یکی از بخش هایی که به صورت مداوم باید انجام شود. ابزار های مختلفی برای اینکار وجود دارد که البته هر کدام در مکان و زمان مناسب خود قابل استفاده است. مثلا ابزاری که در حین پروسه توسعه استفاده می شود مسلما نمیتواند نیازمندی های پروسه در حین اجرای نرم افزار در حال کار را پوشش دهد. در ادامه دسته بندی روی ابزارهای مختلف اینکار خواهیم داشت.1-Java Profilersپروفایلر ها عمدتا حجم عظیمی از داده های فراخوانی توابع، مقدار مصرف شده CPU/RAM، مقادیر آزاد و مصرف شده Heap/Stack، اشیای لود شده در JVM و ... را فراهم می کند.مزایا: عالی برای یافتن مشکلات حافظه ای مانند نشتی و تغییرات لحظه روی GC  و همچنین Thread ها معایب: نیازمند دسترسی مستقیم به پروسه در حال اجراابزارهای معروف: VisualVM, JProfiler, YourKit , Java Mission Control. در برخی IDE ها مانند Eclipse, Intellij افزونه های مشابه  مانند Eclipse MAT و Memory View وجود دارد.2- Tracing Java Web Requests/Transactionsپروفایلرهای استاندارد روی کارایی همه متد های یک برنامه تمرکز می کنند اما ابزارهای این بخش صرفا روی کارایی درخواست های وب یا تراکنش های آنها متمرکز هستند.به عنوان مثال Prefix جزییات زیادی را در خصوص فراخوانی های ORM و کد های SQL تولیدی، فراخوانی های REST/SOAP و جزییات فراخوانی های کتابخانه های جانبی فراهم میکند.ابزار XRebel با کمک یک agent روی کانتینر نرم افزار تحت وب شما ، میتواند جزییات هر درخواست وارده به برنامه را  نشان دهد.مزایا: دسته بندی و مرتب سازی حجم زیادی از داده های خامی که پروفایلر استاندارد وجود دارد. با دنبال کردن   جریان درخواست ها، کلاس ها و متد های درگیر در یک زمان پاسخ دهی را نشان میدهد.معایب: صرفا برای زمان توسعه مناسب است. ابزارهای معروف: XRebel, Prefix.3- Java Application Performance Management (APM)ابزار مدیریت کارایی یا اصطلاحا APM میتواند وظیفه بررسی کارایی نرم افزار را در محیط production انجام دهد.مزیت این پروفایلرها ارائه اطلاعات صحیح به روشی هوشمندانه برای عدم تأثیرگذاری بر عملکرد برنامه در محیط اجرایی است. مزایا: توانایی نظارت بر محیط اجرامعایب:عموما برای مانیتور همه سرورها پر هزینه است. برخی از این ابزارها از نمایش داده های async پشتیبانی نکرده و یا به درستی تنظیم نشده اند و  برنامه را کند می کنند.ابزارهای معروف: New Relic, Microsoft, Stackify, AppDynamics, Dynatrace, Scouter, Pinpoint.4. Real User Monitoring (RUM)ابزارهای RUM از دیدگاه کاربر نهایی  به زمان بارگیری المان های صفحه و پاسخگویی درخواست ها برنامه می پردازد.برخی  از محصولات APM این ویژگی را بعنوان یک قابلیت اضافی در نظر گرفته اند.  همچنین محصولات مستقل مانند Google PageSpeed ​​نیز وجود دارد.5. JVM Performance Metricsماشین مجازی جاوا (JVM) اطلاعات بسیار ارزشمندی را در مورد GC، مصرف حافظه و Threadها به کمک JMX می دهد. مزایا: قابل دسترس به کمک اتصال JMX به هر برنامهمعایب:برای اتصال در محیط عملیاتی ممکن است مشکلاتی ایجاد کند. بررسی و تحلیل جزییات اطلاعات ممکن است زمانبر باشد. ابزارهای معروف: JConsole.6. Web Server (Apache/Nginx) Access Logsدر صورتی که برای اجرای برنامه خود از وب سرور استفاده می کنید، می توانید از access log ان نیز برای تحیل استفاده کنید.روشی ساده برای بررسی درخواست ها که میتوان با بررسی آنها پرکاربرترین/سریعترین/کندترین endpoint ها شناسایی نمود. همچنین با بررسی کد پاسخ ها(Response code) میتوانید علل شایع مشکلات را پیدا کرد.مزایا: به سهولت متوان آخرین درخواست ها را بررسی کرد (tail) و همچنین در صورت نیاز برای تحلیل به نرم افزارهای مخصوص آن ایمپورت کرد.معایب: جزییات مشکلات احتمالی و یا دلیل تاخیر در درخواست ها قابل بررسی نیست. داده های POST در دستری نیست.ابزارهای معروف: Desktop Tools: AWStats and Apache ViewerHosted Tools: ELK stack, Stackify, Splunk, LogEntries7. Tracking All Java Exceptionsیکی از بزرگترین دلایل مشکلات کارایی برنامه ها ، بروز استثناهاست.زمانی که یک استثنا پرتاب می شود، ترد را متوقف می کند تا stack trace  جمع آوری شود. حتی استثناهای مدیریت شده که بی ضرر به نظر می رسند نیر از این قاعده جدا نیستند و باعث افت کارایی در زمان لود برنامه می شوند. کلیه استثناها باید مانیتور، بررسی و رفع شوند تا از افت کارایی جلوگیری گردد.برای مطالعه بیشتر: How GWB Found Hidden Exceptions and Application Performance Problemsمزایا: راه اندازی فریمورک های مخصوص لاگ از قبیل  Log4j , Logbackابزارهای معروف:  APM providers, Raygun, Stackify8. Memory Analysisدر مواردی که برنامه مشکل نشتی حافظه دارد و یا کرش می کند میتوان از ابزارهای انالیز حافظه استفاده کرد. برای دریافت فایل حافظه از JVM در زمانی که به دلیل کمبود حافظه کرش می کند از پارامتر زیر در اجرای برنامه استفاده کنید:-XX:+HeapDumpOnOutOfMemoryErrorفایل دامپ می تواند در ابزارهایی مانند Eclipse MAT بررسی شود تا منشا مشکل یافت شود.ترجمه ای آزاد از منابع زیر:https://stackify.com/java-performance-tools-8-types-tools-need-know/https://blog.codota.com/top-9-free-java-process-monitoring-tools/</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Mon, 02 Sep 2019 18:30:37 +0430</pubDate>
            </item>
                    <item>
                <title>سفارشی سازی های لینوکس برای برنامه نویسی - بخش سوم</title>
                <link>https://virgool.io/@m-razavi/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%87%D8%A7%DB%8C-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-e1ponaxu4bfc</link>
                <description>پست قبلی این موضوع را می توانید در اینجا بیابید.با توجه به اینکه من در حال حاضر توسعه دهنده Java هستم، ابزارها و نرم افزارهایی که نصب می کنم در همین حوزه است.1- نصب JDKابتدا JRE و JDK را نصب می کنیم. برای اینکار چند روش وجود دارد:با من تماس بگیرد تا برایتان نصب کنم ;)با استفاده از apt-get آخرین نسخه پیشفرض OpenJDK را نصب کنید.(روشی ساده برای تازه کارها)با استفاده از apt-get  نسخه  Oracle JDK 8 یا نسخه  Oracle JDK 11 را نصب کنید.به صورت آفلاین  نسخه JDK  خاصی را نصب کنید. (پیشرفته) ۱-۱- استفاده از apt-get برای نصب آخرین نسخه پیشفرض OpenJDK  ابتدا مخازن را به روز کنید و سیستم خود را آپدیت نمایید:apt-get update &amp;&amp; apt-get upgradeسپس با کمک دستور زیر آخرین نسخه پیشفرض را نصب کنید:apt-get install default-jdk۲-۲- نصب نسخه خاصی از Oracle JDK به دلیل تحریم ها، امکان دسترسی مستقیم برای دانلود Oracle JDK وجود نداردو باید محدودیت ها دور زده شود;)  با فرض اینکه سیستم شما دسترسی مستقیم دارد، ادامه دهید ابتدا یکسری بسته نرم افزاری را نصب کنید و مخزن جدید اضافه کنید.apt-get install software-properties-common
add-apt-repository ppa:linuxuprising/java
add-apt-repository ppa:webupd8team/javaapt-get updateدر نهایت نسخه مورد نظر را نصب کنید.apt-get install oracle-java11-installerapt-get install oracle-java8-installer1-3-برای نصب آفلاین ابتدا فایل فشرده آنرا دانلود کنید. سپس در مسیر زیر برای آن یک دایرکتوری ایجاد کنید.mkdir /opt/javaو فایل فشرده را در آن مسیر باز کنید.tar -zxf jdk-11.0.1_linux-x64_bin.tar.gz -C   /opt/javaباید مسیر نصب را به عنوان متغیرهای محیطی وارد کنید. برای اینکار فایل مربوطه را ویرایش کنیدnano /etc/environmentو این خط را در انتهای آن قرار دهید.JAVA_HOME=&amp;quot/your/java/installation-path&amp;quotو مجدد متغیرهای محیطی را لود کنید.source /etc/environmentبرای بررسی صحت نسخه نصب شده دستور زیر را اجرا کنید.java -versionدر صورتی که چندین نسخه از Java را نصب داشته باشید برای مشخص کردن نسخه پیشفرض می توانید از ابزار زیر استفاده کنید.sudo update-alternatives --config javasudo update-alternatives --config javac۲- نصب GITهمانطوری که میدونین Git معروفترین و پرطرفدارترین ابزار مدیریت نسخه است.برای نصب آن: sudo apt install git۳- نصب GitKrakenابزار خیلی خوش ساخت و کاربردی که به صورت ویژوال کار شما را با Git راحتتر می کنه و دید خیلی خوبی در میان برنچ ها بهتون میده . میتوانید نسخه آخر آنرا دانلود و نصب کنید.wget https://release.gitkraken.com/linux/gitkraken-amd64.deb
dpkg -i gitkraken-amd64.debو یا با استفاده از snap که یک مدیر بسته کاربردی است آنرا نصب کنید:sudo apt install snapd
sudo snap install gitkrakenاین نوشته تکمیل می شود....۳- نصب Post Man۳- نصب SDK Man</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Sat, 17 Aug 2019 17:47:22 +0430</pubDate>
            </item>
                    <item>
                <title>خودکار سازی ورود کلمات در Ankidroid</title>
                <link>https://virgool.io/@m-razavi/%D8%AE%D9%88%D8%AF%DA%A9%D8%A7%D8%B1-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%D8%B1%D9%88%D8%AF-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-%D8%AF%D8%B1-ankidroid-pbmqrpoahimu</link>
                <description>در پست قبلی گفتم که چطوری فلش کارت ها را سفارشی کنید که فیلدهای معنی فارسی ، تلفط ، مثال و ... هم داشته باشه. حالا چطوری این همه فیلد را خودکار پر کنیم.انکیدروید کلی addon داره که قابلیت های زیادی را بهش اضافه میکنه در اینجا لیست اونها را میتونین ببینیدhttps://ankiweb.net/shared/addons/ و یکی از اونهایی که قراره کار مارا راه بندازه Fast Query است که در آدرس زیر قابل دسترس است.https://ankiweb.net/shared/info/1807206748یک کد عددی در انتهای صفحه بخش download دارد، آنرا کپی کنید.برای اضافه کردن آن در بخش addon بروید.و کد 1807206748 را در این بخش وارد کنید.بعد از نصب، این افزونه به منوی Tools اضافه می شود.از منوی Tools  گزینه Fast WQ را کلیک کنید تا وارد آن شده وا تنظیمات مربوط به خودکار سازی را انجام دهیم.این افزونه می تواند فیلدهایی که اضافه کردید را با استفاده از دیکشنری های آنلاین و یا آفلاین پر کند.برای دیکشنری های آنلاین که در لیست جلوی هر فیلد میتوانید انتخاب کنید.برای دیکشنری های آفلاین میتوانید از فایلهای که برای دیشکنری babylon است و به نام  glossary در اینترنت وجود دارد استفاده کنید. فایلهای با پسوند mdx قابل قبول هستند. لیست دیکشنری های آفلاین من برای معنی فارسی  از Aryanpour English-Persian Dictionary.mdx استفاده کردم برای اینکار آنرا  دانلود و فایل mdx در مسیری که با دکمه Dictionary Folder باز می شود کپی کنید. سپس فیلد اول را انتخاب کنید و ignore بقیه را بردارید، مانند تصویر زیر. دیکشنری که فایل آنرا اضافه کردم با اسم آن در لیست می آید و قابل انتخاب است. برای مابقی هم از دیکشنری ها و سایت های آنلاین استفاده کردم.در نهایت پس از اعمال این تنظیمات در زمانی که کلمات را وارد می کنید روی همون فیلد اول دکمه ctrl+q بزنید و یا دکمه query پایین پنجره را کلیک کنید.اینکار را به صورت گروهی روی لیستی از کلمات در بخش Browse هم میتونید انجام دهید.</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Fri, 26 Jul 2019 15:28:12 +0430</pubDate>
            </item>
                    <item>
                <title>سفارشی سازی های Ankidroid</title>
                <link>https://virgool.io/@m-razavi/%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%87%D8%A7%DB%8C-ankidroid-wpaa37m7zyl3</link>
                <description>یکی از بهترین نرم افزارهایی که برای ساخت و مرور فلاش کارت وجود داره انکیدروید است.در مورد قابلیت ها و ویژگی هاش زیاد گفته شده مثلا :همگامسازیانکی از فضای رایگان ابری برای همگام کردن کارت‌های شما بین دستگاه‌های مختلف استفاده می‌کند.بهینه شدهانکی با دسته‌هایی با بیش از ۱۰۰۰۰۰ کارت هم بدون مشکل کار خواهد کرد.انعطاف پذیریاز ظاهر کارت گرفته تا زمانبندی مرور کارت، انکی گزینه‌های زیادی را برای سفارشی کردن در اختیار شما قرار می‌دهد.کاملاً قابل گسترش استانکی دارای کتابخانه بسیار بزرگی از افزونه‌هاست که قابلیت‌های آن را دوچندان می‌کند.پشتیبانی از چندرسانه‌ایتصاویر، ویدیو، صوت یا نشانه‌گذاری‌های علمی خود را در کارت‌های انکی قرار دهید و بر نحوه‌ی نمایش آن‌ها کنترل کامل داشته باشید.متن بازاز آنجایی که کد و نحوه‌ی ذخیره سازی در انکی باز هستند، تمامی اطلاعات شما ایمن خواهند بود.تنها عیبی که داره، ظاهر ساده و کمی پیچیدگی در سفارشی سازی برای اولین بار است.در ادامه میخوام قدرت سفارشی سازی اون را بهتون توضیح بدم که فوق العاده است. برای اینکار با یه مثال در یادگیری زبان انگلیسی جلو میریم:مثلا من برای یادگیری زبان میخوام که برای کلمات فلاش کارت درست کنم ولی نه فلاش کارت معمولی بلکه یکسری تغییرات بهشون بدم.فلاش کارت های به صورت یک رو (Basic) و دو رو (Basic and Reversed) هستند که معمولا دو رو انتخاب می کنیم. در حالت عادی شما روی کارت(front) کلمه انگلیسی می نویسید و پشت آن (back) معنای فارسی .ولی برای یادگیری یه کلمه بهتره که تلفظ، فونتیک، معنی انگلیسی، مترادف/متضاد، مثال در جمله، معنی فارسی، تصویر هم داشته باشه. خب کی حال داره همه اینها را اضافه کنه، کلی وقت میگیره...خب پس برای هر چیزی که میخوایید اضافه تر باشه یه فیلد جدا تعریف کنید. ابتدا وارد منوی Tools &gt; Manage Note Types شوید.سپس دکمه Fields را بزنید و فیلدهای جدیدی که میخواهید را وارد کنید.وقتی که فیلد های دلخواه اضافه شدند، حالا در پنجره ای که قبلا کلمات را وارد میکردین فیلدهای جدید را میبینید. ولی هر چیزی که در فیلدهای جدید اضافه کنید موقع مرور فلش کارت ها در گوشی و یا کامپیوتر نشون نمیده!! چرا؟؟چون باید نحوه نمایش کارت ها را هم سفارشی کنید. در همون پنجره Manage Note Type دکمه Cards را بزنید. برای تغییر نحوه نمایش کارتها دو تا بخش اصلی داره یکی برای روی کارت (Front Template)  و یکی برای پشت کار (Back Template). از این کدهای نامفهوم نترسید این ها css هستند و بی آزارند. کافیه فیلدهایی که قبلا اضافه کردین را در هر پنجره بنویسید و پیش نمایش آن را در سمت راست ببینید. دقت کنید که اسامی فیلدها باید بین {} باشد.با تغییرات در CSS آنها میتونین سایز و رنگ عوض کنید و یا مثلا بین فیلدها خط بکشید و ...خب با ذخیره این تغییرات و وارد کردن کلمات، فلش کارتهایی که میبینید خیلی توپ میشه و وقتی sync کنید  داخل گوشی هم دقیقا به همین صورت میاد.در پست بعدی بهتون میگم که چطور معنی و مثال و تلفظ و... را خودکار پرکنید که در وقتتون صرفه جویی بشه.</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Fri, 26 Jul 2019 14:55:32 +0430</pubDate>
            </item>
                    <item>
                <title>سفارشی سازی های   18.04 Ubuntu -بخش دوم</title>
                <link>https://virgool.io/@m-razavi/customize-ubuntu-development-enviroment-kq6irxfecdo4</link>
                <description>بخش اول این مطلب را در اینجا می توانید ببینید.و حالا ادامه ماجرا:10 - تغییر داکهمراه با نصب اوبونتو، یک نسخه از افزونه‌ی dash to dock  هم نصب می‌شود که متاسفانه تمام خاصیت‌های تنظیم آن هم غیرفعال شده است. بنابراین آن را حذف و نسخه‌ی اصلی افزونه را نصب کنم.sudo apt remove gnome-shell-extension-ubuntu-dock
rm -rf ~/.local/share/gnome-shell/extensions/dash-to-dock@micxgx.gmail.comسپس با مراجعه با صفحه‌ی افزونه dash to dock آن‌را نصب می‌کنیم.( منبع )11- اجرای فایلهای اسکریپت با دابل کلیکیکسری از برنامه ها و ابزارها با استفاده از یک فایل shell اجرا می شوند. اکثر اوقات نیازی به اجرای آنها در ترمینال نداریم و می خواهیم با دابل کلیک روی آن فایل، آنرا اجرا کنیم. برای اینکار کلید های   Alt+F2  را فشار دهید تا پنجره command باز شود و در آن عبارت dconf-editor را بنویسید و اجرا کنید. در dconfg-editor به مسیر org ➤ gnome ➤ nautilus ➤ preferences  بروید و  در لیست executable-text-activation را پیدا کنید، وارد آن شوید و مقدار پیشفرض را روی launch یا ask  بگذارید.12- روشن بودن NumLuck در صفحه Loginدر سیستم عامل هایی نظیر ویندوز، وضعیت تنظیم شده برای Numlock از bios خوانده شده و در صفحه login و یا شروع سیستم عامل معمولا روشن است. ولی در اوبونتو این روال انجام نمی شود.برای روشن بودن NumLock در شروع کار ubuntu مراحل زیر را دنبال کنید:ابتدا terminal را باز کنید و دستورات زیر را به ترتیب وارد کنید و در انتهای هر خط Enter بزنید .sudo -ixhost +SI:localuser:gdmsu gdm -s /bin/bashgsettings set org.gnome.settings-daemon.peripherals.keyboard numlock-state &#x27;on&#x27;انجام شد، لذت ببرید!13- اتصال به سرور های لینوکس بدون پسورد (Passwordless SSH)ممکن است سرور های شما هم لینوکسی داشته باشید که برای هر اتصال ریموت باید پسورد آنرا هم بزنید. به قول عزیزی &quot;اگر حوصله تون نمشه &quot; میتونید برای همیشه از  تایپ پسورد خلاص شوید. به طور خلاصه شما باید کلید عمومی سیستم خود را در سرور قرار دهید.ابتدا بررسی کنید که سیستم شما کلید عمومی دارد یا نه. ls -al ~/.ssh/id_*.pubاگر ندارد باید بسازید.ssh -keygen -t rsaسپس دستور زیر را در سیستم خود بزنید تا به سرور وصل شوید و این کلید را در آن کپی کنید.(نام کاربری و ادرس سرور را در دستور زیر با اطلاعات سرور خودتان جایگزین کنید و در نهایت پسورد سرور را که درخواست می شود وارد کنید)cat ~/.ssh/id_rsa.pub | ssh user@serverIpAddress &quot;mkdir -p ~/.ssh &amp;&amp; chmod 700 ~/.ssh &amp;&amp; cat &gt;&gt; ~/.ssh/authorized_keys &amp;&amp; chmod 600 ~/.ssh/authorized_keys&quot;در پست بعدی برخی نرم افزارها و ابزارهای مورد نیاز برای توسعه نرم افزار را نصب می کنیم...</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Sat, 19 Jan 2019 10:15:37 +0330</pubDate>
            </item>
                    <item>
                <title>سفارشی سازی های محیط برنامه نویسی جدید (Ubuntu)</title>
                <link>https://virgool.io/@m-razavi/customize-new-development-enviroment-ww5rs3wc5wnn</link>
                <description>مدت کوتاهی است که Ubuntu  را به عنوان سیستم Desktop انتخاب کرده ام. هرچند از ‍۱۰ سال پیش با لینوکس درگیر بوده ام و عمدتا پلاتفرم deploy توزیع های مختلف لینوکس بوده و  در کار با ترمینال آن مو سفید کردم، ولی باید اعتراف کنم در کار با Ubuntu Desktop و محیط UI آن کاملا آماتور محسوب می شوم. و تنها تجربه ام برمی گردد به سال 1385 و Suse و شبیه سازی فوتبال دوبعدی بنا به عادتهایی که با محیط UI ویندوز داشته ام،  مجبورم که یکسری تغییرات را برای راحتی بیشتر خود در ابونتو اعمال کنم. نسخه ای که فعلا استفاده می کنم Ubuntu 18.04 است.۱- آشنایی با اسامی این محیط گرافیکی جدید، اسامی جدید نیز دارد. بهتر است با نام درست آن آشنا شویم که معادل ویندوزی را به کار نبریم و لینوکس کارها بهتون نخندند.LauncherLauncher ItemsWorkspace SwitcherWindow TitleApplication MenusStatus Menus (Indicators)Window DecorationWindow ButtonsToolbarStatus BarDesktopUbuntu Button (Home Button or BFB, &quot;Big Freakin&#x27; Button&quot;)DashRun Command (Alt+F2)عکس و توضیحات از AskUbuntu۲- نصب زبان فارسیدر Setting در بخش   Regional &amp; Langunage زبان فارسی را اضافه کنید.در Setting در بخش   Regional &amp; Langunage ب۳- نصب فونت فارسیبرای نصب قلم‌های فارسی در اوبونتو و دیگر توزیع‌ها می‌توان از اسکریپت فرود استفاده کرد. برای این منظور ابتدا باید گیت را نصب کرد:$ sudo apt install gitسپس اسکریپت را از گیت‌هاب دریافت می‌کنیم:$ git clone https://github.com/fzerorubigd/persian-fonts-linux.gitحال به درون شاخه‌ی اسکریپت می‌رویم:$ cd persian-fonts-linux/اسکریپت را اجرا می‌کنیم:$ ./farsifonts.shدر این‌جا شماره‌ی قلمی که می‌خواهیم نصب شود را از فهرست انتخاب  می‌کنیم. در صورت تمایل به نصب یک‌جای همه‌ی قلم‌ها می‌توان شماره‌ی All  (در این‌جا ۲۷) را انتخاب کرد.متن و عکس از Ubuntu.ir۴-مشکل با مکان حرف پ در ویندوز چون از صفحه کلید عربی استفاده شده بود، حروف اضافی فارسی (پ ژ گ چ) را از چپ و راست به گوشه های صفحه کلید اضافه کردند.کلید هایی که به دنبال آن خواهید گشت:برای ئ ------&gt; Shift+Sبرای پ دکمه M برای ویرگول ---&gt; Shift+7می توان با روشهایی مکان این کلید ها را تغییر داد یا مشابه ویندوز نمود ولی بهتر است عادت های غلط را اصلاح کنیم و به دنبال تغییر جای کلید پ نباشیم!۵- نصب IDE  و سایر نرم افزارها و ابزار های مورد نیاز بنا به سلیقه شخصی ;)۶- نصب تقویم فارسیاستارکلندر (به انگلیسی StarCalendar) یک نرم‌افزار تقویم فارسی آزاد توسعه داده شده توسط سعید رسولی است. برای نصب تقویم فارسی استارکلندر از مخزن گیت‌هاب این پروژه استفاده می‌کنیم. برای این منظور ابتدا گیت را نصب می‌کنیم:$ sudo apt install gitسپس برنامه را از گیت‌هاب دریافت می‌کنیم:$ git clone https://github.com/ilius/starcal.gitحال به درون پوشهٔ برنامه می‌رویم:$ cd starcalبرای نصب در اوبونتو از اسکریپتی که به همین منظور درون برنامه وجود دارد استفاده می‌کنیم:$ sudo ./install-ubuntu۷- پیشنیازهای تغییرات در محیط گرافیکیبرای تغییرات در GUI یکی از ابزارهایی که خیلی به کار می آید Gnome Tweaks  و دیگری نصب افزونه  GNOME Shell integration در Firefox است. ایندو را نصب کنید و :$ sudo apt-get install chrome-gnome-shellنرم افزار Gnome Tweaks را از بخش Ubuntu Software (یا روشهای دیگر) می توانید نصب کنید.۸- کلیک روی برنامه برای minimize اگر مثل من عادت دارید با کلیک روی آیکون برنامه در Launcher  (همون TaskBar در ویندوز)  برنامه یا پنجره در حال اجرا Minimize شود باید با استفاده از  Ubuntu Software برنامه Dconf Editor را نصب کنید. س‍پس به مسیر org -&gt; gnome -&gt; shell -&gt; extensions -&gt; dash-to-dock  رفته و click-action  را بیابید. آنرا باز کنید و مقدار پیشفرض آنرا تغییر داده و روی minimize ست کنید.۹- سوییچ بین پنجره ها بدون گروه بندیابونتو به صورت پیشفرض، زمانی که Alt+Tab را می زنم. پنجره های یک جنس را در یک گروه قرار می دهد و Alt+Tab زدن با مشقاتی همراه می شود. برای رفع آن باید از یک gnome-extention  به نام AlternateTab استفاده کنید. در FireFox روی GnomeShellExtention کلید کرده و سپس AlternateTab را پیدا کرده و آنرا نصب و فعال کنید.بخش دوم </description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Tue, 04 Sep 2018 00:52:09 +0430</pubDate>
            </item>
                    <item>
                <title>راه اندازی NEXUS OSS  برای مدیریت Dependecy های Java</title>
                <link>https://virgool.io/Software/maven-proxy-repository-with-nexus-oss-gevqooakuzx0</link>
                <description>توسعه و پیاده سازی در هر کدام از زبانهای برنامه نویسی از جمله Java ، گاها نیازمند library و یا Framework می باشد همچنین در روند توسعه تیم های بزرگ، ممکن است تیم ها به خروجی تیم دیگر وابسته باشند. این مسئله در برخی مواقع به یک مشکل جدی تبدیل می شود. مشکلاتی از قبیل:عدم دسترسی به وب سایت آن کتابخانه به دلایل فیلترینگ (مانند مخازن sbt برای Play Framework)عدم دسترسی به اینترنت در سیستم کاری (برخی شرکت ها به دلایل امنیتی، شبکه سازمانی آفلاین دارند)محدود بودن پهنای باند اینترنت برای دانلود هر کدام از اعضای تیمناهمگونی نسخه های کتابخانه ها با یکدیگرمدیریت متمرکز وابستگی های ها و بسته های تولید شده توسط هر تیم برای استفاده تیم های دیگر...در این مواقع استفاده از یک سرور مخزن محلی در سازمان که همه اعضای تیم بتوانند به آن دسترسی داشته ضروری به نظر می رسد. نرم افزارهایی که میتوانند این موضوع را مدیریت نمایند عبارتند از:Apache ArchivaSonatype NexusJfrog Artifactoryمن برای این منظور از نرم افزار رایگان Nexus2.0  استفاده می کنم و در ادامه روش راه اندازی و کانفیگ آنرا برای شما شرح می دهم. نصب برای نصب این نرم افزار ابتدا یک توزیع لینوکس را بایستی نصب و پیشنیازهای مورد نیاز را روی آن نصب نمود. در این جا من از CentOS6.5 استفاده می کنم. پیشنیازهای نصبموارد زیر باید قبل از شروع در سیستم نصب شوند:2 * NIC (local, internet)  Set Time,DateConfigure VPNJREConfigure Firewall نصب به صورت سرویس1- نسخه Nexus 2.0 OSS  را بر روی مسیر /usr/local از حالت فشرده خارج می کنیم.2- یک کاربر به نام nexus  بسازید. توصیه می شود که nexus را با root  اجرا نکنید.adduser --disabled-login nexus3- با استفاده از دستور زیر یک لینک ایجاد کنید.ln -s /usr/local/nexus-2.14.4-03/ /usr/local/nexus24- دسترسی شاخه ها را برای کاربر NEXUS ست کنید.chown nexus:nexus /usr/local/nexus-2.14.4-03chown nexus:nexus /usr/local/sonatype-workecho &quot;export NEXUS_HOME=/usr/local/nexus2&quot; &gt;&gt; /etc/profile.d/nexus.sh5- در متغیر NEXUS_HOME در فایل /usr/local/nexus2/bin/nexus  مسیری که nexus (/usr/local/nexus2) را نصب کرده اید ست کنید.6- در متغیر RUN_AS_USER در فایل /usr/local/nexus2/bin/nexus  نام کاربری که ساختید،( nexus ) را ست کنید.7- فایل /usr/local/nexus2/bin/nexus  را در /etc/init.d/nexus2 کپی کنید.cp /usr/local/nexus2/bin/nexus  /etc/init.d/nexus28- دسترسی فایل را اصلاح کنید.chmod 755 /etc/init.d/nexus2chown root /etc/init.d/nexus29- برای اجرا به صورت سرویس در سیستم عامل های CentsOS, Fedora, Redhat با استفاده از ابزار chkconfig می توانید این کار را انجام دهید.cd /etc/init.dchkconfig --add nexus2chkconfig --levels 345 nexus2 onservice nexus2 startبرای اجرا سرویس در سیستم عامل UBUNTU دستورات زیر را انجام دهید.cd /etc/init.dupdate-rc.d nexus2 defaultsservice nexus2 startراه اندازی برای راه اندازی nexus کافیست که سرویس آنرا start کنید.service nexus2 startتبریک می گویم، nexus اجرا شده و از طریق browser میتوانید وارد شوید.http://192.168.1.10:8081/تنظیم مخازن Mavenبرای کاربردهای مختلف، انواع مختلفی از مخزن ها را میتوان در nexus تعریف کرد. مثلا hosted, proxy,virtual,groupبرای ایجاد یک مخزن mirror از Maven Central میتوانید یک proxy تعریف کنید. در این حالت درخواست های کاربران ابتدا به این مخزن ارسال شده و اگر موجود باشد تحویل داده می شود . در غیر اینصورت از اینترنت دانلود می شود و به کاربر داده شده و یک نسخه برای استفاده بعدی ذخیره می شود.برای تنظیم مخزن mvn بایستی یک مخزن از نوع proxy به صورت زیر تعریف کنید.  می توانید مخازن دیگر maven مانند JBoss را نیز به همین صورت اضافه کنید.  ادغام چندین مخازنبا استفاده امکان group میتوانید هر تعداد مخزن maven را در یک گروه قرار داده و در کلاینت ها به جای اضافه کردن آدرس تک تک مخازن، فقط آدرس گروه را وارد نمایید. در این حالت اضافه و کم کردن مخازن در گروه نیاز به هیچ تغییری در کلاینت ها نخواهد داشت. برای اینکار یک گروه به صورت زیر ایجاد کنید.تنظیم مخازن SBT/IVYفریم ورک SBT نیاز به چند repository دارد که متاسفانه از داخل کشور قابل دسترس نیست. مثلا Play Framework دو مخرن IVY و یک مخزن Maven دارد که برای اینکار ابتدا دو مخزن proxy از سایت های زیر به روش قبل ایجاد کنید.http://repo.typesafe.com/typesafe/ivy-releases/http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/سپس این دو را در یک گروه به نام ivy  قرار دهید. برای استفاده کلاینت ها نیاز به مخزن Maven نیز وجود دارد که گروه مخازن Maven را در مرحله قبل ساخته اید.حالا کافیست که آدرس گروه های زیر را در کلاینت ها وارد نمایید.http://192.168.1.10:8081/nexus/content/groups/public/http://192.168.1.10:8081/nexus/content/groups/ivy/فراموش نکنید که روی این سرور یک پروکسی یا vpn برای رفع محدودیت و دسترسی به کتابخانه های sbt باید ست شوند.</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Wed, 22 Aug 2018 19:19:16 +0430</pubDate>
            </item>
                    <item>
                <title>خطاها در Multi Threading</title>
                <link>https://virgool.io/@m-razavi/java-multi-threading-errors-hrbk4ec5wshb</link>
                <description>در برنامه هایی که نیاز به انجام چند عمل همزمان باشد، از چند Thread جداگانه برای انجام کارهای مختلف استفاده می کنند. به اینگونه برنامه های، برنامه های MultiThread گفته می شود. هرچند استفاده از Thread های جداگانه منجر به بالا رفتن کارایی برنامه گردد ولی در صورت عدم کنترل و یا استفاده نامناسب باعث عدم پایداری سسیتم و بروز مشکلاتی برای آن می شود.یکی از مواردی مهم در زمان استفاده از Thread ها، ایمن بودن بخش هایی از نرم افزار است که در Thread های جداگانه اجرا می شود. این بخش ها اصطلاحا باید Thread Safe باشند تا در زمان استفاده همزمان توسط Thread های مختلف باعث بروز مشکل نشوند. خطاهای قابل بررسی در Multi Threadingکلاسهای Thread-safe بلوک های سازنده برنامه های MutiThread هستند. اما میدانید که چگونه میتوان یک کلاس Thread-Safe ساخت؟دو خطای زیر، عمده ترین خطاهایی هستند که در برنامه های MultiThread رخ می دهد :Data RaceDeadlockدر ادامه یک مثال ساده از رخ دادن این خطا ها را بررسی می کنیم:Race ConditionData Race یا Race Condition شرایطی است که خروجی به توالی اجرا و یا زمان اجرای یکسری وقایع غیر قابل کنترل وابسته باشد. به عنوان مثال کلاس زیر بر روی فیلد f حالت Race وجود دارد و دو متد مختلف میتوانند به صورت همزمان مقدار فیلد f را تغییر دهند. با اینکه در متد testAndUse()فیلد f قبل از استفاده بررسی می شود ولی ممکن است پس از موفقیت آمیز بودن بررسی ، متد toggle() مقدار فیلد f را null کرده و فراخوانی متد f.hashCode() منجر به خطای NullPointerException گردد.ckage tso.examples;
import java.util.Random;
public class SimpleDataRace {
 private Object f = new Object();
  public void toggle() {
     if (f == null)
          f = new Object();
      else
         f = null;
   }
   public int testAndUse() {
      if (f != null)
       /* Potential NullPointerException:
         * f may become null before
               * calling hashCode()*/ java.util.Random;
public class SimpleDataRace {
 private Object f = new Object();
  public void toggle() {
     if (f == null)
          f = new Object();
      else
         f = null;
   }
   public int testAndUse() {
      if (f != null)
       /* Potential NullPointerException:
         * f may become null before
         * calling hashCode()*/
         return new Random().nextInt() * f.hashCode();
         else
         return -1;
          }age tso.examples;
import java.util.Random;
public class SimpleDataRace {
 private Object f = new Object();
  public void toggle() {
     if (f == null)
          f = new Object();
      else
         f = null;
   }
   public int testAndUse() {
      if (f != null)
       /* Potential NullPointerException:
         * f may become null before
               * calling hashCode()*/ java.util.Random;
public class SimpleDataRace {
 private Object f = new Object();
  public void toggle() {
     if (f == null)
          f = new Object();
      else
         f = null;
   }
   public int testAndUse() {
      if (f != null)
       /* Potential NullPointerException:
         * f may become null before
         * calling hashCode()*/
         return new Random().nextInt() * f.hashCode();
         else
         return -1;
          }
     }DeadlockDeadlock حالتی است که اجرای برنامه به بن بست رسیده و ادامه کار برنامه ممکن نباشد. کلاس زیر ThreadSafe نیست زیرا استفاده از آن ممکن است به حالت Deadlock برنامه منجر شود. به دلیل اینکه متدهای m1() و m2() اشیای lock1 و lock2 را در اختیار گرفته اند و یا توجه به ترتیب عکس در اختیار گرفتن آنها، تردی که m1 را اجرا می کند lock1 را در اختیار گرفته و منتظر آزاد شدن lock2 است تا آنرا نیز در اختیار بگیرد در حالی که در ترد دیگری که m2() را اجرا می کند، lock2 را در اختیار گرفته و منتظر آزاد شدن lock1 است تا آن را نیز در اختیار بگیرد. در این حالت برنامه در بن بست گیر کرده است.package tso.examples;
public class SimpleDeadlock {
 private Object lock1 = new Object();
 private Object lock2 = new Object();
 public void m1() {
    synchronized (lock1) {
         synchronized (lock2) {
                System.out.println(&quot;foo&quot;);
                }
         }       
  }
  
    public void m2() {
       synchronized (lock2) {
            synchronized (lock1) {
                   System.out.println(&quot;bar&quot;);
                        }
                           }       .examples;
public class SimpleDeadlock {
 private Object lock1 = new Object();
 private Object lock2 = new Object();
 public void m1() {
    synchronized (lock1) {
         synchronized (lock2) {
                System.out.println(&quot;foo&quot;);
                }
         }       
  }
  
    public void m2() {
       synchronized (lock2) {
            synchronized (lock1) {
                   System.out.println(&quot;bar&quot;);
                        }
              }       
    }
 }</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Mon, 20 Aug 2018 02:09:27 +0430</pubDate>
            </item>
                    <item>
                <title>مدیریت تغییرات دیتابیس با Liquibase</title>
                <link>https://virgool.io/coderlife/database-refactoring-with-liquibase-ltjezbuhij8d</link>
                <description>در پروسه توسعه نرم‌افزار یکی از سؤالاتی که همیشه پیش می‌آید که چگونه روند تکامل شمای دیتابیس و نسخه های مختلف را نگه داری کنیم و همچنین چگونه آنرا به نسخه نهایی مشتری منتقل کنیم.ابزارهای مهاجرت دیتابیس (Database Migration Tools) مختلفی برای این موضوع وجود دارد. این ابزارها به شما کمک می‌کند که شمای دیتابیس را بسازید، آنرا در نسخه های مختلف اعمال کنید، و همچنین تست های خودکار بر اساس نسخه های مختلف کد و شمای DB بنویسید و مطمن باشید که تغییرات به درستی به محصول نهایی اعمال می گردد.در دنیای جاوا دو ابزار بیشتر شناخته شده برای اینکار Flyway و Liquibase است.در ادامه  ابزار Liquibase را بیشتر بررسی می کنیم.با استفاده از Liquibase  تغییرات مورد نظر را مستقل از نوع دیتابیس در فرمت XML,YML,JSON  می‌توانید تعریف کنید و در نسخه های مختلف برنامه روی دیتابیس اعمال کنید. مستقل بودن از دیتابیس این امکان را دارد که مثلاً تست های اولیه را با H2  انجام دهید ولی در محصول نهایی از MySql استفاده کنید.با استفاده از Flyway امکان تعریف تغییرات در فرمت SQL,Java وجود دارد. نوشتن تغییرات در فرمت SQL این امکان را می‌دهد که DBA مسؤل این تغییرات باشد و نیازی به یادگیری فرمت جدید نباشد و یا شروط پیچیده‌ای را با استفاده از فرمت جاوا برای تغییرات در نظر داشته باشید.مفاهیم اولیهفایل تغییرات: در این فایل کلیه تغییرات مورد نظر ذخیره می شود. هر تغییر شامل یک شماره و نویسنده است و میتوان پیش شرط های را نیز برای آن‌ها در نظر گرفت.برای تغییرات می‌توان context  تعریف کرد که مثلاً این تغییر در زمان test اجرا شود و یا dev.( این context صرفاً یک کلمه تعریف شده توسط توسعه‌دهنده است)&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotUTF-8&amp;quot?&gt;
&lt;databaseChangeLog
  xmlns=&amp;quothttp://www.liquibase.org/xml/ns/dbchangelog&amp;quot
  xmlns:xsi=&amp;quothttp://www.w3.org/2001/XMLSchema-instance&amp;quot
  xsi:schemaLocation=&amp;quothttp://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd&amp;quot&gt;

&lt;changeSet id=&amp;quot01&amp;quot author=&amp;quothhimanshu&amp;quot&gt;
  &lt;createTable tableName=&amp;quotbooks&amp;quot
    remarks=&amp;quotA table to contain all books&amp;quot&gt;
    &lt;column name=&amp;quotid&amp;quot type=&amp;quotint&amp;quot&gt;
      &lt;constraints nullable=&amp;quotfalse&amp;quot unique=&amp;quottrue&amp;quot primaryKey=&amp;quottrue&amp;quot/&gt;
    &lt;/column&gt;
    &lt;column name=&amp;quotname&amp;quot type=&amp;quotvarchar(255)&amp;quot&gt;
      &lt;constraints nullable=&amp;quotfalse&amp;quot unique=&amp;quottrue&amp;quot/&gt;
    &lt;/column&gt;
    &lt;column name=&amp;quotauthor&amp;quot type=&amp;quotint&amp;quot&gt;
      &lt;constraints nullable=&amp;quotfalse&amp;quot/&gt;
    &lt;/column&gt;
  &lt;/createTable&gt;
&lt;/changeSet&gt;
&lt;/databaseChangeLog&gt;فرمان ها: برای اعمال تغییرات بالا باید از دستور Update  استفاده کنید. سایر دستوراتی که پشتیبانی می‌کند عبارتند از Update,Rollback,Diff,SQLOutput,DBDoc .فایل تنظیمات: برای تعیین پارامترهای اتصال به دیتابیس و سایر تنظیمات می‌تواند آن‌ها در فایل  liquibase.properties تعریف کنید. به عنوان مثال:contexts: test 
changeLogFile: com/company/client/project/db.changelog.xml 
driver: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@tf-appserv-linux:1521:xe
username: admin
password: adminPass
verbose: true 
dropFirst: false برای استفاده از Liquibase میتوان آنرا به صورت مستقیم در خط فرمان فراخوانی کرد و یا از پلاگین های آن در Maven,Gradle,Ant,Sbt,Spring,…  استفاده کنید.</description>
                <category>Mahdi Razavi</category>
                <author>Mahdi Razavi</author>
                <pubDate>Sat, 18 Aug 2018 10:45:33 +0430</pubDate>
            </item>
            </channel>
</rss>