‫ایجاد پروژه در TFS به روش اسکرام

یکی از کارهایی که همیشه انجام می‌دهم ایجاد یک پروژه در TFS 2010 به روش اسکرام است. بد ندیدم که بعضی از مراحل آن را در اینجا بیاورم:

۱- کسب اطمینان از نصب SfTS در TFS. این ابزار امکانات اسکرام را در TFS و Visual Studio فراهم می‌کند.

۲- اجرای ویژوال استودیو در حالت Admin.

۳- انتخاب گزینه New Team Project…‎ از پنجره Team Explorer.

۴- نام گذاری پروژه و انتخاب Template با نام Scrum for Team System و ادامه همه مراحل.

۵- راست کلیک روی اسم پروژه در Team Explorer و انتخاب گزینه‌های Team Project Settings و Group Membership.

۶- دابل کلیک روی گروه دلخواه و اضافه کردن کاربران مورد نظر از طریق Windows User or Group.

۷- باز کردن آدرس وبی TFS که معمولاً به صورت http://servername:8080/tfs/web/‎ است.

از اینجا به بعد باید مراحل مخصوص اسکرام دنبال شود. یعنی اسپرینت‌ها، Backlog Itemها، Taskها و… تعریف شوند. هر اسپرینتی هم باید به صورت work item ثبت شود و هم به صورت ساختار داخلی Iteration.

۸- اضافه کردن iterationهای مورد نظر بر اساس تعداد اسپرینت‌ها. دقت شود که برای تیم‌های کوچک فقط Team Sprint مهم است.

۹- بعد از مشخص کردن همه Iterationها چیزی شبیه به عکس زیر دیده خواهد شد.

۱۰- تعریف Releaseها، Sprintها و Team Sprintها بر اساس درخت Iterartion. وارد شدن تاریخ‌ها نباید فراموش شود. از این سه تا work item فقط نوع Team Sprint برای ما اهمیت دارد.

۱۱- تعریف رابطه Implemented by و Implements بین Releaseها، Sprintها و Team Sprintها.

۱۲- تعریف Backlogها (PBI) و  Taskها (SBT) و روابط بین خودشان و Team Sprintها.

۱۳- استفاده از Queryهای موجود برای مشاهده Work Itemهای تعریف شده.

۱۴- تکمیل تدریجی اطلاعات Work Itemها.

۱۵- استفاده از Sprint Burndown Chart و دیگر گزارشات برای کسب اطلاعات بیشتر از وضعیت پروژه.

۱۶- از Portal پروژه هم می‌توان استفاده کرده و به خیلی از اطلاعات و امکانات پروژه دسترسی پیدا کرد.

‫DataBinding در WPF

به عنوان یک برنامه‌نویس ASP.NET عادت داشتم هر جا که اطلاعات تغییر می‌کند. متود DataBind()‎ را از کنترل‌هایی مثل GridView فراخوانی کنم. در WPF هم می‌خواستم همان کارها را بکنم اما به کمی مشکل برخوردم. در WPF باید کارهای زیر انجام شود:

۱- یکی از کنترل‌های گرید در WPF که امکانات Binding خوبی دارد کنترل DataGrid است. من هم از همین کنترل شروع می‌کنم.

۲- مقدار AutoGenerateColumns را مشابه ASP.NET برابر True قرار می‌دهم.

۳- اطلاعاتی که می‌خواهم با آنها کار کنم را به ItemSource (به جای DataSource) معرفی می‌کنم.

۴- متودی به اسم DataBind وجود ندارد. برای Refresh شدن اطلاعات باید دقت کنیم که مدل Data Binding در WPF چیزی به اسم Observer pattern است. در این الگو خود data به کنترل DataGrid می‌گویند که چه وقتی اطلاعات آنها تغییر کرده و باید اطلاعات Refresh شوند.

۵- برای پیاده‌سازی عملیات Refresh باید اطلاعاتی که قرار است به کنترل‌هایی داده‌ای Bind شوند، اینترفیس INotifyCollectionChanged را پیاده‌سازی کرده باشند. به این ترتیب این وظیفه خود منبع اطلاعاتی است که به استفاده کنندگانش اعلام کند که اطلاعات تغییر یافته.

۶- برای راحتی کار می‌توان از Collectionهای ویژه‌ای مثل BindingList استفاده کرد.

۷- نمی‌دانم این روش Data Binding در WPF خوب است یا بد. اما ظاهراً حق انتخاب دیگری وجود ندارد.

‫کمی درباره‌ی WCF

WCF یکی از امکانات نسبتاً جدید ‎.Net Framework است که در برنامه‌های توزیعی، سرویسی و معماری SOA کاربرد دارد. هدف مایکروسافت از ارائه WCF یکی کردن امکانات سرویسی قدیمی از جمله Web Serivceها، ‎.Net Remoting، Socket Programming و Pipelineها می‌باشد. در رابطه با WCF به چند نکته می‌توان توجه کرد:

۱- اگر کارتان با یک وب سرویس ساده راه می‌افتد سراغ WCF نروید. چون راه اندازی یک وب سرویس ساده خیلی خیلی ساده‌تر از راه انداختن یک سرویس WCF است.

۲- یک سرویس WCF را صرفاً از طریق فایل config آن می‌توان طوری تنظیم کرد که از هر یک از روش‌های دلخواه انتقال اطلاعات از جمله ارتباط وب سرویسی یا ارتباط از طریق TCP استفاده نماید. این تغییر از دید برنامه Host کاملاً مخفی است.

۳- یک سرویس WCF به طور هم زمان می‌تواند روی هر تعداد از روش‌های مثل TCP، وب سرویس یا Pipeline سرویس دهد.

۴- Hosting سرویس‌های WCF هم می‌تواند از طریق IIS باشد و هم می‌تواند از طریق ویندوز سرویس یا یک برنامه مستقل انجام پذیرد.

۵- کار با WCF آدم را خیلی زیاد به یاد ‏‎.Net Remoting می‌اندازد.

منبع:
فصل ۲۵ کتاب Apress Pro C# 2010 and the .NET 5 Platform

بی‌اطمینانی به مایکروسافت

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

اما از وقتی که با NHibernate آشنا شدم و روال کار آن را با LINQ-to-SQL و Entity Framework مقایسه کردم دیدم که یک جای کار می‌لنگد. NHibernate با احستاب سوابق جاوایی‌اش چندین سال است که به خوبی کار کرده و خیلی کم دچار تغییرات شدید شده است. کلیاتی که از NHibernate یاد گرفته‌ام هنوز همان است و مجبور نشده‌ام به جز LINQ-to-NHibernate که یک افزونه جدید حساب می‌شود نه یک تغییر، چیز اساسی یاد بگیرم. اما کسانی که ORM را با مایکروسافت شروع کرده‌اند مثل من راحت نبوده‌اند. چون اول وقت زیادی روی LINQ-to-SQL گذاشتند ولی بعد از مدت کوتاهی به آنها اعلام شد که LINQ-to-SQL دیگر توسعه داده نخواهد شد و به جای آن باید از Entity Framework استفاده کنند. این یعنی چیزی را که یاد گرفته و به آن عادت کرده‌اید را باید به طور کامل دور ریخته و فناوری جدیدتری را با صرف کلی وقت یاد بگیرید.

مشابه این مسئله را در SourceSafe و جایگزینی آن با TFS هم دیده‌ام. کسانی که با SourceSafe کار می‌کردند مجبور شدند آن را با TFS عوض کنند. اما کسانی که از همان اول با SVN کار می‌کردند هیچ وقت دچار همچین اجباری نشدند. حدس می‌زنم همین مسئله را در مورد Web Serviceها از یک سو و ‎.Net Remoting و WCF از دیگر سو داشته باشیم.

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

‫تعیین نوع fetch در Search APIهای NHibernate

برای آن که NHibernate بتواند به طور بهینه از Caching استفاده نماید باید Fetch در Entityها و Queryها به طور مناسبی تعریف شده باشد. Fetch به طور کلی به NHibernate می‌گوید sql دریافت اطلاعات از دیتابیس را چطور تولید کند. یک select کلی از همه جداول با استفاده از outer joinهای متعدد یا selectهای جداگانه به ازای هر جدول. مزیت عمده select جداگانه وقتی است که آن اطلاعات از قبل در Cache موجود باشند.

Fetch در Queryهای دیتابیسی NHibernate و APIهای مختلف جستجوی آن روش‌های متفاوتی دارد:

  • در HQL با استفاده join fetch انجام می‌شود. ±
  • در Linq-to-NH با استفاده از Expand و Fetch انجام می‌شود. ±
  • در QueryOver با Fetch انجام می‌شود (مشابه linq-to-nh). ±
  • در ICriteria با SetFetchMode انجام می‌شود. ±

‫clientها و ابزارهای کار با git در ویندوز

mysysgit
خود git است که به صورت command line کار می‌کند.

Cygwin
اجرای git از طریق Cygwin که یک شبیه ساز برنامه‌های لینوکس در ویندوز است.

gitk و git-gui دو ابزار گرافیکی که همراه با خود git نصب می‌شوند.

TortoiseGit
با ویندوز یکی می‌شود. مشابه TortoiseSVN. ظاهراً امکانات خوبی دارد و برای کسانی که به TortoiseSVN عادت دارند خیلی مناسب است.

Git-Cheetah
با ویندوز یکی می‌شود. البته نسبت ویندوزی بودن آن اصلاً مطمئن نیستم.

Git Extensions
با ویندوز یکی می‌شود. به صورت Add-on به ویژوال استودیو هم اضافه می‌شود. ولی Add-on ویژوال استودیو آن اصلاً جالب نیست. تنها کلاینتی است (به جز command line) که تا کنون با آن کار کرده‌ام.

Git Source Control Provider
این برنامه صرفاً یک Visual Studio plugin است. به نظر می‌رسد امکانات خوبی داشته و جای خالی AnkhSVN را بتواند پر کند.

SmartGit
صرفاً یک برنامه ویندوزی کار با git بدون integration با ویندوز یا Visual Studio بوده و ضمناً غیر رایگان است.

GitForce
مشابه SmartGit صرفاً یک برنامه ویندوزی کار با git بدون integration با ویندوز یا ویژوال استودیو بوده ولی رایگان می‌باشد.

Git#‎
API کار با git در C#‎.

اطلاعات بیشتر:

‫لذت Low Level

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

اما این روزها حس Low Level دوستی‌ام با دو چیز به خوبی ارضا می‌شود. یکی ریزه‌کاری‌های NHibernate مثل Fetch Mode، First/Level Cache و Mappingها و دیگری ور رفتن با git به عنوان یک ابزار سورس کنترل غیر متمرکز. git و ساختار و نحوه استفاده آن آنقدر جذابیت دارد که می‌توان ساعت‌ها بدون بلند شدن از جلوی کامپیوتر با آن کار کرد.

‫روش‌های ایجاد git server در ویندوز

راه اندازی git server در ویندوز راه‌های گوناگونی دارد که متاسفانه تعداد کمی از آنها ساده و کوتاه بوده و عمدتاً هم نیاز به کمی مهارت لینوکس و ور رفتن‌های فراوان با ابزارهای لینوکسی مثل cygwin دارند. در ادامه بعضی از روش‌ها و راهنماها معرفی می‌شوند.

۱- با استفاده از CopSSH: این روش نیازی به استفاده از cygwin پیدا نکرده بنابراین ساده‌تر و مطمئن‌تر هم هست. به این راهنما و این راهنما مراجعه کنید. راهنمای فارسی و خلاصه‌ای از این دو راهنما هم در این آدرس موجود است.

۲- با استفاده از cygwin و gitosis: این راهنما مستلزم استفاده سنگین از cygwing و python و OpenSSH و gitosis است. این راه، تقریباً سخت‌ترین راه بوده و عملاً مثل این است که یک سرور لینوکس نصب کرده و مراحل را روی آن انجام داده‌اید. cygwin محیط و امکانات لینوکس را در ویندوز ارائه می‌دهد. مزیت این راه حل ظاهراً مدیریت راحت‌تر کاربران است. علاوه بر این، روش gitosis در کنار روش WebDAV که از پروتکل http استفاده می‌کند، کامل‌ترین روش git server است. به این راهنما مراجعه کنید.

۳- با استفاده از cygwin و cygrunsrv و git daemon: مراحل انجام این روش کوتاه و ساده است. ولی من خودم به خاطر مشکلی که ظاهراً از IPv6 ویندوز ۷ بود نتوانستم آن را انجام دهم. در این روش از SSH استفاده نمی‌شود بنابراین امنیت وجود ندارد. ظاهراً مشکلاتی هم در رابطه با push و read only بودن مخزن دارد. به این راهنما مراجعه کنید.

۴- استفاده از git daemon به طور مستقیم در ویندوز: در این روش که بسیار ساده هم هست از پروتکل git مثل git://myserver استفاده می‌شود. پیدا کردن آدرسی دهی، احتمال read only بودن مخزن آن و مشکل concurreny یعنی push کردن هم زمان چند کاربر از جمله مشکلات احتمالی این روش می‌باشد. به اینجا مراجعه کنید.

۵- استفاده از File Sharing: مشابه آنچه که در SourceSafe انجام می‌شد. یعنی یک مخزن bare ساخته شده و در شبکه به اشتراک گذاشته می‌شود. سپس افراد با استفاده از urlهای فایلی به آن دسترسی پیدا می‌کنند. در این روش هیچ امنیتی وجود ندارد. مشکل Concurrency هم دارد. هر وقت کسی بخواهد push کند باید به بقیه استفاده کنندگان اطلاع دهد که تا اتمام push او هیچ کس دیگری push نکند. با وجود این معایب، این راه ساده‌ترین روش ممکن بوده و هیچ دردسری ندارد. به این راهنما مراجعه کنید.

‫جایزه AAFS و Social benefit از FSF

بنیاد نرم‌افزارهای آزاد FSF هر ساله دو جایزه اهدا می‌کند به نام‌های توسعه نرم‌افزار (Advancement of Free Software award: AAFS) و کمک به اجتماع (Social benefit).

جایزه AAFS به کسی داده می‌شود که تلاش خیلی زیادی برای پیشرفت نرم‌افزارهای آزاد کرده باشد. از جمله کسانی که برنده این جایزه شده‌اند:

۱- Rob Savoye به خاطر Gnash. این نرم‌افزار جزیی از پروژه GNU است و قرار است جایگزینی باشد برای Adobe Flash.

۲- Andrew Tridgell به خاطر Samba. این نرم‌افزار پروتکل شبکه‌ای SMB/CIFS را پیاده‌سازی کرده.

۳- Guido van Rossum به خاطر Python.

۴- Larry Wall به خاطر Perl و بقیه کارهایش.

جایزه کمک به اجتماع (Social Benefit) به پروژه‌ها یا تیم‌هایی اهدا می‌شود که منفعتی به جامعه برسانند. چند تا از برندگان این جایزه عبارتند از Tor به خاطر کمک به حفظ حریم شخصی در اینترنت، پروژه بایگانی اینترنت، اجازه نامه Creative Commons، پروژه Sahana به خاطر کمک به آسیب دیدگان از بلایای طبیعی و ویکی‌پدیا.