حل مشکل داینامیک تکست ها در ادوبی فلش

March 17th, 2009 یک نظر »

نمی دونم تا حالا به این مشکل برخورد کردید یا نه ولی علاوه بر باگ های فراوانی که همه ی فلش کارها در ادوبی فلش پیدا می کنن, flash کارهای ایرانی دردسر استفاده از فونت فارسی توی فلش رو هم دارن! این مشکل خصوصا در dynamic text هایی که با فونت embed سر و کار دارن بروز می کنه. حروف فارسی شکسته می شه و خطوط به هم می ریزن!

مشکل از این جا ناشی می شه که توی سیستم های عامل یا هر محیط دیگه ای, پیشفرض استفاده از یونیکد رعایت می شه. یعنی تکست باکس هایی که مثلا توی محیط ویندوز کار می کنن, همه Unicode با فرمت decimal یا ده دهی رو پشتیبانی می کنن. پس وقتی من توی یک text box در یک اپلیکیشن تحت ویندوز می نویسم, اگه از تکست باکس استاندارد استفاده کرده باشم, همه ی یونیکد های دسیمال من به کدهای اصلی یونیکد یعنی هگزادسیمال ترجمه می شه. همه ی این کارها در بک گراند ماجرا در جریانه و من هیچی ازش نمی فهمم!

یعنی مثلا وقتی توی یک text box می نویسم: “سلام”, خود محیط میاد و حروف “س, ل, ا و م” رو به hex Unicode ترجمه می کنه. در این صورت می فهمه که وقتی “س” اول کلمه اومده و بعدش “ل” اومده, یعنی باید سین اول چسبان بنویسه. پس می شه: سل و الی آخر.

حالا adobe flash توی تکست باکس های داینامیک از این ترجمه پشتیبانی نمی کنه (برای حروف embed) و برای حروف اختصاصی فارسی از قبیل “گ”, “چ”, “پ”, “ژ”, “ی”. برای همین یک کلاس نوشتم که به راحتی می تونه متنی رو که بهش داده می شه به فارسی با یونیکد هگزادسیمال تبدیل کنه تا فلش اون رو دست نمایش بده.

این class, قابلیت مرتب کردن خطوط و alignment و ترکیب علایم و حروف انگلیسی با فارسی رو هم داره.

می تونید این کلاس رو به همراه راهنمایی ها و مثالی که داخلش هست از این جا دانلود کنید.

زبانش اکشن اسکریپت 2 هست (action script 2.0) و به راحتی می شه به زبان های دیگه هم ترجمه اش کرد.

فریم ورک ها و معماری های جدید

October 11th, 2008 یک نظر »

فریم ورک کدایگنایتر (CodeIgniter) از بسیاری جهات برای ساخت سیستم های مبتنی بر وب عملکرد خوبی از خود نشان می ده. این فریم ورک یکی از رقبای خوب کیک پی.اچ.پی (CakePHP) محسوب می شه. در حالی که CakePHP به صورت پیش فرض از ماژول ها پشتیبانی نمی کنه, CodeIgniter با قابلیت پشتیبانی از سیستم ماژولار و اپلیکیشن های مختلف, مورد توجه بسیاری از برنامه نویسان سیستم های مبتنی بر وب قرار گرفته.

CodeIgniter از مدل MVC مبتنی بر معماری مدل, ویو و کنترلر (Model, View, Controller) پشتیبانی می کنه و تمامی کارهاشو با استفاده از این مدل انجام می ده به این ترتیب که وجود هر کنترلر برای در دست گیری اپلیکیشن و ویو برای نمایش واسط های کاربری ضروری و استفاده از مدل ها برای ارتباط با پایگاه داده اختیاری است.

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

مزیت بعدی CodeIgniter عدم پشتیبانی اولیه از ارسال فرم ها با متد get هست. با این که امکان فعال سازی این متد وجود داره ولی به دلیل این که استفاده نکردن از این متد, هم شکل URL و هم امنیت بالاتر رو حفظ می کنه, فرم غیر فعال اون و استفاده از متد post و یا ارسال سگمنت (segment) ها توصیه شده. به این ترتیب در یک url ساده, می توانید application و کنترل مورد نظر و حتی پارامترهای ارسالی رو هم بدون نیاز به یک خظ کد اضافه داشته باشید!

مثال:

Normal URL:

http://yourdomain.com/index.php?app=content&task=show_content&content_id=23

CodeIgniter URL:

http://yourdomain.com/contents/show_content/23/

از مشکلات این فریم ورک عدم پشتیبانی مستقیم از Ajax (ای.جکس یا همان آژاکس ایرانی ها!) هست که با کلک های خاصی به راحتی قابل پیاده سازی است. همچنین عدم امکان ساخت ماژول های 100% مستقل به دلیل مشکلات namespace import از دیگر ضعف های این فریم ورک است.

پایگاه های داده و مشکلات نخ بندی

September 16th, 2008 یک نظر »

مبحث نخ بندی برنامه های سیستم عامل یا همون threadingاز جمله مسایلی هست که روی پایگاه های داده نقش بسزایی داره که هر مدیر database, طراح یا برنامه نویس وب باید به این قضیه نگاه عمیقی داشته باشه.

یکی از مشکلات بزرگ در هنگامی رخ می ده که چند مشتری در یک زمان اتصال (connection) باز با دیتابیس دارند و نحوه ی کدنویسی هم به صورتی هست که عملکرد هر کدوم بر دیگری تاثیر می ذاره. بذارید این سناریو رو بررسی کنیم که مثلا شما قضد دارید به کاربر با آی.دی 222 جایزه ی ویژه ای بدید. تا الان 221 بازدیدکننده به سایت شما سر زده و ثبت نام کرده اند. توجه کنید که در پروسه ی ثبت نام هیچ فیلد منحصر به فرد (unique field) دیگه ای جز آی.دی وجود نداره و همین آی.دی کلید اصلی جدول (primary key) هست. در این اثنا بازدید کننده ی شماره ی 222 وارد شده و شروع به وارد کردن اسم خودش می کنه. پس از این کار شما اسم رو ذخیره می کنید و کاربر رو به مرحله ی بعد پاس می دید. اسم با شماره ی 222 ذخیره می شه و تا این جای کار همه چیز درسته. در مرحله ی بعد شما چک می کنید که آیا جدول به شماره ی 222 رسیده که به بازدید کننده جایزه بدید و اون رو به فرم دریافت آدرس و شماره تلفن پاس بدید یا نه؟ برای این کار چه راهی پیشنهاد می شه؟

از اون جایی که عموما تمامی پروسه ی بالا در یک آن و یک مرحله ی اتصال انجام می شه, تنها چیزی که واقعا از کاربر در دست شماست اسم اونه و می خواید ببینید که نفر 222 ام هست یا نه؟ برای این کار راحت ترین راه حل مشاهده ی آخرین ردیف (row) وارد شده (inserted) در پایگاه داده هست. مسلما شما به راحتی قادر هستید با دستور (MAX id) و یا دستورات مشابه دریافت آخرین ردیف بر اساس نوع پایگاه داده ی خودتون, آخرین ردیف که احتمالا همون آقای 222 ام هست رو بگیرید. ولی چی می شه اگه بین دو تا خط دستورتون عمل threading اجرا بشه و برای چند لحظه این کد به حالت halt بره و آقای دیگه ای در اون سر جهان عمل ورود اسمش رو انجام بده! در این حالت سناریو به شکل زیر می شه:

A.insert(“hassan”); //id 222 automatically generates, auto_increment property

A.halt();

B.insert(“ali”); //id 223 automatically generates, auto_increment property

B.halt();

A.get_last_row(); //produces B row with id 223

B.get_last_row(); //produces B row with id 223

خب! هیچ کس که برنده نشد! ممکنه فکر کنید می تونید بگید آخرین ردیف وارد شده ای که اسمش hassan هست می تونه به ما کمک کنه! ولی توجه داشته باشید که ممکنه از شانس خوب شما, همون طور که threading ها افتاد وسط کد, اسم آقای دوم هم hassan باشه که اتفاقا اسم نادری هم نیست!

خود MySQL و حتی MSSQL برای غلبه بر این مشکل راه حل هایی با توابع داخلی خاصی ازایه داده اند که اکثرا فقط در مورد یک کاربر صدق می کنه ولی راه حل های عمومی تر ولی مشکل تری برای غلبه بر این مسئله و یا مسایل شبیه این وجود داره. از جمله:

· استفاده ازtransaction (تراکنش؟!) باعث می شه که بین دستوراتتون وقفه ی تاثیر گذار نیفته.

· استفاده از قفل/باز کردن جداول (lock/unlock)

· و یا استفاده از کدهای hash منحصر به فرد مختص هر کاربر که نیاز به ایجاد تغییراتی در جدول داره.

به هر حال در کار با دیتابیس و خصوصا در حیطه ی وب, علاوه بر توجه شدید به مسایل امنیتی و تزریقی, باید توجه بالایی هم به این گونه مسایل بشه…

گیج می شویم

September 14th, 2008 یک نظر »

می دونی, بدترین قسمت کار با پی اچ پی (PHP), -این زبان قشنگ- اینه که هیچ کس نمی تونه دقیقا بگه بهترین روش کار با پی اچ پی چیه؟!

با بک گراندی که از دات نت دارم می دونم که تقریبا همه ی دات نت (.net) کارها با ویژوال استودیو کار می کنن, می دونن که نحوه ی معماری نرم افزارشون چیه, مدل ها کجاست, کلاس ها چطوری طبقه بندی می شه و… ولی در زبان پی اچ پی هر کس ساز خودش رو می زنه! به همین دلیله که بی شمار فریم ورک (Framework) و سی.ام.اس (CMS) به این زبان نوشته شده که هر کدوم معماری و روش کار خودشون رو دارند.

در این مدت به ترتیب ابتدا با Macromedia Dreamweaver کد می نویسی و معمولا پروژه ها رو بدون کمک این فریم ورک ها انجام می دی, بعد کم کم با توجه به سختی کار بدون داشتن زیرساخت خوب به سمت استفاده از Content Management System هایی مثل Joomla, Drupal, EE, PHPNuke و یا حتی WordPress می ری و پس از مدتی گیجی احساس می کنی که بد نیست خودت برای پروژه هات یک CMS یا Framework اختصاصی داشته باشی و شروع می کنی به نوشتن و از این راه با کلی اصول و قواعد کاری و معماری هایی مثل MVC آشنا می شی, با Eclipse کار می کنی و پی می بری که کلا جاوا بی خودی بزرگ می شه و در نهایت بر می گردی به همون جوملا و بعد هم فریم ورک های ساده و کارایی مثل CakePHP یا Codeigniter و کار رو با Adobe Dreamweaver ادامه می دی!…

چرخه ی گیجی یک وب کار به همین جا ختم نمی شه بلکه تا بی نهایت ادامه پیدا می کنه!…

مهم این جاست که توی همه ی این گیجی ها, تجربه کسب کنی… همون طوری که برای هر کسی در زمینه ی IT توی سال اول دانشگاه این سوال پیش میاد که “چه زبانی رو به عنوان زبان اصلیم انتخاب کنم” و با گشتن بین زبان های مختلف یه یکی دو سالی فقط به همه چی ناخنک می زنه و به کسب تجربه می پردازه, در این جا هم باید بدون مقاومت, اجازه بدی مغز و احساست با هم راهت رو به سوی زبان, فریم ورک یا هر چیز دیگه ای انتخاب کنن, درست همون کاری که وقتی دنبال کیس ازدواجی انجام می دی!

مدیریت شده توسط فواد امیری, تحلیل گر, برنامه نویس و مدیر پروژه ی سیستم های مبتنی بر وب