<?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/"
	>

<channel>
	<title>گنجه &#187; C</title>
	<atom:link href="http://blog.ebrahim.ir/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ebrahim.ir</link>
	<description># tail -f /var/log/experience</description>
	<lastBuildDate>Wed, 25 Aug 2010 22:16:39 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>مقابله با ایرادهای فساد حافظه</title>
		<link>http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/</link>
		<comments>http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 01:03:31 +0000</pubDate>
		<dc:creator>ابراهیم</dc:creator>
				<category><![CDATA[رایانه]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C++‎]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[Valgrind]]></category>
		<category><![CDATA[ابزار]]></category>
		<category><![CDATA[ایرادزدایی]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[سرریز میان‌گیر]]></category>
		<category><![CDATA[فساد حافظه]]></category>
		<category><![CDATA[هم‌گردان]]></category>

		<guid isPermaLink="false">http://blog.ebrahim.ir/?p=261</guid>
		<description><![CDATA[مبنای بحث در این مطلب، زبان‌های C++‎ و C هستند، ولی مطالعهٔ آن برای برنامه‌نویسان هر زبانی که در معرض ایراد0های فساد حافظه1 است و حتی هر برنامه‌نویسی، احتمالاً خالی از سود نخواهد بود. برنامه‌ای نوشته‌اید که ایراد داره. اون رو حسابی آزموده‌اید و هر ایراد منطقی2 رو که فکر می‌کنید ممکن هست وجود داشته [...]]]></description>
			<content:encoded><![CDATA[<p><!--startnum=0--></p>
<p>مبنای بحث در این مطلب، زبان‌های C++‎ و C هستند، ولی مطالعهٔ آن برای برنامه‌نویسان هر زبانی که در معرض ایراد<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_0_261" id="identifier_0_261" class="footnote-link footnote-identifier-link" title="Bug">0</a></sup>های فساد حافظه<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_1_261" id="identifier_1_261" class="footnote-link footnote-identifier-link" title="Memory corruption">1</a></sup> است و حتی هر برنامه‌نویسی، احتمالاً خالی از سود نخواهد بود.</p>
<p>برنامه‌ای نوشته‌اید که ایراد داره. اون رو حسابی آزموده‌اید و هر ایراد منطقی<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_2_261" id="identifier_2_261" class="footnote-link footnote-identifier-link" title="Logical">2</a></sup> رو که فکر می‌کنید ممکن هست وجود داشته باشه بررسی و رفع کرده‌اید، ولی هنوز برنامه ایراد داره!<br />
برنامهٔ شما رفتارهای عجیبی از خودش نشون می‌ده. مثلاً اگر در حالت ایرادزدایی<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_3_261" id="identifier_3_261" class="footnote-link footnote-identifier-link" title="Debug">3</a></sup> بسازیدش<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_4_261" id="identifier_4_261" class="footnote-link footnote-identifier-link" title="Build">4</a></sup> کار می‌کنه، ولی در حالت انتشار<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_5_261" id="identifier_5_261" class="footnote-link footnote-identifier-link" title="Release">5</a></sup> یا اشتباه کار می‌کنه، یا کار نمی‌کنه و دچار سانحه<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_6_261" id="identifier_6_261" class="footnote-link footnote-identifier-link" title="Crash">6</a></sup> می‌شه. یا مثلاً با ورودی‌های مختلف، در جاهای کاملاً متفاوت و نسبتاً بی‌ربط از کد دچار سانحه می‌شه. یا مثلاً همیشه در پایان یک تابع<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_7_261" id="identifier_7_261" class="footnote-link footnote-identifier-link" title="Function">7</a></sup> بعد از همهٔ عملیات، ولی قبل از بازگشت (یعنی دقیقاً روی { !!!) دچار سانحه می‌شه.<br />
در چنین شرایطی هست که شما حدس می‌زنید برنامه‌تون دچار ایراد فساد حافظه<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_1_261" id="identifier_8_261" class="footnote-link footnote-identifier-link" title="Memory corruption">1</a></sup> شده.<br />
اگر برنامه همیشه در یک تابع خاص دچار سانحه می‌شه، حدس می‌زنیم که در یکی از متغیرهای محلی همون تابع خراب‌کاری شده و پشته<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_8_261" id="identifier_9_261" class="footnote-link footnote-identifier-link" title="Stack">8</a></sup> خراب شده؛ به همین دلیل در هنگام جمع کردن قاب پشتهٔ<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_9_261" id="identifier_10_261" class="footnote-link footnote-identifier-link" title="Stack frame">9</a></sup> تابع از روی پشته، به علت فساد نشانی بازگشت<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_10_261" id="identifier_11_261" class="footnote-link footnote-identifier-link" title="Return address">10</a></sup>، برنامه دچار سانحه می‌شه<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_11_261" id="identifier_12_261" class="footnote-link footnote-identifier-link" title="نوعی سرریز میان&zwnj;گیر (Buffer overflow)">11</a></sup>.<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_12_261" id="identifier_13_261" class="footnote-link footnote-identifier-link" title="البته این رفتار سانحه&zwnj;آمیز (!) بستگی به هم&zwnj;گردان داره، ولی هم&zwnj;گردان&zwnj;های جدید مثل GCCهای ۴ به بعد (و شاید بعضی قدیمی&zwnj;ترها)، به علت داشتن روش&zwnj;هایی برای مقابله با خرابی پشته، عمداً برنامه&zwnj;ای تولید می&zwnj;کنند که در این شرایط دچار سانحه بشه">12</a></sup> معمولاً با خوندن دقیق همون تابع، ایراد یافت و حل می‌شه. اگر نشد، متغیرهای محلی که روی پشته هستند رو به کومه<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_13_261" id="identifier_14_261" class="footnote-link footnote-identifier-link" title="Heap">13</a></sup> منتقل می‌کنیم (با استفاده از new یا malloc) و می‌ریم به سراغ روش‌های مربوط به فساد کومه که الان می‌خواهیم بگیم.<br />
اولین قدم برای یافتن ایرادهای فساد حافظهٔ کومه، استمداد از حضرت <a href="http://valgrind.kde.org">Valgrind</a> است (که در دبین<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_14_261" id="identifier_15_261" class="footnote-link footnote-identifier-link" title="Debian">14</a></sup> بسته‌اش valgrind است)):</p>
<div dir="ltr">

<div class="wp_syntax" dir="ltr"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">valgrind</span> <span style="color: #660033;">--leak-check</span>=full <span style="color: #660033;">--leak-resolution</span>=high .<span style="color: #000000; font-weight: bold;">/</span>buggy</pre></div></div>

</div>
<p>برنامه با سرعتی بسیار کم‌تر از حد معمول اجرا می‌شه و هر دست‌رسی به حافظهٔ کومه که خارج از حافظهٔ تخصیص‌یافته<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_15_261" id="identifier_16_261" class="footnote-link footnote-identifier-link" title="Allocated">15</a></sup> باشه، با نام تابع و (در حالت ایرادزدایی) شمارهٔ خط کد منبع<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_16_261" id="identifier_17_261" class="footnote-link footnote-identifier-link" title="Source code">16</a></sup> گزارش می‌شه. البته Valgrind بسیار جای حرف و معرفی و ستایش و غیره داره که از موضوع این مطلب خارجه!<br />
اگر Valgrind مشکل رو یافت و ایراد رفع شد که خدا رو شکر می‌کنیم! اما اگر نه، با یک مورد بدخیم (!) طرف هستیم. یعنی دست‌رسی‌هایی داریم که به رغم ایراد داشتنشون، داخل حافظهٔ تخصیص‌یافته قرار گرفته‌اند. مثلاً دو آرایهٔ ۱۰۰تایی پشت سر هم در کومه گرفته‌ایم و به عنصر ۱۲۵ام از آرایهٔ اول دست زده‌ایم! دست‌رسی هنوز داخل حافظهٔ پردازهٔ<sup><a href="http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/#footnote_17_261" id="identifier_18_261" class="footnote-link footnote-identifier-link" title="Process">17</a></sup> خودمان است، ولی نادرست و ایراددار. اگر کسی تا این جای مطلب رو خونده باشه تعجب می‌کنم! البته کسی به جز خودم!<br />
ان‌شاء الله در مطلب بعدی شیوه‌ای برای یافتن این موارد بدخیم معرفی خواهد شد که از یکی از هم‌کاران باتجربه‌ترم (حفظه الله) آموخته‌ام.</p>
<ol start="0" class="footnotes"><li id="footnote_0_261" class="footnote">Bug</li><li id="footnote_1_261" class="footnote">Memory corruption</li><li id="footnote_2_261" class="footnote">Logical</li><li id="footnote_3_261" class="footnote">Debug</li><li id="footnote_4_261" class="footnote">Build</li><li id="footnote_5_261" class="footnote">Release</li><li id="footnote_6_261" class="footnote">Crash</li><li id="footnote_7_261" class="footnote">Function</li><li id="footnote_8_261" class="footnote">Stack</li><li id="footnote_9_261" class="footnote">Stack frame</li><li id="footnote_10_261" class="footnote">Return address</li><li id="footnote_11_261" class="footnote"><span dir="rtl">نوعی سرریز میان‌گیر (Buffer overflow)</span></li><li id="footnote_12_261" class="footnote"><span dir="rtl">البته این رفتار سانحه‌آمیز (!) بستگی به هم‌گردان داره، ولی هم‌گردان‌های جدید مثل GCCهای ۴ به بعد (و شاید بعضی قدیمی‌ترها)، به علت داشتن روش‌هایی برای مقابله با خرابی پشته، عمداً برنامه‌ای تولید می‌کنند که در این شرایط دچار سانحه بشه</span></li><li id="footnote_13_261" class="footnote">Heap</li><li id="footnote_14_261" class="footnote">Debian</li><li id="footnote_15_261" class="footnote">Allocated</li><li id="footnote_16_261" class="footnote">Source code</li><li id="footnote_17_261" class="footnote">Process</li></ol>]]></content:encoded>
			<wfw:commentRss>http://blog.ebrahim.ir/1388/01/fighting-memory-corruption-bugs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>بهینه‌سازی هدایت‌شده با سابقه</title>
		<link>http://blog.ebrahim.ir/1387/12/profile-guided-optimization/</link>
		<comments>http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 03:57:45 +0000</pubDate>
		<dc:creator>ابراهیم</dc:creator>
				<category><![CDATA[رایانه]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C++‎]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[PGO]]></category>
		<category><![CDATA[ابزار]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[بهینه‌سازی]]></category>
		<category><![CDATA[سابقه‌گیری]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[هم‌گردان]]></category>
		<category><![CDATA[ویندوز]]></category>
		<category><![CDATA[کارآیی]]></category>

		<guid isPermaLink="false">http://blog.ebrahim.ir/?p=200</guid>
		<description><![CDATA[یکی از روش‌های نسبتاً متفاوت هم‌گردان0ها برای بهینه‌سازی1، روش «بهینه‌سازی هدایت‌شده با سابقه»2 است که گاهی اون رو کوتاهانه3 PGO هم می‌گویند. مؤثر بودن این روش رو می‌شه به چشم دید. مثلاً اگر از مرورگر Firefox هم در لینوکس4 و هم در ویندوز5 استفاده کرده باشید، حتماً تفاوت فاحش کارآیی6 رو حس کرده‌اید. دلیل این [...]]]></description>
			<content:encoded><![CDATA[<p><!--startnum=0--></p>
<p>یکی از روش‌های نسبتاً متفاوت هم‌گردان<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_0_200" id="identifier_0_200" class="footnote-link footnote-identifier-link" title="Compiler">0</a></sup>ها برای بهینه‌سازی<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_1_200" id="identifier_1_200" class="footnote-link footnote-identifier-link" title="Optimization">1</a></sup>، روش «بهینه‌سازی هدایت‌شده با سابقه»<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_2_200" id="identifier_2_200" class="footnote-link footnote-identifier-link" title="Profile-Guided Optimization">2</a></sup> است که گاهی اون رو کوتاهانه<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_3_200" id="identifier_3_200" class="footnote-link footnote-identifier-link" title="به یاد استاد روحانی رانکوهی!">3</a></sup> PGO هم می‌گویند.</p>
<p>مؤثر بودن این روش رو می‌شه به چشم دید. مثلاً اگر از مرورگر Firefox هم در لینوکس<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_4_200" id="identifier_4_200" class="footnote-link footnote-identifier-link" title="Linux">4</a></sup> و هم در ویندوز<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_5_200" id="identifier_5_200" class="footnote-link footnote-identifier-link" title="Windows">5</a></sup> استفاده کرده باشید، حتماً تفاوت فاحش کارآیی<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_6_200" id="identifier_6_200" class="footnote-link footnote-identifier-link" title="Performance">6</a></sup> رو حس کرده‌اید. دلیل این تفاوت فاحش، استفاده از PGO در ساخت<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_7_200" id="identifier_7_200" class="footnote-link footnote-identifier-link" title="Build">7</a></sup> پروندهٔ<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_8_200" id="identifier_8_200" class="footnote-link footnote-identifier-link" title="File">8</a></sup> اجرایی<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_9_200" id="identifier_9_200" class="footnote-link footnote-identifier-link" title="Executable">9</a></sup> ویندوز و عدم استفاده ازش در ساخت اجرایی لینوکس بیان شده.</p>
<p>خوب، حالا که به اندازهٔ کافی انگیزوندمتون (!)، ببینیم این روش اصلاً چی هست و چه‌جوری می‌تونیم ازش استفاده کنیم.</p>
<p>اساس این روش، استفاده از اطلاعات کسب‌شده در زمان اجرا<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_10_200" id="identifier_10_200" class="footnote-link footnote-identifier-link" title="Run-time">10</a></sup>ی برنامه، برای بهینه‌سازی در زمان هم‌گردانی<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_11_200" id="identifier_11_200" class="footnote-link footnote-identifier-link" title="Compile-time">11</a></sup> هست. پس هم‌گردانی با این روش، سه مرحله خواهد داشت:</p>
<p>۱. هم‌گردانی برای تولید اجرایی مخصوص جمع‌آوری اطلاعات مورد نیاز برای بهینه‌سازی<br />
۲. اجرای برنامهٔ تولیدشده در مرحلهٔ ۱ و استفاده از موارد کاربرد<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_12_200" id="identifier_12_200" class="footnote-link footnote-identifier-link" title="Use case">12</a></sup> مورد نظر برای بهینه‌سازی<br />
۳. هم‌گردانی با بهینه‌سازی به کمک اطلاعات جمع‌آوری‌شده در مرحلهٔ ۲</p>
<p>هم‌گردان‌ها برای مراحل ۱ و ۳ گزینه‌های مخصوصی دارند که این‌جا فقط GCC رو می‌بینیم.</p>
<p>درGCC برای مرحلهٔ ۱ از گزینهٔ ‎-fprofile-generate و برای مرحلهٔ ۳ از گزینهٔ ‎-fprofile-use استفاده می‌کنیم. دقت کنید که گزینهٔ ‎-fprofile-generate رو هم باید برای هم‌گردانی<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_13_200" id="identifier_13_200" class="footnote-link footnote-identifier-link" title="Compiling">13</a></sup> بدید، و هم برای پیوند<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_14_200" id="identifier_14_200" class="footnote-link footnote-identifier-link" title="Linking">14</a></sup>.</p>
<p>من که معمولاً از CMake به عنوان سامانهٔ ساخت<sup><a href="http://blog.ebrahim.ir/1387/12/profile-guided-optimization/#footnote_15_200" id="identifier_15_200" class="footnote-link footnote-identifier-link" title="Build System">15</a></sup> استفاده می‌کنم، برای به کارگیری این روش، این چند خط رو به CMakeLists.txt اضافه می‌کنم:</p>

<div class="wp_syntax" dir="ltr"><div class="code"><pre class="none" style="font-family:monospace;"># profile::generate
#set(CMAKE_C_FLAGS &quot;${CMAKE_C_FLAGS} --profile-generate&quot;)
#set(CMAKE_CXX_FLAGS &quot;${CMAKE_CXX_FLAGS} --profile-generate&quot;)
#set(CMAKE_EXE_LINKER_FLAGS &quot;${CMAKE_EXE_LINKER_FLAGS} --profile-generate&quot;)
# profile::use
#set(CMAKE_C_FLAGS &quot;${CMAKE_C_FLAGS} --profile-use&quot;)
#set(CMAKE_CXX_FLAGS &quot;${CMAKE_CXX_FLAGS} --profile-use&quot;)
#set(CMAKE_EXE_LINKER_FLAGS &quot;${CMAKE_EXE_LINKER_FLAGS} --profile-use&quot;)</pre></div></div>

<p>برای مرحلهٔ ۱، سه تا set اول و برای مرحلهٔ ۳، سه تا set دوم رو فعال می‌کنم. راستی دقت کردید که به جای ‎-fprofile-folan می‌شه از  ‎-profile-folan- استفاده کرد؟!</p>
<ol start="0" class="footnotes"><li id="footnote_0_200" class="footnote">Compiler</li><li id="footnote_1_200" class="footnote">Optimization</li><li id="footnote_2_200" class="footnote">Profile-Guided Optimization</li><li id="footnote_3_200" class="footnote"><span dir="rtl">به یاد استاد روحانی رانکوهی!</span></li><li id="footnote_4_200" class="footnote">Linux</li><li id="footnote_5_200" class="footnote">Windows</li><li id="footnote_6_200" class="footnote">Performance</li><li id="footnote_7_200" class="footnote">Build</li><li id="footnote_8_200" class="footnote">File</li><li id="footnote_9_200" class="footnote">Executable</li><li id="footnote_10_200" class="footnote">Run-time</li><li id="footnote_11_200" class="footnote">Compile-time</li><li id="footnote_12_200" class="footnote">Use case</li><li id="footnote_13_200" class="footnote">Compiling</li><li id="footnote_14_200" class="footnote">Linking</li><li id="footnote_15_200" class="footnote">Build System</li></ol>]]></content:encoded>
			<wfw:commentRss>http://blog.ebrahim.ir/1387/12/profile-guided-optimization/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>نقش برنامه‌نویس‌ها در گرمایش زمین</title>
		<link>http://blog.ebrahim.ir/1387/12/programmers-and-global-warming/</link>
		<comments>http://blog.ebrahim.ir/1387/12/programmers-and-global-warming/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 13:40:39 +0000</pubDate>
		<dc:creator>ابراهیم</dc:creator>
				<category><![CDATA[رایانه]]></category>
		<category><![CDATA[کلمات قصار]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C++‎]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ابزار]]></category>
		<category><![CDATA[برنامه‌نویسی]]></category>
		<category><![CDATA[زمین]]></category>
		<category><![CDATA[طبیعت]]></category>
		<category><![CDATA[گرمایش]]></category>
		<category><![CDATA[‎.NET]]></category>

		<guid isPermaLink="false">http://blog.ebrahim.ir/?p=197</guid>
		<description><![CDATA[با پرهیز از Java و ‎.NET (در مقابل C++‎ و C) در روند گرمایش زمین سهم کم‌تری داشته باشیم.]]></description>
			<content:encoded><![CDATA[<p>با پرهیز از Java و ‎.NET (در مقابل C++‎ و C) در روند گرمایش زمین سهم کم‌تری داشته باشیم.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ebrahim.ir/1387/12/programmers-and-global-warming/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (user agent is rejected)

Served from: blog.ebrahim.ir @ 2012-02-07 00:05:47 -->
