<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های khaled moazedi</title>
        <link>https://virgool.io/feed/@xhmoazedi</link>
        <description>back end developer .. copy writter</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:32:05</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1041823/avatar/2DsgMp.jpeg?height=120&amp;width=120</url>
            <title>khaled moazedi</title>
            <link>https://virgool.io/@xhmoazedi</link>
        </image>

                    <item>
                <title>ctrl+click توی VsCode کار نمی کنه</title>
                <link>https://virgool.io/@xhmoazedi/ctrlclick-%D8%AA%D9%88%DB%8C-vscode-%DA%A9%D8%A7%D8%B1-%D9%86%D9%85%DB%8C-%DA%A9%D9%86%D9%87-nt2nxsvizjeh</link>
                <description>نکات ریز : به منظور ریدرکشن(رفتن به مسیر) به منبع یک فانکشن ! متغیر و هر عنصری که در یک پروژه از محل دیگه ای فراخونده شده در ادیتور های مختلف میانبر های مختلفی در نظر گرفته شده که به صورت پیش فرض ترکیبهای خاصی از ارو کی و کلیدهای کی بورد و همچنین ماوس شما رو شامل میشه یکی از پر کاربرد ترینهای این لیست ترکیب ctrl + click هست که در ادیتور ویژوال استدیو معروف و قابل استفاده ستاگر این قابلیت اتفاقی در سیستم شما از کار افتاده یکی از راههایی که میتونید برای فعال کردن مجددش امتحان کنید اینه 1 - F1 رو بفشارید2 - settings json -&gt; open settings json رو باز کنید3- از وجود عبارت  &quot;editor.multiCursorModifier&quot;: &quot;alt&quot;,  در متن موجود در صفخه مطمئن بشیداگر این عبارت نیست اونو بهش اضافه کنید و حالا با سیو کردن تغییرات و بستن این تب دوباره امتحان کنید 4 - میتونید برنامه ی vscode رو دوباره لانچ کنید امیدوارم مشکل حل شده باشه</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Mon, 19 Aug 2024 11:34:30 +0330</pubDate>
            </item>
                    <item>
                <title>تریگر ها در SQL</title>
                <link>https://virgool.io/@xhmoazedi/%D8%AA%D8%B1%DB%8C%DA%AF%D8%B1-%D9%87%D8%A7-%D8%AF%D8%B1-sql-qu07fxut2m2l</link>
                <description>تریگر درواقع یه قابلیت قدرتمند از زبان sql هست که به ما اجازه میده یه سری خواسته هامون رو بصورت اتوماتیک در سطح دیتابیس مدیریت کنیم تریگر نوعی از فانکشن هاست که وقتی یه اکشن خاصی در دیتابیس صورت میگیره  بصورت خودکار اجرا میشه مث insert , update, delete و ... از تریگر میشه برای هندل کردن مشکلات مختلفی کمک گرفت مثلا   business rules, data validate , ... انواع تریگر ها :1. نوع یک Before Triggers : این ترگرها یت میشن که قبل از مثلا اینزرت شدن یه row یه کاری رو انجام بدن2. نوع دو After Triggers : ان تریگرها ست میشن تا عملی رو بعد از یه اکشنی روی دیتابیس صورت بدن مثلا بعد از دیلیت شدن هر رکوردی یه مقداری رو افزایش بدن بصورت خودکار3. نوع سوم Instead of Triggers : تریگر ایونت ها : تریگر ها روی چند نوع استیتمنت اجرا میشن Insert , Update , Delete ساخت تریگر :  CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { INSERT | UPDATE | DELETE } ON table_name  
FOR EACH ROW  
BEGIN 
 -- trigger code here  
END;جمله ی اول :‌ CREATE TRIGGER &gt;&gt; این بخش کلید واژه ی CREATE رو داره که برای ساختن هر عنصری استفاده میشه و تریگر هم یک عنصر در زبان SQL هست . TRIGGER هم کلید واژه ی تریگره و همونطور که مشخصه بعد از اون نام تریگر رو انتخاب کردهبخش هایی که در کرلی بریس {} گذاشته شده هم متودهایی هست که میتونیم بعد از دستور ساختن و تریگر و نامش بنا به هدفی که از این تریگر دنبال میکنیم استفاده ببریمفرض کن قراره یه تریگر بسازم که یه استاتوس رو روی یه تیبلی مثلا به اسم persons برای هر row جنریت کنه مثلا هر row جدیدی که اینزرت میشه استاتوس رو به pending تغییر بده . میگم : CREATE TRIGGER trg_Persons_InsertBEFORE INSERT ON persons ترجمه ش میشه : یه تریگر بساز به اسم trg_Persons_insert ( خود اسم شامل همه ی این توصیفات هست ) که قبل از اینزرت روی تیبل persons ...چکار میکنه ؟جمله ی دوم : FOR EACH ROW این یعنی  روی هر رکورد جدیدی اینکارو بکن جمله ی سوم : BEGIN : معلومه دیگه یعنی کاری که قراره بکنه از اینجا شروع میشه ! حالا در مثال خودم میشه BEFOR INSERT ON persons
FOR EACH ROW 
BEGIN : 
SET NEW.status = &#039;pending&#039; ;
END;الان ترجمه ش میشه ؛ قبل از اینکه هر رکورد جدیدی بیاد برای هر ROW ایتاتوس رو به pending تغییر بده و تمام .گاهی ممکنه بخوای تایم آپدیت شدن رو به عهده ی خود دیتابیس نذاری و با یه تریگر هندلش کنی (فرض کن آدم به دیتابیس اعتماد نداره مثلا D: ) اونوقت بعد از هر آپدیت میخوای مقدار updated_at رو به زمان حال تغییر بدی :یه تریگر مینویسی CREATE TRIGGER ON persons 
FOR EACH ROW 
BEGIN:
SET NEW.updated_at=NOW();
//یا ممکنه یه ستون دیگه داشته باشی که اخرین بروزرسانی رو نگه میداره 
// SET NEW.last_update= NOW();
END;یا حتی ولیدیشن که یکی از بیشترین کاربردهای تریگر میتونه باشهمثلا برای اد کردن سن یه نفر نمیخوایم مقدار منفی بتونه وارد بشه و این رو در سطح دیتابیس با یه تریگر میخوایم هندل کنیم (البته خیلی از این ولیدیشنها رو برخی dbms ها خودشون هندل کردن و این صرفا یه مثاله برای تقریب به ذهن)CREATE TRIGGER trg_persons_Insert
BEFORE INSERT ON persons
FOR EACH ROW
BEGIN
IF NEW.age &lt;= 0 THEN
SIGNAL SQLSTATE &#039;45000&#039;
SET MESSAGE_TEXT = &#039;Age must be greater than 0&#039;;
END IF;
END;اینجا گفته IF NEW.age &lt;= 0 THEN اگر مقداری که برای age میاد کمتر از ۰ بود چکار کن ؟ یه ارروز کد با عدد 45000  ریز کن و یه پیغام رو برگردون که : age must be greater than 0 . نباید منفی باشه خلاصه !و end if یعنی شرط تموم شد . بعدم که end یعنی کارم باهات تموم شد...SIGNAL یه کی ورد یا کلمه ی کلیدیه برای INTERRUPT ایجاد کردن (مختل کردن) حالت نرمال اجرای یه کد sql بر گردوندن یه اررور . این کد هم 45000 یه استاتداردیه که توسط خود زبان sql در نطر گرفته شده برای نشون دادن خطای ورودی کاربر اگر نکته ی دیگه ای هست یا اشتباهی رو در توضیحات دیدید ممنون میشیم که گوشزد کنید تا استفاده کنیمtake it easy man ... :D</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sat, 03 Aug 2024 16:29:18 +0330</pubDate>
            </item>
                    <item>
                <title>یه سفر چهار روزه نطلبیده به قائمشهر</title>
                <link>https://virgool.io/@xhmoazedi/%DB%8C%D9%87-%D8%B3%D9%81%D8%B1-%DA%86%D9%87%D8%A7%D8%B1-%D8%B1%D9%88%D8%B2%D9%87-%D9%86%D8%B7%D9%84%D8%A8%DB%8C%D8%AF%D9%87-%D8%A8%D9%87-%D9%82%D8%A7%D8%A6%D9%85%D8%B4%D9%87%D8%B1-nu9okujx9qli</link>
                <description>۱۴۰۳.۰۳.۲۷شب اول  تو اتوبوس گذشت ! از مسافرتای این شکلی زیاد داشتم سِفْر اول تهرانه ! ساعت شش صبح آزادی بودم ! توی این فصل این وقت سال که آفتاب برای پاشدن از روی زمین خیلی عجله داره شیش صبح حسابی گرم گرفته . یه کوله با خودم آوردم که وسایل زندگی واسه پنج روز توشه ولی با وضعی که تسمه هاش داره مطمئن نیستم تا پنج روز وزن کولە رو بتونن تحمل کنن ، چون اینو میدونستم با خودم ابزار دوخت و دوزهم آوردم .. یادم رفته کارد و قاشق و لیوان بردارم ! نمیدونم چرا ! حتی دمپایی هم برداشتم .تجربه نشون داده بدون دمپایی توی پارک و جاهایی که احتمالا واسه استراحت میرم اذیت میشم ، اما وسایل چای و غذا رو فراموش کردم بردارم  عجیبه! مترو رو صبحها خلوت تر می بینی . مسافرها هم عموما خوابن ! یا به نیمکتشون تکیه دادن و چرت میزنن یا خواب توی چشمای سرخشون هنوز داره پرسه میزنه دارم میرم یه سر پیش سینا ! هم ببینمش هم این چهار پنج ساعتی که تا حرکت اتوبوس قائمشهر وقت دارم رو تو خیابون نمونم . حقه واقعا ! سینا بچه ی گلیه ! همیشه واسه من سنگ تموم میذاره . این دفه سپیده رو هم دیدم ! اونم دختر گلی بود به هم میان ! کلی گپ زدیم . سپیده اهل رشته واسه صبونه املت درست کرده بود با قارچ ، من قارچ نمی خورم ولی بقیه ش خیلی خوشمزه بود ظهر سینا منو رسوند ترمینال شرق ! بار اولی بود که سمت تهران پارس می اومدم . ترمینال شرق یه حس دیگه داشت لهجه هایی که به گوش میخورد شمالی طور بودن ، صادقانه اتوبوسا بهتر بود ! محوطه خلوت تر بود  دم رفتن رسیدم و سوار یه اتوبوس شدم که بنظر میرسید جز من و یه نفر دیگه که مردینه بودیم همه زن بودن ! دخترا و زنهایی که معلوم بود با هم هستن و انگار اکیپ کرده بودن یه سفر برن شمال ، یا شایدم داشتن از یه سفر بر میگشتن وسط راه یکی از خانوما دم گرفت که آقای راننده ! عاقای راننده ! ودست میزد . یکی دوتا از خانومای دیگه هم باهاش همراه شدن یاللا بزن تو دنده ...اما یهو صداشون قطع شد . آقای راننده تذکر داده بود که از این حرکتای جلف نزنن واسه ش دردسر نشه من صندلی ۱۳ بودم و داشتم «انسان در جستجوی معنا» رو برای بار دوم از اول مطالعه میکردم . بنظرم برای موقعیت من که یه راه طولانی رو بی پول و پله ی مناسب و بی اینکه بدونم شب روکجا قراره سر کنم میرفتم ، بهترین انتخاب بود ... همون دم سفر این کتابو واسه همین ویژگیش انتخاب کردم که با خودم ببرم ؛ میخواستم وسط این بلبشو ! واسه ی تحمل مسیرم معنا پیدا کنم ااز تهران تا قائمشهر خونه ی پر ۴ ساعت با اتوبوس از مسیر فیروزکوه راهه ! که وسطش هم یه توقف کوتاه ۱۵ دقیقه ای داره دم یه رستوران تو راهی که منظره ی نسبتا خوبی هم داره سِفْرِ دوم ؛ قائمشهر . . . ساعت 5 عصر ،مثبت منفی 5 دقیقه رسیدیم شهر ! از اتوبوس که خارج شدم هُرم آتیش گرفته ی تَری محکم خورد تو صورتم . سنگین و گرم و خیس .  یه چند گالونش داشت زور میزد راهش رو به ریه هام باز کنه ولی تنفسش واقعا دشوار بود . کوله م دستم بود ، پام رو گذاشتم زمین چندتا راننده طبق معمول همه جا مقصدهاشون رو پرزنت میکردن ! هتل ببرمتون ؟ بازار آقا؟ مرکز شهر میری آقا؟ تاکسی ارزون بیا ! من ؟ ! !!من برنامه م پارک بود . . . آره این همه وسایل رو واسه پارک آورده بودم . حتی دمپایی که بتونم راحت بپوشم واسه دستشویی ! کی وسعش به هتل و مسافرخونه  می رسه ؟ ضمنا باید پولامو نگهدارم واسه هزارتا گیروگور لازمش دارم قائمشهر مث پسر بی استعداد آقا وخانم دکتر میمونه بین همه‌ی بقیه که هرکدوم یکی مدرسه نمونه ست یکی موسیقی رو عالی میزنه و یکی ورزشکاره ! باورت نمیشه از همه ی جاذبه های شمال اینجا فقط شرجیش رو داره ! گرمای شرجی طاقت فرسای شمال تو روزهای طولانی تابستون ! یه پسری که با من بین اونهمه زن و دختر تنها مسافرای نرینه ی اتوبوس محسوب میشدیم هم از اتوبوس پیاده شده بود و داشت آدرس می گرفت ! درحالی که جواب من به همه ی سوالای راننده ها فقط نه بود صدای اون  رو شنیدم که می‌گفت هتل ماسوله میرم ! آقا تا دانشگاه از هتل ماسوله چقد راهه؟دستمو گذاشتم رو شونه ش ! گفتم داداش شمام واسه امتحان اینجایی؟ - بله !  وتازه یادم اومد که پارسال همین موقه تو دانشکده دیده بودمش ! تو کافه تریای دانشکده وسط یه جمع ده نفره میدون داری میکرد ! - نمیای بریم هتل؟ - نه داداش من وسعم به هتل نمی رسه میرم مسافرخونه ای چیزی (و لبخند زدم) و... باهم تو هتل ماسوله یه اتاق دو تخته گرفتیم !یه کافه نزدیک هتل ماسولهته دلم ! وقتی سمتش رفتم گفتم کاش این بنده خدا یهو یه راه حل خوبی پیشنهاد کنه . مثلا بگه دانشکده خودش پانسیون داره نمیخواد بری مسافر خونه - بخوانید پارک - ولی در خطه ی افسانه ای ایران همچین اتفاقایی هم افسانه ست ! وقتی پا در راه میذاری باید خودتو آماده ی هزار خان جور واجور کنی ! از بی پولی و بی مکانی گرفته تا براورده نشدن مقصودت و بی نتیجه برگشتن ! باید کفش فلزی بپوشی و عزم کنی باری ! توی این تاریخ رزرو 24 ساعت جای خواب با یه توالت و یه دوش و البته یه مینی یخچال و یه کولر گازی که مسلما از تلف شدن توی شرجی بی امان هوا قراره نجاتت بده ! برای دو همسفر 750 هزار تومن آب میخوره که با معادلات پیچیده ی ریاضی که از حوصله ی این مقال خارجه میشه محاسبه کرد سهم هر نفر 375 تومنه !  امیرحسین ! از من هفت سالی بچه تر بود اما سر پر سوداتری داشت . من از اینام که لای دستمال کاغذی بزرگ شدن و وقتی بزرگ شدن یهو انداختنشون زمین ! مهارتهای روبرو شدن با جهان رو درست لحظه ای که برای اولین بار توی اتوبوسی نشستم که مقصدش سیرجان بود شروع به یادگیری کردم در سن 19 سالگی وقتی کارشناسی علوم کامپوتر قبول شده بودم ! از کردستان تا کرمان ! 17 ساعت اتوبوسی به تاخت میرفت و این اولین و طولانی ترین سفری بود که به تنهایی در سیر سلوکم آغاز و  پیمودم !از اون روز به انحای مختلفی به بهانه های جورواجور بار سفر به نقاط مختلفی بسته ام و هر بار لحظه ی اول حرکتم برام بسیار سخت میگذره و انگار سوار قطاری شدم با سیل مسافرانی یهودی و هراسی سخت هر دم توی وجودم شدت بیشتری میگیره . منتظرم برای کار اجباری به کارخانه ی اسلحه سازی برده بشیم .اما ناگهان ؛&quot;سوت قطار مانند ضجه کسی بود که التماس کنان به سوی نیستی سقوط میکرد. سپس قطار به خط دیگری تغییر مسیر داد وپیدا بود که به ایستگاه بزرگی نزدیک می شویم. ناگهان از میان مسافران مضطرب،فریادی به گوش رسید،«تابلو آشویتس!»بله آشویتس نامی که مو بر تن همه راست میکرد:اتاق های گاز،کوره های آدم سوزی، کشتارهای جمعی.قطار آنچنان آهسته و با تأنی مرگباری در حرکت بود که گویی می خواست لحظه های وحشت ناشی از نزدیک شدن به آشویتس را کشدار تر ازآنچه هست بگرداند:آش ... ویتس!&quot; انسان در جستجوی معنا - دکتر ویکتور فرانکل فکر میکنی طبیعی نیست این همه اضطراب ؟ چرا طبیعیه ...  اما از میان همه ی مسافران این قطار من همون فرانکلم ! که توی ذرات موقعیتی که درش غوطه میخورم دنبال معنا میگردم ... سرتونو درد نیارم سه شب هتل ماسوله موندیم و با اینکه بیشتر مسافرای این هتل دوستاره از دانشجوهایی بودن که برای امتحان اومده بودن و خود کشیر اعتراف کرد که شلوغ ترین فصل کارشون همین چند روز امتحانات ماست اما بخودشون زحمت یه تخفیف دل خوش خنک رو هم ندادن  هتل ماسوله بدی نبود ! ولی سال بعدی اگر در کار باشه اونجا بر نمیگردم ! امیرحسین میگفت با همین پول جای دیگه ی بهتری هم هست   1403 هستیم خرداد ماهبیا یه بررسی کنیم ده سال پیش-  1393-با همین پول چه ها میشد کرد ؟ 750 هزار تومن وجه بی زبون مملکت.دلار توی ماههای ابتدایی سال 93 تا اواخر تابستون بین 3000 تا 3300 تومن بود یعنی 750 هزارتومنی که بابت یه شب خوابیدن تو یه هتل دو ستاره دادیم میشه 250 دلار سال 93 . امروز همین حالا دلار قیمتش 61000 تومنه و 250 دلار یعنی 15 میلیون و 250 هزار تومن یه هتل 5 ستاره تو شمالبا 750 تومن دو نفر میتونستن 2 شب و سه روز توی یه هتل 5 ستاره اقامت کنن ! ای بابا ...</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Tue, 18 Jun 2024 17:04:40 +0330</pubDate>
            </item>
                    <item>
                <title>The project you were looking for could not be found or you don&#039;t have permission to view it</title>
                <link>https://virgool.io/@xhmoazedi/the-project-you-were-looking-for-could-not-be-found-or-you-dont-have-permission-to-view-it-er2do0ksvtpg</link>
                <description>The project you were looking for could not be found or you don&#039;t have permission to view itپس از نصب هر یک از توزیع های لینوکس یکی از رایج ترین معضلاتی که همه باهاش دست و پنجه نرم کردیم ست کردن دوباره ی سیستم هست ! docker , postgres , network, git credentials , vscode وکانتینر هاش و ... هر کس به فراخور کاری که میکنه و زبانی که داره کد میزنه(من با Golang کد میزنم) ابزارهای دیگه ای که خودش میتونه به این لیست اضافه کنه ... وپس از نصب و راه اندازی همه ی موارد یکی از بدترینهاش زمانی هست که با اینکه کردنشال رو برای گیت ست کردی و به راحتی می تونی پروژه هایی که میخوای رو روی سیستمت کلون بگیری اما برای دریافت پکیج ها روی vscode چنین اروری میگیریThe project you were looking for could not be found or you don&#x27;t have permission to view itوقتی به چنین اروری میخوری چند تا راه رو برای حلش امتحان کن :1 * شاید داری پکیجی رو از گیت لب شرکت درخواست میدی که در این صورت حواست باشه که متغیر محلی مربوطه رو درست مقدار دهی کرده باشی در مورد Go با این دستور میتونی مقدارهای ست شده برای متغیر های این زبان رو ببینی :go env و بطور کلی در محیل لینوکس با دستور زیر یشه متغیرهای محیطی و مقادیر ست شده برای اونها رو دید sudo env و در این مورد دنبال متغیر GOPRIVATE باید بگردی و مقدارش رو از تیم لید بگیر و اینجا ست کنexport GOPRIVATE=&amp;quotthe.private.address&amp;quot 2 * شاید باید برای دسترسی به پکیجهای شرکت از پشت یه پراکسی درخواستت رو انجام بدی و این بخاطر مسایل امنیتی پروتوکولی هست که برخی شرکتها درنظر میگیرن پس برای متغیر GOPROXY این مقدار رو هم از نیروهای دواپس شرکت بپرس و ستش کن3 * مطمین شو که به VPN  متصل نباشی و دوباره امتحان کن ! و اگر بهش متصل نیستی اطمینان حاصل کن که این مساله بخاطر تحریم بودن ما نباشه پس به VPN متصل شو یا به وب سایت shecan شکن ! مراجعه کن و dns رو ست کن و دوباره امتحان کن4 * اگر برای یه شرکت کار میکنی و چنین اروری میگیری از تیم لیدت بپرس که آیا برای دریافت و دانلود و pull گرفتن از پکیج یا پکیج هایی که براشون درخواست زدی دسترسی مربوطه رو داری یانه . بسیاری از مواقع این مشکل از محدودیت سطح دسترسی بوجود میاد5 * و در آخر با آدرس HOME برو و با زدن کلیدهای ترکیبی ctrl + h مقادیر پنهان شده رو هم در دیدرس قرار بده و دنبال فایلی با نام .netrc بگرد . اگر چنین فایل متنی با پسوند txt داری ! اون رو با یکی از از ادیتور ها مثل نانو به شکل زیر با دستور 1 باز کن و اگر نداری با دستور 2  اون رو بساز و با دستور 1 باز کنcommand 1 : nano ~/.netrc
command 2 : touch ~/.netrc اگر فایلی که ساختی یا اگر از قبل موجود بوده و بازش کردی غیر قابل ویرایش بود دستورات رو با sudo بصورت روت وارد کنید حالا با کپی کردن این خط در فایلی که ایجاد کردید و جایگذاری آدرس گیتلب. یوزرنیم و پسورد  در محل مورد نظر و ذخیره اون / به سیستمت اطمینان بده که حتما به مقادیر امنیتی شما برای دسترسی به گیت هاب یا گیت لب دسترسی داشته باشهmachine &lt;&lt;ADDRESS&gt;&gt; login &lt;&lt;USERNAME&gt;&gt; password &lt;&lt;PASSWORD&gt;&gt;لازمه تذکر بدم که پسورد شما برای دسترسی به ریپوزیتوری های موجود در گیت لب یا گیت هاب توکنی هست که خودت باید در محیط گیت هاب ایجاد کنی که از حوصله ی این موضوع خارجهپ .ن : سخت نگیر  و اگه چیزی بلدی که فکر میکنی من بلد نبودم یا به هر دلیلی نگفتم! شما اضافه کن ما یاد بگیریم</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Wed, 03 Apr 2024 15:34:17 +0330</pubDate>
            </item>
                    <item>
                <title>Downgrade the Kernel in Ubuntu</title>
                <link>https://virgool.io/@xhmoazedi/downgrade-the-kernel-in-ubuntu-xijwwmmjlwcp</link>
                <description>کرنل چیه :کرنل بخش مرکزی سیستم عامل شماست ! در واقع یه رابطه که از طریق اون با سخت افزارت ارتباط می گیری . کرنل شما مسئول برخی از فرآیندهای حیاتیه، مث مدیریت حافظه ی سیستم یا دادن دسترسی پراسس به CPU و ...  همه ی سیستم عاملهایی که میشناسیم از یه کرنل برای ارتباط با سخت افزارشون استفاده میکنن .همنوطوری که انتظار میره این کرنل ها هم هی دارن روز از پی روز توسط شرکت سازنده شون - اگه سورسشون باز نیست - و - اگر open source باشن توسط دولوپرهای عزیز از سراسر جهان البته با مجوز مینتینر (maintainer) آپدیت میشن - خب ! علی القاعده انتظار نداریم هرکی هر چرت و پرتی بخواد رو به عنوان یه آپدیت معرفی کنه . باید توجیه داشته باشه ! درسته که سورس باز هستن ولی نه اونقدر باز که سوز بیاد و بره ! هرچند البته از زمانی که آپدیتهای یه کرنل میاد تا زمانی که یه نسخه ی LTS(long term service) ازش میاد که خوبا تاییدش میکنن - گردن می گیرنش - خیلی از نسخه ها باگ های پر خامه و درست حسابی دارن ! مثلا : در مورد کرنل linux-image-6.5.0-26-generic  خودم برخوردم و خیلی هم گزارش خرابی ثبت شده که با خاموش کردنش از  طریق GUI  داون میشه ولی پاور آف نمیشه ! طوری که مجبور میشی force shutdown کنی !  راهش اینه اگه چنین مشکلی داری داون گرید کنی یعنی یه نسخه پایین تر رو نصب کنی که موضوع ما هم هستچطور با یه نسخه ی پایین تر اوبونتو رو بوت کنیم : ابونتو یه راه حل اورژانسی برامون در نظر گرفته برای زمانی که احیانا یه آپگرید انجام میدی و متوجه میشی دوستان  محض سرگرمی آپگرید دادن ! و چیزا درست کار نمی کنه ۱ - ری استارت میکنی ۲ قبل از اینکه فرایند استارت آپ شروع بشه یکی از تکمه های زیر رو با توجه به وضعیت سیستمت فشار بده تا به صفخه ی زیر هدایتت کنه * اگربوت سیستمت از UEFI استفاده میکنه ESC* اگر از BIOS استفاده میکنه Shiftاگر کار رو درست انجام داده باشی باید منوی GRUB رو ببینی و روی این گزینه اینتر بزن Advanced Options for Ubuntuحالا اتفاقی که می افته نسخه هایی از کرنل که ایمیجش روی سیستمت وجود داره بهت نمایش داده میشهکرنلی که میخوای رو انتخاب کن و اینتر بزن یه چیزی شبیه اینحالا این نسخه از کرنل بوت میشه ولی با توجه به اولویت بوت ! دفعه ی بعد که ریبوت کنی باز هم روی نسخه ی پیش بوت میشه!پس بهتره نسخه ای که مشکل داره رو ریمو کنی وبا نسخه ی بهتر و مطمین تر کار کنی !قابل توجه اینکه اگه حوصله داری هر بار اینجوری بوت کنی اینم حذف نکن ! چون ممکنه این مشکلی که روی این یکی داری رو نداشته باشه در عوض یه بهترشو داشته باشه ! مجبور شی برگردی به اولی ! ولی in case اینم راه داون گرید کردنه :داون گرید کردن اوبونتو :  اول با استفاده از همون نسخه ای که باهاش به مشکل خوردی بوت کن !- که احتمالاا بدون اینکه به چیزی دست بزنی ریبوت کنی خودش همونو میاره بالا -یه ترمینال باز کن و این کامند رو وارد کن :
dpkg –list|grep linux-imageاگر ازت پرمیشن خواست با sudo بزناین مرحله به شما تمام ایمیج نسخه ها رو نمایش میده نسخه ای که میخوای حذف کنی رو یه جا کپی کن که دم دستت باشه حالا این دستور رو بزن dpkg -list|grep linux-headerاینجا همون ایمیجها رو بهت نمایش میده اما هدرهاش !هدر مخصوص همون نسخه رو هم کپی کن بذار  همونجایی که بالایی رو نگه میداری که اینم دم دست باشهحالا با این دستور کرنل رو حذف کنsudo apt-get purge linux-image-unsigned-6.1.1-0601010-genericازت میپرسه مطمینی ؟ اگه هستی با یه Y بهش اجازه ی حذف رو بده و بعد با دستور بعدی هدرش رو هم حذف کن 
sudo apt-get purge linux-headers-6.1.1-060101-genericو تمام ...حالا اگه یه بار دیگه از ایمیجهای موجود روی سیستمت لیست بگیری نباید اون نسخه رو ببینی !و با ریبوت ! روی کرنلی که به اولویت اول رسیده بوت خواهی شد !از من میشنوی اما ! اگر ایشویی که داری اونقدرها هم مشکل مهمی نیست ! حذفش نکن . یه روز به دادت میرسهپ . ن !سخت نگیر و اگه در این مورد چیزی میدونی که بهتره ما هم بدونیم بهمون بگو</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Thu, 28 Mar 2024 12:33:39 +0330</pubDate>
            </item>
                    <item>
                <title>آخه چرا panic می کنه ؟؟؟؟</title>
                <link>https://virgool.io/@xhmoazedi/%D8%A2%D8%AE%D9%87-%DA%86%D8%B1%D8%A7-panic-%D9%85%DB%8C-%DA%A9%D9%86%D9%87-qyk0sypxrhqj</link>
                <description>چرا این کد panic می کنه ؟var m map[string]float64
m[&amp;quotpi&amp;quot] = 3.1416panic: assignment to entry in nil mapحق داری ! ولی قاعده ش اینه که وقتی میخوای یه map تعریف کنی و بهش مقدار بدی باید با make بسازیش :) m := make(map[string]float64)
m[&amp;quotpi&amp;quot] = 3.1416یه وقتایی آدم یه چیزو نمی دونه یه وقتایی میدونه ولی حواسش نیست کد نویسی یعنی همین !اگه بلد نیستی یاد بگیر اگه بلدی انجام بده گیر میکنی  فکر میکنی میگردی راهشو پیدا می کنینگران نباش اگه خیلی خفنی چیزای جالبی بلدی به ما هم بگو </description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 09 Apr 2023 18:00:47 +0330</pubDate>
            </item>
                    <item>
                <title>Naming REST API Endpoints</title>
                <link>https://virgool.io/@xhmoazedi/naming-rest-api-endpoints-q8s7x6nf8a9u</link>
                <description>سلام روز همه بخیر امیدوارم نسیم آزادی به زودی وزیدن بگیره برای آزادی #جادی و همه ی در بندان و شادی روح شهدای آزادی توی این روزهای سخت یکی از وظایفی که بر خودم توجه به اون رو واجب می دونم توجه به پیشرفت شخصی خودم و اشاعه ی فرهنگ سعی برای حرکته . یکی از دوستان از قول جیمز کلیر به نقل از کتاب عادتهای اتمی می گفت : بزرگترین تهدید موفقیت شکست نیست تن آساییه ! ومن چقدددر باورش دارم .... دوستان تواناییهاتون رو به کار بگیرید که تو بدنتون خشک نشن ! زندگی همراه خوب حرکته ! به مرور و بدون اینکه بفهمی بهت جایزه ش رو میده به قول دوستان انگلیسی زبانمون belive in progress  باری ! در مورد naming میخوام یه چند تا نکته از این منبع  استخراج کنم استفاده کنم در اختیار شما هم بگذارم (احتمالا یه نکته هم به مقاله ی time in golang اضافه می کنم ) REST API naming conventions(قواعد نام گذاری در  فریم ورک REST)× قانون اول و مهم اینه که برای نام گذاری از اسم استفاده بشه نه حرف و نه فعل ! اسمی که با دیدنش مخاطب محتوای اون url  رو براحتی حدس بزنه ×  قانون بعد اینه که هیچگاه از کلمات مختصر شده و گنگ استفاده نشه مثلا deletefriendshipRequest رو نباید delFR یا چیزهایی شبیه به این نوشت که تنها شما و آنهم در مواردی که scale کارتون کمه می فهمیدش و بقیه و حتی خودتون در scale بالا اصلا ازش سر در نمیارید ! و حتی یادمون باشه که اسمی که من گذاشتم هم درست نیست چون هم حاوی یکی از ارکان CRUD یعنی delete هست هم در کل فعله ! × پس یه قانون دیگه هم داشته باشیم : در url نویسی هر گز از کلمات کلیدی HTTP استفاده نشه (و...create,update,read, delete,get,post) چون هم کلمه ی کلیدی هستن و هم فعل هستند × قانون بعد : از (/) و (\) و (:) -slash, backslash,colon و (؛)و (&quot;&quot;). (=), ...- درست استفاده کنید اینها برای استفاده ی REST رزرو شدن و نمی تونید جز در مواردی که برای اونها تعریف شده استفاده شون کنید مثلا : اسلش برای جدا کردن ثفحات مربوط به یک category استفاده میشه به عنوان مثال : users/admin/settings× برای جدا کردن کلمات ترکیبی از dash یا hyphen (-)  ونه underline (_)  ونه cammleCase استفاده کنید مثال درست : user-numbers   | | مثال غلط : user_numbers     OR    userNumbers بین همه توافق شده که (همه که میگم خودمون منظورم نیست ! از ما بهترون منظورمه ) که از هایفن برای جدا کردن کلمات ترکیبی استفاده بشه هم در تایپ راحتتره هم فهمش برای عموم ساده تره . حالا ممکنه من و شما نظرمون چیز دیگه ای باشه ... خب اینجا آزادی حتی خراب کاری هم بکنی چه برسه به  با متد خودت url نوشتن ! اما خب بهتره به این خرد جمعی اعتماد کنی مهندس! جواب میده (به غلط کردم بعدش نمی ارزه ...در اسکیل های بزرگ به عرفانی دست پیدا میکنی که این دوستان یه چیزی می دونستن که اینارو گفتن بعد اگر لیاقت اینو داشته باشی که راه بازگشتی وجود داشته باشه که خوش اقبالی و اگر نه ! تکمه رو غیر فعال کردن و فقط می مونه آه ندامت و دست حسرت زدن بر دامان ) × حروف رو lowercase استفاده کنید  . این قانون کوتاه و شیر فهم و مختصره . از حروف بزرگ استفاده نکن ×  قانون بعد میگه هرگز از پسوند برای url ت استفاده نکن یعنی : users/admin.xml نداریم users/admin خلاص ! اگه مایلی type رو به نمایش بذاری راه های دیگه ای هست Content-Type entity-header × و قانون آخر این قوانینو همیشه رعایت کن! اینجوری دو سه تا خوبی داره : یک حرفه ایه دو منظمه سه همه فهمه و کارت با کار بقیه که حرفه ای هستن تداخل پیدا نمی کنهخسته نباشید و به منبعی که بالا گفتم هم سر بزنید .. هر چند همینا رو گفته که م گفتم ولی منبعه حتما می تونید چیزای  بهتری ازش یاد بگیرید .. اگه کارتون درسته و جایی از ایم مقاله ایراد می بینید یا کم و کاستی داره به مام بگید اصلاحش کنیم و بیشتر یاد بگیریم اگر هم اول راهید : نگران نباشید راه میافتید کم کم  انقدرهام سخت نیست take it easy ...خالد.م</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Mon, 05 Dec 2022 16:37:45 +0330</pubDate>
            </item>
                    <item>
                <title>Generics in Golang</title>
                <link>https://virgool.io/@xhmoazedi/generics-in-golang-ur0tvpwuhgxu</link>
                <description>سلام دوستان امیدوارم در این روزهای سخت حالتون خوب باشه وقوی باشید #mahsa_aminiمتنی که اینجا می بینید  برداشتی خواهد بود از سورس اصلی وب سایت Go که اگه روی این بخش کلیک کنید() خواهید دید.برای اینکه اگر کسی به زبان تسلط کافی نداره زیاد محروم نباشه تا زمانی که زبانو یاد می گیره چون راهی جز این نیست#برای_آیندهاین آموزش به مبانی Generics در زبان Go می پردازه.با این مفهوم می تونی function ها و type هایی رو تعریف و استفاده کنی که به منظور کنار اومدن با هر نوع از داده نوشته شدن (میدونیم که برای تعریف هر نوع از متغیر باید type خاصی که در ظرف متغیر مدنظر ما قرار خواهد گرفت رو مشخص کنیم مثلا : type x string  میگه متغیر x ظرفی هست که تنها و تنها مقادیری از رشته ها رو در خودش نگهداری میکنه . مفهوم Generics به معنای عمومی ها مارو از این محدودیت میخواد در بیاره) اینجا ما قراره به دوشکل یک عمل رو انجام بدیم یکی به وسیله ی non-Generic function ها که طبیعتا ما ازشون استفاده میکنیم و بعد همون عمل رو به Generic Function ها بسپاریم ببینیم چی میشه !مراحل کار اینان :۱- یه folder برای کدت می سازی۲- یه سری non-Generic function اضافه میکنی۳- یه generic Function برای هندل کردن چند تایپ  (multiple types) تعریف میکنی۴- وقتی generic function رو وسط میاری دیگه نوع داده ها رو از بین انواع مجازش خودش تشخیص میدهخب اول یه سمپل hello world که دستت گرم بشه بزن :شوخی کردم جدی نگیر &lt;span style=&#x27;font-size:100px;&#x27;&gt;&amp;#128530;&lt;/span&gt;امیدوارم مرحله ی اول رو که پیش نیازهای نوشتن این کدها باشه بتونید انجام بدید (اگه نمی تونید پیشنهاد میکنم فعلا این قلمو فراموش کنید بر گردید راه اندازی رو کار کنید // یعنی ساخت یه فولدر :| یه ماژول go و یه function main - تمام این مراحل رو منبعی که بالا قرار دادم و این متن تقریبا ترجمه ی اونه براتون شرح داده)خب زیر تعریف نام پکیج این فانکشن non-Generic رو اضافه می کنیم(منظور همون تابع های عادی هست که همیشه استفاده کردیم . این یک نمونه ش هست)یه trace انجام بدید ببینید منظور این دو function رو متوجه میشید یانه function اول یه map که string رو به int64 قراره map کنه  به عنوان ورودی گرفته و  int64 ها رو هم به عنوان مقادیری که کلیدش string بوده جمع میزنه و به ما قراره برگردونه function بعدی همونه فقط ورودی تابع یه map هست که بجای int64 داره float64 بر میگردونهقصه رو گرفتید ؟ بحث ما راجع به type هاست . ورودی ها و خروجی های این دو فقط type های مختلف دارن اگرنه اعمال یکسانی رو دارن انجام میدن : یه map بگیر و مقادیر map جمع کن و بر گردونحالا بیا تو تابع main مطابق تصویر بالا دوتا map بساز و مقدار دهی کن و به توابعی که بالاتر ساختیم pass بده که نتایج رو ببینی : دیدید ؟ برای اینکه روی map ها با key-value های مختلف الانواع (multiple types) و البته خروجی های از type های مختلف محاسباتی رو انجام بدیم non-generic function های زیادی باید مصرف بشه و این یعنی کد بیشتر احتمال خطای بیشتر صرف زمان و خستگی بیشتر حجم بالاتر maintenance دشوار تر و پر هزینه تر و پیچیدگی بیشتر و...حال چه کنیم ای وی ؟کار کردن با generic function ها را فراگیر و کار بند که صرفه در هزاین خویش بجویی :)برای اینکه بتونیم مقادیر از انواع int64 , float64 رو در ورودی یکسان به یک تابع Generic بدیم در مثال بالا اینکارو میکنیم: قبل از آرگومان های ورودی تابع . درست پس از نام تابع در یک براکت باز و بسته مقادیر رو برای عمل function تعریف میکنیم :func SunIntsOrFloats[K compairable, V int64 | float64](m map[K]V) Vیه توضیحی بدم : همونطور که میدونیم کلید مورد استفاده در هر دو map ی که استفاده کرده بودیم از نوع string بود درسته ؟پس این مقداریه که قراره مقایسه بشه با مقادیر متناظرش . اینو میذاریم compairable چیزی که نوعش متفاوت بودvalue ما بود که متغیرش رو میذاریم V  و با یه علامت خط عمودی که معنای OR میده بهش تمام available option هاش رو میدیم که میشه دو نوع int64 و float64 و به حکم or هرکدوم بیاد میگیره حالا بریم که این فانکشن رو استفاده کنیم جای قبلی :و خروجی : هنوز چیزای زیادی راجع بهش هست که باید یاد بگیریم ولی فعلا کافیهtake it easy ...مثل همیشهمراقبت از خودتون اولین اولویت باشه که فردا ها همدیگه رو ببینیمبه یاد جادی میرمیرانی عزیز</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Tue, 29 Nov 2022 11:32:56 +0330</pubDate>
            </item>
                    <item>
                <title>time in golang</title>
                <link>https://virgool.io/@xhmoazedi/time-in-golang-nl17099m38kn</link>
                <description>سلام ! امیدوارم حالتون زیاد بد نباشه!از وقتی جادی رو گرفتن انگار واقعا فهمیدم شوخی نیست! به یاد جادی ! بهترین و دوست داشتنی ترین تکنولوژیست ایران و برای آزادیش و سلامتیش  #مهساـامینی:خب قاعدتا ما با زمان کار داریم تو هر زبانی تو ی گو هم همینطور : چند تا نکته در مورد استفاده از زمان :برای نمایش زمان الان من  اینکارو میکنم : با دستور time.Nowpackage main

import (
	&amp;quotfmt&amp;quot
	&amp;quottime&amp;quot
)

func main() {
	currentTime := time.Now()
	fmt.Println(&amp;quotThe time is&amp;quot, currentTime)
}


خروجی این تیکه کد قاعدتا چون هر دفعه زمان همون لحظه رو میخونه و چاپ میکنه هر دفعه با دفعه ی پیش فرق داره یه m= توی نتیجه هست غیر از زمان که یه عدد رو نشون میده کوچیکتر از یک ! این ساعت مونوتکنیکه که برای خطاهای احتمالی در نظر گرفته شده تا دقت زمان بیشتر باشه ! زیاد بهش توجه نکنیم بهتره ! اگه اما خواستیم بیشتر راجع بهش بدونیم بریم اینجا حالا همون تیکه کد بالا ! رو با یه سری متد ها امتحان کنیم که بجای کل زمان فقط سال رو فقط ساعت رو دقیقه رو یا ماه رو بهمون نشون بدهfunc main() {
	currentTime := time.Now()
	fmt.Println(&amp;quotThe time is&amp;quot, currentTime)
	
	fmt.Println(&amp;quotThe year is&amp;quot, currentTime.Year())
	fmt.Println(&amp;quotThe month is&amp;quot, currentTime.Month())
	fmt.Println(&amp;quotThe day is&amp;quot, currentTime.Day())
	fmt.Println(&amp;quotThe hour is&amp;quot, currentTime.Hour())
	fmt.Println(&amp;quotThe minute is&amp;quot, currentTime.Hour())
	fmt.Println(&amp;quotThe second is&amp;quot, currentTime.Second())
}
توجه کنید که وقتی از متد time.Month() استفاده میکنید خروجی string هست و بشکل نام ماه مثلا : August ر و اگه بصورت تایپ type توی متد print بیاریمشون بازهم به شکل اول پرینت خواهند شد :
fmt.Printf(&amp;quot%d.%d,%d.%d:%d:%d:%d\ncurrentTime.Year(),currentTime.Month(),currentTime.Day(),currentTime.Hour(),currentTime.Minute(),currentTime.Second(),)output :The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
2021-8-15 14:14:45: برای اینکه خودمون بخوایم تایمی رو ست بکنیم اینجوری انجام میشه :...func main() {	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)	fmt.Println(&amp;quotThe time is&amp;quot, theTime)}The time is 2021-08-15 14:30:45.0000001 -0500 CDT    &lt;......output   :الان بیشتر چالش خودم مقایسه ی بین زمانها بود که اینجا میارمش :در این زبان چهار رتا راه برای مقایسه ی زمانها وجود داره : date1 == date 2 این اگه دوتا تایم کاملا یکی باشن ترو میدهdate 1 != date2 اینجا اگه یکی نباشن ترو میدهdate1.Before(date2) اگه زمان اول قبل از زمان دوم باشهdate1.After(date2) اگه زمان اول بعد از زمان دوم باشهفقط یه چیزی ! این دوتا فانکشن ۳ و ۴ اگه زمانها کاملا یکی باشن فالس بر میگردوننفکر میکنم واسه این دفعه همین چند خط کافیه take it easy...</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Tue, 01 Nov 2022 16:36:19 +0330</pubDate>
            </item>
                    <item>
                <title>refresh token</title>
                <link>https://virgool.io/@xhmoazedi/refresh-token-aa9mcx9neky0</link>
                <description>کوتاه و گویا :دیاگرام بالا چی نشون میده ؟ SPA = Single-Page ApplicationAS = Authorization ServerRS = Resource ServerAT = Access TokenRT = Refresh Tokenببین تو قراره به یوزرت برای دسترسی به ریسورسهایی که داره یه توکن دسترسی بدی غیر اینه؟ اون میشه access token  که authorization server میده / بعد این توکنی که داری یه یه ربع بیس دقیقه مثلا زمان استفاده شه و بعد اکسپایر میشه حالا سیستم یوزرو لاگ اوت کنه بنظرت و یوزر دوباره لاگ این کنه ؟ یاااا یه توکن با مدت زمان اکسپایریشن بیشتری به یوزر بدیم که اونو هر دفه دم اکسپایر شدن اکسس توکنش به authorization server بفرسته سرورم دوباره یه access token جدید صادر کنه بعد یوزر ازش استفاده کنه اطلاعاتی که میخواد بگیره ! نظرت؟ من دومیو می پسندمخب دومین توکنی که میخوایم به یوزرمون بدیم میشه ؛ refresh tokenحالا با توجه به چیزایی که گفتم تصویرو ببین ! گویاتره نه؟همین!میخوای بیشتر بخونی راجع بهش؟ این تصویرو این توضیحات منبعش اینجاست -------&gt; اینجاtake it easy ... programming is not so complexاگه توضیح بهتری داری یا فک میکنی چیزی اشتباهه به مام بگو </description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sat, 10 Sep 2022 18:49:14 +0430</pubDate>
            </item>
                    <item>
                <title>what is a module ماژول چیه ؟</title>
                <link>https://virgool.io/@xhmoazedi/what-is-a-module-%D9%85%D8%A7%DA%98%D9%88%D9%84-%DA%86%DB%8C%D9%87-ucpc08clvki5</link>
                <description>ماژول یه بخش از برنامه ست که یه کار خاصی  رو انجام میده ! خیلی ساده بود نه؟دنبال یه پیچیدگی بودی که سعی کنی درکش کنی؟ وقتی چند تا ماژول دست به دست هم کنار هعم قرار میگیرن میتونن یه برنامه رو بسازن !ماژول ها به ما کمک میکنن بتونیم فقط رو یه بخش از برنامه مون و فانکشنالیتی خاصی تمرکز کنیم . معمولا ماژول ها رو با  اینترفیس ها مدیریت و هندل میکنیم! اگر میخواید اینو انگلیسی بخونین برید به این لینکو مخاطبایی که خیلی کارتون درسته! لطفا تعریف بهترش رو برامون کامنت کنید ممنونیمtake it easy bro taike it easy ...</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sat, 03 Sep 2022 11:37:04 +0430</pubDate>
            </item>
                    <item>
                <title>http.NewRequest using golang</title>
                <link>https://virgool.io/@xhmoazedi/httpnewrequest-using-golang-xadealvfahi3</link>
                <description>package mainimport (&amp;quotfmt&amp;quot&amp;quotio/ioutil&amp;quot&amp;quotnet/http&amp;quot&amp;quotos&amp;quot&amp;quottime&amp;quot)const serverport = 3333func main() {go func() {mux := http.NewServeMux()mux.HandleFunc(&amp;quot/&amp;quot, func(w http.ResponseWriter, r *http.Request) {fmt.Printf(&amp;quotserver: %s /\n&amp;quot, r.Method)fmt.Fprintf(w, `{&amp;quotmessage&amp;quot: &amp;quothello!&amp;quot}`)})server := http.Server{Addr:    fmt.Sprintf(&amp;quot:%d&amp;quot, serverport),Handler: mux,}if err := server.ListenAndServe(); err != nil {fmt.Printf(&amp;quoterr running http server : %s \n&amp;quot, err)}}()time.Sleep(100 * time.Millisecond)requestURL := fmt.Sprintf(&amp;quothttp://localhost:%d&amp;quot, serverport)//http.NewRequest creates the request but dose not send it to server right away//so we can make any changes to itreq, err := http.NewRequest(http.MethodGet, requestURL, nil)if err != nil {fmt.Printf(&amp;quotclient: could not create request: %s\n&amp;quot, err)os.Exit(1)}//http.DefaultClient.Do sends the req to the server//DefaultClient value is Go&#039;s default http client. the same we&#039;ve been using with http.Get()res, err := http.DefaultClient.Do(req)if err != nil {fmt.Printf(&amp;quotclient: error making http request: %s\n&amp;quot, err)os.Exit(1)}fmt.Printf(&amp;quotclient: got response! \n&amp;quot)fmt.Printf(&amp;quotclient : Status code : %d\n&amp;quot, res.StatusCode)//ioutil.ReadAll is been used to read the http response&#039;s bodyresBody, err := ioutil.ReadAll(res.Body)if err != nil {fmt.Printf(&amp;quotclient: could not read response body: %s\n&amp;quot, err)os.Exit(1)}fmt.Printf(&amp;quotclient: response body: %s\n&amp;quot, resBody)}توی github خودم هم میتونید این رپو رو با توضیحاتش ببینیدtake it easy ...</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Wed, 17 Aug 2022 12:00:46 +0430</pubDate>
            </item>
                    <item>
                <title>تفاوت Cookie و Session</title>
                <link>https://virgool.io/@xhmoazedi/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-cookie-%D9%88-session-flsmi4qjv6zn</link>
                <description>سلام عزیزان ! 
این چند جمله در تفاوت کوکی و سشن تقدیم به اونایی که دربه در دنبال منابع فارسی ان که کوتاه و مختصر سوالشون رو پاسخ داده باشه :
کوکی ها سمت کلاینت هستند و سشن ها سمت سرور .. کوکی ها بخشی از اطلاعات یوزر رو روی سیستم خود یوزر به صورت لوکال ذخیره میکنن و تا زمانی که خودتون عمدا یا بصورت تصادفی حافظه ی کش رو خالی کنید باقی می مونن اما کوکی ها اطلاعاتی از یوزر رو سمت سرور ذخیره میکنن و تا زمانی که یا بروزر رو ببندید یا لاگ اوت کنید می مونن و بعد اکسپایر میشن !!خدمت شما !take it easy ...</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Wed, 17 Aug 2022 10:27:44 +0430</pubDate>
            </item>
                    <item>
                <title>gRPC در زبان golang</title>
                <link>https://virgool.io/@xhmoazedi/grpc-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-golang-hcbwa4jt7wh2</link>
                <description>مفهوم gRPC : یک RPC (remote procedure call) هست حالا به ساده ترین حالت ممکن RPC چیه ؟ یه پروتوکوله که ارتباط بین سرویسهای مختلف رو مدیریت میکنه بطوری که لازم نیست از جزییات کار باخبر باشیم . یه درخواست میگیره درخواست رو به سرویسی که میخوایم میفرسته پاسخ دریافتی از اون سرویس رو به کلاینت پس میفرسته (یه واسط)حالا grpc همون پروتوکوله که استانداردش رو google نوشته ! شرکت ارایه کننده ی go! پس مشخصه که باهم خیلی خوب کنار میان شما اینجا با یک سرویس client server مواجهید که بینش grpc ارتباط رو برقرار میکنه یعنی رکوست هارو از کلاینت به سرور و بالعکس ردوبدل میکنه !من میخوام الان اینجا یه سرویس note ساده بنویسم که یه پیغام رو save و رترایو میکنه :در اولین اقدام خب ماژول رو میسازیم و اسمش رو من گذاشتم notesService . بعد یه فایل .proto که اسمش رو من میذاریمnotes.proto توی یه فولدر به همین نام .. تصویر پایین گویاست :از خط اول تا آخر یه تعریف کوتاه و ساده : اول اینکه با پروتوکول proto3 نوشته میشه که یعنی طبق آخرین تغییراتیه که روی این syntax اعمال شده option go_package = &amp;quot./&quot;       :     اینجا آدرسی که قراره نتیجه ی جنریت شدن کدهای پروتو ذخیره بشن رو میذاریم... package notes ; اسم پکیج رو مشخص میکنیم service Notes {//saving a noterpc Save(Note) returns (NoteSaveReply);//retrieving a noterpc Load(NoteSearch) returns(Note);}اینجا اینترفیسمون رو با سینتکس grpc داریم که یه متد save و یه متد Load داره که ورودی اولی یک نوت خواهد بود و خروجیش یه مقدار بولین و ورودی دومی یک کلید خواهد بود و خروجیش یک نوت //The request messagemessage Note {string title =1;bytes body =2;}
//The response messagemessage NoteSaveReply{bool saved = 1;}//The Retrieving note requestmessage NoteSearch {string keyword =1;}حالا با وارد کردن این دستور در terminal :  protoc --go_out=plugins=grpc:./notes notes/notes.protoفایل پروتو رو جنریت کنیم و نتیجه رو توی همون فولدر notes ذخیره کنیممن همچنین پس از اینکه دستور جنریتور رو زدم یک بار go mod tidy رو هم میزنم تا پکیج هایی که باید ایمپورت بشن (قابل توجهتون این که این پکیج ها رو باید با اتصال به نت بگیرید)این دستور که بالاتر گفته شد و جنریت میکنه پروتو رو / نتیجه ی جنریت رو در قالب یک فایل بر میگردونه که بالا با نام notes_pb.go میبینیمش .. اما از اگه از این کد دستوری استفاده کنیم :protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative notes/notes.protoدر این حالت دو شیت خواهیم داشت که یکی notes.pb.go و notes_grpc.pb.go هست و در این حالت دومی ارتباطات grpc  رو مدیریت میکنه note.go رو باهاش کاری نداشته باشید .... :)))بهتره از این کد دستوری دوم استفاده کنیم !این چند خط میتونه تو رو در تولید proto file به شیت .go کمک کنه تا ساخت یه پروژه کوچیک با این تکنولوژی فعلا ! :&gt;)</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Wed, 10 Aug 2022 09:40:00 +0430</pubDate>
            </item>
                    <item>
                <title>Go migration postgresql</title>
                <link>https://virgool.io/@xhmoazedi/go-migration-postgresql-djkwhvgjd9am</link>
                <description>Go migration using postgresql مایگریشن یعنی دولوپر از اول تمام جزییات دیتابیس رو بصورت ورژن تعریف بکنهیعنی هر تغییر جدید در یک ورژن جدید نوشته میشه و در صو.رتی که هر تغییر رو بخوایم برداریم به ورژن قبلی برمیگردیمکار با او به این صورته که و قتی درکتوری اولیه رو ساختیم و ماژولارش کردیم در اولین حرکت با وارد کردن این کمند در cli به برنامه میگیم که یک پوشه بسازه و نسخه های مختلف دیتابیس رو در اون بگنجونهmigrate create -ext sql -dir &lt;the direction/&gt; -seq &lt;the file name &gt;بخش the direction  مسیری هست که برای نگهداشتن نسخه ها میسازیم و the file نامی هست که به هر نسخه اختصاص میدیم و بهتره شامل نشانی از تغییرات اعمال شده باشهعبارت seq- مرتب سازی نسخه ها رو برعهده داره(بهتره بدونیم که migration و پکیجش رو از پیش باید نصب کرده باشیم)ورژن اولبا این کار در مسیر db/migration در هر مرحله که نسخه ی جدید رو وارد میکنیم دو فایل با پسوند down.sql &amp; up.sql  ساخته میشه و معلومه که یکی برای migrate به نسخه ی جدیده و یکی دیگه برای backward شدن به نسخه ی قدیمی ترکار با او به این شکله که در فایل up ما کوئری های مربوط به ریلیز جدید رو وارد میکنیم و در فایل down کوئری برگشت به حالت قبلی رو / مثلا چون در مرحله ای اولیم up ما شامل ساخت تیبل و down شامل دراپ اون میشه :اولین ورژناولین ورژنعبارتهای BEGIN; &amp; COMMIT; در ابتدا و انتها یک بلاکایز کردنه چیز خاصی نیست ! وقتی دستو رما فقط یه دونه ست حتی لازم به نوشتن این عبارات هم نیستاون دش های بالا رو اگه خواستین دقیقا همین کدها رو وارد کنید به آندرلاین تغییر بدین pr-name …&gt; pr_nameاما دستوری لازمه که بوسیله ی اون این کدهای جدید شناسایی جنریت دیباگ و ست بشن .. یعنی یه دستوری به برنامه بدیم که این ریلیز جدید رو به عنوان دیتابیس نو مورد استفاده قرار بده :migrate -path &lt;the migration path&gt; -database &amp;quotpostgresql://username:password@localhost:5432/database_name?sslmode=disable&amp;quot -verbose upکل دستور مورد خاصی نداره جز اینکه در بخش username:password شما یوزرنیم و پسورد کانتینری که ساختید رو وارد میکنید برای دسترسی به اون/  و بخش sslmode که باید disable باشه و up در انتهای دستور که با down دو کلید واژه برای ریلیز جدید یا بک وارد هستن و ما اون ها رو جایگزین میکنیم طبق حالت هایی که نیاز داریماما قبل از اینکه واردش کنیم یه سری مراحل داریم :گیچه ل داره ! :) این کلمه رو فراموش کن شوخی بوداما وارد cli میشیم و با دستور sudo docker container exec -it &lt;the container name &gt;bashالحمد لله اسم container رو که میدونیم ! میذاریم جای خودش و وارد میشیم ..containerبا دستور su postgres ادمینستریتور میشیم :با دستور : psql -U postgres -W  به محتوای container دسترسی خواهیم داشت :با دستور create database &lt;database name &gt; یک دیتا بیس بسازید :حالا اسم دیتابیس رو در محلی که گفتم اون بالا (کجا گفته بودم ? توی دستور migrate up) بنویسید و دستور رو اجرا کنید تا درون این دیتا بیس برای شما تیبل رو بسازهمن اسم دیتابیسم رو گذاشتم migrationحالا با دستور \c migration (بک اسلش سی و اسم دیتابیس) میریم تو دیتا بیسی که ساختیم و صدا میزنیم تیبلی رو که ورژن یک دیتابیسمونه :حالا یه ورژن جدید به دیتابیس میدیم و در اون بهش یه تیبل دیگه اضافه میکنیم :من این تیبل رو اسمش رو میگذارم users :برای اینکار کل مراحل ورژنینگ قبل رو تکرار میکنیم :قاعدتا سربسر گذاشتن این قابلیت و تکنولوژی مایگریشن نیاز وقت انرژی و صبره و شما باید چندین ورژن بسازید مایگریت کنید برگردید تا به طور کامل جا بیافته لازمه یه مورد رو یا آوری کنم ساختن اسکیما رو اینجا دستی انجام دادیم این درحالیه که شما باید از طریق مایگریشن اینکارو بکنید برای اینکار در کوءریتون این دستور رو قبل از create table اضافه کنید :CREATE SCHEMA &lt;the schema name&gt;;و در دستور جنریت کردن migration که بالا تر در موردش حرف زدم جای database name رو خالی بذارید یعنی اینجوری :migrate -path &lt;the migration path&gt;-database &amp;quotpostgresql://username:password@localhost:5432/database_name?sslmode=disable&amp;quot -verbose up

migrate -path &lt;the migration path&gt; -database &amp;quotpostgresql://username:password@localhost:5432/?sslmode=disable&amp;quot -verbose upاینطوری کل مراحل ساخت دستی دیتا بیس و اسکیما رو skip کردین به داکیومنتیشن postgresql  برید و در مورد آلتر کردن یاد بگیرید و به دوستانی هم که اینم مطلب رو میبینن و خیلی کارشون درسته عرض میکنم بابا take it easy من میخوام همه چی انقد که به نظر میاد پیچیده نباشه </description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 31 Jul 2022 13:40:53 +0430</pubDate>
            </item>
                    <item>
                <title>golang tutorials(for loop)</title>
                <link>https://virgool.io/@xhmoazedi/golang-tutorialsfor-loop-y8tibuluny0h</link>
                <description>حلقه ی فورForاین مفهوم از مهمترین مفهوم های پایه ای در برنامه نویسی ست … جهان برنامه نویسی پر از کارهاییست که باید بارها و بارها انجام بشن مثلا یه لیست عدد رو در نظر بگیریم که میخوایم همه رو با هم جمع کنیم اگه این اعداد ۱۰ تا باشن ما عمل جمع رو که یک کار تکراری هست باید ۹ بار انجام بدیم . در کدنویسی ما این عمل رو یک بار می نویسیم و ۹ بار باز استفاده میکنیم . این روندی رو تا آخر رفتن و به اول برگشتن شبیه یک دایره نیست ؟  تصویر بالا گویای این روندهList := {1,2,3,4,5,6}sum := 0for i:=0; i&lt;= len(List);i++ {sum = sum + List[i]}return sumدر اسنیپت بالا(ما به قطعه کد میگیم snipet) که حدودا یه شبه کده (وقتی یه کدی تمام ضوابط سینتکس زبانی رو مراعات نمیکنه -سینتکس هم یعنی گرامر زبان- وفقط منطق رو هدف قرار داده میگیم شبه کده .  شبه کدها خیلی کلی ترند حتی)  ما اومدیم حرفایی که بالا زدیم رو به زبان go نوشتیمیه لیست اینتجر داریم که چند تا عدد رو در خودش داره .. یه sum تعریف کردیم که یک متغیره و ایتنجر میگیره ..و یه ظرفیه که قراره نتیجه ی جمعو بریزیم توش حلقه ی فور یه ایندکس داره که اینجا 0=:i هست این ایندکس روی اعضای لیست ما حرکت میکنه و با رسیدن به هرعضو اون عضو عضو ایندکسم ما میشه یعنی i ام .. یه شرط برای حلقه میذاریم که میگه این حلقه تا کی باید بچرخه اینجا هست Lists) len=&gt; i)دوتا دستور مهم در حلقه ی فور وجود داره یکی break که هرجا بنویسم از همونجا حلقه قطع میشه و شکسته میشه و دیگری continue که هرکجا بنویسم برنامه از اون مرحله به اول حلقه برمیگردهمثلاfor i:=1; i&lt;=100; i++ {if i &lt;= 50 { continue }break}در اینجا حلقه تا به پنجاه میرسد پس از برقراری شرطی که گذاشتم بر میگرده ولی به ۵۱ که رسید حلقه رو میشکنه :)</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 24 Jul 2022 18:41:50 +0430</pubDate>
            </item>
                    <item>
                <title>golang tutorials(constants)</title>
                <link>https://virgool.io/@xhmoazedi/golang-tutorialsconstants-hiwqe2xrxncb</link>
                <description>مقادیر ثابتConstantsبرای درک مقادیر ثابت همون متغیرهارو در نظر بگیر فقط از ظرفها قابلیت خالی شدن رو بگیر .. یعنی وقتی یه جایی از برنامه میگیم یه مقداری برای یک ظرفی ثابت خواهد بود اون نام همون مقدار رو برای همیشه داره مگر اینکه خودمون یه جایی مقدارش رو ازش بگیریم و خالیش کنیمتعریف و مقدار دهی ثابت ها اینجوریه :const a stringa = “constants”orConst a string = “constant”</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 24 Jul 2022 18:38:07 +0430</pubDate>
            </item>
                    <item>
                <title>golang tutorials(variables)</title>
                <link>https://virgool.io/@xhmoazedi/golang-tutorialsvariables-tj8m2emcxfvy</link>
                <description>متغیرها :variablesمتغیرها رو اگه ساده تعریف کنیم یک سری ظرف هستند برای اینکه مقدایر رو در خودشون نگهدارند و همونطور که معلومه ظروف قابلیت خالی شدن دارن و میشه از اونها دوباره استفاده کرد . اما این ظروف مشخصه ی نوع مقادیر دریافتیشون رو هم دارن یعنی یک ظرف نوشابه رو نمیشه توش آب ریخت و دیگه به طریق اولی تو ظرف نوشابه نمیشه آجر هم ریخت یا بقول دوستمون هر سوراخ مال یه نفرهمتغیرها رو روشون اسم میذاریم مثلا a میتونه یک متغیر از تایپ string باشه و به صورتهای زیر میتونیم توی go  تعریف ومقداردهیش کنیم:Var a stringa = “dadash” .ora := “dadash” .var b int = 2b := 3var t boolt = truet := true</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 24 Jul 2022 18:31:57 +0430</pubDate>
            </item>
                    <item>
                <title>golang tutorial (values)</title>
                <link>https://virgool.io/@xhmoazedi/golang-tutorial-values-wduxgtwf2xkg</link>
                <description>مقادیرvaluesاز اصلی ترین و پایه ای ترین مفاهیم . درک مفهوم مقدار هست و از اونجا که در این مسیر قرار هست لب لباب رو اینجا دریافت بکنیم اینطوری مقدار رو تعریف میکنم :مقادیر ورودیهای ما هستن و در زبان go انواع یا تایپ های متفاوتی دارن  مثل, float, string . integer, boolean, و غیره که تعریف اونها با متغیرها و ثابت ها بهتر میتونه مفهوم پیدا کنهمقدار استرینگ یا رشته توی دابل کوتیشن قرار میگیره مثل &quot;dadash&quot; و boolean  تنها مقادیر true and false رو میگیره</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 24 Jul 2022 18:29:17 +0430</pubDate>
            </item>
                    <item>
                <title>معماری هگزاگونال</title>
                <link>https://virgool.io/@xhmoazedi/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D9%87%DA%AF%D8%B2%D8%A7%DA%AF%D9%88%D9%86%D8%A7%D9%84-aq6ye9dcfumr</link>
                <description>این تحقیق توسط حمزه معاضدی انجام شده استدر این معماری، همه چیز، هسته برنامه را احاطه کرده است.هسته یک مؤلفه آگنوستیک فناوری است که شامل تمام منطق است. در پیاده‌سازی این قسمت وجود چیزهای دیگر در بیرون را باید به کلی نادیده گرفت.به عبارت دیگر، هسته اصلی نباید از نحوه ارائه برنامه یا محل نگهداری داده ها آگاه باشد.هسته را می توان به عنوان یک &quot;جعبه&quot; (که به عنوان یک شش ضلعی نشان داده می شود) مشاهده کرد که قادر به حل همه منطق تجاری، مستقل از زیرساختی است که برنامه در آن نصب شده است.این رویکرد به ما این امکان را می دهد که هسته را به صورت مجزا آزمایش کنیم و به ما این امکان را می دهد که به راحتی اجزای زیرساخت را تغییر دهیم.اکتورها (actors ):اکتورها  چیزهای دنیای واقعی هستند که می خواهند با هسته اصلی تعامل داشته باشند.این چیزها می تواند انسان، پایگاه داده یا حتی برنامه های کاربردی دیگر باشد.بسته به اینکه چه کسی باعث ایجاد تعامل می شود، اکتورها را می توان به دو گروه دسته بندی کرد:Drivers (or primary) actors :اکتورهایی هستندکه ارتباط با هسته را خود کلید میزنند.آنها این کار را برای فراخوانی یک سرویس خاص در هسته انجام می دهند.یک کاربرانسانییا یک CLI (واسط خط فرمان) نمونه های کاملی از درایور اکتور ها هستند. Driven (or secondary) actors :اکتورهایی هستند که انتظار دارند هسته اصلی آغاز کننده یارتباط باشد.در این صورت، هسته است که به چیزی نیاز دارد که اکتورارائه میکند، بنابراین درخواستی را برای اکتورارسال می کند و اقدام خاصی را بر روی آن درخواستمی دهد.به عنوان مثال، اگر هسته نیاز به ذخیره داده ها در پایگاه داده MySQL داشته باشد، هسته ارتباط را برای اجرای کوری INSERT در کلاینت MySQL راه اندازی می کند.توجه داشته باشید که اکتورها و هسته اصلی به زبان‌های مختلفی صحبت می‌کنند.یک برنامه خارجی درخواستی را از طریق http ارسال می کند تا یک درخواست برای انجام سرویسی از هستهرا فراخوانی کند (در حالیکه هستهمعنی http را نمی فهمد).مثال دیگر زمانی است که هسته اصلی (که دارای تکنولوژی آگنوستیک است) می خواهد داده ها را در پایگاه داده mysql (که با زبان SQL صحبت می کند) ذخیره کند.با این اوصاف، باید «چیزی» وجود داشته باشد که بتواند به ما در انجام چنین ترجمه‌هایی کمک کند. اینجا جایی است که پورت ها و آداپتورها به بازی می آیند.Ports ( پورت ها ) :از یک طرف، ما پورت هایی داریم که رابط(اینترفیس) هایی هستند که نحوه برقراری ارتباط بین یک اکتورو هسته را مشخص می کنند.بسته به اکتور، پورت ها ماهیت متفاوتی دارند:. پورت هایی برای اکتور های درایور:پورت‌ها برای اکتور های dirver مجموعه اقداماتی را که هسته ارائه می‌کند و در معرض بیرون قرار می‌دهد، تعریف می‌کند.هر عمل به طور کلی با یک مورد خاص از استفاده مطابقت دارد.. پورت هایی برای driven actor ها :مجموعه اقداماتی را که اکتورباید اجرا کند را تعریف می کند.توجه داشته باشید که پورت ها متعلق به هسته هستند.مهم است، زیرا هسته اصلی موجودیتیاست که تعریف می کند که کدام تعامل برای دستیابی به اهداف منطقی تجاری مورد نیاز استAdapters ( آداپتور ها) :از سوی دیگر، ما آداپتورهایی داریم که مسئول تبدیل بین یک درخواست از اکتوربه هسته هستند و بالعکس.این امر ضروری است، زیرا همانطور که قبلاً گفتیم بازیگران و هسته اصلی به زبان های مختلف &quot;صحبت&quot; می کنند.. یک آداپتور برای یک پورت driver ، یک درخواست فناوری خاص را به یک تماس در یک سرویس اصلی تبدیل می کند.. یک آداپتور برای یک پورت driven ، یک درخواست مستقل از فناوری از سویهسته را به یک درخواست فناوری خاص از اکتورتبدیل می کندDependency injection ( تزریق وابستگی )پس از اتمام پیاده سازی، لازم است به نحوی آداپتورها را به پورت های مربوطه متصل کنید.این می تواند زمانی انجام شود که برنامه شروع شود و به ما امکان می دهد تصمیم بگیریم که کدام آداپتور باید در هر پورت وصل شود، این همان چیزی است که ما به آن &quot;تزریق وابستگی&quot; می گوییم.برای مثال، اگر می‌خواهیم داده‌ها را در یک پایگاه داده mysql ذخیره کنیم، فقط باید یک آداپتور برای پایگاه داده mysql به پورت مربوطه وصل کنیم یا اگر می‌خواهیم داده‌ها را در حافظه اصلیذخیره کنیم (برای آزمایش) باید یک آداپتور in memory database را  به آن پورت وصل کنیم.</description>
                <category>khaled moazedi</category>
                <author>khaled moazedi</author>
                <pubDate>Sun, 24 Jul 2022 16:46:45 +0430</pubDate>
            </item>
            </channel>
</rss>