<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات برنامه‌نویسی</title>
        <link>https://virgool.io/programming/feed</link>
        <description>تجربیات، خاطرات و چیزای باحال و بی‌حال درباره برنامه‌نویسی</description>
        <language>fa</language>
        <pubDate>2026-06-16 18:25:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/v78nypx3gopa/eikucz.png</url>
            <title>برنامه‌نویسی</title>
            <link>https://virgool.io/programming</link>
        </image>

                    <item>
                <title>تکنولوجیا! چطوری می‌شه از لیست کنسرت‌ها باخبر شد؟</title>
                <link>https://virgool.io/programming/%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%D8%AC%DB%8C%D8%A7-%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D9%85%DB%8C-%D8%B4%D9%87-%D8%A7%D8%B2-%D9%84%DB%8C%D8%B3%D8%AA-%DA%A9%D9%86%D8%B3%D8%B1%D8%AA-%D9%87%D8%A7-%D8%A8%D8%A7%D8%AE%D8%A8%D8%B1-%D8%B4%D8%AF-a24w32hiba5y</link>
                <description>در حال گشت‌و‌گذار توی ایکس بودم که متوجه شدم ظاهرا علیرضا قربانی کنسرتش رو تمدید کرده. کنجکاو شدم که ببینم وضعیت بلیط‌فروشی چطوره. وارد سایت شدم و مطابق انتظار بلیط خاصی باقی نمونده بود. تک و توک صندلی خالی توی ردیف‌های آخر پیدا می‌شد که داشتند یکی یکی تیر خلاص می‌خوردند. برام سوال شد که مردم چطور متوجه بلیط‌فروشی کنسرت‌های معروف می‌شن و انقد سریع همه‌ی بلیط‌ها رو می‌خرند. قاعدتا بیشتر اطلاع‌رسانی‌ها از طریق شبکه‌های اجتماعی خواننده‌ها انجام می‌شه و باید خواننده‌های موردعلاقه‌ت رو دنبال کنی تا بفهمی چه زمانی و کجا کنسرت دارند. منتهی من که اینستاگرام ندارم باید چیکار کنم؟چند وقتی هست که وقت آزاد بیشتری دارم و دنبال ایده‌هایی هستم که بشه تک‌نفره پیاده‌سازی کرد. در نتیجه ایده‌ی ساخت یه راهکاری برای باخبرشدن از کنسرت‌ها به سرم زد. اولین و ساده‌ترین راهی که به ذهنم رسید این بود که سایت‌های فروش بلیط رو هر چند وقت یه بار چک کنم و لیست کنسرت‌های فعال رو به دست بیارم. البته قاعدتا این کار نباید دستی انجام بشه و باید یه ابزاری بسازم که این کار رو به صورت خودکار انجام بده.یادم افتاد که جادی هفته‌ی پیش یه ویدیو در مورد همین ابزار ساخته بود. ابزاری به اسم n8n که بدون زحمت خاصی می‌تونست یه سری کارهای تکراری رو انجام بده و در نهایت یه خروجی بهمون بده. گفتم برم یه سری به ویدیو بزنم ببینم چه خبره. جادی هم مثل من زیاد حال و حوصله‌ی توضیح نداشت. خیلی ساده گفت چنین ابزاری هست و می‌شه باهاش این کارا رو کرد و یه مثال هم زد. روی سرور شخصی خودم که برای دورزدن تحریم‌ها (آره) ازش استفاده می‌کنم، این ابزار رو نصب کردم و یه کم باهاش ور رفتم.خروجی این ور رفتن کوتاه، تصویر زیر شد:عملیات استخراج لیست کنسرت‌ها، همونطور که می‌بینید، شامل چند مرحله بود:الف) دریافت داده‌هاب) پردازش داده‌هاپ) ارسال اطلاعاتدریافت دادهتوی این مرحله باید لیستی از سایت‌های فروش کنسرت رو پیدا کنیم که با یه سرچ ساده پیدا می‌شه.بعد این لیست رو می‌دیم به n8n و می‌گیم که هر چند دقیقه یا هر چند ساعت یک‌بار، متن این سایت‌ها رو دانلود کن.خروجی مرحله‌ی اول چنین چیزی هست:پردازش داده‌هابعد از این که کد HTML سایت مدنظر رو دانلود کردیم، نوبت به پردازش داده‌ها می‌رسه. پردازش داده‌ها شامل سه مرحله هست که البته می‌تونه بیشتر یا کمتر هم باشه.توی مرحله‌ی اول من اومدم و اطلاعات اضافی رو که دانلود کرده بودیم، حذف کردم. مثلا وقتی شما یه سایت فروش بلیط رو باز می‌کنید، به جز لیست کنسرت‌ها، هزار و یک اطلاعات اضافی هم نمایش داده می‌شه که باید اون‌ها رو نادیده بگیرید. من با تگ‌های css فقط متن اون بخش‌هایی از صفحه رو که لازم داشتم، انتخاب کردم.خروجی مرحله اول پردازش چنین چیزیه:از اون کدهای زیاد و شلوغ HTML به چنین متنی رسیدیم که تقریبا لیست کنسرت‌ها رو می‌شه داخلش با یه نظمی دید.توی مرحله‌ی دوم، لازمه متن خام رو تبدیل به یه جدول ساختاریافته بکنیم. به خاطر این که این متن خام خوانا نیست و اطلاعات اضافی زیادی هم توش هست. اینجا نیاز به برنامه‌نویسی هست و چون من به جاوا اسکریپت مسلط نیستم کافیه از هوش مصنوعی کمک بخوام. در نتیجه متن خام رو به ChatGPT دادم و ازش خواستم با یه کد جاوااسکریپت تبدیلش کنه به یه فایل جیسون که تاریخ و عنوان هر کنسرت رو به شکل ساختاریافته بهم بده.خروجی این مرحله هم چنین چیزی شدش که خیلی فوق‌العاده نیست ولی کافیه و داره لیست کنسرت‌ها رو با یه ترتیبی بهم می‌ده.توی مرحله سوم هم باید این لیست رو تبدیل به یه پیام یا گزارش کرد که قابل ارسال باشه. با یه کد جاوااسکریپت ساده ردیف‌های جدول رو به هم چسبوندم و با اینتر جدا کردم تا بشه توی یه پیام ارسالش کرد.به این ترتیب یه پیام آماده داریم که می‌شه ایمیلش کرد یا به تلگرام و اینطور جاها فرستاد یا داخل یه اپلیکیشن نمایشش داد. در نتیجه اطلاعات آماده‌ی ارسال هستند.ارسال اطلاعاتتوی مرحله‌ی آخر هم لازمه که اطلاعاتی که به‌دست اومده رو بفرستیم به جایی که دوست داریم. من تلگرامو دوست دارم به خاطر همین وصلش کردم به تلگرامم تا گزارش رو برام هر روز بفرسته.برای ارسال به تلگرام هم n8n تقریبا همه‌ی کارها رو می‌کنه و فقط کافیه یه ربات تلگرام بسازید و توکنش رو بدید به n8n تا از طریق ربات، گزارش رو براتون ارسال کنه.در نهایت چنین پیامی توی تلگرام ارسال می‌شه که خیلی محتوای به‌دردنخوری هم داره و متوجه می‌شید چرا کنسرت‌های قربانی سریع فروش می‌ره.نکته‌ی پایانیدر حالت عادی من هرگز حال و حوصله‌ی چنین کاری رو نداشتم و اگر هم داشتم، بلد نبودم که انجامش بدم. منتهی با استفاده از n8n، YouTube و ChatGPT زیر دو ساعت هم خود ابزار رو یاد گرفتم و هم تونستم ایده‌ای که داشتم رو اجرا کنم. در گذشته صرفا همین ارسال پیام به تلگرامش می‌تونست دلیل کافی برای شکست‌خوردن پروژه باشه.در نتیجه هوش مصنوعی و نرم‌افزارها حداقل در زمان حال لولو نیستند و برای کمک به انسان‌ها ساخته‌شدن.اینم از کاور پست که جناب لولو بر اساس متن پست تولید کردن:مطلب قبلیمhttps://virgool.io/@khaleghi/1403-iaa7dwihspuo</description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Tue, 03 Jun 2025 19:40:35 +0330</pubDate>
            </item>
                    <item>
                <title>چطور درباره حقوق مذاکره کنیم؟</title>
                <link>https://virgool.io/programming/negotiation-zalazdehhfuo</link>
                <description>مذاکره درباره حقوق یکی از مهم‌ترین بخش‌های فرآیند استخدام هست و نتیجه اون نه تنها از نظر مالی، بلکه از نظر نوع نگاهی که به شما توی شرکت جدید می‌شه تاثیر داره. یعنی ممکنه که شما نیروی بادانش و خوبی باشید، منتهی چون حقوق پایینی دارید به نظراتتون توجه کافی نشه. وقتی عضو یه شرکت بشید، خیلی سخته که نگاهی که نسبت به شما دارند و معمولا از تجربه‌ی اولین برخورد با شما بدست اومده عوض بشه. پس خیلی مهمه که همون اول کار میخ رو محکم بکوبید و چه در زمینه حقوق و چه در زمینه معرفی خودتون، به بهترین شکل عمل کنید. توی این مطلب می‌خوام درباره تکنیک‌هایی که میشه توی مذاکره درباره حقوق استفاده کرد صحبت کنم و ببینیم چطور می‌شه با حقوق خوبی به توافق رسید. مذاکره درباره حقوق، قبل از این‌که برای موقعیت شغلی اقدام کنید، شروع می‌شه!فرض کنید یه باشگاه فوتبال قراره با یه فوتبالیست معروف مثل ام‌باپه قرارداد ببنده. بالای ۹۹ درصد باشگاه‌ها حتی برای جذب ام‌باپه اقدام هم نمی‌کنند، چون می‌دونند این بازیکن با توانایی و شهرتی که داره، دستمزد بسیار بالایی داره و نخونده پیشنهادشون رو رد می‌کنه. همینطور اگه باشگاهی جرات کنه و به ام‌باپه پیشنهاد بده، می‌دونه که باید دستمزد خیلی بالایی رو بهش پیشنهاد بده. به این ترتیب ام‌باپه بدون این‌که حتی پیشنهادی دریافت کرده باشه، درباره حقوقش مذاکره کرده و همه می‌دونند چقدر می‌خواد!این قاعده درباره شما هم صدق می‌کنه. هرچقدر توی حوزه کاری خودتون شناخته‌شده‌تر باشید، دستمزد پیشنهادی به شما بالاتره و رزومه قوی‌تر می‌تونه قبل از هر صحبتی، حقوق شما رو بالا ببره. حالا چطور می‌شه برای خودمون اسمی دست‌وپا کنیم؟ برای بعضی آدم‌ها این اتفاق خیلی شانسی می‌افته ولی اکثر آدم‌ها باید برای این اتفاق برنامه‌ریزی و تلاش داشته باشند. این‌که چطور برند خودمون رو داشته باشیم بحث گسترده‌ایه ولی راه‌های زیادی مثل وبلاگ‌نوشتن، شرکت توی پادکست‌ها، ساخت دوره‌های آموزشی، مشارکت توی پروژه‌های open-source و... داره. فقط یادتون باشه که هر چقدر بهتر توانایی‌های خودتون رو ارائه بدید و مشهورتر باشید، راحت‌تر می‌تونید برای حقوق مذاکره کنید و حتی می‌تونه مهم‌ترین فاکتور توی مذاکره باشه. هستند آدم‌هایی که صرفا به خاطر شهرتشون توی حوزه کاری، حقوق دوبرابری نسبت به عرف می‌گیرند. این‌که چطوری اقدام می‌کنید، مهمه.دومین عامل مهمی که توی روند مذاکره حقوق شما تاثیر می‌ذاره، اینه که چطور برای موقعیت شغلی اقدام کردید. معمولا چطور کار پیدا می‌کنید؟ می‌رید توی سایت کاریابی، سرچ می‌کنید، رزومه‌تون رو می‌فرستید و منتظر می‌مونید؟ ظاهرا بدترین روش برای اقدام به کاریابی هست. چرا که باعث می‌شه شما توی مذاکره دست پایین رو داشته باشید. چرا که شما توی این روش نیازمند شرکت هستید و هر سازی که بزنند باید برقصید. از طرفی شرکت هم مطمئنه که شما علاقه‌مند به کار توی شرکت هستید و می‌تونید با شرایطشون کنار بیاید. اما این تنها راه کاریابی نیست و راه‌های دیگه‌ای برای پیدا کردن موقعیت شغلی هست. یکی دیگه از راه‌های کاریابی، پیدا کردن شغل از طریق یه معرفه. اسمش البته پارتی‌بازی نیست. شما یه نفر رو می‌شناسید که توی شرکت خوبی کار می‌کنه. ازش می‌خواید که شما رو به شرکتشون معرفی کنه تا اگه به شما نیاز داشتند، جذبتون کنند. این روش دو تا خوبی داره. اولا که یه معرف دارید که به شما اعتبار می‌ده و شرکت می‌تونه به واسطه معرف خیالش تا حدودی راحت باشه که سرش کلاه نمی‌ره. دوما که شما مستقیم برای موقعیت شغلی اقدام نکردید و این شما رو نیازمند شرکت نمی‌کنه. چه بسا که بتونید طوری نقش بازی کنید که انگار اصلا نیازی به این شغل ندارید و همینطوری معرفی شدید. راه سوم برای پیدا کردن شغل که ایده‌آل‌ترین راه هست اینه که شما برای موقعیت شغلی اقدام نکنید، بلکه خود کارفرما دنبال شما بیاد. ممکنه بگید بیا برو بابا که تا حدود خوبی حق هم دارید؛ ولی این اتفاق هم شدنیه و هستند افراد زیادی که موقعیت شغلی بهشون پیشنهاد می‌شه. راه‌حلش همونطور که توی بخش قبل گفتم برندسازی و شهرت توی حوزه کاری هست و فعالیت توی شبکه‌های اجتماعی. خوبی این روش این هست که شما کاملا دست بالا رو توی مذاکره دارید و می‌تونید تا حدود خوبی شرکت رو به ساز خودتون برقصونید. شخصی که اولین عدد رو بگه باخته!حالا که درباره مقدمات اقدام برای موقعیت شغلی صحبت کردیم، اجازه بدید درباره جلسه مصاحبه و این‌که چطور عدد مدنظرمون رو بگیم، صحبت کنیم. قانون معمولا اینه که توی جلسه‌ی مصاحبه کسی که عدد اول رو بگه باخته. چطور؟ با یه مثال توضیح می‌دم. مثلا فرض کنید که توی جلسه HR هستید و مدیر HR ازتون حقوق درخواستی رو می‌پرسه. شما می‌گید من عدد سی میلیون تومان ماهانه رو می‌خوام؛ یا زرنگ‌ترید و می‌گید من بین سی تا سی و پنج میلیون می‌خوام. مدیر HR هم می‌گه که به احترام شما، به شما سقف بازه پیشنهادی، یعنی سی و پنج میلیون رو پرداخت می‌کنند. خیلی با خوشحالی قرارداد رو امضا می‌کنید و می‌بازید! ماجرا اینه که معمولا وقتی این سناریو اتفاق می‌افته، بازه‌ای که شرکت به عنوان دستمزد شما درنظر گرفته بوده عدد بالاتری مثلا چهل میلیون بوده و با منت، عدد پایین‌تری رو بهتون پرداخت می‌کنند. اینکه شما عدد اول رو بگید باعث می‌شه که سقف قراردادتون خیلی زود تعیین بشه و دیگه امکان این‌که حقوقتون از عدد پیشنهادی بالاتر بره وجود نداره؛ ولی احتمال این‌که پایین‌تر بیاد خیلی زیاده. ممکنه بگید من زرنگ‌تر از این حرفام و یه عدد خیلی بالا می‌گم که حتی اگه چونه زدند هم ضرر نکنم. متاسفانه توی این شرایط هم به احتمال زیاد می‌بازید. به خاطر این‌که عدد خیلی بالا رو حتی خود شما هم بهش باور ندارید و احتمال ریجکت‌شدنتون زیاده. پس این‌که شرکت اولین عدد رو بگه، بهترین حالته. مگر اینکه شرکت از قصد عدد خیلی پایینی رو به عنوان اولین پیشنهاد بهتون بده. معمولا شرکت‌ها برحسب سابقه و توانایی‌های شما، عددی نزدیک عرف بازار می‌گن و میشه با چونه زدن مقداری بالاترش برد ولی اگه عدد پیشنهادیشون خیلی پایین باشه مشکل به وجود میاد. به خاطر همین اگه درباره شرکت و نحوه مذاکره‌شون اطلاعی ندارید، می‌شه یه عدد رو به عنوان حداقل حقوق مطرح کرد و حول اون چونه زد. البته که اگه شرکت، شرکت مزخرفی باشه و بخواد بیگاری بکشه، معمولا مذاکره بی‌فایده‌س و بهتره کلا استخدامشون نشید. اگه الا و بلا گفتن باید اولین عدد رو ما بگیم چی؟تا حد امکان نگید! اگه توی فرم اقدام برای موقعیت شغلی ازتون عدد خواسته بودند، بنویسید صفر و بگید که بعدا درباره‌ش توضیح می‌دید. توی جلسه مصاحبه هم می‌شه مثلا بگید که بستگی به مزایا داره. یا اینکه من هنوز شناخت کافی درباره موقعیت شغلی و نقشی که قراره داشته باشم، ندارم و نمی‌تونم عدد دقیقی بگم. یا بگید که شما رنجی برای این موقعیت شغلی در نظر گرفتید یا نه؟ اگه گفتند بله، بگید که چون من شناخت دقیقی از کار ندارم، رنج رو بگید تا ببینم با تصوراتم مطابقت داره یا نه. اما اگه شرکت سمج بود و کوتاه نیومد، بهترین راه اینه که یه بازه نسبتا بزرگ رو بگید و دلیل بزرگ بودن بازه رو به مزایا و سطح کار نسبت بدید. ضمن این که عدد پایین بازه باید یه مقداری از چیزی که مدنظرتون هست بالاتر باشه. مثلا اگه شما سی میلیون تومان براتون کافی هست، می‌گید که من بسته به حجم کار و مزایا، حقوقی بین ۳۵ تا ۵۰ میلیون تومان می‌خوام. این‌طوری جای زیادی برای مذاکره باقی گذاشتید و ضمن این‌که حتی اگه از بازه شما پایین‌تر هم بیان، همچنان حول عدد مورد‌علاقه‌تون مذاکره انجام می‌شه. اگه حقوق فعلیمون رو پرسیدن چی؟جواب این سوال اینه که به شما ربطی نداره ولی چون نمی‌شه اینطوری بهشون گفت باید طور دیگه‌ای پیچوند. معمولا حقوق فعلی آدم‌ها، از چیزی که می‌خوان پایین‌تره و این سوال می‌تونه به روند مذاکره جهت بده. پس تا حد امکان سعی کنید جوابش رو بپیچونید. مثلا بگید که به واسطه‌ی قراردادم نمی‌تونم درباره حقوق حرف بزنم. اگه که مجبور بودید درباره حقوق فعلی صحبت کنید هم که سعی کنید تا حد امکان، بازه رو بزرگ و رو به بالا در نظر بگیرید. مثلا می‌گید که در حال حاضر بسته به مزایا و اضافه‌کاری بین بیست تا سی تومان می‌گیرم. وقتی که اونا بهمون عددی رو پیشنهاد دادن چه کنیم؟اگه عددی رو پیشنهاد دادید و طرف مقابل موافقت کرد، دیگه به هیچ‌وجه عدد رو بالا نبرید. چرا که حتی اگه باهاش موافقت کنند، ذهنیت بدی درباره شما ایجاد می‌شه. اما اگه شرکت اولین عدد رو به شما پیشنهاد داد، قضیه فرق می‌کنه. اگه شرکت عدد اول رو پیشنهاد داد، شما باید جوابشون رو با عدد بالاتری بدید و سقف این عدد، به اندازه میزان طمع و جسارت شماست. مثلا اگه شرکت به شما پیشنهاد حقوق سی میلیونی داده، بگید عدد مدنظر من حدود پنجاه تا شصت میلیون هست. اینجا شما دست بالا رو دارید. چون معمولا وقتی مصاحبه به مرحله مذاکره مالی می‌رسه، شرکت‌ها تصمیم جذب شما رو گرفتند و سخته براشون دوباره از اول وارد مرحله مصاحبه با کس دیگه‌ای بشن. پس باید یه کم شجاع و بااعتماد به نفس باشید. اگه عدد پیشنهادی شما نزدیک عدد پیشنهادی شرکت باشه، معمولا نتیجه عکس داره و از موضعشون کوتاه نمیان ولی اگه از سی تومان بپرید روی پنجاه تومان، ممکنه به احتمال زیاد روی عدد چهل به توافق برسید. توصیه‌های نهاییقبل از مذاکره بهتره درباره عرف بازار و همینطور میزان دستمزد‌های شرکت مدنظر مطالعه کنید تا عدد خیلی پرتی رو پیشنهاد نکنید. اگه عددی که پیشنهاد می‌دید معقول باشه و جزئیات ارائه بدید که چرا این عدد رو درخواست کردید، معمولا راحت‌تر پذیرفته می‌شه. توی مذاکره این‌که چقدر پول نیاز دارید مهم نیست. مثلا اگه قسطاتون ده میلیون هست، دلیلی نداره پونزده تومن برای شما کافی باشه، وقتی مهارت شما حتی ممکنه بیست‌وپنج تومان بیارزه. خودتون رو دست کم نگیرید و روی مهارت‌ها و ارزش‌هاتون مانور بدید و به کم راضی نباشید. توی مذاکره تا حد امکان دست بالا رو داشته باشید، ولی طمع‌کار نباشید و مدام با اعداد بازی نکنید. صرفا یک یا دو بار باید عدد پیشنهاد بدید و سعی کنید شبیه یه نیروی حرفه‌ای به نظر برسید تا یه کاسب. پی‌نوشت: قصد دارم اگه وقت و حوصله داشتم، پست‌های این مدلی (درباره مهارت‌های نرم) بیشتر بنویسم. امیدوارم مفید باشه. این مطلب تقریبا ترجمه‌ای بود از بخش ۵۰ کتاب Soft Skills از John Sonmez. توی این مطلب کتاب رو معرفی کردم. مطلب قبلیم https://virgool.io/programming/dart-phr2xkfu7xne </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sun, 04 Feb 2024 01:24:37 +0330</pubDate>
            </item>
                    <item>
                <title>چطور کانتریبیوتر زبان دارت شدم؟</title>
                <link>https://virgool.io/programming/dart-phr2xkfu7xne</link>
                <description>زبان دارت یکی از زبان‌های برنامه‌نویسی نسبتا جدید هست که برای توسعه برنامه‌های وب و موبایل علی‌الخصوص با فریم‌ورک فلاتر کاربرد داره. چند روز پیش توی شرکت نشسته بودم و منتظر بیلد پروژه بودم که یه ایراد املایی موقع بیلد برنامه رفت روی مخم. خلاصه گفتم من که بیکارم بذار یه وری برم شاید درست شد. این شد که رفتم توی گیت‌هاب دارت و ریپازیتوری build رو کلونش کردم. روی سیستم خودم یه سرچی توی فایل‌ها زدم و غلطش رو پیدا کردم و درست کردم. حجم بالای تغییراتبعدش هم کامیت کردم و پوش کردم روی فورکی که از دارت گرفته بودم. در نهایت هم مرج ریکوئست زدم به برنچ مستر دارت. یه فرم لایسنس رو امضا کردم و در کمال ناباوری مرج ریکوئست تایید شد. بعد از حدود یه ساعت اجرای تست‌های اتومات کدم مرج شد و کانتریبیوتر دارت شدم.اینگونه بود که مرزهای برنامه‌نویسی جا‌به‌جا شد و تاریخ دارت به قبل و بعد این کامیت تقسیم شد. نام جاودانه من بر سردر ریپازیتوری بیلد دارتبا بررسی لیست کانتریبیوترهای دارت مشخص شد افتخاری دیگر برای ایران و ایرانی رقم خورده و اولین کانتریبیوتر ایرانی این ریپازیتوری من هستم. (آماده عقد قرارداد با گوگل و سایر کمپانی‌ها)بر طبل شادانه بکوبمطلب قبلیم https://virgool.io/programming/tarafdari-rmriukzijwu7 </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Fri, 03 Nov 2023 18:05:02 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش ساخت اکستنشن کروم ضدسانسور طرفداری</title>
                <link>https://virgool.io/programming/tarafdari-rmriukzijwu7</link>
                <description>یکی از سایت‌هایی که من به صورت روزانه و حتی ساعتی بهش سر می‌زنم سایت طرفداری هست. سایت طرفداری یه سایت ورزشی هست که اخبار و مقالات مرتبط با ورزش‌ها رو منتشر می‌کنه و چون حالت شبکه اجتماعی داره، بخش کامنت‌ها و پست‌های کاربران توش حسابی فعال هست. جذاب‌ترین بخشش هم برای من همین خوندن کامنت‌های کاربرها هست. منتهی یه مشکل وجود داره. وقتی پست یه مقدار حاشیه‌دار باشه، بخش ارسال کامنت مسدود می‌شه و نه می‌شه کامنت گذاشت و نه کامنت‌هایی که قبلا گذاشته شدند رو خوند. مثلا اگه نگاهی به این پست بیندازید می‌بینید که بخش ارسال نظراتش محدود شده و نمی‌شه کامنتی گذاشت. ولی با نصب این افزونه دسترسی خوندن نظرات و ارسال نظر باز می‌شه و می‌تونید به راحتی به علیرضا دبیر فحاشی کنید. از مدت‌ها پیش می‌دونستم چطور می‌شه این محدودیت رو دور زد و هم می‌تونستم وقتی پست مسدود شده کامنت بذارم و هم کامنت‌های بقیه رو بخونم. این آخر هفته از روی بی‌حوصلگی و برای تفریح و تجربه تصمیم گرفتم یه افزونه کروم بسازم و روشی که تا قبل از این به صورت دستی پیاده‌سازی می‌کردم رو در قالب یه اکستنشن کروم پیاده‌سازی کنم. توی این پست می‌خوام این افزونه رو معرفی کنم و بگم چطوری ساختمش.  آموزش نصب متاسفانه برای انتشار افزونه توی کروم وب‌استور نیاز به وریفای اکانت گوگل هست که چون نیاز به کردیت کارد داره و ما توی جزیره‌ی ثبات زندگی می‌کنیم، کنسله. برای همین برای نصب و استفاده از این افزونه باید مراحل زیر رو انجام بدید اگه دوست داشتید:۱. از صفحه گیت‌هابش دانلود و اکسترکتش کنید. ۲. گوگل کروم دسکتاپ رو باز کنید و با انتخاب سه‌نقطه بالاش از قسمت Extensions برید توی بخش Manage Extensions. ۳. با انتخاب سوئیچ بالای صفحه Developer Mode رو فعال کنید. ۴. از بالا سمت چپ دکمه Load unpacked رو انتخاب کنید. ۵.  آدرس پوشه اکستنشن رو که توی بخش اول دانلود کردید رو بهش بدید. ۶. افزونه باید نصب و به لیست افزونه‌ها اضافه شده باشه. توضیحات فنیاین افزونه حقیقتا کار خیلی خاصی نمی‌کنه چون بخش سانسور طرفداری فعلا کار خاصی نمی‌کنه. برای حذف سانسور طرفداری دو تا مرحله وجود داشت:‌ ۱. محدودیت مطالعه پیام‌ها برای این‌که شما نتونید کامنت‌های یه پست رو بخونید، برادرای طرفداری صرفا میان و بخش نظرات رو با کمک css مخفی می‌کنند. افزونه هم برای این‌که شما بتونید کامنت‌های یه پست رو بخونید، میاد و با کمک js بخش نظرات رو نمایش می‌ده. // Find all elements with class name &amp;quotdiscusses&amp;quot
const discussesElements = document.querySelectorAll(&#039;.discusses&#039;);

// Loop through each element and set its style to &amp;quotdisplay: block;&amp;quot
discussesElements.forEach(element =&gt; {
 if (element.style.display === &amp;quotnone&amp;quot) {
 isCensored = true;
 element.style.display = &#039;block&#039;;
 }
});۲. محدودیت ارسال پیامبرای حذف محدودیت ارسال پیام هم یه کلک مقداری رشتی زدم. وقتی پست سانسور می‌شه فرم مربوط به ارسال نظر از صفحه حذف می‌شه. برای این‌که بشه نظر جدید فرستاد رفتم این فرم رو از یه پستی که سانسور نشده کپی کردم و با استفاده از جاوااسکریپت، سر جایی که باید باشه اضافه‌ش کردم. ضمن اینکه برای سابمیت فرم نیاز به آی‌دی پست هم هست که اون رو هم از route صفحه استخراجش کردم. برای مطالعه کد کاملش می‌تونید به گیت‌هاب پروژه سر بزنید.  https://github.com/alikhaleghi76/tarafdari این روش در حال حاضر که کار می‌کنه و با عملکردی که تیم برنامه‌نویسی طرفداری داره بعید می‌دونم به این زودی‌ها هم از کار بیافته. امیدوارم روزی برسه که نیازی به سانسور محتوا و نظرات مردم نباشه و اگه هم اون روز نیومد، حداقل بشه پول ثبت‌نام برای انتشار اکستنشن ضدسانسور رو از طریق کردیت‌کارد پرداخت کرد. مطلب قبلیم https://virgool.io/@khaleghi/ink-kz6f6hneut75 </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Thu, 21 Sep 2023 23:08:31 +0330</pubDate>
            </item>
                    <item>
                <title>چرا کاربران به پلتفرم‌های ایرانی نه می‌گویند؟</title>
                <link>https://virgool.io/programming/cucumber-ntsh40pzcdgl</link>
                <description>به صورت خلاصه بخوام بگم به خاطر اینکه همین سایت ویرگول مثل خیار اطلاعات شما رو می‌ده به کمیته مصادیق محتوای مجرمانه. داستان از چه قرار است؟امروز ۱۴ آبان ۱۴۰۱، گروه هکری آنانیموس سرور ایمیل‌ درگاه خدمات الکترونیک مصادیق محتوای مجرمانه رو هک کردند. اطلاعات و ایمیل‌هایی که لو رفته رو می‌تونید از اینجا دریافت کنید. (توصیه می‌شه نکنید چون ممکنه آلوده باشند - حجم تقریبی ۲-۳ گیگابایت). ظاهراً این سامانه ارسال و دریافت ایمیل دو تا کاربرد اصلی داره. ۱- با استفاده از این ایمیل‌سرور گزارشات مربوط به فیلتر کردن سایت‌ها دریافت میشه. (یعنی مردم زیرآب سایت‌ها رو می‌زنند). ۲- از طرف کمیته مصادیق محتوای مجرمانه با مالکان سایت‌ها و خدمات اینترنتی ارتباط برقرار می‌شه. (یعنی می‌گن آمار فلانی رو بده یا فلان کار رو بکن)از اطلاعات لورفته چی می‌فهمیم؟من خودم به‌شخصه ایمیل‌ها رو دانلود نکردم. بیشتر به علت سرعت افتضاح اینترنت و کمی هم مسائل امنیتی؛ ولی کانال تک توب توی تلگرام چندتا از ایمیل‌ها رو به صورت نمونه منتشر کرده و من هم همونا رو اینجا میارم. اولین نمونه:‌ سایت وزین ویرگولتوی ویرگول همونطور که احتمالاً دیدید و می‌دونید اکانت‌های زیادی هستند که مطالب تند و تیز سیاسی، اجتماعی و... می‌نویسند. خود شخص بنده هم در برخی مواقع که مثل امروز اوضاع کشور نابسامان بوده مطالبی نوشتم. حالا برادران کمیته با محتوای من یا هر کس دیگه‌ای حال نمی‌کنند و درخواست اطلاعات من رو از ویرگول می‌کنن تا به جرم تشویش افکار عمومی، نشر اکاذیب، فساد فی‌الارض و... ترتیب نویسنده رو بدن. ویرگول در جواب می‌فرماید که: با سلام و احترام و تشکر و آرزوی موفقیت، اطلاعات نویسنده را می‌دهد. قاعدتاً اگه موقع ساخت اکانت شماره موبایل وارد شده بود، اون هم در اختیار برادران قرار می‌گرفت. حالا اگه همین نویسنده توی مدیوم محتوا رو منتشر بکنه و رسانه معاند مدیوم با برادران کمیته همکاری نکنه (که نمی‌کنه)، مدیوم فیلتر می‌شه. شاید به همین دلیل باشه که کاربران به پلتفرم‌های ایرانی اعتماد نمی‌کنند. دومین نمونه: سایت Pay.irسایت Pay.ir کارش اینه که به شما یه درگاه پرداخت می‌ده تا از طریق اون جنس بفروشید. مثلاً شما یه دوره آموزشی تولید کردید و می‌خواید اون رو به صد نفر بفروشید. از طریق این سایت شما محصول رو در اختیار مشتری می‌ذارید و پول رو می‌گیرید. خیلی بی‌دردسر و تمیز. از طریق این سایت می‌شه هر چیزی رو فروخت و نقدش کرد. مثلاً آلبوم موسیقی زیرزمینی، حق عضویت و شارژ سایت شرط‌بندی و... برادران کمیته هر انتقال پولی که تشخیص بدند صرف کار غیرمجاز می‌شه رو باید متوقف کنند. پس ایمیل می‌زنند به سایت Pay.ir و دستور می‌دن درگاه فلان محصول متوقف بشه و اطلاعات کسی که درگاه رو ایجاد کرده مثل خیار در اختیار برادران قرار بگیره. به این ترتیب کاربر ایرانی که به هر طریقی محصولش به مذاق آقایون خوش نیاد لو می‌ره. در نتیجه کاربر ایرانی سراغ این روش نمی‌آد و در عوض با ارز دیجیتال معامله می‌کنه. سایت Pay.ir بعد از این‌که یه مدتی به علت خرید و فروش‌های بی‌سروسامان فیلتر شده بود، یه اکانت نظارت مستقیم تقدیم برادران کمیته می‌کنه که دیگه هی لازم نباشه ایمیل بزنند و اطلاعات بگیرند. خودشون برند هر کی رو می‌خوان اطلاعاتش رو به‌دست بیارند. اینم مشخصاتشسومین نمونه: شبکه اجتماعی با هم این شبکه رو نمی‌دونم چه دری‌وری‌ای هست! ولی قاعدتاً این‌طور که از اسمش پیداست یه شبکه اجتماعی هست که توش می‌شه محتوا گذاشت. حالا شما یه محتوایی می‌ذارید و به مذاق برادران خوش نمیاد و در نتیجه مثل خیار لو می‌رید. کاری که واتس‌اپ، تلگرام، فیسبوک، توئیتر، اینستاگرام و... نکردند و فیلتر شدند. چهارمین نمونه: سایت‌های کوتاه‌کننده لینکاگه اشتباه نکنم یکی دو سال پیش احراز هویت برای سایت‌های کوتاه‌کننده لینک اجباری شد. یعنی شما یه لینک دارید که خیلی طولانیه و می‌خواید این لینک رو با یه لینک کوتاه جایگزین کنید. باید برید توی سایت ایرانی و اول شماره موبایلتون رو تایید کنید بعد لینک رو کوتاه کنید. در حالی که سایت خارجی با یه حرکت لینک رو کوتاه می‌کنه. در نتیجه کاربر سمت سایت ایرانی نمی‌اومد و به سایت خارجی می‌رفت. البته سایت‌های خارجی رو فیلتر کردند که کاربر سمت سایت ایرانی بیاد و احراز هویت بشه! احتمالاً هدف از این طرح جلوگیری از حملات فیشینگ بوده ولی عواقب این طرح چی بوده؟ مدیر سایت yun.ir خوب جوابشون رو داده. ۱- کاربر خارجی داریم. اونا رو چیکار کنیم؟ ایمیل خالی رو که قبول نمی‌کنید و شماره تلفن می‌خواید! ۲- پول این اس‌ام‌اسای کوفتی تایید هویت رو که باید بفرستیم رو کی می‌ده؟ ۳ و ۴- اگه ما احراز هویت رو گذاشتیم و یکی گردنش کلفت بود نذاشت و کاربرا رفتند سمت اون تکلیف ما چیه؟ مدیر سایت کوتاه‌کننده لینک کورتو هم بنده خدا گفته که ما این کار رو دلی می‌کردیم و درآمدی هم برامون نداشته. حالا که قراره سنگ بندازید و خرج هم برامون بتراشید، کلاً قیدش رو می‌زنیم و تعطیلش می‌کنیم.بند آخر هم خیلی زیبا حرفش رو زده که با این مسخره‌بازیا قمار و فیشینگ جمع نمی‌شه. راه عملی اگه خواستید ما در خدمتیم. دو تا ایمیل جالب هم دیدم که می‌ذارم. اولین مورد این ایمیله. ظاهراً با بودجه کشوری یه سامانه‌ای ساخته شده برای نظارت بر کانال‌های تلگرامی و قاعدتاً یه تعدادی آدم هم باهاش دارند کار می‌کنند؛ از برنامه‌نویس گرفته تا کاربر عادی. شغل شریف این عزیزان رو از طریق محتوای این ایمیل می‌شه فهمید چیه. می‌شینن توی تلگرام می‌گردن و یه لیست از کانال‌ها تهیه می‌کنند و می‌گن تا چه حدی مجرمانه‌ست. معیار مجرمانه بودن هم از طریق متن ایمیل می‌شه فهمید چیه. این‌که داشتن این لیست به چه دردی می‌خوره رو نمی‌دونم ولی قاعدتاً می‌خوان ادمین بدبخت رو یه طوری شناسایی و کله‌پا کنند. همون کاری که تلگرام برای انجامش باهاشون همکاری نکرد.مورد دوم هم این ایمیله که یه عزیزی به کمیته ایمیل زده و خواهش کرده به سایت time.ir تذکر بدند تا محتوای رکیکی که منتشر کرده رو حذف کنه. همون سایتی که میریم توش می‌بینیم ساعت چنده، امروز چندمه و آفتاب کی غروب می‌کنه هم می‌تونه اقدام علیه امنیت ملی و افکار عمومی بکنه!  آقا مجتبی ناراحته که چرا توی تقویم مناسبت‌هایی مثل روز جهانی مبارزه با خشونت علیه زنان داریم. چرا روز جهانی مبارزه با حکم اعدام توی تقویم وجود داره؟ چرا در تقویم روز حمله به سفارت روسیه مشخص شده؟ چرا جشن سپندارمذگان، روز عشق و روز کریسمس مشخص شدن؟ آقا مجتبی ببخشید.  پی‌نوشت: مطمئناً توی هر شبکه اجتماعی و سایتی امکان تخلف وجود داره و هیچ شکی نیست که نباید اینترنت به حال خودش رها بشه چون آدم‌های بدی توی همه جای جهان وجود دارند. تقریباً همه‌ی شبکه‌های اجتماعی به‌دردبخور هم قوانین و سازوکار مشخصی برای مقابله با کلاهبرداری، ترویج خشونت، نشر اکاذیب، کپی‌رایت، نشر محتوای جنسی، آزار کودکان و... دارند. زمانی که واقعاً جرمی اتفاق افتاده باشه هم همکاری می‌کنند؛ ولی آدم‌فروشی نمی‌کنند که خب نباید هم بکنند!مخالفت با اندیشه‌های سیاسی، فروش آلبوم موسیقی، اطلاع‌رسانی درباره روزهای تقویم و عدم احراز هویت کاربران سایت کوتاه‌کننده لینک در هیچ‌ کشور نرمالی جرم نیست. آدما اگه آزاد باشند، انتخاب‌های درستی می‌کنند.  دفتر ویرگولمطلب قبلیم https://virgool.io/@khaleghi/takahira-qsdg1m6deybv </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sat, 05 Nov 2022 19:40:29 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه طراحی سایت با فلاتر وب</title>
                <link>https://virgool.io/programming/flutter-web-eqi9j3iq4fjo</link>
                <description>چند وقت پیش یه پروژه طراحی سایت گرفتم که صرفا قرار شد یه صفحه با محتوای ثابت باشه. توی این سایت صرفاً قرار بود یه سری خدمات معرفی بشن و امکان تماس گرفتن فراهم بشه. با توجه به اینکه کار کردن با فلاتر برام خیلی راحت‌تر از بقیه فریمورک‌های UI هست و نسخه وب فلاتر هم استیبل شده تصمیم گرفتم این صفحه رو با فلاتر وب (نسخه ۲.۸) بالا بیارم. توی این مطلب می‌خوام تجربه‌م رو در این مورد، یعنی استفاده از فلاتر وب به منظور طراحی سایت، به اشتراک بذارم. #مزایا۱. سرعت پیاده‌سازیبه عنوان یه برنامه‌نویس موبایل، توسعه یه سایت با فریمورکی مثل بوت‌استرپ یا ویو برای من که سابقه کار زیادی باهاشون ندارم اصلاً کار راحتی نیست ولی با فلاتر در عرض یکی دو روز تونستم یه UI نسبتاً پیچیده و شلوغ رو پیاده‌سازی کنم. قبلاً تا حدودی با بوت‌استرپ کار کرده بودم و آشنایی داشتم و به نظرم توسعه با فلاتر خیلی راحت‌تر و سریع‌تر بود. ۲. طراحی ریسپانسیوقبلاً توی شرکت چند صفحه از اپلیکیشن‌هامون رو به منظور استفاده توی سایت ریسپانسیو کرده بودم و به همین خاطر تقریباً می‌دونستم که طراحی یه صفحه که توی همه پلتفرم‌ها ظاهر خوبی داشته باشه چه مراحلی داره. همچنین برای نمایش جدول‌ها و لیست‌ها کتابخونه‌های مختلفی هستند که میشه برای سایزهای مختلف صفحه جدول‌ها رو ریسپانسیو کرد. تا جایی که اطلاع دارم طراحی ریسپانسیو توی صفحات وب کار سختیه ولی با فلاتر هیچ سختی‌ای رو متحمل نشدم. طراحی ریسپانسیو ساده رو هم یکی از مزایای کار با فلاتر می‌دونم. به جز این دو مورد، مزیت خاصی به ذهنم نمی‌رسه که به واسطه انتخاب فلاتر، به کمکم اومده باشه. #معایببه عنوان معایب استفاده از فلاتر وب می‌شه فهرست بلندبالایی رو در حال حاضر لیست کرد. شاید در آینده خیلی از این مشکلات برطرف شده باشه. ۱. زمان لودینگ بسیار بالافلاتر وب بزرگترین ضدحال رو موقع انتشار سایت زد! خلاصه‌ش این که اگه سایت با کیفیت خوب بالا بیاد، دفعه اول حدود ۲۰-۱۰ ثانیه طول می‌کشه تا باز شه. اگه هم کیفیت رو فدای سرعت کنیم باز حدود ۵-۴ ثانیه باید منتظر باشیم تا سایت لود شه. داستان از این قراره که فلاتر توی هر پلتفرمی که اجرا می‌شه، یه موتور پردازنده ریزه میزه بالا میاره و تک‌‌تک پیکسل‌های روی صفحه رو خودش پردازش می‌‌کنه. یعنی ویجت‌هایی که توی فلاتر استفاده میشه هیچکدوم ربطی به ویجت‌های نیتیو اون پلتفرم نداره و چه ساخت و چه نمایشش توسط موتور خود فلاتر انجام می‌شه. حالا این توی روند کار ما چه تاثیری داره؟ وقتی با فلاتر اپلیکیشن می‌سازیم، اپلیکیشن خام سه-چهار مگابایت حجم داره که بیشترش مربوط به همین انجین فلاتره و خب تاثیرش توی کار اینه که کاربر باید سه-چهار مگابایت بیشتر دانلود کنه. اما توی وب این انجین چند مگابایتی دردسرساز میشه. شما وقتی مشغول وب‌گردی هستید، دوست دارید که سایت‌ها خیلی سریع بالا بیان. حالا فرض کنید یه سایت که خیلی هم مشتاق دیدنش نیستید حدود ۲۰ ثانیه طول بکشه تا بالا بیاد. قاعدتاً حوصله‌‌تون سر می‌ره و از خیرش می‌گذرید. لود شدن انجین فلاتر توی وب تقریباً انقد طول می‌کشه!فلاتر دو تا رندرر وب داره: canvas kit و html. اگه با canvas kit خروجی بگیرید زمان لود سایت بسته به سرعت اینترنت و قدرت سیستمتون، بار اول حدود ۲۰-۱۰ ثانیه طول می‌کشه و همه چی همونطوری که دوست دارید نشون داده میشه. اگه با رندرر html که یه چیز سبک‌تره خروجی بگیرید، باز هم لود سایت در دفعه اول حدود ۵-۴ ثانیه طول می‌کشه که زیاد مطلوب نیست. ضمن اینکه عناصر صفحه یه مقداری انگار تار و محوه. خیلی زحمت کشیدم که این زمان کمتر شه، تقریباً نشد! خروجی تقریباً خوبه ولی نه در حد یه صفحه سایت ساده. ۲. سئوی ضعیفتوضیحات این بخش هم به توضیحات بخش قبل وابسته‌ست. چون فلاتر همه چی رو خودش پردازش می‌‌‌‌‌‌‌‌‌‌‌کنه و خروجیش html نیست، مطالبی که توی سایت می‌نویسید در حالت عادی توسط موتورهای جست‌وجو ایندکس نمی‌شن. یعنی کاربر با سرچ توی گوگل و... نمی‌تونه به مطالب شما دست پیدا کنه و صرفاً با کار کردن روی کلیدواژه‌ها و تگ‌های متا میشه امیدوار به سرچ‌شدن سایت بود. برای این مشکل یه راه‌حل مزخرف وجود داره که ارزش نداره برای یه صفحه سایت دنبالش رفت. یه کتابخونه در حال توسعه هست که باید همه متن‌های داخل سایت رو داخل یه ویجت دیگه wrap کرد تا متن‌ها توسط موتورهای جست‌وجو قابل پیدا کردن باشند. ۳. لگ‌زدن صفحهتوی مورد یکِ معایب توضیح دادم که به منظور کم کردن زمان لودینگ مجبور شدم از رندرر html استفاده کنم. به خاطر همین، صفحه یه کم کند شده و لگ می‌زنه. باز هم چون سایت صرفاً یه صفحه ساده‌ست، انتظار می‌ره مثل فرفره بیاد بالا و کار کنه که نمی‌کنه. ۴. تقلا برای رسیدن به حالت نرمال!مواردی که توی توسعه با نیتیو وب و html یه چیز کاملاً عادی هستند، توی فلاتر وب می‌تونند تبدیل به چالش بشن. مثلاً توی ۹۹ درصد سایت‌ها شما به راحتی می‌تونید متن سایت رو کپی کنید و ازش استفاده کنید اما توی فلاتر وب به صورت پیش‌فرض متن‌ها قابل انتخاب کردن نیستند. باید همه عناصر متنی رو داخل یه ویجت دیگه قرار بدید تا بشه متن‌ها رو کپی کرد. هر چند با همین کار هم همچنان عکس‌ها قابل کپی کردن نیستند و انتخاب متن‌ها هم چندان تعریفی نیست. یا اسکرول‌بارها اون چیز دیفالتی که مرورگرها ارائه میدن نیستند و خود فلاتر رندر می‌کنه که ظاهرش متفاوت با چیزیه که کاربر باهاش آشنایی داره. یه مشکل دیگه هم این بود که وقتی از رندرر html استفاده می‌کنی، یه سری مشکلات با زبان فارسی و صفحات راست‌چین داره. مثلا پرانتزها جابه‌جا می‌شن یا نقطه میاد اول متن. جمع‌بندیاینطور که من فهمیدم فلاتر تا این تاریخ یعنی ۵ فروردین ۱۴۰۱ گزینه خوبی برای توسعه وب‌سایت نیست. اگه قراره یه صفحه لندینگ طراحی کنید که طرف قراره بیاد یه دوری بزنه و بره پی کارش، فکر یه گزینه دیگه باشید. اما برعکس، برای توسعه وب‌‌اپلیکیشن فلاتر گزینه جذابیه. مثلاً وب‌اپلیکیشن اسنپ یا دیجیکالا که کاملاً شبیه یه اپلیکیشن روی گوشی باز می‌شن رو میشه خیلی خوب با فلاتر پیاده‌سازی کرد و اون مزیتی که هم خروجی اندروید/iOS و هم خروجی وب میشه ازش گرفت، محشر به پا می‌کنه! مطلب قبلیم https://virgool.io/@khaleghi/best-of-1400-atq1wua0isoe </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Fri, 25 Mar 2022 12:57:49 +0430</pubDate>
            </item>
                    <item>
                <title>داستان یک کلک رشتی؛ چطور زدم آهنگ بعد!</title>
                <link>https://virgool.io/programming/earphone-d6mpe9gzs3ta</link>
                <description>من استاد خراب کردن هندزفری هستم. به خاطر اینکه موقع راه رفتن گوشی رو می‌ذارم توی جیبم و آهنگ گوش می‌دم. در نتیجه فیش هدفون‌های سیمی من همیشه بعد چند وقت خراب می‌شن. این شد که بعد سال‌ها مقاومت بالاخره یه هدفون بی‌سیم خریدم. این هدفون همه چیش قابل‌قبول بود به جز یه موردش. نمی‌شد بدون اینکه گوشی رو از جیب دربیاری آهنگ رو عوض کنی. تمام دفترچه راهنماش رو خوندم و چیزی در این باره نوشته نشده بود. نظراتش رو خوندم و دیدم مردم هم راهی پیشنهاد ندادن. اینترنت رو گشتم و دیدم برنامه جانبی‌ای هم نداره. بعد مقدار زیادی شخم زدن اینترنت کد یه اپلیکیشن رو توی گیت‌هاب پیدا کردم که تقریبا همچین کاری رو برای یه مدل دیگه از هدفون انجام می‌داد، با استفاده از یه کلک رشتی. کلک رشتیش خیلی ساده بود. یه کم توضیح می‌دم. هدفون من که مدلش earphone 2 basic شیائومی هست کلا دو تا عملکرد داره. اگه دو بار بزنی رو گوشی راستش آهنگ متوقف و پخش میشه و اگه دو بار بزنی رو گوشی چپش دستیار صوتی گوگل باز می‌شه. توی گوشی‌های اندروید یه قابلیتی وجود داره به نام اینتنت که با استفاده ازش می‌شه یه برنامه دیگه رو باز کرد. این هدفون هم وقتی دو بار روی دکمه چپش می‌زنی یه اینتنت صدا می‌زنه که دستیار صوتی گوگل باز شه. حالا سازوکار این کلک رشتی به این صورته که میاد و برنامه‌ای که خودمون نوشتیم رو به عنوان برنامه‌ای که می‌تونه اینتنت دستیار صوتی رو دریافت کنه معرفی می‌کنه. در نتیجه وقتی دو بار روی دکمه چپ هندزفری بزنیم، به جای اینکه دستیار صوتی مستقیم باز بشه، گوشی میاد و از ما می‌پرسه که دستیار صوتی رو با کدوم برنامه باز کنم. همونطور که مثلا برای باز کردن یه عکس یا فیلم میشه از برنامه‌های مختلفی استفاده کرد. حالا که تونستیم رویداد دو بار لمس کردن دکمه سمت چپ رو متوجه بشیم و به برنامه خودمون منتقلش کنیم، کار راحت می‌شه. خیلی راحت میایم و هر وقت دکمه لمس شد به جای باز کردن دستیار صوتی، هر کاری که خواستیم می‌کنیم. مثلا عوض کردن آهنگ یا کم و زیاد کردن صدا. اینگونه میشه که یه هدفون خرفت، رام می‌شه! برنامه رو اینجا منتشر کردم که اگه کس دیگه‌ای هم این مشکل رو داشت بتونه ازش استفاده کنه.  https://cafebazaar.ir/app/ali.khaleghi.earphone روی هدفون خودم ۱۰۰٪ و روی مدل Airdots شیائومی هم به احتمال خوبی کار می‌کنه. بقیه هدفون‌ها و مدل‌ها رو نمی‌دونم. کلا جای دکمه دستیار صوتی رو می‌گیره دیگه! سورس‌کد برنامه هم اینجا هست. https://github.com/alikhaleghi76/earphone آیکون‌های استفاده‌شده داخل برنامه رو هم از پکیج آیکون IconaMoon داریوش کش رفتم. مطلب قبلیم https://virgool.io/programming/remote-vx2tw4vfezor </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Wed, 12 Jan 2022 12:04:47 +0330</pubDate>
            </item>
                    <item>
                <title>چطور از کنترل تلویزیون کپی بگیریم؟</title>
                <link>https://virgool.io/programming/remote-vx2tw4vfezor</link>
                <description>یه ضرب‌المثل فنلاندی هست که می‌گه: «گیرم که همه چیز را داخلی کردی، با رویش ناگزیر محدودیت‌ها چه می‌کنی؟»! ماجرا از جایی شروع شد که ما یه تلویزیون دوو خریدیم و هیچ اپلیکیشنی برای کنترل این تلویزیون با تلفن‌همراه وجود نداشت. البته چند موردی وجود داشت که برای تلویزیون‌های دووی قدیمی و کُره‌ای کاربرد داشت؛ نه این جدیدای ایرانی. در نتیجه به سرم زد که خودم یه اپلیکیشن کنترل تلویزیون بسازم. تا حدی روند کار مشخص بود که چیکار باید بکنم. بعضی گوشی‌های جدید بالای سرشون یه فرستنده مادون‌قرمز دارن که نقش همون چراغ بالای سر کنترل تلویزیون رو داره. این چراغ وقتی دکمه‌ای از کنترل رو فشار میدی یه سیگنال مادون‌‌‌‌‌‌‌‌‌‌‌‌قرمز می‌فرسته سمت تلویزیون. تلویزیون هم یه گیرنده‌ی مادون‌قرمز داره که این موج رو می‌گیره و برحسب نوع و مدت زمانی که موج ارسال شده، واکنش مناسب مثل تغییر کانال یا صدا رو انجام می‌ده. کاری که من باید می‌کردم این بود که اول بفهمم این سیگنال‌هایی که کنترل می‌فرسته چه محتوایی داره و چه شکلیه و بعدش چطور میشه این محتوا رو در قالب یه برنامه موبایل به سمت تلویزیون فرستاد. مرحله اول: مطالعهابتدا یه جست‌وجوی مختصر کردم که شاید یه نفر اطلاعات مربوط به سیگنال‌های تلویزیون‌های دوو رو جایی آپلود کرده باشه توی اینترنت که قاعدتاً سایت خود دوو از بیخ تعطیل بود و توی گیت‌هاب و جاهای دیگه هم اطلاعات همه‌جور تلویزیونی بود به جز ایرانی‌ها. بعدش رفتم سراغ اینکه خودم چطور می‌تونم اطلاعات یه ریموت کنترل رو بدون هزینه یا با حداقل هزینه دریافت کنم. توی جست‌وجوها مشخص شد که ظاهراً مفتی نمی‌شه این اطلاعات رو بدست آورد و نیاز به یه سخت‌افزار هست که بتونه اطلاعاتی که کنترل می‌فرسته رو بخونه. در نتیجه یه برد آردوینو و یه پکیج مادون‌‌قرمزش رو سفارش دادم. برد آردوینو به زبان ساده یه کامپیوتر خیلی ریزه‌میزه و ساده‌‌ست که میشه باهاش کارای این مدلی کرد. برد آردوینومرحله دوم: دریافت اطلاعات کنترلدر این مرحله با استفاده از اطلاعاتی که توی اینترنت بود، یه مدار جمع و جور ساختم که بتونم اطلاعات کنترل رو دریافت کنم. این مدار شامل یه گیرنده‌ی مادون‌قرمزه که به برد آردوینو وصل می‌شه و با یه کم برنامه‌‌‌‌‌‌نویسی اطلاعات هر موج مادون‌قرمزی که دریافت بکنه رو نمایش می‌ده. گیرنده مادون‌قرمزبرد آردوینو و مدار گیرنده فرکانس مادون‌قرمزعکس‌های بالا مربوط به مدار ساده‌ای هستند که برای خوندن اطلاعات مادون‌قرمز مورد نیازه. یه چنین کدی هم برای نصب روی برد و نمایش اطلاعات باید پیاده‌سازی بشه: در نهایت خروجی این مدار وقتی یه دکمه تلویزیون فشار داده می‌شه چنین چیزیه: عدد خط اول همون اطلاعاتیه که تلویزیون دریافت می‌کنه و خط دوم هم مشخص می‌کنه این سیگنال از یه کنترل با برند ناشناخته ارسال شده. حالا باید اطلاعات تک‌تک دکمه‌های کنترل تلویزیون رو یادداشت می‌کردم و از طریق برنامه موبایل ارسالشون می‌کردم. بعد از تهیه این جدول خیلی خوشحال و سرخوش رفتم سراغ مرحله بعدی یعنی پیاده‌‌سازی برنامه اندروید. مرحله سوم: پیاده‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌سازی اپ اندروید انتظار نمی‌رفت پیاده‌سازی اپلیکیشن کار زیاد سختی باشه. صرفاً طراحی ظاهر کنترل و پیدا کردن روش ارتباط با فرستنده مادون‌‌‌‌‌قرمز دو بخش انجام این کار بود. مستندات برقراری ارتباط با فرستنده مادون‌قرمز خیلی محدود بود و عملاً با تیکه‌کدهای پراکنده‌ای که پیدا کردم تونستم اولین سیگنال رو ارسال کنم ولی یه مشکل خیلی بزرگ به وجود اومد که نزدیک بود پروژه رو کلاً کنسل کنه. اعدادی که به عنوان اطلاعات ارسالی کنترل به دست آورده بودم هیچ شباهتی به نمونه‌‌‌‌‌‌کدهایی که می‌دیدم نداشتند. توی نمونه‌کدها یه رشته کاراکتر نسبتاً طولانی ارسال می‌‌‌‌‌‌‌‌‌شد که در اصل زمان‌بندی و اندازه موج‌های مادون‌قرمز رو مشخص می‌کرد و اعداد من صرفاً یه عدد چندرقمی بودند که معنی خاصی هم نمی‌تونستم براشون پیدا کنم. بعد از کلی گشتن اینترنت و بالا و پایین کردن کدهای آردوینو تقریباً ناامید شده بودم که با استفاده از این پست تونستم اطلاعاتی که می‌خواستم رو تا حدودی به‌دست بیارم. خروجی این کد چنین چیزی بود که تا حد زیادی شباهت به چیزی که من می‌خواستم داشت: مختصر بخوام توضیح بدم در طی فرآیند ارسال اطلاعات، فرستنده‌ی مادون‌قرمز چندین بار به مدت‌زمان‌های مختلف روشن و خاموش میشه و این اطلاعات می‌گه چند بار چراغ باید روشن و خاموش بشه و هر دفعه به چه مدت. بعد از یه کم تغییر دادن خروجی موفق شدم اولین سیگنال رو با گوشیم به تلویزیون بفرستم و چند باری از شادی جفتک بزنم توی خونه. در ادامه هم یه دستی به سر و روی ظاهر برنامه کشیدم و چنین برنامه‌ای به وجود اومد: برای نصب این برنامه می‌تونید از این لینک استفاده کنید:  https://cafebazaar.ir/app/ali.khaleghi.daewooremote همچنین سورس‌کد برنامه رو هم می‌‌‌‌تونید از اینجا دریافت کنید . https://github.com/alikhaleghi76/daewoo-remote مطلب قبلیم https://virgool.io/programming/%DA%86%D8%B1%D8%A7-%D9%87%D9%85%D9%87-%DA%86%DB%8C-%D9%82%D8%B4%D9%86%DA%AF%D9%87-%D9%88%D9%84%DB%8C-%D9%87%DB%8C%DA%86%DB%8C-%D9%82%D8%B4%D9%86%DA%AF-%D9%86%DB%8C%D8%B3%D8%AA-zslmxqxujlwl </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Thu, 11 Nov 2021 15:59:56 +0330</pubDate>
            </item>
                    <item>
                <title>چرا همه چی قشنگه ولی هیچی قشنگ نیست؟!</title>
                <link>https://virgool.io/programming/%DA%86%D8%B1%D8%A7-%D9%87%D9%85%D9%87-%DA%86%DB%8C-%D9%82%D8%B4%D9%86%DA%AF%D9%87-%D9%88%D9%84%DB%8C-%D9%87%DB%8C%DA%86%DB%8C-%D9%82%D8%B4%D9%86%DA%AF-%D9%86%DB%8C%D8%B3%D8%AA-zslmxqxujlwl</link>
                <description>بررسی اهمیت UI Style Guide در طراحی و اجرای اپلیکیشن‌ها این وسایل رو در نظر بگیرید: یه مبل راحت، یه ساعت اداری، کاشی‌‌‌های سنتی ایرانی و کف‌پوش ماشین؛ هر کدوم از این وسایلی که دیدیم در جای خودشون چیز خوب و به‌دردبخوری هستن ولی وقتی کنار هم قرار بگیرن: خیلی چیز جالبی نمی‌شن!در زمینه نرم‌افزار هم همین داستان صادقه. در زمان قدیم‌‌‌‌‌الایام، همین که برنامه گرافیک داشت و کار می‌کرد، از سر کاربر هم زیاد بود. مثلا این سایت با استانداردهای سال ۲۰۰۰ احتمالاً چیز ردیفی محسوب می‌شده: سایت وزین arngren.netولی الان باید بپذیریم که عجق‌وجقی بیش نیست. طراح‌های محترم بعد از این که یه کم عقلشون رسید، به این نتیجه رسیدن که هر چیزی در جای خودش بهترینه و قرار نیست چون کاشی عهد قاجار قشنگه، با مبل چستر هم ترکیب قشنگی بده. این بود که تِم اختراع شد. ماجرای تم اینه که جناب طراح تلاش می‌کنه تمام عناصری که توی طراحیشون به کار می‌ره با هم سازگاری یا همون هارمونی داشته باشن. مثلاً توی این اتاق در و تخته خیلی قشنگ با هم جور هستن و تم کار یه تم شیک و یک‌دست از آب دراومده. طبیعیه که این اتاق از اتاق قبلی ظاهر بهتری هم داشته باشه و اگه بنا بر انتخاب باشه، این اتاق شانس بیشتری داره که انتخاب بشه. تو زمینه نرم‌افزار هم همینطوره. کم‌کم دست توی کار زیاد شد و چون عقل مردم هم توی چشمشونه، اگه دو تا برنامه کار یکسانی رو انجام می‌دادند و یکیشون ظاهر بهتری داشت، طبیعی بود که کاربرها برنامه‌ی با ظاهر بهتر رو انتخاب کنند. صفحه اول سایت دیوارمثلاً دیوار نسبت به اون سایت عجق‌وجق خیلی ساده‌تر و زیباتره. اما اینجا یه مشکلی پیش میاد. توی کار طراحی و اجرا فقط یک نفر دخیل نیست و هر چیزی که طراحی بشه، لزوماً اجرا نمیشه. در کل دو تا گروه توی این زمینه یعنی طراحی و اجرا کار می‌کنند؛ گروه طراحی و گروه اجرا! جناب طراح که حالا با تم آشنا شده، میاد و یه سری طرح با فرمت استاندارد و رنگ و لعاب مناسب می‌زنه؛ ولی چیزی که تیم اجرا تحویل می‌ده کلاً یه چیز دیگه از آب درمیاد. مثلا این دو تا کیک رو در نظر بگیرید: طرح سمت چپ چیزیه که طراح، طراحی کرده و طرح سمت راست نتیجه اجرای طرحه. این دو تا کیک توی کلیات طراحی شبیه هم هستند؛ ولی چیزی که مشخصه اجرای سمت راست صرفاً یه برداشت آزاد از طرح سمت چپه. توی زمینه نرم‌افزار هم همین داستان صدق می‌کنه. معمولاً برنامه‌نویس‌ها توی پیاده‌سازی طرح، دقت لازم رو در زمینه جزئیات ندارند و درک و بینشی که طراح نسبت به طرح داره رو نمی‌شه از یه برنامه‌نویس انتظار داشت. اونوقته که می‌شه انتظار شنیدن این سوال رو داشت که «چرا همه چی قشنگه ولی هیچی قشنگ نیست؟!». راه‌حل چیه؟ فرقی نمی‌کنه موضوع اجرای دکوراسیون یه اتاق، ساخت یه کیک تولد یا تولید یه نرم‌افزار باشه. اینجا نیاز به یه استاندارد و قرارداد مشترک بین تیم طراحی و تیم اجرا هست تا برای پیاده‌سازی طرح به یه زبان مشترک برسن. مثلا توی طراحی دکوراسیون اتاق، طراح به مسئول خرید و چیدمان اتاق می‌گه که همه چوب‌های دکوراسیون حتما باید از جنس چوب افرا و به رنگ ماهوگانی باشن، سرامیک کف حتماً باید از برند ایزی‌سرام باشه و مدل R89 رو بخره و... . چند تا دستورالعمل این مدلی باعث می‌شه تا چیزی که خریداری و چیده می‌شه دقیقاً مطابق نظر طراح باشه و اتاق به همون شکلی که ایده‌ش داده شده بود، به نظر برسه. در زمینه نرم‌افزار، به این قوانین و استانداردها که باعث می‌شن چیزی که مدنظر طراح هست عیناً پیاده‌سازی بشه، UI Style Guide (راهنمای سَبْک رابط کاربری) می‌گن. به قول امیر تقی‌آبادی: استایل‌گاید مجموعه‌ای از استانداردهای نوشتاری،‌ طراحی، گریدبندی و... است که کمک می‌کند سرعت و انسجام در طراحی بیشتر شود.امیر، اینجا درباره مزایای استایل‌گاید و اهمیتش از دید یه طراح نوشته.  https://virgool.io/UIUXcourse/ui-style-guide-%DA%86%DB%8C%D8%B3%D8%AA-fg4ua1axbvkd من توی این نوشته قصد دارم از نگاه یه برنامه‌‌نویس و مجری طرح اهمیت استایل‌گاید رو بررسی کنم. مزایای داشتن استایل‌گاید برای توسعه‌دهنده‌ها۱. یک‌پارچه‌شدن خروجی‌ توسعه‌دهنده‌‌های مختلف و پیاده‌‌‌‌سازی دقیق طرحما توی شرکت با سه تا بانک مهر ایران، سینا و پارسیان همکاری می‌کنیم و اپلیکیشن همراه‌‌‌بانکشون رو توسعه می‌دیم. پایه اپلیکیشن این سه تا بانک یکی هست و درواقع فقط رنگ و لعاب و بعضی از امکاناتشون با هم فرق می‌کنن. نسخه فعلی اپلیکیشن‌ها از نظر رابط کاربری زیاد قوی نیست و هدفمون توسعه رابط کاربری جدیدی هست. قاعدتاً توی این مقیاس فقط یه برنامه‌نویس روی اپلیکیشن کار نمی‌کنه و چند نفری مشغول توسعه هستیم. همچنین هر بخش از برنامه ممکنه با فریمورک اندروید یا فلاتر توسعه داده شده باشه. پس کل برنامه حتی توی یک بستر نرم‌افزاری هم نیست. حالا فرض کنید هیچ برنامه‌ریزی و نظمی در کار نباشه و هر برنامه‌نویس یه گوشه از کار رو بگیره و شروع به پیاده‌‌سازی رابط کاربری طراحی شده بکنه. مطمئناً نتیجه شلم‌شوربایی بیش نیست! برای جلوگیری از اعمال سلیقه‌های شخصی و تعریف یه استاندارد نرم‌افزاری، تیم طراحی یه چنین سندی به ما میدن: نمونه ساده ui style guideتوی این سند، فهرست تمامی رنگ‌هایی که توی برنامه به کار رفته، فونت‌‌ها، سایز آیکون‌ها، فاصله محتوا از لبه‌های صفحه و... به دقت مشخص شده. البته توی سناریوی ما باید ۶ تا سند تولید بشه. سه تا بانک و برای هر بانک دو تا سند، یکی برای تم روز و یکی هم برای تم شب. پس اولین و مهمترین مزیت UI Style Guide همین یک‌پارچه‌شدن خروجی‌‌های توسعه‌دهنده‌‌های مختلف و پیاده‌‌‌‌سازی دقیق طرحه. ۲. کاهش هزینه تغییرمزیت دیگه‌ای که UI Style Guide به وجود می‌آره، کاهش هزینه تغییره. به عنوان مثال بخشی از خروجی این سند در زمینه رنگ‌ها توی کد نرم‌افزاری چنین چیزی میشه: کاری که می‌کنیم اینه که میایم و به رنگ‌هایی که توی برنامه استفاده شده، بر حسب کارکردشون اسم می‎‎‌دیم. رنگ اصلی، رنگ اصلی تیره، رنگ ثانویه و... . حالا مثلاً هر جا نیازی به استفاده از رنگ اصلی و سازمانی بانک مهر هست، به جای کد رنگی #84BD00 از کلمه colorPrimary استفاده می‌شه. در نتیجه اگه روزی بانک تصمیم بگیره رنگ سازمانیش رو عوض کنه (که همین چند وقت پیش هم کرد) دیگه نیازی به تغییر همه اجزای برنامه نیست و صرفاً با یه تغییر ساده، همه جا رنگ به‌روز می‌‌‌شه. ۳. ایجاد یه زبان مشترک بین برنامه‌نویس، مدیر محصول و طراحمزیت دیگه‌ای که این سند، توی توسعه نرم‌‌افزار به‌‌‌‌‌‌وجود میاره، ایجاد یه زبان مشترک بین برنامه‌نویس، مدیر محصول و طراحه. به این معنی که اگه برفرض من می‌گم بهتره رنگ این دکمه رو از primary به accent تغییر بدیم، هم مدیر محصول و هم طراح دقیقاً منظورم رو متوجه می‌شن و ابهامی به وجود نمی‌آد. انتظارات توسعه‌دهنده‌ها از استایل‌گاید۱. به موقع حاضر باشهشرط اول استفاده از استایل‌گاید، وجود داشتنشه. معمولاً به خاطر این‌که برنامه‌ها خیلی سریع تغییر دارن و سیاست شرکت‌ها تحویل گرفتن خروجی در حداقل زمانه، حق طراح‌ها خورده می‌شه و زمان کافی برای اجرای ایده‌هاشون ندارند. همین باعث می‌شه که تنظیم استایل‌گاید خیلی وقتا نادیده گرفته بشه یا موازی توسعه نرم‌افزار، طراحی انجام بشه. طبیعیه وقتی استایل‌گاید بعد از پیاده‌سازی طرح حاضر بشه و تحویل تیم توسعه داده بشه، یه هزینه مجدد باید صورت بگیره تا پیاده‌سازی‌ها توی چارچوب استایل‌گاید دربیان. نتیجه این حاضر نبودن به موقع می‌شه چنین تسکی: ۲. منطبق با استانداردها باشهیه سری کلمات به صورت قراردادی تعریف شده‌ان و بهتره استایل‌گاید هم طبق همین قرارداد پیاده‌سازی شده باشه. مثلا کلمه colorPrimary همه‌جا به معنی رنگ اصلی و غالب برنامه‌ست. حالا اگه توی استایل‌گاید به جای این کلمه از کلمه main یا green استفاده شده باشه، شاید اون مفهوم رو به خوبی منتقل نکنه؛ هم‌چنین باعث بشه زبان مشترک بین توسعه‌دهنده و طراح از بین بره. ۳. کامل باشه انتظار دیگه‌ای که از استایل‌گاید می‌ره اینه که تمام مواردی که توی طرح هست رو پوشش بده. یا شاید بشه این‌‌‌طور به قضیه نگاه کرد که از طرح انتظار می‌ره توی چارچوب استایل‌گاید باشه. مثلا وقتی ده‌تا رنگ توی استایل‌گاید هست و قرار شده توی طرح صرفاً از این ده‌تا رنگ استفاده بشه، توقع می‌ره رنگ یازدهمی توی طراحی‌ها دیده نشه. چون اضافه کردن رنگ جدید هزینه داره. مخصوصاً اگه مثل محصول ما به ازای هر رنگ قرار باشه ۶ تا کد رنگی تعریف بشه. ۴. تا حد امکان ساده باشهبعضی از استایل‌گایدها به خاطر خلوت‌تر شدن صفحه یا شلوغی ذهن طراح جوری نوشته می‌شن که تفسیرش نیازمند سال‌‌‌‌‌‌‌‌‌‌‌‌‌‌ها تحصیل در حوزه‌ست! انتظار دیگه‌ای که از استایل‌گاید می‌ره اینه که تا حد امکان ساده و واضح باشن که سادگی غایت کمال است. خلاصهاستایل‌گاید زبان مشترک بین توسعه‌دهنده و طراحه و باعث میشه همه‌چی همون‌طوری پیاده‌سازی بشه که طراحی شده. استایل‌گاید چیز خوبیه، بسازیدش!مطلب قبلیم https://virgool.io/@khaleghi/poop-rjnqxyqv0jbr </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Mon, 23 Aug 2021 20:48:11 +0430</pubDate>
            </item>
                    <item>
                <title>کتابخانه DatePicker فارسی فلاتر</title>
                <link>https://virgool.io/programming/%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-datepicker-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-szhll85pbr58</link>
                <description>برای پروژه شرکت نیاز به یه datepicker فارسی داشتیم. توی اینترنت چیزی که به دردمون بخوره و توی سبک مدنظر باشه پیدا نکردیم. به خاطر همین تصمیم گرفتم خودم بنویسمش.یکی دو روز بود مشغول کار کردن بودم. انقد استثنا و شرایط خاص به وجود میاد که مغز آدم به معنی واقعی کلمه سوت می‌کشه. ظهر موقع استراحت گفتم یه سر به شبکه‌های اجتماعی بزنم که این پست رو توی لینکدین دیدم:تا به حال انقدر با یه پست هم‌دردی نکرده بودم!حاصل این هم‌دردی و مغز سوت‌کشیده شد چنین چیزی که مشاهده می‌کنید:این date picker هم تقویم فارسی (جلالی) و هم تقویم میلادی رو پشتیبانی می‌کنه، تماماً با زبان دارت نوشته شده و هم توی نسخه وب و هم اندروید و iOS فلاتر جواب می‌ده. البته date picker مورد نیاز ما یه کم شرایط خاص داشت که اینجا به کار نمیومد و این یه چیز عمومی‌تره. ضمن اینکه طبیعتاً منبع‌باز (open-source) هست و اگه چیزی خواستید بهش اضافه کنید یا بهبودش بدید، در خدمتم.روش راه‌اندازیبرای استفاده ازش، اول باید پروژه رو بهش وابسته کنید؛ به این صورت که داخل فایل pubspec.yaml این کد رو اضافه می‌کنید:dependencies:
  flutter_linear_datepicker: ^1.1.1که نسخه 1.1.1 ممکنه تغییر کنه، موقع استفاده چک کنید آخرین نسخه باشه.بعد با استفاده از یکی از دستورات پایین نصبش کنید:با pub:$ pub getبا Flutter:$ flutter pub getالبته اگه ادیتورتون درست‌درمون باشه، خودش این مرحله رو انجام می‌ده.در مرحله آخر هم پکیج رو داخل کلاس دارتی که می‌خواید استفاده کنید، باید ایمپورت کنید. به این صورت:import &#039;package:flutter_linear_datepicker/flutter_datepicker.dart&#039;;حالا که ایمپورت شد، می‌تونید ازش استفاده کنید.چطور استفاده کنیم؟ استفاده سادهفقط این تیکه کد پایین رو بنویسید. قاعدتا خیلی مناسب نیست و باید شخصی‌سازی بشه بعداً:LinearDatePicker(
  dateChangeListener: (String selectedDate) {
    print(selectedDate);
  },
);استفاده پیشرفتههمه بلاهایی که می‌تونید سرش بیارید، توی این کد پایین مشخصه:LinearDatePicker(
    startDate: &amp;quot2004/10/17&amp;quot, //yyyy/mm/dd
    endDate: &amp;quot2020/02/20&amp;quot,
    initialDate: &amp;quot2010/11/15&amp;quot,
    dateChangeListener: (String selectedDate) {
        print(selectedDate);
    },
    showDay: true, //false -&gt; فقط انتخاب ماه و سال
    fontFamily: &#039;sans&#039;,
    showLabels: true, // متن بالای ستونا نشون داده شه یا نه
    textColor: Colors.black,
    selectedColor: Colors.deepOrange,
    unselectedColor: Colors.blueGrey,
    yearText: &amp;quotسال | year&amp;quot,
    monthText: &amp;quotماه | month&amp;quot,
    dayText: &amp;quotروز | day&amp;quot,
    columnWidth: 100,
    isJalaali: false // false -&gt; میلادی
),صفحه date picker توی سایت pub.dev (با لایک کردن مسرورم فرمایید):  https://pub.dev/packages/flutter_linear_datepicker صفحه گیت‌هاب date picker (با استار فرمودن مسرورم فرمایید):  https://github.com/alikhaleghi76/flutter-datepicker کتابخونه‌های کمکی از کتابخونه MarcinusX/NumberPicker برای انتخاب عددا استفاده شده. (با تغییرات توی کد) از کتابخونه FatulM/shamsi_date هم برای تبدیل تاریخ به شمسی استفاده شده.مطلب قبلیم https://virgool.io/@khaleghi/soldier-qriiryua83ta </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Thu, 19 Nov 2020 15:30:08 +0330</pubDate>
            </item>
                    <item>
                <title>عمو فالت بگیروم؟</title>
                <link>https://virgool.io/programming/faal-zgjjeri3l1ks</link>
                <description>در این روزها یک اپلیکیشن جنگولکِ ساده نوشتم که اگه دوست داشتید می‌تونید نصب و استفاده کنید. بدون هیچ‌گونه دسترسی و رایگان! برنامه تکراری‌ و بسیار خز و خیلی هست، ولی توی هر خونه‌ای لازم میشه. لینک دانلود برنامه فال حافظ https://cafebazaar.ir/app/ali.khaleghi.falutter این برنامه رو بچلونی کلاً سه تا آپشن داره که ایناس: فهرست کامل غزلیات حافظبا قابلیت گرفتن فال و مشاهده تفسیر آنامکان جست‌وجو در اشعارو تنها برتری‌ای که نسبت به رقبا داره صداقتشه! هیچ‌گونه ادعایی مبتنی بر گرفتن فال با اثرانگشت یا قناری نداریم و فال شما صرفاً با یک عدد تصادفی بین ۱ تا ۴۹۵ انتخاب میشه. اما چه چیزی باعث شد که این اپلیکیشن خز و خیل متولد بشه؟ هیچی، صرفاً یه تمرین برای یادگیری فلاتر و زبان دارته. ضمن اینکه کد برنامه برای همه در دسترسه و می‌تونید ببینید و اگه دوست داشتید ویرایشش کنید. قاعدتاً چون یه مبتدی در زمینه فلاتر محسوب می‌شم، معماری یا چیز آموزنده فوق‌العاده‌ای نداره. سورس‌کد پروژه رو از طریق این صفحه گیت‌هاب می‌تونید دریافت کنید.  https://github.com/alikhaleghi76/falutter تابلو فالگیر قزوینی، از خوبای استاد کمال‌الملکمطلب قبلیم  https://virgool.io/MePlusBook/book-kpnld449ies7 </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sun, 12 Jul 2020 13:23:48 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی کتابخانه اندروید RTL Intro Slider</title>
                <link>https://virgool.io/programming/intro-otbrlsinakca</link>
                <description>یه روز خیلی یهویی تصمیم گرفته شد که به همه برنامه‌های شرکت یه صفحه اینترو (خوش‌آمد گویی) اضافه بشه. صفحه اینترو رو احتمالا می‌دونید چیه. اگه نمیدونید چیه که باید عرض کنم اینه: ‌یه صفحه که وقتی برنامه برای بار اول اجرا میشه، نمایش داده میشه و به کاربر یه سری اطلاعاتی رو میده. البته این تصویر بالا یه چیز خفن‌تریه و اینتروی مدنظر ما چیز ساده‌تری بود. شبیه این: این که آیا اصلاً این کار خوبه یا نه، توی چه مواردی کاربرد داره و چطور بهتره پیاده‌سازی شه رو آقای تقی‌آبادی به زیبایی توی این مقاله گفتند.  https://virgool.io/@amirtaqiabadi/%D8%A7%D8%B5%D9%88%D9%84-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-user-onboarding-odq2c7vpapat چون برنامه‌های شرکت به زبان فارسی طراحی شده بودن، نیاز بود که این صفحه اینترو هم به صورت راست چین (RTL) پیاده‌سازی بشه. برای اینکه یه وقت چرخ رو دوباره نسازیم، شروع کردم به سرچ کردن دنبال اینکه آیا کسی از قبل چنین چیزی ساخته یا نه. کتابخونه برای ساخت صفحه اینترو به وفور پیدا میشه، منتهی این ویژگی خاص یعنی RTL بودن چیزی بود که من پیداش نکردم. حالا شاید هم باشه. در نتیجه تصمیم گرفتم که خودم یه کتابخونه بسازم و یه طوری هم بسازم که بشه توی همه پروژه‌ها به آسونی ازش استفاده کرد. حاصل این تصمیم شد ایشون. (لینک کتابخونه) https://github.com/alikhaleghi76/rtl-slider یه کتابخونه اینترو که هم صفحات راست‌چین(RTL) رو پشتیبانی می‌کنه و هم صفحات چپ‌چین (LTR). برای توسعه کتابخونه از زبان کاتلین و لایبرری androidx استفاده کردم. یه کم چون تحویل فوری باید می‌دادم کدش شاید شلوغ پلوغ و غیر بهینه باشه. اگه اصلاحی، چیزی دارید که خوشحال میشم. طرز استفادهتوی فایل build.gradle سطح پروژتون، ریپازیتوری جیت‌پک رو اضافه کنید: allprojects {
		repositories {
			...
			maven { url &#039;https://jitpack.io&#039; }
		}
	}بعد توی فایل build.gradle سطح app، لایبرری رو به دیپندنسی‌ها اضافه کنید: dependencies {
	        implementation &#039;com.github.alikhaleghi76:rtl-slider:1.0.6&#039;
	}حالا کتابخونه به پروژه اضافه شده و می‌تونید ازش استفاده کنید. برای استفاده می‌تونید ویوی اسلایدر رو این شکلی به layoutتون اضافه کنید: &lt;ali.khaleghi.rtlintroslider.RTLIntroSlider
        android:layout_width=&amp;quotmatch_parent&amp;quot
        android:layout_height=&amp;quotmatch_parent&amp;quot
        android:id=&amp;quot@+id/introSlider&amp;quot /&gt;و توی سمت جاوا یا کاتلین با کد زیر بهش صفحه اضافه کنید: RTLIntroSlider introSlider = findViewById(R.id.introSlider);
        
        introSlider.addPage(
                &amp;quotTITLE1&amp;quot,
                &amp;quotDETAIL1&amp;quot,
                ContextCompat.getColor(this, R.color.intro_text_color1),
                ContextCompat.getColor(this, R.color.intro_background_color1),
                R.drawable.icon1
        );
        
        introSlider.addPage(
                &amp;quot&amp;quot,
                &amp;quotDETAIL2&amp;quot,
                ContextCompat.getColor(this, R.color.intro_text_color2),
                ContextCompat.getColor(this, R.color.intro_background_color2),
                -1
        );توی این کتابخونه هم می‌تونید از صفحات پیش‌فرض مثل همین کد بالا استفاده کنید که ظاهر بدی هم نداره و شما فقط بهش عنوان و عکس و این چیزا می‌دید، هم می‌تونید هر فرگمنتی که دوست داشتید، بهش بدید. برای اینکه بتونید از همه امکانات کتابخونه استفاده کنید، می‌تونید این کارارو بکنید. اول توی فایل xml مربوط به layoutتون و بالاترین لایش، یعنی همون لایه root این خط کدو اضافه کنید: xmlns:sliderOptions=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quotبعدش می‌تونید اینطوری ویو رو کاستوم کنید: &lt;ali.khaleghi.rtlintroslider.RTLIntroSlider
        android:layout_width=&amp;quotmatch_parent&amp;quot
        android:layout_height=&amp;quotmatch_parent&amp;quot
        android:id=&amp;quot@+id/introSlider&amp;quot
        sliderOptions:next_text=&amp;quot@string/next&amp;quot
        sliderOptions:skip_text=&amp;quot@string/skip&amp;quot
        sliderOptions:enter_text=&amp;quot@string/enter&amp;quot
        sliderOptions:show_indicator=&amp;quottrue&amp;quot
        sliderOptions:is_rtl=&amp;quottrue&amp;quot
        sliderOptions:active_dot_color=&amp;quot#CCFFFFFF&amp;quot
        sliderOptions:inactive_dot_color=&amp;quot#77FFFFFF&amp;quot
        sliderOptions:separator_color=&amp;quot#88FFFFFF&amp;quot
        sliderOptions:next_color=&amp;quot#FFFFFF&amp;quot
        sliderOptions:skip_color=&amp;quot#FFFFFF&amp;quot /&gt;فک کنم واضحه هر خط چیکار می‌کنه. برای سفارشی کردن از سمت جاوا/کاتلین هم که می‌تونید اینطوری رفتار کنید: // to set custom font
        introSlider.setTypeface(Typeface.createFromAsset(context.getAssets(), &amp;quotfonts/custom_font.ttf&amp;quot));

        // show/hide skip button
        introSlider.setSkipVisibile(true);

        // rtl/ltr slider
        introSlider.setRtl(true);

        // text of next button
        introSlider.setNextText(&amp;quotNEXT&amp;quot);

        // text of skip button
        introSlider.setSkipText(&amp;quotSKIP&amp;quot);
        
        // to add custom slider page
        introSlider.addFragment(new Fragment1());

        // show/hide indicator
        introSlider.setShowIndicator(true);
        
        // to add list of custom pages
        ArrayList&lt;Fragment&gt; fragments = new ArrayList&lt;&gt;(); 
        fragments.add(new Fragment1()); 
        fragments.add(new Fragment2()); 
        introSlider.addFragments(fragments);
        
        // observe skip button click
        introSlider.addOnSkipClickListener(() -&gt; finish());این اولین کتابخونه‌ای بود که توی زندگیم نوشتم. به خاطر همین حس خوبی داره و گفتم به شما هم معرفیش کنم. اگه برنامه‌نویس هستید و یا به هر دلیلی صفحه گیت‌هاب دارید و حال کردید، می‌تونید یه ستاره‌ای چیزی شاباش بدید!لینک کتابخونه روی گیت‌هابپی‌نوشتلعنت به ادیتور ویرگولمطلب قبلیم https://virgool.io/programming/copy-ad6ukw0tlndz </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Mon, 02 Dec 2019 23:20:43 +0330</pubDate>
            </item>
                    <item>
                <title>بعضی وقتا هم کپی‌کردن جواب نیست.</title>
                <link>https://virgool.io/programming/copy-ad6ukw0tlndz</link>
                <description>پیاده‌سازی همزمان پرداخت درون برنامه‌ای گوگل و بازار یه روش فروش خدمات و کالای دیجیتال توی برنامه‌های موبایل، پرداخت درون برنامه‌ایه. به این صورت که شما پول می‌دید و یه چیزی توی برنامه براتون باز میشه. مثلاً یه تعداد سکه یا حذف تبلیغات یا هر چی.فرض کنید یه پروژه اندرویدی داریم و می‌خوایم هم به کاربرای ایرانی چیزی بفروشیم و هم به کاربرای خارجی. چون ایران توی همه‌ی زمینه‌ها باید با همه جای دنیا فرق کنه، مجبوریم که کارای مالی و پرداخت رو به دو شکل پیاده‌سازی کنیم. یکی برای همه دنیا به جز ایران و دو سه تا کشور دیگه، یکی برای ایران. برای همه‌ی دنیا، ما از خدمات پرداخت درون برنامه‌ای گوگل استفاده می‌کنیم و برای ایرانی‌ها یکی از راه‌های عرضه کالای دیجیتال، پرداخت درون برنامه‌ای کافه بازاره. داستان پرداخت درون برنامه‌ای، یه همچین چیزیه: عملکرد پرداخت درون برنامه ایاما موقع کار واقعی، همه چیز انقدم گوگولی نیست. یه کم فنی‌تر اگه بخوایم بررسی کنیم، این ارتباط بین برنامه ما و گوگل‌پلی یا بازار به کمک یه واسط انجام میشه. یعنی ما برای اینکه بتونیم از یه سری خدماتی که داخل اپلیکیشن گوگل‌پلی یا بازار قرار داده شده استفاده کنیم لازمه که یه بنده خدایی رو بذاریم این وسط تا حرف ما رو به گوگل‌پلی یا بازار بفهمونه و بالعکس، به ما بگه این زبون‌بسته داره چی میگه. به این واسط میگن فایل AIDL. این فایل AIDL یه اینترفیسه که با زبان AIDL یا همون Android Interface Definition Language نوشته شده و اسمش روشه دیگه، واسطه! یه چنین چیزی یعنی: نقش فایل AIDLحالا اگه ما بخوایم توی یه برنامه هم از خدمات پرداخت درون برنامه‌ای بازار استفاده کنیم و هم گوگل‌پلی، باید از دو تا AIDL کمک بگیریم. اینجاست که یه مشکل به وجود میاد. کافه‌بازار، زحمت کشیده و همه چیز رو از روی گوگل‌پلی کپی کرده. حتی اسم فایل‌های AIDL و پوشه‌ای که فایل AIDL رو باید توش قرار داد. بنابراین ما اگه بخوایم فایلهای AIDL بازار و گوگل‌پلی رو همزمان داخل برنامه بذاریم، با هم به تداخل می‌خورن و امکان استفاده همزمان از هر دو وجود نداره. اون دو تا AIDL که مثل هم هستن به صورت همزمان قابل استفاده نیستند و همین باعث میشه ما عملاً نتونیم بازار رو در کنار گوگل‌پلی داشته باشیم. اما راه حل چیه؟راه‌حل‌هایی که به ذهن من رسید، شامل این موارد بود: راه حل اول: فایل AIDL بازار رو بذار یه جای دیگه، تا با گوگل‌پلی به مشکل نخوره. نتیجه: باخت!فایل AIDL یه واسط دو طرفس، اگه توی برنامه‌ی شما در جای درستی قرار نگرفته باشه، توی برنامه مقصد شناسایی نمیشه و کاری براتون انجام نمیده. راه حل دوم: اسم یکی از فایل‌های AIDL رو عوض کن. نتیجه: یه برد شانسی و در مجموع باخت!تغییر نام، به همون دلیلی که راه‌حل اول جواب نداد، جواب نمیده. منتهی توی برنامه اندروید ما به دلیلی که خودمم تا چند ساعت قبل نوشتن این مطلب نمی‌دونستم جواب داد که بعداً میگم چی بود داستان. راه حل سوم: جست و جو توی اینترنتنتیجه: باختهیچ کاربر ایرانی‌ای حاضر نشده بود که اگه چاره‌ای برای این مشکل پیدا کرده، اونو منتشر کنه تا بقیه هم استفاده کنن ازش. امیدوارم این مطلب این خلأ رو پر کنه.راه حل چهارم: پرسیدن از خود بازارنتیجه: باختبار اول این مشکل برای یکی از اپلیکیشن‌های اندرویدمون به وجود اومد و من ایمیل زدم و راه‌حل خواستم که این جواب از طرف بازار اومد: مشکل من خیلی شانسی با راه‌حل دوم حل شد و گذشت تا اینکه دوباره این مشکل برای یکی از بازی‌های شرکت و برنامه‌نویس یونیتی به وجود اومد و ایشون هم ایمیل زدند که این جواب از طرف بازار اومد: این کار ممکن نیست.راه حل پنجم: بررسی اینکه چرا اون سری شانسی کار کرد.نتیجه: بردهمونطور که گفتم، من اومدم و اسم فایل AIDL بازار رو عوض کردم و نتیجه هم داد. من هم خیلی باد به غبغب انداخته بودم که این مشکل به چه آسونی حل شد و تا چند ساعت قبل نوشتن این مطلب فکر می‌کردم راهش همینه. اما وقتی این راهو برای یه بازی شرکت و روی یونیتی امتحان کردیم، جواب نداد. بماند که یونیتی با فایل Jar کار می‌کنه و این عوض کردن اسمه هم به همین راحتی نیست. اینجا بود که متوجه شدم یه چی جور در نمیاد این وسط. با دهنی باز رفتم سراغ کد خودم تا ببینم چطور داره کار می‌کنه. اما داستان این کار کردن شانسی چی بود؟ همونطور که بالاتر توی تصویر یه اشاراتی کردم، یه سری فایل کمکی توسط بازار و گوگل‌پلی ارائه شده تا برنامه‌نویس مستقیماً درگیر پیچیدگی‌های AIDL نشه و با کمک این فایل‌ها کارشو راه بندازه. یعنی یه سری فایل دوباره نقش واسط برنامه‌نویس و AIDL رو ایفا می‌کنن. وقتی من اسم فایل AIDL بازار رو عوض کرده بودم، اسمش توی این فایل‌های کمکی عوض نشده بود! یعنی این فایل‌های کمکی همچنان از فایل AIDL با اسم قبلی استفاده می‌کردن و این فایل چیزی نبود جز فایل AIDL گوگل‌پلی!کلاس‌های کمکی بازار من با استفاده از AIDL گوگل‌پلی با بازار ارتباط برقرار می‌کردن و انقدر کپی بازار مو به مو و دقیق انجام شده که هیج مشکلی پیش نمیاد.فایل AIDL بازار از مدار خارج شده!عکس بالا نشون میده که چطور شانسی شانسی اپ کار کرده بود. حالا راه حل چیه؟ همون عوض کردن اسم فایل AIDL؟ نه! راه حل عوض کردن اسمش نیست. پاک کردنشه.فایل AIDL بازار با گوگل‌پلی هیچ فرقی با هم ندارن. یکیشون اگه حذف بشه اون یکی جاشو پر می‌کنه. سر همین خیلی ریلکس میشه یکی رو پاک کرد، بدون این که آب از آب تکون نخوره. خلاصه عرایضم این که اگه توی اپ اندروید قصد دارید همزمان از پرداخت درون برنامه‌ای بازار و گوگل‌پلی استفاده کنید و فایل‌های AIDLشون دچار تداخل میشن یکی رو نادیده بگیرید یعنی کلاً ازش استفاده نکنید (تا زمانی که بازار عیناً از گوگل‌پلی کپی کرده، احتمالاً تا ابد!) و اگه توی یونیتی قصد دارید چنین کاری بکنید، فایل Jar پرداخت درون برنامه‌ای بازار رو باز کنید و سه تا فایلی که مربوط به AIDL هستند رو از توش پاک کنید. BazaarIAB. com/android/vending/billingهمین!مطلب قبلیم برناhttps://virgool.io/@khaleghi/chernobyl-aqocjmxfkjxb </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sat, 30 Nov 2019 22:46:06 +0330</pubDate>
            </item>
                    <item>
                <title>انجیلی برای توسعه‌دهندگان نرم‌افزار - برنامه‌نویس‌ها!</title>
                <link>https://virgool.io/programming/soft-skills-eggvqgmngv0r</link>
                <description>اگه یه کمی با برنامه‌نویسی آشنا باشید و یه سری توی منابع آموزشی زده باشید، متوجه می‌شید که تقریباً همه آموزش‌ها یه روال ثابت و مشخص دارند. از یه جایی و با یه سری مقدمه شروع میشن، وارد آموزش میشن، خیلی جدی یه سری چیزا رو به شما یاد میدن و تمام.بعد اینکه آموزش تموم شد شما رو به حال خودتون ول می‌کنن!من یه سری فیلم آموزشی دیدم، توی یه سری کلاس شرکت کردم و چند تا پروژه کوچولو هم اجرایی کردم. می‌تونم ادعا کنم که یه توسعه دهنده نرم‌افزارم که خیلی خوب و اصولی هم کد میزنه. حالا بعدش چی؟!بسیاری از توسعه‌دهندگان نرم‌افزار مثل سایر آدم‌ها سردرگم میشن. یعنی نمی‌دونن که کجای کار هستن، میخوان چیکار کنن و قراره بعد از این چی بشه. به عبارتی خلأ یه راهنما و دستورالعمل احساس میشه. مگه میشه که یه تلویزیون یا یخچال دفترچه راهنما داشته باشه ولی آدمیزاد، اون هم از نوع برنامه‌نویسش بدون دفترچه راهنما باشه؟!توی فیلم‌ها وقتی یه قهرمان میخواد شکل بگیره یه استاد و راهنما داره که راه و چاه رو بهش نشون میده و ازش الهام می‌گیره. شما هم قراره قهرمان زندگی خودتون باشید، بد نیست یه استاد داشته باشید!چند وقت پیش به صورت خیلی اتفاقی با یه استاد مواجه شدم که با بقیه استادای نرم‌افزاری فرق می‌کرد. به قول خودش بقیه استادا به شما یاد میدن چطور از ابزار برنامه‌نویسی درست استفاده کنید؛ اما من به شما یاد میدم چطور یه توسعه‌دهنده نرم‌افزار خوب باشید.اون استاد ایشونه: کتاب Soft Skills اثر John Z. Sonmez.هدف از نوشتن این کتاب یاد دادن روش‌‌های مختلف توسعه نرم‌افزار یا معماری‌های مختلف و این حرفا نیست. این کتاب دستورالعمل زندگی یه توسعه‌دهنده نرم‌افزاره. با مطالعه این کتاب تقریباً با همه مسائلی که ممکنه برای شما به عنوان یه توسعه‌دهنده نرم‌افزار پیش بیاد آشنا میشید و راه و چاه مسیر رو خیلی دقیق مشخص میکنه.این کتاب به هفت بخش اصلی تقسیم شده. توی بخش اول نکاتی رو در مورد حرفه توسعه نرم‌افزار یاد می‌گیرید. خیلی از توسعه‌دهندگان نرم‌افزار افراد درون‌گرایی هستن. این کتاب به شما یادآوری می‌کنه که ارتباط با بقیه موضوع مهمیه. نکاتی مثل شرکت توی جلسه مصاحبه، نحوه انتخاب شرکت مناسب، نحوه استعفا دادن و مواردی از این دست موضوعاتی هستند که توی این بخش بررسی میشن.بخش دوم درباره بازاریابی و فروش خودمونه!اینکه چطور توی برنامه‌نویسی یه برند شیم و مهارت‌ها و محصولاتمون رو ارائه بدیم؟بخش سوم راجع به آموزشه. یادگیری مداوم و حفظ آموخته‌ها از مهم‌ترین نکات در زمینه توسعه نرم‌افزاره. این بخش به شما یاد میده چطور استاد و روش یادگیری مناسب خودتون رو پیدا کنید، چطور یه استاد بشید و چطور چیزایی که بلدید رو یکپارچه کنید.موضوع چهارمین بخش، خلاقیته.داشتن خلاقیت برای یه توسعه‌دهنده نرم‌افزار خوب، از نون شب واجب‌تره! اما این خلاقیت یه موضوع ذاتی نیست و نیازمند تمرین و نظمه. این بخش به شما تکنیک‌ها و اصولی رو یاد میده تا بتونید توسعه‌دهنده خلاقی باشید. بخش پنجم، بحث شیرین مالی و حساب کتاب!چطور سر حقوق چونه بزنیم؟ چطور پولامونو خرج کنیم؟! با این وضعیت، قراره کی بازنشست بشیم؟بخش ششم موضوع سلامتی رو بررسی می‌کنه. خیلی از توسعه‌دهندگان نرم‌افزار به واسطه کم‌تحرّکی و نشستن‌های طولانی مدت که شغلشون ایجاب می‌کنه دچار مشکلات مختلف مثل ضعف بینایی، مشکلات ستون فقرات و چاقی میشن.توی بخش ششم این کتاب مسائل مربوط به حفظ سلامتی و تناسب اندام که مورد نیاز برنامه‌نویساس مطرح و بررسی میشن.بخش هفتم، سلامت روححفظ روحیه و ایجاد انگیزه هم از اوجب واجبات توی حرفه توسعه نرم‌افزاره. این که چطور مثبت‌اندیش باشیم، در برابر مشکلات بی‌شمار مقاومت کنیم و روحیمونو نبازیم، مثل حفظ سلامت اندام نیازمند بررسی و یادگیریه؛ کاری که آخرین بخش این کتاب برای ما انجام میده.نویسنده این کتاب آقای جان سانمِزه. صاحب وب‌سایت simpleprogrammer.com و یه توسعه‌دهنده نرم‌افزار خفن که آموزش‌های مختلفی در زمینه‌های iOS، اندروید، جاوا، دات‌نت، توسعه بازی و... ارائه داده. پادکستای مختلفی هم درباره مهندسی و توسعه نرم‌افزار ضبط کرده که می‌تونید از طریق همون سایت بهشون دسترسی داشته باشید.کتاب به زبان انگلیسی نوشته شده. ترجمه فارسیش رو تا این لحظه من جایی ندیدم؛ ولی زیاد جای نگرانی نیست. متن انگلیسی کتاب روانه و اگه خیلی هم زبانتون خوب نیست میتونید ازش استفاده کافی رو ببرید.دریافت کتاببرای دریافت این کتاب راه‌های مختلفی وجود داره. اگه وضعتون خوبه و تحریم نیستید و خارج‌نشین هستید، (خوش به حالتون) می‌تونید این کتاب رو از آمازون خریداری کنید.  https://www.amazon.ca/Soft-Skills-software-developers-manual/dp/1617292397 اگه هم مثل من توی ایران متولد شدید و بچه پولدار هم نیستید که اینجا آپلودش کردم. دانلود کنید و حالشو ببرید و 27.43 دلار رو هم بذارید توی جیبتون بمونه (البته اگه کل داراییتون بیشتر از اینه!). حجم فایل زیاد نیست، نزدیک 15 مگابایت. http://s9.picofile.com/file/8350735184/Soft_skills.pdf.html مطلب قبلیم https://virgool.io/@khaleghi/offside-poyg9gcb8den </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sat, 02 Feb 2019 10:53:15 +0330</pubDate>
            </item>
                    <item>
                <title>دلخوشی کوچولوی یه جوجه برنامه نویس!</title>
                <link>https://virgool.io/programming/database-dzzptsxtem1j</link>
                <description>یه آدم بی نظم و شلخته که توی انبار خونشون کارای عجیب و غریبی انجام می‌ده و اختراعات بامزه و خفن می‌کنه. بعید میدونم کسی با این مدل آدما حال نکنه. یه چی تو مایه های ریک سانچز سریال ریک اند مورتی یا نقش مارک وال‌برگ توی تبدیل شوندگان 2014. از این تیپ آدما!منم هیچ وقت بدم نمیومد یه همچین آدمی باشم. ولی فک کنم واضحه که این مدلی بودن یه کم تخیلیه و توی واقعیت کمتر کسی میتونه این تیپی باشه.وقتی شما برنامه‌نویس هستید، یعنی دو تا دنیا دارید. یه دنیای واقعی با هفت هشت میلیارد جمعیت و یه دنیای دو نفره، بین خودتون و کامپیوتر. دنیای واقعی دنیای بی‌رحمیه. توی دنیای واقعی شاید هیچ وقت به آرزوهاتون نرسید و هزار و یک چیز وجود داشته باشه که حال شما رو خراب کنه؛ ولی توی دنیای برنامه‌نویسی همه چی عوض میشه. توی دنیای برنامه‌نویسی شما می‌تونید یه انباری پر از آت و آشغال داشته باشید که به هم وصلشون کنید و یه کار بامزه انجام بدید. توی دنیای برنامه‌نویسی لازم نیست چند ماه پس‌انداز کنید تا یه پراید بخرید، لازمه یه کم فکر کنید تا یه پراید بسازید! برنامه‌نویس می‌تونه رویاهاش رو واقعی کنه، البته توی دنیای برنامه‌نویسی.هفته پیش یکی از نیروهای شرکتمون کنار گذاشته شد. ایشون وظیفه کارای دیتابیسی و امور داده رو برعهده داشت. پروژه جدیدی که داریم روش کار می‌کنیم یه پروژه چند زبانس و باید تمامی متن هایی که داخل برنامه ها استفاده میشن داخل یه جدول و با زبان‌های مختلف ثبت بشن. هر بخشی از برنامه که کامل می‌شد، متن های به کار رفته توی اون بخش رو در اختیار مسئول دیتابیس میذاشتم تا وارد دیتابیس کنه. اطلاعاتی که من بهشون می‌دادم یه چنین شکلی داشت:متنای سبز رنگ سمت چپ کلید متن هستن و متنای سفید سمت راست مقدار متن. مسئول دیتابیس باید دونه دونه این کلیدها و مقادیر رو کپی می‌کرد و همراه یه سری اطلاعات اضافی داخل دیتابیس می‌ذاشت. یه همچین چیزی:اگه قرار بود ردیفی به این جدول اضافه بشه باید اول کلیدها و مقادیرشون از یه جا دیگه کپی می‌شد و وارد جدول می‌شد بعد همه اون اطلاعات تکراری که توی جدول هست، دوباره کپی می‌شد و توی ردیف بعد قرار می‌گرفت. یه کار مسخره، تکراری و حوصله سر بر. بعد از این که مسئول دیتابیس از شرکت رفت، مسئولیت وارد کردن این اطلاعات به جدول، افتاد گردن خودمون. بعد اضافه کردن سه چهار ردیف دیدم هیچ جوره حوصلم نمیکشه و هدف از خلقت من چیز دیگه ایه! قبل از اینکه به این نتیجه برسم که خدا مُرده یاد انباری و وسایل داخلش افتادم. تبدیل چارتا متن به جدول توی دنیای واقعی شاید کار زمان‌بری باشه ولی برای کامپیوتر سه سوته. دویدم تو انباری و دو سه تا خرت و پرت رو با میخ و چکش به هم وصل کردم که حاصلش شد این وسیله:وسیله ای نه چندان زیبا و هول هولکی!یه ماشین ساختم که بهش اون متنو میدادم و خودش بهم یه ردیف جدول میداد. یه چی تو این مایه ها:خروجی این ماشین تحویل دیتابیس داده میشه و یه ردیف به جدول اضافه میشه :) یعنی یه کار دو ساعته توی ده دقیقه انجام شد و بعد از این هم حالا حالاها با این ماشین کار دارم. این ماشین برای من یه دلخوشی کوچولو و یه اتفاق بامزه بود. انقد بامزه که ذوق داشتم به بقیه هم نشونش بدم.پی‌نوشت‌ها1- مثل اینکه دیتابیسا انقد کله گنده هستن که خودشون بتونن از این کارا انجام بدن، به من چه!2- این ماشین فقط چار تا چرخ داره، دوستان برنامه نویس گیر ندید حالا :)) http://vrgl.ir/A00ue </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Sun, 19 Aug 2018 23:01:51 +0430</pubDate>
            </item>
                    <item>
                <title>دور زدن تحریم‌های نرم افزاری در سه سوت!</title>
                <link>https://virgool.io/programming/boycott-hhlwia78a4it</link>
                <description>برنامه‌نویس ها و افرادی که تو زمینه نرم افزاری کار می‌کنند، به جز فیلترهای داخلی درگیر تحریم‌های خارجی هم هستند! شرکتهای نرم‌افزاری مختلف مثل گوگل و اوراکل مدت‌هاست که ایران رو تحریم کردن و به شکلای مختلفی اجازه دسترسی کاربران ایرانی رو به سایت‌ها و خدماتشون نمیدن.سه روز بود که درگیر نصب اندروید استودیو روی یکی از سیستم های شرکت بودم و هزار و یک روش مختلف رو برای نصب پکیج‌های نرم‌افزاری و کتابخونه‌های لازم امتحان کردم. هیچ کدوم از روش‌های دور زدن و vpnهایی که امتحان کردم جوابگو نبود و گوگل به این راحتیا به کاربران ایرانی سرویس نمی‌داد. تا اینکه توی یه سایت ایرانی نظر یکی از کاربرا توجهم رو به خودش جلب کرد. یه سرویس رایگان ایرانی معرفی کرده بود که امکان دور زدن تحریم‌ها رو به راحتی آب خوردن به وجود می‌آورد. شکن اسمیه که برای این سرویس انتخاب کردن!وقتی وارد سایت میشید با یه چنین صفحه‌ای مواجه میشید. راه حل این سایت خیلی سادس:برای استفاده از شکن در هر شبکه‌ای، کافیه DNS رو روی این IP ها تنظیم کنید178.22.122.100  و  185.51.200.2حالا این جمله یعنی چی؟!توی سیستم عامل‌های مختلف تنظیم کردن DNS روش‌های مختلفی داره. توی این متن من ویندوز رو یاد میدم و بقیش دیگه بر عهده بزرگواران که بگردن و پیدا کنن.به‌ روز رسانی - آقای مهدی ابوالفضلی لطف کردن و این آموزش رو برای لینوکس و توزیع اوبونتو هم آماده کردن که اگه لینوکسی هستید میتونید ادامه آموزشو از اینجا دنبال کنید!توی ویندوز اول باید وارد کنترل پنل بشید و به بخش Network and sharing center برید.بعد از گزینه های سمت چپ، change adapter settings رو انتخاب کنید.توی صفحه‌ای که باز میشه شبکه‌ای که باهاش به اینترنت وصلید رو انتخاب کنید.وقتی گزینه فعال رو انتخاب کنید یه همچین پنجره ای باز میشه:گزینه Properties رو انتخاب کنید تا صفحه پایین باز شه، بعد روی گزینه Internet Protocol Version 4 (TCP/IPv4) دابل کلیک کنید:با انتخاب این گزینه، پنجره پایین باز میشه:روی Use the following DNS server addresses کلیک کنید تا فعال شه، آدرس DNSی که از شکن دریافت کردید رو وارد کنید و روی ok کلیک کنید.تموم شد! حالا با خیال راحت می‌تونید از امکانات نرم‌افزاری که به واسطه تحریم از دسترس شما خارج شده بود، استفاده کنید :)پی‌نوشتبه امید روزی که نه تحریمی باشه و نه فیلتری و نه تحریم شکنی و نه فیلترشکنی!کار خوب بچه های شکن دیروز کمک بزرگی به من کرد و حسابی حالم خوب شد، وقتی بعد از سه روز معطلی بالاخره کارم راه افتاد. گفتم این حال خوب را با شما هم تقسیم کنم :) http://vrgl.ir/KE0Zt </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Mon, 09 Jul 2018 11:32:29 +0430</pubDate>
            </item>
                    <item>
                <title>کاربرد کامپوننت ها در داشتن یک زندگی باحال (زندگی کامپوننتی)</title>
                <link>https://virgool.io/programming/component-m6ptrjcuudgk</link>
                <description>اول از همه بگم که کامپوننت چیه. کلمه کامپوننت رو کمابیش اینور اونور شنیده بودم تا اینکه تو درس مهندسی نرم افزار با مفهومی به نام برنامه نویسی بر  قطعه (component based programming) آشنا شدم. این مفهوم به طور مختصر و تقریبی میگه که شما به جای اینکه هر دفعه بیاید چرخو اختراع کنید، یه بار چرخو بسازید و هر جا لازم بود ازش استفاده کنید. یعنی به جای اینکه بیاید و خط به خط کدنویسی کنید، یه سری قطعه (کامپوننت) از کدها آماده کنید و مثل پازل کنار هم قرار بدید. چند روز هست که این مفهوم به شدت روی مخمه و توی جای جای زندگی دارم احساسش میکنم. مثلا یه ماشین رو در نظر بگیرید. متشکل از چند قطعه مستقل از هم مثل موتور، بدنه و... میشه که کنار هم چیده میشن و کارو راه میندازن. (اینکه اینجا کار یعنی ماشین یا همون کار رو خودمم نمیدونم!)جالبه که این نگرش محدود به وسایل نمیشه و شامل کارها هم میشه. مثلا رانندگی رو در نظر بگیرید. عملکرد شما موقع رسیدن به دست انداز یه کامپوننته، موقع ترافیک یه کامپوننت دیگه، موقع رانندگی تو اتوبان یه کامپوننت دیگه و... هر کامپوننتم شامل یه سری دستورات و پیش فرض ها میشه و قدرت شما توی اون مستقل از بقیس؛ یعنی ممکنه کامپوننت برخورد با دست انداز شما ضعیف باشه و کامپوننت اتوبان شما قدرتمند. چون این دو مستقل از همن و هر کدوم با تمرینات جداگانه تقویت میشن.بعضی از کامپوننتای یه فوتبالیستحالا این نگرش چه تاثیری روی زندگی داره و اصلا به چه دردی میخوره؟ جواب سادس، نظم.وقتی به زندگی نگاه کامپوننتی داشته باشید میتونید: خودتونو بهتر بشناسیداین نگرش باعث میشه آدم بتونه تعریف دقیقی از کاری که داره انجام میده ارائه بده. مثلا عملی مثل غذا خوردن شامل چند بخش میشه. نوع نشستن، نوع استفاده از وسایل، سرعت غذا خوردن، میزان توجه به اطراف و... شما میتونید با این نگرش این عملو بخش بندی کنید و بفهمید که تو هر بخش چه وضعیت و رفتاری دارید و این بخشهای مختلفو اگه ضعیفن تقویت کنید. مثلا میفهمید که ضعف شما موقع غذا خوردن مربوط به نشستن میشه و باید این قطعه از عملیات رو روش کار کنید و اگه لازمه کدش رو بازنویسی کنید تا با بقیه قطعات همخونی داشته باشه.در برخورد با وقایع خونسرد باشیدنگاه کامپوننتی شما رو از شر چندکاره بودن خلاص میکنه. حتما میدونید که مغز انسان در لحظه فقط میتونه روی یک کار تمرکز کنه و به یه چیز فکر کنه. مثال میزنم؛ در حال رانندگی هستید، گوشیتون زنگ میخوره، یه ماشین داره ازتون سبقت میگیره، رو به رو یه چاله هست، بچه روی صندلی عقب داره گریه میکنه و پلیس یه کم جلوتر برگ جریمه به دست وایستاده. اگه قبلا به این موارد فکر نکرده باشید و نوع برخوردتون با هر کدوم از این مسائل رو تعیین و تقویت نکرده باشید، به معنی واقعی کلمه بیچاره میشید! مغز هرگز نمیتونه همه این مسائل رو در زمان محدودی که برای تصمیم گیری دارید حل کنه. توی نگاه کامپوننتی، رانندگی شما شامل یه سری قطعس که مستقل از همن و البته با هم تعامل دارن. اگه شما همه قطعاتی که فعل رانندگی لازم داره رو روی خودتون نصب کرده باشید و تمامی قطعاتتون توی وضعیت خوبی باشن رانندگی شما بسیار ساده و بدون مشکل میشه و حتی ده تا مسئله دیگه هم به مسائل قبلی اضافه شه اتوماتیک و بدون فکر همه رو حل میکنید. یعنی با تمرین کامپوننتهای مختلف رانندگی رو یاد گرفتید و روی خودتون نصب کردید و حالا خیلی ساده ازشون استفاده میکنید.رفتار بقیه رو پیش بینی کنیدبا نگاه کامپوننتی میتونید رفتار بقیه انسانها رو پیش بینی کنید. آدما وقتی به یه حدی از رشد و بلوغ میرسن معمولا کامپوننتاشون ثابت میشن. شما میتونید خیلی راحت کامپوننتهاشونو بشناسید و محک بزنید و مثل یه هکر هر جا راه نفوذی پیدا کردید ازش استفاده کنید!مثلا مربی های فوتبال مهارتهای بازیکن ها رو به چند بخش تقسیم میکنن و عملکرد هر بازیکن رو توی هر بخش میدونن؛ میدونن که باگ مهدی رحمتی توی کامپوننت خروج از دروازشه و از این طریق بهش آسیب میزنن، میدونن کامپوننت دایو مهدی طارمی خیلی قویه و دست بهش بزنی یه پنالتی برات هزینه داره. شما هم میتونید کامپوننتای آدمای اطرافتونو شناسایی کنید و ازشون استفاده کنید. از کامپوننتا بازم استفاده کنیدتوی جهان واقعی تعداد کامپوننتای ضروری خیلی بیشتر از جهان برنامه نویسیه، برای همین شاید استفاده مجدد از قطعات یه کم سخت باشه ولی ممکنه. مثلا یه کامپوننت بیکاری برای خودتون میسازید که شامل رفتاریه که شما رو در بیکاری های چند ساعتی سرگرم میکنه. حالا هر وقت که بیکار شدید این کامپوننت فعال میشه و شما رو خودکار هل میده سمت مطالعه، ورزش، بازی یا هر چیز باحال دیگه ای.  یا مثلا یه کامپوننت دزدی طراحی کنید و از شاطر کوچه ما تا مسئول عالی رتبه مملکت، به هر مقامی که رسیدید، دزدی کنید.در مجموع میخوام عرض کنم که جهان ما، چه مادی و چه غیرمادی از یه سری کامپوننت تشکیل شده که هر کدوم از یه سری کامپوننت دیگه تشکیل شدن و الی آخر. این نوع نگرش به رفتار و نوع زندگی میتونه نظم خوبی به رفتار بده، برنامه ریزی رو برای آینده راحت تر کنه و تکلیف شما رو با خودتون و نقاط ضعفتون روشن کنه.پی نوشت هااولا که سال نوی همگی مبارک.دوما که خیلی متن علمی ای نبود، دوستان کامپیوتری منو اعدام نکنن :)) چون ذات کامپوننتو خیلی جاها بردم زیر سوالمطلب قبلی منو هم بخونید، اگه دوست داشتید: http://vrgl.ir/mCYPJ </description>
                <category>برنامه‌نویسی</category>
                <author>عـ.ـلـ.ـی خـ.ـالـ.قـ.ـی</author>
                <pubDate>Fri, 23 Mar 2018 02:15:04 +0430</pubDate>
            </item>
            </channel>
</rss>