چرا node.js اینقدر طرفدار داره

23 آذر 1389

nodejs

به جرأت میتونم بگم node.js انقلابی‌ترین حرکت در زمینه توسعه وب توی یکی دو سال گذشته بوده. node در github سومین پروژه از لحاظ محبوبیته و همین الان که من دارم این مطلب رو می‌نویسم این پروژه بیش از 4000 تماشاچی داره و بیش از 400 بار fork خورده و 100 ها ماژول براش نوشته شده و همه این اتفاقات در کمتر از یک سال و اندی که از شروع این پروژه می‌گذره افتاده.

اگر اخبار و تحولات توسعه وب رو دنبال کرده باشید حتما تا به حال مطالبی در موردش شنیدید اما ممکنه به اهمیت موضوع پی نبرده باشید. به عبارت دیگه اکثر افراد در وهله اول متوجه نمیشن که node چه چیز جدیدی برای ارائه داره و چی باعث محبوبیت اون شده.

اگر می‌خواهید در مورد node بیشتر بدونید در ادامه این مطلب با من همراه باشید.

خواندن دنباله‌ی این نوشته »

سر و کله زدن با دیتابیس‌های حجیم MySQL

13 آبان 1389

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

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

خواندن دنباله‌ی این نوشته »

WebExtract

21 مهر 1389

بعد از تحریم cpanel و جایگزینی اون با plesk یکی از گلایه های مشتری ها عدم امکان باز کردن فایلهای فشرده از طریق کنترل پنل بوده.

از اونجایی که این امکان، امکان پرطرفداری بود. تصمیم گرفتم که برنامه ای برای این کار بنویسم تا کور بشه چشم هر کی که بخواد ما رو تحریم کنه :D

این شد که دست به کار شدم و WebExtract رو با پایتون نوشتم. این برنامه یک Daemon هست که به صورت یک سرویس نصب میشه و روی پورت 2121 سرویس میده و از یوزر و پسورد های سیستم برای احراز هویت استفاده میکنه. به عبارتی بعد از نصب این برنامه کاربر با رفتن به آدرس سایت خودش روی پورت 2121 می‌تونه با وارد کردن نام کاربری و رمز ftp ، فایلها و فولدرهای خودش رو ببینه و فایل های فشرده رو آنلاین باز کنه.

در ادامه نحوه نصبش رو توضیح میدم.

خواندن دنباله‌ی این نوشته »

مظلومیت اینترنت

10 شهریور 1389

اینترنت در ایران واقعا مظلومه.

اینجا اینترنت به عنوان یک ابزار تفننی شناخته میشه و گاهی اوقات هم به عنوان یک معضل. و متاسفانه به نظر میرسه که هر روز این وضع داره بدتر میشه. یک دوستی می‌گفت وظیفه ماست که در این مورد اطلاع رسانی کنیم تا بلکه صدامون به گوش کسی برسه که دستش به جایی میرسه …

خواندن دنباله‌ی این نوشته »

تقویم فارسی (هجری شمسی) برای 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 استفاده میکنه و بعد از ایجاد شی دیگه تقویم قابل تغییر نیست.)

فشرده ساز اسکریپت گوگل

29 آذر 1388

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

اولین ابزارهایی که در این زمینه تولید شدند الگوریتم های ساده ای داشتند که با استفاده از Reqular Expression ها کار می‌کردند و به همین دلیل مشکلاتی هم داشتند. برای مثال JSMin و Dean Packer از چلاننده(Minifier) های معروفی هستند که به همین روش کار می‌کنند. مثلا JSMin نمی‌تواند همه‌ی کاراکترهای خط جدید (line feed) را حذف کند چون ممکن است باعث بوجود آمدن باگ در برنامه شود. Dean Packer هم برای اینکه درست کار کند باید تمام دستورات اسکریپت به «;» ختم شده باشند.

این شد که توسعه دهنده ها به فکر تولید چلاننده‌هایی افتادند که بتواند مثل یک موتور اسکریپت (JavaScript Engine) اسکریپت را تفسیر نموده و به بهینه ترین نحو بچلاند. اولین چلاننده از این نسل Dojo ShrinkSafe بود که بر پایه موتور اسکریپت Rhino نوشته شده است. کمی بعد یاهو هم چلاننده ای تولید کرد با نام YUI Compressor که نسبت به سایر چلاننده‌‌های موجود از کارایی بهتری برخوردار بود و این برتری را تا مدتها حفظ کرد و هم اکنون که بیش از دو سال از انتشار نسخه‌ی اول آن می‌گذرد اکثر پروژه ها و فریم ورک های جاوااسکرپیت از این چلاننده برای چلاندن اسکریپت‌هایشان استفاده می‌کنند.

حدود یکی دو ماه پیش گوگل هم پا به عرصه رقابت گذاشت و چلاننده‌ی خودش را با نام Closure Compiler عرضه کرد. این چلاننده از تکنیک های جدیدی استفاده میکند که باعث شده نرخ فشرده سازی آن حدود 10 تا 20 درصد از YUI بیشتر باشد. از نکات قابل توجه در این چلاننده این است که قابلیت شناسایی و حذف کدهای بلااستفاده(dead code) را از درون اسکریپت دارد.

چلاننده‌ی گوگل مشابه YUI یک برنامه Java است که از خط دستور اجرا میشود ولی علاوه بر این گوگل این برنامه را به صورت اپلیکشن تحت وب و API هم ارائه کرده است.

برای مقایسه‌ی تکنیک های بکار رفته در YUI Compressor و Closure Compiler دیدن این slideshow رو توصیه می‌کنم.

مقایسه‌ی Git با Subversion

23 شهریور 1388

امروز بعد از مدتها یادم اومدم وبلاگ هم دارم. گفتم یه چیزی بنویسم تا اینجا از این وضع در بیاد.

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

این روزها سیستم‌های توزیع شده‌ی کنترل سورس (Distributed Version Control) کم کم دارن جای سیستم‌های کنترل سورس سنتی متمرکز (Centralized) مثل svn رو می‌گیرن. از جمله git یکی از این سیستم‌های کنترل سورس توزیع شده است که محبوبیت زیادی پیدا کرده.
قسمت عمده‌ای از تفاوت‌های git و svn برمی‌گرده به تفاوت مدل توزیع شده و مدل متمرکز، برای همین ابتدا این دو مدل رو توضیح میدم.
خواندن دنباله‌ی این نوشته »

آزمون آنلاین توسعه‌ی وب

26 اسفند 1387

اگر یادتون باشه حدود 2 یا 3 سال پیش سایت brainbench.com آزمون php رو رایگان کرده بود. امروز دوباره رفتم ببینم هنوز هم رایگانه یا نه.

آزمون php رایگان نبود. توی لیست آزمون های رایگانش گشتم ببینم چیزی داره که به درد ما بخوره. آزمون «مفاهیم توسعه‌ی وب» (Web Development Concepts) رو پیدا کردم. 40 تا سوال داشت با 3 دقیقه وقت برای هر سوال. واقعا سوال ها خوب طراحی شده بودند. اگر شما هم توی همین زمینه کار می‌کنید توانایی‌هاتون رو یک محک بزنید. برای رزومه هم خوبه. یک کاربرد خوب این آزمون برای کارفرماها اینه که میتونن برای استخدام نیرو از این آزمون استفاده کنند.

این هم نتیجه‌ی آزمون من:

راستی سال نو هم پیشاپیش تبریک، شاید تا سال دیگه فرصت نوشتن پیدا نکردم.

راهکارهایی برای بهینه سازی سایت

6 دی 1387

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

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

در ادامه این مقاله که در واقع برگرفته از کتاب «High Performance Web Sites» هست می پردازیم به اهمیت و راهکارهای بهینه سازی سمت کاربر.
لازم به ذکر است که این کتاب نوشته‌ی Steve Souders مسئول performance در یاهو می باشد.

خواندن دنباله‌ی این نوشته »