بایگانی برای اردیبهشت

تقویم فارسی (هجری شمسی) برای N900

چهارشنبه, 15 اردیبهشت 1389

تقریبا یک ماهی میشه که n900 خریدم.

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

به هر حال من هم از همون روزهای اول به فکر نوشتن یک تقویم شمسی برای این گوشی بودم. تا اینکه یک روز به ذهنم زد که از کتابخونه icu استفاده کنم اینطوری میشد یک تقویمی نوشت که همه تقویم ها و زبانهای دنیا رو ساپورت کنه. گفتم حتما پایتون ماژول برای icu داره توی پکیج های پایتون گشتم دیدم بعله pyicu هست. فقط یک مشکلی بود که تو پکیج های pymaemo نبود. خلاصه سورسش رو گرفتم بردم تو SDK برای armel کامپایل کردم. فایل ها رو ریختم رو گوشی و یک اسکریپت کوچولوی پایتون برای تستش نوشتم. مثل باقلوا کار کرد. دست به کار شدم یک ویجت براش نوشتم. یک تایمر هم گذاشتم راس ساعت ۱۲ شب ویجت رو رفرش کنه. در ضمن با استفاده از dbus-monitor سیگنال تغییر زمان سیستم رو هم پیدا کردم تا بتونم در صورت تغییر دستی تاریخ ویجت رو رفرش کنم.

ویجت رو قابل تکثیر تعریف کردم تا بشه تقویم های مختلف رو همزمان داشت و از gconf برای ذخیره تنظیمات استفاده کردم.

خلاصه نتیجه شد این:

n900-persian-calendar

پکیجش کردم گذاشتمش تو مخزن extras-devel :

http://maemo.org/packages/view/multical-date-widget/

آپدیت:
برای نصب این برنامه لینک زیر رو روی گوشی باز کنید:

http://farhadi.ir/downloads/multical-date-widget.install

تقویم فارسی برای php 5.3

جمعه, 10 اردیبهشت 1389

شش ماه پیش امید متقی توی وبلاگش در مورد پشتیبانی php 5.3 از تقویم فارسی نوشته بود. این امکان با اضافه شدن اکستنشن Intl به اکستنشن های پیشفرض php در نسخه 5.3 به بعد فراهم شده. این اکستنشن در واقع امکان کار با کتابخونه ICU رو برای php فراهم میکنه.  دیدم کار با این توابع یک کمی مشکله تصمیم گرفتم با این توابع یک توسعه برای کلاس DateTime بنویسم که کار باهاش آسون بشه. این شد که چهار ماه پیش این کلاس رو نوشتم (اینجا) ولی خوب به خاطر مشغله کاری و تنبلی وقت نکردم در موردش چیزی بنویسیم.

با این کلاس در واقع همون امکانات DateTime رو به اضافه پشتیبانی از تقویم‌ها و زبان‌های مختلف دارید. برای مثال:

$date = new IntlDateTime('now', 'Asia/Tehran', 'persian', 'fa');
echo $date->format('yyyy/MM/dd'); // ۱۳۸۹/۰۲/۱۰
echo $date->format('E dd LLL yyyy'); // جمعه ۱۰ اردیبهشت ۱۳۸۹

نحوه کارش مشابه کلاس DateTime هست با تفاوت های زیر:

  1. پارامتر اول علاوه بر رشته میتونه timestamp و یا یک شی از نوع DateTime باشه.
  2. در پارامتر اول کاراکترهای عددی به هر زبانی میتوانند باشند. یعنی اگر رشته شما شامل اعداد فارسی یا عربی یا ترکیبی از اونها و یا هر زبون دیگه ای که باشه با این کلاس بدون مشکل کار میکنه. (این قسمت رو به لطف کلاس NumberFormatter که یکی دیگه از امکانات intl هست نوشتم )
  3. برای پارامتر دوم به جای شی DateTimeZone میشه از رشته هم استفاده کرد.
  4. پارامتر سوم نوع تقویم رو مشخص میکنه که میتونه Buddhist, Chinese, Coptic, Ethiopic, Gregorian, Hebrew, Indian, Islamic, Islamic-Civil, Japanese, Persian, Taiwan باشه. (دم ICU گرم فکر کنم فقط تقویم مایاها رو یادشون رفته پیاده کنن!)
  5. پارامتر چهارم زبانه برای مثال میتونه fa ، fa_IR ، en ، en_US ، en_UK و … باشه
  6. یکی از سختی های کار با کلاس IntlDateFormatter اینه که باید حتما pattern تاریخ رو مشخص کنید ولی کلاس IntlDateTime در اکثر مواقع خودش میتونه pattern رو تشخیص بده و برای موارد خاص که pattern توسط کلاس قابل تشخیص نباشه باید خودتون pattern رو به عنوان پارامتر پنجم بدید.
  7. برای استفاده از متد format باید pattern رو به فرمتی که ICU قبول میکنه بدید. برای استفاده از فرمت خود php  از متد classicFormat استفاده کنید.
  8. متد فرمت timezone هم به عنوان پارامتر دوم قبول میکنه (بدون تغییر timezone داخلی شی)
  9. کلاس IntlDateFormatter با تایم زون هایی که DST دارن مشکل داره که من توی IntlDateTime رفعش کردم.
  10. تنها اشکالش اینه که با تاریخ های خارج از محدوده timestamp کار نمیکنه که به عنوان باگ برای IntlDateFormatter گزارش دادم. (آپدیت: این مشکل هم رفع شد.)
  11. متد modify تاریخ رو مطابق با تقویمی که ست شده ویرایش میکنه (مثلا برای تاریخ امروز +1 month رو اگر روی تقویم میلادی اجرا کنی 30 روز و اگر روی تقویم هجری شمسی اجرا کنی 31 روز تاریخ رو جلو میبره)
  12. با متد setCalendar و setLocale تقویم و زبان رو میتونید عوض کنید که مثلا برای تبدیل تاریخ از میلادی به شمسی و بالعکس کاربرد داره.

یک تعداد testcase هم براش نوشتم که برای آشنایی با طرز کار کلاس میتونین یک نگاهی بهش بندازین. البته هنوز تستهاش کامل نیست. بعدا اگه فرصت کنم کاملش میکنم.

همونطور که گفتم این کلاس فقط روی php 5.3 به بعد کار میکنه اگر دنبال کدی میگردید که روی php 5 هم کار کنه یک کلاس دیگه نوشتم (اینجا) که البته محدودیت هایی نسبت به این کلاس داره (در حال حاضر فقط تقویم فارسی و میلادی رو ساپورت میکنه ولی قابل گسترش برای سایر تقویم ها هست. از الگوی factory استفاده میکنه و بعد از ایجاد شی دیگه تقویم قابل تغییر نیست.)