شرح یک تجربه: سیانوژن روی گوشی LG Optimus 4X

مدتی (شاید بیشتر از یک سال و نیم پیش) است که از یک گوشی اندروییدی ال جی اپتیموس 4X -که با نام LG P880 هم شناخته می‌شود- برای مرور وب، چک ایمیل و کارهایی مثل این استفاده می‌کنم (و عملاً هیچگاه از آن به طور جدی برای کاربرد اصلی آن یعنی تلفن زدن استفاده نکرده‌ام). این گوشی ویژگیهای خوبی دارد از جمله پردازندهٔ چهار هسته‌ای (که البته مثل بیشتر چند هسته‌ای‌ها در بازیها و برنامه‌های سنگین پشتش داغ می‌شود)، یک گیگابایت رم، ۱۶ گیگابایت با ۱۲ گیگابایت قابل استفاده فضای ذخیره‌سازی با قابلیت نصب حافظهٔ خارجی، دوربین و صفحهٔ نمایش با کیفیت مطلوب و البته نقاط ضعفی هم دارد: از جمله مصرف باتری بالا که طرفداران گوشیهای شارژنگه‌دار را راضی نمی‌کند و صدای پخش موسیقیِ نه چندان راضی کننده. خلاصه آن که در انجام آنچه من از آن انتظار داشته‌ام کاملاً موفق عمل کرده، ضمن آن که نرم‌افزار و رابط کاربری آن در مقایسه با نمونه‌های دیگری که دیده‌ام فوق‌العاده است. ساده، در عین حال زیبا، سریع و تعداد نرم‌افزارهای اضافی از پیش نصب شده و مزاحم آن به نسبت نمونه‌های مشابه کم است. ضمناً رابط کاربری خود گوشی و نرم‌افزارهای مخصوص کامپیوترش با کیفیت بالایی به فارسی ترجمه شده و از لحاظ پشتیبانی از زبان فارسی (جدای از پشتیبانی ضعیف از تاریخ شمسی) من به شخصه نمرهٔ عالی به آن می‌دهم.

آن روزگاری که من به صرافت خرید یک گوشی اندروییدی افتادم حقیقتاً دنبال یک «گوشی تلفن» نبودم. نوکیای ۵۸۰۰م هنوز هم علی‌رغم خم شدن پین شارژر و آسیبهای بدنه و … گوشی تلفن اصلی من است و این پاره آجر خوش‌ساخت -که در مواقع اضطرار به اندازهٔ کافی هوشمند هم هست- از لحاظ اندازه و قابلیتهای اولیه به نظرم خیلی مناسب‌تر و پایدارتر از گوشی ال جی برای کاربری به عنوان یک گوشی تلفن است. من آن موقع، در پی آماده کردن یک نسخهٔ اولیه از گنجور اندروید بودم و دوست داشتم یک دستگاه اندروییدی سطح بالا برای آزمایش همیشه دم دستم باشد. انتخابهای سطح بالای آن روزها محدود به HTC One X، سامسونگ گلکسی اس ۳ و همین گوشی می‌شد. تولیدات سامسونگ را به دلیل مسخره‌ای همیشه از انتخابهایم خارج کرده‌ام و آن حس بدی است که نسبت به لوگوی SAMSUNG دارم! احساس می‌کنم زشت است و حضورش را -مخصوصاٌ همیشه جلوی چشم- تحمل نمی‌توانم بکنم! در مورد HTC فاکتور قیمت و البته سابقه‌ای که در رضایت از خرید دو گوشی دیگر ال جی داشتم باعث شد آن را کنار بگذارم. اپتیموس را با قیمتی حدود یک میلیون و صد هزار تومان خریدم و فکر می‌کنم با توجه به کاهش قیمت آن در این روزها -اگر نگرانی از بابت عدم ارائهٔ آخرین به‌روزرسانی اندرویید برای آن نداشته باشید و راضی باشید تا ابد با لوبیا ژله‌ای سدّ جوع کنید ;)- هنوز هم انتخاب مناسبی می‌تواند باشد مخصوصاً برای آنها که مثل من دنبال یک «گوشی تلفن» نیستند. البته من بعدها به این نتیجه رسیدم که یک تبلت با صفحهٔ بزرگ و حدود ۱۰ اینچ می‌توانست برای کاربردهای مد نظر مفیدتر باشد با این حال فکر می‌کنم انتخاب فعلیم هم انتخاب بدی نبوده.

بگذریم، همچنان که اشاره کردم بعد از آخرین بروزرسانی به نسخهٔ ۴.۱.۲ اندرویید، مدتهاست که بروزرسانی جدیدی برای این گوشی عرضه نشده و جسته و گریخته در اینترنت اگر بگردید صحبت این هست که این گوشی بروزرسانی رسمی جدیدتری نخواهد داشت.

مشخصات آخرین نرم‌افزار اپتیموس فور ایکس

این است که دیر یا زود اگر بخواهید از برنامه‌هایی روی این گوشی استفاده کنید که از قابلیتهای نسخه‌های جدیدتر اندرویید استفاده می‌کنند باید فکر دیگری بکنید. آنچه در این نوشته به شرح آن می‌پردازم حاصل تجربه‌ایست که من در تغییر سیستم عامل یا درست‌تر بگویم رام این گوشی به آخرین نسخه‌های سیانوژن با اندروید ۴.۴ داشتم. حقیقت این است که من بعد از رفتن این راه دراز از حاصل راضی نشدم و دوباره گوشی را به رام کارخانه‌ای برگرداندم . اما می‌دانم که روزی دورتر باید دوباره همین راه را بروم لذا هم برای آن که راهنمایی باشم برای خودم و در آینده و عمر در تکرار تجربه هدر ندهم و هم برای آن که راهنمایی باشم برای دیگرانی که قصد رفتن این راه را -نرفته- دارند تصمیم گرفتم شرح این تجربه را اینجا بنویسم. اما پیش از آن توجهتان را به چند هشدار و زینهار جلب می‌کنم:

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

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

ادامه خواندن “شرح یک تجربه: سیانوژن روی گوشی LG Optimus 4X”

رابط برنامه‌نویسی گنجور رومیزی – بخش دوم

در ادامهٔ بحث نوشتهٔ پیشین در این نوشته به عنوان یک نمونهٔ عملی از نحوهٔ استفاده از رابط برنامه‌نویسی گنجور رومیزی، من قسمتی از یک فایل docx در دسترس از طریق سایت تصوف ایران -مربوط به اشعار وحدت کرمانشاهی- را به کمک تکه کدی که شرح آن در ادامه می‌آید به قالب گنجور رومیزی تبدیل کرده‌ام (اصل فایل اینجاست، من آن را دریافت کرده‌ام، با کمک ورد ۲۰۰۷ با پسوند docx ذخیره کرده و آن را در فایل زیپ پروژهٔ مربوط به این مطلب -قابل دریافت از این نشانی– گنجانده‌ام، به‌روزآوری: پروژهٔ به‌روز شده را می‌توانید از گیتهاب دریافت کنید، از اینجا).

برای انجام این کار باید علاوه بر ویژوال استودیو (با امکان برنامه‌نویسی برای سکوی ‎.NET ویرایش ۳.۵ یا ۴) کتابخانهٔ برنامه‌نویسی OpenXML را نیز نصب داشته باشید. این کتابخانه را از این صفحه دریافت و نصب کنید (OpenXMLSDKv2.msi با حجم کمتر از ۴ مگابایت برای مقصود مورد نظر ما کافیست، البته پیش‌نیاز نصب این کتابخانه سکوی ‎.NET ویرایش ۳.۵ با سرویس پک ۱ است).

پس از نصب کتابخانهٔ یاد شده و ایجاد پروژه، ارجاع متناظر با آن را به فهرست ارجاعهای پروژه اضافه می‌کنیم تا فضاهای نام مورد نیاز در دسترس قرار گیرند.

ارجاعهای لازم برای دستیابی به کتابخانهٔ OpenXML شامل DocumentFormat.OpenXml و WindowsBase است

برای پیاده‌سازی تبدیل مورد نظر لازم است الگوی تایپ فایل ورودی را استخراج کنیم. با بررسی ظاهر فایل ورودی الگوی عمومی زیر را مشاهده می‌کنیم:

سلولهای جدول حاوی متن اشعار در فایل ورودی مورد نظر

بنابراین در ترتیب معمول بازخوانی محتوای این فایل (چگونه فایل تایپ شده): هر مصرع در تمام سلولهای حاوی متن از مصرعهای دیگر با یک break جدا شده است. محتوای سلول اول جدول (۱)، مربوط به مصرعهای اول ابیات است، بعد از این سلول، سلولی خالی داریم (۲)، محتوای سلول بعدی (۳) مربوط به مصرعهای دوم ابیات است، بعد یک سلول خالی (۴) (استثنایی وجود دارد که توضیح می‌دهم)، بعد سلولی شامل دو مصرع متوالی که مربوط به بیت تخلص شاعر است (۵) و پس از آن تا شعر بعدی یک سلول خالی دیگر داریم (۶).

پس ما در هنگام تبدیل فایل ورودی در هر لحظه انتظار یکی از سه نوع سلول جدول مصرعهای سمت راست، چپ یا وسط را می‌کشیم:

ادامه خواندن “رابط برنامه‌نویسی گنجور رومیزی – بخش دوم”

رابط برنامه‌نویسی گنجور رومیزی – بخش اول

یکی از نکاتی که شاید به کار برنامه‌نویسانی بیاید که دوست دارند در گسترش دامنهٔ داده‌های گنجور با استفاده از گنجور رومیزی مشارکت کنند این است که بدانند تنها راه تبدیل منابع اینترنتی یا فایلهای موجود به فرمت گنجور رومیزی کپی دستی اشعار از این منابع در ویرایشگر گنجور رومیزی نیست و می‌توان با استفاده از ‎C#‎ یا هر یک از دیگر زبانهای ‎.NET تقریباً به آسانی فایلهای مناسب برای نمایش در گنجور رومیزی را ساخت.

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

مقدمهٔ کار در ویژوال استودیو، اضافه کردن یک ارجاع به اسمبلی ganjoor.exe است (فایل اجرایی گنجور رومیزی که در مسیر نصب برنامه قرار دارد) تا فضای نام ganjoor در برنامه در دسترس قرار گیرد.*

اضافه کردن ارجاع در ویژوال استودیو
ارجاع به اسمبلی گنجور رومیزی در ویژوال استودیو
[code lang=”c#”]
using ganjoor;
[/code]

پس از این کار به کلاس اصلی مدیریت داده‌ها در گنجور رومیزی که DbBrowser نام دارد دسترسی داریم. تکه‌کد زیر -که به نظرم به اندازهٔ کافی گویاست- نشان می‌دهد که چگونه می‌توان با استفاده از این کلاس (و کلاسهای جانبی فضای نام ganjoor که اطلاعات داده‌ها را در خود دارند) یک فایل سادهٔ gdb یا s3db ساخت که گنجور رومیزی توانایی نمایش اطلاعات آن را دارد:

ادامه خواندن “رابط برنامه‌نویسی گنجور رومیزی – بخش اول”

برنامه‌نویسی با C++‎ آسان است؟!

البته که نه! برنامه‌نویسی با C#‎ و به کمک سکوی ‎.NET آسان‌تر است. بحث اینجا البته نه C++‎ است نه C#‎، نه سکوی ‎.NET و نه حتی برنامه‌نویسی.

خواستم نکته‌ای را که مدتی پیش یاد گرفته‌ام به شما هم یاد بدهم. سعی کنید عنوان این مطلب را در Notepad ویندوز تایپ کنید. ابتدا آن را راست به چپ کنید و تایپ کنید «برنامه‌نویسی با C++‎ آسان است.» چه اتفاقی می‌افتد؟

جهت C++‎ در جملهٔ تایپ شده درست نیست

چرا این اتفاق می‌افتد؟ آیا این ایراد نرم‌افزاری نوت‌پد است؟ من چنین تصوری داشتم و مطلب را در انجمن رایانش فارسی سؤال کردم (اینجا). پاسخ آن است که خیر این یک ایراد نیست. بر طبق الگوریتم دوسونویسی استاندارد یونیکد (UBA) نویسههایی مانند + و # کم‌توان محسوب می‌شوند و جهت آنها در متن توسط نویسهٔ پرتوان بعدی آنها تعیین می‌شود. به همین جهت اضافه کردن یک نویسهٔ پرتوان استاندارد غیرقابل مشاهده مثل نویسهٔ LRM (Left-to-Right Mark)‎ (قابل تایپ توسط Ctrl+Shift+3 در صفحه‌کلید استاندارد ویندوز در حالتی که صفحه‌کلید فارسی است) مشکل را حل می‌کند (برنامه‌نویسی با C++<LRM>‎ آسان است).

جهت C++‎ به کمک نویسهٔ LRM بعد از آن درست شده است.

نظیر همین مشکل برای تایپ «سکوی ‎.NET» وجود دارد، در این مورد باید نویسهٔ کنترلی را پیش از نقطه گذاشت. البته من راجع به دلیلش مطمئن نیستم. طبق چیزی که بالا نقل کردم باید نویسهٔ بعدی نقطه جهت را چپ به راست می‌کرد، اما این گونه نمی‌شود و نیاز است قبل از آن نویسهٔ کنترلی بگذاریم. احتمالاً دلیلش با بررسی مستندات UBA مشخص می‌شود. اگر از دوستان کسی دلیلش را می‌داند بنویسد (بعدنوشت: جوابش را آقای سید رضی داد: اینجا).

علاوه بر این از نویسه‌های کنترلی LRM و RLM برای تایپ ممیزهای بین اعداد تاریخ طوری که در مرورگرهای مختلف متن نهایی یکسان دیده شود می‌توان استفاده کرد. گویا مایکروسافت ورد این نویسه‌ها را به صورت خودکار در جای لازم درج می‌کند و به همین دلیل کسانی که با ورد تایپ می‌کنند احتمالاً این مشکل را زیاد مشاهده نکرده‌اند.

دنبالهٔ ۱

پیرو بحث پاراگراف اول دربارهٔ تقابل C++‎ و C#‎، بارها دوستان تقاضا کرده‌اند گنجور رومیزی را روی لینوکس یا مک‌اوس بتوانند اجرا کنند. من پیشتر دنبال راه حلهایی مانند مونو بودم (اینجا را ببینید) که به نتیجه نرسید. با ویرایشهای جدیدتر مونو حتی در حد همان دلخوشکنک ابتدایی نمایش پنجرهٔ برنامه هم، برنامه اجرا نمی‌شود. آقای سیدرضی علوی‌زاده در حال تهیهٔ برنامه‌ای سازگار با پایگاه داده‌های گنجور رومیزی با استفاده از Qt هستند که تحت سه سیستم عامل ویندوز، لینوکس و مک اجرا می‌شود. اطلاعات بیشتر راجع به «ساغر» را اینجا بخوانید و تصاویری از آن را ببینید.

دنبالهٔ ۲

از آنجا که حدس می‌زنم عنوان نوشته اغواگر جستجوگران اینترنتی «C++‎ آسان» باشد سایت پی‌سی‌کدنویس را به این دسته از مشتریان نوشته توصیه می‌کنم.

دنبالهٔ ۳

در راستای دنبالهٔ ۱ و بر اساس دلایلی که در اینجا راجع به آن صحبت کرده‌ام صفحهٔ فیس‌بوک گنجور را راه‌اندازی کرده‌ام (http://www.facebook.com/ganjoor). اگر اهل فیس‌بوک هستید و به گنجور علاقه دارید سری به آن بزنید و آن را به دوستانتان بشناسانید.

صفحهٔ گنجور در فیس‌بوک

دنبالهٔ ۴

این نوشته را تقدیم می‌کنم به شیخنا.

شاید به وقتش به فکر شما هم نرسد

۱

چند روز پیش تصمیم داشتم از سرور گنجور بک‌آپ بگیرم تا پس از تغییر احتمالی بستهٔ میزبانی بک‌آپ گرفته شده را روی آن بازگردانم. روی سرور گنجور دسترسی SSH دارم و به همین دلیل می‌توانم به سرعت از دیتابیسهای سایت بک‌آپ تهیه کنم و بک‌آپها را به همراه فایلهای موجود روی سرور را فشرده کنم و نهایتاً مجموعهٔ بک‌آپها را در قالب یک فایل دریافت کنم.

مشکل اینجا بود که حجم نهایی فایل بک‌آپ زیاد شد و این شد که مجبور شدم یک شب تا صبح کامپیوترم را برای دریافت این فایل روشن بگذارم.

راه حل بهتر -به جای دریافت یک فایل چند صد مگابایتی- صبح روز داونلود به ذهنم رسید: وقتی که هنوز چند ده مگابایتی از فایل مذکور مانده بود. من روی گزیر هم یک بستهٔ میزبانی جدا دارم. می‌توانستم به جای داونلود این فایل عظیم روی کامپیوتر خودم و احتمالاً علافی چند ساعتهٔ آتی برای آپلودش آن را از طریق خط فرمان SSH و دستور ftp به سرور گزیر منتقل کنم و بعداً هم با امکانی مشابه آن را به محل نهایی منتقل کنم. کاری که به کمک ارتباط ِ -اگر درست یادم مانده باشد- ۷۵۰ کیوبایت بر ثانیه‌ای دو میزبان در کمتر از یک دقیقه به انجام رسید!

۲

مشکلی که در داونلودهای بزرگ گاهی وجود دارد قطع ارتباط اینترنت است. من همچنانکه پیشتر اشاره کرده‌ام در حال حاضر از اینترنت ADSL داتک استفاده می‌کنم و پیش از آن از آسیاتک (یکی از مشکلاتم هم با داتک همین قطعیهای ناگهانی است که البته بلافاصله بعد از قطعی می‌شود دوباره وصل شد و نیازی به تماس با بخش پشتیبانی نیست، یک بار قضیه را به پشتیبانی داتک گفتم گفتند مشکل از مودم من است که مودم خوبی نیست!). برای حل این مشکل، آن وقتها که آسیاتک داشتم یک فایل بچ درست کرده بودم که در آن به کمک دستور rasdial ویندوز؛ ارتباط را شماره‌گیری می‌کردم و این فایل بچ را در اسکجولر ویندوز گذاشته بودم هر نیم ساعت یا یک ساعت یک بار اجرا شود و قطعی ارتباطهای احتمالی را در زمانی که من پشت کامپیوتر نیستم رفع کند. اما برای داتک این روش درست کار نمی‌کرد، چرا که در پیکربندی داتک تلاشهای متوالی برای اتصال مجدد با یک نام کاربری و گذرواژه وقتی که هنوز قطع نشده‌اید در نهایت باعث قفل شدن حساب کاربری می‌شد. راه حل دم دستی این می‌توانست باشد که پیش از شماره‌گیری به کمک سوییچ disconnect دستور rasdial اتصال موجود را قطع کنم، مدتی منتظر بمانم و سپس دوباره شماره‌گیری کنم. مشکل اینجاست که خط فرمان استاندارد ویندوز دستوری برای sleep ندارد، جستجوی مختصری کردم و متوجه شدم که با استفاده از سوییچهای دستور پینگ می‌شود وقفهٔ چندثانیه‌ای ایجاد کرد. این بچ‌فایل جدید همان کاری را که من نیاز دارم انجام می‌دهد که ممکن است برای شما مفید باشد:

rasdial datak /disconnect

ping 127.0.0.1 -n 10 -w 1000 > nul

rasdial datak username password

هر چند به نظرم باید راهکار استانداردی برای اطلاع از قطع اتصال وجود داشته باشد تا نیاز نباشد اتصال موجود را قطع کنیم. شما چنین راهکاری سراغ ندارید؟

فایرفاکس جدید، اپراهای موبایل و …

فایرفاکس ۳.۶ خیلی وقت است که آمده، ولی من همین یکی دو روز پیش نصبش کرده‌ام. با نصب (در واقع ارتقا به) این ویرایش، بعضی افزونه‌های ناسازگارم از کار افتادند. راه حلی که برای ویرایشهای قدیمی‌تر این مشکل را حل می‌کرد برای این ویرایش با کمی تغییر کار می‌کند: کافیست در about:config کلیدی با نام extensions.checkCompatibility.3.6 ایجاد کنید و مقدار آن را false بگذارید (دستورالعمل این کار مطابق همان روش قدیمی است که می‌توانید آن را اینجا بازخوانی کنید).

ادامه خواندن “فایرفاکس جدید، اپراهای موبایل و …”

نوار لغزان با لغزندگی پایین

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

اما «چطورش» شاید به درد برنامه‌نویسهای (احتمالاً تازه‌کار یا کم‌سواد مثل خودم) ویندوز فرمز بخورد (چون راه حلش را با جستجو پیدا نکردم): کنترل اصلی گنجور رومیزی یک User Control ساده است که نشانی شعرها یا دسته‌های شعرها و همینطور شماره بیتها با استفاده از کنترلهای LinkLabel و مصرعها با استفاده از یک کنترل مشتق از Label روی آن تعبیه شده و ویژگی AutoScroll آن فعال است. به این ترتیب، با توجه به جای پایین‌ترین و سمت چپ‌ترین کنترل، نوارهای لغزندهٔ آن به طور خودکار ظاهر می‌شوند. من برای این که بتوانم کلیدهای جهتی را برای حرکت دادن نوارهای لغزان دریافت کنم رویداد PreviewKeyDown را برای این کنترل به صورت زیر نوشتم:

[code lang=”c#”]
private void GanjoorViewer_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
bool isInputKey = true;
switch (e.KeyCode)
{
case Keys.Down:
if (VerticalScroll.Value + VerticalScroll.SmallChange <= VerticalScroll.Maximum) VerticalScroll.Value += VerticalScroll.SmallChange; break; case Keys.Up: if (VerticalScroll.Value - VerticalScroll.SmallChange >= VerticalScroll.Minimum)
VerticalScroll.Value -= VerticalScroll.SmallChange;
break;
case Keys.PageDown:
for(int i=0; i<2; i++)//!? if (VerticalScroll.Value + VerticalScroll.LargeChange <= VerticalScroll.Maximum) VerticalScroll.Value += VerticalScroll.LargeChange; else VerticalScroll.Value = VerticalScroll.Maximum; break; case Keys.PageUp: for (int i = 0; i < 2; i++)//!? if (VerticalScroll.Value - VerticalScroll.LargeChange >= VerticalScroll.Minimum)
VerticalScroll.Value -= VerticalScroll.LargeChange;
else
VerticalScroll.Value = VerticalScroll.Minimum;
break;
case Keys.Right:
if (HorizontalScroll.Value + HorizontalScroll.SmallChange <= HorizontalScroll.Maximum) HorizontalScroll.Value += HorizontalScroll.SmallChange; break; case Keys.Left: if (HorizontalScroll.Value - HorizontalScroll.SmallChange >= HorizontalScroll.Minimum)
HorizontalScroll.Value -= HorizontalScroll.SmallChange;
break;
default:
isInputKey = false;
break;
}
if (isInputKey)
e.IsInputKey = true;
}
[/code]

در مورد حلقهٔ دوتایی کلیدهای PageDown و PageUp، دلیلش را نمی‌دانم ولی بدون اصرار 😉 کار نمی‌کرد! بعد این رویداد را علاوه بر UserControl اصلی، همه جا، پس از ایجاد و اضافه کردن زیرکنترلهایش به آنها هم نسبت دادم:

[code lang=”c#”]
private void AssignPreviewKeyDownEventToControls()
{
foreach (Control ctl in this.Controls)
ctl.PreviewKeyDown += GanjoorViewer_PreviewKeyDown;
}
[/code]

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

نیم‌فاصله‌ی غلط / نیم‌فاصله‌ی درست

من تا یکی دو سال پیش برای تایپ نیم‌فاصله در ویندوز ایکس‌پی Alt را نگه می‌داشتم و اعداد ۰۱۵۷ را تایپ می‌کردم. بعداً از یکی از دوستان میانبر بهتری یاد گرفتم که سریع‌تر و بهتر به نظر می‌رسید (Ctrl+Shift+4). پیش‌تر متوجه شده بودم که در بعضی از متون نیم‌فاصله‌هایی هست که با این نیم‌فاصله فرق دارند (در پنجره‌ی جستجو نیم‌فاصله‌ی خودم را تایپ می‌کردم، آن نیم‌فاصله‌ها را پیدا نمی‌کرد). همین چند روز پیش متوجه شدم که با کلید ترکیبی Ctrl+Shift+2 هم می‌شود نیم‌فاصله تایپ کرد و اتفاقاً نیم‌فاصله‌ی درست و اصلی همین است نه آن.

گفتم بنویسم تا اگر شما هم با Ctrl+Shift+4 نیم‌فاصله تایپ می‌کنید بدانید که اشتباه است و باید با Ctrl+Shift+2 تایپش کنید. همین!

ماشینهای صاحب‏نظر

قلمرو ناخواسته‌های دنیای اینترنت محدود به نامه‌های الکترونیکی و هرزنامه‌ها نیست. هر نوع فرم الکترونیکی که از طریق سایتهای اینترنتی در دسترس قرار می‌گیرد در معرض حمله‌ی روباتها و برنامه‌های کامپیوتری است. این برنامه‌ها با اهداف مختلف تلاش می‌کنند این فرمها را پر کنند و معمولاً حاصل این تلاشها انبوهی از نظرات هرز در وبلاگها، از کار افتادن کامپیوترهای میزبان سایتهای اینترنتی و انواع پیامدهای ناخوشایند دیگر است.

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

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

در نوشته‌ی بعدی به بعضی روشهای مقابله با اسپم در قلمرو فرمهای الکترونیکی اشاره خواهم کرد.

فهرست سری نوشته‌های من درباره‌ی هرزنامه‌ها:

قسمت اول: ریشه‌ی نام اسپم

قسمت دوم: هرزنامه‌ها

قسمت سوم: کدامیک هرزنامه‌های بیشتری می‌گیرند: «علی» یا «زهرا»؟

قسمت چهارم: بگذارید «اسپم»ها را آنها بخورند!

قسمت پنجم: درآمدزایی هرزنامه‌ها

قسمت ششم: ماشینهای صاحب‌نظر

قسمت هفتم: کپچا: «تو آدمی؟!»

قسمت هشتم: او.سی.آر: قاتل کپچای تصویر متن

قسمت نهم: صنعت حل کپچای هند و راه‌حلهای مقابله با اسپم با تکیه بر تحلیل محتوی

بگذارید «اسپم»ها را آنها بخورند!

تولید فهرستهای تقریباً تصادفی از آدرسهای ایمیل -آن طور که در نوشته‌ی قبلی به آن اشاره کردم- هزینه‌ی کاری و زمانی بالایی دارد و با توجه به آن که فقط درصدی از نشانیهای تولید شده معتبر هستند برای هرزنامه‌نگاران کوچک راه‌حل چندان به‌صرفه و مفیدی نیست (البته، هرزنامه‌نگاران با یک ارسال آزمایشی و بررسی پاسخ دریافتی از سرورهای پست الکترونیکی، می‌توانند ایمیلهای معتبر را غربال کنند و فهرست خودشان را بهبود دهند، ولی این کار هم هزینه‌ی پردازشی بالایی دارد). راه حل بهتر، استفاده از فهرستهای ایمیلهای واقعی است. اما این فهرستها چگونه پر می‌شوند و اطلاعات آنها چگونه جمع‌آوری می‌شود؟ هرزنامه‌نگاران برنامه‌های کاربردی زیادی در اختیار دارند که به کمک آنها می‌توانند فهرستهای خودشان را با ایمیلهای واقعی پر کنند. آنها برنامه‌هایی در اختیار دارند که همانند رباتهای موتورهای جستجو به صفحات وب سرکشی می‌کنند و در آنها دنبال رشته‌هایی با الگوی نشانی پست الکترونیکی (نام@دامنه.پسوند دامنه) می‌گردند. پس یکی از اولین و بهترین راهها برای جلوگیری از اضافه شدن ایمیلتان به این فهرستها آن است که آن را در صفحات عمومی وب در اختیار بقیه نگذارید. سعی کنید به جای وارد کردن نشانی ایمیلتان در وبلاگ یا سایت شخصیتان صفحه‌ی تماس بسازید و آن را طوری تنظیم کنید که پیام مخاطب را به طور غیرمستقیم به ایمیلتان بفرستد. بسیاری از سیستمهای نظرسنجی سایتها و وبلاگها از شما می‌خواهند که نام، نشانی وب‌سایت و ایمیلتان را وارد کنید. تا زمانی که مطمئن نشده‌اید سیستم سایت یا وبلاگ مذکور ایمیل شما را به صورت عمومی منتشر نمی‌کند از وارد کردن ایمیلهای اصلیتان در این گونه کادرها خودداری کنید (به عنوان نمونه، یکی از سیستمهای پرطرفدار وبلاگنویسی وطنی که جهت حفظ حریم خصوصی نظردهندگان در وبلاگها آی.پی آنها را حتی در اختیار صاحب وبلاگی که نظر برای او گذاشته شده نمی‌گذارد -احتمالاً به دلیل این که حق همه است که ایمیل نظردهندگان را بدانند و ببینند- ایمیل نظردهندگان را به صورت عمومی منتشر می‌کند 😉 ). برخی از سایتها و تالارهای گفتگو بدون ثبت‌نام، مطالب و مقالات خود را در اختیار بازدیدکننده نمی‌گذارند و شما مجبورید برای دستیابی به مطلب مورد نظرتان در این گونه سایتها ثبت‌نام کنید. مشکل اینجاست که ثبت‌نام در این سایتها معمولاً دریافت نامه‌های ناخواسته را به دنبال دارد و علاوه بر این، برخی از این سایتها اطلاعات کاربران خود را در قالب فهرستهای ایمیل، به هرزنامه‌نگاران می‌فروشند. اگر تنها به یک مطلب یا مقاله از سایت یا تالار گفتگوی مورد نظر نیاز دارید بهتر است ابتدا سعی کنید با استفاده از سایتهایی مانند bugmenot.com اطلاعات ورود به اشتراک‌گذاشته شده‌ای از سایت مزبور بیابید و با استفاده از آن وارد سایت مورد نظر شوید (برای نمونه، چند نام کاربری و کلمه‌ی عبور برای سایت آفتاب نقطه آر را اینجا ببینید). در صورتی که به نتیجه نرسیدید و مجبور شدید در سایت مورد نظرتان ثبت‌نام کنید به جای وارد کردن ایمیل واقعیتان از ایمیلهای یک‌بار مصرف استفاده کنید. سایتهایی نظیر www.mailinator.com بدون نیاز به ثبت‌نام، نشانیهای ایمیل موقتی در اختیارتان می‌گذارند که پس از پایان فرایندهای ثبت‌نام می‌توانید با خیال راحت آنها را رها کنید و به قول صاحبان این سرویس: «بگذارید اسپمها را آنها بخورند»!

ادامه دارد …

فهرست سری نوشته‌های من درباره‌ی هرزنامه‌ها:

قسمت اول: ریشه‌ی نام اسپم

قسمت دوم: هرزنامه‌ها

قسمت سوم: کدامیک هرزنامه‌های بیشتری می‌گیرند: «علی» یا «زهرا»؟

قسمت چهارم: بگذارید «اسپم»ها را آنها بخورند!

قسمت پنجم: درآمدزایی هرزنامه‌ها

قسمت ششم: ماشینهای صاحب‌نظر

قسمت هفتم: کپچا: «تو آدمی؟!»

قسمت هشتم: او.سی.آر: قاتل کپچای تصویر متن

قسمت نهم: صنعت حل کپچای هند و راه‌حلهای مقابله با اسپم با تکیه بر تحلیل محتوی