مطالب
مشکل فایل‌های ANSI-Windows-1256 با VS.Net در ویندوز 7

در ویندوز XP زمانیکه زبان سیستم و همچنین کشور جاری به ایران تنظیم شود، VS.Net فایل‌های ANSI را از نوع ANSI-Windows-1256 (یا همان ANSI-Arabic) در نظر می‌گیرد و مشکلی هم برای ذخیره داده‌های یونیکد در این نوع فایل‌های ANSI ویژه نخواهد بود (الزامی وجود ندارد که این فایل‌ها حتما به فرمت UTF8 ذخیره شوند). اما در ویندوز 7 با همان تنظیمات، VS.Net این فایل‌ها را با encoding از نوع windows-1252 تشخیص می‌دهد و پس از کامپایل برنامه‌ای که قبلا مشکل نداشت، این‌بار همه چیز به همه ریخته خواهد بود. شاید اینطور به نظر برسد که این فایل‌ها خراب شده‌اند، ولی خیر. مشکلی وجود ندارد؛ فقط فرمت encoding خواندن آن‌ها باید windows-1256 باشد (و نه 1252) و گرنه تخریب شده به نظر می‌رسند.

تعداد فایل‌ها هم زیاد است و نیاز به یک روش سریع برای رفع این مشکل وجود داشت.
بنابراین سه عملیات باید صورت گیرد:
لیست کردن تمام فایل‌های مورد نظر (فایل‌های cs و aspx و امثال آن فقط)
پیدا کردن encoding جاری فایل‌ها : کدامیک از آن‌ها با فرمت UTF-8 ذخیره نشده‌اند؟
تبدیل به یونیکد: خواندن این فایل‌های غیر یونیکد یافت شده با فرمت windows-1256 و سپس ذخیره مجدد با فرمت UTF-8

که خلاصه روش انجام کار به صورت زیر است:

الف) آیا فایل جاری مورد نظر با فرمت UTF-8 with signature ذخیره شده است؟
این signature در مورد فایل‌های UTF-8 به سه بایت اول فایل بر می‌گردد که اصطلاحا byte-order mark یا BOM گفته می‌شود و باید مساوی EFBBBF باشد. چون فایل‌های ANSI این امضا را ندارند، در یک سیستم ممکن است 1256 خوانده شوند و در یک سیستم دیگر 1252 یا نوع‌های ANSI دیگر بسته به تنظیمات جاری سیستم و مشکل اصلی از VS.Net نیست.

/// <summary>
/// آیا فایل مورد نظر با فرمت یونیکد دارای امضا ذخیره شده است؟
/// </summary>
/// <param name="filePath">فایل ورودی</param>
/// <returns>بله یا خیر</returns>
public static bool IsUTF8(string filePath)
{
using (FileStream file = new FileStream(filePath,
FileMode.Open, FileAccess.Read, FileShare.Read))
{
if (file.CanSeek)
{
byte[] bom = new byte[4]; // Get the byte-order mark, if there is one
file.Read(bom, 0, 4);
if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)) // utf-8
{
return true;
}
else
{
return false;
}
}
else
{
//احتمالا فایل بایناری است
return false;
}
}
}

ب) خواندن یک فایل ANSI عربی با فرمت windows-1256 بدون تخریب اطلاعات آن و سپس ذخیره سازی با فرمت UTF-8

/// <summary>
/// تبدیل یک فایل انسی عربی به یونیکد دارای امضاء
/// </summary>
/// <param name="path">مسیر ورودی</param>
public static void FixWindows1256(string path)
{
try
{
//باز کردن فایل با فرمت انسی عربی و تبدیل به یونیکد
string data = File.ReadAllText(path, Encoding.GetEncoding("windows-1256"));
//نوشتن حاصل یونیکد در جای قبلی با فرمت مربوطه
File.WriteAllText(path, data, Encoding.UTF8);
}
catch (Exception ex)
{
//دسترسی وجود ندارد یا امثال آن
Console.WriteLine(ex.ToString());
}
}


پ.ن.
جالب اینجا است که این نوع فایل‌های ANSI عربی در وب زیاد پیدا می‌شوند. برای مثال اینجا کلیک کنید. تمام این نوع فایل‌ها را با متد فوق می‌توان بدون تخریب اطلاعات به فرمت UTF-8 دارای امضاء اصلاح کرد.

مطالب
چند نکته کوتاه و عمومی در مورد قبل و بعد از نصب ویندوز 7

- فایل ISO ایی که از سایت‌های این دور و اطراف قابل دریافت است، یک DVD از نوع bootable به شما ارائه نخواهد داد. بنابراین نیاز است تا این قابلیت را فراهم کرد. خود مایکروسافت برنامه سورس بازی را در آدرس زیر جهت تهیه یک bootable DVD یا حتی bootable flash drive از روی فایل ISO دریافت شده ارائه داده است:


- نیاز است تا کلیه افزونه‌ها، کلمات عبور ذخیره شده و غیره‌ی فایرفاکس را بتوان به سیستم جدید انتقال داد. ابزار رایگان و سورس باز MozBackup این‌کار را به بهترین نحو ممکن میسر می‌سازد: +

- پس از نصب، نیاز به صفحه کلید فارسی مرغوب می‌باشد : + و +

- پس از نصب ویندوز 7 ، درایو ویندوز قبلی موجود شما ناپدید شده است! نحوه‌ی رفع مشکل : +

- هر چند در پیدا کردن درایورها از اینترنت مشکلی ندارد، اما بد نیست یکبار هم سیستم را با ابزار رایگانی جهت به روز بودن درایورها بررسی کرد: +

- اگر هنگام کار با Virtual PC مایکروسافت هنگام اتصال به VPN با خطای 721 متوقف شدید، نگران نباشید. با انتخاب گزینه‌ی run as admin این مشکل برطرف می‌شود.

- تنظیم DNS جدید گوگل نیز توصیه می‌شود: +

و یک گجت تقویم فارسی هم کفایت می‌کند : + و یا +

مطالب
کتابخانه‌ی انواع و اقسام مدل‌های داده‌ای

سایت databaseanswers.org قسمتی را دارد تحت عنوان Data models که طراحی دیتابیس بیش از 600 سیستم را جمع آوری کرده است.
از data model سیستم مدیریت ارتباطات



تا data model یک باغ وحش





مطالب
دریافت کتاب از Google books

پیرو مطلب "آیا نمودارهای UML هنوز هم استفاده‌ی صنعتی گسترده‌ای دارند یا خیر؟" در کامنت‌های این مطلب، اکثرا عنوان می‌کردند که از CRC cards استفاده می‌کنند. کتاب معروف CRC cards هم به نام The CRC card book مربوط به سال 1997 است و در کتاب فروشی‌های این دور و اطراف یافت نشد (یا حداقل من نیافتم). اما این کتاب در Google books موجود است.

برنامه رایگان و سورس بازی برای این منظور در CodePlex موجود است که پس از دریافت آدرس کتاب، کل آن‌را از Google books دریافت کرده و یک خروجی pdf و یا تصویری ارائه می‌دهد.



آنچنان سرعت بالایی برای دریافت یک کتاب ندارد اما کار می‌کند (برای دریافت یک کتاب شاید نصف روز معطل شوید).

مطالب
رفع مشکل initializing toolbox هنگام باز کردن یک پروژه وب

بعد از نصب مجموعه AJAX Control Toolkit و همچنین نمونه‌های مشابه موجود برای سیلورلایت و WPF دو مشکل برای VS2008 من رخ داد :

1- از کار افتادن نوار ابزار کنترل‌ها (کار نمی‌کرد! نمی‌شد روی کنترلی کلیک کرد)
2- به ازای باز کردن هر صفحه aspx و امثال آن در IDE ، حدود یک دقیقه در پایین صفحه، سمت چپ نوشته می‌شد، initializing toolbox و بعد هم IDE تقریبا هنگ می‌کرد.

نحوه رفع مشکل:
روی tool box کلیک راست کرده و گزینه reset toolbox را انتخاب کنید.
حدود 10 دقیقه با مصرف CPU نزدیک به 100 درصد همه چیز مرتبط و مثل روز اول می‌شود.
بعد از این، باز کردن فایل‌های پروژه فقط با یک کلیک امکان پذیر شده و مشکل هنگ IDE برطرف می‌شود.

البته VS 2008 خام با پروژه‌های وب خیلی مشکل دارد و عملا بعد از نصب SP1 آن کاملا روان شده و درست کار می‌کند.


مطالب
آشنایی با Defensive programming - قسمت دوم

در ادامه یک سری از خط مشی‌های متداول در defensive programming را با هم مرور خواهیم کرد:

1- بررسی نال بودن اشیاء
سعی در استفاده از اشیاء نال، به یک NullReferenceException منتهی خواهد شد. اگر به هر دلیلی امکان نال بودن یک شیء وجود داشت، پیش از استفاده از آن، حتما این وضعیت ‌را بررسی نمائید.
بهترین ابزاری هم که برای این منظور می‌توان استفاده کرد، نگارش جدید افزونه‌ی ReSharper است که زیر شیء‌ایی را که احتمال نال بودن آن می‌رود یک خط آبی رنگ می‌کشد.



2- بررسی آرگومان‌های دریافتی
برای نمونه اگر متد شما تاریخی را بر اساس DateTime دریافت می‌کند، حتما حدود آن‌را بررسی نمائید. برای مثال دریافت تاریخ 31 اسفند از کاربر، به یک ArgumentOutOfRangeException منتهی خواهد شد. بنابراین آرگومان‌های دریافت شده باید انتظارات مربوطه را برآورده کنند و پیش از استفاده حتما بررسی گردند تا بتوان مشکلات را به کاربر به صورت واضحی گوشزد کرد. (خطای ArgumentOutOfRangeException برای کاربر نهایی بی‌معنی است)

3- وضعیت اشیاء را بررسی کنید
برای مثال بستن یک کانکشن به دیتابیس در صورت بسته بودن آن،‌ به یک InvalidOperationException منتهی می‌شود. بنابراین بهتر است ابتدا وضعیت این شیء بررسی شده و سپس عملیات خاصی بر روی آن صورت گیرد.

4- هنگام کار با آرایه‌ها دقت کنید
اگر اندیس فراخوانی شده کمتر از صفر یا بیشتر از اندازه‌ی آرایه باشد به یک IndexOutOfRangeException بر خواهید خورد. بنابراین همواره بهتر است که این بررسی پیش از بروز واقعه انجام شود.

5- مراقب الگوریتم‌های بازگشتی باشید
هر چند متدهای بازگشتی در بعضی از موارد کار راه انداز هستند اما اگر بدون دقت از آن‌ها استفاده شود ممکن است سبب ایجاد یک حلقه‌ی بی نهایت شده و نهایتا برنامه با یک StackOverFlowException خاتمه می‌یابد (این مورد در دات نت فریم ورک تنها حالتی است که با try و catch قابل مهار نیست).

6- هنگام تبدیل اشیایی از نوع object‌ مراقب باشید
اگر قصد تبدیل یک شیء را به نوعی داشته باشید که با مقدار ذخیره شده در آن مطابقت ندارد، یک InvalidCastException حاصل خواهد شد. بنابراین در اینگونه موارد بهتر است از اپراتورهای as و یا is استفاده کنید. هنگام استفاده از as اگر عملیات تبدیل با موفقیت صورت نگیرد، حاصل عملیات تنها یک شیء نال خواهد بود و استثنایی رخ نخواهد داد.

7- بجای متد Parse از TryParse استفاده کنید
برای مثال در دات نت جهت تبدیل یک رشته به مقداری عددی می‌توان از int.Parse و یا int.TryParse استفاده کرد. در حالت اول اگر عملیات تبدیل میسر نباشد حتما یک FormatException رخ خواهد داد اما در حالت دوم در صورت موفقیت آمیز بودن عملیات تبدیل، خروجی true خواهد بود و حاصل اصلی را با یک پارامتر از نوع out در اختیار شما قرار می‌دهد.


و به صورت خلاصه
- ورودی‌های کاربر را محدود کرده (مثلا اگر قرار است عددی را وارد کند، از یک تکست باکس عددی (masked edit controls) استفاده کنید) و یا آن‌ها را دقیقا بررسی نمائید تا احتمال بروز خطاهای بعدی را کاهش دهید.
- زمانیکه می‌توان از بروز یک exception جلوگیری کرد، بهتر است مدیریت آن‌را به قسمت catch بلاک try/catch واگذار نکرد.
- و هنگامیکه با برنامه نویسی نمی‌توانید تمامی خطاهای ممکن را پیش بینی کرده و آن‌ها را مدیریت کنید، برای مدیریت استثناء‌ها برنامه داشته باشید.

مطالب
اصلاح شیوه نامگذاری در ReSharper

یکی از روش‌های متداول نام گذاری متدها در سی شارپ به این صورت است که متدهای خصوصی با حروف کوچک شروع شوند یا lower camel case و متدهای عمومی با حرف بزرگ.
ReSharper 4.5 که جزو ابزارهای واجب کاری است، گزینه Naming style را نیز اضافه کرده و اگر شما از اصول نامگذاری متدها، کلاس‌ها ، متغیرها و غیره پیروی نکنید، علایم راهنمایی را به شما ارائه خواهد کرد. در این نگارش تمامی متدها به یک صورت در نظر گرفته می‌شوند: Upper camel case .



برای اصلاح آن می‌توان به برگه گزینه‌های آن مراجعه کرده و در قسمت naming style بر روی دکمه add مربوط به user defined naming rules کلیک و تغییر زیر را اعمال نمود:



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





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

پرسش پاسخ
برای ایجاد یک وبلاگ بلاگری از کجا شروع کنم؟ با داشتن یک اکانت جی میل، به آدرس زیر مراجعه کرده و هر تعداد که مایل بودید می‌توانید وبلاگ ایجاد نمائید:
قالب‌های پیش فرض گوگل چنگی به دل نمی‌زنند و بود و نبود آن‌ها احساس نمی‌شود! چه باید کرد؟ برای تهیه قالب‌های فارسی به آدرس زیر مراجعه نمائید:
تاریخ فارسی را چه کنم؟ روش دوستان ، روش من
برنامه نویسم! کدهای من یا نمایش داده نمی‌شود یا فرمت آن‌ها هنگام ارسال به هم می‌ریزد. چه باید کرد؟ روش مورد علاقه‌ی من ، روش مایکروسافت (+ و + و افزونه‌ای برای این‌کار)
آخرین نظرات کاربران سایت را چگونه در ستون کناری سایت نمایش دهم؟ یکی از ویجت‌های پرکاربرد گوگل در بلاگر، ویجت فید است. هر بلاگ دارای دو فید مطالب و نظرات است. ویجت فید را اضافه کرده و سپس آدرس فید نظرات سایت خود را به آن معرفی کنید. همیشه آخرین 5 نظر ارسالی را نمایش می‌دهد. این ویجت کاربردهای قابل توجهی می‌تواند داشته باشد.
آمار مراجعان به سایت را باید در کجا ملاحظه کرد؟ جای پیش فرضی وجود ندارد! یک اکانت Analytics برای خود تهیه کرده و آن‌را به سایت اضافه کنید. همچنین پس از آن یک اکانت فید برنر را نیز برای خود تهیه کنید. فیدبرنر اکنون جزیی از گوگل است و پس از معرفی آدرس فید سایت خود به آن، یک آدرس جدید به همراه آیکونی برای نمایش در سایت به شما می‌دهد که می‌توانید تگ‌های آن تصویر ‌را توسط ویجت html نمایش دهید. همچنین از همین طریق نیز می‌توان اشتراک از طریق ایمیل را به وبلاگ اضافه کرد.
کامنت‌های سایت من در بیرون از سایت باز می‌شوند. چرا؟ به این مطلب مراجعه نمائید:
چگونه برای بلاگ خود قسمت ارسال نظرات را تهیه نمایم؟ من از سرویس فرم ساز Zoho‌ استفاده می‌کنم که در سال 2008 جزو برترین‌های وب شناخته شده بود. بعد از ایجاد فرم خود و دریافت کد مربوطه، یک مطلب جدید را ارسال کنید و در بدنه‌ی آن ، کدی را که Zoho به شما ارائه می‌دهد قرار دهید. سپس لینک این مطلب را توسط یک ویجت html به کنار سایت اضافه کنید تا همیشه در دسترس باشد.

مطالب
نحوه شبیه سازی سرعت‌های اتصال پایین جهت آزمایش یک وب سایت

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






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


مطالب
چگونه بررسی کنیم smtp server مورد نظر ما کار می‌کند؟

گاهی برای عیب یابی عدم ارسال ایمیل نیاز هست بررسی کنیم آیا smtp server مورد نظر جواب می‌دهد؟ آیا در شبکه به آن دسترسی داریم؟ یا برای مثال آیا ISP ما این عملیات را بلاک نکرده است؟

مثال الف) بررسی دسترسی به gmail
در خط فرمان تایپ کنید، telnet و سپس دکمه enter را فشار دهید.
در ادامه سطر زیر را وارد نمائید و enter کنید:
open smtp.gmail.com 587
اگر پیغام زیر را برای مدتی طولانی دریافت کردید، یعنی به میل سرور گوگل دسترسی ندارید و به هر علتی بلاک شده است:
Connecting To smtp.gmail.com...
در غیراینصورت یا یک صفحه مشکی خالی را دریافت خواهید کرد و یا یک پیغام معمولی؛ پس از آن مجددا در خط فرمان وارد کنید helo و سپس enter (دقت کنید helo یک l دارد اینجا).
صفحه زیر را باید مشاهده نمائید:



مثال ب) بررسی دسترسی به میل سرور لوکال
همانند مثال قبل است فقط قسمت open آن به شکل زیر تغییر خواهد کرد:
open localhost 25
و یا
open 127.0.0.1 25