<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>گزیر &#187; برنامه‌نویسی</title>
	<atom:link href="http://www.gozir.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gozir.com</link>
	<description>گاهنوشتهای حمیدرضا محمدی</description>
	<lastBuildDate>Sat, 10 Dec 2011 06:31:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.1.3</generator>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>رابط برنامه‌نویسی گنجور رومیزی – بخش دوم</title>
		<link>http://www.gozir.com/1389/11/10/docx2gdb/</link>
		<comments>http://www.gozir.com/1389/11/10/docx2gdb/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 15:43:45 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=2018</guid>
		<description><![CDATA[
در ادامهٔ بحث نوشتهٔ پیشین در این نوشته به عنوان یک نمونهٔ عملی از نحوهٔ استفاده از رابط برنامه‌نویسی گنجور رومیزی، من قسمتی از یک فایل docx در دسترس از طریق سایت تصوف ایران -مربوط به اشعار وحدت کرمانشاهی- را به کمک تکه کدی که شرح آن در ادامه می‌آید به قالب گنجور رومیزی تبدیل [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در ادامهٔ بحث <a href="http://www.gozir.com/1389/11/05/dg-api/" title="رابط برنامه‌نویسی گنجور رومیزی – بخش اول">نوشتهٔ پیشین</a> در این نوشته به عنوان یک نمونهٔ عملی از نحوهٔ استفاده از رابط برنامه‌نویسی گنجور رومیزی، من قسمتی از یک فایل docx در دسترس از طریق سایت <a href="http://www.sufi.ws/">تصوف ایران</a> -مربوط به اشعار وحدت کرمانشاهی- را به کمک تکه کدی که شرح آن در ادامه می‌آید به قالب گنجور رومیزی تبدیل کرده‌ام (اصل فایل <a href="http://www.sufi.ws/books/download/farsi/divan-vahdat.doc">اینجا</a>ست، من آن را دریافت کرده‌ام، با کمک <acronym title="Word">ورد</acronym> ۲۰۰۷ با پسوند docx ذخیره کرده و آن را در فایل <acronym title="zip">زیپ</acronym> پروژهٔ مربوط به این مطلب -قابل دریافت از <a href="http://j.mp/hDR779">این نشانی</a>-  گنجانده‌ام).
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
برای انجام این کار باید علاوه بر ویژوال استودیو (با امکان برنامه‌نویسی برای سکوی ‎.NET ویرایش ۳.۵ یا ۴) کتابخانهٔ برنامه‌نویسی OpenXML را نیز نصب داشته باشید. این کتابخانه را از <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&displaylang=en">این صفحه</a> دریافت و نصب کنید (OpenXMLSDKv2.msi با حجم کمتر از ۴ مگابایت برای مقصود مورد نظر ما کافیست، البته پیش‌نیاز نصب این کتابخانه سکوی ‎.NET ویرایش ۳.۵ با سرویس پک ۱ است).
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
پس از نصب کتابخانهٔ یاد شده و ایجاد پروژه، <acronym title="reference">ارجاع</acronym> متناظر با آن را به فهرست ارجاعهای پروژه اضافه می‌کنیم تا فضاهای نام مورد نیاز در دسترس قرار گیرند.
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/openxmlref.gif" alt="ارجاعهای لازم برای دستیابی به کتابخانهٔ OpenXML شامل DocumentFormat.OpenXml و WindowsBase است" width="232" height="253" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
برای پیاده‌سازی تبدیل مورد نظر لازم است الگوی تایپ فایل ورودی را استخراج کنیم. با بررسی ظاهر فایل ورودی الگوی عمومی زیر را مشاهده می‌کنیم:
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/doc2gdbsample.gif" alt="سلولهای جدول حاوی متن اشعار در فایل ورودی مورد نظر" width="400" height="374" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
بنابراین در ترتیب معمول بازخوانی محتوای این فایل (چگونه فایل تایپ شده): هر مصرع در تمام سلولهای حاوی متن از مصرعهای دیگر با یک break جدا شده است. محتوای سلول اول جدول (۱)، مربوط به مصرعهای اول ابیات است، بعد از این سلول، سلولی خالی داریم (۲)، محتوای سلول بعدی (۳) مربوط به مصرعهای دوم ابیات است، بعد یک سلول خالی (۴) (استثنایی وجود دارد که توضیح می‌دهم)، بعد سلولی شامل دو مصرع متوالی که مربوط به بیت تخلص شاعر است (۵) و پس از آن تا شعر بعدی یک سلول خالی دیگر داریم (۶).
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
پس ما در هنگام تبدیل فایل ورودی در هر لحظه انتظار یکی از سه نوع سلول جدول مصرعهای سمت راست، چپ یا وسط را می‌کشیم:
</p>
<span id="more-2018"></span>
<div style="direction:ltr;text-align:left"><script type="text/javascript" src="https://gist.github.com/802943.js?file=gistfile1.cs"></script></div>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در صورتی که فایل را بیشتر بررسی کنیم این استثنا را می‌بینیم:
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/doc2gdbsampleexp.gif" alt="استثنای الگوی جدولی فایل ورودی" width="400" height="378" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
همچنان که می‌بینید پس از سلول (۳)، در حالی که انتظار یک سلول خالی را داریم (۴) با یک سلول شامل ادامهٔ مصرعهای اول مواجه می‌شویم (۱) لذا در صورتی که بعد از سلول شامل محتوای مصرعهای دوم سلول خالی نداشته باشیم، سلول بعدی شامل ادامهٔ مصاریع اول همان شعر است و نه بیت تخلص.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
برای بازخوانی فایلهای docx ارجاعهای لازم به کتابخانهٔ OpenXml را اضافه می‌کنیم تا <acronym title="namespace">فضاهای نام</acronym> مورد نیاز در دسترس قرار گیرند:
</p>
<div style="direction:ltr;text-align:left"><script type="text/javascript" src="https://gist.github.com/802947.js?file=gistfile1.cs"></script></div>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
با توجه به توضیحی که در مورد نحوهٔ سازماندهی مصاریع در این فایل دادم الگوریتم تبدیل اینچنین است (در کد کامل و قابل اجرای پروژه، کدهای اضافی برای پردازش استثناها و ... گنجانده شده که اینجا برای ساده‌تر شدن مطالعهٔ کد فرایند اصلی حذف شده):
</p>
<div style="direction:ltr;text-align:left"><script type="text/javascript" src="https://gist.github.com/802952.js?file=gistfile1.cs"></script></div>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
همچنان که از تصاویر و احتمالاً توضیحات بالا پیداست، فایل ورودی اولیهٔ مورد استفادهٔ من دیوان وحدت کرمانشاهی نبوده بلکه دیوان شاه نعمت الله ولی (قابل دریافت از <a href="http://www.sufi.ws/MysticalBooks%289%29.php">این نشانی</a>) را بررسی کرده‌ام. از آنجا که این دیوان یکدست تایپ نشده و پس از بخش قصاید الگوهای تایپ دیگری دارد (مثلاً بعضی غزلها را بدون بیت تخلص در میانه تایپ کرده‌اند و ...) در تنظیم نهایی مطلب، ورودی یکدست‌تری را انتخاب کردم و راهکاری نیز برای رفع یک مورد استثنا در فایل ورودی جدید (در <a href="http://j.mp/hDR779">پروژهٔ قابل دریافت</a>) پیش‌بینی کردم. در هر حال سی و خرده‌ای قصیدهٔ ابتدایی شاه نعمت الله نیز توسط سازوکار شرح داده شده در اینجا قابل تبدیل است.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
همچنان که پیشتر اشاره کردم کد این پروژه را -‎.NET ویرایش ۴، <acronym title="Windows Forms">ویندوز فرمز</acronym>، ویژوال C#‎ اکسپرس ۲۰۱۰- از <a href="http://j.mp/hDR779">اینجا</a> می‌توانید دریافت کنید (نشانی اسمبلی گنجور رومیزی را در کامپایل مجدد احتمالاً باید تصحیح کنید). به عنوان نکته‌ای که احتمالاً به ذهن خودتان هم می‌رسد اما یادآوریش ضرری ندارد، اشاره می‌کنم به این که فایل خروجی را می‌توانید فایل پایگاه داده‌های اصلی گنجور رومیزی تعیین کنید تا بتوانید خروجی کار را به شکل زنده مشاهده کنید. البته، برنامه در صورت وجود فایل خروجی از کاربر تأییدیهٔ حذف می‌گیرد و <strong>فایل موجود را حذف می‌کند</strong>، مواظب باشید اگر اطلاعات شخصی پشتیبان گرفته نشده در فایل خروجی دارید (نشانه‌ها در گنجور رومیزی) این اطلاعات را از دست ندهید.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1389/11/10/docx2gdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>رابط برنامه‌نویسی گنجور رومیزی &#8211; بخش اول</title>
		<link>http://www.gozir.com/1389/11/05/dg-api/</link>
		<comments>http://www.gozir.com/1389/11/05/dg-api/#comments</comments>
		<pubDate>Tue, 25 Jan 2011 07:29:27 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=2000</guid>
		<description><![CDATA[
یکی از نکاتی که شاید به کار برنامه‌نویسانی بیاید که دوست دارند در گسترش دامنهٔ داده‌های گنجور با استفاده از گنجور رومیزی مشارکت کنند این است که بدانند تنها راه تبدیل منابع اینترنتی یا فایلهای موجود به فرمت گنجور رومیزی کپی دستی اشعار از این منابع در ویرایشگر گنجور رومیزی نیست و می‌توان با استفاده [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
یکی از نکاتی که شاید به کار برنامه‌نویسانی بیاید که دوست دارند در گسترش دامنهٔ داده‌های <a href="http://ganjoor.net">گنجور</a> با استفاده از <a href="http://ganjoor.sourceforge.net">گنجور رومیزی</a> مشارکت کنند این است که بدانند تنها راه تبدیل منابع اینترنتی یا فایلهای موجود به فرمت گنجور رومیزی کپی دستی اشعار از این منابع در <a href="http://blog.ganjoor.net/1389/04/27/dg-editor/">ویرایشگر گنجور رومیزی</a> نیست و می‌توان با استفاده از ‎C#‎ یا هر یک از دیگر زبانهای ‎.NET تقریباً به آسانی فایلهای مناسب برای نمایش در گنجور رومیزی را ساخت.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
البته همانطور که احتمالاً این دسته از دوستان مطلعند فایلهای گنجور رومیزی در واقع پایگاه داده‌های <a href="http://www.sqlite.org" title="اسکیولایت">SQLite</a> هستند و راه متداول برای ایجاد آنها به کمک زبانهای برنامه‌نویسی، استفاده از دستورات SQL است که نیازمند بازبینی ساختار پایگاه داده‌های برنامه و به دست آوردن روابط بین جداول است. اما روشی که در این نوشته در مورد آن توضیح خواهم داد آسان‌تر است.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
مقدمهٔ کار در <acronym title="Microsoft Visual Studio">ویژوال استودیو</acronym>، اضافه کردن یک <acronym title="Reference">ارجاع</acronym> به <acronym title="Assembly">اسمبلی</acronym> ganjoor.exe است (فایل اجرایی گنجور رومیزی که در مسیر نصب برنامه قرار دارد) تا <acronym title="namespace">فضای نام</acronym> ganjoor در برنامه در دسترس قرار گیرد.<a href="http://www.gozir.com/1389/11/05/dg-api/#fn1" name="hn1">*</a>
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/add-ref.gif" alt="اضافه کردن ارجاع در ویژوال استودیو" width="293" height="244" class="centered" />
<img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/ganjoor-ref.gif" alt="ارجاع به اسمبلی گنجور رومیزی در ویژوال استودیو" width="164" height="121" class="centered" />
[code lang="c#"]
using ganjoor;
[/code]
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
پس از این کار به کلاس اصلی مدیریت داده‌ها در گنجور رومیزی که DbBrowser نام دارد دسترسی داریم. تکه‌کد زیر -که به نظرم به اندازهٔ کافی گویاست- نشان می‌دهد که چگونه می‌توان با استفاده از این کلاس (و کلاسهای جانبی فضای نام ganjoor که اطلاعات داده‌ها را در خود دارند) یک فایل سادهٔ gdb یا s3db ساخت که گنجور رومیزی توانایی نمایش اطلاعات آن را دارد:
</p>
<span id="more-2000"></span>
<div style="direction:ltr;text-align:left"><script src="https://gist.github.com/794637.js" type="text/javascript"> </script></div>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
همین کلاسها امکان بازخوانی اطلاعات از یک فایل پایگاه داده‌های گنجور رومیزی (و مثلاً ذخیرهٔ آن با فرمتهای دیگر را) در اختیار می‌گذارند:
</p>
<div style="direction:ltr;text-align:left"><script src="https://gist.github.com/794638.js" type="text/javascript"> </script></div>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در نوشتهٔ بعدی یک نمونهٔ عملی را برای استخراج اطلاعات از یک فایل docx خاص و ذخیرهٔ آن در قالب گنجور رومیزی ارائه خواهم داد.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
<small>
<a href="#hn1" name="fn1">*</a>این اسمبلی ارجاعی به اسمبلی System.Data.SQLite.dll دارد که یک اسمبلی Mixel Mode مبتنی بر ویرایش ۲ سکوی ‎.NET است لذا در صورت استفاده در برنامه‌های مبتنی بر ویرایش ۴ سکوی ‎.NET لازم است خطوط زیر (جهت رفع خطای مرتبط کامپایلری) در App.config اضافه شود (<a href="http://stackoverflow.com/questions/2455654/what-additional-configuration-is-necessary-to-reference-a-net-2-0-mixed-mode-a">منبع</a>):
</small>
</p>
<a href="http://stackoverflow.com/questions/2455654/what-additional-configuration-is-necessary-to-reference-a-net-2-0-mixed-mode-a"><img src="http://www.gozir.com/logman/wp-content/uploads/2011/01/dotnet2mixed-in-dotnet4.gif" alt="load .NET 2 mixed mode assembly in .NET 4" width="498" height="94" class="centered" /></a>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1389/11/05/dg-api/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>یاریگری هست؟</title>
		<link>http://www.gozir.com/1389/09/27/help-me-with-jquery-for-ganjoor/</link>
		<comments>http://www.gozir.com/1389/09/27/help-me-with-jquery-for-ganjoor/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 18:30:11 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[نوشته‌های پراکنده]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1976</guid>
		<description><![CDATA[
می‌دانید؟ اخیراً از جایی درخواست یک هدیه کردم (اینجا) و آن را تحویل گرفتم.


بد ندیدم، با یادکردی از آن لطف، با توجه به این که این روزها دست و دلم خیلی به کار نمی‌رود تقاضا(ها)یی بکنم برای کمک، شاید جی‌کوئریکاری پیدا شد ندای ما را لبیک گفت و از مشکلات گنجور کمی کم کرد. عموم [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
می‌دانید؟ اخیراً از جایی درخواست یک هدیه کردم (<a href="http://blog.manipixel.com/1389/09/a-gift-from-mani-pixel/">اینجا</a>) و آن را تحویل گرفتم.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
بد ندیدم، با یادکردی از آن لطف، با توجه به این که این روزها دست و دلم خیلی به کار نمی‌رود تقاضا(ها)یی بکنم برای کمک، شاید <a href="http://jquery.com">جی‌کوئری</a>کاری پیدا شد ندای ما را لبیک گفت و از مشکلات گنجور کمی کم کرد. عموم تقاضاها -برای اهلش- به تخمین خودم چندان زمانبر نیست اما لطفی است بی‌حد در حق نه تنها من بلکه در حق تمام کسانی که با گنجور مشکلاتی از جنس آنچه شرح خواهم داد دارند.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اولین مشکل مربوط به اسکریپت جستجوی لغات با دوبار کلیک بر روی آنها در لغتنامهٔ دهخداست (<a href="http://blog.ganjoor.net/1386/12/21/double-click-search-in-loghatnameh/">اینجا</a> را ببینید). مشکلش چیست؟ با کروم و سافاری و اپرا کار نمی‌کند. راه‌حلش چیست؟ تصور می‌کنم <a href="http://davidwalsh.name/text-select-widget">این</a> باشد. اصلاً شاید خود همین باشد بدون نیاز به تغییر. کاری که شما باید برای من بکنید این است که مطمئن شوید با متون راست به چپ مشکلی ندارد، می‌شود اسکریپتهای لازمه را (از جمله کتابخانهٔ جی‌کوئری را) در ته صفحه قبل از بسته شدن تگ body (و نه در بالای صفحه) بارگذاری کرد و تمام. و البته، اگر مشکلی هست برایم رفعش کنید!
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اما دومین و سومین مشکل را، اگر اولین مشکل را حل کردید، دنبالشان باشید: من اسکریپت ساده‌ای برای شماره‌گذاری ابیات در گنجور نوشته‌ام (<a href="http://blog.ganjoor.net/1387/03/09/btshmr/">اینجا</a> را ببینید). این را برایم با جی‌کوئری بازنویسی کنید (اسکریپت را با بازبینی کد صفحات گنجور می‌بینید). مشکل سوم را البته اصراری روی حلش ندارم، احتمالاً سخت است ولی صورت مسأله‌اش این است که <a href="http://www.gozir.com/1388/10/15/persian-ol-tags/">این مسأله</a> را با استفاده از جی‌کوئری حل کنید.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
نکتهٔ آخر که تصور می‌کنم از متن نوشته برداشت می‌شود ولی رک و راست گفتن آن خالی از فایده نیست آن که برای این مسائل من راهنمایی نمی‌خواهم، راه‌حل نهایی آمادهٔ نصب و صد در صد تضمین‌شده را می‌خواهم. گفتم که حواستان باشد اگر لطف می‌کنید ناقص نباشد!
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1389/09/27/help-me-with-jquery-for-ganjoor/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>داستانهایی دربارهٔ اعداد تصادفی</title>
		<link>http://www.gozir.com/1389/06/20/random-numbers/</link>
		<comments>http://www.gozir.com/1389/06/20/random-numbers/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 18:30:49 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[خنده‌ناک]]></category>
		<category><![CDATA[نقل قول]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1889</guid>
		<description><![CDATA[
۱) تابع تولید عدد تصادفی

۲) چرخ چهارگوش

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



پس دست به کار شدم و نصاب فایرفاکس [...]]]></description>
			<content:encoded><![CDATA[<br />
<h3>۱) تابع تولید عدد تصادفی</h3>
<a href="http://xkcd.com/221/"><img src="http://www.gozir.com/logman/wp-content/uploads/2010/09/random_number.png" alt="xkcd: Random Number" width="400" height="144" class="centered" /></a>
<h3>۲) چرخ چهارگوش</h3>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
<a href="http://weblogs.asp.net/fbouma/about.aspx">برنامه‌نویس سرشناسی</a> که همچون من و احتمالاً شما، آن روزها که قرار بود موزیلا ویرایش ۳.۵ از مرورگر محبوبش را منتشر کند ذوق دریافت فایرفاکس جدید را داشت در روزهای اول استفاده از این ویرایش مهم فایرفاکس <a href="http://weblogs.asp.net/fbouma/archive/2009/07/09/the-firefox-3-5-fiasco.aspx">به مشکل آزاردهنده‌ای برخورد کرد</a>:
</p>
<blockquote>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
پس دست به کار شدم و نصاب فایرفاکس را در روز انتشار دریافت کردم و پس از گذر از کثیف‌کاری معمول به‌روزرسانی افزونه‌ها توانستم مرورگر جدید را برای اولین بار اجرا کنم و <em>خدایا من چه می‌بینم</em>: وب -انگارکن- به سال ۱۹۹۴ برگشته: وقتی که هیچ کس جز خوره‌های واقعی سایت نداشت و همه چیز به سرعت برق بود. زندگی شیرین شده بود!
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
روز بعد با فنجان قهوهٔ تازه در دست، فایرفاکس ۳.۵ عزیزم را روی سیستم تازه بالا آمده‌ام اجرا کردم. انتظار داشتم پنجرهٔ مرورگر را در عرض چند ثانیه ببینم تا باز هم وبگردی با سرعت برق‌آسا را تجربه کنم، اما اتفاقی نیفتاد. البته، یک <em>اتفاق</em> افتاد، هارد دیسک کامپیوترم مثل وقتهایی که آن را ویروسیابی می‌کنم مشغول شده بود تا این که بعد از ۳۵ ثانیه یا چیزی در همین حدود بالاخره توانست تمام بیتها و تکه‌های لازم را پیدا کند و چهرهٔ آشنای فایرفاکس را به من نشان بدهد تا من راهم را به دنیای بیرون شروع کنم!
</p>
</blockquote>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
فایرفاکس روی سیستم فرد معلوم‌‌الحال یاد شده همچنان سریع کار می‌کرد اما همیشه شروع شدنهایش کند و آزاردهنده بود. تا این که بالاخره تصمیم گرفت با جستجو در انجمنهای پشتیبانی فایرفاکس ریشهٔ مشکل را بیابد و این جستجو به کشف این نکته این انجامید که آقا، در این مصیبت تنها نیست و همدردهای زیادی دارد. بگذریم، خلاصه آن که مشخص شد مشکل مربوط به کتابخانهٔ <a href="http://www.mozilla.org/projects/security/pki/nss/">NSS</a> است. کتابخانه‌ای شامل توابع امنیت شبکه که انواع کارکردهای رمزنگاری و امنیتی را پوشش می‌دهد و برای پیاده‌سازی این توابع نیاز به <strong>اعداد تصادفی</strong> دارد:
</p>
<blockquote>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
ایجاد اعداد تصادفی واقعی مشکل است چرا که در یک سیستم کامپیوتری هیچ چیز واقعاً تصادفی نیست: هر چیزی نتیجهٔ یک عمل قابل پیش‌بینی است. پسران و دختران باهوش تیم NSS باید این مسأله را به گونه‌ای حل می‌کردند: چطور اعداد تصادفی واقعی ایجاد کنیم که تا حد ممکن تصادفی باشند؟ به جای استفاده از توابع ارائه شده توسط سیستم عامل (که این قابلیت را به دلیل نیاز پروتکل TCP در خود دارد) آنها این کار را به همان شیوه‌ای که عموماً شرکت موزیلا کارهایش را انجان می‌دهد انجام دادند: چرخ را از نو اختراع کردند. من مشکلی با اختراع مجدد چیزها ندارم، اشتباه برداشت نکنید، هیچ چرخی مثل چرخ دیگر نیست. اگر چه، مشکل اختراع دیگربارهٔ چرخ آن است که علاوه بر آن که در این فرایند شما حق اشتباه کردن ندارید، باید چرخی بسازید که از چرخهای اختراع شدهٔ قبلی بهتر باشد. برای نمونه هیچ کس از چرخ چهارگوش شما استفاده نخواهد کرد.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
برای حل مشکل اعداد تصادفی، تیم NSS به روشی هوشمندانه روی آورده بودند، رویکردی چنان عالی که تا به حال به ذهن هیچ کس نرسیده بود: آنها تصمیم گرفتند که تمام فایلهای موجود در تمام پوشه‌های موقتی ویندوز را با چند ریسمان موازی بخوانند تا از آنها به عنوان نقطه‌های آغاز (seed) تولید اعداد تصادفی استفاده کنند! توجه کنید: این پوشه‌ها در هر چند میلی‌ثانیه تغییر می‌کنند، به سرعت در دسترسند، تأخیری در دسترسی به آنها وجود ندارد و هیچوقت با چیزهای حاشیه‌ای به دردنخور پر نمی‌شوند!
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
البته، پاراگراف بالا ذهنیت تیم NSS بود. در دنیای واقعی، چیزها <em>یک کوچولو</em> متفاوتند. متوجه هستید که؛ فایرفاکس ویرایش ۳.۵ <strong>کش اینترنت اکسپلورر</strong> را و <strong>پوشهٔ temp ویندوز</strong> برای پروفایل کاربر را توسط زیرسیستم NSS خود می‌خواند. این نه تنها به نظر من یک <em>نباید</em> به جهت خواندن داده‌های موقتی برنامهٔ دیگر است، بلکه  یک بی‌توجهی شگفت‌آور نسبت به گلوگاه اصلی کامپیوترهای امروزی است: هارد دیسکها. اگر شما ویروس‌کشی داشته باشید که در حالت <em>بددلانه</em> تنظیم شده باشد پیمایش پوشه‌های موقت توسط NSS کندتر هم خواهد بود چرا که دسترسی به هر فایل از سوی فایرفاکس باعث اسکن آن توسط ویروس‌کش می‌شود. و اگر کاربر، با کامپیوترش هیچ کاری غیر از مرور وب با فایرفاکس نکند به گونه‌ای که این پوشه‌های موقت دست‌نخورده یا خالی بمانند، آن وقت چه؟ آیا خواندن فایل بدترین روش ممکن برای تولید نقطه‌های آغاز اعداد تصادفی نیست؟
</p>
</blockquote>
<h3>۳) ماشین تولید اعداد تصادفی</h3>
<a href="http://dilbert.com/strips/comic/2001-10-25/"><img src="http://www.gozir.com/logman/wp-content/uploads/2010/09/v.2318.strip_.gif" alt="dilbert random generator" width="219" height="567" class="centered" /></a>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
- مطمئنید که این تصادفی است؟
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
- مشکل تصادفی بودن همین است که هیچ وقت نمی‌شود مطمئن بود.
</p>
<h3>۴) داستان گنجور</h3>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
برای <a href="http://www.gozir.com/1389/03/17/vganjoor/">سیستم بازبینی خروجیهای OCR گنجور</a>، راهکارهای مختلفی می‌شد طراحی کرد: می‌شد با توجه به آن که من عدد اطمینان بازشناسی تکه‌شعرها را هم داخل پایگاه داده‌ها داشتم، اوّل آنهایی را که با دقت پایین‌تری خوانده شده بودند در معرض بازبینی بگذارم. می‌شد به ترتیب عمل کنم، یعنی دوستانی که بازبینی می‌کنند از اوّل شروع کنند و هر کسی که تازه می‌آید آخرین تکه شعری را که هنوز بازبینی نشده یا اگر همه حداقل یک دور بازبینی شده‌اند، هنوز در دور دوم بازبینی نشده بازبینی کند و ... .
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اما خوب، من آسان‌ترین -و البته از لحاظ پردازشی کم‌هزینه‌ترین- راه را انتخاب کردم. هر بار بر اساس یک عدد تصادفی، یک خط شعر تصادفی در معرض بازبینی قرار می‌گرفت. مزیت این کار، نیاز به کمترین برنامه‌نویسی و همینطور به دلیل عدم نیاز به جستجو برای بازبینی نشده یا کم‌بازبینی‌شده‌ها سرعت و هزینهٔ پردازشی پایین بود.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اما در طولانی مدت چه اتفاقی می‌افتد؟ من حدود پنجاه هزار تکه تصویر بریده شده را در معرض بازبینی قرار داده بودم و اگر روزانه ۱۰۰۰ تکه از اینها بازبینی می‌شد باید در یک سیستم ترتیبی، همه در زمانی حدود دو ماه حداقل یک بار بازبینی شده باشند. اما در یک سیستم مبتنی بر اعداد تصادفی چه؟
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
نتیجه را احتمالاً می‌توانید حدس بزنید. خیلی از روزها، بیش از ۱۰۰۰ تکه از شعرها بازبینی می‌شد (آمارش هنوز در <a href="http://v.ganjoor.net/verification_results/stats">این صفحه</a> در دسترس است)، اما بعد از دو ماه چیزی حدود ۱۹۰۰۰ تکه بیش از یک بار و حدود ۲۶۰۰۰ تکه تنها یک بار بازبینی شده بودند و ۸۰۰۰ تکه هم اصلاً بازبینی نشده بودند (<a href="http://blog.ganjoor.net/1389/05/09/ocr-stats2/">گزارش تا آن مرحله</a>).
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
مطلوب آن بود که تمام تکه‌ها، بیش از یک بار بازبینی شوند، برای کاهش تعداد بازبینی‌نشده‌ها و یک بار بازبینی‌شده‌ها، کمی برنامه را دستکاری کردم: این بار کاربر از یک تکهٔ تصادفی شروع می‌کرد و بعد از آن به صورت ترتیبی بازبینی‌نشده‌ها (در دو هفتهٔ اول) و فقط یک بار بازبینی‌شده‌ها (در ادامه) را بازبینی می‌کرد. گزارش نهایی کار را می‌توانید <a href="http://blog.ganjoor.net/1389/06/18/ocr-verify-phase1-finished/">اینجا</a> بخوانید.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
خلاصه آن که -با تشکر ویژه از تمامی دوستانی که در این کار مشارکت کردند- مرحلهٔ اول <a href="http://www.gozir.com/1389/03/17/vganjoor/">بازبینی خروجیهای OCR گنجور</a> به ثمر نشسته است. برای برداشت محصول نهایی می‌توانید سری به آثار <a href="http://ganjoor.net/bidel/ghazalbi/">بیدل</a> و <a href="http://ganjoor.net/ghaani/ghasidegh/">قاآنی</a> در گنجور بزنید و اگر گنجور رومیزی دارید مجموعه اشعار متناظر را با شرحی که در <a href="http://blog.ganjoor.net/1389/06/18/ocr-verify-phase1-finished/">این نوشته</a> آمده به برنامه اضافه کنید.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
و البته، یادتان باشد که این فقط مرحلهٔ اول بود و نهضت کماکان <a href="http://v.ganjoor.net">ادامه دارد</a>.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1389/06/20/random-numbers/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>لیستهای مرتب با اعداد فارسی</title>
		<link>http://www.gozir.com/1388/10/15/persian-ol-tags/</link>
		<comments>http://www.gozir.com/1388/10/15/persian-ol-tags/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 18:40:32 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[زبان فارسی]]></category>
		<category><![CDATA[طراحی وب]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1638</guid>
		<description><![CDATA[
تگ ol (لیست مرتب) در html در CSS ویرایش ۲ توانایی نمایش اعداد به صورت فارسی را ندارد (از اعداد لاتین، رومی و ارمنی(!) پشتیبانی می‌کند اما اعداد را به صورت عربی یا فارسی نمی‌تواند نشان دهد). استایلهای انواع لیستها را در این استاندارد اینجا می‌توانید ببینید. در استاندارد جدیدتر گویا قرار است پشتیبانی از [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
تگ ol (لیست مرتب) در html در CSS ویرایش ۲ توانایی نمایش اعداد به صورت فارسی را ندارد (از اعداد لاتین، رومی و ارمنی(!) پشتیبانی می‌کند اما اعداد را به صورت عربی یا فارسی نمی‌تواند نشان دهد). استایلهای انواع لیستها را در این استاندارد <a href="http://www.w3schools.com/Css/css_list.asp">اینجا</a> می‌توانید ببینید. در <a href="http://www.w3.org/TR/css3-lists/">استاندارد جدیدتر</a> گویا قرار است پشتیبانی از شکل اعداد فارسی  هم اضافه شود.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
چند وقتی است استقبالهای شاعران را از هم (<a href="http://ganjoor.net/hafez/saadi/">حافظ از سعدی</a>، <a href="http://ganjoor.net/hafez/salman/">حافظ از سلمان</a>، <a href="http://ganjoor.net/salman/saadi/">سلمان ساوجی از سعدی</a> و ...) را با توجه به میزان مشابهت کلمات ابیات و همینطور با توجه به وزن و قافیهٔ اشعار استخراج کرده‌ام و در گنجور در دسترس قرار داده‌ام. دیروز به نظرم رسید بد نیست این فهرستها را با کمک تگ ol شماره‌گذاری کنم. اما با توجه به نکته‌ای که در پاراگراف قبل گفتم امکان نمایش درست اعداد در متن فارسی وجود نداشت. جستجویی کردم و به <a href="http://www.dot1ne.com/web-design/farsi-arabic-ol-tag/">این صفحه</a> رسیدم. نویسندهٔ مطلب به کمک جاوا اسکریپت مشکل را حل کرده. با کمک اسکریپت او، اسکریپت ساده‌ای نوشتم که امکان نمایش اعداد لیستهای مرتب را به صورت فارسی در اختیار می‌گذارد:
</p>
<span id="more-1638"></span>
[code lang="javascript"]
//Original Code & Author: M Saleh EG[dot1ne] www.dot1ne.com
function faol(){
	ols = document.getElementsByTagName("ol");
  for(i=0; i<ols.length; i++){
		 list=faolgetListItems(ols[i]);		 
		 lis=faformatListItems(list);
 		 newOL=document.createElement("ol");
         newOL.style.listStyleType = "none";
		 newOL.style.paddingRight = "0px";
		 newOL.style.marginRight = "10px";		 
         for(var k=0; k<lis.length; k++)
			newOL.appendChild(lis[k]);
	     newOL.id=ols[i].id;
		 newOL.className=ols[i].className;
		 ols[i].parentNode.replaceChild(newOL, ols[i]);
			
	}  
}
function  faolgetListItems(ol){
	     lis = new Array();
         for(var i=0; i < ol.childNodes.length; i++){
          if(ol.childNodes[i].nodeName == "LI" || ol.childNodes[i].nodeName == "li"){
	      ol.childNodes[i].style.direction="rtl";
	      ol.childNodes[i].style.textAlign="right";
		  if(ol.childNodes[i].childNodes[0].className=="dot1_ol")
		  ol.childNodes[i].removeChild(ol.childNodes[i].childNodes[0]);		  
	      lis.push(ol.childNodes[i]);
	      }
         }
		 return lis;
};	  
function faformatListItems(list_items) {
	     for(var i=0; i < list_items.length; i++){
         index=i+1;
		 list_items[i].innerHTML = "<span class=\"dot1_ol\" style=\"display:block;float:right;width:20px;\" >" + bshfarsinum(String(index)) + ".  &nbsp;</span>" + list_items[i].innerHTML;
		 }	 
		 return list_items;
	  };
function bshfarsinum(englishnum)
{
  var result = "";
  for(var i=0; i<englishnum.length;i++)
 {
   result = result +String.fromCharCode(englishnum.charCodeAt(i)+0x6C0);
 }
 return result;
}[/code]
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
که در نهایت با فراخوانی آن در رویداد onload می‌توان به مقصود رسید:
</p>
[code lang="html"]
<script type="text/javascript" language="JavaScript" src="faol.js"></script>
<script type="text/javascript"> 
  window.onload = function() {faol();}
</script>
[/code]
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
عملکرد کد را در فایرفاکس ۳.۵ و اینترنت اکسپلورر ۸ آزمایش کردم و مشکلی ندیدم.
</p>
<a href="http://ganjoor.net/hafez/saadi/"><img src="http://www.gozir.com/logman/wp-content/uploads/2010/01/hafez-saadi.jpg" alt="استقبالهای حافظ از سعدی" width="497" height="388" class="centered" /></a>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1388/10/15/persian-ol-tags/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>نوار لغزان با لغزندگی پایین</title>
		<link>http://www.gozir.com/1388/09/20/scroll-autoscrolls-using-arrow-keys/</link>
		<comments>http://www.gozir.com/1388/09/20/scroll-autoscrolls-using-arrow-keys/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 08:52:36 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[نرم‌افزار]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1609</guid>
		<description><![CDATA[
یکی از ایرادهای گزارش شده برای ویرایشهای قدیمی‌تر گنجور رومیزی این بود که نوارهای لغزان آن با کمک کلیدهای جهتی نمی‌لغزد. در واقع اگر ویرایش ۱.۶۳ و پایین‌تر آن را آزمایش بکنید می‌بینید که مثلاً نوار لغزان عمودی آن را، اگر کلید جهتی پایین را همینطور فشار دهید، بعد از سه چهار ثانیه بالاخره تسلیم [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
یکی از ایرادهای گزارش شده برای ویرایشهای قدیمی‌تر <a href="http://ganjoor.sourceforge.net/">گنجور رومیزی</a> این بود که <acronym title="scrollbars">نوارهای لغزان</acronym> آن با کمک کلیدهای جهتی نمی‌لغزد. در واقع اگر ویرایش ۱.۶۳ و پایین‌تر آن را آزمایش بکنید می‌بینید که مثلاً نوار لغزان عمودی آن را، اگر کلید جهتی پایین را همینطور فشار دهید، بعد از سه چهار ثانیه بالاخره تسلیم می‌شود و راه می‌افتد اما خوب! سخت راه می‌افتد (دلیلش از لحاظ برنامه‌نویسی احتمالاً این است که کلید جهتی مزبور در واقع فوکوس را دارد بین کنترلها جابجا می‌کند و به هر کدام چند میلی ثانیه اجازهٔ مالکیت آن را می‌دهد تا آخر سر نوبت به نوار لغزان می‌رسد). توی ویرایش جدیدتر این مشکل را حل کردم.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اما «چطورش» شاید به درد برنامه‌نویسهای (احتمالاً تازه‌کار یا کم‌سواد مثل خودم) <acronym title="Windows Forms">ویندوز فرمز</acronym> بخورد (چون راه حلش را با جستجو پیدا نکردم): کنترل اصلی گنجور رومیزی یک User Control ساده است که نشانی شعرها یا دسته‌های شعرها و همینطور شماره بیتها با استفاده از کنترلهای LinkLabel و مصرعها با استفاده از یک کنترل مشتق از Label روی آن تعبیه شده و ویژگی AutoScroll آن فعال است. به این ترتیب، با توجه به جای پایین‌ترین و سمت چپ‌ترین کنترل، نوارهای لغزندهٔ آن به طور خودکار ظاهر می‌شوند. من برای این که بتوانم کلیدهای جهتی را برای حرکت دادن نوارهای لغزان دریافت کنم رویداد PreviewKeyDown را برای این کنترل به صورت زیر نوشتم:
</p>
[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]
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در مورد حلقهٔ دوتایی کلیدهای PageDown و PageUp، دلیلش را نمی‌دانم ولی بدون اصرار ;) کار نمی‌کرد! بعد این رویداد را علاوه بر UserControl اصلی، همه جا، پس از ایجاد و اضافه کردن زیرکنترلهایش به آنها هم نسبت دادم:
</p>
[code lang="c#"]
        private void AssignPreviewKeyDownEventToControls()
        {
            foreach (Control ctl in this.Controls)
                ctl.PreviewKeyDown += GanjoorViewer_PreviewKeyDown;
        }
[/code]
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در هر صورت، راه حل، کمی عجیب و غریب است ولی کار می‌کند. اگر دوستان راه‌حل بهتری سراغ دارند پیشنهاد دهند. کد گنجور رومیزی نیز در دسترس و قابل دریافت است (<a href="http://ganjoor.sourceforge.net/develop/">این صفحه</a> را ببینید). فهرست تغییرات گنجور رومیزی را در <a href="http://ganjoor.sourceforge.net/changelog/">این صفحه</a> می‌توانید ببینید.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1388/09/20/scroll-autoscrolls-using-arrow-keys/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>گنجور رومیزی تحت لینوکس</title>
		<link>http://www.gozir.com/1388/07/17/linjoor/</link>
		<comments>http://www.gozir.com/1388/07/17/linjoor/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 14:25:28 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[نقل قول]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1578</guid>
		<description><![CDATA[
چند روز پیش دوستی در مورد امکان ارائه‌ی نسخه‌ی مکینتاش گنجور رومیزی سؤال کرده بود.


می‌دانستم که به کمک پروژه‌ی مونو می‌توان برنامه‌های دات‌نتی را تحت لینوکس اجرا کرد. پیشتر هم به کمک ابزاری که از سوی توسعه‌دهندگان مونو ارائه شده (اینجا را ببینید)، سازگاری گنجور رومیزی را با مونو تحقیق کرده بودم. تنها ناسازگاری گزارش [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
چند روز پیش دوستی در مورد امکان ارائه‌ی نسخه‌ی مکینتاش گنجور رومیزی <a href="http://ganjoor.sourceforge.net/1388/07/17/10/">سؤال کرده بود</a>.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
می‌دانستم که به کمک <a href="http://www.mono-project.com">پروژه‌ی مونو</a> می‌توان برنامه‌های <acronym title=".NET">دات‌نتی</acronym> را تحت لینوکس اجرا کرد. پیشتر هم به کمک ابزاری که از سوی توسعه‌دهندگان مونو ارائه شده (<a href="http://farasun.wordpress.com/2009/07/19/run-your-dot-net-application-on-linux/">اینجا</a> را ببینید)، سازگاری گنجور رومیزی را با مونو تحقیق کرده بودم. تنها ناسازگاری گزارش شده توسط <a href="http://mono-project.com/MoMA" title="MoMA">این برنامه</a> خاصیت راست به چپ نوار ابزار برنامه بود که در فهرست در <acronym title="TODO">دست اقدام</acronym>های پروژه‌ی مونو قرار دارد.
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/10/moma.jpg" alt="ناسازگاریهای گنجور رومیزی با مونو" width="500" height="100" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
با توجه به آن که مونو نسخه‌ی مکینتاش هم دارد دوستمان را به کد منبع گنجور رومیزی (قابل دریافت از <a href="http://sourceforge.net/projects/ganjoor/files/">اینجا</a>) و پروژه‌ی مونو ارجاع دادم و قرار شد اگر ایشان به نتیجه رسیدند مرا هم در جریان قرار دهند.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
در هر صورت، امروز فرصتی شد تا به کمک <acronym title="Mono LiveCD">دیسک زنده‌ی مونو</acronym> (قابل دریافت از <a href="http://www.go-mono.com/mono-downloads/download.html">اینجا</a>) نظریه‌ی امکان اجرای برنامه را تحت لینوکس آزمایش کنم.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
نتیجه آن که با جایگزینی اسمبلی مربوط به ارتباط با پایگاه داده‌های SQLite با نسخه‌ی کاملاً Managed (من نسخه‌ی جاری آن را از <a href="http://sourceforge.net/projects/sqlite-dotnet2/files/SQLite%20for%20ADO.NET%202.0/1.0.65.0/SQLite-1.0.65.0-managedonly-binaries.zip/download">اینجا</a> گرفتم) بدون نیاز به تغییر کد و در محیط <a href="http://monodevelop.com/" title="MonoDevelop">مونو دِوِلپ</a> می‌توان پروژه را باز و کامپایل کرد (جالب آن که یک خط کد زاید را مونودولپ پیدا می‌کند و در موردش هشدار می‌دهد که فکر می‌کنم ویژوال استودیو در موردش هشدار نمی‌دهد) و نهایتاً آن را از طریق این محیط یا به کمک خط فرمان اجرا کرد.
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/10/MonoDevelop.gif" alt="محیط برنامه‌نویسی مونو" width="500" height="416" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
ایراد قابل مشاهده (علاوه بر مشکل راست به چپ منو و نوار ابزار) نحوه‌ی نمایش متون فارسی است که فکر می‌کنم اشکال از دیسک زنده‌ی مونو باشد: با آن که امکان انتخاب زبان فارسی از منوی بوت دیسک زنده‌ی یاد شده وجود دارد من نتوانستم در این محیط فارسی تایپ کنم و فکر می‌کنم بسته‌های زبان فارسی این دیسک ناقص هستند. به همین دلیل، حدس می‌زنم که تحت لینوکسی با پشتیبانی کافی از زبان فارسی بتوان برنامه را به صورت کم اشکال اجرا کرد. 
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/10/ganjoor-linux.jpg" alt="صفحه‌ی اول گنجور رومیزی تحت دیسک زنده‌ی مونو" width="500" height="371" class="centered" />
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/10/ganjoo-linux2.jpg" alt="ترجیع بند معروف سعدی در گنجور رومیزی تحت لینوکس" width="500" height="371" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
هر چند، پروژه‌ی مونو هنوز گویا کار زیاد دارد. به عنوان نمونه، در صورتی که پنجره‌ی «تنظیمات» گنجور رومیزی را باز کنید و روی دکمه‌ی «تنظیمات پیش‌فرض» کلیک کنید، برنامه بلافاصله بسته می‌شود و در ترمینال چنین خطایی اعلام می‌شود:
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/10/gterm.gif" alt="خطای برنامه بعد از خروج ناخواسته" width="500" height="393" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
با این وصف، احتمالاً می‌توان به زودی مستقل بودن از سیستم عامل را به ویژگیهای برنامه‌های دات‌نتی اضافه کرد که پیش از این از جمله خاصیتهای منحصر به فرد برنامه‌های مبتنی بر جاوا بوده (و البته به دلیل نقائصش یا احتمالاً به دلیل حسادت برنامه‌نویسان سایر سکوها برایش جُکهایی مثل این ساخته‌اند: <a href="http://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/1284837#1284837">جاوا: یک بار بنویسید، همه جا اشکالش را بیابید!</a>، یا <a href="http://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/236736#236736">این یکی</a>).
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
<strong>پی‌نوشت:</strong> با لینوکس <a href="http://www.opensuse.org/en/">OpenSUSE</a> نگارش ۱۱.۱ به صورت نصب کامل (که امکان تایپ عربی داشت) هم امتحان کردم. نتیجه همینی است که در تصاویر مشخص است. ضمن آن که برای اجرای برنامه‌ی دات‌نتی تحت مونو نیازی به کامپایل مجدد آن نیست و من بدون کامپایل مجدد و با استفاده از فایل اجرایی تولید شده توسط ویژوال استودیو، پس از جایگزینی اسمبلی مربوط به SQLite توانستم برنامه را به کمک فرمان mono اجرا کنم.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
<strong>پی‌نوشت ۲:</strong> نرم‌افزار ساغر راه حل نهایی برای مرور اشعار گنجور تحت لینوکس است. <a href="http://www.gozir.com/1389/10/06/saaghar/">اینجا</a> را ببینید.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1388/07/17/linjoor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>میانبر مزاحم</title>
		<link>http://www.gozir.com/1388/06/13/vs-ctrl-shift-2/</link>
		<comments>http://www.gozir.com/1388/06/13/vs-ctrl-shift-2/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 12:47:13 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1534</guid>
		<description><![CDATA[
اگر مثل من با Ctrl+Shift+2 نیم‌فاصله می‌زنید، با ویژوال استودیو کار دارید و نهایتاً باید هر از چند گاه در محیط این نرم‌افزار فارسی تایپ کنید احتمالاً متوجه شده‌اید که تایپ نیم‌فاصله در محیط این نرم‌افزار در حالت پیش‌فرض ممکن نیست (من تا به حال با کپی مشکل را حل می‌کردم!). علت هم مشخص است: [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
اگر <a href="http://www.gozir.com/1388/03/10/half-space/">مثل من</a> با Ctrl+Shift+2 نیم‌فاصله می‌زنید، با ویژوال استودیو کار دارید و نهایتاً باید هر از چند گاه در محیط این نرم‌افزار فارسی تایپ کنید احتمالاً متوجه شده‌اید که تایپ نیم‌فاصله در محیط این نرم‌افزار در حالت پیش‌فرض ممکن نیست (من تا به حال با کپی مشکل را حل می‌کردم!). علت هم مشخص است: این کلید ترکیبی با یکی از میانبرهای ویژوال استودیو تداخل می‌کند. چند روز پیش یکی از همکاران میانبر متداخل ;) را پیدا کرد (View.BrowsePrevious). برای حل مشکل از طریق پنجره‌ی Options این نرم‌افزار آن را غیرفعال کنید یا تغییر دهید (تصویر را ببینید).
</p>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/09/ctrl-shift-2-vs.jpg" alt="Ctrl+Shift+2 یکی از میانبرهای پیش‌فرض ویژوال استودیو است"  width="500" height="289" class="centered" />]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1388/06/13/vs-ctrl-shift-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>رومیزی نو</title>
		<link>http://www.gozir.com/1388/05/02/dg-1/</link>
		<comments>http://www.gozir.com/1388/05/02/dg-1/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 11:56:07 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[ادبیات]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[زبان فارسی]]></category>
		<category><![CDATA[نرم‌افزار]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1518</guid>
		<description><![CDATA[
کمی روی گنجور رومیزی کار کردم. حالا بالایش یک نوار ابزار دارد با چند دکمه، پایینش یک نوار وضعیت و خوب! یک کارهایی هم می‌کند   . برایش یک نصاب ساختم و پروژه را به سایت سورس فورج منتقل کردم. تصویری از آن را ببینید:



دوستانی که آن فایل ۲۱ مگابایتی پیشین را دریافت کرده‌اند [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
کمی روی <a href="http://www.gozir.com/1388/04/29/desktop-ganjoor/">گنجور رومیزی</a> کار کردم. حالا بالایش یک نوار ابزار دارد با چند دکمه، پایینش یک نوار وضعیت و خوب! یک کارهایی هم می‌کند ;) . برایش یک نصاب ساختم و پروژه را به سایت <a href="http://sf.net">سورس فورج</a> منتقل کردم. تصویری از آن را ببینید:
</p>
<a href="http://ganjoor.sourceforge.net"><img src="http://www.gozir.com/logman/wp-content/uploads/2009/07/dg-1.0.jpg" width="500" height="375" alt="گنجور رومیزی" class="centered" /></a>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
<strong>دوستانی که آن فایل ۲۱ مگابایتی پیشین را دریافت کرده‌اند</strong> کافی است فقط <a href="http://sourceforge.net/projects/ganjoor/files/ganjoor.exe/download">این فایل اجرایی</a> را دریافت کنند و آن را در پوشه‌ای که برنامه را در آن باز کرده‌اند جایگزین فایل قبلی کنند. باقی دوستان، در صورت تمایل برنامه را از <a href="http://ganjoor.sourceforge.net">اینجا</a> دریافت کنند.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1388/05/02/dg-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>خوراکی برای فیلمها</title>
		<link>http://www.gozir.com/1387/11/28/wp-movie-ratings/</link>
		<comments>http://www.gozir.com/1387/11/28/wp-movie-ratings/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 18:03:03 +0000</pubDate>
		<dc:creator>حمیدرضا</dc:creator>
				<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[خودم]]></category>
		<category><![CDATA[گزیر]]></category>

		<guid isPermaLink="false">http://www.gozir.com/?p=1404</guid>
		<description><![CDATA[
می‌دانید؟! شبها پیش از این که بخوابم، بیشتر وقتها، -دیگر فکر می‌کنم برایم عادت شده-، به طور ناخودآگاه یک لحظه چشمم را باز می‌کنم و تاریکی روبه‌رو را نگاه می‌کنم. فکر می‌کنم به این که الان کجا هستم، پارسال کجا بودم، چند سال پیش کجا بودم و آن وقتها دوست داشتم الان کجا باشم. می‌دانید؟! [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
می‌دانید؟! شبها پیش از این که بخوابم، بیشتر وقتها، -دیگر فکر می‌کنم برایم عادت شده-، به طور ناخودآگاه یک لحظه چشمم را باز می‌کنم و تاریکی روبه‌رو را نگاه می‌کنم. فکر می‌کنم به این که الان کجا هستم، پارسال کجا بودم، چند سال پیش کجا بودم و آن وقتها دوست داشتم الان کجا باشم. می‌دانید؟! مثل برق دارد می‌گذرد روزها و ساعتها. نه این که واقعاً هدف مهمی داشته باشم و از نرسیدن به آن حسرت بخورم، نه! فقط دوست دارم این روزها و ساعتهایی را که پشت سر می‌گذارم ازشان یک خروجی، یک یادگاری داشته باشم. بدانم که این ساعتها را تلف نکرده‌ام. می‌دانید؟! گاهی فکر می‌کنم به این که اگر من، فردا، دیگر بیدار نشوم از دنیا چه چیزی کم می‌شود. آیا اصلاً اگر کل من و زندگی من را از فهرست آدمهایی که تا به حال آمده‌اند و رفته‌اند حذف کنند اتفاق مهمی می‌افتد؟! جواب تأسف‌آوری را که به آن می‌رسم احتمالاً خودتان می‌توانید حدس بزنید.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
بگذریم! روی همان حساب پاراگراف اول دوست دارم خیلی از کارهایی را که می‌کنم -هر چند اهمیت چندانی نداشته باشند- مستند کنم. کارهایی با حداقل ارزش <a href="http://flickr.com/photos/hrm1359/favorites/">دیدن یک عکس خوب</a> و دیدن یک فیلم. در راستای فعالیت دوم، افزونه‌ای را بر روی وردپرس نصب کرده‌ام که به من امکان ثبت فهرست فیلمهایی را که دیده‌ام می‌دهد (<a href="http://paulgoscicki.com/projects/wp-movie-ratings/">نشانی این افزونه</a>). به کمک این افزونه می‌توان به کمک یک <acronym title="bookmarklet">نشانک</acronym> (بوکمارکلت) به آسانی دیدن فیلمها را ثبت کرد، علاوه بر آن، به آنها امتیاز داد و یک توضیح یا نقد کوچک راجع به آنها نوشت. نهایتاً فهرست فیلمها را در قالب یک صفحه‌ی مجزا و یک ابزارک وردپرس منتشر کرد. فهرست فیلمهایی را که تا به حال به کمک این افزونه دیده شدنشان را ثبت کرده‌ام <a href="http://www.gozir.com/movies/">اینجا</a> ببینید.
</p>
<a href="http://www.gozir.com/movies/"><img src="http://www.gozir.com/logman/wp-content/uploads/2009/02/wp-movie-ratings-screenshot.gif" alt="فیلمهایی که دیده‌ام" title="" width="493" height="292" class="centered" /></a>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
فکر می‌کنم یک سال و نیمی هست که من این افزونه را نصب کرده‌ام و از آن زمان تا حالا این افزونه چندان تغییری نکرده و به‌روزرسانی عمده‌ای برای آن ارائه نشده. به همین لحاظ این افزونه نقصهایی هم دارد. یکی از نقصهای آن عدم ارائه‌ی خروجی آر.اس.اس (خوراک) است.
</p>
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
امروز به نظرم رسید که خروجی خوراکی برای این افزونه درست کنم و آن را به <a href="http://friendfeed.com/hrm">حساب کاربری فرندفیدم</a> اضافه کنم. کمی جستجو کردم و کدی که در ادامه می‌بینید نتیجه‌ی این جستجوهاست. اگر بخواهید برای وردپرس خروجی خوراک بدلخواه درست کنید باید از چنین ساختاری استفاده کنید. خروجی نهایی یک افزونه‌ی ساده است. با امید این که نویسنده‌ی اصلی این افزونه بالاخره روزی خروجی خوراک را به آن اضافه خواهد کرد تمام چیزهایی را که می‌توانستند «انتخابی» باشند در متن کد گذاشته‌ام (عنوان خوراک، نشانی، تعداد و ...) و اگر خواستید از آن استفاده کنید باید این موارد را ویرایش کنید. ضمن آن که افزونه‌ی امتیازدهی به فیلمها در وبلاگ من در پوشه‌ی wp_movie_ratings نصب شده و افزونه‌ی نوشته شده توسط من برای این که درست کار کند باید در ریشه‌ی پوشه‌ی افزونه‌ها قرار گیرد و اگر غیر از این می‌خواهید باشد باید آن را ویرایش کنید.
</p>
<span id="more-1404"></span>
<img src="http://www.gozir.com/logman/wp-content/uploads/2009/02/code.gif" alt="چون کد حاوی تگهای rss بود و خوراک وبلاگ را خراب می‌کرد -به اطلاع آقای الوانی- تصویرش را گذاشتم" width="520" height="873" class="centered" />
<p style="text-align:right; direction:rtl; font:normal 12px tahoma;">
خروجی را به کمک <a href="http://validator.w3.org/feed/">یک سرویس اعتبار سنجی خوراک</a> اعتبارسنجی کردم. خطایی ندارد و فقط یک هشدار دارد. اما توصیه می‌کنم جهت تولید خروجی بهتر و همچنین پایین آمدن بار ناشی از مراجعه‌ی خوراکخوانها، خوراک را به فیدبرنر بدهید و از خروجی آن استفاده کنید. اگر از افزونه‌ی <a href="http://orderedlist.com/wordpress-plugins/feedburner-plugin/">فیداسمیت</a> برای انتقال ترافیک خوراکتان به فیدبرنر استفاده می‌کنید باید آن را غیرفعال کنید، چون تفاوتی بین این خوراک و خوراک استاندارد وردپرس قائل نمی‌شود. کد این افزونه را از <a href="http://www.gozir.com/logman/wp-content/uploads/2009/02/wp_mrrss.zip">اینجا</a> دریافت کنید. نمونه خروجی این افزونه را پس از پخته شدن توسط فیدبرنر <a href="http://feeds2.feedburner.com/hrmmovies">اینجا</a> ببینید.
</p>]]></content:encoded>
			<wfw:commentRss>http://www.gozir.com/1387/11/28/wp-movie-ratings/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

