ترکی استانبولی با ترانه

در نوشتهٔ پیشین اشاره کردم که بیشتر با هدف درک معنی ترانه‌های ترکی استانبولی دوولینگو (DuoLingo) را استفاده می‌کردم و در نهایت تا به حال به آنجا که باید نرسیدم.

شاید برنامهٔ لینگوکلیپ (با نام قدیمی لیریکس‌ترینینگ) را دیده باشید. با این برنامه می‌توانید متن ترانه‌های در دسترس از طریق آن را مشاهده و تمرین کنید و در بازی پر کردن جاهای خالی یا تایپ کلمات جاافتاده در آن شرکت کنید.

به نظرم رسید با توجه به آن که بیشتر ترانه‌ها و خوانندگان ترکیه‌ای که ما ایرانی‌ها با آنها آشنا هستیم در این برنامه غایب هستند و این که یوتیوبِ جاسازی شده داخل این برنامه اخیراً با بعضی وی‌پی‌ان‌های در دسترس ما مشکل دارد برنامه‌ای بسازم که این ایده را بدون یوتیوب و با ترانه‌های آشنا برای خودمان ارائه کند.

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

از این جهت مثل گذشته به فکر اختراع مجدد چرخ افتادم 😉 -تقریباً مطمئنم ابزار مناسبش وجود دارد و من خوب نگشته‌ام، اما خوب شاید به جای گشتن سرهم کردن ابزاری که این کار را برایم انجام دهد با عادت و روال من همخوانی بیشتری دارد-. به امکانات همگامسازی گنجور رومیزی امکان همگامسازی بر اساس کلمه را اضافه کردم و خروجی مناسبی برای استفاده توسط برنامهٔ خارجی هم به آن اضافه کردم (خروجی json که یک فایل متنی ترجمه هم در حین تولید می‌گیرد).

همگامسازی بر اساس کلمه در گنجور رومیزی

بیشتر کارهای مربوط به ترجمهٔ متن و لغات را هم با استفاده از سرویس ترجمهٔ گوگل یا چت‌جی‌پی‌تی انجام داده‌ام و برنامه در حال حاضر با ۸ ترانه در دسترس است (اینجا).

تصاویری از امکانات فعلی برنامه را می‌بینید:

در حین کوه‌گردی به نظرم رسید یک راه خیلی خوب برای آموختن متن ترانه‌ها و لغات جدید آن است که یک شرح صوتی به فارسی برای هر کدام از ترانه‌ها هم درست کنم که بدون نیاز به به باز کردن گوشی هم بشود از آن استفاده کرد. منتهی چند بار تلاشم برای تولید چنین شرح‌هایی راضی‌کننده نبود. در نهایت به این قناعت کردم که متن ترانه را روی کامپیوتر با صدای پایین پخش کنم و روی آن ترجمه‌ها را بخوانم. به نظرم رسید که «از هیچی بهتر است» ولی صلاح ندیدم در محیط اصلی در دسترس باشد. برای همین آن را به این صورت در برنامه در دسترس قرار دادم که در پنجرهٔ تصویر بعد (مرحلهٔ بعد از انتخاب یکی از ترانه‌ها) سه بار روی «چه کنیم؟» اگر بزنید یک دکمهٔ پخش ظاهر می‌شود که می‌توانید این شرح‌های کمکی را گوش کنید. امیدوارم شرایط فراهم شود و شرح‌های آبرومندتری آماده کنم که نیاز به مخفی کاری نداشته باشد ;).

کد مخفی

ترکی با ترانه را از کافه بازار دریافت کنید.

آیا امروز کافی بودم؟!

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

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

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

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

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

زنجیرهٔ دیگری را که بعدتر شروع کردم زنجیرهٔ تمرین‌های روزانهٔ دوولینگو (DuoLingo) بود. انگیزهٔ اولیه؟ فکر کردم بد نیست متن ترانه‌های ترکی استانبولی را که به نظرم شیرین و دوست‌داشتنی می‌رسید بفهمم و یاد بگیرم. آن زنجیره هم چند باری شکسته شد اگر چه الان و امروز روز ۵۸۱م آخرین زنجیرهٔ شکسته‌نشده‌اش را پشت سر می‌گذارم و دورهٔ ترکی استانبولی آن را تمام کرده‌ام. آیا الان متن ترانه‌ها را می‌فهمم؟ خیر! آیا به اندازهٔ کسی که یک دوره را تمام کرده ترکی بلدم؟ آن هم خیر! چقدر بلدم؟ دانم من این قدر که به ترکی است آب سو!

چاره چیست؟! قطعاً آغاز یک زنجیرهٔ دیگر با یک برنامهٔ دیگر و درست کردن برنامه‌ای برای تمرین متن ترانه‌های ترکی (که در نوشتهٔ بعدی راجع به آن صحبت می‌کنم)!

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

کارنامهٔ گیتهاب امسالم

حدس عدد

چند باری در توییتر یا جاهای دیگر نمونه چالش‌های حدس عدد را بر اساس راهنماهای ارائه شده برای ارقام دیده بودم. جستجویی سطحی کردم و برنامهٔ موبایلی خوبی برای اینجور چالش‌های ریاضی ندیدم. چند روز پیش ویر این که یکی خودم درست کنم به جانم افتاد و هم‌اکنون این بازی با همین عنوان (به صورت رایگان) در بازار در دسترس است (دریافت حدس عدد در بازار).

برای این که حل بازی و همینطور برنامه‌نویسیش را برای خودم ساده‌تر کنم یک پیش‌فرض گذاشتم و آن که عدد جواب رقم تکراری نداشته باشد (شاید یک وقتی این که عدد بتواند رقم تکراری هم داشته باشد را اضافه کردم). در راهنمای جوابها هم با این فرض اگر رقمی در جای درستش ظاهر شود و سپس در جای نادرست تکرار شود تکرار آن به جای آن که «درست در جای نادرست» فرض شود نادرست فرض می‌شود.

در نهایت پس از مشخص شدن جواب با زدن روی عبارت «تبریک! این جواب صحیح است.» می‌توانید ببینید که چطور همهٔ احتمالات دیگر حذف می‌شوند یا چرا یک عدد دیگر ورودی نمی‌تواند جواب باشد.

کاشی‌چینی: فرصتی برای دقت بیشتر در گنجینه‌های تصویری

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

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

کاشی‌چینی - نقاشی‌های نسخه‌های خطی در قالب پازل

همهٔ این تصاویر را پیشتر خودم در گنجینهٔ گنجور برچسبگذاری کرده بودم (مشخص کرده بودم که در نسخه‌های خطی کدامشان تصویر دارند).

کاشی‌چینی - نقاشی‌های نسخه‌های خطی در قالب پازل

در حال حاضر هم همهٔ لینک‌های «اصل نگاره» به همان گنجینهٔ گنجور می‌رسد.

کاشی‌چینی - نقاشی‌های نسخه‌های خطی در قالب پازل

جدول داریم از هر جنس و رنگ ;)

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

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

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

البته شبیه این کارها را پیشتر زیاد انجام داده‌ام و همان حسی که پشت صفحه‌کلید دارم کمک کرده به نتیجه برسانمشان. نتایجی که ایده‌آل و باعث افتخار نیستند ولی کار می‌کنند!

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

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

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

اضافه کردن تبلیغش پایین نوشته‌های اینجا از جمله معدود تغییراتی بود که طی این سالهای اخیر اینجا به خودش دیده (الان حذفش کرده‌ام):

جدول شعر
جدول شعر

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

جدول متقاطع قرآن کریم
جدول متقاطع قرآن کریم

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

جدول متقاطع جاخالی‌های انگلیسی
جدول متقاطع جاخالی‌های انگلیسی

ادامه خواندن “جدول داریم از هر جنس و رنگ ;)”

دریافت gradle برای فلاتر روی مک

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

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

جستجویی کردم و به نتیجهٔ درست نرسیدم.

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

فایل zip گریدل را مستقیماً دریافت کردم و محتوای پوشه را با استفاده از آن طبق الگویی که باقی نسخه‌های کاملاً دریافت شده درست کرده بودند تکمیل کردم.

پوشهٔ .gradle
پوشهٔ .gradle

اولین تلاش با شکست در راه دسترسی انحصاری به فایل‌ها به شکست انجامید. مک را یک بار خاموش و روشن کردم و دومین تلاش به نتیجه رسید.

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

لطفاً خودتان را تکرار نکنید!

Mr Smith In Matrix Reloaded : Repeated himself and failed!

یک اصل یا قاعده یا توصیهٔ برنامه‌نویسی هست که علی رغم آن که عموماً جماعت برنامه‌نویس با آن آشنایی دارند -به نظرم- التزام به پیروی از آن موجب رستگاری همگان در همهٔ کارها خواهد شد ;).

این اصل که به طور خلاصه «DRY» خوانده می‌شود (و متضاد آن «WET» است! ؛ اولی مخفف Don’t Repeat Yourself و دومی مخفف Write Everything Twice) به طور ساده (به زبان برنامه‌نویسان) می‌گوید هر قسمتی از کدِ برنامه که ممکن است لازم باشد در جای دیگری مجدداً استفاده شود؛ لازم است به جای تکرار، به شکل یک کد قابل استفادهٔ مجدد (تابع، کلاس و …) درآید و هر جا لازم شد فراخوانی شود. البته این اصل تعریف پیچیده‌تر و دقیق‌تری هم دارد که درکش مستلزم سوزاندن فسفر بیشتری است: «هر بخشی از دانش در یک سیستم باید یک نمایش یکتا، غیر مبهم و معتبر داشته باشد».

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

همیشه طوری کدنویسی کن که انگار کسی که قرار است کد تو را نگهداری کند یک قاتل زنجیره‌ای روانی است که نشانی خانه‌ات را می‌داند!

Dexter

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

شأن نزول این مطلب آن بود که خود من مدتها است که دارم تاوان عمل نکردن به این قاعده را برای خطای متداولی روی گنجور رومیزی می‌پردازم:

ایمیلهایی که گزارش خطایی با راهکار یکسان برای رفع خطا را در گنجور رومیزی به من داده‌اند

مسأله آن است که در اغلب این موارد، زمانی که برای جلوگیری از تکرار باید صرف شود بسیار کمتر از زمانی است که برای انشا و ارسال جواب تکراری برای تک تک مخاطبان صرف می‌شود. خاتمه آن که، امروز وقت گذاشتم و پاسخ متداول را جایی در دسترس گذاشتم. دعای آخر مجلس آن که کاش در جی‌میل می‌شد فیلتری تعریف کرد که در مواجهه با ایمیل حاوی کلمات تکراری (برای من استثنای برنامه‌نویسی System.BadImageFormatException)، به طور خودکار ایمیل از پیش تعیین شده‌ای را ارسال کند (که در نمونهٔ من ایمیلی حاوی لینک به این صفحه می‌شود).

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

در ادامهٔ بحث نوشتهٔ پیشین در این نوشته به عنوان یک نمونهٔ عملی از نحوهٔ استفاده از رابط برنامه‌نویسی گنجور رومیزی، من قسمتی از یک فایل 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 ساخت که گنجور رومیزی توانایی نمایش اطلاعات آن را دارد:

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