<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali Torki</title>
        <link>https://virgool.io/feed/@alimaster</link>
        <description>JavaScript Instructor | Software Engineer</description>
        <language>fa</language>
        <pubDate>2026-06-16 19:46:21</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1026/avatar/Rwp3vz.jpg?height=120&amp;width=120</url>
            <title>Ali Torki</title>
            <link>https://virgool.io/@alimaster</link>
        </image>

                    <item>
                <title>کوروش: پادشاه جدید دنیای AI Code Analysis</title>
                <link>https://virgool.io/@alimaster/%DA%A9%D9%88%D8%B1%D9%88%D8%B4-%D9%BE%D8%A7%D8%AF%D8%B4%D8%A7%D9%87-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-ai-code-analysis-nhm9kzizncdz</link>
                <description>کوروش: ماجرای ساختن یه رویاایده اولیه پروژه کوروش برمی‌گرده به حدودا ۴ سال پیش، بعد از ایده پروژه داکراتور که کلی روش کار کردم ولی خب به سرانجام نرسیده ولی در کنار این موضوع اون موقع بود که فکر کردم کاش یه ابزاری بود که می‌تونست کمکم کنه توی پیدا کردن باگ‌های پروژه‌هام و به عنوان یک دستیار عمل کنه. سال گذشته چندتا مسیر مختلف رو رفتم که یکیشون روش AST parser بود که بیام کد رو تحلیل ساده و ابتدایی کنم ولی خب جواب نبود تا اینکه ChatGPT و دنیای LLMها متولد شدن.داستان اسم کوروشخب، شاید عجیب بنظر بیاد که اسم یه ابزار برنامه‌نویسی رو کوروش گذاشتم! کوروش کبیر اولین کسی بود که تونست امپراتوری بزرگی رو اداره کنه و انصاف رو رعایت کنه. منم دنبال این بودم ابزاری بسازم که کدها رو با همین روحیه اداره کنه.چرا اصلا شروع کردم؟حقیقتا، خیلی ساده بود. خسته شده بودم از اینکه هر بار برای analyze کردن کدهام یا پروژه‌هایی که از ابتدای توسعه‌اشون نبودم باید پول می‌دادم اونم دلاری به ابزارهایی مثل Github Copilot یا Jet-brains AI یا ساعت‌ها وقت بذارم. البته بگم که این ابزارهایی مثل Github Copilot طبق تجربه من اصلا نمی‌تونن در مقایس بزرگ نقش بزرگی رو هم ایفا کنن،حداقل تا امروز که نتونستن یا در شرایطی، خیلی اشتباهات فاحش دارن یا چیزی مثل Claude Code که گزینه خوبیه اما هزینه خیلی بالایی داره و البته محدودیت زیاد.یادمه یه بار یه پروژه NodeJS رو سال گذشته به دستم رسیده بود از طرف یکی از دوستانم که پر از باگ‌های امنیتی بود و فقط قرار بود یک باگی رو فیکس کنم براشون. اینقدر که همه چیز درهم بود که هربار می‌رفتم برای Trace کردن کد، به یک شکل جدیدی سرگیجه می‌گرفتم.اولین ایده: Language Detectionفکر کردم اگه بخوام ابزاری بسازم که واقعاً مفید باشه، باید بتونه خودش بفهمه با چه زبانی طرف کار می‌کنه یا پروژه نوشته شده. نه اینکه فقط extension فایل رو نگاه کنه.این کار خیلی سخت‌تر از چیزی بود که فکرش رو می‌کردم! آدم باید Pattern های مختلف زبان‌ها رو یاد می‌گرفت. مثلاً تو TypeScript از interface استفاده می‌شه، تو Python از def، تو Java از public static void main...الان که نگاه می‌کنم، دقت ۹۵ درصدی داره کوروش. خودمم گاهی تعجب می‌کنم!AI Integration: قسمت دوست‌داشتنیاینجا بود که کار سخت شد. می‌خواستم کوروش بتونه با AI های مختلف کار کنه. نه فقط OpenAI که پولیه، نه فقط cloud که همیشه اینترنت نداریم یا اگر داریم هم مشکل قندشکن داریم یا اگر قندشکن داریم، مشکل لوکیشن قندشکن داریم و خلاصه کلی دغدغه کلافه کننده دیگه که خودتون بهتر از من می‌دونید.زمانی که Ollama معرفی شد و بعدش LmStudio و حالا هم Docker Models، روی سیستم اجراء‌شون کردم که خب دقت‌شون به اندازه نسخه‌های Cloud نیست اما به شکل عجیبی راضی کننده هم هستن واقعا. اینجا بود که Ollama integration رو که اضافه کردم، انگار یه دنیای جدید باز شد! خودم می‌تونستم راحت روی سیستم خودم، بدون پول، بدون اینترنت، بدون نیاز به قندشکن و... یک AI Code Assitant سبک و کار راه‌بنداز داشته باشم و صد البته کوروش هم باهاش بتونه هم‌زبون بشه.Code Analysis: مغز متفکراین بخش واقعاً سخت بود. باید برای هر زبان جداگانه تحلیلگر می‌نوشتم. TypeScript Compiler API، Python AST، Java parser... هر کدوم یه دنیای جدا بودن.ولی وقتی متوجه شدم با LLMها به سادگی میشه درکی از کد رو ایجاد کرد و مشکلاتی که کد داره رو پیدا کرد، همه‌ی خستگی از تنم در اومد. یادمه اولین باری کهsecurity vulnerability پیدا کرد تو کد خودم! احساس کردم واقعاً میشه روش حساب کرد.Mentor Mode: ایده‌ای که حسابی برای خودمم دوست داشتنیهفکر کردم چرا کوروش فقط error پیدا کنه؟ چرا نتونه یاد هم بده؟Mentor Mode رو طوری طراحی کردم که بتونه با سطح دانش خودت از روی کدهایی که نوشتی یا سوالاتی که می‌پرسی ارتباط برقرار کنه. یه مبتدی که بیاد، بهش مفاهیم پایه رو توضیح می‌ده. یه حرفه‌ای که بیاد، نکات عمیق و سطح بالاتری رو می‌گه.خودم هنوزم ازش استفاده می‌کنم! بعضی وقت‌ها کدی می‌نویسم و بعد می‌رم می‌گم &quot;کوروش، این کد چطوره؟&quot;Health Monitoring: چک‌آپ کاملاین بخش رو وقتی اضافه کردم که فهمیدم پروژه‌های بزرگ(مثل پروژه اخیر خودم توی صرافی پول‌نو) نیاز به یه نمای کلی دارن. نمی‌شه فایل به فایل نگاه کرد. روش کارش هم اینطوری که در ابتدا تمام فایل‌ها و محتوایات داخلشون رو با AI بررسی می‌کنه و یک Health score می‌ده از ۱۰۰ نمره به کل پروژه. اگر اشتباه نکنم اولین باری که کد خودم رو اسکن کردم، ۶۷ گرفت یا ۷۷!قابلیت‌های کوروش به این مقاله معرفی ختم نمیشه و نیازه که مستندات خودش رو بخونید و اونجا سعی کردم کامل شرح بدم هر قابلیتی که داره(با کمک AI)چرا رایگان منتشرش کردم؟اولاً خودم از open source استفاده می‌کنم و به قول شاعر ملک الشعرای بهار، دگران کاشتند و ما خوردیم...ما بکاریم و دیگران بخورند.دوماً اعتقاد دارم ابزارهای خوب باید در دسترس همه باشن.کلام آخرکوروش رو توی شرایط و کدبیس‌های مختلفی تستش نکردم حقیقتا ولی امیدوارم بتونه به شما هم کمک کنه که کدهای بهتری بنویسید.اگر ازش استفاده کردید و مشکلی داشت، توی گیت‌هاب ایشو ثبت کنید سعی می‌کنم زود بهتون کمک کنم.با کوروش کد بزنید، لذت ببرید!لینک گیت‌هاب کوروشhttps://github.com/ali-master/cyrus</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Mon, 09 Jun 2025 20:06:03 +0330</pubDate>
            </item>
                    <item>
                <title>چرا بهترین نیت‌های ما برای کمک به دیگران، اغلب به نتیجه معکوس می‌رسد؟ (و چطور جلوی آن را بگیریم)</title>
                <link>https://virgool.io/@alimaster/%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86-%DA%86%D8%B1%D8%A7-%D9%81%D9%82%D8%B7-ejblk8vqmuge</link>
                <description>هنر کمک سازنده: چرا عبارت &quot;خب، چرا فقط...&quot; اغلب بیشتر آسیب می‌زند تا کمک؟حتماً برای همه‌مون پیش اومده: درگیر یک مشکل پیچیده‌ایم، کلی باهاش کلنجار رفته‌ایم، و وقتی با یکی در میون می‌ذاریم، با یه راه‌حل خیلی ساده و سریع مواجه می‌شیم که معمولاً با این جمله شروع می‌شه: &quot;خب، چرا فقط فلان کار رو نمی‌کنی؟&quot; شاید گوینده نیت خیری داشته باشه، اما اینجور وقتا این جمله مثل یه سطل آب سرد می‌مونه روی سر کسی که داره با چالش دست و پنجه نرم می‌کنه. تو این مقاله می‌خوایم دقیق‌تر بررسی کنیم که چرا این عبارت به ظاهر ساده، می‌تونه اینقدر مشکل‌ساز باشه و چطور می‌تونیم به شکل سازنده‌تری به دیگران کمک کنیم و در حل مسائل، همراه بهتری باشیم.وقتی &quot;فقط&quot; ساده نیست: بار پنهان یک پیشنهاد عجولانهوقتی کسی با اطمینان می‌گه &quot;چرا فقط...&quot;، حتی با نیت خوب، ناخواسته داره چندتا پیام منفی رو به ما منتقل می‌کنه:کوچک شمردن مشکل: اولین پیامی که به گوش می‌رسه اینه که &quot;مشکل تو اونقدرها هم که فکر می‌کنی پیچیده نیست.&quot; این خودش می‌تونه باعث بشه طرف مقابل احساس کنه درکش نمی‌کنیم، یا بدتر از اون، فکر کنه به اندازه‌ی کافی باهوش نبوده که به این راه‌حل &quot;واضح&quot; برسه. حس بی‌کفایتی یا حتی ساده‌لوح به نظر رسیدن، کمترین نتیجه‌شه.نادیده گرفتن تلاش‌ها و محدودیت‌ها: این عبارت تمام مسیری که فرد برای رسیدن به نقطه فعلی طی کرده رو نادیده می‌گیره. ساعت‌ها فکر، بررسی راه‌های مختلف، آزمون و خطا، و تمام محدودیت‌هایی (زمانی، مالی، دانشی، ابزاری و...) که شاید ما ازشون بی‌خبریم، همگی با یک &quot;فقط&quot; ساده کنار گذاشته می‌شن. شاید اون راه‌حلی که به نظر ما خیلی بدیهیه، اولین چیزی بوده که اون شخص امتحان کرده و به دلایل منطقی جواب نداده!چگونه شنونده و راهنمای بهتری باشیم؟خب، پس اگه نمی‌خوایم با یه جمله‌ی ساده، تمام پل‌های ارتباطی رو خراب کنیم و واقعاً قصد کمک داریم، چه کار باید بکنیم؟ مقاله چندتا راهکار خیلی خوب پیشنهاد می‌ده:کلمه &quot;فقط&quot; را حذف کنیم و به دنبال زمینه باشیم: به جای اینکه سریع بپریم وسط و بگیم &quot;فقط کافیه که...&quot;، اولین قدم هوشمندانه اینه که کمی مکث کنیم و بیشتر در مورد شرایط بپرسیم. سوالاتی مثل:&quot;تا الان چه راه‌هایی رو امتحان کردی؟&quot; &quot;بزرگترین مانع یا چالشی که الان باهاش روبرو هستی چیه؟&quot; &quot;چه منابع یا محدودیت‌هایی داری که باید در نظر بگیریم؟&quot; اینجوری نه تنها اطلاعات بیشتری به دست میاریم که بتونیم پیشنهاد دقیق‌تری بدیم، بلکه به طرف مقابل هم نشون می‌دیم که برای تجربه‌ و نگاهش ارزش قائلیم و عجولانه قضاوت نمی‌کنیم.پیشنهاد بدهیم، دستور ندهیم: لحن ما در انتقال پیام، معجزه می‌کنه. به جای اینکه راه‌حل‌مون رو به شکل یک دستور قطعی و از بالا به پایین بیان کنیم (مثلاً: &quot;باید این کار رو بکنی&quot;)، خیلی بهتره که اون رو به عنوان یک پیشنهاد، یک ایده، یا یک تجربه شخصی مطرح کنیم. مثلاً:&quot;به این فکر کردی که شاید این روش هم بتونه کمک کنه؟&quot; &quot;من یه تجربه‌ی مشابه داشتم، اون موقع فلان کار کمکم کرد، شاید برای تو هم مفید باشه.&quot; &quot;یک دیدگاه دیگه هم می‌تونه این باشه که...&quot; اینطوری فضا برای بحث، بررسی و حتی رد شدن پیشنهاد ما باز می‌مونه و طرف مقابل احساس نمی‌کنه که داریم براش تعیین تکلیف می‌کنیم یا خودمون رو عقل کل می‌دونیم.پیچیدگی مشکل را به رسمیت بشناسیم: حتی اگه فکر می‌کنیم مشکل راه‌حل ساده‌ای داره، خیلی مهمه که پیچیدگی‌های احتمالی رو دست‌کم نگیریم و این درک رو به زبان بیاریم. گفتن جمله‌ای مثل:&quot;می‌دونم که احتمالاً جنبه‌های مختلفی داره که من ازشون بی‌خبرم، اما به ذهنم رسید که...&quot; &quot;قطعاً تو خیلی بیشتر از من درگیر این مسئله بودی و جوانبش رو سنجیدی، ولی خواستم این ایده رو هم مطرح کنم...&quot; این کار به طرف مقابل اطمینان می‌ده که شما درک می‌کنید که اون با یه چالش واقعی روبروست و شما قصد ساده‌انگاری ندارید.فروتن باشیم: و در نهایت، فروتنی کلید اصلی یک ارتباط سازنده‌ست. ما هیچوقت همه‌چیز رو نمی‌دونیم و قرار هم نیست بدونیم. شاید راه‌حل ما واقعاً به درد اون موقعیت خاص نخوره یا قبلاً با شکست امتحان شده باشه. مهمه که با این ذهنیت وارد گفتگو بشیم که داریم یک ایده رو برای بررسی بیشتر به اشتراک می‌ذاریم، نه اینکه یک حقیقت محض و راه‌حل نهایی رو اعلام می‌کنیم. اگه پیشنهاد ما با استقبال مواجه نشد یا رد شد، نباید بهمون بربخوره، بلکه باید کنجکاو باشیم که دلیلش چیه و از این بازخورد برای درک بهتر مسئله استفاده کنیم.نتیجه‌گیری: کمک کردن، یک هنر استدر نهایت، هدف ما از کمک کردن به دیگران اینه که واقعاً باری از دوششون برداریم، نه اینکه ناخواسته احساسات منفی مثل بی‌کفایتی، درک نشدن یا حتی عصبانیت در اون‌ها ایجاد کنیم. دفعه‌ی بعدی که خواستیم به کسی که با مشکلی دست و پنجه نرم می‌کنه کمک کنیم، بیایم عبارت &quot;خب، چرا فقط...&quot; رو آگاهانه از واژگانمون حذف کنیم.به جاش، با کنجکاوی فعال، همدلی عمیق، و احترام کامل به تجربه‌ و دانش اون فرد گوش بدیم و سعی کنیم واقعاً هم‌فکر و هم‌قدمش باشیم، نه یک معلم همه‌چیزدان. این تغییر به ظاهر کوچیک در نحوه‌ی بیان و رویکرد ما، می‌تونه تفاوت بسیار بزرگی در کیفیت روابط انسانی‌مون و احساس رضایت و مفید بودن در طرفین ایجاد کنه. کمک کردن یک هنره، و مثل هر هنر دیگه‌ای، نیاز به دقت، ظرافت، صبر و درک متقابل داره. بیایم این هنر رو در خودمون پرورش بدیم.منبعhttps://www.neverjust.net/فیلسوف کسی است که تصدیق می کند، دانش زیادی ندارد و این موضوع او را آزار می دهد. با این حال او داناتر از همه کسانی است که در مورد دانستنی ها و مهارت خودشان، در زمینه هایی که هیچ اطلاعی از آنها ندارند، سر و صدا می کنند. من می گویم که دانا کسی است که می داند که نمی داند. سقراط خودش اعتراف می کرد که فقط یک چیز می داند و آن اینکه هیچ چیز نمی داند. این گفته را آویزه گوش کن، چون این اعتراف حتی بین فیلسوفها خیلی کمیاب است. یادت باشد که این اعتراف بین مردم، می تواند به قیمت از دست دادن جان آدم تمام شود. همیشه خطرناکترین آدمها کسانی هستند که می پرسند. جواب دادن تا این اندازه خطرناک نیست. در یک سوال می تواند بیش از هزاران جواب، باروت خشک وجود داشته باشد.  یاستین گوردر</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Sat, 24 May 2025 03:23:28 +0330</pubDate>
            </item>
                    <item>
                <title>تحلیل جبرگونه و ریاضیاتی any، unknown و never در TypeScript</title>
                <link>https://virgool.io/@alimaster/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%DB%8C%D9%86-any-unknown-never-%D8%AF%D8%B1-%D8%AA%D8%A7%DB%8C%D9%BE-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-ozypazpaqo6e</link>
                <description>تفاوت Any, Unknown و Never از دیدگاه نظریهٔ جبر مجموعه‌ها و ریاضیات تفاوت Any، Unknown و Never از دیدگاهِ نظریّهٔ جبرِ مجموعه‌ها و ریاضیّاتسعی می‌کنم توی این نوشته، از دیدگاهِ نظریّهٔ جبرِ مجموعهٔ‌ها و تئوری تایپ، تفاوت این سه تایپ any، unknown و never رو به صورت مختصر و مفید توضیح بدم.البته قبلش لازمهٔ چهارتا مفهوم پایه‌ای از تئوری مجموعهٔ‌ها رو بدونیم تا درک و دید بهتری برای مقایسهٔ و تحلیلِ نحوهٔ عملکردشون داشتهٔ باشیم:1. اگه &quot;T&quot; یه تایپ باشهٔ، اون‌وقت &quot;{T}&quot; مجموعهٔ‌ای از همهٔ عناصریهٔ که از نوع &quot;T&quot; هستن.2. عملگر Union در تایپ‌اسکریپت &quot;(|)&quot; در واقع، متناظر با عملگرِ اجتماع &quot;(∪)&quot; در جبرِ مجموعهٔ‌هاست.3. عملگر Intersection در تایپ‌اسکریپت &quot;(&amp;)&quot; همون اشتراکٔ &quot;(∩)&quot; در تئوریِ مجموعهٔ‌هاست.4. رابطهٔ SubType &quot;(&lt;:)&quot; رو می‌شهٔ با زیرمجموعهٔ‌بودن &quot;(⊆)&quot; مطابقت داد.با این پیش‌زمینهٔ، حالا هر سهٔ تایپِ never، unknown و any هرکدوم جایگاهِ ویژهٔ خودشون رو توی این ساختار دارن که در ادامهٔ، هر کدوم رو توضیح می‌دم. البته قبلش لازمهٔ تفسیر و معنی کلمهٔ &quot;کاردینالیتهٔ&quot; رو کوتاه توضیح بدم که در ادامهٔ صحبت‌هام، چند باری نقل قول کردم ازش.کاردینالیتهٔ (Cardinality) توی جبر مجموعهٔ‌ها یا همون تئوری مجموعهٔ‌ها، در واقع اشاره داره به «تعداد اعضای» یه مجموعهٔ یا به بیان ساده‌تر «اندازهٔ» اون مجموعهٔ رو تعریف می‌کنهٔ. حالا این اندازه ممکنهٔ متناهی باشه (مثلاً یه مجموعهٔ با ۵ تا عضو) یا نامتناهی (مثل اعداد طبیعی که بی‌نهایت عضو دارن). پس اگه بگم کاردینالیتهٔ یه مجموعهٔ چقدره، یعنی دقیقاً دارم می‌گم چند تا عنصر می‌تونهٔ توی اون مجموعهٔ باشه و یا حضور پیدا کنهٔ.حالا نوبت می‌رسهٔ به تفسیر و موشکافی هر کدوم از این سهٔ تایپ و تحلیل عملکردشون زیر ذره‌بین.تایپ neverاز دیدِ ریاضی می‌شهٔ گفت این تایپ همون «مجموعهٔ تهی» (∅) هستش؛ یعنی اصلاً مقداری توش نمی‌گنجهٔ. توی تئوریِ تایپ‌ها بهش می‌گن «Bottom Type». به این معنی کهٔ تابعی کهٔ مقدارش never برمی‌گردهٔ، یا Throw Error کرده یا اینکهٔ توی یه حلقهٔ بی‌نهایت گیر افتادهٔ. و همین‌طور از اون‌جایی که ∅ زیرمجموعهٔ هر مجموعهٔ دیگه‌ای به حساب میاد، پس در سطح تایپ هم never یک SubType از همهٔ تایپ‌هاست. احتمالا بپرسید این یعنی چی؟بذارید اینطوری بگم کهٔ از دیدگاهٔ جبر مجموعه‌ٔها، مجموعهٔ تهی (∅) یعنی اینکهٔ هیچ عنصری توش وجود ندارهٔ یا به عبارت دیگه T⊈∅. حالا چرا می‌گیم ∅ زیرمجموعۀ همه مجموعه‌ٔهای دیگهٔ به حساب میاد؟ چون یکی از تعریف‌های زیرمجموعه‌ٔبودن اینه که «همهٔ عناصر مجموعهٔ اول، توی مجموعهٔ دوم هم باشن». خب وقتی هیچ عنصری نداری، اصولاً چیزی هم نیست که بیرون از مجموعهٔ دوم قرار بگیره. پس به‌عبارت دیگهٔ، می‌تونیم اینطوری تعبیر کنیم که شرط زیرمجموعه‌ٔبودن همیشه صادقهٔ، چون هیچ موردی وجود ندارهٔ که نقض‌اش کنهٔ.از این طرف، توی دنیای تایپ‌ها و تایپ‌اسکریپت، وقتی حرف از never می‌زنیم یعنی معادل ∅ به حساب میاد، و این یعنی در حقیقت هیچ مقداری نمی‌شه‌‌ٔ بهش اختصاص داد یا به عبارت دیگه Assign کرد، چون هیچ تایپ‌ای وجود ندارهٔ که بشهٔ از نوع never باشهٔ. پس طبیعیه‌ٔ که اگر یه تابعی قرارهٔ مقدارش never برگرده‌ٔ، معنیش این میشهٔ که یا این تابع اصلاً خروجی‌ای برنمی‌گردونه (دچار یک حلقهٔ بی‌نهایت یا Infinite Loop شدهٔ) یا یک Throw Error‌ کرده و کلاً نقطۀ پایانی هم ندارهٔ.حالا چون ∅ توی ریاضیات زیرمجموعۀ هر مجموعهٔ دیگه‌ای محسوب می‌شهٔ، توی دنیای تایپ‌ها هم never یک SubType از همهٔ تایپ‌ها به حساب میاد. یعنی اگه جایی از کدت انتظار داری یه نوع خاص باشهٔ مقدارش، این واقعیت که never هیچ مقداری نداره، جادویی رو می‌کنهٔ که بتونی اون رو (از لحاظ تئوری) به هر نوع (تایپ داده) دیگه‌ٔای تغییر بدی یا در حقیقت Type Casting کنی، بدون اینکه با تناقض وجودیتش مواجه بشی. توی تایپ‌اسکریپت اگر یه متغیر یا یه تابع بتونه never باشهٔ، عملأ می‌شه با قطعیت گفت که هیچ‌وقت قرار نیست مقدار واقعی از اون تایپ داده رو داشتهٔ باشی، پس هر ترکیبی که نیاز باشهٔ، می‌تونه در سطح تئوری سازگار بمونه در مورد این تایپ.تایپ unknownاین یکی رو می‌تونیم «مجموعهٔ Universal Set یا جهانی» با نمادِ اختصاری (U) در جبر بدونیم و همینطور در تئوری تایپ، یه «Top Type» به حساب میاد. حال از نگاهِ کاردینالیتهٔ، تایپ unknown می‌تونهٔ دربرگیرندهٔ همه‌چیز (مقدار و یا نوع داده) باشه(T⊆Usafe​). اما نکتهٔ مهم اینه که برای دسترسی به متدها یا propertyهای مختلف‌اش، باید حتماً نوع داده‌اش رو Narrow یا چک کنیم که به یک مفهوم از یک تئوری دیگه‌ای به اسم Type Guard در تایپ‌اسکریپت هم نشأت می‌گیره.به همین خاطرهٔ که unknown در نهایت امر، یک تایپ شدیدأ محافظه‌کار و مطمئن به‌حساب میاد؛ یعنی توی کدت مجبوری همیشه در مواجهه با این تایپ مراقب باشی و قبل از استفاده ازش، حتمأ نوع‌ داده‌ای که با خودش حمل می‌کنه رو بررسی کنی  (narrowing) تا امکان دسترسی بهش رو پیدا کنی. به تعبیر دیگه‌ای، این تایپ نوع‌های مختلفی از نقاب‌ها رو همیشه بر چهره‌اش داره که در هر مکان و زمانی‌ می‌تونهٔ خودش رو در جلوه دیتا تایپ‌ای که شما انتظار دارید نمایان کنهٔ و به سازگاری موقتی برسهٔ!حالا اگر بخوایم این unknown رو زیر زره‌بین و با جزئیات بیشتری تحلیل کنیم می‌تونیم همچین تعریفی داشته باشیم کهٔ وقتی می‌گیم unknown می‌تونهٔ دربرگیرندهٔ همه‌چیز باشهٔ، یعنی مثل یه «مجموعهٔ جهانی» (Universal Set) عمل می‌کنهٔ. در بحث مجموعه‌ٔها، مجموعهٔ جهانی (U) یه جورایی بزرگ‌ترین مجموعهٔ توی یه فضای مفهومی مشخص محسوب می‌شهٔ که شامل تمام اعضای ممکن اون فضاست.حالا با این تعاریف، توی تایپ‌اسکریپت هم unknown به همین شکل می‌تونهٔ پذیرای هر نوع مقداری باشه (از عدد و رشتهٔ گرفتهٔ تا آبجکت‌ها و فانکشن‌ها و غیرهٔ). پس در واقع از دید کاردینالیتهٔ، می‌تونیم بگیم که unknown بیشترین ظرفیت رو برای قرار گرفتن هر نوع عنصری رو در خودش داره. که صد البتهٔ unknown محبوب‌ترین تایپ من‌ بوده تا به امروز.تایپ anyبازم از نگاهِ نظریهٔ مجموعه‌ها می‌شه گفت که مثل تایپ unknown این تایپ‌هم یک مجموعه U یا همون مجموعهٔ جهانیه (Universal Set) به حساب می‌آد؛ ولی این یکی اصلاً محافظه‌کار نیست و هیچ‌وقت نمی‌تونه بهت اون حس اطمینان و خاطرِ جمعی که بخاطرش کد می‌زنی رو بده. چرا؟ چون کامپایلر رو دور می‌زنه  و حالا هر عملیات/تغییری رو می‌تونی روش انجام بدی بدون این‌که خطأ تایپ بگیری و به همین سادگی ما بهترین قابلیت تایپ‌اسکریپت یعنی (Type Safety) رو از دست می‌دیم. برای همین هم می‌گن که any راهِ فرار یا خروج اضطراری از سیستم دست و پا گیر تایپ‌ها به‌حساب میاد و بهت کمک می‌کنهٔ تا قوانین کامپایلر رو اونطوری دور بزنی که دیگه اصول و اخلاقی نباشه که بخوای بهشون پابند بمونی.اگه بخوام خلاصهٔ و چکیدهٔ تمام صحبت‌هام رو بگم تا مروری بکنیم:• تایپ never دقیقاً تهی (∅) یا Bottom Type هستش و هیچ مقداری رو در بر نمی‌گیره.• تایپ unknown عملاً مجموعهٔ جهانی (U) ولی مطمئن و محافظه‌کاره و باید برای استفاده، حتماً Narrowing کنیم.• تایپ any هم از نگاهِ نظریهٔ کاردینالیته مثل Uـه، ولی Type Safety رو نادیده می‌گیره و سیستم Type Checking کامپایلر رو به تعبیری غیرفعال می‌کنه.در پایان، امیدوارم این نوشته دیدِ مختصر و مفیدی در موردِ درک بهتر نظریّهٔ جبرِ این سه تایپ و نوعِ عملکرد و تفاوتشون بهتون داده باشه تا توی نوشتنِ کدهاتون با تایپ‌اسکریپت، زین پس از این سه تایپِ خاص و دوست داشتنی، به‌درستی و به‌جا استفاده کنین.من همیشهٔ می‌توانم آزادانهٔ انتخاب کنم، اما باید بدانم که اگر انتخاب نکنم، باز هم انتخابی کرده‌ام.ژان پل سارترموفق باشید</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Sun, 09 Feb 2025 13:04:39 +0330</pubDate>
            </item>
                    <item>
                <title>تقویم مخصوص اپلیکیشن های PWA و Mobile First design</title>
                <link>https://virgool.io/@alimaster/%D8%AA%D9%82%D9%88%DB%8C%D9%85-%D9%85%D8%AE%D8%B5%D9%88%D8%B5-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7%DB%8C-pwa-%D9%88-mobile-first-design-v1vgf1swf1vq</link>
                <description>محصولی دیگه از خانواده PersianTools منتشر شد!React Persian Mobile DatePickerمخصوص اپلیکیشن های PWA و Mobile First deisgn.React Persian Mobile DatePicker تقریبا ۶ ماه به صورت پاره وقت طول کشید تا از صفر نوشته بشه و تبدیل بشه به اولین React Persian Mobile DatePicker ای که تقریبا Full Accessible and Customizable هستش و راستی کلا ۲۰ کیلوبایت حجم این کتابخونست!برخی از قابلیت هاش:- تم دارک و لایت- قابلیت هایلایت تعطیلات رسمی- قابلیت هایلایت کردن روز های جمعه- قابلیت تغییر متن روز و ماه و سال به هر شکلی که دوست داشته باشید- قابلیت تغییر استایل ستون ها، ایتم ها و روز، ماه و سال انتخاب شده- قابلیت نمایش نام روزهای هفته- قابلیت محدود سازی دامنه نمایش تاریخ ها که سخته نوشتن قابلیت های این تیکه اش، پیشنهاد میکنم دموهاش رو ببینید- قابلیت محدود سازی نمایش ستون لیست سال ها، مثلا نمایش باز ۱۳۹۰ تا ۱۴۰۰ بدون نیاز به محدود سازی ماه و روز- قابلیت نمایش عنوان برای هر ستون با سطح دسترسی تغییر استایل های هر عنوان- دارای انواع توابع کار با تاریخ بدون نیاز به استفاده از هیچ کتابخونه ای مثل moment-jalaali یا jalaaliJS و...گل کلام: استار ای که توی گیت هاب خواهید داد خستگی تمام روزها و شب هایی که تا پاسی از شب با هایپ بیدار میموندم تا این پروژه رو بنویسیم و چالش های پیچیده ای که داشت رو حل کنم رو از تنم در میاره.در پایان، از soheil pasbakhsh و Parvin Hashemi و Akram Najafi بابت کمک های فراوانشون از ارائه ایده های خوبشون تا پیاده سازی این پروژه ممنونم. خسته نباشید بچه ها.لینک پروژه در گیت هابhttps://github.com/persian-tools/persian-mobile-datepickerلینک دمو پروژهhttps://persian-tools.github.io/persian-mobile-datepicker/</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Tue, 10 Aug 2021 15:51:22 +0430</pubDate>
            </item>
                    <item>
                <title>زندگینامه و تجربیات ۱۰ ساله یک برنامه نویس</title>
                <link>https://virgool.io/CodeLovers/%D8%B2%D9%86%D8%AF%DA%AF%DB%8C%D9%86%D8%A7%D9%85%D9%87-%D9%88-%D8%AA%D8%AC%D8%B1%D8%A8%DB%8C%D8%A7%D8%AA-%DB%8C%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%DB%B1%DB%B0-%D8%B3%D8%A7%D9%84%D9%87-wkzlftj4ip1r</link>
                <description>امروز ۹بهمن ۹۹ تولد 10 سالگی برنامه نویسی منه.زندگینامه یک برنامه نویساول زندگینامه‌ کاری‌ام رو براتون مینویسم و بعدش تجربیاتم رو براتون بازگو میکنم. تجربیاتی که در نهایت براتون میگم بیشتر به درد کسایی که میخوره که یا میخوان قدم توی این راه پر فراز و نشیب بذارن یا شروع کردن و در اول راه هستن.چیزایی که میخوام بگم:چطوری برنامه نویسی رو شروع کردم؟چه چالش هایی داشتم؟چطوری چالش هام رو پشت سر گذاشتم؟چطوری اولین پروژه وب سایتم رو گرفتم؟چطوری اولین شغلم رو در ۱۷ سالگی بدست آوردم؟چطوری بهترین شغل زندگیم رو به دست آوردم و استخدام شدم؟چکیده ۱۰ سال برنامه نویسیچطوری برنامه نویسی رو شروع کردم؟مهر ماه سال ۸۹یک مسابقه وبلاگ نویسی در سطح کشور برگزار شد که از طریق مدیر دبیرستانمون ازش مطلع شدم و چون بلاگفا رو می‌شناختم شرکت کردم. پایان مسابقه دی ماه بود که حسابی وقت داشتم وبلاگم رو زیبا طراحی کنم و مطلب بنویسم و منتشر کنم.سه ماه خواب و خوراک رو از خودم گرفتم و نزدیک ۴تا کتاب خریدم و دونه دونه‌اشون رو خوندم و چکیده‌اشون رو توی وبلاگم نوشتم. ۶بهمن ۸۹مدیر مدرسه وقتی سر کلاس فیزیک بودم صدام زد و منم گفتم خدایا چیکار کردم که مدیر مستقیما کارم داره(چون اون زمان خیلی دانش آموز بدی بودم توی مدرسه)، بهم گفت که از تیم برگزار کننده مسابقه به مدرسه زنگ زدن که دو نفر از مدرسه ‌ی شما تو مسابقه برنده شدن و یکیشون دوم شده و اون یکی سوم(من). بهترین خبر زندگیم رو تا به اون روز شنیدم و اونی که نفر اول شده بود چهارم دبیرستان بود. قرار شد که روز بعدش با هزینه مدرسه بریم اصفهان برای جشن اختتامیه مسابقه با هزینه خود مدرسه(که در نهایت حتی پول اتوبوس رو هم ندادن). اونی که نفر دوم شده بود نزدیک ۵سال برنامه نویسی میکرد اون موقع و بجای وبلاگ یه سایت نوشته بود با DataLife Engine(DLE) و روی sub domain سایتش رو بالا آورده بود.اینکه من نتونسته بودم در حد اون ادم باشم به طرز عجیبی ناراحتم میکرد و کل مسیر رفت و برگشت رو من حرص خوردم و راستش حسودی کردم.۹ بهمن ۸۹:وقتی برگشتیم از اصفهان، با خودم عهد کردم که باید از اون ادم بزنم جلو. از هیچ شروع کردم. اصلا ایده ای نداشتم که از کجا شروع کنم و چیا رو بخونم. توی انگلیسی هم رسما گلدون بودم و هیچی از مقاله های خارجی نمیفهمیدم و به هر فیلم فارسی ای که پیدا میکردم چنگ میزدم و با جزئیات میخوندم. تا قبل از عید سال ۸۹نزدیک ۱۵تا قالب Static رو با HTML و CSS طراحی کردم. اومدم که یکی از اون قالب هایی که طراحی کرده بودم رو بذارم روی بلاگم و وقتی تموم شد حواسم نبود که ارتفاع تمامی بلاک ها رو مقدار ثابت داده بودم و ارتفاع داینامیک نبود. وقتی به اون دوستم گفتم منو پیچوند و کد کلی ادم دیگه رو توی اینترنت خوندم تا بالاخره فهمیدم مشکلم چیه!!!چه چالش هایی داشتم؟اولین و بزرگترین چالشم این بود که همه چیز رو با سرعت میخوندم و ذخیره و یادآوری حجم اطلاعات تو ذهنم برام یه چالش بزرگ شده بود.دوتا ایده به ذهنم رسید: نوشتن یه جزوه از چیزایی که یاد گرفته بودمتدریس چیزایی که یاد گرفتم به بقیه آدماایده اولیم رو پیاده کردم اما اونطوری که می‌خواستم جواب نداد. البته چون فاصله خونمون از مدرسه نزدیک ۴۵دقیقه پیاده روی بود باعث می‌شد که وقت خوبی برای مطالعه چیزایی که نوشتم بودم داشته باشم اما نتیجه ای که دوست داشتم حاصل نشد.ایده دوم خیلی قلقلکم میداد اما کار سختی بود که آدمای هم سن خودت رو قانع کنی که چیزی که تو بهش ایمان داری رو یاد بگیرن. اول از همکلاسی هام شروع کردم. تونستم ۸تاشون رو قانع کنم که بیان توی کلاس هام اما کدوم کلاس؟‌ کجا؟ رفتم با کانون فرهنگی تربیتی پویش شهرمون صحبت کردم و اونا رو هم تونستم قانع کنم که بهم یه کلاس بدن روز های پنجشنبه از ساعت ۸صبح تا ۲بعد از ظهر.این شروع راهی بود که سرعت پیشرفت منو۱۰برابر کرد. برای اینکه بتونم آماده بشم که به بقیه چیزایی که توی ذهنم هستش رو یاد بدم باید خودم کلی میخوندم و تمرین میکردم در حدی که اگر کسی ازم سوال پرسید نگم نمیدونم(از این جمله فراری بودم)!!!بعد از کانون فرهنگی تربیتی پویش رفتم یه آموزشگاه دخترونه قبول کرد که برم اونجا و آموزش بدم.بعد از اونجا نزدیک ۲.۷ سال هم توی مجتمع فنی تهران نمایندگی ونک تدریس کردم که این دوره زمانی هم دوره قشنگی بود برام و با کلی آدم خفن آشنا شدم که همگی الان از ایران رفتن متاسفانه.تا به امروز ۷۸۳ نفر دانشجو از روز اول شروع برنامه نویسیم تا به الان داشتم که ۳تاشون رو خبر دارم که جاهای خوبی دارن الان کار می‌کنن.تجربه تدریس:آموزش دادن باعث شد تلاش کنم که به آدم هایی که صفر هستن یا حتی کامپیوتر رو هم بلد نیستن بهشون HTML, CSS یاد بدم و کاری کنم که به خروجی برسن. و همین موضوع باعث شد امروز هرچیزی که اون روزا یاد بقیه داده بودم از ذهنم خارج نشن و بدون CTRL + S زدن کلی کد HTML, CSS بزنم و در نهایت نتیجه همونی باشه که انتظارش رو دارم.چطوری اولین پروژه وب سایتم رو گرفتم؟چندتا از مغازه هایی که بنر طراحی می کردن توی شهرمون رو نشون کردم و رفتم براشون متناسب با تم رنگی و یک سری معیارهای دیگه ای که داشتن قالب طراحی کردم و می رفتم پیششون و کاری که براشون نوشته بودم رو دمو میکردم و سعی میکردم پروژه شون رو ازشون بگیرم که در نهایت دوتاشون جواب مثبت دادن. یکیشون با قیمت ۲۵۰هزار تومان کارش رو گرفتم اما در نهایت پولم رو نداد و اون یکی ۱میلیون و اومد خونه‌امون و بابام برامون یه قرارداد نوشت و کارش رو به بهترین شکل ممکن براش نوشتم و ۱میلیون رو گرفتم و اون روز بهترین روز زندگی من بود و با پولش سیمکارتی که امروز دارم رو خریدم.چطوری اولین شغلم رو در ۱۷ سالگی بدست آوردم؟۲۳خرداد سال ۹۳که امتحانات دبیرستان مون تموم شد از شهرمون به تنهایی مهاجرت کردم به تهران، شهریار و کلا ۵۰هزار تومن پول داشتم. با پولم یه چسب خریدم و روی ۵۰تا کاغذ متن زیر رو چاپ کردمطراحی سایت شما با کمترین قیمت و بهترین کیفیتبعد از ۳ روز یه نفر بهم زنگ زد و در اول صحبت گفت:اون: کارت خوبه؟ چطوری کار میکنی؟من: بنظر خودم که کارم عالیهاون:‌ بیا دفترم فلان جا و نمونه کاراتم با خودت بیاربرام عجیب بود که چرا باهام محترمانه حرف نزد! اما برام مهم نبود. راس ساعت رفتم دفترش و کارش نمایندگی پارس آنلاین توی شهریار و حومه شهریار بود و پروژه هم می‌گرفت و میداد بقیه انجام بدن.کار هامو که نشون دادم خیلی خوشش اومد و بهم پیشنهاد داد که ماهی ۲۵۰هزار تومن بهم حقوق بده و بیمه هم نداره چون سنم زیر ۱۸بود. منم قبول کردم. خونه نداشتم و بهم کمک کرد که دنبال خونه بگردم و بالاخره یه خونه پیدا کرد برام که ۲۰۰تومن کرایه ماهیانش بود.خلاصه سرتون رو به درد نیارم. اون ادم هم ۳.۵میلیون از پولم رو خورد و بهم نداد و من هفته ها رو با نون بربری سپری کردم و هیچ پولی نداشتم و خونه‌امم در نهایت از دست دادم و در ادامه داستانی هست که علاقه ای به گفتنش ندارم چون روزگار سختی بود برام.چطوری بهترین شغل زندگیم رو به دست آوردم و استخدام شدم؟قبل از مهاجرتم به تهران، به طرز عجیبی شرکت بیان رو دوست داشتم و بهشون شب ها رو روزها و حتی توی خوابمم فکر میکردم. مقصد همه فکر های زندگیم شده بود ورود به شرکت بیان. شب ها روز ها رو سخت تلاش میکردم و وب سایت‌هاشون رو دنبال میکردم و تمام تلاشم این بود که طوری طراحی کنم که نزدیک به طراحی‌های اونا باشه و اگر روزی خواستن باهام مصاحبه کنن و نمونه کارام رو ببینن صد درصد ازم خوششون بیاد.چندین بار رفتم کوچه‌ی زهره پشت در شرکتشون می‌نشستم و خودم رو تصور میکردم که صبح وارد شرکت میشم و غروب خارج میشم و کلی خیال بافی‌های دیگه. یکی از روزایی که پشت در نشسته بودم و اتفاقا لپ تاپمم باهام بود، زد به سرم که در رو بزنم و برم داخل و ازشون خواهش کنم که با مدیر عامل که آقای علی قدیری بود صحبت کنم که منو استخدام کنن.وقتی در رو زدم آقای سنا در رو باز کرد و گفتم که میخوام استخدام شرکتشون بشم که در جواب بهم گفت که نمیتونی و باید بری و از طریق وب سایتمون اقدام کنی.براشون ۳بار اپلای کردم و دفعه اول رد شدم و رفت تا ۳ماه دیگه. بدجوری ناراحت شدم. عمیقا از شکست متنفرم و بابت اینکه دیگه اینطوری نرم تو دیوار مجدد کلی سایت دیگه طراحی کردم که یکی از یکی قشنگ تر بودن و رزومه‌ام رو بهتر کردم و مجدد اپلای کردم و بازم رد شدم.اما از رو نرفتم و سه ماه بعدش دوباره اپلای کردم و ایندفعه بهم زنگ زدن که بیا برای مصاحبه. شاید باورتون نشه اما نمی‌تونستم حجم خوشحالی خودم رو پنهون کنم و طوری داد زدم توی خونه که حنجره‌ام درد گرفت. روز مصاحبه دقیقا سر وقت رفتم و اقای محمد صالحه(CTO بیان که ایشون سال گذشته در حادثه هواپیمای اوکراینی جان باختند) و اقای محسن حق‌شنو باهام مصاحبه کردن و از پس مصاحبه حسابی براومدم. و جلسه که تموم شد گفتن که جوابش رو بهم میدن.دو هفته طول کشید تا جواب بدن و من توی اون دو هفته خواب و خوراک نداشتم. در نهایت باهام تماس گرفتن و گفتن که قبول شدی و باید برم با مدیرعامل مصاحبه کنم.وقتی مدیرعامل رو ملاقات کردم و داستانم رو براش گفتم که چقدر برای بیان اومدم تلاش کردم خیلی حس خوب گرفت و ازم استقبال کرد و بهم پیشنهاد حقوق ۲.۵میلیون رو داد. اون موقع تازه ۱۸سالم شده بود و در پایان صحبتمون بهم گفت که خوش اومدی به بیان و این بود آغاز زندگی کاری جذاب من.بهترین روزای زندگیم رو در بیان گذروندم و هنوزم که هنوزه من داخل دوران قشنگی که تو بیان سپری کردم گیر کردم و نتونستم فراموشش کنم. سرعت پیشرفتم 100برابر شده بود. ادمایی که کنارشون بودم هر کدوم داخل حوزه‌ی کاری خودشون جزو خدایان اون حوزه بودن و خیلی چیزا یاد گرفتم.روز تلخ:بیان بخاطر اتفاقی که عاجزم از گفتنش و ظلم هایی که برخی ظالمان بهش تحمیل کردن، وارد چالش‌هایی شد که خداروشکر عدالت همیشه بر ظلم و ظالم حکم‌فرماست و بیان بعد از گذشت مدتی، پیروز شد دربرابر اون ظلم نابرابر.چکیده ۱۰ سال برنامه نویسیکارت رو زندگی کنعاشق کد هایی باش که بابت نوشتن هر خطش داری عمرت رو صرف می‌کنیتدریس کن به ادمایی که صفر هستن و این باعث میشه مباحث fundamental رو درست و حسابی یاد بگیری و هیچ وقت فراموش نکنی.تدریس فرایندی طولانی هستش که مستلزم زمان هم هستش. اگر زمانش رو نداری پس سعی کن یه چیزی رو خیلی خوب یاد بگیری و توی یه ورکشاپ ۲ ساعته یا بیشتر به بقیه یادش بده.اگر باهوشی جایی کار کن که ادمای اونجا از تو باهوش ترن در غیر این صورت به صورت اتوماتیک طرد میشی از اون شرکت چون نه تو اون آدما رو درک میکنی و میفهمی و نه اونا تو رو.اگر به راهی که داری واردش میشی ایمان داری، اگر حتی ۱۰۰۰۰ بار هم زمین خوردی بازم بلند شو و ادامه بده. ۱۰۰۰۰ بار شکست یعنی ۱۰۰۰۰ راه جدید.تو خالق کدهایی هستی که میزنی،‌ پس حسابی مواظب باش تمیز خلق کنی و ادمای دیگه از مخلوقت لذت ببرن.تا میتونی کتاب های حوزه زبان برنامه نویسی ای که کار میکنی رو با جزئیات فراوان بخون. توی کارت همیشه به جزئیات توجه کن. توجه به جزئیات یعنی موفقیت.با حرف هر آدمی راهت رو عوض نکن و از این شاخه به اون شاخه نپر. نمیتونی با یه دست چند تا هندونه رو نگه داری پس سعی نکن چند تا زبان رو بلد یاد بگیری، تمرکز کن فقط روی یک زبان و توی اون Deep شو و علمی یادش بگیر.از کد زدن فرار نکن و هر وقت خالی که پیدا کردی رو صرف خواندن یا کدنویسی کناگر میخوای بدونی بقیه چطوری کد میزنن ساده ترین راهش گشت و گذار توی گیت هابه. کد پروژه ها رو بخون. این کار هم کلی بهت ایده میده و هم چیزای جدید و خلاقانه پیدا میکنی توی کدهاشون.تجربه رو دوباره تجربه نکن، بلکه ازش استفاده کن. روی چیزی که بقیه بهترینش رو نوشتن تمرکز نکن، بلکه چیزی رو بنویس که بقیه یا هنوز پیاده سازی نکردن یا خوب پیاده سازیش نکردن.اگر باهوشی و به هوش خودت ایمان داری پس کاری رو بکن که بقیه نمی کنند و راهی رو برو که بقیه نمیرن و طوری فکر کن که بقیه نمی کنند. همین یه مورد تجربیاتی رو برات رقم میزنه که بقیه هنوز تجربه نکردن.هرجا میخوای بری کار کنی یا داری کار میکنی، سعی کن پیشرو باشی و کارشون رو از خودت بدونی. اینطوری میدرخشی.از شکست نترس، شکست یک تجربه گران بهاست. اگر تجربه شکست های فراوان داشته باشی اونوقت اونقدر تجربه داری که برای شروع هر کاری، بدونی چطوری میتونی باعث بشی اون کار موفق بشه یا شکست بخوره.از آدمهایی که از تو قوی تر هستن سعی کن یاد بگیری، به هر قیمتی.سعی نکن توی زندگیت یک شخص موفق رو تارگت کنی و بگی که من میخوام شبیه اون بشم،‌ از خودت بخواه که اون شخص موفق رو ببینه و متفاوت از اون باشه. اینطوری دوتا ادم موفق خواهیم داشت که میتونن اسطوره بقیه باشن.سعی کن همیشه تجربیاتت رو با بقیه به اشتراک بذاری و ازشون بخوای که اونا هم همین کارو بکنن. کلی چیز جدید یاد میگیری از بقیه با همین کار.منتظر این نباش که کسی بیاد و چیزی رو بهت یاد بده. خودت با تمام توان شروع کن و آدما خودشون کم کم میان سمتت که چیزایی که بلدی رو ازت یاد بگیرن.همونطور که بقیه میتونن باعث پیشرفت تو بشن، پس تو هم باعث پیشرفت بقیه باش.زندگی همینطوریشم سخته، تو دیگه بیشتر سختش نکن.اتفاقای خوب یهویی رخ نمیدن، یک شبه یا یک ماهه یا یک ساله نمیتونی به کسی برسی که راه چندین ساله رو رفته، پس صبور باش و قدم به قدم جلو برو.ادمای اضافی زندگیت که ارزش افزوده ای برات ندارن رو بذار کنار، این توهین به اونا نیست، بلکه داری به وقت و هدف خودت احترام میذاری.تو اونقدر وقت نداری که همه کارایی که توی ذهنت میگذره رو انجام بدی، ولی اونقدر هم وقت داری که خیلی کارا رو به سرانجام برسونی، پس هر روز پر انرژی به راهت ادامه بده.اگر تا اینجای مطلب رو خوندی که دمت گرم و خوشحالم کردی حسابی. یادت نره که هیچوقت خودت رو با کسی مقایسه نکنی و اونطوری کد بزن که درسته نه اونطوری که بقیه میگن.(حالا بعدا تجربیاتم درباره اینکه چی درسته و چطوری بفهمیمم چی درسته و یا نه هم مطلب مینویسم).نکته آخر:گر خواهی شوی رسوا، همرنگ جماعت شو</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Thu, 28 Jan 2021 22:45:37 +0330</pubDate>
            </item>
                    <item>
                <title>نسخه ۱.۵.۰ پروژه Persian-tools منتشر شد.</title>
                <link>https://virgool.io/@alimaster/%D9%86%D8%B3%D8%AE%D9%87-%DB%B1.%DB%B5.%DB%B0-%D9%BE%D8%B1%D9%88%DA%98%D9%87-Persian-tools-%D9%85%D9%86%D8%AA%D8%B4%D8%B1-%D8%B4%D8%AF.-t1fs13wx0xf3</link>
                <description>persian-tools نسخه ۱.۵.۰ پروژه Persian-tools منتشر شد.قابلیت های جدید:- استخراج شماره موبایل(ها) درون یک متن- اعتبار سنجی شماره موبایل و دریافت اطلاعات اپراتور و شهر از روی شماره موبایل- استخراج شماره کارت(ها) درون یک متن به همراه اعتبارسنجی هریک از شماره کارت های استخراج شده و دریافت نام بانک- غلط‌یابی و تصحیح متن اعداد برای تبدیل آنها به عدددر صورتی که متن ورودی تابع WordsToNumber &quot;دویشت ر بیشت هزار&quot; باشد، تابع اتوماتیک آن را تصحیح می‌کند به &quot;دویست و بیست هزار&quot; و در ادامه آن را تبدیل به &quot;220000&quot; میکند.این قابلیت در حال حاضر ؛بتا؛ می‌باشد.ساز و کار تصحیح رو به این شکل پیاده سازی کردم که با استفاده از الگوریتم Levenshtein distance نزدیک ترین کلمه درست نسبت به هرکدوم از کلمات اشتباه رو پیدا میکنم و اون رو جایگزین کلمه نادرست میکنم.اگر این الگوریتم رو نمی‌شناسید پیشنهاد میکنم جزئیاتش رو توی ویکی پدیا مطالعه کنیدhttps://en.wikipedia.org/wiki/Levenshtein_distanceو در نهایت با افتخار اعلام می‌کنم که Code Coverage پروژه برای +۴۰۰۰ خط کد ۱۰۰٪ شد در این نسخه و تمامی خط های پروژه تست شده اند.*** برای حمایت لطفا در گیت هاب یک Star بدید. ****https://github.com/persian-tools/persian-tools</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Fri, 01 Jan 2021 13:27:28 +0330</pubDate>
            </item>
                    <item>
                <title>سناریو کامل CI&amp;CD با گیت لب و داکر و Traefik و Reactjs</title>
                <link>https://virgool.io/@alimaster/%D8%B3%D9%86%D8%A7%D8%B1%DB%8C%D9%88-%DA%A9%D8%A7%D9%85%D9%84-cicd-%D8%A8%D8%A7-%DA%AF%DB%8C%D8%AA-%D9%84%D8%A8-%D9%88-%D8%AF%D8%A7%DA%A9%D8%B1-%D9%88-traefik-%D9%88-reactjs-iebtcpzlz5ue</link>
                <description>CI &amp; CD with gitlab and docker and traefikتوی این مقاله قصد دارم که شما رو با سناریو هایی در حول محور Continues integration و Continues Deployment &amp; Delivery آشنا کنم و سعی کنیم که این موارد رو با گیت لب روی سرور خودمون پیاده سازی کنیم.برای شروع باید موارد زیر رو آماده داشته باشید:سروری با حداقل ۵۰ گیگ هارد و ۲ گیگ رم و ۱ هسته سی پی یو(پیشنهاد میکنم سیستم عامل رو Ubuntu v18 بگیرید)یک دامنه آماده که روی DNS های Cloudflare ست شدهحداقل دانشی در حوزه Linux و کار با command lineاگر سرور ندارید! و میخواید از روش های Pay as you go استفاده کنید(بدین معنی که هرچقدر منابع مصرف کردید پول بدید) میتونید از زیرساخت های آروان کلاد کمک بگیرید که خیلی قدرتمند عمل کردن(از روی تجربه ای که باهاشون داشتم میگم)هدف نهایی:دیپلوی شدن پروژه Reactjs بر حسب نوع کامیت ها و برنچ ها روی یک ساب دامنه اختصاصی و اجراء تمامی تست ها بعد از کامیت روی هر برنچ. بدین معنی که اگر روی برنچ feature/test کامیت کردین٬ سیستم بیاد اتوماتیک تست ها رو اجراء‌کنه و در صورت pass شدن همه تست ها٬ در انتها بیاد سیستم رو دیپلوی کنه و روی ادرس زیر بالا بیارهhttps://test.feat.domain.irیا مثال های دیگه ای از این قبیل:Branch name: hotfix/testURL: https://test.fix.domain.irBranch name: developURL: https://stg.domain.irBranch name: masterURL: https://prod.domain.irتکنولوژی هایی که میخوایم باهاشون کار کنیم:Docker &amp; docker-compose(Deploy codes in a isolated container)Gitlab CI(Gitlab devops infrastructure)Gitlab runner(A connection between gitlab CI website and our server)Traefik(A DNS manager in order to connect domain to the docker containers)Portainer(for monitoring all docker containers, stacks, volumes, images, networks and etc...)مراحل در پیش رو:ساخت یک پروژه در گیت لبنصب Gitlab runner روی سروراتصال gitlab-runner به ریپازیتوری گیت لبنصب داکر و docker-composeنصب Nodejsنصب Traefik , Portainerنوشتن داکر فایل های بیلد گرفتن از پروژهنوشتن کانفیگ nginx برای سرو کردن کد بلید شده درون داکر روی پورت ۸۰نوشتن pipeline ها اجرایی در فایل gitlab-ci.ymlتنظیم Couldflare روی IP سرور و تنظیمات DNS ساب دامنه هانصب Gitlab runner روی سروربرای اتصال گیت لب به سرور خودمون باید Gitlab-runner رو روی سرور نصب داشته باشید. مراحل نصب:۱. در ابتدا باینری فایلش رو میتونید از اینجا طبق مشخصات سیستم عامل ubuntu خودتون دانلود کنید:# Linux x86-64 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64  # Linux x86 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386  # Linux arm sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm  # Linux arm64 sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm64۲. دسترسی های لازم رو بهش بدیمsudo chmod +x /usr/local/bin/gitlab-runner۳. یک یوزر اختصاصی براش بسازیمsudo useradd --comment &#039;GitLab Runner&#039; --create-home gitlab-runner --shell /bin/bash۳. سرویسش رو اجراء کنیمsudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner 
sudo gitlab-runner startاتصال gitlab-runner به ریپازیتوری گیت لببدین منظور به صفحه اصلی پروژتون برید و به settings &gt; CI / CD settings &gt; Runner  مراجعه کنید.توی این صفحه اگر روی تب Runners کلیک کنید دوتا باکس میبینید به عناوین:Specific runnersShared runnersکه باید روی دکمه Disable shared runners کلیک کنید و غیرفعال کنید این ویژگی رو(خودم به باگی روی همین یه تیکه کوچیک خورده بودم که سه روز از وقتم رو درگیرش بودم تا فهمیدم مشکل shared runner ها هستن که باید غیرفعال می‌شدن).ما از ویژگی Specific runners استفاده خواهیم کرد طبق تصویر زیرSetup a specific gitlab runnerحالا برگردید به سرور خودتون و کامند زیر رو اجراء کنید توی ترمینال:sudo gitlab-runner registerبعد از اجراء کردن دستور بالا٬  ازتون میخواد که آدرس گیت لبتون رو وارد کنید که مقدار زیر رو وارد کنید:Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):https://gitlab.com/Please enter the gitlab-ci token for this runner:در مرحله بعد ازتون توکن میخواد. توکن توی صفحه specific runners هستش که توی عکس بالا من هایلایتش کردم چون برای هر ریپازیتوری فرق میکنه این توکن. مقدارش رو کپی کنید و توی ترمینالتون وارد کنید.Please enter the gitlab-ci description for this runner:توی مرحله بعدی ازتون میخواد که یک توضیحی حتی کوتاه درباره این runner بنویسیدPlease enter the gitlab-ci tags for this runner (comma separated):مرحله بعدش میگه یکسری تگ که با comma جدا شدن برای دسته بندی بنویس که نمیخواد چیزی بنویسید و Enter رو بزنید و برید به مرحله بعد.Please enter the executor: custom, docker-ssh, shell, docker+machine, docker-ssh+machine, docker, parallels, ssh, virtualbox, kubernetes:توی این مرحله میگه میخواین executor این runner چی باشه که پیشنهاد میکنم shell رو بنویسید براش و Enter رو بزنید.تمام. با موفقیت runner شما رجیستر شد و به اکانت گیت لب شما وصل شد.نصب داکر و docker-composeبرای نصب این دو مورد هم مراحل زیر رو طی کنید:۱. بروزرسانی دیتابیس پکیج های نصب شدهsudo apt update۲. نصب پکیج های پیش نیاز apt برای نصب پکیج های روی بستر httpssudo apt install apt-transport-https ca-certificates curl software-properties-common۳. نصب کلید GPG برای docker officialcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -۴. اضافه کردن ریپازیتوری داکر به منابع aptsudo add-apt-repository &amp;quotdeb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable&amp;quot۵. بروز رسانی کردن دیتابیس پکیج های همراه با ریپازیتوری داکر که اضافش کردیمsudo apt updateاطمینال از این که میخوایم داکر رو از روی ریپازیتوری خودش نصب کنیم نه ریپازیتوری پیش فرض اوبونتوapt-cache policy docker-ceنتیجه اجراء کامند بالاdocker-ce:
  Installed: (none)
  Candidate: 18.03.1~ce~3-0~ubuntu
  Version table:
     18.03.1~ce~3-0~ubuntu 500
        500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packagesتا اینجا ما هنوز Docker-ce رو نصب نکردیم بلکه اون رو یه کاندید برای نصب میدونیم۶. در نهایت نصب خود داکرsudo apt install docker-ce۷. بعد از اجراء‌ کامند بالا دستور زیر رو وارد کنید که از صحت سلامت اجراء داکر مطمئن بشید.sudo systemctl status dockerنتیجه دستور بالا باید همچین چیزی باشه:docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago
     Docs: https://docs.docker.com
 Main PID: 10096 (dockerd)
    Tasks: 16
   CGroup: /system.slice/docker.service
           ├─10096 /usr/bin/dockerd -H fd://
           └─10113 docker-containerd --config /var/run/docker/containerd/containerd.tomlنصب Nodejsبرای نصب Nodejs مراحل زیر رو طی کنید۱. بروزرسانی دیتابیس پکیج های نصب شدهsudo apt update۲. نصب Nodejs و npmsudo apt install nodejs npm۳. اطمینان از نصب nodejs و npmnodejs -v
npm -vمابقی مراحل رو هم در پست بعدی براتون کامل شرح میدم.</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Sat, 28 Mar 2020 01:06:57 +0430</pubDate>
            </item>
                    <item>
                <title>نسخه جدید ابزار persian-tools مخصوص فارسی زبانان</title>
                <link>https://virgool.io/@alimaster/persian-tools-eqaxfgz7bynw</link>
                <description>persian-toolsشاید با این ابزار از قبل آشنایی نداشته باشید و باید بگم که این ابزار بهتون کمک میکنه که در زبان جاوااسکریپت بتونید متنی از اعداد رو به فارسی و برعکس تبدیل کنید و یا از روی کد ملی٬ نام شهر و استانش و معتبر بودنش رو دریافت کنید یا همینطور از روی شماره کارت نام بانک و همچنین معتبر بودن اون رو مطلع بشید و چند امکان دیگه که همگی در ابزاری به نام persian-tools منتشر شدن که بخاطر اینکه من رمز OTP اکانت npmjs.org خودم رو گم کردم مجبور شدم ورژن جدید اون رو به اسم     persian-tools2 منتشر کنم.به این ورژن قابلیت های کلیدی ای بهش اضافه نشده اما تغییراتی زیرساختی زیادی رو در خودش شاهد بود به عنوان مثال:اضافه شدن تایپ اسکریپتتغییر در مدل تست های هر کدام از ماژول هااضافه شدن پشتیبانی از مرورگر برای استفاده از این ابزار در آناضافه شدن پشتیبانی کامل از فرمت AMD , UMDاضافه شدن پشتیبانی از فرمت ES برای Tree shaking در وب پک یا rollup و یا همینطور parceljsروش نصبnpm i --save persian-tools2روش استفاده در مرورگر&lt;!-- Load PersianTools.js --&gt; 
&lt;script src=&amp;quothttps://cdn.jsdelivr.net/npm/persian-tools2@latest/dist/index.bowser.js&amp;quot&gt;
 &lt;script type=&amp;quottext/javascript&amp;quot&gt;       
      var convertToFa = PersianTools.digitsEnToFa(1234567); 
 https://github.com/ali-master/persian-tools استار به این پروژه به جهت حمایت رو فراموش نکنید.</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Sat, 08 Feb 2020 11:38:26 +0330</pubDate>
            </item>
                    <item>
                <title>کتابخانه Persian Tools</title>
                <link>https://virgool.io/JavaScript8/persian-toolsjs-oyw89mk47cnr</link>
                <description>تاحالا پیش اومده که بخوام اعداد فارسی رو به انگلیسی تبدیل کنم و باید کلی بگردم!یا مثلا بخوام اعداد رو به حروف تبدیل کنم یا برعکسیا حتی بخوام حروف عربی رو از توی متن فارسی پاک کنم!اما بعد از مدت ها به این نتیجه رسیدم که کتابخونه ای رو برای حل این مجموعه مشکلات بنویسم که نتها مشکلات پر تکرار خودم رو برطرف کرده باشم٬ بلکه مشکلات برنامه نویسای دیگه ای که حتما به مشکلات من زیاد برخوردن هم حل کرده باشم.از این رو کتابخونه PersianTools.js رو که مجموعه ای بدون وابستگی به هیچ کتابخونه دیگه ای برای جاوااسکریپت هستش که برخی از نیازهای حیاتی رو ایفا میکنه رو شروع به نوشتن کردم با این رویکرد که این سری از مشکلات رو برطرف کنه:تبدیل اعداد به حروف و برعکس(مثلا:‌تبدیل ۳۰۰ به سی صد و برعکس).حذف و اضافه کردن کاما به اعداد.تبدیل اعداد فارسی به انگلیسی و عربی و عربی به انگلیسی و فارسی.تایید و اعتبارسنجی کد ملی.دریافت نام استان و شهرستان با کد ملی.تایید و اعتبارسنجی شماره عابر بانک.دریافت نام بانک توسط شماره عابر بانک.تایید و اعتبارسنجی متن فارسی(به عنوان مثال:‌ درصورتی که متن وارد شده فارسی باشد true برمیگرداند)تمیز کردن متن فارسی از حروف عربی و unicode ها.نیاز اولی یکی از پرتکرار ترین نیازهایی بود که توی پروژه های مختلف بهش برخورده بودم.تمامی مثال ها و اطلاعات تکمیلی رو میتونید توی صفحه گیت هاب پروژه مشاهده کنید. https://github.com/ali-master/persian-tools/ در آینده ای نزدیک٬ نسخه Vue.js این کتابخونه هم تکمیل و ارائه خواهد شد.خوشحال میشم پروژه رو با Star دادن حمایت کنید.</description>
                <category>Ali Torki</category>
                <author>Ali Torki</author>
                <pubDate>Mon, 30 Jul 2018 13:42:17 +0430</pubDate>
            </item>
            </channel>
</rss>