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

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 توی سال اول دانشگاه این سوال پیش میاد که “چه زبانی رو به عنوان زبان اصلیم انتخاب کنم” و با گشتن بین زبان های مختلف یه یکی دو سالی فقط به همه چی ناخنک می زنه و به کسب تجربه می پردازه, در این جا هم باید بدون مقاومت, اجازه بدی مغز و احساست با هم راهت رو به سوی زبان, فریم ورک یا هر چیز دیگه ای انتخاب کنن, درست همون کاری که وقتی دنبال کیس ازدواجی انجام می دی!

راحت می شویم!

September 2nd, 2008 یک نظر »

طی این دو هفته ی اخیر با کم کردن کارهای کوچیک و مشخص کردن اهداف اصلی, بیشتر تمرکزمون رو روی پروژه های بزرگ تر مثل مارکتینگ و سیستم های خلاقانه گذاشتیم, تا این جای کار که سفارش پروژه های کوچیک و وب سایت ها اکثرا رد شده مگر این که شرکت سفارش دهنده شرکت بزرگی بوده و ما امید داشتیم که بشه در مورد مارکتینگ هم باهاشون حرف زد!

آخرین بازمانده های پروژه های کوچیک قبلی مثل www.majoun.ae و یا www.amadehlaziz.com هم طی چند روز گذشته بالا رفتند و حالا بیشتر تمرکز من و یکی دو تا از بچه ها به روی تکمیل پروژه ای که واقعا دوستش دارم یعنی www.manoelite.com و بازی جدیدمون هست.

می دونم که اگه توی کار آی.تی نمی افتادم حتما آشپز می شدم! درسته که از اکثر غذاهای ایرانی بیزارم ولی واقعا آشپزی رو دوست دارم! خیلی راحت می تونید با رفتن به www.manoelite.com شاهد این قضیه باشید. کلی دستور غذایی برای دمو گذاشتم و حتی بعضی هاش به همراه پخت و عکس و دستور و تزیین غذا کار خودمه!

برای درس تجارت الکترونیک این ترم هم اتفاقا پروژه ی تیممون درباره ی یک سایت آشپزی بود! با شرکت آماده لذیذ (الیت) هم صحبت کردیم و قرار شده همین سایت من و الیت که توی فاز اول بالا رفته در فاز دوم چیزی شبیه همون پروژه ی تجارت بشه با یه کم ایده ها و کارهای بهتر!

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