2011/02/26

‫تفاوت Load و Get در NHibernate


برای فراخوانی رکوردها از دیتابیس (بر اساس primary key) به حافظه دو راه در NHibernate وجود دارد. یکی Get و دیگری Load. متود Get برای دستیابی به رکورد مربوطه مستقیماً به cache یا database مراجعه می‌کند در حالی که متود Load تا زمانی که کسی propertyی غیر از id را فراخوانی نکرده به دیتابیس مراجعه نمی‌کند. بنابراین متود Load برای ایجاد reference به آبجکت خیلی مناسب‌تر است. مثلاً با استفاده از Load می‌توان رفت و آمد به دیتابیس را در فرایندهای Update کاهش داد. برای کسب اطلاعات بیشتر به اینجا و اینجا مراجعه کنید.




2011/02/24

‫اندازه گیری سرعت صفحات ASP.NET

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

۱- یکی از دقیق‌ترین ابزارها برای اندازه‌گیری سرعت صفحات ASP.NET استفاده از Performance Monitor در ویندوز ۲۰۰۸ است.


با استفاده از این ابزار می‌توانید بفمهید اجرای صفحه مورد نظر شما چقدر طول می‌کشد و در کدام یک از مراحل اجرای کد دات‌نت قرار دارد. سه تا از counterهای مفید عبارتند از

  • ‭% Time in Jit (.Net CLR Jit)
  • ‭Request Execution Time (ASP.NET Apps)
  • ‭Requests/Sec (ASP.NET Apps)

۲- ابزار دیگری که بدون دسترسی به سرور هم قابل استفاده است و بیشتر روی مراحل مختلف ساخت شی Page متمرکز است، عبارت است از ابزار Trace.



برای فعال کردن این امکان در ASP.NET باید تنظیمات زیر را در مدخل system.web در web.config قرار دهید:

۳- حواستان باشد زمان مورد نیاز برای JIT را به حساب کندی برنامه نگذارید. dllهای دات‌نت به زبان IL هستند و برای اجرا نیاز دارند به کد ماشین ترجمه شوند. انجام این کار به عهده JIT هست. وقتی که یک برنامه ASP.NET را در IIS قرار می‌دهید، با اولین درخواست برای هر صفحه، کد آن توسط JIT تبدیل به کد ماشین می‌شود. این تبدیل فقط یک بار انجام خواهد شد و برای دفعات بعد cache خواهد شد.




2011/02/22

‫if تنفر انگیز


به این if توجه کنید:
//code...

if (something != null)
{
Do1();
Do2();
}

//code...
در اینجا null نبودن بررسی شده و بر اساس آن یک سری عملیات انجام می‌شود. اما دقت کنید که اگر مقدار مورد نظر null باشد هیچ مکانیزمی برای اعلام خطا وجود ندارد و به سادگی هر چه تمام‌تر آن بخش از کد بی هیچ سر و صدایی skip خواهد شد. درست است که بعضی جاها null بودن لزوماً به معنای خطا نیست اما اگر نمونه کدی ببینید که تمام ifهای آن به همین سبک هستند حتماً از این ifها متنفر خواهید شد.




2011/02/20

مروری بر مفاهیم بانک اطلاعاتی

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


integrity - جامعیت
صحت داده‌ها، مثلاً موجودی حساب بانکی منفی نباشد

Domain Integrity - جامعیت دامنه‌ای
یعنی تمام صفات در تمام رابطه‌ها از نوع دامنه خود باشند. مثلاً تعداد فرزندان یک شخص نباید اعشاری باشد.

Intra-relation Integrity - جامعیت درون رابطه‌ای
یعنی هر رابطه‌ای به تنهایی صحیح باشد. مثلاً همه کلیدهایش درست باشد.

Referential Integrity - جامعیت ارجاع
یعنی کلید خارجی درست تعریف شده باشد. مثلاً کلید خارجی یک رابطه حتماً در رابطه دیگر کلید باشد.

consistency - هم خوانی
اطلاعات مختلف سیستم با هم در تضاد نباشد. مثلاً نام شخص در جاهای مختلف سیستم یکی باشد.

impedance mismatch - ناهمگونی مانع
همان تفاوتی که بین زبان SQL و C#‎ وجود دارد و ORMها مدعی حل آن هستند.

Super Key - ابرکلید
هر ترکیبی از صفت‌ها که خاصیت کلید داشته باشد. این کلید کمینه نیست. یعنی زیر مجموعه‌ای از آن هم می‌تواند کلید باشد. مثل «شماره دانشجویی» و «شمار دانشجویی و نام دانشجو»

Candidate Key - کلید کاندید
هر ترکیبی از صفت‌ها که کلید کمینه باشد. یک رابطه ممکن است چند کلید کاندید داشته باشد.

Primary Key - کلید اصلی
یکی از کلیدهای کاندید است که توسط مدیر بانک اطلاعات انتخاب شده.

Alternative Key, Secondary Key - کلید فرعی
یکی دیگر از کلیدهای کاندید است که برای برخی کاربردها انتخاب می‌شود.

Foreign Key - کلید خارجی
صفتی است در یک رابطه که در رابطه‌ی دیگری کلید اصلی (یا فرعی) است و برای برقراری ارتباط بین دو رابطه استفاده می‌شود.

Projection پرتو
انتخاب تعداد محدودی از ستون‌ها نه همه آنها

Having
اعمال شرط روی دستورات Group By

Normalization - نرمال سازی
از بین بردن افزونگی داده‌ها (Data Redundancy) با استفاده از فرم‌های نرمال‌سازی 1NF، 2NF و 3NF و گاهی اوقت BCNF

ضرب دکارتی
select * from city, country

join و inner join
هر دو یکی هستند. به معنی پیوند دو جدول با لحاظ شرط مربوطه

left join و left outer join
هر دو یکی بوده و مثل inner join عمل می‌کند منتها سمت چپ رابطه را همیشه می‌آورد حتی اگر به ازای آن چیزی وجود نداشته باشد.

right join و right outer join
برعکس right join

full outer join
ترکیب left join و right join



منابع:




2011/02/18

اتاق چینی

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

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

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




‫کتاب‌های NHibernate

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


NHibernate 3.0 Cookbook

اگر با مفهوم Cookbook به طور کلی آشنایی داشته باشید به خوبی متوجه نوع مطالب این کتاب خواهید شد. Cookbook معمولاً به کتاب‌های راهنمای آشپزی گفته می‌شود که در هر یکی دو صفحه آن دستور پخت یک نوع غذا نوشته شده است. در این طور کتاب‌ها معمولاً خیلی کم از مباحث تئوریک و آکادمیک سخن به میان می‌آید. علاوه بر این پیوستگی مطالب در این طور کتاب‌ها خیلی کم است. مثلاً شما می‌تواند بدون خواندن ۱۰۰ صفحه اول کتاب مستقیماً به سراغ دستور غذای توضیح داده شده در صفحه ۱۰۱ رفته و آن را اجرا کنید.
این کتاب ۳۲۸ صفحه‌ای هم دقیقاً همین روش را در مورد NHibernate دنبال می‌کند. یعنی در هر یک از ۷۰ دستورالعمل آن یکی از امکانات، تنظیمات یا شرایط NHibernate به طور کاملاً عملی توضیح داده شده است. مزیت این کتاب در این است که شما می‌توانید مستقیماً به آن بخشی که نیاز دارید مراجعه کرده و مجبور نباشید مقدمات آن را بلد باشید. درست مثل این که به یک Community مرتبط مراجعه کرده و یا از یک همکار واردتر از خودتان بپرسید. جالب است بدانید نویسندگان این کتاب از فعالان پروژه NHibernate و Communityهای مربوطه هستند.



NHibernate In Action


این کتاب بر اساس کتاب مشابهی برای Hibernate (جاوا) نوشته شده و در دنیای Hibernate/NHibernate مرجع استاندارد یادگیری Hibernate/NHibernate می‌باشد. کتاب پشتوانه تئوریک خیلی خوبی دارد و سعی کرده همه مباحث را از مقدماتی تا کامل پوشش دهد. این کتاب شبیه کتاب‌های درسی است یعنی ترتیب مطالب آن باید تا اندازه‌ای حفظ شود. چون بیشتر مطالب وابسته هستند به مطالبی که در فصول قبل توضیح داده شده‌اند. در نتیجه این کتاب برای کسانی مناسب است که وقت مناسبی داشته و می‌خواهند NHibernate را از سیر تا پیاز یاد بگیرند. به عبارت دیگر اگر شما در به کارگیری NHibernate کمی عجله داشته و یا صرفاً با مباحث خاصی از آن کار دارید بهتر به سراغ کتاب NHibernate 3.0 Cookbook بروید.
این کتاب کاملاً بر خود NHibernate متمرکز است و خبری از امکانات جانبی NHibernate در آن نیست. حتی از LINQ-to-NHibernate هم چیزی در این کتاب گفته نشده. نکته آخر در مورد این کتاب این که ویرایش جاری آن در حال حاضر یعنی بهمن ۱۳۸۹ بر اساس NHibernate 2.1 است. هر چند که مفاهیم توضیح داده شده در این کتاب در NHibernate 3.0 هم قابل استفاده است، اما اگر این موضوع اذیت‌تان می‌کند می‌توانید کمی صبر کنید. زیر احتمالاً به زودی ویرایش جدیدی از این کتاب بر اساس NHibernate 3.0 منتشر خواهد شد.



NHibernate Reference Documentation & API Version: 3.0.0


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



NHibernate 2 Beginner's Guide


یک کتاب مقدماتی در مورد کار با NHibernate که ظاهراً نمونه کدهای آن VB.NET می‌باشد. این کتاب از سطح بسیار پایینی شروع کرده و می‌تواند برای برنامه‌نویسان بسیار تازه کار واقعاً مفید و آموزنده باشد. البته اگر آشنایی مختصری با NHibernate یا حتی دیگر ORMها دارید توصیه می‌شود از این کتاب استفاده نکنید چون چیز زیادی در آن پیدا نخواهید کرد.








NHibernate with ASP.NET ProblemDesignSolution (Wrox Blox)‎



این کتاب الکترونیکی حدوداً ۱۲۰ صفحه‌ای بسیار ساده نوشته شده و مقدمات استفاده از NHibernate را در یک برنامه ASP.NET بیان می‌کند. در این کتاب فقط چند بحث اولیه‌ی NHibernate استفاده شده است. این کتاب مناسب برنامه‌نویسان ASP.NETی است که می‌خواهند برای اولین بار از NHibernate در برنامه‌شان استفاده کرده ولی نمی‌خواهد درگیر جزییات آن شوند.







نکته:
آخرین نسخه NHibernate در حال حاضر یعنی بهمن ۱۳۸۹ نسخه ۳ می‌باشد. هر چند که بعضی بخش‌های NHibernate از نسخه 2.1 به 3.0 تغییر چندانی نداشته‌اند اما حواستان به نسخه ذکر شده در هر کدام از کتاب‌ها باشد.




2011/02/16

‫معرفی کتاب Pro C# 2008 and the .NET 3.5 Platform






خواندن این کتاب را مدت‌ها پیش شروع کرده بودم اما تا حالا فرصتی نشده بود که نظرم را راجع به آن بگویم. این کتاب حجیم ۱۴۰۰ صفحه‌ای همه چیز را راجع به C# 2008 به آدم یاد می‌دهد و می‌تواند به عنوان یک مرجع دائمی مورد استفاده قرار گیرد. مطالب این کتاب آنقدر جامع و کامل هستند که حتی در فصول مقدماتی و ساده آن هم می‌تواند چیزی را برای یادگیری پیدا کرد. این کتاب شامل ۳۳ فصل و ۲ ضمیمه می‌باشد.

فصل اول و دوم مقدماتی راجع به دات‌نت و C#‎ می‌گویند که دانستن آنها مفید خواهد بود. خصوصاً فصل اول که ابزار پراستفاده ildasm.exe را معرفی می‌کند.

فصل ۳ و ۴ ساختارهای اصلی C#‎ را توضیح می‌دهد که فکر می‌کنم هر کسی که کمی C#‎ بلد باشد اینها را هم بلد باشد.

فصل ۵ و ۶ راجع به ساختار شی گرا در زبان C#‎ می‌باشد. خواندن این فصل خصوصاً فصل ۶ به کسانی که می‌خواهند C#‎ را به خوبی بفهمند توصیه می‌گردد.

فصل ۷ راجع به Exception Hadling است. خیلی برنامه‌ها بدون یک Exception Handling خوب هم کار می‌کنند. اما یک Exception Handling خوب تاثیر زیادی در کیفیت برنامه دارد و باعث می‌شود خطایابی و نگهداری آن خیلی راحت‌تر باشد.

فصل ۸ راجع به چرخه زندگی Objectها در C#‎ است. دانستن مطالب این فصل برای مواقعی که بعضی چیزها را در C#‎ نمی‌فهمید خیلی مفید است. مع الوصف بنده به شخصه دانستن این اطلاعات را ضروری می‌دانم.

فصل ۹ و ۱۰ راجع به Interfaceها و Collectionها و Generic می‌باشد. ناگفته پیداست که دانستن این‌ها هم برای یک برنامه‌نویس حرفه‌ای خصوصاً آنها که به طراحی هم علاقه دارند خیلی لازم است.

فصول ۱۱ الی ۱۳ راجع به امکاناتی از C#‎ صحبت می‌کند که هم جز مباحث پیشرفته و به در بخور آن محسوب می‌شوند و هم مقدمه‌ای بر LINQ هستند. یعنی استفاده موثر از LINQ بدون آنها امکان پذیر نیست. برخی مطالب این سه فصل عبارتند از Delegate، Event، Lambda، Indexer، Automatic Properties و Extension Methodها.

فصل ۱۴ اختصاص دارد به مقدمه‌ای از LINQ. اگر این مقدار از LINQ کارتان را راه نینداخت که قریب به یقین همین طور است باید از منابع دیگری برای یادگیری تکمیلی LINQ استفاده کنید. بنده خودم به شخصه از کتاب LINQ in Action استفاده کردم.



فصول ۱۵ الی ۱۹ کلاً راجع به اسمبلی‌ها یا همان dllها و مباحث مرتبط با آنهاست. راجع به ساختار داخلی آنها، کار با آنها از طریق Reflection، مسائل مرتبط با AppDomainها، برنامه‌های چند ریسمانی (Multi Thread) و CIL و Dynamic Assemblies. به نظر شخصی من مطالب این چند فصل آنقدر خاص هستند که ممکن است خیلی‌ها هیچ وقت به آن نیاز پیدا نکنند. توصیه می‌کنم بعد از آن که فهمیدید هر کدام از این فصول راجع به چه موضوعی صحبت می‌کنند آنها را رها کرده و هر وقت که واقعاً به آنها نیاز داشتید به سراغشان بروید. بنده به شخصه فقط مبحث Reflection را مطالعه کردم و فکر هم می‌کنم حالا حالاها به غیر از مبحث چند ریسمانی به بقیه مطالب آن بی‌نیاز باشم.

فصول ۲۰ الی ۲۶ راجع به Class Library دات‌نت می‌باشند. بیشتر افراد با بعضی مطالب این فصول از قبل آشنا هستند و خیلی‌ها هم ممکن است هیچ نیاز پیدا نکنند و یا نخواهند که از بعضی از آنها استفاده کنند. مطالب این فصول به نظر من باید به صورت Reference مطالعه شوند. یعنی تا زمانی که واقعاً به آنها نیاز نشده نباید سراغشان رفت. مطالب این فصول عبارتند از IO، Object Serialization، ADO.NET، LINQ API، WCF و WF.

فصول ۲۷ الی ۳۳ کمی از خود C#‎ فاصله گرفته و به برنامه‌نویسی UI در دات‌نت می‌پردازند. این فصول مطالبی را راجع به Windows Forms، WPF و ASP.NET بیان می‌کنند. به نظر شخصی من جای این طور مطالب در یک کتاب تخصصی C#‎ نیست. یعنی اگر کسی بخواهد ASP.NET یاد بگیرد بهتر است به یک کتاب اختصاصی راجع به ASP.NET مراجعه کند نه یک کتاب C#‎. با توجه به این موضوع و با توجه به این که مطالب مطرح شده در این فصول خصوصاً در مورد ASP.NET کمی مقدماتی هستند، بنده هیچ کدام آنها را نخوانده و به کسی هم توصیه نمی‌کنم. خصوصاً این که خود من به دنبال درک بهتر C#‎ به سراغ این کتاب آمدم نه به دنبال یادگیری مقدماتی ASP.NET.

ضمیمه اول ممکن است به درد کسانی که مجبورند در دات‌نت از اشیای قدیمی COM استفاده کنند بخورد. ضمیمه دوم هم راجع به مونو است که فکر می‌کنم حالا دیگر حسابی out of date شده باشد.


پ. ن.: 
۱- ظاهراً این کتاب به فارسی هم ترجمه شده. نگاهی به اینجا بیندازید.

۲- بلد بودن بعضی مباحث که خودم آنها را غیر ضروری فرض کرده بودم برای قبولی در امتحان ۵۳۶ اجباری می‌باشد.

۳- اگر قرار باشد بار دیگر هم کتابی راجع به C#‎ بخوانم احتمالاً این دفعه نگاهی به کتاب C# in Depth بیندازم. آن هم به خاطر ارادت خاصی که نسبت به Jon Skeet پیدا کرده‌ام.




2011/02/14

‫نگهداری داده‌های حجیم در MS SQL

در خانواده MS SQL نسخه‌های ۲۰۰۰، ۲۰۰۵ و ۲۰۰۸ تعدادی فیلد خاص برای کار با داده‌های حجیمی مثل عکس یا متون خیلی طولانی وجود دارد. هر کدام از اینها شرایط خاص خودشان را دارند که در ادامه بررسی خواهند شد.


char و varchar: حداکثر ۸۰۰۰ کاراکتر

varchar(max)‎: حداکثر ۲ میلیارد کاراکتر - این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

nchar و nvarchar: حداکثر ۴۰۰۰ کاراکتر (به طور کلی ظرفیت انواع یونیکد نصف انواع غیر یونیکد است)

nvarchar(max)‎: حداکثر ۱ میلیارد کاراکتر - این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

binary و varbinary: برای داده‌های غیر متنی و حداکثر ۸۰۰۰ بایت

varbinray(max)‎: برای داده غیر متنی و حداکثر ۲ گیگا بایت.

text: حداکثر ۲ میلیارد کاراکتر - این نوع داده قرار است به زودی حذف شود.

ntext: حداکثر ۱ میلیارد کاراکتر - این نوع داده قرار است به زودی حذف شود.

image: حداکثر ۲ گیگا بایت - این نوع داده قرار است به زودی حذف شود.

FileStream: نوعی ارتباط بین MS SQL و سیستم فایل ویندوز یعنی NTFS - این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

Xml: نگهداری اطلاعات به صورت Xml - این نوع داده در SQL 2000 پشتیبانی نمی‌شود.



توصیه خود مایکروسافت برای نگهداری داده‌های حجیم استفاده از سه نوع varchar(max)‎ و nvarchar(max)‎ و varbinary(max)‎ است. زیرا انواع text و ntext و image دیگر پشیبانی نشده و در نسخ آتی MS SQL برداشته خواهند شد. جهت کسب اطلاعات بیشتر به اینجا و اینجا مراجعه کنید.




2011/02/12

‫یک مثال عملی از Decoupling


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

امروز موقعیت خوبی در یک برنامه ASP.NET پیش آمد که هم مزایای واقعی Decoupling (افتراق) را درک کنم و هم یک مثال ساده از آن اجرا کنم. یکی از امکاناتی که برای قسمت بندی بخش‌های مختلف برنامه و امکان Code Reuse در ASP.NET فراهم شده است امکان User Control است. برنامه‌نویس می‌تواند یک User Control نوشته و آن را در چند جای مختلف استفاده کند. یا حتی صرفاً از آن برای کاهش پیچیدگی استفاده کند. یکی از کارهای رایجی که خودم به شخصه در User Controlها انجام می‌دهم ارتباط با کنترل والد یا همان کنترلی است که کنترل مورد نظر من در آن قرار دارد. در موردی که من امروز با آن برخورد کردم User Control به Parent خود دسترسی پیدا کرده و از طریق FindControl یکی از دکمه‌های آن را Disable/Enable می‌کرد. این موضوع به غیر نازیبایی و ناخوانایی که ایجاد کرده بود باعث شده بود وقتی از این کنترل در جای دیگری استفاده می‌کردم خطا به وجود بیاید چون آن دکمه دیگر در اینجا وجود نداشت.

اعمال Decoupling (افتراق) در اینجا خیلی ساده بود. در User Control مورد بحث یک Event تعریف کردم و Disable/Enable کردن دکمه مورد نظر را به خود ماژول استفاده کننده سپردم. این ماژول فقط در Event تعریف شده مشترک می‌شد و Disable/Enable کردن دکمه را خودش انجام می‌داد. ماژول‌های دیگری هم که از User Control من استفاده می‌کردند هم صرفاً از همین Event استفاده می‌کنند. در واقع دیگر لازم نیست که User Control مورد نظر اطلاعی از وضعیت ماژول‌های والد خود داشته باشد و این یعنی Decoupling (افتراق).




2011/02/10

برون‌سپاری خدمات تخصصی - ۶


طی پنج قسمت قبلی این مطلب سعی کردم مشکلاتی که سر راه برون‌سپاری خدمات تخصصی بین شرکت‌های داخلی و برنامه‌نویس‌ها به ذهنم می‌رسد را دسته‌بندی کنم. به نظر من به طور کلی ۴ نوع مشکل برای برون‌سپاری وجود دارد:

۱- عدم اطمینان کارفرماها (قسمت ۲)

۲- نبود ادبیات مشترک بین کارفرما، برنامه‌نویس‌ها و کارمندان شرکت مقصد (قسمت ۳)

۳- استاندارد نبودن کارها و بی‌نظمی در شرکت‌ها (قسمت ۴)

۴- عدم اطمینان برنامه‌نویس‌ها (قسمت ۵)

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



لینک نوشته‌های این سری:

برون‌سپاری خدمات تخصصی - بخش اول

برون‌سپاری خدمات تخصصی - ۲

برون‌سپاری خدمات تخصصی - ۳

برون‌سپاری خدمات تخصصی - ۴
برون‌سپاری خدمات تخصصی - ۵




2011/02/08

برون‌سپاری خدمات تخصصی - ۵

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

۱- آیا از لحاظ تخصصی در سطح مورد نظر هستند؟ بعضی شرکت‌ها آنقدر سطح پایین کار می‌کنند که نمی‌شود با ایشان کار کرد و نه می‌شود سطح کاریشان را بالا آورد.

۲- آیا شرکت مورد نظر صداقت کافی دارد؟ بعضی دوستان محترم در به در به دنبال یک نفر متخصص در امری خاص می‌گردند ولی بعد از یکی دو تا ایمیل و تلفن و یک جلسه معارفه بی‌خیال موضوع می‌شوند. نه به این خاطر که شما شخص مورد نظر ایشان نیستید بلکه به این خاطر که به اطلاعات مورد نظرشان دسترسی پیدا کرده‌اند و دیگر نیازی به شما ندارند!

۳- آیا کار شرکت مورد نظر آنقدر زیاد هست که ارزش برنامه‌ریزی و وقت گذاشتن داشته باشد؟ کار بعضی شرکت‌ها با چند ساعت مشاوره و برنامه‌نویسی تمام می‌شود و آنقدر نیست که بتوان روی آن حساب کتاب کرد.

۴- آیا شرکت مورد نظر مشکل پرداخت ندارد؟ شرکت‌های زیادی وجود دارند که همیشه پرداخت‌های آخرشان دچار مشکل شده و این تاخیر بعضاً تا یک سال هم طول می‌کشد.

۵- کمتر برنامه‌نویسی هست که شغلش صرفاً مشاوره یا برنامه‌نویسی‌های پراکنده‌ی از این شرکت به آن شرکت باشد. معمولاً افراد یک شغل تمام وقت ولی با کمی وقت آزاد در یک جا داشته و باقی‌مانده وقتشان را به این طور کارها اختصاص می‌دهند. به همین خاطر تغییر برنامه‌های متعدد و حفظ ارتباط با این شرکت و آن شرکت برای ایشان کار سخت و هزینه‌بری است و باعث می‌شود کمتر راغب باشند به انجام کارهای برون‌سپاری و مشاوره‌ای.


توجه:
این نوشته جز سری نوشته‌های «برون سپاری خدمات تخصصی» می‌باشد.




2011/02/06

‫افزودن دکمه «ارسال به iDevCenter» به بلاگر

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

با کمی جستجو به مطلبی با عنوان «افزونه دکمه iDevCenter برای BlogEngine.Net» رسیدم. کد این مطلب برای BE نوشته شده بود ولی ایده‌ی خوبی به من داد تا مشابه آن را برای بلاگر ایجاد کنم. به اسکریپت زیر دقت فرمایید:
برای استفاده از این اسکریپت باید Template بلاگ خود را در حالی که گزینه Expand Widget Templates تیک خورده است باز کنید و به دنبال عبارت



بگردید. این اسکریپت باید بعد از این عبارت قرار گیرد.




2011/02/04

انواع طراحی در نرم‌افزار

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

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


طراحی کارکرد (نوع اول)

طراحی کارکرد برنامه از دید کاربرد. این نوع طراحی مواردی مثل زیر را مشخص می‌کند:
۱- روال انجام یک کار معین چطور است و شامل چرا مراحلی می‌شود.
۲- روش ارتباط کاربر با برنامه از چه طریق بیشتر باشد، صفحه کلید، ماوس یا چیز دیگر؟
۳- اگر برنامه در جایی دچار خطا شد این خطا را چطور به کاربر اعلام کند و بعد از اعلام خطا چه چیزی باید اتفاق بیفتد؟
۴- برنامه چطور باید جلوی اشتباهات احتمالی کاربر را بگیرد.
۵- کار کردن با برنامه چقدر برای کاربر راحت است؟
۶- رنگ، اندازه قلم و کوچک بزرگی دکمه‌ها و فرم‌ها چطور باید باشد؟
۷- اگر کاربر اطلاعاتی را در صفحه‌ای وارد کرد و سهواً خارج شد، آیا برنامه تمهیدات لازم را برای جلوگیری از دست رفتن اطلاعات کابر دارد؟
۸- اگر یک چیز کوچک از نیازمندی‌های برنامه دچار مشکل شد، مثلاً اینترنت قطع شد یا کاغذ پرینتر تمام شد، آیا کل برنامه از کار می‌افتد؟
۹- آیا امکان تست برنامه یا قسمتی از آن بدون تاثیر بد روی اطلاعات عملیاتی وجود دارد؟
۱۰- امکانات backup/restore چقدر آسان و مطمئن است؟
۱۱- آیا سابقه‌ای از خطاهای سیستم وجود دارد؟
۱۲- آیا ساختار برنامه با منطق و صنعت مشتری (حسابداری، انبارداری و…) منطبق است؟
۱۳- آیا می‌توان در سیستم مشخص کرد که هر کسی چه کاری کرده؟
۱۴- آیا واقعاً برنامه توانسته سرعت عمل کاربرانش را بالا ببرد؟
۱۵- آیا برنامه می‌تواند علت خطاهای به وجود آمده را خوب بفهمد و علت واقعی خطا را نمایش دهد؟
۱۶- آیا برنامه طوری نوشته شده که نیاز به حضور مستمر افراد تیم پشتیبانی نداشته باشد؟
۱۷- چقدر طول می‌کشد تا کاربر بتواند به اطلاعات مورد نظرش دست پیدا کند؟ به عبارت دیگر جستجوی اطلاعات چقدر آسان یا سخت است.
۱۸- آیا برنامه یادش می‌ماند که کاربر در مراحل قبلی در حال انجام چه کاری بوده؟ این موضوع به کاربر کمک می‌کند تا مجبور نشود یک سری عملیات را مجدداً تکرار کند. مثلاً وقتی روی یکی از اقلام Grid کلیک شد و وارد صفحات اطلاعات جزیی شد، بعد از اتمام کار در صفحه جزیی بتواند به همان صفحه و آیتم از Grid قبلی بازگردد. یا اگر مثلاً کاربر در سه روز پیش در حال وارد کردن اطلاعات حضور و غیاب بود، بعد از سه روز باز هم بتواند از همانجا کارش را ادامه دهد.
۱۹- آیا امکان کار به صورت تعداد بالا یا فله‌ای (Bulk) موجود است؟ مثلاً اگر قرار شد ۱۲۰ تا نامه در پوشه «اداره مالیات» بایگانی شود باید این کار را تک تک انجام داد یا امکان انجام دفعتی آن موجود است؟
۲۰- آیا چیزی به نام امکان «ذخیره موقت» موجود است؟ مثلاً اگر انجام کاری ۳۰ دقیقه طول بکشد، آیا کاربر می‌تواند وسط کار بلند شده و با ذخیره موقت کار خیالش راحت باشد که اگر حتی کامپیوترش خاموش هم که شد باز کار نصفه نیمه‌اش از دست نخواهد رفت؟
۲۱- آیا برنامه امکان یادگیری از کاربر را دارد؟ مثلاً برنامه می‌تواند از کاربر یاد بگیرد روش اسکن و ذخیره مدارک چطور است و خودش این کار را با کمک چیزی مثل macro به طور خودکار و با کمترین دخالت کاربر انجام دهد؟
۲۲- آیا با یک نگاه کلی به برنامه می‌توان وضعیت فعلی برنامه مثل ارتباط با شبکه، عدم hang یا کاربر login کرده را فهمید؟
۲۳- …

بیشتر موارد این صفحه را می‌توان با اصطلاحاتی مثل کاربر پسندی (UserFriendly)، کاربرد پذیری و خطا ناپذیر سازی
بیان کرد. اما با این وجود منظور من از طراحی نوع اول همه‌ی این موارد با هم است. به نظر من انجام این طراحی توسط هر شخصی که نسبت به نرم‌افزار، کامپیوتر و نیازهای کاربران آشنایی و تجربه کافی دارد قابل انجام است و هیچ لزومی به برنامه‌نویس بودنش نیست. البته این به معنی کم اهمیت بودن موضوع نیست. بلکه برعکس خیلی مهم است. کافی است نگاهی به طراحی(نوع اول) ویندوز، Office، جیمیل، Visual Studio یا ویکی‌پدیا بیندازید تا بفهمید رعایت همین موارد ساده چقدر در موفقیت آنها تاثیر داشته.


طراحی فنی (نوع دوم)

این نوع طراحی را خیلی راحت‌تر می‌توان درک کرد. منظور از این طراحی، طراحی مورد نیاز برای پیاده‌سازی نرم‌افزار از جمله موارد زیر است:
۱- معماری لایه‌های نرم‌افزار چطور باشد؟
۲- از کدام رابط برای ارتباط با دیتابیس استفاده شود؟ از ADO.NET یا NHibernate؟
۳- تعریف عملیات در یک کلاس واحد باشد یا در طول چند کلاس پراکنده؟
۴- آیا لازم است از interfaceها استفاده شود؟
۵- تبادل اطلاعات بین صفحات از طریق query string انجام شود یا session؟
۶- دریافت اطلاعات از متودها به صورت ref و out باشد یا از کلاس‌های کمکی موسوم به DTO استفاده شود؟
۷- خوانایی مهم‌تر است یا performance؟
۸- منطق تجاری برنامه در اسکریپت‌ها و stored procedureهای دیتابیسی نگهداری شود یا در کلاس‌های سرویسی دات‌نت؟
۹- استفاده از تریگرها در دیتابیس مجاز است یا خیر؟
۱۰- از کدام فناوری برای Ajax استفاده شود؟
۱۱- …

همین طور که مشخص است این نوع طراحی فقط مخصوص برنامه‌نویس‌هاست. شاید بتوان گفت بخش زیادی از موضوع این نوع طراحی مربوط است به مبحث software artichecture. مشخص است که اگر بخواهیم در طراحی کارکرد (نوع اول) دستمان باز باشد باید حسابی به طراحی فنی (نوع دوم) مسلط بوده و آن را به بهترین وجه ممکن انجام داده باشیم.


مقایسه با صنعت ساختمان

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




2011/02/02

Private SVN hosting

سایت‌های رایگان خیلی زیادی برای نگهداری سورس تحت svn وجود دارد. از جمله CodePlex و SourceForge. اما متاسفانه این سایت‌ها فقط برای نگهداری سورس‌های کد باز (Open Source) قابل استفاده‌اند چون نمی‌توان سورس آنها را از دید عموم خارج کرد. بعضی سایت‌های دیگر مثل github هم هستند که امکان میزبانی سورس‌های غیر کد باز را ارائه می‌دهند اما نه به صورت مجانی. اگر می‌خواهید از این سرویس استفاده کنید باید پول پرداخت کنید. و اگر می‌خواهید از سرویس‌های رایگان این طور سایت‌ها استفاده کنید باز هم مجبور می‌شوید سورس خود را به صورت کد باز روی آنها قرار دهید.

اما این پایان راه نیست. اگر شما می‌خواهید سورس خود را به صورت غیر Open Source و به صورت مجانی در جایی نگهداری کنید می‌توانید از سایت‌های زیر استفاده کنید:

Assembla.com

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


http://unfuddle.com/about/tour/plans
به نظر خوب می‌آید

http://www.xp-dev.com
به نظر خوب می‌آید.

http://www.projectlocker.com
به نظر خوب می‌آید.

http://www.myversioncontrol.com
به نظر خوب می‌آید.

http://codesion.com
به نظر کند می‌رسد

http://www.sliksvn.com
خیلی قابل اطمینان است. ولی به نظر می‌رسد دارای تشریفات خیلی بیشتری برای ثبت نام است.




منبع:
http://www.svnhostingcomparison.com