<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-4734015984943343401</id><updated>2013-05-05T22:40:56.983+04:30</updated><category term="برنامه نویسی" /><category term="Download" /><category term="dotNET Framework" /><category term="SQL Server" /><category term="حرفه من" /><category term="Bug" /><category term="Parallel Extension" /><category term="LightDictionary" /><category term="Oracle" /><category term="SalarDbCodeGenerator" /><category term="Google" /><category term="OpenSource" /><category term="اخبار فناوری" /><category term="ASP.NET" /><category term="Web Development" /><category term="بدون دسته بندی" /><category term="SalarBlog" /><category term="Parallel" /><category term="آموزشی" /><category term="Linux" /><category term="ORM" /><category term="Delphi" /><category term="طنز و متفرقه" /><category term="PLinq" /><category term="AI Challenge" /><category term="روزنوشت" /><category term="JavaScript" /><category term="Dapper" /><category term="معرفی" /><category term="Task" /><category term="FireFox" /><title type="text">Salar.Code();</title><subtitle type="html">نوشته های سالار خلیل زاده پیرامون توسعه نرم افزار، تکنولوژی های آن و مسائل پیرامون (و... شخصی)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.salarcode.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.salarcode.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default?start-index=26&amp;max-results=25" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>105</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/salarblog" /><feedburner:info uri="salarblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>salarblog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-170550721419312193</id><published>2012-09-03T20:52:00.000+04:30</published><updated>2012-09-03T20:54:04.370+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><title type="text">بهبود فونت فارسی پیش فرض ویندوز 8</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;فونت پیش فرض ویندوز 8 با نام &lt;a href="http://en.wikipedia.org/wiki/Segoe_ui" target="_blank"&gt;Segoe UI&lt;/a&gt; در این نسخه از ویندوز دستخوض تغییراتی شده است. این تغییرات برای زبان انگلیسی بیشتر باعث بهبود خوانایی آن شده اند. اما تغییری که کاراکترهای عربی و فارسی آن کرده اند قابل ملاحظه است، بگونه ای که حتی می شد نام جدید برای این فونت انتخاب کرد.&lt;br /&gt;پس از ویندوز XP که فونت پیش فرض زیبا و خوانای &lt;a href="http://en.wikipedia.org/wiki/Tahoma_%28typeface%29" target="_blank"&gt;Tahoma&lt;/a&gt; را داشت، فونت &lt;a href="http://en.wikipedia.org/wiki/Segoe_ui" target="_blank"&gt;Segoe UI&lt;/a&gt; جایگزین آن شد. متاسفانه این فونت تا نسخه اخیر بسیار ناخوانا بود و ترکیب آن در صفحه نمایش زشت دیده می شد.&lt;br /&gt;نسخه جدید Segoe UI برای رسم الخط عربی تغییرات بسیاری کرده تا آنجا که حتی بهتر از Tahoma نیز می باشد.&lt;br /&gt;تصویر زیر پیش نمایش از تعدادی حرف و عدد در این سه فونت مختلف را نمایش می دهد:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/Windows8Font/Win8FontsInFarsi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/Windows8Font/Win8FontsInFarsi.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;همانطور که ملاحظه می کنید فونت Tahoma در وضعیت ضخیم و کمی اندازه بزرگتر کیفیت خود را از دست می دهد، اما فونت Segoe UI همانچنان خوانا و زیبا می باشد.&lt;br /&gt;&lt;br /&gt;جهت اطلاع از تغییرات این فونت برای الفبای لاتین:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;a href="http://www.istartedsomething.com/20120302/segoe-ui-gets-a-subtle-facelift-in-windows-8/" target="_blank"&gt;Segoe UI gets a subtle facelift in Windows 8&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.quppa.net/2012/02/17/segoe-ui-light-improvements-in-windows-8/" target="_blank"&gt;Segoe UI Light Improvements in Windows 8 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.quppa.net/2012/02/17/more-on-segoe-ui-in-windows-8/" target="_blank"&gt;More on Segoe UI in Windows 8 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/fh4lkJfmqPw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/170550721419312193/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/09/windows-8-default-font-persian.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/170550721419312193" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/170550721419312193" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/fh4lkJfmqPw/windows-8-default-font-persian.html" title="بهبود فونت فارسی پیش فرض ویندوز 8" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/09/windows-8-default-font-persian.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-4441164397886965406</id><published>2012-08-30T11:45:00.000+04:30</published><updated>2012-08-30T20:22:12.343+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="AI Challenge" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">مسابقه ایرانی هوش مصنوعی</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;مسابقات آنلاین شبیه سازی و برنامه نویسی که اخیرا راه اندازی شده است بر روی هوش مصنوعی تاکید دارد. این مسابقات به صورت دوره ای و آنلاین برگذار می شود و برای برندگان نیز جایزه هایی تعیین شده است.&lt;br /&gt;دور اول مسابقه موش پنیر یاب است که برنامه نویس باید با استفاده از پکیج های آماده شده الگوریتم خود را در زبان برنامه نویسی منتخب خود پیاده کرده و مسائله را سریعتر از رقیب خود حل کند.&lt;br /&gt;نمایی از مسابقه در حال اجرا:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/CheeseFinderMouse/cheese-finder-mouse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/CheeseFinderMouse/cheese-finder-mouse.png" /&gt;&lt;/a&gt;&lt;/div&gt;با توجه به بسته های شروع موجود آغاز کار بسیار ساده است. با استفاده از همه معلومات داده شده به روبات مانند موقعیت پنیرها ، دیوارها و رقیب و با به کار گیری از بهینه ترین روشها و الگوریتمها باید سریع تر از رقیب پنیر و امتیاز بیشتری بدست آورد.&lt;br /&gt;در نگاه اول مسئله بسیار ساده می رسد و با توجه به اینکه هیچ مجهولی نداریم به ظاهر با استفاده از یک الگوریتم (مانند A-Star) می توان به نتیجه رسید. اما همینجا است که الگوریتم های بهینه سازی نتیجه، کاربرد پیدا می کنند و شما باید در هر لحظه سعی کنید با پیش بینی ها بهترین مسیر را انتخاب کرده و بیشترین پنیر را بدست آورید.&lt;br /&gt;&lt;br /&gt;به قولی معروف: ما روباتهایی باهوش درست نمی کنیم، ما سعی دارین روباتهایی درست کنیم که کمتر احمق باشند.&lt;br /&gt;&lt;br /&gt;جوایزی که برای مسابقه (یا دوره مسابقات؟) در نظر گرفته شده (100 هزار تومان برای نفر اول و... است) که برای یک چنین مسابقه ای اغوا کننده هستند. اما چندین ابهام و اشکال در این میان وجود دارد.&lt;br /&gt;با توجه هزینه ها و جوایز هیچ تبلیغاتی روی آن صورت نگرفته(تا آنجایی که می دانم) و این جای شک را ایجاد می کند که آیا واقعا قادر به پرداخت هستند؟ (با توجه به پاسخ سوالی که به من در فروم دادند تمام هزینه به صورت شخصی بر عهده شخص متولی است)&lt;br /&gt;مسئولین و متولیات معرفی نشده اند. با توجه به چنین ایده و کار جالبی، چرا نباید خود را معرفی کنند؟ عدم معرفی به نظر مخفی کار می رسد!&lt;br /&gt;امیدوارم متولیان به این موارد رسیدگی کنند. گرچه تا اینجای کار و راه اندازی سایت و مسابقه کم کاری هم نبوده است.&lt;br /&gt;&lt;br /&gt;به نظر من تعریف مسئله ساده انجام شده است. امکانش بود که با افزودن جزئیات و مسائل بیشتر سختی و جذابیت بیشتری به مسابقه داد. برای مثال دو موش نتوانند روی یک خانه قرار گیرند. و یک دشمن مانند گربه برای هر دو موش باشد. و یا محیط بزرگ بوده و دید موش محدود به چند خانه اطراف و خانه های بازدید کرده باشد. و یا پنیر ها ظاهر بشوند و پس از مدتی فاسد بشوند(امتیاز منفی) و ...&lt;br /&gt;&lt;br /&gt;یکی از اشکالات عمده ای که سایت فعلا دارد، مدت زمان کامپایل کد و انجام مسابقه است. این مدت معمولا 1 تا 3 روز طول می کشد که ناراحت کننده است. (با توجه به مشکلات کامپایل که ممکن است پیش بیاید)&lt;br /&gt;&lt;br /&gt;نکته مهم: لطفا در چنین مسابقاتی هیچ وقت بسته های پیش فرض را آپلود نکنید. این بسته ها هیچ الگوریتمی ندارد و به طور تصادفی حرکت می کنند. با این کار فقط وقت و حجم سرور را هدر داده اید. &lt;br /&gt;&lt;br /&gt;لینکها:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;a href="http://2drobot.com/" target="_blank"&gt;وبسایت مسابقه&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2drobot.com/learn/" target="_blank"&gt;راهنمای مسابقه&lt;/a&gt; و &lt;a href="http://2drobot.com/start/" target="_blank"&gt;راهنمای شروع&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2drobot.com/packages/" target="_blank"&gt;بسته های برنامه نویسی&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://2drobot.com/gift/" target="_blank"&gt;جوایز&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;پ.ن: در فرصتی که داشتم یک روبات برای خودم نوشتم. این روبات فعلا از ترکیب دو الگوریتم استفاده می کنه و چند اشکال اساسی داره که در فرصت بعدی رفع می کنم. پس از پایان این دوره کدهایش را هم منتشر می کنم و سعی خواهم کرد توضیحی در مورد آن ها بنویسیم. &lt;a href="http://2drobot.com/mygames/user/267/" target="_blank"&gt;لینک پروفایل روبات من&lt;/a&gt;.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/hYAg7ZpZl-Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/4441164397886965406/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/08/online-ai-programming-competition.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4441164397886965406" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4441164397886965406" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/hYAg7ZpZl-Q/online-ai-programming-competition.html" title="مسابقه ایرانی هوش مصنوعی" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/08/online-ai-programming-competition.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-3535800704461572450</id><published>2012-08-24T14:28:00.000+04:30</published><updated>2012-08-26T23:14:34.273+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="SalarDbCodeGenerator" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">SalarDbCodeGenerator نسخه 2 و NHibernate</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;در &lt;a href="http://blog.salarcode.com/2012/05/introducing-salardbcodegenerator.html" target="_blank"&gt;پست قبلی&lt;/a&gt; با &lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;SalarDbCodeGenerator&lt;/a&gt; آشنا شدید. در این پست می خواهیم نسخه 2 این نرم افزار رو به طور خلاصه بررسی کنیم.&lt;br /&gt;برخی از تغییرات مهم نسخه 2:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;الگوی جدید NHibernate MappingByCode (پشتیبانی از MVVM و data annotations)&lt;/li&gt;&lt;li&gt;الگوی جدید Dapper+SQLinq که از کتابخانه SQLinq و توابع کمکی در Dapper استفاده می کنه&lt;/li&gt;&lt;li&gt;باز نویسی مجدد موتور شمای الگوها&lt;/li&gt;&lt;li&gt;بازنویسی مجدد موتور اصلی&lt;/li&gt;&lt;li&gt;شمای جدید پروژههای برنامه&lt;/li&gt;&lt;li&gt;به روز شدن همه الگوها&lt;/li&gt;&lt;li&gt;بهبود سرعت کلی تولید کد&lt;/li&gt;&lt;li&gt;خواندن و شناسایی اعمال کلید خارجی&lt;/li&gt;&lt;li&gt;پشتیبانی از توضیحات ستون ها در oracle و sqlCe &lt;/li&gt;&lt;/ul&gt;و البته پروژه های نسخه 1 توسط این نسخه پشتیبانی نمی شود.&lt;br /&gt;&lt;a href="http://salardbcodegenerator.codeplex.com/releases/view/91639" target="_blank"&gt;لیست کامل تغییرات در صفحه دانلود&lt;/a&gt; قرار دارد.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;نگاهی به پیاده سازی NHibernate MappingByCode انجام شده.&lt;/b&gt;&lt;br /&gt;پیاده سازی نگاشتها بدون استفاده ClassMapping و صرفا با استفاده از کلاس کمکی ModelMapper انجام شده است. این متد کمکی در فایل SampleDbMapper قرار می گیرد.&lt;br /&gt;همچنین برای پیاده سازی های سفارشی متد دیگری با نام CustomMapToModel در نظر گرفته شده است.&lt;br /&gt;در کل ساختار پروژه به این صورت می شود:&lt;br /&gt;&lt;br /&gt;&lt;div style="direction: ltr; text-align: left;"&gt;Base\SampleDbBase.cs&lt;br /&gt;Entities\DataAnnotations\*Meta.cs &lt;br /&gt;Entities\UserEntities\*Entity.cs&lt;br /&gt;Entities\Principal\EntityObjects.cs&lt;br /&gt;Entities\SampleDbMapper.cs&lt;br /&gt;Entities\SampleDbMapper.User.cs&lt;br /&gt;Entities\SampleDbSession.cs&lt;br /&gt;app.config&lt;/div&gt;تقریبا ساختار بیشتر پروژه های تولید شده توسط این برنامه به همین شکل است. به همین منوال بقیه، کلاس پایه SampleDbBase.cs شامل چند متد اضافی هست که به تهیه کپی از کلاسهای مدل کمک می کند. از جمله متدهای CloneUnproxied و CopyUnproxied که یک نمونه بدون پراکسی را تهیه می کنند.&lt;br /&gt;طریقه استفاده از این پروژه ساده است. با استفاده از کلاس کمکی SampleDbSession یک نمونه از session را ایجاد کرده و بقیه اعمال را به منوال عادی NHibernate انجام می دهیم:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;using (var session = SampleDbSession.OpenSession())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var newCar = new Car()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Color = "white"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; session.Save(newCar);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; session.Flush();&lt;br /&gt;}&lt;br /&gt;using (var session = SampleDbSession.OpenStatelessSession())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataList = session.Query&amp;lt;car&amp;gt;().Where(x =&amp;gt; x.Color == "white");&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;نگاهی به Dapper+SQLinq&lt;/b&gt;&lt;br /&gt;این الگو همانند الگوی DapperAccess است که کتابخانه &lt;a href="http://sqlinq.codeplex.com/" target="_blank"&gt;SQLinq&lt;/a&gt; به آن اضافه شده است. این کتابخانه این امکان را برای Dapper فراهم می کند که با استفاده از عبارات LINQ کوئری مورد نظر بدون استفاده مستقیم از عبارات sql عملیات استاندارد را انجام دهد. ترکیب Dapper و این کتابخانه راحتی و سرعت قابل قبولی را فراهم می کند.&lt;br /&gt;این کتابخانه فقط از SqlServer پشتیبانی می کند. &lt;br /&gt;&lt;br /&gt;نمونه کد:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;using (var dap = new CarDap())&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataList = dap.Query(new SQLinq&amp;lt;car&amp;gt;().Where(x =&amp;gt; x.Color == "white"));&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;بهبودها و نسخه بعدی&lt;/b&gt;&lt;br /&gt;در این نسخه از SalarDbCodeGenerator اصلاح کننده نام های نامعتبر تغییرات زیادی کرده و بهبود یافته است. به همین علت ممکن است که پروژه تولید شده با این نسخه سازگار با نسخه های قبلی سازگار نباشد.&lt;br /&gt;&lt;br /&gt;همچنین برای نسخه های آینده احتمالا بر روی ویژگی های جدید EF5 کار خواهم کرد (پشتیبانی از Enum و Table-Valued).&lt;br /&gt;&lt;br /&gt;نظر شما چیست؟ چه ویژگی به نظرتون حیاتی است و می خواهید در نسخه بعدی مشاهده کنید؟&lt;br /&gt;&lt;br /&gt;&lt;b&gt;دانلود &lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://salardbcodegenerator.codeplex.com/releases/" target="_blank"&gt;صفحه دانلود&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://salardbcodegenerator.codeplex.com/SourceControl/list/changesets" target="_blank"&gt;کد پروژه&lt;/a&gt; (به git تغییر داده شد. اکنون می توان از روی پروژه &lt;a href="http://salardbcodegenerator.codeplex.com/SourceControl/network/create/fork" target="_blank"&gt;fork&lt;/a&gt; ایجاد کرد) &lt;/li&gt;&lt;li&gt;&lt;a href="http://salardbcodegenerator.codeplex.com/workitem/list/advanced" target="_blank"&gt;گزارش خطا و اصلاحات&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/yv9BTXxH994" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/3535800704461572450/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/08/salardbcodegenerator-version-2.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/3535800704461572450" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/3535800704461572450" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/yv9BTXxH994/salardbcodegenerator-version-2.html" title="SalarDbCodeGenerator نسخه 2 و NHibernate" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/08/salardbcodegenerator-version-2.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-7560388224677895866</id><published>2012-07-04T07:54:00.000+04:30</published><updated>2012-07-04T07:57:59.409+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Oracle" /><title type="text">دانلود دیتابیس اوراکل</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;قبلا درهای سایت اوراکل برای ایرانی ها یک طرفه باز بود و می شد وارد شد ولی اجازه دانلود نداشتیم، اما مدتی هست که ظاهرا همه درها بسته شده، حتی اجازه دیدن قیافه سایت نیز منع شده است!&lt;br /&gt;برای رفع مشکل دانلود لینک دانلود های زیر را جمع آوری کردم که فعلا آخرین نسخه دیتابیس یعنی 11g Release 2 رو می تونید دریافت کنید.&lt;br /&gt;روش کلی جستجو خیلی ساده است، فقط کافی هست که نام فایل مورد نظر رو به صورت کامل به صورت زیر در گوگل وارد کنید:&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;intitle:index.of ODTwithODAC112030.zip&lt;/div&gt;نتایج معمولا سایتهای شخصی هستند که افراد فایلها رو روی سرور دانلود کرده و گوگل آنها را یافته است. البته این لینک ها زیاد دوام نمی آورند، به خاطر همین لینک جستجو آنها رو نیز قرار دادم.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;دانلود Oracle Database 11g Release 2 &lt;a href="http://compbio.ddns.comp.nus.edu.sg/%7Ezhouhufeng/FTP/Public/Tools/programs/Windows/win32_11gR2_database_1of2.zip" target="_blank"&gt;Win32-Part1&lt;/a&gt; &lt;a href="http://compbio.ddns.comp.nus.edu.sg/%7Ezhouhufeng/FTP/Public/Tools/programs/Windows/win32_11gR2_database_2of2.zip" target="_blank"&gt;Win32-Part2&lt;/a&gt; | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+win32_11gR2_database_1of2.zip&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:en-US:official&amp;amp;client=firefox-a#q=intitle:index.of+win32_11gR2_database_1of2.zip&amp;amp;hl=en&amp;amp;client=firefox-a&amp;amp;hs=3HO&amp;amp;tbo=1&amp;amp;rls=org.mozilla:en-US:official&amp;amp;output=search&amp;amp;source=lnt&amp;amp;tbs=qdr:y&amp;amp;sa=X&amp;amp;ei=cEXvT9mqCK354QT51PjcDQ&amp;amp;ved=0CAgQpwUoBQ&amp;amp;bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&amp;amp;fp=15f4f2ff325d4b5a&amp;amp;biw=1366&amp;amp;bih=663" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;دانلود Oracle Database 11g Release 2 &lt;a href="http://compbio.ddns.comp.nus.edu.sg/%7Ezhouhufeng/FTP/Public/Tools/programs/Windows/win64_11gR2_database_1of2.zip" target="_blank"&gt;Win64-Part1&lt;/a&gt; &lt;a href="http://compbio.ddns.comp.nus.edu.sg/%7Ezhouhufeng/FTP/Public/Tools/programs/Windows/win64_11gR2_database_2of2.zip" target="_blank"&gt;Win64-Part2&lt;/a&gt; &lt;br /&gt;دانلود&amp;nbsp;&lt;a href="http://141.31.147.114/%7Edienert/dbadmin/unterlagenNessarNazar/oracle_bins/OracleXE112_Win32.zip" target="_blank"&gt;Oracle Database XE 11g R2&lt;/a&gt;  | &lt;a href="https://www.google.com/#hl=en&amp;amp;output=search&amp;amp;sclient=psy-ab&amp;amp;q=intitle:index.of+OracleXE112_Win32.zip" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;دانلود Oracle Instant Client &lt;a href="http://www.di.unito.it/%7Epasteris/download/temp/instantclient-basic-nt-11.2.0.3.0.zip" target="_blank"&gt;Win32&lt;/a&gt; &lt;a href="http://anakhoul.com/instantclient-basic-windows.x64-11.2.0.3.0.zip" target="_blank"&gt;Win64&lt;/a&gt; | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+instantclient-basic-nt-11.2.0.3.0.zip" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;دانلود Oracle Database Client 11g R2&amp;nbsp; &lt;a href="http://ftp.inspursoft.com/install_media/database/Oracle/11g/win32_11gR2_client.zip" target="_blank"&gt;Win32&lt;/a&gt; &lt;a href="http://ftp.inspursoft.com/install_media/database/Oracle/11g/win64_11gR2_client.zip" target="_blank"&gt;Win64&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;دانلود &lt;a href="http://file.createmania.co.kr/ODTwithODAC112030.zip" target="_blank"&gt;ODAC 11.2 Release 4 (11.2.0.3.0) with Tools for Visual Studio&lt;/a&gt;  | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+ODTwithODAC112030.zip" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;دانلود &lt;a href="http://piletice.hkfree.org/%7Ekiller/ODAC112030Xcopy_32bit.zip" target="_blank"&gt;ODAC 11.2 Release 4 (11.2.0.3.0) with Xcopy Deployment&lt;/a&gt;  | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+ODAC112030Xcopy_32bit.zip" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;دانلود &lt;a href="http://img.cs.montana.edu/windows/jdk-7u5-windows-i586.exe" target="_blank"&gt;Jdk7 u5 i586&lt;/a&gt;  | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+jdk-7u5-windows-i586.exe" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;دانلود &lt;a href="http://itchen.class.kmu.edu.tw/file/Src/jdk-7u5-windows-x64.exe" target="_blank"&gt;Jdk7 u5 x64&lt;/a&gt;  | &lt;a href="https://www.google.com/search?q=intitle%3Aindex.of+jdk-7u5-windows-x64.exe" target="_blank"&gt;لینک جستجو&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;در مورد JRE به سایت &lt;a href="http://www.filehippo.com/download_jre_32/" target="_blank"&gt;Download JRE FileHippo&lt;/a&gt; و سایتهای دیگه مراجعه کنید که همیشه آخرین نسخه را قرار می دهند.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/Gbfv7-R2Frk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/7560388224677895866/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/07/download-oracle-database.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7560388224677895866" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7560388224677895866" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/Gbfv7-R2Frk/download-oracle-database.html" title="دانلود دیتابیس اوراکل" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/07/download-oracle-database.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6212071917389914964</id><published>2012-07-01T16:09:00.001+04:30</published><updated>2012-07-01T16:20:11.222+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title type="text">تغییر کلمه عبور فراموش شده در SQL Server</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;فراموشی کلمه عبور SQL Server از مواردی هست که کم برای کسی پیش می آید ولی اگر پیش بیاد دردسر بزرگی خواهد بود.&lt;br /&gt;چند راه مختلف برای بازیابی و ریست کلمه عبور وجود دارد، در اینجا قصد ندارم آنها رو شرح بدهم. اما شاید ساده ترین روش ورود با استفاده از حساب sa و یا با استفاده از حساب ویندوز (Windows authentication) باشد.&lt;br /&gt;اما اگه این دو نشد چه؟ مثلا حساب sa غیر فعال است و windows authentication برای کاربران تعریف نشده باشد .(البته غیر فعال بودن sa توصیه میشه.)&lt;br /&gt;یک راه جالبی وجود دارد که نیاز به روش خاصی برای انجام دارد که در ادامه می خوانید، اما قبل از آن لینک های زیر شامل روشهای مختلف دیگری برای بازیابی کلمه عبور هستند:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;a href="http://forums.asp.net/t/1604697.aspx/1" target="_blank"&gt;How to reset lost sql sa password?&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sqlauthority.com/2009/08/04/sql-server-forgot-the-password-of-username-sa/" target="_blank"&gt;SQL SERVER – Forgot the Password of Username SA&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://worthposting.wordpress.com/2008/11/01/sql-server-reset-sa-password/" target="_blank"&gt;SQL SERVER – Reset sa Password&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://deepakrangarajan.blogspot.com/2008/01/forgot-sa-password-in-sql-server-2005.html" target="_blank"&gt;Phoenix: Forgot the SA password in Sql Server 2005&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thebackroomtech.com/2008/03/26/how-to-change-the-sql-sa-password-from-a-command-prompt/" target="_blank"&gt;How to change the SQL sa password from a command prompt&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;اجرای sql server در حالت single user هم جالب هست که در لینکهای بالا توضیح داده شده است.&lt;br /&gt;&lt;br /&gt;اما روشی که من استفاده کردم بر یک نکته ساده مربوط به حساب کاربری جاری متصل شونده به دیتابیس استوار است. در زمان اتصال به sql server و استفاده از روش windows authentication حساب کاربر جاری مورد استفاده قرار می گیرد. برای مثال اگه حساب کاربری ویندوزی &lt;b&gt;جاری&lt;/b&gt; salar باشد، وجود حساب وی و دسترسی وی به sql server بررسی شده و سپس اجازه ادامه عملیات و برقراری اتصال داده می شود.&lt;br /&gt;حال اگر کاربر جاری را به SYSTEM تغییر دهیم چه می شود؟ به طور پیشفرض کاربر SYSTEM جزو کاربران مجاز با دسترسی کامل در هنگام نصب sql server تعیین می شود.&lt;br /&gt;پس با این اوصاف اگر بتوانیم با کاربر SYSTEM وارد شویم امکان تغییر کلمه عبور کاربران و کارهای دیگر فراهم می شود.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/SQLServerPasswordChanger/SqlServerUsers.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/SQLServerPasswordChanger/SqlServerUsers.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;وجود کاربر جاری و کاربر سیستم&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;نکته ای که اینجا هست کاربران یا برنامه های عادی اجازه اجرای برنامه در حساب کاربری SYSTEM را ندارند، فقط سرویس ویندوز هستند که می تواند چنین اجازه ای می تواند داشته باشند (و این مسئله باید صراحتا توسط سرویس در هنگام نصب آن درخواست شود).&lt;br /&gt;&lt;br /&gt;همه این نکات در برنامه/سرویس SQLServerPasswordChanger جمع شده است. این برنامه دستور SQL را که در فایل cmd.sql قرار دارد اجرا کرده و نتیجه اجرا را  (موفقیت / عدم موفقیت) در فایل result.log می نویسد. دستور پیش فرض قرار گرفته شامل تغییر کلمه عبور sa و سپس فعال کردن sa در صورت غیر فعال بود هست.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;exec sp_password @new='1234567890', @loginame='sa' ;&lt;br /&gt;alter login sa enable ; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;قبل از همه این مراحل سرویس این برنامه باید نصب شود، عملیات نصب/عذل توسط خود برنامه انجام می شود و دارای تعدادی نکته هست که بررسی آن خالی از لطف نیست.&lt;br /&gt;همچنین کانکشن اتصال در فایل SQLServerPasswordChanger.exe.config قرار دارد که فقط در صورت وجود Instance نیاز به تغییرش هست.&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;دانلود&lt;/li&gt;&lt;/ul&gt;برنامه SQLServerPasswordChanger در &lt;a href="https://salarblogsources.svn.codeplex.com/svn/Projects/SQLServerPasswordChanger/%21Released/" target="_blank"&gt;این آدرس&lt;/a&gt; قابل دریافت است.&lt;br /&gt;کد های این برنامه به صورت آنلاین &lt;a href="https://salarblogsources.svn.codeplex.com/svn/Projects/SQLServerPasswordChanger/" target="_blank"&gt;در این آدرس&lt;/a&gt; قرار دارند.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/5Vvr5h6XkZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6212071917389914964/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/07/reset-sql-server-password.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6212071917389914964" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6212071917389914964" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/5Vvr5h6XkZc/reset-sql-server-password.html" title="تغییر کلمه عبور فراموش شده در SQL Server" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/07/reset-sql-server-password.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-3719830529243771139</id><published>2012-05-18T19:54:00.001+04:30</published><updated>2012-05-19T18:43:13.907+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dapper" /><category scheme="http://www.blogger.com/atom/ns#" term="SalarDbCodeGenerator" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><category scheme="http://www.blogger.com/atom/ns#" term="ORM" /><title type="text">Dapper یک mini-ORM سریع</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;اخیرا در حال کار بر روی سرویس تحت وبی بودم که برخلاف حجم کوچک پروژه کار خیلی زیادی رو انجام میده و ترافیک زیادی قراره روی اون سوار بشه.&lt;br /&gt;&lt;br /&gt;به علت فشاری که سرویس قرار بود متحل بشه مشغول بهینه سازی عملکرد بخش های مختلف بودم. این فشار حداقل 100 درخواست در ثانیه  از مجموع 10 کاربر همزمان برای شروع کار در نظر گرفته شده بود. در چنین حجم کاری هر میلی ثانیه نیز با ازش هست. در حین بررسی اجرای برنامه متوجه تاخیرهای بیش از حد و غیر عادی عملیات دیتابیس شدم. برای کاهش تاخیر سعی شد تا عملیات به روز رسانی و درج در دیتابیس غیر همزمان انجام شود(با Thread Pooling توسط BeginInvoke ساده)، اما این کار ممکنه ایجاد تداخل کنه و همیشه قابل انجام نیست. &lt;br /&gt;در کل تاخیر های انجام شده توسط EntityFramework محسوس بودند. بنچمارک های انجام شده نیز این مطلب را نشان می دهد که EF کندتر از سایر orm ها عمل می کند. این کندی به چه معناست؟ یعنی برای انجام 500 درخواست متوالی EF حدود 600 میلی ثانیه زمان مصرف می کند، در حالی کار به ado.net ساده زمانی حدود 44 میلی ثانیه لازم دارد.&lt;br /&gt;البته این برای برنامه های دسکتاب اصلا به چشم نخواهد آمد، چون اصلا کاربر بیش از چند نفر نمی شود.&lt;br /&gt;در این بین مدل 3Tier که توسط &lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;این برنامه&lt;/a&gt; تولید می شود یک گزینه موجود بود اما مناسب نبود. این مدل نیاز به کار با StoredProcedures ها دارد، در حال حاظر مقدور نبود از sp ها استفاده کنم و همچنین وابستگی شدیدی به مدل(database model) خود دارد و چند محدودیت دیگر. در حین جستجو برای بهترین نتایج، Dapper جالب به نظر رسید.&lt;br /&gt;Dapper یک نیمچه ORM که به علت سرعت بالایی که داره انتخاب من شد. کارکرد Dapper بسیار جالب هست، &lt;a href="http://code.google.com/p/dapper-dot-net/source/browse/Dapper/SqlMapper.cs" target="_blank"&gt;یک فایل&lt;/a&gt; را به پروژه اضافه می کنید و تمام. با استفاده از چند متن افزوده به connection دیتابیس به راحتی امکان دریافت نتایج و مپ کردن آنها به کلاسهای مدل دیتابیس را فراهم میکنه.&lt;br /&gt;استفاده از آن هم به سادگی کد زیر هست:&lt;br /&gt;&lt;pre style="direction: ltr; text-align: left;"&gt;using (var conn = new SqlConnection(myConnectionString)) {&lt;br /&gt;     conn.Open();&lt;br /&gt;     Account result = conn.Query&amp;lt;account&amp;gt;(@"SELECT * FROM Account WHERE Id = @Id", new {  Id = Id }).FirstOrDefault();&lt;br /&gt;     ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;همانطور که می بینید با استفاده از عبارات sql فراخوانی ها مستقیما انجام میشود. پارامتر دوم پارامترهای کوئری است که از نوع dynamic تعریف شده و هر نوع شیئی را می پذیرد.&lt;br /&gt;امضاهای مختلفی از این متد وجود دارد. در صورتی که نیاز باشد تا فقط چند ستون از جدول انتخاب شود از امضای زیر که خروجی dynamic دارد استفاده می کنیم:&lt;br /&gt;&lt;br /&gt;&lt;pre style="direction: ltr; text-align: left;"&gt;dynamic account = conn.Query&amp;lt;dynamic&amp;gt;(@"SELECT Name, Address, Country FROM Account WHERE Id = @Id", new { Id = Id }).FirstOrDefault();&lt;br /&gt;Console.WriteLine(account.Name);&lt;br /&gt;Console.WriteLine(account.Address);&lt;br /&gt;Console.WriteLine(account.Country);&lt;/pre&gt;براس آشنایی بیشتر با چند متدهای دیگر به صفحه &lt;a href="http://code.google.com/p/dapper-dot-net/" target="_blank"&gt;Dapper&lt;/a&gt; مراجعه کنید.&lt;br /&gt;کارایی dapper برای من سوال بود و زیاد به بنچ مارکهای دیگران اعتماد نداشتم به همین جهت به گفته ها بسنده نکرده و در یک تست ساده select بر آن شدم تا مقایسه ای انجام بدم. و این هم از نتایج:&lt;br /&gt;&lt;pre style="text-align: left;"&gt;Selecting 1 record in 200 iterations&lt;br /&gt;------------------------&lt;br /&gt;EF CodeFirst total: 00:00:00.2616611, ms: 261&lt;br /&gt;ActiveRecord total: 00:00:00.1116575, ms: 111&lt;br /&gt;Dapper total:       00:00:00.0177814, ms: 17&lt;br /&gt;------------------------&lt;br /&gt;EF CodeFirst total: 00:00:00.2460143, ms: 246&lt;br /&gt;ActiveRecord total: 00:00:00.1105966, ms: 110&lt;br /&gt;Dapper total:       00:00:00.0183922, ms: 18&lt;br /&gt;------------------------&lt;br /&gt;EF CodeFirst total: 00:00:00.2454677, ms: 245&lt;br /&gt;ActiveRecord total: 00:00:00.1116689, ms: 111&lt;br /&gt;Dapper total:       00:00:00.0173781, ms: 17&lt;br /&gt;------------------------&lt;br /&gt;EF CodeFirst total: 00:00:00.2448425, ms: 244&lt;br /&gt;ActiveRecord total: 00:00:00.1117898, ms: 111&lt;br /&gt;Dapper total:       00:00:00.0174709, ms: 17&lt;br /&gt;------------------------&lt;br /&gt;EF CodeFirst total: 00:00:00.2478316, ms: 247&lt;br /&gt;ActiveRecord total: 00:00:00.1104544, ms: 110&lt;br /&gt;Dapper total:       00:00:00.0197321, ms: 19&lt;br /&gt;&lt;/pre&gt;هر فراخوانی 200 بار تکرار شده و کل آزمون رو 5 بار تکرار کردم. همانطور که می بینید EntityFramework بدترین نتیجه رو بدست آورده و البته این همه اختلاف جای تعجب دارد. در این تست کار مستقیم با ado.net رو پوشش ندادم ولی با توجه به نتایج تست خود صفحه dapper در 500 تکرار در حد 4 یا 5 میلی ثانیه اختلاف بین dapper و ado.net مسقیم وجود دارد.&lt;br /&gt;&lt;br /&gt;به همین دلایل یک الگو برای &lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;SalarDbCodeGenerator&lt;/a&gt; مهیا کردم که تا من رو از خطر نگهداری و نوشتن کدهای SQL تاحدودی راحت کنه. این الگو یک کلاس میانی برای هر جدول دیتابیس ایجاد می کنه که علاوه بر مدیریت اتصال های پایگاه داده (dapper مدیریت اتصال پایگاه داده را انجام نمی دهد) متد های اصلی CRUD را دارا است. همچنین برای ارتباطات جداول و کلیدهای اندیس و یکتا(unique) متدهای کمکی را تولید می کند.&lt;br /&gt;خلاصه با استفاده از این الگو بدون نیاز به هر کاری می توان کارهای ساده با جداول را با قدرت Dapper انجام داد.&lt;br /&gt;نکته: لازم نیست که حتما مدلهای جداول این الگو را تولید کنید، می توان از مدلهای سایر ORM ها با اندکی تغییر استفاده کرد.&lt;br /&gt;نمونه کد:&lt;br /&gt;&lt;pre style="direction: ltr; text-align: left;"&gt;using (var pdap = new PersonDap())&lt;br /&gt;using (var transaction = pdap.BeginTransaction())&lt;br /&gt;using (var cdap = new CarDap(pdap))&lt;br /&gt;{&lt;br /&gt; var person = pdap.GetByPersonID(10);&lt;br /&gt; var carList = cdap.GetByPersonID(person.PersonID);&lt;br /&gt;&lt;br /&gt; var newCar = new Car()&lt;br /&gt;     {&lt;br /&gt;         CarPlaque = "1982-92",&lt;br /&gt;         Color = "White",&lt;br /&gt;         ModelType = "BMW",&lt;br /&gt;         PersonID = person.PersonID,&lt;br /&gt;     };&lt;br /&gt; cdap.Insert(newCar);&lt;br /&gt; transaction.Commit();&lt;br /&gt;&lt;br /&gt; var bmwList = pdap.Query&amp;lt;Car&amp;gt;(&lt;br /&gt;  CarDap.SqlSelectCommand + " WHERE ModelType=@ModelType",&lt;br /&gt;  new {ModelType = "BMW"})&lt;br /&gt;  .ToList();&lt;br /&gt;&lt;br /&gt; ....&lt;br /&gt;}&lt;/pre&gt;تنها نکته لازم به توضیح، ثابت SqlSelectCommand هست، این ثابت و سه ثابت دیگر دستورات sql پیشفرض برای عملیات CRUD در پایگاه داده هستند که توسط generator تولید شده و همیشه به روز هستند و در همه جداول وجود دارند. می توانید دردسر نوشتن دستورات sql را تا حدودی کاهش دهید.&lt;br /&gt;&lt;br /&gt;و&amp;nbsp; در آخر بهتر است بدانید که Dapper توسط &lt;a href="http://samsaffron.com/" target="_blank"&gt;Sam Saffron&lt;/a&gt; یکی از برنامه نویسان سایت &lt;a href="http://stackoverflow.com/" target="_blank"&gt;StackOverflow&lt;/a&gt; و برای همان سایت توسعه داده شده و بعدا open-source شده است. &lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;b&gt;لینکهای مفید&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dapper-dot-net/" target="_blank"&gt;صفحه پروژه Dapper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/dapper-dot-net/source/browse/Tests/Tests.cs" target="_blank"&gt;تست های پروژه حاوی همه نوع مثال و شیوه استفاده&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;صفحه SalarDbCodeGenerator&lt;/a&gt; و &lt;a href="http://blog.salarcode.com/2012/05/introducing-salardbcodegenerator.html" target="_blank"&gt;توضیحات&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tritac.com/bp-24-dapper-dot-net-by-example" target="_blank"&gt;Dapper.Net by example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/jalpeshpvadgama/archive/2011/05/20/edit-update-with-dapper-orm-and-asp-net-mvc-3.aspx" target="_blank"&gt;Edit/Update with dapper ORM and ASP.NET MVC 3&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;*پ.ن: نسخه جدید SalarDbCodeGenerator در سایت قرار گرفت که همراه با این مدل به نام DapperAccess است، یک به روزرسانی برای مدل EF دارد. از صفحه پروژه قابل دریافت است.&lt;br /&gt;&lt;br /&gt;به روزرسانی: همانطور که در متن توضیح دادم Dapper یک ORM کامل نیست، برای اینکه شبهه ای ایجاد نشه، عنوان مطلب اصلاح شد.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/cN7-vtqu-WI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/3719830529243771139/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/05/dapper-pattern.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/3719830529243771139" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/3719830529243771139" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/cN7-vtqu-WI/dapper-pattern.html" title="Dapper یک mini-ORM سریع" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/05/dapper-pattern.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-4551942233726190908</id><published>2012-05-05T09:21:00.000+04:30</published><updated>2012-05-05T19:07:12.580+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="SalarDbCodeGenerator" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">معرفی SalarDbCodeGenerator</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;مدتی بود که تصمیم داشتم پروژه رو که در ادامه مشاهده می کنید، اوپن سورس کنم. این برنامه در طول مدت تقریبا نزدیک به 4 سال به تدریج توسعه یافته و به شکل کنونی خود رسیده. تقریبا در بیشتر پروژه هایی که خودم شروع کردم از اون استفاده کردم و تا حد قابل قبولی آزمایش شده و قابل اعتماد هست.&lt;br /&gt;SalarDbCodeGenerator یک تولید کننده کد است که از مدل اول دیتابیس (Database first) پیروی می کند. با استفاده از الگوهای از قبل تهیه شده پروژه را تولید کرده و آماده کامپایل و استفاده می شه. هر الگو معمولا شامل کلاسها مدلینگ جدوال، ویو ها و در نهایت کلاسهای پایه کار دیتابیس و یا کلاسهای پایه ORM مورد استفاده است.&lt;br /&gt;از عمده مزیت استفاده از یک تولید کننده کد کاهش زمان مورد نیاز برای نوشتن کلاسهای مدل و توابع mapping است. تقریبا همه این کارها انجام شده و پروژه قابل استفاده تحویل می گیرید.&lt;br /&gt;الگوهای مورد استفاده برنامه همگی قابلیت سفارشی سازی دارند و در حالت کلی برای نرم افزار زبان مورد استفاده شده هیچ اهمیتی ندارد و هر آنچه که در الگو معین شده خروجی را تعیین می کند. در نتیجه خروجی این تولید کننده در هر زبانی می تواند باشد.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;پایگاه داده های مورد پشتیبانی&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;Micorsoft SQL Server (2000/2005/2008/2012)&lt;br /&gt;(پشتیبانی از توضیح برای فیلدها)&lt;/li&gt;&lt;li&gt;SQL Server Compact Edition 4&lt;/li&gt;&lt;li&gt;Oracle Database (8i/9i/10g/11g)&lt;/li&gt;&lt;li&gt;SQLite (v3 and above)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;خلاصه امکانات&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;شناسایی کلید واژه های رزروشده (Keywords) زبان برنامه نویسی و عدم ایجاد تداخل کد تولیدی&lt;/li&gt;&lt;li&gt;پستیبانی از تغییر نامه جداول و ویوهای تولیدی جهت خوانا شدن در هنگام برنامه نویسی&lt;/li&gt;&lt;li&gt;افزودن توضیحات هر یک از فیلدهای جدول به مدلهای تولید شده جهت راحتی در هنگام کد نویسی (فقط SQLServer)&lt;/li&gt;&lt;li&gt;الگوی های سفارشی&lt;/li&gt;&lt;li&gt;استفاده شده از الگوهای کد به صورت XML که تغییر و ویرایش آنها را ساده می کند&lt;/li&gt;&lt;li&gt;تولید کد برای کلیدهای خارجی (Foreign keys) و اندیس ها (Index)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;الگوهای همراه برنامه&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: white; color: black;"&gt;&lt;b&gt;Entity Framework Code First&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;EF4 CodeFirst&lt;br /&gt;(همراه با data annotations) &lt;/li&gt;&lt;li&gt;EF4 CodeFirst MVVM &lt;/li&gt;&lt;li&gt;(همراه با&amp;nbsp; data annotations و اعلان تغییر پراپرتی های mvvm) &lt;/li&gt;&lt;li&gt;EF4 CodeFirst Simple&lt;br /&gt;(کلاسهای ساده بدون ویژگی اضافه) &lt;/li&gt;&lt;/ul&gt;مدل دیتابیس را برای استفاده توسط Entity Framwork 4.2 CodeFirst تولید می کند. همچنین چندین متد و ویزگی اضافه که برای برنامه نویس مفید هستند همراه این مدل افزوده است.&lt;br /&gt;&lt;br /&gt;data annotations و اعلان تغییر پراپرتی ها(INotifyPropertyChanged) به صورت دو الگوی جداگانه طراحی شده و در دسترس هستند. همچنین همه کلاسها به صورت partial بوده و قابلیت سفارش سازی دارند.&lt;br /&gt;همراه با همه الگوهای پیش فرض معمولا کلاسهای Partial جداگانه ای تولید می شود تا برنامه نویس بتواند ویژگی ها و متد های سفارشی خودش را در آنها قرار دهد.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NHibernate Mapping By Code&lt;/b&gt; (در حال آماده سازی)&lt;br /&gt;Mapping By Code از نسخه NHibernate 3.2 معرفی شد و بدون نیاز به داشتن فایلهای xml اضافه اجازه استفاده از مدلها را می دهد.&lt;br /&gt;در زمانها فراقتم در حال آماده کردن این الگو  هستم، که پس از آزمایش اطمینان از صحت عمل آن منتشر می کنم.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NHibernate ActiveRecord&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;NHibernate ActiveRecord&lt;/li&gt;&lt;li&gt;NHibernate ActiveRecord WCF&lt;/li&gt;&lt;/ul&gt;مدل های دیتابیس و کلاسهای مورد نیاز را تولید می کند که&amp;nbsp; توسط هر دو نسخه Castle ActiveRecord 2.2 یا 3 قابل استفاده است. Castle ActiveRecord از الگوی&amp;nbsp; ActiveRecord پیروی می کند و به صورت توکار از NHibernate برای اجرای کوئری ها استفاده میکند.&lt;br /&gt;الگوی "NHibernate ActiveRecord WCF" اختصاصا برای کار با WCF بهینه سازی شده است، به این صورت که ID جدوال خارجی را نیز در خود نگه میدارد (این کار در حال عادی مرسوم نیست) جهت سهولت ارسال مدل ها در WCF. البته این Id ها باید به صورت دستی مقدار دهی شوند.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LinqToSql&lt;/b&gt;&lt;br /&gt;نسخه متفاوتی از مدل Linq To Sql را تولید می کند. مدل تولید شده از روش برنامه های سه لایه تبعیت می کند. البته توجه شود که فقط دو لایه Bussinuess و DAL در این الگو تولید می شوند. طبق معمول جهت سفارشی سازی کلاسها&amp;nbsp; و متدهای اضافه مد تظر گرفته شده اند.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Entity Framework 4 POCO&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;EF4 POCO &lt;/li&gt;&lt;li&gt;EF4 POCO LINQ &lt;/li&gt;&lt;/ul&gt;مدل های دیتابیس و کلاسهای Entity Framework 4 را به صورت مدل POCO تولید می کند. POCO مخفف Plain Old Clr Object استفاده از روش سفارشی سازی شده برای Entity Framework نسخه 4 است.&lt;br /&gt;الگوی "EF4 POCO LINQ" یک مدل اضافه روش برنامه نویسی سه لایه نیز تولید می کند، که هر دو روش در برنامه قابل استفاده هستند. جهت استفاده از این دو الگو باید حتما مراحل زیر را دنبال کنید.&lt;br /&gt;ابتدا در پروژه باید حتما مدل ایجاد شود، نام مدل باید همنام دیتابیس به علاوه Entities باشد (مثلا TestDbEntities.edmx و TestDbEntities برای نام کلاس).&lt;br /&gt;هنگام تهیه مدل حتما باید گزینه "Pluralize or singularize generated object names" حذف شود. و در نهایت ویرایشگر مدل (Model Designer) مقدار ویژگی "Code Generation Strategy" باید به "None" تغییر داده شود.&lt;br /&gt;پس از طی این مراحل مدل تولیدی قابل استفاده خواهد بود.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3Tier&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;3Tier CSharp&lt;/li&gt;&lt;li&gt;3Tier VB.NET &lt;/li&gt;&lt;/ul&gt;مدل های دیتبایس را جهت استفاده در یک برنامه سه لایه کلاسیک تولید می کند. این الگوها از کلاسهای پایه ADO.Net جهت دسترسی به داده و انجام عملیات استفاده می کنند. همچنین همه عملیات پیش فرض این مدل ها توسط Stored Procedure تولید شده انجام می شود.&lt;br /&gt;به همین دلایل سرعت عملیاتی این مدل بسیار بالا بوده و برای برنامه هایی که نیاز به سرعت زیادی دارند، بسیار مناسب می باشد.&lt;br /&gt;الگوی "3Tier CSharp" علاوه بر موارد ذکر شده از یک مرحله caching اضافه هنگام خواندن اطلاعت بر روی ترتیب رکوردها نیر استفاده می کند. این باعث افزایش کارایی هنگام خواندن حجم عظیمی از داده می شود.&lt;br /&gt;این دو الگو محدودیت های خودشان را نیز دارند، از جمله نیاز به نوشتن هر عملیات جدید به صورت دستی، عدم پشتیبانی از Linq و محدود بودن به SQL Server می توان اشاره کرد.&lt;br /&gt;&lt;br /&gt;جهت اطلاعات بیشتر و مستندات الگوها می توانید به &lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;آدرس پروژه&lt;/a&gt; مراجعه کنید.&lt;br /&gt;الگوها همگی به زبان XML تهیه شده اند و ویرایش آنها کار ساده ای است. در صورتی که درخواست کافی جهت تهیه مستندات برای قالب الگو دریافت کنم، این کار را خواهم کرد.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salardbcodegenerator.svn.codeplex.com/svn/PostImages/MainWindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="293" src="https://salardbcodegenerator.svn.codeplex.com/svn/PostImages/MainWindow.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;پنجره اصلی برنامه&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salardbcodegenerator.svn.codeplex.com/svn/PostImages/ProjectOptions.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="318" src="https://salardbcodegenerator.svn.codeplex.com/svn/PostImages/ProjectOptions.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;پنجره تنظیمات برنامه&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;b&gt;دانلود&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;این پروژه به صورت اوپن سورس و رایگان در آدرس &lt;a href="http://salardbcodegenerator.codeplex.com/" target="_blank"&gt;salardbcodegenerator.codeplex.com&lt;/a&gt; قرار گرفته است.&lt;br /&gt;همچنین کدهای برنامه به صورت آنلاین در &lt;a href="http://salardbcodegenerator.codeplex.com/SourceControl/BrowseLatest" target="_blank"&gt;این آدرس&lt;/a&gt; قابل مشاهده هستند.&lt;br /&gt;&lt;br /&gt;پیشنهادات و ایرادات مشاهده شده از اینجا و یا &lt;a href="http://salardbcodegenerator.codeplex.com/discussions" target="_blank"&gt;صفحه نظرات&lt;/a&gt; پروژه مطرح کنید.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/GnjOrSXigMI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/4551942233726190908/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/05/introducing-salardbcodegenerator.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4551942233726190908" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4551942233726190908" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/GnjOrSXigMI/introducing-salardbcodegenerator.html" title="معرفی SalarDbCodeGenerator" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/05/introducing-salardbcodegenerator.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6427665878609162792</id><published>2012-04-05T15:46:00.000+04:30</published><updated>2012-04-05T15:50:23.509+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="LightDictionary" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">دیکشنری سبک فارسی/انگلیسی</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;مدتی بود که یک دیکشنری ساده برای خودم نوشته بودم که خیلی از نیازهای خودم رو برطرف می کرد. تصمیم گرفتم که کمی روی امکاناتش کار کنم که برای همه قابل استفاده باشه و نتیجه اش شد این برنامه.&lt;br /&gt;اما چرا یک دیکشنری جدید؟ تعداد دیکشنری با امکانات مختلف که خیلی زیاد بود. جواب این سوال در ویژگهای خاص این دیکشنری است:&lt;br /&gt;&lt;br /&gt;ویژگی های این دیکشنری: &lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;ترجمه لغت فارسی به انگلیسی و انگلیسی به فارسی&lt;/li&gt;&lt;li&gt;غلط یاب هوشمند با استفاده از الگوریتم و کتابخانه پیشرفته برای فارسی و انگلیسی&lt;/li&gt;&lt;li&gt;غلط یاب جداگانه جهت تطبیق کلمات یافت نشده برای نمایش معانی کلمات مشابه موجود &lt;/li&gt;&lt;li&gt;بهینه سازی شده برای شروع سریع&amp;nbsp;&lt;/li&gt;&lt;li&gt;نمایش معانی کلمات موجود در حافظه موقت سیستم (Clipboard)&lt;/li&gt;&lt;li&gt;تلفظ کلمات انگلیسی با صدای سیست&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;چند ویژگی خیلی مهم این برنامه که اشاره شد می تونه توجیهی مناسبی برای استفاده از اون با وجود سایر دیکشنری ها باشه.&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;اجرای سریع و نمایش سریع نتایج&lt;/li&gt;&lt;li&gt;وجود چند نوع غلط یاب پیشرفته که کلمات مشابه را نشان می دهند. این موضوع از این جهت مهمه که معمولا کلمات تایپ شده در دیکشنری برای فرد ناآشنا هستند، پس امکان تایپ غلط بسیار زیاد است. متاسفانه اکثر برنامه ها در این زمینه ضعیف عمل می کنند.&lt;/li&gt;&lt;li&gt;نمایش معانی کلمات از clipboard، این مورد هم قبلا در برنامه مثل babylon با روش point-click بسیار سریع و ساده عمل می کردند بسیار مفید بود، اما از زمانی که اکثر برنامه ها از سیستم های جدید نمایش متون استفاده می کنند (Hardware accelerated rendering &amp;amp; ClearType fonts)، دیگه این روش کار ساز نیست و لغت رو باید در حافظه کپی کرد. این برنامه یک قدم سریع برداشته و معنای لغت موجود در حافظه رو نشون میده.&lt;/li&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lightfarsidictionary.svn.codeplex.com/svn/images/SuggestionEnglish.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lightfarsidictionary.svn.codeplex.com/svn/images/SuggestionEnglish.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;صفحه اصلی - نمایش غلط گیر و کلمات مشابه&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lightfarsidictionary.svn.codeplex.com/svn/images/SuggestionFarsiSpellcheck.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lightfarsidictionary.svn.codeplex.com/svn/images/SuggestionFarsiSpellcheck.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;نمایش غلط گیر و کلمات مشابه برای فارسی&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;/b&gt;&lt;span id="goog_1912723673"&gt;&lt;/span&gt;&lt;span id="goog_1912723674"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt; &lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lightfarsidictionary.svn.codeplex.com/svn/images/Prefix.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://lightfarsidictionary.svn.codeplex.com/svn/images/Prefix.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;نمایش معنی نزدیکترین کلمه با اصلاح غلط املایی در اول آن&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;دانلود&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;/ul&gt;قبل از استفاده از این برنامه باید &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=17718" target="_blank"&gt;Microsoft .NET Framework 4&lt;/a&gt; رو در سیستم خود نصب شده داشته باشد.&lt;br /&gt;&lt;br /&gt;برای دانلود برنامه به صفحه آن در codeplex مراجعه کنید، &lt;b&gt;&lt;a href="https://lightfarsidictionary.codeplex.com/" target="_blank"&gt;در این آدرس&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;بررسی مختصر کدها&lt;/b&gt;&lt;br /&gt;این برنامه با زبان #C نوشته شده، رایگان و کدباز تحت MPL2 هست.&lt;br /&gt;کدهای برنامه در آدرس پروژه به صورت آنلاین نیز قابل مشاهده است. &lt;a href="https://lightfarsidictionary.codeplex.com/SourceControl/BrowseLatest" target="_blank"&gt;در اینجا&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;فراخونی با تاخیر و گرم کردن&lt;/b&gt;&lt;br /&gt;گرم کردن یا اصطلاحا Warm-Up علت اصلی سرعت بهینه اجرا برنامه است. به این صورت که در یک thread جداگانه برنامه اقدام به ایجاد یک اتصال به پایگاه داده می کند، این کار قبل از شروع ایجاد فرم صورت می گیرد. به علت خاصیت thread برای اجرای همزمان، این دو کار همزان اجرا می شوند. در thread اصلی برنامه فرم ایجاد شده و thread دیگر اولین اتصال به پایگاه داده که بسیار وقت گیر انجام می شود.&lt;br /&gt;اولین اتصال به پایگاه داده از این جهت مهم است معمولا این اتصال پس از بسته شدن به صورت نیمه فعال باز باقی می ماند و در صورتی که درخواستی مجددا صورت گیرد، بدون نیاز به باز کردن اتصال جدید همین اتصال نیمه فعال، فعال شده و مورد استفاده قرار می گیرد.&lt;br /&gt;&lt;br /&gt;در طی همین مراحل نیز در thread جدید و جداگانه دیگری بانک اطلاعاتی غلط یابها بارگذاری می شود که شامل فارسی و انگلیسی است. بارگذاری این دو بانک نیز زمانبر است ولی به علت استفاده از thread ها این تاخیر های مشاهده نمی شوند.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ابزارهای و کامپوننت های برنامه&lt;/b&gt; &lt;br /&gt;* دیتابیس لغات، از جمله آنهایی هست که دست به دست شده و بالاخره به من رسیده، به همین علت نمی دونم کی زحمت تهیه اش را کشیده.&lt;br /&gt;* کتابخانه غلط یاب &lt;a href="http://nhunspell.sourceforge.net/" target="_blank"&gt;NHunspell&lt;/a&gt;، که الگوریتم پیشرفته آن که به نام &lt;a href="http://en.wikipedia.org/wiki/Hunspell" target="_blank"&gt;Hunspell&lt;/a&gt; در مجموعه نرم افزارهای بسیار زیاد و مشهوری استفاده شده.&lt;br /&gt;* تلفظ کننده متون که توکار در نسخه 4 دات نت است. در برنامه تنظیمات پیش فرض سیستم استفاده شده و در صورت اعمال تغییر در گوینده و صدا و غیره به برنامه نیز اعمال خواهد شد.&lt;br /&gt;* کنترل نمایش دهنده لیست پیشنهادات که مخصوصا برای این برنامه نوشتم؛ به این علت که AutoComplete استاندارد که توسط کنترل ارائه میشه جوابگوی نیاز نبود.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;نکته:&lt;/b&gt;&lt;br /&gt;بانک اطلاعاتی این برنامه Access هست و اگر سیستم 64 بیتی باشد، امکان اتصال به بانک میسر نیست زیرا برای Access فقط درایور 32 بیتی موجود است. راه حل خیلی ساده تنظیم platform برنامه بر روی x86 هست. با این کار کامپایلر زمان اجرای دات نت همیشه برنامه را به صورت 32 بیتی کامپایل می کند. در نهایت امکان دسترسی به دیتابیس هم در سیستم 32 بیتی و هم در 64 بیتی محیا میشه.&lt;br /&gt;&lt;br /&gt;امیدوارم مفید واقع بشه.&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/NnDhbmAAf74" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6427665878609162792/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/04/light-farsi-dictionary.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6427665878609162792" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6427665878609162792" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/NnDhbmAAf74/light-farsi-dictionary.html" title="دیکشنری سبک فارسی/انگلیسی" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/04/light-farsi-dictionary.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6816625660381031760</id><published>2012-02-25T13:04:00.000+03:30</published><updated>2012-02-25T13:22:40.865+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="Download" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">ماژول دانلودر برای ASP.NET</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="rtl"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;مقدمه&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;بیشتر مواقع لازم است تا بر روی دانلود های وبسایت نظارت انجام شود,  برای مثال فقط اعضا اجازه دانلود فایلی را داشته و یا دانلود یک شمارنده  داشته باشد و غیره. در حالت عادی برنامه نویسان فایل را مستقیم به خروجی می  نویسند. این روش کار را انجام داده و به نتیجه لازم نیز می رسد اما یک  مزیت بزرگ را از دست می رود. آن مزیت قابلیت Resumable Downloading  است که به طور خلاصه به کاربر این اجازه را می دهد که در هر زمان دانلود را  متوقف کرده و پس از شروع مجدد از همان محل قبلی ادامه دانلود را  انجام دهد. این موارد بیشتر در فایلهای حجیم صادق است و مورد نیاز می شود.&lt;br /&gt;همچنین یک نیاز دیگر هم پیش می آید و آن محدود کردن پهنای باند مصرفی  برای دانلود است. که در حالت عادی و ارسال فایل از طریق دستورات asp.net  این کار امکان پذیر نیست.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;معرفی&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;برای رفع مشکلات و محدودیت های مطرح شده ماژولی را آماده کرده ام که با  استفاده از آنها میتوانید کنترل نسبتا کاملی بر دانلود کاربر داشته باشید.&lt;br /&gt;مجموعه کلاسهای ResumableDownload چندین کار مخلتف را انجام می دهد که با کنار هم قرار دادن آنها به مقصودمان می رسیم.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;طریقه استفاده&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;قبل از هرکاری باید درخواست ورودی کاربر بررسی شده و دقیقا بدانیم که کدام فایل مد نظر است. سپس حجم آن را بدست بیاوریم.&lt;br /&gt;اولین  قدیم شناسایی درخواست کاربر است. این درخواست معمولا توسط یک نرم افزار  دانلودر مانند IDM انجام شده است. هدف در اینجا شناسایی هدر های ارسالی است  که توسط یکی از متدهای کلاس HeadersParser انجام می شود. &lt;br /&gt;قدم دوم باید  اطلاعات فایلی که قرار است دانلود بشود توسط کلاس DownloadDataInfo جمع  آوری شود. یکی از سازنده های کلاس اطلاعات فایل را دریافت می کند باید مورد  استفاده قرار گیرد. سپس خروجی متد مورد استفاده از HeadersParser باید به  کلاس DownloadDataInfo اطلاع داده شود و این کار با استفاده از متد  InitializeRanges آن انجام می شود.&lt;br /&gt;قدم سوم بررسی صحت درخواست دانلود است. این کار توسط متد های Validate   کلاس HeadersParser انجام می شود. این کار از این جهت مهم است که ممکن است  فایل در سرور تغییر داده شده باشد ولی کاربر سعی دارد تا همچنان به دانلود  نسخه قدیمی که ناقص انجام شده بود ادامه دهد.&lt;br /&gt;قدم اختیاری در این بین اعمال محدودیت در پهنای باند دانلود فایل برای  کاربر است. این محدودیت توسط کلاس UserSpeedLimitManager قابل اعمال است.  در آزمایشاتی که من انجام دادم مشخص شد که در هر صورت استفاده از این کلاس  بار زیادی را از دوش سرور بر می دارد. این بدان علت است که در حالت بدون  محدودیت سرور تمام فایل را از دیسک خوانده و به یکباره به بافر انتظار می  فرستد, این عملیات یکباره بار زیادی بر سرور وارد می کند. همچنین مشخص شد  که گذاشتن محدودیت حتی در حد 2MB/s می تواند تاثیر زیادی در افزایش بازدهی  سرور داشته باشد.&lt;br /&gt;قدم نهایی ارسال فایل به کاربر طبق درخواست وی که از طرق متد ProcessDownload کلاس DownloadProcess انجام می شود.&lt;br /&gt;&lt;br /&gt;در ادامه یک مثال کامل را مشاهده می کنید. در این مثال نام فایل به عنوان  ورودی ارسال می شود, سیستم این فایل را از مسیر برنامه یافته و برای کاربر  ارسال می کند.&lt;br /&gt;برای مثال آدرس به این صورت خواهد بود: http://localhost:5200/ResumableDownload.ashx?file=sample.zip&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// 50 KB limit&lt;br /&gt;const int DownloadLimit = 50 * 1024;&lt;br /&gt;&lt;br /&gt;public void ProcessRequest(HttpContext context)&lt;br /&gt;{&lt;br /&gt; // Accepting user request&lt;br /&gt;&lt;br /&gt; // reading the query&lt;br /&gt; var fileNameQuery = context.Request.QueryString["file"];&lt;br /&gt;&lt;br /&gt; // validating the request&lt;br /&gt; if (string.IsNullOrEmpty(fileNameQuery))&lt;br /&gt; {&lt;br /&gt;  InvalidRequest(context, "Invalid request! Specify file name in url e.g.: ResumableDownload.ashx?file=sample.zip");&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // the physical file address path&lt;br /&gt; var fileName = context.Server.MapPath(fileNameQuery);&lt;br /&gt; if (!File.Exists(fileName))&lt;br /&gt; {&lt;br /&gt;  InvalidRequest(context, "File does not exists!");&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // reading file info&lt;br /&gt; var fileInfo = new FileInfo(fileName);&lt;br /&gt; var fileLength = fileInfo.Length;&lt;br /&gt;&lt;br /&gt; // Download information class&lt;br /&gt; var downloadInfo = new DownloadDataInfo(fileName);&lt;br /&gt;&lt;br /&gt; // Reading request download range&lt;br /&gt; var requestedRanges = HeadersParser.ParseHttpRequestHeaderMultipleRange(context.Request, fileLength);&lt;br /&gt;&lt;br /&gt; // apply the ranges to the download info&lt;br /&gt; downloadInfo.InitializeRanges(requestedRanges);&lt;br /&gt;&lt;br /&gt; string etagMatched;&lt;br /&gt; int outcomeStausCode = 200;&lt;br /&gt;&lt;br /&gt; // validating the ranges specified&lt;br /&gt; if (!HeadersParser.ValidatePartialRequest(context.Request, downloadInfo, out etagMatched, ref outcomeStausCode))&lt;br /&gt; {&lt;br /&gt;  // the request is invalid, this is the invalid code&lt;br /&gt;  context.Response.StatusCode = outcomeStausCode;&lt;br /&gt;&lt;br /&gt;  // show to the client what is the real ETag&lt;br /&gt;  if (!string.IsNullOrEmpty(etagMatched))&lt;br /&gt;   context.Response.AppendHeader("ETag", etagMatched);&lt;br /&gt;&lt;br /&gt;  // stop the preoccess&lt;br /&gt;  // but don't hassle with error messages&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // user ID, or IP or anything you use to identify the user&lt;br /&gt; var userIP = context.Request.UserHostAddress;&lt;br /&gt;&lt;br /&gt; // limiting the download speed manager and the speed limit&lt;br /&gt; UserSpeedLimitManager.StartNewDownload(downloadInfo, userIP, DownloadLimit);&lt;br /&gt;&lt;br /&gt; // It is very important to destory the DownloadProcess object&lt;br /&gt; // Here the using block does it for us.&lt;br /&gt; using (var process = new DownloadProcess(downloadInfo))&lt;br /&gt; {&lt;br /&gt;  // start the download&lt;br /&gt;  var state = process.ProcessDownload(context.Response);&lt;br /&gt;&lt;br /&gt;  // checking the state of the download&lt;br /&gt;  if (state == DownloadProcess.DownloadProcessState.PartFinished)&lt;br /&gt;  {&lt;br /&gt;   // all parts of download are finish, do something here!&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;دانلود&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;جهت دانلود از &lt;a href="http://www.4shared.com/zip/_f_EtfKd/SalarResumableDownload.html" target="_blank"&gt;این آدرس&lt;/a&gt; و یا &lt;a href="https://dl.dropbox.com/u/52703032/blog.salarcode.com/Salar.ResumableDownload.zip" target="_blank"&gt;این آدرس&lt;/a&gt; اقدام کنید.&lt;br /&gt;کدهای این پروژه به صورت آنلاین در &lt;a href="https://salarblogsources.svn.codeplex.com/svn/Projects/Salar.ResumableDownload/" target="_blank"&gt;این آدرس&lt;/a&gt; در دسترس هستند. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/SalarResumableDownload/SalarResumableDownload.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/SalarResumableDownload/SalarResumableDownload.png" width="308" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;چندین کانکشن همزمان برای دانلود در حالی که کاربر به 50KB/s محدود شده است&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;مشکلات احتمالی&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;یک مشکل که فعلا حل نشده است و مربوط به محدودیت دانلود اعمال شده است که  ممکن است دقیق اعمال نشود, برای مثال اگر محدودیت 50KB/s را اعمال کرده باشید  سرعت دانلود کاربر بین 30 تا 60 در نوسان خواهد بود.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;کدهای استفاده شده از سایر نویسندگان&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;کلاس ThrottledStream جهت اعمال محدودیت در پهنای باند مصرفی. &lt;a href="http://www.codeproject.com/Articles/18243/Bandwidth-throttling" target="_blank"&gt;اینجا&lt;/a&gt;.&lt;br /&gt;نسخه ابتدایی و قدیمی ZipHandler در زبان vb.net که چند سال پیش این ماژول ها بر اساس آن تبدیل و تهیه شد. &lt;a href="http://www.devx.com/dotnet/Article/22533/1954" target="_blank"&gt;اینجا&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/RUWH9pYTsFc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6816625660381031760/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/02/aspnet-resumable-downloading.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6816625660381031760" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6816625660381031760" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/RUWH9pYTsFc/aspnet-resumable-downloading.html" title="ماژول دانلودر برای ASP.NET" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/02/aspnet-resumable-downloading.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-1049301243209639458</id><published>2012-01-25T17:13:00.002+03:30</published><updated>2012-01-25T17:19:25.423+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">نمایش صحیح متون فارسی در جهت چپ به راست (بخش دوم)</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;a href="http://blog.salarcode.com/2010/04/blog-post_3023.html" target="_blank"&gt;قبلا&lt;/a&gt; کدی را برای تصحیح نمایش صحیح متون فارسی در محیطهایی که فارسی یا یونیکد را پشتیبانی نمی کنند نوشته بودم. آن تکه کد مشکلاتی داشت که بر آن شدم تا مجددا کلاسی را برای انجام صحیح این کار تهیه کنم که مشکلات قبلی را نداشته باشد.&lt;br /&gt;قبل از استفاده از این کلاس باید مطمئن باشید که کامپوننت یا برنامه مورد نظر شما از یونیکد پشتیبانی نمی کند. اما در صورتی که از یونیکد پشتیبانی کرد بهتر است که از راه حل یونیکد استفاده کنید.&lt;br /&gt;در راه حل یونیکد که با استفاده از تابع CorrectPersinRtlToDisplayLtrUnicode در دسترس است کارکاکتر RTL Embedding را به ابتدای رشته اضافه می کند. وجود این کاراکتر سبب خواهد شد یا رشته مورد به صورت راست به چپ و درست نمایش داده شود و در عین حال نیز چپ چین باقی بماند (Aligned to left).&lt;br /&gt;در صورتی که از &lt;u&gt;عدم&lt;/u&gt; پشتیبانی یونیکد مطمئن هستید از تابع CorrectPersinRtlToDisplayLtr استفاده کنید. این تابع ترتیت کلمات در متون فارسی/انگلیسی را طوری جابجا می کند که متن راست به چپ بتواند به درستی در محیط چپ به راست نیز نمایش داده شود. توجه کنید متن تبدیل شده قابل برگشت نیست.&lt;br /&gt;&lt;b&gt;نکته مهم&lt;/b&gt; در مورد اعداد. به علت اینکه رفتار اعداد به RTL یا LTR بودن محیط وابسته است در برخی شرایط خاص امکان تصحیح نمایش آنها برای محیط چپ به راست وجود ندارد. این استثنا در صورتی رخ می دهد که عددی در &lt;u&gt;ابتدای جمله&lt;/u&gt; و &lt;u&gt;با فاصله&lt;/u&gt; از کلمه بعدی قرار بگیرد.&lt;br /&gt;مثال: راست به چپ: 1 تست 2&lt;br /&gt;&lt;div dir="ltr" style="direction: ltr !important; text-align: left !important;"&gt;1 تست 2&lt;/div&gt;به هر ترتیب در صورت عدم وجود فاصله بعد از اولین عدد مشکلی پیش نخواهد آمد.&lt;br /&gt;&lt;b&gt;نکته:&lt;/b&gt; برای سهولت تابعی نیز برای تبدیل اعداد به معادل فارسی آنها و بالعکس که البته یونیکد نیز هستند تعبیه شده است. فراموش نشود که برای محیط یونیکد از تابع یونیکد استفاده کنید.&lt;br /&gt;&lt;br /&gt;کدهای کلاس و برنامه مورد نظر در ادامه قابل دریافت است.&lt;br /&gt;&lt;span id="goog_1626934625"&gt;&lt;/span&gt;&lt;span id="goog_1626934626"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/PersianLeftToRight/PersianLeftToRightTestProgram.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/PersianLeftToRight/PersianLeftToRightTestProgram.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;نتیجه اجرای کلاس تبدیل&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;دریافت کلاس و برنامه PersianLeftToRight از &lt;a href="http://www.4shared.com/zip/7uskem7W/SalarPersianLeftToRightCorrect.html" target="_blank"&gt;اینجا&lt;/a&gt; و یا &lt;a href="https://dl.dropbox.com/u/52703032/blog.salarcode.com/Salar.PersianLeftToRightCorrection.zip" target="_blank"&gt;اینجا&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;کدهای پروژه به صورت آنلاین &lt;a href="https://salarblogsources.svn.codeplex.com/svn/Projects/PersianLeftToRightCorrection/" target="_blank"&gt;از اینجا&lt;/a&gt; نیز قابل مشاهده است.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/PwUHxifJ1Qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/1049301243209639458/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/01/persian-text-rtl-correction.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/1049301243209639458" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/1049301243209639458" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/PwUHxifJ1Qo/persian-text-rtl-correction.html" title="نمایش صحیح متون فارسی در جهت چپ به راست (بخش دوم)" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/01/persian-text-rtl-correction.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6493717945428896539</id><published>2012-01-10T22:24:00.000+03:30</published><updated>2012-01-10T22:36:59.307+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><title type="text">الگوریتم ژنتیک برای n وزیر و الگوریتم های جستجو</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;چندی قبل برای یکی از همکاران روی پروژه الگوریتم ها کار کردیم که یکی مربوط به الگوریتم ژنتیک برای مسئله n وزیر است و دیگری الگوریتمهای جستجوی BFS , DSF و UCF است.&lt;br /&gt;عملکرد تمامی قسمت ها توضیح داده شده و به صورت کامنت برای هر دستور نوشته شده است, همچنین سعی شده که کدها کمترین پیچیدگی رو داشته باشه تا برای دانشجو قابل درک بوده و مفید واقع بشه.&lt;br /&gt;&lt;div style="text-align: right;"&gt;امیدوارم از این پروژه ها در جهت صحیح استفاده شده و مفید واقع بشه. زبان استفاده شده C# است.&lt;/div&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/AIStudent/AIStudentGeneticAlgorithm-Main.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/AIStudent/AIStudentGeneticAlgorithm-Main.png" width="282" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;تصویر برنامه الگوریتم ژنتیک&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://salarblogsources.svn.codeplex.com/svn/PostImages/AIStudent/AIStudentSearch-Main.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="https://salarblogsources.svn.codeplex.com/svn/PostImages/AIStudent/AIStudentSearch-Main.png" width="283" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;تصویر برنامه الگوریتم های جستجو&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;دانلود &lt;/b&gt;الگوریتم ژنتیک برای n وزیر از &lt;a href="http://www.4shared.com/rar/01Rh8duV/NMinister-GeneticAlgorithm.html" target="_blank"&gt;اینجا&lt;/a&gt; یا &lt;a href="https://dl.dropbox.com/u/52703032/blog.salarcode.com/NMinister-GeneticAlgorithm.rar" target="_blank"&gt;اینجا&lt;/a&gt;&lt;br /&gt;&lt;b&gt;دانلود &lt;/b&gt;الگوریتمهای جستجوی BFS , DSF و UCF  از &lt;a href="http://www.4shared.com/rar/QVFL5CR-/AISearchAlgorithms.html" target="_blank"&gt;اینجا&lt;/a&gt; یا &lt;a href="https://dl.dropbox.com/u/52703032/blog.salarcode.com/AISearchAlgorithms.rar" target="_blank"&gt;اینجا&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;لینکهای مفید&lt;/b&gt;:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;&lt;a href="http://artificial.ir/intelligence/thread619.html" target="_blank"&gt;حل مسئله 8 وزير با روش هاي مختلف&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fa.wikipedia.org/wiki/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85_%DA%98%D9%86%D8%AA%DB%8C%DA%A9" target="_blank"&gt;الگوریتم ژنتیک&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.aghazeh.com/artificial-intelligence-book/710-genetic-algorithm-ebook-farsi.html" target="_blank"&gt;دانلود کتاب جامع پیرامون الگوریتمهای ژنتیک به زبان فارسی&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://barnamenevis.org/showthread.php?41308-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%B4%D8%AA-%D9%88%D8%B2%DB%8C%D8%B1" target="_blank"&gt;الگوریتم هشت وزیر&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fa.wikipedia.org/wiki/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85_%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C_%D8%A7%D9%88%D9%84_%D8%B3%D8%B7%D8%AD" target="_blank"&gt;الگوریتم جستجوی اول سطح (BFS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fa.wikipedia.org/wiki/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85_%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C_%D8%B9%D9%85%D9%82_%D8%A7%D9%88%D9%84" target="_blank"&gt;الگوریتم جستجوی عمق اول&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/u_TwCFNfSWc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6493717945428896539/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2012/01/ai-genetic-algorithm-nminister-and.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6493717945428896539" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6493717945428896539" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/u_TwCFNfSWc/ai-genetic-algorithm-nminister-and.html" title="الگوریتم ژنتیک برای n وزیر و الگوریتم های جستجو" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2012/01/ai-genetic-algorithm-nminister-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6174920651019655212</id><published>2011-12-18T09:20:00.002+03:30</published><updated>2011-12-18T10:08:29.269+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenSource" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">WebP و آینده تصاویر وب</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="rtl" style="font-family: tahoma,sans-serif;"&gt;سپتامبر سال میلادی گذشته بود که &lt;a href="http://code.google.com/speed/webp/" target="_blank"&gt;گوگل&lt;/a&gt; فرمت تصاویر جدید که برای استفاده در وب تهیه شده بود را معرفی کرد. این فرمت &lt;a href="http://en.wikipedia.org/wiki/Webp" target="_blank"&gt;WebP&lt;/a&gt; مخفف Web Picture نام گرفت (تلفظ شود Web Pe) و به صورت Open Source منتشر شد. اکنون  با گذشت نزدیک به دو سال از آن زمان این فرمت پیشرفت های بسیار زیادی کرده  به طوری که پتانسیل بالایی برای محبوب شدن در وب را دارد.&lt;br /&gt;تصاویر کنونی مورد استفاده در وب شامل فرمت های محدود jpg، png و gif هستند که هر کدام محدودیتهای خاص خودشان را دارند.&lt;br /&gt;اما اینکه WebP چه ویژگی هایی دارد که باعث می شود جایگزین هر سه فرمت شود در ادامه توضیحات می خوانید:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;جایگزین برای &lt;a href="http://en.wikipedia.org/wiki/JPEG" target="_blank"&gt;Jpeg&lt;/a&gt;:&lt;/b&gt; این استاندارد در سال 1992 تدوین شد و آخرین نسخه این استاندارد مربوط به  سال 1998 است. ویژگی اصلی jpeg کاهش حجم تصاویر با کاهش کیفیت تصویر است، که البته  این کیفیت متغیر بوده و قابل تنظیم است (در اصلاح lossy format). فرمت WebP  نیز با ارائه حالت lossy با الگوریتم های بهتر و فشرده سازی بیشتر می  تواند جایگزین مناسبی برای این فرمت باشد. در مقایسه با Jpeg فرمت WebP  میتواند 24 تا34 درصد حجم تصاویر را بیشتر کاهش دهد در حالی که کیفیت تصاویر کمتر کاهش می یابد. &lt;a href="http://code.google.com/speed/webp/docs/webp_study.html" target="_blank"&gt;منبع&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;جایگزین برای &lt;a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics" target="_blank"&gt;Png&lt;/a&gt;:&lt;/b&gt; اولین نسخه این استاندارد در سال 1996 تهیه شد و پس از تبدیل شدن به  استاندارد عمومی در سال 2003 آخرین نسخه آن مربوط به سال 2004 است. ویژگی  اصلی این فرمت ارائه یک کانال جداگانه برای شفافیت (alpha channel) هست که  امکان ایجاد تصاویر شفاف و با قابلیت سایه روشن را می دهد. همچنین فشرده  سازی این فرمت تصویر بدون کاهش کیفیت بوده و lossless نام برده می شود. در  نسخه اخیر که از WebP &lt;a href="http://blog.chromium.org/2011/11/lossless-and-transparency-encoding-in.html" target="_blank"&gt;ارائه شد&lt;/a&gt; دو قابلیت alpha channel و lossless compression نیز به آن اضافه شده است.  همچنین با توجه الگوریتم های بهتر فشرده سازی که در فرمت webP وجود دارد  توانسه تا 45 درصد بهبود در مقایسه با فرمتهای عادی Png دست پیدا کند.  همچنین در مقابل تعدادی ابزارهای جاداگانه که فشرده سازی بیشتری را برای  png بدست می آوردند نیز تا 25 درصد بهبود حاصل شده است. &lt;a href="http://blog.chromium.org/2011/11/lossless-and-transparency-encoding-in.html" target="_blank"&gt;منبع&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;جایگزین برای &lt;a href="http://en.wikipedia.org/wiki/Gif" target="_blank"&gt;Gif &lt;/a&gt;و &lt;a href="http://en.wikipedia.org/wiki/Animated_Portable_Network_Graphics" target="_blank"&gt;A&lt;/a&gt;&lt;a href="http://en.wikipedia.org/wiki/Animated_Portable_Network_Graphics" target="_blank"&gt;Png&lt;/a&gt;:&lt;/b&gt; فرمت gif که برای نمایش انیمیشن استفاده می شود نیز یک فرمت قدیمی است اولین  بار در سال 1989 تهیه شد و آخرین نسخه آن با بهبود های اندک مربوط به سال  2004 است. مهمترین ویژگی این فرمت نمایش انیمیشن است و البته مهمترین ضعف  آن محدود بودن تعداد رنگ به 255 رنگ است. به همین علت بود که موزیلا جهت  ایجاد انیمیشن های بهتر فرمت APng را از روی png ایجاد کرد تا علاوه بر  داشتن تمامی ویژگی های آن انیمیشن نیز باشد. &lt;br /&gt;&lt;br /&gt;چند ماه قبل ویژگی انیمیشن به فرمت WebP نیز افزوده شد. که علاوه بر داشتن ویژگی های مزبور فشرده سازی بهتری را نیز به همراه دارد. &lt;a href="https://groups.google.com/a/webmproject.org/group/webp-discuss/browse_thread/thread/4ab76cbde89e6ade/23512e5a1ed1dab0?lnk=raot" target="_blank"&gt;منبع&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;با این اوصاف در مجموع تمامی ویژگی هایی که سه فرمت نام برده شده داشتند  در یک فرمت جمع و مهیا شده است. با توجه به اینکه این فرمت به صورت فعالی  از طرف گوگل در حال توسعه است آینده خوبی برای آن می توان متصور شد.&lt;br /&gt;در حال حاظر ابزار های محدودی تهیه این فرمت را پشتیبانی می کنند و نرم  افزارهای کمی هم نمایش آن را. البته هدف این فرمت وب است و این مرورگر ها  هستند که با پشتبانی از آن بر محبوبیتش خواهند افزود. در حال حاضر  مرورگرهای Chrome و Opera به طور رسمی WebP را پشتیبانی می کنند.&lt;br /&gt;&lt;br /&gt;فراگیر شدن WebP به عوامل مختلفی بستگی دارد ولی در حال حاظر و در شرایط کنونی بعید می رسد این اتفاق زودتر از 3 تا 6 سال آینده بیافتد.&lt;br /&gt;&lt;br /&gt;لینک ها مفید:&lt;br /&gt;&lt;ul style="text-align: right;"&gt;&lt;li&gt;گالری تصاویر تهیه شده با WebP و مقایسه آنها با فرمت های مختلف &lt;a href="http://code.google.com/speed/webp/gallery1.html" target="_blank"&gt;اینجا&lt;/a&gt; و &lt;a href="http://code.google.com/speed/webp/gallery2.html" target="_blank"&gt;اینجا&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/speed/webp/download.html" target="_blank"&gt;مبدل خط فرمان این فرمت&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://muizelaar.blogspot.com/2011/04/webp.html" target="_blank"&gt;تصمیم موزیلا برای عدم پشتیبانی از این فرمت&lt;/a&gt; (مربوط به قبل از پیاده سازی alpha و lossless می شود)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/O2MdPcNYjQ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6174920651019655212/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2011/12/webp-future-of-web-image-formats.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6174920651019655212" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6174920651019655212" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/O2MdPcNYjQ8/webp-future-of-web-image-formats.html" title="WebP و آینده تصاویر وب" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2011/12/webp-future-of-web-image-formats.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-4039108432683901315</id><published>2011-12-14T23:18:00.001+03:30</published><updated>2011-12-14T23:20:56.586+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Development" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">فونت tahoma برای بلاگر</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;اگر فونت بلاگر شما رو هم اذیت می کنه می تونید از اسکریپتی که برای من منظور تهیه کردم استفاده کنید.&lt;br /&gt;&lt;br /&gt;ابتدا افزونه Greasemonkey رو در فایرفاکس نصب کنید: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/" target="_blank"&gt;از اینجا&lt;/a&gt;&lt;br /&gt;سپس از صفحه اسکریپت دکمه install رو بزنید و تمام: &lt;a href="http://userscripts.org/scripts/show/119772" target="_blank"&gt;از اینجا&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;اسکریپتهای بسیار متنوع و زیادی برای تغییر ظاهر و افزودن عملکرد به سایتها وجود دارد که کافی هست کلمه مورد نظرتون رو در سایت جستجو کنید. وبسایت &lt;a href="http://userscripts.org/" target="_blank"&gt;UserScripts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;تعدادی اسکریپت مرتبط:&lt;br /&gt;&lt;a href="http://userscripts.org/scripts/show/100760" target="_blank"&gt;گودرفارسی&lt;/a&gt;&lt;br /&gt;&lt;a href="http://userscripts.org/scripts/show/106428" target="_blank"&gt;Google Plus Persian&lt;/a&gt;&lt;br /&gt;&lt;a href="http://userscripts.org/scripts/show/93471" target="_blank"&gt;Friendfeed Font Change&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;پ.ن: اگر از کارکرد یک اسکریپت مطمئن نیستید، بی جهت نصبش نکنید، ممکن است کدهای مخرب داشته باشه. &lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/mdCCO5DQBzY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/4039108432683901315/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2011/12/tahoma-for-blogger.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4039108432683901315" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4039108432683901315" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/mdCCO5DQBzY/tahoma-for-blogger.html" title="فونت tahoma برای بلاگر" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2011/12/tahoma-for-blogger.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-4788312968819003765</id><published>2011-12-12T12:11:00.000+03:30</published><updated>2011-12-12T12:12:26.220+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><title type="text">تعدادی Extension Method برای لیست ها</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;جهت سهولت در کار با لیست ها و مجموعه ها تعدادی متد اضافه شونده (Extension Method) رو همیشه استفاده می کنم. تعدادی از اونها جمع بندی کردم که در ادامه قابل دانلود است.&lt;br /&gt;&lt;br /&gt;لیست متد ها برای کار با لیست ها:&lt;br /&gt;&lt;pre dir="ltr" style="text-align: left;"&gt;void &lt;span style="color: #38761d;"&gt;ForEachAction&lt;/span&gt;&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; enumerable, Action&amp;lt;T&amp;gt; action)&lt;br /&gt;void &lt;span style="color: #38761d;"&gt;AddRange&lt;/span&gt;&amp;lt;T&amp;gt;(this ICollection&amp;lt;T&amp;gt; collection, IEnumerable&amp;lt;T&amp;gt; enumerable)&lt;br /&gt;void &lt;span style="color: #38761d;"&gt;RemoveFromIList&lt;/span&gt;&amp;lt;TSource&amp;gt;(this IList&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, bool&amp;gt; predicate)&lt;br /&gt;ObservableCollection&amp;lt;T&amp;gt; &lt;span style="color: #38761d;"&gt;ToObservableCollection&lt;/span&gt;&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source)&lt;br /&gt;TSource &lt;span style="color: #38761d;"&gt;FirstOrDefaultFast&lt;/span&gt;&amp;lt;TSource&amp;gt;(this IList&amp;lt;TSource&amp;gt; list, Func&amp;lt;TSource, bool&amp;gt; predicate)&lt;br /&gt;int &lt;span style="color: #38761d;"&gt;FirstIndexOf&lt;/span&gt;&amp;lt;T&amp;gt;(this IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, bool&amp;gt; predicate)&lt;br /&gt;void &lt;span style="color: #38761d;"&gt;RemoveFirst&lt;/span&gt;&amp;lt;T&amp;gt;(this IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, bool&amp;gt; predicate)&lt;br /&gt;void &lt;span style="color: #38761d;"&gt;RemoveLast&lt;/span&gt;&amp;lt;T&amp;gt;(this IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, bool&amp;gt; predicate)&lt;br /&gt;T &lt;span style="color: #38761d;"&gt;MinValue&lt;/span&gt;&amp;lt;T&amp;gt;(this IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, int&amp;gt; function)&lt;br /&gt;T &lt;span style="color: #38761d;"&gt;MinValue&lt;/span&gt;&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; enumerable, Func&amp;lt;T, int&amp;gt; function)&lt;br /&gt;T &lt;span style="color: #38761d;"&gt;MaxValue&lt;/span&gt;&amp;lt;T&amp;gt;(this IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, int&amp;gt; function)&lt;br /&gt;T &lt;span style="color: #38761d;"&gt;MaxValue&lt;/span&gt;&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; enumerable, Func&amp;lt;T, int&amp;gt; function)&lt;/pre&gt;لیست سایر متد ها:&lt;/div&gt;&lt;pre dir="ltr" style="text-align: left;"&gt;DateTime &lt;span style="color: #38761d;"&gt;ToEndTimeOfDay&lt;/span&gt;(this DateTime dateTime)&lt;br /&gt;DateTime &lt;span style="color: #38761d;"&gt;ToStartTimeOfDay&lt;/span&gt;(this DateTime dateTime)&lt;br /&gt;string &lt;span style="color: #38761d;"&gt;GetDescription&lt;/span&gt;(this Enum value)&lt;/pre&gt;تقریبا از اسامی اونها مشخص هست که چه کاری انجام می دهند. علاوه بر این برای هر کدام یک توضیح هم جهت سهولت استفاده نوشتم.&lt;br /&gt;&lt;br /&gt;این کلاسها رو از اینجا دانلود کنید: &lt;a href="http://www.4shared.com/file/m1Jk2gZE/SalarHelperExtensions.html" target="_blank"&gt;&lt;b&gt;دانلود&lt;/b&gt;&lt;/a&gt; و یا &lt;a href="https://dl.dropbox.com/u/52703032/blog.salarcode.com/Salar.HelperExtensions.7z" target="_blank"&gt;&lt;b&gt;دانلود&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;لینک سایر متد ها:&lt;br /&gt;&lt;a href="http://datetimeextensions.codeplex.com/" target="_blank"&gt;متدهای اضافه شونده برای DateTime&lt;/a&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: right;"&gt;&lt;a href="http://stackoverflow.com/questions/1847427/method-signature-for-ilistt-split-extension-method" target="_blank"&gt;IList&amp;lt;T&amp;gt;.Split()&lt;/a&gt;&lt;/div&gt;&lt;a href="http://dpatrickcaldwell.blogspot.com/2009/03/more-ilist-extension-methods.html" target="_blank"&gt;متد هایی برای مرتب سازی IList&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.sedodream.com/PermaLink,guid,e915ecf8-2189-416f-8ca1-e1602414c079.aspx" target="_blank"&gt;IList Randomization&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/matthieu/archive/2009/04/01/how-to-use-linq-extension-methods-on-non-generic-ienumerable.aspx" target="_blank"&gt;اضافه شونده ها برای IEnumrable غیر جتریک&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/dNSWBx8wN6w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/4788312968819003765/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2011/12/helper-extension-methods.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4788312968819003765" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4788312968819003765" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/dNSWBx8wN6w/helper-extension-methods.html" title="تعدادی Extension Method برای لیست ها" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2011/12/helper-extension-methods.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-5219146944610348430</id><published>2011-12-12T10:03:00.001+03:30</published><updated>2011-12-12T10:34:50.594+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="بدون دسته بندی" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">ادامه در دامنه شخصی</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;پس از این وقفه طولانی وبلاگ به دامنه شخصی انتقال دادم. &lt;br /&gt;آدرس وبلاگ از این به بعد &lt;a href="http://blog.salarcode.com/"&gt;blog.salarcode.com&lt;/a&gt; هست.&lt;br /&gt;آدرس فید وبلاگ تغییری نکرده و همچنان از طریق &lt;a href="http://feeds2.feedburner.com/salarblog" target="_blank"&gt;feeds2.feedburner.com/salarblog&lt;/a&gt; در دسترس است. &lt;br /&gt;&lt;br /&gt;در آینده در فرصت های مناسب که اگه زنده بودیم، کارها و کامپوننت های خودم که پراکند بود رو در &lt;a href="http://www.salarcode.com/" target="_blank"&gt;وبسایتم&lt;/a&gt; قرار می دم.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/jklR7g2s1aA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/5219146944610348430/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2011/12/continue-on-personal-domain.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5219146944610348430" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5219146944610348430" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/jklR7g2s1aA/continue-on-personal-domain.html" title="ادامه در دامنه شخصی" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2011/12/continue-on-personal-domain.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-7010454206720832569</id><published>2010-11-16T11:40:00.000+03:30</published><updated>2011-12-08T12:13:46.596+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="حرفه من" /><category scheme="http://www.blogger.com/atom/ns#" term="Bug" /><title type="text">باگ خوب یا بد؟</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="software-bug" class="size-full wp-image-1102" height="84" src="http://salarblog.files.wordpress.com/2010/11/software-bug.jpg" title="software-bug" width="126" /&gt;&lt;/div&gt;در ادامه داستانی رو در مورد یکی از پروژه هایی که انجام دادیم و به نکته جالبی که برخوردم رو خواهید خوند.&lt;br /&gt;&lt;br /&gt;مدتی قبل بر روی تعویض یکی از نرم افزارهای یک اداره دولتی مشغول رایزنی بودیم. نرم افزار مربوطه با فاکس پرو و تحت داس نوشته شده بود. بحث بر سر انتقال اطلاعات از آن نرم افزار به نرم افزار جدید بود و لازم بود تا حتما فرمت ذخیره سازی و نام جداول و فیلدهای آن مشخص شود. دلیل این هم که ما نمی توانستیم چنین کاری انجام دهیم عدم نام گذاری صحیح دیتابیس بود. به طور مثال نام یک جدول WRK و نام چند فیلد اول مشخص و بقیه با اسامی مانند F1 تا F20 نام گذاری شده بودند. و البته جالبتر اینکه این نرم افزار در چند شعبه و همچنین شهر های مجاور هم مورد استفاده قرار دارد.&lt;br /&gt;&lt;br /&gt;تا اینجای کار هنوز مقصود من نیست و داشتیم به سازشان می رقصیدیم. بحث سر فراخوانی نویسنده این برنامه برای توضیح عملکرد دیتابیس برای انجام انتقال بود که یکی از کارکنان به نکته عجیبی اشاره کرد.&lt;br /&gt;&lt;br /&gt;ایشون گفت که برنامه مربوطه معمولا هر 2 یا 3 ماه یکبار دچار مشکل اساسی می شود و مجبور به فراخوانی نویسنده برای رفع مشکل هستیم. اینطور که این کارمند می گفت برای هر پشتیبانی هم معمولا مبلغی رو دریافت می کند. این رو بسط بدید به تمامی شعبه ها! در این میان ظاهرا اداره با نفر مربوطه قبلا تماس گرفته بود تا با ما همکاری نماید اما ایشان برای انجام همکاری را منوط به تمدید قراردادشان به مدت یک سال دیگر کرده بودند.&lt;br /&gt;&lt;br /&gt;نکته همینجاست، یعنی یک باگ ناقابل می تونه این هم درآمد زا باشد. یعنی با نوشتن یک باگ هدفمند و تنظیم قرارداد زیرکانه می توان کسب درآمد کرد؟ البته این ایده پلید است و دو از اخلاق حرفه ای اما چه تظمینی وجود دارد که کسی چنین کاری را نکند.&lt;br /&gt;&lt;br /&gt;در این میان یک نکته اساسی دیگر وجود دارد و اون کم سوادی و بی سوادی فنی مدیران دولتی است که نمی توانند با تنظیم قراردادهای محکم مانع ضرر دهی خود بشوند. یا اینکه می دانند و نمی خواهند؟! یا شاید هم برایشان مهم نیست و فقط باید بودجه تصویبیشان تا پایان سال به پایان برسد.&lt;br /&gt;&lt;br /&gt;خودتان قضاوت کنید...&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/lP7r-Ytz5Gw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/7010454206720832569/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/11/blog-post.html#comment-form" title="9 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7010454206720832569" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7010454206720832569" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/lP7r-Ytz5Gw/blog-post.html" title="باگ خوب یا بد؟" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>9</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/11/blog-post.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-1148886862258988033</id><published>2010-10-23T13:01:00.000+03:30</published><updated>2011-12-23T10:22:25.594+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="AI Challenge" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">مسابقه هوش مصنوعي گوگل</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;اخیرا دوره دوم مسابقه برنامه نویسی هوش مصنوعی گوگل توسط دانشگلاه  واترلو کانادا از 27 سپتامبر گذشته شروع به کار کرده. مهلت شرکت در مسابقه  تا 27 نوابر امسال هست. در صورت علاقه مندی به این موضوع فرصت رو از دست  ندید.&lt;br /&gt;&lt;br /&gt;زبانهای برنامه نویسی بسیاری در این دوره پشتیبانی  شده اند مانند C#, C++, Java, Python, PHP حتی Lisp هم شامل اونها هست.  برای مشاهده لیست زیانهای پشتیبانی شده &lt;a href="http://planetwars.aichallenge.org/starter_packages.php" target="_blank"&gt;اینجا&lt;/a&gt; مراجعه کنید.&lt;br /&gt;&lt;br /&gt;موضوع این دوره جنگ سیارات هست که الهام گرفته از بازی فلش &lt;a href="http://www.galcon.com/flash/" target="_blank"&gt;Galcon&lt;/a&gt; هست. در این بازی باید تمامی سیارات دشمن رو تسخیر کنید. استراتژی و  الگوریتم هوش مصنوعی که برای این منظور به کار می گیرید تعیین کننده پیروزی  یا شکست شما خواهد بود. در این میان میتونید از سیاراتی که هنوز تسخیر  نشده اند هم کمک بگیرید. به همین سادگی!&lt;br /&gt;&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img alt="دو حریف در حال نبرد" class="size-full wp-image-1094" height="353" src="http://salarblog.files.wordpress.com/2010/10/planetwars.png" style="margin-left: auto; margin-right: auto;" title="دو حریف در حال نبرد" width="340" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;دو حریف در حال نبرد&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;a href="http://planetwars.aichallenge.org/" target="_blank"&gt;وبسایت مسابقات در سال 2010&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;a href="http://planetwars.aichallenge.org/rankings.php" target="_blank"&gt;رنکینگ مسابقات&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://planetwars.aichallenge.org/country_profile.php?country_id=112" target="_blank"&gt;ایرانی های حاظر در مسابقه&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://planetwars.aichallenge.org/profile.php?user_id=11364"&gt;ربات من!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;در صورتی که خواستید شرکت کنید &lt;a href="http://forums.aichallenge.org/viewtopic.php?f=18&amp;amp;t=748" target="_blank"&gt;این ابزار تست&lt;/a&gt; به درد شما خواهد خورد.&lt;br /&gt;&lt;br /&gt;در مورد #C متاسفانه سرور آنها از نسخه قدیمی Mono استفاده می کند که فقط از از C# 2 پشتیبانی می کند و همچنین کامپایلر آن یک باگ دارد که باعث می شود بسیاری از ارسالها بی جهت کامپایل نشوند.&lt;br /&gt;&lt;br /&gt;توجه کنید که این سایت از امکانات Html5 استفاده می کند و باید با مرورگرها جدید مانند نسخه جدید کروم و یا فایرفاکس4 این سایت رو مشاهده کنید.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;پ.ن 1:&lt;/b&gt; ظاهرا گوگل این وسط هیچکاره هست و هیچ کمکی نمی کنه و شرکت کنندگان از وضع سرور خیلی ناراضی هستند و می خوان تا حامی دیگری برای این مسابقه پیدا کنند.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;پ.ن 2:&lt;/b&gt; این مسابقه هیچ جایزه ای تا الان که این رو مینوسم نداره! گوگل هیچ کارس مثل اینکه!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;پ.ن 3:&lt;/b&gt; من هم خواستم که شانس خودم رو امتحان کنم و &lt;a href="http://planetwars.aichallenge.org/profile.php?user_id=11364" target="_blank"&gt;نتیجه اش این شد!&lt;/a&gt; ده نفر اول واقعا که دانش بسیار بالایی دارند!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;پ.ن 4:&lt;/b&gt; لیست &lt;a href="http://planetwars.aichallenge.org/country_profile.php?country_id=112" target="_blank"&gt;ایرانی های حاظر در مسابقه&lt;/a&gt;، خیلی کمه!&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/SCz7iAALBmM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/1148886862258988033/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/10/blog-post.html#comment-form" title="12 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/1148886862258988033" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/1148886862258988033" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/SCz7iAALBmM/blog-post.html" title="مسابقه هوش مصنوعي گوگل" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>12</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/10/blog-post.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-8982737858899652979</id><published>2010-10-08T13:42:00.000+03:30</published><updated>2011-12-08T12:15:29.159+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="Parallel Extension" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">Parallel سازي براي دات نت 2</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="Parallel" class="size-full wp-image-1080" height="96" src="http://salarblog.files.wordpress.com/2010/10/parallel.png" title="Parallel" width="115" /&gt; &lt;/div&gt;همانطور که در دو &lt;a href="http://salarblog.wordpress.com/2010/10/01/tasks-in-dotnet-4/"&gt;پست&lt;/a&gt; &lt;a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/"&gt;قبلی&lt;/a&gt; مطالعه کردید در دات نت فریم ورک 4 قابلیت بسیار مفید parallel اضافه شده است. آن مجموعه کلاسها این امکان را فراهم می کنند که چندین کار در میان هسته های سیستم تقسیم شده و همزمان انجام شود. تنها عیب آن این است که فقط برای دات نت 4 در دسترس است.&lt;br /&gt;&lt;br /&gt;برای حل این محدودیت می توان از روش های جایگزین استفاده کرد. گرچه این روشها باز هم به پای امکانات مهیا شده در دات نت 4 نمی رسد ولی باز هم بسیار راه گشا هستند. برای روش جایگزین می توان هم مستقیما از Thread ها استفاده کرد و هم از ThreadPool که کنترل thread ها را خودکار انجام می ده. البته این دو روش تفاوت فاحشی با هم دارند. تفاوت روش استفاده مستقیم از thread با threadpool عدم وابستگی به تعداد هسته cpu ها است، بدین معنا که در آن تقریبا همه آیتمها را به یکباره مورد پردازش قرار خواهند گرفت(البته به تعداد تعیین شده). اما threadpool همانند دات نت 4 عمل کرده و متدهای در حال اجرا و همزمان را به تعداد هسته cpu محدود می کند (با اندکی تفاوت). ابتدا متدی که مستقیما با thread ها کار می کند را معرفی می کنم و سپس روش threadpool را معرفی خواهم کرد.&lt;br /&gt;&lt;br /&gt;با استفاده تابع زیر که تهیه کردم این امکان فراهم می آید که لیستی از آیتم ها را برای پردازش توسط یک متد یا رویه به طور همزمان پردازش نمایید. متد WorkAsParallel که در پایین ملاحظه می کنید دو ورودی می گیرد که ورودی اول لیستی جنریک از آیتم ها است و ورودی دوم متد پردازشگر مورد نظر که بر روی تک تک آیتم ها اجرا شده و عمل مورد تان را انجام می دهد.&lt;br /&gt;&lt;pre&gt;public static void WorkAsParallel&amp;lt;T&amp;gt;(IList&amp;lt;T&amp;gt; itemsList, ParameterizedThreadStart itemDoWork)&lt;br /&gt;{&lt;br /&gt;// the maximum number of active threads&lt;br /&gt;const int maxThreads = 10;&lt;br /&gt;List&amp;lt;Thread&amp;gt; workers = new List&amp;lt;Thread&amp;gt;();&lt;br /&gt;&lt;br /&gt;if (itemsList.Count &amp;gt; maxThreads)&lt;br /&gt;{&lt;br /&gt;    int currentItem = 0;&lt;br /&gt;    for (int i = 0; i &amp;lt; maxThreads; i++)&lt;br /&gt;    {&lt;br /&gt;        T item = itemsList[i];&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            Thread worker = new Thread(itemDoWork);&lt;br /&gt;            worker.IsBackground = true;&lt;br /&gt;            worker.Name = item.ToString();&lt;br /&gt;&lt;br /&gt;            workers.Add(worker);&lt;br /&gt;&lt;br /&gt;            // item index&lt;br /&gt;            currentItem++;&lt;br /&gt;&lt;br /&gt;            // start the thread&lt;br /&gt;            worker.Start(item);&lt;br /&gt;        }&lt;br /&gt;        catch&lt;br /&gt;        {&lt;br /&gt;            // ignore any exception&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // A little break in current thread&lt;br /&gt;    Thread.Sleep(5);&lt;br /&gt;&lt;br /&gt;    do&lt;br /&gt;    {&lt;br /&gt;        // start waiting&lt;br /&gt;        for (int i = workers.Count - 1; i &amp;gt;= 0; i--)&lt;br /&gt;        {&lt;br /&gt;            Thread worker = workers[i];&lt;br /&gt;&lt;br /&gt;            if ((worker.ThreadState | ThreadState.Stopped) == ThreadState.Stopped)&lt;br /&gt;            {&lt;br /&gt;                workers.RemoveAt(i);&lt;br /&gt;&lt;br /&gt;                // thread finished! run next irem if it is there&lt;br /&gt;                if (currentItem &amp;lt;= itemsList.Count - 1)&lt;br /&gt;                {&lt;br /&gt;                    T item = itemsList[currentItem];&lt;br /&gt;                    worker = new Thread(itemDoWork);&lt;br /&gt;                    worker.IsBackground = true;&lt;br /&gt;                    worker.Name = item.ToString();&lt;br /&gt;&lt;br /&gt;                    workers.Add(worker);&lt;br /&gt;&lt;br /&gt;                    // increase the item index&lt;br /&gt;                    currentItem++;&lt;br /&gt;&lt;br /&gt;                    // start the thread&lt;br /&gt;                    worker.Start(item);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // a little break&lt;br /&gt;        Thread.Sleep(5);&lt;br /&gt;&lt;br /&gt;    } while (itemsList.Count &amp;gt; currentItem);&lt;br /&gt;&lt;br /&gt;    // now all the list items are in progress&lt;br /&gt;&lt;br /&gt;    // start waiting for them to be done&lt;br /&gt;    foreach (Thread worker in workers)&lt;br /&gt;    {&lt;br /&gt;        // just wait for it&lt;br /&gt;        // an infinity wait!&lt;br /&gt;        worker.Join();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;    // all items are starting in threads&lt;br /&gt;    foreach (T item in itemsList)&lt;br /&gt;    {&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            Thread worker = new Thread(itemDoWork);&lt;br /&gt;            worker.IsBackground = true;&lt;br /&gt;            worker.Name = item.ToString();&lt;br /&gt;&lt;br /&gt;            workers.Add(worker);&lt;br /&gt;&lt;br /&gt;            // start the thread&lt;br /&gt;            worker.Start(item);&lt;br /&gt;        }&lt;br /&gt;        catch&lt;br /&gt;        {&lt;br /&gt;            // ignore any exception&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // A little break in current thread&lt;br /&gt;    Thread.Sleep(5);&lt;br /&gt;&lt;br /&gt;    // start waiting for them to be done&lt;br /&gt;    foreach (Thread worker in workers)&lt;br /&gt;    {&lt;br /&gt;        // just wait for it&lt;br /&gt;        // an infinity wait!&lt;br /&gt;        worker.Join();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;به طور پیش فرض تعداد thread فعال 10 در نظر گرفته شده است (توسط ثابت maxThreads که قابل افزایش است) بدین معنا که در صورتی تعداد آیتمهای لیست شما بیش از 10 تا باشد ابتدا فقط 10 آیتم ابتدایی اجرا خواهند شد و تنها پس از پایان هر thread آیتم بعدی مورد پردازش قرار خواهد گرفت. این محدودیت به خاطر جلوگیری از وارد شدن فشار بیش از حد به سیستم در نظر گرفته شده و در صورت صلاحدید شما قابل افزایش است.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;روش استفاده از WorkAsParallel&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;در مثال زیر یک لیست از DateTime با تاخیر زمانی 1 ثانیه چاپ می شود تا همزانی اجرا هم مشخص شود.&lt;br /&gt;&lt;pre&gt;public void TestWorkAsParallel()&lt;br /&gt;{&lt;br /&gt;    List&amp;lt;DateTime&amp;gt; theList = new List&amp;lt;DateTime&amp;gt;();&lt;br /&gt;    theList.Add(DateTime.Now.AddDays(1));&lt;br /&gt;    theList.Add(DateTime.Now.AddDays(2));&lt;br /&gt;    theList.Add(DateTime.Now.AddDays(3));&lt;br /&gt;&lt;br /&gt;    ParallelWorks.WorkAsParallel(theList, x =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        DateTime item = (DateTime)x;&lt;br /&gt;        Console.Write(item);&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    });&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;و برای استفاده در VS 2005 که با کامپایلر CCS2 کار می کنه مثال مذبور رو به این تغییر بدید:&lt;br /&gt;&lt;pre&gt;ParallelWorks.WorkAsParallel(theList, delegate(object x)&lt;br /&gt;{&lt;br /&gt;    DateTime item = (DateTime) x;&lt;br /&gt;    Console.Write(item);&lt;br /&gt;    Thread.Sleep(1000);&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: maroon;"&gt;استفاده از ThreadPool&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;متد مورد نظر من در &lt;a href="http://blog.robvolk.com/2009/02/c-parallelism-executing-methods-in.html"&gt;این پست از وبلاگ&lt;/a&gt; معرفی شده است. این متد لیستی از متد های قابل اجرا را دریافت کرده و به صورت همزمان اجرا می کند.&lt;br /&gt;&lt;pre&gt;public class ParallelProcessor&lt;br /&gt;{&lt;br /&gt;    public delegate void Method();&lt;br /&gt;&lt;br /&gt;    /// &amp;lt;summary&amp;gt;&lt;br /&gt;    /// Executes a set of methods in parallel and returns the results&lt;br /&gt;    /// from each in an array when all threads have completed.  The methods&lt;br /&gt;    /// must take no parameters and have no return value.&lt;br /&gt;    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;    /// &amp;lt;param name="m"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;    public static void ExecuteParallel(params Method[] methods)&lt;br /&gt;    {&lt;br /&gt;        // Initialize the reset events to keep track of completed threads&lt;br /&gt;        ManualResetEvent[] resetEvents = new ManualResetEvent[methods.Length];&lt;br /&gt;&lt;br /&gt;        // Launch each method in it's own thread&lt;br /&gt;        for (int i = 0; i &amp;lt; methods.Length; i++)&lt;br /&gt;        {&lt;br /&gt;            resetEvents[i] = new ManualResetEvent(false);&lt;br /&gt;            ThreadPool.QueueUserWorkItem(new WaitCallback((object index) =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                int methodIndex = (int)index;&lt;br /&gt;&lt;br /&gt;                // Execute the method&lt;br /&gt;                methods[methodIndex]();&lt;br /&gt;&lt;br /&gt;                // Tell the calling thread that we're done&lt;br /&gt;                resetEvents[methodIndex].Set();&lt;br /&gt;            }), i);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // Wait for all threads to execute&lt;br /&gt;        WaitHandle.WaitAll(resetEvents);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;روش استفاده آن هم همانطور که در آن پست ذکر شده آسان است.&lt;br /&gt;&lt;pre&gt;ParallelProcessor.ExecuteParallel(() =&amp;gt;&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine("The long task 1");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;}, () =&amp;gt;&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine("The long task 2");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;},&lt;br /&gt;() =&amp;gt;&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine("The long task 3");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;و برای VS2005 از این روش فراخوانی استفاده کنید:&lt;br /&gt;&lt;pre&gt;ParallelProcessor.Method[] methods = new ParallelProcessor.Method[3];&lt;br /&gt;methods[0] = delegate{&lt;br /&gt;    Console.WriteLine("The long task 1");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;};&lt;br /&gt;methods[1] = delegate{&lt;br /&gt;    Console.WriteLine("The long task 1");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;};&lt;br /&gt;methods[2] = delegate{&lt;br /&gt;    Console.WriteLine("The long task 1");&lt;br /&gt;    Thread.Sleep(500);&lt;br /&gt;};&lt;br /&gt;ParallelProcessor.ExecuteParallel(methods);&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: maroon;"&gt;مقایسه WorkAsParallel و ParallelProcessor در عمل&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;مسلما مقایسه این دو روش زیاد صحیح نخواهد بود. این به علت متفاوت بودن شیوه اجرای این دو روش است. به هرحال جهت نمایش این تفاوت مثال زیر را اجرا می کنیم:&lt;br /&gt;&lt;pre&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;    Console.WriteLine("Parallels for .NET 2, salarblog.wordpress.com");&lt;br /&gt;&lt;br /&gt;    // The list&lt;br /&gt;    List&amp;lt;int&amp;gt; taskList = new List&amp;lt;int&amp;gt;() { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;&lt;br /&gt;    var pwatch = Stopwatch.StartNew();&lt;br /&gt;    ParallelWorks.WorkAsParallel(taskList, x =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("The long task {0} started at {1}", x, DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    });&lt;br /&gt;    pwatch.Stop();&lt;br /&gt;    Console.WriteLine("WorkAsParallel done!");&lt;br /&gt;&lt;br /&gt;    var twatch = Stopwatch.StartNew();&lt;br /&gt;    ParallelProcessor.ExecuteParallel(delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 1 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    }, delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 2 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    }, delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 3 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    }, delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 4 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    }, delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 5 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    }, delegate&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Task 6 started at " + DateTime.Now.ToString("ss:fff"));&lt;br /&gt;        Thread.Sleep(1000);&lt;br /&gt;    });&lt;br /&gt;    twatch.Stop();&lt;br /&gt;&lt;br /&gt;    Console.WriteLine();&lt;br /&gt;    Console.WriteLine("WorkAsParallel finished in {0} seconds", pwatch.Elapsed.TotalSeconds);&lt;br /&gt;    Console.WriteLine("ParallelProcessor finished in {0} seconds", twatch.Elapsed.TotalSeconds);&lt;br /&gt;&lt;br /&gt;    // wait&lt;br /&gt;    Console.ReadKey();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;نتیجه اجرا چیزی مانند این خواهد بود (این نتیجه سیستم دو هسته من هست):&lt;br /&gt;&lt;div class="mceTemp mceIEcenter"&gt; &lt;dl class="wp-caption  aligncenter"&gt;&lt;dt class="wp-caption-dt"&gt;&lt;img alt="WorkAsParallel v.s. ParallelProcessor" class="size-full wp-image-1078" height="232" src="http://salarblog.files.wordpress.com/2010/10/paralleldotnet2test.png" title="WorkAsParallel v.s. ParallelProcessor" width="416" /&gt;[/caption]به زمانها دقت کنید. تفاوت فاهش است، 3 ثانیه برای ParallelProcessor در مقابل 1 ثانیه برای WorkAsParallel. اما این دلیل بر بهتر بودن WorkAsParallel نیست. اگر به زمانهای شروع هر تسک نگاه کنید می بینید که تسک های متد WorkAsParallel همه تقریبا همزمان اجرا شده اند. (زمانها به صورت &lt;i&gt;میلی ثانیه:ثانیه&lt;/i&gt; هستند). دلیل این امر را همانطور که گفتیم استفاده مستقیم از thread است.&lt;br /&gt;&lt;br /&gt;در هر صورت این دو توابع در دسترس هستند و می توانید با توجه به نیاز خود هر کدام را که خواستید انتخاب کرده و مورد استفاده قرار دهید.&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/M4nYjy9Ur5w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/8982737858899652979/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/10/parallel-2.html#comment-form" title="1 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/8982737858899652979" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/8982737858899652979" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/M4nYjy9Ur5w/parallel-2.html" title="Parallel سازي براي دات نت 2" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/10/parallel-2.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-2768985412309281704</id><published>2010-10-01T15:11:00.000+03:30</published><updated>2011-12-08T10:47:23.712+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="PLinq" /><category scheme="http://www.blogger.com/atom/ns#" term="Parallel Extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="Task" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><title type="text">نگاهي به Parallel Extensions در دات نت 4 بخش دوم</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;در &lt;a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/"&gt;نوشته قبلی&lt;/a&gt; در مورد شیوه عملکرد و به کارگیری PLINQ و Parallel ها مطالبی خواندید. در این نوشتار قصد دارم در مورد Task ها (وظایف) صحبت کرده و مروری بر نکات مهم آن داشته باشیم.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;Task چیست&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx" target="_blank"&gt;Task&lt;/a&gt; کلاس جدیدی است که نماینده کاری است که قرار است انجام بدهید. تسکها نیز همانند Parallel ها فقط بر روی هسته های CPU زمی شوند. به این معنا که به تعداد هسته های CPU تسک ها خواهند توانست به طور همزمان اجرا شوند. متدها و کلاسهایی برای کنترل تسک ها فراهم شده تا امکان کنترل اجرای آنها و همزمان سازی آنها را مهیا کند.&lt;br /&gt;&lt;br /&gt;تمامی پیچیدگی کار و اعمالی قرار است بر روی تسک ها انجام بشود توسط Task Scheduler (زمان بند وظایف) پیاده شده و انجام می شود. کاری که Task Scheduler انجام می دهد مدیریت اجرای تسک ها و کنترل نحوه تقسیم آنها در میان Thread های مختلف است.&lt;br /&gt;&lt;br /&gt;فرایندی که هنگام کار با Task Scheduler اتفاق می افتد را اینگونه می توان شرح داد:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;هنگام ایجاد تسک، آن به صف عمومی تسک ها اضافه می شود.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ایجاد Thread های "کارگر" مورد نیاز برای انجام کار تسک ها توسط مدیر Thread های دات نت (Thread pool). تعداد دقیق این thread ها بستگی به فاکتور های مختلفی از جمله تعداد هسته های cpu سیستم، حجم کارهای فعلی در جریان، نوع کار در جریان دارد. برای مثال اگر مدیر thread ها تشخصی دهد که فرایندها در مرحله کار با I/O دارای تاخیر هستند (مانند ذخیره یا دانلود فایل) تعداد thread بیشتری را برای افزایش سرعت ایجاد خواهد کرد. همچنین فرایند پشت زمینه ای هم همزمان هر 0.5 ثانیه پایان کار thread ها را بررسی می کند که اگر هیچ کدام به پایان نرسیده باشد، thread جدیدی را برای انجام کار ایجاد کند.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;هر thread کارگر تسک ها را از صف عمومی تسک ها برداشته و به صف داخلی خود برای اجرا انتقال می دهد.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;هر thread کارگر تسک های صف داخلی خود را انجام می دهد.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;اگر هر thread صف داخلی خود را به پایان برساند، از صف thread های دیگر کارهای در انتظار را از آخر صف برداشته و پردازش می کند.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;نموداری از فرایند بالا را مشاهده کنید:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://salarblog.wordpress.com/" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="روند کار مدیر تسک ها" class="size-full wp-image-1064" height="374" src="http://salarblog.files.wordpress.com/2010/10/taskoverview510-345.png" title="روند کار مدیر تسک ها" width="505" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;روند کار مدیر تسک ها&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: maroon;"&gt;ایجاد و مدیریت تسکها&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;ایجاد و به کار گیری تسک ها بسیار ساده و آسان است. برای ایجاد تسک از دو طریق می توان اقدام کرد. متد &lt;a href="http://msdn.microsoft.com/en-us/library/dd321439.aspx" target="_blank"&gt;Task.Factory.StartNew&lt;/a&gt; که ورودی تابع مورد نظر (از نوع action delegate) را دریافت کرده و فورا شروع به کار می کند. مانند مثال زیر:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Task test = Task.Factory.&lt;b&gt;StartNew&lt;/b&gt;(() =&amp;gt; Console.WriteLine("hello"));&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;و یا اینکه مستقیما نمونه جدید از کلاس Task ایجاد کنید که ورودی آن هم تابع مورد نظر برای اجرا خواهد بود. برای اجرای تسک سپس باید متد Start را فرواخوانی بکنید:&lt;br /&gt;&lt;pre&gt;Task test= new &lt;b&gt;Task&lt;/b&gt;(() =&amp;gt; Console.WriteLine("hello"));&lt;br /&gt;test.&lt;b&gt;Start&lt;/b&gt;();&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;انتظار برای پایان تسک&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;در حالت عادی اجرای تسک سبب مسدود شدن رویه در حال اجرا نخواهد شد. در صورتی که مایل باشید تا اجرای رویه را تا پایان تسک یا تسک های مورد نظر متوقف کنید از توابع زیر می توانید استفاده کنید.&lt;br /&gt;&lt;br /&gt;متد &lt;a href="http://msdn.microsoft.com/en-us/library/dd235635.aspx" target="_blank"&gt;Task.Wait&lt;/a&gt; سبب انتظار برای پایان تسک مورد نظر خواهد شد. برای انتظار به چندین تسک از متد &lt;a href="http://msdn.microsoft.com/en-us/library/dd270695.aspx" target="_blank"&gt;Task.WaitAll&lt;/a&gt; استفاده کنید که چندین تسک را به عنوان ورودی دریافت می کند و رویه اجرای برنامه تا پایان همه آنها منتظر خواهد بود.&lt;br /&gt;&lt;br /&gt;متد &lt;a href="http://msdn.microsoft.com/en-us/library/dd270672.aspx" target="_blank"&gt;Task.WaitAny&lt;/a&gt; چندین ورودی تسک را دریافت می کند و تا زمانی که حداقل یکی از تسک ها به پایان برسد منتظر خواهد ماند. کاربرد این روش می تواند برای انجام عملی باشد که نتیجه مشابهی دارد و از روش متفاوت می توان استفاده کرد و نتیجه برایتان مهم است.&lt;br /&gt;&lt;br /&gt;مثالی از کاربرد این متد ها:&lt;br /&gt;&lt;pre&gt;Task task1 = Task.Factory.StartNew(() =&amp;gt; Console.WriteLine("task 1"));&lt;br /&gt;Task task2 = new Task(() =&amp;gt; Console.WriteLine("hello task 2"));&lt;br /&gt;Task task3 = Task.Factory.StartNew(() =&amp;gt; Console.WriteLine("task 3")); &lt;br /&gt;&lt;br /&gt;task2.Start(); &lt;br /&gt;&lt;br /&gt;task1.&lt;b&gt;Wait&lt;/b&gt;();&lt;br /&gt;Task.&lt;b&gt;WaitAll&lt;/b&gt;(task2, task3);&lt;/pre&gt;&lt;br /&gt;با استفاده از ویژگی &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.iscompleted.aspx" target="_blank"&gt;&lt;i&gt;IsComplete&lt;/i&gt;&lt;/a&gt; نیز میتوانید به پایان رسیدن یک تسک را مورد آزمایش قرار دهید.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ترتیب اجرا&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;در صورتی که نیاز داشته باشید تا حتما پس از پایان یک تسک، تسک بعدی اجرا شود تابع ContinueWith برای همین منظور در نظر گرفته شده است. این تابع باید بر روی تسک مورد نظر فراخوانی شود. در این صورت متد ارسالی به ContinueWith بعد از تسک مورد نظر فراخوانی خواهد شد.&lt;br /&gt;&lt;pre&gt;Task task = Task.Factory.StartNew(() =&amp;gt; Console.WriteLine(" task 1"))&lt;br /&gt;.ContinueWith(x=&amp;gt;  Console.WriteLine("task 2") )&lt;br /&gt;.ContinueWith(x=&amp;gt;  Console.WriteLine("task 3") )&lt;br /&gt;.ContinueWith(x=&amp;gt;  Console.WriteLine("task 4") );&lt;/pre&gt;&lt;br /&gt;&lt;i&gt; نکته:&lt;/i&gt; توجه کنید که در این مثال تسکها یکی پس از دیگری و فقط در صورت پایان هر تسک، تسک بعدی اجرا خواهد شد. (یعنی تسک ها به طور همزمان بر روی هسته های مختلف اجرا نخواهند شد)&lt;br /&gt;&lt;br /&gt;همچنین تابع ContinueWith ورودی از نوع TaskContinuationOptions را دریافت می کند که امکان تعیین شرط برای اجرای تسک را فراهم و همچنین ویژگیهای ویژه ای را برای تسک تعیین می کند. برای مثال با تعیین TaskContinuationOptions.OnlyOnFaulted به عنوان شرط، تسک بعدی فقط در صورت شکست اجرای تسک قبلی اجرا خواهد شد. برای اطلاع بیشتر راجع به سایر مقادیر به &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions.aspx" target="_blank"&gt;راهنمای msdn&lt;/a&gt; مراجعه کنید.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;دریافت خروجی از تسک&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;برای دریافت خروجی کافی هست که در متد تسک مورد نظر خروجی را ارسال کنیم ( در حقیقت داریم از Func delegate استفاده می کنیم). در این صورت خروجی از طریق ویژگی Result در دسترس خواهد بود.&lt;br /&gt;&lt;pre&gt;var data = Task.Factory.StartNew(() =&amp;gt; GetResult());&lt;br /&gt;Console.WriteLine("Parallel task returned with value of {0}", data.Result);&lt;br /&gt;&lt;br /&gt;Task&amp;lt;string&amp;gt; t = new Task&amp;lt;string&amp;gt;(()=&amp;gt;{&lt;br /&gt;return "hello";&lt;br /&gt;});&lt;br /&gt;t.Start();&lt;br /&gt;Console.WriteLine("The result is {0}", t.Result);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;نکته&lt;/b&gt;: فراخوانی ویژگی Result در صورتی که هنوز تسک به پایان نرسیده سبب خواهد شد تا برنامه تا زمان پایان یافتن اجرای تسک و دریافت خروجی متوقف شود. برای جلوگیری از این اتفاق می توانید از ویژگی &lt;i&gt;IsComplete&lt;/i&gt; یا روشهایی که خواندید استفاده کنید.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;تداخل با UI&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;هنگام کار با thread ها نمی توانید مقادیر کنترل ها را تغییر بدهید به عبارت دیگر، به thread مربوط به GUI دسترسی نخواهید داشت. (این محدودیت به علت جلوگیری از مشکلات احتمالی توسط دات نت اعمال شده است).&lt;br /&gt;&lt;br /&gt;با توجه به اینکه Task هم از thread ها برای اجرای متدهایش استفاده می کند همین مشکل نیز در استفاده از آنها وجود دارد. راه حل این مشکل بسیار ساده می باشد.&lt;br /&gt;&lt;br /&gt;برای حل این مشکل با استفاده از تابع TaskScheduler.FromCurrentSynchronizationContext که مدیر تسک های(TaskScheduler) جدیدی را برای thread فعلی ایجاد کرده و بر میگرداند. حال اگر این تابع را در فرم اجرا کنیم محیط اجرا در thread GUI قرار خواهد داشت. سپس کافی است تا این مقدار را به سازنده تسک و یا ادامه دهنده آن (ContinueWith) ارسال کنیم. در این صورت تسک مورد نظر در thread فرم اجرا خواهد شد و در نتیجه تغییر کنترل ها بدون مشکل میسر خواهد بود.&lt;br /&gt;&lt;pre&gt;private void button1_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    var ui = TaskScheduler.FromCurrentSynchronizationContext();&lt;br /&gt;&lt;br /&gt;    Task.Factory.StartNew(() =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        return LoadAndProcessImage(); // compute the image&lt;br /&gt;&lt;br /&gt;    }).ContinueWith(t =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        pictureBox1.Image = t.Result; // display it&lt;br /&gt;&lt;br /&gt;    }, ui);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;در این مثال ابتدا پردازش مورد نظر انجام می شود سپس در تسک بعدی که در thread مربوط به GUI اجرا خواهد شد، نتیجه به کنترل تصویر تخصیص داده می شود.&lt;br /&gt;&lt;br /&gt;موفق باشید.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;منابع&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Pro-NET-Parallel-Programming/dp/1430229675"&gt;APress - Pro .NET 4 Parallel Programming in C#&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Introducing-NET-4-0-Visual-Experts/dp/143022455X"&gt;APress - Introducing .NET 4.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2009/04/14/9549246.aspx"&gt;What’s new in Beta 1 for the Task Parallel Library?&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/DAnmDKtKdYM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/2768985412309281704/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/10/parallel-extensions-4.html#comment-form" title="3 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/2768985412309281704" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/2768985412309281704" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/DAnmDKtKdYM/parallel-extensions-4.html" title="نگاهي به Parallel Extensions در دات نت 4 بخش دوم" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/10/parallel-extensions-4.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-755406237836437494</id><published>2010-06-15T00:11:00.002+04:30</published><updated>2010-06-15T00:12:37.756+04:30</updated><title type="text">ادامه از Wordpress</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;به علت فیلتر شدن کل Wordpress این وبلاگ هم از دست این قیچی در امان  نماند. ظاهرا قرار نیست این فیلتر رفع بشه پس تصمیم به مهاجرت به blogger  رو گرفتم.&lt;br /&gt;این وبلاگ به &lt;a href="http://salartech.blogspot.com/"&gt;این آدرس فعلی&lt;/a&gt;  با تمام محتویات انتقال پیدا کرد. نیازی به تغییر آدرس فید نیست و آدرس آن  همان آدرس قبلی هست.&lt;br /&gt;&lt;br /&gt;پ.ن: ظاهرا این فیلتر شدن به خاطر روشی بود که به عنوان آدرس اضافی  وبلاگ توسط wordpress تعبیه شده و این باعث دور زدن فیلتر می شد.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/_Ge7a5Y7UHw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/755406237836437494/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/06/wordpress.html#comment-form" title="0 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/755406237836437494" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/755406237836437494" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/_Ge7a5Y7UHw/wordpress.html" title="ادامه از Wordpress" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/06/wordpress.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-7330351566828701080</id><published>2010-06-11T02:24:00.009+04:30</published><updated>2011-12-08T12:17:55.807+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="PLinq" /><category scheme="http://www.blogger.com/atom/ns#" term="Parallel Extension" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">نگاهی به Parallel Extensions در دات نت 4 بخش اول</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;Parallel Extensions مجموعه ای کلاسها متدها و روشهایی هست که به دات نت 4 اضافه شده و امکان اجرای درخواستها و متد ها را به صورت موازی می دهد. به طور دقیق تر در این روش برنامه می تواند برخی درخواستهای خاص را به صورت موازی در چند هسته CPU به طور همزمان اجرا کند بدون اینکه در روند عادی اجرای برنامه وقفه ای ایجاد شود ویا نیاز به تغییر عمده ای داشته باشد.&lt;br /&gt;&lt;br /&gt;شاید بپرسید که Threading همین کار را انجام می دهد و چه نیازی به استفاده از این روش وجود دارد. در پاسخ باید گقت Parallelization (یا همزمان سازی) کاربردی نسبتا متفاوت از کاربرد thread ها دارد، گرچه خود شیوه parallel از thread ها استفاده می کند. در حقیقیت parallel ها برای استفاده سریع تر از thread ها در مقاصد خاص ایجاد شده اند و نه جایگزینی برای آن؛ جایی که تعداد زیادی از thread باعث ایجاد مشکلات مدیریتی می شود.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;فرق بین Threading و Parallel&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;به طور خلاصه می توان چند thread را در یک cpu تک هسته ای اجرا کرد ولی parallel سازی فقط در cpu های چند هسته ای اتفاق خواهد افتاد. در هنگام استفاده از parallel ها دات نت به طور خودکار اقدام به شناسایی سیستم برای دارا بودن cpu چند هسته ای می کند، در صورتی سیستم دارای چنین قابلیتی باشد دات نت اقدامات بعدی را برای اجرای پروسه به صورت parallel انجام خواهد داد. این یکی از مزایای این روش هست که تضمین می کند کد برنامه در هر سیستمی قابل اجرا خواهد بود.&lt;br /&gt;&lt;br /&gt;در تصویر زیر مشاهده میکنید که thread ها&amp;nbsp; در یک سیستم تک هسته ای به صورت ترتیبی اجرا می شود و parallel در یکی سیستم چند هسته ای همزمان اجرا می شود.&lt;br /&gt;(توجه کنید که thread ها هم در سیستم چند هسته ای می توانند در هسته های مختلف می توانند اجرا شوند ولی تضمینی برای اجرای همزمان آنها وجود ندارد و کنترل آن توسط سیستم عامل انجام می شود.)&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align:center"&gt;&lt;img alt="Serial vs. Parallel" class="size-full wp-image-959" height="214" src="http://sites.google.com/site/salartech/blogimages/serialparallel.png?attredirects=0" title="Serial vs. Parallel" width="445" /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Parallel Loops&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;دو متد Parallel.For و Parallel.ForEach که در فضای نام System.Threading.Tasks قرار دارند برای انجام حلقه های پارالل در نظر گرفته شده اند. نسخه های مختلفی از آنها با توجه به ورودی و خروجی این متد ها در نظر گرفته شده تا همه شرایط را پوشش دهند. اما برای استفاده از لازم نیست که حتما از این توابع استفاده کنید. متد اضافه شونده AsParallel که جزوی از PLINQ برای راحتی کار در نظر گرفته شده است.&lt;br /&gt;همه لیست ها و آرایه هایی که اینترفیس IEnumerable رو پیاده سازی می کنند بسادگی و با استفاده از متد اضافه شوند (extension method) با نام AsParallel امکان استفاده از پارالل ها را دارند. این متد که در مبحث PLINQ کاربرد دارد کار را بسیار ساده کرده و روش استفاده از آن در حد یک فراخوانی ساده کرده است.&lt;br /&gt;&lt;br /&gt;در مثال ساده زیر یک حلقه از 0 تا 100 داریم که به صورت پارالل اجرا می شود. در بخش بعدی در مثالی در مورد AsParallel را مشاهده خواهید کرد.&lt;br /&gt;&lt;pre&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;Parallel&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: maroon;"&gt;&lt;b&gt;For&lt;/b&gt;&lt;/span&gt;(0, 100, index =&amp;gt;&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Id:{0} Num:{1} - ", Task.CurrentId, index);&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;در اینجا Task.CurrentId مقدار id تسک در حال اجرا نشان می دهد. در بخش بعدی در مورد تسک ها خواهم نوشت.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;کارایی Parallel سازی&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;کارایی این روش بستگی زیادی به کاری که می خواهید با آن انجام دهید  دارد. همیشه سعی کنید کارهایی را که به زمان زیادی نیاز دارد را به صورت پارالل تبدیل اجرا کنید. برای مثال دانلود فیدهای چندین سایت مختلف برای نوشتن نرم افزار فید خوان، یا جستجو در میان لیست یا آرایه ای طولانی.&lt;br /&gt;&lt;br /&gt;دلیل این امر زمانی است که دات نت برای آماده سازی تسک و تقسیم وظایف انجام می دهد. گرچه برای سیستم های سریع فعلی این زمان در حد چند میلی ثانیه است ولی ممکن است در برخی سیستم های قدیمی تر اندکی محسوس تر باشد.&lt;br /&gt;&lt;br /&gt;همچنین در هنگام استفاده از parallel ها همیشه در نظر داشته باشید که بهترین نتیجه را زمانی خواهید گرفت که cpu سیستم دارای چند هسته باشد. در غیر این صورت این روش ممکن است اندکی سربار ایجاد کند.&lt;br /&gt;&lt;br /&gt;درمثال زیر می خواهیم یک کار زمانبر را دو روش parallel و serial اجرا کنیم و نتایج را بررسی کنیم.&lt;br /&gt;&lt;pre&gt;class LongTask&lt;br /&gt;{&lt;br /&gt;public int ID { get; set; }&lt;br /&gt;public void DoIt()&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("The long task " + ID);&lt;br /&gt;System.Threading.Thread.Sleep(500);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// The list&lt;br /&gt;List&amp;lt;LongTask&amp;gt; taskList = new List&amp;lt;LongTask&amp;gt;();&lt;br /&gt;&lt;br /&gt;// The items&lt;br /&gt;for (int i = 0; i &amp;lt; 20; i++)&lt;br /&gt;{&lt;br /&gt;taskList.Add(new LongTask { ID = i });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Serial&lt;br /&gt;Console.WriteLine("Starting serial test");&lt;br /&gt;var swatch = Stopwatch.StartNew();&lt;br /&gt;foreach (var item in taskList)&lt;br /&gt;{&lt;br /&gt;// the long task&lt;br /&gt;item.DoIt();&lt;br /&gt;}&lt;br /&gt;swatch.Stop();&lt;br /&gt;&lt;br /&gt;// parallel&lt;br /&gt;Console.WriteLine("Starting parallel test");&lt;br /&gt;var pwatch = Stopwatch.StartNew();&lt;br /&gt;taskList.&lt;span style="color: maroon;"&gt;&lt;b&gt;AsParallel&lt;/b&gt;&lt;/span&gt;().&lt;span style="color: maroon;"&gt;&lt;b&gt;ForAll&lt;/b&gt;&lt;/span&gt;(x =&amp;gt;&lt;br /&gt;{&lt;br /&gt;x.DoIt();&lt;br /&gt;});&lt;br /&gt;pwatch.Stop();&lt;br /&gt;&lt;br /&gt;Console.WriteLine();&lt;br /&gt;Console.WriteLine("Parallel programming demo, salarblog.wordpress.com");&lt;br /&gt;Console.WriteLine("Serial task finished in {0} seconds", swatch.Elapsed.TotalSeconds);&lt;br /&gt;Console.WriteLine("Parallel task finished in {0} seconds", pwatch.Elapsed.TotalSeconds);&lt;br /&gt;&lt;br /&gt;// wait&lt;br /&gt;Console.ReadKey();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;تصویر زیر نتیجه اجرای این برنامه را در لپتابم که cpu اون core 2 due 2.6 دو هسته ای هست رو نشان میده.&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align:center"&gt;&lt;img alt="Parallel Performance Test" class="size-full wp-image-964" height="427" src="http://sites.google.com/site/salartech/blogimages/parallelperformancetest.png?attredirects=0" title="Parallel Performance Test" width="379" /&gt;&lt;/p&gt;&lt;br /&gt;تفاوت فاهش هست. 10 ثانیه برای serial و 5 ثانیه برای parallel. مدت زمان اجرا با استفاده از parallel تقریبا نصب شده است. البته این بهترین حالت برای یک سیستم دو هسته ای است چون این تست هیچ فشاری رو روی سیستم وارد نمی کنه.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: maroon;"&gt;نکته بسیار مهم:&lt;/span&gt; &lt;/b&gt;اگه به تصویر بالا دقت کنید در هنگام اجرای تست parallel تسک ها بدون ترتیب و در هم اجرا شده اند. این به این علت است که تسک ها در میان هسته های cpu تقسیم شده اند تا تداخلی در هنگام اجرا ایجاد نشود. نحوه تقسیم را هم دات نت تنظیم می کند که در ایجا و برای cpu دو هسته ای برای یک هسته از اول تا وسط و برای هسته بعدی از وسط تا آخر پردازش شده است.&lt;br /&gt;&lt;br /&gt;پس همیشه در استفاده از parallel ها دقت کنید که آیا نیاز دارید که لیست به صورت مرتب بررسی شود یا نه. در صورتی که لازم است لیست به صورت مرتب پارالل شود باید از متد Parallel.For که قبلا اشاره شد استفاده کنید. این متد تظمین می کند که لیست شما مرتب و در عین حال parallel اجرا شود. شیوه رفع این مشکل در PLINQ در ادامه گفته خواهد شد.&lt;br /&gt;&lt;br /&gt;دو متد Parallel.For و Parallel.ForEach کلاس ParallelOptions را به عنوان ورودی قبول می کنند که کنترل بیشتری بر تسک ها در اخیار می گذارد. برای اطلاعات بیشتر در مورد ParallelOptions به منابع انتهای مقاله مراجه کنید.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: maroon;"&gt;نکته مهم - اشتباه به کار گیری:&lt;/span&gt;&lt;/b&gt; نکته دیگری که لازم به ذکر است این است که نباید لیست هایی که توسط تابع AsParallel به لیست های پارالل تبدیل شده اند را توسط دستور foreach ساده فراخوانی کرد. برای مشاهده نتیجه دقیق کد زیر را در مثال بالا جایگزین کرده و اجرا کردم نتیجه آن را در تصویر زیر می بینید:&lt;br /&gt;&lt;pre&gt;foreach (var item in taskList.&lt;span style="color: maroon;"&gt;&lt;b&gt;AsParallel&lt;/b&gt;&lt;/span&gt;())&lt;br /&gt;{&lt;br /&gt;// the long task&lt;br /&gt;item.DoIt();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p style="text-align:center"&gt;&lt;img alt="Wrong Parallel Usage" class="size-full wp-image-968" height="143" src="http://sites.google.com/site/salartech/blogimages/wrongparallelusage.png?attredirects=0" title="Wrong Parallel Usage" width="400" /&gt;&lt;br /&gt;&lt;/p&gt;همانطور که مشاهده می کنید نه تنها استفاده از ناصحیح از پارالل باعث کاهش زمان نشده بلکه چند میلی ثانیه این زمان بیشتر نیز شده است. دلیل این است که با استفاده از متد AsParallel یک لیست parallel بدست می آوریم ولی دستور foreach ساده این لیست را به طور ساده و serial اجرا می کند و هیچ عمل پارالل سازی اتفاق نمی افتد.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;PLINQ - Parallel LINQ&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;اگر دقت کرده باشید من در مثالهای قبلی از PLINQ استفاده کرده ام که قلب اصلی آن متد AsParallel هست.&amp;nbsp; PLINQ نسخه parallel شده LINQ هست که علاوه بر متد ذکر شده شامل متدهای دیگری برای مدیریت ویژگی parallel آن هم هست. تعدادی از این متد های اصلی در لیست زیر را ذکر می کنم:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;AsParallel&lt;/b&gt;: همانظور که ذکر شد یک پرس و جوی LINQ را به یک پر جوی PLINQ تبدیل می کند. به طور دقیق تر یک شیء ParallelQuery را از روی IEnumerable ایجاد می کند. ParallelQuery نماینده یک پرس و جوی PLINQ می باشد.&lt;/li&gt;&lt;li&gt;&lt;b&gt;AsSequential&lt;/b&gt;: عکس کار متد AsParallel را انجام می دهد، یعنی یکی پرس و جوی پارالل را به یک پرس و جوی معمولی linq تبدیل می کند.&lt;/li&gt;&lt;li&gt;&lt;b&gt;AsOrdered&lt;/b&gt;: پرس و جوی پارالل را مجبور می کند که به ترتیب اجرا شود. این دقیقا همان راه حل مشکلی است که در بالا برای درهم اجرا شدن تسک های parallel ذکر شد. این راه حل برای نسخه PLINQ کاربرد دارد.&lt;/li&gt;&lt;li&gt;&lt;b&gt;AsUnordered&lt;/b&gt;: عکس متد بالا را انجام می دهد.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;استفاده از موارد فوق در پرس و جو ها به سادگی امکان پذیر است:&lt;br /&gt;&lt;pre&gt;var resultSet = from t in taskList.&lt;span style="color: maroon;"&gt;&lt;b&gt;AsParallel&lt;/b&gt;&lt;/span&gt;()&lt;br /&gt;select t;&lt;/pre&gt;&lt;br /&gt;متد ForAll: کاربرد این متد برای PLINQ در این است که بدون کش کردن و تلفیق کردن(result merging) نتیجه را فورا بر می گرداند. این باعث خواهد شد که نتایج AsOrdered نادیده گرفته بشوند. برای کنترل بیشتر در مورد نحوه کش کردن و تلفیق کردن نتایج از متد WithMergeOptions که ورودی از نوع ParallelMergeOptions می گیرد را استفاده کنید.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://salarblog.wordpress.com/"&gt;بخش دوم این مقاله در مورد Task ها خواهد بود&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;موفق باشید.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;منابع و لینک های مفید:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: right;"&gt;&lt;a href="http://www.amazon.com/Pro-NET-Parallel-Programming/dp/1430229675"&gt;APress - Pro .NET 4 Parallel Programming in C#&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Introducing-NET-4-0-Visual-Experts/dp/143022455X"&gt;APress - Introducing .NET 4.0&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/C-4-0-Nutshell-Definitive-Reference/dp/0596800959"&gt;O'Reilly - C# 4.0 IN A NUTSHELL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.danielmoth.com/Blog/threadingconcurrency-vs-parallelism.aspx"&gt;Threading/Concurrency vs Parallelism&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd460719.aspx"&gt;How to: Control Ordering in a PLINQ Query&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/2287963/why-is-parallelqueryt-where-not-working-when-converting-to-observable"&gt;Why is ParallelQuery.Where not working when converting to Observable?&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/"&gt;نگاهی به Parallel Extensions در دات نت 4 بخش اول&lt;/a&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/KCKRfSgL2Ng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/7330351566828701080/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/06/parallel-extensions-4_5009.html#comment-form" title="1 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7330351566828701080" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/7330351566828701080" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/KCKRfSgL2Ng/parallel-extensions-4_5009.html" title="نگاهی به Parallel Extensions در دات نت 4 بخش اول" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/06/parallel-extensions-4_5009.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-5862227651733058594</id><published>2010-05-13T22:35:00.004+04:30</published><updated>2010-06-14T15:42:44.109+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="SalarBlog" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">studiostyles.info</title><content type="html">سایت تقریبا تازه تاسیس شده studiostyles.info محل قرار گیری ترکیب بندی رنگ کدهای Visual Studio هست که هر سه نسخه آخر یعنی 2005 ,2008 و 2010 رو پشتیبانی می کنه.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://studiostyles.info/" target="_blank"&gt;&lt;img class="size-full wp-image-948" title="studiostyles" src="http://salarblog.files.wordpress.com/2010/05/studiostyles.png" alt="studiostyles.info" width="400" height="229" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;در این آدرس می تونید لیست تمامی ترکیب رنگها رو مشاهده کنید: &lt;a href="http://studiostyles.info/schemes" target="_blank"&gt;http://studiostyles.info/schemes&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;راهنمای اعمال این ترکیب رنگها رو &lt;a href="http://studiostyles.info/home/faq" target="_blank"&gt;از اینجا&lt;/a&gt; می تونید مطالعه کنید. خلاصه اون رو اینجا می نویسم:&lt;br/&gt;1- ابتدا از صفحه مورد نظر فایل .vssettings رو برای نسخه مورد نظر دانلود کنید&lt;br/&gt;2- در Visual Studio گزینه Tools &amp;gt; Import and Export Settings رو انتخاب کنید.&lt;br/&gt;3- گزینه Import Selected Environment Settings را انتخاب کنید و در صفحه بعدی محل ذخیره پشتیبان را مشخص کنید.&lt;br/&gt;4- کلید Browse را بزنید و فایل دانلود شده رو انتخاب کنید. در صفحه بعدی تغییری لازم نیست و کلید next و سپس پایان.&lt;br/&gt;&lt;br/&gt;برای نمونه ترکیب رنگی رو که برای خودم استفاده می کنم در این سایت ایجاد کردم، می تونید از اینجا دریافت کنید:&lt;br/&gt;&lt;a href="http://studiostyles.info/schemes/easystandard" target="_blank"&gt;http://studiostyles.info/schemes/easystandard&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;پ.ن1:&lt;/strong&gt; می توانید ترکیب رنگ خودتان را از &lt;a href="http://studiostyles.info/schemes/create" target="_blank"&gt;اینجا&lt;/a&gt; ایجاد کنید.&lt;br/&gt;&lt;strong&gt;پ.ن2:&lt;/strong&gt; تعداد دیگری از ترکیب رنگها در &lt;a href="http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx" target="_blank"&gt;اینجا&lt;/a&gt;&lt;br/&gt;&lt;strong&gt;پ.ن3: &lt;/strong&gt;برای تغییر رنگ خود visual studio ابزار مورد نیاز رو می  تونید &lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/20cd93a2-c435-4d00-a797-499f16402378" target="_blank"&gt;از اینجا&lt;/a&gt; دریافت کنید.&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/cKS591fu9Jc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/5862227651733058594/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/05/studiostylesinfo_219.html#comment-form" title="4 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5862227651733058594" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5862227651733058594" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/cKS591fu9Jc/studiostylesinfo_219.html" title="studiostyles.info" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/05/studiostylesinfo_219.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-5730316379540283284</id><published>2010-05-12T03:58:00.004+04:30</published><updated>2010-06-14T15:42:41.977+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="اخبار فناوری" /><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="معرفی" /><title type="text">نصب و رفع مشکلات راهنمای Visual Studio 2010</title><content type="html">ماکروسافت در نسخه جدید Visual Studio سیستم راهنمای آن را که همنام با کتابخانه  راهنمای ماکروسافت به نام MSDN هست تغییر داده است. در این سیستم که اصطلاحا Help Viewer 1.0 نام دارد، دیگر از Document Explorer خبری نیست و راهنما می تواند در هر مرورگری نمایش داده شود. با این تفاوت که مرورگر پیش فرض صفحات راهنما، خود Visual Studio است.&lt;br/&gt;&lt;br/&gt;متاسفانه نصب راهنما در این نسخه چندان سر راست نیست و همچنین تعدادی مشکل دارد که در این اینجا به بررسی آنها می پردازم.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;نصب راهنما&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;پس از نصب موفقیت آمیز Visual Studio در صفحه پایان نصب، لینکی در پایین صفحه جهت نصب راهنما قرار داده شده که مستقیما از آنجا می توانید مراحل نصب را همانند زیر انجام دهید. لزومی نیست که حتما از آن لینک استفاده کنید، بعدا نیز می توانید راهنما را نصب کنید.&lt;br/&gt;&lt;br/&gt;جهت نصب از طریق Visual Studio از منوی Help گزینه Manage Help Settings را انتخاب کنید. در صورتی که بار اولی است که از این گزینه استفاده می کنید از شما مسیر ذخیره سازی فایلهای آفلاین پرسیده خواهد شد. مسیر را با در نظر گرفتن اینکه ممکن است تا 3 گیگ فضا مورد نیاز باشد تایین کنید.&lt;br/&gt;&lt;br/&gt;پس از آن می توانید از طریق گزینه "Choose online or local help" تعیین کنید که آیا از راهنمای آنلاین می خواهید استفاده کنید یا آفلاین. در صورت انتخاب گزینه آنلاین هیچ نیازی به نصب چیز دیگری نخواهید داشت و راهنمای از طریق سایت MSDN ماکروسافت نمایش داده خواهد شد.&lt;br/&gt;&lt;br/&gt;در صورت انتخاب گزینه آفلاین سیستم راهنما از راهنماهای نصب شده استفاده خواهد کرد. پس نیاز خواهید داشت راهنماها را نصب کنید. نصب راهنمای آفلاین به سادگی از طریق نصب از دیسک نصب و یا دانلود امکان پذیر است. برای دانلود گزینه "Install content from online "  و برای نصب از دیسک گزینه "Install content from disk" را انتخاب کنید.&lt;br/&gt;&lt;br/&gt;فایلهای راهنما در دی وی دی نصب موجود است و بهتر است بجای دانلود از آنها استفاده کنید. فایل نصب راهنما در مسیر DVD:\ProductDocumentation\HelpContentSetup.msha قرار دارد که باید از طریق گزینه Install content from disk اقدام کنید.&lt;br/&gt;&lt;br/&gt;پس از اقدام به نصب می توانید از میان بخش های موجود، بخش های مورد نظر را انتخاب و اقدام به نصب یا دانلود کنید.&lt;br/&gt;&lt;br/&gt;&lt;img class="size-full wp-image-941" title="Help Library Manager" src="http://salarblog.files.wordpress.com/2010/05/helplibmanager.png" alt="Help Library Manager" width="457" height="310" /&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;رفع مشکلات&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;پس از انجام عمل Repair برنامه نصب visual studio و یا به علت حذف ویا تغییر نا خواسته مسیر نصب فایلهای آفلاین سیستم راهنما به طور کل از کار می افتد و با اجرای مجدد Manage Help Settings جهت تغییر مسیر نصب و یا تغییر به وضعیت آنلاین، با خطا مواجه خواهید شد. در این وضعیت هیچ امکانی برای استفاده از راهنما نخواهید داشت. علاوه بر این در روشی که در ادامه توضیح می دم تقریبا هر مشکلی درباره نصب آفلاین راهنما رفع خواهد شد.&lt;br/&gt;&lt;br/&gt;&lt;img class="size-full wp-image-942" title="نمونه خطای سیستم راهنما" src="http://salarblog.files.wordpress.com/2010/05/helperror.png" alt="نمونه خطای سیستم راهنما" width="397" height="137" /&gt;&lt;br/&gt;&lt;br/&gt;چند راه حل برای رفع این مشکل وجود دارد که ساده ترین آنها به این شکل است:&lt;br/&gt;&lt;br/&gt;برنامه Regedit را باز کرده و به مسیر HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0  بروید. در آنجا مقدار LocalStore را پیدا کرده و پاک کنید. سپس مجددا گزینه Manage Help Settings را اجرا کنید تا مسیر نصب مجددا پرسیده شود. که می توانید در این حالت مسیر قبلی راهنماهای نصب شده را تعیین کنید.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;span style="color:#800000;"&gt;&lt;strong&gt;برنامه کمکی H3Viewer&lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;با استفاده از این برنامه رایگان می توانید راهنماهای آفلاین نصب شده را همانند Document Explorer  نسخه قبلی راهنما مشاهده کنید. همچنین با استفاده ازاین برنامه می توایند مرورگر پیش فرض راهنما را نیز تغییر دهید.&lt;br/&gt;&lt;br/&gt;&lt;a href="http://salarblog.files.wordpress.com/2010/05/h3viewer.png"&gt;&lt;img class="size-full wp-image-943" title="H3Viewer" src="http://salarblog.files.wordpress.com/2010/05/h3viewer.png" alt="H3Viewer" width="510" height="345" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;این برنامه کم حجم را می توانید از اینجا دریافت کنید (لینک دانلود در پایین صفحه): &lt;a href="http://mshcmigrate.helpmvp.com/viewer"&gt;http://mshcmigrate.helpmvp.com/viewer&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;برنامه H3Viewer نیاز دارد تا سیستم راهنما در حالت آفلاین کار بکند، در این صورت می تواند راهنماهای نصب شده بر روی سیستم را لیست کند.&lt;br/&gt;&lt;br/&gt;برای تنظیم مرورگر پیش فرض سیستم راهنما از طریق زیر منوی Options-&amp;gt;Set default Viewer for MS HV 1.0 اقدام کنید. توجه کنید که برنامه باید با دسترسی administrator اجرا شده باشد.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;پ.ن:&lt;/strong&gt; در هر صورت وجود راهنمای اصلی نرم افزار لازم و ضروری به نظر می رسه گرچه ممکنه گوگل شما را سریع تر به نتیجه برسونه.&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/xP0esC0xtLg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/5730316379540283284/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/05/visual-studio-2010_7304.html#comment-form" title="6 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5730316379540283284" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/5730316379540283284" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/xP0esC0xtLg/visual-studio-2010_7304.html" title="نصب و رفع مشکلات راهنمای Visual Studio 2010" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/05/visual-studio-2010_7304.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-4097803162555533902</id><published>2010-04-19T01:38:00.004+04:30</published><updated>2012-01-25T17:22:00.298+03:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="برنامه نویسی" /><category scheme="http://www.blogger.com/atom/ns#" term="SalarBlog" /><category scheme="http://www.blogger.com/atom/ns#" term="dotNET Framework" /><title type="text">نمایش صحیح متون فارسی-انگلیسی در جهت چپ به راست</title><content type="html">&lt;div dir="rtl" style="text-align: right;" trbidi="on"&gt;خوشبختانه اکثر کامپوننت های کنونی از ویژگی راست به چپ متون پشتیبانی می کنند، اما همچنان کامپوننت هایی هستند که این ویژگی را که برای ما حیاتی است پشتیبانی نمی کنند. در چنین مواقعی ممکنه که نیاز داشته باشید که حتما از آن ابزار استفاده کنید، ولی همچنان مشکل متون فارسی همراه با متون انگلیسی را خواهید داشت.&lt;br /&gt;&lt;br /&gt;در ادامه با استفاده از کدی که تهیه کردم کاری می کنیم که متونی اینچنینی در حالت چپ به راست هم به درستی نمایش داده بشوند. برای نمونه:&lt;br /&gt;&lt;br /&gt;&lt;img alt="PersianLeftToRightText" class="size-full wp-image-933" height="171" src="http://salarblog.files.wordpress.com/2010/04/persianlefttorighttext2.png" title="PersianLeftToRightText" width="508" /&gt;&lt;br /&gt;&lt;br /&gt;کاری که این تابع انجام می دهد تغییر و جابجایی محل متون انگلیسی و فارسی هست. توجه کنید که متن تغییر داده شده قابل برگشت نیست و هیچ تابعی برای برگشت آن نوشته نشده، پس سعی کنید آن را در هیچ جایی ذخیره نکنید.&lt;br /&gt;&lt;br /&gt;کد این کلاس همراه با پروژه نمونه از آدرس زیر قابل دریافت است.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: maroon;"&gt;&lt;b&gt;به روزرسانی: &lt;a href="http://blog.salarcode.com/2012/01/persian-text-rtl-correction.html" target="_blank"&gt;نسخه جدیدی از این کلاس تهیه شد که در این آدرس قابل دریافت است.&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ویرایش: همچنین نرم افزاری بر اساس همین کلاس نوشتم تا عمل تبدیل را بر  روی فایل متنی انجام بده. این نرم افزار هم از همان لینک قابل دریافت است.&lt;br /&gt;&lt;br /&gt;پ.ن1: ممکن است که این کلاس برای برخی کاراکتر ها به درستی کار نکند، در صورت مشاهده این موارد لطفا آنها را گزارش کنید تا بررسی شوند.&lt;br /&gt;&lt;br /&gt;پ.ن2: در متون چند خطی ترتیب نمایش به پایین به بالا تغییر پیدا می کند و این به خاطر از آخر به اول شدن متون فارسی هست.&lt;br /&gt;&lt;br /&gt;موفق باشید.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/3VEMwM5ycTE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/4097803162555533902/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/04/blog-post_3023.html#comment-form" title="6 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4097803162555533902" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/4097803162555533902" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/3VEMwM5ycTE/blog-post_3023.html" title="نمایش صحیح متون فارسی-انگلیسی در جهت چپ به راست" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/04/blog-post_3023.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4734015984943343401.post-6401621890574935709</id><published>2010-03-20T21:23:00.004+03:30</published><updated>2010-06-14T15:42:37.391+04:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="آموزشی" /><category scheme="http://www.blogger.com/atom/ns#" term="حرفه من" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><category scheme="http://www.blogger.com/atom/ns#" term="SalarBlog" /><title type="text">چند اشتباه در طراحی پایگاه داده</title><content type="html">&lt;div class="mceTemp"&gt;&lt;dl class="wp-caption  alignright"&gt;&lt;dt class="wp-caption-dt"&gt;&lt;img class="size-full wp-image-917" title="Database-Green" src="http://salarblog.files.wordpress.com/2010/03/database-green.png" alt="Database - سال نو مبارک" width="157" height="111" /&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br/&gt;&lt;blockquote&gt;چند ساعتی تا تحویل سال مونده، سال نو همه مبارک و امیدوارم که سال خوبی پیش رو داشته باشید.&lt;br/&gt;سال گذشته که شخصا برام سال پر حادثه ای بود. اینطور که بوش میاد در سال جدید هم رویدادهای مختلف در انتظارم هستند، شاید وقت کمی برای نوشتن داشته باشم.&lt;br/&gt;&lt;br/&gt;این مطلب رو هم مدتی قبل که یک پروژه نیمه کاره رو تحویل گرفتم تا کار کنم و از دست مشکلات پروژه ناراحت بودم نوشتم. پست با کمی ویرایش الان آماده شد!&lt;br/&gt;&lt;br/&gt;سال نو همه مبارک و خوش و خرم باشید!&lt;/blockquote&gt;&lt;br/&gt;&lt;a href="http://salarblog.wordpress.com/"&gt;performance&lt;/a&gt; یا بازده، فاکتور خیلی مهمی در همه زمینه ها هست که معمولا توسط تازه کار ها و گاها توسط طراح دیتابیس فراموش میشود. معمولا در مرحله آموزش، بر روی کارهای کوچک و حجم کوچک اطلاعات مانور داده می شود. پروژه های آموزشی کوچک بوده و مثالها کاربردهای کوچک در مقابل داده های کم را در نظر می گیرند.&lt;br/&gt;&lt;br/&gt;در دنیای واقعی وضعیت فرق میکنه. برنامه های نوشته شده باید برای مدت زمانی طولانی بدون مشکل پاسخ گو باشند. حجم داده های ورودی خیلی زیاد است. و در یک برنامه تجاری ممکنه این موارد برای چند صد تا چند صد هزار رکورد در روز هم برسد. در چنین شرایطی عدم رعایت چند نکته کوچک اما اساسی ممکن است مشکل ساز شود.&lt;br/&gt;&lt;br/&gt;در ادامه می خواهم چند اشتباه در طراحی پایگاه داده رو مطرح کنم، به این امید که دیگر شاهد آنها نباشم. این موارد مطمئنن در طور دوره های آموزی به کرات مطرح می شود ولی شگفتا که هنوز هم عده ای این اشتباه ها را تکرار می کنند.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;استفاده ازنوع داده های رشته ای به عنوان اندیس یا  کلید اصلی&lt;/strong&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;نوع داده varchar و هر نوع داده کاراکتری یا رشته ای بدترین نوع انتخاب برای اندیس جدول است. این اشتباه زمانی بدتر خواهد شد که این فیلد به عنوان کلید اصلی نیز استفاده کنید؛ و سرانجام اشتباه با استفاده از این کلید به عنوان کلید خارجی تکمیل خواهد شد!&lt;br/&gt;&lt;br/&gt;البته توجه داشته باشید که استفاده از فیلد اندیس کاراکتری در کنار کلید اصلی مشکل خاصی نخواهد داشت. فقط این مورد در صروت لزوم و زمانی که از آن فیلد به کرات برای جستجو استفاده میکنید مورد استفاده قرار دهید.&lt;br/&gt;&lt;br/&gt;علت اشتباه بودن این انتخاب در ساخت جدول اندیس و تعداد مقایسه های انجام شده بر می گردد. به عنوان یک مثال ساده مقایسه ، دو نوع عددی می توانند به راحتی توسط دستور عمل های CPU با یکدیگر مقایسه شوند، در حالی که درنوع کارکتری باید تک تک کارکاتر ها با استفاده از شبیه سازی نرم افزاری مقایسه شوند. در رشته های یونیکد هم که حجم کاراکتر ها دو برابر می شوند.&lt;br/&gt;&lt;br/&gt;راه حل: راه حل بسیار ساده استفاده از انواع داده عددی مانند int یا bigint است. در عین حال می توانید از سایر انواع ساده دیگر نیز استفاده کنید.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;عدم استفاده از اندیس یا کلید اصلی&lt;/strong&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;این مورد رو از مورد بالایی جدا کردم چونکه هر کس همچنین اشتباهی رو انجام بده باید در مورد دانش وی تردید کرد. جداولی که ارجاعات مکرری به آنها وجود دارد باید از طریق اندیس ها بهینه شوند. وجود اندیس باعث سرعت بخشیدن در ارجاعات و افزایش بازده دیتابیس خواهد شد. کلید اصلی را هم برای استفاده به عنوان کلید خارجی و یا شناسه هر رکورد مورد استفاده قرار دهید.&lt;br/&gt;&lt;br/&gt;البته یک استثنا در این مورد هم وجود دارد. این مورد زمانی هست که انواع توصیفی را در جدولی جداگانه قرار می دهیم، که در این صورت چون داده های این جدول کم خواهد بود و حذف اضافه ای در کار نخواهد بود، می توان آن جدول را بدون اندیس یا کلید اصلی در نظر گرفت.&lt;br/&gt;&lt;br/&gt;این نکته را هم در نظر داشته باشید که بدون کلید اصلی و یا یک کلید یکتا نمی توانید ارتباطی مابین جداول بر قرار کنید.&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;استفاده از فیلد های NULL بی مورد&lt;/strong&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;همیشه در استفاده از فیلدهای NULL دقت کنید. سعی کنید که فیلدهای رشته ای را NULL قرار ندهید چونکه یک معنای زاید به آن فیلد داده اید، مگر اینکه واقعا به null نیاز داشته باشید. یک کاربرد مفید null بودن فیلد برای کلید های خارجی هست که نشان می دهد، هیچ ارتباطی در رکورد جاری تعریف نشده است. نمونه ای این کاربرد را در تصویر زیر مشاهده می کنید.&lt;br/&gt;&lt;div class="mceTemp mceIEcenter"&gt;&lt;dl class="wp-caption  aligncenter"&gt;&lt;dt class="wp-caption-dt"&gt;&lt;img class="size-full wp-image-922" title="Database" src="http://salarblog.files.wordpress.com/2010/03/database.png" alt="Database" width="391" height="299" /&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br/&gt;در کنار استفاده از فیلدهای null می توانید از مقادیر پیش فرض هم استفاده کنید تا هیچ فیلدی ندانسته خالی رد نشود. این کار کدهای sql شما را هم کوتاه تر خواهد کرد.&lt;br/&gt;&lt;br/&gt;در همین زمینه مطالعه کنید:&lt;br/&gt;&lt;br/&gt;&lt;a href="http://weblogs.sqlteam.com/davidm/archive/2005/09/12/7746.aspx" target="_blank"&gt;10 Common Design Mistakes&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/" target="_blank"&gt;Ten Common Database Design Mistakes&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.15seconds.com/Issue/040115.htm" target="_blank"&gt;Database Performance Philosophy&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/salarblog/~4/diGg1eIA-UI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.salarcode.com/feeds/6401621890574935709/comments/default" title="نظرات پیام" /><link rel="replies" type="text/html" href="http://blog.salarcode.com/2010/03/blog-post_1289.html#comment-form" title="5 نظر" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6401621890574935709" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4734015984943343401/posts/default/6401621890574935709" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/salarblog/~3/diGg1eIA-UI/blog-post_1289.html" title="چند اشتباه در طراحی پایگاه داده" /><author><name>Salar Khalilzadeh</name><uri>https://plus.google.com/105397214522932500988</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-Zw8x2Y5_74s/AAAAAAAAAAI/AAAAAAAAAHg/XvFo4CNkp-o/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.salarcode.com/2010/03/blog-post_1289.html</feedburner:origLink></entry></feed>
