2009/11/30

‫معرفی کتاب ASP.NET AJAX in Action

حدود ۳ ماه بود که برای آژاکسی کردن یک Web Application نسبتاً بزرگ (با حدود ۳۰۰ صفحه aspx) در حال بررسی راه حل‌های مختلف بودم. بعد از آن که تصمیم گرفتم مابین jQuery و ASP.NET AJAX از ASP.NET AJAX استفاده کنم شروع به یادگیری ASP.NET AJAX کردم. اما بعد از مدتی دیدم بهتر است به جای خواندن مقالات متعدد، یک کتاب خوب پیدا کرده و از روی آن یاد بگیرم. بعد از کمی جستجو سه تا کتاب مناسب پیدا کردم و از بین آن سه کتاب نیز نهایتاً کتاب ASP.Net Ajax in Action را برای مطالعه انتخاب کردم. در ادامه نظرات من را راجع به این کتاب با توجه به این نکات که الف- قرار نیست من کنترل نویسی کنم، ب- تمرکز عمده من باید بر Server Centric باشد نه Client Centric، ج- باید از راه حل‌هایی استفاده کنم که هزینه نگهداری کمتری داشته باشد، د- محیط استفاده Application ما یک محیط اینترانت بدون محدودیت سرعت و کاربران ثابت و همیشگی خیلی معمولی است، می‌خوانید.

این کتاب به دلیل تکرار و مرور مناسب مطالب یادگیری خیلی خوبی دارد و شامل ۱۳ فصل است:
فصل اول: مقدمه‌ای بر فناوری Ajax و ASP.NET Ajax: تقریبا همه برنامه‌نویسان وب به مطالب این فصل اشراف دارند.
فصل دوم: معرفی کتابخانه جاوا اسکریپتی Microsoft Ajax Library: این کتابخانه هم در نوشتن کدهای جاوا اسکریپت بدون در نظر گرفتن آژاکس و ASP.NET مفید است و هم در بحث آژاکس در ASP.NET AJAX. خواندن این فصل به عنوان یک بخش پایه اجباری است.
فصل سوم: یادگیری موثرتر جاوا اسکریپت بر پایه کتابخانه Microsoft Ajax Library: این فصل به شما یاد می‌دهد که چطور با کمک کتابخانه فوق الذکر در جاوا اسکریپت، class، interface، inheritance، enum و… را پیاده سازی کنید. این فصل چه برای آنها که می‌خواهند در فضای client فعال باشند و client centric کار کنند و چه برای آنها که فقط می‌خواهند از UpdatePanel و AjaxControlToolkit کار کنند خیلی ضروری بوده و حتماً باید مطالعه گردد.
فصل چهارم: مروری بر امکانات سمت سرور ASP.NET AJAX: مطالب این فصل که عمدتاً شامل استفاده از UpdatePanel و ScriptManager است را تقریباً همه بلد هستند. در نتیجه نیازی به مطالعه دقیق ندارد.
فصل پنجم: رد و بدل کردن اطلاعات با سرور به طور ناهمزمان از طریق جاوا اسکریپت: مطالعه این فصل دید خیلی خوبی راجع به کار شبکه‌ای می‌دهد. در این فصل نحوه کار با «وب سرویس»ها به طور ناهمزمان (آسنکرون) از طریق جاوا اسکریپت گفته شده که می‌تواند ابزار خیلی راحت و خوبی برای کارهای ساده با سرور باشد.
فصل ششم: کار با UpdatePanel: هر چند این فصل خیلی روی UpdatePanel عمیق نمی‌شود ولی خواندن آن برای یادگیری جزییات کار با UpdatePanel اجباری است.
فصل هفتم: کار با UpdatePanel به طور خیلی تخصصی!: مطالعه و تمرین این فصل به آدم‌های مثل خودم که تمرکزشان روی کنترل‌های سروری است و ترجیح می‌دهند صرفاً از ScriptManager، UpdatePanel و کنترل‌های AjaxControlToolkit است شدیداً توصیه می‌شود.
فصل هشتم و نهم: این دو فصل به مطالعه و بررسی مباحث توسعه Client Centric می‌پردازند و برای افراد علاقه‌مند به Server Centric مثل خودم غیر ضروری هستند.
فصل دهم: Ajax Control Toolkit: مروری مختصر بر Ajax Control Toolkit با تاکید بر مفاهیم Clientی و نحوه توسعه کنترل‌های مربوطه. برای علاقه‌مندان Server Centric بررسی مستقیم خود کنترل‌های Ajax Control Toolkit خیلی مفیدتر است.
فصل یازدهم: XML Script: این فناوری در نسخه‌های اخیر ASP.NET AJAX حذف شده و دیگر ارزش یادگیری ندارد.
فصل دوازدهم: Drag N Drop: چون به آن نیازی نداشتم اصلاً مطالعه نکردم ولی مطمئناً برای افراد علاقه‌مند به درد بخور خواهد بود.
فصل سیزدهم: تمرین آنچه که در ۱۲ فصل گذشته مطالعه شده است. اما چون بیشتر مبتنی بر client بود آن را مطالعه نکردم.
پیوست‌ها، منابع و ایندکس: مطابق هر کتاب دیگری، این سه بخش در خواندن و درک بهتر مطالب کمک خوبی محسوب می‌شوند.

مطالعه بیشتر:
۱- پیوند کتاب در سایت آمازون
۲- پیوند کتاب در سایت ناشر
۳- آشنایی با کتابخانه Microsoft Ajax Library
۴- جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library
۵- ‫فراخوانی Web Service از Client Side
۶- ‫نکاتی تخصصی درباره‌ی UpdatePanel
۷- ‫‫آیا واقعاً بهتر است به جای ASP.NET AJAX از jQuery استفاده کنیم؟
۸- ‫یادگیری ASP.NET AJAX
۹- به روز رسانی صفحات آژاکسی از سمت سرور




2009/11/26

‫نکاتی تخصصی درباره‌ی UpdatePanel

سرعت بیشتر با آژاکس!! اگر تا حالا سعی کرده باشید با ASP.NET AJAX (راه حل مایکروسافت برای آژاکسی کردن ASP.NET) کار کرده باشید، در برخورد با کنترل UpdatePanel اقلاً برای یک بار هم که شده با خود فکر کرده‌اید کار با آن خیلی ساده است. اما این فقط ظاهر ماجراست چون آژاکسی کردن با UpdatePanel مشکلات خاص خود را داشته و نیاز به تکنیک‌های خاصی برای حل مشکلات آن هست. در ادامه به مرور چند تا از این مشکلات یا تکنیک‌ها که عمدتاً در بخش ‫۷-۳‬‏ و ‫۷-۴‬ فصل ۷ کتاب ASP.NET Ajax in Action آمده است می‌پردازیم:

۱- تزریق کدهای جاوا اسکریپت که قبلا از طریق Page.ClientScript انجام شد حالا باید از طریق متودهای ScriptManager مثل ScriptManager.RegisterStartupScript انجام شود.

۲- همراه با کنترل UpdatePanel دیگر نمی‌توان از Server.Transfer و Response.Write استفاده کرد. در مورد Server.Transfer باید event کنترل مربوطه، یعنی آن کنترلی که Server.Transfer در کد event آن صدا می‌شود را به عنوان PostBackTrigger کنترل UpdatePanel معرفی کنید. در مورد Response.Write هم اگر صرفاً استفاده‌های دیباگ دارید، یعنی از آن در جاهای مختلف برنامه برای نمایش یک پیغام ساده در صفحه استفاده کرده‌اید بهتر است از معادل جاوا اسکریپتی آن یعنی Sys.Debug.trace به همراه ابزارهایی مثل FireBug استفاده کنید.

۳- تا آنجا که می‌شود UpdatePanel کد کمتری را در بر گیرد. هر چقدر که کدهای محصور شده در ContentTemplate آن کمتر باشد Performance بهتری به دست می‌آید.

۴- UpdatePanel یک property دارد به اسم UpdaetMode. با این که حالت پیش فرض این property برابر Always است سعی کنید آن را همیشه در حالت Conditional نگه دارید مگر آن که مجبور شوید از حالت Always استفاده کنید. این property به UpdatePanel می‌گوید چه وقت‌هایی Update شود و چه وقت‌هایی نشود. این تنظیم صرفاً بر روی Performance تاثیر دارد.

۵- قطع ارتباط کنترل‌های سنگینی مثل GridView از parentشان به وسیله کد جاوا اسکریپت control.parentNode.removeNode(gv)‎. این قطع ارتباط بایستی در pageLoading مربوط به PageRequestManager انجام شود.

۶- وقتی که یک صفحه با UpdatePanel آژاکسی شده است به هنگام کار با آن تا نتیجه یک PostBack آسنکرون از سرور بر نگشته است کاری نکنید که صفحه برای بار دوم و سوم و… PostBack بخورد. چون ASP.NET AJAX نمی‌تواند چند PostBack آسنکرون همزمان را به درستی مدیریت کرده و ممکن است دچار گیجی شود.

۷- بعضی کنترل‌ها هستند که کلاً با UpdatePanel مشکل دارند، برای رفع مشکل این طور کنترل‌ها باید منتظر نسخه‌های بعدی dot net framework باشید. FileUpload نمونه‌ای از کنترل‌هایی بود که در framework 2.0 مشکل داشت و احتمالاً تا حالا (زمان انتشار نسخه‌ی بتا ۲ ویژوال استودیو ۲۰۱۰) مشکلش حل شده باشد.

منبع: فصل ۷ کتاب ASP.NET Ajax in Action

مطالعه بیشتر:
۱- آشنایی با کتابخانه Microsoft Ajax Library
۲- جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library
۳- ‫فراخوانی Web Service از Client Side




2009/11/22

‫فراخوانی Web Service از Client Side

همان طور که می‌دانیم فراخوانی و استفاده از Web Serviceها تنها از طریق کدهای Server Side امکان پذیر است، اما اگر بخواهیم یک برنامه آژاکسی Client Side بنویسیم و از Web Serviceها هم در کدهای جاوا اسکریپتی سمت کلاینت استفاده کنیم چه باید کرد؟ راه حل این مشکل در ASP.NET AJAX نهفته است. ASP.NET AJAX امکاناتی را ارائه می‌دهد که با کمک آنها می‌توان یک Web Service را درست مثل توابع داخلی جاوا اسکریپت فراخوانی کرد. اقدامات مورد نیاز برای انجام این کار:

۱- تعریف کلاس وب سرویس (asmx) به طور خاص
۲- معرفی وب سرویس مورد نظر با استفاده از Script Manager
۳- فراخوانی غیر همزمان متودهای دلخواه وب سرویس از کد جاوا اسکریپت

ASP.NET AJAX خودش خروجی وب سرویس را به JSON سریالایز کرده، در سمت کلاینت deserialize کرده و نهایتاً در قالب objectهای جاوا اسکریپتی (با ساختار مشابه objectهای سمت سرور) به کلاینت تحویل می‌دهد بدون آن که استفاده کننده یا برنامه‌نویس بویی از جزییات ببرد.
دقت کنید که تا اینجای کار فرض بر این بوده است که وب سرویس مورد نظر در همان سروری قرار دارد که صفحات aspx ما هم قرار دارند. در صورت نیاز به وب‌سرویس‌ها (و دیگر سرویس‌ها) در وب سایت‌های دیگر باید از راه حل‌های دیگری مثل Bridge استفاده کرد.

 

منبع: فصل ۵ کتاب ASP.NET Ajax in Action (در این فصل غیر از Web Serviceها، روش‌ها و ابزارهای دیگری نیز برای ارتباط Asynchronous با سرور گفته شده است)

مطالعه بیشتر:
۱- آشنایی با کتابخانه Microsoft Ajax Library
۲- ‫‫جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library
۳- نمونه کدهای فصل پنج




2009/11/16

‫‫جاوا اسکریپتی قوی‌تر با Microsoft Ajax Library


اگر می‌خواهید امکانات C#‎ را در کدهای کلاینتی JavaScript داشته باشید آن هم به همان شکلی که در C#‎ وجود دارد، یک راه ساده وجود دارد: استفاده از Microsoft Ajax Library. این کتابخانه بخش client موتور آژاکس مایکروسافت یعنی ASP.NET AJAX را تشکیل می‌دهد و با استفاده از ScriptManager به طور خودکار به صفحات ASP.NET اضافه می‌شود. Mirosoft Ajax Library به جاوا اسکریپت امکاناتی را اضافه می‌کند تا برنامه‌نویسان C# عمده امکانات Object Oriented ‫را به همان سبک و سیاق C#‎ در دسترس داشته باشند. این امکانات عبارتند از:

۱- تعریف Object و Class (هم Property و هم Method)
‫۲- interface
‫۳- enum
‫۴- inheritance
‫۵- event
‫۶- namespace
‫۷- reflection

دقت کنید که این امکانات به Client Side و جاوا اسکریپت اضافه می‌شود، آن هم به جاوا اسکریپتی که بیش از یک function و object بدون متود چیزی ندارد! به عبارت دیگر این یعنی این که شما با کمک این امکانات می‌توانید بخش زیادی از منطق و ساختار برنامه را با کمک هزاران خط کد جاوا اسکریپت به صورت منظم، ساختارمند و کاملا مشابه کدهای شی گرای C#‎ در سمت Client پیاده سازی کنید.

منبع:
فصل سوم کتاب ASP.NET Ajax in Action
مطالعه بیشتر:
الف- ‫آشنایی با کتابخانه Microsoft Ajax Library
ب- راهنمای خیلی فشرده جاوا اسکریپت






مشکل اعداد فارسی و استانداردهای ۶۲۱۹ و ۹۱۴۷

یکی از مشکلات پیش روی استانداردهای ماتصا ۶۲۱۹ و ماتصا ۹۱۴۷ عدم پشتیبانی تعداد زیادی از نرم‌افزارهای موجود از اعداد فارسی است. این دسته از نرم‌افزارها به خصوص آنها که قرار است روی این اعداد پردازشی انجام دهند، یا به طور کلی از پذیرش اعداد فارسی سر باز زده یا دچار خطا شده و رفتارهای عجیبی از خود نشان می‌دهند. به طور مثال:

۱- اکسل ۲۰۰۳ اعداد فارسی را به صورت رشته در نظر می‌گیرد و نمی‌تواند عملیات ریاضی مثل جمع و تفریق را بر روی آنها انجام دهد.
۲- در Windows Live Writer اگر به هنگام ایجاد جدول جدید، طول و عرض جدول با اعداد فارسی وارد شود پیغام خطا داده و بسته می‌شود.
۳- صفحه ورود به اینترنت بانک بانک اقتصاد نوین با هر بار وارد کردن اعداد فارسی هشدار می‌دهد که استفاده از این نویسه‌ها غیر مجاز است.
۴- خیلی از نرم‌افزارهای مالی اداری تولید شرکت‌های داخلی با استفاده از MaskEdit به طور کلی مانع از ورود اعداد فارسی در فیلدهای عددی می‌شوند.
۵- …

ماتصا ۹۱۴۷ این مشکل را پیش‌بینی کرده و به همین دلیل اعداد واقع در NumPad را به همان صورت انگلیسی مورد استفاده قرار می‌دهد. اما با عادات کاربران چه کار کنیم؟ آنهایی که عادت دارند برای ورود اعداد از ردیف بالایی صفحه کلید (ردیف زیر کلیدهای F1 تا F12) استفاده کنند را چه کنیم؟ علاوه بر این مشکلاتی هم با ماتصا ۶۲۱۹ موجود است. به عنوان مثال خود ما در بخشی از نرم‌افزار مالی-اداری‌مان که اطلاعات را به قالب‌هایی مثل اکسل export می‌کند دچار مشکل شدیم. ما در این نرم‌افزار استاندارد ماتصا ۶۲۱۹ را رعایت کرده و اعداد را به صورت فارسی نمایش می‌دهیم نه انگلیسی. حال وقتی که این اطلاعات به اکسل Export می‌شوند اکسل قادر نیست بر روی آن‌ها هیچ گونه عملیات ریاضی مثل جمع و میانگین بر روی آنها انجام دهد. علت آن هم این است که اکسل با اعداد فارسی به صورت رشته برخورد می‌کند نه عدد! البته خوشبختانه این مشکل در اکسل ۲۰۰۷ بر طرف شده.

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

همان طور که پیش‌تر اشاره شد اکسل ۲۰۰۳ اعداد فارسی تولید شده توسط نرم‌افزار سازگار با ماتصا ۶۲۱۹ ما را نمی‌فهمید. با این که اکسل ۲۰۰۷ این مشکل را حل کرده ولی چون کارمندان شرکت مشتری ما حاضر نیستند از اکسل ۲۰۰۷ استفاده کنند ما مجبور شدیم یک راه ابتکاری پیدا کرده و با استفاده از ماکروی زیر اعداد فارسی را در خود اکسل به اعداد انگلیسی تبدیل کنیم:

Attribute VB_Name = "Module1"
Sub fa_support()
Attribute fa_support.VB_Description = "Macro recorded 2009/01/20 by mohebbi"
Attribute fa_support.VB_ProcData.VB_Invoke_Func = " \n14"
'
' Macro1 Macro
' Macro recorded 2009/01/20 by mohebbi
'
Cells.Replace What:=ChrW(1776), Replacement:="0", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1777), Replacement:="1", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1778), Replacement:="2", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1779), Replacement:="3", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1780), Replacement:="4", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1781), Replacement:="5", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1782), Replacement:="6", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1783), Replacement:="7", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1784), Replacement:="8", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1785), Replacement:="9", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1644), Replacement:=",", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:=ChrW(1643), Replacement:=".", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub

مطالعه این مطالب نیز توصیه می‌شود:

۱- معرفی استاندارد ماتصا ۶۲۱۹ – ISIRI 6219
۲- معرفی استاندارد ۹۱۴۷ – ISIRI 9147




2009/11/14

ریز بلاگ نویسی با تویتر


وبلاگ نویسی به صورت رایج آن کار چندان راحتی نیست. برای آن که یک مطلب قابل قبول داشته باشید باید چند پاراگراف متن (حدود ۵۰۰ کلمه) را بدون اشتباه تایپی و گرامری و با جمله بندی صحیح و درست بنویسید. اضافه بر آن معمولاً مجبور هستید یک عکس و کمی نمونه کد (در مورد وبلاگ‌های برنامه‌نویسی) به آن اضافه کرده، برای مطلبتان یک عنوان مناسب پیدا کرده و آن را با چند label مناسب غنی‌سازی کنید. این تازه اول ماجراست چون قبل از همه این‌ها باید یک موضوع مناسب پیدا کرده و به اندازه کافی در ذهنتان برایش content تولید کنید.

همه این مشکلات وقتی که در کنار وقت خیلی کم وبلاگ نویسان قرار گرفتند باعث ظهور پدیده‌ای شدند به اسم «ریز بلاگ نویسی» یا همان Micro Blogging. ریز بلاگ نویسی کار وبلاگ نویسان را از چندین جهت به شدت راحت کرده است:
۱- مجبور نیستید برای یک موضوع کلی گشته و راجع به آن تولید محتوا کنید. همین که آن موضوع به ذهنتان رسید یکی دو جمله کوتاه راجع به آن می‌نویسید و تمام!
۲- ریز بلاگ نویسی وقت خیلی کمتری می‌گیرد.
۳- مجبور نیستید برای افزایش حجم مطلب به آن آب ببندید.
۴- با ریز بلاگ نویسی دوستان خیلی بیشتری پیدا می‌کنید چون تعداد ریز بلاگ نویس‌ها خیلی بیشتر از وبلاگ نویس‌ها است.
۵- می‌توانید با گذشت زمان ریز مطلب‌های نوشته شده درباره یک موضوع خاص را جمع آوری کرده و از آن یک مطلب کامل‌تر و پخته‌تر تهیه کنید چون طی این مدت بازخوردهای زیادی از دوستان خود دریافت کرده‌اید.
۶- تعامل (interactivity) در ریز بلاگ نویسی خیلی بیشتر است چون ریز بلاگ نویسی در جواب دیگران راحت‌تر از comment گذاشتن در وبلاگ‌ها و دنبال کردن کامنت‌های افراد دیگر است.
۷- …

قاعدتاً برای ریز بلاگ نویسی ابزارهای خیلی متعددی وجود دارد. یکی از این ابزارها که اتفاقاً خیلی هم معروف است و نرم‌افزارها و وب‌سایت‌های خیلی زیادی هم برای کار با آن ایجاد شده «تویتر» است. در تویتر هر یک از اشخاص برای نوشتن مطلب به یک سقف ۱۴۰ نویسه‌ای محدود هستند. افراد می‌توانند همدیگر را در تویتر follow کنند یا خود توسط دیگران follow شوند. follow به معنی اشتراک در نوشته‌های فرد مقابل است. در اینجا و اینجا اطلاعات خوبی راجع به تویتر پیدا می‌شود.

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





2009/11/13

سندرم شماره نامه به هم ریخته

همه کسانی که در نوشتن نرم‌افزارهای دبیرخانه دخیل بوده‌اند با مشکلی به اسم به هم ریختگی شماره نامه آشنا هستند. شماره نامه معمولاً ترکیبی از اعداد، علائم، حروف فارسی و گاهاً انگلیسی هستند. از آنجا که ما در یک محیط دو جهته زندگی می‌کنیم هنوز در نحوه چینش صحیح این حروف در کنار یکدیگر ابهاماتی وجود دارد و مردم بسیاری از قواعد موجود را هم یا نمی‌شناسند یا اصلاً به کار نمی‌برند. در نتیجه چیزی که کاربر با هزار دردسر به عنوان شماره نامه وارد می‌کند به هنگام نمایش مجدد دچار به هم ریختگی می‌شود. مثلاً جای حروف و علائم عوض شده یا علامتی مثل خط تیره به جای آن که در سمت راست یک کاراکتر نمایش یابد به سمت چپ آن منتقل می‌شود. این قضیه وقتی تشدید می‌شود که شماره نامه ذخیره شده را بخواهیم در محیط‌های متنوعی مثل reportها، برنامه‌های ویندوزی، وب (IE و فایرفاکس)، xmlهای مربوط به پروتکل ECE و محیط‌های خام مثل SQL Server Management Studio نمایش دهیم. به عنوان نمونه به تصاویر زیر که یک شماره نامه واحد را آن طور که در محیط‌های مختلف دیده می‌شود دقت کنید:

افراد مختلف راه حل‌های مختلفی را برای غلبه بر این مشکل پیدا کرده‌ند. بعضی‌ها یک MaskEdit برای ورود شماره در نظر گرفته‌اند. بعضی‌ها شماره نامه وارده شده را به صورت یک عکس render کرده و نمایش می‌دهند. بعضی‌ها برای نمایش صحیح در صفحات وب یک ActiveX ایجاد کرده‌اند. بعضی‌ها هم قالب شماره نامه را طوری تعریف کرده‌اند که دچار مشکل کمتری شوند و این قالب را به کارفرما تحمیل کرده‌اند.


اما راه حلی که من مورد استفاده قرار داده‌ام استفاده از نویسه یونیکد LEFT-TO-RIGHT OVERRIDE است. وجود این نویسه در هر رشته‌ای باعث می‌شود کلیه نویسه‌هایی که بعد از آن وارد می‌شوند به صورت اکیداً چپ به راست نمایش نمایش یابند. یعنی انگار نه انگار محیط کار، راست به چپ است. به عنوان مثل فرض کنید می‌خواهیم جمله «پاییز زیبا است» را یک بار به صورت عادی و یک بار دیگر هم با وارد کردن این کاراکتر بین کلمات «پاییز» و «زیبا» نمایش دهیم. عکس زیر هر دو حالت را نمایش می‌دهد.


حال روش من برای استفاده از این کاراکتر این است که در رویداد OnKeyPress (یا هر رویداد مشابه دیگری) بعد از ورود هر کاراکتر توسط کاربر، این کاراکتر نیز به قبل از آن اضافه شده سپس نمایش یابد. نهایتاً به هنگام ذخیره متن وارد شده بایستی به جز کاراکتر ابتدای متن، بقیه کاراکترهای LEFT-TO-RIGHT OVERRIDE را از متن پاک کرد. چون وجود بیش از یک مورد آن غیر ضروری است. برای درک بهتر موضوع به کد جاوا اسکریپت زیر که این روش را در صفحات وب پیاده سازی می‌کند دقت کنید. بدیهی است که برای WinForm و WPF هم می‌توان این روش را به کار برد:


function ltr_override(e)
{
//‫از این تابع در onkeypress هر textBox که استفاده شود باعث می‌شود که
//کاراکترهای تایپ شده توسط کاربر به طور مطلق از چپ به راست نمایش داده
//شود. حتی اگر کاربر یک متن فارسی را وارد کند. کاربرد فعلی این تابع
//در شماره نامه است که همیشه از چپ به راست خوانده می‌شود

//‫دقت شود که رشته تولید شده توسط این تابع پر از کاراکتر یونیکد 0x202d است و
//قبل از ذخیره در بانک اطلاعاتی یا انجام هر پردازش دیگری باید از رشته مورد نظر پاک شود

var key;
var obj;
if (window.event) {
e = window.event;
obj = e.srcElement;
key = e.keyCode;
} else {
obj = e.target;
key = e.charCode;
}
//0x202d: LEFT-TO-RIGHT OVERRIDE
obj.value = String.fromCharCode(0x202d)+obj.value;
return true;
}


پ. ن. ۱: کاراکتر LEFT-TO-RIGHT OVERRIDE یکی از کاراکترهای ویژه معرفی شده در الگوریتم شماره ۹ یونیکد (الگوریتم دو جهته) و جزیی از استاندارد ماتصا ۶۲۱۹ (ISIRI 6219) می‌باشد.

پ. ن. ۲: برای مطالعه بیشتر اینجا و اینجا را بخوانید.

پ. ن. ۳: استفاده از ابزارک «فردیس» شاید بتواند در کار با نویسه‌های ویژه یونیکد کمک کند.

پ. ن. ۴: من ایده اصلی این کار را از این کتابخانه که برای شبیه سازی صفحه کلید ۲۹۰۱ در محیط‌های غیر فارسی نوشته شده بود و با نگاهی به اینجا و اینجا گرفتم.




2009/11/09

‫آشنایی با کتابخانه Microsoft Ajax Library

کتابخانه Microsoft Ajax Library  بخش کلاینت ASP.NET AJAX را تشکیل می‌دهد. ASP.NET AJAX شامل دو بخش دیگر به نام‌های ASP.NET AJAX Extensions و AJAX Control Toolkit نیز می‌باشد. این کتابخانه نه تنها امکانات Ajax را در کلاینت مهیا می‌کند بلکه یک کتابخانه خیلی خوب برای JavaScript نیز محسوب می‌گردد. با کمک این کتابخانه می‌توان کدهای جاوا اسکریپت را خیلی راحت‌تر، بهینه‌تر و خلاصه‌تر نوشت. مثلا این کتابخانه همچون jQuery به جای استفاده از دستورات طویلی مثل document.getElementById('someid').value; از دستورات خلاصه‌تری مثل $get('someid') استفاده می‌کند.  در ادامه فهرستی از امکانات اولیه این کتابخانه برای کار با جاوا اسکریپت و DOM می‌آید. دقت شود که کتابخانه Microsoft Ajax Library غیر از این فهرست شامل امکانات زیادی برای دیگر کارها از جمله خود Ajax هم هست.
۱- رعایت سازگاری با مرورگرهای مختلف بدون آن که لازم باشد برنامه‌نویس در آن دخالت کند.
۲- ارائه کلیه امکانات به نحوی که برای برنامه‌نویسان دات‌نت آشناتر است. مثل ساختار Array، Exception، فرمت استرینگ کاملاً مشابه دات‌نت.
۳- امکانات Event Handling و Delegates کاملاً مشابه دات‌نت.
۴- Error Handling مشابه ساختار Exception Handling در دات‌نت.
۵- امکان خیلی به دردبخور Debug. دیگر نیاز نیست از alert استفاده شود.
۶- ارائه ساختار client page life cycle مشابه آنچه که در Page در صفحات ASP.NET قرار دارد.
۷- Globalization

نمی‌دانم Microsoft Ajax Library رقیب jQuery یا هر کتابخانه دیگری باشد یا نه، اما ظاهراً استفاده از این کتابخانه حتی برای مقاصد صرفا کلاینتی و غیر آژاکسی هم می‌تواند کیفیت و کارایی کد را بسیار بالا ببرد.

منبع: فصل ۲ کتاب ASP.NET Ajax in Action





2009/11/06

‫مشارکت من در یک نرم‌افزار آزاد به نام OTRS

OTRS چیست؟
OTRS یک نرم‌افزار آزاد و کد باز (FOSS) است که در اصل یک نرم‌افزار مکانیزاسیون Help Desk می‌باشد ولی بعدها امکانات ITIL:ITSM هم به آن افزوده شد. از این نرم‌افزار در تیم‌های پشتیبانی محصول و خدمات IT در شرکت‌ها و ادارات استفاده شده و گاهی اوقات آن را CRM نیز می‌نامند، چون تعامل مشتریان را با سازمان مدیریت می‌کند. OTRS فعلاً در ایران بیشتر در ISPها استفاده می‌شود. این نرم‌افزار تحت وب با پرل نوشته شده و محیط اصلی اجرای آن LAMP می‌باشد ولی به راحتی در ویندوز، IIS و MS SQL Server هم قابل اجراست. این نرم‌افزار تحت مجوز GPL منتشر شده و هسته اولیه آن را یک آلمانی به نام Martin Edenhofer ایجاد کرده است. OTRS به طور مداوم در حال توسعه بوده و جامعه کاربری بسیار فعالی دارد.

OTRS چطور پول در می‌آورد؟
توسعه‌دهندگان اولیه OTRS کارشان را با تاسیس یک شرکت ادامه دادند. خدماتی که این شرکت ارائه می‌دهد عبارت است از توسعه OTRS و ماژول‌های آن و افزودن امکانات خاص به آن بر مبنای درخواست مشتری (با دریافت پول)، مشاوره و استقرار OTRS در سازمان مشتری، قراردادهای پشتیبانی و مشاوره و خدمات hosting.
در عین حال توسعه دهنده اصلی OTRS بر خلاف خیلی از نرم‌افزارهای کدباز معروف عمدتاً خود اعضای این شرکت هستند نه جامعه برنامه‌نویسان داوطلب. البته OTRS توسعه‌ها و patchهای کاربران را نیز قبول کرده و به CVS خود می‌افزاید. بعضی افراد هم ماژول‌های خاص خود را برای OTRS توسعه داده‌اند اما با وجود همه این حرف‌ها باز هم عمده توسعه توسط خود شرکت انجام می‌پذیرد. همان طور که در بالا اشاره شد سود شرکت OTRS از خدمات جانبی که ارائه می‌دهد آنقدر هست که حالا حالاها به توسعه OTRS و انتشار مجانی و آزاد آن ادامه دهد و حتی به فکر افزایش سرمایه هم باشد.

OTRS چطور مشارکت افراد را به خود جلب می‌کند؟
پروژه OTRS (نه شرکت OTRS) هیچ چیزی برای پنهان کردن ندارد. آنها صداقت فوق‌العاده‌ای دارند و مانند هر پروژه کدباز موفق دیگری همه موارد مورد نیاز را در اختیار افراد قرار می‌دهند:
۱- تمام سورس کد بدون هیچ مخفی کاری شامل نسخه‌های جاری و تمام نسخ قبلی (CVS) ++
۲- چند mailing-list فعال همراه با آرشیوهای قبلی. ++
۳- مرجع خیلی دقیقی برای ثبت و پیگیری bugها به اسم Bugzilla. آنها تک تک باگ‌های ثبت شده را مورد بررسی قرار داده و در صورت لزوم ترتیب اثر می‌دهند. ++
۴- documentation همه بخش‌ها به طور کامل. ++
۵- پشتیبانی کامل از زبان‌های غیر انگلیسی از جمله زبان فارسی (به جز تقویم)
۶- همکاری و راهنمایی به کاربران و رسیدگی به مشکلات و باگ‌های ارائه شده توسط آنها

چطور با OTRS آشنا شدم و چه کارهایی با انجام دادم؟
پاییز ۸۶ وقتی که در یک مرکز دولتی کار می‌کردیم OTRS به عنوان یک نرم‌افزار مدیریت Trouble Ticket به ما معرفی و از ما خواسته شد ضمن بررسی و نصب آن در صورت امکان آن را برای زبان فارسی و محیط ایران محلی‌سازی کرده و گزارشاتی به آن بیفزاییم. پاییز ۸۷ همین کار را یک شرکت نیمه خصوصی انجام دادیم. با این تفاوت که این بار قرار شد از ماژول ITSM به طور کامل استفاده کرده و بخشی از فرایند ITIL یعنی Service Managment را با استفاده از OTRS پیاده‌سازی کنیم. ما در بهار ۸۸ برای بار سوم OTRS را در یک شرکت خصوصی نرم‌افزاری مورد بهره‌برداری قرار دادیم اما این بار بدون توجه به ITIL و به عنوان یک نرم‌افزار صرفاً Ticket Management. این شرکت از OTRS برای ثبت و پیگیری درخواست‌های رفع مشکل (Ticket) مشتری‌ها و در واقع به عنوان نرم‌افزاری برای پیاده‌سازی مفهوم CRM استفاده می‌کند.

من چه کارهایی برای OTRS انجام دادم؟
۱- ترجمه بعضی ماژول‌ها و به روز رسانی ترجمه‌های قبلی نرم‌افزار ++ ++ ++ ++ ++
۲- همکاری جهت رفع مشکلات مربوط به زبان فارسی ++ ++ ++  ++ ++
۳- تهیه راهنمای نصب OTRS در ویندوز ++ ++ ++ ++
۴- تحریر بعضی مطالب جهت بررسی و تبلیغ OTRS ++ ++ ++ ++
۵- مشارکت‌های هر چند خیلی کوچک در جوابگویی به سوالات کاربران در mailing listهای مربوطه.

من چه چیزهایی از OTRS یاد گرفتم؟
من علاوه بر این که همیشه حق‌الزحمه کارهای خودم را از کارفرماهایم گرفته‌ام چیزهای زیادی در حین مشارکت در OTRS یاد گرفته‌ام:
۱- تجربه‌ی کار با یک تیم حرفه‌ای توسعه نرم‌افزار در آن سوی مرزها، هر چند خیلی کوتاه و مختصر.
۲- سورس کنترل، Bug Tracking، پایگاه خبری و مدیریت نسخه‌های (منتشر شده) در موفقیت یک پروژه نقش خیلی حیاتی بازی می‌کنند و هیچ وقت نباید هیچ کدام از آنها را دست کم گرفت و یا کنار گذاشت.
۳- چطور می‌شود یک پروژه کدباز و کاملاً آزاد ایجاد کرد و از آن حتی بدون donation پول در آورد، شرکت موفقی تاسیس کرد و حسابی هم معروف شد.
۴- چطور می‌توان طعم شیرین مشارکت در یک پروژه کدباز را چشید، به آن کمک کرد و بی پول هم نماند. قرارداد با یک شرکت ایرانی از یک سو و به اشتراک گذاشتن کارهای انجام شده و مفاهیم یاد گرفته شده با جامعه کاربری پروژه از دیگر سو.
۵- چطور فرایند پشتیبانی از یک نرم‌افزار در یک شرکت نرم‌افزاری را با استفاده از OTRS مکانیزه و منظم کرده و به اصطلاح یک CRM (مدیریت ارتباط با مشتری) به وجود آورد.

پیوندهای مرتبط:
۱- پروژه OTRS
۲- شرکت OTRS
۳- مطالب وبلاگ خودم راجع به OTRS
۴- شرکت امپیکو