۱۳۸۹/۰۵/۰۶

تجربه‌ای با Sphinx

بروزرسانی صفخات وب یکی از معضلات من است. هر بار باید فایل HTML را باز نموده تغییراتی داده و آنرا آپلود نمایم. اگر فایل با میکروسافت ورد آماده شده باشد که حجم و متخلفات آن بسیار زیاد است. مدتی پیش برای آماده‌سازی صفحه وب مربوط به داده‌ها و پیاده‌سازیهای یکی از مقالاتم ترجیح دادم که آنرا به صورت دستی آماده نمایم تا با ورد. به این ترتیب حجم فایل بسیار کم شد. برای قرار دادن جداول لاتک مقاله‌ام هم یک اسکریپت SED نوشتم که کار بسی راحت شد.
در آن مورد کارم راه افتاد ولی این مشکل برای مستندسازی فایلهای یک پروژه وجود دارد. یکی از راههای انجام چنین کاری استفاده از reStructured Text و استفاده از ابزاری همچون Sphinx برای تبدیل آنها به HTML یا LaTeX است.
در جستو به این صفحه از سایت VanderLinden رسیدم که راهنمای خوبی در مورد تولید خودکار مستندات با استفاده از Mercurial, Sphinx, reStructured Text است. چون با راهنمایی‌های سایت مذکور به نتیجه رسیدم تصمیم گرفتم که آنرا در اینجا هم ذکر کنم. روش ذکر شده در آن در لینوکس است که من برخی مراحل را در اوبونتو چک کردم ولی تا آخر نرفتم. فقط یک نکته باید ذکر کنم که از آنجا که برخی از ملزومات اینکار در سورس‌فورج قرار دارد و نصب آنها در اوبونتو با مشکل مواجه می‌شود، باید آنها را جداگانه دانلود نمود و سپس نصب نمود. به نظرم بیشتر آنها با دستور خط فرمان python setup.py install نصب می‌شوند. فایلهای .egg‌هم با easy_install نصب می‌شوند. در ادامه به مراحل کار در ویندوز خواهیم پرداخت.
به فرض python روی سیستم شما نصب شده است.

نصب SPHINX، DOCUTILS و JINJA2
Sphinx، Docutils و Jinja2 را از سایتهای مربوطه دانلود و نصب نمایید.

نصب Mercurial
در مورد Mercurial قبلاً پستی داشته‌ام. آنرا نصب نمایید.

ایجاد یک مخزن 
با دستور hg init mydox مخزنی به نام mydox ایجاد کنید. قرار است به محض commit کردن این مخزن، فایلهای HTMLی که بعداً ساخته می‌شوند به صورت خودکار و مبتنی بر فایلهای .rst بروزرسانی شوند. اکنون باید شاخه .hg را داشته باشید.
من برای تست mydox را در همان شاخه Sphinx ایجاد کردم.

پیکربندی SPHINX
با دستور python sphinx-quickstart پیکربندی انجام می‌پذیرد. برای نام پروژه، نام مؤلف و شماره نسخه مواردی را خودتان درنظر بگیرید؛ تنظیمات پیش‌فرض را قبول کنید و تا انتها ادامه دهید. اکنون باید شاخه‌های source,build ایجاد شده باشند.

ایجاد فایل RESTRUCTURED TEXT
فایل ReSTی که قرار است مثلاً به HTML‌تبدیل شود را در شاخه source ایجاد نمایید. به فرض این فایل با نام  first_doc.rst و با محتویات زیر است:
=========================
This Is My First Document
=========================

Yes, this is my first document.  It's lame.  Deal with it.
اکنون با استفاده از دستور python ..\sphinx-build.py source/ docs می‌توان خروجی HTML فایل rst. را در شاخه mydox/docs داشت.

خودکارسازی تولید HTML در هنگام COMMIT
اگر خواسته باشیم در هنگام commit کردن تغییرات توسط Mercurial، به صورت خودکار فایلهای HTML بروزرسانی شوند باید از precommit hook در Mercurial استفاده نمود.
فایل mydox/.hg/hgrc را باز نمایید و خطوط زیر را به آن اضافه کنید (اگر این فایل نیست، ایجادش کنید):

[hooks]
precommit.sphinxify = MYDOXPATH\sphinxify_docs.bat

که در آن MYDOXPATH مسیر شاخه mydox است.
فایل sphinxify_docs.bat را با محتویات زیر در شاخه mydox ایجاد کنید:
cd MYDOXPATH
python ..\sphinx-build.py source/ docs/
حال اگر هر commitی در Mercurial انجام دهید، به شرطی که تغییری در فایلها داده باشید، HTML به صورت خودکار بروزرسانی خواهد شد:

> hg ci -m "Initial commit" 
موارد دیگری هم در پست VanderLinden هست که می‌توانید به آن مراجعه نمایید. برای خودم که خیلی جالب بود، امیدورام برای شما هم مفید باشد.
به عنوان یک نمونه سایت که از Sphinx استفاده کرده است، سری به سایت http://www.mathjax.org بزنید.

۱۳۸۹/۰۵/۰۴

میلاد حضرت صاحب‌الزمان (علیه‌السلام) مبارک باد


 از امام صادق علیه السّلام روایت شده که پدر بزرگوارشان در پاسخ کسی که از فضیلت شب نیمه شعبان از ایشان پرسیده بود فرمودند:

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

۱۳۸۹/۰۴/۱۷

کتابخانه جبرخطی Armadillo برای ++C

همانگونه که می‌دانید ++C کتابخانهٔ ریاضی قوی ندارد. Armadillo یک مجموعه توابع برای جبرخطی در ++C فراهم کرده است.
به همراه این کتابخانه مثالهایی هم هست که می‌توان اجرا نمود و لذت برد. برای بسیاری از عملیات ماتریسی MATLAB معادلی هم در آرمادیلو وجود دارد. گرچه که به گفته سایت آن، نیازی به LAPACK,BLASS نیست و این دو فقط برای افزایش کارایی می‌توانند در کنار آرمادیلو استفاده شوند، لیکن من در اجرای تابع solve آن با مشکل روبرو شدم که نیاز به LAPACK,BLASS داشت. روش رفع مشکل را در اینترنت نیافتم. خوشبختانه مشکل به صورتی که گفته خواهد شد قابل رفع است. اگر شما هم با چنین مشکلی مواجه شدید کافیست
  1. LAPACK,BLASS را از اینجا دانلود نموده و فایلها را باز کنید.
  2. سپس مسیرهای LAPACK و BLASS را به مسیر مورد جستجوی لینکر اضافه نمایید. به عنوان مثال در Code::Blocks در Project->Build Options->Search Directories->Linker
  3. فایل lapack_win32.lib را در قسمت تنظیمات لینکراضافه کنید.
  4. فایل config.hpp  در مسیر Armadillo PATH/include/armadillo_bits را باز نموده و دستور زیر را را از حالت انتخاب شده خارج نمایید:
#define ARMA_USE_LAPACK



۱۳۸۹/۰۴/۱۲

ابزار CImg برای پردازش تصویر


قبلاً در این پست راجع به نصب OpenCV که یک مجموعه از توابع متن باز برای پردازش تصویر است، مطلبی نوشته بودم. به جز OpenCV ابزارهای دیگری هم هستند که از جمله می‌توان به CImg اشاره کرد. این مجموعه بسیار جمع و جور است و من در اجرای مثالهای آن در Code::Blocks مشکلی نداشتم. فقط یک نکته و آن اینکه در تنظیمات لینکر باید libgdi32.a را اضافه کنید وگرنه با خطای undefined reference to SetDIBitsToDevice@48 مواجه می‌شوید.
ضمناً با باز کردن تصاویر jpeg مشکل دارم و پیام خطایی مبنی بر یافت نشدن gm.exe در مسیر temp ویندوز دریافت می‌کنم که هنوز رفع نشده است ): یکی فهمید به من هم بگوید بی‌زحمت.
خودم فهمیدم: ظاهراً CImg برای کار به تصاویر jpeg به ImageMagick نیاز دارد.