<?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>Alvanweb</title>
	<atom:link href="http://weblog.alvanweb.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://weblog.alvanweb.com</link>
	<description>یادداشت‌های مرتضی الوانی</description>
	<lastBuildDate>Thu, 22 Mar 2012 13:02:44 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>
	<item>
		<title>نوروز 1391</title>
		<link>https://weblog.alvanweb.com/2012/03/19/norouz-1391/</link>
					<comments>https://weblog.alvanweb.com/2012/03/19/norouz-1391/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 19 Mar 2012 14:13:58 +0000</pubDate>
				<category><![CDATA[عکس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Norouz]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=214</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="center">
<p><img decoding="async" src="https://weblog.alvanweb.com/wp-content/uploads/2012/03/norouz-1391.jpg" alt="زکوی یار می آید نسیم باد نوروزی، از این باد ار مدد خواهی چراغ دل بر افروزی" title="زکوی یار می آید نسیم باد نوروزی، از این باد ار مدد خواهی چراغ دل بر افروزی" /></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2012/03/19/norouz-1391/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress بر پایه CakePHP</title>
		<link>https://weblog.alvanweb.com/2011/07/20/building-wordpress-with-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2011/07/20/building-wordpress-with-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 20 Jul 2011 07:15:02 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[وردپرس]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Framework]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=207</guid>

					<description><![CDATA[بدون شک وردپرس بزرگترین و محبوبترین سیستم وبلاگ نویسی (یا بهتر بگوییم مدیریت محتوا) است که با اختیارات فراوانی که به کاربر می دهد هنوز بصورت رایگان ارائه می‌شود. کیک پی‌اچ‌پی هم جزء برترین فریم‌ورک‌های PHP موجود است که سهم قابل توجهی در بازار دارد. اما آیا می توان وردپرس را بر پایه کیک پیاده [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>بدون شک <a href="http://wordpress.org">وردپرس</a> بزرگترین و محبوبترین سیستم وبلاگ نویسی (یا بهتر بگوییم مدیریت  محتوا) است که با اختیارات فراوانی که به کاربر می دهد هنوز بصورت رایگان ارائه می‌شود. <a href="http://cakephp.org">کیک پی‌اچ‌پی</a> هم جزء برترین فریم‌ورک‌های PHP موجود است که سهم قابل توجهی در بازار دارد. اما آیا می توان وردپرس را بر پایه کیک پیاده سازی کرد؟!</p>
<p>اگر چه هسته وردپرس خوب نوشته شده است اما بنظرم پیاده سازی الگوی MVC کیک، می‌تواند وردپرس را برای توسعه دهند‌گان آن دگرگون کند.برای مثال قالب یا همان Layout وردپرس را تصور کنید، شلوغ و نامفهوم به نظر می‌آید(هرچند مستندات وردپرس جای هیچ سئوالی را بی‌پاسخ نگذاشته است). طراح مجبور است یک صفحه را به چند بخش در چندین فایل مجزا کند اما با معماری MVC همه در یک مجموعه منظم خواهند بود. مسلماً این پیاده سازی چالش های بزرگی خواهد داشت چرا که وردپرس یک سیستم ساده نیست امنیت و وسعت اختیارات فاکتورهای مهمی هستند که نباید نادیده گرفته شوند.</p>
<p><a href="http://www.timtrice.com/">Tim Trice</a> فردی است که روی این پروژه که اسم آن را CakePress گذاشته است کار می‌کند. کیک‌پرس هنوز در حال توسعه است و تمام قابلیت‌های وردپرس را ندارد اما بدنه و قابلیت‌های اصلی را پوشش داده است. می‌توانید CakePress را از گوگل کد از <a href="https://code.google.com/p/cakephp-wordpress/">اینجا</a> دریافت کنید. برای افرادی که با معماری دیتابیس وردپرس و همچنین MVC در کیک آشنایی دارند سورس این پروژه می تواند یک منبع آموزشی عالی برای فراگیری CakePHP باشد.توضیحات بیشتر را می‌توانید در وبلاگ Tim در <a href="http://www.timtrice.com/website-programming/php/cakephp/building-wordpress-cakephp-database-setup-model-associations/">اینجا</a> بیابید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2011/07/20/building-wordpress-with-cakephp/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title>وارد کردن اطلاعات از Excel  به MySQL با PHP</title>
		<link>https://weblog.alvanweb.com/2011/07/10/import-microsoft-excel-to-mysql-with-php/</link>
					<comments>https://weblog.alvanweb.com/2011/07/10/import-microsoft-excel-to-mysql-with-php/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 10 Jul 2011 05:52:43 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[microsoft excel]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=199</guid>

					<description><![CDATA[در بخشی از آخرین پروژه ایی که این روزها در حال نوشتن آن هستم لازم بود قابلیت Mail Merge مایکروسافت ورد، تحت وب پیاده سازی شود. بعبارتی کاربر یک الگو در قالب فرمت doc یا docx ایجاد می نمود و بعد از آنالیز الگو، داده های متناظر از یک فایل با فرمت اکسل در بلوک [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در بخشی از آخرین پروژه ایی که این روزها در حال نوشتن آن هستم لازم بود قابلیت Mail Merge مایکروسافت ورد، تحت وب پیاده سازی شود. بعبارتی کاربر یک الگو در قالب فرمت doc  یا docx ایجاد می نمود و بعد از آنالیز الگو، داده های متناظر از یک فایل با فرمت اکسل در بلوک ها قرار می گرفت و فایل نهایی آماده سازی می شد. به واسطه فیلتر سازی داده های فایل اکسل و استفاده بهینه از کد راهی مناسب تر از ایمپورت داده ها از قالب Excel  به Mysql پیدا نکردم. اصولاً بکارگیری نرم افزارهای آفیس مایکروسافت در محیط وب با PHP، بخصوص ویرایش فایل های ساخته شده با این مجموعه کار ساده ایی نیست. هرچند استفاده از COM در این موارد چاره ساز است اما محدودیت به سیستم عامل ویندوز را به همراه خواهد داشت. </p>
<p>ساده ترین راه برای انتقال داده ها، ذخیره فایل اکسل با فرمت های xls یا xlsx در قالب فرمت csv  توسط مایکروسافت اکسل و ایمپورت آن به Mysql  بود. این فرمت خلاصه شده عبارت comma-separated values ( مقادیر جدا شده با کاما) می باشد که داده ها را بصورت جدولی در یک فایل متنی که می توان آن را با یک وبرایش گر متن باز کرد ذخیره می کند. در حقیقت شماره خطها  به ردیف های جدول و داده های جدا شده با کاما به فیلدها اشاره دارند. اما  تبدیل به csv توسط اکسل UTF-8 را به خوبی پشتیبانی نمی کند و داده های فارسی در تبدیل  قابل استفاده نیستند و اینکه می بایست کاربر عملیات تبدیل را خودش انجام می داد و فایل csv را برای ایمپورت وارد می کرد در حالی که استفاده از فایل اکسل با فرمت معمولی xls  یا xlsx ارجحیت داشت.</p>
<p>خوشبختانه کلاس <a href="http://phpexcel.codeplex.com/">PHPExcel</a> به اندازه ایی خوب و کامل نوشته شده بود که دغدغه نوشتن کلاس جدید را نداشتم. این کلاس که بر پایه استانداردهای <a href="http://en.wikipedia.org/wiki/Office_Open_XML">OpenXML</a> مایکروسافت نوشته شده است قابلیت نوشتن و خواندن از فایل Excel را براحتی فراهم می کند. برای وارد کردن اطلاعات از فایل Excel  به Mysql تکه کد زیر را نوشتم: <span id="more-199"></span></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
require_once 'PHPExcel.php';
$objReader = new PHPExcel_Reader_Excel2007();
$objPHPExcel = $objReader-&gt;load('book1.xlsx');
$rowIterator = $objPHPExcel-&gt;getActiveSheet()-&gt;getRowIterator();

$skip_rows = 0;
$excell_array_data = array();
foreach($rowIterator as $row){
	$cellIterator = $row-&gt;getCellIterator();
	$cellIterator-&gt;setIterateOnlyExistingCells(false);
	if($skip_rows &gt;= $row-&gt;getRowIndex ()) continue;
	$rowIndex = $row-&gt;getRowIndex ();
	$excell_array_data&#x5B;$rowIndex] = array();

	foreach ($cellIterator as $cell) {
		$excell_array_data&#x5B;$rowIndex]&#x5B;$cell-&gt;getColumn()] = $cell-&gt;getCalculatedValue();
	}
}

$link = @mysql_connect('localhost', 'root', '123');
if ($link){
	$db_selected = mysql_select_db('alvanweb.com', $link);
	@mysql_set_charset('utf8',$link);

	//Create Database table with one Field
	$sql = &quot;CREATE TABLE xlsx (
	rowID INT NOT NULL ,
	PRIMARY KEY (rowID)
	)&quot;;
	mysql_query($sql);

	//Create Others Field (A, B, C &amp; ...)
	$columns_name = array();
	$columns_name = $excell_array_data&#x5B;$skip_rows+1];
	foreach (array_keys($columns_name) as $fieldname ){
		$sql = &quot;ALTER TABLE xlsx ADD $fieldname VARCHAR(1000)&quot;;
		mysql_query($sql);
	}

	//Insert Excel data to MySQL
	foreach( $excell_array_data as $k=&gt;$v){
		$keys = join(array_keys($v), ',');
		$values = join($v, &quot;','&quot;);
		$sql = &quot;insert into xlsx (rowID, $keys) values ($k, '$values') &quot; ;
		mysql_query($sql);
	}

} else {
	echo &quot;Error in database connection.&quot;;
}
?&gt;</pre>
<p>مستندات  <a href="http://phpexcel.codeplex.com/">PHPExcel</a> کامل است و نیاز به توضیح متدها نیست. ورود اطلاعات توسط این کد در چهار مرحله انجام می شود:<br />
1-  ریختن داده های فایل اکسل در آرایه <span dir="ltr">$excell_array_data</span> (خطوط 9 تا 19)<br />
2- اتصال به پایگاه داده و  ایجاد جدول  xlsx  در  دیتابیس  و افزودن فیلد rowed به عنوان PRIMARY KEY  (خطوط 21 تا 31)<br />
3- افزودن فیلدهای مربوط به نام ستون های فایل اکسل (A، B، C و &#8230;) به جدول xlsx   (خطوط 34 تا 39)<br />
4- خواندن آرایه <span dir="ltr">$excell_array_data</span> و افزودن داده ها به جدول ( خطوط 42 تا 47)</p>
<p>توضیح اضافه اینکه <span dir="ltr">$skip_rows</span> برای رد کردن ردیف ها بالای فایل اکسل مقداردهی می شود. معمولاً اولین ردیف قبل از داده ها معرف نام ستون هایی است که گویااطلاعات نوع فیلد است (فرضاً سن، جنسیت و &#8230;) برای رد کردن این ردیف این متغیر برابر 1 تنظیم می شود.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2011/07/10/import-microsoft-excel-to-mysql-with-php/feed/</wfw:commentRss>
			<slash:comments>38</slash:comments>
		
		
			</item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>https://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/</link>
					<comments>https://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 21 Mar 2010 09:25:51 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Celebration]]></category>
		<category><![CDATA[Norouz]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=196</guid>

					<description><![CDATA[هرچند نوشتن در اینجا را فراموش کرده ام اما به عادت سال های قبل و به رسم این روزها، نوروز را به همه دوستان تبریک گفته و بهترین لحظات را در این سال برایتان آرزومندم.]]></description>
										<content:encoded><![CDATA[<p>هرچند نوشتن در اینجا را فراموش کرده ام اما به عادت سال های قبل و به رسم این روزها، نوروز را به همه دوستان تبریک گفته و بهترین لحظات را در این سال برایتان آرزومندم.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2010/03/21/happy-norouz-1389/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
			</item>
		<item>
		<title>استفاده از jQuery برای صفحه‌بندی در CakePHP</title>
		<link>https://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/</link>
					<comments>https://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 30 May 2009 21:02:02 +0000</pubDate>
				<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=191</guid>

					<description><![CDATA[بعد از یک مدت تقریبا طولانی ننوشتن در اینجا، در این پست قصد دارم به طور خلاصه درمورد آژاکسی کردن صفحه‌بندی پیشفرض CakePHP توسط jQuery بنویسم. ابتدا آخرین نسخه‌ی jQuery را دریافت و آن را به صورت زیر در layout فراخوانی کنید. دقت کنید jQuery تان ویرایش 1.3 یا به بالا باشد چون قرار است [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>بعد از یک مدت تقریبا طولانی ننوشتن در اینجا، در این پست قصد دارم به طور خلاصه درمورد آژاکسی کردن صفحه‌بندی پیشفرض CakePHP توسط  jQuery بنویسم.<br />
ابتدا آخرین نسخه‌ی jQuery را <a href="http://jquery.com/">دریافت</a> و آن را به صورت زیر در layout فراخوانی کنید. دقت کنید jQuery تان ویرایش 1.3 یا به بالا باشد چون قرار است از تابع live که در این ویرایش افزوده شده است استفاده کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
echo $javascript-&gt;link('jquery-1.3.2.min');
?&gt;</pre>
<p>پیشنهاد می‌کنم برای تکه کد زیر که قرار است درخواست‌ کلیک بر روی لینک صفحات را به صورت آژاکس ایجاد کند، یک فایل js جدید بسازید یا اینکه می‌توانید آن‌ را مستقیم در layout اضافه کنید:</p>
<pre class="brush: jscript; title: ; notranslate">$('a&#x5B;href*=/page:]').live('click', function(){
    $('#content').load($(this).attr('href'));
    return false;
});</pre>
<p>کار تمام است با کلیک بر روی شماره صفحات محتوا به صورت آژاکس بارگذاری می‌شود. اما یکسری نکات ریز که شاید از قلم انداخته باشید:</p>
<p>کامپوننت RequestHandler را می‌بایستی به کنترلرتان افزوده باشید. دلیل آن روشن است چرا که باید نوع تقاضای کنترلر را، تشخیص دهد و  layout را بصورت خودکار به Ajax تبدیل کند. برای درک بیشتر این موضوع پیشنهاد می‌کنم تغییرات بوجود آمده درپی افزودن یا حذف این کامپوننت را از طریق کنسول <a href="http://getfirebug.com/">FireBug</a> دنبال کنید. <span id="more-191"></span></p>
<p>مقدار <span dir="ltr">#content</span> نشانگر id عنصری است که محتوا را در بر دارد. این مقدار  layout پیشفرض کیک است اگر برای محتوا id یا class دیگری تعریف کرده‌اید روشن است که آن را باید تغییر دهید.</p>
<p><strong>کمی بیشتر</strong><br />
با افزودن <span dir="ltr">a[href*=/sort:]</span> به کد بالا می‌توانید مرتب‌سازی عناصر را هم در یک جدول داده پیشفرض کیک به صورت آژاکس داشته باشید:</p>
<pre class="brush: jscript; title: ; notranslate">$('a&#x5B;href*=/sort:],a&#x5B;href*=/page:]').live('click', function(){
    $('#content').load($(this).attr('href'));
    return false;
});</pre>
<p><strong>خواندنی‌های کمکی دیگر</strong><br />
+ اگر از ویرایش‌های پایین jQuery استفاده می‌کنید، پلاگین <a href="http://docs.jquery.com/Plugins/livequery">Livequery</a> می توانید جایگزینی برای تابع live  باشد.<br />
+ اگر هنوز نمی‌دانید چگونه صفحه‌بندی را در app تان ایجاد کنید، به مستندات کیک در <a href="http://book.cakephp.org/view/164/Pagination">اینجا</a> مراجعه کنید.<br />
+ همچنین در <a href="http://book.cakephp.org/view/167/AJAX-Pagination">اینجا </a>توضیح داده شده چگونه می‌توانید این کار را بدون jQuery  و البته با استفاده از فریم‌ورک prototype انجام دهید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/05/31/pagination-in-cakephp-with-jquery/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>https://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/</link>
					<comments>https://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Thu, 19 Mar 2009 09:55:13 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Celebration]]></category>
		<category><![CDATA[Norouz]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=190</guid>

					<description><![CDATA[یک سال دیگر گذشت. سال نو بهانه‌ایی است برای شروع مجدد، شروعی نو با نگاهی نو به زندگی. سال 1387 برای من سال خوبی نبود بخصوص این ماه‌های آخر. اما امیدوارم سال 1388 که یکی از سرنوشت سازترین سال‌های زندگیمه، سال خوبی باشه. امیدوارم میمنت سال جدید طلیعه‌ی موفقیت‌های بزرگ هم برای شما و هم [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>یک سال دیگر گذشت. سال نو بهانه‌ایی است برای شروع مجدد، شروعی  نو با نگاهی نو به زندگی. سال 1387 برای من سال خوبی نبود بخصوص این ماه‌های آخر. اما امیدوارم سال 1388 که یکی از سرنوشت سازترین سال‌های زندگیمه، سال خوبی باشه.</p>
<div class="center"><img decoding="async" src="/old_media/norouz-1388.jpg" title="نوروز 1388 بر همگان مبارک باد" alt="نوروز 1388 بر همگان مبارک باد" /></div>
<p>امیدوارم میمنت سال جدید طلیعه‌ی موفقیت‌های بزرگ هم برای شما و هم برای خودم باشه. در لحظه حلول سال نو با زمزمه کردن دعای عرفانی یا مقلب القلوب و الابصار، دعا گوی ما هم باشید. عید بر همگان مبارک باد </p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/03/19/happy-norouz-1388/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>کاربرد کامپوننت Authentication در CakePHP</title>
		<link>https://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 11 Mar 2009 19:04:28 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[ACL]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[CakePHP Component]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=185</guid>

					<description><![CDATA[در این پست با یک مثال کاربردی به معرفی کامپوننت Authentication در فریم‌ورک قدرتمند CakePHP خواهیم پرداخت. بصورت ساده یک مدل تصدیق هویت کاربر ایجاد می‌کنیم که برای ورود به بخش مدیریت، کاربر می‌باید وارد سیستم شود. در پست بعدی در مورد تصدیق هویت در کیک، با اضافه کردن دو کامپوننت ACL و Cookie سیستم [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در این پست با یک مثال کاربردی به معرفی کامپوننت <a href="http://book.cakephp.org/view/172/Authentication">Authentication</a> در  فریم‌ورک قدرتمند CakePHP خواهیم پرداخت. بصورت ساده یک مدل تصدیق هویت کاربر ایجاد می‌کنیم که برای ورود به بخش مدیریت، کاربر می‌باید وارد سیستم شود. در پست بعدی در مورد تصدیق هویت در کیک، با اضافه کردن دو کامپوننت ACL و Cookie سیستم پایدارتری ایجاد خواهیم کرد.</p>
<p>در این آموزش فرض شده است اصول کار با کیک را فراگرفته‌اید. می‌توانید کیک را نصب کنید، تنظیمات اولیه را مقداردهی کنید و  Cake Bake  (پختن کیک) را با کنسول انجام دهید و &#8230; اگر آماده نیستید به سری آموزش‌های قبل  (<a href="https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">ساخت لینکدونی با CakePHP</a>) رجوع کنید و بعدا برگردید. ضمنا از آخرین نسخه پایدار CakePHP و PHP 5 استفاده می‌کنیم.</p>
<p>خوشبختانه نصب و بکارگیری کامپوننت توکار auth ساده‌ترین شکل ممکن برای داشتن یک سیستم ورود کاربر است. مانند همه کامپوننت‌ها، با افزودن &#8216;Auth&#8217; به پارامتر <span dir="ltr">$components</span> کامپوننت به کنترلر شما افزوده می‌شود. چون قصد داریم از این کامپوننت در دیگر کنترلر‌ها نیز استفاده کنیم برای جلوگیری از تکرار، آن را به AppController اضافه می‌کنیم. بنابراین فایلی بنام app_controller.php در شاخه اصلی app تان با محتوای زیر ایجاد کنید:</p>
<pre class="brush: php; title: ; notranslate">class AppController extends Controller {
	var $components = array(&#039;Auth&#039;);
}</pre>
<p>روشن است که چون دیگر کنترلر‌ها فرزند AppController هستند خصوصیات آن را به ارث خواهند برد. بگذارید کمی در مورد قوانین توکار این کامپوننت بگویم. بطور پیشفرض این کامپوننت انتظار دارد شما جدولی بنام users با فیلدهایی بنام username و password داشته باشید.‌ اما در برخی موارد خاص، پایگاه داده بدلایل امنیتی اجازه نمی‌دهد که برای یک فیلد نام password را انتخاب کنید. مشکلی نیست ما این عرف را برهم میزنیم و از نام دلخواه خودمان استفاده می‌کنیم. ابتدا یک جدول بصورت زیر بسازید: <span id="more-185"></span></p>
<pre class="brush: sql; title: ; notranslate">CREATE TABLE users (
  id integer auto_increment,
  email char(50),
  secretpass char(50),
  PRIMARY KEY (id)
);</pre>
<p>از email برای نام کاربری و secretpass برای کلمه عبور استفاده کردیم. در اینجا لازم است با تابع beforeFilter در کیک آشنا شوید. CakePHP یکسری <a href="http://book.cakephp.org/view/60/Callbacks">توابع callbacks</a> توکار دارد که با آن‌ها می‌توان منطقی را بعد یا قبل اجرای یک کنش اضافه کرد. BeforeFilter قبل از هر کنشی در کنترلر اجرا می‌شود. اما در اینجا چه استفاده ایی دارد؟ برای برخی از تنظیمات کامپوننت Auth نیاز داریم قبل از اجرای هر کنشی آن‌ها را مقدار دهی کنیم</p>
<p> اولین موردی که باید به این تابع اضافه شود اعلام تغییر نام فیلدهای جدول users است (چون قوانین توکار این کامپوننت را رعایت نکردیم) بدین منظور کد زیر را مجددا به AppController اضافه می‌کنیم (دلیل این کار روشن است):</p>
<pre class="brush: php; title: ; notranslate">function beforeFilter() {
$this-&gt;Auth-&gt;fields = array(&#039;username&#039; =&gt; &#039;email&#039;, &#039;password&#039; =&gt; &#039;secretpass&#039;);
}</pre>
<p>حال این کامپوننت می‌تواند با نام‌های جدید فیلدها کار کند. با ساخت این جدول، کنترلر و مدل و همچنین نمای login را برای این جدول bake کنید. به کنترلر users دو کنش login  و logout را بصورت زیر اضافه کنید:</p>
<pre class="brush: php; title: ; notranslate">function login() {
 //Auth componet does it automatically
}
function logout() {
 $this-&gt;redirect($this-&gt;Auth-&gt;logout());
}</pre>
<p>این کامپوننت بطور پیشفرض مسیر users/login (کنترلری بنام users و کنشی بنام login) را برای ورود در نظر می‌گیرد. می‌توانید با تکه کد زیر در BeforeFilter این مسیر را تغییر دهید:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Auth-&gt;loginAction = array(&#039;admin&#039; =&gt; false, &#039;controller&#039; =&gt; &#039;members&#039;, &#039;action&#039; =&gt; &#039;login&#039;);</pre>
<p> در اینجا ما همان مسیر پیشفرض را بکار می‌گیریم. همچنین بطور پیشفرض نیازی نیست برای پردازش فرم login.ctp کنش login را کدنویسی کنید خود کامپوننت این کار را بطور خودکار انجام می‌دهد بنابراین آن را در بالا خالی گذاشتیم. حال فرم ورود را در login.ctp بصورت زیر تعریف کنید:</p>
<pre class="brush: php; title: ; notranslate">if ($session-&gt;check(&#039;Message.auth&#039;)) {
  $session-&gt;flash(&#039;auth&#039;);
}
echo $form-&gt;create(&#039;User&#039;, array(&#039;url&#039; =&gt; array(&#039;controller&#039; =&gt; &#039;users&#039;, &#039;action&#039; =&gt; &#039;login&#039;)));
echo $form-&gt;input(&#039;email&#039;);
echo $form-&gt;input(&#039;secretpass&#039;, array(&#039;type&#039; =&gt; &#039;password&#039;));
echo $form-&gt;submit(&#039;Login&#039;);
echo $form-&gt;end();</pre>
<p>این کامپوننت برای رمزنگاری کلمه عبور از یک کلاس امنیتی استفاده می‌کند که این کلاس بصورت پیشفرض از SHA1 بهره می‌گیرد. برای تغییر متد رمزنگاری می‌باید setHash را برحسب md5 ،sha1 یا sha256 در اولین پارامتر مقداردهی کنید. ما از md5 استفاده می‌کنیم بنابراین BeforeFilter به صورت زیر خواهد بود:</p>
<pre class="brush: php; title: ; notranslate">function beforeFilter() {
Security::setHash(&#039;md5&#039;);
$this-&gt;Auth-&gt;fields = array(&#039;username&#039; =&gt; &#039;email&#039;, &#039;password&#039; =&gt; &#039;secretpass&#039;);
}</pre>
<p><strong>توجه کنید!</strong> فایل core.php و مقدار امنیتی Security.salt را یادتان هست که در ابتدای تنظیمات کیک مقداردهی می‌کردید؟! درست حدس زده‌اید، کلاس امنیتی برای رمزنگاری بیشتر، از این مقدار نیز استفاده می‌کند بنابراین دقت کنید اگر زمانی خواستید پروژه را از نو با مقادیر قدیمی رمزنگاری شده‌ی موجود در دیتابیس بنویسید این مقدار را مشابه پروژه قبل لحاظ کنید.</p>
<p>در اینجا برای تست نیاز دارید یک نام و کلمه عبور به دیتابیس اضافه کنید. ساخت یک فرم ثبت نام به منظور وارد کردن یک ردیف در جدول users ساده است اما ساده‌تر برای ما که تنها قصد تست برنامه را داریم چیست؟  اگر debug را در تنظیمات (core.php) دستکاری نکردید (برابر مقدار 2 تنظیم شده است) در مرورگر  مسیر users/login را مرور کنید و نام و کلمه عبور را انتخاب کنید. در نوار زیرین مربوط به debug کلمه عبوری که وارد کردید بطور هش شده (رمزنگاری شده) مشاهده می‌شود می‌توانید به phpMyAdmin بروید و این مقدار را بصورت دستی اضافه کنید. اگر هم برایتان دشوار است خط زیر را ایمپورت کنید. حال یک نام عبور alvani  با کلمه عبور 123 دارید:</p>
<pre class="brush: sql; title: ; notranslate">INSERT INTO &#039;users&#039; (&#039;id&#039;, &#039;email&#039;, &#039;secretpass&#039;) VALUES
(1, &#039;alvani&#039;, &#039;f6b48e1ff9c21a8fe36a77c1ec839086&#039;);</pre>
<p>نگران نباشید در آموزش بعدی که کامپوننت ACL هم وارد شد، فرم ثبت نام هم افزوده می‌شود تا آن زمان خودتان هم می‌توانید با کمی کنجکاوی آن رابسازید.</p>
<p> نوبت آن رسیده است که دسترسی به برخی از کنش‌ها را در برخی کنترلرها محدود کنیم. فرض کنید قسمت مدیریت بصورت users/account باشد. می‌خواهیم برنامه را طوری طراحی کنیم که کاربر با ورود موفق به سیستم به این بخش هدایت شود و همچنین کاربران دیگر بدون ورود مجاز به دیدن این کنش نباشند. کنش account را در کنترلر users ایجاد کنید.</p>
<p>از دو متد allow و deny بدین منظور استفاده می‌کنیم. فرض کنید می‌خواهیم دسترسی به کنش account را در کنترلر users محدود کنیم کافیست تکه کد زیر را به این کنترلر اضافه کنیم:</p>
<pre class="brush: php; title: ; notranslate">function beforeFilter(){
 parent::beforeFilter();
 $this-&gt;Auth-&gt;deny(&#039;account&#039;);
}</pre>
<p>تکه کد بالا ابتدا خصوصیات تابع BeforeFilter کنترلر پدر (یعنی AppController را به ارث می‌برد) سپس کنش account را محدود می‌کند. با انجام مراحل فوق تلاش برای مرور users/account شما را به users/login منتقل خواهد کرد. اما بعد از ورود موفق به کجا هدایت خواهید شد؟ این کامپوننت بطور خوردکار پس از ورود موفق شما را به صفحه‌ایی که تلاش می‌کردید آن را ببینید هدایت می کند اما با کد زیر در BeforeFilter چنانچه نیاز باشد می‌توانید کاربر را به کنترلر و کنش دلخواه هدایت کنید:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Auth-&gt;loginRedirect = array(&#039;controller&#039; =&gt; &#039;users&#039;, &#039;action&#039; =&gt; &#039;account&#039;);</pre>
<p>تمرین مناسبی است که BeforeFilter ایی که در  کنترلر users در بالا (به منظور محدود کردن و مجوز دادان) استفاده کردید را حذف کنید و  با استفاده از foreach بصورت زیر، در BeforeFilter کنترلر AppController، تنها با تعریف کنش‌های مجوز داده شده یا محدود شده در ابتدای هر کنترلر آن‌ها را مشخص کنید. مسلما باید ابتدا <span dir="ltr">$allowedActions</span> و <span dir="ltr">$deniedActions</span> را در AppController تعریف کنید:</p>
<pre class="brush: php; title: ; notranslate">class AppController extends Controller {
var $components = array(&#039;Auth&#039;);
public $allowedActions = array(&#039;index&#039;);
public $deniedActions = array();

function beforeFilter() {
Security::setHash(&#039;md5&#039;);
$this-&gt;Auth-&gt;fields = array(&#039;username&#039; =&gt; &#039;email&#039;, &#039;password&#039; =&gt; &#039;secretpass&#039;);
	
foreach( $this-&gt;allowedActions as $allowAction ){
	$this-&gt;Auth-&gt;allow( $allowAction );
}
		
foreach( $this-&gt;deniedActions as $denyAction ){
	$this-&gt;Auth-&gt;deny( $denyAction );
}
}
}</pre>
<p>در اینجا من دسترسی به کنش‌ index را برای همه کنترلرها آزاد تعریف کردم . از طرف دیگر سایر کنش‌ها محدود شده‌اند. حال می‌توانم با مقداردهی مجدد <span dir="ltr">$allowedActions</span> و <span dir="ltr">$deniedActions</span> در ابتدای هر کنترلر کنش‌هایش را از لحاظ دسترسی تعریف کنم. برای مثال اگر بخواهم کنش register را در کنترلر users که بطور پیشفرض محدود است آزاد کنم به کنترلر users کد زیر را اضافه می‌کنم:</p>
<pre class="brush: php; title: ; notranslate">var $allowedActions = array(&#039;register&#039;);</pre>
<p>حال تلاش برای نمایش users/register به صفحه users/login منتقل نخواهد شد. تا اینجای کار می‌توانید کنش‌ها را از لحاظ مجوز دسترسی به یک کاربر کنترل کنید اما این کامپوننت انعطاف پذیری‌ خیلی بیشتری دارد در ادامه برخی از آن‌ها بصورت مختصر ذکر می‌گردد.</p>
<p>چگونه خطاها را تغییر دهید؟ اگر دقت کرده باشید وقتی تلاش می‌کنید یک کنش محدود شده را ببینید و به Login منتقل می‌شود خطای عدم مجوز یا هنگامی که نام و کلمه عبورتان درست نیست خطای مربوطه در نمای login نمایش داده می‌شود با مقداردهی دو متغیر زیر در BeforeFilter می‌توانید این خطاها را تغییر دهید:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Auth-&gt;authError = &quot;Access denied!&quot;;
$this-&gt;Auth-&gt;loginError = &quot;That&#039;s not the right email or password!&quot;;</pre>
<p>گاهی اوقات نیاز است شرط دیگری را هم برای ورود موفق تعریف کنیم. مثلا کاربری که علاوه بر نام و کلمه عبورش اکانتش فعال هم شده باشد.  یک فیلد دیگر بنام active به جدول users ‌اضافه می‌کنیم. اگر Y بود کاربر فعال اگر N غیرفعال. حال با کد زیر می‌توانیم به کاربران فعال مجوز ورود بدهیم:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Auth-&gt;userScope = array(&#039;User.active&#039; =&gt; &#039;Y&#039;);</pre>
<p>وقتی users/logout را برای خروج مرور می‌کنید مستقیم به users/login منتقل می‌شوید با مقداردهی کنترلر و کنش زیر می‌توایند هدایت کاربر بعد از logout را تغییر دهید:</p>
<pre class="brush: php; title: ; notranslate">$this-&gt;Auth-&gt;logoutRedirect = array(Configure::read(&#039;Routing.admin&#039;) =&gt; false, &#039;controller&#039; =&gt; &#039;members&#039;, &#039;action&#039; =&gt; &#039;logout&#039;);</pre>
<p>سایر متغیرهای کامپوننت authentication را می‌توانید در مستندات کیک در <a href="http://book.cakephp.org/view/248/AuthComponent-Variables">اینجا</a> دنبال کنید . در پست‌های آینده این کامپوننت را با ACL و Cookie ترکیب می‌کنیم تا سیستمی با مجوزها و گروه‌های مختلف بسازیم. هرچند با امکانات کامپوننت authentication به تنهایی می‌توان سیستمی با گروه‌های مختلف ایجاد کرد، نمونه‌اش را می‌توانید <a href="http://www.studiocanaria.com/articles/cakephp_auth_component_users_groups_permissions_revisited">اینجا</a> بیابید. اما انعطاف پذیری ACL بخصوص در پروژه‌های بزرگ که کاربران در گروه‌های مختلف قرار دارند فوق العاده قوی‌تر است.</p>
<p>هرگونه مشکلی در خصوص این کامپوننت دارید در کامنت‌ها مطرح کنید حتما پاسخ خواهم داد بخصوص اینکه فکر می‌کنم در این پست بعضی از نکته‌ها از قلم افتاده‌اند و شاید نیاز به توضیح بیشتر باشد. موفق باشید، مرتضی الوانی اسفندماه 1387.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/03/11/using-auth-component-in-cakephp/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>نحوه کارکرد سیستم تصدیق هویت در CakePHP</title>
		<link>https://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Thu, 05 Mar 2009 06:19:03 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[ACL]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[CakePHP Component]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=178</guid>

					<description><![CDATA[از آنجایی که قصد داشتم در مورد کامپوننت‌های ACL و Authentication در کیک پی‌اچ‌پی بنویسم (و خیلی‌ها کار با ACL در کیک را از مباحث دشوار می‌دانند)، بهتر دیدم برای فهم بیشتر پست‌های آینده، ابتدا مختصری بصورت تئوری در مورد یک مدل تصدیق هویت کاربر توضیح دهم و سپس با مثال‌های عملی شروع کنم. سیستم‌های [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>از آنجایی که قصد داشتم در مورد  کامپوننت‌های <a href="http://book.cakephp.org/view/171/Access-Control-Lists">ACL</a> و <a href="http://book.cakephp.org/view/172/authentication">Authentication</a> در کیک پی‌اچ‌پی بنویسم (و خیلی‌ها کار با ACL در کیک را از مباحث دشوار می‌دانند)، بهتر دیدم برای فهم بیشتر پست‌های آینده، ابتدا مختصری بصورت تئوری در مورد یک مدل تصدیق هویت کاربر توضیح دهم و سپس با مثال‌های عملی شروع کنم.</p>
<p>سیستم‌های تصدیق هویت کاربر بخش رایج بسیاری از برنامه‌های کاربردی تحت وب هستند. در CakePHP چندین سیستم بدین منظور وجود دارد که هر یک اختیارات متفاوتی ایجاد می‌کند. ساده‌ترین آن استفاده از کامپوننت authentication است که در صورت تصدیق کاربر، مجوز ورود  به تمام بخش‌های برنامه می‌دهد.</p>
<p>این کامپوننت می تواند با کامپوننت دیگری بنام <strong>A</strong>ccess <strong>C</strong>ontrol <strong>L</strong>ists برای ساخت مدل‌های پیچیده‌تری که سطوح مختلفی از دسترسی را تعیین می‌کند، ترکیب شود. برای مثال به یک کاربر مجوز دسترسی به بخش‌های عمومی، به دیگری اجازه ویرایش مطالب و به کاربری دیگر مجوز مدیر سیستم را بدهد.</p>
<p>کار با کامپوننت authentication بطور باورنکردنی ساده‌ و سریع است اما کاربرد کامپوننت  ACL شاید برای بار اولی که از ان استفاده می‌کنید کمی مشکل‌تر باشد اما با یادگیری کاربرد آن به یکی از جالب‌ترین و پرقدرت ترین کامپوننت‌های توکار کیک تبدیل خواهد شد. برای شروع یک سناریو ساده به شکل زیر را که در عمل صورت می‌گیرد تصور کنید:</p>
<p>1- تلاش برای مشاهده آدرس. در ابتدا فرض کنید کاربری بنام محسن سعی میکند محتویات صفحه‌ایی به آدرس http://alvanweb.com/article/edit را مشاهده کند.</p>
<p>2- تجزیه‌ آدرس. هنگامی که درخواست کاربر از طریق مرورگر ارسال می‌شود، کامپوننت authentication تشخیص می‌دهد که آدرس درخواستی با کنترلری بنام article و کنشی بنام edit (که خود با کنشی از نوع update رابطه دارد) در ارتباط است.</p>
<p>3- آیا صفحه محدود شده است؟ همچنین این کامپوننت تشخیص می‌دهد که دسترسی به این کنش در کنترلر article محدود شده است. بنابراین بررسی می‌کند که آیا کاربر وارد سیستم شده است یا خیر. <span id="more-178"></span></p>
<p>4- نمایش فرم ورود کاربر. تا هنگامی که کاربر وارد نشده باشد هر درخواستی برای مشاهده این آدرس به صفحه‌ایی حاوی فرم ورود هدایت می‌شود تا کاربر بتواند با درج نام و کلمه عبور وارد سیستم شود.</p>
<p>5- تطبیق نام‌ و کلمه عبور کاربر. پس از ارسال فرمی که منطبق با اطلاعات موجود در بانک‌داده است، این کامپوننت تشخصی می‌دهد که نام‌کاربری mohsen است. تا اینجا فقط صحبت از کامپوننت authentication بود&#8230;</p>
<p>6- پرسش از ACL برای دسترسی. کامپوننت authentication از ACL می‌پرسد که آیا کاربر mohsen اجازه دارد کنش update رابرای کنترلر article بکار برد یا خیر.</p>
<p>7- ACL دسترسی را تشخصی می‌دهد. حال کامپوننت ACL با بررسی جدول‌های داده تشخیص می‌دهد که کاربر mohsen بطور صریح به هیچکدام از صفحات این سایت بمنظور ویرایش دسترسی ندارد اما این کاربر جز‌ء گروه ویراستار‌ها (Editors) می‌باشد و هر کاربری جزء این گروه قابلیت ویرایش مقالات را دارد. بنابراین کامپوننت ACL این‌گونه پاسخ می‌دهد: تا هنگامی که کاربر mohsen یک ویراستار است، وی مجوز ویرایش مقالات را به ارث می‌برد.</p>
<p>8- authentication هدایت می‌کند. بمحض تشخیص این دسترسی مجددا کامپوننت authentication وارد می‌شود تا کاربر را به صفحه درخواستی هدایت کند.</p>
<p><strong>نکته کلیدی:</strong> کامپوننت ACL می‌بایستی با یک سیستم ورود کاربر بکار گرفته شود.<br />
آنچه مدل بالا در این نوع از کاربرد نشان می‌دهد، نقش کامپوننت ACL بررسی مجوزهای خاص برای دسترسی به بخش‌های مختلف سیستم است بدین دلیل می‌توانیم استدلال کنیم، این کامپوننت باید با کامپوننتی در ارتباط باشد که شامل موارد زیر باشد:</p>
<p><strong>+</strong> نام و کلمه عبور را ذخیره کند.<br />
<strong>+</strong> نام و کلمه عبور را از فرم ورود بگیرد.<br />
<strong>+</strong> نام  و کلمه عبور را با مقادیر ذخیره شده تطبیق دهد.<br />
<strong>+</strong> بمحض تطبیق موفق، نام کاربری را  با اطلاعات نوع درخواست به کامپوننت ACL ارسال کند.<br />
<strong>+</strong> صفحه در خواستی را نمایش دهد یا اینکه با توجه به مجوزی که کامپوننت ACL تعیین می‌کند به صفحه دیگری هدایت کند.</p>
<p>بنابراین می‌توان دریافت کامپوننت توکار authentication یک انتخاب طبیعی برای داشتن یک سیستم ورود کاربر است. که می‌تواند در کنار ACL بکار گرفته شود.</p>
<p>نمونه بالا تنها یک تفکیک وظیفه میان این دو کامپوننت بود. در پست‌های آینده در مورد این کامپوننت و کاربرد آن خواهم نوشت سپس کار با کامپوننت ACL را فرا می‌گیرد در نهایت در مثال <a href="https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">ساخت لینکدونی با CakePHP</a> که در همین وبلاگ آموزش داده شد از این دو کامپوننت استفاده می‌کنیم.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/03/05/how-work-authentication-system-in-cakephp/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>معرفی کتاب: برنامه‌نویسی پیشرفته در پی‌اچ‌پی</title>
		<link>https://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/</link>
					<comments>https://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Fri, 27 Feb 2009 21:32:33 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[کتاب]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Review]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=171</guid>

					<description><![CDATA[هرچند این روزها فرصتی نیست که مانند گذشته کتاب بخوانم اما در عوض فرصت مناسبی است تا کتاب‌هایی که در گذشته خوانده‌ام را معرفی کنم و از کمبود سوژه مناسب برای نوشتن در این وبلاگ بکاهم. در این پست‌ و پست‌های آتی بدنبال لینک دانلود کتاب نباشید. تنها آنچه می‌خوانید برداشت شخصی من از کتاب‌ها [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>هرچند این روزها فرصتی نیست که مانند گذشته کتاب بخوانم اما در عوض فرصت مناسبی است تا کتاب‌هایی که در گذشته خوانده‌ام  را معرفی کنم  و از کمبود سوژه مناسب برای نوشتن در این وبلاگ بکاهم. در این پست‌ و پست‌های آتی بدنبال لینک دانلود کتاب نباشید. تنها آنچه می‌خوانید برداشت شخصی  من  از کتاب‌ها است.<br />
<center><img decoding="async" src="/old_media/advanced-php-programming-book-review.jpg" alt="Advanced PHP Programming Book Review" /></center><br />
کتابی که برای این پست در نظر گرفته‌‌ام کتاب <a href="http://www.amazon.com/gp/product/0672325616/">برنامه‌نویسی پیشرفته در پی‌اچ‌پی</a> نوشته <a href="http://www.schlossnagle.org/~george/blog/">جورج شلاس‌نیگل</a> است (مشخصات دقیق لاتین و ترجمه کتاب در انتهای پست آمده است). اولین چاپ کتاب فوریه سال 2004 بوده و در اسفندماه 1385 توسط مهندس محسن مسگر هروی تحت نام برنامه‌نویسی پیشرفته در PHP 5 به زبان فارسی ترجمه شده است.</p>
<p>برنامه‌نویسانی که با PHP مقدماتی آشنایی داشته و مباحث اولیه وب را بشناسند می‌توانند با مطالعه این کتاب اطلاعات مفیدی را در زمینه‌هایی مانند سبک‌های برنامه‌نویسی، شی‌گرایی، بالا بردن کارایی و سرعت و افزایش امنیت به دست آورند. به کسانی که در  PHP مبتدی هستند توصیه می‌شود پیش از خواندن کتاب به کتب مقدماتی در این زمینه مراجعه کنند.</p>
<p>برخلاف عنوان فارسی و همچنین توضیح روی جلد لاتین، محتوا کاملا منطبق با PHP 5 نیست و هیچ چیز به طور خاص محدود به PHP 5 نمی‌شود! کتاب بیشتر روی ایده‌ها و استراتژی‌ها (بخصوص در قسمت بهبود کد به منظور افزایش سرعت، دقت و طراحی) تمرکز کرده است و صرفا یک آموزش گام به گام نیست و از این جنبه در کتاب‌های نوع خود عالیست. <span id="more-171"></span></p>
<p>اگر قبلا دو یا سه یا تعداد بیشری پروژه‌ی متوسط و بزرگ با  PHP‌ انجام داده‌اید این کتاب مناسب شماست. چرا که  ایده‌های مطرح شده می‌توانند در تغییر افق‌های دید در جهت بهینه‌سازی کد موثر باشند. بنظرم یکی از اصول برنامه‌نویسی حرفه‌ایی، نوشتن کد قابل نگهداری و خوانا است زیرا کدی را که خوب نوشته شده بهتر می‌توان بهینه کرد تا کدی که بهینه بوده اما بد نوشته شده است. این کتاب مقداری شما را با این اصول آشنا می‌کند.</p>
<p>کتاب اصلی (لاتین) 5 بخش (23 فصل) دارد اما در ترجمه فارسی تنها 3 بخش (16 فصل) آورده شده است و دو بخش آخر حذف شده است. بخش چهارم در مورد کارایی و بخش پنجم در مورد توسعه پذیری  (توسعه PHP و Zend Engine) بحث می‌کند که هر دو جزء مهمترین مباحث این کتاب هستند اما نمی‌دانم چرا مترجم آن‌ها را حذف کرده است؟! فهرست کتاب لاتین به صورت زیر است:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
<strong>I-Implementation and Development Methodologies</strong><br />
1-Coding Styles<br />
2-Object-Oriented Programming Through Design Patterns<br />
3-Error Handling<br />
4-Implementing with PHP: Templates and the Web<br />
5-Implementing with PHP: Standalone Scripts<br />
6-Unit Testing<br />
7-Managing the Development Environment<br />
8-Designing a Good API</p>
<p><strong>II-Caching</strong><br />
9-External Performance Tunings<br />
10-Data Component Caching<br />
11-Computational Reuse</p>
<p><strong>III-Distributed Applications</strong><br />
12-Interacting with Databases<br />
13-User Authentication and Session Security<br />
14-Session Handling<br />
15-Building a Distributed Environment<br />
16-RPC: Interacting with Remote Services</p>
<p><strong>IV-Performance</strong><br />
17-Application Benchmarks: Testing an Entire Application<br />
18-Profiling<br />
19-Synthetic Benchmarks: Evaluating Code Blocks and Functions</p>
<p><strong>V-Extensibility</strong><br />
20-PHP and Zend Engine Internals<br />
21-Extending PHP: Part I<br />
22-Extending PHP: Part II<br />
23-Writing SAPIs and Extending the Zend Engine
</li>
</ul>
<p>ترجمه فارسی کتاب خوب است اما توصیه می‌کنم دو فصل آخر را هم بخوانید (خوشبختانه کتاب جدید نیست و با یک جستجوی کوچک می‌توانید فرمت PDF لاتین آن را دانلود کنید)</p>
<p>لازم به ذکر است که تمام مثال‌های این کتاب روی سیستم‌عامل لینوکس نوشته شده است هرچند بسیاری از کدها با تغییراتی اندک روی ویندوز نیز اجرا می‌شوند اما بعضی از مثال‌ها غیر قابل انتقال هستند. همچنین در پایان هر فصل لیستی از منابع آنلاین برای مطالعه بیشتر عنوان شده است.</p>
<ul class="intro">
<li>
<strong>+ مشخصات لاتین کتاب:</strong><br />
عنوان: Advanced PHP Programming<br />
مولف: George Schlossnagle<br />
ناشر: Sams</p>
<p><strong>+ مسخصات ترجمه کتاب:</strong><br />
عنوان: برنامه‌نویسی پیشرفته در PHP 5</p>
<p>مترجم: محسن مسگر هروی<br />
ناشر: موسسه فرهنگی هنری دیباگران تهران
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/02/28/advanced-php-programming-book-review/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>معرفی فیدرول نسخه 1.2.0</title>
		<link>https://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/</link>
					<comments>https://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 20 Jan 2009 22:28:16 +0000</pubDate>
				<category><![CDATA[پروژه‌ ها]]></category>
		<category><![CDATA[FeedRoll]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[آژاکس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=165</guid>

					<description><![CDATA[در پست قبل حدود بیست روز پیش فیدرول را معرفی کردم آن زمان قرار بود فیدرول یک سیستم برای منظم سازی خوراک‌ها براساس زمان آپدیت و جزئیات مختصر دیگری باشد اما مشورت با چند نفر از دوستان و ایده‌های جالب دیگر کارکرد پروژه را عوض کرد. فیدرول قرار است یک آنالیزگر خوراک‌ برای وبلاگ‌های فارسی [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در پست قبل حدود بیست روز پیش فیدرول را معرفی کردم آن زمان قرار بود فیدرول یک سیستم برای منظم سازی خوراک‌ها براساس زمان آپدیت و جزئیات مختصر دیگری باشد اما مشورت با چند نفر از دوستان و ایده‌های جالب دیگر کارکرد پروژه را عوض کرد.<br />
<center><a href="http://feedroll.alvanweb.com"><img decoding="async" src="/old_media/FeedRoll_Logo.png" alt="صفحه اصلی پروژه فیدرول" title="صفحه اصلی پروژه فیدرول" /></a></center><br />
فیدرول قرار است یک آنالیزگر خوراک‌ برای وبلاگ‌های فارسی باشد. فعلا پروژه تکمیل نشده و در حال توسعه است. برخی از قابلیت‌ها بعلت پهنای باند و فضای محدود هاست رایگان تا تهیه یک هاست مناسب به حالت تعلیق درآمده‌اند و در آینده نزدیک قابلیت‌های جدید دیگری افزوده خواهد شد. فیدرول را می‌توانید فعلا <a href="http://feedroll.alvanweb.com">اینجا</a> ببینید.</p>
<ul class="intro">
<li>
<strong>قابلیت‌های فعلی:</strong><br />
+ امکان افزودن خوراک وبلاگ‌ به‌نهایت سادگی و آگاهی از وضعیت آن<br />
+ بروزرسانی خوراک‌ها هر 5 دقیقه یکبار<br />
+ منظم سازی بر اساس زمان بروزرسانی، حروف الفبا، تعداد مشترکین فید‌برنر<br />
+ نمایش عنوان 10 مطلب اخیر وبلاگ‌های ثبت شده<br />
+ جستجوی پیشرفته در نام‌وبلاگ‌ها، زمان بروز‌رسانی و تعداد مشترکین فیدبرنر<br />
+ خروجی RSS با قابلیت سفارشی‌سازی
</li>
</ul>
<p>تمام قابلیت‌های فوق توسط آژاکس (تماماً کتابخانه <a href="http://jquery.com/">JQuery</a>)  و زبان قدرتمند PHP و بانک اطلاعاتی MySQl پیاده‌سازی شده و سعی شده نهایت کاربر پسند بودن در آن لحاظ شود. برخلاف خواسته‌ام ناگزیر شدم <a href="http://cakephp.org">CakePHP </a>را در این پروژه کنار بگذارم و کلاس‌ها را از نو بنویسم. </p>
<p>خوراک چندی از وبلاگ‌های دوستان اضافه شده ‌است می‌توانید خوراک وبلاگتان را اضافه کنید اگه در سیستم موجود باشد هم مطلع خواهید شد. اما چگونه خوراک اضافه کنید. بدین منظور فیلد مناسبی در بالای صفحه تعبیه شده که به سهولت می‌توانید خوراک‌ها را اضافه کنید لازم است توضیحی در مورد محتوای خوراک‌ها بدهم. قرار است روی خوراک‌ها کار آماری شود و علاوه برآن لیست سازی انجام شود پس لازم است به این نکات توجه کنید: <span id="more-165"></span></p>
<p><strong>چگونه خوراک اضافه کنید؟</strong><br />
 قبل از هر چیز می‌بایست خوراکتان معتبر باشد. منظور از اعتبار رعایت معیارهایی است که توسط کنسرسیوم جهانی وب تعریف شده است. اگر وبلاگتان دو خوراک یا بیشتر دارد فقط مجاز هستید یکی را اضافه کنید (خوراکی که مشتمل بر محتوای اصلی وبلاگ‌تان است) خوراک‌ها فقط می‌بایست مخصوص وبلاگ باشند نه وب‌سایت‌هایی نظیر مجله‌ها یا دانلود سنتر‌ها و&#8230;</p>
<p>بهتر است از فیدبرنر استفاده کنید و اگر وبلاگتان این خوراک را دارد آن را اضافه کنید. چرا که تعداد مشترکین فیدبرنر یکی از معیارهای منظم‌سازی است. اگر هم فیدبرنر دارید و از روی ناآگاهی Awareness API غیرفعال است  و مایلید دیگران به تعداد مشترکین خوراکتان دسترسی داشته باشند بهتر است Awareness API را فعال کنید در غیراین‌صورت سیستم تعداد مشترکان را صفر لحاظ می‌کند.</p>
<p>از آنجایی که پس از خرید فیدبرنر توسط گوگل برخی از خوراک‌ها در حال انتقال از سیستم قدیمی به سیستم جدید هستند همه خوراک‌های فیدبرنر (سازگار با API قدیمی و جدید، شامل دامنه‌های feedburner.com و feedproxy.google.com) پشتیبانی می‌شوند.</p>
<p>انتخاب شمار مشترکان فیدبرنر بصورت خام (فیدبرنر آمار روز قبل را ارائه می‌دهد) معیار چندان مناسبی برای منظم‌سازی نیست در آینده از تغییرات در یک بازه زمانی بصورت درصد افزایش یا کاهش هم استفاده خواهد شد. ضمنا منظور از تعداد مشترکان آیتم circulation فیدبرنر است نه تعداد هیت! </p>
<p>پیام‌های موجود در نتیجه افزودن خوراک، گویا هستند اما فعال بودن و غیر فعال بود و درانتظار تایید بودن به چه منظور است. کارکرد سیستم گونه‌ایی است که خوراک‌ها باید تایید شود. پیام معتبر نیست یعنی یا خوراک شرایط اعتبار را ندارد یا سیستم نمی‌تواند خوراک را بخواند. پیام در انتظار تایید یعنی خوراک ثبت شده اما هنوز تایید نشده است. پیام فعال یعنی خوراک در سیستم پردازش می‌شود. فعلا خوراک غیر فعال نداریم اما اگر محتویات خوراک‌ها در سیستم اختلال ایجاد کند غیرفعال خواهد شد.</p>
<p><strong>چگونه خوراک‌ها را مرتب کنید؟</strong><br />
با یک کلیک! در حالت پیشفرض خوراک‌ها بر اساس زمان بروزرسانی(صعودی به نزولی از پایین به بالا) منظم هستند با بردن نشانگر ماوس روی عنوان ستون‌ها و کلیک بر روی آن‌ها می‌توانید بر اساس همان ستون خوراک‌ها را بصورت نزولی و صعودی درآورید و با دکمه‌های زیرین آن‌ها را پیمایش کنید. همچنین با کشیدن ستون‌ها می‌توانید‌ آن‌ها را بزرگ و کوچک کنید. دقیقا همانند کار با سلول‌ها در اکسل.</p>
<p><strong>چگونه در خوراک‌ها جستجو کنید؟</strong><br />
برای شروع جستجو بر روی نماد جستجو در پایین سمت چپ کلیک کنید. نماد کناری عمل بروزرسانی را انجام می‌دهد. پنجره معلق جستجو قابل جابجا شدن است آن را می‌توانید به گوشه‌ایی خارج از جدول بکشید و براساس فیلدها و عملگرهای کاملا هوشمند، جستجوی پیشرفته‌ایی در تمام خوراک‌ها انجام دهید.</p>
<p><strong>محتویات خوراک‌ها را چگونه مشاهده کنید؟</strong><br />
محتویات کامل خوراک‌ها فعلا مقدور نیست (فضا و پهنای باند کافی برای این کار نداریم) منحصرا لیست 10 مطلب اخیر هر خوراک با کلیک بر روی علامت مربع دراولین ستون کنار هر خوراک قابل مشاهده است.</p>
<p><strong>چگونه از خروجی RSS استفاده کنید؟</strong><br />
فعلا خروجی RSS (خوراک فیدرول) بصورت صعودی به نزولی از آخرین آپدیت‌ها مرتب می‌شود تعداد آیتم‌ها را می‌توانید مشخص کنید برای مثال خروجی 20 وبلاگی که اخیراً بروزرسانی شده‌اند به صورت زیر است:</p>
<pre class="brush: php; title: ; notranslate">http://feedroll.izfree.com/rss.php?nu=20
nu = Item Count </pre>
<p>بزودی خروجی براساس تعداد مشترکین فیدبرنر و سایر معیارها با قابلیت offset برای دسترسی به آیتم‌های داخلی اضافه می‌شود. قابلیت‌های دیگری نیز به زودی افزوده خواهند شد. از هر نظر یا پیشنهاد شما برای بهبود عملکرد فیدرول مشتاقانه استقبال می‌شود. ضمنا یادتان نرود خوراک وبلاگ‌تان را اضافه کنید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/01/21/feedroll_introduction_version1_2_0/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
			</item>
		<item>
		<title>این روزها، پروژه FeedRoll</title>
		<link>https://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/</link>
					<comments>https://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Fri, 02 Jan 2009 16:01:18 +0000</pubDate>
				<category><![CDATA[پروژه‌ ها]]></category>
		<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[Blogrolling]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[FeedRoll]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[SimplePie]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=159</guid>

					<description><![CDATA[قرار بود دسامبر سال قبل این مطلب رو بنویسم اما بنابر گرفتاری همیشگی و مشکلی که برای هاست پروژه جدید پیش اومد فرصت نشد. مدت‌ها پیش (همان زمان‌هایی که سرور بلاگرولینگ مرتبا به علت پینگ‌های زیاد از کار می‌افتاد) قصد داشتم سیستمی مشابه بلاگرولینگ با استفاده از فید بنویسم اما فرصت زیادی نداشتم. چند وقت [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>قرار بود دسامبر سال قبل این مطلب رو بنویسم اما بنابر گرفتاری همیشگی و مشکلی که برای هاست پروژه جدید پیش اومد فرصت نشد. مدت‌ها پیش (همان زمان‌هایی که سرور بلاگرولینگ مرتبا به علت پینگ‌های زیاد  از کار می‌افتاد) قصد داشتم سیستمی مشابه بلاگرولینگ با استفاده از فید بنویسم اما فرصت زیادی نداشتم.</p>
<p>چند وقت پیش در یک پروژه کوچک با کلاس <a href="http://simplepie.org">SimplePie</a> آشنا شدم. انصافا در تجزیه عناصر درونی فید عالی عمل می‌کرد به خصوص اینکه مکانیزم caching مناسبی داشت. دو هفته قبل تصمیم گرفتم از این کلاس در قالب یه کامپونت برای <a href="http://cakephp.org">CakePHP</a> بمنظور ایجاد سیستمی مشابه بلاگرولینگ استفاده کنم. </p>
<p>خوشبختانه تا امروز با وجود کمبود وقتی که داشتم این وب اپلیکیشن کوچک رو تا یه جایی رسوندم نتیجه‌اش هم بلاگرول همین‌جاست. بعلت پهنای باند محدودم مجبور شدم فعلا پروژه را روی یک سرور رایگان ران کنم. هنوز پروژه تکمیل نشده و اگه فرصتم اجازه بده روی مولتی یوزر بودنش کار می‌کنم. (البته خبرهای خوشی از <a href="http://status.blogrolling.com/">تیم توسعه بلاگرولینگ</a> به گوش میرسه شاید تا اون زمان دوباره همه برگشتیم)</p>
<p> مهمترین دلیلم برای عدم استفاده از یه تجزیه‌گر فید ساده بمنظور لیست کردن وبلاگ‌ها، عدم ویرایش عناصر فیدها بود. حالا با استفاده از یه مکانیزم کش مناسب و ذخیره آخرین فید هر بلاگ در  MySQL هم عناصر عنوان و توضیحات فیدها قابل ویرایش هستند و هم از لحاظ بهینه‌سازی بار سرور برای لیست‌های طولانی کمتر می‌شه.</p>
<p>لیست بلاگرول اینجا هر 15 دقیقه رفرش می‌شه خروجی فید بلاگرول من هم <a href="http://feedroll.coolpage.biz/rss.php">اینجاست</a>. این‌ها همه رو گفتم برای این که بگم با گسترش کاربرد فید‌ها  تگ pubDate خیلی مهمه. خیلی‌ها هنوز آیتم‌های فیدشون این برچسپ رو نداره یا مقدارش معتبر نیست!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2009/01/02/nowadays-and-feedroll-project/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>پیکربندی Eclipse برای کار با CakePHP (بخش اول)</title>
		<link>https://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 26 Nov 2008 18:01:56 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=158</guid>

					<description><![CDATA[از آنجایی که خیلی از دوستان در رابطه با انتخاب یک IDE مناسب برای کار با کیک با مشکل مواجه بودند. این پست نوشته شد، امیدوارم مفید واقع شود. در این پست و پست آتی تنظیمات ادیتور قدرتمند Eclipse برای کار با فریم‌ورک CakePHP به ترتیب زیر آورده شده است: + بخش اول: 1- معرفی [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> از آنجایی که خیلی از دوستان در رابطه با انتخاب یک IDE مناسب برای کار با کیک با مشکل مواجه بودند. این پست نوشته شد، امیدوارم مفید واقع شود. در این پست و پست آتی تنظیمات ادیتور قدرتمند <a href="http://eclipse.org">Eclipse</a> برای کار با فریم‌ورک <a href="http://cakephp.org">CakePHP </a>به ترتیب زیر آورده شده است:</p>
<ul class="intro">
<li>
<strong>+ بخش اول:</strong><br />
1- معرفی اجمالی Eclipse و ایجاد workspace و project<br />
2- پیوند هسته کیک به پروژه جهت استفاده از قابلیت‌های توکار Eclipse<br />
3- پیکربندی برای شناسایی فایل‌های thtml  یا  ctp<br />
4- پیکربندی برای طبخ کیک بطور مستقیم با کنسول CakePHP</p>
<p><strong>+ بخش دوم:</strong><br />
5- دسترسی به پایگاه داده  MySQL به کمک پلاگ‌‌این QuantumDB<br />
6- افزودن پشتیبانی از Subversion به کمک پلاگ‌این Subclipse</p>
<p><strong>آنچه بدین منظور نیاز دارید:</strong><br />
+‌ نسخه‌ای از Eclipse که شامل ابزارهای توسعه‌ی پی‌اچ‌پی است (3.3.2)<br />
+ نسخه‌ای از XAMPP که بطور پیشفرض در C:xampp نصب شده است<br />
+ نسخه‌ای از CakePHP که بطور پیشفرض در C:xampphtdocscake قرار دارد<br />
+ سیستم عامل ویندوز ایکس‌پی
</li>
</ul>
<p><strong>چرا از Eclipse استفاده می‌کنم؟</strong><br />
اول اینکه کد باز است و تعداد زیادی پلاگ‌این برای آن نوشته شده است که همه‌ی نیازهای یک توسعه دهنده‌ی وب را پوشش می‌دهد بطوریکه با اطمینان می توان گفت این نرم‌افزار به تنهایی یک توسعه دهنده را راضی خواهد کرد.</p>
<p>دوم اینکه بزرگ و قدتمند است اما در عین حال ساده برای بکارگیری. Eclipse یک IDE خاص نیست بلکه برای طیف وسیعی از زبان‌های برنامه‌نویسی منتشر شده است. حتی خیلی از ادیتورهایی که جدیدا عرضه می‌شوند بر پایه‌ی Eclipse بنا شده‌اند. از آن جمله می‌توان نرم‌افزار Carbide.ui Theme Edition شرکت نوکیا که برای طراحی تم‌های گوشی‌های موبایل ساخته شده است را نام برد یا جای دوری نرویم همین <a href="http://www.aptana.com/">Aptana</a> که برای کار با فریم‌ورک‌های جاوااسکریپت پیشنهاد می‌شود و &#8230; <span id="more-158"></span></p>
<p><strong>نصب Eclipse برای PHP</strong><br />
گفتم که Eclipse یک IDE کلی هست. در پروژه‌ایی تحت نام PHP Development Tools معروف به PDT (ابزارهای توسعه پی‌اچ‌پی) آنچه برای توسعه‌ی پی‌اچ‌پی مورد نیاز است به این IDE افزوده شده است. </p>
<p>براساس<a href="http://www.eclipse.org/pdt/"> وب سایت</a> PDT، پکیج All-in-One شامل مجموعه کاملی است برای آنکه بتوان بی‌درنگ از PDT استفاده کرد. آخرین نسخه پایدار برای ویندوز را می توانید از <a href="http://download.eclipse.org/tools/pdt/downloads/">اینجا</a> دریافت کنید.<br />
خوشبختانه نصب eclipse بسیار ساده است چرا که هیچ مرحله‌ای برای نصب ندارد. کافیست آن را از حالت فشرده خارج کنید و در جایی مناسب کپی کنید سپس برنامه را اجرا کنید. برای اولین اجرا احتمالا سوالی برایتان پیش خواهد آمدکه &#8230;</p>
<p><strong>workspace چیست؟</strong><br />
معمولا افراد از تعریف workspace تعابیر متفاوتی دارند. من آن را فضای کاری ترجمه می‌کنم. workspace در حقیقت مکانی است که پروژه‌هایتان را در آنجا نگه می‌دارید (در مثال ما خود فریم‌ورک CakePHP بعنوان workspace شناخته می‌شود) ساده بگویم یک دایرکتوری روی هارد. برای اولین بار اجرای  eclipse باید workspace را تعریف کنید.</p>
<div class="center"><a href="/old_media/defining_your_workspace.jpg"><img decoding="async" src="/old_media/defining_your_workspace_small.jpg" alt="Defining workspace" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p><strong>تعریف‌ کردن workspace</strong><br />
قاعده ثابتی بدین منظور وجود ندارد، اما من توصیه می‌کنم آن را برابر <span dir="ltr">C:xampphtdocs</span> مقدار‌دهی کنید. همچنین از طریق منو File و Switch Workspace می توانید workspace متفاوت دیگری مشخص کنید.</p>
<p><strong>پروژه (Project) چیست؟</strong><br />
همانگونه که شما می‌دانید پروژه‌ی کاری، برنامه‌ا‌‌ی که در حال توسعه دادن است تعریف می‌شود. در مورد CakePHP پروژه‌ایی که در حال توسعه‌دادن است یک کپی از فولدر app کیک است. بنابراین نیاز داریم تا یک پروژه تعریف کنیم.</p>
<p><strong>تعریف کردن پروژه</strong><br />
از منو File گزینه New و سپس PHP Project را انتخاب کنید. در صورتی که این گزینه وجود ندارد در قسمت Other و زیر شاخه PHP می‌توانید PHP Project را بیابید.  تنظیمات بعدی را مطابق شکل انجام دهید (برای دیدن تصاویر در سایز واقعی روی آن‌ها کلیک کنید):</p>
<div class="center"><a href="/old_media/defining_projects.jpg"><img decoding="async" src="/old_media/defining_projects_small.jpg" alt="Defining projects" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>در eclipse هنگام تعریف پروژه چنانچه دایرکتوری پروژه محتوی فایل باشد پنجره‌ایی به شکل زیر برای تایید مسیر پروژه نمایان خواهد شد: </p>
<div class="center"><a href="/old_media/project_location_verification.jpg"><img decoding="async" src="/old_media/project_location_verification_small.jpg" alt="project location verification" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>این پنجره هشدار می‌دهد که محلی که برای تعیین پروژه انتخاب کرده‌اید حاوی فایل است و پاک کردن پروژه در محیط eclipse فایل‌ها را پاک خواهد نمود. با انتخاب گزینه پیشفرض یعنی گزینه دوم، برنامه در مسیر داده شده یک فولدر جدید (هم‌ نام پروژه) می‌سازد و عملیات توسعه در آن انجام خواهد شد. اما از آنجایی که برای توسعه کیک می‌بایستی عملیات توسعه بر روی فایل‌هایی که از فولدر app کپی گرفته‌ایم انجام شود گزینه اول را انتخاب می‌کنیم. دقت کنید که در این حالت پاک کردن پروژه از داخل محیط IDE تمامی فایل‌های آن دایرکتوری را پاک خواهد کرد. هم اکنون می‌بایستی در ستون سمت چپ، پروژه‌تان را مشاهده کنید. می‌توانید هر فولدر را بسهولت باز و ساختار فایل‌های آن را مشاهده کنید.</p>
<p><strong>پیوند هسته کیک به پروژه</strong><br />
حال نوبت آن رسیده است که این پروژه را به هسته کیک پیوند دهیم. به این معنی که بتوانید از کلاس‌ها و ثابت‌های کیک (classes &#038; constants) با قابلیت تکمیل خودکار (auto-complete) استفاده کنید. علاوه بر این می‌توانید به فایل‌های هسته کیک دسترسی داشته باشید. یک راهنمای دم دست!<br />
ابتدا هسته کیک را بعنوان یک پروژه تعریف می‌کنیم. دقیقا شبیه قبل از منو File گزینه New و سپس PHP Project را انتخاب کنید و سپس مطابق شکل زیر عمل کنید:</p>
<div class="center"><a href="/old_media/defining_cakephp_core_project.jpg"><img decoding="async" src="/old_media/defining_cakephp_core_project_small3.jpg" alt="Defining Cakephp core project" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>مجددا در پنجره تاییدیه مسیر پروژه، گزینه اول را انتخاب کنید. حال می‌بایستی بین این دو پروژه پیوند برقرار کنیم بدین منظور در نمای PHP explorer بر روی پروژه اصلی (نه پروژه‌ایی که بعنوان هسته تعریف شد) راست کلیک کرده و گزینه Configure Include Path را انتخاب می‌کنیم. در تب projects با انتخاب add پروژه‌ی Cake را تیک می‌زنیم (دقت کنید چنانچه پروژه Cake بسته باشد در این قسمت موجود نخواهد بود)</p>
<p>حالا می‌توانید نتیجه عملیات رو آزمایش کنید. برای برنامه‌ایی که در نظر دارید یک کنترلر باز یا ایجاد کنید و به نمای Outline بروید. همانطور که مشاهده می کنید کلاس‌ها، توابع و متغیر‌ها را تشخیص داده است. حتی وراثت کلاس را به خوبی مشخص می‌کند بطوری که می توانید به سادگی تمام زیرشاخه‌ها را وارسی کنید. خیلی جالبه نه! و جالب تر اینکه در ویرایشگر PHP قابلیت تکمیل خودکار خیلی هوشمندانه عمل می‌کنه (می‌توانید با میان‌بر Ctrl+Space آزمایش کنید)</p>
<div class="center"><a href="/old_media/linking_project_to_core_in_ide.jpg"><img decoding="async" src="/old_media/linking_project_to_core_in_ide_small.jpg" alt="Linking Project to core in IDE" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p><strong>پیکربندی برای شناسایی فایل‌های thtml  یا  ctp</strong><br />
بسته به اینکه از چه نسخه‌ایی از کیک استفاده می کنید با فایل‌هایی با فرمت thtml (برای نسخه 1.1 کیک) و یا ctp (برای نسخه 1.2 کیک) که برای ایجاد نما (view) استفاده می‌شوند، سر و کار خواهید داشت. این فایل‌ها در حقیقت محتوای PHP‌ دارند. برای اینکه بتوان از قابلیت های‌لایت و تکمیل کد استفاده کنیم بهتر است به روش زیر این فایل‌ها را برای Eclipse بعنوان فایل PHP تعریف کنیم.</p>
<p>بدین منظور از منو Window گزینه Preferences و سپس General را انتخاب کنید. در قسمت Content types شاخه‌ی text را باز کنید و PHP content type را انتخاب کنید. حال در قسمت file associations بر روی add کلیک کنید و <span dir="ltr">*.ctp</span> و <span dir="ltr">*.thtml</span> را در مراحلی جداگانه اضافه کنید.</p>
<div class="center"><a href="/old_media/recognise_thtml_or_ctp_files.jpg"><img decoding="async" src="/old_media/recognise_thtml_or_ctp_files_small.jpg" alt="recognise thtml or ctp files" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>حالا دوباره به preferences برگردید و اینبار Editors و از آنجا File Associations را انتخاب کنید. با انتخاب add مجددا فرمت‌های فوق را اضافه کنید. سپس با انتخاب این فرمت‌ها بطور جداگانه در قسمت Associated Editors با انتخاب add آن‌ها را به PHP Editor بطور پیشفرض اضافه کنید. حال می توانید یک فایل با فرمت ctp در کیک 1.2 باز کنید و های‌لایت کدها را ببینید.</p>
<p><strong>پیکربندی برای طبخ کیک بطور مستقیم</strong><br />
این یک مجتمع‌سازی ماهرانه است و یکی از جالبترین بخش‌هایی است که می‌بایستی در تنظیمات eclipse لحاظ کرد. بسته به اینکه از چه نسخه‌ایی از کیک استفاده می کنید، تنظیمات متفاوت خواهد بود:</p>
<p><strong>برای نسخه 1.1</strong><br />
از منو Run گزینه External Tools  و از آنجا Open External Tools Dialogue را انتخاب کنید. بر روی Program  از سمت چپ، راست کلیک کنید و New را انتخاب کنید. تنظیمات تب main را مطابق شکل زیر لحاظ کنید:</p>
<div class="center"><a href="/old_media/bake_script_1_1.jpg"><img decoding="async" src="/old_media/bake_script_1_1_small.jpg" alt="bake script 1_1" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>Apply و سپس Close کنید. حال از منوی run‌  گزینه External tools و از آنجا Organise favourites را انتخاب و با کلیک روی add و تیک دار کردن Bake_1_1 آن را به لیست اجرا اضافه کنید.</p>
<p><strong>برای نسخه 1.2</strong><br />
ابتدا می‌بایستی کنسول CakePHP را در ویندوز پیکربندی کنید. هر چند یک فیلم آموزشی در این مورد در <a href="http://cakephp.org/screencasts/view/6">اینجا</a> موجود است اما مراحل را توضیح می‌دهم:<br />
به Control Panel از آنجا System و تب Advanced بروید. Environment Variables را انتخاب و از قسمت System variables متغیر سیستمی Path را باز کنید و در فیلد Variable Value در ادامه محتویات مقادیر زیر را قرار دهید (دقت کنید قبل از وارد کردن این مقادیر، در انتهای مقدار موجود علامت سیمیکولون یعنی ;  را بگذارید):</p>
<pre class="brush: php; title: ; notranslate">C:xamppphp;C:xampphtdocscakecakeconsole;</pre>
<p>پنجره‌ها را بترتیب ok کنید. در قسمت run منوی استارت cmd را تایپ کنید تا محیط Command Prompt باز شود در خط فرمان cake تایپ کنید چنانچه پیام خوش‌آمدگویی کنسول کیک را مشاهده کردید پیکربندی کنسول روی ویندوز درست انجام شده است. می توانید با استفاده از دستور cd به شاخه نصب کیک بروید تا مسیرهای صحیح Current Patch را ببینید (هر چند نیازی نیست)</p>
<p>به Eclipse برمی‌گردیم. برای اینکه تنظیمات پیکربندی کنسول در محیط IDE هم لحاظ شود Eclipse را ببندید و مجدد اجرا کنید.  از منو Run گزینه External Tools  و از آنجا Open External Tools Dialogue را انتخاب کنید. بر روی Program  از سمت چپ، راست کلیک کنید و New را انتخاب کنید. تنظیمات تب main را مطابق شکل زیر لحاظ کنید:</p>
<div class="center"><a href="/old_media/bake_script_1_2.jpg"><img decoding="async" src="/old_media/bake_script_1_2_small.jpg" alt="bake script 1_2" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>Apply و سپس Close کنید. حال از منوی run‌  گزینه External tools و از آنجا Organise favourites را انتخاب و با کلیک روی add و تیک دار کردن Bake_1_2 آن را به لیست اجرا اضافه کنید.</p>
<p><strong>چگونه کیک را طبخ کنیم؟</strong><br />
برای  Bake کردن (که من طبخ کردن ترجمه‌اش کردم) run external tool را انتخاب و برحسب نسخه کیک bake_1_1 یا bake_1_2 را اجرا کنید. از طریق منوی run و گزینه External tools نیز قابل دسترسی هستند.<br />
اگر از کیک 1.2 استفاده می‌کنید همانطور که در تنظیمات فوق مشاهده کردید برای آدرس دایرکتوری کاری مقدار <span dir="ltr">${project_loc}</span> را جایگزین کردیم که بطور خودکار به پروژه‌ایی اشاره دارد که انتخاب شده است. یعنی در هنگام Bake کردن، پروژه‌ای که انتخاب شده باشد را Bake خواهد کرد نه سایر پروژه‌ها را. بنابراین باید دقت کنید که قبل از شروع عملیات طبخ پروژه را انتخاب کرده باشید (پروژه کاری نه پروژه‌ایی که بعنوان هسته کیک تعریف شد)</p>
<p>حال با کنسول CakePHP بسادگی می‌توانید پروژه‌های جدید ایجاد کنید، مدل، کنترلر و نما بسازید و دیتابیس را پیکربندی کنید. امیدوارم طباخی یاد داشته باشید. چون توضیح این قسمت خارج از حوصله من است اگر مشکلی داشتید مطرح کنید. </p>
<p>در ادامه این مطلب در پست‌های آینده، دسترسی به پایگاه داده MySQL به کمک پلاگ‌‌این QuantumDB و همچنین افزودن پشتیبانی از Subversion به کمک پلاگ‌این  Subclipse توضیح داده خواهد شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/11/26/setting-up-eclipse-to-work-with-cakephp/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش سوم)</title>
		<link>https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/</link>
					<comments>https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Thu, 23 Oct 2008 21:40:09 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[Linkdump]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP Framework]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=157</guid>

					<description><![CDATA[پیش نیازها: ساخت لینکدونی با CakePHP (بخش اول) و (بخش دوم) در مراحل قبل داده‌ها را از دیتابیس خواندیم و در قالب لینک نمایش دادیم. در این بخش قصد داریم امکان افزودن لینک جدید، ویرایش و حذف لینک را اضافه کنیم و مختصری هم با Routes در کیک پی‌اچ‌پی آشنا شویم. ساخت فرم و افزودن [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>پیش نیازها:</strong> ساخت لینکدونی با CakePHP (<a href="https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">بخش اول</a>) و (<a href="https://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/">بخش دوم</a>)<br />
در مراحل قبل داده‌ها را از دیتابیس خواندیم و در قالب لینک نمایش دادیم. در این بخش قصد داریم امکان افزودن لینک جدید، ویرایش و حذف لینک را اضافه کنیم و مختصری هم با Routes در کیک پی‌اچ‌پی آشنا شویم. </p>
<div class="post_caption">ساخت فرم و افزودن لینک</div>
<p>طبق نمونه‌های گذشته به فایل links_controller.php کنش add  را بصورت زیر اضافه می‌کنیم تا بتوانیم لینک‌های جدیدی در دیتابیس اضافه کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class LinksController extends AppController {
  var $name = &#039;Links&#039;;
  function index() {
    $this-&gt;set(&#039;links&#039;, $this-&gt;Link-&gt;find(&#039;all&#039;));
  }     
  function view($id = null) {
    $this-&gt;Link-&gt;id = $id;
    $this-&gt;set(&#039;link&#039;, $this-&gt;Link-&gt;read());
  }       
  function add() {
    if (!empty($this-&gt;data)) {
     if ($this-&gt;Link-&gt;save($this-&gt;data)) {
$this-&gt;flash(&#039;Your link has been saved.&#039;, &#039;/links&#039;);
     }
    }
  }  
}
?&gt;</pre>
<p>تابع add را به این صورت تعریف می‌کنیم که چنانچه فرم ارسال شده خالی نبود، با استفاده از مدل Link سعی شود داده ذخیره شود اما چنانچه بنا به دلایلی ذخیره نشد، نما نمایش داده شود. این خود فرصتی را در اختیارمان قرار می‌دهد تا خطاهای ناشی از محتوای فیلدهای ارسالی را نمایش دهیم. <span id="more-157"></span></p>
<p>هنگامی کاربر به روش POST داده‌ها را به برنامه ارسال می‌کند، این اطلاعات در <span dir="ltr">$this->data</span> وجود دارند با استفاده از تابع pr‌ می‌توانید آن‌ها را چاپ کنید. تابع <span dir="ltr">$this->flash()</span> یک متد کنترلر است که برای چند ثانیه پیامی را به کاربر نشان می‌دهد. سپس کاربر را به صفحه‌ای که به عنوان پارامتر دوم دریافت می‌کند هدایت می‌کند. (در اینجا کاربر به صفحه‌ی links هدایت می‌شود)</p>
<p>در اینجا لازم است در مورد اشکال زدایی توکار فریم‌ورک (Debug) توضیح بدهم. کیک برای اشکال زدایی دو حالت تولید (Production) و توسعه (Development) دارد. حالت تولید مربوط به زمانی است که پروژه تان با کیک اتمام یافته و قصد دارید آن را ارائه کنید. حالت توسعه هم گویای زمان توسعه پروژه است. این حالت‌ها در فایل  appconfigcore.php با مقداردهی عددی از 0 تا 3 برای debug  قابل تنظیم است. </p>
<p>مقدار 0 مربوط به حالت تولید می‌شود، در این حالت هیچ خطا و هشداری مشاهده نمی‌شود و تابع Flash که در بالا معرفی شد بصورت redirect عمل میکند (بطور خودکار کاربر به صفحه دیگر منتقل می‌شود) در حالتی که این مقدار بزرگتراز صفر تنظیم شود فریم‌ورک در حالت توسعه است و تابع  Flash بطور خودکار عمل انتقال کاربر به صفحه جدید را انجام نمی‌دهد (بطور پیشفرض مقدار روی 2 تنظیم شده است)</p>
<p>متد save خطاها را بررسی خواهد کرد و چنانچه خطایی رخ دهد عمل ذخیره انجام نخواهد شد. در قسمت بعد توضیح خواهم داد که چگونه این خطاها را کنترل کنید.</p>
<div class="post_caption">معتبرسازی داده</div>
<p>هر برنامه‌نویس تحت وبی رویکردی برای بررسی صحت اطلاعات وارد شده در فیلدهای فرم‌ها دارد و تقریبا معتبرسازی اطلاعات وارد شده و هدایت کاربر به پرکردن صحیح فرم‌ها کار وقت گیری است. کیک در این مورد بی‌اندازه متنوع و انعطاف‌پذیر است.</p>
<p>برای بهره‌گیری از قابلیت‌های معتبرسازی فرم‌ها کافیست از FormHelper کیک استفاده کنید. FormHelper  بطور پیشفرض در همه نماها که در آن عملگر <span dir="ltr">$form</span>  بکار رود موجود است. نمای add را بصورت زیر ایجاد می‌کنیم:</p>
<pre class="brush: php; title: ; notranslate">/app/views/links/add.ctp
&lt;h1&gt;Add Link&lt;/h1&gt;
&lt;?php
echo $form-&gt;create(&#039;Link&#039;);
echo $form-&gt;input(&#039;title&#039;);
echo $form-&gt;input(&#039;url&#039;);
echo $form-&gt;input(&#039;body&#039;, array(&#039;rows&#039; =&gt; &#039;3&#039;));
echo $form-&gt;end(&#039;Save Link&#039;);
?&gt;</pre>
<p>در اینجا از <span dir="ltr">$form->create()</span>  بمنظور ایجاد تگ باز form استفاده کردیم این کد خروجی زیر را تولید می‌کند:</p>
<pre class="brush: xml; title: ; notranslate">&lt;form id=&quot;LinkAddForm&quot; method=&quot;post&quot; action=&quot;/cake/links/add&quot;&gt;</pre>
</form>
<p>اگر تابع create  هیچ پارامتری نداشته باشد، بطور پیشفرض کیک action و method را مقدار‌دهی می‌کند. از <span dir="ltr">$form->input()</span> هم برای ایجاد عناصر فرم با همان نامی که به عنوان پارامتر می‌گیرد استفاده می‌شود. کیک توسط اولین پارامتر تشخیص می‌دهد که فیلد از چه نوعی است و دومین پارامتر این امکان را فراهم می کند که آرایه وسیعی با اختیارات فراوان تعیین کنیم. در اینجا تعداد سطرهای textarea لحاظ شده است. <span dir="ltr">input()</span> عناصر فرمی متفاوتی را، مبنی بر مدل فیلد مشخص شده، ایجاد می‌کند و این یکی از شگردهای کیک است.<br />
با فراخوانی <span dir="ltr">$form->end()</span> یک کلید ارسال ایجاد، و تگ form بسته می‌شود. رشته‌ای که به عنوان اولین پارامتر <span dir="ltr">end()</span> قرار می‌گیرد، برابر مقدار (value) کلید ارسال خواهد بود.</p>
<p>حال اجازه بدهید به صفحه اصلی لینکدونی برگردیم و در فایل app/views/links/index.ctp لینک  صفحه جدیدی را که بمنظور افزودن داده به دیتابیس ساختیم، قبل از جدول اضافه کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php echo $html-&gt;link(&#039;Add Link&#039;,&#039;/links/add&#039;)?&gt;</pre>
<p>ممکنه تعجب کنید که چطور کیک صحت اعتبار این فیلدها را بررسی می‌کند. قاعده‌های معتبر‌سازی در مدل تعریف می‌شوند. بدین منظور مجدداً به مدل Link بر می‌گردیم و اصلاحاتی را به شکل زیر لحاظ می‌کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class Link extends AppModel {
   var $name = &#039;Link&#039;;
   var $validate = array(
     &#039;title&#039; =&gt; array(
     &#039;rule&#039; =&gt; array(&#039;minLength&#039;, 1)
    ),
     &#039;url&#039; =&gt; array(
     &#039;rule&#039; =&gt; array(&#039;minLength&#039;, 1)
    ),    
     &#039;body&#039; =&gt; array(
     &#039;rule&#039; =&gt; array(&#039;minLength&#039;, 1)
    )
  );	
}
?&gt;</pre>
<p>آرایه <span dir="ltr">$validate</span> به کیک می‌گوید که هنگامی که متد <span dir="ltr">save()</span> فراخوانی شد چگونه صحت اطلاعات بررسی شود. در اینجا سه فیلد عنوان، آدرس و توضیحات را چک می‌کنیم که نبایستی خالی باشد. یکبار دیگر تکرار می‌کنم موتور معتبرسازی کیک بسیار قوی است چرا که شمار زیادی از قواعد پیش‌ساخته شده (بررسی صحت آدرس ایمیل، شماره کارت اعتباری، تلفن و &#8230;) در آن گنجانده شده است و سفارشی سازی آنها انعطاف پذیری فوق العاده‌ای دارد. برای اطلاعات بیشر می توانید به <a href="http://book.cakephp.org/view/125/data-validation">اینجا</a> رجوع کنید.</p>
<p>هم‌اکنون قواعد معتبرسازی لحاظ شده‌اند. فرم افزودن لینک را با فیلدهای خالی تست کنید تا ببینید چگونه کار می‌کند. هنگامی که از <span dir="ltr">input()</span> برای ایجاد عناصر فرم استفاده می‌کنیم، خطاهای مربوط به عدم صحت داده بطور خودکار نمایش داده می‌شوند.</p>
<div class="post_caption">حذف کردن لینک</div>
<p>قصد داریم امکانی را ایجاد کنیم که کاربران بتوانند لینک‌ها را از دیتابیس پاک کنند. خوب! با کنش <span dir="ltr">delete()</span>  در LinksControlle  به شکل زیر شروع می کنیم:</p>
<pre class="brush: php; title: ; notranslate">function delete($id) {
$this-&gt;Link-&gt;del($id);
$this-&gt;flash(&#039;The link with id: &#039;.$id.&#039; has been deleted.&#039;, &#039;/links&#039;);
}</pre>
<p>این تابع با گرفتن <span dir="ltr">$id</span> هر لینک، آن را از دیتابیس پاک می‌کند و با استفاده از <span dir="ltr">flash()</span> پیام تاییدی را مبنی بر حذف لینک قبل از ری‌دایرکت (انتقال خودکار) شدن به صفحه‌ی <span dir="ltr">/links</span> به کاربر نشان می‌دهد. با این وجود یکبار دیگر باید فایل index.ctp را بصورت زیر ویرایش کنیم و قابلیت حذف هر لینک را به آن بیفزاییم:</p>
<pre class="brush: php; title: ; notranslate">&lt;h1&gt;Links:&lt;/h1&gt;
&lt;p&gt;&lt;?php echo $html-&gt;link(&#039;Add Link&#039;,&#039;/links/add&#039;)?&gt;&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Actions&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($links as $link): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;id&#039;&amp;#93;; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link($link&#x5B;&#039;Link&#039;]&#x5B;&#039;title&#039;],
&quot;/links/view/&quot;.$link&#x5B;&#039;Link&#039;]&#x5B;&#039;id&#039;]); ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link(&#039;Delete&#039;, &quot;/links/delete/{$link&#x5B;&#039;Link&#039;]&#x5B;&#039;id&#039;]}&quot;, null, &#039;Are you sure?&#039; )?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;created&#039;&amp;#93;; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;</pre>
<p>کد بالا از قابلیت توکار HtmlHelper  بمنظور ایجاد یک دیالوگ جاوااسکریپتی تایید حذف لینک، قبل از اینکه کاربر لینک را حذف کند، استفاده می کند. می‌بینید این فریم‌ورک تا چه اندازه همه چیز را ساده کرده است!</p>
<div class="post_caption">ویرایش لینک </div>
<p>اگر مراحل قبل را فراگرفته باشید از الان شما یک حرفه‌‌ای کیک پی‌اچ‌پی هستید! پس می‌بایستی الگوی ادامه کار را حدس بزنید. یک کنش می‌سازیم و سپس نما را اضافه می‌کنیم. در زیر کنش <span dir="ltr">edit()</span> را که باید در LinksControlle لحاظ شود می‌بینید:</p>
<pre class="brush: php; title: ; notranslate">function edit($id = null) {
 $this-&gt;Link-&gt;id = $id;
 if (empty($this-&gt;data)) {
  $this-&gt;data = $this-&gt;Link-&gt;read();
 } else {
  if ($this-&gt;Link-&gt;save($this-&gt;data)) {
$this-&gt;flash(&#039;Your link has been updated.&#039;,&#039;/links&#039;);
  }
 }
}</pre>
<p>این تابع ابتدا داده ارسالی فرم را  بررسی می‌کند ، اگر هیچ چیزی فرستاده نشده باشد لینک‌ها را به نما منتقل می‌کند. اگر داده‌ای در نتیجه تغییر، ارسال شده باشد سعی می‌کند از طریق مدل Link داده‌ جدید را در دیتابیس ذخیره کند (یا خطاهای ناشی از عدم اعتبار داده را نشان خواهد داد) نمای edit بصورت زیر است:</p>
<pre class="brush: php; title: ; notranslate">/app/views/links/edit.ctp
&lt;h1&gt;Edit Link&lt;/h1&gt;
&lt;?php
echo $form-&gt;create(&#039;Link&#039;, array(&#039;action&#039; =&gt; &#039;edit&#039;));
echo $form-&gt;input(&#039;title&#039;);
echo $form-&gt;input(&#039;url&#039;);
echo $form-&gt;input(&#039;body&#039;, array(&#039;rows&#039; =&gt; &#039;3&#039;));
echo $form-&gt;input(&#039;id&#039;, array(&#039;type&#039;=&gt;&#039;hidden&#039;));
echo $form-&gt;end(&#039;Save Link&#039;);
?&gt;</pre>
<p>خروجی کد بالا فرمی خواهد بود که درفیلدهای آن اطلاعات لینکی که درخواست ویرایش آن داده شده قرار دارد. باید در اینجا توجه کنید که id هر لینک بصورت یک عنصر مخفی (hidden) در فرم آمده است. در حقیقت هنگامی که id هر لینک با اطلاعات ارسال شده باشد کیک تشخیص می‌دهد که این لینک باید ویرایش شود در صورتی که اگر id با اطلاعات ارسالی نباشد هنگامی که تابع <span dir="ltr">save()</span> فراخوانی می‌شود یک لینک جدید اضافه خواهد شد.</p>
<p>مجدداً به نمای index برمی‌گردیم و قابلیت ویرایش هر لینک را به صورت زیر در کنار پیوند مربوط به حذف لینک اضافه می‌کنیم (تا در صفحه‌ی اصلی قابلیت ویرایش لینک را داشته باشیم):</p>
<pre class="brush: php; title: ; notranslate">&lt;?php echo $html-&gt;link(&#039;Edit&#039;, &#039;/links/edit/&#039;.$link&#x5B;&#039;Link&#039;]&#x5B;&#039;id&#039;]);?&gt;</pre>
<p>تا اینجا آموختید که چگونه با  CakePHP یک لینکدونی ساده بسازید. قابلیت‌هایی نظیر افزودن، ویرایش و حذف لینک تنها به این دلیل بود که با نحوه ایجاد کنش در کنترلر آشنا شوید و بتوانید نماهای مربوطه را ایجاد کنید. به ادمه بحث در مورد Routes (مسیرها) می‌پردازیم.</p>
<div class="post_caption">مسیرها (Routes) در CakePHP</div>
<p>برای بعضی‌ها تنظیمات پیشفرض کیک در مورد مسیرها کافی است. اما توسعه دهندگان نسبت به کاربرپسند کردن URL‌ها و سازگاری با موتورهای جستجو حساس هستند. از اینرو می‌توانند از تنظیمات Routes استفاده کنند. در این آموزش تغییرات ناچیزی را در این مورد لحاظ می‌کنیم برای اطلاعات بیشتر و تکنیک‌های مسیر‌دهی پیشرفته، بخش <a href="http://book.cakephp.org/view/46/">Routes Configuration</a> در مستندات کیک را ببینید.</p>
<p>تا اینجا که لینکدونی را ایجاد کردیم چنانچه کاربری به صفحه‌ی اصلی (شاخه دایرکتوری اصلی) به نشانی example.com/cake مراجعه کند بطور پیشفرض PagesController فراخوانی می‌شود و نمایی بنام home رندر می‌شود. قصد داریم مسیر را طوری تعیین کنیم که با درخواست شاخه اصلی، لیست لینک‌ها نمایش داده شود. </p>
<p>مسیرها در فایل app/config/routes.php تعیین می‌شوند. خط زیر مسیر پیشفرض شاخه اصلی را تعیین می‌کند. آن را توسط کامنت (//) غیرفعال کنید یا این خط را پاک کنید:</p>
<pre class="brush: php; title: ; notranslate">Router::connect(&#039;/&#039;, array(&#039;controller&#039; =&gt; &#039;pages&#039;, &#039;action&#039; =&gt; &#039;display&#039;, &#039;home&#039;));</pre>
<p>خط فوق آدرس &#8216;/&#8217; را با صفحه پیشفرض کیک مرتبط می‌کند. ما می‌خواهیم آن را با کنترلر خودمان ارتباط دهیم بنابراین خط زیر را به این فایل اضافه می‌کنیم:</p>
<pre class="brush: php; title: ; notranslate">Router::connect(&#039;/&#039;, array(&#039;controller&#039; =&gt; &#039;links&#039;, &#039;action&#039; =&gt; &#039;index&#039;));</pre>
<p>حال با رفتن به صفحه اصلی کیک به نشانی example.com/cake بجای صفحه پیشفرض لیست لینک‌ها را می‌بینید. می‌توانید نام شاخه اصلی را که در بخش اول آموزش cake گذاشتید، به linkdump تغییر دهید (تا هخوانی بیشتری  با پروژه داشته باشد) بنابراین آدرس صفحه اصلی به example.com/linkdump تغییر خواهد کرد.</p>
<p>اگر نام شاخه را از cake به  linkdump تغییر دادید فایل‌های تمپ را پاک کنید تا صفحه اصلی را ببینید. تنها جهت آشنایی شما با خطاهای پیکربندی اولیه کیک، نام دایرکتوری را ابتدا cake انتخاب کردم چون می‌توانست از همان ابتدا linkdump انتخاب شود.</p>
<div class="post_caption">سخن آخر</div>
<p>نوشتن این لینکدونی در اینجا به پایان رسید. ساده نبود؟! یادتان باشد این آموزش پایه بود CakePHP خیلی خیلی قابلیت‌های بیشتری از آنچه گفته شد دارد و بیش از آنچه تصور کنید انعطاف‌پذیر است. متاسفم از اینکه باید بگویم فرصت کافی ندارم تا آنچه از کیک می‌دانم بزبان ساده بیان کنم.</p>
<p> از همین الان می‌توانید پروژه‌های آزمایشی را با کیک  شروع کنید. بزرگترین راهنما یعنی <a href="http://book.cakephp.org/">Manual</a> و <a href="http://api.cakephp.org/">API</a> کیک در اختیار شماست. اگر مشکلی داشتید در حد دانشم درخدمتم. موفق باشید. (مرتضی الوانی، آبانماه 1387)</p>
<div class="post_caption">دریافت فایل‌های ضمیمه</div>
<p><strong><a href="/old_media/cake_app_linkdump.zip">[+]</a></strong> دایرکتوری app این پروژه بهمراه فایل sql ساخت جدول<br />
<strong><a href="/old_media/create_linkdump_with_cakephp.zip">[+]</a></strong> آموزش کامل (بخش‌های اول و دوم و سوم) بصورت PDF</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش دوم)</title>
		<link>https://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/</link>
					<comments>https://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 22 Oct 2008 20:43:33 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=156</guid>

					<description><![CDATA[پیش نیاز: ساخت لینکدونی با CakePHP (بخش اول) در پست قبل تا ساخت پایگاه‌ داده و مقداردهی فایل database.php بمنظور ارتباط با MySQL پیش رفتیم. حال یک جدول بنام links با شش فیلد زیر در دیتابیس linkdump که قبلاً ساخته‌ایم ایجاد می‌کنیم. همچنین جهت تست دو لینک اضافه می‌کنیم: /* First, create our links table: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>پیش نیاز:</strong> <a href="https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/">ساخت لینکدونی با CakePHP (بخش اول)</a><br />
در پست قبل تا ساخت پایگاه‌ داده و مقداردهی فایل database.php  بمنظور ارتباط با MySQL پیش رفتیم. حال یک جدول بنام links با شش فیلد زیر در دیتابیس linkdump که قبلاً ساخته‌ایم ایجاد می‌کنیم. همچنین جهت تست دو لینک اضافه می‌کنیم:</p>
<pre class="brush: sql; title: ; notranslate">/* First, create our links table: */
CREATE TABLE links (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255),
title VARCHAR(255),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
/* Then insert some links for testing: */
INSERT INTO links (url, title, body, created) VALUES
(&#039;http://alvanweb.com&#039;, &#039;Alvanweb&#039;, &#039;All about web design and progrmming&#039;, NOW()),
(&#039;http://cakephp.org&#039;, &#039;CakePHP&#039;, &#039;The rapid development php framework&#039;, NOW());</pre>
<p>نام‌ جدول و ستون‌ها اختیاری نیستند! اگر از قواعد نامگذاری جداول و کلاس‌های کیک پیروی کنید خواهید توانست از مزایای توابع توکار کیک بدون پیکر‌بندی براحتی استفاده کنید. کیک تا انجا انعطاف پذیر است که حتی با وجود عدم تطابق با طرح‌های پیشفرض می‌توانید آن را سفارشی کنید اما استفاده از قواعد در صرفه‌جویی زمان موثر است. </p>
<p>برای اطلاعات بیشتر در مورد این قواعد نامگذاری <a href="http://book.cakephp.org/view/22/">اینجا</a> را ببینید. اما همین اندازه کافی است که بدانید جدول links بطور خودکار به مدلی بنام link اشاره دارد و همچنین فیلدهای created و modified بطور منطقی و خودکار توسط کیک مدیریت می‌شوند. <span id="more-156"></span></p>
<div class="post_caption">ایجاد یک مدل</div>
<p>به سراغ کدنویسی کیک می‌رویم. اولین فایلی که باید ایجاد کنیم یک مدل برای لینک‌ها است. به زبان ساده بگویم مدل در واقع نان و کره‌ی یک برنامه نوشته شده با کیک است. با ایجاد یک مدل با دیتابیس ارتباط برقرار کرده‌ایم. در ابتدا پایه کد را می‌نویسیم سپس اعمالی نظیر نمایش، افزودن، ویرایش و حذف لینک را اضافه خواهیم کرد.</p>
<p>کلاسی که به عنوان مدل تعریف می‌شود در app/models  قرار می‌گیرد و محتویات فایلی که در app/models/link.php ذخیره خواهد شد بصورت زیر است:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class Link extends AppModel {
   var $name = &#039;Link&#039;;
}
?&gt;</pre>
<p>یادتان نرود قواعد نامگذاری در کیک بسیار مهم است. با نامیدن مدل بنام Link کیک بطور خودکار می‌تواند تشخیص دهد که این مدل توسط کنترلری بنام LinksController بکار گرفته خواهد شد و با جدولی بنام links در دیتابیس در ارتباط است.</p>
<p>اگر کیک نتواند فایلی مطابق با مدل در app/models بیابد، بطور داینامیک یک آبجکت مدل ایجاد می‌کند. این همچنین به این معناست که اگر بطور تصادفی نام فایل مدل را اشتباه تایپ کنید (مثلا بجای link.php نام فایل links.php شود) کیک هیچ کدام از تنظیمات شما را لحاظ نمی کند و در عوض مقادیر پیشفرض خودش را جانشین خواهد کرد.</p>
<div class="post_caption">ایجاد یک کنترل‌کننده</div>
<p>در این مرحله برای لینک هایمان یک کنترلر ایجاد می‌کنیم. کنترلر جایی است که قصد داریم جزئیات لینک ها را استخراج کنیم. فایلی بنام links_controller.php را با محتویات پایه‌ی زیر در app/controllers ایجاد می‌کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class LinksController extends AppController {
   var $name = &#039;Links&#039;;
}
?&gt;</pre>
<p>حال اجازه دهید یک کنش (Action) به کنترلر بیفزایم. کنش اغلب به یک تابع در برنامه اشاره دارد. برای مثال وقتی کاربران درخواست example.com/cake/links/index را ‌می‌دهند (که با example.com/cake/links  مشابه است) انتظار دارند با لیستی از لینک‌ها مواجه شوند. کدی که این کنش را تعریف می‌کند بصورت زیر است:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class LinksController extends AppController {
   var $name = &#039;Links&#039;;
   function index() {
     $this-&gt;set(&#039;links&#039;, $this-&gt;Link-&gt;find(&#039;all&#039;));
   }
}
?&gt;</pre>
<p>با تعریف تابع index در LinksController، کاربران می‌توانند به درخواستی مانند این example.com/cake/links/index دسترسی داشته باشند. بطور مشابه اگر تابعی بنام foobar تعریف کنیم کاربران قادر خواهند بود به درخواست example.com/links/foobar دسترسی داشته باشند.</p>
<p>ممکن است کنجکاو شوید تا به طریقی نام‌های کنترلر و کنش را تغییر دهید. فعلاً دست نگهدارید و از قواعد کیک بمنظور ایجاد کنش‌های قابل فهم استفاده کنید. در آینده بدین منظور با routes در کیک آشنا خواهید شد.</p>
<p>در این کنش از تابع set برای گذر داده از کنترل‌کننده به نمایش (view) استفاده می‌کنیم. این خط، متغیر links را برابر مقدار بازگشتی از <span dir="ltr">find(&#8216;all&#8217;)</span> تنظیم می‌کند. مدل لینک بطور خودکار در <span dir="ltr">$this->Link</span> موجود خواهد بود چراکه از قواعد نامگذاری کیک استفاده کردیم.</p>
<div class="post_caption">ایجاد یک نما</div>
<p>تا هم اکنون با جریان داده به مدل، منطق برنامه و روند تعریف شده توسط کنترلر آشنا شدید حال اجازه دهید یک نما برای کنش index که در بالا تعریف شد ایجاد کنیم. نماهای کیک در واقع نمایش  اجزایی هستند که در طرح‌بندی (layout)  برنامه کنار هم قرار میگیرند. برای بیشتر برنامه‌ها HTML مخلوط با PHP استفاده می‌شود اما می تواند بصورت XML، CSV یا حتی داده باینری باشد.</p>
<p>آخرین قسمت عنوان قبل را بیاد آورید، که چگونه متغیر links را با متد set به نما ارجاع می‌دادیم؟ خروجی آرایه را می‌توانیم به صورت زیر نشان دهیم:</p>
<pre class="brush: php; title: ; notranslate">// print_r($links) output:
Array
(
 &#x5B;0] =&gt; Array
  (
	&#x5B;Link] =&gt; Array
	 (
	 &#x5B;id] =&gt; 1
	 &#x5B;url] =&gt; http://alvanweb.com
	 &#x5B;title] =&gt; Alvanweb
 &#x5B;body] =&gt; All about web design and progrmming
	 &#x5B;created] =&gt; 2008-10-22 20:29:21
	 &#x5B;modified] =&gt;
	 )
  )
 &#x5B;1] =&gt; Array
  (
	Link] =&gt; Array
	 (
	 &#x5B;id] =&gt; 2
	 &#x5B;url] =&gt; http://cakephp.org
	 &#x5B;title] =&gt; CakePHP
 &#x5B;body] =&gt; The rapid development php framework
	 &#x5B;created] =&gt; 2008-10-22 20:29:21
	 &#x5B;modified] =&gt;
	 )
  )
)</pre>
<p>فایل‌های مربوط به نما در app/views در فولدری همنام با واژ‌ه‌ای که در کنترلر تعریف می‌شود، ذخیره می‌شوند. (در اینجا می‌بایستی نام فولدر ما links باشد) برای فرم‌دادن به داده‌ی لینک‌هایمان در قالب یک جدول زیبا(ایجاد صفحه‌ای برای کنش index)، از کد زیر استفاده می‌کنیم:</p>
<pre class="brush: xml; title: ; notranslate">/app/views/links/index.ctp
&lt;h1&gt;Links:&lt;/h1&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Created&lt;/th&gt;
&lt;/tr&gt;
&lt;?php foreach ($links as $link): ?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;id&#039;&amp;#93;; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $html-&gt;link($link&#x5B;&#039;Link&#039;]&#x5B;&#039;title&#039;],
&quot;/links/view/&quot;.$link&#x5B;&#039;Link&#039;]&#x5B;&#039;id&#039;]); ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;created&#039;&amp;#93;; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;</pre>
<p>احتمالاً متوجه استفاده از آبجکتی بنام <span dir="ltr">$html</span> شده‌اید. این یک نمونه از کلاس HtmlHelper کیک است. کیک‌ پی‌اچ‌پی مجموعه‌ای از این آبجکت‌ها را تحت نام view helpers در خود گنجانده است مواردی از قبیل لینک‌گذاری، خروجی فرم، جاوااسکریپت و آژاکس از این دسته‌اند. اطلاعات تکمیلی درمورد کار با آنها را می‌توانید <a href="http://book.cakephp.org/view/181/">اینجا</a> بیابید. اما انچه در اینجا مهم است که بدان اشاره شود متد link است که بوسیله‌ی پارامترهایی که گرفته است، یک لینک HTML را ایجاد خواهد کرد. در این مرحله می بایستی بتوانید در مرورگرتان مسیر example.com/cake/links/index را ببینید.</p>
<p>اگر بر روی هر یک از لینک‌ها کلیک کنید تا توضیحاتش را ببینید با صفحه‌ی خطایی مواجه خواهید شد مبنی بر این که کنش مربوطه در فایل کنترل‌کننده هنوز تعریف نشده است. بنابراین مجدداً به فایل links_controller.php بر‌ می‌گردیم تا یک کنش بنام view بمنظور نمایش اطلاعات هر لینک ایجاد کنیم:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
class LinksController extends AppController {
  var $name = &#039;Links&#039;;
  function index() {
    $this-&gt;set(&#039;links&#039;, $this-&gt;Link-&gt;find(&#039;all&#039;));
  } 
  function view($id = null) {
    $this-&gt;Link-&gt;id = $id;
    $this-&gt;set(&#039;link&#039;, $this-&gt;Link-&gt;read());
  }    
}
?&gt;</pre>
<p>خوب با set که از قبل آشنایی دارید اما نکته‌ای که در اینجا لازم است به آن اشاره کنیم این است که بجای <span dir="ltr">find(&#8216;all&#8217;)</span> از read استفاده کردیم چراکه قصد داریم اطلاعات تنها یک لینک را استخراج کنیم.</p>
<p>دقت کنید کنش view یک پارامتر می‌گیرد که برابر با ID هر لینک است. این پارامتر از طریق درخواست از طریق URL مقداردهی می‌شود بطوریکه اگر کاربری links/view/2 را درخواست دهد، مقدار 2 برابر ID خواهد بود. حال اجازه دهید نمای view را برای این کنش در app/views/links بصورت زیر ایجاد کنیم:</p>
<pre class="brush: php; title: ; notranslate">/app/views/links/view.ctp
&lt;h1&gt;&lt;?php echo $html-&gt;link($link&#x5B;&#039;Link&#039;]&#x5B;&#039;title&#039;],
$link&#x5B;&#039;Link&#039;]&#x5B;&#039;url&#039;]); ?&gt;&lt;/h1&gt;
&lt;p&gt;&lt;small&gt;Created: &lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;created&#039;&amp;#93;?&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;?php echo $link&amp;#91;&#039;Link&#039;&amp;#93;&amp;#91;&#039;body&#039;&amp;#93;?&gt;&lt;/p&gt;</pre>
<p>حال با کلیک بر روی هر لینک اطلاعات مربوط به آن لینک در صفحه‌ای دیگر نمایش داده خواهد شد. در پست بعدی سایر مراحل را دنبال خواهیم کرد.<br />
<strong>ادامه:</strong> ساخت لینکدونی با CakePHP (<a href="https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">بخش سوم</a>)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>ساخت لینکدونی با CakePHP (بخش اول)</title>
		<link>https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/</link>
					<comments>https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 22 Oct 2008 16:03:54 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=155</guid>

					<description><![CDATA[در پست قبل با فریم‌ورک قدرتمند CakePHP و ساختار MVC آشنا شدیم. از آنجایی که فراگیری این ساختار جز با تمرین و در عمل ممکن نیست، در این پست و پست‌های آتی قصد داریم یک پروژه‌ی کوچک را با این فریم‌ورک مرحله به مرحله با هم دنبال کنیم. در ابتدا ساخت یک لینکدونی ساده که [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در <a href="http://weblog.com/blog/2008/09/21/mvc-architecture-in-cakephp/">پست قبل</a> با فریم‌ورک قدرتمند CakePHP و ساختار MVC آشنا شدیم. از آنجایی که فراگیری این ساختار جز با تمرین و در عمل ممکن نیست، در این پست و پست‌های آتی قصد داریم یک پروژه‌ی کوچک را با این فریم‌ورک مرحله به مرحله با هم دنبال کنیم. در ابتدا ساخت یک لینکدونی ساده که قابلیت افزودن، ویرایش و حذف لینک را دارد هدف نهایی است و در مرحله بعد در صورتیکه فرصت محدودم اجازه بیشتری  بدهد قابلیت‌های دیگری نظیر شمارش کلیک، دسته‌بندی و امکان نظر‌دهی افزوده خواهد شد.</p>
<div class="post_caption">آنچه برای شروع کار با کیک مورد نیاز است</div>
<p><strong>1)</strong> سرور HTTP،‌ ترجیاً Apache با mod_rewrite فعال (برای کاربرپسند کردن URL‌ها و کار با فایل‌های htaccess بهتر است قابلیت mod rewrite را فعال کنید. بدین منظور می‌بایستی فایل httpd.conf سرور آپاچی را ویرایش کنید)   </p>
<p><strong>2)</strong> پی‌‌اچ‌پی 4.3.2  یا بالاتر، کیک پی‌اچ‌پی با نسخه‌های 4 و 5 پی‌اچ‌پی کاملاً سازگار است. برای نصب PHP تحت ویندوز خواندن <a href="http://www.toofani.net/archive/2008/05/05/install-php-on-windows-step-by-step.aspx">این مطلب</a> پیشنهاد می‌شود.</p>
<p>برای اجرای کیک موارد فوق کافی است اما در مورد ساخت لینکدونی به یک پایگاه داده نیاز داریم. ترجیحاً از <a href="http://dev.mysql.com/downloads/mysql/">MySQL</a> استفاده می‌کنیم. برای نصب و راه‌اندازی مای ‌اس‌کیو‌ال سرور، خواندن <a href="http://www.toofani.net/archive/2008/06/28/install-mysql-on-windows-step-by-step.aspx">این مطلب</a> پیشنهاد می‌شود. لازم به ذکر است، CakePHP علاوه بر MySQL از پایگا‌ه‌های داده زیر پشتیبانی می‌کند:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
PostgreSQL| Firebird DB2 | Microsoft SQL Server | Oracle | SQLite | ODBC
</li>
</ul>
<p>برای راحت‌کار کردن با MySQL بهتر است از رابط تحت وب phpmyadmin استفاده کنید یا با استفاده از رابط گرافیکی MySQL GUI Tools دیتابیس را مدیریت کنید. <span id="more-155"></span></p>
<div class="post_caption">نحوه نصب و پیکربندی CakePHP</div>
<p>کیک کاملاً رایگان و کد‌باز است. به دو طریق می‌توانید آخرین نسخه از آن را دریافت کنید. اول اینکه یک نسخه فشرده شده‌ی (zip/tar.gz/tar.bz2) آن را از <a href="http://www.cakephp.org/">اینجا</a> بگیرید یا از مخزن SVN (برای سری 1.2.x.x از <a href="https://svn.cakephp.org/repo/branches/1.2.x.x">اینجا</a>) استفاده کنید. تمامی متعلقات کیک در پروژه‌ای بنام CakeForge جمع آوری شده است. دریافت مستقیم کیک بهمراه مستندات نسخه‌های 1.1 و 1.2 آن در <a href="http://cakeforge.org/projects/cakephp">اینجا</a> موجود است. در این آموزش از سری 1.2 این فریم‌ورک استفاده می کنیم.</p>
<p>پس از دریافت کیک آن را به وب سرور خود منتقل کنید ساختار فولدر‌ها و فایل‌های بیس کیک به صورت زیر است:</p>
<div class="center"><img decoding="async" src="/old_media/cakephp_files_structure.jpg" alt="CakePHP Files Structure" /></div>
<p>از فولدر App شروع می‌کنیم، این همان فولدری است که بیشترین کار توسعه پروژه‌ در آن انجام می شود. هر چند نام فایل‌ها و فولدر‌های موجود در این شاخه گویای همه چیز است اما اجازه دهید نگاه دقیقتری به محتویات آن داشته باشیم:</p>
<p><strong>Config </strong>فایل‌های مربوط به پیکربندی برنامه معمولا در اینجا قرار دارند. دقت کنید این فایلها تنظیمات مربوط به هسته فریم ورک را شامل نمیشود (تنها تنظیمات مختصری در مورد پروژه‌ی کاریمان نظیر جزییات اتصال به پایگاه داده، محل قرار گیری فایل‌ها روی سرور و &#8230;)</p>
<p><strong>Controllers </strong>کنترل‌گرها و مولفه‌ها‌ی (کامپونت‌ها‌ی) پروژه‌ در این فولدر قرار خواهند گرفت. پیش از این گفتیم کنترل کننده (کنترلر) درخواست‌هایی که توسط کلاینت ایجاد شده را بررسی و به یه مسیر صحیح هدایت می کند.</p>
<p><strong>Locale </strong>برای فایل‌های مربوط به بومی‌سازی پروژه مورد استفاده قرار می‌گیرد. برای مثال قصد دارید پروژه‌ای را شروع کنید که به چند زبان مختلف موجود باشد، فایل‌های حاوی سایر زبان‌ها در اینجا قرار می‌گیرند.</p>
<p><strong>Models </strong>مدل‌‌های پروژه ‌در این فولدر قرار خواهند گرفت. قبلاً گفتیم که که مدل‌ها به نوعی به داده برنامه اشاره دارد. معمولاً جداول پایگاه‌های داده در اینجا مورد بحث قرار می‌گیرند بطوریکه به ازای هر جدول پایگاه داده، یک فایل در این فولدر قرار خواهد گرفت که بدان جدول اشاره دارد.</p>
<p><strong>Plugins </strong>پکیج‌های پلاگین چنانچه در صورت نیاز برای پروژه نوشته شود در اینجا قرار خواهد گرفت. پس از اتمام پروژه می توانید افزونه‌هایی بنویسید که بدون تغییر اساسی در پروژه قابلیت‌های جداگانه‌ای بدان اضافه کند.</p>
<p><strong>Tmp </strong>در این فولدر اطلاعات تمپ (موقتی) ذخیره می‌شوند. نحوه ذخیره اطلاعات به تنظیمات کیک بستگی خواهد داشت، اما بطور معمول توضیحات مدل، فایل‌های ثبت وقایع و گاهی اوقات اطلاعات نشست‌ها در این فولدر ذخیره می‌شوند.</p>
<p><strong>Vendors </strong>کلاس‌ها یا کتابخانه‌هایی که توسط شخص برنامه‌نویس برای استفاده در برنامه نوشته می‌شوند باید در اینجا قرار بگیرند. جلوتر خواهید دید که بایک تابع توکار براحتی می‌توانید این محتویات را به پروژه‌ الحاق و از آنها استفاده کنید.</p>
<p><strong>Views </strong>صفحات بصری که به نوعی با کاربر در ارتباط است شامل صفحات  مربوط به طرح‌بندی، عناصر، خطا‌ها، راهنماها در اینجا قرار می‌گیرند.</p>
<p><strong>Webroot </strong>در نهایت این فولدر در نصب برنامه می‌بایستی به عنوان root (شاخه اصلی) پروژه بکار گرفته شود. همچنین این فولدر فایل‌های مربوط به CSS، تصاویر و جاوااسکریپت را در بر خواهد داشت.</p>
<p>به فولدر اصلی بر‌میگردیم. دو فولدر cake و vendors   هسته این فریم‌ورک را تشکیل می‌دهند و همین اندازه آشنایی با این دو فولدر برای کار با این فریم‌ورک کافی است (اگر مشتاقید به جمع توسعه دهندگان این فریم‌ورک بپوندید مستندات کیک درمورد توابع و کلاس‌های سازنده هسته کاملاً روشن است)</p>
<p>هر چند توضیحات ساختاری فایل‌ها و فولدرها می توانست بیش از این به تفصیل بیان شود اما بعلت کمبود وقت و دورشدن از هدف اصلی از آنها عبور می‌کنیم . </p>
<div class="post_caption">تنظیمات و مراحل ساخت لینکدونی</div>
<p>یک فولدر بنام cake در وب سرور می‌سازیم و محتویات کیک‌پی‌اچ‌پی را به آن منتقل می‌کنیم. در مرورگر آدرس دایرکتوری که فایل‌های پروژه در آن قرار دارد به صورت زیر خواهد بود:</p>
<div class="center"><img decoding="async" src="/old_media/cake_base_address.jpg" alt="CakePHP Base Address" /></div>
<p>اگر وب سرور را اجرا کرده باشید پس از ارسال درخواست صفحه‌‌ی خوش آمد کیک را مشاهده خواهید نمود. چنانچه  چیدمان مطالب موجود آرایش منظمی ندارد (صفحه فاقد تصویر و استایل است)، احتمالاً mod rewrite سرور فعال نیست. بدین منظور فایل httpd.conf وب سرور آپاچی را با یک ویرایشگر متن با کرده و بدنبال خط زیر بگردید و با حذف علامت # از ابتدای خط، mod_rewrite.so را به ماژول‌های وب سرور اضافه کنید. حال وب سرور را ریستارت کنید و صفحه را ریفرش کنید مشکل باید حل شده باشد. </p>
<pre class="brush: xml; title: ; notranslate">#LoadModule rewrite_module modules/mod_rewrite.so</pre>
<p>برای اجرای صحیح کیک بطور پیشفرض، تاکید بر این است که mod rewrite سرور فعال باشد اما چنانچه بنا به دلایلی نخواستید این ماژول را به وب سرور اضافه کنید، می‌بایستی تمامی فایل‌های htaccess را از فولدرهای کیک حذف کنید و در فایل app/config/core.php با حذف علامت کامنت (//) از ابتدای خط زیر، کیک را بدون mod rewrite اجرا کنید:</p>
<pre class="brush: css; title: ; notranslate">Configure::write(&#039;App.baseUrl&#039;, env(&#039;SCRIPT_NAME&#039;));</pre>
<p>برای اولین مرتبه که کیک راه‌اندازی می‌شود، در صفحه اصلی هشدارهایی را خواهید دید. در نسخه 1.2 کیک، استایل بکار رفته با رنگ‌های زرد و سبز، کاربر را راهنمایی می‌کند. ابتدا فایل app/config/core.php را باز کنید. Security.salt  را پیدا کنید و آن را به دلخواه تغییر دهید (می توانید دو سه کاراکتر آن رشته را تغییر دهید) این یک رشته تصادفی است که کیک برای رمزنگاری از آن استفاده می‌کند تا هنگامی که مقدار پیشفرض آن را تغییر ندهید خطای زرد رنگ مبنی بر تغییر آن در صفحه اصلی وجود خواهد داشت.</p>
<div class="center"><a href="/old_media/first_Cakephp_welcome_page_big.jpg"><img decoding="async" src="/old_media/first_Cakephp_welcome_page_small.jpg" alt="CakePHP Welcome Page" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>خطای زرد رنگ دیگری که در این صفحه خواهید دید مربوط به تنظیمات پایگاه داده است. بمنظور رفع آن فایل app/config/ database.php.default را به database.php تغییر نام دهید. پایگاه‌ داده‌ای بنام linkdump درMySQL بسازید و  بمنظور ارتباط پایگاه داده به کیک فایل  database.php را باز کنید و آرایه default را با آنچه قبلاً در نصب پایگاه داده وارد کرده‌اید تنظیم کنید:</p>
<pre class="brush: php; title: ; notranslate">var $default = array(
&#039;driver&#039; =&gt; &#039;mysql&#039;,
&#039;persistent&#039; =&gt; false,
&#039;host&#039; =&gt; &#039;localhost&#039;,
&#039;login&#039; =&gt; &#039;root&#039;,
&#039;password&#039; =&gt; &#039;nbuser&#039;,
&#039;database&#039; =&gt; &#039;linkdump&#039;,
&#039;prefix&#039; =&gt; &#039;&#039;,
);</pre>
<p>خطای دیگری که ممکن است موجود باشد مربوط به فولدر app\tmp است. قبلاً گفتیم که tmp برای ذخیره‌ی فایل‌های موقتی نظیر ثبت وقایع و نشست‌ها استفاده می‌شود از این رو می‌بایستی مجوز آن را طوری تعیین کنید که قابلیت نوشتن در فولدر فعال باشد. در صورتی که موارد فوق را درست انجام داده باشید صفحه‌ی اصلی کیک به صورت زیر خواهد بود:</p>
<div class="center"><a href="/old_media/second_Cakephp_welcome_page_big.jpg"><img decoding="async" src="/old_media/second_Cakephp_welcome_page_small.jpg" alt="CakePHP Welcome Page" title="برای بزرگ دیدن تصویر کلیک کنید" /></a></div>
<p>در پست بعدی سایر مراحل را دنبال خواهیم کرد.<br />
<strong>ادامه:</strong> ساخت لینکدونی با CakePHP (<a href="https://weblog.alvanweb.com/2008/10/23/create-linkdump-with-cakephp-part-2/">بخش دوم</a>) و (<a href="https://weblog.alvanweb.com/2008/10/24/create-linkdump-with-cakephp-part-3/">بخش سوم</a>)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/10/22/create-linkdump-with-cakephp-part-1/feed/</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
		<item>
		<title>مقدمه‌ای بر معماری MVC در CakePHP</title>
		<link>https://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 21 Sep 2008 14:17:59 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=154</guid>

					<description><![CDATA[همانطور که در پست قبل گقتم CakePHP از معماری MVC استفاده می کند. این معماری یه الگوی طراحی نرم‌افزاره که برنامه‌نویسی بر این مبنا، برنامه رو به سه بخش اصلی تقسیم می‌کنه: 1- Model مدل به داده برنامه اشاره دارد (معمولا جداول پایگاه داده). 2- View شاید هیچ لفظ فارسی جز خود این واژه نتونه [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>همانطور که در پست قبل گقتم <a href="http://cakephp.org">CakePHP</a> از معماری <a href="http://en.wikipedia.org/wiki/Model-view-controller" title="Model View Controller">MVC</a> استفاده می کند. این معماری یه الگوی طراحی نرم‌افزاره که برنامه‌نویسی بر این مبنا، برنامه رو به سه بخش اصلی تقسیم می‌کنه:</p>
<p>1- <strong>Model</strong> مدل به داده برنامه اشاره دارد (معمولا جداول پایگاه داده). 2- <strong>View</strong> شاید هیچ لفظ فارسی جز خود این واژه نتونه جایگزین خوبی باشه اما این واژه را &#8220;نما&#8221; تعریف می‌کنم. نما در حقیقت یه رندر تصویری از داده مدل هست که در انتها به مرورگر کاربر ارسال میشه. 3- <strong>Controller</strong> کنترل کننده (کنترلر) درخواست‌هایی که توسط کلاینت ایجاد شده را بررسی و به یه مسیر صحیح هدایت می کند.</p>
<p>نمودار زیر چرخه معماری MVC را در CakePHP توضیح  می ده:</p>
<div class="center"><img decoding="async" src="/old_media/basic_mvc_alvanweb.png" alt="A Basic MVC Request" title="A Basic MVC Request" /></div>
<p>برای مثال فرض کنید یه کلاینت بنام ریکاردو بر روی یک لینک (بالفرض خرید کیک که لینکی شبیه زیر داره) در صفحه اصلی برنامه کلیک کنه بنابراین درخواست از مرورگر وی به وب سرور منتقل می‌شه.</p>
<pre class="brush: xml; title: ; notranslate">http://www.example.com/cakes/buy</pre>
<p>در اینجا dispatcher آدرس درخواستی رو بررسی می‌کنه (cakes/buy/) و این درخواست رو به یک کنترلر صحیح هدایت می‌کند. کنترلر، منطق مشخص برنامه رو انجام می‌ده، برای مثال چک می کنه آیا ریکاردو تا حالا لاگین کرده یا نه. علاوه براین کنترلر بمنظور دستیابی به داده‌های برنامه از مدل ها استفاده می کنه. مدل ها معمولا نمایانگر جداول پایگاه داده هستند اما می تونن معرف ورودی‌های <a href="http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol" title="Lightweight Directory Access Protocol">LDAP</a>، فیدهای RSS یا فایل‌های روی سیستم هم باشند. بعنوان مثال در اینجا کنترلر یه مدل رو به کار می‌بره تا آخرین خرید ریکاردو رو از دیتابیس بکشه بیرون (به اصطلاح Fetch کنه). <span id="more-154"></span></p>
<p>وقتی کنترلر کار خودش رو بر روی داده انجام داد نوبت مرحله نما می‌رسه. همانطور که گفتم در نما داده هایی که آماده‌سازی شدن به کلاینت عرضه می‌شن. بعبارت ساده‌تر کلایت بطور معمول می تونه از طریق مرورگر نتیجه رو مشاهده کنه. در کیک، خروجی نما، بصورت HTML است اما بر حسب نیاز می تونه بسادگی به فرمت‌ PDF، XML و <a href="http://en.wikipedia.org/wiki/JSON" title="JavaScript Object Notation">JSON</a> تبدیل بشه.</p>
<p>اما <strong>مزایا استفاده از MVC چیست؟</strong><br />
ببینید این معماری مورد آزمون قرار گرفته و بعنوان یک الگوی طرحی نرم‌افزار مورد قبول واقع شده چرا که برنامه رو قابل نگاهداری و ماژولار می‌کنه و به امر توسعه سرعت می‌ده. تقسیم عملکرد برنامه در سه بخش مدل، نما و کنترلر پایداری رو بدنبال داره. ویژگی های جدید بسهولت افزوده می‌شن و چهره جدید ویژگی های قدیمی رو بهبود می ده. </p>
<p>همچنین طراحی جداگانه و ماژولار به طراحان و توسعه‌دهندگان این اجازه رو می‌ده که همزمان با هم کار کنند و به سرعت بر توانایی نمونه اولیه بیفزایند. جداسازی یه خوبی دیگه هم داره اینکه به توسعه‌دهندگان این امکان رو میده که تغیرات مورد نظر رو در یک بخش لحاظ کنند بدون اینکه نیازی باشه سایر بخش‌ها تغییری بکنه.</p>
<p>اگر تا حالا برنامه ای رو به این سبک نساخته اید، یه خورده وقت می‌‌بره تا این معماری رو بکار ببرید. اما مطمنم برای اولین بار که یه برنامه با کیک پی‌اچ‌پی بسازید دیگه حاضر نخواهید شد از یه روش دیگر انجامش بدید. در پست‌های آینده به شرح تنظیمات و پیکربندی CakePHP خواهم پرداخت.<br />
+ [<a href="http://book.cakephp.org/view/10/Understanding-Model-View-Controller">منبع</a>]</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/09/21/mvc-architecture-in-cakephp/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title>کار با CakePHP</title>
		<link>https://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/</link>
					<comments>https://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 17 Sep 2008 20:42:12 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[کیک پی‌اچ‌پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=153</guid>

					<description><![CDATA[بیشتر پروژه‌ها را تاجایی که امکان داره با CakePHP انجام میدم. ساختار MVC، معتبرسازی توکار، سفارشی کردن URL‌ها و انعطاف پذیری فوق العاده، دلایل عمده من برای انتخاب این فریم‌ورک PHP هستن. فکر میکنم کسانی که با Ruby on Rails کار کردن حرفمو تایید کنن. منابع زیادی برای آموزش این فریم‌ورک روی وب هست. برای [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>بیشتر پروژه‌ها را تاجایی که امکان داره با <a href="http://cakephp.org/">CakePHP</a> انجام میدم. ساختار  <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a>، معتبرسازی توکار، سفارشی کردن URL‌ها و انعطاف پذیری فوق العاده، دلایل عمده من برای انتخاب این فریم‌ورک PHP هستن. فکر میکنم کسانی که با <a href="http://www.rubyonrails.org/">Ruby on Rails</a> کار کردن حرفمو تایید کنن.</p>
<p>منابع زیادی برای آموزش این فریم‌ورک روی وب هست. برای دو نسخه 1.1 و 1.2 که با هم تفاوت‌هایی دارند، بطور جداگانه <a href="http://book.cakephp.org/">راهنمای کاملی</a> در سایت اصلی کیک پی‌اچ‌پی موجوده. قسمت مثال‌ها و بخصوص <a href="http://book.cakephp.org/view/219/Blog">The Cake Blog Tutorial</a> محبوب‌ترین قسمت این راهنما است. در این آموزش یاد میگیرید که چطور بر پایه این فریم‌ورک یه وبلاگ ساده بسازید.</p>
<p>هدفم از کیک پی‌اچ‌پی و راهنما گفتنش معرفی پست‌های <a href="http://www.jamesfairhurst.co.uk/">James Fairhurst</a> در این رابطه هست. حدود آوریل امسال James یه سری آموزش در رابطه با ایجاد یک کاتالوگ DVD با  CakePHP‌ رو شروع کرد. این آموزش‌ شامل 12 قسمته که دو هفته قبل قسمت آخرش تموم شد. لیست این پست ها رو در زیر آوردم که انصافا&#x200d; یکی از دیگری بهتره:</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_1">Part 1</a>: Setup of CakePHP and creation of the tables and models<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_2">Part 2</a>: Creating the first controller and the corresponding views<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_3">Part 3</a>: Creating two more controllers with the respective views<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_4">Part 4</a>: File upload and introduction of <a href="http://jquery.com/">jQuery</a><br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_5">Part 5</a>: Working with a HABTM association<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_6">Part 6</a>: Adding authentication to the application<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_7">Part 7</a>: Graphical design of the application<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_8">Part 8</a>: Realizing the design with HTML and CSS<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_9">Part 9</a>: Introduction to layouts and elements<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_10">Part 10</a>: Defining the start page<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_11">Part 11</a>: Using requestAction<br />
+ <a href="http://www.jamesfairhurst.co.uk/posts/view/full_cakephp_application_part_12">Part 12</a>: Finishing the application
</li>
</ul>
<p>فقط کافیه یه خورده زمان داشته باشید و البته اشتیاق برای یادگیری این فریم‌ورک. نتیجه‌ی نهایی آموزش بالا رو می‌تونید <a href="http://cakecatalog.jamesfairhurst.co.uk/">اینجا</a> ببینید. سعی می‌کنم پست‌های آینده ام بیشتر در رابطه با توضیح ساختار MVC و آموزش CakePHP باشه.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/09/18/building-web-application-with-cakephp/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>بدون شرح</title>
		<link>https://weblog.alvanweb.com/2008/08/17/be-right-back/</link>
					<comments>https://weblog.alvanweb.com/2008/08/17/be-right-back/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 17 Aug 2008 18:42:25 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=152</guid>

					<description><![CDATA[این روزها به شدت گرفتار دو سه پروژه J2SE و PHP هستم. امیدوارم درآینده نزدیک کم کاری‌های گذشته رو بتونم جبران کنم. از دوستانی که به اینجا سر می‌زدن و با ایمیل های پرمهرشون جویای حالم بودن هم ممنونم.]]></description>
										<content:encoded><![CDATA[<p>این روزها به شدت گرفتار دو سه پروژه J2SE و PHP هستم. امیدوارم درآینده نزدیک کم کاری‌های گذشته رو بتونم جبران کنم. از دوستانی که به اینجا سر می‌زدن و با ایمیل های پرمهرشون جویای حالم بودن هم ممنونم.</p>
<div class="center"><img decoding="async" src="/old_media/return_soon.jpg" alt="Be Right Back" title="Be Right Back" /></div>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/08/17/be-right-back/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>رنگارنگی کمتر در صفحات وب</title>
		<link>https://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/</link>
					<comments>https://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 31 May 2008 12:04:35 +0000</pubDate>
				<category><![CDATA[طراحی وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=151</guid>

					<description><![CDATA[وب یه مکان رنگارنگه. می‌تونید هر رنگی که تصورش رو بکنید انتخاب کنید و در طراحی ازش استفاده کنید. بدون اینکه مشکل درهم آمیختگی رنگ‌ها رو داشته باشید یا در مورد هزینه چاپ رنگ‌ها نگران باشید. داشتن یه صفحه وب رنگارنگ کار خیلی راحت و وسوسه انگیزی است. اما آیا گزینه‌های دیگری هم برای کاربرد [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>وب یه مکان رنگارنگه. می‌تونید هر رنگی که تصورش رو بکنید انتخاب کنید و در طراحی ازش استفاده کنید. بدون اینکه مشکل درهم آمیختگی رنگ‌ها رو داشته باشید یا در مورد هزینه چاپ رنگ‌ها نگران باشید.</p>
<p>داشتن یه صفحه وب رنگارنگ کار خیلی راحت و وسوسه انگیزی است. اما آیا گزینه‌های دیگری هم برای کاربرد رنگ در طراحی وجود داره؟ </p>
<p><strong>طرح‌های تک رنگ (Monochromatic Design)</strong><br />
همانطور که از اسمش  معلومه، طرح تک رنگ طراحی با یک رنگه. یه رنگ رو به عنوان پایه انتخاب می‌کنید و سفید و سیاه رو بهش اضافه می‌کنید تا سایه‌های متفاوت از اون رنگ بسازید. در این حالت طرحتون منحصراً یک پالت تک رنگ داره و چندین سایه‌ی رو به سفید یا تیره شدن. شکل زیر این بیان رو می‌تونه کاملاً مشخص کنه:</p>
<div class="center"><img decoding="async" src="/old_media/color_palette.gif" alt="Color Palette" /></div>
<p><strong>مزایای طرح‌های تک‌ رنگ</strong><br />
ساخت یک پالت تک رنگ خیلی ساده است. رنگ دلخواه رو انتخاب کنید و سیاه و سفید رو بهش اضافه کنید. همین! </p>
<p>وقتی از یک رنگ واحد استفاده می‌کنید، رنگ‌ها هرگز نمی تونن برخورد داشته باشند. اگر رنگ‌ها رو بطور ناگهانی انتخاب کنید، طرح تک رنگ نسبتاً یه گزینه ایمن برای انتخابه.</p>
<p>طرح حالت ساده پیدا می‌کنه. سادگی طرح رنگ، خودش رو به طرح بسط می‌ده و هیچگونه مقایسه و رقابتی بین رنگ‌های مختلف بوجود نمیاد بطوریکه در عین سادگی طرح آرامش و سکون پسندیده‌ای رو تداعی می کنه.</p>
<p>به شما اجازه می‌ده تا به المان‌های مهم اهمیت بدین. اگرچه تمام طرحتون یه پالت تک رنگ داره اما می‌تونید کنتراست رنگ رو برای المان هایی که می‌خواهید اهمیت بیشتری بهشون بدین تغییر بدین. برای نمونه آیکون خروجی فید. <span id="more-151"></span></p>
<p><strong>معایب طرح‌های تک رنگ</strong><br />
تغییر ناچیز در طرح. نبود تنوع و تباین، دلبستگی دیداری طرح رو کم می‌کنه. اما در مقابل گزینه سادگی طرح رو داره که می‌تونه یه طرح رو از شلوغی نجات بده.</p>
<p>سختی در خواندن متن. اغلب بین رنگ متن نوشته و رنگ پس زمینه کنتراست خیلی کمی وجود داره و خواندن متون دشوار می‌شه. بهتره در این حالت تیرگی رو نسبت به پس زمینه بیشتر کرد.</p>
<p>ناامیدی. محدودیت در پالت رنگ در هنگامی که برای اولین بار باهاش کار می‌کنید خیلی ناامید کننده است. گاهی اوقات ممکنه وسوسه انگیز باشه که قاعده رو بهم بزنید و چند رنگ بیشتر اضافه کنید. گاهی اوقات انتخاب خوبیه اما گاهی اوقات نه، به تجربه نیاز داره.</p>
<p><strong>نمونه‌ایی از طرح‌ تک رنگ</strong></p>
<div class="center"><a title="Jeff Croft" href="http://jeffcroft.com/"><img decoding="async" src="/old_media/jeffcroft.jpg" alt="Jeff Croft" /></a></div>
<p><strong>طرح های بی رنگ (Achromatic Design)</strong><br />
در طرح‌های بی‌رنگ هیچ رنگی وجود نداره جز سایه‌های ساده‌ای از تیرگی. مزایا و معایب طرح‌های بی‌ رنگ مشابه طرح‌های تک رنگ بالا هستن اما یه خورده بیشتر. مثلا عنوان کردیم با طرح‌های تک رنگ حالت ساده ای رو داریم که آرامش رو تداعی می کنه باید بگم یه طرح بی رنگ می تونه این حالت رو بیشتر بوجود بیاره یا همانطور که یک طرح تک رنگ می تونه متمایز از رنگارنگ بودن باشه یک طرح بی رنگ می تونه خیلی بیشتر این تمایز رو دارا باشه.</p>
<p>یافتن طرح‌های بی‌رنگ خالص روی وب مشکله. بیشترشون کمی قانون شکنی می‌کنند و کمی از رنگ دیگری رو اضافه می کنند. البته منحصراً برای تاکید روی یک المان‌های معین و برای اینکه بی تنوعی رو از بین ببرند. طرح زیر می‌تونه جز این دسته باشه:</p>
<div class="center"><a title ="Cameron Moll's Authentic Boredom" href="http://www.cameronmoll.com/"><img decoding="async" src="/old_media/cameronmoll.jpg" alt="Cameron Moll's Authentic Boredom" /></a></div>
<p><strong>نتیجه‌گیری</strong><br />
لزوماً استفاده از رنگ‌های بیشتر مساوی یه طرح بهتر نیست. اگر طرح نیازی به اون رنگ نداره لزومی نداره با  رنگ‌های گوناگون جاذبه رو بیشتر کنید.</p>
<p>اگر نوشته‌های وبلاگتون ساده و بدون تکلفه، یه طرح تک رنگ یا بدون رنگ می‌تونه اثر‌گذاری بیشتری روی خوانندگان و بازدیدکنندگان داشته باشه. در کل این طرح‌ها مناسبه برای وبلاگ‌های شخصی و وبلاگ‌هایی که به نوعی لایف استایل هستن.</p>
<p>پس بهتره همیشه به فکر طرح‌های رنگارنگ نباشید و وب رو اندکی کم‌رنگ تر کنید. </p>
<p>قبلاً هم در مورد طرح های بدون آلایش در <a href="https://weblog.alvanweb.com/2006/01/06/adorn-schemes/">اینجا</a> نوشتم. از اونجایی که به طرح‌های تک رنگ علاقه زیادی دارم،  <a href="http://www.problogdesign.com/design/make-the-web-a-less-colorful-place/">پست تخصصی</a> Michael Martin در آخرین یادداشت وبلاگش در این مورد، این پست وبلاگ من رو ساخت.راستی بنظر شما الوان وب جز کدوم یکی از این طرح‌هاست؟</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/05/31/make-the-web-a-less-colorful-place/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>حذف انتخابگرهای زاید CSS</title>
		<link>https://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/</link>
					<comments>https://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 21 Apr 2008 16:47:50 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<category><![CDATA[فایرفاکس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/?p=150</guid>

					<description><![CDATA[بارها برایم پیش آمده است که در هنگام انجام یک پروژه یک (یا چندین) انتخابگر برای تست ایجاد کرده‌ام و با بالارفتن حجم کدنویسی، یادم رفته است که آن‌ها را پاک کنم. یا برعکس انتخابگری را تعریف کرده‌ام که المانش را به دلایلی پاک کرده‌ام یا نامش را تغییر داده‌ام. شاید برای شما هم اتفاق [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>بارها برایم پیش آمده است که در هنگام انجام یک پروژه یک (یا چندین) انتخابگر برای تست ایجاد کرده‌ام و با بالارفتن حجم کدنویسی، یادم رفته است که آن‌ها را پاک کنم. یا برعکس انتخابگری را تعریف کرده‌ام که المانش را به دلایلی پاک کرده‌ام یا نامش را تغییر داده‌ام. شاید برای شما هم اتفاق افتاده باشد.</p>
<p><a href="http://www.sitepoint.com/">SitePoint</a>  افزونه‌ای بنام <a href="http://www.sitepoint.com/dustmeselectors/">Dust-Me Selectors</a> برای فایرفاکس منتشر کرده است که به شما کمک می‌کند به راحتی این سلکتورها را شناسایی کنید.</p>
<p>برای کار با این افزونه طرح مورد نظر را در مرورگر فراخوانی کرده و بر روی آیکونی که در پایین سمت راست فایرفاکس ایجاد شده است، کلیک کنید. این افزونه فایل سی‌اس‌اس طرحتان را آنالیز کرده و با توجه به المانهایی که در صفحه جاری بکار رفته است انتخابگرهایی که مورد استفاده قرار نگرفته‌اند را در مشخص می‌کند.</p>
<p>توجه کنید شاید سایر سلکتورها را در المانهایی در سایر صفحات طرحتان بکار برده‌اید، بنابراین با آنالیز یک صفحه همانطور که در بالا اشاره شد سلکتورهای استفاده نشده در آن صفحه به عنوان unused شناخته می‌شوند. اما با آنالیز سایر صفحات طرحتان تعداد سلکتورهای unused مرتبا کم می‌شود تا جایی که سلکتورهای زاید پیدا شوند.</p>
<p>نسخه جدید این افزونه می‌تواند به عنوان یک اسپایدر صفحه‌های طرحتان را آنالیز کند تنها کافیست آدرس <a href="http://www.sitemaps.org/protocol.php">Sitemap</a> را به آن بدهید. اگر کل صفحات در Sitemap نیامده است دادن آدرس همان صفحه اول هم کفایت می‌کند البته اگر لینک سایر صفحات در آن موجود باشد. به این روش دیگر نیازی به آنایز تک تک صفحات بصورت منوال نیست.</p>
<p>+ برای ساخت Sitemap می توانید از <a href="http://www.xml-sitemaps.com/">این</a> سرویس استفاده کنید. وردپرسی ها هم می‌توانند با سرویس گوگل به کمک <a href="http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/">این پلاگین</a> Sitemap بسازند.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/04/21/using-dust-me-selectors-plugin-to-find-unused-css-selectors/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>https://weblog.alvanweb.com/2008/03/20/norouz-1387/</link>
					<comments>https://weblog.alvanweb.com/2008/03/20/norouz-1387/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 19 Mar 2008 19:52:09 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/03/20/norouz-1387/</guid>

					<description><![CDATA[خوب این هم روزهای سال 1386 خورشیدی که به سرعت گذشت. حرف‌های من در آستانه سال نو حرف جدیدی نیست‌ همان حرف‌های تکراری چهار- پنج ساله گذشته. امسال برای من سال خیلی بدی نبود هر چند لحظات تلخی رو در این سال تجربه کردم ولی در کنار اون شیرین‌ترین‌ها هم وجود داشت. به بعضی از [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>خوب این هم روزهای سال  1386 خورشیدی که به سرعت گذشت. حرف‌های من در آستانه سال نو حرف جدیدی نیست‌ همان حرف‌های تکراری چهار- پنج ساله گذشته.</p>
<p> امسال برای من سال خیلی بدی نبود هر چند  لحظات تلخی  رو در این سال تجربه کردم ولی در کنار اون شیرین‌ترین‌ها هم وجود داشت. به بعضی از اهداف و خواسته‌هام رسیدم، باقی یا نیمه‌کاره موند یا اصلا بهشون نرسیدم و رفت برای سال آینده.</p>
<p>امیدوارم سال جدید طلیعه‌ی موفقیت‌های بزرگ برای شما و هم برای خودم باشه. در لحظه حلول سال نو با زمزمه کردن دعای عرفانی یا مقلب القلوب و الابصار، دعاگوی ما هم باشید. عید بر همگان مبارک باد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/03/20/norouz-1387/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>پشتیبانی از jQuery در Dreamweaver</title>
		<link>https://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/</link>
					<comments>https://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Thu, 14 Feb 2008 13:10:58 +0000</pubDate>
				<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/</guid>

					<description><![CDATA[دیر وقت است کار با Adobe Dreamweaver را کنار گذاشته‌ام، Eclipse را بیشتر می‌پسندم به خصوص این مدت که به سمت برنامه‌نویسی جاوا و کار با لینوکس هم کشیده شده‌ام. اگر شما هم با Eclipse کار کرده‌اید یقینا Aptana هم می‌تواند نیازهایتان را در زمینه توسعه وب برآورده کند. Aptana را در کار با فریم‌ورک‌های [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>دیر وقت است کار با <a href="http://www.adobe.com/products/dreamweaver/">Adobe Dreamweaver</a>  را کنار گذاشته‌ام، <a href="http://www.eclipse.org/">Eclipse</a> را بیشتر می‌پسندم به خصوص این مدت که به سمت برنامه‌نویسی جاوا و کار با لینوکس هم کشیده شده‌ام.  اگر شما هم با Eclipse کار کرده‌اید یقینا <a href="http://www.aptana.com/">Aptana</a> هم می‌تواند نیازهایتان  را در زمینه توسعه وب برآورده کند.</p>
<p>Aptana را در کار با فریم‌ورک‌های جاوا اسکریپت پیشنهاد می‌کنم اما اگر هنوز از Dreamweaver استفاده می‌کنید و از عدم پشتیبانی از فریم‌ورک‌های جاوا اسکریپت خسته شده‌اید، دیگر نگران نباشید.  Chris Charlton افزونه‌ای برای Dreamweaver نوشته است که مشکل را حل می‌کند.</p>
<p>این افزونه برای دو فریم‌ورک <a href="http://jquery.com/">jQuery</a>  و   <a href="http://prototypejs.org/">Prototype </a>از<a href="http://xtnd.us/"> اینجا</a> قابل دریافت است. گویا پشتیبانی از سایر کتابخانه‌ها از جمله <a href="http://mootools.net/">MooTools</a> و <a href="http://developer.yahoo.com/yui/">YUI</a> نیز در حال انجام است.</p>
<p><strong>درهمین رابطه:</strong><br />
+ تنظیمات مربوط به پکربندی فریم‌ورک jQuery را برای Aptana می‌توانید در <a href="http://www.aptana.com/docs/index.php/Getting_started_with_Aptana_and_jQuery">اینجا</a> بیابید.<br />
+ <a href="http://www.spket.com">Spket</a>  را هم فراموش نکنید، نحوه بکارگیری jQuery در این IDE هم <a href="http://www.spket.com/jquery.html">اینجاست</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/02/14/support-jquery-in-adobe-dreamweaver/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>افزایش سرعت بارگذاری فایل‌های PHP</title>
		<link>https://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/</link>
					<comments>https://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 05 Feb 2008 12:11:43 +0000</pubDate>
				<category><![CDATA[پی اچ پی]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/</guid>

					<description><![CDATA[در وبگردی ‌های امروز با PHP Speedy آشنا شدم. این اسکریپت پی‌اچ‌پی بطور قابل ملاحظه‌ای زمان بارگذاری ‌فایل‌های پی‌اچ‌پی را کاهش می‌دهد. PHP Speedy بطور خودکار تمام فایل‌های لازم را با یكدیگر ترکیب و بصورت فشرده در می‌آورد که این خود بار درخواستی سرور و همچنین اندازه فایل‌ها را کاهش می‌دهد. در نتیچه زمان بارگذاری [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در وبگردی ‌های امروز با <a href="http://aciddrop.com/php-speedy/">PHP Speedy</a> آشنا شدم. این اسکریپت پی‌اچ‌پی بطور قابل ملاحظه‌ای زمان بارگذاری ‌فایل‌های پی‌اچ‌پی را کاهش می‌دهد.</p>
<p>PHP Speedy بطور خودکار تمام فایل‌های لازم را با یكدیگر ترکیب و بصورت فشرده در می‌آورد که این خود بار درخواستی سرور و همچنین اندازه فایل‌ها را کاهش می‌دهد. در نتیچه زمان بارگذاری کاهش خواهد یافت.</p>
<p> این اسکریپت به دو صورت خودکار و دستی می‌تواند نصب شود. بعد از نصب، کدهای این اسکریپت می‌بایستی درابتدای فایل اصلی وب‌سایت (در بیشتر موارد index.php) الحاق شود. نتایج زیر را مشاهده کنید:</p>
<p>قبل از نصب اسکریپت (14 درخواست در مدت زمان 4.44 ثانیه)</p>
<div class="center">
<img decoding="async" src="/old_media/faster-php-by_alvanweb1.gif" alt="PHP Speedy" /></div>
<p>بعد از نصب اسکریپت (4 درخواست در مدت زمان 1.1 ثانیه)</p>
<div class="center">
<img decoding="async" src="/old_media/faster-php-byalvanweb2.gif" alt="PHP Speedy" /></div>
<p>اگر <a href="http://www.getfirebug.com/">Firebug</a> بر روی مرورگرتان ندارید تفاوت را با <a href="http://tools.pingdom.com/fpt/">این</a> ابزار آنلاین (Pingdom) میتوانید مشاهده کنید. قبلا Pingdom  در <a href="https://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/">این یادداشت</a> بطور کامل معرفی شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/02/05/increase-website-loading-speed-with-php-speedy/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>فایل‌های htaccess را آنلاین بسازید</title>
		<link>https://weblog.alvanweb.com/2008/01/31/generate-htaccess-files-online-using-htaccess-editor/</link>
					<comments>https://weblog.alvanweb.com/2008/01/31/generate-htaccess-files-online-using-htaccess-editor/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Thu, 31 Jan 2008 10:05:37 +0000</pubDate>
				<category><![CDATA[ابزارهای وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/01/31/generate-htaccess-files-online-using-htaccess-editor/</guid>

					<description><![CDATA[خیلی اوقات برای بازنویسی آدرس‌ها، حفاظت از دایرکتوری‌ها، ارجاع آدرس‌‌ها و اهداف دیگر، هر توسعه دهنده وب یا دارنده یک سایت از فایل‌های .htaccess استفاده می‌کند. کد‌نویسی .htaccess بسته به آنچه می‌خواهیم انجام دهیم گاهی اوقات کار پیچیده‌ای است. با ویرایشگر htaccess برخی از این‌ کارها را می‌توانید بطور آنلاین انجام دهید. این ویرایشگر بر [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>خیلی اوقات برای بازنویسی آدرس‌ها، حفاظت از دایرکتوری‌ها، ارجاع آدرس‌‌ها و اهداف دیگر، هر توسعه دهنده وب یا دارنده یک سایت از فایل‌های .htaccess استفاده می‌کند.</p>
<p> کد‌نویسی .htaccess  بسته به آنچه می‌خواهیم انجام دهیم گاهی اوقات کار پیچیده‌ای است. با <a href="http://www.htaccesseditor.com/">ویرایشگر htaccess</a>  برخی از این‌ کارها را می‌توانید بطور آنلاین انجام دهید. این ویرایشگر  بر پایه آژاکس طراحی شده است و کار با آن بسیار ساده است.</p>
<p>+ مقاله کاملی در مورد کار با فایل‌های htaccess را می توانید در <a href="http://www.askapache.com/2006/htaccess/htaccesselite-ultimate-htaccess-article.html">اینجا</a> بیابید. همه موارد بصورت کاربردی همراه با نمونه در آن آورده شده است.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/01/31/generate-htaccess-files-online-using-htaccess-editor/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>I&#8217;m Busy</title>
		<link>https://weblog.alvanweb.com/2008/01/28/im-busy/</link>
					<comments>https://weblog.alvanweb.com/2008/01/28/im-busy/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 28 Jan 2008 09:34:05 +0000</pubDate>
				<category><![CDATA[ابزارهای وب]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2008/01/28/im-busy/</guid>

					<description><![CDATA[این روزها به شدت درگیر یک پروژه برنامه‌نویسی جاوا (J2SE) هستم. اصلا فرصت آپدیت نیست. صحبت از ترم آخر و کارشناسی ارشد و این حرفها هم هست&#8230; پی نوشت نامرتبط: نزدیک به هشت ماه می‌شود از سرویس رایگان Clicky استفاده می‌کنم. مزیت‌های آن در مقابل دیگر ویزیتور آنالیزگرها قابل توجه است (در اینجا جدول مقایسه‌ای [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>این روزها به شدت درگیر یک پروژه برنامه‌نویسی جاوا (J2SE) هستم. اصلا فرصت آپدیت نیست. صحبت از ترم آخر و کارشناسی ارشد و این حرفها هم هست&#8230;</p>
<p><strong>پی نوشت نامرتبط:</strong><br />
نزدیک به هشت ماه می‌شود از سرویس رایگان <a href="ttp://getclicky.com">Clicky</a> استفاده می‌کنم. مزیت‌های آن در مقابل دیگر ویزیتور آنالیزگرها قابل توجه است (در <a href="http://getclicky.com/#theotherguys">اینجا</a> جدول مقایسه‌ای همه چیز را نشان می‌دهد) فیلترهای جالبی برای اطلاعات ویزیتورها دارد و مهمتر از همه به طور پیوسته آپگرید می‌شود. </p>
<p>در اکانت رایگان تنها برای 21 روز اجازه استفاده از تمام قابلیت‌ها وجود دارد. امروز دل را به دریا زدم و اکانت بلاگر یکساله Clicky را خریدم البته نه برای دو سه ویزیتور اینجا. اگر شما هم دنبال یک آنالیزگر جمع  جور و حرفه‌ای می‌گرید Clicky را <a href="http://getclicky.com/stats/home?site_id=10">امتحان کنید</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2008/01/28/im-busy/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>خسته‌ام</title>
		<link>https://weblog.alvanweb.com/2007/12/29/im-tired/</link>
					<comments>https://weblog.alvanweb.com/2007/12/29/im-tired/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Fri, 28 Dec 2007 21:53:29 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/12/29/im-tired/</guid>

					<description><![CDATA[این‌ روزها فقط خسته‌ام و البته بی‌حوصله. حیفم آمد دسامبر 2007 وبلاگم یادداشتی نداشته باشد&#8230;]]></description>
										<content:encoded><![CDATA[<p>این‌ روزها فقط خسته‌ام و البته بی‌حوصله.<br />
حیفم آمد دسامبر 2007 وبلاگم یادداشتی نداشته باشد&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/12/29/im-tired/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Firebug و کند شدن Gmail</title>
		<link>https://weblog.alvanweb.com/2007/11/13/firebug-can-slow-down-your-gmail/</link>
					<comments>https://weblog.alvanweb.com/2007/11/13/firebug-can-slow-down-your-gmail/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 13 Nov 2007 19:21:15 +0000</pubDate>
				<category><![CDATA[ابزارهای وب]]></category>
		<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[فایرفاکس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/11/13/firebug%d9%88-%da%a9%d9%86%d8%af-%d8%b4%d8%af%d9%86-gmail/</guid>

					<description><![CDATA[امروز متوجه شدم که این اکستنشن محبوب من با نسخه جدید جی‌میل که جدیداً عرضه شده است تداخل دارد. گوگل برای کاربران سیستم‌ عامل‌های لینوکس و ویندوز راه حلی را پیشنهاد داده است. کافیست در تنظیمات این اکستنشن تیک گزینه نمایش XMLHttpRequests را بردارید و Network Monitoring را هم غیر فعال کنید. البته اگر قصد [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>امروز متوجه شدم که <a href="http://www.getfirebug.com/">این اکستنشن</a> محبوب من با نسخه جدید جی‌میل که جدیداً عرضه شده است تداخل دارد. گوگل برای کاربران سیستم‌ عامل‌های لینوکس و ویندوز <a href="https://mail.google.com/support/bin/answer.py?answer=77355">راه حلی</a> را پیشنهاد داده است. کافیست در تنظیمات این اکستنشن تیک گزینه نمایش XMLHttpRequests را بردارید و Network Monitoring را هم غیر فعال کنید. البته اگر قصد ندارید آن را تماما از کار بیندازید.</p>
<p>صحبت از <a href="http://www.getfirebug.com/">Firebug</a> شد. اکستنشنی که هر طراح و توسعه‌دهنده‌ی وب به آن نیاز خواهد داشت. چند روز قبل  <a href="http://www.456bereastreet.com">Roger</a> در وبلاگش <a href="http://www.456bereastreet.com/archive/200710/css_diagnostics_with_xray_and_mri/">مطلبی</a> در مورد شیوه‌های تشخصی سی اس اس با دو ابزار آنلاین نوشته بود که بد نیست مختصری در مورد آنها توضیح بدهم.</p>
<p>همانطور که می‌دانید چندین ابزار وجود دارد که می‌توانید از آنها برای عیب‌یابی سی اس اس استفاده کنید. بعضی‌ها مثل دو اکستنشن  Web Developer و Firebug با مرورگرها قابل استفاده هستند. اما گاهی اوقات پیش میاد که دسترسی به این مرورگرها یا اکستنشن‌ها وجود ندارد. هر چند XRAY‌ و MRI این دو ابزار آنلاین، قابلیت‌های سایرین رو به طور کامل ندارند اما می‌توانند کار راه انداز باشند.</p>
<p><strong><a href="http://westciv.com/xray/xray_more.html">XRAY</a></strong> به شما اجازه می‌دهد که تنها با یک کلیک بر روی عنصر، خصوصیات آن عنصر، مثل نوع عنصر، کلاس، آی دی، اندازه، حاشیه‌ها و &#8230;  را در یک پنجره معلق جدید ببینید. ویژگی جالب آن نمایش عناصر وارث به صورت سلسله مراتبی است.</p>
<p><strong><a href="http://westciv.com/mri/">MRI</a></strong> هم پنجره‌ای شبیه فوق باز می‌کند که یک فیلد ورودی دارد که می‌توانید سلکتور سی اس اس مربوطه را در آن وارد کنید. هنگامی که بر روی دکمه آن کلیک کردید عناصری که با آن انتخابگر مطابق هستند را مشخص خواهد کرد. البته می‌توانید با کلیک بر روی هر کدام از عناصر صفحه نیز سلکتور مربوطه را ببینید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/11/13/firebug-can-slow-down-your-gmail/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>با وردپرس 2.3</title>
		<link>https://weblog.alvanweb.com/2007/10/01/with-wordpress-23/</link>
					<comments>https://weblog.alvanweb.com/2007/10/01/with-wordpress-23/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 30 Sep 2007 22:21:29 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<category><![CDATA[وردپرس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/10/01/with-wordpress-23/</guid>

					<description><![CDATA[تا سه روز قبل نسخه وردپرس نصب شده در اینجا 2.0.7 بود. چون از این نسخه به بعد انتشار نسخه‌های جدید به علت بهبود‌های امنیتی سرعت گرفت ترجیح دادم تا رسیدن به یک نسخه پایدار عوضش نکنم. البته مشکلم بیشتر برای بروز رسانی از سری 2.0 به 2.1 عدم تطابق پلاگینی بود که برای صفحه [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>تا سه روز قبل نسخه وردپرس نصب شده در اینجا  2.0.7 بود. چون از این نسخه به بعد انتشار نسخه‌های جدید به علت بهبود‌های امنیتی سرعت گرفت ترجیح دادم تا رسیدن به یک نسخه پایدار عوضش نکنم. البته مشکلم بیشتر برای بروز رسانی از سری 2.0 به 2.1 عدم تطابق <a href="http://www.scriptygoddess.com/archives/2005/01/23/wppaginate-for-wp-15/">پلاگینی</a> بود که برای صفحه بندی ازش استفاده می‌کردم. <a href="http://www.scriptygoddess.com/">نوسینده پلاگین</a> هم قصد رفع مشکل رو اصلا نداشت و من هم وقتش رو نداشتم که سورسش رو بازبینی و اصلاحش کنم. همیشه نوشتن یه کد پیچیده خیلی ساده‌تر از اینه که بفهمی چه طور انجام شده البته اگر کامنت هم نداشته باشه که دیگه نگو.</p>
<p>خلاصه این که با صرف کمی وقت توانستم <a href="http://www.lesterchan.net/portfolio/programming.php">این پلاگین</a> رو طوری کاستومایز کنم که مشابه پلاگین قبلی کار کنه و چیدمان قبلی وبلاگ رو بهم نزنه و در نهایت وردپرس رو با موفقیت به روز کردم. چند مورد به ذهنم جالب اومد که در ادامه توضیح می‌دم:</p>
<p>نسخه 2.3 به نظر پایدارتر میاد (هر چند فکر می کنم همین امروز فردا نسخه جدیدی برای رفع بعضی از باگها منتشر بشه) و مهمتر اینکه یکسری تغییرات بنیادی در این نسخه صورت گرفته که در تاریخ انتشار وردپرس بی سابقه بوده مهمترینش تغییر در جداول پایگاه داده است که هنوز دلیلش رو نمی‌دونم.</p>
<p>همچنین یه مورد دیگه که شاید هنگام بروز رسانی متوجه نشده باشید (به علت اینکه دیتابیس همون مقادیر اولیه رو داره)  بروزرسانی لیست بلاگ‌رول پیشفرض وردپرس هست. از همون اولین نسخه‌ای که وردپرس منتشر شد این لیست شامل وبلاگ‌های توسعه‌دهندگان وردپرس بوده اما حالا تنها به مستندات خود وردپرس اشاره شده. هر چند به گفته <a href="http://blog.carthik.net/">Carthik</a> این چند ساله لینکها حداقل یه رتبه تاپ گوگلی به ارمغان آورد.</p>
<p>فکر می‌کنم اکثر تغییرات جز مهمترین و البته <a href="http://wordpress.org/extend/ideas/?show=popular">محبوب‌ترین ایده‌ها و پیشنهادات کاربران</a> وردپرس بودند و این جای تحسین داره. اما من  خیلی از نامهای جدید در دیتابیس استقبال نکردم ‌ همانطور که خود مستندات وردپرس اشاره کرده: <span id="more-142"></span></p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
WordPress 2.3 introduces our new taxonomy schema. Any plugin that queries against the old table will break horribly. Plugins that use the category API should be fine. This new schema replaces the categories, post2cat, and link2cat tables with three new tables that are more flexible.<br />
Three new <a href="http://codex.wordpress.org/index.php?title=Version_2.3:New_Taxonomy">terms tables</a> (schema) term_relationships, term_taxonomy, and terms support combined post categories, link categories, and the new tags. The tables, categories, link2cat, and link2post, are gone!
</li>
</ul>
<p>اگر جداول جدید در رابطه با دسته‌ها و برچسب‌ها و فرضاً لینک‌های بلاگ‌رول هستند خوب بهتر اینه که جداول هم نامی مشابه داشته باشند. در صورتی که از نامهای جدید هیچ نقشی در مورد جایگاه آنها در دیتابیس نمی‌شه تصور کرد. تمام این سه نام کاملاً نو هستند و هرگز قبل از این در تاریخ انتشار وردپرس نبوده‌اند. من مطمئنم باید دلیل خوبی برای این نامگذاری وجود داشته باشه و مشتاقم که در این مورد بیشتر بدانم&#8230;</p>
<p>من زیاد با رابط کاربری وردپرس مشکلی نداشتم ولی احساس می‌کنم با افزودن فیلد برچسب برای هر پست، اگر از آژاکس برای کامل کردن اتوماتیک برچسپ استفاده می‌شد خوب بود. همچنین نبود یه قسمت مجزا برای مدیریت برچسب‌ها واقعا یه مشکل بزرگه! من به شخصه با Slug برچسبها و فارسی نوشتنش حساسیت دارم نه ظاهر خوبی در دیتابیس داره نه هم در یو.ار.ال مگر اینکه برچسب‌ها رو انگلیسی بنویسم یا برای هر برچسب slugش رو از خود دیتابیس به فرم انگلیسی ویرایش کنم چون هیچ رابطی برای این‌کار در پانل تعریف نشده است. هر چند که با نوشتن یک پلاگین ساده این مشکل قابل حله  اما امیدوارم در نسخه‌های آینده وردپرس این مشکل حل شود.</p>
<p><strong>پی‌نوشت:</strong> کمی سه جدول جدید رو وارسی کردم نظرم در مورد ساختار دیتابیس عوض شد. بنظرم این taxonomy آزادی بیشتری به توسعه دهندگان خواهد داد. برای مثال شما قادر خواهید بود برای هر آبجکتی در پایگاه داده از جمله پست‌ها، صفحات، لینکها و برچسب‌ها taxonomy جداگانه و متفاوتی داشته باشید. در مورد خود واژه term هم اینجوری می‌شه بیان کرد که در واقع یه کلمه کلیدی هست که آبجکت رو توصیف می‌کنه و taxonomy هم یک سیستم دسته‌بندی که term هر آبجکتی رو کنترل می‌کنه. رویکرد جالبی بنظر می‌رسه فکر می کنم این حرکت پیشرفت‌های و بهبودهای بزرگی رو آینده  به دنبال خواهد داشت.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/10/01/with-wordpress-23/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>برگ ریزان</title>
		<link>https://weblog.alvanweb.com/2007/09/24/autumn-1386/</link>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 24 Sep 2007 11:12:59 +0000</pubDate>
				<category><![CDATA[عکس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/09/24/autumn-1386/</guid>

					<description><![CDATA[دوباره پاییز با تمام زیبایی‌هایش آمد، با بوی همیشگی خاطرات مدرسه و شیطنت‌هاش. و هر سال یک خاطره هم بهش اضافه میشه و میره تا دوباره سال بعد بیاد. شعر: سیاوش کسرائی پی نوشت: متاسفانه این‌ روزها درگیر یکسری مسائل شخصی هستم و کمتر فرصت می‌کنم به اینجا برسم. امیدوارم در آینده نزدیک بتوانم بیشتر [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>دوباره پاییز با تمام زیبایی‌هایش آمد، با بوی همیشگی خاطرات مدرسه و شیطنت‌هاش. و هر سال یک خاطره هم بهش اضافه میشه و میره تا دوباره سال بعد بیاد.</p>
<div class="center"><img decoding="async" src="/old_media/autumn_1386_alvanweb.jpg" alt="Autumn 1386" /></div>
<p>شعر: سیاوش کسرائی<br />
پی نوشت: متاسفانه این‌ روزها درگیر یکسری مسائل شخصی هستم و کمتر فرصت می‌کنم به اینجا برسم. امیدوارم در آینده نزدیک بتوانم بیشتر بنویسم.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>سی‌ اس اس فریمورک</title>
		<link>https://weblog.alvanweb.com/2007/08/15/blueprint-css-framework/</link>
					<comments>https://weblog.alvanweb.com/2007/08/15/blueprint-css-framework/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 15 Aug 2007 08:33:54 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/08/15/blueprint-css-framework/</guid>

					<description><![CDATA[همان اوایلی که Blueprint به عنوان یک سی‌اس‌اس فریمورک (CSS Framework) منتشر شد قصد داشتم در موردش بنویسم اما فرصت مناسبی پیدا نکردم. این روزها فریمورک در توسعه وب معنای کاملاً نامفهومی پیدا کرده است. با فریمورک‌های جاوا اسکریپتی نظیر jQuery ،Yahoo UI و Prototype این مفهوم پر رنگ‌تر شده است. اما اصلاً یک فریمورک [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>همان <a href="http://bjorkoy.com/past/2007/8/3/launch_blueprint_a_css_framework/">اوایلی</a> که Blueprint به عنوان یک سی‌اس‌اس فریمورک (CSS Framework) منتشر شد قصد داشتم در موردش بنویسم اما فرصت مناسبی پیدا نکردم. این روزها فریمورک در توسعه وب معنای کاملاً نامفهومی پیدا کرده است. با فریمورک‌های جاوا اسکریپتی نظیر jQuery ،Yahoo UI و Prototype این مفهوم پر رنگ‌تر شده است. اما اصلاً یک فریمورک چیست؟ و فقط مورد نیاز یک برنامه‌نویس است  یا یک طراح وب هم می‌تواند از آن بهره ببرد؟</p>
<p> نمی‌دانم وقتی صحبت از فریمورک می‌شود چه تعریفی برای آن در ذهن دارید. بطور کلی می‌توان فریمورک را مجموعه‌ای از ابزارها، کتابخانه‌ها، قراردادها و بهترین شیوه‌ها تعریف کرد بطوریکه سعی می‌کنند وظایف روتین را به سوی مدل‌های جامعی سوق دهند که دوباره می‌توانند مورد استفاده قرار بگیرند. هدف این است که به یک طراح یا توسعه دهنده اجازه داده شود تا بر روی وظایفی که در انجام پروژه مهم هستند تمرکز کند. البته وقتی صحبت از فریمورک می‌شود الزاماً در مورد چیزی که ساخته شده، بصورت پکیج در آمده و برای عموم منتشر شده حرف نمی‌زنیم. چرا که ممکن است یک فریمورک منحصراً برای شما یا تیم شما باشد.</p>
<p>فکر می‌کنم برای مقدمه تا همین اندازه از فریمورک بدانید کافی باشد  برای اطلاعات بیشتر می‌توانید مقاله &#8220;<a href="http://www.alistapart.com/articles/frameworksfordesigners">فریمورک برای طراحان</a>&#8221; نوشته Jeff Croft  را بخوانید. به گفته<a href="http://bjorkoy.com/"> نویسنده</a> سی‌اس‌اس فریمورک، همین مقاله باعث شده است تا به فکر ایجاد یک فریمورک عمومی برای سی‌اس‌اس بیفتد.  برویم سراغ اصل مطلب که همان سی‌اس‌اس فریمورک و پروژه Blueprint است. <span id="more-139"></span></p>
<div class="center"><img decoding="async" src="/old_media/bp.png" alt="Blueprint (CSS Framework)" /></div>
<p><a href="http://bjorkoy.com/blueprint">Blueprint</a> یک فریمورک برای سی‌اس‌اس است که با هدف کاهش زمان توسعه فایل‌های سی‌اس‌اس ایجاد شده است. این فریمورک ساختار یکپارچه‌ای از کدهای سی‌اس‌اس را در اختیارتان قرار می دهد بطوریکه براحتی می‌توانید طرح را شبکه بندی کنید، تایپوگرافی عناصر را به دلخواه تغییر دهید و حتی یک استایل برای چاپ بسازید. این فریمورک انعطاف پذیری بی‌نظیری در بکارگیری مقاس‌های استاندارد دارد. برای اولین بار همچین فریمورکی آن هم برای سی‌اس‌اس بطور عمومی منتشر می‌شود. کار با آن بسیار ساده است و هر کس می‌تواند با توجه به نوع طرح از آن استفاده کند. مستندات نسبتاً خوبی هم برای آموزش دارد.</p>
<p> در نسخه جدید (<a href="http://bjorkoy.com/past/2007/8/11/release_blueprint_04/">0.4</a>) که چند روز پیش منتشر شد، قابلیت‌های بیشتری به آن اضافه شده است و با استقبالی که از آن صورت گرفته، پیش‌بینی می‌شود این روند همچنان ادامه داشته باشد. تنها مشکلی که فکر می‌کنم ما کاربران فارسی زبان در استفاده از آن داشته باشیم نوع فونت بکار رفته در مشخصه‌ی font-family و همچنین نوع چیدمان باشد که با کمی وارسی سورس فریمورک قابل حل است.</p>
<p>+ برای اطلاعات بیشتر در مورد این فریمورک <a href="http://code.google.com/p/blueprintcss/">اینجا</a> را ببینید. اگر Google code اجازه دریافت فایل را به شما نمی‌دهد، نسخه 0.4 (آخرین نسخه در زمان نگارش این مطلب) را از <a href="/old_media/blueprint0.4.zip">اینجا</a> دریافت کنید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/08/15/blueprint-css-framework/feed/</wfw:commentRss>
			<slash:comments>36</slash:comments>
		
		
			</item>
		<item>
		<title>توضیح نویسی فایل‌های CSS</title>
		<link>https://weblog.alvanweb.com/2007/07/14/commenting-in-css-files/</link>
					<comments>https://weblog.alvanweb.com/2007/07/14/commenting-in-css-files/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 14 Jul 2007 12:11:42 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/07/14/commenting-in-css-files/</guid>

					<description><![CDATA[در این مقاله در مورد توضیح نویسی (Commenting) در فایل‌های CSS بحث خواهد شد. علاوه بر بیان مزایا، در انتها معایب آن ذکر و راه‌حل مناسبی پیشنهاد می‌شود. سطح مقاله مبتدی بوده و در زیرگروه مقدمات و پایه آموزش CSS قرار می‌گیرد. هنگامی که یک فایل CSS می‌نویسید، ممکن است با یک ایده‌ی خوب مواجه [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>در این مقاله در مورد توضیح نویسی  (Commenting) در فایل‌های CSS بحث خواهد شد. علاوه بر بیان مزایا، در انتها معایب آن ذکر و راه‌حل مناسبی پیشنهاد می‌شود. سطح مقاله مبتدی بوده و در زیرگروه مقدمات و پایه آموزش CSS قرار می‌گیرد.</p>
<p>هنگامی که یک فایل CSS می‌نویسید، ممکن است با یک ایده‌ی خوب مواجه شوید یا برعکس به یک مشکل برخورد کنید و برای آن راه‌حلی بیندیشید. اما اگر پس از گذشت مدت زمانی دوباره به آن فایل برگردید احتمال دارد نتوانید آن ایده یا رویکردی را که از آن استفاده کرده‌اید به خاطر بیاورید. این مشکل در طراحی مجدد (Redesign) بخصوص اگر حجم کارهایتان زیاد باشد، جدای از اینکه وقت‌تان را خواهد گرفت ممکن است شما را دچار سردرگمی کند. همچنین اگر بخواهید مراحل پیاده‌سازی را برای فرد دیگری شرح دهید یا یک توسعه‌دهنده دیگر بخواهد کدهای شما را در آینده ویرایش کند، توضیح نویسی  یک راه‌حل مناسب خواهد بود.</p>
<p>افزودن توضیح در CSS بسیار ساده است. یک توضیح در CSS با علامت */ شروع و با /* خاتمه می‌یابد. این نوع از توضیح‌نویسی به عنوان C style شناخته می‌شود چرا که در زبان برنامه‌نویسی C این متد کاربرد دارد. توضیحات می‌توانند در یک یا چند خط باشند و در هر جایی در کنار کد قرار بگیرند: <span id="more-138"></span></p>
<pre class="brush: css; title: ; notranslate">/* Body Styles */
body {
font-size: 67.5%; /* Set the font size */
}</pre>
<p><strong>افزودن توضیحات ساختاری</strong><br />
اولین توضیحی که معمولاً در سرآیند یک فایل CSS قرار می‌گیرد نشان می‌دهد که این استایل برای چیست، همچنین تاریخ ایجاد و شماره نسخه، نام و وب آدرس نویسنده را نیز در بر می‌گیرد:</p>
<pre class="brush: xml; title: ; notranslate">/*–––––––––––––––––––––––––––––––––––––––––––––––––
Basic Style Sheet (for version 4 browsers)
version: 1.0
author: morteza alvani
email: info@example.com
website: http://www.alvanweb.com/
–––––––––––––––––––––––––––––––––––––––––––––––––*/</pre>
<p>سپس کدها را به طور مشهود از هم تفکیک می‌کنیم. معمولاً این‌کار با قواعد عمومی نظیر تایپوگرافی، عناوین (headlines) و لینک‌ها شروع می‌شود.  پس از آن وارد زیر ساخت پایه و جزیی می‌شویم به طور مثال می‌توانیم استایل طرح را به قسمت‌های: محتوای اصلی (main content)، محتوای فرعی (secondary content)، هدایت‌گر اصلی (main nav) و فرعی و در نهایت پانویس (footer) تقسیم کنیم. نظیر بخش اول از الگویی مثل زیر برای جداسازی قسمت‌های مختلف استفاده می‌کنیم. بزرگ بودن این توضیح باعث خواهد شد تا از لحاظ دیداری زودتر قسمت مربوطه را بیابیم:</p>
<pre class="brush: xml; title: ; notranslate">/* Typography
–––––––––––––––––––––––––––––––––––––––––––––––––*/</pre>
<p>این یک مدل خیلی ساده و در عین حال جزئی است شما می‌توانید این قسمت‌ها را به زیر مجموعه‌های کوچک‌تری نیز تقسیم کنید که باعث سهولت در فهم و جستجوی آسان خواهد شد. کد‌نویسی یک سایت بزرگ این موضوع را به وضوح نشان خواهد داد. حتی در برخی موارد نمی‌توان به مورد فوق هم بسنده کرد و نیاز خواهیم داشت تا از یکسری کاراکتر اضافی پیش از توضیحی که در مورد کدها می‌نویسیم استفاده کنیم. چرا که ممکن است فایل‌های CSS ساختارهای مشابهی داشته باشند. به طور نمونه الگوی زیر را در نظر بگیرید:</p>
<pre class="brush: xml; title: ; notranslate">/* =Typography
–––––––––––––––––––––––––––––––––––––––––––––––––*/</pre>
<p>در این مثال جستجو برای &#8221; typ= &#8221;  شما را مستقیماً به قسمت تایپوگرافی هدایت خواهد کرد. بنابراین با این روش می‌توانید در پروژه‌های یزرگ زمان جستجو را به حداقل کاهش دهید. بیشتر طراحان یک مدل اولیه دارند و از آن برای نظم دهی به استایل در همه طرح‌هایشان استفاده می‌کنند بنابراین نیازی ندارند تا در هر پروژه جدید مجدداً به توضیح‌نویسی کامل بپردازند.</p>
<p><strong>یادداشت‌هایی برای خودتان</strong><br />
گاهی اوقات برای حل یک مشکل خاص ممکن است به <a href="https://weblog.alvanweb.com/2005/07/17/php-css-hacks/">CSS Hack</a> نیاز داشته باشید. در این موارد نوشتن توضیح مختصری در مورد نحوه کار کد و یا اگر توضیحی در مورد آن بر روی اینترنت موجود است و از آن استفاده کرده‌اید، درج نشانی آن صفحه یک ایده خوب است:</p>
<pre class="brush: css; title: ; notranslate">/*Use the star selector hack to give IE a different font size http://tinyurl.com/5hf69*/
* html body {
font-size: 75%;
}</pre>
<p>همچنین برای اینکه توضیحات خود را معنی‌دار تر کنید می توانید از واژه‌های کلیدی برای توضیحات مهم استفاده کنید. بالفرض از TODO برای یادآوری آنچه باید تغییر کند، از BUG برای مشکلی که وجود داشته است و از KLUDGE برای بیان راه حلی که استفاده کرده‌اید:</p>
<pre class="brush: xml; title: ; notranslate">/* :TODO: Remember to remove this rule */
/* :KLUDGE: Setting a small negative margin but it&#039;s not pretty */
/* :BUG: Rule breaks in IE 5.2 Mac */</pre>
<p>همچنین می توانید از واژه TRICKY برای هشدار به سایر توسعه‌دهندگان در مورد پیچیدگی قسمتی از کد استفاده کنید. در قوانین برنامه‌نویسی، این واژه‌های کلیدی Gotcha به معنی I caught you نامیده می‌شوند و می‌توانند در مراحل بعدی توسعه خیلی مفید باشند.</p>
<p><strong>حذف توضیحات و بهینه‌سازی استایل‌ها</strong><br />
توضیحات به طور قابل ملاحظه‌ای می‌توانند حجم فایل‌های CSS را افزایش دهند. بنابراین ممکن است بخواهید از این توضیحات صرفنظر کنید. خیلی از ویرایشگرهای متن گزینه جستجو و جایگزین کردن را دارند و مشکل حذف توضیحات را تا حدی حل می‌کنند. همچنین بهینه‌سازهای آنلاین CSS <a href="http://www.cssoptimiser.com/">نظیر این</a> می‌تواند این کار را انجام دهد. البته این بهینه‌سازها علاوه بر حذف توضیحات، فضاهای خالی بین کدهای CSS را حذف می‌کند و می‌تواند بایت‌های اضافی را کاهش دهد. برخی هم از ترکیب زبان برنامه‌نویسی PHP با  CSS استفاده می‌کنند. قبلا در مورد این روش در <a href="https://weblog.alvanweb.com/2005/07/17/php-css-hacks/">اینجا</a> و <a href="https://weblog.alvanweb.com/2007/01/31/faster-development-with-css-constants/">اینجا</a> بحث شده است. جدای از مشکلات بعلت پیچیدگی، این روش زیاد مقبول و مرسوم نیست.</p>
<p>بهترین گزینه شاید فعال کردن فشرده‌سازی سمت سرور باشد. اگر شما از سرور آپاچی استفاده می‌کنید با مسئول هاست خود در مورد نصب mod_gzip و mod_deflate صحبت کنید. بسیاری از مرورگرهای مدرن می توانند فایل‌های فشرده شده با GZIP را پردازش کنند و آن‌ها را در کسر کوچکی از زمان از حالت فشرده خارج کنند. این ماژول‌های آپاچی می‌توانند تشخصی دهند که آیا مرورگر می‌تواند این قبیل فایلها را پردازش کند یا خیر، اگر بتواند، یک نسخه فشرده شده از فایل را ارسال می‌کند. فشرده سازی سمت سرور می تواند تا حدود 80 درصد از حجم فایل‌های XHTML و CSS را کاهش دهد، در نتیجه پهنای باند مصرفی را کاهش می‌دهد و صفحات سریع‌تر بارگذاری خواهند شد. اگر شما دسترسی به این ماژول‌ها ندارید، می توانید با استفاده از <a href="http://www.fiftyfoureleven.com/weblog/web-development/css/the-definitive-css-gzip-method">این آموزش</a> فایل‌هایتان را فشرده کنید. قبلا روش ترکیب PHP و فشرده‌سازی CSS در <a href="https://weblog.alvanweb.com/2006/08/29/php_css_compressor/">اینجا</a> توضیح داده شده است.</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">
+ <a href="http://www.cssmastery.com/">CSS Mastery book (Chapter 1: SETTING THE FOUNDATIONS)</a><br />
+ <a href="http://www.fiftyfoureleven.com/weblog/web-development/css/discussing-css-management-and-optimization">CSS Management and Optimization</a><br />
+ <a href="http://www.fiftyfoureleven.com/weblog/web-development/css/the-definitive-css-gzip-method">Gzipping your CSS</a>
</li>
</ul>
<p>+ منابعی که در تدوین این مقاله از آنها استفاده کرده‌ام.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/07/14/commenting-in-css-files/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>ابزاری برای آزمایش بارگذاری صفحات وب</title>
		<link>https://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/</link>
					<comments>https://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Fri, 15 Jun 2007 10:23:49 +0000</pubDate>
				<category><![CDATA[آژاکس]]></category>
		<category><![CDATA[ابزارهای وب]]></category>
		<category><![CDATA[فناوری‌های وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/</guid>

					<description><![CDATA[Pingdom کمپانی معتبری در زمینه سیستم‌های مونیتورینگ وب سایت است. چند روز قبل ابزار آنلاینی برای اندازه‌گیری سرعت بارگذاری صفحات وب ارائه داده است که می‌تواند برای وب‌مستر‌ها مفید باشید. این ابزار که بر پایه تکنولوژی آژاکس پایه ریزی شده است، هر نوع فایلی که به صفحه ارتباط داشته باشد ائم از تصویر، سی اس [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.pingdom.com">Pingdom</a> کمپانی معتبری در زمینه سیستم‌های مونیتورینگ وب سایت است. چند روز قبل ابزار آنلاینی برای اندازه‌گیری سرعت بارگذاری صفحات وب ارائه داده است که می‌تواند برای وب‌مستر‌ها مفید باشید. این ابزار که بر پایه تکنولوژی آژاکس پایه ریزی شده است، هر نوع فایلی که به صفحه ارتباط داشته باشد ائم از تصویر، سی اس اس، جاوا اسکریپت، آر اس اس، فلش و حتی در صورت وجود frame های داخلی یک طرح را آنالیز می‌کند. </p>
<p> زمان شروع، خواندن و پایان فایل با یک ستون افقی در سه رنگ مجزا برای هر فایل همراه با حجم آن به تفکیک نشان داده می‌شود. این ابزار می‌تواند چیدمان و ترتیب بارگذاری المان‌های صفحه را در مرورگر نشان دهد. مورد جالبی که در این ابزار به چشم می‌خورد کامپایل پیوندها در فایل‌های سی اس اس است. بالفرض اگر در فایل سی ‌اس اس المانی با خاصیت نمایش یک تصویر داشته باشید، آن تصویر هم در آنالیز تفکیک می‌شود. اما گویا قدرت کامپایل فایل‌های جاوااسکریپت و عناصر درونی‌اش را به طور مجزا ندارد. همچنین یک حداکثر مقداری به عنوان اندازه هر فایل در نظر گرفته شده است تا از آنالیز فایل‌های حجیم  جلوگیری شود.</p>
<p> صفحه‌ی اصلی وبلاگم را <a href="http://www.pingdom.com/tools/fpt/?url=https://weblog.alvanweb.com&#038;treeview=0&#038;column=objectID&#038;order=1&#038;type=0">چک کردم</a>، در مجموع 27 آبجکت با حجم 82 کیلوبایت در صفحه اصلی وجود دارد. که اگر کاربری با سرعت پایین یک اتصال دیال‌آپ را هم در نظر بگیریم در مدت زمانی کمتر از 6 -8 ثانیه کل محتوای صفحه اصلی بارگذاری می‌شود. این ابزار آنلاین را می‌توانید در <a href="http://www.pingdom.com/tools/fpt/">اینجا</a> بیابید.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/06/15/page-load-testing-tool/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>سومین همایش علم اقتصاد</title>
		<link>https://weblog.alvanweb.com/2007/05/30/education-and-research-in-iranian-economy/</link>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 30 May 2007 09:07:38 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/05/30/education-and-research-in-iranian-economy/</guid>

					<description><![CDATA[امروز (نهم خرداد 1386) و فردا، سومین همایش علم اقتصاد در ایران با همکاری دانشکده اقتصاد دانشگاه سیستان و بلوچستان و قطب علمی اقتصاد (دانشکده اقتصاد دانشگاه علامه طباطبائی) در حال اجراست. من هم به عنوان دانشجوی اقتصاد امروز صبح در این همایش شرکت کردم. مقالات جالبی در خصوص آموزش و پژوهش علم اقتصاد در [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>امروز (نهم خرداد 1386) و فردا، سومین همایش علم اقتصاد در ایران با همکاری دانشکده اقتصاد دانشگاه سیستان و بلوچستان و قطب علمی اقتصاد (دانشکده اقتصاد دانشگاه علامه طباطبائی) در حال اجراست. من هم به عنوان دانشجوی اقتصاد امروز صبح در این همایش شرکت کردم.</p>
<p>مقالات جالبی در خصوص آموزش و پژوهش علم اقتصاد در این همایش مطرح و میزگردهایی در این خصوص انجام خواهد شد. علاوه برمباحث مطرح شده، فرصت مناسبی است تا با اقتصاددانان کشور که در این همایش شرکت کرده‌اند از نزدیک بیشتر آشنا شد. در آینده در این مورد بیشتر خواهم نوشت.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>اوبونتو به دستم رسید</title>
		<link>https://weblog.alvanweb.com/2007/05/15/i-received-ubuntu-cds/</link>
					<comments>https://weblog.alvanweb.com/2007/05/15/i-received-ubuntu-cds/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 15 May 2007 14:09:14 +0000</pubDate>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/05/15/i-received-ubuntu-cd%e2%80%99s/</guid>

					<description><![CDATA[چند وقت پیش در اینجا از شروع کار با لینوکس نوشتم. از آن روز تا حالا با فدورا کور 6 کار می‌کردم. البته قبل از اینکه فدورا کور 6 را نصب کنم از اوبونتو چیزهایی شنیده بودم اما عدم دسترسی به این توزیع، مجبورم کرد تا با همان فدورا کور کار کنم. در 8 ام [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>چند وقت پیش در <a href="https://weblog.alvanweb.com/2007/04/10/starting-with-fedora-core6/">اینجا</a> از شروع کار با لینوکس نوشتم. از آن روز تا حالا با <a href="http://fedoraproject.org/wiki/">فدورا کور</a> 6 کار می‌کردم. البته قبل از اینکه فدورا کور 6 را نصب کنم از <a href="http://www.ubuntu.com/">اوبونتو</a> چیزهایی شنیده بودم اما عدم دسترسی به این توزیع، مجبورم کرد تا با همان فدورا کور کار کنم. در 8 ام آوریل فرم ارسال اوبونتو را پر کردم اما بعید می‌دانستم به این زودی‌ها به دستم برسد. (<a href="/old_media/Ubuntu_packet_lable2.jpg">تصویر</a>)</p>
<p>اما امروز که به خانه آمدم با پاکت ارسالی سی ‌دی‌های اوبونتو نسخه ۷.۰۴ مواجه شدم. جالب اینکه علاوه بر سی دی‌ها، چند برچسپ زیبا با آرم اوبونتو و البته شعار Linux for human beings در پاکت قرار داشت. از شرکت <a href="http://www.canonical.com/">Canonical</a> که این بسته را برایم فرستادند هم متشکرم. و خلاصه اینکه از امروز من هم به جمع کاربران این توزیع محبوب لینوکس پیوستم.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/05/15/i-received-ubuntu-cds/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
			</item>
		<item>
		<title>وردپرس را خوشمزه‌تر کنید</title>
		<link>https://weblog.alvanweb.com/2007/05/14/delicious-plugin-for-wordpress/</link>
					<comments>https://weblog.alvanweb.com/2007/05/14/delicious-plugin-for-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 13 May 2007 20:12:20 +0000</pubDate>
				<category><![CDATA[وردپرس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/05/14/delicious-plugin-for-wordpress/</guid>

					<description><![CDATA[آخرین پلاگینی که همین چند روز پیش نصب کردم Postalicious بود. با این پلاگین می‌توانید مدیریت کاملی بر روی Bookmark ها در وبلاگتان داشته باشید. البته همانطور که از نام پلاگین مشخص است با سرویس معروف خوشمزه کار می‌کند. از جمله امکانات بی‌نظیری که این پلاگین در اختیارتان قرار می‌دهد می‌توان به ارسال خودکار لینک‌ها [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>آخرین پلاگینی که همین چند روز پیش نصب کردم <a href="http://neop.gbtopia.com/?p=108">Postalicious</a> بود. با این پلاگین می‌توانید مدیریت کاملی بر روی Bookmark ها در وبلاگتان داشته باشید. البته همانطور  که از نام پلاگین مشخص است با سرویس معروف <a href="http://del.icio.us">خوشمزه</a> کار می‌کند.</p>
<p>از جمله امکانات بی‌نظیری که این پلاگین در اختیارتان قرار می‌دهد می‌توان به ارسال خودکار لینک‌ها در قالب پست‌های وبلاگ اشاره نمود. بطوریکه می‌شود آن را سفارشی کرد که هر N لینک را در یک پست مجزا ارسال کند. یا دسته ارسال پست و کاربر آن را مشخص کرد و حتی امکان کامنت و پینگ را حذف نمود و جالب‌تر اینکه مشخص کرد لینک‌هایی با تگ به خصوص به وبلاگ ارسال شوند.</p>
<p>نکته ظریفی که در این پلاگین به چشم می‌خورد سفارشی نمودن استایل پست‌هایی است که لینک‌ها تحت آن‌ها منتشر می‌شوند. البته باید به این موضوع اشاره کرد که این N لینک شما می‌تواند در یک روز ارسال شده باشد یا در طی چند روز. که در هر مورد الگو مجزایی دارد. که نشانگر انعطاف‌پذیری فوق العاده این پلاگین است.</p>
<p>نصب و راه‌اندازی این پلاگین بسیار ساده‌ است. اطلاعات کاملتر را می‌توانید در <a href="http://neop.gbtopia.com/?p=108">اینجا</a> بیابید. بنظرم با کمی ذوق و سلیقه می‌تواند کاربردهای دیگری هم برایتان داشته باشد. مثلاً مولتی یوزرش کرد و یک دایرکتوری ساخت و یا &#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/05/14/delicious-plugin-for-wordpress/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>35 طراح، 5 سئوال</title>
		<link>https://weblog.alvanweb.com/2007/04/21/35-designers-x-5-questions/</link>
					<comments>https://weblog.alvanweb.com/2007/04/21/35-designers-x-5-questions/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 21 Apr 2007 12:49:06 +0000</pubDate>
				<category><![CDATA[طراحی وب]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/04/21/35-designers-x-5-questions/</guid>

					<description><![CDATA[Smashing Magazine از آن مجله‌های نو پایی است که پیرامون توسعه و طراحی وب و با هدف بهره‌گیری از تکنیک‌های جدید، مطالب جالبی منتشر می‌کند. کم و بیش مطالبش را می‌خوانم. این مجله آنلاین دیروز مقاله جالبی با عنوان &#8220;35 طراح و 5 سئوال&#8221; منتشر کرد که خواندنش را به همه طراحان و علاقمندان به [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.smashingmagazine.com/">Smashing Magazine</a> از آن مجله‌های نو پایی است که پیرامون توسعه و طراحی وب و با هدف بهره‌گیری از تکنیک‌های جدید، مطالب جالبی منتشر می‌کند. کم و بیش مطالبش را می‌خوانم. این مجله آنلاین دیروز مقاله جالبی با عنوان &#8220;35 طراح و 5 سئوال&#8221; منتشر کرد که خواندنش را به همه طراحان و علاقمندان به وب توصیه می‌کنم.</p>
<p>این مجله 35 طراح و کمپانی برتر در سرتاسر جهان را در ماه مارس انتخاب کرده و از آن‌ها خواسته تا به 5 سئوال در رابطه با طراحی پاسخ‌ دهند تا از این طریق دانش و تجربه‌هایشان را با دیگر توسعه‌دهندگان تقسیم کنند. پنج سئوال به این صورت بوده است:</p>
<ul class="intro">
<li>1- یک جنبه از طرح که بیشترین ارجحیت را به آن می‌دهید.<br />
2- یکی از مفیدترین تکنیک‌های CSS که اغلب از آن استفاده می‌کنید.<br />
3- یک فونت که اغلب در پروژه‌ها بکار می‌برید.<br />
4- یک کتاب عالی در زمینه طراحی که خواندن آن را توصیه می‌کنید.<br />
5- یک مجله در زمینه طراحی که بصورت روانه یا هفتگی می‌خوانید.
</li>
</ul>
<p>این مجله می‌نویسد در انتها، پاسخ‌های بیشتری از آنچه انتظار داشتیم دریافت کردیم. بیش از 80 تکنیک  سی‌ اس اس ، ایده طراحی، پیشنهاد، فونت، کتاب‌های مرتبط با طراحی وب و مجلات آنلاین در این خصوص. که همه آن‌ها در <a href="http://www.smashingmagazine.com/2007/04/20/35-designers-x-5-questions/">اینجا</a> لیست شده است. دانستن این جالبه که طراح‌های معروف چگونه طرح‌های بی‌نظیری رو خلق می‌کنند.</p>
<p><a href="http://www.smashingmagazine.com/2007/04/20/35-designers-x-5-questions/">اصل مقاله</a> را خودتان بخوانید، فرصت اندکم اجازه ویرایش و نگارش آن را نمی‌دهد. باید در لینکدونی بالا معرفی می‌شد ولی جذابیتش ایجاب می‌کرد کمی در موردش توضیح دهم.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/04/21/35-designers-x-5-questions/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>شروع کار با لینوکس</title>
		<link>https://weblog.alvanweb.com/2007/04/10/starting-with-fedora-core6/</link>
					<comments>https://weblog.alvanweb.com/2007/04/10/starting-with-fedora-core6/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 09 Apr 2007 19:54:00 +0000</pubDate>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/04/10/starting-with-fedora-core6/</guid>

					<description><![CDATA[کمتر از سه ماه است که کار با سیستم عامل لینوکس را شروع کرده‌ام. اولین تجربه‌ام با لینوکس چند سال پیش و با توزیع رد‌هت بود و البته خاطره تلخ از دست دادن تمام پارتیشن‌هایم. آن زمان با سخت افزارها خیلی مشکل داشتم ولی به دلیل مانور سریع و سفارشی شدنش چند وقتی تحمل کردم [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>کمتر از سه ماه است که کار با سیستم عامل لینوکس را شروع کرده‌ام. اولین تجربه‌ام با لینوکس چند سال پیش و با توزیع رد‌هت بود و البته خاطره تلخ از دست دادن تمام پارتیشن‌هایم. آن زمان با سخت افزارها خیلی مشکل داشتم ولی به دلیل مانور سریع و سفارشی شدنش چند وقتی تحمل کردم (اولین بسته‌ای که نصب کردم <a href="http://www.xmms.org/">xmms</a> بود که برایم فرمت MP3 را از ویندوز مدیا پلیر بهتر می‌خواند) تا اینکه کار طراحی و بخصوص نرم‌افزارهای اداری مجبورم کرد که فکر لینوکس را نکنم و حتی بدنبال توزیع‌های جدیدش نروم. </p>
<p>این اواخر برای  کار راحت‌تر با PHP و بخصوص <a href="http://gtk.php.net/">GTK</a> لینوکس <a href="http://fedoraproject.org/wiki/">فدورا کور</a> 6 را نصب کردم. خوشبختانه تمام سخت‌افزارها شناسایی شدند و تنها مشکلم با بلوتوث بود که امروز که کرنل را به روز کردم آن هم رفع شد. مشکل دیگر فونت تاهوما بود، اوایلی که این فونت را نصب کردم خیلی اذیتم می‌کرد (شاید بدلیل عادتی بود که به <a href="http://en.wikipedia.org/wiki/ClearType">ClearType</a> مایکروسافت داشتم، هر چند آنجا هم مجبور بودم از <a href="http://www.ioisland.com/cleartweak/">ClearTweak</a> برای کنترلش استفاده کنم) اما الان برعکس شده است.</p>
<p>تنها موردی که فکر می‌کنم در ویندوز بود و اینجا نیست، کرک و سریال و &#8230; باشد . که یکی از صدها مزیت دنیای کد باز است. هیچ تعصبی نسبت به لینوکس و ویندوز ندارم اما کد باز را به دلیل دادن آزادی بیشتر به کاربر بیشتر می‌پسندم. امیدوارم فرصت این را داشته باشم که به عنوان یک کاربر تازه‌کار لینوکس هر چه را فرا می‌گیرم منتشر کنم. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/04/10/starting-with-fedora-core6/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>یا مقلب القلوب و الابصار</title>
		<link>https://weblog.alvanweb.com/2007/03/21/norouz-1386/</link>
					<comments>https://weblog.alvanweb.com/2007/03/21/norouz-1386/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 20 Mar 2007 23:31:25 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/03/21/norouz-1386/</guid>

					<description><![CDATA[یک سال دیگر هم گذشت، سریعتر از آنچه تصورش را می‌کردم. روزها و ساعات آخر سال به تنها چیزی که افسوس می خورم لحظه لحظه‌هایی است که از دست رفته‌اند، شاید می‌شد بهتر از این باشد. امیدوارم همین حس سرآغاز سالی باشد که بتوانم از تمام لحظه‌هایش بهترین استفاده را بکنم. امیدوارم میمنت سال جدید [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>یک سال دیگر هم گذشت، سریعتر از آنچه تصورش را می‌کردم. روزها و ساعات آخر سال به تنها چیزی که افسوس می خورم لحظه لحظه‌هایی است که از دست رفته‌اند، شاید می‌شد بهتر از این باشد. امیدوارم همین حس سرآغاز سالی باشد که بتوانم از تمام لحظه‌هایش بهترین استفاده را بکنم. امیدوارم میمنت سال جدید طلیعه‌ی موفقیت‌های بزرگ هم برای شما و هم برای خودم باشه. در لحظه حلول سال نو با زمزمه کردن دعای عرفانی , یا مقلب القلوب و الابصار، دعا گوی ما هم باشید . عید بر همگان مبارک باد .</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/03/21/norouz-1386/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>به‌ روز رسانی فوری وردپرس</title>
		<link>https://weblog.alvanweb.com/2007/03/03/wordpress-upgrade-212/</link>
					<comments>https://weblog.alvanweb.com/2007/03/03/wordpress-upgrade-212/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 03 Mar 2007 14:57:00 +0000</pubDate>
				<category><![CDATA[وردپرس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/03/03/wordpress-upgrade-212/</guid>

					<description><![CDATA[اگر در طی 3-4 روز گذشته وردپرس 2.1.1 را از سایت رسمی آن دانلود کرده‌اید، احتمالاً فایل‌های شما حاوی یک اکسپلویت خطرناک است که توسط یک کراکر اضافه شده است. هر چه سریعتر فایل‌هایتان را به نسخه 2.1.2 ارتقا دهید. متن فوق قسمتی از خبری است که در بخش توسعه و انتشار وب سایت رسمی [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>اگر در طی 3-4 روز گذشته وردپرس 2.1.1 را از سایت رسمی آن دانلود کرده‌اید، احتمالاً فایل‌های شما حاوی یک اکسپلویت خطرناک است که توسط یک کراکر اضافه شده است. هر چه سریعتر فایل‌هایتان را به <a href="http://wordpress.org/download/">نسخه 2.1.2</a> ارتقا دهید.</p>
<p>متن فوق قسمتی از <a href="http://wordpress.org/development/2007/03/upgrade-212/">خبری</a> است که در بخش توسعه و انتشار وب سایت رسمی وردپرس اعلام شده است. گویا یک کراکر به سطح کاربری یکی از سرورهای سایت وردپرس دسترسی داشته است و توانسته در سورس فایل دریافتی تغییراتی ایجاد کند. اگر چه تمام فایل‌های دانلود شده این مشکل را ندارند ولی وردپرس به محض اطمینان  کاربران از عدم وجود فایل‌های دست خورده نسخه جدید 2.1.2 را منتشر کرده که چند بروزرسانی جزئی نیز در آن انجام شده است.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/03/03/wordpress-upgrade-212/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>فایرفاکس و آپلود آسان تصاویر</title>
		<link>https://weblog.alvanweb.com/2007/02/11/firefox-companion-for-kodak-easyshare-gallery/</link>
					<comments>https://weblog.alvanweb.com/2007/02/11/firefox-companion-for-kodak-easyshare-gallery/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 11 Feb 2007 09:43:08 +0000</pubDate>
				<category><![CDATA[فایرفاکس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/02/11/firefox-companion-for-kodak-easyshare-gallery/</guid>

					<description><![CDATA[حتماً کمپانی کداک را می‌شناسید (کمپانی سازنده تجهیزات فلمبرداری و عکاسی) چند روز قبل این کمپانی اکستنشنی را برای فایرفاکس منتشر کرد که به کاربران اجازه می‌دهد تا براحتی عکس‌هایشان را در فضایی تحت نام Kodak EasyShare Gallery آپلود کنند. بعد از نصب این اکستنشن و ایجاد یک اکانت رایگان، به کمک قابلیت Drag and [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>حتماً کمپانی <a href="http://www.kodak.com">کداک</a> را می‌شناسید (کمپانی سازنده تجهیزات فلمبرداری و عکاسی)  چند روز قبل این کمپانی اکستنشنی را برای فایرفاکس منتشر کرد که به کاربران اجازه می‌دهد تا براحتی عکس‌هایشان را در فضایی تحت نام <a href="http://www.kodakgallery.com">Kodak EasyShare Gallery</a> آپلود کنند. بعد از نصب این اکستنشن و ایجاد یک اکانت رایگان، به کمک قابلیت Drag and Drop و افزودن عنوانی برای عکس‌ها، می‌توانید آلبوم‌های دلخواه‌تان را ایجاد کنید. قابلیت ویژه این اکستنشن Multi Selecting بودن آن است که به شما اجازه می‌دهد در یک‌زمان چندین عکس را انتخاب و یکباره به رابط کاربری زیبای آن وارد کنید.</p>
<div class="center"><a href="http://www.mozilla.com/en-US/add-ons/kodak/"><img decoding="async" src="/old_media/fotofox-kodak.jpg" alt="Kodak EasyShare Gallery" /></a></div>
<p>البته در نظر داشته باشید که این اکستنشن علاوه بر Kodak  از سایت‌های دیگری  از جمله <a href="http://www.flickr.com">Flickr</a>، <a href="http://www.tabblo.com">Tabblo</a> و &#8230; پشتیبانی می‌کند و در آینده سرویس‌های دیگری به آن افزوده خواهد شد. توضیحات بیشتر در مورد این اکستنشن را در <a href="http://www.mozilla.com/en-US/add-ons/kodak/">اینجا</a> بیابید.</p>
<p><strong>پی‌نوشت:</strong> در مورد محدودیت در آپلود، کمتر سیستمی پیدا می‌شود که محدودیت نداشته باشد، در هر صورت باید هزینه‌ این همه امکانات به نوعی تامین شود. اما فکر می‌کنم کداک در این مورد کمی سختگیرانه‌تر عمل می‌کند. طبق <a href="http://www.kodakgallery.com/TermsOfService.jsp?">قوانین و مقررات کداک</a> در Kodak Gallery محدودیت حجمی برای آپلود تصویر ندارید اما به محض آپلود اولین تصویر در این سرویس تا 12 ماه بعد فقط خواهید توانست به طور رایگان تصویر آپلود کنید. برای فعال شدن اکانت‌تان هر 12 ماه یکبار، باید خریدی از Imaging Network کداک داشته باشید. در غیر اینصورت اکانت غیر فعال و تصاویر حذف خواهد شد. البته این نکته هم ذکر شده است که در هر زمانی که کداک بخواهد می‌تواند مقررات این بند را تغییر دهد.</p>
<p>علاوه بر تصاویر، با این سرویس فایل‌های ویدیویی تا 15 مگابایت در هر فایل را می‌توان آپلود کرد که حجم محدودی برای هر اکانت در نظر گرفته شده که نهایتاً 150 مگابایت می‌باشد. همچنین Kodak Gallery هر فایل ویدیویی را تنها تا 30 روز بعد از آپلود آن ذخیره خواهد نمود.<br />
 اگر چه برای ما ایرانیان داخل رعایت این مقررات دشوار است اما می‌توان از امکان آپلود تصویر در سایر سیستم‌های این اکستنشن بهره برد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/02/11/firefox-companion-for-kodak-easyshare-gallery/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>توسعه سریعتر با ثابت‌های CSS</title>
		<link>https://weblog.alvanweb.com/2007/01/31/faster-development-with-css-constants/</link>
					<comments>https://weblog.alvanweb.com/2007/01/31/faster-development-with-css-constants/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Wed, 31 Jan 2007 07:37:32 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[فناوری‌های وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/01/31/faster-development-with-css-constants/</guid>

					<description><![CDATA[قبلاً به طور غیر مستقیم در مقالات PHP &#038; CSS Hacks و فشرده‌سازی CSS به کمک PHP به طور مختصر از ثابت‌ها یا همان constant ها استفاده کردیم. متاسفانه همانطور که همه می‌دانیم CSS از ثابت‌ها پشتیبانی نمی‌کند. اگر می‌توانستیم در ابتدا مقادیر ثابت را تعریف کنیم و سپس از آن‌ها در بخش‌های مختلف فایل [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>قبلاً به طور غیر مستقیم در مقالات <a href="https://weblog.alvanweb.com/2005/07/17/php-css-hacks/">PHP &#038; CSS Hacks</a> و <a href="https://weblog.alvanweb.com/2006/08/29/php_css_compressor/">فشرده‌سازی CSS به کمک PHP</a> به طور مختصر از ثابت‌ها یا همان constant ها استفاده کردیم. متاسفانه همانطور که همه می‌دانیم CSS از ثابت‌ها پشتیبانی نمی‌کند. اگر می‌توانستیم در ابتدا مقادیر ثابت را تعریف کنیم و سپس از آن‌ها در بخش‌های مختلف فایل  CSS مان استفاده کنیم خیلی عالی می‌شد.</p>
<p> توسعه ‌دهندگان وب برای حل این موضوع عمدتاً به ترکیب یک زبان برنامه نویسی تحت وب مثل PHP با CSS متوسل می‌شوند. (<a href="http://www.wait-till-i.com/index.php?p=24">روش اول</a> استفاده از PHP محض و <a href="http://www.shauninman.com/archive/2005/08/09/css_constants">روش دوم</a>  ویرایش فایل Htaccess است)   هر چند خیلی کم هستند کسانی که این متد رو بکار می‌برند. چند وقت پیش که با  <a href="http://edgeofmyseat.com/">Rachel Andrew</a> در این مورد بحث می‌کردم اینطور وانمود می‌کرد که روش‌های مرسوم برای این کار جدای از اینکه مورد انتقاد قرار گرفتن، عمدتاً به علت ناآگاهی طراح، زیاد مورد استقبال قرار نگرفته و انتظار می‌رود در آینده نزدیک تعداد طراحانی که این متدها رو بکار می‌برند بیشتر شود.</p>
<p>اما بنظر خودم ترکیب یک زبان برنامه نویسی تحت وب مثل PHP با CSS برای یک سایت پر ترافیک واقعاً می‌تواند ناکارآمد باشد. موضوع دقیقاً روشن است، کامپایل یک فایل PHP به CSS مقداری از پهنای باند را مصرف خواهد کرد. چرا که یک فایل استاتیک (مثلاً یک فایل نرمال با فرمت CSS) می‌تواند کش شود در حالی یک فایل پویا در هر بار که یک صفحه از سایت را باز کنید باید کامپایل و دوباره روی مرورگر بارگذاری شود. بنابراین قبلاً از اینکه این ترکیب رو بکار برد باید به فکر یک مکانیسم کشینگ عالی بود. از طرف دیگر من هم قبول دارم که CSS باید گزینه‌ای برای ثابت‌ها داشته باشد اما <a href="http://w3.org/">W3C</a> این روش را قبول نمی‌کند، <a href="http://lists.w3.org/Archives/Public/www-style/2006Oct/0150.html">خودتان قضاوت کنید</a>. پس راه حل چیست؟ <span id="more-126"></span></p>
<p>خیلی از طراحان دیگر استفاده از فهرست رنگ‌ها یا همان <a href="http://www.garrettdimon.com/archives/css-maintenance-tip-use-a-color-glossary">Color Glossary</a> را به عنوان <strong>جزئی از راه‌حل</strong> در مقابل پیشنهاد می‌کنند. اگر چه این روش نمی‌تواند جایگزین مناسبی برای ترکیب یک زبان برنامه نویسی با CSS باشه اما  تا حد قابل توجهی در اتلاف زمان طراحی و بخصوصی ویرایش‌های بعدی فایل‌های CSS‌ مان موثر خواهد بود. روش کار به این شکل است که لیستی از رنگ‌هایی را که در فایلمان استفاده کرده‌ایم همراه با توضیحات مربوطه و البته به طور دلخواه (به طوریکه مشخص شود هر رنگ مربوط به چه قسمتی از صفحه است)  در داخل کامنت بیاوریم و آن را در بالای فایل قرار دهیم. نمونه زیر را ببینید:</p>
<pre class="brush: xml; title: ; notranslate"> /*
Dark grey (text): #333333
Dark Blue (headings, links) #000066
Mid Blue (header) #333399
Light blue (top navigation) #CCCCFF
Mid grey: #666666
*/</pre>
<p>فرض کنید می‌خواهیم خاکستری کمرنگ یا همان Mid grey را به 999999 تغییر دهیم، یک جستجو و جایگزینی سریع به کمک ادیتورمان می‌تواند تمام مقادیر 666666  را با مقدار  999999 جانشین کند. همانطور که گفتم منصفانه این متد در برابر ترکیب یه زبان برنامه نویسی  یک تکنیک ضعیف محسوب می‌شود. چرا که می‌توانستیم مقدار رنگ را در یک متغیر قرار دهیم و هنگام کد نویسی فقط از نام متغیر استفاده کنیم علاوه بر این در هنگام ویرایش مقادیر نیز، نیازی به جستجو نخواهد بود.</p>
<p> در نظر داشته باشید که این موضوع <strong>Color Glossary</strong> تنها به این جهت مطرح شده که رنگ‌ها کاربرد زیادی در المان‌ها دارند و نسبت به سایر خاصیت‌های بکار رفته شده در فایل‌های CSS‌ مان بیشتر ویرایش می‌شوند و این تکنیک منحصراً دسترسی به محتوای فایل و تغییرات آن را (البته برای رنگ‌ها و نه همه خاصیت‌ها) آسان‌تر می‌کند. </p>
<p>+  هر چند جستجوهایم در مورد استفاده از مقادیر ثابت در فایلCSS فراتر از جزییات فوق بود اما تمامی روش‌های بکارگرفته شده به همین‌هایی که گفتم ختم می‌شد. آیا شما روش دیگری یا ایده جدیدی سراغ دارید؟ </p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/01/31/faster-development-with-css-constants/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>هنر اسپرسو (هنر قهوه)</title>
		<link>https://weblog.alvanweb.com/2007/01/08/espresso-art/</link>
					<comments>https://weblog.alvanweb.com/2007/01/08/espresso-art/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 08 Jan 2007 13:07:41 +0000</pubDate>
				<category><![CDATA[عکس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2007/01/08/espresso-art/</guid>

					<description><![CDATA[اگر مثل من عاشق قهوه و به خصوص قهوه اسپرسو باشید حتماً اسم هنر اسپرسو رو هم شنیدین. اسپرسو یک واژه ایتالیایی است به معنی سریع و خیلی کوتاه. در سال 1822 میلادی ایتالیایی‌ها روش جدیدی رو برای تهیه قهوه ابداع کردند. به این طریق كه در فشار بالا و با آب 90 درجه از [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>اگر مثل من عاشق قهوه و به خصوص قهوه اسپرسو باشید حتماً اسم هنر اسپرسو رو هم شنیدین. اسپرسو یک واژه ایتالیایی است به معنی سریع و خیلی کوتاه. در سال 1822 میلادی ایتالیایی‌ها روش جدیدی رو برای تهیه قهوه ابداع کردند.  به این طریق كه در فشار بالا و با آب 90 درجه از دانه قهوه، عصاره آن را میگرفتند، قهوه به دست آمده از این طریق به قهوه اسپرسو معروف شد. بعد از اون دستگاهای اسپرسو ساز به بازار اومدن.</p>
<p>حرفه‌ای‌ها این نوع قهوه رو بعد از ریختن داخل فنجان به کمک كمى خامه رقیق شده با شیر پرچرب و البته کمی دقت و حوصله تزیین می‌کنند که زیبایی خاصی رو به این نوع از قهوه می‌ده و لذت خوردنش رو دو چندان می‌کنه و باعث شده تا این هنر تزیین قهوه رو، هنر اسپرسو بنامند. (من در کافی شاپ‌های ایران این چنین تزییناتی رو تا بحال ندیدم) اگر می‌خواهید از نزدیک با هنر تزیین آشنا بشین <a href="http://www.youtube.com/watch?v=ZDZs__m5iAI">این ویدیو</a> YouTube رو از دست ندین. نیویورک تایمز همچنین <a href="http://www.nytimes.com/2006/09/13/dining/13coff.html?ex=1315800000&#038;en=bd8a3ba642e9f17b&#038;ei=5088&#038;partner=rssnyt&#038;emc=rss">مقاله مفصلی</a> در مورد آموزش هنر اسپرسو به همراه یک <a href="http://video.on.nytimes.com/ifr_main.jsp?nsid=b20ca33a9:10fd2d09a6f:-1e1c&#038;fr_story=a8e5e670cf58065ed37ca989a0727c7c6aee77e7&#038;st=1167477350505&#038;mp=FLV&#038;cpf=false&#038;fvn=8&#038;fr=123006_061722_20ca33a9x10fd2d09a6fxw1e1b&#038;rdm=308400.7633423436">فیلم</a> دارد. نمونه‌هایی از این هنر رو در تصاویر زیر مشاهده می‌کنید: </p>
<div class="center"><img decoding="async" src="/old_media/kikiespressoart_2.jpg" alt="Espresso Art" title="Espresso Art" /></div>
<p><span id="more-125"></span></p>
<p><center><img decoding="async" src="/old_media/espresso1a_2.jpg" alt="Espresso Art" title="Espresso Art" /></p>
<p><img decoding="async" src="/old_media/espresso2art_2.jpg" alt="Espresso Art" title="Espresso Art" /></p>
<p><img decoding="async" src="/old_media/espressoart5_2.jpg" alt="Espresso Art" title="Espresso Art" /></p>
<p><img decoding="async" src="/old_media/espressoart4_2.jpg" alt="Espresso Art"  title="Espresso Art"/></center></p>
<p>آن قدر زیبا تزیین شده‌اند که کمتر کسی راضی خواهد شد کمی از آن بخورد. دلت می‌خواهد تصویرش را قاب بگیری بزنی به دیوار اتاقتت.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2007/01/08/espresso-art/feed/</wfw:commentRss>
			<slash:comments>35</slash:comments>
		
		
			</item>
		<item>
		<title>سوژه‌ای برای نوشتن</title>
		<link>https://weblog.alvanweb.com/2006/12/30/occasion/</link>
					<comments>https://weblog.alvanweb.com/2006/12/30/occasion/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 30 Dec 2006 11:57:15 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/12/30/occasion/</guid>

					<description><![CDATA[وقتی بعد از یکی دو روز دوری از وب، دوباره آنلاین می‌شم ، از بس در فایرفاکس تب باز می‌کنم بیچاره اتوماتیک ریستارت می‌زنه. تغییرات در این محیط واقعاً متحیر کننده است. با خودم فکر می‌کنم اگر فقط یک ماه هیچ دسترسی به منابع آنلاین نداشته باشم، خیلی عقب افتادم. گرفتاری‌های پروژه‌ای که این یکی [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>وقتی بعد از یکی دو روز دوری از وب، دوباره آنلاین می‌شم ، از بس در فایرفاکس تب باز می‌کنم بیچاره اتوماتیک ریستارت می‌زنه. تغییرات در این محیط واقعاً متحیر کننده است. با خودم فکر می‌کنم اگر فقط یک ماه هیچ دسترسی به منابع آنلاین نداشته باشم، خیلی عقب افتادم. گرفتاری‌های پروژه‌ای که این یکی دو ماه اخیر ذهنم را تماما&#x200d;ً به خود مشغول کرده بود خدا را شکر تمام شد. </p>
<p>از <a href="http://www.webnevis.net/">پیامبر وب نویس</a>، <a href="http://www.gozir.com/1385/10/06/yalda/">حمید‌رضا محمدی</a> و <a href="http://underline.wordpress.com/2006/12/28/yalda-game/">محمد میهن خواه </a>عزیز که من رو هم به <a href="http://www.globalpersian.com/archive/dynamic/044215.html">این بازی</a> دعوت کردند، سپاسگزارم. با اینکه خیلی چیز مهمی برای اعتراف ندارم ولی فکر می‌کنم پنج تا از همه مهمترش اینان:</p>
<p>1- یه زمانی عاشق شنا و استخر و این ماجراها بودم، سال دوم دبیرستان به طور اتفاقی در عمق 4.5 متر نفسم گرفت و از حال رفتم. از همون زمان از استخر و آب و دریا وحشت دارم.</p>
<p>2- به اندازه یه سنسور حساسم. یه مورد خاصی که پیش بیاد مدت‌ها در ذهنم می‌مونه و شاید هیچ وقت پاک نشه. ولی تا جایی که تونستم سعی کردم به آینده جدای از گذشته فکر کنم. البته این حساس بودن در مود کارم بیشتر مصداق پیدا می‌کنه. هر کاری رو حتی اگه سودی هم برام نداشته باشه باید تمام و کمال انجام بدم و تا وقتی کار تموم نشده آرامش ندارم.</p>
<p>3- الوان وب تنها وبلاگی نیست که می‌نویسم، وبلاگ دیگری  به زبان روسی دارم که در جای خودش آدرسش را فاش خواهم کرد (جدای از <a href="http://alvanweb.wordpress.com/">الوان وبِ</a> وردپرس دات کام، که فقط برای تست ساخته شده و چند پستش عمدتاً انگلیسی است)</p>
<p>4- با خواب اصلاً میانه خوبی ندارم. اگر خیلی سرم شلوغ باشد با 3 ساعت خواب در 24 ساعت شبانه روز هیچ مشکلی ندارم (بارها و بارها برایم پیش آمده که به همین سه ساعت اکتفا کردم)</p>
<p>5- همیشه سعی کردم &#8220;نه گفتن&#8221; را بیاموزم و به طرز قاطعانه، اما با خوشرویی به دوستان بفهمانم که گرفتار هستم، اما اعتراف می‌کنم که زیاد موفق نشده‌ام. </p>
<p>من هم بنا به شیوه این بازی دوستان زیر رو دعوت می‌کنم. شرمنده از حد نصاب کمتره، هر کسی رو خواستم دعوت کنم تکراری بود. <a href="http://www.manionline.org/weblog.php">مانی منجمی</a>، <a href="http://weblog.corelist.net/">علی ستاری</a>، <a href="http://hamed.blogfa.com/">زندگی دیجیتال</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/12/30/occasion/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>وب در آستانه سال نو میلادی</title>
		<link>https://weblog.alvanweb.com/2006/12/03/web-and-new-year/</link>
					<comments>https://weblog.alvanweb.com/2006/12/03/web-and-new-year/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 03 Dec 2006 06:09:19 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/12/03/web-and-new-year/</guid>

					<description><![CDATA[یادتان هست عید گذشته را چه طور به وبلاگستان آوردیم؟! یکی برنامه‌های سفرش را با مختصری از فرهنگ نوروز ضمیمه محتوای پست‌هایش کرد دیگری لوگوی وبلاگش را کمی پررنگ تر کرد و یک دسته سبزه و تنگ ماهی به زور کنارش جا داد. بعضی‌ها هم در حدی که می‌توانستند قالبی عوض کردند یا حداقل اینکه [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>یادتان هست عید گذشته را چه طور به وبلاگستان آوردیم؟! یکی برنامه‌های سفرش را با مختصری از فرهنگ نوروز ضمیمه محتوای پست‌هایش کرد دیگری لوگوی وبلاگش را کمی پررنگ تر کرد و یک دسته سبزه و تنگ ماهی به زور کنارش جا داد. بعضی‌ها هم در حدی که می‌توانستند قالبی عوض کردند یا حداقل اینکه یک Countdown گذاشتن سایدبار وبلاگشان تا ثانیه‌ها را برایشان بشمارد.  فکر می‌کنم در همین حد و حدود بود، نه یک کار دیگه هم کردیم دست به دامن گوگل شدیم. شاید هم کارهای مشابه که من بی‌خبرم یا فراموش کردم. فقط اینو خوب یادمه که منم هیچ کاری نکردم!</p>
<p>اما این روزهای آخر سال میلادی در وبگردی‌های روزانه با ایده‌های جالبی در وب مواجه می‌شوم، وب سایت‌هایی جهت هر چه با‌شکوه‌تر شدن کریسمس در دنیای مجازی. <a href="http://25.veracon.net/">یکی</a> یکماه مانده به پایان سال هر روز یک سایت زیبا معرفی می‌کند. دیگری سایتی است با نام <a href="http://24ways.org">24Ways</a> که حتما می‌شناسید. هر سال 24 مقاله جدید در زمینه توسعه وب توسط معروف‌ترین توسعه‌دهندگان و طراحان وب منتشر می‌کند که نظیر ندارد. به طوریکه مقالات هر سال یکماه مانده به پایان سال‌(در دسامبر)، هر روز یک مقاله منتشر می‌شود و صدها سایت مشابه که هر سال با ایده‌های نو و خلاقانه پا به عرصه وب می‌گذارند.</p>
<p>چه می‌شود از همین الان به فکر شویم تا عیدمان را فراتر از سال پیش به وب بیاوریم. ایده‌های جدید مطرح کنیم و حداقل تا جایی که می‌توانیم آن‌ها را عملی کنیم.</p>
<p>+ <strong>پی نوشت</strong>: <em>بابت حذف کامنت‌های این پست و پست قبل متاسفم. مشکل حل شد.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/12/03/web-and-new-year/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>ساختن باکس جستجو برای FireFox 2 و IE 7</title>
		<link>https://weblog.alvanweb.com/2006/11/27/build-a-search-box-for-firefox-and-ie7/</link>
					<comments>https://weblog.alvanweb.com/2006/11/27/build-a-search-box-for-firefox-and-ie7/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 27 Nov 2006 17:54:36 +0000</pubDate>
				<category><![CDATA[دنیای کامپیوتر]]></category>
		<category><![CDATA[فایرفاکس]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/11/27/build-a-search-box-for-firefox-and-ie7/</guid>

					<description><![CDATA[تا هنگامی‌‌که تکنولوژی مرورگرهای وب موجب توسعه‌ی کمپانی‌هایی نظیر موزیلا شود، محصولاتی شبیه مرورگر فایرفاکس (Firefox) ارائه خواهد شد تا ابزارهایی را در اختیار توسعه‌دهنده قرار دهد که بتواند امکانات بیشتری را برای کاربران خود ارائه کند. چیزهایی مثل فیدها (RSS Feeds) می‌تواند به‌عنوان Live Bookmarked بکار رود، قابلیت باز شدن چندین تب در واسط [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>تا هنگامی‌‌که تکنولوژی مرورگرهای وب موجب توسعه‌ی کمپانی‌هایی نظیر موزیلا  شود، محصولاتی شبیه مرورگر <a href="http://www.mozilla.com/en-US/firefox/">فایرفاکس</a> (Firefox) ارائه خواهد شد تا ابزارهایی را در اختیار توسعه‌دهنده قرار دهد که بتواند امکانات بیشتری را برای کاربران خود ارائه کند. چیزهایی مثل فیدها  (RSS Feeds) می‌تواند به‌عنوان Live Bookmarked بکار رود، قابلیت باز شدن چندین تب در واسط کاربری افزوده شود و هم ‌اکنون به‌سادگی می‌توانیم جستجوی مستقیم یک سایت را در مرورگرمان داشته باشیم.</p>
<p><strong>باکس جستجو یک سایت چیست؟</strong><br />
باکس جستجوی سایت یک ابزار جستجو است که به طور مستقیم در درون مرورگر افزوده می‌شود معمولاً در اطراف فیلد آدرس دیده می‌شود و عملیات جستجو را برای یکسری سایت‌های مخصوص آسان‌تر و سریع‌تر می‌کند. پس از نصب فایرفاکس چندین باکس جستجوی استاندارد از جمله گوگل، یاهو، آمازون و ایی‌بی به طور پیشفرض موجود هستند. از اینرو این سئوال مطرح می‌شود که چگونه می‌توانم یک نمونه برای سایتم ایجاد کنم؟ این آسان‌تر از آپلود یک فایل XML روی سرورتان و اضافه نمودن یک خط کد به برچسپ HEAD صفحه‌هایتان است. <span id="more-122"></span></p>
<p><strong>اول: ساخت فایل XML</strong><br />
برای افزودن جستجوی سایت، مرورگر باید این فایل xml را دانلود کند. (در واقع این فایل به‌عنوان یک پلاگین برای مرورگر در نظر گرفته می‌شود) و تنها اطلاعات مخصوصی از سایت‌تان را شامل می‌شود. قبل از هر چیز فایل XML نمونه را از <a href="/old_media/opensearch_desc.xml">اینجا</a> دریافت کنید و آن را opensearch_desc.xml  بنامید. در ادامه روش سفارشی کردن را توضیح می‌دهیم، اولین دو خطی را که بسادگی می‌توانید سفارشی کنید، نام و توضیح است. فقط مقادیر زیر را مطابق با اطلاعات سایت‌تان تغییر دهید:</p>
<pre class="brush: xml; title: ; notranslate">&lt;shortname&gt;Alvanweb&lt;/shortname&gt;
&lt;description&gt;Alvanweb - Article Search&lt;/description&gt;</pre>
<p>سپس آیکونی را جهت نمایش در باکس جستجو اضافه می‌کنیم. می‌توانید از همان آدرس Favicon استفاده کنید. (اگر هنوز نمی‌دانید Favicon چیست در <a href="http://robo.wordpress.com/2005/01/13/%d9%8a%da%a9-%d8%b3%d8%b1%d9%88%d9%8a%d8%b3-%d8%a8%d8%b1%d8%a7%d9%8a-%d8%b3%d8%a7%d8%ae%d8%aa-%d8%a2%d9%8a%da%a9%d9%88%d9%86/">اینجا</a> توضیح مفصلی در موردش داده شده است) فقط آدرس را تغییر دهید:</p>
<pre class="brush: xml; title: ; notranslate">&lt;image height=&quot;16&quot; width=&quot;16&quot; type=&quot;image/x-icon&quot;&gt; /old_media/favicon.ico&lt;/image&gt;</pre>
<p>و در نهایت رشته جستجو را اضافه‌ می‌کنیم. مهمترین مرحله کار همین‌ جاست. این به نوع سیستمی که برای مدیریت محتوایتان بکارگرفته‌اید بستگی خواهد شد. برای این منظور باید رشته مورد جستجو را از طریق روش GET ارسال کنیم. برای این وبلاگ (الوان وب و بقیه دوستانی که وردپرس استفاده می‌کنند) از فرمتی به شکل زیر استفاده شده است:</p>
<pre class="brush: xml; title: ; notranslate">&lt;url type=&quot;text/html&quot; method=&quot;get&quot; template=&quot;https://weblog.alvanweb.com/index.php? s={searchTerms}&quot; /&gt;</pre>
<p>فایل XML را ذخیره و روی سرورتان آپلود کنید. و در انتها کد زیر را در قسمت Head صفحات سایت‌تان اضافه کنید. البته ویرایش آدرس مسیر فایل و عنوان را یادتان نرود:</p>
<pre class="brush: xml; title: ; notranslate">&lt;link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot; href=&quot;https://weblog.alvanweb.com/opensearch_desc.xml&quot; title=&quot;Alvanweb&quot; /&gt;</pre>
<p><strong>تمام شد</strong><br />
آدرس سایت‌تان را در مرورگر فایرفاکس 2 یا اکسپلرر 7 (با نسخه‌های پایین‌تر این نرم‌افزارها جواب نخواهید گرفت) تایپ کنید. پس از بارگذاری کامل سایت در لیست سایت‌های جستجو پیغامی را مبنی بر نصب جستجوی این سایت خواهید دید با کلیک روی آن، جستجوی سایت به مرورگر اضافه خواهد شد.<br />
<center><img decoding="async" src="/old_media/adding_alvanweb0.gif" alt="weblog.alvanweb.com" /></center><br />
یادتان باشد که این جستجو، به موتور جستجوی سایت‌تان وابسته است و برای سفارشی سازی بیشتر باید نحوه کارکردن سیستم سایت‌تان و جستجوی محتوای آن را بدانید. بنظرم این ایده برای یک وبلاگ‌ کم آرشیو زیاد جالب نیست ولی برای فرام‌ها و سایت‌های با محتوا و کاربر زیاد بی‌نظیر است.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/11/27/build-a-search-box-for-firefox-and-ie7/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>زود قضاوت نکن</title>
		<link>https://weblog.alvanweb.com/2006/11/14/dont-judge-quickly/</link>
					<comments>https://weblog.alvanweb.com/2006/11/14/dont-judge-quickly/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Tue, 14 Nov 2006 10:47:42 +0000</pubDate>
				<category><![CDATA[دانشگاه]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/11/14/dont-judge-quickly/</guid>

					<description><![CDATA[امروز یک‌بار دیگر احساس کردم باید دوباره به خودم بگویم ولش کن همین‌جوری ماست مالی کن بده بره، این همه جوش کارو نزن. این چندمین باری است که به خاطر درست انجام دادن وظیفه‌ام بازخواست می‌شوم. یادم می‌آید برای اولین بار دوران دبیرستان بود، یک تحقیق اسنادی ساده در مورد یکی از مشاهیر نامی ایران. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>امروز یک‌بار دیگر احساس کردم باید دوباره به خودم بگویم ولش کن همین‌جوری ماست مالی کن بده بره، این همه جوش کارو نزن. این چندمین باری است که به خاطر درست انجام دادن وظیفه‌ام بازخواست می‌شوم. یادم می‌آید برای اولین بار دوران دبیرستان بود، یک تحقیق اسنادی ساده در مورد یکی از مشاهیر نامی ایران. به علت جامعیت مقاله‌ام و نگارش زیبایش، معلم بزرگوار هیچ وقت باورش نشد که کار من است. به آسمان و زمین پریدن هم فایده‌ای نداشت. دومین بار هم در همان دوران بود، درس آمار و مدلسازی و این‌بار یک تحقیق میدانی. بازهم گفتند تو و این چارت‌های اکسل؟</p>
<p>بعد از اینکه رفتم دنبال برنامه‌نویسی و طراحی وب باز هم وضعیت به همین منوال بود. در کارهایی که انجام می‌دادم بودند کسانی که به ما وصله‌های این مدلی بزنند. آن موقع به خودم می‌گفتم بی‌خیالش. به قول معروف از این گوش می‌شنوم و از اون گوش…<br />
اما این روزها در محیط کاری‌ام و دیگر محیط‌ها می‌بینم که این حس مسئول بودنم در مورد کاری که انجام می‌دهم کار دستم می‌دهد. حتی اگر موارد فوق را نداشته باشد حداقلش این است که شخصیتم انگشت‌نمای دیگران در یک اجتماع کوچک می‌شود. راست می‌گویند خواهی نشوی رسوا همرنگ جماعت شو. <span id="more-121"></span></p>
<p>امروز مشابه موارد گذشته با من برخورد شد. این ترم خیر سرم 3 واحد کار تحقیقاتی دارم. وقتی طرح تحقیق را به استاد محترم ارائه دادم بی‌مقدمه گفت: این کار شما نیست. همه حرف‌هایشان بجای خود ولی این حرف خیلی برام گرون تموم شد: &#8220;انتظار داشتم خودتون برید دنبال کار…&#8221; و کلی نصیحت. دوستانی که مرا می‌شناختند صدایشان درآمده بود. دلم نمی‌خواست هیچ چیزی بگویم. به استادی که از چهار تا جدول و دو تا خط شکسته نستعلیق نوشتن و یک حاشیه و کادر این ور و آن ور کردن،  این چنین قضاوت می‌کند چه می‌توان گفت؟ اگر استاد محترم قبل از وصله زدن کمی از سابقه‌ی کارهای پژوهشی‌ام می‌پرسید، این حرف رو می‌زد؟ کما اینکه وقتی در انتهای کلاس به اصرار یکی از دوستان کمی از کارهایم برایش گفتم کاملا قانع شد. </p>
<p>من از هیچ چیز حرص نمی‌خورم ولی از دیگران، از استاد دانشگاه، از فردی که عضو هیات علمی دانشگاه است، فردی که تجربه کاری‌اش به اندازه موهای سفید سرش هست انتظار دیگری دارم. ایراد بزرگی که ماها داریم همین است. قبل از اینکه در مورد شخصی یا چیزی اطلاعاتی داشته باشیم شروع به انتقاد می‌کنیم، طرف را به هزار دلیل محکوم می‌‌کنیم و حتی به جاهایی ارتباطش می‌دهیم که طرف در خواب هم ندیده‌ است.<br />
 البته این منوط به امروز من نمی‌شود در اجتماعات دیگر هم این وجود دارد و البته نه برای من بلکه برای همه افراد مثل من. هر چند به امروز و گذشته توجهی ندارم ولی مطمئنم برای دفعات بعدی روی کاری که انجام ‌می‌دهم تاثیر خواهد داشت.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/11/14/dont-judge-quickly/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>کم‌کاری، گرفتاری، انتظار&#8230;</title>
		<link>https://weblog.alvanweb.com/2006/10/23/fo-alvanweb/</link>
					<comments>https://weblog.alvanweb.com/2006/10/23/fo-alvanweb/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Mon, 23 Oct 2006 12:34:39 +0000</pubDate>
				<category><![CDATA[پروژه‌ ها]]></category>
		<category><![CDATA[دانشگاه]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/10/23/fo-alvanweb/</guid>

					<description><![CDATA[این روزها آن‌قدر غرق تجزیه و تحلیل‌های اقتصادی شده‌ام که کم‌کم دارم به این نتیجه می‌رسم که باید این‌جا را هم اقتصادی کنم. خدای نکرده یک رشته تخصصی‌ام اقتصاد صنعتی یا همان Applied Economics Engineer است (انگلیسی‌اش باکلاس‌تر به نظر می‌رسد، در مورد همه چیز بیگانه‌اش خوشگل‌تر است، نه؟) هر کس از بچه‌های دانشکده که [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>این روزها آن‌قدر غرق تجزیه و تحلیل‌های اقتصادی شده‌ام که کم‌کم دارم به این نتیجه می‌رسم که باید این‌جا را هم اقتصادی کنم. خدای نکرده یک رشته تخصصی‌ام اقتصاد صنعتی یا همان  Applied Economics Engineer  است (انگلیسی‌اش باکلاس‌تر به نظر می‌رسد، در مورد همه چیز بیگانه‌اش خوشگل‌تر است، نه؟) هر کس از بچه‌های دانشکده که آدرس وبلاگم را دارد و خبری از حرفه‌ام ندارد، با لحنی همراه با تعجب گله می‌کند که مردک این مزخرفات چیست. در عوض در آموزشکده ای که به‌حساب وب تدریس می‌کنم باید مکرر به این سوال جواب  دهم که الوان‌وب بالا را با چه فونت و فوت و کلکی نوشته‌ام. در همین‌جا وقتی به کارآموز می گویم ماوس را حرکت بده دو طرف کیبورد را محکم می چسپد و این‌ور و آن‌ورش می‌کند، عجیب نیست،  همین که ماوس را با مونیتور اشتباه نمی‌گیرند جای تامل دارد.</p>
<p>در همین راستای گرایشات و تمایلات به سمت اقتصاد، علی الخصوص اقتصاد مملکت گل مان (که هیچ متغیر کلانش در چهارچوب تئوری های اقتصادی قابل توجیه نیست یا توجیه اش کمرشکن است) دست به یک کار پژوهشی، تحقیقاتی زده ام در مورد صنایع کوچک البته در سطح منطقه‌ای و استانی. و تاکنون جز انتظار پشت درب دفتر ارتباط با صنعت و سازمان صنایع و معادن کار دیگری نکرده‌ام. </p>
<p>از طرف دیگر روز و شب منتظرم و مثل این‌که باید یکماه دیگر هم منتظر بمانم تا کمی ذهنم آرام شود (خودتون بهتر از من می‌دونید انتظار چه قدر سخته، مخصوصا وقتی که مورد انتظارت هم خیلی برات عزیزه،  اون هایی که منو ذاتاً می شناسن که بهتر) وقتی منتظری، ذهنت منتظر است و تخیلاتت مثل سوهان تفرکت را می سائد حداقل برای من این‌طور است. وقتی انتظارم به پایان رسید منم داد می زنم &#8220;بسه بسه، انتظار…&#8221; آن زمان فکر می‌کنم و امیدوارم وضع از اینی که هست بهتر شود.</p>
<p>دو ماه دیگر هم الوان‌وب اکسپایر می‌شود فعلا برنامه دقیقی برایش ندارم. ناچاراً مجبورم برای کاهش دغدغه های ذهنیم، حداقل به مدت دو ماه از این حواشی مرخصی نیمه وقت بگیرم. البته همانطور که شاهد و ناظرید اینجا از دیر وقت مرخصی گرفته، ماهی به زور یک یا دو پست نیمه آبکی نوشتن، این موضوع را کاملا تصدیق می‌کنه. منظورم از مرخصی از جواب ندادن ایمیل ها و آفلاین ها و این موارد بود. این را گفتم که اگر ایمیل زدید و جواب ندادم داغ نکنید. به‌هر حال هر وقت فرصت کنم حتما تا جایی که بتوانم پاسخگو خواهم بود.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/10/23/fo-alvanweb/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>هشدارهای CSS Validator در مورد رنگ خطا نیست</title>
		<link>https://weblog.alvanweb.com/2006/10/08/css_validator_colour_warnings_are_not_errors/</link>
					<comments>https://weblog.alvanweb.com/2006/10/08/css_validator_colour_warnings_are_not_errors/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 08 Oct 2006 17:56:46 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/10/08/css_validator_colour_warnings_are_not_errors/</guid>

					<description><![CDATA[قبلا مجادلات زیادی در این مورد با خیلی از دوستان صورت گرفته بود، اگر چه به یک جواب درست و حسابی در مورد این مشکل نرسیدم (بعدها فهمیدم که خیلی از کسایی که باهاشون بحث کردم فرق هشدار و خطا رو نمی فهمیدن) ولی چند روز قبل Roger عزیز در این پست وبلاگش موضوع رو [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>قبلا مجادلات زیادی در این مورد با خیلی از دوستان صورت گرفته بود، اگر چه به یک جواب درست و حسابی در مورد این مشکل نرسیدم (بعدها فهمیدم که خیلی از کسایی که باهاشون بحث کردم فرق هشدار و خطا رو نمی فهمیدن)  ولی چند روز قبل Roger عزیز در <a href="http://www.456bereastreet.com/archive/200610/css_validator_colour_warnings_are_not_errors/">این پست</a> وبلاگش موضوع رو خیلی جمع و جور توضیح داده. حال و حوصله این که فارسیش را بنویسم ندارم، خودتان زحمتش را بکشید.</p>
<p>کم کم دارم به این نتیجه می رسم که جای یک فرام تخصصی CSS بین مان خالیست. خیلی ها کله هایشان پر است و رو نمی کنند. بعضی ها اصالتا خسیس اند حتی در این مورد، بعضی ها هم فرصت و مکانش را ندارند. بعضی ها هم پولکی هستند اگر حرف $ به میان بیاید با کله می آیند. بنظرم ایجاد یک فرام، علاوه بر ایجاد حس رقابت میان اعضای فعال، مشکل دوستان رده دوم را کمی حل می کند. اشتراک اطلاعات حداقل مزیتش این است که از قافله عقب نمی افتی. اگر کسی از دوستان ایده ای دارد مطرح کند.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/10/08/css_validator_colour_warnings_are_not_errors/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>شگردهای CSS (قسمت اول)</title>
		<link>https://weblog.alvanweb.com/2006/09/24/css-tricks-part-one/</link>
					<comments>https://weblog.alvanweb.com/2006/09/24/css-tricks-part-one/#comments</comments>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sun, 24 Sep 2006 15:59:42 +0000</pubDate>
				<category><![CDATA[سی اس اس]]></category>
		<category><![CDATA[طراحی وب]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/09/24/css-tricks-part-one/</guid>

					<description><![CDATA[گاهی اوقات به نکات و شگردهای جالبی در مورد کار با عناصر CSS برمی خورم. چه از طریق وب چه تجربه شخصی، مطالعه کتاب و گاهی وقت ها هم با وارسی فایل های سی اس اس حرفه ای ها، در الگو هایی که برای آموزش ارائه می دن. از اونجایی که این نکات منظم و [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>گاهی اوقات به نکات و شگردهای جالبی در مورد کار با عناصر CSS برمی خورم. چه از طریق وب چه تجربه شخصی، مطالعه کتاب و گاهی وقت ها هم با وارسی فایل های سی اس اس حرفه ای ها، در الگو هایی که برای آموزش ارائه می دن. از اونجایی که این نکات منظم و مرتب نیست و هر نکته ای رو یه جا فهمیدم و بکار بردم،  انتظار اینکه بیام سلسله وار و منظم لیستشون کنم یه خورده بی انصافیه (البته اگر وقتم مهلت می داد حتما همچین کاری می کردم) تصمیم گرفتم پست هایی رو تحت نام شگردهای CSS شروع کنم تا به هر تکنیکی رسیدم فوری پست کنم تا نه من یه وقتی یادم بره و نه خدای نکرده شما بی نصیب بمونید. البته این نکته هم قابل ذکره که شاید اینا از دید شما که استادید یه تکنینک محسوب نشه و بیشتر حالت امپریکال داشته باشه، چرا که مو به مو همه چیز شرح داده شده تا مبتدی هم درک کنه. خلاصه به بزرگی خودتون ببخشید. خوب بریم سراغ تکنیک این پست:</p>
<p><strong>تغییر سایز متن بدون استفاده از واحد پیکسل</strong><br />
(در این پست سعی می کنم بیشتر در مورد تایپوگرافی بنویسم) قدیما هر وقت طرح های حرفه ای رو نگاه می کردم می دیدم بیشترشون برای سایز متن ها از واحد <acronym title="Printing a unit for measuring the width of printed matter, equal to the height of the type size being used">em</acronym> بجای px استفاده می کنن. حالا دلیل این کار بماند آخر مقاله؟ اما جالب اینجا بود که اگر المانی رو که مثلا اندازش 12px بود رو می خواستی معادل کنی به واحد em بجاش می نوشتن 1.2em یعنی تقسیم بر ده می کردنش. کار ساده ای به نظر می رسید. ما هم گفتیم همه المان هایی که به واحد پیکسل هستند رو بر ده تقسیم و بجاش از em استفاده می کنیم. ولی دیدم خیلی  سایزش متفاوت شد. دو تا کلاس ساده به شکل زیر ایجاد کنید: <span id="more-118"></span></p>
<pre class="brush: xml; title: ; notranslate">&lt;div class=&quot;test1&quot;&gt;Hello Morteza&lt;/div&gt;
&lt;div class=&quot;test2&quot;&gt;Hello Morteza&lt;/div&gt;</pre>
<p>این هم سورس سی اس اس کلاس ها، یکی سایز فونتش به واحد px و دیگری به واحد em<br />
(نوع فونت هم مهم نیست):</p>
<pre class="brush: css; title: ; notranslate">.test1 { font-size: 1.5em; }
.test2 { font-size: 15px; }</pre>
<p>اگر مدل بالا رو امتحان کنید نتیجه دو نوع نوشته با فونت سایزهای متفاوت خواهد بود. (یقینا نوع مرورگر هم بی تاثیر است). برای حل مشکل فوق تنها کافیه برای مشخصه body در فایل سی اس اس، سایز فونت رو برابر با 62.5% قرار بدین. به غیر از این عدد هر عددی رو که انتخاب کنید دو سایز با هم متفاوت خواهند بود. (البته این حالت هم مقدار ناچیزی خطا داره که به چشم نمیاد) کد زیر رو به فایل سی اس اس خودتون انتقال و نتیجه رو مشاهده کنید:</p>
<pre class="brush: css; title: ; notranslate">body { font-size: 62.5%; }</pre>
<p>پس هر جا دیدید طرف اندازه فونت رو در body برابر 62.5 درصد قرار داده، تعجب نکنید این از کجا اومد. اما چرا بجای px از em استفاده کنیم؟ ببینید اگر جهان وب یک نمونه ایده آل و یکسان بود یقینا از پیکسل استفاده می کردیم. اما این جور نیست، ما مرورگرهایی داریم که برخی فرآیندها رو نقض می کنن. اینترنت اکسپلرر ویندوز (IE/Win) به خوانندگانش اجازه نمی ده که المان هایی رو که سایزشون بر مبنای واحد پیکسل تنظیم شده، تغییر اندازه بدن. همون مثال فوق رو در نظر بگیرید هر دو واحد رو مثلا به 15px بنویسید در IE به منوی Viwe و از اونجا Text Size رو تغییر بدین، آیا تغییری مشاهده می کنید؟!</p>
<p>چه لزومی داره که خوانندگان فونت نوشته رو تغییر سایز بدهند؟ شاید خواننده ای نزدیک بین باشه، شاید از این لب تاب های خنده دار با رزولیشن بالا استفاده کنه یا واقعا با سایزی که شما انتخاب کردید چشمهاش خسته بشه. بنابراین مگر اینکه شما بدانید (فکر نکنید) که مخاطبان شما از IE استفاده نمی کنن یا هرگز تمایل ندارند سایز نوشته هایتان را تغییر بدهند. اما وقتی از em استفاده می کنید قابلیت تغییر سایز متن برای همه مروگرها وجود خواهد داشت.</p>
<p><strong>کمی آن طرف تر:</strong><br />
نمی دونم تا چه حد با مفاهیم parent و child در المان های آشنا هستید. اما همین قدر بدونید که المان هایی که تحت یک المان دیگه واقع می شن یا به عبارتی زیر مجموعه ای از سری بالاتر قرار می گیرند child و خود سری اصلی رو parent می نامند. بنظرم این مفاهیم آشنا باشه و نیازی به شرح بیشتر نیست. تنها برای روشن تر شدن قضیه مثال زیر رو در نظر بگیرید:</p>
<pre class="brush: xml; title: ; notranslate">&lt;div id=&quot;page&quot;&gt;
&lt;h1&gt;Hello Morteza&lt;/h1&gt;
&lt;/div&gt;</pre>
<p>در الگوی بالا مشخصه page رو parent و تگ عنوان H1 رو child تعریف می کنیم. در مرورگرهایی که مبنی بر موزیلا (Mozilla) هستند هرگاه المان های عنوان یا سر فصل نظیر h1، h2 تا h6 یا بعبارتی   heading elements ها به عنوان child در نظر گرفته بشن، فونت سایز المان parent رو به ارث می برند. اما سایر مرورگرها از این متد تبعیت نمی کنند و heading ها رو در اندازه های متفاوت نشون می دن. راه حل همه اینه که بیایم به المان های عنوان ها فونت سایزهای از پیش تععین شده نسبت بدیم. اما اینکه چه سایزی رو بر حسب واحد em انتخاب کنیم کمی مشکل خواهد بود.</p>
<p> فرض کنید در مثال بالا سایز فونت المان page برابر 12px باشه. شما می خواهید عنوان h1 فونت سایزی برابر 24px داشته باشه. چکار کنیم؟ چه طور بر حسب em تبدیلش کنیم؟ حتما می گید تقسیم بر ده می کنیم و بجاش می نویسیم 2.4em البته 62.5% رو هم در   body  لحاظ می کنیم. نه این اشتباهه ! امتحان کنید چرا که فونت سایز المان h1 تحت تاثیر فونت سایز المان page قرار خواهد گرفت. برای اینکه این واحد را به em معادل کنید یه فرمول خیلی جالب هست و اون اینکه فونت سایز المان child رو بر مبنای px بر فونت سایز المان   parent بر مبنای px تقسیم می کنیم، فونت سایز المان child بر مبنای em بدست خواهد آمد. یعنی در این مثال فونت سایز المان h1 رو که به عنوان child لحاظ شده (عدد 24 پیکسل) بر فونت سایز المان page که به عنوان parent واقع شده (عدد 12 پیکسل) تقسیم می کنیم در نهایت فونت سایز المان h1 برمبنای em به صورت  2em خواهد بود.</p>
<p>موضوع رو گرفتید؟! امیدوارم. حرف هایی که بالا زده شد در مورد المان های تیتر یا عنوان یا همان heading ها بود. برای درک بیشتر موضوع به سراغ لیست آیتم ها ( آیتم های لیست شده) می رویم. قاعده زیر را در نظر بگیرید این به ما می گوید که تمام آیتم هایی که در زیر مجموعه المان page قرار دارند باید سایزشان 10px باشد. (فراموش نکنید فونت سایز المان page همان 12px مثال بالا در نظر گرفته شده است)</p>
<pre class="brush: css; title: ; notranslate">#page li { font-size:0.8333em }</pre>
<p>چرا 10px؟ طبق فرمول 10px تقسیم بر 12px می شود 0.8333 em اما به نظر شما وقتی یک لیست در زیر مجموعه یک لیست دیگر قرار بگیرد چه اتفاقی خواهد افتاد؟ کوچکتر خواهد شد اما چرا؟ چون قاعده بالا به ما می گه هر لیست آیتمی که در زیر مجموعه المان page واقع بشه، باید 0.8333 ام سایز المان parent خودش باشه. بنابراین دوباره ما به یک قاعده ای  نیاز داریم که تاثیر این کاهش ارثی رو از بین ببره.  الگوی زیر این کار رو انجام می ده:</p>
<pre class="brush: css; title: ; notranslate">li li {font-size:1em}</pre>
<p>این به ما می گه که هر لیست آیتمی که در زیر مجموعه یه لیست آیتم دیگر واقع شد، باید سایزی یکسان با parent خودش داشته باشه. بهتره برای جلوگیری از آشفتگی و سر درگمی طرح از همون اول یک قاعده برای تمامی انتخابگر های child ای که استفاده می کنید به شکل زیر لحاظ کنید:</p>
<pre class="brush: css; title: ; notranslate">li li, li P, TD P, BLOCKQUOTE P {
font-size:1em
}</pre>
<p>اگر این پست رو تا آخر خوندین و چیزی هم یاد گرفتید یا از قبل یاد داشتید و از یادتون رفت حتما در نظرات مطرح کنید تا کیفیت مطالب رو تغییر بدم. اگر قسمتی از این پست رو هم متوجه نشدین همین جا مطرح کنید بهتر از ایمیل زدن خواهد بود. موفق باشید.</p>
<ul class="intro" style="direction:ltr">
<li style="text-align:left">+ <a href="http://www.clagnut.com/blog/348/">How to size text using ems</a><br />
+ <a href="http://mondaybynoon.com/2006/03/13/effective-style-with-em/">Effective Style with em</a><br />
+ <a href="http://www.bigbaer.com/css_tutorials/css_font_size.htm">CSS Font Size Explained</a><br />
+ <a href="http://www.meyerweb.com/eric/articles/webrev/199912.html">Font Sizing by Eric Meyer</a><br />
+ <a href="http://www.sitepoint.com/forums/showthread.php?threadid=389839">Sitepoint Forums: Best Practice for font-size</a><br />
+ <a href="http://www.webmasterworld.com/forum83/5632.htm">Webmaster world forums: PX to em</a> and <a href="http://www.google.com/search?sourceid=navclient-ff&#038;ie=UTF-8&#038;rls=GAPB,GAPB:2005-09,GAPB:en&#038;q=em+or+px%3F+font+size">more</a> </li>
</ul>
<p>+ لیست منابعی که در این آموزش بیشتر کمکتان خواهند کرد.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://weblog.alvanweb.com/2006/09/24/css-tricks-part-one/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>نمره بیست فارسی سازی</title>
		<link>https://weblog.alvanweb.com/2006/09/23/no20-in-localization/</link>
		
		<dc:creator><![CDATA[مرتضی الوانی]]></dc:creator>
		<pubDate>Sat, 23 Sep 2006 08:24:50 +0000</pubDate>
				<category><![CDATA[مطالب روزمره]]></category>
		<guid isPermaLink="false">http://weblog.alvanweb.com/2006/09/23/no20-in-localization/</guid>

					<description><![CDATA[فارسی سازی، فارسی ساز و کلماتی مشابه! اگر سر زبانتان نیامده حتما به گوشتان خورده است. امروز پیشرفته ترین وسایل الکترونیکی و دیجیتالی ساخت خارج (یا مونتاژ داخل) مان منوی فارسی هم دارند. جای دوری نرویم نرم افزارها هم منوی فارسی دار می شوند. مگر ایرادی دارد؟ واقعا جای شرمندگی است که وسایل دیجیتالی با [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>فارسی سازی، فارسی ساز و کلماتی مشابه! اگر سر زبانتان نیامده حتما به گوشتان خورده است. امروز پیشرفته ترین وسایل الکترونیکی و دیجیتالی ساخت خارج (یا مونتاژ داخل) مان منوی فارسی هم دارند. جای دوری نرویم نرم افزارها هم منوی فارسی دار می شوند. مگر ایرادی دارد؟ </p>
<p>واقعا جای شرمندگی است که وسایل دیجیتالی با آخرین امکانات و تکنولوژی های روز، از خارج وارد، و در کشور ما فقط منو فارسی می شوند. تنها هنرمان همین است و به آن افتخار هم می کنیم که آقا ما فلان وسیله رو داریم منو فارسی هم داره ها. بنظرم اگر برای ایده ها و طرح هایی که مطرح می شد و می شود بستر سازی مناسب می شد، الان اینجای کار نبودیم. باید فقط ببینیم که آن ور آبی ها ایده هایمان را مفت مفت می خرند و بکار می گیرند و خودمان از ته دل آه بکشیم.<br />
کلی حرف اینجاست این چند خط رو هم نوشتم تا امروز یادم نره &#8230;</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
