<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امید زاهد</title>
        <link>https://virgool.io/feed/@OZahed</link>
        <description>برنامه نویس،‌ علاقه مند به Go و C# , python</description>
        <language>fa</language>
        <pubDate>2026-06-17 13:43:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1237162/avatar/mH29T3.jpg?height=120&amp;width=120</url>
            <title>امید زاهد</title>
            <link>https://virgool.io/@OZahed</link>
        </image>

                    <item>
                <title>مرگ تخصص یا سخت‌تر شدن کلاه برداری؟</title>
                <link>https://virgool.io/@OZahed/%D9%85%D8%B1%DA%AF-%D8%AA%D8%AE%D8%B5%D8%B5-%DB%8C%D8%A7-%D8%B3%D8%AE%D8%AA-%D8%AA%D8%B1-%D8%B4%D8%AF%D9%86-%DA%A9%D9%84%D8%A7%D9%87-%D8%A8%D8%B1%D8%AF%D8%A7%D8%B1%DB%8C-jg0dt5ru0jpd</link>
                <description>نشر آموخته تخصص گرایی نمرده، کلاه برداری کردن با اسم تخصص و مدرک گرایی سخت شده.*اگر می‌خواید بخونید لطفا تا آخر  بخونید.*کتاب رو خوندم،‌ سرتاسر پروپاگاندای حزب دموکرات امریکا بود اون دسته متخصصینی که مردم امریکا (و مردم جهان) دیگه آدم حسابشون نمی کنن،‌دسته به اصطلاح متخصصینی بودن که دانششون رو ابراز کلاه برداری کرده بودن مثل اقتصاددان‌هایی که برای چاپیدن بودجه عمومی توسط رفیق های خودشون تزهای مسخره ای مثلتورم فقط حاصل انتظارات تورمی مردمه و اگه بی سر و صدا پول چاپ کنیم مشکلی پیش نمیاد (من اقتصاددان نیستم ولی دیدم که این حرف هم در ایران و هم در ونزوئلا و هم در هند و هم در ترکیه و هم در اروپا در دوران کرونا و هم امریکا بعد از بحران ۲۰۰۸ اشتباه بوده)یا ایده احمقانه تری مثل جمله معروف اگر تزریق پول ناگهانی باشه بعدم ناگهانی قطع بشه تورم ایجاد نمی کنهیا اون دسته به اصطلاح جامعه شناسانی که هر تحقیقشون بی برو برگرد نتیجه اش میشه اینکه سفید پوستای جهان یه مشت برده دار پست فطرتن.(مدل ایرانیش:‌ تقصیر مردمه،‌بی آبی،‌ گرونی،‌ گرما هوا و... تقصیر مردمه)کتاب میگه متخصصین هم اشتباه میکنن ولی کمتر از مردم عادی  دقیقا اینجا رو باش موافقم ولی وقتی ما میبنیم یه سری آدم به صرف داشتن مدرک از دانشگاه های بزرگ، متخصص حساب میشن، و ما تا الان چیزی جز اشتباه ازشون ندیدیم. چی؟ (کل کسانی که سیستم پولی فعلی جهان رو میچرخونن و به نظرشون تورم چیز ) مردم نمیگن  من بیشتر میفهمم،‌ میگن اگه قرار من ۶۰ درصد اشتباه کنم یک به اصطلاح متخصص ۵۰ درصد، خب چه نیازی به اون متخصص هست؟ وگرنه اتفاقا اعتماد مردم به سیستم های مهندسی،‌ریاضیاتی،‌ مدیریتی،‌ مالی و... که دارن خروجیش رو میبینن خیلی بیشتر شده مثلا هیچ وقت قبلا کسی حاضر نمیشد یه ریاضی دان براش تصمیم بگیره ولی الان تمام تیم‌های ورزشی مشاور آماری و آنالیزور آماری و مهندس داده دارن یا قبلا کسی تو ماشین خودران نمی نشست ولی الان تسلا بخاطر خودران بودنش پرفروش شده.یا سرمایه گذاران شرکت‌ها، سرمایه‌های چند صد میلیاردی شون رو در اختیار انسان‌هایی قرار میدن که تخصصشون استخدام کردن انسان‌هاست. و حتی بعضا برون سپاری مکنن این کار رو.یا ملت پول برای تخصص دکوراسیون هزینه میکنن یا تخصص گل آرایی یا تخصص آرایش و... یا مردم جهان دارن حاصل دست رنجشون رو میزارن روی یک سری صفر ویک که حاصل کار متخصصین هست (کریپتوکارنسی ها، دیتابیس بانک‌ها، نرم افزارهای معاملاتی،‌نرم افزارهای مشاوره معاملاتی و...). هیج وقت در طول تاریخ مردم جهان به تخصص و متخصصین در این حد که تو قرن ۲۱ اعتماد دارن، اعتماد نداشتن مردم حاضرن زندگی و مرگشون رو بدن دست تخصص کسانی که دستگاه تزریق دارو رادیو اکتیو اتوماتیک رو ساخته. امروز مردم تو اتوبان ها جون شون رو در اختیار تخصص سازندگان الگوریتم‌های ماشین‌های خودران میذارن. سربازها و نظامی‌ها توی میدان جنگ به معنی واقعی کلمه، جونشون رو در اختیار تخصص مهندسین میذارندر طول تاریخ حتی پادشاهان به ندرت مشاوره مالی میگرفتن ولی امروزه بخش بزرگی از مردم طبقه متوسط  جهان حداقل ۲ ۳ بار در طول عمرشون مشاوره مالی درباره خرید خونه و ماشین و اوراق بهادار و بقیه چیزا میگیرن این جمله که مردم به متخصصین بی اعتنا شدن صرفا یک دروغ بزرگه که حاصل تلاش یک سری کلاه بردار آکادمیک برای کلاه برداری هست. وقتی این دسته کلاه بردارها میبینن دیگه اسم دکتر و مهندس و پروفسور یا اسم دانشگاه برای مردم اهمیت نداره و مردم بجای اینکه بگن: وای طرف چه خفنه، تو دانشگاه استنفورد(شریف) درس خونده، میپرسن: طرف چیکار کرده تا الان و چیا بلده به این نتیجه میرسن که مشکل از مردمه که دیگه به تخصص اهمیت نمیدن. وقتی یه شیاد مثل نسیم طالب رو میبینن که کتاب مینویسه درباره رندومنس و اشکالات سیستم مالی متمرکز، و در همون حالت با بیت کوین و بقیه کریپتوها و پول‌های خصوصی هم مخالفت میکنه. یا شیادهای نیویورک تایمز رو میبینن که ادعا مقابله با نژاد پرستی میکنن و میگن تخصصشون خبرنگاریه و در عین حال شهردار زن سیاه پوست رو بایکوت میکنن به جرم جمهوری‌خواه بودن و اخبار بدون منبع منتشر میکنن یا مثلا ما توی ایران نمونه اش رو فراوان دیدیم. شیادهای کارشناس شبکه های لندنی که میگن با سیستم مخالفن، بعد ۱۰ ساعت تو صف انتخابات منتظر میمونن که به همین سیستمی که باش مخالفن،‌ رای بدن. مسلمه که به کل اون دسته از به اصطلاح متخصصین مشکوک بشن.</description>
                <category>امید زاهد</category>
                <author>امید زاهد</author>
                <pubDate>Fri, 13 Oct 2023 15:28:35 +0330</pubDate>
            </item>
                    <item>
                <title>الگوهای طراحی- بخش۲ singleton, Repository, UOW</title>
                <link>https://virgool.io/@OZahed/singleton-nkwdajxrgerh</link>
                <description>پیش نوشت:‌ این نوشته نقش تبلیغ برای برنامه نویسان جوان رو داره. برای یادگیری دلایل استفاده از الگوهای طراحیه و هدفش توضیح محل استفاده از دیزاین پترن‌هاستتوی بخش قبلی میخواستم نشون بدم برای استفاده از دیزاین پترن‌های مدیتور و کامن کجا استفاده مشن. که به وضوح در رسیدن به این هدف شکست خوردم.حالا میخوام یه راه دیگه رو پیش بگیرم برای توضیح دیزاین پترن‌ها. اول توضیح بدم مشکلات از چه جنسی هستند و راه حل‌هایی که باید تو بخش الگوریتم‌ها یاد می‌گرفتیم، چطور در حل مشکلات غیر ریاضی کار به ما کمک میکنند. مثلا اینکه وقتی میخوایم فیچر جدید اضافه کنیم، خیلی طول میکشه و خیلی فایل ها رو باید عوض کنیم. اینجا مساله بهینه سازی از زمان اجرای کد توسط کامپیوتر در الگوریتم‌ها، به زمان اجرای تسک توسط انسان‌ها تغییر کرد. ولی بازم مساله همونه و روش حل مساله و حمله کردن به مشکل همون روش الگوریتیمه پارامترهای بهینه سازی، بجای اینکه برای عملیات‌هایی که سیستم کامپیوتری باید انجام بده تا به جواب برسه برای تعداد عملیات ها یا تعداد خط کدی که سیستم انسانی باید انجام بده تا به هدفش برسه تعریف مشن. مثلا مساله میتونه این باشه که: ساختار کدمون رو چطور پیاده کنیم تا کمتریم هزینه رو برای تولید نرم افزار متحمل بشیم.(جواب دادن به این سوال وظیفه معمار نرم افزار هستش).بیاید به عنوان یه دولوپر دوتا شرایط زیر رو در نظر بگیرید:１.  شما دارید برنامه فرانت اندی می‌نویسید، که باید تم داشته باشه و کاربر میتونه بین تم دارک و لایت یکی رو انتخاب کنه２.  شما دارید یه برنامه وب مینویسید و نیاز دارید اطلاعات رو توی دیتا بیس نگه دارید.خب حالا شما مساله اول رو با درست کردن کلاس dark-… , light-… برای کامپوننت هاتون حل میکنید و مساله دوم رو هم هر بار بخشی از برنامه نیاز داشت به دیتا بیس درخواستی بده یه کانکشن باز میکنید.فعلا برنامه شما کار میکنه ولی مشکلاتی هست:درباره مساله اول وقتی کاربر خواست تم تاریک بشه باید یه کدی بنویسید که بره کلاس تمام کامپوننت ‌ها رو یکی یکی عوض کنه، برای این کار، جداگانه برای هر کامپوننت توی فانکشن مربوطه، باید مقدار یه چیزی(حالا یا اینپوت یا چک باکس یا ...) رو هر بار بخونیم و از اول مقدار تم (true, false) یا (dark, light) رو از ورودی مربوطه دریافت کنیددرباره مساله دیتابیس هم تا زمانی که شما مثلا ۴۰ ۵۰ تا درخواست در ثانیه دارید مشکلی نیست ولی بعدش متوجه میشید که سیستم خیلی کند شده و خیلی سخت میتونه اسکیل بشه. چون هر بار باید کل فرایند هزینه بر ساختن کلاس ابسترکت دیتابیس و ایجاد کانکشن TCP بین برنامه و دیتا بیس رو اجرا کنیدحالا شما میخوای بری دنبال راه حلاینجا مساله بیشتر تو مایه های پرفورمنس کده تا تمیزی کد.هر دوتا مساله رو میشه به دو مرحله تبدیل کرد ، به دوبخش، اول گرفتن ورودی‌ها (خوندن مقدار تم و یا درست کردن کانکشن‌ دیتابیس). دوم اجرای بخش مربوط به لاجیک (عوض کردن کلاس رنگ یا دستور ثبت اطلاعات در دریتابیس)اجرای مرحله دوم وابسطه به مرحله قبلی هست پس ما میایم و جواب مرحله اول رو که حساب کردیم نگهش میداریم،قبلا آدم‌ها با این مشکل برخوردن و برای راه حلش یه اسم گذاشتن،‌ که بش میگیمسینگلتون:UML سینگلتونسینگلتون یه مدل کلاس یا فانکشنه (بستگی داره oopبنویسید یا فانکشنال) که هر بار کسی کانستراکتور رو صدا میکنه اگه اون آبجکت وجود داشته باشه، بجای ساختن یک اینستنس (فارسیش رو نمی‌دونم) جدید اون اینستنس موجود رو بر میگردونه و اگه اینستنسی نباشه اونو میسازه و مقدارش رو برای دفعات بعدی که نیاز میشه نگه میدارهتوی جاوا این مدلی میشه  (البته thread safeکردنش یکم داستان lock و اینا داره که فعلا حوصله نوشتنش رو ندارم)public final class Singleton {
    private static Singleton instance = null;
     
     private Singleton() 
     {
          // private to prevent anyone from creating one
          // initiation logic
           this.isDark = input.value;
    }
    public Singleton GetInstance ()
    {
           if (instance == null)
                   instance  = new Singleton ();
           return  instance ;
    }
    public boolean GetIsDark ()
    {
             return this.isDark;
     }
     public void setIsDark (Boolean dark)
     {
         this.isDark = dark;
      }
} ما یکبار مقدار های تم رو حساب میکنیم و هر بار نیاز داشتیم اون رو میخونیم  به کامپوننت نیاز مندش پاس میدیم. این روش همون روشیه که ریکت برای اجرای theme provider استفاده میکنه.یا مثلا در مورد دیتا بیس، تو زبان GOمیتونیم توی main.go  یا توی database.go  از تابع init استفاده کنیمtype Singleton struct {
       connStr string
}
var st *Singleton
func init (){
     // initialize the Variables of single tone
     st = &amp;Singleton { connStr : os.Getenv(&amp;quotConnection_String&amp;quot)}
}
func GetDBSingleTon () *Singleton {
      return st
}معایب سینگلتونباید حواسمون باشه که سینگلتون نیاز به مموری بیشتری داری پس نباید ازش سو استفاده کرد و هر چیزی رو سیتگلتون کرد درضمن سینگلتون مشکلی که ایجاد میکنه اینه که بخش های استفاده کننده ازش می تونن استیتش رو عوض کنن(اگه جلوش رو نگیریم)، میتونن باعث ایجاد مشکل توی بخش‌های دیگه بشن که احتمال باگ رو افزایش میده پس باید فقط چیزایی سینگلتون بشن که واقعا لازمه مثل کانکشن پول دیتابیس یا تم توی فرانت اند.تا اینجا ما مساله دوباره تولید کردن کانکشن و حل درست کردن کلاس‌های مختلف برای رو حل کردیم و همه چیز به خوبی و خوشی پیش رفت.حالا خوشحال و راحت میریم خونه بعد از مدتی دوتا نیازمندی جدید میاد.بدلیل حجم بالای ریکوئست‌ها حالا دیگه میخواین از دیتا بیس sqlite به دیتا بیس mongoDB تغییر بدیم سیستم رو شما ریکوئست‌ها تون رو به دیتابیس رو توی فایل مدل نوشتین و توی سرویس‌ها اون متدهای مدل رو کال میکنید (این روش توی MVC خیلی مرسومه)حالا اگر بخواین نیازمندی‌های جدید رو بسازیم باید مدل‌ها رو ریفکتور بکنیم. این مساله رو هم مردم باش مشکل داشتن و قبلا براش اسم گذاشتن ولی این بار چندتا اسم دارهریپوزیتوری، فاساد (facade ) کمی هم dependency inversion:بگم فاساد  خیلی کلی تر از این مساله است ولی یه مصداقش اینجاسخلاصه همه این اسما در عمل اینه که شما بجای اینکه بیاید تو برنامه تون از پیاده سازی‌های نهایی استفاده کنید. از یک مدل ابسترکشن استفاده کنید و بعد بیاده سازی نهاییتون رو به استفاده کننده ها پاس بدید.یکم پیچ در پیچ شد، ببخشید.برنامه تون وقتی میخواد چند مدل پیاده سازی از وظیفه‌ای که باید انجام بشه ولی به چند روش باید انجامش بدیم، رو انجام بده، باید یک سری کلاس ابسترکت از خود کار و مراحلش بسازیم و بعد ساب کلاس‌ها بیان و اون رو پیاده سازی کنند.   مثلا توی بک اند بجای اینکه توی سرویس‌هاتون از کامندهای SQL  استفاده کنید بیاید از یک اینترفیس یا کلاس ابسترکت(ریپوزیتوری) استفاده کنید که کلاس‌های persistent (دائمی) دیتابیس میان و اون رو پیاده سازی میکنند. می پذیره یا یه کلاس ابسترکن توی  js برای فرانت که آدرس API  رو میذیره یا اینترفیس تایپ اسکریپتمثلا توی فایل repository برای جاوا میایم و اینطوری مینویسمinterface MyModelRepository{
       public List&lt;MyModel&gt; GetModels ()
       public MyModel FindById( UUID id)
       public void Add (MyModel model)
       .... }حالا توی فایل persistent میاید و این اینترفیس رو برای MongoDB پیاده میکنید (کوئری‌های مناسب رو مینویسید) بعد سرویساتون با اینتر فیس کار میکنن. تا زمانی که کلاس مخصوص هر دیتا بیس، این اینتر فیس رو پیاده میکنه، برای تغییر دادن دیتا بیس نیاز نیست که استفاده کننده ‌هاشون (سرویس‌هامون) رو تغییری بدیمcalss MongoMyClassRepo implements MyModelRepository{
....
}
calss PostgreMyClassRepo implements MyModelRepository{
}
// for the sake of test
calss ُTestMockMyClassRepo implements MyModelRepository{ }حالا راحت میتونیم هم کد خوانا تری داشته باشیم هم کد تست پذیر و هم امکان راحت تر عوض کردن API ها و دیتابیس‌هامعایب ریپوزیتوری و فاساد:‌ اگه برای تسک‌هایی که قرار نیست چند مدل داشته باشه بیایم و ابسترکشن بسازیم(مثل مدل تم توی فرانت اند که بالاتر گفتم) کد بیش از حد ابسترکت میشه و فهمیدن اینکه چطور کار میکنه واقعا سخت میشه و پیدا کردن باگ‌‌ها هم زمان برتر از حالت بدون فاساد یا ریپوزیتوری میشهبرای یحث دیتا بیس ریپوزیتوری‌ها برای افزایش پرفورمنس میتونن در کنار UOW بکار برن خلاصه Unit Of Work یا persistent  aggregateوقتی توی برنامه میخوایم تعدادی کار روی داده ها مون انجام بدیم(CRUD) و اونا رو توی دیتابیس (یا هر جایی که نیاز داره از شبکه یا دیسک استفاده کنه) ذخیره کنیم میشه از دیزاین پترن unit of work استفاده کرد چون اینجا مساله در اصل مجموع دو مساله است، اول لاجیک ارتباط بین مدل‌ها و کلاس‌های برنامه و بعدی ارتباط با دیتا بیس و ذخیره کردن داده،‌ اینجا ارتباط با دیتابیس خیلی هزینه بره چون باید اول پروتوکل های شبکه اجرا بشه بعد منتظر تاخیر شبکه باشیم تا جوابش بیاد. حالا unit of work میاد و برای ما بخش رابطه کلاس ها و لاجیک مربوط به کلاس ها رو از بخش ارتباط با شبکه جدا میکنه تا بتونیم تقریبا همه عملیات‌ها رو فقط با یک بار انجام عملیات وصل شدن به دیتابیس هم زمان انجام بدیم (این روشیه که اکثر ORM ها برای کار کردن استفاده میکنن درباره اش بخونید جالبه) unit of work  می‌تونه به عنوان یک persistent  aggregate  در مدل برنامه سازی دامنه محور (Domain driven design )استفاده بشه.پیاده سازیش یکم طولانیه شدیدا توصیه میکنم این پست Microsoft رو ببینیدتوی aggregate ها ما میدونم که چند بخش باید با هم ذخیره بشن (همه یا هیچی) مثلا برای اطلاعات سبد خرید کاربران،‌ ما باید اطلاعات کالاها و اطلاعات زمان خرید و پرداخت رو توی دیتابیس با هم ذخیره کنیم، و اگه پرداخت کنسل بشه باید لیست کالاهای خریداری شده رو هم حذف کنیم. پس اینجا دوتا ریپوزیتوری از OrderItemRepo و OrderInfoRepo میسازیم بعد توی اینترفیس unit of work مون اینو میسازیمtype UnitStruct{
    name string //the name of struct we wanna work with
    value interface {} 
}

type OrderUnitOfWork struct{
     // injected repositories
     orderIrem *OrderItemRepo
     orderInfo  *OrderInfoRepo
     // to track adds 
     news []UnitStruct 
     // to track Updates 
      dirties []UnitStruct
     // to track Deletes 
     removes []UnitStruct     
}

// Inject the Repositories into builder function
func NewOrderUnitOfWork (info  *OrderInfoRepo ,  item  *OrderItemRepo) *OrderUnitOfWork {
     return &amp;OrderUnitOfWork {
            orderIrem: item,
            orderInfo  info,
      }
}معایت UOW:استفاده از UOW برای کارهای ساده و جاهایی که اصلا نیازی نیست چندتا چیز رو هم زمان با هم ذخیره کنیم یا با هم حذف کنیم، یا جاهایی که نمی‌خوایم لایبرری رو مون رو بدیم دیگران هم استفاده کنن،‌ UOW واقعا کد رو بی دلیل پیچیده میکنه.اکثرا کسانی که تازه با دیزاین پترن‌ها آشنا شدن خیلی زیاده روی میکنن توی استفاده ازشون (خودمم این مدلی بودم).خیلی طولانی شد امیدوارم یکم به درک جای استفاده از دیزاین پترن‌ها برای جوان‌ترها کمک کرده باشهخوشحال میشن نظراتتون رو بگید و اینکه بابت غلط املایی‌ها عذر میخوام من خیلی املام خوب نیست</description>
                <category>امید زاهد</category>
                <author>امید زاهد</author>
                <pubDate>Sun, 10 Oct 2021 00:43:59 +0330</pubDate>
            </item>
                    <item>
                <title>کامپایل کردن پایتون ۳.۱۰ از سورس کد</title>
                <link>https://virgool.io/@OZahed/%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84-%DA%A9%D8%B1%D8%AF%D9%86-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%DB%B3%DB%B1%DB%B0-%D8%A7%D8%B2-%D8%B3%D9%88%D8%B1%D8%B3-%DA%A9%D8%AF-s65qkpecubt0</link>
                <description>این روزها واقعا حالت جالبی برام داره سه‌تا از زبون‌های مورد علاقه‌ام یا تازه ورژن جدید شون رلیز شده یا به زودی رلیز میشن و هر کدومشون یا تغییرات نسبتا بزرگی دادن یا قراره توی ورژنی که میاد تغییرات جالبی ایجاد کنندزبان GO قرار اول فوریه آینده ورژن ۱.۱۸ رو بده و توش جنریک‌ها رو اضافه کنه، C# هم توی ورژن ۱۰ ش قراره ویژگی‌های جالب جدیدی از async رو اضافه کنه مثل async method builder چند روز پیش‌ هم پایتون ۳.۱۰ منتشر شده، که متاسفانه یا خوشبختانه اوبونتو هنوز حتی ورژن ۳.۹ رو دیفالت توی پکیج‌های خودش نذاشته.بخاطر همین تصمیم گرفتم هم سوس کد پایتون رو برای خودم کامپایل کنم هم اینکه به این بهانه یکم درباره سورس کد زبان پایتون اینجا بنویسمپیش نوشت:من خوشم میاد از این کارا، نشستم دستی کامپایلش کردم شما میتونید بدون دردسر از apt و یا  ویندوز اینستالر استفاده کنیدبا apt:sudo apt install software-properties-common -y
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt install python3.10حالا بریم سراغ کامپایل کردنش:مواد لازم برای این کار مسلما داشتن gcc و make و دسترسی به ترمیناله که من خودم از WSL2 ویندوز استفاده میکنمخب بریم سر اصل مطلب، اول اینو بگم که پایتون ایمپلمنتیشن‌های مختلفی داره مثل pypy  و IronPython.net و هر کدوم، سورس کد پایتون رو تغییرات اساسی دادن که باعث زیاد شدن سرعت اجرا و یا کامپتیبل شدنش با مایکروسافت Common runtime language یا چیزای دیگه می‌شه و خب کامپایل کردنشون داستانی کاملا جداست.حالا ما میخوایم CPython که ایمپلمنتیشن اصلی پایتونه رو یه نگاهی بش بندازیماول دایرکتوری‌ که میخوایم توش کارامون رو بکنیم بسازیمmkdir python_source &amp;&amp; cd python_sourceلیست دیپندنسی‌ها و لایبرری‌های مورد نیاز پایتون رو نصب میکنیم:sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-devکه تقریبا همشون لایبرری‌های نسبتا معروفی هستن مثل sqlite3, build-essential, libssl, و بقیهفایل سورس کد هم که روی سایت پایتون هست و کلا ۲۴ مگهwget  https://www.python.org/ftp/python/3.10.0/Python-3.10.0b4.tgzبا tar بازش میکنیم و میریم ببینیم چیا توشه؟tar -xf Python-3.10.0b4.tgz
cd Python-3.10.0
ls فایل config خیلی چیز جالبه و کار رو به شدددددت راحت میکنه،‌ و میاد برای شما محتویات makefile.pre رو بسته به سیستم شما عوض میکنه. دیگه حتی نیازی نیست داکیومنت‌ها رو بخونیم یا سورس کد  رو تو گیت‌هاب زیر و رو کنیم. هر چند این فایل خودکار تولید شده و حدود ۲۰هزار خطه، اما بخش‌هاش کاملا مشخصند و اگه یکم bash script بلد باشید و قبلا پروژه‌های متن باز رو کامپایل کرده باشید راحت می‌تونید چیزایی که می‌خواید رو پیدا کنید. میدونیم که عموما این پروژه‌های متن باز توی فایل کانفیگشون، به بخش optimization دارن که makefile یا makefile.pre رو برای سیستم شما عوض میکنهحالا که دستور مد نظر رو پیدا کردیم اجراش میکنیم./configure --enable-optimizationsلیست بلند بالایی از متغییرهای مختلف خواهید دید که بر مبنای سیستم شما، تنظیم میشن. و یه چند ثانیه شایدم چند دقیقه کوتاه طول میکشه یه چیزی مثل تصویر پایینتموم که شد وقت make کردن میشه، که احتمالا برای WSL باید خود پکیجش رو نصب کنیدsudo apt install make -yکامند make یه flag داره  به اسم -j یا jobs که میتونید بگید چندتا از پروسسور‌ها رو استفاده کنه که خب من برای اینکه کارم  سریع‌تر راه بیوفته میزنم رو ۸ تا. شما میتونی بگی پردازنده های بیشتری رو استفاده کنه یا کمترmake -j 8خود make میره makefile رو بر اساس Makefile.pre تولید میکنه براتون. وقتی میک فایل رو باز می‌کنید اولش یه همچین کامنتی میبینید که کامندهای بدرد بخور رو براتون نوشتهکامندهای make test , make install  اصلی‌ها هستن ولی نوشته make altinstall  پایتون جدید رو با قبلیه جایگزین نمی‌کنه ولی make install  اینکارو میکنه به همین دلیل من اینجا altinstall میکنم make altinstallمعمولا برای اینکه ببینید نرم افزار درست کامپایل شده یا نه باید یه بار ترمینال رو ببندید دوباره باز کنید برای چک کردن اینکه نصب تموم شده یا نهpython3.10 --version حالا که کامپایل تموم شده بیاید یه نگاهی به خود سورس کد پایتون بندازیم توی دایرکتوری‌ای که حاصل فایل فشرده بود چندتا دایرکتوری دیگه هست که بعضیاش رو میخوام توصیه کنم حتما نگاه کنید واقعا آموزنده هستش و اینو به آدم میفهمونه که وقتی خیلی راحت خفن ترین کارهای دنیای برنامه نویسی رو با ۴ خط کد انجام میدیم، توی اون زیرزمین تنگ و تاریکی کدها که هیچ کس نمی‌خواد ببینتش چقدز نبوغ مهندسی خرج شده.دایرکتوری Lib تمام لایبرری‌های استاندارد رو شامل میشه که شدیدا توصیه میکنم حداقل لایبرری‌های http, crypt, asyncio,ssl رو بخونید و ببینید چقدر نبوغ مهندسی برای پایتون خرج شدهدایرکتوری Python هم شامل سورس کد لایبرری‌های هسته پایتونه که واقعا کدهای جالبی توش هستمن هنوز تو مدیریت خطاها بعضی وقت‌ها شیش میزنم فایل errors.c خیلی برام باحال بوددایرکتوری Objects هم سورس آبجکت‌های built-in پایتون به زبان C هستن و انقدر دقیق و کامل کامت گذاری شدن که انگار دارید کتاب میخونید نه کد.</description>
                <category>امید زاهد</category>
                <author>امید زاهد</author>
                <pubDate>Tue, 05 Oct 2021 23:11:25 +0330</pubDate>
            </item>
                    <item>
                <title>ما،‌ الگوهای معماری، الگوریتم‌ها-بخش۱ ports &amp; adaptors</title>
                <link>https://virgool.io/@OZahed/%D9%85%D8%A7-%D8%A7%D9%84%DA%AF%D9%88%D9%87%D8%A7%DB%8C-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%A7-%D8%A8%D8%AE%D8%B4%DB%B1-ports-adaptors-ecb96ntaqtnp</link>
                <description> سلام،‌این پست اولین پست وبلاگی من هست و امیدوارم اگه مشکلاتی داشت مخصوصا در مورد موضوع فنی و نگارش، به من اطلاع بدیدحالا داستان چیه؟‌ اولا بگم که من دولوپر ارشد نیستم و درحال یادگیری‌ام،‌ ولی تازگی‌ها توی سایت‌های مختلف و گروه‌های برنامه نویسی می‌بینم خیلی‌ها به دیزاین پترن‌ها و الگوریتم ها گیر میدن که فقط به درد مصاحبه میخوره، نه فقط در ایران قضیه توی زبان انگلیسی هم خیلی تکرار میشه احتمالا تا الآن باید حداقل یکبار این توییت وایرال شده رو دیده باشیدتوییت وایرال شده در باره الگوریتن ها خب به علت همین قضیه مجاب شدم چندتایی از دیزاین پترن‌ها و الگوریتم‌هایی که حداقل من می‌دونم خیلی کاربردی هستن رو اینجا درحد خودم توضیح بدم تا هم خودم بهتر یادبگیرم و هم شاید یه سری جوون ترها مجاب بشن الگوریتم و دیزاین پترن رو یاد بگیرن.تو این بخش قصد دارم درباره‌ی کاربرد دیزاین پترن Mediator و command بنویسم و کاربردش توی راحت تر کردن کار اجرای الگوی معماری معروف به پورت ها و آداپتورها یا همون معماری شش ضلعی Hexagonal architecture.احتمالا  تا الآن در حال کار کردن با الگوی طراحی شش ظلعی،‌ به جایی رسیدید که تعداد زیادی لایه بیرونی داشتید که نیاز به استفاده از لایه اپلیکیشن داشتند،‌ درست مثل نمونه تصویر اول پست. مثلا بخش گزارش گیری نیاز داره درباره مدل‌های اپ  خبر داشته باشه و همینطور رابط گرافیکی و همزمان API ها و بخش مربوط به تست ها،‌ هم همینطور،‌ حالا چی میشه اگه شما بخوای اینترفیس (Interface) بخش  مربوط به بیزینس لاجیک رو عوض کنید؟ با فرض بر اینکه شما از اصل Dependency inversion  پیروی کردید و حالا نیازمندی های بخش مدل‌ها عوض شده مثلا فکر کنید در حال اجرای اپلیکیشنی مثل گوگل میت هستید و حالا میخواید بخش کلندر رو تازه اضافه کنید. و وقتی که کسی براش جلسه ست شده یا لغو شد یا هر اتفاقی تغییری توی استیت شون افتاد ایمیل بفرستید و یه سری ریسپانس‌ها رو برای کاربر بفرستید که تا الان نمی فرستادید. چندتا از سرویس‌ها تو رو باید ریفکتور کنید؟ وقتی که ارسال ایمیل اضافه شد باید همه سرویس هایی که از مدل های داخلی استفاده میکنند ریفکتور بشن.حالا اینجا دیزاین پترن‌های میدیتور و کامند به کار میان و میتونن کمک کنند. اما چطور؟اول یه نگاهی به خود دیزاین پترن ها بندازیم:‌اول Mediator دیزاین پترن میدیتورخلاصه این دیزاین پترن اینه که هرجا دیدید لایبرری‌ها تون نیاز دارن درباره همدیگه بدونن و تعداد بخش هایی که قراره از هم بدونن زیاده بیاید یه کلاس(یا لایبرری) بزارید وسطش که همه با اون کلاس کار کنن و اون کلاس در باره همه لایه های زیریش(تو تصویر بالا قسمت سمت راست) بدونه و بدونه کدوم ورودی رو به کدوم خروجی وصل کنه. در اصل بخش سمت راست خودش رو برای مدیتور داوطلب انجام کاری که بخش چپ درخواست میکنه، میکنه جالبی مدیتور اینه که میتونه اصلا بخشی از کد شما نباشه مثلا مسیج بروکر هایی مثل RabbitMQ یا مثلا Redis.دیزاین پترن commandبهترین توصیف کامندخلاصه این یکی دیزاین پترن اینه که هروقت تسکی داشتید که میخواست استیت رو عوض کنه و نیاز بود از جاهای مختلفی اینکار انجام بشه (مثل دکمه سیو که هم ctrl+s هست هم تو منو فایل هم توی آیکون سیو)  بیاید و اون تست رو بدید به کلاس جدا گونه برای انجامش و از هرجا لازم شد فقط متد execute روی اون کلاس رو کال کنید تو مدل گوگل میت که بالاتر گفتم میشه NewSessionCommand.execute(sessionInfo) که اینجا ما چون مدیتور داریم این مدلی تغییرش میدیمMediator.Send (new CreateSessionEvent(sessionInfo))دیگه کار فرستادن ایمیل و اضافه کردن دیتا بیس و اینا همه با هندلر مربوط به تولید سشن هست که مدیتور کالش میکنه.خب حالا چطور اینا کمک میکنن که ما کدمون راحت تر نگه‌داری بشه؟با استفاده از ترکیب مدیتور و کامند میشه اجرای بخش ثبت اتفاقات و ایمیل فرستادن رو کاملا از سرویس ها مخفی کرد و فقط متدهایی رو که تسک های ساختن جلسات و ارسال ایمیل رو هم زمان برای مدیتور register کرد و سرویس ها فقط توی خودشون به مدیتور بگن میخوام کامند ثبت جلسه اجرا بشه، همین.چیزی مثل ساختار مدل زیراین مدلی هر بخش یا سرویسی که لازم داره با مدل‌ها ارتباط برقرار کنه بدون اینکه بدونه مدل چیه یا چطور کار می‌کنه خیلی راحت فقط یک ایونت برای اون عملیات ایجاد میکنه و تحویل مدیتور میده. حالا میتونید تا زمانی که  ورودی‌ها تون یکسانه هر جوری دوست دارید خروجی‌های بخش هندلر مربوط به تولید سشن برای کاربرا رو عوض کنید.اگه اشتباه نگارشی داشت معذرت میخوام و خوشحال میشم بم تو کامنتا بگیداگه اشتباه فنی هم داشت بازم خوشحال میشم بگید و کمک کنید بیشتر یاد بگیرم.ممنون</description>
                <category>امید زاهد</category>
                <author>امید زاهد</author>
                <pubDate>Mon, 04 Oct 2021 15:56:06 +0330</pubDate>
            </item>
            </channel>
</rss>