در راستای نوشتهٔ پیشین، کاشیچینی (قابل دریافت از کافهبازار از اینجا) یک کار جدید است که آن را هم تا حدود زیادی بر مبنای همان کدهایی که برای برنامههای جدولی نوشته بودم آماده کردهام. این یکی بیشترین وقتی که صرفش شده زمانی بوده که صرف پیدا کردن تصاویر و آمادهسازی آنها شده.
یک بازی پازلی ساده است اما به نظرم به صورت بالقوّه میتواند فرصتی فراهم کند تا بیش از حد معمول در نقاشیهای کتابهای خطی دقیق شویم.
همهٔ این تصاویر را پیشتر خودم در گنجینهٔ گنجور برچسبگذاری کرده بودم (مشخص کرده بودم که در نسخههای خطی کدامشان تصویر دارند).
در حال حاضر هم همهٔ لینکهای «اصل نگاره» به همان گنجینهٔ گنجور میرسد.
پیشنیاز برنامهٔ اندرویدی این بود که بتوانم جدولها را به حالت متقاطع تولید کنم. باید جوابهای افقی و عمودی همدیگر را کامل میکردند. مطمئن نبودم که از پس تولید این جدولها به شکل خودکار بربیایم. برنامه را این طور نوشتم که با دریافت طرح هندسی جدول شروع به پر کردن تصادفی خانههای آن با جاخالیهای تصادفی از شعرها میکرد و سعی میکرد با جاخالیهای متناسب افقی و عمودی آن را کامل کند و هر کجا با توجه به دادههای موجود کار را غیرممکن میدید برمیگشت و کلمات را عوض میکرد.
همچنان که احتمالاً حدس میزنید نیاز به یک الگوریتم پیچیده داشت که از منی که همهٔ کارها رو پشت صفحهکلید و حسی انجام میدهم و علاقهای به از پیش محاسبه و فکر کردن ندارم بعید بود بربیاید.
البته شبیه این کارها را پیشتر زیاد انجام دادهام و همان حسی که پشت صفحهکلید دارم کمک کرده به نتیجه برسانمشان. نتایجی که ایدهآل و باعث افتخار نیستند ولی کار میکنند!
این هم همان شد. برنامهٔ تولید جدول را نوشتم که عملاً شبیه برنامههای بروتفورس (brute force) شکستن پسورد بود! طول میکشید اما کار میکرد. چند طرح هندسی که با بررسی آنها به این نتیجه رسیدم که به خروجی میرسد آماده کردم و لپتاپ قدیمیم را که حالا سالهاست به تلویزیون وصل است و با آن داخل یوتیوب میچرخم گذاشتم تا در ساعات عدم استفادهاش مشغول به تولید جدول باشد (طرحهای ایدهآل مجلهای جدولهای متقاطع که کل جدول با هم ارتباط دارند با این برنامه به نتیجه نمیرسیدند و از خیر آنها گذشتم).
بعد سراغ برنامهٔ اصلی یعنی همان بازی اندرویدی جدول شعر رفتم که آن هم برای خودش چالشهای زیادی داشت. نیاز به یک صفحهکلید اختصاصی داشتم و باید حل جدول را با استفاده از آن برای کاربر آسان میکردم.
علیرغم آن که آن کار را هم با ضرب و زور به نتیجه رساندم این روزها که نگاهش میکنم برای خودم باورکردنی نیست که من چنین کاری را آن هم بدون کمک گرفتن از کمپوننت و ابزار از پیشآماده انجام داده باشم.
اضافه کردن تبلیغش پایین نوشتههای اینجا از جمله معدود تغییراتی بود که طی این سالهای اخیر اینجا به خودش دیده (الان حذفش کردهام):
حدود یک هفته بعد از انتشار نسخهٔ اولیهٔ جدول شعر، جدول قرآن را منتشر کردهام. پس آن هم نباید کار زیادی برده باشد. اصل کار برای تولید جدولها و برنامهٔ اندرویدی پیشتر انجام شده بوده و من تنها نیاز به منبعی برای متن قرآن و تغییراتی در صفحهکلید و امکانات جانبی داشتهام. خبرگزاری ایکنا در مطلبی (احتمالاً بعد از ارسال ایمیلی از طرف خود من) این برنامه را معرفی کرده است.
جدول انگلیسی حدود ده روز بعد از جدول قرآن منتشر شده. آن هم مبتنی بر منبعی از جملات انگلیسی است و تغییراتی که نیاز داشته در حد چپچین کردن جدول و صفحهکلید و چیزهایی مثل آن بوده و البته یک دیکشنری انگلیسی به فارسی نیز برای تولید راهنماییهای آن استفاده شده.
نُه سالی میشود که اینجا چیزی ننوشتهام. دامنهٔ وبلاگ تغییر کرده (هزینهٔ گزیر دات کام زیاد بود و نگه داشتنش نمیصرفید و البته دوستتش نداشتم)، من عوض شدهام، سنم بالا رفته و خیلی اتفاقات دیگر افتاده. خوب بود یک سال دیگر هم صبر میکردم تا بعد از یک عدد رُند برمیگشتم!
به نظرم رسید که هر چیزی اینجا نوشتهام را بعداً راحت پیدا کردهام. اما چیزهایی که جاهای دیگر (فیسبوک مثلاً) نوشتهام بعداً دیگر پیدا نشدهاند. چند هفته پیش دنبال مطلبی بودم که تقریباً مطمئن بودم توی فیسبوک گنجور نوشته بودم (در مورد نسخهٔ تاجیکی گنجور)، پیدا نشد که نشد.
به نظرم رسید باید چیزهای مهم را اینجا بنویسم. چیزهای مهم؟ کارهایی که کردهام، چیزهایی که باید یادم باشند. اینجا تا کی هست؟ سعی میکنم تا وقتی که به آن چیزهای مهم نیاز دارم اینجا را سر پا نگه دارم.
گفتم که عوض شدهام! یکیش این که تنظیمات اینجا به طور پیشفرض روی استفاده از ویرایشگر متنی است. پیشتر حساس بودم و وسواس استاندارد بودن متن HTML را داشتم. الان دیگر فکر کنم حساس نیستم. وسواس ندارم. مدت طولانی است که بخشهای مختلف اینجا از کار افتادهاند و من وقعی به آن ننهادهام 😉 !
متنهایی را که خودم مینویسم دوست دارم! گاهی چند بار گاهی چند ده بار و گاهی چند صد بار میخوانمشان! این یکی از مشکلات نوشتن در اینجاست که این مزخرفاتی که در تولید آن به خودکفایی رسیدهام عامل تلف شدن وقت و عمر و زندگی خودم هم هستند. ولی چه ضرری دارد؟ آن وقتی را که نمیخواهم اینجا تلف کنم جای دیگری تلف میکنم با بهرهوری پایینتر و تولیدات نامرغوبتر!
به هر حال نوشتم که بنویسم برگشتهام! ببینم تا کی هستم!
یک وقتی «ابزاری» وجود داشت «برای بریدن تکههای مهم» 😉 به اسم کلیپمارکس نقطه کام که بعدها توسط شرکت کمی بزرگتری خریداری شد و اسمش شد کلیپبورد نقطه کام که آن هم اخیراً اعلام کرده که توسط شرکت بسیار بزرگتری به اسم سیلزفورس خریداری شده و طبق رسم متداول اینجور ابزارها و سرویسها، وقتی چنین اتفاقی برایشان میافتد -بر خلاف استنباط اولیه مبنی بر بهبود چشمگیر و گسترده شدن امکانات با تکیه بر توان مالی صاحب آن- در حال انهدام کامل است و اعلام کرده که بیایید و اگر میخواهید اطلاعاتتان را بردارید که ما داریم جمع میکنیم، برویم.
خلاصه آن که ما هم رفتیم و آنچه آنجا کاشته و انباشته بودیم درویدیم و در این نشانی جایش دادیم. هر چند منابع خیلی از کلیپها گم شدهاند اما باز هم -اگر به دنبال تکههایی جالب و سرگرمکننده از اینترنت زمان پیرمردها- میگردید، چند دقیقهای میتواند سرگرمتان کند.
سالی که گذشت همانند سال قبلش بیشتر برای من به کار -در محل کار 😉 – گذشت:
و همانند سال قبلش نه فرصت چندانی برای فعالیتهای مربوط به گنجور و طرحهایی که حالا شاید بشود گفت سالهاست در ذهن دارم فراهم شد و نه البته به لحاظ موقعیت جغرافیایی و مشکلات مخابراتی و … امکان دسترسی دائم به اینترنت برای صرف کردن اوقات فراغت به اینجور برنامهها. در حال حاضر بعد از دو سال صندوق پستی گنجور پر است از کلی ایمیل پاسخ داده نشده و عمدتاً ستاره زده شده و … اما باز هم در این سال در گنجور بیشتر از سایر جاهای غیرکاری فعال بودم (بایگانی تازههای گنجور در سال ۹۱)
با این حال، با توجه به آن که کارهایم در محیط کاری به نظر خودم بسیار مؤثر و مفید بودند و با اطمینان میتوانم بگویم که از لحاظ حجم کاری دو یا شاید سه برابر آن ظرفیتی که از خودم انتظار داشتم کار کردم سالی که گذشت را یکی از پربارترین سالهای زندگیم میدانم.
The only downer for Peter Schnautz is the non-participation of the Iranian partner Hoda Systems: “Throughout history vibrant trade relations were often the driving force for political changes – why should it not occur on this occasion?” remarks Peter Schnautz and continues: “technologically this is a great loss. Hoda Systems is one of the few suppliers in the market that offers a premiere ICR engine for Arabic characters. ”
این از آن نوشتههای خودمحورانهٔ خستهکنندهایست که احتمالاً باعث میشود دوستانی آنقدر عصبی شوند تا جهت تخلیهٔ انبار باروت درونشان، به زحمت ارسال ایمیلهای تقبیحی و تنبیهی بیفتند! لذا توصیه میکنم -با توجه به اخطار روی جنبهٔ شخصی داشتنش، اگر متحمل این دسته از فشارها میشوید- از خواندن ادامهٔ مطلب خودداری کنید! اما قبل از ارائهٔ قسمت خستهکننده اشاره کنم که تصور میکنم حافظهٔ طولانیمدت خیلی خوبی ندارم به طوری که اگر شواهد کافی وجود نداشت من احتمالاً جزء منکرین زندگی پیش از هفت سالگی میبودم! با این حال یکی از عادتهای سالهای اخیرم که جمعآوری و بایگانی تقریباً همه گونه آت و آشغال دیجیتالی از فایل متنی گرفته تا عکس و فیلم و برنامهٔ کامپیوتری تولید شده توسط خودم بوده تا حدودی به بازیابی قسمتهای حذف شدهٔ بایگانی ذهنم کمک کرده. گاهی مرور این بایگانیها باعث میشود به کشف اتفاقات محو شدهای از زندگیم نائل شوم! سیدیهایی که عموماً برچسبهای بامسمایی هم دارند:
در هر حال، دیروز، برف ناگهانی باعث شد تا تصمیم بگیرم قید سر کار رفتن را -به هوای زحمت احتمالی مسیر طولانی برگشت- بزنم و در عوض، چرخی بین این انبارهای زباله بزنم! حاصل آن چرخ زدنها یافتههاییست که حدس میزنم قابل تحملترینشان این تصویر متحرک باشد:
اما غیر از آن، عمدهٔ چرخهایم را بین سیدیهایی زدم که خروجیهای کارهایم در شرکت گاز روی آنها قرار داشت. کارهایی که از طراحی پاورپوینتهای مناسبتی گرفته تا طراحی صفحات وب اینترانت و اینترنت شرکت و نهایتاً برنامهنویسیهای پراکنده را در بر میگرفت. اینها تصاویر تکههایی از آن کارها هستند -که همچنان که اشاره کردم- به منظور استفادهٔ شخصی و زنده کردن یا خلق مجدد خاطرات در اینجا منتشرشان میکنم.
یک اصل یا قاعده یا توصیهٔ برنامهنویسی هست که علی رغم آن که عموماً جماعت برنامهنویس با آن آشنایی دارند -به نظرم- التزام به پیروی از آن موجب رستگاری همگان در همهٔ کارها خواهد شد ;).
این اصل که به طور خلاصه «DRY» خوانده میشود (و متضاد آن «WET» است! ؛ اولی مخفف Don’t Repeat Yourself و دومی مخفف Write Everything Twice) به طور ساده (به زبان برنامهنویسان) میگوید هر قسمتی از کدِ برنامه که ممکن است لازم باشد در جای دیگری مجدداً استفاده شود؛ لازم است به جای تکرار، به شکل یک کد قابل استفادهٔ مجدد (تابع، کلاس و …) درآید و هر جا لازم شد فراخوانی شود. البته این اصل تعریف پیچیدهتر و دقیقتری هم دارد که درکش مستلزم سوزاندن فسفر بیشتری است: «هر بخشی از دانش در یک سیستم باید یک نمایش یکتا، غیر مبهم و معتبر داشته باشد».
برنامهنویسان نمود کارایی این قاعده را عموماً در رفع ایراد برنامهها مشاهده میکنند: جاهایی که عدم رعایت این توصیه باعث شده بخشهایی از کد -جا به جا- به جای تبدیل به یک تابع و فراخوانی تکراری، به طور کامل کپی شده و حالا مشخص شده که آن بخش از کد ایراد دارد. اگر کار به قاعده انجام شده باشد -کسی خودش را تکرار نکرده باشد- رفع ایراد یا بهینهسازی یک قسمت از کد مشکل را حل میکند، اما وای به حال وقتی که کد؛ مکرراً کپی شده و تازه احیاناً در کپیهای مجدد در هر جا -بنا به مقتضیات- تغییرات مختصر یا مفصلی هم کرده باشد: اگر برنامهنویس خطاکار خود شما بوده باشید که تاوان عمل نکردن به این توصیه را با صرف وقتتان خواهید پرداخت، اما اگر کس دیگری قرار باشد خطای شما را تصحیح کند چه؟ لبخند میزنید؟! دلتان از شدت بدجنسی ضعف میرود؟! توصیه میکنم شما علاوه بر این توصیه، توصیهٔ مفیدتری را هم آویزهٔ گوشتان داشته باشید که ممکن است روزی جانتان را نجات دهد:
همیشه طوری کدنویسی کن که انگار کسی که قرار است کد تو را نگهداری کند یک قاتل زنجیرهای روانی است که نشانی خانهات را میداند!
بگذریم! این که خواندید مقدمهٔ صحبتم بود. اصل مطلب این که به نظرم یکی از جاهایی که پیروی از DRY شدیداً میتواند از هدررفت تکراری وقتها جلوگیری کند آنجاست که شما یک پروژهٔ بازمتن یا سایت یا وبلاگ عامالمنفعه و مانند آن روی اینترنت دارید و خود را تا حد امکان متعهد به پشتیبانی از آن با پاسخگویی سؤالات مخاطبانتان میدانید. DRY زمانی نمود و کاربرد پیدا میکند که مخاطبانتان سؤالات یا درخواستهای تکراری دارند و شما مجبورید به طور عادی یک جواب خاص را برایشان تکرار کنید. یکی از راهحلهای این مسأله که میتواند به شما کمک کند کمتر خودتان را تکرار کنید آن است که پاسخ این سؤالات را در صفحاتی روی وب نگهداری کنید و در پاسخ هر سؤال تکراری، به جای نوشتن پاسخ مفصل، مخاطب را به صفحهٔ پاسخ ارجاع دهید.
شأن نزول این مطلب آن بود که خود من مدتها است که دارم تاوان عمل نکردن به این قاعده را برای خطای متداولی روی گنجور رومیزی میپردازم:
مسأله آن است که در اغلب این موارد، زمانی که برای جلوگیری از تکرار باید صرف شود بسیار کمتر از زمانی است که برای انشا و ارسال جواب تکراری برای تک تک مخاطبان صرف میشود. خاتمه آن که، امروز وقت گذاشتم و پاسخ متداول را جایی در دسترس گذاشتم. دعای آخر مجلس آن که کاش در جیمیل میشد فیلتری تعریف کرد که در مواجهه با ایمیل حاوی کلمات تکراری (برای من استثنای برنامهنویسی System.BadImageFormatException)، به طور خودکار ایمیل از پیش تعیین شدهای را ارسال کند (که در نمونهٔ من ایمیلی حاوی لینک به این صفحه میشود).