<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر مومنیان</title>
        <link>https://virgool.io/feed/@nainemom</link>
        <description>امیر مومنیان هستم، یک برنامه‌نویس ترک تحصیل کرده و علاقه‌مند به طراحی و آهنگ‌سازی و نویسندگی.</description>
        <language>fa</language>
        <pubDate>2026-06-16 20:11:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/9762/avatar/TtpErx.png?height=120&amp;width=120</url>
            <title>امیر مومنیان</title>
            <link>https://virgool.io/@nainemom</link>
        </image>

                    <item>
                <title>خواب</title>
                <link>https://virgool.io/@nainemom/%D8%AE%D9%88%D8%A7%D8%A8-jpet90dyidck</link>
                <description>حس کردم یکی داره صدام می‌کنه. بلند شدم دیدم یه مرد حدود پنجاه ساله بالای سرم ایستاده و نگران به نظر می‌رسه. انقدر خوابم عمیق بود که اصلا توجهی بهش نکردم و دوباره سرم رو گذاشتم روی میز. من خیلی آدم خوش‌خوابی هستم و نمی‌خواستم ادامه اون خواب شیرینم رو از دست بدم. دوباره و این بار بلندتر صدام زد و خواب از سرم پرید. «آقا حالتون خوبه؟». سرم داشت سوت می‌کشید و انقدر منگ بودم که متوجه موقعیتم نشده بودم. من توی یه کتاب‌خونه بودم. به اطراف نگاه کردم و دیدم چند نفری که اونجا بودن همه داشتن به من نگاه می‌کردن و منتظر بودن من یه چیزی بگم. من هیچ کدوم از آدم‌های اونجا رو نمی‌شناختم و حتی یادم نبود که من کی وارد اونجا شده بودم. این خیلی من رو اذیت می‌کرد که بقیه بهم توجه کنن، واسه همین کوله‌ای که کنار دستم بود و حدس زدم باید برای من باشه رو برداشتم و بدون اینکه چیزی بگم از اونجا خارج شدم.از ساختمون کتاب‌خونه خارج شدم و رفتم به سمت خیابون. هوا گرگ و میش بود. هنوز هضم نکرده بودم که دقیقا چه اتفاقی داره می‌افته و همچنان محیط برام ناآشنا بود. به تابلوی خیابون نگاه کردم ولی اون هم واسم آشنا نبود. حتی اسمش تا حالا به گوشم نخورده بود. شک کردم که شاید هنوز خواب باشم، ولی همه چیز خیلی عجیب واقعی بود. آخرین صحنه‌ای که خیلی واضح از قبل از این توی ذهنم بود لحظه‌ای بود که من و مریم توی یه خونه بودیم. یه خونه شکیل با دیوار‌های خوش‌رنگ. مریم روی یه صندلی چرمی نشسته بود و من بالای سرش داشتم با لبخند نگاهش می‌کردم. خیلی خونه تمیزی بود و همه جزئیاتش جلوی چشمم بود، ولی هرچی فکر کردم نفهمیدم اونجا کجا بود و ما کی رفته بودیم اونجا. من و مریم همیشه با هم بودیم. اینکه الان پیشم نبود هم برام عجیب بود. دوباره به کوله‌پشتی توی دستم نگاه کردم و یادم اومد که کوله‌پشتی مریم همین شکلی بود. اون کیف دست من چیکار می‌کرد و مریم خودش کجا بود؟ زیپ کیف رو باز کردم به امید اینکه چیز بیشتری بفهمم و دیدم توش پر از وسایل سفره. سرم رو بلند کردم و دیدم از سر خیابون دو تا مامور پلیس دارن به سمت من میان.به نظر می‌رسید که دارن به من نگاه می‌کنن. خیلی ترسیده بودم. زیپ کیف رو بستم و شروع کردم به راه رفتن. ناخودآگاه و از روی غریزه سعی داشتم ازشون دور شم، ولی احساس می‌کردم که اونها هم پشت سرم میان. همیشه از پلیس می‌ترسیدم، واسه همین سرعتم رو بیشتر کردم و قلبم داشت سریع می‌زد. وقتی به آخر خیابون رسیدم، برگشتم دیدم اونا شروع کردن به دویدن به سمتم. خیلی هول شدم. به پایین خیابون نگاه کردم و با سرعت تمام شروع کردم به فرار. انقدر سریع می‌دویدم که حتی نمی‌شد سرم رو برگردونم و ببینم چقدر باهام فاصله دارن. اونها چرا داشتن دنبال من می‌اومدن؟ اصلا نمی‌دوستم و تا ده دقیقه فقط داشتم می‌دویدم و متوجه هیچ چیز نبودم. چند تا خیابون رو که رد کردم، چشمم به یه کوچه فرعی افتاد که زیاد توی دید نبود. سریع رفتم توی اون کوچه و خودم رو زیر یکی از ماشین‌ها قایم کردم. از اون زیر داشتم خیابون رو می‌پاییدم که ببینم اون دو تا پلیس نیان توی کوچه. لرزش کل بدنم رو حس می‌کردم. برای چند دقیقه به خیابون خیره شده بودم و وقتی مطمئن شدم که اونها من رو گم کردن یه نفس راحت کشیدم و از زیر ماشین اومدم بیرون و به پشت ماشین تکیه دادم. دوباره کوله رو نگاه کردم و به فکر مریم افتادم. من باید می‌فهمیدم. باید می‌فهمیدم قضیه چیه. جیب‌های کیف رو زیر رو رو کردم و دیدم توی یکی از جیب‌ها یه موبایل بود. سریع قفلش رو باز کردم و عکس خودم و مریم رو روی صفحه‌ش دیدم. همیشه از این جنگولک‌بازی‌های مریم بدم می‌اومد. همینطور صفحه‌های گوشی رو بالاپایین می‌کردم که چشمم به آخرین تماس‌ها افتاد. واردش شدم و دیدم ده تا شماره آخر، همه شماره پلیس بود. خیلی عجیب بود. مریم اون پلیس‌ها رو فرستاده بود دنبال من؟باید مریم رو پیدا می‌کردم و راجع به این اتفاقای عجیب ازش سوال می‌پرسیدم. لعنتی انقدر سرم سنگین بود که نمی‌تونستم تمرکز کنم. با خودم گفتم برم اول یه چیزی بخورم تا حواسم سر جاش بیاد. یکم جلوتر یه مغازه دیدم و رفتم داخلش. از همون اول، مغازه دار با تعجب نگاهم می‌کرد. بعد از اینکه یکم مغازه رو ورانداز کردم، یه دوهزار تومنی گذاشتم روی میز یارو و بهش گفتم که یه نون با یه نخ سیگار بده. هنوز داشت با تعجب نگاهم می‌کرد. «یه نون و یه سیگار بده»! این‌بار سریع از جاش بلند شد و رفت از اون پشت یه نون تازه که انگار برای خودش بود با یه پاکت سیگار آورد و گذاشت روی شیشه. ازش پرسیدم قیافه من عجیبه؟ چرا اینطوری نگام می‌کنی؟ خیلی ترسیده بود. نمی‌دونستم از چی ترسیده. حوصله نداشتم با طرف دعوا کنم. نون و سیگار رو برداشتم و از مغازه زدم بیرون. کمی پایین‌تر از اون مغازه یه میدون بود. رفتم اونجا و روی زمینش نشستم و شروع کردم به خوردن نون. انگار چند روز بود که چیزی نخورده بودم. خوردن اون نون خیلی واسم لذت‌بخش بود. حالا وقتش بود که به اتفاقایی که واسم افتاده فکر کنم. پاکت سیگار رو باز کردم یه نخ از توش درآوردم و گوشه لبم گذاشتم. کبریت؟ لعنتی، باز یادم رفت. سیگار رو از گوشه لبم برداشتم و پرت کردم اون‌ور. انگار همه چیز دست به دست هم داده بود که من نتونم تمرکز کنم. روی زمین دراز کشیدم، به آسمون خیره شدم و دوباره اون صحنه خونه‌ای که با مریم توش بودیم رو توی ذهنم مرور کردم.با خارش دست راستم از خواب بیدار شدم. خیلی می‌سوخت. سعی کردم چشمام رو بخارونم که انگار دستم به یه چیزی بسته شده بود. سرم رو بالا آوردم و دیدم دست‌هام به دست‌های یه سرباز با دست‌بند زده وصله. خیلی عجیب بود! ما توی یه سالن نشسته بودیم. به سرباز نگاه کردم و ازش پرسیدم «من چرا اینجام»؟ سرباز که به نظر می‌رسید حوصله جواب دادن به من رو نداره، گفت ساکت! تا چند دقیقه دیگه می‌ریم تو! کجا می‌ریم؟ روبه‌روم چند نفر دیگه نشسته بودن و انگار همشون منتظر چیزی بودن. تیپ و قیافه‌شون شبیه به دزدا بود، اما این سرباز فقط حواسش به من بود. همه‌شون داشتن به من نگاه می‌کردن. روبه‌رومون یه اتاق بود که انگار قرار بود بریم اون تو. در اتاق که باز شد، یه مرد هیکلی که روی تمام بازوهاش جای خالکوبی بود با یه سرباز دیگه از اون تو اومد بیرون و به سمت پایین پله‌ها رفتن. سرباز کناریم، دستم رو کشید و گفت بریم تو! داخل اتاق یه مرد مسن با اخم‌های تو هم رفته پشت میز نشسته بود و روبه‌روش یه صندلی بود که من باید روی اون می‌شستم. سرباز دست من رو کشید و برد داخل اون اتاق و در رو پشت سرش بست. تا وقتی که روی صندلی بشینم اون مرد هیچ نگاهی به من نکرد. مشغول یادداشت کردن یه چیزی بود. «خب تعریف کن دو روز پیش کجا بودی؟». این رو در حالی گفت که هنوز سرش رو بالا نگرفته بود. ازش پرسیدم مریم کجاست؟ سرش رو بالا گرفت و با اخم یه نگاه توی چشم‌هام انداخت. «مثل اینکه حرف حساب حالیت نیست! جواب سوال من رو بده!». نمی‌دونستم چه جوابی باید بدم. می‌خواستم ازش بپرسم اونجا کجاست که گفت: «خفه‌شو! اگه الان جواب درست ندی مستقیم می‌فرستیمت زندان! حالا خوب دقت کن ببین چی می‌گم. تو دو روز پیش کجا بودی؟!».اونجا اداره پلیس بود. من حتی نمی‌دونستم که توی کدوم شهرم، چجوری جواب سوال اون رو باید می‌دادم؟ توجهم به گوشی مریم که روی میز اون بود، جلب شده بود. اون گوشی اونجا چی‌کار می‌کرد؟ لالمونی گرفتی؟ می‌گم جواب سوال من رو بده! یهو یه اتفاق مثل صحنه یه فیلم اومد توی ذهنم. با مریم توی یه اتاق بودیم. مریم روی یه صندلی معمولی نشسته بود و داشت من رو نگاه می‌کرد. خیلی خوب جزئیات اون صحنه رو یادمه، ولی تاریخش رو نمی‌دونستم. من داشتم می‌خندیدم و واسه مریم شعر می‌خوندم، اما اون خیلی قیافه‌اش مضطرب بود. یادم اومد که داشتم تلاش می‌کردم تا قانعش کنم هیچ اتفاقی برامون نمی‌افته. «حواست با منه؟ اگه الان تکلیفت روشن نشه می‌فرستیمت زندان!». به خودم اومدم و دیدم اون پلیس گوشی مریم رو تو دستش به سمت من گرفته. من هنوز تمرکز نداشتم و نمی‌فهمیدم چه اتفاقی داره می‌افته. ازم پرسید تو دو روز پیش به مقتول پیام داده بودی که وسایلش رو جمع کنه. کجا می‌خواستید برید؟ هنوز نمی‌دونستم گوشی مریم دست اون چی‌کار می‌کرد. هیچ‌چیز از قبل یادم نمی‌اومد. حتی نمی‌دونستم به چه جرمی... مقتول؟ اون الان گفت مقتول! مقتول؟ چی داری واسه خودت می‌گی؟ مریم کجاست؟هنوز صحبتم رو تموم نکرده بودم که اون سرباز با آرنجش محکم زد به گردنم و از شدت درد گردنم کج شد. اما هنوز کوتاه نیومدم. من باید می‌فهمیدم قضیه چیه. اون مرتیکه همین الان به مریم گفت مقتول. یعنی مریم کشته شده؟ حتما خود اون پلیس‌های کثیف مریم رو کشته بودن. مریم کشته شده بود. مریم کشته شده بود؟ انقدر آشفته شده بودم که دیگه هیچ چیز واسم مهم نبود. از سر جام بلند شدم و به سمت اون پلیس عوضی حمله کردم که این بار یه سوزش خیلی شدید رو توی پهلوم حس کردم و همون‌جا افتادم روی زمین. بالای سرم اون سرباز با من کشیده شد و کنار من افتاد. توی دست اون سرباز یه شوکر بود. بدنم هیچ حسی نداشت و حتی نتونستم خودم رو از زیر اون سرباز نجات بدم. با آخرین توانی داشتم مریم رو صدام کردم، ولی انقدر دردم زیاد بود که هیچ صدایی از گلوم خارج نشد. کم کم چشم‌هام داشت سیاه می‌شد. دیگه هیچ‌چیز نفهمیدم و از هوش رفتم.به هوش اومدم و دیدم توی یه اتاق تاریک که درش بسته بود روی زمین دراز کشیدم. شبیه به بازداشتگاه بود. فکر مریم داشت آزارم می‌داد. بلند شدم و از پنجره اون در آهنی بیرون رو نگاه کردم. همه جا ساکت بود. به ساعت بیرون از اون اتاق نگاه کردم و متوجه شدم ساعت پنج صبحه. بلاخره داشتم احساس آرامش می‌کردم. برگشتم روی زمین، به دیوار کناری اون اتاق تکیه دادم و به این اتفاقات فکر کردم. من چیکار کرده بودم؟ یهو یاد خوابی که داشتم می‌دیدم افتادم. خواب دیدم که با مریم دوتایی توی یه خونه قدیمی بودیم. اون خونه خیلی کثیف و بدشکل بود. تمام جزئیاتش رو یادمه. مریم روی یه صندلی چوبی و شکسته نشسته بود و دست‌هاش و دهنش با یه پارچه کثیف بسته شده بود و توی دست من یه چاقوی بزرگ بود. همیشه عادت داشتم از این خواب‌های عجیب ببینم. جلوتر رفتم و مریم داشت تقلا می‌کرد که یکی نجاتش بده. اما من داشتم با لبخند بهش نگاه می‌کردم. اون نمی‌فهمید که کل زندگی پوچه. می‌خواستم این رو بفهمه. چاقو رو بلند کردم نزدیک صورتش بردم. با تمام قوا سعی می‌کرد داد بزنه و من از این موضوع لذت می‌بردم. اون خواب خیلی صحنه‌های عجیبی داشت. نمی‌دونم چرا انقدر دقیق صحنه‌های خواب رو یادم مونده. من همیشه عادت داشتم از این خواب‌های عجیب ببینم. من همیشه عادت داشتم از این خواب‌های عجیب ببینم؟</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sat, 13 Apr 2019 16:39:35 +0430</pubDate>
            </item>
                    <item>
                <title>بی‌آرتی</title>
                <link>https://virgool.io/@nainemom/brt-o9dwvaiqtmex</link>
                <description> اتوبوس بی‌آرتیتوی بی‌آرتی روی صندلی منتظر نشسته بودم. همه صندلی‌های دیگه پر شده بودن و دیگه کم‌کم موقع رفتن اتوبوس بود. اونجا ایستگاه اول خط بود و بیرون اتوبوس هم یه صف نسبتا کوتاهی از مردم که منتظر اومدن اتوبوس بعدی بودن شکل گرفته بود. همون لحظه یه پیرمرد عصاش رو به در زد و بلند گفت یا الله. معمولا کسایی که عجله دارن حاضر به سرپا وایستادن توی اتوبوس سرصبح اون خط می‌شن، اما پیرمرد که به سختی از پله بالا اومده بود، به نظر نمی‌رسید که مقصدش جلسه نشست با مدیران بانک‌های مهم کشور درباره تصمیم‌گیری درباره بیت‌کوئین باشه.طبق رسم نانوشته بخش مردونه مترو و اتوبوس، وقتی جا برای نشستن یه پیرمرد نیست، معمولا جوون‌ها مسابقه هر کی زودتر بلند بشه برندست رو برگزار می‌کنن و برنده این مسابقه که جای خودش رو به پیرمرد داده، معمولا با تبسمی حاکی از رضایت روبه‌روی پیرمرد وای‌میسته و با نگاهی گیرا به سمت واگن بانوان خیره می‌شه. اما امروز انگار مسابقه کنسل شده بود. جوون‌ها یا گرم صحبت بودن یا سرشون توی گوشی خودشون یا گوشی کناریشون بود. انگار همه تصمیم گرفته بودن که پیرمرد رو نبینن. من شب قبل درست نخوابیده بودم و واقعا دلم نمی‌خواست از جام بلند شم، اما از اون‌جایی که از اول ورود پیرمرد به اتوبوس کاملا توجه‌م جلب اون شده بود، داشت با لبخندی حاصل از درماندگی به من نگاه می‌کرد. توی اون شرایط دوست داشتم کمی پیرتر بودم تا از انجام این مسابقه تک‌نفره معاف می‌شدم، اما اون‌جا جای درستی برای فکر کردن به این تخیلات نبود. نگاه خیره پیرمرد به من داشت کار رو برای من سخت می‌کرد.اون‌جا تازه ایستگاه اول بود و اتوبوس‌ها هر شش هفت دقیقه یک‌بار معمولا حرکت می‌کنن. چرا پیرمرد نباید دو دقیقه بیرون توی صف منتظر می‌موند تا اتوبوس بعدی بیاد؟ تازه متوجه دلیل بی‌توجهی بقیه شده بودم. اما انگار نماینده همه اون‌ها من بودم و وظیفه من بود که این موضوع رو به پیرمرد حالی کنم. مدام داشتم با خودم مکالمه احتمالی رو با پیرمرد مرور میکردم. یکی از بهترین شروع‌ها، این بود که با لبخند بگم: «حاجی اتوبوس بعدی الان میاد، بهتره بیرون وایستین تا اتوبوس بعدی بیاد.» اما نه؛ این حرف خلاف ادب است. دنبال کلمات مناسب‌تری بودم که همون لحظه پیرمرد با چهره‌ای آزرده رو به من گفت: «جوون‌ها هم جوون‌های زمان قدیم». قبل از اینکه به خودم بیام، متوجه نگاه باقی مردم که انگار تازه توجهشون جلب شده بود شدم. نگاه با افسوس پیرمرد از سمت صورت من به سمت باسن من و سپس زمین می‌اومد و من مثل کسی که وسط جلسه خاستگاری گوزیده باشه به نظر میرسیدم. همه داشتن با نگاهشون من رو سرزنش می‌کردن. چطور جرئت کردی همچین کاری کنی پسره‌ی بی‌ادب؟ این جامعه ما داره به کجا می‌ره؟ چرا این جوون‌ها انقدر گستاخ شدن؟ مگه یه صندلی چه ارزشی داره؟ همون لحظه یکی از جوون‌ها سریع از جاش بلند شد به پیرمرد گفت: «پدر جان شما بفرمایید» و پیرمرد در حالی که نگاه‌های «خاک بر سرت کنن» تحویل من و نگاه‌های «آفرین پسر خوب» به اون جوون تحویل می‌داد، روی صندلی نشست. اتوبوس همون لحظه حرکت کرد.داشتم با خودم فکر می‌کردم کاش خودم جام رو به پیرمرد داده بودم، ولی دیگه دیر شده بود. دوست داشتم شرایط رو عوض کنم. تنها چیزی که به ذهنم رسید این بود که از جام بلند بشم از اون جوون خواهش کنم حالا که این لطف رو به پیرمرد کرده، من هم جام رو بهش بدم تا ثواب حاصل رو تقسیم بر دو کنیم. حتی برای اینکه مطمئن بشم درخواستم رو قبول می‌کنه، حاضر بودم باقی‌مانده اعشاری این تقسیم رو به اون بدم. اتوبوس همون لحظه‌ای که از جام بلند شده بودم و داشتم این مکالمه رو با جوون مورد نظر انجام می‌دادم، به ایستگاه دوم خودش رسید و راننده درها رو باز کرد. جوون یه نگاه سرتا پا به من انداخت و در جواب گفت: «من همین‌جا پیاده می‌شم» و من مات و مبهوت لطف اون نسبت به پیرمرد شدم. آه که چه کار سختی انجام داده بود. همش یه ایستگاه بود سفرش؟ چرا؟ اصلا گور پدر این چیزها. اصلا دیگه واسم مهم نبود بقیه چه فکری می‌کنن راجع بهم. قبل از اینکه مسافران ایستگاه دوم وارد اتوبوس بشن برگشتم که بشینم سر جام، اما دیدم یه پسربچه حداکثر دوازده ساله که احتمالا از زیر پاهام یا از توی شیشه اتوبوس وارد شده بود، جای من نشسته بود. وقتی نگاهش کردم، جوری خودش رو به خواب زده بود که انگار چند ساعته که همونجا نشسته و خوابیده. با خودم گفتم اشکالی نداره. ولی داشت. نمی‌تونستم با خودم کنار بیام. با اون وضع باید تا ایستگاه آخر که مقصدم بود سرپا می‌بودم و کج نگاه‌کردن مردم رو تحمل می‌کردم. خیلی دوست داشتم بدترین فحش‌هایی که بلد بودم رو تحویل پسربچه و پیرمرد و اون جوون می‌دادم. اما بنظر نمی‌رسید وضع تغییری کنه. تازه ممکن بود علاوه بر خودخواه‌ترین فرد اتوبوس، تبدیل به گستاخ‌ترین آدم توی اتوبوس هم بشم. بخاطر همین برای به جا آوردن حداقل توهین موأدبانه‌ای که می‌شد در فضای عمومی کرد، پشتم رو کردم به پیرمرد و همون‌جا روبه‌روی پسربچه از میله اتوبوس آویزون شدم. هنوز چند ثانیه از حرکت اتوبوس نگذشته بود که دیدم دستی به پشتم خورد. برگشتم دیدم همون پیرمرد در حالی که داره جمع‌تر می‌شینه، بهم گفت: «ناراحت نباش ببم‌جان، بیا پیش خودم بشین.»</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sat, 16 Mar 2019 14:32:44 +0330</pubDate>
            </item>
                    <item>
                <title>دون‌پایه</title>
                <link>https://virgool.io/@nainemom/doon-paye-wmgj4jfecbev</link>
                <description>ترمینالزمان یک هفته‌ای سعید تموم شده بود و روز برگزاری دادگاه سر رسیده بود. سرآبادانی با یه وکیل گرون‌قیمت توی دادگاه حاضر شده بود و با خودش حساب همه‌چیز رو کرده بود. مطمئن بود سعید حتما محکوم می‌شه. سعید روی صندلی مخصوص متهم نشسته بود و داشت به حرف‌های قاضی گوش می‌داد. قاضی بعد از اینکه یه دور از روی اتهامات سعید خوند، همه رو ساکت کرد و رو به سعید پرسید دفاعی از خودت داری؟ تا وکیلش اومد در گوشی باهاش حرف بزنه خودش پرید وسط حرفش و بلند گفت نه! قاضی تعجب کرد. یه بار دیگه آهسته‌تر همون سوال رو پرسید و دوباره جواب داد که نه من هیچ دفاعی از خودم ندارم! توی دادگاه برای چند ثانیه همه ساکت شدن و بعد کم‌کم صدای پچ‌پچ از گوشه و کنار بلند شد. قیافه سرآبادانی روی میز کناری دیدنی بود. حداقل شش ماه زندان منتظر سعید بود.یک هفته قبل، شرکت خدمات پرداخت موبایلی افقساعت ده صبح یکی از روزهای ماه بهمن سرآبادانی از اتاق مدیرعامل اومد بیرون و رفت به سمت اتاق سعید. سعید برنامه‌نویس ارشد اون شرکت بود. سرآبادانی بعد از یه احوال‌پرسی گرم و عجیب بهش گفت که باید روی یکی از سرویس‌های شرکت ای‌پی‌آیی بذاره که بشه با توکن اختصاصی بدون اینکه روی سرور لاگ بندازه با یوزر روت به ترمینال سرور دسترسی پیدا کرد و کامند دلخواه رو اجرا کرد. سعید از این درخواست سرآبادانی جا خورد. این کاری که سرآبادانی ازش می‌خواست کار نشدنی‌ای نبود اما نحوه گفتنش عجیب بود و معلوم نبود هدفش از این کار چیه. این درخواست خارج از تسک‌های عادی شرکت بود که توی برد وارد می‌شد. سعید بعد از چند لحظه خیره شدن به کیبردش گفت این کار سختیه و نمی‌تونه انجامش بده. سرآبادانی فهمیده بود که سعید داره طفره می‌ره، بخاطر همین سعی کرد با پیشنهاد پاداش آخر ماه و حقوق بیشتر اون رو راضی کنه، اما سعید باز هم طفره رفت و بیشتر به موضوع شک کرده بود. برای سعید این تسک خیلی عجیب بود و از طرفی خود سرآبادانی به لینوکس و ساختار اون سرویس‌ها وارد بود و ‌می‌تونست این کار رو انجام بده. چرا داشت به سعید می‌گفت؟ سعید مطمئن شده بود حتما هدف دیگه‌ای پشت قضیه هست. این‌بار رک بهش گفت کاری که ازش می‌خواد خلاف قوانینه و امکان نداره که انجامش بده. سرآبادانی چند لحظه توی صورت سعید نگاه کرد و نمی‌دونست چکار باید بکنه. اون از شرایط بد مالی سعید خبر داشت و پیش خودش مطمئن بود که می‌شه سعید رو با پول راضی به انجام این کار کرد، می‌خواست با این کار اگر چیزی لو رفت فقط اسم سعید وسط باشه، ولی حالا متوجه شده بوده که سعید اون کار رو انجام نمی‌ده و اگر سعید به کسی اون حرف‌ها رو می‌زد می‌تونست به ضررش تموم بشه. حالت چهره‌اش تغییر کرده بود و داشت زمین رو نگاه می‌کرد. غرورش اجازه نمی‌داد بیشتر از این از سعید خواهش کنه و از طرفی هم حسابی بهم ریخته بود. آخر سرش رو بالا گرفت و با لحن تهدیدآمیز گفت نباید کس دیگه‌ای از این صحبت خبردار بشه و بعد از اتاق خارج شد.جذبه و شخصیت سرآبادانی همیشه بین کارمندهای اون شرکت معروف بود. اگه با کسی لج می‌کرد تا زمانی که اون رو کاملا زمین نزده باشه راضی نمی‌شد و هیچکس نمی‌تونست ازش باج بگیره. حتی اگر دو ماه هم حقوق کسی رو نمی‌داد، کسی از ترس جرئت نمی‌کرد به خودش یا اداره بیمه چیزی بگه. عباس گجرانی یکی از کسایی بود که به گفته بچه‌ها قبلا باهاش لج افتاده بود و بخاطر خود سرآبادانی و مافیایی که توی صنعت نرم‌افزار شهر داشت مجبور شده بود کلا از شهر بره تا بتونه کار جدید گیر بیاره. سعید و عباس از دوستای قدیمی هم‌دیگه بودن. طفره سعید از انجام اون کار اعصاب سرآبادانی رو حسابی به هم ریخته بود و رفتارش اون رو ترسونده بود. سرآبادانی قصد داشت با داشتن این دسترسی بعدا بتونه از مدیرهای اصلی هولدینگ شرکت باج بگیره و نمی‌خواست هیچ رد پایی از خودش روی پیاده‌سازی این بک‌دور باشه. ادامه اون روز خیلی آروم گذشت تا حدود ساعت سه ظهر که منشی شرکت سعید رو صدا زد و حکم اخراجش رو بهش تحویل داد. سعید که سرش گرم کار خودش بود از دیدن این واکنش سرآبادانی جا خورد. توی اون شرایط مالی به پول احتیاج داشت و اخراج شدنش از اون شرکت زندگیش رو به هم می‌ریخت. با عصبانیت رفت توی اتاقش، کوله‌اش رو برداشت و بدون اینکه حرفی از سنوات و باقی حقوقش بزنه یا ساعت خروجش رو ثبت کنه از شرکت رفت به سمت خونه‌ش.عصر همون روز سرآبادانی دوباره به موبایل سعید زنگ زد و دوباره پیشنهادش رو گفت. سعید آدم لجبازی بود و خیلی زود به هم می‌ریخت و به راحتی زیر بار حرف زور نمی‌رفت. قبل از اینکه سرآبادانی حتی صحبتش تموم بشه گوشی رو قطع کرد و واسه‌ش نوشت: «هر کاری دلت می‌خواد بکن تا ماتحتت جر بخوره بدبخت!» و بعد گوشی رو یه گوشه پرت کرد. این اس‌ام‌اسی نبود که آدم به مدیری مثل سرآبادانی بفرسته. چند دقیقه بعد از ارسال اون پیام  صدای نوتیفیکیشن گوشیش اومد. سرآبادانی جواب داده بود: «کاش زودتر فهمیده بودی با کی داری بازی می‌کنی دون‌پایه بدبخت!». سعید لحظات سختی رو می‌گذروند و نهایت فکری که می‌کرد این بود که باید از شهر خارج بشه یا به یه کار دیگه‌ای مشغول بشه. اما تصورش از ترس و کینه‌ای که سرآبادانی ازش پیدا کرده بود حتی نزدیک به واقعیت هم نبود.سرآبادانی از سعید ترسیده بود. از طرفی از کار خودش هم پشیمون شده بود که انقدر راحت سعید رو از نقشه‌ش با خبر کرده بود و نمی‌تونست ریسک کنه. فعال کردن اون ای‌پی‌آی روی سرور کاری بود که خودش هم می‌تونست با اکانت کس دیگه‌ای انجام بده و این درخواستش از سعید اشتباه محض بود. شرایط سختی بود. اگه کسی از نقشه‌ش برای گذاشتن بک‌دور روی سرورهای شرکتی که خودش مدیرش بود مطلع می‌شد کارش حسابی بیخ پیدا می‌کرد و نمی‌تونست ریسک کنه. بخاطر همین شروع کرد به تمیز کردن گندی که زده بود. نقشه جدیدش این بود که یه جرم کامپیوتری علیه سعید ترتیب بده تا بتونه اون رو برای مدتی بندازه زندان! این کار باعث می‌شد حساب کار دست سعید بیاد و حتی اگه می‌خواست حرفی بزنه یا اون رو لو بده کسی باور نکنه. پسورد کامپیوتر سعید رو که با کمک دوربین‌های مداربسته شرکت و زوم کردن روی کیبردش پیدا کرد و با اکانتش بالانس پول تعداد زیادی از مشترکین اپلیکیشن رو رو جابه‌جا کرد و پول رو به اکانت سعید انتقال داد. با این کار سعید رو حسابی توی دردسر می‌نداخت. سرآبادانی بخاطر اینکه مطمئن بشه پلیس حرفش رو باور می‌کنه حتی تاریخ چند تا از ویدئوهای حضور سعید توی شرکت توی ساعت‌های خلوتی رو به اون روز جابه‌جا کرده بود و بعنوان مدرک کنار گذاشته بود. لاگ سرورها رو هم جوری ویرایش کرده بود که پلیس هم همون نتیجه دلخواه رو با خوندن اون‌ها بگیره. همه چیز بر علیه سعید بود.فردا صبح تعدادی از مشترکین به شرکت زنگ زدن و از کم شدن پول توی حسابشون شاکی بودن. سرآبادانی هم که اصلا از اون خبر شکه نشده بود شکایت اون‌ها رو به همراه تمام اون مدارک جعلی پیش پلیس برد و اون‌ها رو قانع کرد تا حکم جلب سعید رو بگیره. ظهر همون روز پلیس توی یک غافلگیری با چند تا مأمور سعید رو دستگیر کردن و مستقیم به سمت کلانتری بردن. سرآبادانی بخاطر لینک‌هایی که توی اداره پلیس داشت تونست سریع‌ترین اتهام ممکن رو بر علیه سعید بچینه. پلیس با بدترین رفتار ممکن سعید رو تا فردا صبح توی بازداشت‌گاه انفرادی اون اداره نگه داشت. فردا صبح اون روز عباس گجرانی تونست سند خونه باباش رو جور کنه و به سعید کمک کنه تا با قید وثیقه تا زمان دادگاه از بازداشگاه مرخصی بگیره. هفته بعد زمان برگزاری دادگاه بود و سعید باید خودش رو آماده می‌کرد. سرآبادانی که متوجه این اتفاق شد سریع رفت سراغ وکیل‌هایی که سعید احتمالا می‌خواست برای خودش بگیره تا بتونه بهشون رشوه بده و اون‌ها رو از این کار منع کنه. دلش نمی‌خواست مو لای درز نقشه‌ای که علیه سعید کشیده بره. سعید اما برخلاف تصور سرآبادانی فقط از عباس تشکر کرد و مستقیم از اداره پلیس به سمت خونه‌ش رفت و کل اون یه هفته از خونه خارج نشد.روز دادگاهروز برگزاری دادگاه بود. سرآبادانی با یه وکیل گرون‌قیمت توی دادگاه حاضر شده بود و با خودش حساب همه‌چیز رو کرده بود. مطمئن بود سعید حتما محکوم می‌شه. سعید هم با یه وکیل تسخیری که خود دادگاه براش گرفته بود روی صندلی مخصوص متهم نشسته بود و داشت به حرف‌های قاضی گوش می‌داد. قاضی دادگاه بعد از اینکه یه دور از روی اتهامات سعید خوند، همه رو ساکت کرد و رو به سعید پرسید دفاعی از خودت داری؟ تا وکیلش اومد در گوشی باهاش حرف بزنه خودش پرید وسط حرفش و بلند گفت نه! قاضی تعجب کرد. یک‌بار دیگه آهسته‌تر همون سوال رو پرسید و دوباره جواب داد که نه من هیچ دفاعی از خودم ندارم و تمام اتهامات رو قبول می‌کنم! توی دادگاه برای چند ثانیه همه ساکت شدن و بعد کم‌کم صدای پچ‌پچ از گوشه و کنار بلند شد. قیافه سرآبادانی روی میز کناری دیدنی بود. عباس گجرانی و بقیه کسایی که تو اتاق بودن از این کار سعید تعجب کردن. حداقل شش ماه زندان منتظر سعید بود. سرآبادانی با اینکه از این حرکت سعید جا خورده بود و انتظار مقاومت بیشتری رو داشت، اما خیلی هم خوشحال بود که همه چیز به این سادگی تموم شده. قاضی دوباره همه رو ساکت کرد و حکم سعید رو خوند. «هفتاد ضربه شلاق و شش ماه زندان». وکیل‌ها حتی فرصت حرف‌زدن هم پیدا نکرده بودن. ختم جلسه اعلام شد و مامور پلیس وارد دادگاه شد تا سعید رو به سمت زندان ببره.چند ماه بعدسرآبادانی بعد از اون درسی که به سعید داده بود خیلی به خودش افتخار می‌کرد. بقیه کارمندهای اون شرکت حتی بیشتر از قبل ازش می‌ترسیدن. همه چیز آروم شده بود و وقت عملی کردن نقشه‌اش بود. اون روز حدود ساعت هشت شب و وقتی شرکت خالی شده بود، فلش یو‌اس‌بی خودش رو برداشت و بدون اینکه به کسی خبر بده به سمت ساختمون دیتاسنتر رفت. تمام پیش‌بینی‌های لازم رو از قبل کرده بود و مطمئن بود دوربین‌ها و سنسورهای امنیتی توی اون ساعت کار نمی‌کنن. می‌تونست با خیال راحت اسکریپتی که برای گذاشتن بک‌دور روی سرور نوشته بود رو توی سرور اصلی آپلود کنه. دیتاسنتر شرکت جزو دیتاسنترهای پیشرفته به حساب می‌اومد و چند لایه امنیتی برای ورود و خروج و امکاناتی مثل تنظیم دمای محیط پیشرفته و اطفای حریق بدون نیاز به آب داشت. اون بخاطر اینکه ریسک نکنه دیگه دلش نمی‌خواست حتی یک نفر از این کارش باخبر بشه و کل کارها رو کند اما تنها انجام داده بود. با کلید در ساختمون دیتاسنتر رو باز کرد و وارد زیرزمین اونجا شد. زیرزمین جایی بود که سرورهای اصلی اونجا قرارداشت و رد شدن از سه لایه قفلی که اونجا بود نیاز به رمزعبور داشت. تمام رمزعبورها رو وارد کرد و خودش رو روبه‌روی سرور دید. کمی ترسیده بود، اما خیالش از همه‌چیز راحت بود. دو دوربین خاموش بالای سرش و سنسورهای حرارتی که حتی چشمک هم نمی‌زندن بهش قوت قلب می‌دادن. فلش رو به سرور وصل کرد و اون رو مانت کرد و اسکریپت کامپایل شده‌ای که با زبون گو نوشته بود رو از توی فلش به آدرس مورد نظرش کپی کرد. بعد از اجرای اسکریپت شروع به ادیت‌کردن لاگ‌های سرور و ردپای خودش کرد. ویم رو باز کرد و بعد از اینکه کارش با لاگ‌ها تموم شد، دونقطه دبلیو کیو رو وارد کرد. همه‌چیز خوب پیش رفته بود ولی پیغامی که روی صفحه نمایش داده شده بود عادی نبود. نوشته بود: «کاش زودتر فهمیده بودی با کی داری بازی می‌کنی دون‌پایه بدبخت؟». پیغام آشنایی بود و این خیلی عجیب بود. خیلی جا خورده بود و نمی‌دونست چه اتفاقی داره می‌افته. همون لحظه سیستم تنظیم دمای محیط شروع به خنک شدن کرد و دما به سرعت داشت به سمت زیر صفر حرکت می‌کرد. سرآبادانی هول شده بود و سعی کرد از اونجا خارج بشه ولی هیچ‌کدوم از رمزهای عبور برای باز کردن قفل کار نمی‌کردن. دما در عرض چند دقیقه به منفی سی و پنج رسیده بود و لایه‌های صوتی دیوارهای اونجا باعث می‌شد صدای فریادهاش از اونجا خارج نشه. شبکه موبایل توی اون زیرزمین آنتن نمی‌داد و هرچقدر هم که سعی کرد دوباره سنسورهای دزدگیر رو فعال کنه موفق نشد.فردای اون روز پلیس در حالی جنازه یخ زده سرآبادانی رو توی اون زیرزمین پیدا کرد که تمام لاگ‌های سرور تنظیمات اشتباهی خودش رو روی سیستم‌های امنیتی اونجا نشون می‌داد و این مرگ رو یه حادثه اشتباهی می‌دونست. سعید وقتی این خبر رو توی زندان شنید هیچ واکنشی نشون نداد و داشت خودش رو برای روز آزادیش آماده می‌کرد.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Mon, 25 Feb 2019 12:39:21 +0330</pubDate>
            </item>
                    <item>
                <title>شوهرخاله</title>
                <link>https://virgool.io/@nainemom/%D8%B4%D9%88%D9%87%D8%B1%D8%AE%D8%A7%D9%84%D9%87-qgd1xxvrjaq1</link>
                <description>تصویر بک‌گراند پیش‌فرض ویندوز XPبا یه شلوار جین تیره و تی‌شرت آبی نشسته بودم پشت پنجره اتاق و داشتم محله رو نگاه می‌کردم. صدای آهنگ ابی از کامپیوتر فاضل توی فضای اونجا پیچیده بود و با حسن مشغول کار کردن بودن. اون روز چهارشنبه ساعت حدود ده شب بود. اون آخر هفته خورده بود به تعطیلی دو روزه بعدش و اکثر همکارها احتمالا الان داشتن وسایل سفر فردا صبح رو مرتب می‌کردن. لیوان چایی رو بلند کردم بخورم که یهو حسن توی سالن اصلی کوبید روی میز و داد زد فاک! محسن بیا! از ترس هول کردم. چایی رو گذاشتم لب پنجره و بعد با عجله از اتاق خارج شدم که ببینم چه خبره.فاضل صدای آهنگ رو کم کرده بود و داشت با تعجب به مانیتور حسن نگاه می‌کرد! حسن گفت شت! بعد رو کرد به من و گفت فکر کنم ریدم! بکاپ داریم از دیتا؟ جلوتر رفتم و وقتی نگاهم به کامپیوتر حسن افتاد و آدرس آی‌پی سرور و آخرین کامندی که اجرا شده بود رو دیدم، عرق سرد کل بدنم رو پوشوند و فقط تونستم خیره بهش نگاه کنم. احتمالا از هیستوری دستورات قبلی استفاده کرده بود و زده بود کل دیتابیس برنامه رو پاک کرده بود. همه بچه‌های شرکت حداکثر تا سه ساعت پیش رفته بودن خونه و فقط ما سه تا مونده بودیم که کارای این سرویس کوفتی رو تموم کنیم که شرکت بتونه فردا صبح باهاش قرارداد ببنده بتونه حقوقمون رو بده. اکبرپور گفته بود حتی اگه شده تا صبح بمونید سر کار هم باید کار رو تموم کنیم. ما هم از ترسمون که حقوق چند ماه عقب افتادمون رو بده شرکت و تو پاچمون نره، مونده بودیم که اون سرویس کوفتی جدید رو تموم کنیم.«محسن بگو که بکاپ داریم روی اون یکی سرور!»اون سرویس جدید قرار بود آنالیز فعالیت‌های همه کاربرامون رو محاسبه کنه و در قالب ای‌پی‌آی به کلاینت‌ها بده. بچه‌های وب و اپ‌های موبایل کارشون رو با ای‌پی‌آی‌های ماک انجام داده بودن و فقط مونده بودیم ما که سرویس اصلی رو دیپلوی کنیم به جاش. کل کاری که مونده بود، فقط این بود که اون تیبل‌های جدید رو توی دیتابیس سرور اصلی بسازیم و بذاریم این سرویس خودش دیتا رو آنالیز کنه و اون‌هارو پر کنه. کارهای کراد و این‌ها همه قبلش انجام شده بود و تستشون هم کرده بودیم.«محسن جان مادرت حرف بزن.»مسئولیت این سرویس با من بود و تسک‌هاش جوری تقسیم شده بود که تقریبا کل کار رو من کردم، فاضل نگاه می‌کرد و حسن باید فقط دکمه دیپلوی رو فشار می‌داد. که البته توی این یه کار هم گند زده بود. این دیتایی که حسن پاک کرده بود اگه برنمی‌گشت بدبخت می‌شدیم. دیتای خام کل فعالیت‌های کاربرای برنامه شرکتمون بود و هیچ نسخه دیگه‌ای ازشون موجود نبود. فاضل داشت دنبال میرور دیتابیس می‌گشت که ببینه نسخه کپی دیتابیس جای دیگه‌ای هم هست یا نه. ولی فقط من می‌دونستم که نیست. اون هفته که قرار بود یه میرور از همه دیتابیس توی اون یکی سرور بسازم، بخاطر وقت کم من گفته بودم که بمونه واسه زمانی که سرمون یکم خلوت‌تر شده. ولی الان نبود اون نسخه کپی حتی از نبود یار هم ناراحت‌کننده‌تر بود.«یه چیزی بگو محسن. خب نفهمیدم کوئری رو اشتباه اجرا کردم، الان باید چی‌کار کنیم؟»بحث اخراج شدن یا حتی نگرفتن حقوق عقب افتادمون نبود. اگه نمی‌تونستیم جمعش کنیم اکبرپور می‌تونست ازمون شکایت هم بکنه یا حتی با رابط‌هایی که داشت می‌تونست باعث بشه کل زندگیمون نتونیم تو یه شرکت کار کنیم. همین الان هم دیر بود. اگه یه نفر از اپلیکیشن استفاده می‌کرد می‌فهمید همه دیتاها پاک شده. باید هر کاری که می‌شد رو سریع انجام بدیم. توی اون لحظات فکر فرار از مرز یا حتی آتیش‌زدن کل دیتاسنتر برای اینکه بگیم کار ما نبوده هم افتادم. هر کاری که می‌خواستیم انجام بدیم باید همین الان انجام می‌دادیم. احتیاج داشتم که بتونم توی اون اوضاع تمرکز کنم.«چرا باز داری میری تو اتاق؟ سیگار؟»سیگار رو روشن کردم و رفتم سمت پنجره اتاق. یاد هفته پیش افتادم که اکبرپور چقدر جلسه می‌رفت و از جاهای مختلف می‌اومدن تو شرکت ما برای صحبت راجع به این قرارداد. همش بر باد رفته بود. با خودم گفتم کاش اینترنت قطع بود یا حتی برق کل ساختمون رفته بود که ما نمی‌تونستیم اصلا این دیپلوی عجله‌ای رو انجام بدیم. یه کام غلیظ از سیگار گرفتم و دوباره فکر کردم که کاش اکبرپور امشب توی خواب بمیره و اصلا فردا صبح رو نبینه که بفهمه چه اتفاقی افتاده. کاش قیامت بشه. سیگار تقریبا آخراش بود. چی می‌شد اگه همه چیز کنترل زد داشته باشه؟ خیلی راحت می‌تونستی هر اشتباهی رو که کردی رو برگردونی به حالت قبل. دود رو به سمت پنجره فوت کردم و ته سیگار رو انداختم توی همون لیوان چایی قبلی که الان لب پنجره بود و دیگه یخ شده بود. با خودم گفتم شاید بشه با ریکاوری هارد سرور یه غلطی کرد. اعتمادی به نتیجه نداشتم، فقط کاری بود که می‌شد توی اون شرایط انجام داد.برگشتم توی سالن و به حسن گفتم بلند شه تا بتونم از سیستمش که از قبل توی سرور لاگین کرده استفاده کنم. حسن پشت سرم وایستاد و فاضل روش به سمت من. سعی کردم یه تب جدید توی پنجره ترمینال بسازم، ولی هر کلیدی که می‌زدم عمل نمی‌کرد. حتی با ماوس هم سعی کردم پنجره رو ببرم کنار اما هیچ اتفاقی نمی‌افتاد. عجیب بود برام. آلت و تب رو زدم و یهو دیدم هیچ برنامه‌ای باز نیست که بخواد بینشون جابه‌جا بشه! پس اون ترمینال چجوری بازه؟ با ماوس روی دسکتاپ کلیک راست کردم و متوجه شدم حتی وقتی روی پنجره ترمینال هم کلیک راست می‌کنم باز هم منو باز می‌شه. برگشتم پشت سرم دیدم حسن و فاضل زدن زیر خنده. احمق‌ها کل اون محیط دسکتاپ جعلی رو که فاضل با فتوشاپ درست کرده بود بعنوان عکس گذاشته بودن روی بکگراند کامپیوتر حسن. همه این قضیه پاک شدن دیتابیس و اجرای اون کامند الکی بود. حسن افتاده بود کف سالن و همینطور که داشت می‌خندید گفت اسگل شدیییی! و فاضل هم داشت با انگشت من رو نشون می‌داد و بلند بلند می‌خندید. این شوخی بی‌مزه ویندوزی حتی از جک‌های شوهرخالم راجع به باجناق هم بی‌نمک‌تر بود.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sun, 17 Feb 2019 16:22:27 +0330</pubDate>
            </item>
                    <item>
                <title>تایم‌زون</title>
                <link>https://virgool.io/pullrequest/%D8%AA%D8%A7%DB%8C%D9%85%D8%B2%D9%88%D9%86-vbbmxrky9dhp</link>
                <description>یک روز سرد پاییزی در ساعت پنج عصر، یک سری دانشمند که مشغول یادداشت کردن تغییرات روز و شب بودند به یک نکته عجیب برخوردند. این سوال برایشان پیش آمده بود که چرا تا همین شش ماه پیش ساعت پنج عصر هوا آفتابی بود و خورشید در آسمان می‌تابید، اما الان هوا تاریک است؟بعد از اینکه این مورد را با دانشمند بزرگ در میان گذاشتند، دانشمند بزرگ تمام شاگردها را از اتاقش به بیرون پرتاب کرد و به دیوار خیره شد. داشت به این فکر می‌کرد که کشف قبلیش که سعی داشت این مشکل را حل کند، چرا کار نمی‌کند؟ رفت دفترچه کشفیات خودش را باز کرد و شروع کرد به خواندن داستان کشف قبلیش که  Timezone نام داشت:طی تماس اسکایپی که با خاله‌ام در برلین داشته‌م متوجه شدم اینجا هوا تاریک است و آنجا هنوز هوا تاریک نشده و خورشید در آسمانشان است. منطقی هم هست، کره زمین گرد است و می‌چرخد و خورشید آن طرف‌تر ثابت ایستاده. خب اگر این طرف زمین آفتاب وسط آسمان باشد، آن طرف دیگر باید نصفه شب باشد دیگر. ولی آیا منطقی است که تعریف ما از ساعت متفاوت باشد؟ من یک عمر در اینجا به شاگردانم دستور داده‌ام که ساعت ۹ صبح بیدار شوند و برای من نان سنگک تازه بخرند، اما اگر با یکی از این کودن‌ها به آنجا برویم ساعت نه هوا مثل سگ تاریک است و هنوز نانوایی‌ها باز نکرده‌اند. نمی‌شود که هر بار به جایی می‌رویم ساعت کاری‌مان به هم بخورد.وزن خود را از باسن چپش به باسن راست انداخت و ادامه داد:برای حل این موضوع به راه‌حلی رسیدم که می‌تواند این مشکل را حل کند. این که آن وسط کره زمین که اسمش گرینویچ است و همیشه ساعت دوازده ظهر هوا روشن و دوازده شب هوا تاریک است را ساعت مبدا کره زمین در نظر بگیریم و ما که اینور با فاصله از مبدا قرار داریم، ساعت روزمره‌مان را با یک فاصله ثابت از آن ساعت مبدا در نظر بگیریم. خاله‌ام در آلمان هم همین وضعیت، منتها یک فاصله زمانی متفاوت. اینطوری این کودن‌ها هر قبرستانی که بروند باز هم باید ساعت نه صبح بیدار شوند و بروند نان سنگک تازه بخرند. با کمک خط‌کش و یک کره زمین پلاستیکی و یک ساعت مچی، اکنون به دستاورد بزرگی رسیده‌ام. لیستی که فاصله‌زمانی یا همان تایم‌زون کشورهای مختلف کره زمین در آن محاسبه شده و باعث می‌شود همه جای دنیا ساعت شش صبح نانوایی‌ها باز باشند:https://www.timeanddate.com/time/mapکمی خود را خواراند و دوباره به فکر فرو رفت. درست است که زمین گرد است و هر ۲۴ ساعت ما باید انتظار موقعیت ثابتی از خورشید در معرض دیدمان داشته باشیم، اما مسخره بازی کره زمین با چرخش به دور خودش باعث می‌شود این معادله دقیق نباشد. یعنی اگر امروز ساعت ۱۲ ظهر خورشید را از در فلان زاویه ببینیم، فردا همین ساعت خورشید کمی آن‌ورتر رفته است. اما اگر قرار بود هر روز این زاویه بیشتر شود، پس چرا آن کشف قبلی هنوز داشت کار می‌کرد؟ چون تایمر خداوند سر سال ریست می‌شود. یعنی درست است که هر روز زاویه تغییر می‌کند، اما میزان زاویه خورشید با یک سال بعد، اما همان روز یکی است.کمی بیشتر خود را خواراند و با خود گفت چه می‌شود اگر ما هر شش ماه یک‌بار بیاییم ساعت روزمره را بکشیم جلو، بعد دوباره سر سال بکشیمش سر جایش تا اون زاویه‌هه دقیق‌تر شود نسبت به انتظار ما. نه که همه چیز را حل کند، اما حداقل می‌دانیم که این باعث می‌شود ساعت نانوایی‌ها کمتر به هم بخورد.سپس بدون فکر به اینکه اینکار باعث می‌شود همه مردم دنیا سالی دوبار علاف این مسخره بازی شوند و بدون در نظر گرفتن تاثیر ناچیز آن روی یک مشکل حل نشدنی، یکی از شاگردها را صدا کرد و به او گفت این تغییر را هم بفرستد برود روی پروداکشن.پنجاه سال بعد، درست سال قبل از فوت این دانشمند بزرگ مراسم تجلیلی از او برگزار شد. در میانه مراسم یک جلسه پرسش و پاسخ برگزار شد که او بخاطر کهولت سن، کنار رفته و شاگردانش این قضیه را هندل می‌کردند. سوال‌ها به ترتیب پاسخ داده می‌شدند که نوبت به یکی از حضار رسید. او پرسید:ما به تازگی یک اپلیکیشن خدمات پرداخت موبایلی نوشته‌ایم و در آن اطلاعات پرداخت‌های مشتریانمان را سیو می‌کنیم. این اطلاعات شامل  یک سری چیزها به همراه تاریخ و زمان تراکنش آنها است. ما خیلی نکته‌سنج بودیم و از ساعت گرینویچ بجای ساعت محلی استفاده کردیم تا مشکل فاصله زمانی نداشته باشیم، اما اگر به پاییز برسیم و ساعت‌ها تکان بخورند، باید ساعت‌های قبلی را آپدیت کنیم؟ ما می‌خواهیم بتوانیم به اطلاعات قبلی اعتماد کنیم...دانشمند بزرگ که به این سوال گوش می‌کرد، عرق سرد از پیشانی‌اش جاری شد و نیمی از موهایش ریخت. رو به آن شاگردش که نامه عقب جلو کردن ساعت را نوشته بود کرد و با تمام توان یک پس‌گردنی محکم به او زد. شاگرد که علت را جویا شد، توضیح داد:پدرسگ من این همه محاسبات کرده‌ام تا به این دستاورد برسم، آن‌وقت تو به این شکل اشتباه به مردم توضیحش داده‌ای؟ من کی گفته‌ام ساعت گرینویچ عقب جلو می‌شود؟ من گفتم ساعت محلی. یعنی همین ماسماسکی که به دیوار آویزان می‌کنیم. یعنی اینکه مثلا آن مثبت سه و نیم که در ایران به ساعت گرینویچ اضافه می‌شود تا ساعتش بدست بیاید، در بهار بشود مثبت چهار و نیم تا آن قضیه نانوایی حل شود. آن‌وقت توی گوساله برداشته‌ای به مردم گفته‌ای که گرینویچ را جابه‌جا کنند؟شاگرد که سرش را پائین گرفته بود، از اعماق دلش ابراز پشیمانی کرد و قول داد دیگر این اشتباه را نکند. سپس دانشمند خطاب به پرسنده سوال قضیه را توضیح داد و از آن شاگرد خواست تا به کل دنیا و مخصوصا برنامه‌نویس‌های برنامه‌های خدمات پرداختی نامه جدیدی ایمیل کند تا آن‌ها نیز متوجه بشوند که ساعت عقب جلو نمی‌شود، بلکه فاصله فقط زمانی تکان می‌خورد.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sun, 23 Dec 2018 15:56:13 +0330</pubDate>
            </item>
                    <item>
                <title>پکیج‌منجر NPM چطوری می‌تونه ما رو توی مشکل بندازه؟</title>
                <link>https://virgool.io/pullrequest/npm-wipkqlgezyk2</link>
                <description>اول بگم که فانکشن require در حالتی که ما بخوایم یک ماژول رو ایمپورت کنیم باهاش، اول میاد توی فولدر node_modules که کنار فایل index.js هست میگرده، اگه نبود توی ماژول‌های کناری می‌گرده. وقتی توی پروژه جاوا‌اسکریپت و نود‌جی‌اس کامند npm install رو اجرا می‌کنیم، NPM شروع می‌کنه به خوندن فایل package.json‍ و تمام دیپندنسی‌هایی که اونجا تعریف شده رو از توی اینترنت دانلود و توی فولدر node_modules قرار می‌ده. وقتی داخل برنامه زیر کامند npm install رو اجرا می‌کنیم:// package.json
{
	&quot;name&quot;: &quot;my app&quot;,
	&quot;dependencies&quot;: {
		&quot;a&quot;: &quot;1.0.0&quot;,
		&quot;b&quot;: &quot;1.0.0&quot;
	}
}چنین ساختاری برای ما تولید می‌کنه:---- my app-------- node_modules------------ a------------ bخیلی هم عالی. اما گاهی اوقات پیش می‌آد که یکی از دیپندنسی‌ها خودش به یه پکیج دیگه وابسته‌ست و NPM مجبوره برای راضی نگه داشتن اون، دیپندنسی‌های اون رو هم دانلود کنه. توی این مثال، فرض کنید پکیج a خودش وابسته به پکیج c و d باشه و پکیج b دوباره وابسته به پکیج d باشه. ساختار فولدر ما میشه:---- my app-------- node_modules------------ a---------------- node_modules-------------------- c-------------------- d------------------------ node_modules---------------------------- b------------ bخوبی این ساختار اینه که اگه پکیج d داخل خودش بخواد پکیج b رو ایمپورت کنه، اون b داخلیه بهش می‌رسه و اگه ما توی روت پروژه همون کار کنیم، اون b که توی node_modules هست بهمون تحویل داده می‌شه. اما بدی‌هایی داشت این روش که باعث شد NPM روش تولید این ساختار رو عوض کنه. یکیش اینکه ما چرا اصلا باید دو تا b داشته باشیم (با فرض اینکه نسخه‌ها یکی باشن)؟ یا اینکه اگه مثلا c هم یک سری دیپندنسی داشت که اونا هم باز دیپندنسی داشتن که اونا هم... تا ابد باید همینطوری فولدر node_modules بسازه و بره جلو؟ درسته فانکشن‌های ریکرسیو خفنن، ولی نه دیگه تا این حد! مخصوصا اینکه اگه یکی از کلاینت‌های ما بخواد ویندوز باشه و حتی نتونه اون فولدرهای داخلی رو به علت طولانی بودن آدرس نشون بده!بعد از بحث‌های زیاد درباره این قضیه، NPM تصمیم گرفت روشش رو عوض کنه. توی نسخه‌های بعد 3 دیگه NPM سعی می‌کنه تا جایی که راه داره همه چیز رو فلت کنه. الان اگه بخوایم همون وضعیت آخری رو در نظر بگیریم، وقتی با NPM جدید کامند npm i رو اجرا کنیم، ساختار ما این‌شکلی میشه:---- my app-------- node_modules------------ a------------ b------------ c------------ dبه‌به. الان دیگه به جای داشتن یه عالمه node_modules‌ تو در تو فقط یه دونه ازش داریم و همه چیز همینجوری وسطش پهن شدن. اما صبر کنید بذارید وضعیتی رو بگم که ممکنه این ساختار اونقدری هم که بنظر می‌رسه، خوب نباشه.فرض کنید شما دارید یک پلاگین برای babel می‌نویسید. این ماژول مثلا میاد به یه سری فرایندهای کار babel کمک می‌کنه. حالا می‌خواید این رو منتشرش کنید،آیا babel باید توی devDependencyها باشه؟ معلومه که نه. چون همیشه به babel نیاز داره تا کار کنه!فهمیدم، باید توی dependencyها باشه؟ nice try، اما بازم جواب اشتباه بود. این پلاگین به babel نیاز نداره، این babelـه که به این نیاز داره.پس چی‌کار کنیم؟ به babel بگیم این پلاگین مارو به dependencyهای خودش اضافه کنه؟ نه نه. لایبرری babel نمی‌تونه هر روز بیاد یه عالمه plugin که هر روز دولوپرها براش منتشر می‌کنن رو به dependencyهای خودش اضافه کنه. اصلا منطقی نیست. هرکی babel رو می‌خواد دلیل نمیشه همه pluginهاش رو هم بخواد.شاید توی بعضی پروژه‌ها و فایل package.jsonـشون قسمت peerDependencies رو دیده باشید. این لایببری‌هایی که توی این بخش نوشته می‌شن، نه موقع develop و نه موقع انتشار نصب نمی‌شن! فقط کارشون اینه که اگه کسی این پلاگین رو توی پروژه mammad نصب کرد، npm در صورتی که تو همون پروژه mammad پکیج babel نصب نبود، به کاربر یه پیغام زرد رنگ که ممکنه خیلی راحت ازش بگذرید بده که «یکی از پکیج‌های شما یه پکیج دیگه رو می‌خواد که شما نداریدش یا یه نسخه دیگه ازش دارید که اون نمی‌تونه نصبش کنه. نصبش کنید!»این وضعیت ممکنه گند بزنه به پروژه شما. حالت زیر رو در نظر بگیرید: (می‌دونم ممکنه سخت باشه)// package.json
{
	&quot;name&quot;: &quot;plugin&quot;,
	&quot;peerDependecies&quot;: {
		&quot;babel&quot;: &quot;1.0.0&quot;
	}
}

{
	&quot;name&quot;: &quot;another-plugin&quot;,
	&quot;peerDependecies&quot;: {
		&quot;babel&quot;: &quot;2.0.0&quot;
	}
}

{
	&quot;name&quot;: &quot;custom-builder&quot;,
	&quot;dependencies&quot;: {
		&quot;babel&quot;: &quot;1.0.0&quot;,
		&quot;plugin&quot;: &quot;latest&quot;
	}
}

{
	&quot;name&quot;: &quot;my-app&quot;,
	&quot;dependencies&quot;: {
		&quot;babel&quot;: &quot;2.0.0&quot;,
		&quot;another-plugin&quot;: &quot;latest&quot;,
		&quot;custom-builder&quot;: &quot;latest&quot;
	}
}اوه اوه. پکیج plugin میگه نصب‌کننده‌های من باید babel نسخه یک رو داشته باشن. پکیج custom-builder میگه من نسخه یک babel و plugin رو توی دیپندنسی‌هام می‌خوام. و پکیج my-app که پروژه نهایی ماست، پکیج babel نسخه دو و custom-builder رو توی dependencyهاش داره. اینجا به قول معروف NPM گه‌گیجه می‌گیره. مرحله به مرحله با نصب پکیج‌های مورد نیاز my-app پیش می‌ریم:- اقدام به نصب پکیج babel نسخه دو، چون توی روت پروژه نسخه دیگه‌ای ازش نیست، همونجا نصب می‌شه.- اقدام به نصب پکیج another-plugin، چون توی روت پروژه نسخه دیگه‌ای ازش نیست، همونجا نصب می‌شه.- اقدام به نصب پکیج custom-builder، چون توی روت پروژه نسخه دیگه‌ای ازش نیست، همونجا نصب می‌شه.- اقدام به نصب dependencyهای custom-builder...- اقدام به نصب پکیج babel نسخه یک توی روت پروژه. توی روت پروژه نمیشه چون اونجا یه نسخه دیگه ازش هست، پس باید بره توی خود custom-builder.- اقدام به نصب plugin نسخه یک. چون توی روت پروژه نسخه دیگه‌ای ازش نیست، همونجا نصب می‌شه.پس نتیجه می‌شه:---- my app-------- node_modules------------ babel@2.0.0------------ another-plugin------------ custom-builder---------------- node_modules-------------------- babel@1.0.0------------ pluginاینجا یه مشکل بزرگ هست. یه بار دیگه برید بالا به peerDependecyـهای پکیج plugin نگاه کنید. اون babel نسخه یک رو میخواد، اما الان تو این پروژه اگه بخواد babel رو ایمپورت کنه، نسخه دو بهش میرسه، جون نزدیک‌ترین babel بهش نسخه دو هست، نه نسخه یک! و طبیعتا ممکنه توی کارش مشکل بوجود بیاد. تنها کاری که NPM تو این شرایط می‌کنه اینه که موقع نصب پکیج‌های my-app به شما بگه «پکیج plugin نسخه یک babel رو می‌خواد ولی شما نسخه دو رو دارید، برید پکیج babel نسخه یک رو دستی نصب کنید»مشخصه که ما به این راحتی نمی‌تونیم این کار رو کنیم. چون پروژه my-app ما و همینطور another-plugin طبیعتا babel نسخه دو رو لازم دارن. اینجاست که ممکنه editor رو ببندیم و بریم توی توئیتر به NPM و NodeJs و Javascript فحش بدیم.مشخصه که اگه NPM یه جوری می‌فهمید پکیج plugin رو توی custom-builder نصب می‌کرد، مشکل حل می‌شد. اما به عنوان یک npm install کننده، نمی‌تونیم چنین کاری کنیم. پس دو تا راه داریم، یکی با دید اینکه ما صاحب پکیج my-app هستیم و اون یکی دیگه با دید اینکه ما صاحب پکیج custom-builder هستیم و می‌خوایم مشکل رو به صورت اصولی حل کنیم.ما صاحب پکیج my-app هستیم...ما بعد از نصب پکیج‌های مورد نیاز، می‌تونیم بیل رو برداریم و خودمون این مشکلات peerDependenciesهای پکیج‌هامون رو حل کنیم و پکیج‌های مورد نیازشون رو نصب کنیم تا در نهایت اپ ما کار بکنه. حالا مطمئن بشیم که فایل package-lock.json هم تولید شده و اون رو هم با تغییرات دیگه کامیت می‌کنیم. این فایل برای نفر بعدی که کامند npm i رو اجرا می‌کنه ساخته شده و در واقع توش ساختار فعلی فولدر node_modules ماست. پس از این به بعد هر بار npm install کنیم، مطمئنیم دوباره اون مشکل پیش نمیاد و ساختار دقیقا همین شکلی که الان هست می‌شه. اما یه مشکل بزرگ اینه که  این روش فقط وقتی جواب می‌ده که my-app ما یه پروژه نهایی باشه و مطمئن باشیم هیچ‌جوره امکانش نیست که کسی بخواد اون رو به عنوان dependency نصبش کنه. چون این فایل package-lock.json که ما تولید کردیم، فقط زمانی معتبره که کسی مستقیما بخواد داخل این فولدر npm install رو اجرا کنه. حالا فرض دوم رو بخونید.ما صاحب پکیج custom-builder هستیم...اینجا ما باید یه فایل lock پرقدرت‌تر بسازیم. یه فایلی که علاوه‌بر اینکه یوزرهای مستقیم ما جدی می‌گیرینش، یوزرهایی که ما رو توی dependency‌هاشون نصب می‌کنن هم جدی بگیرنش. این فایل دوم توی فایلی به نام npm-shrinkwrap.json ذخیره میشه. این فایل به شما تضمین می‌کنه که در هر صورت ساختار node_modules شما تغییر نمی‌کنه، حتی اگر شما یه dependency باشید. مراحل کار تا حد زیادی شبیه مرحله قبله، اما بعد از اتمام کار و قبل از کامیت کردن، یه کار دیگه لازمه. اینکه بیایم این فایل lock دومی رو با کامند npm shrinkwrap تولید کنیم. این کامند باعث میشه محتویات فایل package-lock.json به فایل npm-shrinkwrap.json منتقل بشه.همین. امیدوارم تونسته باشم به اطلاعاتتون اضافه کنم. درصورتی که بنظرتون مطلب خوبی بود، با اشتراک گذاشتنش من رو خوشحال می‌کنید.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Wed, 14 Nov 2018 12:45:51 +0330</pubDate>
            </item>
                    <item>
                <title>وب‌اپلیکیشن</title>
                <link>https://virgool.io/pullrequest/service-worker-b95eybil2lfa</link>
                <description>سرویس‌ورکردستم رو زیر چونم گذاشته بودم و با چشم‌هایی که به زور باز نگهشون داشته بودم، به کنسول برازر خیره شده بودم. ایونت‌ها همه به درستی از سرور به من می‌رسید، اما این سرویس‌ورکر برازر انگار درست کار نمی‌کرد. بعضی ایونت‌ها رو لایی می‌کشید و هیچ اتفاقی توی کلاینت رخ نمی‌داد. ایونت‌ها مهم بودن. حتی یک ایونت هم سمت کلاینت نباید از دست می‌رفت. زمان به ما اجازه نمی‌داد که منتظر آپدیت بعدی برازر باشیم که این مشکل مسخره رو حل کنه. پروژه رو باید فردا تحویل می‌دادیم. داشتم به روز اولی که این پروژه رو قبول کرده بودیم فکر می‌کردم. من و سالار و سیامک، توی جلسه‌ای که با شهرداری تهران داشتیم قبول کرده بودیم که این پروژه رو با تکنولوژی node برای سمت سرور و وب‌اپلیکیشن برای سمت کلاینت انجام بدیم. وب‌اپلیکیشن پیشنهاد من بود. سالار و سیامک هر دو تردید داشتند، اما من اصرار کردم و هر جور شده راضی‌شون کردم. ته دلم به قدرت روزافزون تکنولوژی‌های جدید سمت وب باور داشتم. سالار قبل از اینکه رضایت خودش رو اعلام کنه، بهم گفت:برازر هنوز امتحان خودش رو برای چنین اپلیکیشنی پس نداده. مطمئنم به مشکل می‌خوریم. سرویس‌ورکر هنوز ساپورت خوبی نداره توی همه برازرها و ما نمی‌تونیم مجبورشون کنیم آخرین نسخه رو نصب کنن...قبل از اینکه سالار حرفش رو تموم کنه، مدیر شهرداری و احتمالا کارفرمای جدید ما وسط حرفش پرید و گفت:خیالتون از این نظر راحت باشه دوستان. این برنامه قرار نیست دست همه باشه، فقط روی سیستم‌های کارکنان شهرداری نصب می‌شه و تمام سیستم‌ها به‌روز هستند و آخرین نسخه تمام برنامه‌ها را دارند. حتی ما می‌تونیم یه جلسه توجیهی/آموزشی براشون برگزار کنیم و کار با این برنامه رو بهشون آموزش بدیم.این حرف خیال من رو راحت کرده بود. اما حالا که متوجه شده بودم با وجود نصب آخرین نسخه کروم روی لپتاپ من باز هم بعضی ایونت‌ها به درستی کار نمی‌کنن، کمی اوضاع به هم ریخته بود. فردا ساعت 11 صبح جلسه تحویل پروژه بود و الان با سیامک به خیال خودمون داشتیم کدها رو ریویو می‌کردیم. سیامک فقط نشسته بود و هی منو‌ها رو بالا پایین می‌کرد و از شاه‌کاری که توی طراحی این اپلیکیشن کرده بود، احساس پیروزی می‌کرد. اما الان مشکل مهم‌تر از این‌ها بود. با اینکه می‌دونستم سیامک هم می‌تونه کمک کنه، بهش چیزی نمی‌گفتم. نمی‌خواستم بعدا بزنه توی سرم که &quot;تو هیچ کاری نکردی&quot;. از همون اول هم قرار بود توی کار همدیگه دخالت نکنیم. توی این موقعیت، داشت استایل‌ها رو بالاپایین می‌کرد. سالار هم که کارش رو هفته پیش تموم کرده بود، الان احتمالا خونه خوابیده بود. مشکل فقط سمت من بود و کدهای کلاینت. از خوش‌خیالی سیامک اذیت می‌شدم. غرق در فکر شده بودم و داشتم صدای احتمالی خروپف سالار را تصور می‌کردم.بخش دومروز دوم، ساعت 10 صبح، پارک روبه‌روی شهرداریحدود دو ساعت دیگه تا تحویل پروژه مونده بود و با سیامک توی پارک منتظر سالار نشسته بودیم. من داشتم سیگار می‌کشیدم و سیامک از ترس اینکه بوی سیگار من با بوی عطرش قاطی نشه، با فاصله از من وایستاده بود و داشت نگاه &quot;تو یه یابوی سیگاری بدبختی که هیچی حالیت نیست&quot; تحویل من می‌داد. من توی ذهنم داشتم مکالمه‌ای رو مرور می‌کردم که قرار بود با حضور سالار صورت بگیره. باید این مشکل رو با اون‌ها مطرح می‌کردم. هنوز کام آخر رو نگرفته بودم که سالار از روبه‌رو به سمت ما اومد.سالار: بههه سلاممم. چطورید رفقا؟من: سلام سالار. قربونت، تو خوبی؟سالار: خوبم. سیامک جون تو چطوری؟ خوبی؟سیامک: نوکرم داداش، چه خبر؟ ردیفی؟سالار: قربونت منم خوبم. همه‌چی ردیفه؟سیامک: آره همه‌چی عالی شده و استایل‌ها...من: ولی یه مشکلی داریم.نگاه بهت زده سالار و سیامک به سمت من برگشت. قصد نداشتم اینطوری بدون پروا بگم. می‌خواستم کلی مقدمه بچینم، ولی نتونستم جلوی خودم رو بگیرم. سالار که داشت آدامس می‌جویید، انگار فکش خشک شده بود. حتی نفس هم نمی‌کشیدند. مثل آن سکانس معروف سریال‌های تلویزیون که نمایانگر شدت تعجب کاراکترها است، هردو با کمی تاخیر و یک‌صدا گفتند: &quot;مشکل؟&quot;من: به یه مشکلی خوردم توی کدها.سیامک: تو که گفتی همه‌چیز کار می‌کنه! چه مشکلی؟من: انتظار این مشکل رو نداشتم.سالار: کدوم مشکل؟مشکل رو توضیح دادم. با اینکه این نقص برازر بود، بازهم چیزی از تقصیر من کم نمی‌کرد. دوست نداشتم اشتباه خودم رو گردن کس دیگه‌ای بندازم. سالار خیلی داشت جلوی خودش رو می‌گرفت که حرفای روز اولش که بهم گفته بود &quot;با وب‌اپلیکیشن به مشکل می‌خوریم&quot; رو بهم یادآوری نکنه، اما سیامک اینطوری نبود. با نگاه توأم با تنفرش با عصبانیت رو به من گفت: &quot;حالا چه گهی بخوریم؟&quot;. موقعیت سختی بود. داشتم سعی می‌کردم موقعیت رو کنترل کنم. بعد از اینکه سیگار دوم رو روشن کردم، شروع به صحبت کردم:می‌دونم. حتی احتمالا تمام فحش‌هایی که دارید بهم می‌دید رو هم می‌دونم. اما اتفاقیه که شده. واقعا کاری ازم ساخته نیست. باید توی جلسه یه جوری این تیکه رو بپیچونیم. کار سختی هم نیست. بیشتر تمرکزمون رو می‌ذاریم روی نشون دادن استایل کار و توضیح راجع به اتفاقات سمت سرور. بعد از جلسه احتمالا تا اون موقعی که اینا بفهمن برنامه دقیقا چجوری کار می‌کنه، برازرا خودشون را آپدیت می‌کنن و این مشکل مسخره حل می‌شه. بذارید این جلسه خوب پیش بره و بعدش راجع به مشکل حرف می‌زنیم. موافقید؟بعد از چیزی حدود ده ثانیه سکوت، جواب &quot;باشه&quot; رو در حالی شنیدم که مطمئن بودم پشتش هزار تا حرف دیگه بود. حداقل یکی از آن هزار حرف و مودبانه‌ترین آنها این بود که «می‌مردی زودتر این قضیه رو بهمون می‌گفتی گوسفند؟»خاکستر خاموش شده سیگار توی دستم، تقریبا هم قد خود سیگار شده بود که با تکان دست من به روی زمین ریخت. خواستم قبل از رفتن به جلسه، سیگار آخر رو هم بکشم که سیامک هم یک نخ سیگار از من گرفت. سالار همچنان سعی داشت این تغییر ناگهانی رو توی صحبت‌هایی که قرار بود انجام بده رو برای خودش حل کنه.بخش سومروز دوم، ساعت 11 صبح، اتاق جلسهسالار روی صندلی چرم اتاق شهرداری نشسته بود داشت تصویر لپتاپش رو روی پروژکتور می‌انداخت. بخار داشت از لیوان‌های چای روی میزها بلند می‌شد. من و سیامک هم دو طرف اون نشسته بودیم و داشتیم به مدیر شهرداری و سه مسئول دیگر لبخند تحویل می‌دادیم. سعی می‌کردیم چهره خود را شبیه به کسانی که موفق به انجام کار شده‌اند نشان دهیم. هرچه بیشتر طول می‌کشید، تواناییمان در حفظ این حالت کمتر می‌شد. کشتی‌گرفتن سالار با کابل پروژکتور همچنان ادامه داشت. مدیر شهرداری داشت با لپ‌تاپ قدیمی‌ای که روبه‌رویش بود ور می‌رفت. کم‌کم لپم داشت از این لبخند مصنوعی طولانی درد می‌گرفت که ناگهان تصویر صفحه لپ‌تاپ سالار روی پروژکتور افتاد و با لبخند رو به بقیه گفت &quot;بالاخره درست شد. اگه موافق باشید شروع کنیم؟&quot;. بقیه هم به نشانه تأیید سر تکان دادند. مدیر شهرداری سرش را از روی لپ‌تاپ بلند کرد و مشتاقانه گفت «شروع کنیم». سالار بعد از سر کشیدن لیوان چای‌ش که یخ کرده بود، توضیحات خود را شروع کرد.حدود یک ساعت گذشته بود. سالار تمام بخش‌های برنامه را برای آنها توضیح داد، به تمام سوالات آنها جواب داد و باعث شد کوچکترین استرسی به آنها انتقال پیدا نکند. بدون اغراق، توضیحات سالار و معرفی نرم‌افزار عالی پیش رفت. با خوش‌شانسی فوق‌العاده ما هم هیچ‌کسی متوجه هیچ کمبودی نشد و همه راضی به نظر می‌رسیدند. دو مسئول دیگر داشتند با خوشحالی راجع به استایل باز شدن منوها با هم حرف می‌زدند. همه چیز خوب بود. مدیر شهرداری شروع به صحبت کرد:خب عالی بود دوستان. نتیجه کار واقعا خوب شده و بهتون تبریک می‌گم. گل کاشتین. فقط لطفا این پروژه رو روی لپ‌تاپ خودم هم نشون بدید. این یکی از لپ‌تاپ‌های کارکنان اینجاست و باید مطمئن بشیم روی این هم بدرستی کار می‌کنه.لپ‌تاپی که روبه‌روی مدیر شهرداری بود، یک لپ‌تاپ قدیمی توشیبا و رنگ‌ورو رفته بود. یاد حرف روز اول مدیر شهرداری افتادم که گفته بود تمام سیستم‌های شهرداری به‌روز هستند و آخرین نسخه همه نرم‌افزارها روی آن‌ها نصب است، اما قیافه آن لپ‌تاپ چیز متفاوتی را بیان می‌کرد. این وسط چیزی درست نبود. مطمئن بودم که هر سه ما دقیقا به همین موضوع فکر می‌کنیم. تقریبا تمام نگاه‌های اتاق رو به سالار بود و منتظر بودند برود و به مدیر شهرداری کارکرد برنامه را نشان بدهد. سالار گلوی خود را صاف کرد و خود را با صندلی به سمت لپ‌تاپ مدیر شهرداری هول داد. من و سیامک منتظر بودیم تا لبخند رضایت را روی صورت سالار ببینیم. استرسمان فوق‌العاده زیاد بود. هرچه بیشتر منتظر می‌شدیم، سکوت حاکم بر اتاق بیشتر ما را اذیت می‌کرد. سالار حرف نمی‌زد و حتی دستش را به طرف لپ‌تاپ نبرده بود. فقط داشت نگاه می‌کرد. اصلا شبیه آن سالاری که پیش از این می‌شناختیم نبود. من و سیامک که خیلی نگران بودیم، به سمت او رفتیم و با دیدن مانیتور لپ‌تاپ، سالار را درک کردیم. سیامک تقریبا سکته کرد. تصویر لپتاپ، منظره‌ای سبز با آسمان آبی را نشان می‌داد و لوگوی ویندوز اکس‌پی و آیکون اینترنت‌اکسپلورر 6 روی آن، تقریبا هر جنبنده‌ای به غیر از مسئولان حاضر در اتاق را از پای درمی‌آورد.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sat, 18 Aug 2018 14:50:53 +0430</pubDate>
            </item>
                    <item>
                <title>تقارن</title>
                <link>https://virgool.io/@nainemom/ocd-x1ya12cq1yrt</link>
                <description>بر روی کاسه توالت نشسته و مشغول جیش کردن بودم. در حالی که صورتم به سمت دست راستم بود که برای حفظ تعادل شیر آب را گرفته بود، ذهنم اما درگیر مسأله عمیق‌تری بود؛ این‌که چرا دست‌شویی‌ها را قرینه نمی‌سازند تا بتوانیم دست چپ را هم از چیزی آویزان کنیم؟وقتی کوچک‌تر بودم، تقریبا اوایل ظهر یک روز تابستان، بخاطر حواس‌پرتی از روی دوچرخه به زمین خوردم و یک طرف بدنم تقریبا نابود شد. از درد داشتم به خودم می‌پیچیدم. بعد از اینکه بلند شدم و خودم را تکاندم، دیگر ذهنم متوجه درد نبود. تنها چیزی که به آن فکر می‌کردم این بود که طرف دیگر بدنم درد نمی‌کرد. کمی این‌طرف و آن‌طرف را نگاه کردم و وقتی متوجه شدم هیچ‌کس شاهد این صحنه دلخراش نبود، سعی کردم به گوشه‌ای بروم و آن یکی طرف بدنم را هم از دوچرخه به زمین بزنم! با اینکه کار بظاهر احمقانه‌ای بنظر می‌رسید، اما درد داشتن فقط یک طرف بدن خیلی تجربه ناخوشایند و اعصاب خردکنی بود و قرینه بودن درد در دو طرف بدنم، به من حس آرامش می‌داد. زاویه نشستن و دوچرخه را کاملا قرینه دفعه قبل تنظیم کردم و خودم را به زمین کوبیدم. اما تجربه درد اصلا شبیه به دفعه قبلی نبود. این اعصاب من را بیشتر خرد می‌کرد. چون این بار هر دو طرف بدنم باید حس طرف مقابل را تجربه می‌کرد و باید دوبار دیگر خودم را به زمین می‌زدم. تقریبا نزدیک غروب شده بود که بلاخره بعد از کلی تلاش، با بدنی سراسر زخمی دوچرخه‌ام را بلند کردم و به سمت خانه رفتم. آنقدر این حس قرینه بودن به من لذت می‌داد که نگاه‌های هاج و واج همسایه‌ها به لباس‌های خاکی و بدن زخمی من اصلا برایم مهم نبود.اینکه تعادل باید در هر چیزی برقرار باشد مهم است. منظورم از تعادل میانه‌روی نیست، منظورم خود تعادل است. وقتی روی یک ترازو دو چیز با وزن غیریکسان بگذاریم، یکی از لبه‌ها سنگین‌تر شده و به سمت پایین می‌رود. این اتفاق نه از لحاظ ظاهر که صحنه‌ای ناعادلانه تولید می‌کند، بلکه از نظر انسانیت صحنه دل‌خراشی‌است. اگر اشیا جان داشتند، لبه سنگین‌تر ترازو حتما به لبه سبک‌تر حسودی می‌کرد که درد کمتری تحمل می‌کند. یک قاضی باید در تمام شرایط قوانین یکسانی برای هر دو طرف اعمال کند.نزدیک‌های خانه بودم که دیدم مامان دم در خودش را به چهارچوب در تکیه داده و خانم امینی، همسایه ته کوچه‌ایمان هم جلوی در ایستاده و هر دو به من نگاه می‌کنند. اول کمی مکث کردم و سوالات زیادی در ذهنم ایجاد شد، ولی قبل از اینکه جوابی برای آن سوال‌ها پیدا کنم خودم را رو به روی مامان دیدم. مامان چند قدم به سمت من آمد.- مامان: چی می‌گه خانم امینی؟- من: چی می‌گه؟ خانم امینی چی می‌گید؟- مامان: خودت رو به اون راه نزن. خانم امینی می‌گه تو داشتی ته کوچه کاشی‌های پشت خونه‌شون رو با فرمون دوچرخه می‌شکوندی!- خانم امینی: آره! خودم دیدم!متوجه شدم که خانم امینی احتمالا در تمام مدت داشته من را دید می‌زده. از دید او احتمالا این کارهایی که من می‌کردم، کارهای یک آدم سالم نبوده و حتما باید به مامان گزارش می‌کرده. اما او درک نمی‌کرد که چون سمت چپ فرمان دوچرخه من کاشی سوم از گوشه را بصورت غیر عمدی شکانده، راه فراری برای کاشی سوم از سمت آن یکی گوشه نیست و محکوم به شکستن توسط فرمان سمت راست دوچرخه من است. سعی کردم برای او این مسأله را بصورت قابل فهم توضیح بدهم، اما با توجه به تجربه‌های ناموفق قبلی از این کار منصرف شدم. به جایش سعی کردم کمی ماست‌مالی کنم.- من: ببخشید خانم امینی. فرمون دوچرخه‌ام گیر کرده بود و من فقط داشتم گیر دوچرخه‌م رو باز می‌کردم که اون‌جوری شد.- مامان: اما خانم امینی می‌گه از ساعت یک ظهر تو داشتی خودت رو عین احمقا به کاشی‌های اون‌ها می‌کوبیدی.- خانم امینی: کلی هم خسارت زده!- مامان: من دیگه آسی شدم از دست این بچه. همیشه یا داره خودش رو به در و دیوار می‌کوبه، یا داره یه جایی رو لیس می‌زنه، یا وسایل خونه رو بهم می‌ریزه. همیشه داره خراب‌کاری می‌کنه.- خانم امینی: تازه بچه‌های کوچه هم وقتی دیدنش، کلی ازش ترسیدن!- مامان: تخم سگ.وقتی از محل قبلی به این‌جا آمدیم، مامان برای من حسابی خط و نشان کشیده بود که دیگر خراب‌کاری نکنم. او همیشه از آن زن‌های ساکت بود و همیشه از تنش با همسایه‌ها دوری می‌کرد. همیشه به من می‌گفت: «نذار آبرومون توی این محل جدید بره». در آن محل قبلی هم یک روز همسایه ته کوچه‌ای بخاطر اینکه من گل‌های باغچه‌شان را از زمین کنده بودم و در عوض بصورت مرتب دوباره کاشته بودم، با مامان دعوا راه انداخته بود. از نظر خودم کاری که کرده بودم لیاقت مدال که نه، اما حداقل لیاقت یک تشکر حسابی داشت. اما همسایه‌ها این موضوع را درک نمی‌کنند. در واقع هیچکس درک نمی‌کند، حتی مامان. این بار هم مامان بعد از عذرخواهی از خانم امینی، وقتی که دیگر بقول خودش خیلی شرمنده شده بود خسارت را بطور کامل به خانم امینی داد و قول داد «این توله سگ» دیگر آن طرف‌ها پیدایش نشود. از لحن ادبیات مامان متوجه شده بودم که شب خوبی در انتظارم نیست.آخر شب شده بود. از غروب حتی یک کلمه هم مامان با من حرف نزده بود. بابا که از سرکار آمد، مامان سریع به سمتش رفت و انگار دوباره عصانیتش فوران کرده بود. کل ماجرا را برای بابا تعریف کرد. بابا هم در طول مدت سرش پایین بود و با دقت به حرف‌های مامان گوش داد. بعد از اینکه حرف‌‌های مامان تمام شد، به او گفت: «حالا برو چایی بریز. من میرم باهاش صحبت می‌کنم». انگار بابا عاقل‌تر از مامان بود و می‌دانست این داستان با صحبت حل می‌شود. بابا به طرف من آمد و کنار من نشست و برای چند ثانیه خیره به من نگاه کرد و لبخند زد.- من: سلام بابا.- بابا: علیک سلام بابایی. علی جون مامانت چی می‌گه؟- من: نمی‌دونم. چی می‌گه؟بابا همیشه معتقد بود برخی روش‌های تربیتی مامان مثل تنبیه‌کردن اصلا جوابگو نیست و باید برای نصیحت بچه از در دوستی وارد شد. برای همین سعی کرد من را درک کند. کنترل تلویزیون را برداشت تا برای حفظ تعادلش از آن استفاده کند و نمودارهای احتمالی برای نصیحت کردن من را با آن رسم کند.- بابا: ببین پسرم. من می‌دونم ذهن تو چجوریه. من تو رو درکت می‌کنم. اما نباید وسایل بقیه رو خراب کنی.- من: ولی بابا من که خودم رو از قصد ننداختم. دوچرخه خودش لیز خورد.- بابا: می‌دونم بابایی.- من: ولی بابا من دروغ گفتم. دفعه اول دوچرخه واقعا لیز خورد، اما دفعه‌های بعدی خودم اون رو به زمین زدم.در همان حال بابا وزن بدنش را از باسن چپ به باسن راست انداخت. پیش‌بینی مقاومت از طرف من را نمی‌کرد. انتظار داشت سریع‌ کوتاه بیایم. کنترل را یک دور در دستش چرخاند. چند ثانیه مکث کرد، بعد ادامه داد.- بابا: این رو هم می‌دونم بابایی. ببین علی جونم. مردم عادی تو رو درکت نمی‌کنن. تو یه سری توانایی خاص داری. اما باید بتونی خودت رو کنترل کنی.- من: ولی بابا اینکه یه چیزی کج باشه، یا دو تا چیز کنار هم باشن و قرینه نباشن من رو عصبانی می‌کنه.- بابا: می‌دونم بابایی. من همه اینارو می‌دونم. ولی تو باید خودت رو کنترل کنی.- من: نمی‌شه. من دست خودم نیست.- بابا: می‌دونم بابایی. ولی دست خودم نیست نداریم. هر کاری با یکم تلاش امکان‌پذیره. - من: ولی این ربطی به تلاش نداره. من می‌گم دست خودم نیست...هنوز جمله خودم رو کامل نکرده بودم که انگار بابا دیگر تحمل‌ش تمام شد. میزان مقاوت این دفعه بابا نسبت به دفعات پیشین چشمگیر بود. بابا کنترل را به زمین انداخت و من ناگهان ضربه سنگینی را زیر چشم سمت چپم حس کردم. برای لحظه‌ای همه چیز تار شد. بلند شدم و ناخودآگاه فرار کردم. بابا در حالی که با صدای بلند داشت جمله «مگه با تو نیستم خودت رو کنترل کن!» را تکرار می‌کرد دنبالم می‌دوید. برای چند ثانیه هم که شده اصلا به فکر این نبودم که فقط یک طرف صورتم ضربه خورده و طرف دیگر سالم بود. تقریبا سه دفعه کل طول و عرض خانه را بابا دنبال من دوید تا بلاخره جلوی در دستشویی و انتهای راهرو رسیدم. بابا هم از پشت سر به من رسید و جلوی من ایستاد. وقتی دیدم دیگر راهی برای فرار نیست، همانجا ایستادم و با نگاهی ملتمسانه به بابا نگاه کردم. بابا مثل شیری که بعد از تعقیب و گریزی طولانی آهویی را در کوچه بن‌بست گیر انداخته باشد، داشت پنجول‌هایش را تیز می‌کرد. مثل سگ ترسیده بودم. مامان با سرعت خودش را به ما رساند. آن صحنه قابلیت کاندید شدن بعنوان بهترین سکانس جنگی جشنواره فیلم فجر را داشت. پدر دست به کمر رو به روی من، مادر با یک قوری چای کنار بابا، من بدون هیچ وسیله دفاعی در طرف مقابل. بابا داشت کمربند شلوارش را شل می‌کرد و مامان داشت شانه‌هایش را مالش می‌داد تا برای نبرد آماده باشد.هر کسی در چنین شرایطی گرفتار باشد، حتی اگر آتئیست هم باشد به حضرت ابوالفضل متوسل می‌شود. من هم همین‌طور. مدام داشتم تمام ذکرهای معنوی که در مدرسه یاد گرفته بودیم را با خودم تکرار می‌کردم. بابا دیگر کمربندش را در آورده بود و آن را دولا کرده بود و منتظر موقعیت مناسب برای حمله به من بود که ناگهان صدای کوبیده شدن در خانه آمد. بابا که انگار تمرکزش را دست داده بود، به مامان نگاه کرد و مامان هم رویش را به طرف در خانه برگرداند. باید بهترین استفاده را از شرایط موجود و حواس‌پرتی آنها می‌کردم. سریع به داخل دست‌شویی پریدم و در را پشت سرم قفل کردم. صدای نفس‌ عمیق بابا از روی افسوس را از پشت در شنیدم و برای چند لحظه آرامش به خانه برگشت. انگار روی ذغال آب ریخته باشی. هر چند مطمئن بودم این آرامش فقط برای لحظاتی کوتاه خواهد بود. صدای همسایه کناری که از پشت در داد می‌زد: «به اون کره‌خر که زده چرخ‌های ماشین من رو پنچر کرده بگید بیاد بیرون!» به من این نوید را می‌داد که شب را باید در دست‌شویی بگذرانم.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Mon, 16 Jul 2018 14:50:29 +0430</pubDate>
            </item>
                    <item>
                <title>کامندهای npm رو جدی بگیرید.</title>
                <link>https://virgool.io/JavaScript8/npm-build-u9at1wu0wmob</link>
                <description>دیشب متوجه یه سوتی خیلی ساده ولی مهم توی Framevuerk شدم. من توی داکیومنت برای یوزر نهایی نوشته بودم که هر وقت کانفیگ پروژه‌ت رو عوض کردی، کامند npm rebuild framevuerk رو اجرا کن تا اسکریپت build فریمویورک دوباره اجرا بشه. و اتفاقا کار هم میکرد و منم دیگه رهاش کرده بودم.اما چیزی که من بهش میگم سوتی، این بود که وقتی اسکریپت postinstall رو (بخاطر یه دلیل منطقی دیگه که الان نمی‌خوام ازش حرف بزنم) حذف کردم، دیگه کامند  npm rebuild framevuerk اجرا نمیشد. رفتم دوباره سرچ کردم که چرا اینجوری شد؟ رسیدم به داکیومنت خود npm که نوشته:This command runs the npm build command on the matched folders.اولین چیزی که رسید به ذهنم این بود که برم براشون ایشو بنویسم،‌ اما یکم سرم رو خاروندم و با خودم گفتم بابا این اگه کار نمیکرد که تا الان هزار نفر فهمیده بودن. پروژه‌های بزرگی مثل node-sass همین الان دارن از این کامند استفاده می‌کنن. پس سعی کردم این مشکل رو بندازم گردن خودم و بیشتر بخونم راجع بهش.در جست‌وجوهای بعدی رسیدم به این جواب. اگر قبلا این موضوع رو نمیدونستید و الان تازه خوندید،‌ احتمالا برای شما هم عجیب باشه:npm run start === npm start
npm run build !== npm buildمن هم انتظار داشتم npm rebuild توی پروژه مقصد، اسکریپت build من رو اجرا کنه، اما یه کار دیگه میکرد و فقط بخاطر postinstall بود که اسکریپت بیلد من دوباره اجرا میشد.هدفم از نوشتن این پست اشاره به همین موضوع بالا بود، اما اگر مهمه واستون که مشکل رو در نهایت چجوری حل کردم، باید به بخش bin توی فایل package.json اشاره کنم.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Mon, 28 May 2018 13:14:03 +0430</pubDate>
            </item>
                    <item>
                <title>مدیریت پیشوندها در CSS برای پشتیبانی در مرورگرهای مختلف</title>
                <link>https://virgool.io/pullrequest/%D9%85%D9%88%D8%B6%D9%88%D8%B9-%D9%BE%DB%8C%D8%B4%D9%88%D9%86%D8%AF%D9%87%D8%A7-prefix-%D8%AF%D8%B1-css-v4c4mzwpgdfn</link>
                <description>در دنیای برازرهای امروزی، درصد زیادی از مشکلاتی قبلا وجود داشت دیگه وجود ندارن. سیستم آپدیت برازرها اینطوریه که وقتی یه پراپرتی جدید css معرفی می‌شه، برازرها قبل از اینکه اون رو بطور مستقیم به نسخه جدید خودشون اضافه کنن، اول بصورت اختصاصی با یک پیشوند خاص اون رو اضافه می‌کنن و بعد از اینکه مدتی با همون حالت موند و مشکلاتش توسط استفاده‌کنندگان گزارش شد، اون بخش رو بهبود می‌بخشن و به نسخه جدیدتر اضافه میکنن.وقتی ما می‌خوایم یک سایت یا یک برنامه تحت وب طراحی کنیم، معمولا نمی‌تونیم به کاربرانمون بگیم که حتما از فایرفاکس نسخه فلان استفاده کنن و وقتی که اونا ببینن سایت ما زشت توی صفحشون نشون داده میشه، ما رو مقصر می‌دونن. کاری که ما باید انجام بدیم، اینه که کدمون توی تمام برازرهایی که الان پر استفاده هستن، کار کنه. چجوری؟ فرض کنید الان سال 2013ـه و ما می‌خوایم یک بلاک درست کنیم که کاربر اجازه نداره سلکتش کنه، رنگ زمینه بالاش سفیده و پایینش هم مشکی. برای اینکار، ما یه چنین کدی احتیاج داریم:کد استاندارد:.example {
    user-select: none;
    background: linear-gradient(to bottom, white, black);
}اما اگه همین کد رو توی برازرها اجرا کنیم، میبینیم توی بعضی‌هاشون عمل نمیکنه. بخاطر اینکه اونا هنوز این کدهای ما رو نمیفهمن؟ نه! بخاطر اینکه ما نیاز به یه چنین کدی داریم تا حداقل به بهترین نتیجه برسیم:.example {
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
    background: -webkit-gradient(linear, left top, left bottom, from(white), to(black));
    background: -webkit-linear-gradient(top, white, black);
    background: -o-linear-gradient(top, white, black);
    background: linear-gradient(to bottom, white, black);
}اوه. آدم واقعا پشیمون میشه از این که بخواد این همه کد رو بنویسه واسه دو تا استایل. چرا ما باید این همه prefix بنویسیم؟ خب اونا برن برازر جدید استفاده کنن! اما دنیا اینطوری کار نمی‌کنه. ما باید حداقل تا حد زیادی به سلیقه کاربرانمون احترام بذاریم و کدی بنویسیم که حتی استفاده کنندگان IE هم بتونن استفاده کنن. (همکار ویندوزی‌اش نگاهی خشمناک به او میکند). برای اینکه این کار برای خود ما هم راحت‌تر بشه، sass و lessمعرفی شدن که قابلیت‌های جدیدی اضافه کردن. مثلا یکیش mixin نوشتن بود که ما توش میگفتیم هر وقت توی کدمون نوشتیم mammad، تمام این استایل‌ها ایجاد بشن.@mixin mammad() {
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
    background: -webkit-gradient(linear, left top, left bottom, from(white), to(black));
    background: -webkit-linear-gradient(top, white, black);
    background: -o-linear-gradient(top, white, black);
    background: linear-gradient(to bottom, white, black);
}

.example{
  @include mammad();
}

.example2{
  @include mammad();
}بلاک اول این کد، mixin ما رو ایجاد میکنه و از اون به بعد هر جایی ما اون رو فراخونی کنیم، تمام استایل‌ها به این جای جدید اعمال میشن. خیلی کار راحت شد نه؟ اما ما هنوز هم به نتیجه دلخواه نرسیدیم. بخاطر اینکه این روش باعث میشه ما باز هم یه چیزایی رو از دست بدیم. مثلا ما یادمون بره که پیشوند -ms- که خیلی کم استفاده میشه، توی mixinـمون استفاده کنیم. به علاوه اینکه باعث میشه ما یه syntax جدید واسه خودمون درست کنیم. اگه یه آدم دیگه که اتفاقا خدای css هست بخواد بیاد کدهای مارو بخونه، احتمالا کدهای مارو نمی‌فهمه! چون به هرحال اینا کدهای استاندارد نیستن!از وقتی postcss و پلاگین خیلی خوب autoprefixer معرفی شد، ما خیالمون دیگه از این بابت راحت شد. وقتی ما پروژمون رو توسط این‌ها کانفیگ کنیم (که بخاطر طولانی شدن مطلب الان وارد جزئیاتش نمیشم)، ما میشیم همون آدم قبلی که از prefix نوشتن متنفره و همون کد اول این مطلب رو مینویسه. چون autoprefixer زحمت این کار رو برای ما میکشه. مثلا ما توی کانفیگمون میگیم:autoprefixer(&#039;last 2 versions&#039;, &#039;ie 10&#039;)این پلاگین خودش میفهمه که ما نیاز داریم کدمون توی دو تا نسخه آخر برازرها و همچنین IE نسخه 10 کار کنه، پس میاد و تمام prefixهای مورد نیاز ما رو ایجاد میکنه و خروجی درست رو به ما تحویل میده! امیدوارم این مطلب به دردتون بخوره!منابعsassmeistersass-langautoprefixerstackoverflow</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Tue, 04 Jul 2017 14:56:11 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت ابزار خط فرمان cli با استفاده از نود جی اس nodejs</title>
                <link>https://virgool.io/pullrequest/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D8%AE%D8%B7-%D9%81%D8%B1%D9%85%D8%A7%D9%86-cli-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%86%D9%88%D8%AF-%D8%AC%DB%8C-%D8%A7%D8%B3-nodejs-noc8zgknowdd</link>
                <description>ترمینال خیلی جای خوبیه. البته منظورم ترمینال جنوب نیست، منظورم از ترمینال، کنسول یا پاورشل یا کامندلاین یا cmd یا بنا بر گفته بسیاری از مهندسان حال حاضر دنیا، همون داس هستش. من هم توی این پست میخوام ساخت یه ابزار واسه اون رو یاد بدم. جوری که دیگه به جای باز کردن مای‌کامپیوتر و…، با تایپ اسم ابزار خودمون و پاس دادن آرگومنت‌هامون بهش، عملیات مورد نظرمون انجام بشه. اونم با جاواسکریپت و نود‌جی‌اس. لایک عه باس.شروع به نوشتنپروژه‌مون رو مثل یه برنامه عادی با نوشتن کامندهای زیر شروع می‌کنیم:mkdir my-project
cd my-projectحالا یه فایل می‌سازیم به اسم package.json و محتویات زیر رو داخلش قرار می‌دیم.{
  &quot;name&quot;: &quot;my-project&quot;,
   &quot;version&quot;: &quot;0.0.1&quot;,
   &quot;bin&quot;: {
    &quot;my-project&quot;: &quot;index.js&quot;
    }
}البته ما با npm init هم می‌تونستیم این فایل رو بسازیم، اما ظاهرا این کامند نمی‌تونه keyهای خاص ما رو قبول کنه. یکی از این keyها، bin هستش که توش میگیم وقتی کاربر توی ترمینالش تایپ کرد my-project، اسکریپت ما اجرا بشه.حالا توی فولدر فوق، فایل index.js که درواقع اسکریپت اصلی برنامه خودمون هست رو ایجاد میکنیم و توش محتویات زیر رو مینویسیم:#!/usr/bin/env node
console.log(&quot;salam&quot;);این یه برنامه سادست که به محض اجرا، عبارت salam رو نمایش می‌ده. فقط حواستون باشه که خط اول این اسکریپت خیلی مهمه. این خط به سیستم‌عامل می‌فهمونه که از nodeبرای اجرای دستورات بعدی این فایل استفاده کنه. چون همون‌طور که می‌دونید این اسکریپت مستقیم توسط سیستم‌عامل قراره اجرا بشه و ما قرار نیست همیشه با node index.jsاون رو اجرا کنیم. برای شروع، دونستن همین کافیه. ولی اگر گیک درونتون بی‌تابی می‌کنه، می‌تونید از اینجا بیشتر بخونید راجع بهش.خب حالا برای تست، توی ترمینال می‌نویسیم:node index.jsو ترمینال هم برای پاسخ به زحمات ما، به ما سلام می‌کنه!اما این خیلی ساده بود. مطمئنم تا اینجاش رو خودتون می‌دونستید. اما الان قراره چیزهای مهم‌تری رو بگم. مثل آرگومنت‌ها که به این برنامه قراره پاس داده بشن. کامند cd رو در نظر بگیرید. ما توی ترمینال همیشه در ادامه تایپ این کامند، آدرس دایرکتوری مورد نظرمون رو می‌نویسیم. مثلا cd ./felan. این آدرس، یه آرگومنت هستش که به این برنامه پاس داده می‌شه. حالا ما هم می‌خوایم به برناممون آرگومنت پاس بدیم. پس دوباره فایل index.js رو باز کنید و این تغییرات رو روش اعمال کنید.#!/usr/bin/env node
console.log(&quot;salam &quot; + process.argv[2] );حالا توی ترمینال، به جای دستور قبلی می‌نویسیم:node index.js amirو این بار ترمینال اون آرگومان ما رو هم چاپ می‌کنه! اما یه سوال، اون process.argvچی بود؟ الان می‌گم. آبجکت process توی برنامه‌های node ما در دسترسه. توی این آبجکت اطلاعاتی مثل دایرکتوری کنونی و آدرس فولدر کاربر و آرگومنت‌های تایپ‌شده و متودهایی مثل بستن برنامه و ایونت‌هایی مثل قبل از بسته‌شدن و اینها قرارداره. چیزی که ما ازش استخراج کردیم، argv یا همون آرگومنت‌های تایپ‌شدههست که در واقع یه لیست از آرگومنت‌های تایپ‌شده کاربر توی ترمیناله. توی این لیست همیشه خانه 0 برابر با خود اسکریپت node و خانه 1 برابر با اسکریپت ما یا همون index.js هست. پس از خانه 2 به بعد، تمام آیتم‌ها همون آرگومنت‌هایی هستن که به برنامه ما پاس داده شدن. همینطور که توی مثال دیدید.پس چرا هنوز کامند my-project فعال نشده؟بخاطر اینکه این پروژه هنوز هیچ‌جا نصب نیست. یادتون نره که این یک پروژه nodeهستش و ما نیازی نداریم جایی environment ست کنیم، فقط باید این پکیج رو به صورت گلوبال روی سیستم نصب کنیم. پس با اجرای کامند زیر توی ترمینال، این کار رو می‌کنیم و بعدش وقتی توی ترمینال نوشتیم my-project salam دیگه سیستم‌عامل به ما خطای command not found نمی‌ده، چون node می‌پره وسط و به سیستم‌عامل می‌گه که منظور کاربر از این کامند در واقع همون برنامه ماست (دوغ):npm install -gالبته ما قرار نیست همینجا متوقف بشیم و با نوشتن برنامه سلام کردن به کاربر از دنیای برنامه‌نویسی خداحافظی کنیم، ما قراره برنامه‌های خفن‌تری بنویسیم. این دوتا لینک هم قراره مطالعه کنیم، چون توضیح کاملشون توی این پست نمی‌گنجید. :Dراهنمای آبجکت processپکیج commander برای مدیریت آرگومان‌هاحرف آخرامیدوارم از این آموزش خوشتون اومده باشه و مورد استفادتون قرار بگیره و یا حداقل انگیزه‌ای شده باشه برای شروع نوشتن برنامه‌های جالبی که توی ذهنتون دارید. اگر هم نظری یا انتقادی در مورد این پست دارید، درهای کامنت و تماس با ما همیشه به روی شما باز است.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Tue, 02 May 2017 14:44:12 +0430</pubDate>
            </item>
                    <item>
                <title>نگه‌داری متغیرها توی پروژه‌های بزرگ در جاواسکریپت</title>
                <link>https://virgool.io/pullrequest/%D9%86%DA%AF%D9%87%D8%AF%D8%A7%D8%B1%DB%8C-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-%D8%AA%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87%D9%87%D8%A7%DB%8C-%D8%A8%D8%B2%D8%B1%DA%AF-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-hagm7zgz1i32</link>
                <description>اگر با جاواسکریپت و فریم‌ورک‌هایی مثل ری‌اکت، انگولار، ویو یا دوستای اون‌ها برنامه می‌نویسید و بطور کلی مفهوم کامپوننت رو می‌دونید، این متن برای شماست. من قرار نیست توی این پست Redux و Vuex یا هر لایبرری دیگه رو یاد بدم، بلکه می‌خوام توضیح بدم این‌هایی که گفتم چه کار می‌کنن و طرز کار کلیشون چجوریه.حتما می‌دونید که معمولا توی پترن برنامه‌نویسی کلاینت، ما سه تا بخش اصلی داریم. بخش اطلاعات یا همون state که اطلاعات ما رو نگه میداره. بخش actions که فانکشن‌های ما که قراره اطلاعات رو تغییر بده توش نگه‌داری میشه و بخش نمایش یا view که صفحاتی که کاربر قراره اونا رو ببینه و دکمه‌هاشون رو فشار بده، توی این بخش قرار می‌گیره. در ادامه، ارتباط این سه تا رو نشون می‌دم.Flowاگه اپلیکیشن ما در حد نمایش یه سری اطلاعات ساده و کم و زیاد کردن اعداد باشه، میتونیم با همین روند کارمون رو ادامه بدیم. چون این الگو ساده و قابل‌فهم برای شروعه و هیچ مشکل خاصی نداره. حتی ما می‌تونیم محاسبات پیچیده رو با همین الگو پیاده کنیم. اما وقتی اپلیکیشن ما بخواد بزرگ بشه، ممکنه ما اذیت بشیم. چرا؟ چون با گوشت‌کوب هم میشه میخ رو به دیوار کوبید، ولی اگه شما نجار باشی، برای ساختن یه صندلی بزرگ ممکنه بدون چکش دستتون رو زخم کنید. توی ادامه متن براتون توضیح میدم که چرا ممکنه دستمون زخم بشه.فرض میکنیم برنامه ما یه برنامه‌ایه که کاربرها میتونن توش login کنن و یه سری دکمه رو بزنن و وقتی کارشون تموم شد، logout کنن. وقتی چندتا کامپوننت یا تمپلیت بخوان یه متغیر خاص مثلا وضعیت login کاربر رو نشون بدن و اتفاقا بعضی‌های دیگه‌شون بخوان اون رو تغییرش بدن، یکم اوضاع گوریده میشه به هم. درسته این کار شدنیه، ولی ما باید هی این متغیر رو به اون کامپوننت‌ها پاس بدیم. وقتی برنامه بزرگ باشه، ممکنه صاحب این متغیر خاص که گفتم، خود این کامپوننت لود شده نباشه و کامپوننت پدر که الان سه نسل با اون فاصله داریم صاحبش باشه. به عبارتی ما نمیتونیم به این نوه جدید بگیم متغیر وضعیت login رو تغییر بده، باید بگیم من دات پدرم دات پدرش دات متغیر وضعیت login رو تغییر بده. بعد تازه چون این متغیر خاص بین همه اونها مشترکه، وقتی یکیشون تغییر ایجاد میکنه بقیشون هم باید خبردار بشن و مشتقات این تغییر رو روی خودشون اعمال کنن. حالا تصور کنید خدا عمر با عزت به این فامیل عطا کنه و دارای هفت هشت تا نسل بشه. اون وقت آدرس‌دادن و مدیریت کردن تغییرات این متغیر بین کامپوننت‌ها پیچیده، سنگین و گیج کننده میشه. دیگه نگم که دخترعمو/پسرعموها هم بخوان با هم ازدواج کنن! این جوری اپلیکیشن ما میشه یه سالن کوچیک که هزارتا آدم دارن توش همدیگه رو صدا میکنن و هی با همدیگه کار دارن و کلی بچه هم اون وسط دارن کله‌ملق بازی می‌کنن.راه حل چیه؟ما میتونیم تصاحب این متغیرها رو از روی دوش کامپوننت‌ها برداریم و اونها رو توی یه آبجکت عمومی global نگه‌داری کنیم. اینطوری همشون اون رو میشناسنش و دیگه مشکل گوریدن نداریم. اما صبر کنید. اگه مثلا یه متغیر بخواد فقط تحت تصاحب خونواده خاله و نوه نتیجه اونها باشه و بقیه حق دخالت نداشته باشن چی؟ برای حل این یکی ما می‌تونیم از namespace یا آبجکت‌های من درآوردی دیگه یا ماژولار کردن اونها استفاده کنیم و حق تغییر و استفاده از اون‌ها رو به کامپوننت‌هامون بسپریم. جوری که متغیرها توی هم قاطی نشن. اما دوباره یه مشکل پیش میاد. بحث اختراع دوباره چرخ. اگه شما از دسته مخترعین عزیز هستین و دوست دارین این مشکل رو با روش‌های خودتون حل کنید، حق تصمیم‌گیری با شماست. ولی زمانی که بیشتر از یک نفر بخوان توی توسعه این برنامه شرکت کنن، این کار خیلی خودخواهانه‌ست. ما باید سعی کنیم از یه روش استاندارد عمومی که همه بهش دسترسی دارن و می‌تونن از کلی مطلب موجود اون رو یاد بگیرن استفاده کنیم تا اینکه چرخ‌های رنگارنگ جدید تولید کنیم.استیت منجرها یا State Managerها برای همین ساخته شدن. برای اینکه تصاحب این متغیرها از روی دوش کامپوننت‌ها برداشته بشن. اونها در عوض میان وسط و توی هر کامپوننت یه آبجکت میدن که ما میتونیم متغیرها رو توی اون بنویسیم. هرکس دیگه‌ای هم از فامیل خواست به اون‌ها دسترسی داشته باشه، می‌تونیم حق دسترسی بهشون بدیم و متوجه بشیم کی سعی می‌کنن تغییرش بدن. درواقع این عضو خانواده رو می‌تونید شخص مادر توی هر فامیل این خونواده بزرگ درنظر بگیرید. مادرها از تغییرات فرزنداشون خبردار می‌شن و با یه زنگ به خاله و عمه‌ها می‌تونن حال‌واحوال اونها رو جویا بشن و اتفاقات خونوادگی رو باهاشون در میون بذارن. توی حالت جدید، ارتباط بخش‌های برنامه در یک فریمورک خاص مثل Vue بصورت زیر می‌شه.Vuexکی به State Managerها نیاز پیدا می‌کنم؟این سوالیه که جوابش دست شماست. اگرچه خود فریم‌ورک‌های ویو و ری‌اکت و… می‌تونن متغیرهای ما رو نگه‌داری کنن و امکانات و متودهایی برای تغییر اون‌ها و باخبرشدن از تغییراتشون در اختیار ما قرار میذارن، اما موضوع اندازه برنامه ماست. اگر برنامه‌تون داره بزرگ می‌شه و دارید توی نگه‌داری متغیرها به مشکل می‌خورید و اوضاع پیچیده شده، قدم بعدیتون می‌تونه State Manager باشه. درنهایت، توضیحات این مطلب رو با یک جمله آب‌طلاپسند از Dan Abramov، سازنده لایبرری Redux به پایان می‌برم:کتابخونه های فلاکس مثل عینک می‌مونن، وقتی بهشون نیاز داشته باشی، خودت میفهمی.</description>
                <category>امیر مومنیان</category>
                <author>امیر مومنیان</author>
                <pubDate>Sat, 08 Apr 2017 04:05:37 +0430</pubDate>
            </item>
            </channel>
</rss>