<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>نوشته های یک برنامه نویس</title>
	<atom:link href="http://salarblog.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://salarblog.wordpress.com</link>
	<description>نوشته های سالار خلیل زاده پیرامون حرفه تولید نرم افزار و برنامه نویسی</description>
	<lastBuildDate>Sun, 15 Jan 2012 16:14:32 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='salarblog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/a0c0c85d87ed6df1037f5940bdfca9d2?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>نوشته های یک برنامه نویس</title>
		<link>http://salarblog.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://salarblog.wordpress.com/osd.xml" title="نوشته های یک برنامه نویس" />
	<atom:link rel='hub' href='http://salarblog.wordpress.com/?pushpress=hub'/>
		<item>
		<title>ادامه در دامنه شخصی</title>
		<link>http://salarblog.wordpress.com/2011/12/12/continue-on-personal-domain/</link>
		<comments>http://salarblog.wordpress.com/2011/12/12/continue-on-personal-domain/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 07:36:43 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[معرفی]]></category>
		<category><![CDATA[بدون دسته بندی]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=1109</guid>
		<description><![CDATA[پس از این وقفه طولانی وبلاگ به دامنه شخصی انتقال دادم. آدرس وبلاگ از این به بعد blog.salarcode.com هست. آدرس فید وبلاگ تغییری نکرده و همچنان از طریق feeds2.feedburner.com/salarblogدر دسترس است. در آینده در فرصت های مناسب که اگه زنده بودیم، کارها و کامپوننت های خودم که پراکند بود رو در وبسایتم قرار می دم. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1109&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="text-align:right;" dir="rtl">
<p>پس از این وقفه طولانی وبلاگ به دامنه شخصی انتقال دادم.</p>
<p>آدرس وبلاگ از این به بعد <a href="http://blog.salarcode.com/">blog.salarcode.com</a> هست.</p>
<p>آدرس فید وبلاگ تغییری نکرده و همچنان از طریق <a href="http://feeds2.feedburner.com/salarblog" target="_blank">feeds2.feedburner.com/salarblog</a>در دسترس است.</p>
<p>در آینده در فرصت های مناسب که اگه زنده بودیم، کارها و کامپوننت های خودم که پراکند بود رو در <a href="http://www.salarcode.com/" target="_blank">وبسایتم</a> قرار می دم.</p>
</div>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%af%d9%88%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%a8%d9%86%d8%af%db%8c/'>بدون دسته بندی</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/1109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/1109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/1109/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1109&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2011/12/12/continue-on-personal-domain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>
	</item>
		<item>
		<title>باگ خوب یا بد؟</title>
		<link>http://salarblog.wordpress.com/2010/11/16/is-software-bug-bad-or-not/</link>
		<comments>http://salarblog.wordpress.com/2010/11/16/is-software-bug-bad-or-not/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 04:40:45 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[اخبار فناوری]]></category>
		<category><![CDATA[حرفه من]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Software Bug]]></category>
		<category><![CDATA[دولت]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=1024</guid>
		<description><![CDATA[در ادامه داستانی رو در مورد یکی از پروژه هایی که انجام دادیم و به نکته جالبی که برخوردم رو خواهید خوند. مدتی قبل بر روی تعویض یکی از نرم افزارهای یک اداره دولتی مشغول رایزنی بودیم. نرم افزار مربوطه با فاکس پرو و تحت داس نوشته شده بود. بحث بر سر انتقال اطلاعات از [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1024&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl class="wp-caption   alignright">
<dt class="wp-caption-dt"><img class="size-full wp-image-1102" title="software-bug" src="http://salarblog.files.wordpress.com/2010/11/software-bug.jpg?w=510" alt="software-bug"   /></dt>
</dl>
</div>
<p>در ادامه داستانی رو در مورد یکی از پروژه هایی که انجام دادیم و به نکته جالبی که برخوردم رو خواهید خوند.</p>
<p>مدتی قبل بر روی تعویض یکی از نرم افزارهای یک اداره دولتی مشغول رایزنی بودیم. نرم افزار مربوطه با فاکس پرو و تحت داس نوشته شده بود. بحث بر سر انتقال اطلاعات از آن نرم افزار به نرم افزار جدید بود و لازم بود تا حتما فرمت ذخیره سازی و نام جداول و فیلدهای آن مشخص شود. دلیل این هم که ما نمی توانستیم چنین کاری انجام دهیم عدم نام گذاری صحیح دیتابیس بود. به طور مثال نام یک جدول WRK و نام چند فیلد اول مشخص و بقیه با اسامی مانند F1 تا F20 نام گذاری شده بودند. و البته جالبتر اینکه این نرم افزار در چند شعبه و همچنین شهر های مجاور هم مورد استفاده قرار دارد.</p>
<p>تا اینجای کار هنوز مقصود من نیست و داشتیم به سازشان می رقصیدیم. بحث سر فراخوانی نویسنده این برنامه برای توضیح عملکرد دیتابیس برای انجام انتقال بود که یکی از کارکنان به نکته عجیبی اشاره کرد.</p>
<p>ایشون گفت که برنامه مربوطه معمولا هر 2 یا 3 ماه یکبار دچار مشکل اساسی می شود و مجبور به فراخوانی نویسنده برای رفع مشکل هستیم. اینطور که این کارمند می گفت برای هر پشتیبانی هم معمولا مبلغی رو دریافت می کند. این رو بسط بدید به تمامی شعبه ها! در این میان ظاهرا اداره با نفر مربوطه قبلا تماس گرفته بود تا با ما همکاری نماید اما ایشان برای انجام همکاری را منوط به تمدید قراردادشان به مدت یک سال دیگر کرده بودند.</p>
<p>نکته همینجاست، یعنی یک باگ ناقابل می تونه این هم درآمد زا باشد. یعنی با نوشتن یک باگ هدفمند و تنظیم قرارداد زیرکانه می توان کسب درآمد کرد؟ البته این ایده پلید است و دو از اخلاق حرفه ای اما چه تظمینی وجود دارد که کسی چنین کاری را نکند.</p>
<p>در این میان یک نکته اساسی دیگر وجود دارد و اون کم سوادی و بی سوادی فنی مدیران دولتی است که نمی توانند با تنظیم قراردادهای محکم مانع ضرر دهی خود بشوند. یا اینکه می دانند و نمی خواهند؟! یا شاید هم برایشان مهم نیست و فقط باید بودجه تصویبیشان تا پایان سال به پایان برسد.</p>
<p>خودتان قضاوت کنید&#8230;</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/%d8%a7%d8%ae%d8%a8%d8%a7%d8%b1-%d9%81%d9%86%d8%a7%d9%88%d8%b1%db%8c/'>اخبار فناوری</a>, <a href='http://salarblog.wordpress.com/category/%d8%ad%d8%b1%d9%81%d9%87-%d9%85%d9%86/'>حرفه من</a> Tagged: <a href='http://salarblog.wordpress.com/tag/bug/'>Bug</a>, <a href='http://salarblog.wordpress.com/tag/software-bug/'>Software Bug</a>, <a href='http://salarblog.wordpress.com/tag/%d8%af%d9%88%d9%84%d8%aa/'>دولت</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/1024/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/1024/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/1024/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1024&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/11/16/is-software-bug-bad-or-not/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/11/software-bug.jpg" medium="image">
			<media:title type="html">software-bug</media:title>
		</media:content>
	</item>
		<item>
		<title>مسابقه هوش مصنوعی گوگل</title>
		<link>http://salarblog.wordpress.com/2010/10/23/google-ai-challenge/</link>
		<comments>http://salarblog.wordpress.com/2010/10/23/google-ai-challenge/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 06:01:56 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[معرفی]]></category>
		<category><![CDATA[اخبار فناوری]]></category>
		<category><![CDATA[AI Challenge]]></category>
		<category><![CDATA[AI Contest]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=1091</guid>
		<description><![CDATA[اخیرا دوره دوم مسابقه برنامه نویسی هوش مصنوعی گوگل توسط دانشگلاه واترلو کانادا از 27 سپتامبر گذشته شروع به کار کرده. مهلت شرکت در مسابقه تا 27 نوابر امسال هست. در صورت علاقه مندی به این موضوع فرصت رو از دست ندید. زبانهای برنامه نویسی بسیاری در این دوره پشتیبانی شده اند مانند C#, C++, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1091&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>اخیرا دوره دوم مسابقه برنامه نویسی هوش مصنوعی گوگل توسط دانشگلاه واترلو کانادا از 27 سپتامبر گذشته شروع به کار کرده. مهلت شرکت در مسابقه تا 27 نوابر امسال هست. در صورت علاقه مندی به این موضوع فرصت رو از دست ندید.</p>
<p>زبانهای برنامه نویسی بسیاری در این دوره پشتیبانی شده اند مانند C#, C++, Java, Python, PHP حتی Lisp هم شامل اونها هست. برای مشاهده لیست زیانهای پشتیبانی شده <a href="http://www.ai-contest.com/starter_packages.php" target="_blank">اینجا</a> مراجعه کنید.</p>
<p>موضوع این دوره جنگ سیارات هست که الهام گرفته از بازی فلش <a href="http://www.galcon.com/flash/" target="_blank">Galcon</a> هست. در این بازی باید تمامی سیارات دشمن رو تسخیر کنید. استراتژی و الگوریتم هوش مصنوعی که برای این منظور به کار می گیرید تعیین کننده پیروزی یا شکست شما خواهد بود. در این میان میتونید از سیاراتی که هنوز تسخیر نشده اند هم کمک بگیرید. به همین سادگی!</p>
<div id="attachment_1094" class="wp-caption aligncenter" style="width: 350px"><img class="size-full wp-image-1094" title="دو حریف در حال نبرد" src="http://salarblog.files.wordpress.com/2010/10/planetwars.png?w=510" alt="دو حریف در حال نبرد"   /><p class="wp-caption-text">دو حریف در حال نبرد</p></div>
<ul>
<li><span style="color:#800000;"><a href="http://www.ai-contest.com/index.php" target="_blank">وبسایت مسابقات</a></span></li>
<li><span style="color:#800000;"><a href="http://www.ai-contest.com/rankings.php" target="_blank">رنکینگ مسابقات</a></span></li>
<li><a href="http://www.ai-contest.com/country_profile.php?country_id=112" target="_blank">ایرانی های حاظر در مسابقه</a></li>
<li><a href="http://www.ai-contest.com/profile.php?user_id=11364">ربات من!</a></li>
</ul>
<p>در صورتی که خواستید شرکت کنید <a href="http://www.ai-contest.com/forum/viewtopic.php?f=18&amp;t=748" target="_blank">این ابزار تست</a> به درد شما خواهد خورد.</p>
<p>در مورد #C متاسفانه سرور آنها از نسخه قدیمی Mono استفاده می کند که فقط از از C# 2 پشتیبانی می کند و همچنین کامپایلر آن یک باگ دارد که باعث می شود بسیاری از ارسالها بی جهت کامپایل نشوند.</p>
<p>توجه کنید که این سایت از امکانات Html5 استفاده می کند و باید با مرورگرها جدید مانند نسخه جدید کروم و یا فایرفاکس4 این سایت رو مشاهده کنید.</p>
<p><strong>پ.ن 1:</strong> ظاهرا گوگل این وسط هیچکاره هست و هیچ کمکی نمی کنه و شرکت کنندگان از وضع سرور خیلی ناراضی هستند و می خوان تا حامی دیگری برای این مسابقه پیدا کنند.</p>
<p><strong>پ.ن 2:</strong> این مسابقه هیچ جایزه ای تا الان که این رو مینوسم نداره! گوگل هیچ کارس مثل اینکه!</p>
<p><strong>پ.ن 3:</strong> من هم خواستم که شانس خودم رو امتحان کنم و <a href="http://www.ai-contest.com/profile.php?user_id=11364" target="_blank">نتیجه اش این شد!</a> ده نفر اول واقعا که دانش بسیار بالایی دارند!</p>
<p><strong>پ.ن 4:</strong> لیست <a href="http://www.ai-contest.com/country_profile.php?country_id=112" target="_blank">ایرانی های حاظر در مسابقه</a>، خیلی کمه!</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a7%d8%ae%d8%a8%d8%a7%d8%b1-%d9%81%d9%86%d8%a7%d9%88%d8%b1%db%8c/'>اخبار فناوری</a> Tagged: <a href='http://salarblog.wordpress.com/tag/ai-challenge/'>AI Challenge</a>, <a href='http://salarblog.wordpress.com/tag/ai-contest/'>AI Contest</a>, <a href='http://salarblog.wordpress.com/tag/c/'>C#</a>, <a href='http://salarblog.wordpress.com/tag/google/'>Google</a>, <a href='http://salarblog.wordpress.com/tag/haskell/'>Haskell</a>, <a href='http://salarblog.wordpress.com/tag/lisp/'>Lisp</a>, <a href='http://salarblog.wordpress.com/tag/php/'>PHP</a>, <a href='http://salarblog.wordpress.com/tag/python/'>Python</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/1091/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/1091/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/1091/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1091&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/10/23/google-ai-challenge/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/10/planetwars.png" medium="image">
			<media:title type="html">دو حریف در حال نبرد</media:title>
		</media:content>
	</item>
		<item>
		<title>Parallel سازی برای دات نت 2</title>
		<link>http://salarblog.wordpress.com/2010/10/08/parallels-for-dotnet-2/</link>
		<comments>http://salarblog.wordpress.com/2010/10/08/parallels-for-dotnet-2/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 06:42:43 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[dotNET Framework]]></category>
		<category><![CDATA[معرفی]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[بدون دسته بندی]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[dotNET]]></category>
		<category><![CDATA[dotNET Framework 4.0]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Parallel Extension]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=1050</guid>
		<description><![CDATA[به زمانها دقت کنید. تفاوت فاهش است، 3 ثانیه برای ParallelProcessor در مقابل 1 ثانیه برای WorkAsParallel. اما این دلیل بر بهتر بودن WorkAsParallel نیست. اگر به زمانهای شروع هر تسک نگاه کنید می بینید که تسک های متد WorkAsParallel همه تقریبا همزمان اجرا شده اند. (زمانها به صورت میلی ثانیه:ثانیه هستند). دلیل این امر [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1050&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1080" class="wp-caption alignright" style="width: 125px"><img class="size-full wp-image-1080" title="Parallel" src="http://salarblog.files.wordpress.com/2010/10/parallel.png?w=510" alt="Parallel"   /></dt>
</dl>
</div>
<p>همانطور که در دو <a href="http://salarblog.wordpress.com/2010/10/01/tasks-in-dotnet-4/">پست</a> <a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/">قبلی</a> مطالعه کردید در دات نت فریم ورک 4 قابلیت بسیار مفید parallel اضافه شده است. آن مجموعه کلاسها این امکان را فراهم می کنند که چندین کار در میان هسته های سیستم تقسیم شده و همزمان انجام شود. تنها عیب آن این است که فقط برای دات نت 4 در دسترس است.</p>
<p>برای حل این محدودیت می توان از روش های جایگزین استفاده کرد. گرچه این روشها باز هم به پای امکانات مهیا شده در دات نت 4 نمی رسد ولی باز هم بسیار راه گشا هستند. برای روش جایگزین می توان هم مستقیما از Thread ها استفاده کرد و هم از ThreadPool که کنترل thread ها را خودکار انجام می ده. البته این دو روش تفاوت فاحشی با هم دارند. تفاوت روش استفاده مستقیم از thread با threadpool عدم وابستگی به تعداد هسته cpu ها است، بدین معنا که در آن تقریبا همه آیتمها را به یکباره مورد پردازش قرار خواهند گرفت(البته به تعداد تعیین شده). اما threadpool همانند دات نت 4 عمل کرده و متدهای در حال اجرا و همزمان را به تعداد هسته cpu محدود می کند (با اندکی تفاوت). ابتدا متدی که مستقیما با thread ها کار می کند را معرفی می کنم و سپس روش threadpool را معرفی خواهم کرد.</p>
<p>با استفاده تابع زیر که تهیه کردم این امکان فراهم می آید که لیستی از آیتم ها را برای پردازش توسط یک متد یا رویه به طور همزمان پردازش نمایید. متد WorkAsParallel که در پایین ملاحظه می کنید دو ورودی می گیرد که ورودی اول لیستی جنریک از آیتم ها است و ورودی دوم متد پردازشگر مورد نظر که بر روی تک تک آیتم ها اجرا شده و عمل مورد تان را انجام می دهد.</p>
<pre>public static void WorkAsParallel&lt;T&gt;(IList&lt;T&gt; itemsList, ParameterizedThreadStart itemDoWork)
{
// the maximum number of active threads
const int maxThreads = 10;
List&lt;Thread&gt; workers = new List&lt;Thread&gt;();

if (itemsList.Count &gt; maxThreads)
{
    int currentItem = 0;
    for (int i = 0; i &lt; maxThreads; i++)
    {
        T item = itemsList[i];
        try
        {
            Thread worker = new Thread(itemDoWork);
            worker.IsBackground = true;
            worker.Name = item.ToString();

            workers.Add(worker);

            // item index
            currentItem++;

            // start the thread
            worker.Start(item);
        }
        catch
        {
            // ignore any exception
        }
    }

    // A little break in current thread
    Thread.Sleep(5);

    do
    {
        // start waiting
        for (int i = workers.Count - 1; i &gt;= 0; i--)
        {
            Thread worker = workers[i];

            if ((worker.ThreadState | ThreadState.Stopped) == ThreadState.Stopped)
            {
                workers.RemoveAt(i);

                // thread finished! run next irem if it is there
                if (currentItem &lt;= itemsList.Count - 1)
                {
                    T item = itemsList[currentItem];
                    worker = new Thread(itemDoWork);
                    worker.IsBackground = true;
                    worker.Name = item.ToString();

                    workers.Add(worker);

                    // increase the item index
                    currentItem++;

                    // start the thread
                    worker.Start(item);
                }
            }
        }

        // a little break
        Thread.Sleep(5);

    } while (itemsList.Count &gt; currentItem);

    // now all the list items are in progress

    // start waiting for them to be done
    foreach (Thread worker in workers)
    {
        // just wait for it
        // an infinity wait!
        worker.Join();
    }
}
else
{
    // all items are starting in threads
    foreach (T item in itemsList)
    {
        try
        {
            Thread worker = new Thread(itemDoWork);
            worker.IsBackground = true;
            worker.Name = item.ToString();

            workers.Add(worker);

            // start the thread
            worker.Start(item);
        }
        catch
        {
            // ignore any exception
        }
    }

    // A little break in current thread
    Thread.Sleep(5);

    // start waiting for them to be done
    foreach (Thread worker in workers)
    {
        // just wait for it
        // an infinity wait!
        worker.Join();
    }
}
}</pre>
<p>به طور پیش فرض تعداد thread فعال 10 در نظر گرفته شده است (توسط ثابت maxThreads که قابل افزایش است) بدین معنا که در صورتی تعداد آیتمهای لیست شما بیش از 10 تا باشد ابتدا فقط 10 آیتم ابتدایی اجرا خواهند شد و تنها پس از پایان هر thread آیتم بعدی مورد پردازش قرار خواهد گرفت. این محدودیت به خاطر جلوگیری از وارد شدن فشار بیش از حد به سیستم در نظر گرفته شده و در صورت صلاحدید شما قابل افزایش است.</p>
<ul>
<li><span style="color:#800000;"><strong>روش استفاده از WorkAsParallel</strong></span></li>
</ul>
<p>در مثال زیر یک لیست از DateTime با تاخیر زمانی 1 ثانیه چاپ می شود تا همزانی اجرا هم مشخص شود.</p>
<pre>public void TestWorkAsParallel()
{
    List&lt;DateTime&gt; theList = new List&lt;DateTime&gt;();
    theList.Add(DateTime.Now.AddDays(1));
    theList.Add(DateTime.Now.AddDays(2));
    theList.Add(DateTime.Now.AddDays(3));

    ParallelWorks.WorkAsParallel(theList, x =&gt;
    {
        DateTime item = (DateTime)x;
        Console.Write(item);
        Thread.Sleep(1000);
    });
}</pre>
<p>و برای استفاده در VS 2005 که با کامپایلر CCS2 کار می کنه مثال مذبور رو به این تغییر بدید:</p>
<pre>ParallelWorks.WorkAsParallel(theList, delegate(object x)
{
    DateTime item = (DateTime) x;
    Console.Write(item);
    Thread.Sleep(1000);
});</pre>
<ul>
<li><strong><span style="color:#800000;">استفاده از ThreadPool</span></strong></li>
</ul>
<p>متد مورد نظر من در <a href="http://blog.robvolk.com/2009/02/c-parallelism-executing-methods-in.html">این پست از وبلاگ</a> معرفی شده است. این متد لیستی از متد های قابل اجرا را دریافت کرده و به صورت همزمان اجرا می کند.</p>
<pre>public class ParallelProcessor
{
    public delegate void Method();

    /// &lt;summary&gt;
    /// Executes a set of methods in parallel and returns the results
    /// from each in an array when all threads have completed.  The methods
    /// must take no parameters and have no return value.
    /// &lt;/summary&gt;
    /// &lt;param name="m"&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public static void ExecuteParallel(params Method[] methods)
    {
        // Initialize the reset events to keep track of completed threads
        ManualResetEvent[] resetEvents = new ManualResetEvent[methods.Length];

        // Launch each method in it's own thread
        for (int i = 0; i &lt; methods.Length; i++)
        {
            resetEvents[i] = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(new WaitCallback((object index) =&gt;
            {
                int methodIndex = (int)index;

                // Execute the method
                methods[methodIndex]();

                // Tell the calling thread that we're done
                resetEvents[methodIndex].Set();
            }), i);
        }

        // Wait for all threads to execute
        WaitHandle.WaitAll(resetEvents);
    }
}</pre>
<p>روش استفاده آن هم همانطور که در آن پست ذکر شده آسان است.</p>
<pre>ParallelProcessor.ExecuteParallel(() =&gt;
{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
}, () =&gt;
{
    Console.WriteLine("The long task 2");
    Thread.Sleep(500);
},
() =&gt;
{
    Console.WriteLine("The long task 3");
    Thread.Sleep(500);
});</pre>
<p>و برای VS2005 از این روش فراخوانی استفاده کنید:</p>
<pre>ParallelProcessor.Method[] methods = new ParallelProcessor.Method[3];
methods[0] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
methods[1] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
methods[2] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
ParallelProcessor.ExecuteParallel(methods);</pre>
<ul>
<li><strong><span style="color:#800000;">مقایسه WorkAsParallel و ParallelProcessor در عمل</span></strong></li>
</ul>
<p>مسلما مقایسه این دو روش زیاد صحیح نخواهد بود. این به علت متفاوت بودن شیوه اجرای این دو روش است. به هرحال جهت نمایش این تفاوت مثال زیر را اجرا می کنیم:</p>
<pre>static void Main(string[] args)
{
    Console.WriteLine("Parallels for .NET 2, salarblog.wordpress.com");

    // The list
    List&lt;int&gt; taskList = new List&lt;int&gt;() { 1, 2, 3, 4, 5, 6 };

    var pwatch = Stopwatch.StartNew();
    ParallelWorks.WorkAsParallel(taskList, x =&gt;
    {
        Console.WriteLine("The long task {0} started at {1}", x, DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    });
    pwatch.Stop();
    Console.WriteLine("WorkAsParallel done!");

    var twatch = Stopwatch.StartNew();
    ParallelProcessor.ExecuteParallel(delegate
    {
        Console.WriteLine("Task 1 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 2 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 3 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 4 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 5 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 6 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    });
    twatch.Stop();

    Console.WriteLine();
    Console.WriteLine("WorkAsParallel finished in {0} seconds", pwatch.Elapsed.TotalSeconds);
    Console.WriteLine("ParallelProcessor finished in {0} seconds", twatch.Elapsed.TotalSeconds);

    // wait
    Console.ReadKey();
}</pre>
<p>نتیجه اجرا چیزی مانند این خواهد بود (این نتیجه سیستم دو هسته من هست):</p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption  aligncenter">
<dt class="wp-caption-dt"><img class="size-full wp-image-1078" title="WorkAsParallel v.s. ParallelProcessor" src="http://salarblog.files.wordpress.com/2010/10/paralleldotnet2test.png?w=510" alt="WorkAsParallel v.s. ParallelProcessor"   /><p class="wp-caption-text">WorkAsParallel v.s. ParallelProcessor</p></div>به زمانها دقت کنید. تفاوت فاهش است، 3 ثانیه برای ParallelProcessor در مقابل 1 ثانیه برای WorkAsParallel. اما این دلیل بر بهتر بودن WorkAsParallel نیست. اگر به زمانهای شروع هر تسک نگاه کنید می بینید که تسک های متد WorkAsParallel همه تقریبا همزمان اجرا شده اند. (زمانها به صورت <em>میلی ثانیه:ثانیه</em> هستند). دلیل این امر را همانطور که گفتیم استفاده مستقیم از thread است.</p>
<p>&nbsp;</p>
<p>در هر صورت این دو توابع در دسترس هستند و می توانید با توجه به نیاز خود هر کدام را که خواستید انتخاب کرده و مورد استفاده قرار دهید.</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/dotnet-framework/'>dotNET Framework</a>, <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%af%d9%88%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%a8%d9%86%d8%af%db%8c/'>بدون دسته بندی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c/'>برنامه نویسی</a> Tagged: <a href='http://salarblog.wordpress.com/tag/dotnet/'>dotNET</a>, <a href='http://salarblog.wordpress.com/tag/dotnet-framework-4-0/'>dotNET Framework 4.0</a>, <a href='http://salarblog.wordpress.com/tag/parallel/'>Parallel</a>, <a href='http://salarblog.wordpress.com/tag/parallel-extension/'>Parallel Extension</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/1050/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/1050/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/1050/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=1050&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/10/08/parallels-for-dotnet-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/10/parallel.png" medium="image">
			<media:title type="html">Parallel</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/10/paralleldotnet2test.png" medium="image">
			<media:title type="html">WorkAsParallel v.s. ParallelProcessor</media:title>
		</media:content>
	</item>
		<item>
		<title>نگاهی به Parallel Extensions در دات نت 4 بخش دوم</title>
		<link>http://salarblog.wordpress.com/2010/10/01/tasks-in-dotnet-4/</link>
		<comments>http://salarblog.wordpress.com/2010/10/01/tasks-in-dotnet-4/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 08:11:01 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[dotNET Framework]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Parallel Extension]]></category>
		<category><![CDATA[PLinq]]></category>
		<category><![CDATA[Task]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=992</guid>
		<description><![CDATA[در نوشته قبلی در مورد شیوه عملکرد و به کارگیری PLINQ و Parallel ها مطالبی خواندید. در این نوشتار قصد دارم در مورد Task ها (وظایف) صحبت کرده و مروری بر نکات مهم آن داشته باشیم. Task چیست Task کلاس جدیدی است که نماینده کاری است که قرار است انجام بدهید. تسکها نیز همانند Parallel [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=992&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>در <a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/">نوشته قبلی</a> در مورد شیوه عملکرد و به کارگیری PLINQ و Parallel ها مطالبی خواندید. در این نوشتار قصد دارم در مورد Task ها (وظایف) صحبت کرده و مروری بر نکات مهم آن داشته باشیم.</p>
<ul>
<li><span style="color:#800000;"><strong>Task چیست</strong></span></li>
</ul>
<p><a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx" target="_blank">Task</a> کلاس جدیدی است که نماینده کاری است که قرار است انجام بدهید. تسکها نیز همانند Parallel ها فقط بر روی هسته های CPU زمی شوند. به این معنا که به تعداد هسته های CPU تسک ها خواهند توانست به طور همزمان اجرا شوند. متدها و کلاسهایی برای کنترل تسک ها فراهم شده تا امکان کنترل اجرای آنها و همزمان سازی آنها را مهیا کند.</p>
<p>تمامی پیچیدگی کار و اعمالی قرار است بر روی تسک ها انجام بشود توسط Task Scheduler (زمان بند وظایف) پیاده شده و انجام می شود. کاری که Task Scheduler انجام می دهد مدیریت اجرای تسک ها و کنترل نحوه تقسیم آنها در میان Thread های مختلف است.</p>
<p>فرایندی که هنگام کار با Task Scheduler اتفاق می افتد را اینگونه می توان شرح داد:</p>
<ul>
<li>هنگام ایجاد تسک، آن به صف عمومی تسک ها اضافه می شود.</li>
<li>ایجاد Thread های &#8220;کارگر&#8221; مورد نیاز برای انجام کار تسک ها توسط مدیر Thread های دات نت (Thread pool). تعداد دقیق این thread ها بستگی به فاکتور های مختلفی از جمله تعداد هسته های cpu سیستم، حجم کارهای فعلی در جریان، نوع کار در جریان دارد. برای مثال اگر مدیر thread ها تشخصی دهد که فرایندها در مرحله کار با I/O دارای تاخیر هستند (مانند ذخیره یا دانلود فایل) تعداد thread بیشتری را برای افزایش سرعت ایجاد خواهد کرد. همچنین فرایند پشت زمینه ای هم همزمان هر 0.5 ثانیه پایان کار thread ها را بررسی می کند که اگر هیچ کدام به پایان نرسیده باشد، thread جدیدی را برای انجام کار ایجاد کند.</li>
<li>هر thread کارگر تسک ها را از صف عمومی تسک ها برداشته و به صف داخلی خود برای اجرا انتقال می دهد.</li>
<li>هر thread کارگر تسک های صف داخلی خود را انجام می دهد.</li>
<li>اگر هر thread صف داخلی خود را به پایان برساند، از صف thread های دیگر کارهای در انتظار را از آخر صف برداشته و پردازش می کند.</li>
<li>نموداری از فرایند بالا را مشاهده کنید:</li>
</ul>
<div id="attachment_1064" class="wp-caption aligncenter" style="width: 515px"><a href="http://salarblog.wordpress.com"><img class="size-full wp-image-1064" title="روند کار مدیر تسک ها" src="http://salarblog.files.wordpress.com/2010/10/taskoverview510-345.png?w=510" alt="روند کار مدیر تسک ها"   /></a><p class="wp-caption-text">روند کار مدیر تسک ها</p></div>
<ul>
<li><strong><span style="color:#800000;">ایجاد و مدیریت تسکها<br />
</span></strong></li>
</ul>
<p>ایجاد و به کار گیری تسک ها بسیار ساده و آسان است. برای ایجاد تسک از دو طریق می توان اقدام کرد. متد <a href="http://msdn.microsoft.com/en-us/library/dd321439.aspx" target="_blank">Task.Factory.StartNew</a> که ورودی تابع مورد نظر (از نوع action delegate) را دریافت کرده و فورا شروع به کار می کند. مانند مثال زیر:</p>
<p><code>Task test = Task.Factory.<strong>StartNew</strong>(() =&gt; Console.WriteLine("hello"));</code></p>
<p>و یا اینکه مستقیما نمونه جدید از کلاس Task ایجاد کنید که ورودی آن هم تابع مورد نظر برای اجرا خواهد بود. برای اجرای تسک سپس باید متد Start را فرواخوانی بکنید:</p>
<pre>Task test= new <strong>Task</strong>(() =&gt; Console.WriteLine("hello"));
test.<strong>Start</strong>();</pre>
<p><strong>انتظار برای پایان تسک</strong></p>
<p>در حالت عادی اجرای تسک سبب مسدود شدن رویه در حال اجرا نخواهد شد. در صورتی که مایل باشید تا اجرای رویه را تا پایان تسک یا تسک های مورد نظر متوقف کنید از توابع زیر می توانید استفاده کنید.</p>
<p>متد <a href="http://msdn.microsoft.com/en-us/library/dd235635.aspx" target="_blank">Task.Wait</a> سبب انتظار برای پایان تسک مورد نظر خواهد شد. برای انتظار به چندین تسک از متد <a href="http://msdn.microsoft.com/en-us/library/dd270695.aspx" target="_blank">Task.WaitAll</a> استفاده کنید که چندین تسک را به عنوان ورودی دریافت می کند و رویه اجرای برنامه تا پایان همه آنها منتظر خواهد بود.</p>
<p>متد <a href="http://msdn.microsoft.com/en-us/library/dd270672.aspx" target="_blank">Task.WaitAny</a> چندین ورودی تسک را دریافت می کند و تا زمانی که حداقل یکی از تسک ها به پایان برسد منتظر خواهد ماند. کاربرد این روش می تواند برای انجام عملی باشد که نتیجه مشابهی دارد و از روش متفاوت می توان استفاده کرد و نتیجه برایتان مهم است.</p>
<p>مثالی از کاربرد این متد ها:</p>
<pre>Task task1 = Task.Factory.StartNew(() =&gt; Console.WriteLine("task 1"));
Task task2 = new Task(() =&gt; Console.WriteLine("hello task 2"));
Task task3 = Task.Factory.StartNew(() =&gt; Console.WriteLine("task 3")); 

task2.Start(); 

task1.<strong>Wait</strong>();
Task.<strong>WaitAll</strong>(task2, task3);</pre>
<p>با استفاده از ویژگی <a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.iscompleted.aspx" target="_blank"><em>IsComplete</em></a> نیز میتوانید به پایان رسیدن یک تسک را مورد آزمایش قرار دهید.</p>
<p><strong>ترتیب اجرا</strong></p>
<p>در صورتی که نیاز داشته باشید تا حتما پس از پایان یک تسک، تسک بعدی اجرا شود تابع ContinueWith برای همین منظور در نظر گرفته شده است. این تابع باید بر روی تسک مورد نظر فراخوانی شود. در این صورت متد ارسالی به ContinueWith بعد از تسک مورد نظر فراخوانی خواهد شد.</p>
<pre>Task task = Task.Factory.StartNew(() =&gt; Console.WriteLine(" task 1"))
.ContinueWith(x=&gt;  Console.WriteLine("task 2") )
.ContinueWith(x=&gt;  Console.WriteLine("task 3") )
.ContinueWith(x=&gt;  Console.WriteLine("task 4") );</pre>
<p><em> نکته:</em> توجه کنید که در این مثال تسکها یکی پس از دیگری و فقط در صورت پایان هر تسک، تسک بعدی اجرا خواهد شد. (یعنی تسک ها به طور همزمان بر روی هسته های مختلف اجرا نخواهند شد)</p>
<p>همچنین تابع ContinueWith ورودی از نوع TaskContinuationOptions را دریافت می کند که امکان تعیین شرط برای اجرای تسک را فراهم و همچنین ویژگیهای ویژه ای را برای تسک تعیین می کند. برای مثال با تعیین TaskContinuationOptions.OnlyOnFaulted به عنوان شرط، تسک بعدی فقط در صورت شکست اجرای تسک قبلی اجرا خواهد شد. برای اطلاع بیشتر راجع به سایر مقادیر به <a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions.aspx" target="_blank">راهنمای msdn</a> مراجعه کنید.</p>
<p><strong>دریافت خروجی از تسک</strong></p>
<p>برای دریافت خروجی کافی هست که در متد تسک مورد نظر خروجی را ارسال کنیم ( در حقیقت داریم از Func delegate استفاده می کنیم). در این صورت خروجی از طریق ویژگی Result در دسترس خواهد بود.</p>
<pre>var data = Task.Factory.StartNew(() =&gt; GetResult());
Console.WriteLine("Parallel task returned with value of {0}", data.Result);

Task&lt;string&gt; t = new Task&lt;string&gt;(()=&gt;{
return "hello";
});
t.Start();
Console.WriteLine("The result is {0}", t.Result);</pre>
<p><strong>نکته</strong>: فراخوانی ویژگی Result در صورتی که هنوز تسک به پایان نرسیده سبب خواهد شد تا برنامه تا زمان پایان یافتن اجرای تسک و دریافت خروجی متوقف شود. برای جلوگیری از این اتفاق می توانید از ویژگی <em>IsComplete</em> یا روشهایی که خواندید استفاده کنید.</p>
<ul>
<li><span style="color:#800000;"><strong>تداخل با UI</strong></span></li>
</ul>
<p>هنگام کار با thread ها نمی توانید مقادیر کنترل ها را تغییر بدهید به عبارت دیگر، به thread مربوط به GUI دسترسی نخواهید داشت. (این محدودیت به علت جلوگیری از مشکلات احتمالی توسط دات نت اعمال شده است).</p>
<p>با توجه به اینکه Task هم از thread ها برای اجرای متدهایش استفاده می کند همین مشکل نیز در استفاده از آنها وجود دارد. راه حل این مشکل بسیار ساده می باشد.</p>
<p>برای حل این مشکل با استفاده از تابع TaskScheduler.FromCurrentSynchronizationContext که مدیر تسک های(TaskScheduler) جدیدی را برای thread فعلی ایجاد کرده و بر میگرداند. حال اگر این تابع را در فرم اجرا کنیم محیط اجرا در thread GUI قرار خواهد داشت. سپس کافی است تا این مقدار را به سازنده تسک و یا ادامه دهنده آن (ContinueWith) ارسال کنیم. در این صورت تسک مورد نظر در thread فرم اجرا خواهد شد و در نتیجه تغییر کنترل ها بدون مشکل میسر خواهد بود.</p>
<pre>private void button1_Click(object sender, EventArgs e)
{
    var ui = TaskScheduler.FromCurrentSynchronizationContext();

    Task.Factory.StartNew(() =&gt;
    {
        return LoadAndProcessImage(); // compute the image

    }).ContinueWith(t =&gt;
    {

        pictureBox1.Image = t.Result; // display it

    }, ui);
}</pre>
<p>در این مثال ابتدا پردازش مورد نظر انجام می شود سپس در تسک بعدی که در thread مربوط به GUI اجرا خواهد شد، نتیجه به کنترل تصویر تخصیص داده می شود.</p>
<p>موفق باشید.</p>
<ul>
<li><span style="color:#800000;"><strong>منابع</strong></span></li>
</ul>
<p><a href="http://www.amazon.com/Pro-NET-Parallel-Programming/dp/1430229675">APress &#8211; Pro .NET 4 Parallel Programming in C#</a><br />
<a href="http://www.amazon.com/Introducing-NET-4-0-Visual-Experts/dp/143022455X">APress &#8211; Introducing .NET 4.0</a><br />
<a href="http://blogs.msdn.com/b/pfxteam/archive/2009/04/14/9549246.aspx">What’s new in Beta 1 for the Task Parallel Library?</a></p>
<p>پ.ن: با پوزش از خوانندگان و دنبال کننگان به خاطر نامنظم و طولانی شدن آپدیت ها.</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/dotnet-framework/'>dotNET Framework</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c/'>برنامه نویسی</a> Tagged: <a href='http://salarblog.wordpress.com/tag/parallel/'>Parallel</a>, <a href='http://salarblog.wordpress.com/tag/parallel-extension/'>Parallel Extension</a>, <a href='http://salarblog.wordpress.com/tag/plinq/'>PLinq</a>, <a href='http://salarblog.wordpress.com/tag/task/'>Task</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/992/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/992/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/992/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=992&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/10/01/tasks-in-dotnet-4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/10/taskoverview510-345.png" medium="image">
			<media:title type="html">روند کار مدیر تسک ها</media:title>
		</media:content>
	</item>
		<item>
		<title>نگاهی به Parallel Extensions در دات نت 4 بخش اول</title>
		<link>http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/</link>
		<comments>http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 18:24:34 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[dotNET Framework]]></category>
		<category><![CDATA[معرفی]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[Parallel]]></category>
		<category><![CDATA[Parallel Extension]]></category>
		<category><![CDATA[PLinq]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=926</guid>
		<description><![CDATA[Parallel Extensions مجموعه ای کلاسها متدها و روشهایی هست که به دات نت 4 اضافه شده و امکان اجرای درخواستها و متد ها را به صورت موازی می دهد. به طور دقیق تر در این روش برنامه می تواند برخی درخواستهای خاص را به صورت موازی در چند هسته CPU به طور همزمان اجرا کند [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=926&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Parallel Extensions مجموعه ای کلاسها متدها و روشهایی هست که به دات نت 4 اضافه شده و امکان اجرای درخواستها و متد ها را به صورت موازی می دهد. به طور دقیق تر در این روش برنامه می تواند برخی درخواستهای خاص را به صورت موازی در چند هسته CPU به طور همزمان اجرا کند بدون اینکه در روند عادی اجرای برنامه وقفه ای ایجاد شود ویا نیاز به تغییر عمده ای داشته باشد.</p>
<p>شاید بپرسید که Threading همین کار را انجام می دهد و چه نیازی به استفاده از این روش وجود دارد. در پاسخ باید گقت Parallelization (یا همزمان سازی) کاربردی نسبتا متفاوت از کاربرد thread ها دارد، گرچه خود شیوه parallel از thread ها استفاده می کند. در حقیقیت parallel ها برای استفاده سریع تر از thread ها در مقاصد خاص ایجاد شده اند و نه جایگزینی برای آن؛ جایی که تعداد زیادی از thread باعث ایجاد مشکلات مدیریتی می شود.</p>
<ul>
<li><strong>فرق بین Threading و Parallel</strong></li>
</ul>
<p>به طور خلاصه می توان چند thread را در یک cpu تک هسته ای اجرا کرد ولی parallel سازی فقط در cpu های چند هسته ای اتفاق خواهد افتاد. در هنگام استفاده از parallel ها دات نت به طور خودکار اقدام به شناسایی سیستم برای دارا بودن cpu چند هسته ای می کند، در صورتی سیستم دارای چنین قابلیتی باشد دات نت اقدامات بعدی را برای اجرای پروسه به صورت parallel انجام خواهد داد. این یکی از مزایای این روش هست که تضمین می کند کد برنامه در هر سیستمی قابل اجرا خواهد بود.</p>
<p>در تصویر زیر مشاهده میکنید که thread ها  در یک سیستم تک هسته ای به صورت ترتیبی اجرا می شود و parallel در یکی سیستم چند هسته ای همزمان اجرا می شود.<br />
(توجه کنید که thread ها هم در سیستم چند هسته ای می توانند در هسته های مختلف می توانند اجرا شوند ولی تضمینی برای اجرای همزمان آنها وجود ندارد و کنترل آن توسط سیستم عامل انجام می شود.)</p>
<div id="attachment_959" class="wp-caption aligncenter" style="width: 455px"><img class="size-full wp-image-959" title="Serial vs. Parallel" src="http://salarblog.files.wordpress.com/2010/06/serialparallel.png?w=510" alt="Serial vs. Parallel"   /><p class="wp-caption-text">Serial vs. Parallel</p></div>
<ul>
<li><strong>Parallel Loops</strong></li>
</ul>
<p>دو متد Parallel.For و Parallel.ForEach که در فضای نام System.Threading.Tasks قرار دارند برای انجام حلقه های پارالل در نظر گرفته شده اند. نسخه های مختلفی از آنها با توجه به ورودی و خروجی این متد ها در نظر گرفته شده تا همه شرایط را پوشش دهند. اما برای استفاده از لازم نیست که حتما از این توابع استفاده کنید. متد اضافه شونده AsParallel که جزوی از PLINQ برای راحتی کار در نظر گرفته شده است.<br />
همه لیست ها و آرایه هایی که اینترفیس IEnumerable رو پیاده سازی می کنند بسادگی و با استفاده از متد اضافه شوند (extension method) با نام AsParallel امکان استفاده از پارالل ها را دارند. این متد که در مبحث PLINQ کاربرد دارد کار را بسیار ساده کرده و روش استفاده از آن در حد یک فراخوانی ساده کرده است.</p>
<p>در مثال ساده زیر یک حلقه از 0 تا 100 داریم که به صورت پارالل اجرا می شود. در بخش بعدی در مثالی در مورد AsParallel را مشاهده خواهید کرد.</p>
<pre><span style="color:#800000;"><strong>Parallel</strong></span>.<span style="color:#800000;"><strong>For</strong></span>(0, 100, index =&gt;
{
     Console.WriteLine("Id:{0} Num:{1} - ", Task.CurrentId, index);
});</pre>
<p>در اینجا Task.CurrentId مقدار id تسک در حال اجرا نشان می دهد. در بخش بعدی در مورد تسک ها خواهم نوشت.</p>
<ul>
<li><strong>کارایی Parallel سازی</strong></li>
</ul>
<p>کارایی این روش بستگی زیادی به کاری که می خواهید با آن انجام دهید  دارد. همیشه سعی کنید کارهایی را که به زمان زیادی نیاز دارد را به صورت پارالل تبدیل اجرا کنید. برای مثال دانلود فیدهای چندین سایت مختلف برای نوشتن نرم افزار فید خوان، یا جستجو در میان لیست یا آرایه ای طولانی.</p>
<p>دلیل این امر زمانی است که دات نت برای آماده سازی تسک و تقسیم وظایف انجام می دهد. گرچه برای سیستم های سریع فعلی این زمان در حد چند میلی ثانیه است ولی ممکن است در برخی سیستم های قدیمی تر اندکی محسوس تر باشد.</p>
<p>همچنین در هنگام استفاده از parallel ها همیشه در نظر داشته باشید که بهترین نتیجه را زمانی خواهید گرفت که cpu سیستم دارای چند هسته باشد. در غیر این صورت این روش ممکن است اندکی سربار ایجاد کند.</p>
<p>درمثال زیر می خواهیم یک کار زمانبر را دو روش parallel و serial اجرا کنیم و نتایج را بررسی کنیم.</p>
<pre>class LongTask
{
 public int ID { get; set; }
 public void DoIt()
 {
  Console.WriteLine("The long task " + ID);
  System.Threading.Thread.Sleep(500);
 }
}
static void Main(string[] args)
{

  // The list
  List&lt;LongTask&gt; taskList = new List&lt;LongTask&gt;();

  // The items
  for (int i = 0; i &lt; 20; i++)
  {
   taskList.Add(new LongTask { ID = i });
  }

  // Serial
  Console.WriteLine("Starting serial test");
  var swatch = Stopwatch.StartNew();
  foreach (var item in taskList)
  {
   // the long task
   item.DoIt();
  }
  swatch.Stop();

  // parallel
  Console.WriteLine("Starting parallel test");
  var pwatch = Stopwatch.StartNew();
  taskList.<span style="color:#800000;"><strong>AsParallel</strong></span>().<span style="color:#800000;"><strong>ForAll</strong></span>(x =&gt;
  {
   x.DoIt();
  });
  pwatch.Stop();

  Console.WriteLine();
  Console.WriteLine("Parallel programming demo, salarblog.wordpress.com");
  Console.WriteLine("Serial task finished in {0} seconds", swatch.Elapsed.TotalSeconds);
  Console.WriteLine("Parallel task finished in {0} seconds", pwatch.Elapsed.TotalSeconds);

  // wait
  Console.ReadKey();
}</pre>
<p>تصویر زیر نتیجه اجرای این برنامه را در لپتابم که cpu اون core 2 due 2.6 دو هسته ای هست رو نشان میده.</p>
<div id="attachment_964" class="wp-caption aligncenter" style="width: 389px"><img class="size-full wp-image-964" title="Parallel Performance Test" src="http://salarblog.files.wordpress.com/2010/06/parallelperformancetest.png?w=510" alt="Parallel Performance Test"   /><p class="wp-caption-text">Parallel Performance Test</p></div>
<p>تفاوت فاهش هست. 10 ثانیه برای serial و 5 ثانیه برای parallel. مدت زمان اجرا با استفاده از parallel تقریبا نصب شده است. البته این بهترین حالت برای یک سیستم دو هسته ای است چون این تست هیچ فشاری رو روی سیستم وارد نمی کنه.</p>
<p><strong><span style="color:#800000;">نکته بسیار مهم:</span> </strong>اگه به تصویر بالا دقت کنید در هنگام اجرای تست parallel تسک ها بدون ترتیب و در هم اجرا شده اند. این به این علت است که تسک ها در میان هسته های cpu تقسیم شده اند تا تداخلی در هنگام اجرا ایجاد نشود. نحوه تقسیم را هم دات نت تنظیم می کند که در ایجا و برای cpu دو هسته ای برای یک هسته از اول تا وسط و برای هسته بعدی از وسط تا آخر پردازش شده است.</p>
<p>پس همیشه در استفاده از parallel ها دقت کنید که آیا نیاز دارید که لیست به صورت مرتب بررسی شود یا نه. در صورتی که لازم است لیست به صورت مرتب پارالل شود باید از متد Parallel.For که قبلا اشاره شد استفاده کنید. این متد تظمین می کند که لیست شما مرتب و در عین حال parallel اجرا شود. شیوه رفع این مشکل در PLINQ در ادامه گفته خواهد شد.</p>
<p>دو متد Parallel.For و Parallel.ForEach کلاس ParallelOptions را به عنوان ورودی قبول می کنند که کنترل بیشتری بر تسک ها در اخیار می گذارد. برای اطلاعات بیشتر در مورد ParallelOptions به منابع انتهای مقاله مراجه کنید.</p>
<p><strong><span style="color:#800000;">نکته مهم &#8211; اشتباه به کار گیری:</span></strong> نکته دیگری که لازم به ذکر است این است که نباید لیست هایی که توسط تابع AsParallel به لیست های پارالل تبدیل شده اند را توسط دستور foreach ساده فراخوانی کرد. برای مشاهده نتیجه دقیق کد زیر را در مثال بالا جایگزین کرده و اجرا کردم نتیجه آن را در تصویر زیر می بینید:</p>
<pre>foreach (var item in taskList.<span style="color:#800000;"><strong>AsParallel</strong></span>())
{
 // the long task
 item.DoIt();
}</pre>
<div id="attachment_968" class="wp-caption aligncenter" style="width: 410px"><img class="size-full wp-image-968" title="Wrong Parallel Usage" src="http://salarblog.files.wordpress.com/2010/06/wrongparallelusage.png?w=510" alt="Wrong Parallel Usage"   /><p class="wp-caption-text">Wrong Parallel Usage</p></div>
<p>همانطور که مشاهده می کنید نه تنها استفاده از ناصحیح از پارالل باعث کاهش زمان نشده بلکه چند میلی ثانیه این زمان بیشتر نیز شده است. دلیل این است که با استفاده از متد AsParallel یک لیست parallel بدست می آوریم ولی دستور foreach ساده این لیست را به طور ساده و serial اجرا می کند و هیچ عمل پارالل سازی اتفاق نمی افتد.</p>
<ul>
<li><strong>PLINQ &#8211; Parallel LINQ</strong></li>
</ul>
<p>اگر دقت کرده باشید من در مثالهای قبلی از PLINQ استفاده کرده ام که قلب اصلی آن متد AsParallel هست.  PLINQ نسخه parallel شده LINQ هست که علاوه بر متد ذکر شده شامل متدهای دیگری برای مدیریت ویژگی parallel آن هم هست. تعدادی از این متد های اصلی در لیست زیر را ذکر می کنم:</p>
<ul>
<li><strong>AsParallel</strong>: همانظور که ذکر شد یک پرس و جوی LINQ را به یک پر جوی PLINQ تبدیل می کند. به طور دقیق تر یک شیء ParallelQuery را از روی IEnumerable ایجاد می کند. ParallelQuery نماینده یک پرس و جوی PLINQ می باشد.</li>
<li><strong>AsSequential</strong>: عکس کار متد AsParallel را انجام می دهد، یعنی یکی پرس و جوی پارالل را به یک پرس و جوی معمولی linq تبدیل می کند.</li>
<li><strong>AsOrdered</strong>: پرس و جوی پارالل را مجبور می کند که به ترتیب اجرا شود. این دقیقا همان راه حل مشکلی است که در بالا برای درهم اجرا شدن تسک های parallel ذکر شد. این راه حل برای نسخه PLINQ کاربرد دارد.</li>
<li><strong>AsUnordered</strong>: عکس متد بالا را انجام می دهد.</li>
</ul>
<p>استفاده از موارد فوق در پرس و جو ها به سادگی امکان پذیر است:</p>
<pre>var resultSet = from t in taskList.<span style="color:#800000;"><strong>AsParallel</strong></span>()
 select t;</pre>
<p>متد ForAll: کاربرد این متد برای PLINQ در این است که بدون کش کردن و تلفیق کردن(result merging) نتیجه را فورا بر می گرداند. این باعث خواهد شد که نتایج AsOrdered نادیده گرفته بشوند. برای کنترل بیشتر در مورد نحوه کش کردن و تلفیق کردن نتایج از متد WithMergeOptions که ورودی از نوع ParallelMergeOptions می گیرد را استفاده کنید.</p>
<p><a href="http://salarblog.wordpress.com/">بخش دوم این مقاله در مورد Task ها خواهد بود</a>.</p>
<p>موفق باشید.</p>
<ul>
<li><strong>منابع و لینک های مفید:</strong></li>
</ul>
<p style="text-align:right;" dir="ltr"><a href="http://www.amazon.com/Pro-NET-Parallel-Programming/dp/1430229675">APress &#8211; Pro .NET 4 Parallel Programming in C#</a><br />
<a href="http://www.amazon.com/Introducing-NET-4-0-Visual-Experts/dp/143022455X">APress &#8211; Introducing .NET 4.0</a><br />
<a href="http://www.amazon.com/C-4-0-Nutshell-Definitive-Reference/dp/0596800959">O&#8217;Reilly &#8211; C# 4.0 IN A NUTSHELL</a><br />
<a href="http://www.danielmoth.com/Blog/threadingconcurrency-vs-parallelism.aspx">Threading/Concurrency vs Parallelism</a><br />
<a href="http://msdn.microsoft.com/en-us/library/dd460719.aspx">How to: Control Ordering in a PLINQ Query</a><br />
<a href="http://stackoverflow.com/questions/2287963/why-is-parallelqueryt-where-not-working-when-converting-to-observable">Why is ParallelQuery.Where not working when converting to Observable?</a></p>
<p><a href="http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/">نگاهی به Parallel Extensions در دات نت 4 بخش اول</a></p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/dotnet-framework/'>dotNET Framework</a>, <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c/'>برنامه نویسی</a> Tagged: <a href='http://salarblog.wordpress.com/tag/parallel/'>Parallel</a>, <a href='http://salarblog.wordpress.com/tag/parallel-extension/'>Parallel Extension</a>, <a href='http://salarblog.wordpress.com/tag/plinq/'>PLinq</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/926/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/926/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/926/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=926&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/06/10/parallel-extensions-in-dotnet-4/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/06/serialparallel.png" medium="image">
			<media:title type="html">Serial vs. Parallel</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/06/parallelperformancetest.png" medium="image">
			<media:title type="html">Parallel Performance Test</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/06/wrongparallelusage.png" medium="image">
			<media:title type="html">Wrong Parallel Usage</media:title>
		</media:content>
	</item>
		<item>
		<title>studiostyles.info</title>
		<link>http://salarblog.wordpress.com/2010/05/13/studiostyles-info/</link>
		<comments>http://salarblog.wordpress.com/2010/05/13/studiostyles-info/#comments</comments>
		<pubDate>Thu, 13 May 2010 14:35:06 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[معرفی]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[اخبار فناوری]]></category>
		<category><![CDATA[Color Schema]]></category>
		<category><![CDATA[Schema]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[ترکیب رنگ]]></category>
		<category><![CDATA[رنگ بندی]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=947</guid>
		<description><![CDATA[سایت تقریبا تازه تاسیس شده studiostyles.info محل قرار گیری ترکیب بندی رنگ کدهای Visual Studio هست که هر سه نسخه آخر یعنی 2005 ,2008 و 2010 رو پشتیبانی می کنه. در این آدرس می تونید لیست تمامی ترکیب رنگها رو مشاهده کنید: http://studiostyles.info/schemes راهنمای اعمال این ترکیب رنگها رو از اینجا می تونید مطالعه کنید. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=947&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>سایت تقریبا تازه تاسیس شده studiostyles.info محل قرار گیری ترکیب بندی رنگ کدهای Visual Studio هست که هر سه نسخه آخر یعنی 2005 ,2008 و 2010 رو پشتیبانی می کنه.</p>
<div id="attachment_948" class="wp-caption aligncenter" style="width: 410px"><a href="http://studiostyles.info/" target="_blank"><img class="size-full wp-image-948" title="studiostyles" src="http://salarblog.files.wordpress.com/2010/05/studiostyles.png?w=510" alt="studiostyles.info"   /></a><p class="wp-caption-text">studiostyles.info</p></div>
<p>در این آدرس می تونید لیست تمامی ترکیب رنگها رو مشاهده کنید: <a href="http://studiostyles.info/schemes" target="_blank">http://studiostyles.info/schemes</a></p>
<p>راهنمای اعمال این ترکیب رنگها رو <a href="http://studiostyles.info/home/faq" target="_blank">از اینجا</a> می تونید مطالعه کنید. خلاصه اون رو اینجا می نویسم:<br />
1- ابتدا از صفحه مورد نظر فایل .vssettings رو برای نسخه مورد نظر دانلود کنید<br />
2- در Visual Studio گزینه Tools &gt; Import and Export Settings رو انتخاب کنید.<br />
3- گزینه Import Selected Environment Settings را انتخاب کنید و در صفحه بعدی محل ذخیره پشتیبان را مشخص کنید.<br />
4- کلید Browse را بزنید و فایل دانلود شده رو انتخاب کنید. در صفحه بعدی تغییری لازم نیست و کلید next و سپس پایان.</p>
<p>برای نمونه ترکیب رنگی رو که برای خودم استفاده می کنم در این سایت ایجاد کردم، می تونید از اینجا دریافت کنید:<br />
<a href="http://studiostyles.info/schemes/easystandard" target="_blank">http://studiostyles.info/schemes/easystandard</a></p>
<p><strong>پ.ن1:</strong> می توانید ترکیب رنگ خودتان را از <a href="http://studiostyles.info/schemes/create" target="_blank">اینجا</a> ایجاد کنید.<br />
<strong>پ.ن2:</strong> تعداد دیگری از ترکیب رنگها در <a href="http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx" target="_blank">اینجا</a><br />
<strong>پ.ن3: </strong>برای تغییر رنگ خود visual studio ابزار مورد نیاز رو می  تونید <a href="http://visualstudiogallery.msdn.microsoft.com/en-us/20cd93a2-c435-4d00-a797-499f16402378" target="_blank">از اینجا</a> دریافت کنید.</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a7%d8%ae%d8%a8%d8%a7%d8%b1-%d9%81%d9%86%d8%a7%d9%88%d8%b1%db%8c/'>اخبار فناوری</a> Tagged: <a href='http://salarblog.wordpress.com/tag/color-schema/'>Color Schema</a>, <a href='http://salarblog.wordpress.com/tag/schema/'>Schema</a>, <a href='http://salarblog.wordpress.com/tag/visual-studio/'>Visual Studio</a>, <a href='http://salarblog.wordpress.com/tag/%d8%aa%d8%b1%da%a9%db%8c%d8%a8-%d8%b1%d9%86%da%af/'>ترکیب رنگ</a>, <a href='http://salarblog.wordpress.com/tag/%d8%b1%d9%86%da%af-%d8%a8%d9%86%d8%af%db%8c/'>رنگ بندی</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/947/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/947/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/947/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=947&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/05/13/studiostyles-info/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/05/studiostyles.png" medium="image">
			<media:title type="html">studiostyles</media:title>
		</media:content>
	</item>
		<item>
		<title>نصب و رفع مشکلات راهنمای Visual Studio 2010</title>
		<link>http://salarblog.wordpress.com/2010/05/11/visual-studio-2010-help-system/</link>
		<comments>http://salarblog.wordpress.com/2010/05/11/visual-studio-2010-help-system/#comments</comments>
		<pubDate>Tue, 11 May 2010 19:58:09 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[dotNET Framework]]></category>
		<category><![CDATA[معرفی]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[اخبار فناوری]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=940</guid>
		<description><![CDATA[ماکروسافت در نسخه جدید Visual Studio سیستم راهنمای آن را که همنام با کتابخانه  راهنمای ماکروسافت به نام MSDN هست تغییر داده است. در این سیستم که اصطلاحا Help Viewer 1.0 نام دارد، دیگر از Document Explorer خبری نیست و راهنما می تواند در هر مرورگری نمایش داده شود. با این تفاوت که مرورگر پیش [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=940&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>ماکروسافت در نسخه جدید Visual Studio سیستم راهنمای آن را که همنام با کتابخانه  راهنمای ماکروسافت به نام MSDN هست تغییر داده است. در این سیستم که اصطلاحا Help Viewer 1.0 نام دارد، دیگر از Document Explorer خبری نیست و راهنما می تواند در هر مرورگری نمایش داده شود. با این تفاوت که مرورگر پیش فرض صفحات راهنما، خود Visual Studio است.</p>
<p>متاسفانه نصب راهنما در این نسخه چندان سر راست نیست و همچنین تعدادی مشکل دارد که در این اینجا به بررسی آنها می پردازم.</p>
<ul>
<li><span style="color:#800000;"><strong>نصب راهنما</strong></span></li>
</ul>
<p>پس از نصب موفقیت آمیز Visual Studio در صفحه پایان نصب، لینکی در پایین صفحه جهت نصب راهنما قرار داده شده که مستقیما از آنجا می توانید مراحل نصب را همانند زیر انجام دهید. لزومی نیست که حتما از آن لینک استفاده کنید، بعدا نیز می توانید راهنما را نصب کنید.</p>
<p>جهت نصب از طریق Visual Studio از منوی Help گزینه Manage Help Settings را انتخاب کنید. در صورتی که بار اولی است که از این گزینه استفاده می کنید از شما مسیر ذخیره سازی فایلهای آفلاین پرسیده خواهد شد. مسیر را با در نظر گرفتن اینکه ممکن است تا 3 گیگ فضا مورد نیاز باشد تایین کنید.</p>
<p>پس از آن می توانید از طریق گزینه &#8220;Choose online or local help&#8221; تعیین کنید که آیا از راهنمای آنلاین می خواهید استفاده کنید یا آفلاین. در صورت انتخاب گزینه آنلاین هیچ نیازی به نصب چیز دیگری نخواهید داشت و راهنمای از طریق سایت MSDN ماکروسافت نمایش داده خواهد شد.</p>
<p>در صورت انتخاب گزینه آفلاین سیستم راهنما از راهنماهای نصب شده استفاده خواهد کرد. پس نیاز خواهید داشت راهنماها را نصب کنید. نصب راهنمای آفلاین به سادگی از طریق نصب از دیسک نصب و یا دانلود امکان پذیر است. برای دانلود گزینه &#8220;Install content from online &#8220;  و برای نصب از دیسک گزینه &#8220;Install content from disk&#8221; را انتخاب کنید.</p>
<p>فایلهای راهنما در دی وی دی نصب موجود است و بهتر است بجای دانلود از آنها استفاده کنید. فایل نصب راهنما در مسیر DVD:\ProductDocumentation\HelpContentSetup.msha قرار دارد که باید از طریق گزینه Install content from disk اقدام کنید.</p>
<p>پس از اقدام به نصب می توانید از میان بخش های موجود، بخش های مورد نظر را انتخاب و اقدام به نصب یا دانلود کنید.</p>
<div id="attachment_941" class="wp-caption aligncenter" style="width: 467px"><img class="size-full wp-image-941" title="Help Library Manager" src="http://salarblog.files.wordpress.com/2010/05/helplibmanager.png?w=510" alt="Help Library Manager"   /><p class="wp-caption-text">Help Library Manager</p></div>
<ul>
<li><span style="color:#800000;"><strong>رفع مشکلات</strong></span></li>
</ul>
<p>پس از انجام عمل Repair برنامه نصب visual studio و یا به علت حذف ویا تغییر نا خواسته مسیر نصب فایلهای آفلاین سیستم راهنما به طور کل از کار می افتد و با اجرای مجدد Manage Help Settings جهت تغییر مسیر نصب و یا تغییر به وضعیت آنلاین، با خطا مواجه خواهید شد. در این وضعیت هیچ امکانی برای استفاده از راهنما نخواهید داشت. علاوه بر این در روشی که در ادامه توضیح می دم تقریبا هر مشکلی درباره نصب آفلاین راهنما رفع خواهد شد.</p>
<div id="attachment_942" class="wp-caption aligncenter" style="width: 407px"><img class="size-full wp-image-942" title="نمونه خطای سیستم راهنما" src="http://salarblog.files.wordpress.com/2010/05/helperror.png?w=510" alt="نمونه خطای سیستم راهنما"   /><p class="wp-caption-text">یکی از خطاهای سیستم راهنما</p></div>
<p>چند راه حل برای رفع این مشکل وجود دارد که ساده ترین آنها به این شکل است:</p>
<p>برنامه Regedit را باز کرده و به مسیر HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0  بروید. در آنجا مقدار LocalStore را پیدا کرده و پاک کنید. سپس مجددا گزینه Manage Help Settings را اجرا کنید تا مسیر نصب مجددا پرسیده شود. که می توانید در این حالت مسیر قبلی راهنماهای نصب شده را تعیین کنید.</p>
<ul>
<li><span style="color:#800000;"><strong>برنامه کمکی H3Viewer</strong></span></li>
</ul>
<p>با استفاده از این برنامه رایگان می توانید راهنماهای آفلاین نصب شده را همانند Document Explorer  نسخه قبلی راهنما مشاهده کنید. همچنین با استفاده ازاین برنامه می توایند مرورگر پیش فرض راهنما را نیز تغییر دهید.</p>
<div id="attachment_943" class="wp-caption aligncenter" style="width: 520px"><a href="http://salarblog.files.wordpress.com/2010/05/h3viewer.png"><img class="size-full wp-image-943" title="H3Viewer" src="http://salarblog.files.wordpress.com/2010/05/h3viewer.png?w=510&#038;h=345" alt="H3Viewer" width="510" height="345" /></a><p class="wp-caption-text">H3Viewer</p></div>
<p>این برنامه کم حجم را می توانید از اینجا دریافت کنید (لینک دانلود در پایین صفحه): <a href="http://mshcmigrate.helpmvp.com/viewer">http://mshcmigrate.helpmvp.com/viewer</a></p>
<p>برنامه H3Viewer نیاز دارد تا سیستم راهنما در حالت آفلاین کار بکند، در این صورت می تواند راهنماهای نصب شده بر روی سیستم را لیست کند.</p>
<p>برای تنظیم مرورگر پیش فرض سیستم راهنما از طریق زیر منوی Options-&gt;Set default Viewer for MS HV 1.0 اقدام کنید. توجه کنید که برنامه باید با دسترسی administrator اجرا شده باشد.</p>
<p><strong>پ.ن:</strong> در هر صورت وجود راهنمای اصلی نرم افزار لازم و ضروری به نظر می رسه گرچه ممکنه گوگل شما را سریع تر به نتیجه برسونه.</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/dotnet-framework/'>dotNET Framework</a>, <a href='http://salarblog.wordpress.com/category/%d9%85%d8%b9%d8%b1%d9%81%db%8c/'>معرفی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a7%d8%ae%d8%a8%d8%a7%d8%b1-%d9%81%d9%86%d8%a7%d9%88%d8%b1%db%8c/'>اخبار فناوری</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/940/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=940&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/05/11/visual-studio-2010-help-system/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/05/helplibmanager.png" medium="image">
			<media:title type="html">Help Library Manager</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/05/helperror.png" medium="image">
			<media:title type="html">نمونه خطای سیستم راهنما</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/05/h3viewer.png" medium="image">
			<media:title type="html">H3Viewer</media:title>
		</media:content>
	</item>
		<item>
		<title>نمایش صحیح متون فارسی-انگلیسی در جهت چپ به راست</title>
		<link>http://salarblog.wordpress.com/2010/04/18/correct-persian-english-text-to-display-in-left-to-right-direction/</link>
		<comments>http://salarblog.wordpress.com/2010/04/18/correct-persian-english-text-to-display-in-left-to-right-direction/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 17:38:35 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[dotNET Framework]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[left-to-right]]></category>
		<category><![CDATA[LTR]]></category>
		<category><![CDATA[right-to-left]]></category>
		<category><![CDATA[RTL]]></category>
		<category><![CDATA[متون فارسی]]></category>
		<category><![CDATA[چپ به راست]]></category>
		<category><![CDATA[راست به چپ]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=928</guid>
		<description><![CDATA[خوشبختانه اکثر کامپوننت های کنونی از ویژگی راست به چپ متون پشتیبانی می کنند، اما همچنان کامپوننت هایی هستند که این ویژگی را که برای ما حیاتی است پشتیبانی نمی کنند. در چنین مواقعی ممکنه که نیاز داشته باشید که حتما از آن ابزار استفاده کنید، ولی همچنان مشکل متون فارسی همراه با متون انگلیسی [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=928&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>خوشبختانه اکثر کامپوننت های کنونی از ویژگی راست به چپ متون پشتیبانی می کنند، اما همچنان کامپوننت هایی هستند که این ویژگی را که برای ما حیاتی است پشتیبانی نمی کنند. در چنین مواقعی ممکنه که نیاز داشته باشید که حتما از آن ابزار استفاده کنید، ولی همچنان مشکل متون فارسی همراه با متون انگلیسی را خواهید داشت.</p>
<p>در ادامه با استفاده از کدی که تهیه کردم کاری می کنیم که متونی اینچنینی در حالت چپ به راست هم به درستی نمایش داده بشوند. برای نمونه:</p>
<div id="attachment_933" class="wp-caption aligncenter" style="width: 518px"><img class="size-full wp-image-933" title="PersianLeftToRightText" src="http://salarblog.files.wordpress.com/2010/04/persianlefttorighttext2.png?w=510" alt="PersianLeftToRightText"   /><p class="wp-caption-text">اصلاح متن فارسی برای نمایش صحیح در حالت چپ به راست</p></div>
<p>کاری که این تابع انجام می دهد تغییر و جابجایی محل متون انگلیسی و فارسی هست. توجه کنید که متن تغییر داده شده قابل برگشت نیست و هیچ تابعی برای برگشت آن نوشته نشده، پس سعی کنید آن را در هیچ جایی ذخیره نکنید.</p>
<p>کد این کلاس همراه با پروژه نمونه از آدرس زیر قابل دریافت است.</p>
<p><span style="color:#800000;"><strong><a title="دریافت کلاس و برنامه نمونه" href="http://www.4shared.com/file/JMDGm2Yw/SalarPersianLeftToRightCorrect.html" target="_blank"><span style="color:#800000;">دریافت کلاس PersianLeftToRight</span></a><br />
</strong></span></p>
<p>ویرایش: همچنین نرم افزاری بر اساس همین کلاس نوشتم تا عمل تبدیل را بر روی فایل متنی انجام بده. این نرم افزار رو هم از اینجا دریافت کنید</p>
<p><span style="color:#800000;"><strong><a href="http://www.4shared.com/file/bi66sDzi/PersianLeftToRightCorrection.html" target="_blank"><span style="color:#800000;">دریافت برنامه PersianLeftToRightCorrection</span></a><br />
</strong></span></p>
<p>پ.ن1: ممکن است که این کلاس برای برخی کاراکتر ها به درستی کار نکند، در صورت مشاهده این موارد لطفا آنها را گزارش کنید تا بررسی شوند.</p>
<p>پ.ن2: در متون چند خطی ترتیب نمایش به پایین به بالا تغییر پیدا می کند و این به خاطر از آخر به اول شدن متون فارسی هست.</p>
<p>موفق باشید.</p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/dotnet-framework/'>dotNET Framework</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c/'>برنامه نویسی</a> Tagged: <a href='http://salarblog.wordpress.com/tag/left-to-right/'>left-to-right</a>, <a href='http://salarblog.wordpress.com/tag/ltr/'>LTR</a>, <a href='http://salarblog.wordpress.com/tag/right-to-left/'>right-to-left</a>, <a href='http://salarblog.wordpress.com/tag/rtl/'>RTL</a>, <a href='http://salarblog.wordpress.com/tag/%d9%85%d8%aa%d9%88%d9%86-%d9%81%d8%a7%d8%b1%d8%b3%db%8c/'>متون فارسی</a>, <a href='http://salarblog.wordpress.com/tag/%da%86%d9%be-%d8%a8%d9%87-%d8%b1%d8%a7%d8%b3%d8%aa/'>چپ به راست</a>, <a href='http://salarblog.wordpress.com/tag/%d8%b1%d8%a7%d8%b3%d8%aa-%d8%a8%d9%87-%da%86%d9%be/'>راست به چپ</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/928/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=928&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/04/18/correct-persian-english-text-to-display-in-left-to-right-direction/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/04/persianlefttorighttext2.png" medium="image">
			<media:title type="html">PersianLeftToRightText</media:title>
		</media:content>
	</item>
		<item>
		<title>چند اشتباه در طراحی پایگاه داده</title>
		<link>http://salarblog.wordpress.com/2010/03/20/database-design-mistakes/</link>
		<comments>http://salarblog.wordpress.com/2010/03/20/database-design-mistakes/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 14:23:12 +0000</pubDate>
		<dc:creator>Salar</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[آموزشی]]></category>
		<category><![CDATA[حرفه من]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[fatal]]></category>
		<category><![CDATA[mistake]]></category>

		<guid isPermaLink="false">http://salarblog.wordpress.com/?p=912</guid>
		<description><![CDATA[چند ساعتی تا تحویل سال مونده، سال نو همه مبارک و امیدوارم که سال خوبی پیش رو داشته باشید. سال گذشته که شخصا برام سال پر حادثه ای بود. اینطور که بوش میاد در سال جدید هم رویدادهای مختلف در انتظارم هستند، شاید وقت کمی برای نوشتن داشته باشم. این مطلب رو هم مدتی قبل [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=912&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl class="wp-caption  alignright">
<dt class="wp-caption-dt"><img class="size-full wp-image-917" title="Database-Green" src="http://salarblog.files.wordpress.com/2010/03/database-green.png?w=510" alt="Database - سال نو مبارک"   /></dt>
</dl>
</div>
<blockquote><p>چند ساعتی تا تحویل سال مونده، سال نو همه مبارک و امیدوارم که سال خوبی پیش رو داشته باشید.<br />
سال گذشته که شخصا برام سال پر حادثه ای بود. اینطور که بوش میاد در سال جدید هم رویدادهای مختلف در انتظارم هستند، شاید وقت کمی برای نوشتن داشته باشم.</p>
<p>این مطلب رو هم مدتی قبل که یک پروژه نیمه کاره رو تحویل گرفتم تا کار کنم و از دست مشکلات پروژه ناراحت بودم نوشتم. پست با کمی ویرایش الان آماده شد!</p>
<p>سال نو همه مبارک و خوش و خرم باشید!</p></blockquote>
<p><a href="http://salarblog.wordpress.com/">performance</a> یا بازده، فاکتور خیلی مهمی در همه زمینه ها هست که معمولا توسط تازه کار ها و گاها توسط طراح دیتابیس فراموش میشود. معمولا در مرحله آموزش، بر روی کارهای کوچک و حجم کوچک اطلاعات مانور داده می شود. پروژه های آموزشی کوچک بوده و مثالها کاربردهای کوچک در مقابل داده های کم را در نظر می گیرند.</p>
<p>در دنیای واقعی وضعیت فرق میکنه. برنامه های نوشته شده باید برای مدت زمانی طولانی بدون مشکل پاسخ گو باشند. حجم داده های ورودی خیلی زیاد است. و در یک برنامه تجاری ممکنه این موارد برای چند صد تا چند صد هزار رکورد در روز هم برسد. در چنین شرایطی عدم رعایت چند نکته کوچک اما اساسی ممکن است مشکل ساز شود.</p>
<p>در ادامه می خواهم چند اشتباه در طراحی پایگاه داده رو مطرح کنم، به این امید که دیگر شاهد آنها نباشم. این موارد مطمئنن در طور دوره های آموزی به کرات مطرح می شود ولی شگفتا که هنوز هم عده ای این اشتباه ها را تکرار می کنند.</p>
<ul>
<li><strong>استفاده ازنوع داده های رشته ای به عنوان اندیس یا  کلید اصلی</strong></li>
</ul>
<p>نوع داده varchar و هر نوع داده کاراکتری یا رشته ای بدترین نوع انتخاب برای اندیس جدول است. این اشتباه زمانی بدتر خواهد شد که این فیلد به عنوان کلید اصلی نیز استفاده کنید؛ و سرانجام اشتباه با استفاده از این کلید به عنوان کلید خارجی تکمیل خواهد شد!</p>
<p>البته توجه داشته باشید که استفاده از فیلد اندیس کاراکتری در کنار کلید اصلی مشکل خاصی نخواهد داشت. فقط این مورد در صروت لزوم و زمانی که از آن فیلد به کرات برای جستجو استفاده میکنید مورد استفاده قرار دهید.</p>
<p>علت اشتباه بودن این انتخاب در ساخت جدول اندیس و تعداد مقایسه های انجام شده بر می گردد. به عنوان یک مثال ساده مقایسه ، دو نوع عددی می توانند به راحتی توسط دستور عمل های CPU با یکدیگر مقایسه شوند، در حالی که درنوع کارکتری باید تک تک کارکاتر ها با استفاده از شبیه سازی نرم افزاری مقایسه شوند. در رشته های یونیکد هم که حجم کاراکتر ها دو برابر می شوند.</p>
<p>راه حل: راه حل بسیار ساده استفاده از انواع داده عددی مانند int یا bigint است. در عین حال می توانید از سایر انواع ساده دیگر نیز استفاده کنید.</p>
<ul>
<li><strong>عدم استفاده از اندیس یا کلید اصلی</strong></li>
</ul>
<p>این مورد رو از مورد بالایی جدا کردم چونکه هر کس همچنین اشتباهی رو انجام بده باید در مورد دانش وی تردید کرد. جداولی که ارجاعات مکرری به آنها وجود دارد باید از طریق اندیس ها بهینه شوند. وجود اندیس باعث سرعت بخشیدن در ارجاعات و افزایش بازده دیتابیس خواهد شد. کلید اصلی را هم برای استفاده به عنوان کلید خارجی و یا شناسه هر رکورد مورد استفاده قرار دهید.</p>
<p>البته یک استثنا در این مورد هم وجود دارد. این مورد زمانی هست که انواع توصیفی را در جدولی جداگانه قرار می دهیم، که در این صورت چون داده های این جدول کم خواهد بود و حذف اضافه ای در کار نخواهد بود، می توان آن جدول را بدون اندیس یا کلید اصلی در نظر گرفت.</p>
<p>این نکته را هم در نظر داشته باشید که بدون کلید اصلی و یا یک کلید یکتا نمی توانید ارتباطی مابین جداول بر قرار کنید.</p>
<ul>
<li><strong>استفاده از فیلد های NULL بی مورد</strong></li>
</ul>
<p>همیشه در استفاده از فیلدهای NULL دقت کنید. سعی کنید که فیلدهای رشته ای را NULL قرار ندهید چونکه یک معنای زاید به آن فیلد داده اید، مگر اینکه واقعا به null نیاز داشته باشید. یک کاربرد مفید null بودن فیلد برای کلید های خارجی هست که نشان می دهد، هیچ ارتباطی در رکورد جاری تعریف نشده است. نمونه ای این کاربرد را در تصویر زیر مشاهده می کنید.</p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption  aligncenter">
<dt class="wp-caption-dt"><img class="size-full wp-image-922" title="Database" src="http://salarblog.files.wordpress.com/2010/03/database.png?w=510" alt="Database"   /></dt>
</dl>
</div>
<p>در کنار استفاده از فیلدهای null می توانید از مقادیر پیش فرض هم استفاده کنید تا هیچ فیلدی ندانسته خالی رد نشود. این کار کدهای sql شما را هم کوتاه تر خواهد کرد.</p>
<p>در همین زمینه مطالعه کنید:</p>
<p><a href="http://weblogs.sqlteam.com/davidm/archive/2005/09/12/7746.aspx" target="_blank">10 Common Design Mistakes</a></p>
<p><a href="http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/" target="_blank">Ten Common Database Design Mistakes</a></p>
<p><a href="http://www.15seconds.com/Issue/040115.htm" target="_blank">Database Performance Philosophy</a></p>
<br />دسته‌بندی شده در: <a href='http://salarblog.wordpress.com/category/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c/sql-server-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-2/'>SQL Server</a>, <a href='http://salarblog.wordpress.com/category/%d8%a2%d9%85%d9%88%d8%b2%d8%b4%db%8c/'>آموزشی</a>, <a href='http://salarblog.wordpress.com/category/%d8%ad%d8%b1%d9%81%d9%87-%d9%85%d9%86/'>حرفه من</a> Tagged: <a href='http://salarblog.wordpress.com/tag/database/'>database</a>, <a href='http://salarblog.wordpress.com/tag/design/'>design</a>, <a href='http://salarblog.wordpress.com/tag/fatal/'>fatal</a>, <a href='http://salarblog.wordpress.com/tag/mistake/'>mistake</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salarblog.wordpress.com/912/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salarblog.wordpress.com/912/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salarblog.wordpress.com/912/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salarblog.wordpress.com&amp;blog=4422419&amp;post=912&amp;subd=salarblog&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salarblog.wordpress.com/2010/03/20/database-design-mistakes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f727b276a87606cd17e572c56deae30f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">salarblog</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/03/database-green.png" medium="image">
			<media:title type="html">Database-Green</media:title>
		</media:content>

		<media:content url="http://salarblog.files.wordpress.com/2010/03/database.png" medium="image">
			<media:title type="html">Database</media:title>
		</media:content>
	</item>
	</channel>
</rss>
