لطفاً خودتان را تکرار نکنید!

Mr Smith In Matrix Reloaded : Repeated himself and failed!

یک اصل یا قاعده یا توصیهٔ برنامه‌نویسی هست که علی رغم آن که عموماً جماعت برنامه‌نویس با آن آشنایی دارند -به نظرم- التزام به پیروی از آن موجب رستگاری همگان در همهٔ کارها خواهد شد ;).

این اصل که به طور خلاصه «DRY» خوانده می‌شود (و متضاد آن «WET» است! ؛ اولی مخفف Don’t Repeat Yourself و دومی مخفف Write Everything Twice) به طور ساده (به زبان برنامه‌نویسان) می‌گوید هر قسمتی از کدِ برنامه که ممکن است لازم باشد در جای دیگری مجدداً استفاده شود؛ لازم است به جای تکرار، به شکل یک کد قابل استفادهٔ مجدد (تابع، کلاس و …) درآید و هر جا لازم شد فراخوانی شود. البته این اصل تعریف پیچیده‌تر و دقیق‌تری هم دارد که درکش مستلزم سوزاندن فسفر بیشتری است: «هر بخشی از دانش در یک سیستم باید یک نمایش یکتا، غیر مبهم و معتبر داشته باشد».

برنامه‌نویسان نمود کارایی این قاعده را عموماً در رفع ایراد برنامه‌ها مشاهده می‌کنند: جاهایی که عدم رعایت این توصیه باعث شده بخشهایی از کد -جا به جا- به جای تبدیل به یک تابع و فراخوانی تکراری، به طور کامل کپی شده و حالا مشخص شده که آن بخش از کد ایراد دارد. اگر کار به قاعده انجام شده باشد -کسی خودش را تکرار نکرده باشد- رفع ایراد یا بهینه‌سازی یک قسمت از کد مشکل را حل می‌کند، اما وای به حال وقتی که کد؛ مکرراً کپی شده و تازه احیاناً در کپیهای مجدد در هر جا -بنا به مقتضیات- تغییرات مختصر یا مفصلی هم کرده باشد: اگر برنامه‌نویس خطاکار خود شما بوده باشید که تاوان عمل نکردن به این توصیه را با صرف وقتتان خواهید پرداخت، اما اگر کس دیگری قرار باشد خطای شما را تصحیح کند چه؟ لبخند می‌زنید؟! دلتان از شدت بدجنسی ضعف می‌رود؟! توصیه می‌کنم شما علاوه بر این توصیه، توصیهٔ مفیدتری را هم آویزهٔ گوشتان داشته باشید که ممکن است روزی جانتان را نجات دهد:

همیشه طوری کدنویسی کن که انگار کسی که قرار است کد تو را نگهداری کند یک قاتل زنجیره‌ای روانی است که نشانی خانه‌ات را می‌داند!

Dexter

بگذریم! این که خواندید مقدمهٔ صحبتم بود. اصل مطلب این که به نظرم یکی از جاهایی که پیروی از DRY شدیداً می‌تواند از هدررفت تکراری وقتها جلوگیری کند آنجاست که شما یک پروژهٔ بازمتن یا سایت یا وبلاگ عام‌المنفعه و مانند آن روی اینترنت دارید و خود را تا حد امکان متعهد به پشتیبانی از آن با پاسخگویی سؤالات مخاطبانتان می‌دانید. DRY زمانی نمود و کاربرد پیدا می‌کند که مخاطبانتان سؤالات یا درخواستهای تکراری دارند و شما مجبورید به طور عادی یک جواب خاص را برایشان تکرار کنید. یکی از راه‌حلهای این مسأله که می‌تواند به شما کمک کند کمتر خودتان را تکرار کنید آن است که پاسخ این سؤالات را در صفحاتی روی وب نگهداری کنید و در پاسخ هر سؤال تکراری، به جای نوشتن پاسخ مفصل، مخاطب را به صفحهٔ پاسخ ارجاع دهید.

شأن نزول این مطلب آن بود که خود من مدتها است که دارم تاوان عمل نکردن به این قاعده را برای خطای متداولی روی گنجور رومیزی می‌پردازم:

ایمیلهایی که گزارش خطایی با راهکار یکسان برای رفع خطا را در گنجور رومیزی به من داده‌اند

مسأله آن است که در اغلب این موارد، زمانی که برای جلوگیری از تکرار باید صرف شود بسیار کمتر از زمانی است که برای انشا و ارسال جواب تکراری برای تک تک مخاطبان صرف می‌شود. خاتمه آن که، امروز وقت گذاشتم و پاسخ متداول را جایی در دسترس گذاشتم. دعای آخر مجلس آن که کاش در جی‌میل می‌شد فیلتری تعریف کرد که در مواجهه با ایمیل حاوی کلمات تکراری (برای من استثنای برنامه‌نویسی System.BadImageFormatException)، به طور خودکار ایمیل از پیش تعیین شده‌ای را ارسال کند (که در نمونهٔ من ایمیلی حاوی لینک به این صفحه می‌شود).

در آستانهٔ سال نو

سال ۹۰ هم رو به پایان است، سالی که برای من توأم با تغییر محل کار و به تبع آن تغییرات دیگر بود. تغییراتی؛ عمدتاً ناخواسته که نهایتاً خوشایندم بود و باعث می‌شود که این سال را سالی توأم با اتفاقات خوب به حساب بیاورم. سالی که البته از کارهای فوق برنامه -گنجور و …- دور ماندم و از این لحاظ از این سال یادگاریهای زیادی ندارم. امیدوارم سال آینده سال پربارتری باشد.

لوح تقدیر تدبیر

سال نو پیشاپیش مبارک!

آمدید، نبودم؟

همزمان با فیلتر شدن گنجور، مشکلاتی در محل کار قبلیم پیش آمد که مجبور به ترک آن محل و شروع به کار در جای دیگر شدم. موعد اجاره‌ام هم با این وقایع همزمان شد و محل زندگیم را هم تغییر دادم. با توجه به ترکیب این وقایع، (به اختیار و ترجیحاً) در خانهٔ جدید تا به امروز و احتمالاً مدتی دیگر اینترنت دائمی نداشتم و ندارم. به همین جهت فعالیتهایم روی وبلاگ و همینطور گنجور و جاهای دیگر محدود شده است. از دوستانی که جویای احوال بودند و هستند متشکرم.

«در واقع»

گفتگوی ایران صدا دربارهٔ گنجور که پیشتر خبرش را داده بودم هم‌اکنون در آرشیو سایت ایران صدا در دسترس قرار گرفته است. علاوه بر آن که فرصت کافی برای طرح قسمت زیادی از مطالبی که آماده کرده بودم پیش نیامد مسألهٔ آزاردهندهٔ دیگر، تکرار پشت سر هم و بلاانقطاع عبارت «در واقع» در اول و وسط و آخر جمله‌ها توسط من بود که در نوع خودش -فکر می‌کنم- تعجب‌برانگیز و رکوردشکن باشد. با عذرخواهی پیشاپیش بابت این درواقع‌باران اعصاب‌خردکن غیرعمدی (و پساپس از دوستانی که به شکل زنده خود را در معرض آن قرار دادند، به ویژه مجری محترم برنامه و دست‌اندرکاران آن که مجبور به تحمل آن بودند) اگر احیاناً هنوز علاقمند بودید این گفتگو را بشنوید می‌توانید با مراجعه به این صفحه و انتخاب بخش مربوطه (آیکون سبزرنگ متناظر با آن در تصویر زیر مشخص است) آن را به شکل آنلاین بشنوید.

این صدای پارسی، گفتگو پیرامون گنجور

برای دریافت آن با سه کیفیت متفاوت نیز می‌توانید از سمت چپ‌ترین گزینه در پایین این صفحه استفاده کنید.

دریافت گفتگوی ایران‌صدا دربارهٔ گنجور

لطفاً ببخشید!

گنجور در ایران‌صدا

چهارشنبه بیستم بهمن، ساعت ۱ بعدازظهر در برنامهٔ زندهٔ رادیو-تی‌وی اینترنتی ایران‌صدا حضور خواهم داشت، موضوع بحث مرتبط با گنجور است. اینجا در این باره بیشتر بخوانید.

آسیاتک

کمتر از بیست روز دیگر فرصت دارم تا خانه‌ای نزدیک محل کار جدیدم (یا محل جدید کارم 😉 ) پیدا و نقل مکان کنم. در این مدتی که در خانه‌ی فعلی (واقع در شمال تهران) ساکن بودم (حدود دو سال و نیم) از خدمات اینترنت ADSL آسیاتک استفاده می‌کردم. آن وقتها که دنبال ای.دی.اس.ال بودم کمی راجع به کیفیت خدمات شرکتهای مختلف جستجو کردم. تا آنجا که به یاد دارم -غیر از نارضایتیهای شدید بعضی- مطلب مؤثر و به درد بخوری پیدا نکردم. آسیاتک آن وقتها یک ماه رایگان سرویس می‌داد، روی همین حساب، با نیت این که سرویسش را تست کنم و در صورت رضایت، تمدید کنم سراغ همین شرکت رفتم (شرکتهای دیگر چنین امکانی نداشتند). مودم را از خودشان خریدم. مودم USB با مارک CORECESS ساخت چین که بعدها به این نتیجه رسیدم که انتخاب اشتباهی بوده : اولاً گاه و بیگاه باعث بروز خطاهای صفحه آبی ویندوز می‌شود و ثانیاً دو سه باری که با دریافت ویرایشهای جدید اوبونتو یا لینوکسهای دیگر تلاش کردم از لینوکس روی کامپیوترم استفاده کنم -با توجه به این که به اندازه‌ی کافی با لینوکس آشنایی دارم و پیشتر کارت گرافیکی و مودم Dial Up م را روی لینوکسهای قدیمی راه انداخته بودم-، عدم موفقیت در راه‌اندازی این مودم باعث شد بی‌خیال لینوکس شوم.

اوایل برای یادآوری شارژ چند روزی پیش از اتمام آن زنگ می‌زدند و می‌پرسیدند که لازم است شارژ صورت گیرد یا نه و برای تحویل فاکتور و دریافت هزینه توسط پیک هماهنگ می‌کردند. بعدتر، یواش یواش یادشان می‌رفت و بعدترها گفتند باید خودتان تماس بگیرید.

برای پرداخت هزینه‌ی ماهیانه ابتدای کار پیک می‌فرستادند -برای خطوط ۱۲۸ کیلو به بالا رایگان-، یک مدت هم مبلغ را واریز می‌کردم و شماره فیش را با ایمیل برایشان می‌فرستادم. بعدتر، پرداخت (کاملاً) آنلاین راه انداختند که فکر می‌کنم چند ماهی 😉 کار می‌کرد (امکان شارژ سرویس، پرداخت آنلاین و گزارشگیری داشت). الان فقط می‌شود از طریق سیستم آنلاینشان -بدون نیاز به تماس با واحد فروش- ماه بعد را شارژ کنید و شماره فیش واریزی را وارد کنید. در هر صورت، همینش هم فکر می‌کنم غنیمت باشد با توجه به این که «اینجا ایران است».

قیمتهایش اوایل خوب بود، من در تمام مدت این دو سال و نیم ۱۲۸ کیلو با پهنای باند نامحدود خریداری می‌کردم، فکر می‌کنم تا همین پارسال کمتر از بیست هزار تومان می‌شد. اما، با طرح شدن آن چند (سه؟) درصد مالیات بر ارزش افزوده (یا یک چیزی مثل این)، بهانه کردند همین را و چیزی حدود چهل درصد قیمتهایشان را افزایش دادند (نزدیک بیست و نه هزار تومان در ماه). ضمن این که پیشترها قیمت ADSL برای کاربران خانگیشان متفاوت بود از کاربران شرکتی (ارزان‌تر بود) و بعدترها همه را یک کاسه کردند.

غیر از چند ماه ابتدایی و آن چند موردی که کوسه گویا اینترنت ایران را گاز گرفته بود و البته موردهای مربوط به مرکز مخابرات، قطعی آنچنانی نداشتند. زیاد پیش نیامد که بخواهم با واحد فنیشان تماس بگیرم. یکی دوباری که پیش آمد احساس می‌کردم که اینها فقط چند شماره کد خطا را حفظند و خارج از محدوده‌ی این کدها کمک زیادی نمی‌توانند بکنند. مثلاً برای مدتی بخش افزونه‌های سایت فایرفاکس با این آی.اس.پی بالا نمی‌آمد در حالی که در محل کارم -که پارس‌آنلاین استفاده می‌کردیم- مشکلی نبود، تماسهای من با واحد فنی آسیاتک در این مورد به جایی نرسید، هر چند بندگان خدا تلاششان را می‌کردند که مشکل من را حل کنند اما خوب وقتی نمی‌دانستند فایرفاکس چیست، انتظار نباید می‌داشتم که مشکل من را بفهمند! البته این مربوط به همان اوایل (شاید دو سال پیش) است، این مشکل خود به خود حل شد و فکر می‌کنم با فیلترینگ مرتبط بود. تماسهای دیگر که در مورد اشکال در ارتباط بود به حل آنی مشکل می‌انجامید.

پیشترها سیستم تلفن گویایشان ساده و سرراست بود و با گوش کردن چند ثانیه دستورالعمل می‌شد به اپراتور مقصد رسید. اخیراً برای دستیابی به یک بخش باید شاید نزدیک یک دقیقه دستورالعمل گوش کنید، باز دستورالعمل گوش کنید و … و نهایتاً اگر به مقصد رسیدید ابتدا -چون اپراتور اشغال است- اگر می‌خواهید منتظر بمانید شماره‌ای را بزنید (طبق دستورالعمل) و بعد از آن اگر می‌خواهید از حالت انتظار خارج شوید (؟!) طبق دستورالعمل شماره‌ای بزنید و اگر در این مرحله شماره‌ی دستور داده شده را نزنید چند دقیقه بعد احتمالاً می‌توانید با اپراتور صحبت کنید! برای مدتی هم -در یک اقدام ابتکاری-، به جای آهنگ انتظار، برای تماس گیرنده در یک حلقه‌ی نامتناهی شماره‌حسابهایشان را تکرار می‌کردند.

من تقریباً همیشه بیتورنتم به راه بود و به همین خاطر می‌توانم بگویم با توجه به سرعت دریافت این نرم‌افزار، سرعت خط تحویلی به من چیزی در حدود آن چیزی که باید باشد بوده.

در کل، ایضاً با توجه به این واقعیت که «اینجا ایران است» و شنیده‌ها و دیده‌هایم از سایر آی.اس.پی‌ها از آسیاتک راضیم و در صورتی که خانه‌ی جدید هنوز یافت نشده، مشکل مخابراتی نداشته باشد و بتوانم ای.دی.اس.ال بگیرم احتمال آن که باز هم سراغ آسیاتک بروم زیاد است. فعلاً با توجه به این که احتمال می‌دهم این ماه آخری دنبال خانه گشتن و مسائل جانبی آن وقت کمتری برای وبگردی برایم باقی بگذارد و همینطور این که به اندازه‌ی یک ماه کامل در این خانه ساکن نخواهم بود، برای این ماه، سرویسم را با محدودیت پهنای باند شارژ کرده‌ام تا ببینم در ماه بعد ساکن کجا هستم و از کجا اینترنت می‌گیرم.

اگر شما راجع به آی.اس.پی‌های دیگر نظر و اطلاع خاصی دارید لطفاً عنوان کنید. باشد که در ماه بعد ما را و در ماههای بعد بندگان دیگر خدا را به کار آید!

۸۸

همین پریروز از تعطیلات طولانی بیست روزه برگشته‌ام. دوری از اینترنت و کلاً کامپیوتر مزه داده و فعلاً چندان میلی به بازگشت به عادتهای پیش از عید ندارم. کلی ایمیل نخوانده دارم و … .

می‌دانید؟! مدتهاست که شبها پیش از خواب، راجع به کارهایی که قرار است انجام دهم فکر نمی‌کنم و برای آمدن فردا اشتیاق ندارم! شدیداً نیاز به تغییر دارم. امیدوارم امسال فرصت تغییر را بیابم و بتوانم از آن استفاده کنم.

سال نو مبارک!

خوراکی برای فیلمها

می‌دانید؟! شبها پیش از این که بخوابم، بیشتر وقتها، -دیگر فکر می‌کنم برایم عادت شده-، به طور ناخودآگاه یک لحظه چشمم را باز می‌کنم و تاریکی روبه‌رو را نگاه می‌کنم. فکر می‌کنم به این که الان کجا هستم، پارسال کجا بودم، چند سال پیش کجا بودم و آن وقتها دوست داشتم الان کجا باشم. می‌دانید؟! مثل برق دارد می‌گذرد روزها و ساعتها. نه این که واقعاً هدف مهمی داشته باشم و از نرسیدن به آن حسرت بخورم، نه! فقط دوست دارم این روزها و ساعتهایی را که پشت سر می‌گذارم ازشان یک خروجی، یک یادگاری داشته باشم. بدانم که این ساعتها را تلف نکرده‌ام. می‌دانید؟! گاهی فکر می‌کنم به این که اگر من، فردا، دیگر بیدار نشوم از دنیا چه چیزی کم می‌شود. آیا اصلاً اگر کل من و زندگی من را از فهرست آدمهایی که تا به حال آمده‌اند و رفته‌اند حذف کنند اتفاق مهمی می‌افتد؟! جواب تأسف‌آوری را که به آن می‌رسم احتمالاً خودتان می‌توانید حدس بزنید.

بگذریم! روی همان حساب پاراگراف اول دوست دارم خیلی از کارهایی را که می‌کنم -هر چند اهمیت چندانی نداشته باشند- مستند کنم. کارهایی با حداقل ارزش دیدن یک عکس خوب و دیدن یک فیلم. در راستای فعالیت دوم، افزونه‌ای را بر روی وردپرس نصب کرده‌ام که به من امکان ثبت فهرست فیلمهایی را که دیده‌ام می‌دهد (نشانی این افزونه). به کمک این افزونه می‌توان به کمک یک نشانک (بوکمارکلت) به آسانی دیدن فیلمها را ثبت کرد، علاوه بر آن، به آنها امتیاز داد و یک توضیح یا نقد کوچک راجع به آنها نوشت. نهایتاً فهرست فیلمها را در قالب یک صفحه‌ی مجزا و یک ابزارک وردپرس منتشر کرد. فهرست فیلمهایی را که تا به حال به کمک این افزونه دیده شدنشان را ثبت کرده‌ام اینجا ببینید.

فیلمهایی که دیده‌ام

فکر می‌کنم یک سال و نیمی هست که من این افزونه را نصب کرده‌ام و از آن زمان تا حالا این افزونه چندان تغییری نکرده و به‌روزرسانی عمده‌ای برای آن ارائه نشده. به همین لحاظ این افزونه نقصهایی هم دارد. یکی از نقصهای آن عدم ارائه‌ی خروجی آر.اس.اس (خوراک) است.

امروز به نظرم رسید که خروجی خوراکی برای این افزونه درست کنم و آن را به حساب کاربری فرندفیدم اضافه کنم. کمی جستجو کردم و کدی که در ادامه می‌بینید نتیجه‌ی این جستجوهاست. اگر بخواهید برای وردپرس خروجی خوراک بدلخواه درست کنید باید از چنین ساختاری استفاده کنید. خروجی نهایی یک افزونه‌ی ساده است. با امید این که نویسنده‌ی اصلی این افزونه بالاخره روزی خروجی خوراک را به آن اضافه خواهد کرد تمام چیزهایی را که می‌توانستند «انتخابی» باشند در متن کد گذاشته‌ام (عنوان خوراک، نشانی، تعداد و …) و اگر خواستید از آن استفاده کنید باید این موارد را ویرایش کنید. ضمن آن که افزونه‌ی امتیازدهی به فیلمها در وبلاگ من در پوشه‌ی wp_movie_ratings نصب شده و افزونه‌ی نوشته شده توسط من برای این که درست کار کند باید در ریشه‌ی پوشه‌ی افزونه‌ها قرار گیرد و اگر غیر از این می‌خواهید باشد باید آن را ویرایش کنید.

ادامه خواندن “خوراکی برای فیلمها”

حدیث نفس!

شما از تلفن همراهتان چه استفاده‌ای می‌کنید؟ بیشتر صحبت می‌کنید؟ پیامک می‌فرستید؟ یا …؟! این نمودار را ببینید:

از گوشی موبایلم چه استفاده‌ای می‌کنم

نمودار را از سایت گراف جم برداشته‌ام، از این صفحه. ایده‌ی این سایت آن است که بازدیدکنندگان و علاقمندان به سایت با کمک ابزارهای آن نمودارهای طنزآمیز و خنده‌دار درست کنند. بگذریم!

دو یا سه هفته پیش من گوشی موبایلم را (روشن و در حال کار) با ماشین لباسشویی شستم و بعد از آبکشی، از جیب کاپشنم بیرونش آوردم.

توصیه‌ی اقتصادی: اگر شما هم بلای مشابهی سر گوشیتان آوردید، اولین کاری که می‌کنید این نباشد که سعی کنید روشنش کنید تا ببینید کار می‌کند یا نه. سعی کنید بگذارید به اندازه‌ی کافی خشک شود، بعد …

به هر حال، توصیه‌ی بالایی حاصل جستجوهای بعد از واقعه -به دنبال راه علاج- است و من دقیقاً اولین کاری که بعد از بیرون آوردن آن از جیب کاپشنم کردم روشن کردن آن بود! روشن شد، البته فقط فلاش دوربینش. بعد از آن یکی دو باری گوشی را باز و بسته کردم. همه جایش را خشک کردم و امتحانهای مجدد، نتیجه‌ای جز حداکثر همان روشن شدن فلاش دوربین یا چراغ مادون قرمز نداشت. باتری را به کمک فلاش دوربین کاملاً خالی کردم. اما بعد از آن دیگر گوشی باتری را شارژ نکرد …، کم کم به فکر تعمیرکار افتاده‌ام و البته به دنبال آن وسوسه‌ی خرید یک گوشی جدید یقه‌ام را محکم گرفته و دستش را توی جیبم کرده این روزها و من ضعیف‌النفس به زودی احتمالاً در برابرش تسلیم خواهد شد و … .

در هر صورت، در این مدت نبود گوشی موبایل را من به صورت متفاوتی احساس کرده‌ام. من با «تلفن» موبایل خیلی کمتر از حد متعارف سر و کار داشته‌ام و دارم. می‌دانید؟! نبود گوشی، در گام اول، باعث شد -بعد از مدتها- سراغ ساعت زنگدار قدیمیم بروم و تازه بفهمم زنگ آن چندان مطمئن کار نمی‌کند. هر چند، همان پیشترها هم صبحها معمولاً چند دقیقه پیش از این که موبایلم زنگ بزند از خواب بیدار می‌شدم. الان هم همینطور است! با این تفاوت که این روزها با خیال راحت تا صبح، یکسره نمی‌خوابم و معمولاً نیم ساعت یا یک ساعت پیش از ساعت مقرر بیدارم.

مشکل دیگر، مربوط به پخت و پز است و زمانهایی که باید طول بکشد تا مرحله‌ی بعدی پختن را انجام دهم. برای این کار یک زمانسنج ویندوزی داونلود کردم که چندان ازش خوشم نیامد. این چند وقته، یا از این ساعت زنگی آنلاین استفاده می‌کرده‌ام یا زمان شروع هر مرحله را روی کاغذ می‌نوشته‌ام تا حواسم به کارم باشد.

لیست خریدها (چند بار رفته‌ام برای خرید یک چیز خاص، یادم نیامده چه می‌خواستم بخرم، کلی آت و آشغال اضافی خریده‌ام، برگشته‌ام و متوجه شده‌ام آن چیز ضروری بین لیست خریدهایم نیست!)، موعد پرداخت هزینه‌ی اینترنت، موعد اجاره‌خانه و … ! می‌دانید؟! من به یک گوشی موبایل احتیاج دارم، البته احتمالاً فقط به یک «گوشی» موبایل!

به هر حال، وبگردی درباره‌ی گوشیها را شروع کرده‌ام. این روزها صفحه‌های لمسی و جی.پی.اس متداول شده و من هم تقریباً مصمم هستم که -اگر خواستم بخرم- این بار یک گوشی حائز این قابلیتها و «سیستم‌عامل‌دار» بخرم، ترجیحاً ویندوزی، اما با بودجه‌ای که در نظر گرفته‌ام احتمالاً معقول‌ترین گزینه نوکیا ۵۸۰۰ اکسپرس میوزیک است که سیمبینی است. شاید هم بر وسوسه‌ی پرخرجم غلبه کردم و همان گوشی آب کشیده را فرستادم تعمیر، تا ببینم چه می‌شود.