<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های YunusDehghani</title>
        <link>https://virgool.io/feed/@dehghan7447</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 02:40:19</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/213774/avatar/0XiJSs.jpg?height=120&amp;width=120</url>
            <title>YunusDehghani</title>
            <link>https://virgool.io/@dehghan7447</link>
        </image>

                    <item>
                <title>هکتون در دیجی پی</title>
                <link>https://virgool.io/@dehghan7447/%D9%87%DA%A9%D8%AA%D9%88%D9%86-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AC%DB%8C-%D9%BE%DB%8C-obk7mqtxp4jl</link>
                <description>بعضی تجربه‌ها انقدر پررنگ و پرتنش هستند که آدم فقط می‌تونه وسطشون بدوه، نه بنویسه. هکتون برای من یکی از اون تجربه‌ها بود. شش ماه گذشت و حالا که از بیرون بهش نگاه می‌کنم، تازه می‌فهمم چه درس‌هایی توی دل اون سه روز پنهان بود. حالا وقتشه همون‌ها رو با شما به اشتراک بگذارم. نه فقط برای روایت یه رقابت، بلکه برای مرور یک نقطه عطف شخصی.داستان از اینجا شروع شد که به تیم اپلیکیشن جدید دیجی پی اضافه شدم. با بچه های دیزاین(design) و پروداکت(product) و تک(tech) که دور هم  جمع می‌شدیم مدام مطرح می‌شد که خارج از چارچوب فکر کنیم. ایده های جدید٬ خارق العاده و عجیب بدیم.کم کم این روند برای من تکرار شد و باعث شد به این فکر بیوفتم که چرا نتونیم شبیه بعضی شرکت ها وقت اختصاصی برای خلاقیت داشته باشیم. وقتی که ایده ها و خلاقیت های خودمون رو پیاده کنیم. توی ذهنم اومده بود ۲۰ درصد تایم کاری رو بتونم روی پروژه های شخصی وقت بزارم. مثل مدل ۸۰ −۲۰ شرکت های معروف. یا حتی مدل های متنوع دیگه که به سیستم اداری شرکت میخورد. خودمم چند تا ایده داشتم برای اپلیکیشن جدید که میخواستم توی این سازوکار وقتی برای پیاده سازی اونها بزارم. خیلی با خودم کلنجار رفتم .  به دلیل حساس بودن و مهم بودن پروژه توی جلساتی که تشکیل میشد میلاد (VP engineering) هم بود. بعد از کلی فکر کردن٬ تصمیم گرفتم این ایده رو با میلاد درمیون بزارم. وقت گرفتم و باهاش جلسه ست کردم.از مشکلات پیاده سازی ایده و نکات ضعفشون گفت. از اینکه ایده به خودی خود دارای ارزش نیست.میلاد میگفت ایده زمانی قابل ارزش گذاری و فهم هست که یک پیاده سازی ساده (mvp or proof of concept) ازش موجود باشه. با ایده ۲۰/۸۰ هم موافق نبود چون مدیر عامل وقت احتمالا باهاش موافقت نمی‌کرد. اما گفت یه فرآیند بهتر داره که قبلا توی شرکت قبلی چندباری پیاده کرده و نتایج خوبی گرفته. دنبال پیاده سازی اون توی شرکت خودمون هم بوده. هکتون!هکتون چیه و چطوری اجرا میشههکتون یه مسابقه ای بعضا درون شرکتی هست که یسری ایده توسط افراد داده میشه. و اون ایده ها توسط تیم ها پیاده میشه و جلو میره تا در نهایت یکیشون به عنوان برنده انتخاب بشه.این افراد حتما در حوزه تک نیستن و نیازی هم نیست باشن. ایده ها در یه فرمت خاص که تیم برگزاری آماده کرده توضیح داده میشن و برای کمیته برگزاری فرستاده میشن. این فرمت مثل پروپوزال دانشگاه هست که کمک میکنه ایده دهندگان٬ همه نکات ایده رو به درستی عنوان کنند و جنبه های مختلف ایده رو بهش فکر کنند. بعدش توی یه روز خاص این کمیته برگزاری دور هم جمع میشن و تعداد محدودی از ایده های آینده دار و پر و پیمون رو برای شرکت در هکتون انتخاب میکنند. (اینکه معیار انتخاب این ایده ها چیه و چرا  انتخاب میشن بستگی به افراد درون کمیته داره که مهمترین اون ها پروداکت٬ تک و بیزینس هست.)میرسیم به روز هکتون. بچه هایی که ایده دادن دونه دونه میان ایدشون رو برای همه شرکت کنندگان توضیح میدن و شرکت کنندگان حول ایده ها تیم می سازند. دو روزی فرصت داده میشه تا هر تیم یه proof of concept یا دلیلی برای موفقیت و اجرایی شدن ایده پیدا کنه. لازم نیست ایده حتما پیاده سازی بشه فقط یه proof of concept کافیه. بعد از دو روز نتایج کار ها آماده ارائه به کمیته هکتون میشه و در نهایت تیم برنده مشخص میشه. من از ایده هکتون میلاد خیلی خوشم اومد و توی همونجا قرار شد برای اجراش هرچقدر که کمک از دستم برمیاد دریغ نکنم. میلاد کمیته رو تشکیل داد و منم توی کمیته اضافه کرد. جلسات رو گذاشتیم و سین برنامه و هدایا تقریبا مشخص شد. کم کم موقع اعلان عمومی و جمع آوری ایده ها رسیده بود. از اونجایی که منم دوست داشتم ایده هام رو عملی کنم قبل از شروع فرآیند داوری از کمیته بیرون اومدم و ایده های خودم رو  برای شرکت در هکتون فرستادم.هکتون شروع شده بود. درسته که هنوز به طور رسمی فرآیند تیم بندی و ارائه ایده ها شروع نشده بود٬ ولی بچه ها شروع کرده بودند. تیم ها به آرامی داشت شکل میگرفت. ایده ها داشت متولد میشد و هر کسی که یه کم شور و اشتیاق داشت به تکاپو افتاده بود.ایده ها به دست کمیته می رسید و قرار شده بود تا هفته بعد لیست ایده های تایید شده توسط کمیته ارزیابی اعلام بشه.یکی از ایده های من هم پذیرفته شده بود. ایده من PFM) Personal Financial Management) با استفاده از قابلیت های موجود توی دیجی پی بود. ارائه خودم رو برای روز موعود آماده کردم و رفتم سراغ یارگیری و لابی کردن. تقریبا هر صاحب ایده لابی خودش رو شروع کرده بود تا افراد خوب رو از دست نده. منم شروع کردم. مسیری که برای پیاده سازی ایده میدیدم تمام تک بود و از سمت پروداکت و بیزینس هیچ دیدی نداشتم. رفتم سراغ فرانت کار های شرکت. با محسن صحبت کردم٬ مدتی بود از اندروید اومده بود فرانت و روی Angular کد میزد. اما senior software developer بود. بعدم علیرضا رو اضافه کردیم که تسلط بیشتری روی بیزینس فرانت شرکت و سوپر اپ داشت. تقریبا تیم رو بسته بودیم.رسیدیم به روز ارائه ایده ها و به قولی تیم بندی حول ایده ها.( تقریبا نصف ایده ها٬ تیم خودشون رو پیدا کرده بودند و مرحله ارائه براشون تقریبا ارزش خاصی نداشت)منم تیم خودم رو جمع کرده بودم و ارائه دادن زیاد برام مهم نبود؛ اما سعی کردم به بهترین نحو انجامش بدم. توی ارائه هایی که میشد بعضا ایده های دست دوم و بی ارزش هم بودن اما واقعا ایده های جذاب هم کم نبود. ایده های جالب و نوآورانه که طرز نگاه جدید به مشکلات داشت. بعد از اتمام ارائه ها٬ تیم ها تشکیل شد و از همون لحظات اولیه کار بچه ها شروع شد.روز اولتیم ما شروع کرد به tech design و بررسی راهکار های موجود. میخواستیم مسیر مشخص  و دیزاین اصولی داشته باشیم تا برای توسعه کمتر به بن بست بخوریم. با محسن و علیرضا حدود دو سه ساعتی فکرامون رو روی هم ریختیم.بالاخره کد زدن رو شروع کردیم.هرچی جلوتر میرفتیم بیشتر نیاز به یه دیزاینر رو حس میکردیم. شکل و فرآیند کار ها خوب به هم چفت نمیشد. توی همین فکرا بودیم که تصمیم گرفتیم نفر جدید رو اضافه کنیم. ندا دیزاینر تیم رو باهاش به توافق رسیدیم (که اگر برنده شدیم چطوری جایزه رو تقسیم کنیم 🙂). توی مسیر خوبی پیش می رفتیم و با تمرکز روی توسعه غرق در کار شدیم. یادم میاد اون شب تا حدود ساعت ۱۲ یا ۱ موندیم توی شرکت و به عنوان آخرین تیم شرکت رو ترک کردیم.روز دومبه دو دلیل تصمیم بچه ها این شد روز دوم رو دورکاری کنیم. اول اینکه شب قبل زیاد موندیم و نتونسته بودیم خوب استراحت کنیم و دوم اگر می خواستیم بیاییم شرکت وقت رفت آمد رو باید در نظر میگرفتیم.دورکاری رو شروع کردیم و قرار گذاشتیم هر چند ساعت یکبار یا اگر مشکل خاصی خوردیم جلسه بگذاریم. یکم که جلوتر رفتیم دیدیم که جای خالی یک نفر که از بیرون پروژه بهش نگاه میکنه خالیه. این شد که از مریم هم کمک گرفتیم. مریم به عنوان coach تیم که توی موقعیت های خاص با دید از بالاش بهمون کمک میکرد به تیم اضافه شده بود و ما داشتیم بدون نقص با یه تیم حرفه ای٬ پرقدرت جلو میرفتیم.تقریبا به جمع بندی خوبی توی روز دوم رسیده بودیم که من آخرای روز حالم بد شد و  قسمت آخر اون روز رو زیر سرم گذروندم. اما بچه ها تا نیمه های شب مشغول جلسه و جلو بردن پروژه بودند.روز سومروز نهایی بود و باید جمع بندی می‌کردیم. هیجان به اوج خودش رسیده بود و دیگه باید نمای خروجی کار رو میدیدم. بماند که تا لحظات آخر قابلیت جدید به پروژه اضافه می‌کردیم اما هر طور که شد کار رو درآوردیم. تیم خیلی یک دل داشت میرفت جلو. به لحظات آخر نزدیک می شدیم و تازه داشت مشکل اصلی نمایان می‌شد. من به ارائه و پرزنت ایده فکر نکرده بودم. اینکه چطور ایده رو به گروه داوری بفروشم برام مساله نبود. شاید اگه همه داورا از حوزه تک بودن یا شاید از نگاه تیم ما دیده بودن پروژه رو کار ساده تر بود اما اینطوری نبود. محمد حسن در اتاق رو زد. ازمون پرسید آماده اید برای ارایه؟ اونجا بود که اولین بار به ارایه فک کردم.محمدحسن: چطوری میخوای ایده رو ارایه بدی؟من: نمیدونمبه کمک بچه ها یکم روش فکر کردیم و به یه جمع بندی رسیدیم.چندباری جلوی محمد حسن ارایه دادم و تا جایی که میشد بهترش کردیم.چند باری جلوی بچه های تیم ارایه رو مرور کردم و تقریبا آماده بودم.ارایه نهاییقرار شد من ارایه بدم و محسن روی TV اپ رو present کنه.شروع به پرزنت کردم. اولش استرس داشتم ولی یکم که جلوتر رفت بهتر شدم. ارایه بدی نبود ولی نسبت به تیم هایی که عین سه روز رو روی ارایه کار کرده بودند بهتر نبود.هیچ داوری سوال خاصی نداشت. یکم عجله برای تموم شدن ارایه ها بود ولی حس میکنم ذهن داورا رو نتونسته بودم درگیر کنم.ارائه ایده ها که تموم شد دو تا گروه داوری مشخص شد.گروه اول و اصلی که متشکل از تیم داوری بود وظیفه مشخص کردن ایده های برتر رو داشتن و گروه دوم داوری از بچه های تک بود که از نظر فنی ایده هارو ارزیابی می کردند. تیم دوم داوری کسانی بودند که توی طول هکتون به بچه ها از نظر فنی کمک میکردند و شناخت عمیقی روی کل مجموعه داشتند.اعلام نتایجتیم سوم٬ دوم و اول خوانده شد. تیم خلا و٬ تیم سریع مشخص شدند اما ما توی هیچ کدوم نبودیم. مواجهه با شکست خیلی سخته اما اینکه ایده تو باشه و تو تیم رو رهبری کرده باشی تلخترش میکنه. همه بچه ها بیشتر از حد توانشون تلاش کرده بودند و دقیقا همه اونچیزی که میخواستیم رو داشتیم اما نتونسته بودیم بفروشیمش. شاید اگه چیزی توسعه پیدا نمیکرد و فقط با دیزاین میرفتیم توی ارایه اما به فروش ایده و ارایه اون فکر کرده بودیم موفق میشدیم. بودن تیم هایی که پیاده سازی نداشتند اما جایزه بردند. شاید یه بخشیش از بی دقتی داورا بوده و شاید تیم ها شانس آورده بودند اما اینکه من به چگونه ارائه دادن ایده فکر نکرده بودم بخش اصلی داستان بود.با بچه ها صحبت که میکردیم چیزی رو متوجه شدم. اگر قبلا با دو نفر یکی توسعه دهنده و اون یکی پروداکت میشد ایده زد و start up شروع کرد اما الان بیزینس هم یکی از پایه های اساسی شکل گیری یه تیم بود. یکی که بجز دید محصولی و تکنیکال٬ بازار رو بشناسه. تیم ما این فرد رو کم داشت یا اصلا بهش فکر نشده بود. شاید این موضوع برای من انقدر واضح و روشن نمی شد اگر یه جایزه کوچیک میبردیم یا حتی اسم تیممون خونده می شد.  حالا بهتر حرف میلاد که بهم گفت خود ایده به خودی خود مهم نیست رو متوجه شده بودم.حالا که چند ماهی گذشته و از دور اون چند روز رو میبینم برام این مسایل واضح تر هست. حالا که از اون شکست دورتر شدم. شاید از نظر مالی هیچ عایده ای برام نداشت اما درس های بزرگی گرفتم که اگر توی شرایط واقعی میخواستم یاد بگیرمشون هزینه های سنگین تری باید میدادم.من توی یه محیط تستی درس هایی گرفتم که افراد توی محیط واقعی با هزینه های سنگین مالی و غیر مالی یادشون میگیرن.ممنونم از شرکت که این فرصت رو برام فراهم کرد و ممنون تر از بچه ها و تیمم که به ایده و خودمون ایمان داشتند. اینکه قبول کردند با هم بجنگیم و نهایت توانشون رو گذاشتند.سه روز پر فشار و هیجانی که پایان تلخی داشت.اما این تلخی ماجرا بود که باعث شد من حقیقت رو ببینم و ازش یاد بگیرم.این تجربه یه یادآوری برای خودم بود: فقط کدنویسی کافی نیست. خلاقیت، هم‌دلی با تیم، درک بازار و قدرت ارائه هم بخشی از مسیر بزرگ‌تر برای ساختن آینده‌ست. آینده‌ای که من برای ساختنش مشتاق‌تر از همیشه‌ام.ممنونم از بچه های تیم: محسن غفار پور که از نظر فنی واقعا خیلی کمک کرد توی تیم - علیرضا عباس زاده که با تسلط بالاش روی دامین سوپر اپ عالی بود - ندا ناصری که اگر نبود پروژه هیچ وقت منسجم و قابل ارایه نمیشد - مریم  فولادی که با دید کلی نگر مارو از بن بست ها نجات میدادماگ بجا مانده از هکتون :)</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Wed, 06 Aug 2025 14:08:04 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه دریافت پروانه نظام مهندسی</title>
                <link>https://virgool.io/@dehghan7447/%D9%86%D8%AD%D9%88%D9%87-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%BE%D8%B1%D9%88%D8%A7%D9%86%D9%87-%D9%86%D8%B8%D8%A7%D9%85-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-qjtja7jg3qtp</link>
                <description>بعد از قبول در آزمون نظام مهندسی ۳ سال وقت برای اقدام به کسب پروانه هست.مراحل دریافت پروانه نظارت و اجرا مشترک هست به جز یه مرحله که جلوتر میگم.۱-عضویت در سازمان نظام مهندس (یادتون نره که حق اشتراک سالیانه هم پرداخت کنید.) https://ims.irceo.ir۲-ساخت پرونده مالیاتی. این مرحله رو از سایت سازمان مالیات باید انجام بدی و تا گام ۴ پیش ببری. https://tax.gov.irحسابی که معرفی میکنی به مالیات همون حسابی هست که نظام یا شهرداری برات حقوق رو میریزه. دقت کن این حساب گردشش فقط برای همین موضوع باشه چون داری یه سازمان مالیات معرفی میکنی.۳-از سامانه مجوز ها در خواست &quot;مجوز مهندس ساختمان شخص حقیقی&quot; رو بزن. توی این گام اگر از قبل کد پستی تایید نشده باشه پستچی برای تایید کد پستی میاد. https://mojavez.ir۴-از سامانه مجوز ها هدایت میشی به سامانه سپامکتوی این سامانه مدارکی رو باید آپلود کنی :الف) پرداخت به سازمان مالیات هست.ب) مهمترینش گواهی &quot;اشتغال به کار و تجریه علمی و سابقه کار&quot; هست. که باید دوتا مهندس پایه ۱ مهر بزنن زیرش. فقط یه نکته داره چون کار در حیطه های نظارت و اجرا نیازمند مجوز هست٬ داخل فرم در بخش نوع مسئولیت باید واژه &quot;کمک نظارت&quot; و &quot;کمک اجرا&quot; پر بشه.نوع پروژه ها بهتره که مسکونی باشن. (یه مرحله توی تاییده این سایت هست که باید مدارک رو ببری و حضوری تایید بشه توی نظام مهندسی که مهمترینش همین گواهی سابقه کار هست.)۵-برای پروانه اجرا باید ۷ تا کلاس بگذرونی که ضروری هستن از سامانه https://edu.tceo.ir لیست ضروری ها۶− بعد از تموم شدن مراحل سپامک پروانه کار در رشته مورد نظر برات صادر میشه و باید بری مهر خودت رو بسازی.۷- مراجعه به دفتر خدمات شهرداری: با مدارک : پرینت پروانه از سپامک + مدرک تحصیلی + کارت ملی + عکس ۳×۴ (برای تخصیص شماره امضا) + مهر نظام مهندسی به دفتر خدمات مراجعه میکنی و ثبت نامت رو داخل سایت های دریافت کار به جریان میندازند.۸- مراجعه به سایت https://observer-old.tceo.ir/Default.aspx?pId=0&amp;Itm=3 برای گرفتن کد پیگیری۹- پرکردن فرم اطلاعات شخصی ارجاع کار در دفتر خدمات الکترونیک شهرداری۱۰- حضور در نظام مهندس برای فعال کردن نهایی۱۱-ثبت خوداظهاری جهت ارجاع کار در سایت sso.tceo.irنکته: اگر برای یه مدتی نمیخوای کار نظارت بگیری باید بری توی پروفایلت داخل سامانه الکترونیک https://eservices.tceo.ir/Home/Dashboard و در قسمت تنظیمات شخصی صلاحیت خودت رو غیرفعال کنی. اینطوری به شما کار نظارت داده نمیشه.برای مثال اگر کار نظارت نمیخواهی فعلا بگیری ولی بهت ارجاع بشه و شما رد کنی٬ نمره منفی برات داره و در دفعات بعد که خواستی بگیری برات مساله ساز میشه.و تمام حالا شما اماده دریافت کار نظارت و اجرا هستید.لینک وبسایت مرجع: عمران ۹۲ دانشگاه</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Wed, 30 Jul 2025 17:23:29 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده ساده از کامند های طولانی گیت</title>
                <link>https://virgool.io/pub-yunus/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D8%A7%D9%85%D9%86%D8%AF-%D9%87%D8%A7%DB%8C-%D8%B7%D9%88%D9%84%D8%A7%D9%86%DB%8C-%DA%AF%DB%8C%D8%AA-i9ao1vuqckr3</link>
                <description>امروز اومدم یسری کامند گیت ساختم که لاگ هارو خوانا نشون بده اما حفظ کردن و تایپشون برام سخت بود.همه رو توی یه فایل خط به خط شروع کردم نوشتن. مثلا پایین دوتاش‍‍‍git log --all --decorate --oneline --graphgit log --graph --pretty=format:&#039;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset&#039; --abbrev-commitبرای اجرا کردن کامند ها نیاز بود مراحل زیر رو برم:۱− فایل رو باز کنم۲− کامند رو پبدا کنم و بعدش کپی کنم۳− کامند رو جایگذاری کنم۴− در نهایت دکمه enter رو بزنمبا خودم فکر میکردم چی می‌شد اگه یه روش پیدا میکردم که شماره خط بدم خودش بره کامند رو بزنهfunction زیر رو توی آخر bashrc اضافه کردم.run_line() {local lineno=$1local file=${2:-commands.txt}local cmdcmd=$(sed -n &quot;${lineno}p&quot; &quot;$file&quot;)if [[ -z &quot;$cmd&quot; ]]; thenecho &quot;No command at line $lineno in $file&quot;elseecho &quot;Running line $lineno: $cmd&quot;eval &quot;$cmd&quot;fi}&quot;الان دیگه bash رو که باز میکنم مینویسم run_line و شماره خط رو میزنم خودش میره کامند رو میزنه.مثلا:‌ run_line 3 میاد مثل عکس زیر لاگ هارو نمایش میدهشاید همه کامند های پر مصرفم رو بیارم اینجا</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Mon, 14 Jul 2025 16:42:21 +0330</pubDate>
            </item>
                    <item>
                <title>Keycloak Run in production server</title>
                <link>https://virgool.io/@dehghan7447/keycloak-run-in-production-server-cqlz89w8zlec</link>
                <description>سلام حالتون چطوره؟توی این پست قصدم گفتن چند نکته راجع به نصب نیم بند keycloak توی محیط سرور هست.اول از همه بگم که Keycloak  یک ابزار هست برای تامین امنیت نرم افزار هایی که مینویسیم. این نرم افزار بحث کنترل و دسترسی رو برای ما مدیریت می کند. از دیگر نکات قابل توجه میشه این رو گفت که این نرم افزار open source هست و  Apache License 2.0 رو داره. میتونم بگم شرکت ها و مجموعه های بزرگی از این ابزار استفاده میکنند و تقریبا چرخی هست که برای کنترل دسترسی اختراع شده و مجددا از نو ساختن همچین ابزاری در صورتی که نیازمندی خاصی نباشه اشتباه محسوب میشه.برای اطلاعات بیشتر راجع به این ابزار میتونید به منابع زیر مراجعه کنید:1- Keycloak Doc2- What Keycloak Is and What It Does?3- Introduction to Keycloak از عنوان اصلی مقاله دور نشیم. بریم سراغ راه اندازی Keycloak روی سرور (طبعاً لینوکسی و برای راحتی من از ubuntu استفاده کردم) و محیط عملیاتی یا به اصطلاح production mode.گام اول: بصورت پیش فرض keycloak از دیتابیس h2 استفاده میکنه. واضح هست که ما نمی خواهیم از این دیتا بیس برای محیط عملیاتی استفاده کنیم. من PostgreSQL رو برای محیط عملیاتی استفاده کردم.اول از همه PostgreSQL رو نصب میکنیم و روی اون یک دیتابیس و یوزر برای keycloak میسازیم. در ادامه فایل  keycloak.conf در مسیر /conf را باز کرده و قسمت های مربوطه را از comment خارج میکنیم:# The database vendor.
db=postgres
# The username of the database user.
db-username=&lt;keycloak database username&gt;
# The password of the database user.
db-password=&lt;keycloak database password&gt;
# The full database JDBC URL. If not provided, a default URL is set based on the selected database vendor.
db-url=jdbc:postgresql://&lt;database url&gt;با انجام این تغییرات keycloak به دیتابیس PostgreSQL متصل خواهد شد.گام دوم:گام دوم مربوط به نام کاربری و رمز عبور مدیر سامانه است. keycloak برای تعریف admin از طریق رابط کاربری (UI)فقط اجازه می دهد که localhost به فرم مربوطه دسترسی پیدا کند. راحترین راه برای تعریف کاربر مدیر استفاده از environment variable است. با معرفی دو متغییر به شکل زیر keycloak آنرا خوانده و مدیر سامانه را در دیتابیس ایجاد میکند.&gt;export KEYCLOAK_ADMIN=&lt;username&gt;
&gt;export KEYCLOAK_ADMIN_PASSWORD=&lt;password&gt;گام سوم:بخش 1:بطور کلی keycloak اجبار میکند که سرور از ssl برای مسایل امنیتی استفاده نماید و بدون معرفی فایل های مربوطه به keycloak این برنامه بصورت طبیعی run نخواهد شد.برای راه اندازی سرور بصورت معمول کافیست دستور زیر را در bash اجرا نموده:bin/kc.sh startبخش 2 :اما در صورتی که نیازی به https و مسایل مربوطه ندارید میتوانید بصورت زیر اقدام نمایید:1- در ابتدا دستور زیر را برای راه اندازی سرور با پروتکل http و غیر فعال نمودن محدودیت های مربوط به عدم استفاده از https اجرا نماییم:&gt;/root/keycloak/keycloak-21.1.0/bin/kc.sh start --hostname-strict=false --hostname-strict-https=false --http-enabled=trueپس از اجرای دستور زیر، keycloak شروع به کار خواهد کرد و در قدم اول جدول های مورد نیاز خود را در دیتابیسی که در قسمت اول معرفی کردیم میسازد.(این اقدام در صورتی انجام می شود که جداول وجود نداشته باشد).2- پس از ساخت جداول و کاربر ادمین برای realm پیش فرض (master) باید حالت اجباری ssl را غیر فعال نمود.کوئری زیر این امکان را فعال میکند:update REALM set ssl_required=&#039;NONE&#039; where id = &#039;master&#039;;و تمام شما keycloak را در محیط عملیاتی راه اندازی کردید.</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Fri, 12 May 2023 22:14:41 +0330</pubDate>
            </item>
                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@dehghan7447/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-tnnmy5li11xo</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/ffh29wabdckb-1vrAj.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۲,۴۴۷ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۹ مرتبه پسندیدند و  ۲ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۸ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۴۰۲ بار خوانده شدند و ۲۱۰,۴۲۹ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۲۸۸۴۹۶۰ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۲,۱۲۷ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۲۸۸۴۹۶۰ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Fri, 02 Apr 2021 01:49:33 +0430</pubDate>
            </item>
                    <item>
                <title>مدیریت استثناء در Spring REST</title>
                <link>https://virgool.io/@dehghan7447/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7%D8%A1-%D8%AF%D8%B1-spring-rest-gvj1kjcqfust</link>
                <description>Exception flowمدیریت کردن استثنا ها یکی از مهمترین بخش های برنامه نویسی است. بخشی که نه میتوان انجام نداد و نه میتوان آن را دوست داشت:)برای ساخت یک کلاس Exception در برنامه بهتر است از روشی که در مقاله جاوا کاپ آمده بهره گرفت:https://javacup.ir/exception-class-best-practice/در این مقاله قائده نامگذاری، سازنده (Constructor) های مورد نیاز و به پیاده سازی دو نوع استثنا پرداخته شده است.انواع Throwable ها در جاواحال بعد از ساختن یک کلاس استثنا (Exception) این مسئله مطرح می شود که نحوه استفاده از استثنا ها چگونه است؟ در برنامه های معمولی جاوایی (منظور برنامه هایی است که از Spring Framework استقاده نمی شود)، نکاتی هست که با در نظر گرفتن آنها میتوان مدیریت مطلوبی برای استثنا ها داشت. این نکات در مقاله دیگری از جاواکاپ، عنوان شده است که مرور نکات مهم آن بصورت تیتر وار خالی از لطف نیست:با wrap کردنِ استثنا، جلوی از دست رفتن stack trace را بگیریداستثناهای چک‌شده را دقیقا مشخص کنیدیا استثنا را لاگ بزنید و یا آن را مجدد پرتاب کنید، نه هر دوهرگز اجازه ندهید از بلوک finally، استثنا پرتاب شودتنها استثناهایی را دریافت کنید که واقعا می‌توانید هندل کنیداگر استثنا را هندل نمی‌کنید، فقط از بلوک finally استفاده کنیدزود پرتاب کنید، دیر دریافت کنید (throw early catch late)استثنای مرتبط پرتاب کنیداز Try-With-Resource استفاده کنیدبرای مطالعه بیشتر مطلب میتونید به ادرس زیر روجوع کنید:https://javacup.ir/exception-best-practices/خوب حالا که کلیاتی از Exception ها را یادآوری کردیم بهتر است برویم سراغ Spring REST. در وبسرویس ها یا REST API هایی که با فریمورک (Framework) اسپرینگ مینویسیم، مدیریت کردن استثنا ها به چهار روش قابل انجام است. قبل از Spring 3.2 راهکار های مدیریت کردن استثنا در اپلیکشن های Spring MVC به دو صورت کلی HandlerExceptionResolver و ExceptionHandler@ صورت می گرفت. هر دو این روش ها نقاط ضعف مشخصی دارند. از Spring 3.2 به بعد با اضافه شدن ControllerAdvice@ تقریبا مشکلات دو روش قبل مرتفع شد و یک روش یکپارچه، برای مدیریت کردن استثنا ها در اپلیکیشن بدست آمد. اخیرا نیز در Spring 5 کلاس ResponseStatusException معرفی شد که یک روش سریع برای مدیریت کردن خطا ها در REST API ها است. در ادامه مبحث به بررسی هر کدام از روش ها می پردازیم و نقاط قوت و ضعف آنها را بررسی خواهیم کرد.روش اول استفاده از ExceptionHandler@ در سطح controller:در روش اول که در سطح کلاس Controller@ پیاده سازی می شود متدی نوشته می شود که مدیریت استثنا را بر عهده می گیرد. این متد همراه است با ExceptionHendler@ و به صورت زیر پیاده می شود:@Controller
public class FooController{
//...
@ExceptionHandler({ CustomException1.class, CustomException2.class })
public void handleException() {
//
}
}همچنین میتوانید در ورودی این متد Exception مورد نیاز خود را مشخص کرده و در بدنه متد به آن  دسترسی پیدا کنید. این راه یک مشکل بسیار بزرگ دارد و آن این است که این متد تنها برای مدیریت کردن استثنا های این controller است و برای کل اپلیکیشن نیست. همچنین اضافه کردن این متد به همه controller های موجود مکانیزم جالبی برای مدیریت کردن استثنا نیست.ما میتوانیم این محدودیت را با ارث بری همه controller ها از یک کلاس BaseController دور بزنیم اما یک مشکل دیگر بوجود خواهد آمد. برای مثال فرض کنید controller ما از یک کلاس دیگر به دلایل فنی بخواهد ارث ببرید که مستقیما در قابل تغییر نیست یا در یک jar دیگر می باشد، آن وقت چه؟در قسمت بعد به یک روش جامع تر برای مدیریت کردن استثنا ها می پردازیم که تغییرات در controller ها و بطور کلی تر در محصول ما ندارد.روش دوم تعریف یک HandlerExceptionResolver :روش  دوم تعریف یک HandlerExceptionResolver است که باعث می شود تمام استثنا های موجود در برنامه مدیریت شوند. استفاده از این روش باعث می شود که یک مکانیزم یکپارچه برای مدیریت استثنا در برنامه پیاده شود. حال قبل از آنکه به ساختن یک Resolver بپردازیم بهتر است به یک پیاده سازی موجود از آن بپردازیم.1-ExceptionHandlerExceptionResolverاین resolver  در spring 3.1 معرفی شد و به صورت پیش فرض در DispatcherServlet فعال است.این Resolver در واقع بخش اصلی مکانیزم مربوط به EXceptionHandler@ است که در بخش قبلی مورد بررسی قرار گرفت.2-DefaultHandlerExceptionResolverاین Resolver در spring 3.0 معرفی شد و بصورت پیش فرض در DispatcherServlet فعال است. این Resolver مسئول حل و فصل کردن استثنا های استاندارد در spring و تبدیل آن به HTTP status code ها می باشد. لیست کد های مدیریت شده توسط این Resolver  به این شرح است:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptionsاین Resolver تنها Status code جواب را مشخص میکند و body جواب را مشخص نمی نماید. این یکی از محدودیت های این Resolver می باشد. در یک REST API فقط status code ها برای client کافی نمی باشد و جواب باید دارای بدنه مشخصی باشد تا برنامه اطلاعات بیشتری را در رابطه با error رخ داده، نمایش دهد.این موضوع با تنظیم کردن view resolution و رندر کردن error در ModelAndView قابل بر طرف کردن است اما کاملا واضح است که این راه حل بهینه نیست. به همین دلیل است که spring در نسخه 3.2 یک راه حل مناسب تر ارائه داد.3-ResponseStatusExceptionResolverاین resolver هم در spring 3.0 معرفی شد و به صورت پیش فرض در DispatcherServlet فعال شده است. مسئولیت اصلی این resolver بدین صورت است که با استفاده از ResponseStatus@ که بر روی کلاس های استثنا قرار گرفته HTTP status code مربوطه را نمایه کند.@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException() {
      super();
}
public ResourceNotFoundException(String message, Throwable cause) {
      super(message, cause);
}
public ResourceNotFoundException(String message) {
       super(message);
}
public ResourceNotFoundException(Throwable cause) {
       super(cause);
}
}این Resolver نیز مشکل DefaultHandlerExceptionResolver را دارا می باشد.4-SimpleMappingExceptionResolver and AnnotationMethodHandlerExceptionResolverاین Resolver مدت هاست که وجود دارد و در مدل های قدیمی Spring MVC مورد استفاده قرار میگیرد و آنچنان به مبحث REST مرتبط نمی باشد. در واقع برای نمایه (map) کردن کلاس استثنا به یک view می باشد.در واقع AnnotationMethodHandlerExceptionResolver در spring 3.0 برای مدیریت کردن استثنا ها از طریق ExceptionHandler@ معرفی شد که با معرفی ExceptionHandlerExceptionResolver در spring 3.2 این Resolver منسوخ (depricated) شد.5-Custom HandlerExceptionResolverترکیب DefaultHandlerExceptionResolver و ResponseStatusExceptionResolver یک مکانیزم بسیار خوب را برای REST API فراهم می آورد ولی باز هم همان مشکل مطرح شده وجود دارد. مشکل عدم کنترل بر  روی body جواب های ارسال شده.بطور ایده ال برای ما دارا بودن خروجی JSON یا XML  (باتوجه به فرمت درخواستی کاربر) بسیار مطلوب می باشد. همین موضوع به تنهایی باعث می شود که ما به custom exception resolver فکر کنیم.@Component
public class RestResponseStatusExceptionResolver
extends AbstractHandlerExceptionResolver {
@Override
protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
try {
        if (ex instanceof IllegalArgumentException) {
        return handleIllegalArgument((IllegalArgumentException) ex,response,handler);
         }
...
} catch (Exception handlerException) {
       logger.warn(“Handling of [“ + ex.getClass().getName() +“] resulted in Exception”, 
handlerException);
}
return null;
}
private ModelAndView handleIllegalArgument(IllegalArgumentException ex, HttpServletResponse response) throws IOException { 
    response.sendError(HttpServletResponse.SC_CONFLICT); 
    String accept = request.getHeader(HttpHeaders.ACCEPT);
    ...
    return new ModelAndView();
   }
}یک موضوع قابل توجه دیگر این است که با توجه به دسترسی ما به Request می توان به مقدار Acceptheader که کاربر ارسال نموده دسترسی پیدا کرد.روش سوم ControllerAdvice@در Spring 3.2 پشتیبانی از یک ExceptionHandler@ جامع با انوتیشن ControllerAdvice@ ممکن شد. این موضوع مکانیزمی جدیدی نسبت به مدل MVC بوجود می آورد.@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
protected ResponseEntity&lt;Object&gt; handleConflict(RuntimeException ex, WebRequest request) {
String bodyOfResponse = “This should be application specific”;
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), httpStatus.CONFLICT, request);
}
}این مکانیزم در عین سادگی، انعطاف پذیر نیز می باشد و امکانات زیر را به ما می دهد:کنترل کامل بر روی بدنه جواب همچنین به Status code هانمایه کردن چندین استثنا بر روی یک متد تا با یکدیگر مدیریت شوند.روش چهارم ResponseStatusExceptionدر Spring 5 کلاس ResponseStatusException معرفی شد که می توان یک نمونه (instance) از این کلاس ساخت و HttpStatus و reason و یا cause آن را به سازنده (constructor) آن پاس داد.@GetMapping(value = “/{id}”)
public Foo findById(@PathVariable(“id”) Long id, HttpServletResponse response) {
try {
Foo resourceById = RestPreconditions.checkFound(service.findOne(id));
eventPublisher.publishEvent(new SingleResourceRetrievedEvent(this, response));
return resourceById;
} catch (MyResourceNotFoundException exc) {
throw new ResponseStatusException( HttpStatus.NOT_FOUND, “Foo Not Found”, exc);
}
}مزایای استفاده از ResponseStatusException چیست؟می تواند یک راه حل ساده و سریع باشد.نیازی به ساخت کلاس های متعدد استثنا نیست.یک نوع استثنا میتواند Status code های متعددی را داشته باشد چیزی که در ExceptionHandler@ ممکن نبود.جمع بندی:در این مقاله در ابتدا با &quot;به روش&quot; های ساخت کلاس استثنا آشنا شدیم و در ادامه به نحوه برخورد با این استثنا ها در قسمت های مختلف برنامه پرداخته شد.بعد از بررسی این کلیات روش های مختلف مدیریت کردن استثنا در Spring REST را بررسی کردیم و مزایا و معایب هر کدام از این چهار روش را خاطر نشان کردیم.آن چه که واضح است این موضوع می باشد که هیچ کدام از این روش ها برای همه حالات رخ داده بهینه نیستند. درواقع ترکیبی از این روش هاست که می تواند مدیریت استثنا مطلوبی را برای برنامه ما ایجاد کند. پس توصیه می شود به هیچ کدام از این روش ها بطور تنها اتکا نکرده و مجموعه ای از آنها را برای استثنا های برنامه مورد استفاده قرار دهید تا یک مدیریت استثنا مطلوب را در برنامه خود شاهد باشید.موفق باشید :)منابع:خب بازم محوریت مطلب ارائه شده ترجمه بود و از کتاب Building a REST API with Spring که گویا تازه منتشر شده کمک گرفته شد. اما باید از مقالات سایت جاواکاپ هم اسم برد زیرا مطالبی از سایت مذکور در این مقاله مورد استفاده قرار گرفته.https://javacup.ir/exception-class-best-practice/https://javacup.ir/exception-best-practices/Building a REST API with Spring, published by: https://www.baeldung.com </description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Sat, 14 Nov 2020 20:41:09 +0330</pubDate>
            </item>
                    <item>
                <title>Annotation در جاوا</title>
                <link>https://virgool.io/@dehghan7447/asas-c1opuxzofcni</link>
                <description>تاریخچهاگه یکم با جاوا سر و کله زده باشید یا حتی چندتا از framework های محبوبش مثل Hibernate یا Spring کار کرده باشید حتما به @ ها خیلی برخوردید.پس بهتره اول ببینم این @ ها چی هستند و توی یه پست دیگه بریم سراغ ساختن یکی از این @ ها موافقید؟در زبان برنامه نویسی جاوا @ ها برای اضافه کردن فراداده هایی(metadata) به سورس کد ماست. @ ها بخش قدرتمندی از جاوا هستند که از جاوا 5 به بعد به آن اضافه شدند. در واقع @ ها در بعضی موقع جایگزینی برای فایل های xml هستند و ما رو از شر xml های مضخرف راحت می کنند.باید یادآوری کرد که هر چند ما قادر هستیم @ ها را به پکیج ها، کلاس ها، اینترفیس ها، متد ها و فیلد ها پیوست کنیم اما این @ ها به خودی خود هیچ کاری را انجام نمی دهند. در واقع بهتره بگیم  @ ها جادو نمی کنند.کلیاتخب حالا که فهمیدیم @ هیچ کار خاصی نمی کنند بهتره ببینیم ما با اونا میتونیم چیکار کنیم:در مورد هشدارها و خطاها به کامپایلر اطلاع دهیمدر زمان کامپایل سورس کد را تغییر بدهیمدر زمان RunTime رفتاری رو تغییر بدیم یا تماشا کنیمBuilt-in Annotationخود جاوا یکسری Built-in @ داره که بهتره اونا رو بشناسیم. این @ ها توی پکیج java.lang هستند:@Override@SuppressWarnings@Deprecated@SafeVarargs@FunctionalInterface@Nativeاستفاده از این @ ها باعث ایجاد یا ساکت کردن هشدار ها و error هایی از سمت کامپایلر میشه. استفاده از این @ ها مستحب موکد (یا همون &quot;BestPractice&quot;) هست؛ چرا که باعث جلوگیری از خطاهای برنامه نویسی در  آینده میشه.@Overrideاین @ موقعی استفاده می شود که میخواهیم رفتار یه متد از کلاس پدر را بازنویسی کنیم.@SuppressWarningsاین @ باعث می شود که هشدار های موقع کامپایل ساکت شوند و ما اطلاع داده نشوند.@SafeVarargsاین @ هم مربوط میشه به متد هایی که تعداد ورودی متغییر براشون در نظر میگیریم.(توضیحات بیشتر توی این لینک هستش)@Deprecatedاین @ بیشتر توی Api ها دیده میشه و این اطلاع رو به استفاده کنندش میده که توسعه دهنده قصد نداره دیگه از این api استفاده کنه و توی نسخه های بعدی احتمالا حذف میشه.@FunctionalInterfaceاین @ بالای اینترفیس های SAM قرار میگیره. کاربرد SAM اینترفیس ها که در جاوا 8 ایجاد شده، بیشتر در لامبدا ها هستش.@Nativeاین @ روی فیلد های کلاس قابل استفادس و این منظور رو میرسونه که فیلد از سمت native code ارجاع داده شده است.همیشه سعی کنید که از @Override و @FunctionalInterface حتما استفاده کنید. نرم افزار هایی که توسعه دهنده زیاد دارند و ممکنه برای بلند مدت به توسعه اونها بپردازیم سر همین استفاده نکردن از این @ ها ممکنه داخلشون مشکلاتی به وجود بیاد که برای رفع کردنشون پوستمون کنده بشه. مخصوصا @Override که داستان های زیادی رو در صورت استفاده نکردن ازش ممکنه تولید کنه.Meta-Annotationsاین @ ها توی @ های دیگه مورد استفاده قرار میگیره و موقعی که میخواهیم یه @ جدید بسازیم خیلی به کارمون میان. این @ ها توی پکیج java.lang.annotation هستند.@Target@Retention@Inherited@Documented@Repeatableخب حالا مثل دسته قبل به توضیح تک تکشون خواهیم پرداخت:@Targetاین @ محدوده استفاده از این @ را مشخص میکنه. در واقع مشخص میکنه که این @ میتونه برای متد استفاده بشه یا فیلد یا...مثال استفاده ازش هم به این صورت هستش:@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {
}@Retentionبعضی از @ ها برای hint دادن به کامپایلر هستند ولی بعضی هاشون runtime مورد استفاده قرار میگیرند. خب با این @ ما میتونیم این مسئله رو مشخص کنیم. این @ سه وضعیت داره:RetentionPolicy.SOURCE – نه runtime و نه برای کامپایلر قابل مشاهدسRetentionPolicy.CLASS – برای کامپایلر قابل مشاهدسRetentionPolicy.RUNTIME – برای هر دوحالت قابل مشاهدسحالت default این @ هم حالت اول هستش و مثال استفاده ازش به شرح زیره:@Retention(RetentionPolicy.RUNTIME)
@Target(TYPE)
public @interface RetentionAnnotation {@Inheritedاین @ باعث میشه که @ مورد تعریف توی کلاس های فرزند هم اعمال بشه. پس میتونیم بگیم که در حالت معمول @ ها به ارث نمیرسند.@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedAnnotation {
}@Documentedاین @ باعث میشه usage یک @ در جاوا داک هم بیاید.@ExcelCell داک جاوا برای @Repeatableبعضی موقع ها هست که استفاده مجدد از یک @ در یک المنت جاوایی نیاز میشه. قبل از جاوا 7 باید این موضوع رو با دسته بندی @ در یک container ها هندل می کردیم.@Schedules({
    @Schedule(time = &amp;quot15:05&amp;quot),
    @Schedule(time = &amp;quot23:00&amp;quot)
})
void scheduledAlarm() {
}از جاوا 7 به بعد یه روش تمیز تر اومد که باعث میشد ما بتونیم از یک @ چندبار برای یک المنت استفاده کنیم. اون چیزی نبود جز @Repeatable.@Schedule
@Schedule(time = &amp;quot15:05&amp;quot)
@Schedule(time = &amp;quot23:00&amp;quot)
void scheduledAlarm() {
}خلاصهتوی این نوشته سعی شد تا با @ های جاوا بیشتر آشنا بشیم. @ هایی که هر توسعه جاوایی باید در موردشون   اطلاعاتی را داشته باشه.انشالله توی پست بعد به این مبحث میپردازیم که چطور یه @ برای خودمون بسازیم.منبعاین نوشته ترجمه خودمونی از مطلب سایت baeldung بود که لینک نوشته اصلیش اینه:https://www.baeldung.com/java-default-annotations</description>
                <category>YunusDehghani</category>
                <author>YunusDehghani</author>
                <pubDate>Wed, 11 Nov 2020 02:02:12 +0330</pubDate>
            </item>
            </channel>
</rss>