۱۳۹۰ اردیبهشت ۳۱, شنبه

تجربه ای بد از .NET کند

مدتی است روی نرم افزاری کار می کنم که کندی .NET  را به وضوح برایم روشن ساخت. در این نرم افزار قرار بود یک تصویر 16 بیتی خاکستری (Grayscale) از روی سنسور یک دوربین خاص تحقیقاتی به روی حافظه کامپیوتر دانلود شود. سپس عملیاتی روی تصویر انجام شود تا تصویر قابل نمایش باشد. سنسور دوربین یک CCD 16 مگاپیکسل با پیکسلهای 16 بیتی بود که در مجموع تشکیل 32 مگابایت اطلاعات را می داد. این اطلاعات به واسطه SDK دوربین که با C++ unmanaged نوشته شده بود از دوربین گرفته می شد. این در حالی بود که صاحبان این دوربین از من خواسته بودند تا نرم افزار را با یکی از زبانهای .NET بنویسم و با وجود هشدارهایم مبنی بر پایین آمدن سرعت نرم افزار، از خواسته خود کوتاه نیامدند.

اطلاعات توسط تابعی سطر به سطر از روی سنسور خوانده می شد و در بلوکی از حافظه قرار می گرفت که اشاره گری به ابتدای آن برگردانده می شد. تا اینجای کار که دانلود اطلاعات به حافظه سیستم، توسط کد unmanaged درون SDK و Marshalling آن توسط CLR انجام می شد مشکلی وجود نداشت و سرعت نرم افزار قابل قبول بود. مشکل آنجا بود که اطلاعات پیکسلهای هر سطر 16 بیتی بودند. از آنجایی که سخت افزار لازم برای نمایش تصویر 16 بیت خاکستری در کامپیوترهای خانگی وجود ندارد، به ناچار این پیسکلهای 16 بیتی باید به پیکسلهای 8 بیت تبدیل می شدند. به بیان دیگر بیش از 16 میلیون پیسکسل 16 بیتی باید یک به یک به معادل 8 بیتی تبدیل می شدند. پس از پایان کد نویسی این قسمت و تست نرم افزار، مشاهده شد که کل این عمل  با سریعترین الگوریتم و با یک سخت افزار متوسط بیش از 40 ثانیه به طول می انجامد که با توجه به تجربه های قبلی ام در کار با همین حجم داده در C++ بسیار زیاد بود. گرچه کارفرمایان از این سرعت ابراز رضایت می کردند اما دلم راضی نشد. به سرم زد تا کل عملیات تبدیل تصویر 16 بیت به 8 بیت را با C++ بنویسم و بعد داده خروجی را به حافظه managed مارشال (Marshal) کنم.  گرچه هنوز فرآیند کد نویسی آن به اتمام نرسیده اما تست های اولیه بسیار امیدوار کننده هستند و امیدوارم زمان اجرای این فرآیند از بیش از 40 ثانیه به زیر 5 ثانیه کاهش یابد.

.NET فرآیند کد نویسی را ساده تر کرده است. هم به واسطه استفاده از حافظه مدیریت شده (Managed) و هم به خاطر کلاسهای غنی خود که بسیاری از فرایندهای پیچیده و الگوریتمهای طولانی را به بهترین شکل و ساده ترین و آماده ترین حالت در اختیار برنامه نویس قرار می دهد. اما وای به روزی که بخواهید خود کد مربوط به یک پردازش بزرگ داده را بنویسید. به نظرم در چنین حالتهایی و یا جاهایی که نیاز به ارتباط تنگاتنگ با سخت افزار وجود دارد، ترکیب کد managed و unmanaged بهترین گزینه است.

۱۳۹۰ اردیبهشت ۳۰, جمعه

Garbage Collector در .NET

طی دو ماه گذشته، بارها دوستان برنامه نویس سوالاتی مبنی بر چگونگی کارکرد Grabage Collector (GC) در .Net پرسیده اند و اینکه چرا GC در برخی موارد، حتی وقتی به طور صریح فراخوانی می شود، توان پاک کردن حافظه اختصاص داده شده به برخی از کلاس ها یا متغیر ها را ندارد؟

به همین دلیل تصمیم گرفتم در جهت روشن تر شدن روش کار GC مطلبی بنویسم و در انتها به پاسخ این سوالات برسم.

اغلب برنامه نویسانی که کار با زبانهایی که کد unmanaged تولید می کنند را تجربه کرده اند (مثل ANSI C++ و C) ، برای کار با هر نوع داده ای و هر ساختار باید دو عمل اصلی را انجام می دادند: اختصاص حافظه و آزاد سازی آن. این اعمال به ظاهر ساده، به صورت بالقوه و گاهی در عمل منشا پیچیده ترین و گیج کننده ترین اشکالات یا به اصطلاح باگ ها در نرم افزارها هستند. کافی است پس از پایان استفاده از بخشی از حافظه، آن را آزاد نکنید و یا اقدام به استفاده از حافظه ای کنید که پیش از آن آزاد شده است. اشکال عمده این نوع خطاها این است که نتیجه آن به آسانی و به شکل یک پیغام خطای زمان اجرا و یا اشکال منطقی قابل ردیابی نبوده و همیشه تحت شرایط یکسان تکرار نمی شوند. با هر بار اجرای برنامه و یا تحت شرایط مختلف دیگر، اتفاقات عجیب و متفاوتی را می شود از برنامه انتظار داشت. با ظهور زبانهای managed مثل جاوا و  زبانهای مبتنی بر .NET مدیریت حافظه بر عهده واسط اجرا کننده کد گذاشته شد. این واسط در جاوا JRE (Java Runtime Environment) و در .NET، CLR (Common Library Runtime) است. اصولا زبانهای managed به زبانهایی می گویند که مدیریت حافظه در آنها به طور اتوماتیک و به دور از چشم برنامه نویس انجام می شود. مزیت این نوع زبانها این است که  توسط آنها با سرعت بالاتر و خطای کمتر می توان نرم افزار جدید تولید نمود. در عین حال عیب عمده این زبانها سرعت پایین نرم افزارهای تولید شده توسط آنهاست.  به دلیل سربار بالای عملیات مدیریت حافظه اتوماتیک، این سرعت کم اجتناب ناپذیر است و همین امر آنها را برای تولید نرم افزارهایی که به سرعت بالای محاسبات نیاز دارند، مثل بازیهای کامپیوتری، نامناسب می سازد.

در .NET یکی از وظایف اصلی مدیریت حافظه را Garbage Collector (GC) بر عهده دارد. کار GC اختصاص و آزادسازی اتوماتیک حافظه به اشیا است. با هر بار فراخوانی کلمه new برای استفاده از یک شیء مقداری حافظه توسط GC به آن اختصاص داده شده و پس از پایان کار با آن شیء این حافظه باز پس گرفته می شود. اما نکته ای که در این مطلب به رویش تمرکز خواهد شد، چگونگی باز پس گیری حافظه است.

به طور کلی در .NET دو نوع ارجاع به اشیاء وجود دارد. ارجاع قوی (Strong Reference) و ارجاع ضعیف (Weak Reference). همه ارجاع ها به طور پیش فرض قوی هستند مگر آنکه صراحتا ضعیف تعریف شوند. همانطور که می دانید یک ارجاع با کلمه کلیدی ref در C# و ByRef در VB مشخص می شود و مفهوم آن این است که تنها آدرس متغیر مورد نظر به عنوان پارامتر به یک تابع ارسال می شود و نه یک کپی از مقدار آن. این به آن معنا است که یک متغیر موجود در یک بلوک مشخص از حافظه بین چند تابع به اشتراک گذاشته می شود. علاوه بر کلمه کلیدی ref، ارجاع به صورت دیگری هم می تواند وجود داشته باشد. بسیاری از انواع داده ای از نوع ارجاعی هستند، به این معنی که از همان ابتدا که شیء جدید ساخته می شود، تنها آدرس محل قرار گیری آن شیء، در متغیر مورد نظر قرار می گیرد و خود شیء در Heap نگهداری می شود. تمام اشیائی که برای مقدار دهی اولیه (Initialization) نیاز به کلمه کلیدی new دارند از این نوع هستند. زمانی که این نوع داده ها را به عنوان پارامتر به یک تابع ارسال می کنید، به طور اتوماتیک تنها آدرس آنها ارسال می شود. همه این نوع ارجاعات ارجاع قوی محسوب می شوند.

اگر یک شیء در حافظه وجود داشته باشد، از حافظه پاک نخواهد شد مگر اینکه همه توابعی که به طور قوی به آن ارجاع داده شده اند، کارشان تمام شده و از حافظه خارج شوند. این جمله به آن معنی است که حتی اگر تابع سازنده شیء مورد نظر از حافظه خارج شود ولی تابع دیگری وجود داشته باشد که هنوز با ارجاع قوی در حال استفاده از آن متغیر باشد، متغیر در حافظه باقی می ماند. در مقابل از ارجاع های ضعیف در هنگام خالی سازی حافظه صرف نظر می شود و اگر تنها ارجاع های موجود به یک شیء از نوع ارجاع ضعیف باشند، به گونه ای عمل می شود که گویی ارجاعی به شیء وجود ندارد و شیء از heap پاک می شود. کلیه این قوانین در مورد ارجاع های قوی و ضعیف، توسط GC و به هنگام پاک سازی heap اعمال می شود.

GC به هر شیء یک عدد صحیح به عنوان شماره نسل اختصاص می دهد. سه نسل برای اشیاء در نظر گرفته می شود. نسل 0، 1 و 2. هر شیء به هنگام ایجاد شدن در نسل 0 قرار می گیرد. GC برای پاک سازی هر نسل از اشیا در فواصل زمانی مشخص اقدام می کند. تعداد دفعات تکرار عمل پاک سازی برای نسل 0 بیشترین است. به این معنی که GC در فواصل زمانی کوتاهتری اقدام به جمع آوری اشیاء نسل 0 می کند. پس از آن و در فواصل طولانی تری نسل 1 و سپس نسل 2. هرگاه GC برای پاک سازی شیءی از حافظه اقدام می کند ولی آن شیء به دلیل وجود یک ارجاع قوی به آن غیر قابل پاک کردن است، یک شماره به نسل آن اضافه می شود. مگر اینکه شی در نسل 2 باشد که در این صورت شماره نسل آن تغییر نمی کند. این به آن دلیل است که هرگاه شیءی در یک اقدام به پاک سازی هنوز قابل پاک کردن نبود به احتمال زیاد مدت زمان بیشتری به آن نیاز خواهد بود و ارجاعات قوی بیشتری به آن وجود دارد و یا توابع ارجاع داده شده به آن کند تر اجرا می شوند. در این صورت برای پایین تر آوردن سربار اجرای GC و بالاتر بردن سرعت اجرای نرم افزار، یک شماره به نسل آن اضافه می شود تا در فواصل طولانی تری اقدام به پاک کردن فضای اختصاص داده شده به آن متغیر در heap شود.

این عمده ترین دلیلی است که GC ممکن است در هر اقدام به پاک سازی، لزوما موفق به پاک کردن شیء و آزاد سازی بلوک حافظه مربوط به آن نشود، حتی اگر به طور صریح و توسط تابع GC.Collect() در کد برنامه اقدام به پاک سازی heap شود.

۱۳۸۹ اسفند ۹, دوشنبه

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

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


خدمت جناب آقای علی مطهری
با عرض سلام و احترام

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

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

ما به مانند شما از تداوم وضعیت نابسامان کنونی که بن‌بستی ناگوار را بر سر راه کشور قرار داده است به ستوه آمده‌ایم. ما خواستار بازگشت آرامش و آسایش به کشور و رفع فضای کینه و نفرت و خشم هستیم.

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

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

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

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

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

آقای مطهری
«جنبش سبز ایران» امروز جنبشی متکثر با خواسته‌های گوناگون است. هر کسی از ظن خود یار آن شده و به اعتراف شاخص‌ترین چهره‌هایش هنوز کسی نتوانسته است کلیتی را به تمامی اقشار حاضر در آن منتسب کند. با این حال ما گروهی از دل همین جنبش هستیم که امیدواریم تا با محوریت قانون، انصاف و مصالح ملی شاهد برقراری گفت و گو با نمایندگان منصف و صادق حاکمیت باشیم. در این راه خواسته‌های ما به صورت شفاف مطرح شده و هرکس که مدعی دلسوزی برای کشور و مردم است باید برای برآورده‌سازی آن‌ها تلاش کند:

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

ما خواهان تضمین حق شهروندان بر تجمعات و راهپیمایی هستیم که صراحتا در بند 27 قانون اساسی ذکر شده است.

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

ما خواستار آزادی مطبوعات و رفع هرگونه سانسور هستیم. حقی بدیهی و اولیه که در بند به بند قانون اساسی کشور به ویژه مواد 3، 24 و 175 مورد تاکید قرار گرفته است.

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

و در نهایت ما خواستار برگزاری انتخابات آزاد، غیرگزینشی و سالم هستیم که تنها مستبدین و دیکتاتورها می‌توانند با آن مخالفت کنند.

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

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

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


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


وبلاگ های امضا کننده:



------------------------------------------------------------------
در صورتی که شما هم وبلاگی دارید و می خواهید از این متن حمایت کنید لطفا آدرس وبلاگتان را به (digiraz.blogspot@gmail.com) میل بزنید

فایلهای خود را به ابرها بفرستید

کامپیوتر خیلی خوب است. کلی کارهایمان را راحت می کند. خیلی سریع است. می توانیم هرچه خواستیم در آن ذخیره کنیم و هر وقت خواستیم به آنها دسترسی داشته باشیم. البته نه! همیشه نمی توانیم به آنها دسترسی داشته باشیم. مثلا اگر کامپیوترمان همراهمان نباشد. آنوقت چه؟

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

راه حل "ابر" (Cloud) است. Cloud Computing* به باور بسیاری از متخصصان، آینده دنیای کامپیوتر خواهد بود. دیگر نیازی نیست که فایهای خود را روی کامپیوتر شخصی نگه دارید. کافی است آن را به فضای شخصی خود روی وب ارسال کنید. همانجا مشاهده اش کنید، تغییرش دهید و در صورت نیاز با سایرین به اشتراک بگذارید تا به طور همزمان روی آن کار کنید. حتی می توانید فایلتان را روی وب ایجاد کنید. در این صورت همیشه فایلهایتان در مکانی امن خواهند بود. این امنیت را ارائه دهندگان سرویس تضمین خواهند کرد. مهمتر آنکه هر وقت و از هر جا می توانید به آنها دسترسی داشته باشید. وجود فایلها و اطلاعاتتان به هیچ وجه بسته به سلامت و در دسترس بودن کامپیوترتان نخواهد بود. اینها تازه بخشی از فواید "ابر" هستند.

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

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

شاید فکر کنید که از آینده دوری سخن می گویم، اما به هیچ وجه چنین نیست. همه سرویس هایی که نام بردم همین حالا وجود دارند. از این میان تعدادی فراگیر تر و تعدادی در مرحله استفاده آزمایشی و با تعداد کاربران کم هستند. شرکتهای بزرگ کامپیوتری و غولهای اینترنت نبرد سنگینی را در این راه شروع کرده اند. به نظر می رسد قدمهای بلند نخست را گوگل و مایکروسافت برداشته اند. گوگل با سیستم عامل Chrome OS و سرویسهای آنلاین مثل Google Documents. مایکروسافت با Windows Azure، Office 365، Windows Server Hyper-V و MS Dynamics CRM Online.

در این میان برای ما ایرانیان، یک نکته نا امید کننده وجود دارد: پهنای باند اینترنت. به نظر می رسد هرچه آینده کامپیوتر بیشتر به سمت سرویسهای اینترنتی پیش برود، به همان میزان ما بیشتر عقب خواهیم ماند. متاسفانه تفکر غالب در میان مدیران فعلی کشور، دسترسی به اینترنت پهن باند را بر نمی تابد. همین تفکر بیش از پیش مانع سرمایه گذاری در این عرصه می شود. اما خبر خوب آنکه با همین سرعت حداقلی، دسترسی به تعداد زیادی از این سرویسها میسر است. از آن جمله Google Documents. گوگل این سرویس را مدتهاست که راه اندازی کرده و با گذشت زمان آن را تکمیل می کند. هم اکنون این سرویس تا حد زیادی توانایی انجام وظایف Microsoft Office را به صورت آنلاین دارد و با یکپارچگی بی نظیر با Google Sites قطعن شما را شگفت زده خواهد کرد. اگر می توانید از سرویس Gmail در حالت Standard View بدون مشکل استفاده کنید، می توانید مطمئن باشید که سرعت کافی برای استفاده از Google Documents و بیشتر سرویسهای دیگر گوگل را نیز دارید. مطمئنن سرعت دسترسی به اینترنت در ایران اجازه استفاده از سرویس های پیشرفته تر را به ما نمی دهد. از آن جمله بازی های تمامن آنلاین که پیشتر به آنها اشاره کردم. اما سرویس های در دسترس، نعمت بزرگی به شمار می روند. به نظر من استفاده از آنها، جذاب و در عین حال بسیار مفید است.

----------------------------------------------------------------------------
 * هر چه فکر کردم، نتوانستم ترجمه مناسبی برای این ترجمه در فارسی پیدا کنم. به هر حال ترجمه کلمه به کلمه آن "محاسبات ابری" است.

۱۳۸۹ اسفند ۷, شنبه

انقلاب وب 2 (Web 2.0)

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

تار جهان گستر*، وب، در ابتدا بسیار متفاوت از امروز بود. فناوری های نرم افزاری و سخت افزاری به سرعت پیش رفت می کردند. با این وجود تا همین ده سال پیش یک چیز بدون تغییر باقی مانده بود. صفحات وب، صفحاتی بودند که محتوای تولید شده توسط صاحبانشان را برای مخاطبان به نمایش می گذاشتند. این صفحات معمولا نویسندگان محدود و خوانندگان زیادی داشتند. صاحبان وب سایت ها تولید کنندگان محتوا بودند و مخاطبان مصرف کننده. سال 2003 کنفرانسی به میزبانی O’Reilly Media برگزار شد که موضوعات جدیدی را به طور جدی در رابطه با وب مطرح کرد. از این موضوعات تحت نام "وب 2" یاد شد. "وب 2" بیش از آنکه یک پیشرفت تکنولوژیک باشد، یک مفهوم بود. مفهومی که درک برنامه نویسان و طراحان را از تعامل کاربران با وب سایت هدف می گرفت.

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

یکی از مهمترین اصول در وب 2 اعتماد به کاربران است. واضح است که امکان دادن به کاربران برای تولید محتوا از همین اعتماد ناشی می شود. مسئولیت درستی محتوای ارسالی توسط کاربر، با خودش است. این کاربر است که نقش اصلی را در رشد سرویس ایفا می کند. ملاک مهم گستردگی وب سایت، تعداد کاربران فعال آن است، نه تعداد دفعات بازدید یک صفحه. چنین سیستم هایی با استفاده بیشتر، بهتر می شوند و رشد می کند. همکاری و تعامل بین کاربران، پایه وب 2 است. هر وبسایت با توجه به نوع فعالیت خود به گونه ای امکان این تعامل را بوجود می آورد و آن را مدیریت می کند. ناگفته پیداست که در این سیستم "حق تالیف" و "مالکیت معنوی" محدود زیر ساخت ارائه سرویس و خود وبسایت است. چنین مفاهیمی را نمی توان برای محتوای تولید شده در آنها بکار برد. جمله معروفی می گوید "در وب 2 بعضی از حقوق محفوظ هستند، نه کلیه حقوق!"

تا اینجا بیشتر آنچه گفتم، مفاهیم انتزاعی بود. برای اینکه این مفاهیم قابل لمس تر باشند، تعدادی از سایتها و سرویسهای وب معمول (وب 1) و معادل امروزی آنها در وب 2 را آورده ام:

وب 1
وب 2
Ofoto
Flickr
Mp3.com
Napster
Britannica Online
Wikipedia
وب سایتهای شخصی
وبلاگها
سیستم مدیریت محتوا (CMS)
ویکی
Akamai
BitTorrent


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

شاید در انتها بد نباشد نگاهی به نقشه دنیای وب 2 بیندازید.

-----------------------------------------------------------------------------------------------------------
*World Wide Web

۱۳۸۹ اسفند ۶, جمعه

IPv6 گامی بزرگ به سوی اینترنت آزاد

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

می توان گفت بزرگترین مشکل اینترنت نهفته در پروتکل IP (Internet Protocol) آن است. این پروتکل سازوکارهایی را تعریف می کند که از طریق آنها بسته های اطلاعاتی معنادار بین کامپیوترها رد و بدل می شود. یکی از مهمترین تعاریف آن، تعریف آدرس IP است. به موجب قرارداد، آدرس های IP شامل 4 بایت داده هستند که با بکارگیری تدابیری قرار بود هر یک از کامپیوترهای متصل به اینترنت یک نسخه منحصر به فرد از این آدرس را داشته باشند. به این طریق بسته های اطلاعاتی از کوتاهترین مسیر به این آدرس ها ارسال می شوند. دیری نپایید که گستردگی روزافزون اینترنت مشخص کرد این آدرسهای محدود در آینده نزدیک به پایان خواهند رسید. پس از آن کاربر جدیدی نمی تواند به اینترنت متصل شود.

متخصصان دست به کار شدند. در مدت کوتاهی تجهیزات جدیدی ساخته و قراردادهای جدیدی تعریف شدند تا بر این مشکل غلبه کنند. یکی از این دستگاهها NAT بود. NAT به مجموعه ای از کامپیوترهای متصل به یک شبکه کوچک که قرار است به اینترنت متصل شوند، یک آدرس IP مشترک اختصاص می دهد. بدین ترتیب درخواستهای آنها به گونه ای به دنیای اینترنت ارسال می شود که پاسخ بازگشتی به کامپیوتر درخواست کننده بازگردد. در این صورت سایر کامپیوتر های متصل به آن NAT پاسخ را نمی بینند. با این کار مشکل تا حد زیادی برطرف شد. اما یک مشکل بزرگ به وجود آمد: کامپیوترهای این کاربران دارای آدرس منحصر به فردی روی شبکه اینترنت نبودند. یعنی هیچ کامپیوتری در شبکه اینترنت نمی توانست اطلاعاتی را مستقیما به کامپیوتری که به اصطلاح پشت NAT قرار داشت ارسال کند. به طور خلاصه کامپیوترهای پشت NAT به نوعی فقط می توانستند شروع کننده یک ارتباط باشند. آنهم تنها ارتباط با کامپیوترهایی که یک آدرس IP معتبر در اینترنت دارند. به این نوع ارتباط، ارتباط مشتری – کارگزار (Client-Server) می گویند. دنیای وب و همینطور بیشتر نرم افزارهای اینترنتی مثل مسنجرها بر همین اساس پایه ریزی شده اند. درواقع حتی اگر دو کاربر ارتباط به ظاهر مستقیمی با هم داشته باشند، حداقل پای یک کامپیوتر دیگر با آدرس IP معتبر در میان است. در این حالت ابتدا دو سر ارتباط به این کامپیوتر میانی متصل می شوند. سپس این کامپیوتر که کارگزار (Server) خوانده می شود، پیامهای هر طرف را به سمت مقابل ارسال می کند.

در حال حاضر در مقابل ارتباط مشتری – کارگزار، ارتباط دیگری به اسم همسان به همسان (P2P*) تعریف می شود. P2P ارتباطات مستقیم دو نفره را تعریف می کند. همانطور که پیشتر گفتم همه ارتباطات به ظاهر مستقیم دوطرفه از حد اقل یک کارگزار میانی می گذرد که بدون آن برقراری ارتباط ممکن نیست. P2P هم در همین دسته قرار می گیرد.

ناگفته پیداست که چرا فیلترینگ ارتباطات اینترنتی به سادگی امکان پذیر است. کافی است یکی از کامپیوترهایی که ارتباط شما با اینترنت را برقرار می کند، بسته هایی که از کامپیوتر شما به مقصد یک کارگزار مشخص ارسال می شود را فیلتر کند. این کارگزار با آدرس مشخص خود به تعداد زیادی از کاربران سرویس می دهد. در واقع در نبود آن ارتباطی قابل برقراری نیست. پس اگر نتوانید به این کارگزار متصل شوید ارتباط خود را به طور کلی با یک سرویس و سایر کاربران آن سرویس از دست می دهید.
IPv6 نسخه اصلاح شده پروتکل IP است. از آن به عنوان بزرگترین بازسازی اینترنت از زمان فراگیر شدن آن یاد می کنند. در این نسخه یکی از بزرگترین تغییرات اعمال شده، تغییر در قرارداد آدرس IP است. تعداد آدرسهای IP قابل استفاده در IPv6 بسیار زیاد است. به گفته طراحان آن، اگر هر سال تعداد کاربران اینترنت دو برابر شود، تا صد سال دیگر می توان به همه آنها آدرس منحصر بفرد اختصاص داد. این پروتکل از سال 2005 به طور رسمی معرفی شد. از آن سال و حتی پیش از آن تجهیزات اینترنتی شروع به پشتیبانی از آن کردند. در آینده نزدیک، شاید چند ماه آینده، می توان از IPv6 به عنوان جایگزین پروتکل فعلی IP که به آن IPv4 نیز گفته می شود، استفاده کرد.

تصور اینترنت با IPv6 برای خود من به شدت هیجان انگیز است. دنیایی که به معنی واقعی همه به هم وصل خواهند بود و هیچ فیلترینگی نمی تواند ارتباط را محدود کند. البته ذکر این نکته ضروری است که احتمالا در این جهان دیگر وب باساختار مشتری-کاگزار همه چیز نیست. نرم افزارهای ارتباطی دیگری بوجود خواهند آمد. وب همچنان قابل فیلتر باقی خواهد ماند، شاید این خبر بد باشد. اما خبر خوبی هم هست. آنتی فیلتر های جهان جدید با استفاده از پتانسیل های به وجود آمده، آنچنان موانع را در هم می شکنند که عملا سرمایه گزاری برای محدود سازی جریان آزاد اطلاعات بی ثمر خواهد بود.

در فرصتی دیگر، به ظرفیت های فنی پیدایش این جهان جدید بیشتر خواهم پرداخت. تا آن زمان تنها مژده می دهم همه باید خود را برای ورود به این دنیای جدید آماده کنیم. جهانی که در همین نزدیکی است.

۱۳۸۹ بهمن ۱۲, سه‌شنبه

از همه که خورده ایم، خود زنی چرا؟

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


امروز در حال گشت زنی در اینترنت بودم که باز سروکارم به یکی دیگر از سایتهای "عظیم" ایرانی افتاد. عظیم نه به لحاظ محتوایی که به لحاظ حجم صفحات برای دانلود! حجمی که با اینترنت ADSL 128  kbps بیشتر از دو دقیقه طول کشید تا به طور کامل دانلود شود و یا به عبارتی صفحه اصلی سایت باز شود. دیدن این سایت و کندی سرعت دانلود آن سوال بزرگی که مدتهاست در ذهنم بی جواب مانده را دوباره به اول صف سوالات کشاند: "از همه که خورده ایم، خود زنی چرا؟" این سوال به خصوص در کشور ما مصداقهای زیادی پیدا می کند اما در این مورد خاص جای تفصیل بیشتری دارد.

در کشوری که اگر کسی به اینترنت "پرسرعت" 1Mbps دسترسی داشته باشد می تواند به 99% دیگر مردمش فخر بفروشد، سرعتی که اگرچه در ایران واقعا سریع است اما در اغلب کشورهای مدرن، نیمه مدرن،  توسعه یافته، در حال توسعه، توسعه نیافته و کشورهای جهانهای اول تا سوم، از حد اقل سرعت دسترسی به اینترنت نیز کمتر است.*

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

در کشوری که اینترنت با سرعت بالای 128 Kbps برای کاربران خانگی ممنوع است و در دانشگاههایش هم هر روز پهنای باند محدود تر می شود!


در کشوری که روی خطوط فیبر نوری ارائه اینترنت پر سرعت امکان پذیر نیست!**

در کشوری که بهترین مکان برای استفاده از اینترنت پر سرعت برای خیلی ها "کافی شاپ" است (منظورم کافی نت نبود)!

در کشوری که از مجوز راه اندازی سایت، سرورهای میزبان قوی، پهنای باند بالای سرور، پول و گواهی فیلتر نشدن (نمی دانم این آخری وجود دارد یا نه)، یا همه را با هم داری و یا هیچ کدام را نداری!

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

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

سخن آخر اینکه مخاطبان ایرانی تشنه محتوای فارسی، با هر موضوعی، در اینترنت هستنند و حال که برای رسیدن به این محتوا باید از هفت خان بگذرند، خوان هشتمی برای رسیدن به این اندک محتوا نسازیم!

در انتها لیست کارهای  ساده اما بسیار موثری که می توان انجام داد تا حجم صفحات پایین تر بیاید را می آورم که امیدوارم مفید باشد:

·         قبل از آپلود تصاویر می توانیم وضوح آنها را پایین تر بیاوریم.
·         اگر از فتوشاپ استفاده می کنیم،هنگام ذخیره سازی از گزینه Save for web استفاده کنیم که تصاویر را با حفظ کیفیت، با حجم کم ذخیره می کند.
·         می توانیم با فرمتهای تصاویر، بیشتر آشنا شویم تا بتوانیم با توجه به نوع عکس، میزان و نوع رنگهای استفاده شده و اندازه عکس، بهترین فرمت را برای ذخیره سازی انتخاب کنیم تا با حفظ کیفیت مورد نظر کمترین حجم را اشغال کند.
·         می توانیم از فرمتهایی که شفافیت (Transparency) را پشتیبانی می کنند مثل Gif و PNG استفاده کنیم تا مجبور نشویم رنگ پشت زمینه را نیز در کادر عکس بگنجانیم که این خود باعث پایین تر آمدن حجم تصاویر می شود و از طرفی اگر خواستیم رنگ پس زمینه را تغییر دهیم کمتر نیاز به تغییر خود عکس پیش می آید.
·         استفاده از تصاویر Interlaced هم در فرمتهایی که آن را پشتیبانی می کنند خوب است. (منظور تصاویری است که از بالا به پایین دانلود نمی شوند و ابتدا کل تصویر با وضوح کم دانلود شده و سپس وضوح آن بیشتر می شود)
·         استفاده از انیمیشن خوب است اما ضروری که نیست به کنار، در اغلب مواقع راههای بسیار دیگری وجود دارد تا همان جذبه و زیبایی را در سایت آفرید. اگر هم واقعا خواستید از انیمیشن استفاده کنید، شاید در بسیاری اوقات GIF جایگزین بهتری برای فلش باشد.
 در آخر نیز بهترین کار این است که حجم کلیه تصاویر و ابزاری که در یک صفحه از وب سایت وجود دارند (در واحد کیلوبایت KB) به عدد 7 (برای اینترنت با سرعت 56 Kbps) تقسیم کنید تا ببینید چند ثانیه طول می کشد تا دانلود شود. اگر زیاد بود، فکری به حالش بکنید. البته توصیه من این است که به اعداد کوچکتری مثل 6، 5 و یا حتی 4 تقسیم کنید زیرا اغلب مواقع خطوط ADSL  ما هم کندتر از این حرفها هستند.

-------------------------------------------------------------------------------------------------------------------
* این نکته را ذکر کنم که در این کشورها یا منطقه ای تحت پوشش اینترنت نیست، که در این صورت مردم از تکنولوژی هایی مثل 3G برای اتصال به اینترنت استفاده می کنند(که در ایران فعلا خواب این تکنولوژی را باید ببینیم ) و یا منطقه تحت پوشش اینترنت است که در این صورت سرعتها از 10 Mbps شروع می شوند. نمی خواهم بگویم که ADSL اصلا استفاده نمی شود اما اگر هم بشود، استفاده از آن محدود به مناطقی است که تحت پوشش "اینترنت پهن باند" یا به قول خودشان به اختصار "اینترنت" نیستند. حال مسئولان ما در ایران هرجا که خط تلفنی برای اتصال Dialup به اینترنت وجود داشته باشد را تحت پوشش اینترنت می خوانند!


** این در حالی است که اصولا فیبر نوری بهترین و سریعترین تکنولوژی برای انتقال دیتا است و ستون فقرات اصلی اینترنت (Internet backbone) در جهان از فیبر نوری تشکیل شده است.


***کمیت و کیفیت خود محتوای سایتها، بحث جدایی است که از حیطه این مطلب و همینطور تخصص بنده خارج است و امیدوارم دوستان صاحب نظر، از این منظر نیز به بررسی سایتهای فارسی بپردازند.

**** منظور از سرعت دسترسی به سایت که در جاهایی از مطلب از آن به عنوان سرعت دانلود هم نام برده ام، به طور کلی فاصله زمانی بین ارسال درخواست از طرف کاربر(مثلا فشردن دکمه Enter بعد از تایپ نام سایت) تا نمایش کامل محتوای سایت است. مهمترین عامل تعیین کننده این زمان، نسبت حجم صفحات به سرعت دسترسی کاربر به اینترنت است، اما موارد دیگری مثل پهنای باد سرور میزبان، میزان دفعاتی که سایت توسط خود کاربر و همینطور سایرین بازدید شده است (که روی موارد مختلفی از جمله کش شدن خود سایت در سرورهای میانی و همینطور تعداد لایه های لازم DNS برای  یافت آدرس سایت و ... موثر است) و مواردی از این دست، نیز تاثیر گذارند.