لذت نوشتن با Markdown و Pandoc، قسمت اول

اگر کسی بخواد از گیر و دار استفاده از پکیجای wyswyg مثل ورد یا حتی اپن‌آفیس فرار کنه، راه حل‌های زیادی وجود داره. مهمترین این راه حل‌ها زبون‌های نشانه‌گذاری متن مختلف مثل HTML یا latex هستند. اما اکثر متن‌هایی که روزمره باهاشون سر و کار داریم از بخش کمی از قابلیت‌های این زبون‌ها استفاده می‌کنند. به علاوه HTML برای وب توسعه داده شده و latex برای متن‌های چاپی. آیا زبون نشونه گذاری‌ای هست که هم ساده باشه و هم بشه همه جا بردش؟

خوب جواب این سوال روش‌های نشونه گذاری ساده‌تره. شاید مهمترین این زبونهای ساده‌تر Markdown باشه. متنی که با Markdown تایپ می‌شه به خوبی توسط انسان قابل خوندنه. مثله این متن رو در نظر بگیرید:

تهیه ته‌چین
==========
به نظرم *ته‌چین* از خوشمزه‌ترین غذاهاست. برای پختن ته‌چین به این مواد نیاز هست:

– برنج
– سینه مرغ
– ماست
– زعفران

یکی بود می‌گفت:

> برای پختن ته‌چین باید صبر داشت.

خوب این متن ساده یه متن Markdown بود که کامپایل می‌شه به:

تهیه ته‌چین

به نظرم ته‌چین از خوشمزه‌ترین غذاهاست. برای پختن ته‌چین به این مواد نیاز هست:

  • برنج
  • سینه مرغ
  • ماست
  • زعفران

یکی بود می‌گفت:

برای پختن ته‌چین باید صبر داشت.

به همین سادگی. خیلی از سایتها مثل github و stack overflow برای نوشته‌هاشن ورودی Markdown قبول می‌کنند.

شاید بهترین ابزار برای کامپایل یه متن Markdown کامپایلر Pandoc باشه. با استفاده از Pandoc می‌شه راحت متن رو از/به HTML، Latex و بسیاری فرمت‌های دیگه تبدیل کرد. به علاوه Pandoc یه سری چیزا مثل اضافه کردن عکس و جدول به متن رو به Markdown‌ اضافه می‌کنه بدون اینکه سادگی و خوانایی قضیه به هم بخوره.

ادیتورای زیادی هستند که Markdown رو پشتیبانی می‌کنند. البته خوب واقعا Markdown نیازی به پشتیبانی زیادی نداره و کافیه یه مقدار بخشای مختلفش تو ادیتور به صورت رنگی نمایش داده بشه. به هر حال از vim و gedit گرفته تا Sublimetext همه افزونه‌هایی برای کار با Markdown دارن. اما یه ادیتور اختصاصی هم به اسم Uber Writer هست که خیلی خوش‌دست و زیباست.

با استفاده از Pandoc و Markdown خیلی کارا می‌شه کرد که تو بخش بعد دو تا از تجربه‌های خودم رو می‌زارم.

خیز برای اول جولای: خاموشی گوگل ریدر

گوگل ریدر (گودر) داره خاموش می‌شه. این وازه منی که از اولین روزهای تولدش تو سال ۸۶ازش استفاده می‌کردم و بعد از رفتن قابلیتهای اجتماعیش هنوزم کاربرشم خبر خوبی نیست.

از میون جایگزینای گودر چندتایی رو امتحان کردم. گودر عاس یه مقدار باسمه‌ایه. فیدلی خوبی، برای آیفون و اندروید اپ هم داره. اما اجتماعی نیست. یه پروژه قدیمی بود به اسم HivMined که الان داره به اسم HiveReader به زندگیش ادامه می‌ده. ایشون قابلیتهای اجتماعی دارن و اعلام کردن تا خاموشی گودر آماده می‌شن. توسعه دهندش الان این شغل تمام وقتشه و ظاهر سایتش هم خوبه. خلاصه که داریم برای خداحافظی آماده می‌شیم.

rvalue ها در ‪C++11‬

rvalue چیست؟
بر اساس تعریف تو ‪C++11‬ به عبارتی lvalue گفته می‌شه که تو حافظه جایی داره و با عملگر & می‌شه بهش دسترسی داشت. به هر عبارتی که lvalue نباشه rvalue می‌گن. lvalueها می‌تونن هم طرف راست و هم طرف چپ یه عبارت انتساب قرار بگیرن، ولی rvalueها فقط می‌تونن طرف راست باشن.

مثلا اگر a و b و c هر سه از نوع int باشن، عبارت‌های a و b و c از نوع lvalue و عبارت a+b و c-2 و ۲۴ از نوع rvalue هستن. طبیعتا یه فانکشنی که داره از نوع مثلا double برمی‌گردونه، مقدارش از نوع rvalueه (تا حال دیدین بشه نوشت ‪sin(x)=2;‬؟)

به چه درد می‌خوره؟
فرض کنید دارید یه کلاس ماتریس می‌نویسید. در حالت عادی عملگر انتساب شما ماتریس سمت راست رو می‌گیری و به کپی از داده‌ها تو ماتریس سمت چپی ایجاد می‌کنه. حالا برای این کلاسمون به عملگر جمع عم می‌نویسم که این عملگر جمع خودش یه ماتریس حاصل برمی‌گردونه. اگه عملگر مساوی مث سابق عمل بکنه، باید داده‌های حاصل رو سمت چپ تساوی کپی بکنه. تو این حالت ماتریس حاصل جمع اضافه می‌مونه. یه راه بهتر اینه که فقط پویینتر داده‌های ماتریس حاصل جمع کپی بشه. البته این راه حل وقتی خوبه که طرف راست تساوی از نوع rvalue باشه. این جاست که rvalue ها مهم میشن. با داشتن نوع rvalue می‌تونیم یه فانکشن رو سربارگزاری کنیم و بگیم اگه پارامترت rvalue بود یه نوع خاص رفتار بکن. سینتکسش هم که خیلی سادست:
[cpp]
void foo(X& x); // lvalue reference overload
void foo(X&& x); // rvalue reference overload

X x;
X foobar();

foo(x); // argument is lvalue: calls foo(X&)
foo(foobar()); // argument is rvalue: calls foo(X&&)
[/cpp]

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

البته تاکید کنم که از قدیم می‌تونستیم فانکشنمون رو به صورت
[cpp]
void foo(X const &x);
[/cpp]
تعریف کنیم که هم رو lvalueها کار می‌کنه هم رو rvalueها، اما فرقی بینشون نمیذاره.

فانکشن stl::move
این فانکشن یه lvalue رو می‌گیره و به صورت rvlue برمی‌گردونه. با استفاده از این فانکشن، میشه برنامه رو مجبور کرد که با یه متغیر به صورت rvalue کار کنه که به موقعش می‌تونه خیلی کمک کننده باشه.

یه کاربرد مهم این فانکشن تو سازنده‌های کلاس‌های مشتق شدست. مثلا این سازنده رو
[cpp]
Derived(Derived&& rhs)
: Base(rhs) // wrong: rhs is an lvalue
{
// Derived-specific stuff
}
[/cpp]
رو با این یکی
[cpp]
Derived(Derived&& rhs)
: Base(std::move(rhs)) // good, calls Base(Base&& rhs)
{
// Derived-specific stuff
}
[/cpp]
مقایسه کنید. مشخصا سازنده اول غلط عمل می‌کنه.

فراخوانی فانکشن‌ها
یه استفاده مهم دیگه از پارامترهای به شکل rvalue برای جلوگیری از کپی شدن متغیرها موقع پاس دادن اون‌هاست. فرض کنید یه فانکشن مثل این داریم:
[cpp]
template
shared_ptr factory(Arg arg)
{
return shared_ptr(new T(arg));
}
[/cpp]
بدیش اینجاست که این فانکشن یه کپی اضافه از arg موقع پاس دادن به سازنده T می‌سازه و ما می‌خوایم جلوی این رو بگیریم. با استفاده از فانکشن std::forward (که هرکدوم از lvalue و rvalue رو به اون یکی تبدیل می‌کنه) و این سینتکس مشکل حل می‌شه:
[cpp]
template
shared_ptr factory(Arg&& arg)
{
return shared_ptr(new T(std::forward(arg)));
}
[/cpp]

این نوشته خلاصه‌ای از منبع اصلی است.

SublimeText، ادیتوری که عاشقش میشی

خیلی درباره ادیتورها خوندیم. دعوای emacs و vi هم که معروفه. اما با این وجود ادیتورهایی که راحت باشن زیاد نیستن. شخصا اصلا نتونستم emacs رو راه بندازم. vi یادگرفتنش خیلی سخته. ادیتور ویژوال استودیو خوب بود. ادیتور Eclipse یه مقدار زیادی شلوغه و البته خود Eclipse خیلی خیلی سنگینه. gedit سیستم پلاگین خوبی داره. اما پریشب که با یکی از کدنویسای پلاگیناش مکاتبه کردم گفت سوییچ کرده رو همین ادیتوری که الان می‌خوام معرفی کنم.

SublimeText2

SublimeText. خوشگله. خیلی سادست. یک عالمه پلاگین داره برای برنامه‌نویسا. از اول یه آدم خوش‌فکر پشتش بوده. چیزی که باید با یک علمه پلاگین تو هر ادیتور دیگه‌ای باشه، از اول تو این ادیتور هست.

مثلا خیلی راحت یشه تو SublimeText با چند تا مکان‌نما کار کرد یا یه با یه میان‌بر تو همه کامندها سرچ کرد.

پلاگین‌هایی که من الان دارم اینان:

  • PackageControl برای نصب پکیج‌ها
  • SublimeRope برای اتوکاپملیت پایتون
  • SyblimePySide برای اتوکامپلیت PyQt و PySide
  • Origami برای کار راحت‌تر با پنلها
  • SublimeClang برای اتوکامپلیت  ‪C++‬ نصبش یه کم قلق داره. برای راهنمای اوبونتوش اینجا رو ببینید.
  • SublimeAStyleFormatter برای فرمت کد  ‪C++‬
  • SublimePythonTidy برای فرمت کد پایتون
  • Git دسترسی خیلی سریع و راحت به دستورات گیت
  • DocBlockr ابزار خوشدست داکیومنت نویسی داخل کد

این هم یه مجموعه فیلم آموزشی خوب و خلاصه. و این هم یه راهنما برای نصبش تو اوبونتو.

در ضمن ورژن ۳ هم به زودی داره میاد. چند تا عیب داره: اوپن سورس نیست و کمی غرغروه از این بابت. به علاوه تا الان زبونهای چپ به راست رو پشتیبانی نکرده.

من هنوز به عنوان جایگزین کامل gedit پیشنهادش نمی‌کنم. اما چند ماهیه تبدیل شده به ادیتور اول من برای توسعه. و باور کنید خیلی خیلی کم احتیاج پیدا می‌کنم دستم رو از رو کیبرد بلند کنم.