راه حل مشکل اتصال RDP روی ویندوز سرور ۲۰۲۵ و همینطور کندی اجرا تحت ویرچوال

اخیراً روی سروری با ویندوز سرور ۲۰۲۵ با این مشکل مواجه شدم که اگر با ریموت دسکتاپ به آن وصل می‌شدم و بدون لاگ‌اوت قطع می‌شدم در هنگام تلاش برای اتصال مجدد ویندوز روی صفحهٔ ورود به حالتی شبیه قفل شده (فریز) باقی می‌ماند و هیچ اتفاقی نمی‌افتاد. راه حل را در تصاویر بعدی نشان داده‌ام. ابتدا Group Policy را با اجرای gpedit.msc بالا بیاورید و طبق تصویر این تنظیم را فعال کنید.

مسیر مشکل RDP
مسیر مشکل RDP
مشکل RDP

مشکل دیگری که روی این ویندوز -که تحت ویرچوال و با نرم‌افزار QEMU بالا آمده بود- می‌دیدم کندی و لختی نسبی اجرا بود. مثلاً کلیک‌ها با کندی باز می‌شدند و یک کوئری SQL که روی ویندوز دیگری در کمتر از ۱ ثانیه اجرا می‌شد روی دیتابیس مشابه بیشتر از ۶ ثانیه طول می‌کشید تا اجرایش تمام شود. آن را هم جستجو کردم و مشخص شد که در رول‌های سرور می‌بایست Hypervisor را فعال کنم (این رول که همان Hyper V است در اصل برای اجرای یک ماشین مجازی داخل خود ویندوز کاربرد دارد). بعد از نصب این role مشکل لختی و کندیی که از آن صحبت می‌کردم مستند به زمان اجرای همان اسکریپت حل شد.

راه‌اندازی سرویس ارسال ایمیل روی ویندوز سرور با اچ‌میل‌سرور

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

تذکر مهم: من تنها نیاز داشته‌ام و دارم که ایمیل ارسال کنم (ایمیل‌های تأییدیهٔ نام‌نویسی کاربران) و هیچگاه علاقمند به دریافت ایمیل نبوده‌ام! دریافت ایمیل قطعاً مراحل بیشتری مانند باز کردن پورتهای ورودی روی دیوارهٔ آتش سرور دارد که من تجربهٔ آن را ندارم.

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

۱. گام اول تنظیم رکوردهای dns دامنهٔ ارسال ایمیل است. در پیشخان DNS یک رکورد از نوع A با نام mail می‌سازیم (یا اگر وجود دارد مقدار آن را ویرایش می‌کنیم) و در مقدار آن IP سرور مقصد را می‌گذاریم:

ایجاد رکورد A با نام mail برای دامنه

سپس برای آن یک رکورد از نوع MX درست می‌کنیم و مقدار آن را mail.domainname.com می‌گذاریم، مثلاً برای مثال تصویر بالا مقدار آن باید مطابق تصویر بعدی باشد.

ایجاد رکورد MX

۲. اچ‌میل‌سرور (hMailServer) را دریافت و روی سرور نصب می‌کنیم. این نرم‌افزار مبتنی بر دات‌نت ۲ است و از این جهت باید روی ویندوزهای سرور از طریق سرورمنیجر رل مربوط به NET 3.5. را هم نصب کرده باشید. برای ذخیرهٔ اطلاعات من از SQL Server که پیشتر روی سرور استفاده کرده‌ام استفاده می‌کنم:

تنظیم پایگاه داده‌های hMailServer

برای hMailServer لازم است یک رمز ادمین تعیین کنید. در مراحل تنظیم نحوهٔ اتصال به SQL Server تعیین کنید که می‌خواهید پایگاه داده‌های جدیدی ایجاد شود. اتصال به SQL Server با Windows Authentication کار نمی‌کند و با این خطا مواجه می‌شود:

به جایش مجبورید روی SQL Server کاربر با دسترسی کافی بسازید تا hMailServer بتواند پایگاه داده‌هایش را بسازد.

لازم است سرویس SQL Server را هم برایش مشخص کنید که هر گاه سرویس اس.کیو.ال ری‌استارت شد این سرویس هم ری‌استارت شود.

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

۳. مرحلهٔ بعد اجرای hMailServer Administrator و اضافه کردن نام دامنه و ایجاد رکورد DKIM در DNS برای اعتبارسنجی دامنه و اسپم نشدن آن در جیمیل است. ابتدا دامنه را در برنامه اضافه می‌کنیم.

در تنظیمات SMTP هم در قسمت نام سرور محلی نام دامنه را می‌زنیم (اگر این کار را نکنیم در ارسال ایمیل نام کامپیوتر سرور گذاشته می‌شود و در بررسی میزان اعتبار ایمیل ارسال شده این خطا ظاهر می‌شود: We check if there is a server (A Record) behind your hostname).

برای رکورد DKIM طبق این راهنمایی به این نشانی می‌رویم و فرم را مطابق شکل زیر پرمی‌کنیم (selector یک رشتهٔ دلخواه است که بعداً باید هر چه اینجا وارد کردیم را داخل نرم‌افزار هم وارد کنیم):

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

و سپس در اچ‌میل‌سرور آن را انتخاب می‌کنیم و selector را هم مطابق همان چیزی که وقت تولید کلید وارد کرده‌ایم وارد می‌کنیم.

طبق راهنمای تولید در تصویر یکی قبل‌تر یک رکورد DNS هم از نوع TXT به این صورت ایجاد می‌کنید:

۴. برای دامنهٔ مد نظر باید کلید متنی SPF را هم در DNS بسازید. ساخت این کلید آسان است و طبق الگوی تصویر بعد نام دامنه و آی.پی را با مقادیر مربوط به خودتان جایگزین کنید:

v=spf1 ip4:1.2.3.4 include:domain.com ~all

۵. رکورد DMARK هم مثل SPF با یک الگو ساخته می‌شود:

v=DMARC1; p=reject; rua=mailto:report-abuse@domain.com

۶. در hMailServer زیر دامنهٔ مد نظر در قسمت Accounts ایمیل مد نظر خود را بسازید. سپس نرم‌افزاری را برای ارسال ایمیل پشت سرور نصب کنید. من از تاندربرد استفاده می‌کنم. از POP3 با پورت ۱۱۰ برای دریافت و از SMTP با پورت ۲۵ به صورت ناامن برای اتصال استفاده کنید و مطمئن شوید پشت سرور با نرم‌افزار به میل‌سرورتان وصل می‌شوید.

۷. بهتر است دی‌ان‌اس معکوس آی‌پی ارسال کنندهٔ ایمیل (reverse dns یا rDns) برابر با دامنهٔ ارسال ایمیل (mail.domainname.com) باشد. در سرورهایی که من تا به حال در اختیار داشته‌ام انجام این تنظیم در اختیار سرویس‌دهنده است و برای این کار برایشان تیکت می‌زنم. اگر این کار انجام نشود یا مثلاً به لحاظ آن که سرویس‌دهنده میزبان چند دامنهٔ ارسال ایمیل باشد و فقط برای یکی بتواند انجام شد مشکل جدی ایجاد نمی‌شود.

۸. به سایت mail-tester.com بروید و با تاندربرد به ایمیل پیشنهادی آن یک ایمیل بزنید:

و در نهایت در سایت mail-tester نتیجه را ببینید.

شرح یک تجربه: سیانوژن روی گوشی 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 تایپش کنید. همین!