<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>یادداشتهای بیت نیمسوز</title>
	
	<link>http://cyberrabbits.net</link>
	<description>یک وبلاگ دیگر از یک برنامه نویس دیگر</description>
	<lastBuildDate>Mon, 25 Mar 2013 10:48:05 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cyberrabbits/posts" /><feedburner:info uri="cyberrabbits/posts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:emailServiceId>cyberrabbits/posts</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>tail و باقی قضایا</title>
		<link>http://cyberrabbits.net/1242/tail-and-other-stories/</link>
		<comments>http://cyberrabbits.net/1242/tail-and-other-stories/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 10:48:05 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[log.io]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[multitail]]></category>
		<category><![CDATA[tail]]></category>
		<category><![CDATA[لینوکس]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1242</guid>
		<description><![CDATA[قبلا درباره Log.io نوشته بودم. ابزار خوبیه ولی خوب سربار زیادی داره. دو تا پروسه، و یه بروزر که به تدریج مصرف رمش میره بالا :) خوب اینه که من مدتهاست استفاده از اونو کنار گذاشتم. ولی حقیقتا خیلی لازمم میشه که یه سری فایل رو مانیتور کنم. multitail گزینه خوبیه و اکثرا کارمو راه [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1093/log-io/' rel='bookmark' title='Log.io'>Log.io</a> <small>خیلی وقتها هست که لازمه یک سری فایل Log رو...</small></li>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
<li><a href='http://cyberrabbits.net/411/mysql-menu-part-3/' rel='bookmark' title='Mysql Menu قسمت سوم'>Mysql Menu قسمت سوم</a> <small>چند وقت پیش در باره منو و طریقه ایجاد آن...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>قبلا <a href="http://cyberrabbits.net/1093/log-io/">درباره Log.io نوشته بودم</a>. ابزار خوبیه ولی خوب سربار زیادی داره. دو تا پروسه، و یه بروزر که به تدریج مصرف رمش میره بالا :) خوب اینه که من مدتهاست استفاده از اونو کنار گذاشتم.<br />
ولی حقیقتا خیلی لازمم میشه که یه سری فایل رو مانیتور کنم. multitail گزینه خوبیه و اکثرا کارمو راه میندازه. ولی مشکلی که داره اینه که کنترلی روی خروجی نداری. مثلا اگه در حال مانیتور کردن mysql هستی و فقط میخوای که کوئری های INSERT رو داشته باشی راه ساده‌ای وجود نداره. میشه گیک بازی درآورد ولی خوب،‌تا زمانی که tail اصلی کارمو راه میندازه کی میره این همه راهو!!</p>
<p>خوب قضیه خیلی سادست. اینطوری :<br />
 <pre class="crayon-plain-tag">tail -f /path/to/filename</pre><br />
لازمه بگم که من اصلا از سوییچ f خبر نداشتم و یه بار اتفاقی بهش برخوردم اونم یه بار که داشتم دنبال یه سوییچ دیگه میگشتم تو man ؟؟؟<br />
خوب، <a href="http://dev.mysql.com/doc/refman/5.1/en/query-log.html">با فعال کردن Log توی MySql </a> حالا وقتشه که فایل رو با tail مانیتور کنیم (فرض کنین فایل مورد نظر من اینه : /var/lib/mysql/elbix-home.log</p>
<p>و من فقط کوئریهایی میخوام که Execute شدن و همه غیر از اونهایی که با SELECT شروع شدن. (خوب نمیخوام SELECT وسط کوئری نادیده گرفته بشه مثلا برای INSERT INTO SELECT ) کوئری هایی که Prepare هم شدن نمیخوام (توی C++ برخلاف PHP کار Prepare کردن و گذاشتن پارامترها رو خود mysql انجام میده )‌<br />
قاعدتا باید چنین خطی جواب بده : </p>
<p></p><pre class="crayon-plain-tag">tail -f /var/lib/mysql/elbix-home.log  | sed 's/^[ 0-9:]*//g' | grep "Execute\|Query" | cut -d" " -f2- | grep -iv "^select"</pre><p> </p>
<p>ولی نمیدونم چرا وقتی تعداد پایپها بیشتر از یکی میشه جواب نمیده. یعنی به پایپ دومی هیچی نمیرسه (sed اولی درست کار میکنه ولی grep اصلا ورودی نداره! نمیدونم باگه یا چی ولی زیاد مهم نیست. )خوب برای اون هم راه حل ساده ای هست. کافیه یه اسکریپت ساده بسازم که کار فیلتر رو برام انجام بده : </p>
<p></p><pre class="crayon-plain-tag">#!/bin/bash                                                                  

while read line;
do
    echo $line | sed 's/^[ 0-9:]*//g' | grep "Execute\|Query" | cut -d" " -f2- | grep -iv "^select"

done;&lt;/dev/stdin</pre><p>باقیش هم سادست، اسم اسکریپت رو مثلا میزارم echoback.sh و توی پوشه خانگیم میذارمش، بعد این دستور رو اجرا میکنم : </p>
<p></p><pre class="crayon-plain-tag">tail -f ./elbix-home.log | ~/echoback.sh</pre><p> </p>
<p>باقیش هم که میتونید حدس بزنید :)))‌</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1242/tail-and-other-stories/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1093/log-io/' rel='bookmark' title='Log.io'>Log.io</a> <small>خیلی وقتها هست که لازمه یک سری فایل Log رو...</small></li>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
<li><a href='http://cyberrabbits.net/411/mysql-menu-part-3/' rel='bookmark' title='Mysql Menu قسمت سوم'>Mysql Menu قسمت سوم</a> <small>چند وقت پیش در باره منو و طریقه ایجاد آن...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/UCLdjKt0dIE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1242/tail-and-other-stories/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>تبریک سال نو</title>
		<link>http://cyberrabbits.net/1238/happy-new-year-3/</link>
		<comments>http://cyberrabbits.net/1238/happy-new-year-3/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 17:39:46 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[تبریک]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1238</guid>
		<description><![CDATA[بر خلاف یه عده ای که هی میگن من به سال نو حسی ندارم و فلان و بهمان، من برای سال نو ارزش قائلم،‌ به هر چیزی که این ملت غمگین رو شاد کنه، اعتقاد دارم :) حتی اگه اون چیز کلاه قرمزی باشه،‌و باعث بشه مردم شاد بشن، منم ازش لذت میبرم. سال نو [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/839/happy-new-year-2/' rel='bookmark' title='سال نو مبارک'>سال نو مبارک</a> <small>اول از همه سال نو مبارک. شروع دهه هم هست...</small></li>
<li><a href='http://cyberrabbits.net/249/happy-new-year/' rel='bookmark' title='سال نو مبارک'>سال نو مبارک</a> <small>فقط خواستم بگم سال نو مبارک. سال نو که شد...</small></li>
<li><a href='http://cyberrabbits.net/962/mafia-irc-php/' rel='bookmark' title='ربات مافیا &#8211; PHP'>ربات مافیا &#8211; PHP</a> <small>بازی مافیا رو اولین بار وقتی دانشجو بودیم انجام دادم...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>بر خلاف یه عده ای که هی میگن من به سال نو حسی ندارم و فلان و بهمان، من برای سال نو ارزش قائلم،‌ به هر چیزی که این ملت غمگین رو شاد کنه، اعتقاد دارم :) حتی اگه اون چیز کلاه قرمزی باشه،‌و باعث بشه مردم شاد بشن، منم ازش لذت میبرم. </p>
<p>سال نو مبارک!</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1238/happy-new-year-3/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/839/happy-new-year-2/' rel='bookmark' title='سال نو مبارک'>سال نو مبارک</a> <small>اول از همه سال نو مبارک. شروع دهه هم هست...</small></li>
<li><a href='http://cyberrabbits.net/249/happy-new-year/' rel='bookmark' title='سال نو مبارک'>سال نو مبارک</a> <small>فقط خواستم بگم سال نو مبارک. سال نو که شد...</small></li>
<li><a href='http://cyberrabbits.net/962/mafia-irc-php/' rel='bookmark' title='ربات مافیا &#8211; PHP'>ربات مافیا &#8211; PHP</a> <small>بازی مافیا رو اولین بار وقتی دانشجو بودیم انجام دادم...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/wixVSlOSqN8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1238/happy-new-year-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>افزونه ای برای XChat</title>
		<link>http://cyberrabbits.net/1228/xchat-plugin-regex-hilight/</link>
		<comments>http://cyberrabbits.net/1228/xchat-plugin-regex-hilight/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 07:24:23 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[hilight]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[xchat]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1228</guid>
		<description><![CDATA[خوب قضیه از این قراره که من از XChat استفاده میکنم و تقریبا همیشه برنامش بازه و میخوام تحت یه سری شرایط خاص بهم Notify بده. مثلا وقتی کسی منو پینگ میکنه،‌با وجود اسم من توی نوشته خود به خود هشدار داده میشه. ولی من یه سری چیز دیگه هم لازم داشتم و اگه بگم [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/655/my-copyfixer/' rel='bookmark' title='افزونه My Copyfixer برای فایرفاکس'>افزونه My Copyfixer برای فایرفاکس</a> <small>خیلی با مزست :) دومین باره که از این وبلاگ...</small></li>
<li><a href='http://cyberrabbits.net/625/similar-words/' rel='bookmark' title='کلمات مشابه'>کلمات مشابه</a> <small>گاهی لازم میشه که شما میخواید از توی یه لیست...</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>خوب قضیه از این قراره که من از XChat استفاده میکنم و تقریبا همیشه برنامش بازه و میخوام تحت یه سری شرایط خاص بهم Notify بده.<br />
مثلا وقتی کسی منو پینگ میکنه،‌با وجود اسم من توی نوشته خود به خود هشدار داده میشه. ولی من یه سری چیز دیگه هم لازم داشتم و اگه بگم لازم داشتم به این دلیل که فقط جالب بود برام، بهتره.<br />
میخواستم یه جوری باشه که وقتی با یه الگوی خاص یه نوشته ظاهر شد، به من هشدار بده. مثلا فرود فـرود و یا حتی فــــرود. و یه سری اصطلاح دیگه.<br />
خوب یه افزونه پیدا کردم <a href="http://wiki.control-d.com/index.php?title=Hilightphrase">اینجا</a> و یه کم تغییرش دادم که با Regex هم کار کنه. نتیجه شد این :‌</p>
<p></p><pre class="crayon-plain-tag">__module_name__ = 'hilight-regex'
__module_description__ = 'XChat notification and hilighting on regex'
__module_version__ = '1.0'

import xchat, re

CONFFILE = xchat.get_info('xchatdir') + '/hilight-regex.conf'
list=[]

xchat.prnt('%(name)s, version %(version)s' % {'name': __module_name__,  'version': __module_version__})

def read_list():
    try:
        conf = open(CONFFILE,'r')
    except:
        xchat.prnt(CONFFILE + " currently doesn't exist, creating")
        return None
    lines = conf.readlines()
    for each in lines:
        list.append(re.sub(r'\n','',each))
    conf.close()


def save_list():
    conf = open(CONFFILE,'w')
    for phrase in list:
        conf.write(phrase + '\n')
    conf.close()


def check_msg(word, word_eol, userdata):

    for phrase in list:
        try :
            if re.search(phrase, word_eol[1]):
                xchat.command("gui color 3")
                xchat.emit_print( "Channel Msg Hilight", word[0], word[1] )
                return xchat.EAT_ALL
        except:
            None;

    return xchat.EAT_NONE


def add_hilight_phrase(word, word_eol, userdata):
    if len(word) &lt;= 2:
        return list_hilight_phrase(word, word_eol, userdata)
    phrase = word_eol[2]
    if phrase not in list:
        try :
            list.append(phrase)
            xchat.prnt('\x032* "%s" will be hilighted' % phrase)
        except :
            xchat.prnt('\x032* "%s" is not valid regular expersion, ignored' % phrase)
    else:
        xchat.prnt('\x032* "%s" is already being hilighted' % phrase)
    save_list()
    return xchat.EAT_XCHAT


def list_hilight_phrase(word, word_eol, userdata):
    xchat.command('query @hilight')
    tab = xchat.find_context(channel='@hilight')
    tab.prnt('\x032Current hilight-phrase list: %d hilighted.' % len(list))
    for index, phrase in enumerate(list):
        tab.prnt('\x032 %s -- %s' % (index, phrase))
    tab.prnt('\x032* End of hilight-phrase list')
    return xchat.EAT_XCHAT


def remove_hilight_phrase(word, word_eol, userdata):
    if len(word) &lt;= 2:
        return list_hilight_phrase(word, word_eol, userdata)
    index = int(word[2])
    if index &gt;= 0 and index &lt; len(list):
        xchat.prnt('\x032 "%s" has been removed from the hilight list' % list[index])
        del list[index]
    else:
        xchat.prnt('\x032 %d is not a valid selection' % index)

    save_list()
    return xchat.EAT_XCHAT

def help_list(word, word_eol, userdata):
    xchat.command('query @hilight')
    tab = xchat.find_context(channel='@hilight')
    tab.prnt('/hilight add &lt;phrase&gt; - add &lt;phrase&gt; to list of strings to highlist')
    tab.prnt('/hilight list - print current list of strings to highlight')
    tab.prnt('/hilight rm &lt;index&gt; - remove list item #&lt;index&gt; from list of strings to hightlist')
    tab.prnt('/hilight help - print this message')
    return xchat.EAT_XCHAT


def choose(word, word_eol, userdata):
    if len(word) == 1:
        return help_list(word, word_eol, userdata)
    command = word[1]
    if command == "add": return add_hilight_phrase(word, word_eol, userdata)
    if command == "rm": return remove_hilight_phrase(word, word_eol, userdata)
    if command == "list": return list_hilight_phrase(word, word_eol, userdata)
    if command == "help": return help_list(word, word_eol, userdata)

    xchat.prnt("unknown option: %s, use '/hilight help' for help" % command)

    return xchat.EAT_XCHAT


read_list()
xchat.hook_command("hilight", choose)
xchat.hook_print("Channel Message", check_msg)</pre><p> </p>
<p>این کد رو تو یه فایل با پسوند py توی پوشه <code>$HOME/.xchat2</code> ذخیره کنید (پوشه خانگی کاربرتون پوشه دات xchat). (یا اگه فقط میخواید تستش کنید، از منوی Window/Plugin and Scripts استفاده کنید.)‌<br />
حالا با راه اندازی مجدد xchat بزنید<br />
<code>/hilight help</code><br />
اسلش hilight فعلا با GPRS کذایی هستم و نمیشه استیل رو اصلاح کنم که درست نشونش بده :)</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1228/xchat-plugin-regex-hilight/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/655/my-copyfixer/' rel='bookmark' title='افزونه My Copyfixer برای فایرفاکس'>افزونه My Copyfixer برای فایرفاکس</a> <small>خیلی با مزست :) دومین باره که از این وبلاگ...</small></li>
<li><a href='http://cyberrabbits.net/625/similar-words/' rel='bookmark' title='کلمات مشابه'>کلمات مشابه</a> <small>گاهی لازم میشه که شما میخواید از توی یه لیست...</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/h1lyfWnW96w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1228/xchat-plugin-regex-hilight/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>اسکریپت نصب فونت فارسی – انتشار دوباره</title>
		<link>http://cyberrabbits.net/1218/farsi-font-installer-github/</link>
		<comments>http://cyberrabbits.net/1218/farsi-font-installer-github/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 12:30:25 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Farsi]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1218</guid>
		<description><![CDATA[وقتی برای اولین بار اسکریپت نصب فونت فارسی رو نوشتم، بیشتر برام یه شوخی بود :)) میخواستم یه سری چیز رو تست کنم، اسکریپت نویسی رو تازه داشتم انجام میدادم خوب به هر صورت مشکل زیاد داشت. تو طول این یکی دوسال، نصف بیشتر ورودیهای وبلاگم هم همین بود، و حالا وقتشه که آزادش کنم. [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
<li><a href='http://cyberrabbits.net/1182/publish-using-git/' rel='bookmark' title='انتشار با کمک git'>انتشار با کمک git</a> <small>وقتی برای اولین بار یک سایت رو آنلاین میکنی مشکل...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>وقتی برای اولین بار اسکریپت نصب فونت فارسی رو نوشتم، بیشتر برام یه شوخی بود :)) میخواستم یه سری چیز رو تست کنم، اسکریپت نویسی رو تازه داشتم انجام میدادم خوب به هر صورت مشکل زیاد داشت.<br />
تو طول این یکی دوسال، نصف بیشتر ورودیهای وبلاگم هم همین بود، و حالا وقتشه که آزادش کنم. (نه اینکه کد رو آزاد کنم، قبلا آزاد بود GPL3 بود) بلکه منظورم این بود که بفرستمش روی گیتهاب. </p>
<p>وقتی یه کدی رو دوست داری، بفرستش روی گیتهاب :) </p>
<p>خوب قبلا درباره <a href="http://cyberrabbits.net/1129/github-as-cdn/">استفاده از گیتهاب به عنوان CDN </a>نوشتم، حالا میخوام از همین استفاده کنم و این اسکریپت رو بفرستم اونجا. فایلها دیگه میرن رو همین فضا، جز تاهوما که به نظرم ممکنه مشکل لیسانس داشته باشه و از همون جای قبلی دانلود میشه. </p>
<p>خوب، این <a href="https://github.com/fzerorubigd/persian-fonts-linux">لینک پروژه توی گیتهاب.  </a></p>
<p>خوشحال میشم همونجا ایراداتش رو بگید (<a href="https://github.com/fzerorubigd/persian-fonts-linux/issues">اینجا</a>) و فورکش کنید، اصلاحش کنید یا اگه احساس میکنید چیزی لازمه اضافه بشه بهش، اضافه کنید. </p>
<p>اگه وقت کنم، یه صفحه به عنوان ایندکس براش طراحی میکنم و آدرسش میشه این : <a href='http://fzerorubigd.github.com/persian-fonts-linux/' title='فونت فارسی برای لینوکس'>فونت فارسی برای لینوکس</a></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1218/farsi-font-installer-github/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
<li><a href='http://cyberrabbits.net/1182/publish-using-git/' rel='bookmark' title='انتشار با کمک git'>انتشار با کمک git</a> <small>وقتی برای اولین بار یک سایت رو آنلاین میکنی مشکل...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/hK8l7fZDhlw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1218/farsi-font-installer-github/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>چرا گنو/لینوکس رو دوست دارم؟</title>
		<link>http://cyberrabbits.net/1188/why-i-love-gnu-linux/</link>
		<comments>http://cyberrabbits.net/1188/why-i-love-gnu-linux/#comments</comments>
		<pubDate>Sun, 13 Jan 2013 14:06:23 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[whyilovelinux]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1188</guid>
		<description><![CDATA[نمیخوام درباره آزادی بگم. اون خیلی دلیل مهمیه، دلیل اصلی من هم هست، ولی گفتنش تکرار بیخودیه، اونو همه میدونیم. میرم سراغ دلیل دومم که کمتر از همین آزادی نیست و البته یه جورایی از همین آزادی نتیجه میشه. بحث گیک بازی هم نیست. که مثلا چه کارهایی میشه با لینوکس انجام داد، قبلا دربارشون [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/932/videocast-ii-pipes/' rel='bookmark' title='ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی'>ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی</a> <small>و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من،...</small></li>
<li><a href='http://cyberrabbits.net/365/arch-linux/' rel='bookmark' title='آرچ لینوکس، دیسترویی که میشناسمش'>آرچ لینوکس، دیسترویی که میشناسمش</a> <small>چند روزی هست که درگیر لینوکس بودم و نصب آرچ...</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>نمیخوام درباره آزادی بگم. اون خیلی دلیل مهمیه، دلیل اصلی من هم هست، ولی گفتنش تکرار بیخودیه، اونو همه میدونیم. میرم سراغ دلیل دومم که کمتر از همین آزادی نیست و البته یه جورایی از همین آزادی نتیجه میشه. بحث گیک بازی هم نیست. که مثلا چه کارهایی میشه با لینوکس انجام داد، قبلا دربارشون نوشتم. نه، دست کم اینبار نمیخوام اینطوری ببینم قضیه رو. دوست دارم چیزی رو به اشتراک بذارم که نتیجه (شاید بشه گفت بهش) تجربست. </p>
<p><strong>و اما دلیل من:</strong> احساس امنیت. من با گنو/لینوکس احساس امنیت میکنم.<br />
 نه نه نه. اصلا منظورم ویروس و این بحثها نیست. اونها همه جا وجود دارن. گنو/لینوکس هم میتونه دچار مشکل بشه، با احتمالی خیلی خیلی خیلی کمتر از ویندوز، ولی ممکنه.<br />
بهتره از قدیمتر شروع کنم!</p>
<p><em> <strong>هشدار</strong>، از این قسمت نوشته، میخوام یه سری تجربیات شخصی رو بگم، ممکنه با تجربیات شما همخوانی نداشته باشه، ولی به هر حال تجربه منه. ذکر اونها در اینجا، به معنی طلب راهنمایی نیست. اصلا دوست ندارم کسی بگه، فلان موقع میتونستی فلان کارو بکنی که جلوی بهمان اتفاقو بگیری. من همه این تجربه ها رو دوست داشتم، شاید اگه می‌تونستم عوضشون میکردم، ولی حالا که نمیتونم پس فکرشم نمیکنم. </em></p>
<p>۱- من خیلی سال پیش فهمیدم که دوست دارم برنامه نویس بشم. از<a href="http://en.wikipedia.org/wiki/GW-BASIC" target="_blank"> GW-BASIC</a> شروع کردم. بعدش <a href="http://en.wikipedia.org/wiki/QBasic" target="_blank">QBasic</a> و بعد ویژوال بیسیک چهار (در حد یکی دو هفته تا بتونم نسخه ۶ رو گیر بیارم. چی فکر کردین؟ سفارش دادم یکی از دوستام از شیراز برام پست کرد :)) )، و بعد ۶. تا سال ۲۰۰۰ با همینها سرگرم بودم و بعد به این نتیجه رسیدم که کافی نیستن. روز اول سال ۲۰۰۰ تعطیل بود، فکر کنم اصلا تعطیل اعلام کردنش به خاطر اون شایعاتی که بود، ولی مارو کشوندن دانشگاه برای کلاس جبرانی ریاضی مهندسی، و من همون روز تصمیم گرفتم برم سراغ <a href="http://en.wikipedia.org/wiki/Embarcadero_Delphi" target="_blank">دلفی</a>.</p>
<p>خودم میخواستم <strong>تغییر</strong> کنم. خوب بود، هنوزم در یه شرایط کنترل شده خوبه، ولی هزینه داشت و داره. اون موقع خیلی کمتر از هزینه تغییرهای الانم.</p>
<p>۲- طول کشید تا تصمیمم رو عملی کنم. سخت بود. ولی وقتی MS رفت سراغ دات نت، خیلی کارم راحت‌تر شد (به هر حال همه چی عوض شده بود) و سر از دلفی درآوردم. اول دلفی ۵، هرگز از دلفی ۶ استفاده نکردم، چون تغییراتی توی ساختار کامپوننتها داده شده بود که یه مدت طول کشید تا جا بیفته، و بعد دلفی ۷. سالها با دلفی ۷ مشغول بودم.<br />
ولی تغییرات کمپانی بورلند شروع شد، افتاد پشت سر MS و دلفی ۸ یه فاجعه بود (لازمه بگم فقط دات نت داشت؟). دلفی ۹ بهتر بود، ولی هنوز فاجعه بود، و همون موقع ویندوز ویستا قرار بود همه گیر بشه، یه سری چیزها توی دلفی ۷ نبود، یه سری آدم سرخوش نشستن یه سری انگولک کردن، ولی نشد. بورلند مرد، دلفی اما زنده موند و زندست هنوز، این چند سال خیلی زیاد بود و من فقط برای یه بار زندگی کردن وقت داشتم. این شد که تصمیم گرفتم برم سراغ چیز دیگه‌ای، و PHP رو انتخاب کردم.</p>
<p>۳- خیلی طول نکشید که PHP منو غرق کرد. یهو به خودم اومدم و دیدم دلفی رو دیگه احتیاج ندارم. بعد متوجه شدم که باید XP رو بذارم کنار، ولی ویستا مسخره بود، و سون هم روی سیستم قدیمی من جواب نمیداد. (محض کامل‌تر شدن قضیه، اون سیستم هنوز داره کار میکنه به عنوان یک نسخه پشتیبان خانگی از همه چی ، نیازی به بیشتر از اون نداشتم تا الان!) خوب تصمیمو چند وقتی بود که گرفته بودم، یه مدت برنامه‌هامو سوییچ کردم به برنامه‌های آزاد. OpenOffice &#8211; Pidgin و هر چیزی که معادل آزاد داشت رو روی ویندوز استفاده کردم و آخرش هم روزی که بیتا بدنیا اومد، به طور کامل ویندوز رو پاک کردم و کلا مهاجرت کردم به لینوکس. -سرخوشم دیگه! الی همیشه میگه، ولی تصمیم داشتم با تولد بیتا اینکارو بکنم، پس وقتی دو هفته زودتر از موعد اومد، منم خیلی عجله‌ای اینکارو کردم. باید انجام میشد :) -</p>
<p>۴- سالهاست که دارم با لینوکس کار میکنم. PHP بیشترین استفاده رو برام داشته و الانم بنا به دلایلی Python.</p>
<p><strong>خوب، حالا سوال اصلی : چرا تو گنو/لینوکس احساس امنیت میکنم؟</strong><br />
من سالها با یه برنامه اشتباه دنبال MS بودم. یه کمپانی بزرگ. ولی مشکل این بود، که اگه بخوام قیاس کنم، من مورچه بودم، MS یه فیل. هر قدم فیل، هزارها مثل منو نابود میکرد. شانس آوردم، وقتی اومدم به سمت دلفی، هنوز انقدر انگیزه داشتم و هنوز انقدر وابسته نشده بودم به MS که نابود بشم. ولی خودتونو بذارید جای کسانی که اون دوران با VB کلی کار انجام داده بودن، خیلیاش رو نمیشد منتقل کنی به .NET یا اینکه میشد ولی انقدر هزینه بالایی داشت که نمی‌صرفید اینکار. دو نفر بودن که من میشناختم و یه شرکت داشتن با کلی پروژه VB که انجام داده بودن. همش از بین رفت. جفتشون بیخیال شدن و رفتن. اونا مثل من کله خراب نبودن و با انرژی البته :))</p>
<p>اما تجربه بعدی من بورلند بود. ایندفعه یه کم فرق میکرد، بورلند تو مقیاس بندی، دیگه فیل نبود. ولی نابود شد. نه کاملا، و بالاخره الان ظاهرا دوباره Embarcadro تونسته دلفی رو یه سروسامونی بده، ولی برای من خیلی بد بود.</p>
<p>من کلی برنامه داشتم که نمیتونستم ادامشون بدم. بالاجبار سورسشونو دادم به مشتری که دستکم اونا ضرر نکنن و مجبور نشن از اول کلی هزینه کنن. بدنش به یه دولوپر دیگه که گسترشش بده براشون. اما من کلی از کارهام، کلی از دانسته‌هام بی‌فایده شد. درسته که کلیت تجربه خیلی مفید بود برام، ولی شاید بیشتر از نصف تجربه‌هام تو ویندوز و دلفی دیگه به‌درد نمیخورن.</p>
<p>اما الان. سالهاست که PHP کار میکنم. وقتی شروع کردم ۳.۱۴ تازه منتشر شده بود و من اولین پروژه جدیمو با ۴ ارایه دادم. جایی هنوز داره کار میکنه بدون هیچ مشکلی! حتی با اینهمه رشدی که PHP داشته (<strong>و نه اینکه اصلا تغییری صورت نگرفته</strong>). هنوز حتی اون اولین تجربیاتم تو دنیای گنو/لینوکس، دارن بهم خدمت میکنن. دیگه نگران نیستم که فلان سرویس وقتی رفت کنار و یه چیز دیگه جاش اومد من باید کلی هزینه کنم تا یادش بگیرم. معمولا اینجا همه چیز سعی بر حفظ <a href="http://en.wikipedia.org/wiki/Backward_compatibility">Backward compatibility</a> دارن، همه برنامه‌ها قراره در خدمت من باشن و هدفی که دارم، هر چی که هست. نه که من برده اونها باشم و مجبور باشم از یه چیز انحصاری استفاده کنم. چیزی که ریسکش برام خیلی بالا باشه، چیزی که کوچکترین تغییرش نابودم کنه.</p>
<p>گاهی اینجامشکلاتی هست (مثلا Python 2 به 3 ) اما انقدر بهت فرصت میدن که کل این مشکلاتو حل کنی. اینجا بهشت مورچه‌هاییه که عمرشون کوتاهه(متوسط عمر ما چقدره مگه؟) و نمیتونن همه عمرشونو صرف این تغییرات احمقانه کنن. تغییر هست، ولی جذابه و نابود کننده نیست. انقدر نیست که دوباره بیمصرف بشی، دوباره صفر بشی و از اول شروع کنی. نهایت تغییر اینه که نمیتونی از Gnome استفاده کنی به نظرت مسخره شده؟ خوب چه اهمیتی داره؟ هنوز کلی آلترناتیو داری براش!</p>
<p>چرا اینجا اینطوریه؟ دلیلش روشنه. اینجا همه مورچه هستن. مثل من. هیچکدومشون نمیتونن به همین راحتی منو نابود کنن (بگذریم از اینکه نمیخوان!!). موقعیت من، به عنوان یه مورچه کوچیک، کاملا تثبیت شدست، و این اجتماعی که ما داریم، به همین راحتی نابود شدنی نیست. حتی اگه فیلی به عظمت MS دشمن ما باشه. اینجا یه اسم هرچقدر بزرگ باشه، حتی اگه در حد استالمن باشه، خیلی ساده میشه جلوش وایساد. میشه باهاش مخالف بود، چون به هر صورت، هر چی که هست و هرکاری که کرده، اونم هنوز یه مورچست.</p>
<p>من هنوز میتونم از سخت‌افزارهای قدیمی خودم استفاده کنم. من هنوز میتونم کدهای نسبتا قدیمی خودمو ادامه بدم. اگه به هر دلیلی PHP رو Zend بذاره کنار، یه گروه دیگه هستن که ادامش بدن. (دقیقا اتفاقی که برای Qt افتاد) امنیت من، توی همین وضعیت تضمین شدست. نگران این نیستم که نابودی فلان کمپانی چه تاثیری خواهد گذاشت بر روی زندگی من، چون تاثیری نخواهد گذاشت. من به این میگم آرامش. من به این میگم امنیت. من به این میگم دلیل، دلیل برای دوست داشتن GNU/Linux</p>
<p>خیلی جالب بود وقتی داشتم اینو مینوشتم خود وردپرس، یه پست دیگه هم معرفی کرد که بیربط نیست : <a href="http://cyberrabbits.net/159/linux-and-the-lost-delight/">لینوکس و شوقی که گم کرده بودم</a></p>
<p><a href="http://blog.sito.ir/why-i-love-gnulinux/"><img src="http://cyberrabbits.net/wp-content/uploads/2013/01/blog-competition-468.png" alt="blog-competition-468" width="468" height="94" class="aligncenter size-full wp-image-1211" /></a></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1188/why-i-love-gnu-linux/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/932/videocast-ii-pipes/' rel='bookmark' title='ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی'>ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی</a> <small>و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من،...</small></li>
<li><a href='http://cyberrabbits.net/365/arch-linux/' rel='bookmark' title='آرچ لینوکس، دیسترویی که میشناسمش'>آرچ لینوکس، دیسترویی که میشناسمش</a> <small>چند روزی هست که درگیر لینوکس بودم و نصب آرچ...</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/-UoMkppTYUM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1188/why-i-love-gnu-linux/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>انتشار با کمک git</title>
		<link>http://cyberrabbits.net/1182/publish-using-git/</link>
		<comments>http://cyberrabbits.net/1182/publish-using-git/#comments</comments>
		<pubDate>Fri, 21 Dec 2012 21:27:46 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[فوت کوزه گری]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[وب]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git hooks]]></category>
		<category><![CDATA[gpg]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[post-recive]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[svn hooks]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1182</guid>
		<description><![CDATA[وقتی برای اولین بار یک سایت رو آنلاین میکنی مشکل چندانی نیست. میدونی که همه فایلها باید آپلود بشن و دیتابیس ساخته بشه و &#8230; منتها برای دفعات بعدی تقریبا عذاب آوره. اگر که دسترسی شل به سرورتون داشته باشید (مثلا vps باشه) یه راه خیلی ساده (با کمک git) میتونه به دادتون برسه. من [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/640/nod32-mirror-linux/' rel='bookmark' title='Nod32 Mirror &#8211; Linux'>Nod32 Mirror &#8211; Linux</a> <small>توی یک شبکه، یه کامپیوتر بود که ما اونرو تبدیل...</small></li>
<li><a href='http://cyberrabbits.net/1156/pre-commit-hook-git/' rel='bookmark' title='بررسی کد قبل از کامیت'>بررسی کد قبل از کامیت</a> <small>چند وقتی هست که کار به روزرسانی یک کد نسبتا...</small></li>
<li><a href='http://cyberrabbits.net/1068/challenge-accepted/' rel='bookmark' title='از یک دانلود ساده تا یک خود درگیری بزرگ!'>از یک دانلود ساده تا یک خود درگیری بزرگ!</a> <small>یکی از مشکلاتی که لینوکسی همیشه میبینم دربارش بحث میکنن...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>وقتی برای اولین بار یک سایت رو آنلاین میکنی مشکل چندانی نیست. میدونی که همه فایلها باید آپلود بشن و دیتابیس ساخته بشه و &#8230; منتها برای دفعات بعدی تقریبا عذاب آوره. اگر که دسترسی شل به سرورتون داشته باشید (مثلا vps باشه) یه راه خیلی ساده (با کمک git) میتونه به دادتون برسه.<br />
من از git برای کنترل سورس استفاده میکنم. توصیه میکنم شما هم همین کار رو بکنید، git یا هر سیستم مشابهی. البته من تا مدتها از subversion استفاده میکردم ولی به نظرم git خیلی بهتر میتونه کارها رو راه بندازه.<br />
پروژه مد نظر من با git مدیریت میشه. خوب برای اولین کار، من یک برنچ جدید توی این پروژه ایجاد میکنم : </p>
<pre class="brush: bash; title: ; notranslate">
git checkout -b published
</pre>
<p>این برنچ، قراره که منتشر بشه. یعنی هر چیزی تو این برنچ قرار بگیره، میخوام که روی سرور داشته باشم. توی سرور هم میرم و یک رپوی خالی میسازم. فرض کنیم توی پوشه root :</p>
<pre class="brush: bash; title: ; notranslate">
cd /root
mkdir project.git
cd project.git &amp;&amp; git init --bare
</pre>
<p>یادتون باشه که این رپو یک جای کاملا private باید ساخته بشه، نه مثلا توی ریشه وب! فرض میکنم که من قراره برنامه رو توی /var/www منتشر کنم. یعنی وب سرور من از این پوشه به عنوان وب روت استفاده میکنه. حالا نیازمند یک اسکریپتم : </p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
TARGET=/var/www/
GIT_WORK_TREE=$TARGET git checkout -f published
</pre>
<p>خوب، اسم این اسکریپت رو میذارم post-recive و کپیش میکنم توی پوشه hooks توی project.git که توی سرور ساختم. دستور خط اول فقط برای راحتیه، که شما بتونید هر زمان که لازم بود عوضش کنید. دستور دوم میخواد به برنچ published سوییچ کنه، ولی اون GIT_WORK_TREE باعث میشه که این عمل سوییچ توی اون دایرکتوری مد نظر ما انجام بشه، نه توی دایرکتوری فعلی. مطمئن بشید که این اسکریپت اجراییه : </p>
<pre class="brush: bash; title: ; notranslate">
chmod a+x /root/project.git/hooks/post-recive
</pre>
<p>حالا وقت انتشاره :)<br />
برگردید توی رپوی خودتون توی کامپیوتر خودتون. اول سرورتون رو به عنوان remote اضافه کنید : </p>
<pre class="brush: bash; title: ; notranslate">
git remote add server root@serveraddress:/root/project.git
</pre>
<p>گام بعدی هم انتشار واقعیه : </p>
<pre class="brush: bash; title: ; notranslate">
git push server published
</pre>
<p>من خیلی وقتا از سوییچ -f هم استفاده میکنم، این سرور، سرور اصلی git نیست، و من اصلا از سرور اصلی برای نگه داری کد استفاده نمیکنم. بنابراین اصلا حوصله ندارم درگیر merge و این مسخره بازیا بشم :) یعنی به محض اینکه گیر داد برای merge یا وقت rebase به مشکل برخوردم خیلی ساده : </p>
<pre class="brush: bash; title: ; notranslate">
git push server published -f 
</pre>
<p>تا اینجا خیلی ساده همه چی منتشر شد. ولی گاهی فقط همین نیست. بعدش هم گاهی لازمه یه سری کار انجام بشه. مثلا من میخوام شماره نسخه جدید برنامه هم به فرض توی فایل version.php کپی بشه. </p>
<p>من معمولا از خود git برای نسخه گذاری استفاده میکنم. برای نسخه گذاری، کافیه که یکبار یک <a href="http://git-scm.com/book/en/Git-Basics-Tagging">tag</a> به وجود بیارید : </p>
<pre class="brush: bash; title: ; notranslate">
git tag -a v1.1 -m&quot;Version 1.1 of my project&quot;
</pre>
<p>خوب اینطوری خیلی ساده نسخه ۱.۱ ایجاد میشه (من معمولا اینطوری نسخه میدم، مثلا v1.1 شما هر طوری دوست دارید نسخه بزنید، خیلی ها ترجیح میدن مثلا با تاریخ نسخه بزنن یا هر چیز دیگه‌ای. یادتون باشه که git خودش یه عدد سوم هم اضافه میکنه، بقیه نوشته رو بخونید) </p>
<p>خوب حالا تا وقتی کامیت جدید انجام نشده با دستور </p>
<pre class="brush: bash; title: ; notranslate">
git describe
</pre>
<p>همین چیزی رو که به عنوان tag معرفی کردید رو به عنوان نسخه بهتون نشون میده. ولی وقتی که کامیت کنید، تغییر میکنه به یه چیزی مثل این : </p>
<pre class="brush: bash; title: ; notranslate">
v1.1-2-gb69ac6a
</pre>
<p>قسمت اول که همون نسخه خود ماست. بعدش یه عدد ۲ اومده که نشون میده ما بعد از tag کردن دو تا کامیت انجام دادیم. بعد هم کامیت هش که خود git میسازه، و به نظر من خیلی هم بامزست ته نسخه باشه :)) ولی اگر دوستش ندارید خیلی راحت میتونید بعد از آخرین &#8211; همه چی رو حذف کنید (کار خاصی نداره، نه کاراکتر آخر رو حذف کنید فقط)<br />
من میخوام اینو تو فایل version.php داشته باشم که یه فایلیه مثل این :</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
$version = &quot;%%DEVELOPMENT%%&quot;;
echo $version;
</pre>
<p>البته منظورم یه ایده کلیه، وگرنه معمولا من این چیزها رو توی فایل تنظیمات که xml ـه اکثرا میذارم :)<br />
خوب یه خط به آخر اسکریپتمون اضافه میکنم : </p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
TARGET=/var/www/
GIT_WORK_TREE=$TARGET git checkout -f published
sed -i s/%%DEVELOPMENT%%/&lt;code&gt;git describe&lt;/code&gt;/g $TARGET/version.php
</pre>
<p>اما وقت push هم باید یه تغییر کوچیکی بدم، باید تگها رو هم push کنم : </p>
<pre class="brush: bash; title: ; notranslate">
git push server published --tags
</pre>
<p>البته همچنان حواستون باشه به سوییچ f و اگه لازم شد ازش استفاده کنید.<br />
بازم هر کاری لازمه میتونید بعدش انجام بدید. مثلا یه دستور بذارید که کش رو پاک کنه، یا مثلا دیتابیس migration ها رو انجام بده و &#8230;باقیش دیگه بستگی داره به نیاز شما. </p>
<p>&#8211; سخت نیست اینکار رو برای svn هم انجام دادن. منتها اونجا قضیه یه کم متفاوته، که خوب، من نیازی بهش ندارم.<br />
&#8211; برای tag کردن توصیه من اینه که حتما با gpg امضا کنید تگهاتون رو. به جای -a اگه بذارید -s خودش تگ رو امضا میکنه.<br />
&#8211; git از نسخه ۱.۷.۹ به بعد امکان امضای کامیت ها رو هم با gpg میده. من که از اون موقع تا الان همه چی رو امضا میکنم :))) </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1182/publish-using-git/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/640/nod32-mirror-linux/' rel='bookmark' title='Nod32 Mirror &#8211; Linux'>Nod32 Mirror &#8211; Linux</a> <small>توی یک شبکه، یه کامپیوتر بود که ما اونرو تبدیل...</small></li>
<li><a href='http://cyberrabbits.net/1156/pre-commit-hook-git/' rel='bookmark' title='بررسی کد قبل از کامیت'>بررسی کد قبل از کامیت</a> <small>چند وقتی هست که کار به روزرسانی یک کد نسبتا...</small></li>
<li><a href='http://cyberrabbits.net/1068/challenge-accepted/' rel='bookmark' title='از یک دانلود ساده تا یک خود درگیری بزرگ!'>از یک دانلود ساده تا یک خود درگیری بزرگ!</a> <small>یکی از مشکلاتی که لینوکسی همیشه میبینم دربارش بحث میکنن...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/4gKERafoUHE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1182/publish-using-git/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>تبدیل دستورات تایپ شده فارسی به انگلیسی – bash و zsh</title>
		<link>http://cyberrabbits.net/1170/bash-zsh-gsh/</link>
		<comments>http://cyberrabbits.net/1170/bash-zsh-gsh/#comments</comments>
		<pubDate>Wed, 17 Oct 2012 21:41:03 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[zsh]]></category>
		<category><![CDATA[فوت کوزه گری]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[command_not_found_handle]]></category>
		<category><![CDATA[command_not_found_handler]]></category>
		<category><![CDATA[persian]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1170</guid>
		<description><![CDATA[یه معضل بزرگ من، این بود که مثلا داشتم فارسی مینوشتم، بعد میرفتم توی ترمینال یادم میرفت کیبرد رو دوباره انگلیسی کنم. تا میومدم به خودم بجنبم کلی تایپ کرده بودم :( آی حرصم میگرفت! بعد مهدی فتاحی، بابای آریوس یه پیشنهادی داد بهم برای آریوس. ولی خوب این مغز من استاد زیرآبی رفتنه، یه [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/893/zshell/' rel='bookmark' title='zsh جایگزینی مناسب برای bash'>zsh جایگزینی مناسب برای bash</a> <small>یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/941/bash-drafts/' rel='bookmark' title='پیشنویسها &#8211; Bash'>پیشنویسها &#8211; Bash</a> <small>خیلی پیش میاد که این وبلاگ به صورت یک آرشیو...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یه معضل بزرگ من، این بود که مثلا داشتم فارسی مینوشتم، بعد میرفتم توی ترمینال یادم میرفت کیبرد رو دوباره انگلیسی کنم. تا میومدم به خودم بجنبم کلی تایپ کرده بودم :( آی حرصم میگرفت! بعد <a href="http://mehdi.wordpress.com/">مهدی فتاحی</a>، بابای <a href="http://arioslinux.org/">آریوس</a> یه پیشنهادی داد بهم برای آریوس. ولی خوب این مغز من استاد زیرآبی رفتنه، یه چیز دیگه به ذهنم رسید -البته در راستای همون پیشنهاد- که پیاده سازی اولیش اینه که میخوام تو این پست دربارش بنویسم. </p>
<p>خیلی پیش میاد که یه دستور اشتباهی زده بشه. خوب اونها مهم نیست :) مشکل دستوراتیه که درستن، ولی با زبان اشتباهی تایپ میشن. خوب راه حل چیه؟<br />
توی zsh و همچنین bash میتونیم یک تابع تغریف کنیم که هنگامی که دستوری زده میشه و وجود نداره، اون تابع اجرا بشه. این تابع (که اصطلاحا هوک هم بهش میگن) با آرگومانی که حاوی دستور اجرا شدست فراخوانی میشه. توی zsh اسم این تابع باید command_not_found_handler و توی bash باید باشه command_not_found_handle -توی zsh اسم تابع یه r در انتها اضافه داره-</p>
<p>یعنی الان توی .zshrc بنویسید : </p>
<pre class="brush: bash; title: ; notranslate">
command_not_found_handler() {
	echo &quot;Sorry but $1 not found.&quot; 
}
</pre>
<p>بعد با دستور source ~/.zshrc اون رو لود کنید (یا اینکه ترمینال رو ببندید و دوباره باز کنید، فرق نمیکنه) و بعد یه دستور اشتباه بزنید، این پیغام به شما نشون داده میشه.<br />
&#8211; برای bash فقط کافیه اسم فایل رو اصلاح کنید و اون r رو بردارید، و بعد بذاریدش تو .bashrc . دیگه از این به بعد حرفی درباره بش نمیزنم، جز این تغییرات کوچک باقیش فرقی نداره. </p>
<p>حالا اینجاست که ایده رو باید پیاده کنیم. یه اسکریپت ساده که کل حروف فارسی رو با انگلیسی عوض کنه و دستور جدید رو چک کنه، اگر وجود داشت، اجراش کنه. یک چنین اسکریپتی : </p>
<pre class="brush: bash; title: ; notranslate">
command_not_found_handler() {
  persian=( ض ص ث ق ف غ ع ه خ ح ج چ ش س ی ب ل ا ت ن م ک گ ظ ط ز ر ذ د پ و ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۰ ! ٬ ٫ ﷼ ٪ × ، ؛ )
  english=( q w e r t y u i o p \[ \] a s d f g h j k l \; \' z x c v b n m , 1 2 3 4 5 6 7 8 9 0 ! @ \# \$ % \^ \&amp;amp; \&amp;quot; )
  len=&lt;code&gt;echo ${#english[*]}&lt;/code&gt;
  arg=$@
  prog=$1
  arg=${arg/$prog/}
  for ((i=1 ; i &amp;lt; $len ; i++)) do
    arg=${arg//${persian[$i]}/${english[$i]}}
    prog=${prog//${persian[$i]}/${english[$i]}}
  done
  
  /usr/bin/which --skip-alias &amp;quot;$prog&amp;quot; &amp;amp;&amp;gt; /dev/null
  if [ &amp;quot;$?&amp;quot; = &amp;quot;0&amp;quot; ];then
	  &lt;code&gt;echo $prog$arg&lt;/code&gt;
      return 0
  else
      return 127
  fi
}
</pre>
<p>دو تا آرایه متناظر از حروف فارسی و انگلیسی که قراره با هم ترکیب بشن وجود داره. اسم برنامه در $1 قرار میگیره و اسم برنامه بعلاوه آرگومانها در $@ . چون قراره که بررسی بشه که آیا برنامه وجود داره یا نه، لازمه که حتما اسم برنامه جداگانه وجود داشته باشه به همین خاطره که یه prog داریم و یه arg. بعدشم که سادست. یه جایگزینی ساده و نه چندان بهینه. متاسفانه نتونستم راهی پیدا کنم که bash یه دفعه همه این جابجایی رو با هم انجام بده. </p>
<p>گام بعدی، بررسی اینه که آیا این برنامه وجود داره یا نه. شاید تعجب کرده باشید که چرا آدرس کامل which رو دادم. در این مورد، zsh خودش یه which داره که متاسفانه ناقصه و نمیدونم چه اصراری بر اجرای اون داره :)) اینه که از which اصلی گنو استفاده میکنم.<br />
نکته اینه که ما نمیتونیم (یا من نمیدونم چطوری میشه) یک alias رو اجرا کنیم. پس اونها رو هم باید جزو غلطها در نظر بگیریم (که خیلی هم جالب نیست! حتما یه راهی براش پیدا میکنم!) و به همین دلیل which با اون آرگومان skip-aliases اجرا شده (که متاسفانه which خود zsh از این پشتیبانی نمیکنه) اگه وجود داشته باشه برنامه، بازگشتی صفره که توی if همین چک شده. و بعد هم دستور توی یک subshell اجرا شده.<br />
اگر پیدا نشه، بازگشتی ۱۲۷ به سیستم حالی میکنه که پیدا نشد، و تو خطای خودتو بده.<br />
فعلا همین :))) و برای من که تا الان خیلی مفید بوده :) بعدا قصد دارم برای آریوس تکمیل ترش کنم. خیلی تکمیل تر. </p>
<p>&#8211; دوستی که خودشو me معرفی کرده یه مشکلی رو گزارش دادن، و اون هم اینه که در bash وقتی شما دستوری رو اشتباه میزنی، خطایی نشون داده نمیشه. کافیه که برای bash دقیقا قبل از خط return 127 تو یه خط جدید اینو بنویسید : </p>
<pre class="brush: bash; title: ; notranslate">
      echo &quot;command not found : $1&quot;
</pre>
<p>&#8211; الان متوجه شدم که این صدمین نوشته ایه که توی این وبلاگ منتشر میکنم :)))</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1170/bash-zsh-gsh/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/893/zshell/' rel='bookmark' title='zsh جایگزینی مناسب برای bash'>zsh جایگزینی مناسب برای bash</a> <small>یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/941/bash-drafts/' rel='bookmark' title='پیشنویسها &#8211; Bash'>پیشنویسها &#8211; Bash</a> <small>خیلی پیش میاد که این وبلاگ به صورت یک آرشیو...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/MDXcb7IfQI8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1170/bash-zsh-gsh/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>وقتی قرار میشه یه گیک ارایه بده</title>
		<link>http://cyberrabbits.net/1164/html5-slidecontrol-mozrepl/</link>
		<comments>http://cyberrabbits.net/1164/html5-slidecontrol-mozrepl/#comments</comments>
		<pubDate>Sat, 22 Sep 2012 07:24:27 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[آپاچی]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[جاوا اسکریپت]]></category>
		<category><![CDATA[فایرفاکس]]></category>
		<category><![CDATA[FireFox Addon]]></category>
		<category><![CDATA[impress.js]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[mozrepl]]></category>
		<category><![CDATA[zanjan]]></category>
		<category><![CDATA[zconf]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1164</guid>
		<description><![CDATA[یکی از مشکلاتی که وقت ارایه ها دارم، کنترل اسلایدهاست. نشستن پشت کامپیوتر و زدن دکمه یا انجام دادن این توسط یه نفر دیگه :) روش معمولشه، ولی روش من نیست. جدیدا با پیشرفت html5 و ابزارهایی مثل bartaz/impress.js بد نیست که به فکر بروزرها باشیم برای اینکار. برای کنفرانس زنجان تصمیم گرفتم که اینکارو [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
<li><a href='http://cyberrabbits.net/528/session-regenerate-id/' rel='bookmark' title='ایجاد مکرر کلید جلسه'>ایجاد مکرر کلید جلسه</a> <small>در مورد جلسات این چند روزه زیاد نوشتم. تو آخرین...</small></li>
<li><a href='http://cyberrabbits.net/655/my-copyfixer/' rel='bookmark' title='افزونه My Copyfixer برای فایرفاکس'>افزونه My Copyfixer برای فایرفاکس</a> <small>خیلی با مزست :) دومین باره که از این وبلاگ...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از مشکلاتی که وقت ارایه ها دارم، کنترل اسلایدهاست. نشستن پشت کامپیوتر و زدن دکمه یا انجام دادن این توسط یه نفر دیگه :) روش معمولشه، ولی روش من نیست.<br />
جدیدا با پیشرفت html5 و ابزارهایی  مثل <a href='https://github.com/bartaz/impress.js/' title='bartaz/impress.js'>bartaz/impress.js</a> بد نیست که به فکر بروزرها باشیم برای اینکار.<br />
برای <a href="http://2012.zconf.ir/">کنفرانس زنجان</a> تصمیم گرفتم که اینکارو بکنم برای ارایه.  البته من زمان کافی برای چنین ارایه مفصلی نداشتم و ارایه من تنها چند اسلاید پشت سرهم  که با html درست شده بود، بود. اما باقی قضیه چی؟ بازم برای کنترل این اسلاید نیاز به دسترسی به کامپیوتره.<a href="http://www.efazati.org/"> محمد افاضاتی</a> برای رفع این مشکل، از یک ماوس وایرلس استفاده کرد. راه بدی نبود، ولی بازم به فکر چیز دیگه ای بودم.<br />
یکی از افزونه هایی که توی فایرفاکس من خیلی دوستش دارم <a href='https://addons.mozilla.org/en-us/firefox/addon/mozrepl/' title='MozRepl :: Add-ons for Firefox'>MozRepl :: Add-ons for Firefox</a> ـه. به شما اجازه میده که از طریق سوکت (مثلا از طریق telnet ) وارد صفحه بشید و بتونید جاوااسکریپت رو اجرا کنید.<br />
خیلی ساده، نصبش کنید، از منوی Tools/MozRepl فعالش کنید و تمام. حالا میشه با هر ابزاری مثل telnet بهش وصل شد : </p>
<pre class="brush: bash; title: ; notranslate">
rlwrap telnet 127.0.0.1 4242
</pre>
<p>که البته rlwrap برای ویندوز لازم نیست، تو لینوکس هم لازم نیست ولی برای اینکه تو ترمینال راحت تر باشید توصیه میکنم که rlwrap رو نصب کنید که بتونید ازش استفاده کنید. اگر هر مشکلی بود خیلی راحت از اول دستور حذفش کنید.<br />
خوب همین دیگه تمومه.<br />
توی این ترمینال بعد از نصب یه نشونه دیده میشه repl>  کافیه جلوش مثلا بزنید </p>
<pre class="brush: jscript; title: ; notranslate">
alert('test')
</pre>
<p>و نتیجه رو توی فایرفاکس ببینید. راهنمای نسبتا کاملتری هم اینجا <a href='https://github.com/bard/mozrepl/wiki/Tutorial' title='Tutorial · bard/mozrepl Wiki'>Tutorial · bard/mozrepl Wiki</a> هست. </p>
<p>گام بعدی باید برید سراغ اسلایدهاتون. توی اسلایدهای html که دارید، دو تا تابع جاوااسکریپت بگذارید. مثلا next و back که کارشون هم حرکت توی اسلایدهاست. یکی برای اسلاید بعدی و اون یکی برای اسلاید قبلی. خیلی ساده. حالا اسلاید رو باز کنید و توی ترمینال mozrepl سعی کنید که توابعتون رو فراخوانی کنید، بله ممکن نیست :)<br />
این مشکلی بود که بیشترین وقت من رو برای این اسلایدها گرفت. اینجا فایرفاکس یه کم حقه باز میشه :) ولی خوب بعد یادم اومد که تقریبا چنین مشکلی رو وقتی میخواستم یه افزونه برای فایرفاکس بنویسم داشتم، و بعد یادم اومد که توی فایرفاکس، window.content برای افزونه ها یه جورایی محدود شدست و توابع داخل صفحه رو شامل نمیشه :) به خودم کلی خندیدم.<br />
 برای اینکار باید از window._content استفاده بشه، به این صورت : </p>
<pre class="brush: jscript; title: ; notranslate">
repl.enter(window._content)
back()
next()
whatever()
</pre>
<p>یعنی به جای فراخوانی توابع در کانتکست content باید در _content اونها رو فراخوانی کرد و این یک آندرلاین، تقریبا ۱۰ ساعت وقت منو گرفت :)))<br />
اما خوب، اجرای تلنت توی گوشی و کانکت شدن به این، به چند دلیل ممکن نیست. یکی اینکه باز گذاشتن آی پی توسط mozrepl برای خارج هم ممکنه، (منوشو توی فایرفاکس ببینید) ولی اصلا امن نیست.<br />
دوم اینکه آخه وقت ارایه بشینم تایپ کنم mozrepl.enter و فلان و بهمان؟ اصلا بیخیال همون میشینم پای کامپیوتر و سنتی ارایه میدم :) نه. راه ساده ای هم هست که توی php و html خلاصه میشه :)<br />
کافیه که گوشی بتونه توی شبکه کامپیوتر باشه. توی کامپیوتر (همونجایی که فایرفاکس برای ارایه گوش به زنگه) یک وب سرور که برای اجرای php تنظیم شده اجرا میشه، یه اسکریپت ساده لازمه : </p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

class SocketHelper
{
 
    private $address = &quot;127.0.0.1&quot;;
    private $port    = &quot;4242&quot;;
    private $socket  = null;
 
    public function connect()
    {
        $this-&gt;socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        if(!$this-&gt;socket){
            socket_strerror($this-&gt;socket).&quot;\n&quot;;
            return false;
        }
 
        $result=socket_connect($this-&gt;socket,$this-&gt;address,$this-&gt;port);
 
        if(!$result){
            socket_strerror($result).&quot;\n&quot;;
            socket_close($this-&gt;socket);
            return false;
        }
 
        $this-&gt;read();
        return true;
    }
 
    /** Send a command to MozRepl */
    public function send_command($command){
        $command.=&quot;\n&quot;;
        socket_write($this-&gt;socket,$command);
        return $this-&gt;read();
    }
 
 
    /* 
        Read from the Socket until we get a &quot;repl&gt;&quot; prompt, 
        or loop forever.
     */
    private function read(){
        $response = '';
        while(1){
            $chunk = socket_read($this-&gt;socket,65536,PHP_BINARY_READ);
            echo $chunk;
            if($chunk === false){
                echo &quot;Error reading from socket\n&quot;;
                break;
            }
            if($chunk === &quot;&quot;) break; //No more data
 
            if(preg_match('|^(.*)\s*repl\d*&gt;\s*$|s',$chunk,$match)){
                $response .= $match[1];
                break;
            }
 
            $response .= $chunk;
        }
        return $response;
    }
}

</pre>
<p>&#8211; کد بالا از <a href="http://www.codediesel.com/tools/peeking-inside-firefox-using-mozrepl/">اینجا</a> اومده. ولی تا جایی که یادمه یه تغییرات کوچیکی هم من دادم بهش یا ممکنه نداده باشم :))  الان این آدرس آفلاینه. </p>
<p>باقیش سادست! یه فایل php مثلا index.php که به اینصورته : </p>
<pre class="brush: php; title: ; notranslate">
&lt;?php 
	require &quot;mozrepl.php&quot;;
	
	$moz = new SocketHelper();
	$moz-&gt;connect();
	if (isset($_GET[&quot;next&quot;])) {
		$moz-&gt;send_command(&quot;repl.enter(window._content)&quot;);
		$moz-&gt;send_command(&quot;next()&quot;);
	} elseif ( isset($_GET[&quot;back&quot;])) {
		$moz-&gt;send_command(&quot;repl.enter(window._content)&quot;);
		$moz-&gt;send_command(&quot;back()&quot;);
	}

?&gt;&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;HTML5 Gaming&lt;/title&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;meta name=&quot;description&quot; content=&quot;&quot;&gt;
    &lt;meta name=&quot;author&quot; content=&quot;&quot;&gt;

    &lt;!-- Le styles --&gt;
    &lt;link href=&quot;css/bootstrap.css&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;link href=&quot;css/bootstrap-rtl.css&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style type=&quot;text/css&quot;&gt;
      body {
        padding-top: 60px;
        padding-bottom: 40px;
        
        direction : rtl;
        font-family : &quot;IranianSans&quot;;
      }
      
      .btn {
		  width: 300px;
		  height: 200px;
	  }
    &lt;/style&gt;
    
  &lt;/head&gt;

  &lt;body&gt;


    &lt;div class=&quot;container&quot;&gt;
		&lt;a href=&quot;&lt;?php echo $_SERVER['PHP_SELF']?&gt;?back=1&quot; class=&quot;btn btn-success&quot;&gt;Back&lt;/a&gt;
		&lt;a href=&quot;&lt;?php echo $_SERVER['PHP_SELF']?&gt;?next=1&quot; class=&quot;btn btn-success&quot;&gt;Next&lt;/a&gt;

    &lt;/div&gt; &lt;!-- /container --&gt;
  &lt;/body&gt;
&lt;/html&gt;

</pre>
<p>و البته کاملا مشخصه که اسم فایل اولی mozrepl.php باشه :) حالا توی بروزر گوشی آدرس کامپیوتر رو میزنیم (که به راحتی میشه مثلا با نام کاربری و رمز محافظتش کرد) و دو تا دکمه میبینیم که back و next هستن :) توضیح بیشتری هم لازمه؟ خیلی وقته ننوشتم سخت شده برام :)) </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1164/html5-slidecontrol-mozrepl/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/162/menu-mysql-and-every-m-thing/' rel='bookmark' title='Menu، MySQL و کلا هر چی با M شروع میشه'>Menu، MySQL و کلا هر چی با M شروع میشه</a> <small>اولین بار،‌برای ایجاد کردن یک منوی تو در تو،‌ از...</small></li>
<li><a href='http://cyberrabbits.net/528/session-regenerate-id/' rel='bookmark' title='ایجاد مکرر کلید جلسه'>ایجاد مکرر کلید جلسه</a> <small>در مورد جلسات این چند روزه زیاد نوشتم. تو آخرین...</small></li>
<li><a href='http://cyberrabbits.net/655/my-copyfixer/' rel='bookmark' title='افزونه My Copyfixer برای فایرفاکس'>افزونه My Copyfixer برای فایرفاکس</a> <small>خیلی با مزست :) دومین باره که از این وبلاگ...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/VyzTVQ82dFE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1164/html5-slidecontrol-mozrepl/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>بررسی کد قبل از کامیت</title>
		<link>http://cyberrabbits.net/1156/pre-commit-hook-git/</link>
		<comments>http://cyberrabbits.net/1156/pre-commit-hook-git/#comments</comments>
		<pubDate>Mon, 02 Jul 2012 07:02:38 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[خیلی پیش میاد!]]></category>
		<category><![CDATA[فوت کوزه گری]]></category>
		<category><![CDATA[code sniffer]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git hooks]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[svn hooks]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1156</guid>
		<description><![CDATA[چند وقتی هست که کار به روزرسانی یک کد نسبتا بزرگ به من سپرده شده و به شدت درگیرش هستم. چون این کد الان دو سه ساله داره کار میکنه من معمولا کارم اصلاح کده طوری که با کد قبلی هماهنگ باشه. از git استفاده کردم برای کنترل پروژه و معمولا از قابلیت format-patch استفاده [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/885/string-array-php/' rel='bookmark' title='رشته ها و آرایه ها PHP'>رشته ها و آرایه ها PHP</a> <small>امروز درگیر یک کد بودم شبیه این : به نظر...</small></li>
<li><a href='http://cyberrabbits.net/1129/github-as-cdn/' rel='bookmark' title='استفاده از github به عنوان CDN'>استفاده از github به عنوان CDN</a> <small>یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای...</small></li>
<li><a href='http://cyberrabbits.net/264/download-with-resume-support-in-php/' rel='bookmark' title='دانلود فایل با قابلیت Resume در PHP'>دانلود فایل با قابلیت Resume در PHP</a> <small>کد انتهایی یه مشکل کوچک داشت که اصلاح شد :)‌...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>چند وقتی هست که کار به روزرسانی یک کد نسبتا بزرگ به من سپرده شده و به شدت درگیرش هستم. چون این کد الان دو سه ساله داره کار میکنه من معمولا کارم اصلاح کده طوری که با کد قبلی هماهنگ باشه.<br />
از git استفاده کردم برای کنترل پروژه و معمولا از قابلیت format-patch استفاده میکنم برای ایجاد پچ، ولی به دلیل بی دقتی، گاهی اشتباهاتی انجام میدم. مثلا خیلی پیش میاد که تابع xdebug_break رو استفاده کنم و بعد یادم بره که بردارمش، یا مثلا var_dump یا print_r و حتی چند مورد خیلی خاص هم پیش اومد که کدم syntax error داشت :) البته من سعی میکنم این مشکلات نباشه، ولی بودنشون اجتناب ناپذیره.<br />
این شد که تصمیم گرفتم چاره‌ای براش پیدا کنم و آخر سر توی git پیداش کردم. قبلا هم با svn از اینکارها (نه به این صورت خاص) انجام داده بودم. </p>
<p>هدف این بود که من نتونم کد رو کامیت کنم، اگر کد خطای دستوری داشت یا اینکه یک سری عبارات خاص توی کد پیدا میشد. خوب برای اینکار hook ها در git به دادم رسیدند.<br />
برای اینکه مفهوم هوکها رو در گیت بهتر درک کنید، <a href="http://git-scm.com/book/en/Customizing-Git-Git-Hooks">اینجا</a> رو بخونید. اما اگر حوصله ندارید، بدونید که توی هر رپوزیتوری گیت یک پوشه قرار داره به اسم .git (دات گیت) داخل اون یک پوشه هست به نام hooks که یک سری اسکریپت اونجا هست. در حالت عادی اون اسکریپتها همه یک پسوند sample هم دارند و همین باعث میشه که اجرا نشن. حالا اگه شما بیاید اسم این اسکریپتها رو تغییر بدید، و عبارت sample رو بردارید درزمان درست اجرا میشن. مثلا post-commit بعد از کامیت کد اجرا میشه. یا pre-commit قبل از کامیت کد.<br />
مهم هم نیست که شل اسکریپت باشن، یا هر جور فایل اجرایی دیگه‌ای. فقط باید حتما فلگ x روی اونها ست شده باشه که پیشفرضشون هست، ولی اگه خودتون فایل رو ساختید اینطوری عمل کنید : </p>
<pre class="brush: bash; title: ; notranslate">
chmod a+x post-commit
</pre>
<p>تا فایل (اینجا فایل post-commit ) اجرایی بشه.<br />
برای مورد خاص من، بهترین هوک، pre-commit بود. این هوک قبل از کامیت اجرا میشه و اگر مقدار بازگشتیش صفر نباشه، کامیت متوقف میشه.<br />
حالا مشکل دوم این بود که باید فایلهایی که قراربود کامیت بشن رو میگرفتم. خوب اینجا بازم میریم سراغ خود گیت : </p>
<pre class="brush: plain; title: ; notranslate">
git diff --cached --name-status
</pre>
<p>که خروجیش میشه چیزی شبیه به این : </p>
<pre class="brush: plain; title: ; notranslate">
M       base/app/lib/view/___Prefix___BaseView.class.php
M       base/templates/app/modules/actions/Action.class.php.tmpl
M       base/templates/app/modules/lib/action/BaseAction.class.php.tmpl
M       base/templates/app/modules/lib/model/BaseModel.class.php.tmpl
</pre>
<p>که M نشونه وضعیت فایله، و بعد یک تب بعد آدرس فایل و درنهایت آخر هر خط کاراکتر انتهای خط .<br />
M,A,D وضعیتهای فایل هستن که D قاعدتا نباید چک بشه. (فایلی که حذف شده فلگ D میخوره، و طبیعیه که فایلی که حذف بشه برای من مهم نیست)<br />
تصمیم گرفتم برای اطمینان از نبود Syntax error از خود php استفاده کنم که با سوییچ l از لحاظ سینتکس فایل رو بررسی میکنه. بعد هم برای راحتی کار ترجیح دادم از grep استفاده کنم برای پیداکردن توابعی که خطا نیستن ولی من نمیخوام که باشن.<br />
حالا اگر کد از اول برای خودم بود، حتما از یه Code Sniffer استفاده میکردم برای بررسی کدها، ولی خوب، چون کد قدیمیه و من نمیخوام زیاد سینتکس فعلی فایل رو دست بزنم، فعلا بیخیال Code Sniffer میشم (توی برنامم هست دربارش بنویسم :) خوب شد یادم اومد، اینم مدرک که دیگه یادم نره) . خوب کد نهایی میشه این، و لازم نیست که بگم من PHP رو بیشتر از bash دوست دارم : </p>
<pre class="brush: php; title: ; notranslate">
#!/usr/bin/php
&amp;lt;?php
echo &amp;quot;pre-commit hook\n&amp;quot;;
$staged = &lt;code&gt;git diff --cached --name-status&lt;/code&gt;;
$staged = explode(&amp;quot;\n&amp;quot;, $staged);
foreach ($staged as &amp;amp;$single)
	$single = explode(&amp;quot;\t&amp;quot;, $single);

//We have files now
foreach ($staged as $file) {
	if (count($file) != 2)
		continue;
	if($file[0] == 'D') { //Ignore deleted files
		continue;
	}
	if (preg_match(&amp;quot;/php$/i&amp;quot;, $file[1]) == 0)
		continue;
	$address = $file[1];
	$result = array();
	$return = 0;
	$code = exec(&amp;quot;php -l $address&amp;quot;, $result, $return);
	if ($return != 0 ) {
		echo &amp;quot;Check for file $address failed, result is : &amp;quot; . print_r($result, true);
		exit(1);
	}
	//Now check for some things in file, like var_dump and xdebug_break
	$invalidKeys = array (
		'xdebug_break',
		'var_dump',
		'print_r',
		);

	foreach ($invalidKeys as $key) {
		$result = array();
		$return = 0;
		exec(&amp;quot;grep -iHn $key $address&amp;quot;, $result, $return);
		if ($return ==0) {
			echo &amp;quot;Found invalid keyword : &amp;quot; . print_r($result, true);
			exit(1);
		}
	}
}

exit(0);

</pre>
<p>خود کد خیلی سادست :) php -l وقتی کد مشکل داشته باشه بازگشتیش صفر نیست، و grep هم وقتی چیزی رو که میخواد پیدا کنه، بازگشتیش صفره.<br />
باقیشم که مشخصه. حالا اگر کدی که میخوام کامیت کنم، خطای دستوری داشته باشه، یا عباراتی که من نمیخوام توش باشه، با یه پیغام متوقف میشم. </p>
<p>برخلاف svn یک رپو در git ماهیت مستقلی داره نسبت به همه رپوهای دیگه. یعنی شما میتونید این چک رو توی رپوی خودتون داشته باشی، ولی یک رپوی دیگه از همین کد کلون کنید نخواهد داشتش. و همینطور اگه تغییرات خودتون رو به یک رپوی دیگه push کنید هم این هوکها در رپوی مقصد به وجود نمیاد.<br />
نکته دیگر هم اینکه ممکنه یک فایل تغییر کرده باشه ولی بعد از اینکه تغییرات add شد بازم تغییر کرده باشه، درسته که وقت کامیت اگر از سوییچ a استفاده نشه git تغییرات دوم رو نمیبینه، ولی این اسکریپت اونها رو هم میبینه، و من بنابه دلایلی همین رو نیاز دارم. </p>
<p>هوکها توی کنترل نسخه، خیلی میتونن مفید باشن. این که من نوشتم، فقط یه ایده بود برای شما که گسترشش بدید. مثلا من قبلتر تو یک شرایط مشابه، میخواستم یک سایت به صورت اتوماتیک با هر کامیت من دوباره ساخته بشه، (با اجرای یک اسکریپت، که فایل رو آپلود میکرد، و یک سری کارهای دیگه) اون اسکریپت رو گذاشته بودیم توی post-commit رپوزیتوری svn و بعد از هر کامیت svn خود به خود اون رو اجرا میکرد. </p>
<p>راستی شما از کنترل نسخه استفاده میکنید دیگه؟ یعنی هست هنوز برنامه نویسی که اینکار رو  نکنه؟؟؟</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1156/pre-commit-hook-git/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/885/string-array-php/' rel='bookmark' title='رشته ها و آرایه ها PHP'>رشته ها و آرایه ها PHP</a> <small>امروز درگیر یک کد بودم شبیه این : به نظر...</small></li>
<li><a href='http://cyberrabbits.net/1129/github-as-cdn/' rel='bookmark' title='استفاده از github به عنوان CDN'>استفاده از github به عنوان CDN</a> <small>یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای...</small></li>
<li><a href='http://cyberrabbits.net/264/download-with-resume-support-in-php/' rel='bookmark' title='دانلود فایل با قابلیت Resume در PHP'>دانلود فایل با قابلیت Resume در PHP</a> <small>کد انتهایی یه مشکل کوچک داشت که اصلاح شد :)‌...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/IhQRB5t5aRU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1156/pre-commit-hook-git/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>استفاده از feed burner به عنوان subdomain</title>
		<link>http://cyberrabbits.net/1138/give-me-my-feeds/</link>
		<comments>http://cyberrabbits.net/1138/give-me-my-feeds/#comments</comments>
		<pubDate>Mon, 25 Jun 2012 12:20:01 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[وب]]></category>
		<category><![CDATA[CloudFlare]]></category>
		<category><![CDATA[CNAME]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[MyBrand]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1138</guid>
		<description><![CDATA[یکی از سرویسهایی که ما قبلا استفاده میکردیم، سرویس feedburner بود. این سرویس امکانات زیادی رو به feed شما میداد. در مورد مزایای feedburner نمیخوام صحبت کنم. متاسفانه، بنا به تشخیص مسئولین، feedburner مضر بود و از دسترس خارج شد. مدتی میشد از آدرسهای feeds2 استفاده کرد، اما بالاخره اونهم از دسترس خارج شد :( [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1129/github-as-cdn/' rel='bookmark' title='استفاده از github به عنوان CDN'>استفاده از github به عنوان CDN</a> <small>یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای...</small></li>
<li><a href='http://cyberrabbits.net/228/php-some-special-function/' rel='bookmark' title='PHP و توابعی که کمتر استفاده میکنیم'>PHP و توابعی که کمتر استفاده میکنیم</a> <small>چند تا تابع هست که ممکنه شما ندیده باشیدشون. منم...</small></li>
<li><a href='http://cyberrabbits.net/760/content-delivery-network/' rel='bookmark' title='Content Delivery Network'>Content Delivery Network</a> <small>اگه دقت کرده باشید، جدیدا عکسهای توی بلاگ و فایلهای...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از سرویسهایی که ما قبلا استفاده میکردیم، سرویس feedburner بود. این سرویس امکانات زیادی رو به feed شما میداد. در مورد مزایای feedburner نمیخوام صحبت کنم. متاسفانه، بنا به تشخیص مسئولین، feedburner مضر بود و از دسترس خارج شد.<br />
مدتی میشد از آدرسهای feeds2 استفاده کرد، اما بالاخره اونهم از دسترس خارج شد :(<br />
یکی از امکاناتی که feedburner داشت امکانی بود به نام MyBrand که قبلا رایگان نبود، ولی از زمانی که گوگل این محصول رو خرید -یا شاید بعدتر، دقیق نمیدونم- رایگان شد. این قابلیت به شما امکان میده که این محصول رو تحت یکی از دامنه های سایت خودتون داشته باشید.<br />
کار سختی نیست :) فقط باید یک رکورد CNAME تعریف کنید. اول برید به اکانت خودتون توی سایت feedburner از منوی بالایی گزینه My Account رو انتخاب کنید، توی منوی سمت چپ، گزینه MyBrand کاملا مشخصه :<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/06/My-Account-__-MyBrand_1340275927043.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/06/My-Account-__-MyBrand_1340275927043.png" alt="" title="My Account __ MyBrand_1340275927043" width="716" height="617" class="aligncenter size-full wp-image-1140" /></a></p>
<p>دو قسمت توی عکس شماره خورده، اولی یک رکورد CNAME ـه که شما باید توی رکوردهای DNS سایتتون اضافش کنید. برای شما متفاوت از این چیزیه که برای من نشون داده شده. و دومی، آدرسیه که میخواید این فیدها از اون طریق در دسترس باشند. مثلا من feeds.cyberrabbits.net رو انتخاب کردم. تا اینجا کافیه، آدرس CNAME رو یک جایی کپی کنید و دکمه Activate رو بزنید. </p>
<p>&#8211; بعد از فعالسازی برای دفعه اول، برای من به جای آدرس CNAME یک آدرس نمایش داده شد که با null شروع میشد، ان آدرس اشتباهه، و احتمالا این یه باگه. یک بار که ریفرش کنید دوباره آدرس درست نمایش داده میشه . </p>
<p>خوب حالا وقتشه که CNAME رو توی سایتتون اضافه کنید. اینکه چطوری، بستگی داره به کنترل پنل سایتتون چیه، اگر اینکار رو تا الان انجام ندادید و نمیدونید چیه حتما از پشتیبانی سایتتون کمک بگیرید.<br />
مثلا برای من یک رکورد تعریف شده که feeds.cyberrabbits.net رو اسم مستعار 1gxpivt.feedproxy.ghs.google.com تعریف میکنه.<br />
 البته من از CloudFlare استفاده میکنم. برای استفاده از این سیستم روی CF به کنترل پنل CF برید. و مثل شکل پایینی روی DNS Settings کلیک کنید<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/06/My-websites-_-CloudFlare-_-The-web-performance-security-company_1340279731298.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/06/My-websites-_-CloudFlare-_-The-web-performance-security-company_1340279731298-1024x312.png" alt="" title="My websites _ CloudFlare _ The web performance &amp; security company_1340279731298" width="1024" height="312" class="aligncenter size-large wp-image-1139" /></a><br />
 به صفحه تنظیمات dns برید. اونجا میتونید یک رکورد جدید تعریف کنید. حتما CNAME رو انتخاب کنید، اسم دامنه رو دقیقا همون چیزی بدید که قبلا توی تنظیمات اکانتتون توی feedburner وارد کرده بودید، و توی اون قسمتی هم که نوشته is an alias of آدرسی رو وارد کنید که feedburner به شما داده بود.<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/06/DNS-Settings-_-CloudFlare-_-The-web-performance-security-company_1340279767795.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/06/DNS-Settings-_-CloudFlare-_-The-web-performance-security-company_1340279767795.png" alt="" title="DNS Settings _ CloudFlare _ The web performance &amp; security company_1340279767795" width="965" height="63" class="aligncenter size-full wp-image-1141" /></a></p>
<p>خوب از اینجا به بعدش آدرس فیدهای شماست. مثلا من قبلا آدرس فید مطالبم توی FeedBurner میشد : </p>
<pre class="brush: plain; title: ; notranslate">

http://feeds.feedburner.com/cyberrabbits/posts

</pre>
<p>و حالا میشه </p>
<pre class="brush: plain; title: ; notranslate"> 

http://feeds.cyberrabbits.net/cyberrabbits/posts

</pre>
<p>اینجوری تمام فیدهایی که شما توی اکانتتون تعریف کردید اینجا به راحتی قابل دسترسیه البته که تا زمانی که سایت من هم مضر تشخیص داده نشه و در دسترس باشه :) این آدرس هم در دسترسه. </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1138/give-me-my-feeds/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1129/github-as-cdn/' rel='bookmark' title='استفاده از github به عنوان CDN'>استفاده از github به عنوان CDN</a> <small>یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای...</small></li>
<li><a href='http://cyberrabbits.net/228/php-some-special-function/' rel='bookmark' title='PHP و توابعی که کمتر استفاده میکنیم'>PHP و توابعی که کمتر استفاده میکنیم</a> <small>چند تا تابع هست که ممکنه شما ندیده باشیدشون. منم...</small></li>
<li><a href='http://cyberrabbits.net/760/content-delivery-network/' rel='bookmark' title='Content Delivery Network'>Content Delivery Network</a> <small>اگه دقت کرده باشید، جدیدا عکسهای توی بلاگ و فایلهای...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/-vojp7h2OTo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1138/give-me-my-feeds/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>استفاده از github به عنوان CDN</title>
		<link>http://cyberrabbits.net/1129/github-as-cdn/</link>
		<comments>http://cyberrabbits.net/1129/github-as-cdn/#comments</comments>
		<pubDate>Wed, 20 Jun 2012 16:24:41 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[CDN]]></category>
		<category><![CDATA[فوت کوزه گری]]></category>
		<category><![CDATA[وب]]></category>
		<category><![CDATA[Content Delivery Network]]></category>
		<category><![CDATA[cookie free domain]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1129</guid>
		<description><![CDATA[یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای بالاتر) با اون درگیر هستند، محتوای استاتیک سایته. مثلا فایلهای جاوااسکریپت، CSS و شاید تا حد زیادی عکسها. داشتن یک CDN، یک ایده‌آله ولی هزینه هاش نسبتا بالا هستند و برای سایتهای شخصی نمیصرفه. بعد از مدتی سروکله زدن با این مساله، یک راه حل [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1138/give-me-my-feeds/' rel='bookmark' title='استفاده از feed burner به عنوان subdomain'>استفاده از feed burner به عنوان subdomain</a> <small>یکی از سرویسهایی که ما قبلا استفاده میکردیم، سرویس feedburner...</small></li>
<li><a href='http://cyberrabbits.net/1083/faq-system-using-github/' rel='bookmark' title='سیستم سوالات متداول با کمک github'>سیستم سوالات متداول با کمک github</a> <small>تا الان شده که مدام یه سوال تکراری رو بخواید...</small></li>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از مسایلی که خیلی وب سایتها (خصوصا در ترافیکهای بالاتر) با اون درگیر هستند، محتوای استاتیک سایته. مثلا فایلهای جاوااسکریپت، CSS و شاید تا حد زیادی عکسها. داشتن یک <a href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a>، یک ایده‌آله ولی هزینه هاش نسبتا بالا هستند و برای سایتهای شخصی نمیصرفه.<br />
بعد از مدتی سروکله زدن با این مساله، یک راه حل نسبتا ساده پیدا کردم، اونهم استفاده از <a href="https://github.com/">github</a> برای اینکاره.<br />
github رو الان همه میشناسن. به نحوی یک شبکه اجتماعی محسوب میشه، نسل جدیدی از فضاهای اشتراک کد با قابلیتهای بالا. اما چطور میشه از این سایت به عنوان CDN استفاده کرد؟<br />
تقریبا کار ساده‌ایه. اگر عضو نیستید، عضو بشید. یک رپوزیتوری جدید ایجاد کنید. <a href="https://help.github.com/articles/create-a-repo">راهنمای خود github</a> کامل و گویاست در این موارد.<br />
بعد از این نوبت میرسه به استفاده از این رپو. خیلی ساده این رپو رو روی سیستم خودتون کلون کنید. مثلا من یک رپوی جدید ساختم به اسم cybits، با فرض اینکه خالیه و هنوز هیچ چیزی توش نیست اینطوری استفاده از اونرو شروع میکنم : </p>
<pre class="brush: plain; title: ; notranslate">
mkdir cybits
  cd cybits
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin https://github.com/fzerorubigd/cybits.git
  git push -u origin master
</pre>
<p>البته من ترجیح میدم که از https استفاده نکنم که هربار مجبور به زدن نام کاربری و رمز نباشم. خوب، با اینکار شما یک رپوزیتوری خالی ساختید، میتونید توی فایل README هم توضیحی بنویسید اگه لازمه. خوب میرسیم به قسمت اصلی کار.<br />
قابلیتی توسط github ارایه میشه که شما میتونید یک سری فایل رو به صورت استاتیک سرو کنید. برای اینکار کافیه که برنچی به اسم gh-pages بسازید. فراموش نکنید به جای اسم من و اسم رپوی من، نام کاربری و رپوی خودتون رو بگذارید. اینطوری : </p>
<pre class="brush: plain; title: ; notranslate">
cd cybits
git checkout --orphan gh-pages
git rm -rf .
# rm '.gitignore'
</pre>
<p>خوب حالا فایلهایی که میخواید رو توی این شاخه کپی کنید. منظورم فایلهای استاتیک مورد نظرتونه، فایلهای CSS و جاوااسکریپت و هر محتوایی که لازم دارید. مثلا من فایل jQuery و فایلهای مربوط به bootstrap رو توی رپوی خودم کپی کردم. (منظور توی پوشه cybits ـه) برای رضای خدا، یک فایل index.html هم بسازید بد نیست.</p>
<p>خوب باقیش که دیگه میشه دستورات git : </p>
<pre class="brush: plain; title: ; notranslate">
echo &quot;My GitHub Page&quot; &gt; index.html
git add .
git commit -m &quot;Create gh-pages&quot;
git push origin gh-pages
</pre>
<p>برای بار اول دست کم ۱۰ دقیقه طول میکشه و بعدش براتون یک ایمیل میاد که آماده به کاره. حالا آدرسش کجاست؟ برای من با نام کاربری fzerorubigd و اسم رپوی cybits آدرس میشه این : </p>
<pre class="brush: plain; title: ; notranslate">

http://fzerorubigd.github.com/cybits/

</pre>
<p>مثلا برای فایل bootstrap.css &#8211; که من کپیش کردم توی پوشه css &#8211; آدرس اینه : </p>
<pre class="brush: plain; title: ; notranslate">

http://fzerorubigd.github.com/cybits/css/bootstrap.css

</pre>
<p><strong>مزایا و معایب </strong><br />
چند تا مزیت هست. (علاوه بر بندواید) اول اینکه بودن محتوای استاتیک در دامنه‌ای دیگر باعث سرعت بیشتر بارگزاری سایت شماست. چرا که همه بروزر ها در هر زمان فقط دو فایل از یک هاست را دانلود میکنند و مثلا وقتی در حال دانلود فایلهای CSS و جاوااسکریپت هستند (دو تا با هم از هر نوعی) باقی فایلها مثلا عکسها منتظر میمانند. با این روش، چون لود فایلهای استاتیک از جای دیگریست، اسلاتهای مورد استفاده برای دانلود از سایت شما بیخود پر نمیشوند.<br />
دومین مزیت این است که این دامنه کوکی ندارد، و خالی بودن این دامنه از کوکی مزیت محسوب میشود (قبلا درباره <a href="http://cyberrabbits.net/760/content-delivery-network/">Cooke free domain</a> نوشتم )<br />
اما در مورد اینکه واقعا github به صورت توزیع شده عمل کند و فایلهای شما برای ویزیتورها از مکانی نزدیک به خودشان سرو شود هیچ اطلاعی ندارم :)) </p>
<p>اما عیب. متاسفانه تاریخ انقضای این فایلها در github برای یک روز تعیین شده. زمان زیاد مناسبی نیست و من زمانی در حد یک سال و &#8230; را ترجیح میدهم :) </p>
<p>&#8211; نکته اینجاست که شاید فایلهای CSS زیاد حجمی نداشته باشند، ولی فایلهای فونت رو توصیه میکنم ببرید روی github :))) </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1129/github-as-cdn/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1138/give-me-my-feeds/' rel='bookmark' title='استفاده از feed burner به عنوان subdomain'>استفاده از feed burner به عنوان subdomain</a> <small>یکی از سرویسهایی که ما قبلا استفاده میکردیم، سرویس feedburner...</small></li>
<li><a href='http://cyberrabbits.net/1083/faq-system-using-github/' rel='bookmark' title='سیستم سوالات متداول با کمک github'>سیستم سوالات متداول با کمک github</a> <small>تا الان شده که مدام یه سوال تکراری رو بخواید...</small></li>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/jXj58iskoX8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1129/github-as-cdn/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Brainfu**</title>
		<link>http://cyberrabbits.net/1120/brainfu/</link>
		<comments>http://cyberrabbits.net/1120/brainfu/#comments</comments>
		<pubDate>Sun, 03 Jun 2012 08:15:35 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[راهنمای قدم به قدم]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[bf]]></category>
		<category><![CDATA[brainfu**]]></category>
		<category><![CDATA[جفنگ]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1120</guid>
		<description><![CDATA[هشدار : این پست فقط وقت شما رو تلف میکنه. لطفا نخونیدش، ممنون. Brainfu** یه زبان برنامه نویسی مفید نیست. اصولا فقط یک چالشه که فقط باعث میشه شما وقتتون رو تلف کنید. خوب ، برام جذاب شد، رفتم یادش گرفتم. نیم ساعتی وقتمو حروم کرد، و حالا میخوام همینجا یه راهنمای نسبتا کامل از [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p><strong>هشدار : این پست فقط وقت شما رو تلف میکنه. لطفا نخونیدش، ممنون.</strong><br />
<a href="http://en.wikipedia.org/wiki/Brainfuck"><br />
Brainfu**</a> یه زبان برنامه نویسی مفید نیست. اصولا فقط یک چالشه که فقط باعث میشه شما وقتتون رو تلف کنید. خوب ، برام جذاب شد، رفتم یادش گرفتم. نیم ساعتی وقتمو حروم کرد، و حالا میخوام همینجا یه راهنمای نسبتا کامل از این زبان بنویسم. </p>
<p>برای داشتن یک کامپایلر برای این زبان میتونید از <a href="http://code.google.com/p/awib/">این کامپایلر که خودش با همین زبان نوشته شده</a>، استفاده کنید. نصبش سادست، <a href="https://aur.archlinux.org/packages.php?ID=7730">پکیجش توی AUR </a>هست و خیلی ساده هم میشه کامپایلش کرد.<br />
این کامپایلر چند تا مفسر داره و یک کامپایلر که کد رو به زبانهای مختلف (مثلا C و Ruby ) ترجمه میکنه. مثلا اگر فایل شما اسمش test.bf باشه، میتونید اینجوری به زبان C کامپایلش کنید : </p>
<pre class="brush: plain; title: ; notranslate">
awib &lt; test.bf &gt;out
</pre>
<p>برای مثلا کامپایل به کد اجرایی سی و دو بیتی باید بالای کد، (منظور توی خط اول test.bf ) این عبارت نوشته بشه </p>
<pre class="brush: plain; title: ; notranslate">
@386_linux
</pre>
<p>و فایل خروجی کد باینری میشه<br />
و برای اجرای کد، بدون کامپایل میتونید اینکار رو انجام بدید : </p>
<pre class="brush: plain; title: ; notranslate">
bfint32 test.bf 
</pre>
<p>البته نسخه های ۸ بیتی (bfint8) ۱۶ بیتی و حتی ۶۴ بیتی هم موجوده، تفاوت اینها اینه که هر کدوم از اینها خانه های پشته رو چند بیتی در نظر میگیرند.</p>
<p>توی <a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfu**</a> شما یک اشاره گر دارید و یک پشته به طول سی هزار بایت، که در ابتدا همه این پشته با صفر پر شده و اشاره گر شما به ابتدای این پشته اشاره<br />
میکنه.اول معرفی دستورات : </p>
<pre class="brush: plain; title: ; notranslate">
&gt;
</pre>
<p>علامت بزرگتر، که باعث میشه اشاره گر یکی در پشته به جلو حرکت کنه. </p>
<pre class="brush: plain; title: ; notranslate">
&lt;
</pre>
<p>علامت کوچکتر که اشاره گر رو یکی به عقب برمیگردونه<br />
&#8211; نکته : مفهوم خروج از پشته زیاد مشخص تعریف نشده مشخص نیست از پشته خارج بشی چی میشه! ولی کامپایلر یه هشدار میده.</p>
<pre class="brush: plain; title: ; notranslate">
+
</pre>
<p>محتوای جایی که اشاره‌گر به اون اشاره میکنه یکی زیاد میکنه </p>
<pre class="brush: plain; title: ; notranslate">
- 
</pre>
<p>محتوای جایی که اشاره‌گر به اون اشاره میکنه رو یکی کم میکنه.</p>
<pre class="brush: plain; title: ; notranslate">
.
</pre>
<p>محتوای جایی که اشاره‌گر بهش اشاره میکنه رو در خروجی چاپ میکنه </p>
<pre class="brush: plain; title: ; notranslate">
,
</pre>
<p>از کاربر یک کاراکتر میگیره و در مکان فعلی اشاره‌گر قرار میده. </p>
<pre class="brush: plain; title: ; notranslate">
[
</pre>
<p>شروع حلقه، وارد حلقه میشود اگر بایتی که اشاره گر به آن اشاره میکند صفر نباشد</p>
<pre class="brush: plain; title: ; notranslate">
]
</pre>
<p>پایان حلقه، به محل شروع حلقه برمیگردد<br />
کامنت ها هم در اصل به صورت // تغریف شدند ولی این کامپایلر مدلهای مختلفی رو پشتیبانی میکنه که میتونید توی راهنمای خودش ببینیدشون.</p>
<p>خوب همین. میرسیم به مثال :</p>
<pre class="brush: plain; title: ; notranslate">
++++++++++[&gt;++++++++++&lt;-]&gt;.
</pre>
<p>این کد حرف d رو در خروجی چاپ میکنه. کاراکتر d کوچک، معادل عدد ۱۰۰ میشه. ۱۰ تا + اول، مقدار بایت اول رو ۱۰ میکنن. بعد که وارد حلقه میشه، یک بایت به سمت جلو حرکت میکنیم که اول مقدارش صفره. ۱۰ تا + بعدی مقدارش رو میرسونن به ۱۰ بعد یک بایت به عقب برمیگردیم و یکی از بایت اول کم میکنیم. مقدار بایت اول میشه ۹ و وقتی تو شرط حلقه چک میشه باز وارد حلقه میشه و ۱۰ تا به بایت دوم اضافه میشه. این عمل ۱۰ بار تکرار میشه تا بایت اول صفر بشه و بایت دوم ۱۰۰ . وقتی از حلقه خارج میشیم، یکی به جلو حرکت میکنیم (بایت دوم) و اونو چاپ میکنیم. یعنی همون عدد ۱۰۰ رو که به صورت حرف d چاپ میشه. </p>
<p>حالا مثلا برای چاپ حرف f میشه اینطوری نوشت :</p>
<pre class="brush: plain; title: ; notranslate">
++++++++++[&gt;++++++++++&lt;-]&gt;++.
</pre>
<p>میبینید که همون کده، فقط بعد از خروج از حلقه و رفتن به بایت دوم،‌دو تا به بایت دوم اضافه شده که میشه ۱۰۲ یا همون f .<br />
خوب برای چاپ نیک نیم من میشه اینطوری نوشت : </p>
<pre class="brush: plain; title: ; notranslate">
++++++++++[&gt;++++++++++&lt;-]&gt;++.   //f
&lt;++++[&gt;+++++&lt;-]&gt;.               //z
&lt;++++[&gt;-----&lt;-]&gt;-.              //e
&lt;+++[&gt;++++&lt;-]&gt;+.                //r
---.                            //o
+++.                            //r
+++.                            //u
&lt;++++[&gt;-----&lt;-]&gt;+.              //b
+++++++.                        //i
--.                             //g
---.                            //d
</pre>
<p>برای گرفتن یک کاراکتر میشه از دستور , استفاده کرد که یک کاراکتر میگیره و توی مکان فعلی پشته قرار میده، مثلا کد زیر ده تا کاراکتر میگیره و بعد اونها رو سرو ته چاپ میکنه : </p>
<pre class="brush: plain; title: ; notranslate">
,&gt;,&gt;,&gt;,&gt;,&gt;,&gt;,&gt;,&gt;,&gt;,.&lt;.&lt;.&lt;.&lt;.&lt;.&lt;.&lt;.&lt;.&lt;.
</pre>
<p>هر وقت بیکار بشم یه سری برنامه برای این زبان دارم که حتما وقت میذارم برای اجراشون :)) ولی خوب تا ببینم کی دوباره وقت آزاد پیدا میکنم!</p>
<p>مسخره بود؟ میتونم درکت کنم، ولی مشکل من نیست که تو گیک نیستی.</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1120/brainfu/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/frtGrazb1n8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1120/brainfu/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Log.io</title>
		<link>http://cyberrabbits.net/1093/log-io/</link>
		<comments>http://cyberrabbits.net/1093/log-io/#comments</comments>
		<pubDate>Thu, 17 May 2012 06:58:08 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Node.js]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[AUR]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[log.io]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1093</guid>
		<description><![CDATA[خیلی وقتها هست که لازمه یک سری فایل Log رو زیر نظر بگیریم. مثلا فایلهای log آپاچی، فایلهای log برای mysql و &#8230; در این موارد، من ترجیح میدم ابزاری داشته باشم که بتونم همه اینها رو به صورت همزمان ببینم و نه به کمک ابزارهایی مثل tail که خوب، ممکنه با اون یه چیزهایی [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/796/my-aur-packages/' rel='bookmark' title='پکیجهای من در آرچ لینوکس'>پکیجهای من در آرچ لینوکس</a> <small>من از آرچ استفاده میکنم و خیلی هم باهاش راحتم....</small></li>
<li><a href='http://cyberrabbits.net/365/arch-linux/' rel='bookmark' title='آرچ لینوکس، دیسترویی که میشناسمش'>آرچ لینوکس، دیسترویی که میشناسمش</a> <small>چند روزی هست که درگیر لینوکس بودم و نصب آرچ...</small></li>
<li><a href='http://cyberrabbits.net/909/hiphop/' rel='bookmark' title='HipHop'>HipHop</a> <small>&#8211; این فقط یه معرفی ساده یه پروژه است نه...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>خیلی وقتها هست که لازمه یک سری فایل Log رو زیر نظر بگیریم. مثلا فایلهای log آپاچی، فایلهای log برای mysql و &#8230; در این موارد، من ترجیح میدم ابزاری داشته باشم که بتونم همه اینها رو به صورت همزمان ببینم و نه به کمک ابزارهایی مثل tail که خوب، ممکنه با اون یه چیزهایی رو از دست بدم.<br />
چیزی که ازش استفاده کردم و گذشته از یک سری مشکلات، تقریبا ازش راضیم<a href="http://logio.org/"> Log.io</a> بوده که با<a href="http://nodejs.org/"> Node.js</a> کار میکنه . متاسفانه نصبش دردسر زیاد داره، و حتی در یک جاهایی خود اسکریپت نصب مشکلاتی داره. طوری که برای نصبش (بعد از مدتها توقف پروژه و معطلی برای ارایه نسخه جدید) مجبور شدم کلی وقت بگذارم و در نهایت هم برای آرچ یک پکیج AUR بسازم.<br />
در حال حاضر اگر از آرچ استفاده میکنید <a href="https://aur.archlinux.org/packages.php?ID=59024">این پکیج AUR</a> میتونه کمکتون کنه ، اگر نه، بهتره مستندات خود Log.io رو مطالعه کنید و کمی تلاش حتما کارتون رو راه میندازه. <a href="https://aur.archlinux.org/packages/no/nodejs-log.io-git/PKGBUILD">مطالعه این پکیج AUR</a> هم بد نیست.<br />
&#8211; در حال حاضر، باید پکیج Node.js در آرچ downgrade بشه به ۶.۱۱ چون فعلا Log.io با این نسخه کار میکنه. علاوه بر اون، فقط نسخه git پکیج در AUR که من ساختمش درست کار میکنه اون یکی پکیج سالم نیست و کار نمیکنه. هر چی هم با نویسندش سعی کردم تماس بگیرم جواب نداد.<br />
اما طرز کار.<br />
بعد از نصب فایل /etc/log.io/harvester.conf رو ویرایش کنید :</p>
<pre class="brush: plain; title: ; notranslate">
/* Log.io log harvester configuration */

exports.config = {

  // Log server host &amp; port
  server: {
    host: '127.0.0.1',
    port: 8998,
  },

  // Watch the following log files, defined by label:path mappings
  log_file_paths: {
    slowsql : '/tmp/slowquery.log',
    mysql : '/tmp/logsql.log',
    pacman : '/var/lg/pacman.log',
    apacheaccess : '/var/log/httpd/access_log',
    apacheerrors : '/var/log/httpd/error_log',
    logio_harvester: '/var/log/log.io/harvester.log'
  },

  // Define name of current machine.
  // Alternatively, you can set this name in /etc/profile:
  // export LOGIO_HARVESTER_INSTANCE_NAME='my_log_machine'
  // If so, comment out the line below
  instance_name : 'my_laptop'

}
</pre>
<p>خیلی سخت نیست. فایلهایی که لازمه تو لیست باشن رو اضافه کنید. فقط دقت کنید که دسترسی به این فایلها باید برای کاربر logio باز باشه. همین طور بد نیست که تنظیمات server که در این فایل /etc/log.io/server.conf هست رو هم مرور کنید که با نیازهاتون کاملا هماهنگ باشه : </p>
<pre class="brush: plain; title: ; notranslate">
/* Log.io log server configuration */

exports.config = {

  // Log server port
  port: 8998,

  // Uncomment to enable basic HTTP authentication
  /*
  basic_auth: {
    username: &quot;foo&quot;,
    password: &quot;bar&quot;
  }
  */
}
</pre>
<p>خوب تقریبا همه چی تمومه. کافیه که هم سرور و هم harvester اجرا بشن . </p>
<pre class="brush: bash; title: ; notranslate">
sudo log.io server start
sudo log.io harvester start
</pre>
<p>البته ممکنه که سرور یه سیستم دیگه باشه و harvester روی یک سیستم دیگه. به عبارتی Log.io میتونه به شما کمک کنه که اطلاعات رو حتی از روی شبکه و ماشینهای دیگه خودتون جمع آوری کنید.<br />
بعد از اینکار، فقط کافیه که مرورگر مورد علاقتون رو باز کنید و آدرس رو باز کنید : </p>
<pre class="brush: plain; title: ; notranslate">

http://localhost:8998/

</pre>
<p>&#8211; حواستون به تنظیمات سرور و پورتی که اونجا هست باشه.<br />
نتیجه میشه این  : </p>
<p><a href="http://cyberrabbits.net/wp-content/uploads/2012/05/2012-05-14-180931_2966x900_scrot.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/05/2012-05-14-180931_2966x900_scrot-1024x576.png" alt="" title="2012-05-14-180931_2966x900_scrot" width="1024" height="576" class="aligncenter size-large wp-image-1110" /></a><br />
&#8211; شاید براتون جالب باشه که چطور میشه کوئری های انجام شده در mysql رو هم اینجا دید. فایل تنظیمات mysql رو باز کنید (فایل my.cnf معمولا و بسته به دیستروی شما جاش متغیره خودتون پیداش کنید ) قسمت mysqld رو پیدا کنید و اینها رو بهش اضافه کنید </p>
<pre class="brush: plain; title: ; notranslate">
# The MySQL server
[mysqld]
# Set All query Log
log=/tmp/logsql.log
# Set Slow Query Log
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /tmp/slowquery.log 

</pre>
<p>البته اون [mysqld] خودش هست و شما نباید اون رو اضافه کنید. قبل از اجرای log.io دسترسی این دو فایل رو تغییر بدید طوری که logio هم بتونه اونها رو بخونه. </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1093/log-io/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/796/my-aur-packages/' rel='bookmark' title='پکیجهای من در آرچ لینوکس'>پکیجهای من در آرچ لینوکس</a> <small>من از آرچ استفاده میکنم و خیلی هم باهاش راحتم....</small></li>
<li><a href='http://cyberrabbits.net/365/arch-linux/' rel='bookmark' title='آرچ لینوکس، دیسترویی که میشناسمش'>آرچ لینوکس، دیسترویی که میشناسمش</a> <small>چند روزی هست که درگیر لینوکس بودم و نصب آرچ...</small></li>
<li><a href='http://cyberrabbits.net/909/hiphop/' rel='bookmark' title='HipHop'>HipHop</a> <small>&#8211; این فقط یه معرفی ساده یه پروژه است نه...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/bglmCKUhdFM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1093/log-io/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>دوباره bootstrap – نسخه Less</title>
		<link>http://cyberrabbits.net/1095/bootstrap-again/</link>
		<comments>http://cyberrabbits.net/1095/bootstrap-again/#comments</comments>
		<pubDate>Sat, 12 May 2012 13:58:59 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Less]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1095</guid>
		<description><![CDATA[چند وقتی هست که bootstrap تبدیل شده به عصای دست من :) و هر کاری رو با اون انجام میدم. منتها شدیدا داره تغییر میکنه و دیگه نسخه‌ای که من راست به چپ کرده بودم، بدرد نمیخورد. این شد که نشستم و دوباره تبدیلش کردم فقط اینکه اینبار به جای نسخه CSS نسخه Less رو [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/978/twitter-bootstrap/' rel='bookmark' title='Twitter bootstrap'>Twitter bootstrap</a> <small>آپدیت جدیدی برای این فریم‌ورک نوشتم که میتونید اینجا ببینید....</small></li>
<li><a href='http://cyberrabbits.net/430/crsf-or-how-i-invent-wheel-again/' rel='bookmark' title='CSRF یا چطور چرخ رو دوباره اختراع کردم'>CSRF یا چطور چرخ رو دوباره اختراع کردم</a> <small>امروز یه اتفاق خیلی ساده، یه درس بزرگ بهم داد....</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>چند وقتی هست که bootstrap تبدیل شده به عصای دست من :) و هر کاری رو با اون انجام میدم. منتها شدیدا داره تغییر میکنه و دیگه نسخه‌ای که من راست به چپ کرده بودم، بدرد نمیخورد. این شد که نشستم و دوباره تبدیلش کردم فقط اینکه اینبار به جای نسخه CSS نسخه <a href="http://cyberrabbits.net/977/less-js">Less</a> رو تبدیل کردم :))<br />
این پست هم فقط برای اینه که همینو اعلام کنم. برای گرفتنش میتونید از <a href="https://github.com/fzerorubigd/bootstrap">github</a> استفاده کنید : </p>
<pre class="brush: bash; title: ; notranslate">
git clone git://github.com/fzerorubigd/bootstrap.git
</pre>
<p>برای کامپایلش هم نیاز به Node.js دارید. بعد از نصب Node.js اول چند تا وابستگی رو نصب کنید :</p>
<pre class="brush: bash; title: ; notranslate">
npm install recess uglify-js jshint -g
</pre>
<p>و بعد هم make و همینطور make bootstrap </p>
<p><ins datetime="2012-05-21T05:21:21+00:00">متاسفانه برای ویندوز بدون نصب یک سری چیزها این گزینه ممکن نیست. ابتدا باید mingw رو نصب کنید :<br />
<a href='http://www.mingw.org/' title='MinGW | Minimalist GNU for Windows'>MinGW | Minimalist GNU for Windows</a><br />
و بعد هم msys رو : <a href='http://www.mingw.org/wiki/MSYS' title='MSYS | MinGW'>MSYS | MinGW</a><br />
و اونوقت میتونید از طریق اونها دستورات رو اجرا کنید.</ins></p>
<p>البته اگه حس اینکارها رو ندارید میتونید<a href="http://cyberrabbits.net/wp-content/uploads/2012/05/bootstrap.zip"> این فایل</a> رو دانلود کنید و استفاده کنید، ولی شدیدا توصیه میکنم که اینکار رو نکنید، من یادم میره این فایل رو به روز کنم، ولی رپوی اصلی رو به روز نگه می‌دارم.<br />
علاوه بر اینها، یک<a href="https://github.com/twitter/bootstrap/pull/3461"> pull request</a> هم به رپوی اصلی دادم که بستگی داره که نظر مدیر اصلی پروژه چی باشه و آیا قبول بکنه یا نه.</p>
<p>اگر مشکلی بود issue رو توی github ثبت کنید و یا اینکه همین جا کامنت بگذارید. </p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1095/bootstrap-again/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/978/twitter-bootstrap/' rel='bookmark' title='Twitter bootstrap'>Twitter bootstrap</a> <small>آپدیت جدیدی برای این فریم‌ورک نوشتم که میتونید اینجا ببینید....</small></li>
<li><a href='http://cyberrabbits.net/430/crsf-or-how-i-invent-wheel-again/' rel='bookmark' title='CSRF یا چطور چرخ رو دوباره اختراع کردم'>CSRF یا چطور چرخ رو دوباره اختراع کردم</a> <small>امروز یه اتفاق خیلی ساده، یه درس بزرگ بهم داد....</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/1wabGF_uj4A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1095/bootstrap-again/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>سیستم سوالات متداول با کمک github</title>
		<link>http://cyberrabbits.net/1083/faq-system-using-github/</link>
		<comments>http://cyberrabbits.net/1083/faq-system-using-github/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 16:03:21 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[faq]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[linux-faq]]></category>
		<category><![CDATA[phing]]></category>
		<category><![CDATA[xsl]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1083</guid>
		<description><![CDATA[تا الان شده که مدام یه سوال تکراری رو بخواید جواب بدید؟ برای ما توی فروم‌های لینوکسی، اخیرا زیاد پیش میاد. مثلا جادی دیگه دادش در اومد :)) این شد که با خودم گفتم که یه سری سوال و جواب های تکراری یه جا جمع بشن خیلی خوب میشه! نه اینکه همه میرن میخوننش و [...]<div class='yarpp-related-rss yarpp-related-none'>

بدون پست مرتبط.
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>تا الان شده که مدام یه سوال تکراری رو بخواید جواب بدید؟ برای ما توی فروم‌های لینوکسی، اخیرا زیاد پیش میاد. مثلا <a href="http://jadi2.undo.it/">جادی</a> دیگه دادش در اومد :))<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/04/jadi.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/04/jadi.png" alt="" title="jadi" width="539" height="104" class="aligncenter size-full wp-image-1085" /></a><br />
 این شد که با خودم گفتم که یه سری سوال و جواب های تکراری یه جا جمع بشن خیلی خوب میشه! نه اینکه همه میرن میخوننش و از دست سوالهای الکی راحت میشیم، نه، چنین چیزی ممکن نیست، ولی خوب بالاخره میشه بهشون لینک داد و کارها خیلی ساده تر میشه. </p>
<p>اما کجا؟ تو یه فروم؟ ساختار فروم مناسب نیست. ویکی به مراتب بهتره، ولی ویکی کجا؟ بچه‌های اوبونتو خودشون <a href="http://forum.ubuntu.ir/index.php/topic,30797.new.html">یه بخش سوال و جواب راه انداختن</a>، ولی همش درباره اوبونتوست (که البته مطمئنم بعدا بهتر میشه) ولی خوب، من یه جای دیگه رو ترجیح میدادم، اینجا : <a href='http://fzerorubigd.github.com/plf/' title='سوالات متداول لینوکسی - سوالات متداول لینوکسی'>سوالات متداول لینوکسی &#8211; سوالات متداول لینوکسی</a><br />
پیشنهادم، <a href="https://github.com/">github</a> بود. این سایت امکان خیلی جالبی رو برای پروژه‌هایی که روی اون هستن به وجود آورده. کافیه یک برنچ داشته باشید به اسم gh-pages و اون توی وب به راحتی قابل دسترسه!اینطوری میشه به راحتی از قابلیت git برای کار گروهی بهره برد.<br />
خوبه، ولی ویرایش یک یا چند html زیاد راحت هم نیست. مدام حواست باید باشه به استیل صفحه، لینکها رو اشتباهی این طرف و اونطرف قاطی نکنی و از طرفی همکاری برای همه سخت میشه، هر کی یه سلیقه داره و کم کم ناهماهنگی پیش میاد (این دلیل از نظر من،‌برای ویکی هم صادقه ).</p>
<p>این شد که با <a href="http://www.phing.info/trac/">Phing</a> یه اسکریپت درست کردم. من هنوز با Phing زیاد آشنا نیستم. ولی بد تجربه‌ای نبود. یه کم <a href="http://www.w3.org/TR/xslt">xslt</a> هم قاطیش شد و در نهایت پروژه شکل گرفت. </p>
<p>ساختار آنچنان هم پیچیده نیست. یه سری فایل xml هست که به این شکله : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;page&gt;
	&lt;category&gt;
		&lt;name&gt;linux-terminal&lt;/name&gt;
		&lt;title&gt;ترمینال لینوکس&lt;/title&gt;
		&lt;description&gt;سوالات رایج درباره ترمینال لینوکس&lt;/description&gt;
	&lt;/category&gt;
	&lt;questions&gt;
		&lt;question&gt;
			&lt;q&gt;&lt;![CDATA[1در ترمینال زمانی که رمز باید وارد کنم، ظاهرا همه دکمه های صفحه کلید غیر‌فعال میشوند چون چیزی در ترمینال ثبت نمیشود. چرا؟]]&gt;&lt;/q&gt;
			&lt;a&gt;&lt;![CDATA[کلید‌ها غیرفعال نمیشوند. بنا به دلایل امنیتی کاملا واضح، شما ورودی خودتان را نمیبینید. رمز مورد نظر را وارد کنید و سپس دکمه Enter را بزنید. ]]&gt;&lt;/a&gt;
		&lt;/question&gt;
		&lt;question&gt;
			&lt;q&gt;&lt;![CDATA[چطور میتوانم ....؟]]&gt;&lt;/q&gt;
			&lt;a&gt;&lt;![CDATA[لطفا این سوال را تکمیل کنید]]&gt;&lt;/a&gt;
		&lt;/question&gt;										
	&lt;/questions&gt;
&lt;/page&gt;
</pre>
<p>فکر نکنم توضیح زیادی بخواد. هر فایل حاوی یه مبحثه. مثلا این فایل مبحث ترمینال لینوکس. یه اسم برای فایل خروجی (linux-terminal) که باید با اسم فایل ورودی هم یکی باشه یه عنوان و در نهایت یه توضیح کوتاه یک خطی. بعد هم همه سوالها خیلی ساده پشت سر هم ردیف شدن.<br />
اینطوری سوالها جدا هستن، راحت برای هر کسی قابل ویرایش هستند و مدیریتشون هم راحت‌تره. فقط مشکل اینه که نمایش سوالها به این روش اصلا برای تازه واردها خوشایند نیست. اما xslt رو برای همین گذاشتن :) خوشبختانه Phing پشتیبانی XSLTransform رو داره. با صرف یک نصفه روز، با توجه به اینکه دفعه اولم بود xsl مینوشتم، یک فایل برای تغییر فایل xml به فایل html نوشتم. </p>
<p>خوب زیاد وارد جزئیات نشم. الان احتیاج به کمک هست برای پر کردن این سوال دونی :) .<br />
قبل از هرکار phing رو نصب کنید (PHP باید نصب باشه، یعنی توی شل دستور php وجود داشته باشه. نیازی به آپاچی یا هر وب سرور دیگه‌ای نیست. ): </p>
<pre class="brush: bash; title: ; notranslate">
pear channel-discover pear.phing.info
pear install phing/phing
</pre>
<p>بسته به تنظیمات pear ممکنه لازم باشه که این دستورات رو با sudo اجرا کنید (معمولا هست) البته phing نصبش تمومه، ولی برای این برنامه، شما باید<a href="http://php.net/manual/en/book.xsl.php"> xsl رو هم برای php</a> تنظیم کنید. (ممکنه لازم باشه php-xsl نصب بشه ولی معمولا با ویرایش فایل php.ini و اضافه کردن  extension=xsl.so اینکار انجام میشه)<br />
اگه اکانت github دارید و تنظیمش کردید از قبل (با ثبت کلید عمومی) یا اینکه دوست دارید اینکار رو انجام بدید، که خیلی خوبه. اگر نه برید به قسمت گرفتن فایلها ( قسمت بعدی رو چشم پوشی کنید) که البته شدیدا توصیه میکنم اینکار رو نکنید و اکانت رو بسازید و تنظیم کنید.<br />
خوب برید تو صفحه پروژه plf و یک fork ازش بگیرید. (دکمه fork کاملا مشخصه ) و بعد یه clone از رپوی خودتون -که براتون ساخته میشه- بگیرید.<br />
اگر اکانت ندارید و نمیخواید داشته باشید، این فایل رو دانلود کنید و محتویاتشو بریزید تو سیستم خودتون.</p>
<p>اصل قضیه یه پوشه است به اسم questions که توش یه سری فایل xml هست. به جز فایل index باقی فایلها، رو میتونید ویرایش کنید. روش ویرایش رو هم بالاتر گفتم. اگر دسته مورد نظرتون اینجا نیست،‌یکی از این فایلها رو کپی کنید اسمشو به اسم انگلیسی دسته مورد نظرتون تغییر بدید و ویرایشش کنید. فکر نکنم کار سختی باشه :) </p>
<p>اما فایل index.xml،‌تا زمانی که یه فایل جدید نساخته باشید نیازی به ویرایش این فایل وجود نداره. ولی اگه فایل جدیدی اضافه کردید فایل index.xml رو هم ویرایش کنید و اسم فایلتون رو به آخرش اضافه کنید. این قسمت : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;files&gt;
	&lt;file name=&quot;questions/general.xml&quot; /&gt;
	&lt;file name=&quot;questions/linux-terminal.xml&quot; /&gt;
	&lt;file name=&quot;questions/gnome.xml&quot; /&gt;
	&lt;file name=&quot;questions/kde.xml&quot; /&gt;
	&lt;file name=&quot;questions/unity.xml&quot; /&gt;
&lt;/files&gt;
</pre>
<p>خوب حالا وقتشه که تغییراتتون رو ببینید. توی پوشه دستور phing رو اجرا کنید. اگه همه چی درست باشه اینو میبینید :<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/04/phingout.png"><img src="http://cyberrabbits.net/wp-content/uploads/2012/04/phingout.png" alt="" title="phingout" width="572" height="215" class="aligncenter size-full wp-image-1084" /></a><br />
فایلهای خروجی در پوشه output هستند. فایل index.html رو باز کنید و ببینید.<br />
حالا وقتشه تغییرات رو به من برسونید. اگر که قبلا پروژه رو تو github برای خودتون fork کرده باشید، کافیه تغییراتتون رو توی رپوی خودتون (فقط توی برنچ master )ثبت کنید و در نهایت یه درخواست pull request بدید تا سوالات و تغییرات شما به سوالات قبلی اضافه بشه.<br />
اگر اینکار رو نکردید، تغییراتتون رو برای من میل کنید. من اونها رو اضافه میکنم. </p>
<p>خوب :) منتظرم دوستان!!!</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1083/faq-system-using-github/"></g:plusone></div><div class='yarpp-related-rss yarpp-related-none'>
<p>بدون پست مرتبط.</p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/TfpCtiz4S1s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1083/faq-system-using-github/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>از یک دانلود ساده تا یک خود درگیری بزرگ!</title>
		<link>http://cyberrabbits.net/1068/challenge-accepted/</link>
		<comments>http://cyberrabbits.net/1068/challenge-accepted/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 08:17:57 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[mini2440]]></category>
		<category><![CDATA[pacman]]></category>
		<category><![CDATA[sftp]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1068</guid>
		<description><![CDATA[یکی از مشکلاتی که لینوکسی همیشه میبینم دربارش بحث میکنن یه دانلودر خوب برای دانلود شبانه‌است. به عبارتی دانلودری که زمان‌بندی هم داشته باشه. البته هستن یه چند تای، ولی هیچکدوم همه شرایط لازم رو همزمان ندارن. ولی خوب، میشه گفت این مشکل خیلی ساده حل میشه. دانلودرهای خط‌فرمانی خوبی توی لینوکس وجود داره و [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/264/download-with-resume-support-in-php/' rel='bookmark' title='دانلود فایل با قابلیت Resume در PHP'>دانلود فایل با قابلیت Resume در PHP</a> <small>کد انتهایی یه مشکل کوچک داشت که اصلاح شد :)‌...</small></li>
<li><a href='http://cyberrabbits.net/403/source-forge-redirector/' rel='bookmark' title='دانلود از SourceForge بدون مشکل'>دانلود از SourceForge بدون مشکل</a> <small>اسکریپت رو اگه نصب کردید دوباره آپدیت کنید، چون sf...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از مشکلاتی که لینوکسی همیشه میبینم دربارش بحث میکنن یه دانلودر خوب برای دانلود شبانه‌است. به عبارتی دانلودری که زمان‌بندی هم داشته باشه. البته هستن یه چند تای، ولی هیچکدوم همه شرایط لازم رو همزمان ندارن. ولی خوب، میشه گفت این مشکل خیلی ساده حل میشه.<br />
دانلودرهای خط‌فرمانی خوبی توی لینوکس وجود داره و من،‌به شخصه، شدیدا طرفدار aria2 هستم. بعضیا ممکنه axel رو دوست داشته باشن. ولی خوب برای زمان بندی اینها چه کاری میشه کرد؟ سادست :) cron اینجا به دادتون میرسه.<br />
من برای دانلود از یه <a href="http://www.friendlyarm.net/products/mini2440">mini2440</a> استفاده میکنم. علتشم اینه که مصرفش خیلی کمه، و از همه مهمتر سر و صدا نداره و مجبور نیستم یه کامپیوتر یا لپ تاب رو بیخود روشن بذارم. روش خیلی ساده aria2 رو کامپایل کردم و الان مدتهاست مثل ساعت داره کار میکنه :)) خوب حالا چطور این کار رو انجام دادم؟<br />
<a href="http://cyberrabbits.net/wp-content/uploads/2012/04/mini2440_1.jpg"><img src="http://cyberrabbits.net/wp-content/uploads/2012/04/mini2440_1-300x273.jpg" alt="مینی ۲۴۴۰ یکی از تفریحات من :)" title="mini2440" width="300" height="273" class="aligncenter size-medium wp-image-1072" /></a></p>
<p>توی یه پوشه به خصوص، جایی که میخواید دانلودها اونجا ریخته بشن، یه فایل متنی ساده درست کنید. من اسمشو گذاشتم dl.lst و توی پوشه /mnt/sd این فایل رو قرار دادم. توی هر خط این فایل یه لینک میذارم که قراره دانلود بشه و یه اسکریپت خیلی ساده هم به این صورت مینویسم : </p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

cd /mnt/sd/
aria2c -i /mnt/sd/dl.lst -m 10 -j 2
</pre>
<p>اینکه آرگومانها چه کاری میکنن، با خودتون :) فقط آرگومان -i رو حواستون بهش باشه که آدرس فایل لیستی که بالاتر درست کردید باید بعدش بیاد.<br />
 و نهایتا میرسه نوبت به cron .<br />
اگه ویرایشگر خاصی مدنظرتونه (مثلا nano یا vim یا هرچی ) اینطوری عمل کنید : </p>
<pre class="brush: bash; title: ; notranslate">
EDITOR=nano crontab -e
</pre>
<p>اینجوری ویرایشگر مورد علاقتون باز میشه و اگه قبلا cron داشته باشید این فایل که باز شده خالی نیست. ولی ممکنه خالی باشه :)‌اونوقت باید یه چیزی شبیه این توش نوشته بشه : </p>
<pre class="brush: plain; title: ; notranslate">
0  2  *  *  *  /bin/aria.sh
0  8  *  *  *  /usr/bin/killall aria2c
</pre>
<p>ساعت ۲ و ۸ به ترتیب شروع و پایان دانلود رایگان منه. اگه از قبل چیزی در اون فایل بود، فقط اینو به انتهاش اضافه کنید.<br />
فرض بر اینه که اسم اسکریپتی که بالاتر نوشتم، aria.sh باشه توی پوشه bin باشه (شما جای دیگه بذارید من توی mini یه کم محدودیت داشتم :)) )و اجرایی هم شده باشه به این صورت : </p>
<pre class="brush: bash; title: ; notranslate">
chmod a+x /bin/aria.sh
</pre>
<p>دستور killall هم معمولا تو همین آدرسه ولی اگه خواستید مطمئن بشید بزنید : </p>
<pre class="brush: bash; title: ; notranslate">
which killall
</pre>
<p>همین :)) فقط کافیه لیست فایلهایی که میخواید دانلود کنید رو بذارید تو فایل dl.lst که اول ساختید. </p>
<p><strong>خود درگیری به سبک یک گیک!!!<br />
</strong><br />
<span id="more-1068"></span><br />
خوب خیلیها تا همین‌جا براشون کافیه، برای من نبود.من میخوام دو تا سیستم رو هم به روز نگه دارم. یکی سیستم خودم که آرچه و یکی دیگه هم سیستم بیتا، که مینته. در حقیقت میخوام آپدیتها توی دانلود شبانه گنجونده بشه، و در نهایت بگیرمشون و روی سیستم خودم داشته باشمشون. و اینکار خیلی ساده انجام بشه. یعنی هی نخوام فایلها رو از رو اون سیستم بیارم اینور کپی کنم و فلان. خوب اینجا دیگه حقیقتا حس bash نوشتن نداشتم این شد که رفتم سراغ PHP .<br />
خوب برای اینکار sftp بهترین گزینست. روی دو سیستم اصلی openssh نصبه و روی مینی هم یه نسخه ساده کامپایل کردم از قبل. خوب برای انتقال فایل از sftp میشه این دستورات رو استفاده کرد : </p>
<pre class="brush: bash; title: ; notranslate">
cd /target/dir/on/local
sftp user@server &lt;&lt;EOF
cd /target/dir/on/remote
put /file/address/in/local
get /file/address/in/remote
quit
EOF
</pre>
<p>خوب زیاد هم سخت نیست. فرض کنید بخواید یه فایل از اون سرور انتقال بدید این طرف، یه فایل از این طرف بفرستید اون طرف :) اول تو سیستم خودتون وارد پوشه مقصد میشید. دستور sftp رو اجرا میکنید بعد توی sftp با کمک دستور cd (که اونجا هم دقیقا مثل اصلش کار میکنه) وارد پوشه مقصد میشید. با دستور put که بعدش باید آدرس فایل روی ماشین خودتون باشه، فایل فرستاده میشه تو پوشه‌ای که بهش cd کردید تو ماشین دوم (سرور) و با دستور get یه فایل رو میتونید از اونجا بگیرید و توی پوشه‌ای که توی ماشین خودتون قبل از دستور sftp داخلش شدید قرار میگیره. و بعد هم quit که خارج میشه .<br />
اون EOF هم یه چیزی مثل Heredoc ها توی PHP رو برای bash پیاده سازی میکنه و میگه از اینجا تا زمانی که به EOF برسی، یه دستوره و چند خط پیاپی و بی ربط نیست.<br />
تنها دستور دیگه که لازمه rm ـه که توی sftp هم دقیقا مثل rm اصلی عمل میکنه (sftp هم چیزی جدای از ssh نیست :) )<br />
خوب قدم به قدم.<br />
اول نیاز دارم بدونم که چه فایلهایی باید برای آپدیت دانلود شن: </p>
<pre class="brush: php; title: ; notranslate">
#!/usr/bin/php
&amp;lt;?php
echo &amp;quot;Get update list from pacman...\n&amp;quot;;

$updlist = &lt;code&gt;sudo pacman -Syup | egrep -o -e &amp;quot;(ht|f)tp://[^\']+&amp;quot;&lt;/code&gt;;
$updlist = explode(&amp;quot;\n&amp;quot;, $updlist );

$updPkg = &lt;code&gt;sudo pacman -Sup --print-format %n&lt;/code&gt;;
$updPkg = explode(&amp;quot;\n&amp;quot;, $updPkg );

while (substr($updPkg[0] , 0 , 2) == '::')
    array_shift($updPkg);

$neededPkg = array ();
foreach ($updlist as $indx =&amp;gt; $pkg)
{
    if (!empty($pkg))
    {
        $neededPkg[$updPkg[$indx]] = $pkg;
	}
}
echo &amp;quot;List updates : &amp;quot;;
print_r($neededPkg);

</pre>
<p>اول pacman رو اجرا میکنیم با سوییچ p و لیست دانلودها رو میگیریم. منتها من بدم نمیومد که اسم پکیجها رو هم داشته باشم. اجرای دوباره pacman برای گرفتن اسم پکیجهاست. بعد این آدرسها رو توی آرایه neededPkg گذاشتم.<br />
حالا وقت اینه که بررسی کنم ببینم آیا قبلا، هیچکدوم از این فایلها دانلود شدن یا نه؟ اونم به این صورت انجام دادم : </p>
<pre class="brush: php; title: ; notranslate">
define ('server','root@192.168.1.24' );
echo &amp;quot;Get downloaded list... \n&amp;quot;;

$cmnd  = &amp;quot;sftp &amp;quot; . server . &amp;quot; &amp;lt;&amp;lt; EOF
ls /mnt/sd
quit
EOF&amp;quot;;

$files =explode (&amp;quot;\n&amp;quot;,&lt;code&gt;$cmnd&lt;/code&gt;);

$results = array( );

foreach ( $files as $fi )
{
	$f = trim($fi);
    if ( substr($f , 0 , strlen( &amp;quot;/mnt/sd/&amp;quot; ) ) == '/mnt/sd/')
        $results[ basename($f)] = $f;
}

echo &amp;quot;This is the list of files available on sd card : \n&amp;quot;;
print_r($results);
</pre>
<p>خیلی ساده :) sftp رو اجرا میکنم، دستور ls رو اجرا میکنم، بعد خروجی رو میگیرم. نتیجه توی آرایه results ریخته شده.<br />
گام سوم ببینم آیا فایلی از فایلهایی که میخوام تو لیست هست یا نه. aria2 وقتی دانلود هنوز تموم نشده باشه یه فایل کنار فایل اصلی میسازه به اسم همون فایل فقط آخرش یه .aria2 میچسبونه. وجود این فایل میتونه نشون بده که فایل کامل دانلود نشده : </p>
<pre class="brush: php; title: ; notranslate">

$downloaded = array();
$newList = array();
foreach ($neededPkg as $pkg =&gt; $addreess)
{
    $x = basename($addreess);
    if (isset($results[$x] ) &amp;&amp; !isset( $results[$x . &quot;.aria2&quot;]))
    {
       $downloaded[$pkg] = $x;
       echo $x . &quot; is done. \n&quot;;
    }
    else
    {
        $newList[] = $addreess;
        echo $x . &quot; is NOT done. \n&quot;;
    }
}

$newList = implode(&quot;\n&quot;, $newList );
file_put_contents(&quot;/tmp/upd.lst&quot; , $newList);
</pre>
<p>اگه دقت کنید یه فایل لیست ایجاد شده (/tmp/upd.lst ) حاوی فایلهایی که لازمن ولی هنوز دانلودشون تموم نشده. آرایه downloaded هم لیست فایلهاییه که دانلود شدن. خوب حالا قدم نهایی گرفتن این فایلهاست از سرور و آوردنشون روی سیستم محلیه.<br />
من میخوام اونها رو بریزم توی پوشه‌ای به نام .upd توی home خودم. برای همین لازمه که اول وارد این پوشه بشم : </p>
<pre class="brush: php; title: ; notranslate">

chdir (&amp;quot;/home/f0rud/.upd&amp;quot;);

$newCmnd = 'sftp ' . server . &amp;quot; &amp;lt;&amp;lt;EOF
cd /mnt/sd/
rm /mnt/sd/upd.lst
put /tmp/upd.lst
&amp;quot;;

$pacman = 'sudo pacman -S --noconfirm ';
$updateIsAvailable = false;
foreach ($downloaded as $p =&amp;gt; $x)
{
    $newCmnd .= &amp;quot;\nget \&amp;quot;/mnt/sd/$x\&amp;quot;&amp;quot;;
    $newCmnd .= &amp;quot;\nrm \&amp;quot;/mnt/sd/$x\&amp;quot;&amp;quot;;
    $pacman .= &amp;quot; $p &amp;quot;;
    $updateIsAvailable = true;
}

$newCmnd .= &amp;quot;\nquit
EOF
&amp;quot;;

echo $newCmnd;

&lt;code&gt;$newCmnd&lt;/code&gt;;
</pre>
<p>یه متغیر newCmnd درست میشه که توی این دستور، فایل upd.lst که دفعه قبل ساخته شد، فرستاده میشه به طرف سرور، فایلهایی که در مرحله قبل فهمیدیم دانلودشون تموم شدن، یکی یکی از سرور گرفته میشن، بعد از روی سرور حذف میشن، و همزمان یه دستوری هم ساخته میشه که باید در مرحله آخر برای آپدیت فایلهای دانلود شده اون دستور اجرا بشه. (منظورم متغیر pacman توی کده. ) خوب، وقتشه newCmnd اجرا میشه (یادم رفت بگم که اپراتور بک تیک <code> توی PHP ، دستور رو داخل شل اجرا میکنه :)) ) محض احتیاط، دستور ایجاد شده رو هم چاپ میکنیم که ببینیم چه خبره :)<br />
و حالا گام آخر، وقتشه که پکمن اجرا بشه. </p>
<pre class="brush: php; title: ; notranslate">

if ($updateIsAvailable)
{
	$str = &amp;quot;sudo mv /home/f0rud/.upd/* /var/cache/pacman/pkg/&amp;quot;;
	&lt;/code&gt;$str&lt;code&gt;;

	echo $pacman;

	&lt;/code&gt;$pacman&lt;code&gt;;
}else
	echo &amp;quot;No update for now.&amp;quot;;
</pre>
<p>اگه آپدیتی باشه، فایلها به پوشه کش پکمن منتقل میشن، و بعد پکمن اجرا میشه.<br />
خوب حالا یه مشکلی هست، این فایل upd.lst که الان اون طرف هست، چطور باید به لیست دانلود اضافه بشه؟ خیلی ساده! اسکریپت بالایی رو که هنوز یادتون هست؟ همونی که aria2 رو اجرا میکرد و اسمش aria.sh بود . تغییرش دادم به این : </p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

cd /mnt/sd/
cat /mnt/sd/upd.lst &gt; /mnt/sd/dl
echo &quot; &quot; &gt;&gt; /mnt/sd/dl
cat /mnt/sd/dl.lst &gt;&gt; /mnt/sd/dl

aria2c -i /mnt/sd/dl -m 10 -j 2
</pre>
<p>همین :)) حالا کافیه که فایل php رو اجرایی کنم، و بعد هم خیلی ساده اونو اجراش کنم و تمام! خودش همه کارها رو انجام میده. فقط یه مشکل :) این sftp رمز میخواد. sudo هم به همچنین :) حالا sudo قابل تحمله،‌ چون یه بار که میپرسه تا یه مدتی بیخیال میشه :) ولی sftp چی؟ خیلی سادست :)) </p>
<p>توجه کنید لطفا! اگر قبلا برای مثلا github یا هر جای دیگه یا هر دلیل دیگه کلید خودتون رو درست کردید، گام اول رو انجام ندید وگرنه کلید قبلی از بین میره!!!! </p>
<pre class="brush: plain; title: ; notranslate">
~  ᐅ ssh-keygen   
Generating public/private rsa key pair.
Enter file in which to save the key (/home/f0rud/.ssh/id_rsa): 
Created directory '/home/f0rud/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/f0rud/.ssh/id_rsa.
Your public key has been saved in /home/f0rud/.ssh/id_rsa.pub.
The key fingerprint is:
29:90:f2:bc:3b:61:4a:d1:32:85:03:f0:70:4f:d3:a3 f0rud@elbit
The key's randomart image is:
+--[ RSA 2048]----+
|=...o.           |
| +oo.oo          |
|  o++. .         |
|  ++E.   .       |
|   +o . S        |
|  . o. .         |
| . o..           |
|  . ..           |
|    ..           |
+-----------------+
</pre>
<p>با دستور ssh-keygen یه کلید جدید درست کنید. هر چی پرسید فقط Enter بزنید. یعد در گام دوم، با دستور ssh-copy-id این کلید رو منتقل کنید به ماشین مقصد : </p>
<pre class="brush: bash; title: ; notranslate">
ssh-copy-id root@192.168.1.24 
</pre>
<p>اینجا رمز ماشین رو میپرسه، بعد کلید رو منتقل میکنه. حالا سعی کنید به ماشین مقصد ssh کنید. اگه همه چی درست باشه دیگه رمز ازتون نمیپرسه. خوب همه چی حله!!!!<br />
اینم کل اسکریپت بالایی به صورت یک جا : </p>
<pre class="brush: php; title: ; notranslate">
#!/usr/bin/php
&amp;lt;?php
define ('server','root@192.168.1.24' );

echo &amp;quot;Get update list from pacman...\n&amp;quot;;

$updlist = &lt;/code&gt;sudo pacman -Syup | egrep -o -e &amp;quot;(ht|f)tp://[^\']+&amp;quot;&lt;code&gt;;
$updlist = explode(&amp;quot;\n&amp;quot;, $updlist );

$updPkg = &lt;/code&gt;sudo pacman -Sup --print-format %n&lt;code&gt;;
$updPkg = explode(&amp;quot;\n&amp;quot;, $updPkg );

while (substr($updPkg[0] , 0 , 2) == '::')
    array_shift($updPkg);

$neededPkg = array ();
foreach ($updlist as $indx =&amp;gt; $pkg)
{
    if (!empty($pkg))
    {
        $neededPkg[$updPkg[$indx]] = $pkg;
	}
}
echo &amp;quot;List updates : &amp;quot;;
print_r($neededPkg);

echo &amp;quot;Get downloaded list... \n&amp;quot;;

$cmnd  = &amp;quot;sftp &amp;quot; . server . &amp;quot; &amp;lt;&amp;lt; EOF
ls /mnt/sd
quit
EOF&amp;quot;;

$files =explode (&amp;quot;\n&amp;quot;,&lt;/code&gt;$cmnd&lt;code&gt;);

$results = array( );

foreach ( $files as $fi )
{
	$f = trim($fi);
    if ( substr($f , 0 , strlen( &amp;quot;/mnt/sd/&amp;quot; ) ) == '/mnt/sd/')
        $results[ basename($f)] = $f;
}

echo &amp;quot;This is the list of files available on sd card : \n&amp;quot;;
print_r($results);

$downloaded = array();
$newList = array();
foreach ($neededPkg as $pkg =&amp;gt; $addreess)
{
    $x = basename($addreess);
    if (isset($results[$x] ) &amp;amp;&amp;amp; !isset( $results[$x . &amp;quot;.aria2&amp;quot;]))
    {
       $downloaded[$pkg] = $x;
       echo $x . &amp;quot; is done. \n&amp;quot;;
    }
    else
    {
        $newList[] = $addreess;
        echo $x . &amp;quot; is NOT done. \n&amp;quot;;
    }
}

$newList = implode(&amp;quot;\n&amp;quot;, $newList );
file_put_contents(&amp;quot;/tmp/upd.lst&amp;quot; , $newList);

chdir (&amp;quot;/home/f0rud/.upd&amp;quot;);

$newCmnd = 'sftp ' . server . &amp;quot; &amp;lt;&amp;lt;EOF
cd /mnt/sd/
rm /mnt/sd/upd.lst
put /tmp/upd.lst
&amp;quot;;

$pacman = 'sudo pacman -S --noconfirm ';
$updateIsAvailable = false;
foreach ($downloaded as $p =&amp;gt; $x)
{
    $newCmnd .= &amp;quot;\nget \&amp;quot;/mnt/sd/$x\&amp;quot;&amp;quot;;
    $newCmnd .= &amp;quot;\nrm \&amp;quot;/mnt/sd/$x\&amp;quot;&amp;quot;;
    $pacman .= &amp;quot; $p &amp;quot;;
    $updateIsAvailable = true;
}

$newCmnd .= &amp;quot;\nquit
EOF
&amp;quot;;

echo $newCmnd;

&lt;/code&gt;$newCmnd&lt;code&gt;;

if ($updateIsAvailable)
{
	$str = &amp;quot;sudo mv /home/f0rud/.upd/* /var/cache/pacman/pkg/&amp;quot;;
	&lt;/code&gt;$str&lt;code&gt;;

	echo $pacman;

	&lt;/code&gt;$pacman`;
}else
	echo &amp;quot;No update for now.&amp;quot;;

</pre>
<p>چقدر نوشتم!!!!!</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1068/challenge-accepted/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/264/download-with-resume-support-in-php/' rel='bookmark' title='دانلود فایل با قابلیت Resume در PHP'>دانلود فایل با قابلیت Resume در PHP</a> <small>کد انتهایی یه مشکل کوچک داشت که اصلاح شد :)‌...</small></li>
<li><a href='http://cyberrabbits.net/403/source-forge-redirector/' rel='bookmark' title='دانلود از SourceForge بدون مشکل'>دانلود از SourceForge بدون مشکل</a> <small>اسکریپت رو اگه نصب کردید دوباره آپدیت کنید، چون sf...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/Qa9nkCSVqVg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1068/challenge-accepted/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 Trait</title>
		<link>http://cyberrabbits.net/1056/php-5-4-trait/</link>
		<comments>http://cyberrabbits.net/1056/php-5-4-trait/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 10:32:33 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Class]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[singleton]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1056</guid>
		<description><![CDATA[یکی از قابلیتهای جدیدی که به PHP 5.4 (که بالاخره چند روز پیش نسخه نهاییش منتشر شد) اضافه شده، Trait ها هستن. خیلی زبانها اجازه ارث بری چندگانه رو میدن ولی PHP از اونها نیست. البته این قابلیت-ارث بری چندگانه-، به نظر شخصی من یکی از اون قابلیتهاییه که توی ایجاد کردن دردسر و ابهام [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1002/phpunit/' rel='bookmark' title='PHPUnit'>PHPUnit</a> <small>یکی از کارهایی که به عنوان برنامه نویس باید انجام...</small></li>
<li><a href='http://cyberrabbits.net/733/regular-expression-part1/' rel='bookmark' title='عبارات با قاعده در PHP – بخش اول'>عبارات با قاعده در PHP – بخش اول</a> <small>عبارات با قاعده، به نظر خیلی ها ترسناکه. به نظر...</small></li>
<li><a href='http://cyberrabbits.net/411/mysql-menu-part-3/' rel='bookmark' title='Mysql Menu قسمت سوم'>Mysql Menu قسمت سوم</a> <small>چند وقت پیش در باره منو و طریقه ایجاد آن...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از قابلیتهای جدیدی که به PHP 5.4 (که بالاخره چند روز پیش<a href="http://www.php.net/archive/2012.php#id2012-03-01-1"> نسخه نهاییش منتشر شد</a>) اضافه شده، <a href="https://wiki.php.net/rfc/horizontalreuse">Trait</a> ها هستن. خیلی زبانها اجازه ارث بری چندگانه رو میدن ولی PHP از اونها نیست. البته این قابلیت-ارث بری چندگانه-، به نظر شخصی من یکی از اون قابلیتهاییه که توی ایجاد کردن دردسر و ابهام میتونه خیلی نقش داشته باشه.<br />
PHP توی نسخه جدید،‌برای رفع این نقیصه یه موجودیت جدید رو معرفی کرده که البته دقیقا همون ارث بری چندگانه نیست، ولی به اندازه کافی مفید هست.. </p>
<p>خیلی وقتها کلاسهایی که مینویسیم، شباهتهایی با همدیگه دارن. مثلا برای سینگلتون من همیشه اینطور عمل میکنم : </p>
<pre class="brush: php; title: ; notranslate">
class Singleton
{
	private static $instance;

	public static function getInstance(){
		if (!self::$instance)
			self::$instance = new self();
		return self::$instance;
	}

}
</pre>
<p>حالا اگه من تعداد زیادی کلاس داشته باشم که بخوام همه اونها سینگلتون باشن، بای همه رو از این کلاس به ارث ببرم، که عملا ممکن نیست، مثلا من نمیتون کلاس مربوط به دیتابیس و کلاس مربوط به Translation رو از یه کلاس مشترک شروع کنم. </p>
<p>قبلا <a href="http://ir2.php.net/manual/en/language.oop5.interfaces.php">interface</a> ها معرفی شده بودن، ولی اونها فقط یه اعلام تابع هستن و بدنه تابع، برای هر کلاس باید دوباره توی خود کلاس نوشته بشه.<br />
توی زبانهایی مثل C++ میشه اینو خیلی ساده حل کرد، هر کلاس میتونه بیشتر از یه پدر داشته باشه،‌و تمام. (مثلا کلاس دیتابیس میتونه همزمان از کلاس دیتابیس پایه ارث ببره و هم از اینکلاس Singleton ) ولی PHP اون روش رو انتخاب نکرد، و من خوشحالم که اینکار رو نکرد، چون قبلا صابون ارث بری چندگانه به تنم خورده بود :)) </p>
<p>trait ها، یه موجودیت کامل نیستن. امکان نداره بشه یه شی از یه trait ساخت. اونها کلاس نیستن، بلکه قراره که بخشی از یه کلاس باشن.<br />
مثلا برای مثال سینگلتون : </p>
<pre class="brush: php; title: ; notranslate">
trait Singleton 
{
	private static $instance;

	public static function getInstance(){
		if (!self::$instance)
			self::$instance = new self();
		return self::$instance;
	}
}


class MySingletonClass 
{
	use Singleton;
}

$singleton = MySingletonClass::getInstance();
</pre>
<p>&#8211; یه نکته خیلی جالب، تو سایت php.net نوشته که </p>
<blockquote><p>
Static variables can be referred to in trait methods, but cannot be defined by the trait.
</p></blockquote>
<p>یعنی من نمیتونم یه متغیر استاتیک رو داخل یک trait تعریف کنم، ولی کد بالا بدون مشکل کار میکنه و این عجیبه! (همین کد بالا اجرا میشه،‌اگه به جای private عمومی هم باشه اجرا میشه و کلا مشکلی نیست.)</p>
<p>این خیلی ساده، باعث میشه که شما از نوشتن کد زاید بی نیاز بشید. مثالهای خیلی بهتر و جامعتری میشه ارایه داد، برای من که در عمل خیلی پیش اومده که یه قسمت از یه کلاس بارها و بارها در کلاسهای دیگه استفاده بشه. توی کامنتهای خود سایت php.net یه مثال جالب بود، و اونهم اینکه trait در حقیقت مثل Copy/Paste عمل میکنه و من تا حدی باهاش موافقم</p>
<p>مثالهای خود <a href="http://php.net/manual/en/language.oop5.traits.php">php.net</a> هم جالبن :<br />
یه کلاس میتونه از یه کلاس دیگه ارث ببره و هر چند تا trait هم داشته باشه مثلا : </p>
<pre class="brush: php; title: ; notranslate">

class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o-&gt;sayHello();  //Result is Hello World!
</pre>
<p>از طرفی تا یه حدی مشکل تداخل هم هست. در بعضی موارد، PHP اونها رو رفع میکنه مثلا در این مورد :</p>
<pre class="brush: php; title: ; notranslate">
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o-&gt;sayHello();  //Result is Hello Universe!
</pre>
<p>متد خود کلاس بعد از use اومده و اونه که اولویت داره. </p>
<p>یه نکته جالب دیگه اینه که میشه هر چند تا trait رو توی یه کلاس استفاده کرد :‌</p>
<pre class="brush: php; title: ; notranslate">
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo ' World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o-&gt;sayHello();
$o-&gt;sayWorld();
$o-&gt;sayExclamationMark();
</pre>
<p>اگه دو trait تو یه کلاس استفاده بشن، و بعد هر دو یه متد رو داشته باشن، با خطای fatal متوقف میشید. برای اینکه بتونید این مشکل رو حل کنید و ابهام به وجود نیاد، PHP کلمه کلیدی جدید معرفی کرده به اسم insteadof (به شباهتش با instanceof توجه کنید، فکر کنم عمدا اینطوری انتخاب شده که شبیه باشن) </p>
<p>علاوه بر او کلیدواژه as هم میشه برای تغییر اسم دادن یک متد از یک trait توی یک کلاس استفاده میشه مثلا : </p>
<pre class="brush: php; title: ; notranslate">
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
</pre>
<p>البته as یه کاربرد دیگه هم داره و اون تغییر دسترسی یک متده . مثلا اگه یه متد توی trait عمومی باشه (public ) و شما بخواید تو کلاستون اونو محافظت شده داشته باشید : </p>
<pre class="brush: php; title: ; notranslate">
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

// Change visibility of sayHello
class MyClass1 {
    use HelloWorld { sayHello as protected; }
}

// Alias method with changed visibility
// sayHello visibility not changed
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
</pre>
<p>یک trait خودش میتونه از trait های دیگه استفاده کنه : </p>
<pre class="brush: php; title: ; notranslate">
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World!';
    }
}

trait HelloWorld {
    use Hello, World;
}

class MyHelloWorld {
    use HelloWorld;
}

$o = new MyHelloWorld();
$o-&gt;sayHello();
$o-&gt;sayWorld();

</pre>
<p>توی trait ها میتونیم متد غایب داشته باشیم (abstract) ولی وقتی یه trait توی یک کلاس استفاده میشه اون کلاس یا باید خودش abstract باشه و اگه نیست باید حتما اون متد رو پیاده سازی کنه : </p>
<pre class="brush: php; title: ; notranslate">
trait Hello {
    public function sayHelloWorld() {
        echo 'Hello'.$this-&gt;getWorld();
    }
    abstract public function getWorld();
}

class MyHelloWorld {
    private $world;
    use Hello;
    public function getWorld() {
        return $this-&gt;world;
    }
    public function setWorld($val) {
        $this-&gt;world = $val;
    }
}

</pre>
<p>البته trait میتونه property هم تعریف کنه،‌ولی در این صورت کلاسی که ازش استفاده میکنه نمیتونه همون property رو داشته باشه تو ساختارش، چون با هم تداخل پیدا میکنن، و این تداخل، قابل اصلاح نیست (بر خلاف تداخل متدها). البته اگه مقدار اولیه دو خصیصه یکی باشه، خطایی گرفته نمیشه. نکته قابل توجه اینه که این مشکل درباره static property ها نیست، و در اون صورت خطایی اعلام نمیشه، ولی منطقا غلطه و این خطرناکتره به نظر من : </p>
<pre class="brush: php; title: ; notranslate">

trait PropertiesTrait {
    public $same = true;
    public $different = false;
}

class PropertiesExample {
    use PropertiesTrait;
    public $same = true; // Strict Standards.
    public $different = true; // Fatal error
}
</pre>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1056/php-5-4-trait/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1002/phpunit/' rel='bookmark' title='PHPUnit'>PHPUnit</a> <small>یکی از کارهایی که به عنوان برنامه نویس باید انجام...</small></li>
<li><a href='http://cyberrabbits.net/733/regular-expression-part1/' rel='bookmark' title='عبارات با قاعده در PHP – بخش اول'>عبارات با قاعده در PHP – بخش اول</a> <small>عبارات با قاعده، به نظر خیلی ها ترسناکه. به نظر...</small></li>
<li><a href='http://cyberrabbits.net/411/mysql-menu-part-3/' rel='bookmark' title='Mysql Menu قسمت سوم'>Mysql Menu قسمت سوم</a> <small>چند وقت پیش در باره منو و طریقه ایجاد آن...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/XPL9CqSARYs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1056/php-5-4-trait/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>مشکلات من و جامعه نرم افزار آزاد ایران</title>
		<link>http://cyberrabbits.net/1014/me-and-freesoftware-community-iran/</link>
		<comments>http://cyberrabbits.net/1014/me-and-freesoftware-community-iran/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 14:48:40 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[freesoftware]]></category>
		<category><![CDATA[fsf]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1014</guid>
		<description><![CDATA[من الان مدتهاست که از نرم افزارهای آزاد استفاده میکنم و خودمو از این جامعه میدونم. ولی یه سری مشکلات هم با این جامعه (بیشتر منظورم اعضا و رفتارشونه) دارم که تصمیم گرفتم به عنوان یه انتقاد مطرحش کنم. منتها برای اینکه سوتفاهم پیش نیاد، لینک به جاهایی که میتونید مثالش رو ببینید نمیدم :) [...]<div class='yarpp-related-rss yarpp-related-none'>

بدون پست مرتبط.
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>من الان مدتهاست که از نرم افزارهای آزاد استفاده میکنم و خودمو از این جامعه میدونم. ولی یه سری مشکلات هم با این جامعه (بیشتر منظورم اعضا و رفتارشونه) دارم که تصمیم گرفتم به عنوان یه انتقاد مطرحش کنم. منتها برای اینکه سوتفاهم پیش نیاد، لینک به جاهایی که میتونید مثالش رو ببینید نمیدم :)<br />
<em>یه نکته مهم : این نقطه نظر منه، و مطمئنا میتونید بهش ایراد بگیرید و انتقاد کنید، ولی هیچ توهینی در کامنتها به هیچ شخصی اجازه انتشار پیدا نمیکنه.<br />
</em><br />
<strong>۱- من فقط و فقط از فلان نرم افزار استفاده میکنم.</strong><br />
این جمله که به خودی خود بد نیست،‌ بیشتر در مورد سیستم عامله، که من فقط و فقط از لینوکس استفاده میکنم. این قسمتش بده که همه رو تشویق میکنن به این سیستم عامل، و کلا باقی سیستم عامل ها بد و اخی هستند و &#8230; در حال حاظر من هم فقط و فقط از لینوکس استفاده میکنم. ولی اگه یه سیستم عامل دیگه پیدا بشه (شما بگو همون ویندوز) که نیازهای منو برطرف کنه، حتما به طرفش میرم و لینوکس رو کنار میذارم. مساله اصلی اینه که ما توی جامعه مون اینرو درک نمیکنیم که نیازهای افراد متفاوته. مثلا نیاز اول من آزادیه سیستم عاملمه، یعنی اینکه (مثلا) GPL باشه. یه روز اگه ویندوز GPL بشه، و خیلی مشکلات دیگشو حل کنه،‌ به نحوی که برای نیازهای من مناسب تر بشه، حتما میرم سراغ اون. حتی اگه سیستم عامل اپل هم باشه یا هر سیستم عامل دیگه.<br />
ولی نیازهای من با نیازهای همه برابر نیست. خیلی ها ممکنه بنا به دلایلی که خودشون میدونن اصلا با آزاد بودن یا نبودن براشون مهم نباشه! حالا چرا ما تا حرفی از فلان نرم افزار میاد، سریعا موضع میگیریم که نه اون آزاد نیست! یا اون فلان نیست! خوب شاید برای شما این نرم افزار مناسب نباشه، اما دلیلی نداره که برای بقیه هم اینطور باشه!!! مثلا خود من الان برای درایور کارت گرافیکم از دریاور آزاد استفاده نمیکنم. چون نیازهای منو برآورده نمیکنه، همین! دیگه حالا شما بیا دو ساعت فلسفه بباف!<br />
<strong>۲- بت سازی و لولو سازی</strong><br />
این یکی کلا مثل اینکه مشکل جامعه ایرانه. ما عادت داریم بت بسازیم. مثلا شما همین الان به یه سری از دوستای من بگو که استالمن احمقه!‌ (فقط مثاله، من استالمن رو دوست دارم لطفا من رو اعدام نکنید) بلافاصله موضع میگیرن، حتی نمیپرسن چرا! لینوس تروالدز، اریک ریموند و &#8230; همه اینها از این دست هستند. حالا برعکسشم هست. برای اینها، بیل گیتز یه لولوی بزرگه، ولی اگه من اعلام کنم ازش خوشم میاد (که همین جا میگم که من یک طرفدار پروپاقرض فعالیتهای انسان دوستانه این بشر هستم و به خاطر این قضیه ستایشش میکنم و در صحبتهای روزانه من یکی از مثالهای منه .)  حتما واکنش نشون میدن.<br />
یا مثلا وقتی مسخره بازی افرادی که تو عمرشون حتی یه محصول اپل رو از نزدیک ندیدن، با مرگ استیوجابز شروع شد، گاهی واکنشهای دوستان ما احمقانه تر بود. خود من مشخصا از این کار هموطنهام خوشم نیومد، ولی عکس العمل های دوستان، برام بیشتر عذاب آور بود!<br />
در این مورد هم،‌دقیقا مثل مورد اول، همه چی برمیگرده به تعریف آدم موفق و الگو از دید افراد مختلف. البته این ایراد بزرگ همیشه وارده که یه آدم موفق در همه زمینه ها که موفق نبوده، پس دلیلی نداره دربست قبولش داشته باشی. کل حرف من اینه : </p>
<pre class="brush: plain; title: ; notranslate">
foreach ( $greatPersons as $person ( {
echo &quot; $person انسان بزرگیه، ولی من ترجیح میدم در همه زمینه ها دنباله رو اون نباشم. کلا زندگی من با اون فرق میکنه، دلیلی نداره منم مثل اون زندگی کنم یا فکر کنم. لطفا اینو بفهمید! \n&quot;

//
</pre>
<p><strong>۳-توهم برتری</strong><br />
این یکی چیز جدایی از دو تای بالایی نیست. این اواخر زیاد میشنوم که مثلا فلان سیستم چه ایده هایی رو از لینوکس/گنوم/KDE یا .. وام گرفته. خوب که چی؟ مثلا ویندوز جدیدا یه چیزی مثل Software Center تو اوبونتو  زده، همه دادشون رفته به هوا که اونها دارن میدزدن اینو یا اینکه &#8230;<br />
بد نیست یه مثال بزنم،‌ فکر کنم استالمن، یا شاید کس دیگه ای :) میگه اگه بتهوون الان زنده بود و میخواست آهنگ بسازه، احتمالا به موفقی گذشته نبود، چون کلی باید وقت میذاشت که اون تیکه آهنگهایی که پتنت دارن رو تو آهنگهاش نیاره، و بر خلاف قانون عمل نکنه. خوب این یعنی محدودیت، همه اینو میدونیم و مخالفش هستیم، یعنی تو جامعه ما، بدترین کار پتنت کردن یه ایدست. در مورد کد،‌ما حق داریم که کدی رو که نوشتیم رو لیسانس براش بذاریم، GPL یا هر چیز دیگه ای. ولی در مورد ایده ها این درست نیست. نمونه های زیادی هم هست، مثلا خیلی ها دوباره میان میشینن و یه سری بازی رو برای اینکه آزاد باشن دوباره از نو مینویسن. خیلی از نرم افزارها بر اساس نسخه های غیر آزادشون گسترش داده میشن. یه قابلیت که توسط اونها پیاده سازی میشه، یا چرا راه دور بریم؟ گنو شروعش همین بود. خود استالمن شروع کرد به نوشتن یه سری برنامه، با لیسانس جدید دقیقا شبیه برنامه های قبلی که بودن از اول.<br />
دستور ls مثلا، دقیقا معادل دستور اولیه ls که آزاد نبود و توی یونیکس بود کار میکنه. خوب دقیقا همون قدر که یونیکسی ها میتونن به این قضیه گیر بدن که شما دارید از ایده های ما (نه برنامه های ما) استفاده میکنید، ما هم میتونیم بگیم که آی ویندوزی های یا اپلی ها، شما هم دارید از ایده های ما استفاده میکنید. </p>
<p>البته یکی دیگه هم هست، منتها نمیخوام بنویسمش، چون خیلی عمومی نیست و محدود میشه به یه عده خاص از دوستان و منم دلم نمیخواد مایه دلخوری بشم. ولی این مواردی که گفتم، همه چیزهایی هستند که توی جامعه کوچیک ولی جذاب ما، منو آزار میده، و چون عمومی بودن از دید من نوشتمشون. </p>
<p>&#8211; انتقاد کنید، ممنون میشم. ولی بازم میگم توهینی منتشر نمیشه.</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1014/me-and-freesoftware-community-iran/"></g:plusone></div><div class='yarpp-related-rss yarpp-related-none'>
<p>بدون پست مرتبط.</p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/1ll2upQKrUQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1014/me-and-freesoftware-community-iran/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>سایت کاربران آرچ لینوکس فارسی</title>
		<link>http://cyberrabbits.net/1005/archlinux-i/</link>
		<comments>http://cyberrabbits.net/1005/archlinux-i/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 10:37:48 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[ArchLinux]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1005</guid>
		<description><![CDATA[بالاخره بعد از یک سال تاخیر، سایت آرچ لینوکس فارسی فعالیت خودش رو رسما شروع کرد. فروم، ویکی و سایت اصلی که تا حد ممکن سعی شده شبیه به سایت اصلی باشن. قبلا گاه و بیگاه درباره آرچ لینوکس نوشتم، توزیعی که بیشتر از هرچیزی بر اصل KISS اصرار داره، و بنا به دلایل کاملا [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
<li><a href='http://cyberrabbits.net/664/arch-custom-kernel-compile/' rel='bookmark' title='پچ جادویی :) برای آرچ لینوکس'>پچ جادویی :) برای آرچ لینوکس</a> <small>این نوید، باید بازاریاب بشه یا فروشنده! این نوشته رو...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>بالاخره بعد از یک سال تاخیر، سایت آرچ لینوکس فارسی فعالیت خودش رو رسما شروع کرد. فروم، ویکی و سایت اصلی که تا حد ممکن سعی شده شبیه به سایت اصلی باشن.<br />
<a href="http://cyberrabbits.net/1005/archlinux-i/archlinux-logo/" rel="attachment wp-att-1007"><img src="http://cyberrabbits.net/wp-content/uploads/2012/02/archlinux-logo.png" alt="" title="archlinux-logo" width="500" height="166" class="aligncenter size-full wp-image-1007" /></a><br />
قبلا گاه و بیگاه درباره آرچ لینوکس نوشتم، توزیعی که بیشتر از هرچیزی بر اصل <acronym title="Keep it simple, stupid.">KISS</acronym> اصرار داره، و بنا به دلایل کاملا شخصی، من اونو به هر توزیع لینوکس دیگه ای ترجیح میدم (دلیل من این نیست که مثلا این از همه بهتره، چنین ادعایی ندارم، منتها برای سلیقه من، نیازهای من خیلی مناسب بوده تا الان) و چند سال اخیر هم با اون کار میکردم و تا الان هم ازش راضیم.<br />
به هر صورت، با کمک دوست خوبم <a href="http://slashrosha.org/blog/">روزبه</a> و چند تا دوست جدید، وبسایت بالا اومده و فعاله :)) </p>
<p>سایت اصلی : <a href='http://archlinux.ir/' title='Persian Arch Linux'>Persian Arch Linux</a><br />
فروم : <a href='http://bbs.archlinux.ir/' title='Persian Arch Linux Forums'>Persian Arch Linux Forums</a><br />
ویکی : <a href='http://wiki.archlinux.ir/index.php/%D8%B5%D9%81%D8%AD%D9%87%D9%94_%D8%A7%D8%B5%D9%84%DB%8C' title='Persian Arch Linux Wiki'>Persian Arch Linux Wiki</a><br />
میلینگ لیست (که ترجیح دادیم فعلا یه گروه گوگل باشه ) : <a href='http://groups.google.com/group/archlinux-ir' title='archlinux-ir | Google Groups'>archlinux-ir | Google Groups</a></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1005/archlinux-i/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
<li><a href='http://cyberrabbits.net/664/arch-custom-kernel-compile/' rel='bookmark' title='پچ جادویی :) برای آرچ لینوکس'>پچ جادویی :) برای آرچ لینوکس</a> <small>این نوید، باید بازاریاب بشه یا فروشنده! این نوشته رو...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/VbYFveh_oaI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1005/archlinux-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHPUnit</title>
		<link>http://cyberrabbits.net/1002/phpunit/</link>
		<comments>http://cyberrabbits.net/1002/phpunit/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 16:00:50 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=1002</guid>
		<description><![CDATA[یکی از کارهایی که به عنوان برنامه نویس باید انجام بدهم، ولی تنبلی مانع از انجامش میشود، نوشتن Test برای کد‌ها و ماژولهاست. فرض کنید که یک مدل نوشته شده برای اینکه یک کاربر را شبیه سازی کند. مدلی مثلا به شکل زیر : کد چندان پیچیده نیست، اما در عمل به همین سادگی نخواهد [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1056/php-5-4-trait/' rel='bookmark' title='PHP 5.4 Trait'>PHP 5.4 Trait</a> <small>یکی از قابلیتهای جدیدی که به PHP 5.4 (که بالاخره...</small></li>
<li><a href='http://cyberrabbits.net/372/mail-for-zend-framework/' rel='bookmark' title='ارسال mail از طریق Zend Framework'>ارسال mail از طریق Zend Framework</a> <small>لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری...</small></li>
<li><a href='http://cyberrabbits.net/485/save-session-in-db/' rel='bookmark' title='ذخیره جلسات در پایگاه داده'>ذخیره جلسات در پایگاه داده</a> <small>دفعه قبل، درباره دزدیدن جلسه صحبت کردم، هنوز منتشر نشده...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از کارهایی که به عنوان برنامه نویس باید انجام بدهم، ولی تنبلی مانع از انجامش میشود، نوشتن Test برای کد‌ها و ماژولهاست. فرض کنید که یک مدل نوشته شده برای اینکه یک کاربر را شبیه سازی کند. مدلی مثلا به شکل زیر : </p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
	class UserModel {
		
		private $userName;


		private $isAuthenticated;

		public function __construct(){

			$this-&gt;userName = null;
			$this-&gt;isAuthenticated = false;
		}
		
		public function getUserName(){
			return $this-&gt;userName;
		}

		public function getIsAuthenticated(){
			return $this-&gt;isAuthenticated;
		}

		public function login($userName , $password){
			//For this example, I do it simple, but in real world we do it diffrent
			if ( $userName == 'admin' &amp;&amp; $password == 'bita')
			{
				$this-&gt;isAuthenticated = true;
				$this-&gt;userName = $userName;
				return true;
			}

			return false;

		}
	}

</pre>
<p>کد چندان پیچیده نیست، اما در عمل به همین سادگی نخواهد بود. معمولا برای تعیین اعتبار از دیتابیس استفاده میشود و جلسات (Session) هم  در آن نقش دارند. برای سادگی من همین حالت را در نظر گرفته‌ام.<br />
خوب برای اینکه این کلاس را تست کنیم و عملکردش را بررسی کنیم،‌بایستی یک نسخه از آن بسازیم و تک تک متدها را هم امتحان کنیم. چیزی مثل این : </p>
<pre class="brush: php; title: ; notranslate">
$user = new UserModel();

if ($user-&gt;getIsAuthenticated())
	echo &quot;Not OK&quot;;
else
	echo &quot;OK&quot;;

</pre>
<p>البته، با توجه به سادگی کد نوشته شده، چنین تستی ممکن است بی معنی به نظر برسد، اما خیلی وقتها همه این تست های ساده هم مهم خواهند بود.<br />
این روش، پاسخگو هست، ولی چندان خوشایند نیست. نوشتن if برای هر تست و چاپ خروجی و متن مناسب و .. همه اینها این روش را دشوار میکند. روش اصلی، استفاده از Unit Testing است.<br />
برای PHP یک کتابخانه کامل و جامع نوشته شده که میتوانید آنرا از طریق PEAR نصب کنید : </p>
<pre class="brush: bash; title: ; notranslate">
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
</pre>
<p>و همچنین میتوانید راهنمای کامل آن و برگه تقلب را هم دانلود کنید. برای یک تست ساده، برای کدی که نوشتم،‌ یک کلاس دیگر، که عمل تست را انجام میدهد ولی جزئی از پروژه اصلی نیست لازم داریم :<br />
<span id="more-1002"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
//This is our model class file
require 'UserModel.class.php';

class UserModelTest extends PHPUnit_Framework_TestCase
{
	public function testInitial()
	{
		$user = new UserModel();
		$this-&gt;assertEquals(false, $user-&gt;getIsAuthenticated());
		$this-&gt;assertEquals(null, $user-&gt;getUserName());
	}
}
</pre>
<p>کلاس جدید، از کلاس  PHPUnit_Framework_TestCase مشتق شده است، و یک متد دارد که اسم آن با test شروع شده، و داخل آن از یک سری متد استفاده شده است (در اینجا assertEquals ) متدهایی که با assert شروع میشوند، یعنی که در صورتی که شرط آنها برقرار باشد (مثلا equal بودن دو آرگومان) آنها موفق خواهند بود،‌در غیراینصورت ناموفقند. لزومی به require کردن فایلی به جز فایل اصلی که قرار است تست شود نیست، خود phpunit فایلهای مورد نیاز را در وقت اجرا اضافه خواهد کرد.<br />
خود PHPUnit کل کلاسهایی که از این کلاس استفاده کرده اند را پیدا کرده و به صورت اتوماتیک یکی یکی متدهایی که با اسمشان با test شروع شده را اجرا میکند. </p>
<p>حالا وقت اجرای تست است. بر فرض که فایل تست به نام test.php ذخیره شده باشد، دستور زیر :</p>
<pre class="brush: bash; title: ; notranslate">
phpunit  ./test.php
</pre>
<p>خروجی‌ای به این صورت خواهد داشت : </p>
<pre class="brush: plain; title: ; notranslate">
PHPUnit 3.6.9 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.50Mb

OK (1 test, 2 assertions)

</pre>
<p>خوب این یعنی تست با موفقیت انجام شده است و نتیجه مثبت بوده. تعداد نقطه‌های خط سوم، تعداد کل test هاست که انجام شده و در نهایت مقدار حافظه مصرف شده و در نهایت تعداد تست ها و assert های انجام شده را نشان میدهد.<br />
برای بهتر دیده شدن نتیجه، سوییچ &#8211;colors را به دستور اضافه کنید خروجی رنگی خواهد بود. حالا یک متد دیگر به تست اضافه میکنیم : </p>
<pre class="brush: php; title: ; notranslate">
	public function testThisMustFail()
	{
		$user = new UserModel();
		$this-&gt;assertTrue($user-&gt;login(&quot;me&quot;, &quot;mypassword&quot;));
	}
</pre>
<p>با توجه به کدی که در ابتدا نوشتم، این تابع بازگشتی false خواهد داشت و من از assertTrue استفاده کردم، به این معنی که باید آرگومان true باشد، که نیست. نتیجه تست اینطور خواهد بود : </p>
<pre class="brush: plain; title: ; notranslate">
PHPUnit 3.6.9 by Sebastian Bergmann.

.F

Time: 0 seconds, Memory: 5.50Mb

There was 1 failure:

1) UserModelTest::testThisMustFail
Failed asserting that false is true.

/home/f0rud/test.php:17

FAILURES!
Tests: 2, Assertions: 3, Failures: 1.

</pre>
<p>در حقیقت، تستها باید طوری نوشته شوند که assert ها فقط در حالاتی اشتباه شوند که واقعا مشکلی وجوددارد،‌در صورتی که در تست دوم، واقعا مشکلی وجود ندارد و کد درست عمل میکند، بنابراین طریقه نوشتن تست اشتباه است نه کد. در حقیقت باید از متد assertFalse استفاده کرد که در این صورت نتیجه درست خواهد بود.<br />
چند نکته را در نظر بگیرید :<br />
۱- اسم تست ها، هر چه واضح تر باشند بهتر است. طول اسم متد مهم نیست، الگویی پیدا کنید و بر اساس الگویی که تعیین کردید اسم گذاری کنید، مثلا testNamespaceClassMethod<br />
۲- وقتی کلاس درست عمل کند تست باید موفقیت آمیز باشد. شاید در بعضی شرایط، کد باید یک خطا ایجاد کند، در این موارد حتما توجه کنید که تست را طوری بنویسید که هر وقت رفتار مورد انتظار نشان داده شد، assert موفقیت آمیز باشد، هیچ تفاوت یا ارجحیتی مثلا بین assertTrue و assertFalse نیست.<br />
۳- خیلی از framework ها، برای تست کد، نیاز به مقدماتی دارند که معمولا در خود framework پیش بینی آن میشود. مثلا در Zend از قبل کلاسهایی برای UnitTest وجود دارد، همچنین در Symfony یا Agavi. برای نوشتن کد تست برای این framework ها بهتر است که راهنمای خود آنها را ببینید و از روش خودشان استفاده کنید.</p>
<p>برای کد بالا، این تست تقریبا تست مناسبی است :</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

require 'UserModel.class.php';

class UserModelTest extends PHPUnit_Framework_TestCase
{
	public function testUserModelInitialize()
	{
		$user = new UserModel();
		$this-&gt;assertEquals(false, $user-&gt;getIsAuthenticated());
		$this-&gt;assertEquals(null, $user-&gt;getUserName());
	}
	
	public function testUserModelLogin()
	{
		$user = new UserModel();
		$this-&gt;assertFalse($user-&gt;login(&quot;me&quot;, &quot;mypassword&quot;));
		$this-&gt;assertEquals(false, $user-&gt;getIsAuthenticated());
		$this-&gt;assertEquals(null, $user-&gt;getUserName());		
		$this-&gt;assertTrue($user-&gt;login(&quot;admin&quot; , &quot;bita&quot;));
		$this-&gt;assertEquals(true, $user-&gt;getIsAuthenticated());
		$this-&gt;assertEquals('admin', $user-&gt;getUserName());		
	}
}
</pre>
<p>در آینده هم اگر بتوانم باز درباره UnitTest خواهم نوشت.</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/1002/phpunit/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1056/php-5-4-trait/' rel='bookmark' title='PHP 5.4 Trait'>PHP 5.4 Trait</a> <small>یکی از قابلیتهای جدیدی که به PHP 5.4 (که بالاخره...</small></li>
<li><a href='http://cyberrabbits.net/372/mail-for-zend-framework/' rel='bookmark' title='ارسال mail از طریق Zend Framework'>ارسال mail از طریق Zend Framework</a> <small>لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری...</small></li>
<li><a href='http://cyberrabbits.net/485/save-session-in-db/' rel='bookmark' title='ذخیره جلسات در پایگاه داده'>ذخیره جلسات در پایگاه داده</a> <small>دفعه قبل، درباره دزدیدن جلسه صحبت کردم، هنوز منتشر نشده...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/y81NOPapCdI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/1002/phpunit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>وضعیت آب و هوا</title>
		<link>http://cyberrabbits.net/984/accuweather/</link>
		<comments>http://cyberrabbits.net/984/accuweather/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 07:59:58 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[پیشنویسها]]></category>
		<category><![CDATA[accuweather]]></category>
		<category><![CDATA[ArchLinux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[conky]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=984</guid>
		<description><![CDATA[یکی از مسائلی که گاهی برای من مهم میشه، دونستن وضعیت آب و هوای بعضی شهرهاست. خصوصا اینکه به خاطر کارم توی هفته چندین روز باید به یه شهر دیگه برم. معمولا چند تا سایت رو دم دست داشتم و چک میکردم وضعیت رو، ولی بعد از تنظیم conky که همین چند روز پیش اتفاق [...]<div class='yarpp-related-rss yarpp-related-none'>

بدون پست مرتبط.
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از مسائلی که گاهی برای من مهم میشه، دونستن وضعیت آب و هوای بعضی شهرهاست. خصوصا اینکه به خاطر کارم توی هفته چندین روز باید به یه شهر دیگه برم.<br />
معمولا چند تا سایت رو دم دست داشتم و چک میکردم وضعیت رو، ولی بعد از تنظیم conky که همین چند روز پیش اتفاق افتاد و من دست از تنبلی برداشتم، به این نتیجه رسیدم داشتن وضعیت آب و هوایی هر دو شهر خودم و شهر محل کارم توی conky کاملا واجبه :)) این شد که گشتم دنبال اسکریپتهای مربوط به آب و هوا توی سایتهای مختلف، و معروفترینشون weather.com بود که متاسفانه رایگان نیست، و کلا به درد ما نمیخوره چرا که دست کم شهرهایی که من باهاش کار داشتم رو نداشت.<br />
این شد که گشتم دنبال یک جایگزین و accuweather.com بهترین گزینه بود.<br />
یه قابلیت جالب این سایت، دادن وضعیت آب و هوا به صورت RSS برای یک نقطه خاصه. کافیه کد شهر رو داشته باشی، مثلا برای تهران این لینک میشه : </p>
<pre class="brush: plain; title: ; notranslate">

http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&#038;locCode=MEA|IR|IR026|TEHRAN|&#038;u=1

</pre>
<p>metric میتونه صفر باشه برای فارنهایت و ۱ باشه برای سیلیسیوس. u هم ربطی به قضیه نداره و فقط فرمت پاسخ رو از rss به xml عوض میکنه که اینجا مد نظر نبود.<br />
میمونه locCode که شاید بیشترین وقت من برای پیدا کردن این locCode گذشت :)) ساختار سایت accuweather کلا تغییر کرده و این کدها رو من که نتونستم تو خود سایت پیدا کنم، و در نهایت با بدبختی تونستم یه فایل حاوی خیلی از این کدها پیدا کنم که <a href="http://cyberrabbits.net/wp-content/uploads/2012/01/Weather-Location-Database.zip">میذارمش اینجا</a> و شما میتونید دانلودش کنید و امیدوارم شهرتون توش باشه :)<br />
اما اسکریپت، که من اونو از توی فروم <a href="https://bbs.archlinux.org/viewtopic.php?id=37381">Archlinux</a> پیداش کردم و کار خودم نیست : </p>
<pre class="brush: bash; title: ; notranslate">
# !/usr/bin/bash
METRIC=1 #Should be 0 or 1; 0 for F, 1 for C
LOCCOD=&quot;MEA|IR|IR026|TEHRAN&quot; 

if [ -z $1 ] &amp;&amp; [ -x $LOCCOD ] ; then
        echo
        echo &quot;USAGE: $0 [locationcode]&quot;
        echo
        exit 0;
elif [ ! -z $1 ] ; then
        LOCCOD=$1
fi


wget -q http://rss.accuweather.com/rss/liveweather_rss.asp\?metric\=${METRIC}\&amp;locCode\=$LOCCOD -O - | awk \
'/Currently:/ {CurWeather=$0}
/[0-9] Forecast&lt;\/title&gt;/ {nr=NR+5}
NR==nr    {postIndx[++x]=$0}
# x&gt;2    {exit}
END{
    split(CurWeather,tmp,&quot;Currently: &quot;)
    split(tmp[2],tmp1,&quot;&lt;&quot;)
    CurWeather=sprintf(&quot;%s&quot;,tmp1[1])
    sub(&quot;:&quot;,&quot;,&quot;,CurWeather)
    for(x in postIndx){
    split(postIndx[x],tmp,&quot;;|&amp;&quot;)
    split(tmp[1],tmp,&quot;&gt;&quot;)
    split(tmp[2],statement,&quot; C &quot;) # substitute C for F if metric differs
    split(tmp[2],temp)
    forecast[++y]=sprintf(&quot;%d to %dC %-15s&quot;,temp[5],temp[2],statement[3])
    }
    printf(&quot;Now:      %s\nToday:    %s\nTomorrow: %s&quot;,CurWeather,forecast[1],forecast[2])
}'

</pre>
<p>خروجیش یه چیزی تو این مایه هاست : </p>
<pre class="brush: plain; title: ; notranslate">
Now:      Intermittent Clouds, -4C
Today:    -6 to 0C Increasing clouds 
Tomorrow: -5 to 0C Clouds and sun
</pre>
<p>حالا برای استفاده از خروجی توی conky خیلی ساده میتونید چنین چیزی رو توی تنظیمات conky بذارید : </p>
<pre class="brush: plain; title: ; notranslate">
${execi 300 /path/to/script/myaccuw.sh}
</pre>
<p>پ.ن : به هیچ وجه نمیتونم صفحه post-new رو توی WP باز کنم! برای زدن پست جدید مجبور شدم تو پیشخوان یه پیشنویس ایجاد کنم و بعد اونو ویرایش کنم (عجیبه که میتونم ویرایش کنم بی مشکل!) کسی راه حل یا دلیلی سراغ نداره برای این قضیه؟؟؟؟</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/984/accuweather/"></g:plusone></div><div class='yarpp-related-rss yarpp-related-none'>
<p>بدون پست مرتبط.</p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/Nsckc1SYTEQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/984/accuweather/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Less جاوااسکریپت</title>
		<link>http://cyberrabbits.net/977/less-js/</link>
		<comments>http://cyberrabbits.net/977/less-js/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 12:09:00 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[جاوا اسکریپت]]></category>
		<category><![CDATA[وب]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Less]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=977</guid>
		<description><![CDATA[ساختار CSS بسیار ساده و واضح طراحی شده. کلا هم تمرکز روی سلکتورها و خصایصه. در حالت عادی، نیاز بیشتری هم نیست. ولی گاهی، برای پروژه‌های بزرگتر، کدهایی هستن که بیش از اندازه تکرار میشن. خصوصا با ظهور CSS3 و خصایصی که هنوز برای هر بروزری یه جور باید نوشته بشن. مثلا برای border-radius معمولا [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/206/css-messages/' rel='bookmark' title='CSS Messages'>CSS Messages</a> <small>اینها رو ببینید، میخوام یه توضیح مختصر بدم درباره اینا...</small></li>
<li><a href='http://cyberrabbits.net/197/reset-css/' rel='bookmark' title='Reset CSS'>Reset CSS</a> <small>همیشه توضیح اینکه چطوری میشه که همه بروزرها یه سایت...</small></li>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>ساختار CSS بسیار ساده و واضح طراحی شده. کلا هم تمرکز روی سلکتورها و خصایصه. در حالت عادی، نیاز بیشتری هم نیست. ولی گاهی، برای پروژه‌های بزرگتر، کدهایی هستن که بیش از اندازه تکرار میشن. خصوصا با ظهور CSS3 و خصایصی که هنوز برای هر بروزری یه جور باید نوشته بشن. مثلا برای border-radius معمولا اینطور نوشته میشه </p>
<pre class="brush: css; title: ; notranslate">
selector {
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
}
</pre>
<p>میشه یه کلاس به این داد، و هر المنتی که قراره ۳ پیکسل border-radius داشته باشه اون کلاس رو بهش اضافه کرد. ولی برای ۴ پیکسل، باز باید همه چی از نو نوشته بشه :)<br />
حتی در خیلی از موارد، برای همین ۳ پیکسل هم اکثر افراد، ترجیح میدن که کل بلوک رو تکرار کنن. این یعنی کلی تکرار بی مورد!<br />
ساختار اصلی CSS این امکان رو در اختیار شما نمیذاره. ولی <a href="http://lesscss.org/">Less </a>میتونه خیلی کمک کنه!<br />
این کتابخونه که برای node.js هم وجود داره، به شما یک زبان ساده تر از CSS و کوتاهتر البته، معرفی میکنه، و بعد، هم میشه در طرف کلاینت، و هم در طرف سرور (البته با node.js) اون رو تبدیل به CSS کرد.<br />
برای استفاده از یه فایل less باید اینطوری عمل بشه، اول فایل less رو به صفحه اضافه کنید بعد خود اسکریپت less رو (حتما بعد از فایل less باید اضافه بشه ) : </p>
<pre class="brush: xml; title: ; notranslate">
&lt;link rel=&quot;stylesheet/less&quot; type=&quot;text/css&quot; href=&quot;styles.less&quot;&gt;
&lt;script src=&quot;less.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>همین :) البته مثلا من، به شخصه این روش رو نمیپسندم. بیشتر ترجیح میدم، فقط برای طراحی CSS از less و سینتکس جالبش استفاده کنم و در آخر همون فایل رو با کمک lessc (یه برنامه ساده که برای تبدیل ) به CSS استاندارد تبدیل کنم و بعد از اون فایل ساخته شده استفاده کنم. اینجوری کار طراحی راحت تر، و البته قابل انعطاف‌تر میشه. مثلا برای تغییر رنگ و تم، خیلی ساده میشه از متغیرها استفاده کرد که در CSS وجود نداره یا از توابع که اونها هم در CSS نیستن.</p>
<p>خوب حالا میرسیم به روش نوشتن less .<br />
دقیقا مثل CSS این less هم از بلاکها تشکیل شده و دو مفهوم متغیر و تابع رو هم معرفی میکنه. </p>
<p><strong>متغیرها </strong><br />
متغیرها با @ معرفی میشن به اینصورت : </p>
<pre class="brush: css; title: ; notranslate">
  // LESS
@color: #4D926F;

#header {
  color: @color;
}
h2 {
  color: @color;
}
</pre>
<p>تبدیل میشه به : </p>
<pre class="brush: css; title: ; notranslate">
#header {
  color: #4D926F;
}
h2 {
  color: #4D926F;
}
</pre>
<p>در Less کامنت تک خطی هم وجود داره، (با دوتا اسلش) که در CSS نهایی دیده نمیشن.<br />
الان، color یه متغیره که در بلاکها ازش استفاده شده، و به راحتی میتونید از این روش استفاده کنید و رنگهای توی طراحی رو به یکباره عوض کنید بدون اینکه نیاز باشه تک تک المانها رو دست بزنید، فقط با تغییر مقدار متغیر.<br />
<span id="more-977"></span><br />
<strong>توابع </strong><br />
در Less توابع به اینصورت به وجود میان : </p>
<pre class="brush: css; title: ; notranslate">
.rounded-corners (@radius: 5px) {
  border-radius: @radius;
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
}

#header {
  .rounded-corners;
}
#footer {
  .rounded-corners(10px);
}
</pre>
<p>تابعی که الان اینجا هست، توی خط اول، شبیه سلکتور کلاسه، با این تفاوت که لیست آرگومان داره. البته، میتونه هیچ آرگومانی نداشته باشه که با دو تا () مشخص میشه و البته از طرفی هم میتونه (مثل همین که الان اینجا هست) مقدار پیشفرض داشته باشه (۵ پیکسل در این مثال.) خروجی به این صورت خواهد بود : </p>
<pre class="brush: css; title: ; notranslate">
#header {
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}
#footer {
  border-radius: 10px;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
}
</pre>
<p>به اینترتیب، یکی از مشکلات مرتفع میشه :) </p>
<p><strong>قوانین تو در تو </strong><br />
یکی دیگه از قابلیتهای جالبی که در Less معرفی شده، تو در تو بودن قوانینه به این صورت : </p>
<pre class="brush: css; title: ; notranslate">
#header {
  h1 {
    font-size: 26px;
    font-weight: bold;
  }
  p { font-size: 12px;
    a { text-decoration: none;
      &amp;:hover { border-width: 1px }
    }
  }
}
</pre>
<p>به اینصورت میشه : </p>
<pre class="brush: css; title: ; notranslate">
#header h1 {
  font-size: 26px;
  font-weight: bold;
}
#header p {
  font-size: 12px;
}
#header p a {
  text-decoration: none;
}
#header p a:hover {
  border-width: 1px;
}
</pre>
<p>اینطوری، کد بسیار واضح تر میشه و ارتباطشون هم واضح‌تر.</p>
<p><strong>عملگرها </strong><br />
یک نکته جالب، و خیلی وقتها به دردبخور در Less، قابلیت استفاده از اپراتورهایی مثل جمع و ضربه.<br />
مثلا :</p>
<pre class="brush: css; title: ; notranslate">
@base: 5%;
@filler: @base * 2;
@other: @base + @filler;

#test {
	color: #888 / 4;
	background-color: @base-color + #111;
	height: 100% / 2 + @filler;
}
</pre>
<p>یک سری توابع مفید هم از قبل وجود داره که برای کار با رنگها درست شدن :</p>
<pre class="brush: css; title: ; notranslate">
lighten(@color, 10%);     // return a color which is 10% *lighter* than @color
darken(@color, 10%);      // return a color which is 10% *darker* than @color

saturate(@color, 10%);    // return a color 10% *more* saturated than @color
desaturate(@color, 10%);  // return a color 10% *less* saturated than @color

fadein(@color, 10%);      // return a color 10% *less* transparent than @color
fadeout(@color, 10%);     // return a color 10% *more* transparent than @color

spin(@color, 10);         // return a color with a 10 degree larger in hue than @color
spin(@color, -10);        // return a color with a 10 degree smaller hue than @color
</pre>
<p>قابلیتهای دیگه ای مثل استفاده از Namespace و اسکوپ برای متغییر ها، import ، و حتی استفاده از جاوااسکریپت در CSS ها (نه به اون صورتی که همیشه توصیه میکنیم استفاده نشه) در Less ارایه شدن، که کل راهنماشو میتونید <a href="http://lesscss.org/">در صفحه اصلی</a> بخونید. </p>
<p><ins datetime="2012-06-03T07:31:06+00:00">دوستی به نام آقای امیرحسین حجتی پور صفحه راهنمای Less رو به فارسی ترجمه کرده <a href="http://lesscss.ir/">اینجا</a>. </ins></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/977/less-js/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/206/css-messages/' rel='bookmark' title='CSS Messages'>CSS Messages</a> <small>اینها رو ببینید، میخوام یه توضیح مختصر بدم درباره اینا...</small></li>
<li><a href='http://cyberrabbits.net/197/reset-css/' rel='bookmark' title='Reset CSS'>Reset CSS</a> <small>همیشه توضیح اینکه چطوری میشه که همه بروزرها یه سایت...</small></li>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/tX21lVYchC4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/977/less-js/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Twitter bootstrap</title>
		<link>http://cyberrabbits.net/978/twitter-bootstrap/</link>
		<comments>http://cyberrabbits.net/978/twitter-bootstrap/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 19:32:23 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[وب]]></category>
		<category><![CDATA[Blueprint CSS]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[CSS Framework]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=978</guid>
		<description><![CDATA[آپدیت جدیدی برای این فریم‌ورک نوشتم که میتونید اینجا ببینید. قبلا درباره فریم وورکهای CSS (به صورت خاص blueprint)نوشتم. اینبار هم میخوام درباره یه فریم وورک CSS بنویسم که یه کم با blueprint متفاوته. این فریم وورک توسط توییتر ارایه داده شده و گسترش داده میشه. یه تفاوت عمده هم با blueprint داره و اونهم [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
<li><a href='http://cyberrabbits.net/843/%e2%80%8cblueprint-css/' rel='bookmark' title='‌Blueprint CSS'>‌Blueprint CSS</a> <small>یکی از مهمترین قسمتهای برنامه نویسی وب برای من اینه...</small></li>
<li><a href='http://cyberrabbits.net/977/less-js/' rel='bookmark' title='Less جاوااسکریپت'>Less جاوااسکریپت</a> <small>ساختار CSS بسیار ساده و واضح طراحی شده. کلا هم...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p><ins datetime="2012-05-12T13:47:53+00:00">آپدیت جدیدی برای این فریم‌ورک نوشتم که میتونید <a href="http://cyberrabbits.net/1095/bootstrap-again/">اینجا</a> ببینید.<br />
</ins><br />
قبلا درباره <a href="http://cyberrabbits.net/843/%E2%80%8Cblueprint-css/" target="_blank">فریم وورکهای  CSS  (به صورت خاص blueprint)</a>نوشتم. اینبار هم میخوام درباره یه فریم وورک CSS بنویسم که یه کم با blueprint متفاوته. </p>
<p>این فریم وورک توسط توییتر ارایه داده شده و گسترش داده میشه. یه تفاوت عمده هم با blueprint داره و اونهم استفاده بسیار زیاد این فریم وورک از CSS 3 و قابلیتهای جدیدشه. علاوه بر اون یه سری پلاگینهای مربوط به jQuery هم ارایه شده که با این فریم وورک کار میکنن و خیلی ساده باعث بهتر شدن استفاده از اون میشن، که البته استفاده از اونها کاملا اختیاریه و بدون اونها هم هیچ مشکلی پیش نمیاد. برای استفاده از این فریم وورک میتونید از اینجا <a href='https://github.com/twitter/bootstrap' title='twitter/bootstrap - GitHub' target="_blank">twitter/bootstrap &#8211; GitHub</a> بگیریدش،‌یا اینکه با کمک GIT اونو بارگزاری کنید : </p>
<pre class="brush: bash; title: ; notranslate">
git clone https://github.com/twitter/bootstrap.git
</pre>
<p>قابلیتهای این فریم وورک خیلی بیشتر از blueprint هستن و امکانات اضافی خیلی زیاد و جالبی دارن که میتونید دموی اون رو <a href="http://twitter.github.com/bootstrap/" target="_blank">اینجا</a> ببینید.<br />
قابلیتهای جالبی، مثل منو، نوار ابزار، هشدارهای متفاوت و جالب، قابلیت layout بندی ساده (بسیار شبیه blueprint اما به صورت کاملتر)‌ استیلهایی برای جداول، فرم و &#8230; که باعث میشن این فریم وورک بسیار مفید و کارآمد خواهد بود.<br />
بزرگترین مشکل این فریم وورک برای من، RTL ساپورت نبودنش بود، که دست آخر تصمیم گرفتم خودم انجامش بدم و نتیجش شد این : <a href='https://github.com/fzerorubigd/bootstrap' title='fzerorubigd/bootstrap - GitHub'>fzerorubigd/bootstrap &#8211; GitHub</a></p>
<p>تو این یکی یه فایل <a href="https://raw.github.com/fzerorubigd/bootstrap/master/bootstrap.rtl.css" target="_blank">bootstrap.rtl.css</a> هم هست که باید بعد از خود bootstrap.css به صفحه اضافه بشه و درنهایت صفحه کاملا راست به چپ میشه. (برای دانلودش از <a href="href="https://raw.github.com/fzerorubigd/bootstrap/master/bootstrap.rtl.css" target="_blank">این لینک</a> بگیریدش)</p>
<p>مثال خود این فریم وورک، کامل و جامعه. برای راست به چپ هم همون مثال درست کار میکنه :)، فقط فایل CSS رو بعد از (تاکید میکنم،‌بعد از) فایل اصلی اضافه کنید به صفحه.<br />
در دو مورد صفحه HTML یه کم تغییرات میخواد، و حقیقتا نمیدونم twipsy چرا کار نمیکنه :) ولی فکر کنم این تا الان تنها نسخه راست به چپه :))</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/978/twitter-bootstrap/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/1095/bootstrap-again/' rel='bookmark' title='دوباره bootstrap &#8211; نسخه Less'>دوباره bootstrap &#8211; نسخه Less</a> <small>چند وقتی هست که bootstrap تبدیل شده به عصای دست...</small></li>
<li><a href='http://cyberrabbits.net/843/%e2%80%8cblueprint-css/' rel='bookmark' title='‌Blueprint CSS'>‌Blueprint CSS</a> <small>یکی از مهمترین قسمتهای برنامه نویسی وب برای من اینه...</small></li>
<li><a href='http://cyberrabbits.net/977/less-js/' rel='bookmark' title='Less جاوااسکریپت'>Less جاوااسکریپت</a> <small>ساختار CSS بسیار ساده و واضح طراحی شده. کلا هم...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/pTYl40PBmo8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/978/twitter-bootstrap/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>ربات مافیا – PHP</title>
		<link>http://cyberrabbits.net/962/mafia-irc-php/</link>
		<comments>http://cyberrabbits.net/962/mafia-irc-php/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 16:36:27 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[متفرقه]]></category>
		<category><![CDATA[Bot]]></category>
		<category><![CDATA[Eli]]></category>
		<category><![CDATA[IRC]]></category>
		<category><![CDATA[mafia]]></category>
		<category><![CDATA[zconf]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=962</guid>
		<description><![CDATA[بازی مافیا رو اولین بار وقتی دانشجو بودیم انجام دادم و متاسفانه چون توی فصل امتحانات بود و منم فارغ التحصیل زیاد قاطی قضیه نشدم :)‌ چند وقت پیش، دوست خوبم ایمان، سعی کرد بچه ها رو جمع کنه برای بازی تو Gtalk و همون موقع تصمیم گرفتم که این بازی رو به صورت یه [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/321/about-past/' rel='bookmark' title='یه کم درباره گذشته&#8230;.'>یه کم درباره گذشته&#8230;.</a> <small>چند وقتی بود که درگیر بودم. یه سر رفتم نمایشگاه....</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>بازی <a href="http://fa.wikipedia.org/wiki/%D9%85%D8%A7%D9%81%DB%8C%D8%A7_(%D8%A8%D8%A7%D8%B2%DB%8C_%DA%AF%D8%B1%D9%88%D9%87%DB%8C)">مافیا</a> رو اولین بار وقتی دانشجو بودیم انجام دادم و متاسفانه چون توی فصل امتحانات بود و منم فارغ التحصیل زیاد قاطی قضیه نشدم :)‌<br />
چند وقت پیش، دوست خوبم ایمان، سعی کرد بچه ها رو جمع کنه برای بازی تو Gtalk و همون موقع تصمیم گرفتم که این بازی رو به صورت یه ربات برای IRC پیاده سازی کنم. به عبارتی این ربات نقش خدا رو توی بازی انجام میده.</p>
<p>تو این بین، تجربه های جالبی هم داشتیم، تو همایش <a href="http://2011.zconf.ir/">ZConf</a> بازی رو به صورت حضوری انجام دادیم و بعد هم گویا ترکشهای این بازی به <a href="http://yeenghelabi.wordpress.com/2011/09/18/%D9%85%D8%A7%D9%81%DB%8C%D8%A7-%D9%88-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87%E2%80%8C%DB%8C-%D9%85%D9%86/">جشن اصفهان</a> هم رسید و الی آخر!</p>
<p>اما ربات. تصمیم گرفتم که منتشرش کنم. قبلا هم <a href="http://cyberrabbits.net/non/mafia/">راهنماشو</a> نوشتم و حالا کد.<br />
فقط یه لطفی کنید و اگه میخواید ازش استفاده کنید :‌<br />
۱- خودتون دو تا Channel برای مافیا درست کنید اون اصلی ها رو که من ثبت کردم (##PMG و ##PMGMafais ) رو شما باید تغییر بدید. -module/mafia/MafiaGame.php-<br />
۲-برای ربات هم یه اسم دیگه انتخاب کنید fzBot رو من ثبتش کردم :)<br />
۳- همین دیگه خود دانید :) یادتون باشه این ربات فقط برای تفریح نوشته شده و من اصلا قصد انتشارشو یا حتی رسوندنش به این مرحله رو نداشتم، پس زیاد انتظار یه کد ایده آل نداشته باشید.</p>
<p>فعلا همین :) تا بعد که نسخه بعدیشو در بیارم، شاید یه تیپ دیگه و &#8230;</p>
<p>پ.ن : امروز تولد الیه. تولدت مبارک خانمی :)<br />
<ins datetime="2011-09-26T14:08:04+00:00">و اینم Github : https://github.com/fzerorubigd/pmg</ins></p>
<p>برای گرفتن کد از GIT استفاده کنید :))</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/962/mafia-irc-php/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/321/about-past/' rel='bookmark' title='یه کم درباره گذشته&#8230;.'>یه کم درباره گذشته&#8230;.</a> <small>چند وقتی بود که درگیر بودم. یه سر رفتم نمایشگاه....</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/WNGadANBUM8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/962/mafia-irc-php/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>پیشنویسها – Bash</title>
		<link>http://cyberrabbits.net/941/bash-drafts/</link>
		<comments>http://cyberrabbits.net/941/bash-drafts/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 16:20:57 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[zenity]]></category>
		<category><![CDATA[خیلی پیش میاد!]]></category>
		<category><![CDATA[پیشنویسها]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[divx]]></category>
		<category><![CDATA[ext3]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[mencoder]]></category>
		<category><![CDATA[mplayer]]></category>
		<category><![CDATA[tune2fs]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=941</guid>
		<description><![CDATA[خیلی پیش میاد که این وبلاگ به صورت یک آرشیو برای خودم مفید میشه! چون من خیلی فراموش کارم و زیاد پیش میاد که یه کار رو که بارها انجام دادم فراموش کنم! جدیدا از پستهای پیشنویس هم استفاده میکردم برای ذخیره کردن یه سری چیزها، راههای ساده تر هست، میدونم، ولی یه باره شد، [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/893/zshell/' rel='bookmark' title='zsh جایگزینی مناسب برای bash'>zsh جایگزینی مناسب برای bash</a> <small>یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه...</small></li>
<li><a href='http://cyberrabbits.net/775/zenity-part-3/' rel='bookmark' title='zenity بخش سوم'>zenity بخش سوم</a> <small>برای اینکه کم کم داشت کارهای ناتمومم زیاد میشد، تصمیم...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>خیلی پیش میاد که این وبلاگ به صورت یک آرشیو برای خودم مفید میشه! چون من خیلی فراموش کارم و زیاد پیش میاد که یه کار رو که بارها انجام دادم فراموش کنم!<br />
جدیدا از پستهای پیشنویس هم استفاده میکردم برای ذخیره کردن یه سری چیزها، راههای ساده تر هست، میدونم، ولی یه باره شد، و چند تا نکته رو، وقتی خونه نبودم تو وبلاگ ذخیره کردم. حالا به این نتیجه رسیدم که خیلی از اینها میتونه برای دیگران هم بدرد بخور باشه. اینه که پستهای پیشنویس که یه کم پر بار تر بشن منتشرشون میکنم، و این هم یکی از اون پستهای پیشنویسه، که البته یه کم توضیحات به هر تیکش اضافه کردم :<br />
<span id="more-941"></span><br />
<strong>۱-چسباندن صدا به یک ویدئو :</strong><br />
یه چند تایی ویدئوکست درست کردم اگه دیده باشید. منتها توی صدا مشکل وجود داشت و تصمیم گرفتم صدا رو توی استودیوی خانگی برادرم ضبط کنم و بعد به هم بچسبونمشون.<br />
<div id="attachment_948" class="wp-caption aligncenter" style="width: 310px"><a href="http://cyberrabbits.net/941/bash-drafts/132457_173761602664360_100000915645085_384705_176747_o/" rel="attachment wp-att-948"><img src="http://cyberrabbits.net/wp-content/uploads/2011/08/132457_173761602664360_100000915645085_384705_176747_o-300x225.jpg" alt="استودیوی خانگی برادرم" title="استودیوی خانگی برادرم" width="300" height="225" class="size-medium wp-image-948" /></a><p class="wp-caption-text">استودیوی خانگی برادرم</p></div><br />
چطور اینکار رو انجام دادم؟ اینطوری :</p>
<pre class="brush: bash; title: ; notranslate">
 ffmpeg -vcodec copy -acodec copy  -i source.mp3 -i source.mkv out.mkv
</pre>
<p>خیلی ساده :) فقط -acodec میگه که صدا رو تبدیل کنه یا نه که من نمیخواستم هیچ تغییری اتفاق بیفته در مورد کیفیت ویدئو هم -vcodec همین رو میگه.<br />
اگه مشکلی پیش اومد، سعی در تغییر این دو عبارت copy معمولا چاره سازه، منتها اونوقت باید کدک ها رو خودتون انتخاب کنید.<br />
پسوند فایل خروجی، اگه مشخص و شناخته شده باشه، ffmpeg اشتباه نمیکنه. ولی در غیر اینصورت فرمت خروجی رو با سوئیچ -f میتونید بهش بگید. مثلا برای اینکه من نوشتم، mkv خودش میشناسونه همه چی رو.</p>
<p><strong>۲- اضافه کردن زیرنویس به فیلم </strong><br />
این دستگاههای ویدئو پلیر که دایوایکس میخونن و فلش و از این حرفها، معمولا فایل زیرنویس رو هم میتونن از فایل srt نمایش بدن، ولی متاسفانه فقط انگلیسی رو، و تمام اونچیزهایی که من دیدم با فارسی مشکل داشتن :(<br />
از طرفی تو خونه ما ترجیح بر دیدن فیلم با تلویزیونه، که اگه اینکار رو هم باهاش انجام ندیم کلا میشه یه وسیله بی مصرف!!!<br />
اینه که گشتم دنبال یه راهی برای اینکار، و راه حل mplayer بود. البته قسمت mencoder این برنامه. -نمیدونم چرا با ffmpeg موفق نشدم :)-<br />
یه اسکریپت ساده نوشتم که اینکار رو برام انجام میده :) اینه :</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash

movie_file=&lt;code&gt;zenity --file-selection --title=&amp;quot;Choose movie file&amp;quot;&lt;/code&gt;
echo $movie_file

sub_file=&lt;code&gt;zenity --file-selection --title=&amp;quot;Choose subtitle file&amp;quot;&lt;/code&gt;
echo $sub_file

sub_encoding=&lt;code&gt;zenity --entry --title=&amp;quot;Sub title encoding&amp;quot; --text=&amp;quot;Your subtitle encoding :&amp;quot; --entry-text=&amp;quot;windows-1256&amp;quot;&lt;/code&gt;
echo $sub_encoding

scale=&lt;code&gt;zenity --scale --title=&amp;quot;Sub font text scale&amp;quot; --value=3 --min-value=1 --max-value=10&lt;/code&gt;
echo $scale

mencoder &amp;quot;$movie_file&amp;quot; -oac copy -ovc xvid \
		-xvidencopts bitrate=687 -sub &amp;quot;$sub_file&amp;quot;\
		 -subcp $sub_encoding -subfont-text-scale $scale \
		 -o &amp;quot;$movie_file&amp;quot;.out.avi

</pre>
<p>خیلی سادست، فقط اینکه اگه هر قسمت رو لغو کنید، کار ادامه پیدا میکنه، با Ctrl+C متوقفش کنید :) حسش نبود خیلی امکانات اضافه کنم براش.<br />
-oac copy هم گاهی جواب نمیده -تو قسمت آخر اسکریپت-، مثلا برای فایلهای mkv، اون مواقع بد نیست بزنید : oac pam یا هر چیز دیگه ای.<br />
البته چون تبدیل به divx صورت میگیره این اسکریپت کارش طول میکشه :) </p>
<p><strong>۳-راحت شدن از فضای رزرو پارتیشنهای ext3 , ext4 و شاید ext2</strong><br />
پارتیشنهای ext3 و ext4 به صورت پیشفرض ۵ درصد از فضای پارتیشن رو رزرو میکنن. اما خیلی وقتها واقعا لازم نیست. مثلا من یه پارتیشن ۱ ترا بایتی دارم که ۵۰ گیگا! فضا رو ازش رزرو کردن. اطلاعاتش هم حساس نیست، فقط فیلمه :) و سریال و انیمه :D نتیجه اینکه دوست داشتم از دست این فضای خالی الکی راحت بشم.<br />
این دستور به دادم رسید :</p>
<pre class="brush: bash; title: ; notranslate">
tune2fs -m 1 /dev/sdXX
</pre>
<p>با تغییر ۱ به هر عدد دیگه ای، میتونید درصد فضای رزرو شده رو از ۵ به این عدد تغییر بدید. مثلا با مقدار صفر کلا فضای رزرو استفاده نمیشه البته دستور باید با دسترسی root اجرا بشه و به جای XX هم اسم پارتیشن شما نوشته بشه، چیزی مثل sda1 . برای درایوهای سیستمی و اطلاعاتی که مهم هستن اصلا توصیه نمیشه که اینکار رو انجام بدید!</p>
<p>فعلا تا همین اندازه کافیه، اگه مشکلی بود یا پیشنهادی خوشحال میشم تو کامنتها مطرح کنید :)</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/941/bash-drafts/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/893/zshell/' rel='bookmark' title='zsh جایگزینی مناسب برای bash'>zsh جایگزینی مناسب برای bash</a> <small>یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه...</small></li>
<li><a href='http://cyberrabbits.net/775/zenity-part-3/' rel='bookmark' title='zenity بخش سوم'>zenity بخش سوم</a> <small>برای اینکه کم کم داشت کارهای ناتمومم زیاد میشد، تصمیم...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/-Ogp_TosETs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/941/bash-drafts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ویدئو کست دوم : پایپها در گنو/لینوکس – بخش دوم و پایانی</title>
		<link>http://cyberrabbits.net/932/videocast-ii-pipes/</link>
		<comments>http://cyberrabbits.net/932/videocast-ii-pipes/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 19:39:31 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[ویدئو]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[pipes]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[videocast]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=932</guid>
		<description><![CDATA[و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من، پایپها در گنو/لینوکس &#8211; بخش دوم. تو این قسمت در مورد پایپهای بی نام و نامدار صحبت شده. و لینک دانلود از دراپ باکس<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/924/videocast-pipes-part1/' rel='bookmark' title='اولین ویدئوکست من :) &#8211; پایپها در گنو لینوکس بخش اول'>اولین ویدئوکست من :) &#8211; پایپها در گنو لینوکس بخش اول</a> <small>این اولین باره که سعی میکنم یه ویدئوکست درست کنم...</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من، پایپها در گنو/لینوکس &#8211; بخش دوم.<br />
تو این قسمت در مورد پایپهای بی نام و نامدار صحبت شده.</p>
<p><a href="http://www.youtube.com/watch?v=Hnxkp8bbrGk"><img src="http://img.youtube.com/vi/Hnxkp8bbrGk/2.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=Hnxkp8bbrGk">Click here to view the video on YouTube</a>.</p>

<p><a href="https://dl.dropbox.com/u/17051717/CyberRabbits.net%20-%20Pipes%20-%20Part%20II.mkv">و لینک دانلود از دراپ باکس</a></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/932/videocast-ii-pipes/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/924/videocast-pipes-part1/' rel='bookmark' title='اولین ویدئوکست من :) &#8211; پایپها در گنو لینوکس بخش اول'>اولین ویدئوکست من :) &#8211; پایپها در گنو لینوکس بخش اول</a> <small>این اولین باره که سعی میکنم یه ویدئوکست درست کنم...</small></li>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/nlXaDtPvEWk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/932/videocast-ii-pipes/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>اولین ویدئوکست من :) – پایپها در گنو لینوکس بخش اول</title>
		<link>http://cyberrabbits.net/924/videocast-pipes-part1/</link>
		<comments>http://cyberrabbits.net/924/videocast-pipes-part1/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 20:20:42 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[ویدئو]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[gnu]]></category>
		<category><![CDATA[pipes]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[videocast]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=924</guid>
		<description><![CDATA[این اولین باره که سعی میکنم یه ویدئوکست درست کنم :) زیاد جالب هم نشده با اینکه دست کم دو روز داشتم سروکله میزدم باهاش. به هر حال این اولین تجربه تو این زمینه است. اگه مشکلی داره ببخشید و اگر هم مشکل قابل رفعی هستش، بگید تا برای کارهای بعدی رفعش کنم. این قسمت [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/932/videocast-ii-pipes/' rel='bookmark' title='ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی'>ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی</a> <small>و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من،...</small></li>
<li><a href='http://cyberrabbits.net/589/bing-pic-as-gnome-background/' rel='bookmark' title='تصاویر بینگ، پسزمینه دسکتاپ لینوکس'>تصاویر بینگ، پسزمینه دسکتاپ لینوکس</a> <small>داشتم گوگل ریدرمو میخوندم :) که رسیدم به این پست...</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>این اولین باره که سعی میکنم یه ویدئوکست درست کنم :) زیاد جالب هم نشده با اینکه دست کم دو روز داشتم سروکله میزدم باهاش.<br />
به هر حال این اولین تجربه تو این زمینه است. اگه مشکلی داره ببخشید و اگر هم مشکل قابل رفعی هستش، بگید تا برای کارهای بعدی رفعش کنم.<br />
این قسمت درباره پایپها ( البته بیشتر هدایت خروجی/ورودی برنامه ها به/از فایل ) هستش. قسمت بعدیش هم به زودی میذارم.<br />
&#8211; دلیل اصلی من <a href="http://linuxfm.com/podcasts/live-5/">این پست فرید احمدیان </a>بود، و اینکه من قالب صدای تنها رو زیاد دوست نداشتم و تصمیم گرفتم اونو با ویدئو ترکیب کنم، و اینکه معتقدم بالاخره باید یه کاری انجام بشه :)<br />
&#8211; فعلا فقط روی youtube هستش و اصل فایل هم توی Dropbox :) تا ببینم چی میشه :D<br />
<p><a href="http://www.youtube.com/watch?v=FuTVX3XrRj8"><img src="http://img.youtube.com/vi/FuTVX3XrRj8/2.jpg"></a></p>
<p><a href="http://www.youtube.com/watch?v=FuTVX3XrRj8">Click here to view the video on YouTube</a>.</p>
</p>
<p>اصل فایل هم <a href="https://dl.dropbox.com/u/17051717/pipes-part1.mkv">اینجاست</a>.</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/924/videocast-pipes-part1/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/932/videocast-ii-pipes/' rel='bookmark' title='ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی'>ویدئو کست دوم : پایپها در گنو/لینوکس &#8211; بخش دوم و پایانی</a> <small>و بالاخره با کلی تاخیر :) قسمت دوم ویدئوکست من،...</small></li>
<li><a href='http://cyberrabbits.net/589/bing-pic-as-gnome-background/' rel='bookmark' title='تصاویر بینگ، پسزمینه دسکتاپ لینوکس'>تصاویر بینگ، پسزمینه دسکتاپ لینوکس</a> <small>داشتم گوگل ریدرمو میخوندم :) که رسیدم به این پست...</small></li>
<li><a href='http://cyberrabbits.net/159/linux-and-the-lost-delight/' rel='bookmark' title='لینوکس و شوقی که گم کرده بودم'>لینوکس و شوقی که گم کرده بودم</a> <small>خیلی سال پیش،‌ وقتی برای اولین بار یک کامپیوتر دیدم،‌بلافاصله...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/iCLexL7lFO4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/924/videocast-pipes-part1/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>HipHop</title>
		<link>http://cyberrabbits.net/909/hiphop/</link>
		<comments>http://cyberrabbits.net/909/hiphop/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 06:27:30 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[HipHop]]></category>
		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=909</guid>
		<description><![CDATA[&#8211; این فقط یه معرفی ساده یه پروژه است نه راهنمای کاملش. یکی از معروفترین سایتهای فعلی، فیسبوکه و شکی در این نیست (نمیدونم با وجود گوگل پلاس وضع همینطوری میمونه یا نه؟). ولی این سایت همینجوری که تبدیل نشده به اینی که الان هست! یک تیم برنامه نویسی قدرتمند هم پشت این پروژه هست [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/811/zend-translate-and-gnugettext/' rel='bookmark' title='Zend_Translate و GnuGetText'>Zend_Translate و GnuGetText</a> <small>یکی از اصولی که سعی میکنم هنگام طراحی رعایت کنم،...</small></li>
<li><a href='http://cyberrabbits.net/403/source-forge-redirector/' rel='bookmark' title='دانلود از SourceForge بدون مشکل'>دانلود از SourceForge بدون مشکل</a> <small>اسکریپت رو اگه نصب کردید دوباره آپدیت کنید، چون sf...</small></li>
<li><a href='http://cyberrabbits.net/372/mail-for-zend-framework/' rel='bookmark' title='ارسال mail از طریق Zend Framework'>ارسال mail از طریق Zend Framework</a> <small>لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p><em>&#8211; این فقط یه معرفی ساده یه پروژه است نه راهنمای کاملش. </em><br />
یکی از معروفترین سایتهای فعلی، فیسبوکه و شکی در این نیست (نمیدونم با وجود گوگل پلاس وضع همینطوری میمونه یا نه؟). ولی این سایت همینجوری که تبدیل نشده به اینی که الان هست! یک تیم برنامه نویسی قدرتمند هم پشت این پروژه هست و چیزی که امروز میخوام معرفی کنم، دلیلی بر این مدعاست.</p>
<p>پروژه <a href="https://github.com/facebook/hiphop-php/wiki/">HipHop for PHP</a> پروژه ای است که بر اساس نیازهای آنها -فیس بوکی ها- ساخته شده. پروژه ای که یه کار &#8211; به ظاهر &#8211; ساده انجام میده. خیلی ساده، کدهای PHP رو تبدیل میکنه به C++ و بعد اون رو کامپایل میکنه، در نهایت کل پروژه تبدیل میشه به یه فایل اجرایی تکی، که خودش یک وب سرور کامل هم هست.<br />
اینجوری، سرعت اجرای کد به طرز کاملا محسوسی بالاتر میره و فشار اجرای مفسری PHP به شدت کم میشه . البته هنوز فایلهای استاتیک به صورت مجزا از این فایل وجود دارند ولی دیگه PHP وجود نداره، کد باینری واقعی هست. یه چیزی مثل <a href="https://live.gnome.org/Vala">vala</a> که تبدیل میشه به C . مثل پروژه هایی که حتما دیدید و فایل PHP رو توی یک فایل اجرایی میچپونن هم نیست -<a href="http://www.bambalam.se/bamcompile/">مثلا این پروژه</a>-.<br />
 این پروژه یه بازنویسی از کل کد PHP هستش نه یه پروژه مشتق شده از PHP. یه سری توابع از دست میرن (مثلا تابع eval) ولی در نهایت توابعی هم که از دست میرن جایگزین مناسبی دارن :) مثلا همین eval یه جورایی از دید من یه تابع خیلی خطرناک محسوب میشه و استفاده ازش احتیاط خیلی زیادی رو میطلبه!<br />
این برنامه در کل ممکنه برای ما هم خیلی کاربردی نباشه چون به درد همه جا نمیخوره. کلا  بعید میدونم به همین راحتی رو ویندوز کامپایل بشه! ولی گاهی وقتها میتونه کارتون رو راه بندازه،مثلا ما الان نیاز به یه وب سرویس داریم تو یه پروژه که روی سرورهای داخلی یه شرکت قراره نصب بشه و فقط یک ارتباط ساده رو با دیتابیس برقرار کنه و از طرفی نصب آپاچی و PHP هم یه جورایی از طرف مدیر شبکه منع شده -یه جور سرور radius هستش و میخوان سبک بمونه &#8211; خوب بهتر از HipHop چی میتونه به ما کمک کنه؟ </p>
<p>حالا میرسیم به چگونگی استفاده از این به اصطلاح HipHop!<br />
<span id="more-909"></span><br />
<strong>نصب !</strong><br />
برای آرچ لینوکس توی <a href="http://aur.archlinux.org/packages.php?ID=35023">AUR</a> هستش. و نصبش هم نیاز به خیلی چیزها داره که شاید بد نباشه از اینجا بخونیدش : <a href='https://github.com/facebook/hiphop-php/wiki/Building-and-installing' title='Building and installing - GitHub'>Building and installing &#8211; GitHub</a><br />
به هر حال سورسش اینجاست :</p>
<pre class="brush: bash; title: ; notranslate">
git clone git://github.com/facebook/hiphop-php.git
</pre>
<p>نمیرم تو بحث نصب به صورت کامل، توصیه میکنم بگردید دنبال پکیج یا راهنمای مناسب برای دیستروی خودتون، چون دردسر داره و کلی هم طول میکشه. فقط اگه رفتید برای نصب از سورس چند تا نکته رو در نظر داشته باشید :<br />
۱- یه چیزی که برای من عجیبه اینه که دولوپرهاش فراموش کردن فایلهای زاید رو پاک کنن. فایل CMakeCache.txt رو از توی پوشه اصلی پروژه پاک کنید که بودنش دردسر ساز میشه و اصلا اجازه کامپایل به شما نمیده مگه اینکه مستقیما توی opt کامپایل بشه که بازم نمیشه خیلی وقتا!<br />
۲- بعد از اینکه رفتید برای cmake دوباره یه فایل CMakeCahce.txt براتون میسازه. کامپایل رو متوقف کنید، توی اون فایل رو بگردید و هر چی -O3 (منهای O او بزرگ بعدش بلافاصله یه ۳ ) هست رو عوض کنید با -O2 (همون فقط ۲ به جای ۳ ) یه مشکل عجیب وقت لینک کردن دامنگیر من و یه عده دیگه -البته نه همه- شده بود که با این روش حل شد.<br />
۳- توی آرچ لینوکس libmemcached 0.50-1 با این کار نمیکنه (تا تاریخ نوشتن این پست) و مجبورید برگردید به نسخه قبلی، libmemcached-0.49-1 بدون مشکل کار میکنه.</p>
<p><strong>طریقه استفاده </strong><br />
برای استفاده از این برنامه،‌ به لیست فایلهای PHP که قراره تبدیل بشن احتیاج دارید. یادتون باشه هر فایلی که توش PHP هست باید توی این لیست باشه.<br />
برای اجرای هیپ هاپ باید برید توی پوشه خود پروژه و چند تا متغیر رو تنظیم بکنید برای استفاده در شل:</p>
<pre class="brush: bash; title: ; notranslate">
cd .. # into the root of the hphp checkout
export HPHP_HOME=&lt;code&gt;pwd&lt;/code&gt;
export HPHP_LIB=&lt;code&gt;pwd&lt;/code&gt;/bin
# if you followed the Ubuntu 9.10 instructions, you also need
export CMAKE_PREFIX_PATH=&lt;code&gt;/bin/pwd&lt;/code&gt;/../
</pre>
<p>این دستورات باید یک بار قبل از اجرای هیپ هاپ استفاده بشن و گرنه درست کار نمیکنه. شاید یه اسکریپت مثل این :‌</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
export CMAKE_PREFIX_PATH=/path/to/hiphop/top/folder #Parent folder of hip hop not root folder
export HPHP_HOME=$CMAKE_PREFIX_PATH/hiphop-php
export HPHP_LIB=$HPHP_HOME/bin
$HPHP_HOME/src/hphp/hphp $*
</pre>
<p>-این اسکریپت توی پکیج AUR آرچ لینوکس هستش و من از اونجا کپیش کردم :) -<br />
من یه کد خیلی ساده PHP نوشتم در این حد ساده : </p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
echo &quot;Hello world!&quot;;
</pre>
<p>و با این دستور تبدیلش کردم : </p>
<pre class="brush: bash; title: ; notranslate">
/opt/hiphop/hphp.sh test.php --keep-tempdir=1 --log=3
</pre>
<p>یه فایل اجرایی بهم تحویل داد به نام program تو یه پوشه داخل tmp به حجم ۲۶ مگا بایت! که با strip کردن شد ۲۱.۳ مگابایت :) و بدون نیاز به هیچگونه فایل اضافی و کاملا مستقل، که هم توی ترمینال درست عمل میکرد (فراخوانی مستقیم بدون هیچگونه سوییچ اضافه) و هم به صورت سرور :</p>
<pre class="brush: bash; title: ; notranslate">
/tmp/hphp_p6vSsP/program -m server -p 8080
</pre>
<p>- نکته نسبتا انحرافی! اینه که روت وب سرور شما میشه جایی که شما هیپ هاپ رو اجرا میکنید. مثلا من اول به جای test.php زدم ~/test.php و بعد برای حالت سرور باید کل مسیر فایل رو هم تو بروزر میزدم.<br />
یه سوییچ -f هم داره که انتظار میره فایل PHP بهش بدی و مستقیم بدون کامپایل &#8211; مثل خود PHP &#8211; اجراش کنه که هر کاری کردم خطا گرفتم، و در کل خود PHP که هست چه مرضیه آخه!<br />
برای اجرای یه پروژه کامل اول یه لیستی از فایلهای PHP اون پروژه ایجاد کنید : </p>
<pre class="brush: bash; title: ; notranslate">
cd /project/root
find . -name &quot;*.php&quot; &gt; files.list
</pre>
<p>و بعد یه دستوری تو این مایه ها : </p>
<pre class="brush: bash; title: ; notranslate">
$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 \
  --force=1 --cluster-count=50
</pre>
<p>برای کامپایل، البته انتخابهای بیشتری هست خیلی بیشتر. بعد اگه همه چی خوب پیش بره پروژه شما توی tmp ساخته میشه و شما میتونید اونو اجرا کنید : </p>
<pre class="brush: bash; title: ; notranslate">
cd /project/root/
sudo /full/path/to/program -m server -v &amp;quot;Server.SourceRoot=&lt;code&gt;pwd&lt;/code&gt;&amp;quot; \
  -v &amp;quot;Server.DefaultDocument=index.php&amp;quot; -c $HPHP_HOME/bin/mime.hdf
</pre>
<p>این دستور باید از توی جایی اجرا بشه که فایلهای استاتیک مثل عکس و CSS و &#8230; قرار دارن.<br />
البته انتخابهای بشتری هم هست، ولی اینجا جای توضیحشون نیست،‌در حقیقت این پروژه در حال پیشرفته و ممکنه همه اینها تغییر کنه، بنابراین ویکی خود پروژه انتخاب مناسبتریه برای راهنما :) </p>
<p>من با هیپ هاپ یه چند تایی برنامه رو به صورت کامل کامپایل کردم بدک نبود، ولی برای من فقط تنها استفاده ای که میتونه داشته باشه همون پروژه ای هستش که بالاتر گفتم ولی این چیزی از ارزش این پروژه کم نمیکنه. به هر حال من اصلا از فیسبوک خوشم نمیاد،‌ولی بابت این پروژه ازشون ممنونم!!</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/909/hiphop/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/811/zend-translate-and-gnugettext/' rel='bookmark' title='Zend_Translate و GnuGetText'>Zend_Translate و GnuGetText</a> <small>یکی از اصولی که سعی میکنم هنگام طراحی رعایت کنم،...</small></li>
<li><a href='http://cyberrabbits.net/403/source-forge-redirector/' rel='bookmark' title='دانلود از SourceForge بدون مشکل'>دانلود از SourceForge بدون مشکل</a> <small>اسکریپت رو اگه نصب کردید دوباره آپدیت کنید، چون sf...</small></li>
<li><a href='http://cyberrabbits.net/372/mail-for-zend-framework/' rel='bookmark' title='ارسال mail از طریق Zend Framework'>ارسال mail از طریق Zend Framework</a> <small>لطفا کامنتهای داخل کدها رو هم بخونید!! بعضیاشون واقعا ضروری...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/sMho-2_1db4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/909/hiphop/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>دکمه Caps Lock</title>
		<link>http://cyberrabbits.net/910/caps-lock-key/</link>
		<comments>http://cyberrabbits.net/910/caps-lock-key/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 20:34:11 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Mini posts]]></category>
		<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Caps Lock]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[xmodmap]]></category>
		<category><![CDATA[xorg]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=910</guid>
		<description><![CDATA[Caps Lock : نمیدونم این دکمه بی فایده و بی معنی رو کی درستش کرد؟ اگه میدونید بگید، سایتی چیزی داره معرفی کنید برم یکم سایتشو مسخره کنم دلم خنک شه!! خواهشمندم دفاع نکنید از این دکمه کذایی!!! با وجود دکمه شیفت، اصولا نیازی به دکمه Caps نیست. خوب بهترین جای کیبرد رو هم اشغال [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/775/zenity-part-3/' rel='bookmark' title='zenity بخش سوم'>zenity بخش سوم</a> <small>برای اینکه کم کم داشت کارهای ناتمومم زیاد میشد، تصمیم...</small></li>
<li><a href='http://cyberrabbits.net/383/zenity-part-on/' rel='bookmark' title='zenity بخش اول'>zenity بخش اول</a> <small>زنیتی (zenity) یک برنامه کوچک برای نمایش دیالوگ GTK+ از...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>Caps Lock : نمیدونم این دکمه بی فایده و بی معنی رو کی درستش کرد؟ اگه میدونید بگید، سایتی چیزی داره معرفی کنید برم یکم سایتشو مسخره کنم دلم خنک شه!! خواهشمندم دفاع نکنید از این دکمه کذایی!!!<br />
با وجود دکمه شیفت، اصولا نیازی به دکمه Caps نیست. خوب بهترین جای کیبرد رو هم اشغال کرده! حیف نیست آخه؟ حالا یه آدم بی عقل هم میاد و یه روز توی ۲۰۱۱ رو به عنوان روز Caps Lock معرفی میکنه نمیدونید من چه حالی میشم. خیلی خودمو کنترل کردم و ژست آدم خوب به خودم گرفتم که نرفتم فحش بنویسم! فردا هم حتما روز جهانی باقالی میخوایم راه بندازیم! یا مثلا روز جهانی ویندوز! یا هر چیز مسخره دیگه!<br />
اگه مثلا این دکمه میشد دکمه Ctrl چی میشد! ولی من بیشترین مشکل رو باهاش وقتی پیدا میکنم که میخوام دکمه Tab رو بزنم که یکی از دکمه های محبوب منه! این شد که گشتم دنبال راه حلی برای حذف این دکمه مزاحم ، (نه برای گنوم یا KDE  برای ترمینال و ssh بیشتر)</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
xmodmap -e &quot;remove Lock = Caps_Lock&quot; # Remove Caps Lock
xmodmap -e &quot;keycode 66 = Tab&quot; # Make the key into Tab (Or other keys, its your choice!)
</pre>
<p>سادست! فقط باید پکیج xorg-xmodmap (برای آرچ لینوکس، برای اوبونتو یا بقیه دیستروها هم یه چیزی باید باشه تو همین مایه ها، میدونید تو نظر بگید اصلاح کنم.)<br />
برای گنوم هم میتونید توی تنظیمات Keyboard Layout دکمه Option بخش Caps Lock key behavior کار این دکمه رو عوض کنید. برای KDE هم میدونم که داره ولی نمیدونم کجا :)‌</p>
<p>پی نوشت :<br />
 <a href='http://www.huffingtonpost.com/2011/06/28/caps-lock-day-2011-_n_885924.html#s299523&#038;title=Eric_Dale_Bader' title='CAPS LOCK DAY 2011: Celebrate Capital Letters With TWEETS!'>CAPS LOCK DAY 2011: Celebrate Capital Letters With TWEETS!</a>  روز جهانی!!!! Caps Lock</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/910/caps-lock-key/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/775/zenity-part-3/' rel='bookmark' title='zenity بخش سوم'>zenity بخش سوم</a> <small>برای اینکه کم کم داشت کارهای ناتمومم زیاد میشد، تصمیم...</small></li>
<li><a href='http://cyberrabbits.net/383/zenity-part-on/' rel='bookmark' title='zenity بخش اول'>zenity بخش اول</a> <small>زنیتی (zenity) یک برنامه کوچک برای نمایش دیالوگ GTK+ از...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/ED51jft-i_g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/910/caps-lock-key/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>zsh جایگزینی مناسب برای bash</title>
		<link>http://cyberrabbits.net/893/zshell/</link>
		<comments>http://cyberrabbits.net/893/zshell/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 07:37:55 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[لینوکس]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[zsh]]></category>
		<category><![CDATA[zshell]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=893</guid>
		<description><![CDATA[یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه که باید توی ترمینال اجرا بشن. به همین دلیل ساده، ترمینالهای گنو/لینوکس به طرز شگفت آوری برتر از ترمینال مسخره ویندوز عمل میکنن. یه نکته جالبتر اینکه توی لینوکس، انتخابهای متفاوتی برای ترمینال وجود داره. تقریبا اکثر دیستروها از bash استفاده میکنن. یه پوسته ساده [...]<div class='yarpp-related-rss'>

پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
</ol>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
]]></description>
				<content:encoded><![CDATA[<p>یکی از اجزای جدا ناشدنی از گنو/لینوکس، ترمینال و دستوراتیه که باید توی ترمینال اجرا بشن. به همین دلیل ساده، ترمینالهای گنو/لینوکس به طرز شگفت آوری برتر از ترمینال مسخره ویندوز عمل میکنن.<br />
یه نکته جالبتر اینکه توی لینوکس، انتخابهای متفاوتی برای ترمینال وجود داره. تقریبا اکثر دیستروها از bash استفاده میکنن. یه پوسته ساده که تقریبا تبدیل شده به یه استاندارد.<br />
منتها چند وقت پیش در پی دسته گلی که به آب دادم و آرچ رو داغون کردم، برای بالا اومدن به صورت لایو از <a href='http://grml.org/' title='grml.org - Debian Live system / CD for sysadmins and texttool-users'>grml.org &#8211; Debian Live system / CD for sysadmins and texttool-users</a> آستفاده کردم و اگر چه نتونستم سیستم رو دوباره برگردونم، ولی بی هیچ تعارفی لینوکس رو که عوض کردم،‌ حتی قبل از نصب گنوم، zsh رو نصب کردم.<br />
<a href="http://cyberrabbits.net/893/zshell/powertoolzny0/" rel="attachment wp-att-900"><img src="http://cyberrabbits.net/wp-content/uploads/2011/06/powertoolzny0-200x300.jpg" alt="" title="powertoolzny0" width="200" height="300" class="aligncenter size-medium wp-image-900" /></a><br />
<span id="more-893"></span><br />
برای نصب zsh توی دیستروی خودتون مطمئنا میتونید از Repo های اصلی استفاده کنید.<br />
برای آرچ : </p>
<pre class="brush: bash; title: ; notranslate">
pacman -S zsh
</pre>
<p>برای اوبونتو و مینت : </p>
<pre class="brush: bash; title: ; notranslate">
apt-get install zsh
</pre>
<p>گام بعدی تغییر Login Shell کاربر شما به این شل جدیده. یه راه اینه که فایل /etc/passwd رو ویرایش کنید که برای اینکار باید حتما روت باشید (یعنی با sudo دستور رو اجرا کنید) بعد از باز کردن فایل مورد نظر خط کاربری که مورد نظرتونه توش پیدا کنید، یه خطی شبیه این :</p>
<pre class="brush: plain; title: ; notranslate">
eli:x:1000:1000:eli,,,:/home/eli:/bin/bash
</pre>
<p>تو این فایل به ازای هر یه کاربر یه خط وجود داره. قسمت آخر خط، دقیقا بعد از :‌ آخری، نشون دهنده shell مورد استفاده این کاربره، و برای تغییر باید عوض بشه به آدرس کامل zsh. توی دیستروهای مختلف، ممکنه جای zsh متفاوت باشه. برای اینکه مطمئن بشید دستور زیر رو اجرا کنید تا آدرس کاملشو پیدا کنید : </p>
<pre class="brush: bash; title: ; notranslate">
which zsh
</pre>
<p>و بعد اینو به جای شل فعلی مورد استفاده کاربرتون بنویسید. یعنی خط بالایی میشه-این دقیقا از یه سیستم لینوکس مینت کپی شده، برای دیستروی شما شاید متفاوت باشه، کپی پیست نکنید لطفا!- : </p>
<pre class="brush: plain; title: ; notranslate">
eli:x:1000:1000:eli,,,:/home/eli:/usr/bin/zsh
</pre>
<p>این راه سختترش بود :) اما یه دستور هم ارایه شده برای تغییر شل کاربر فعلی، توی ترمینال بزنید </p>
<pre class="brush: bash; title: ; notranslate">
chsh
</pre>
<p>بعد ازتون میپرسه که شل جدید چی باشه.<br />
با یه logout/login شل جدید جایگزین میشه. برای اولین بار، یه سری سوال میپرسه که براتون تنظیمات اصلی رو توی پوشه خانگی بنویسه یا نه که هر طور دوست دارید انتخاب کنید. با ویرایش فایل .zshrc که یک فایل مخفی در پوشه خانگی شماست میتونید تنظیمات این شل رو تغییر بدید.<br />
من الان همین شل رو روی یک <a href='http://www.friendlyarm.net/products/mini2440' title='Mini2440 | S3C2440 ARM9 Board - FriendlyARM'>Mini2440</a> نصب کردم و این هم فایل تنظیمات این دستگاه هستش -تا حدی بهش معتاد شدم که حتی تو این دستگاه هم نصبه!-</p>
<pre class="brush: bash; title: ; notranslate">
#Some alias
alias ls='ls --color=auto'
alias rm=&quot;rm -i&quot;
#Default editor 
export EDITOR=nano
#Auto load stuff
autoload -U compinit promptinit
compinit
promptinit
#Set mask for new directory permision
umask 022

#Left prompt :)
PROMPT='%(0?.''.%S%?%s )%U%n%u@%B%m% %b %# '
# prompt for right side of screen
RPROMPT='[%C]' 
#History in zsh
HISTSIZE=1000
SAVEHIST=1000
HISTFILE=~/.history
</pre>
<p>امکانات این شل، بسیار بیشتر از Bash هستش و از اونها میشه به auto complete بسیار جالب-که حتی متغیرهای محیطی رو تشخیص میده و میاره- ، PROMPT های فوق العاده قابل انعطاف (با یک سری امکانات که میشه اونها رو به صورت شرطی در آورد، مثلا %(0?.&#8221;.%S%?%s ) میگه در صورتی که آخرین برنامه خروجیش غیر صفر بود، خروچی رو به صورت highligh شده بنویس) . بیشتر از اینو میسپرم به خودتون، این آدرسها برای شروع خوبن :<br />
<a href='http://www.nparikh.org/unix/prompt.php' title='Customizing your shell prompt'>Customizing your shell prompt</a><br />
<a href='http://aperiodic.net/phil/prompt/' title='Phil!'s ZSH Prompt'>Phil!&#8217;s ZSH Prompt</a><br />
نکته ای که شاید دونستنش خالی از لطف نباشه، اینه که اسم این شل رو نویسندش Paul Falstad از اسم professor Zhong Shao گرفته که همیشه نام کاربریش zsh بوده و به نظرش اسم این پروفسور،‌ مناسب بوده که اسم یک شل باشه! (به نقل از <a href='http://en.wikipedia.org/wiki/Zsh' title='Z shell - Wikipedia, the free encyclopedia'>Wikipedia &#8211; Z shell</a>)</p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/893/zshell/"></g:plusone></div><div class='yarpp-related-rss'>
<p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/547/install-farsi-font-linux-zenity/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI'>اسکریپت نصب فونت فارسی برای لینوکس نسخه GUI</a> <small>قبلا یک اسکریپت نوشته بودم برای نصب فونت فارسی در...</small></li>
<li><a href='http://cyberrabbits.net/360/bash-gui-wget/' rel='bookmark' title='Bash GUI for wget'>Bash GUI for wget</a> <small>اینبار هم میخوام بازم یه اسکریپت رو که تازه نوشتم...</small></li>
<li><a href='http://cyberrabbits.net/344/farsifonts-installer-linux/' rel='bookmark' title='اسکریپت نصب فونت فارسی برای لینوکس'>اسکریپت نصب فونت فارسی برای لینوکس</a> <small>تعداد فونتهایی که به لیست اضافه شدن الان دیگه خیلی...</small></li>
</ol></p>
<img src='http://yarpp.org/pixels/8ac77eef4c18fab6ad59ef74c4ceac46'/>
</div>
<img src="http://feeds.feedburner.com/~r/cyberrabbits/posts/~4/llyhY3l1LaU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/893/zshell/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 2.183 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-19 05:12:13 --><!-- Compression = gzip -->
