۱۳۸۹/۰۹/۰۴

ويديوهاي آموزشي اسكرام


تعدادي ويديوي آموزشي رايگان مربوط به اسكرام را كه از يوتيوب جمع آوري شده‌اند، مي‌توانيد از يكي از لينك‌هاي زير دريافت كنيد (تمام لينك‌ها ختم به يك فايل هستند):

+ ، + ، + ، + ، + ، +

اين مجموعه شامل موارد زير است:



۱۳۸۹/۰۹/۰۲

راه‌هاي تامين Product backlog در تيم‌هاي مايكروسافت


شايد مهم‌ترين رخداد وبلاگ‌هاي مرتبط با برنامه نويسي ايراني در نيمه دوم سال 89، انتشار كتابچه اسكرام و XP ساده شده به زبان فارسي باشد. يكي از فصول اين كتابچه، به روش‌هاي تهيه Product backlog اختصاص دارد كه جزو قسمت‌هاي اوليه پروسه اسكرام است و مي‌شود به آن يك to-do list الويت بندي شده هم گفت. تيم‌هاي مايكروسافت هم به نظر كمابيش بر همين اساس مديريت مي‌شوند. در ادامه ليستي از سايت‌هايي را مشاهده خواهيد كرد كه اين تيم‌هاي گوناگون درون مايكروسافت از آن‌ها جهت تامين product backlog خود استفاده مي‌كنند؛ كاربران (كه در اينجا همان برنامه نويس‌ها هستند) با مراجعه به اين سايت‌ها نيازهاي خود را عنوان كرده و همچنين با وجود امكانات راي دهي، امكان تهيه ليست‌هايي اولويت بندي شده هم وجود دارد:




و ...


تيم‌هاي خارج از مايكروسافت هم از اين ايده استفاده مي‌كنند؛ مانند:

۱۳۸۹/۰۸/۳۰

تغييرات دسترسي به كدها در دات نت 4


دو پروژه‌ي سورس باز XML RPC و Log4Net براي اجرا شدن در برنامه‌هاي دات نت 4 نياز به اندكي تغيير در هر دو برنامه‌ي فراخوان و اسمبلي‌هاي آن‌ها دارند كه در ادامه توضيحات مربوطه ارائه خواهند شد.

اگر يك پروژه‌ي جديد دات نت 4 را آغاز كنيد و سپس ارجاعي را به يكي از اسمبلي‌هاي ذكر شده اضافه نمائيد، اولين خطايي را كه حين استفاده مشاهده خواهيد نمود، مورد زير است:
Could not resolve assembly "System.Web".
The assembly is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client".
Please remove references to assemblies not in the targeted framework or consider retargeting your project.
علت هم اينجا است كه در تنظيمات پروژه‌ها‌ي جديد مبتني بر دات نت 4، پيش فرض Target framework انتخابي توسط VS.NET 2010 از نوع Client profile است؛ كه صرفا جهت كاهش حجم دات نت فريم ورك مورد نياز اين نوع برنامه‌ها طراحي شده است. در اين پروفايل ساده شده، اسمبلي System.Web وجود ندارد. بنابراين جهت استفاده از كتابخانه‌هاي XML RPC و يا Log4Net نياز است تا در خواص پروژه، Target framework را بر روي دات نت فريم ورك 4 كامل قرار داد تا خطاي فوق برطرف شود.

خطاي دومي كه حين كار با كتابخانه‌هاي XML RPC و يا Log4Net در يك برنامه‌ي دات نت 4 حتما با آن مواجه خواهيد شد در ادامه ذكر گرديده است:
Inheritance security rules violated while overriding member:
GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext),
Security accessibility of the overriding method must match the security accessibility of the method being overriden.
متد ISerializable.GetObjectData با ويژگي SecurityCritical در دات نت فريم ورك مزين شده است. با تغييرات امنيتي صورت گرفته در دات نت 4، متدي كه اين متد را تحريف مي‌كند نيز بايد با همان سطح دسترسي متد virtual اصلي معرفي گردد و گرنه برنامه اجرا نخواهد شد. البته اين مشكل ما نيست؛ مشكل سازندگان كتابخانه‌هاي ذكر شده است! ولي خوب تا اين لحظه براي مثال كتابخانه XML RPC براي دات نت 4 به روز نشده است ولي سورس كامل آن در دسترس است.
براي رفع اين مشكل ابتدا سورس اين كتابخانه‌ها را دريافت كرده و سپس در فايل AssemblyInfo.cs آن‌ها يك سطر زير را حذف نموده و پروژه را مجددا كامپايل كنيد:
[assembly: AllowPartiallyTrustedCallers]
علت وجود اين ويژگي‌ در كتابخانه‌هاي ذكر شده اين است كه بتوان از آن‌ها در محيط‌هاي اصطلاحا partially trusted (براي مثال هر برنامه‌اي كه در internet zone يا intranet zone اجرا مي‌شود) استفاده كرد. در دات نت 4 با تغييرات انجام شده معناي AllowPartiallyTrustedCallers به security-transparency تغيير كرده است. بنابراين با قيد آن يا بايد هر جايي كه متد GetObjectData ذكر شده در اين كتابخانه‌ها تحريف مي‌شود، ويژگي SecurityCritical را صريحا اعمال كرد يا اينكه مي‌توان AllowPartiallyTrustedCallers را حذف كرده و وظيفه‌ي انجام آن‌را به CLR محول نمود.


براي مطالعه بيشتر:
Using Libraries from Partially Trusted Code
Security Changes in the .NET Framework 4
TypeLoadException based on Security-Transparent Code, Level 2
Making log4net run on .NET 4.0

۱۳۸۹/۰۸/۲۷

مديريت كار تيمي با SQL Server


پس از انتشار جزوه‌ي SVN در حدود دو سال قبل، ايميل در اين مورد زياد داشتم. يكي از سؤالات هم اين بود كه: "چگونه از SVN جهت مديريت نگارش‌هاي مختلف يك بانك اطلاعاتي اس كيوال سرور در يك تيم استفاده كنيم؟ (منظور مديريت schema است)" و من هم پاسخ مناسبي براي اين مورد نداشتم چون كلاينت‌هاي SVN حداقل با Management studio يكپارچه نمي‌شود (بر خلاف ابزارهاي موجود براي VS.NET مانند VisualSVN ، AnkhSVN و غيره). صد البته مي‌شود از آن همانند اعمال نگارش به يك فايل Text معمولي مانند فايل‌هاي SQL استفاده كرد، اما خوب ...

و خبر خوب اينكه شركت معظم RedGate چند روز قبل يك كتاب رايگان را در اين مورد منتشر كرده است:



سرفصل‌هاي اين كتاب
Chapter 1: Writing Readable SQL
Chapter 2: Documenting your Database
Chapter 3: Change Management and Source Control
Chapter 4: Managing Deployments
Chapter 5: Testing Databases
Chapter 6: Reusing T-SQL Code
Chapter 7: Maintaining a Code Library
Chapter 8: Exploring your Database Schema
Chapter 9: Searching DDL and Build Scripts
Chapter 10: Automating CRUD
Chapter 11: SQL Refactoring

دريافت

۱۳۸۹/۰۸/۲۲

نحوه‌ي صحيح فراخواني SQL Aggregate Functions حين استفاده از LINQ - قسمت دوم


در قسمت قبل در مورد حالتي كه كوئري انجام شده نتيجه‌اي را بر نگردانده است، بحث شد. در اين قسمت يكي از شايع‌ترين مشكلات حين كار با تابع Sum بررسي خواهد شد.

ابتدا جدول ساده Transactions را با دو فيلد Id و Amount مطابق تصوير زير در نظر بگيريد:


تعدادي ركورد در اين جدول ثبت شده‌اند. اكنون مي‌خواهيم جمع آن‌ها را محاسبه كنيم:


همانطور كه ملاحظه مي‌نمائيد اين عمليات ميسر نيست، زيرا حاصل نهايي فراتر از بازه‌ي تعريف شده‌ي Int32 است.
براي رفع اين مشكل بايد Amount را تبديل به BigInt (براي مثال مرتبط با نگارش‌هاي مختلف SQL Server) كرد. مطابق توضيحات قسمت قبل، اين عمليات casting بايد به lambda expression تعريف شده اعمال گردد، زيرا خروجي Sum بر مبناي آن تعيين مي‌گردد.



در اين حالت خروجي SQL آن نيز به صورت زير در خواهد آمد:



هر چند اين مباحث ساده به نظر مي‌رسند ولي در صورت عدم رعايت سبب سرخ و سفيد شدن در هنگام مقتضي خواهند گرديد.

۱۳۸۹/۰۸/۱۹

مديريت ساده‌تر امور Async (غير همزمان) در نسخه‌ي بعدي زبان‌هاي دات نتي


چندي قبل مطلبي را در اين سايت در مورد معرفي الگويي كه توسط آن مي‌توان اعمال غير همزمان را به صورت پي در پي انجام داد، مطالعه كرديد:

و بحث اصلي مطالب فوق هم اين است:
"در برنامه نويسي متداول هميشه عادت داريم كه اعمال به صورت A –> B –> C انجام شوند. اما در Async programming ممكن است ابتدا C انجام شود، سپس A و بعد B يا هر حالت ديگري صرفنظر از تقدم و تاخر آن‌ها در حين معرفي متدهاي مرتبط در يك قطعه كد. همچنين ميزان خوانايي اين نوع كدنويسي نيز مطلوب نيست...."

خبر خوش آن است كه پشتيباني از اين نوع مدل پي در پي برنامه نويسي در نگارش‌هاي بعدي سي شارپ و VB.NET اضافه شده است.



ليستي از مقالات منتشر شده در اين مورد را در ادامه ملاحظه خواهيد كرد:

علاوه بر آن يك سري ويديوي مرتبط با اين بحث نيز منتشر شده است:

۱۳۸۹/۰۸/۱۸

آدرس‌ها و ابزارهايي جهت سهولت دريافت ويديوهاي PDC 2010


اخيرا دو برنامه جهت دريافت ساده‌تر فايل‌هاي PDC 2010 با سيلورلايت تهيه شده‌اند كه بر اساس قابليت اجراي خارج از مرورگر آن (OOB=Out Of Browser) طراحي و پياده سازي شده‌اند:
برنامه‌ي آقاي Mike Taulty سورس باز بوده و بر اساس الگوي MVVM پياده سازي شده است.


علاوه بر آن يك ليست ديگر نيز در اين زمينه وجود دارد:

۱۳۸۹/۰۸/۱۳

نحوه‌ي صحيح فراخواني SQL Aggregate Functions حين استفاده از LINQ


SQL Aggregate Functions كه مد نظر شما هستند مانند Min ، Max ، Sum و امثال آن. بحث LINQ هم زمانيكه از الگوي Repository استفاده شود مستقل از نوع ORM مورد نظر خواهد شد؛ بنابراين در اينجا مقصود از LINQ مي‌تواند LINQ to SQL ، LINQ to Entities ، LINQ to NHibernate و كلا هر نوع ORM ديگري با پشتيباني از LINQ باشد.
صورت مساله هم اين است: آيا نوشتن عبارت LINQ ايي به شكل زير صحيح است؟
decimal amount = respository.Transactions
.Where(t=>t.TransactionDate>new DateTime(2010,10,13))
.Sum(t=>t.Amount);
پاسخ: خير!
توضيحات:
عبارت LINQ فوق در نهايت به شكل زير ترجمه خواهد شد:
-- Region Parameters
-- @p0: DateTime [2010/10/13 12:00:00 ق.ظ]
-- EndRegion
SELECT SUM([t0].[Amount]) AS [value]
FROM [Transactions] AS [t0]
WHERE [t0].[TransactionDate] > @p0
و اتفاقا در اين سيستم پس از تاريخ 2010/10/13 هيچ تراكنشي ثبت نشده است؛ بنابراين خروجي اين كوئري null خواهد بود و نه صفر. همينجا است كه يكي از استثناهاي زير صادر شده و ادامه‌ي برنامه با مشكل مواجه خواهد شد:
- System.InvalidOperationException: The cast to value type 'decimal' failed because the materialized value is null.
- InvalidOperationException: The null value cannot be assigned to a member with type decimal which is a non-nullable value type.

مشكل هم از اينجا ناشي مي‌شود كه متغييري از نوع deciaml يا int و امثال آن، مقدار دريافتي نال را نمي‌پذيرند. براي رفع اين مشكل بايد عبارت LINQ فوق به صورت زير بازنويسي شود (و اهميتي هم ندارد كه Sum است يا Max يا Avg و غيره؛ در مورد بكارگيري تمام SQL Aggregate Functions در يك عبارت LINQ ، اين مورد بايد لحاظ گردد):
decimal amount = respository.Transactions
.Where(t=>t.TransactionDate>new DateTime(2010,10,13))
.Sum(t=>(decimal?)t.Amount)??0;

دقيقا به همين علت است كه در دات نت، nullable types تعريف شده‌اند. امكان ذخيره سازي null‌ در يك متغير براي مثال از نوع decimal وجود ندارد اما نوع decimal? (و يا Nullable<decimal> به بياني ديگر) اين قابليت را دارد.
شايد بگوئيد كه در اينجا با تغيير تعريف متغير به decimal? amount مشكل حل مي‌شود، اما خير. تعريف extension method مربوط به sum به صورت زير است:

public static TResult Sum<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, TResult>> selector)

در اين تعريف به TResult دقت نمائيد؛ هم بيانگر نوع خروجي نهايي متد و هم مشخص سازنده‌ي نوع پارامتري است كه خروجي Lambda Expression را تشكيل مي‌دهد. به اين معنا كه سي شارپ، TResult را از lambda expression دريافت كرده و خروجي Sum را بر همان مبنا و نوع تشكيل مي‌دهد. بنابراين براي دريافت خروجي nullable بايد TResult ايي nullable را همانند مثال فوق ايجاد كنيم.

خلاصه بحث:
اگر در كدهاي LINQ خود كه با بانك اطلاعاتي سر و كار دارند از معادل‌هاي SQL Aggregate Functions استفاده كرده‌ايد، آن‌ها را يافته و نكته‌ي nullable TResult فوق را به آن‌ها اعمال كنيد؛ در غير اينصورت منتظر باشيد تا روزي برنامه شما به سادگي كرش كند.


۱۳۸۹/۰۸/۱۰

استفاده از اسمبلي‌هاي دات نت 2 در يك پروژه دات نت 4


تنظيمات برنامه BloggerToChm را به دات نت 4 تغيير دادم و بدون مشكل كامپايل شد. اما حين اجرا بلافاصله با خطاي زير برنامه اجرا نمي‌شد:

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.
مشكل هم از اسمبلي‌هاي مرتبط با SQLite است كه هنوز براي دات نت 4 كامپايل نشده‌اند. براي رفع اين مشكل بايد تغيير زير را (تنظيم گزينه useLegacyV2RuntimeActivationPolicy) به فايل app.config برنامه اضافه كرد:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
براي برنامه‌هاي ASP.NET نيز به همين صورت است. در آنجا اين تغييرات بايد به Web.Config اضافه شوند.