<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Void and Null &#187; code</title>
	<atom:link href="http://blog.ivanatora.info/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ivanatora.info</link>
	<description>Code, Linux and Shits</description>
	<lastBuildDate>Wed, 01 Feb 2012 17:48:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Регулярни изрази в C (PCRE)</title>
		<link>http://blog.ivanatora.info/2009/11/19/%d1%80%d0%b5%d0%b3%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%b8-%d0%b8%d0%b7%d1%80%d0%b0%d0%b7%d0%b8-%d0%b2-c-pcre/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2580%25d0%25b5%25d0%25b3%25d1%2583%25d0%25bb%25d1%258f%25d1%2580%25d0%25bd%25d0%25b8-%25d0%25b8%25d0%25b7%25d1%2580%25d0%25b0%25d0%25b7%25d0%25b8-%25d0%25b2-c-pcre</link>
		<comments>http://blog.ivanatora.info/2009/11/19/%d1%80%d0%b5%d0%b3%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%b8-%d0%b8%d0%b7%d1%80%d0%b0%d0%b7%d0%b8-%d0%b2-c-pcre/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 18:44:26 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://blog.ivanatora.info/?p=338</guid>
		<description><![CDATA[Предполагам че на всеки, който пише код рано или късно му се налага да парсва низове. В случай че низът не е нещо кратко, точно и ясно, се налага използването на regex. В различните езици регулярни изрази се ползват по различен начин. Общото е че върху изследвания низ се налага шаблон и според това дали [...]]]></description>
			<content:encoded><![CDATA[<p>Предполагам че на всеки, който пише код рано или късно му се налага да парсва низове. В случай че низът не е нещо кратко, точно и ясно, се налага използването на regex. В различните езици регулярни изрази се ползват по различен начин. Общото е че върху изследвания низ се налага шаблон и според това дали низът попада в шаблона (match-ва) се предприемат някакви действия или части от низа се прехвърлят в други променливи. В Perl това става лесно - има си езикова конструкция:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$string</span> = <span class="st0">&quot;The lazy dog jumped over the quick brown fox.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$string</span> =~ /<span class="br0">&#40;</span>\w<span class="br0">&#123;</span><span class="nu0">3</span><span class="br0">&#125;</span>\./<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$match</span> = $<span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">do_something_on<span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Кракто и ясно - ако низът попада в /шаблон/ - да се направи еди какво си. Няма да се спирам точно върху синтаксиса на шаблоните, понеже самия факт че четете това тук предполага че сте на ясно <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Все пак ако не сте на ясно, ето ви един плашещ шаблон, за да се откажете още тук:<br />
<code>/^([\d\.]+?)\skill\s+(\d+)\s+([\w\s]+?)(\d+?)\s+([\w\s]+?)\w+$/</code><br />
Това използвам за парсване на тези редове от логовете на Unreal Tournament:<br />
<code>175.48  kill    1       Sniper Rifle    5       Sniper Rifle    Decapitated</code><br />
В PHP няма езикова конструкция, но има доста функции за <a href="http://bg.php.net/manual/en/ref.pcre.php">Perl Compatible Regular Expressions</a>, които работят на същия принцип.<br />
Сега да видим как е положението в С.<br />
От много време търсех как мога да ползвам регулярни изрази, но все удрях на камък. Когато ми се е налагало да парсвам низове съм ползвал sscanf или разбиване на символи, броене, чакане Х-тия символ да е точно 'А', Y-тия да е точно 'B' и т.н. Неприятна работа включваща жонглиране с цикли, if-ове, strcmp и двадесет нива индентация на кода.<br />
Днес открих че в С има поддръжка на PCRE и ми се дощя да се самоубия <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ако работите на нормална операционна система, то може да видите много информация с <em>man pcre</em> и <em>man pcreapi</em>. Ако сте наистина щастливци, някъде из дистрибуцията ще имате файл pcredemo.c, който нагледно показва как се работи с PCRE функциите.<br />
Ако не сте от тези щастливци можете да си намерите файла от <a href='http://dev.ivanatora.info/tests/pcredemo.c'>тук</a>.<br />
Използват се две основни функции: pcre_compile и pcre_exec. Първата поема съставения шаблон от потребителски низов вид и го превръща във вътрешното представяне, което компилатора използва. Втората функция налага шаблона върху тествания низ и връща съвпаденията във вид на масив от вектори, сочещи началните позиции на съвпаденията. Можете да прочетете за функциите в съответните man страници. И най-добре вижте pcredemo.c</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2009/11/19/%d1%80%d0%b5%d0%b3%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%b8-%d0%b8%d0%b7%d1%80%d0%b0%d0%b7%d0%b8-%d0%b2-c-pcre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Закоментиране на цял блок код с един знак</title>
		<link>http://blog.ivanatora.info/2009/11/01/%d0%b7%d0%b0%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d1%86%d1%8f%d0%bb-%d0%b1%d0%bb%d0%be%d0%ba-%d0%ba%d0%be%d0%b4-%d1%81-%d0%b5%d0%b4%d0%b8%d0%bd-%d0%b7%d0%bd/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b7%25d0%25b0%25d0%25ba%25d0%25be%25d0%25bc%25d0%25b5%25d0%25bd%25d1%2582%25d0%25b8%25d1%2580%25d0%25b0%25d0%25bd%25d0%25b5-%25d0%25bd%25d0%25b0-%25d1%2586%25d1%258f%25d0%25bb-%25d0%25b1%25d0%25bb%25d0%25be%25d0%25ba-%25d0%25ba%25d0%25be%25d0%25b4-%25d1%2581-%25d0%25b5%25d0%25b4%25d0%25b8%25d0%25bd-%25d0%25b7%25d0%25bd</link>
		<comments>http://blog.ivanatora.info/2009/11/01/%d0%b7%d0%b0%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d1%86%d1%8f%d0%bb-%d0%b1%d0%bb%d0%be%d0%ba-%d0%ba%d0%be%d0%b4-%d1%81-%d0%b5%d0%b4%d0%b8%d0%bd-%d0%b7%d0%bd/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 13:51:42 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[пинизи]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivanatora.info/?p=326</guid>
		<description><![CDATA[Този бърз хак работи само в езици, които поддържат коментари от вида "//" за коментиране на ред и такива от вида "/* ... */" за коментиране на блок. Да вземем този блок: &#160; blqk&#40;&#41;; puf&#40;&#41;; paf&#40;&#41;; &#160; Да го закоментираме целия: &#160; /* blqk(); puf(); paf(); */ &#160; И да закоментираме затварящия коментар &#160; /* [...]]]></description>
			<content:encoded><![CDATA[<p>Този бърз хак работи само в езици, които поддържат коментари от вида "//" за коментиране на ред и такива от вида "/* ... */" за коментиране на блок.<br />
Да вземем този блок:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">blqk<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">puf<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">paf<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Да го закоментираме целия:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">blqk();</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">puf();</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">paf();</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>И да закоментираме затварящия коментар <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">blqk();</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">puf();</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">paf();</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">//*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>В този момент целия блок е закоментиран. Ако сега добавим единична "/" пред отварящия коментар, коментарите ще отпаднат и блокът ще се разкоментира:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//*</span></div>
</li>
<li class="li1">
<div class="de1">blqk<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">puf<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">paf<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Изпробвано е и работи в С и РНР. Ако имате пуснато оцветяване на кода в редактора, който ползвате (и оцветяването работи добре в реално време), ще видите интерсна гледка при добавяне и премахване на магическата "/" <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2009/11/01/%d0%b7%d0%b0%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d1%86%d1%8f%d0%bb-%d0%b1%d0%bb%d0%be%d0%ba-%d0%ba%d0%be%d0%b4-%d1%81-%d0%b5%d0%b4%d0%b8%d0%bd-%d0%b7%d0%bd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Интегриране на GCC във Vim</title>
		<link>http://blog.ivanatora.info/2009/03/25/%d0%b8%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-gcc-%d0%b2%d1%8a%d0%b2-vim/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b8%25d0%25bd%25d1%2582%25d0%25b5%25d0%25b3%25d1%2580%25d0%25b8%25d1%2580%25d0%25b0%25d0%25bd%25d0%25b5-%25d0%25bd%25d0%25b0-gcc-%25d0%25b2%25d1%258a%25d0%25b2-vim</link>
		<comments>http://blog.ivanatora.info/2009/03/25/%d0%b8%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-gcc-%d0%b2%d1%8a%d0%b2-vim/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 07:24:31 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[пинизи]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivanatora.info/?p=277</guid>
		<description><![CDATA[Вдъхновен от поста на един приятел, реших че може малко да си улесня живота като добавя бързи бутони за Compile и CompileRun във vim Пиниза наистина е лесен и си струва. Следните редове се добавят във .vimrc: &#160; map &#60;F9&#62; :call CompileRun&#40;&#41;&#60;CR&#62; map &#60;F5&#62; :call Compile&#40;&#41;&#60;CR&#62; func! CompileRun&#40;&#41; &#160; &#160; &#160; &#160; exec &#34;w&#34; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Вдъхновен от <a href='http://gotha88.blogspot.com/2009/03/gedit-ide-c.html'>поста</a> на един приятел, реших че може малко да си улесня живота като добавя бързи бутони за Compile и CompileRun във vim <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Пиниза наистина е лесен и си струва. Следните редове се добавят във .vimrc:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">map &lt;F9&gt; :call CompileRun<span class="br0">&#40;</span><span class="br0">&#41;</span>&lt;CR&gt;</div>
</li>
<li class="li1">
<div class="de1">map &lt;F5&gt; :call Compile<span class="br0">&#40;</span><span class="br0">&#41;</span>&lt;CR&gt;</div>
</li>
<li class="li1">
<div class="de1">func! CompileRun<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; exec <span class="st0">&quot;w&quot;</span> &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; exec <span class="st0">&quot;!gcc % -o %&lt; &amp;&amp; ./%&lt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">endfunc</div>
</li>
<li class="li1">
<div class="de1">func! Compile<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; exec <span class="st0">&quot;w&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; exec <span class="st0">&quot;!gcc % -o %&lt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">endfunc</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>След това докато редактирате .с файл цъкате F5 и файла се компилира, F9 и се компилира и изпълнява. Евентуално може да бъде добавена и функцийка за make с Makefile.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2009/03/25/%d0%b8%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-gcc-%d0%b2%d1%8a%d0%b2-vim/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Мониторинг качеството на нета</title>
		<link>http://blog.ivanatora.info/2009/03/11/%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd%d0%b0-%d0%bd%d0%b5%d1%82%d0%b0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25bc%25d0%25be%25d0%25bd%25d0%25b8%25d1%2582%25d0%25be%25d1%2580%25d0%25b8%25d0%25bd%25d0%25b3-%25d0%25ba%25d0%25b0%25d1%2587%25d0%25b5%25d1%2581%25d1%2582%25d0%25b2%25d0%25be%25d1%2582%25d0%25be-%25d0%25bd%25d0%25b0-%25d0%25bd%25d0%25b5%25d1%2582%25d0%25b0</link>
		<comments>http://blog.ivanatora.info/2009/03/11/%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd%d0%b0-%d0%bd%d0%b5%d1%82%d0%b0/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 23:03:24 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[линукс]]></category>
		<category><![CDATA[пинизи]]></category>

		<guid isPermaLink="false">http://ivanatora.info/?p=267</guid>
		<description><![CDATA[Терминът "качество на нета" по-скоро е взет от някой тинейджърски журнал, но уцелва точно нуждите на крайния клиент. Аз като клиент на моя ISP се нуждая от две неща - ниска (по възможност - никаква) загуба на пакети и ниско (по възможност - никакво) забавяне на пакетите. Това трябва да ми се поднесе разбираемо, с [...]]]></description>
			<content:encoded><![CDATA[<p>Терминът "качество на нета" по-скоро е взет от някой тинейджърски журнал, но уцелва точно нуждите на крайния клиент. Аз като клиент на моя ISP се нуждая от две неща - ниска (по възможност - никаква) загуба на пакети и ниско (по възможност - никакво) забавяне на пакетите. Това трябва да ми се поднесе разбираемо, с картинка.<br />
Нужен софтуер:</p>
<ul>
<li><a href='http://oss.oetiker.ch/rrdtool/'>RRDtool</a> - има страхотни възможности за представяне на числова информация. За примерни графики вижте <a href='http://oss.oetiker.ch/rrdtool/gallery/index.en.html'>галерията</a> им.</li>
<li>ping - резултата от изпълнението на ping съдържа всичко необходимо за изграждане на статистиката ни - Round trip time и Packet loss</li>
<li>Perl - или друг удобен ви език. Трябва ви за парсване на изхода от ping</li>
<li>crontab - искаме статистиката да се събира през определен интервал от време</li>
</ul>
<p>Системата може да бъде разделена на две части: част за събиране на статистика и част за графично представяне на данните.<br />
<strong>Събиране на статистика</strong><br />
На всеки 5 минути ще се пуска ping до няколко избрани хоста в различни зони на пиъринга. Естествено върнатите резултати ще са субективни, защото зависят от параметрите на отсрещната точка. Все пак цялото задание "качество на нета" е субективно, така че да продължаваме <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Избрал съм единия хост да бъде шлюза на доставчика ми, втория хост да бъде dir.bg (тест на bg пиъринга) и третия хост да бъде ivanatora.info (за тест на международната свързаност).<br />
Логът се изгражда от следния скрипт:<br />
/home/ivanatora/perl_razni/ping_stats.pl</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/perl</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$target</span> = <span class="re0">$ARGV</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>; <span class="co1"># тук ще идва адреса на целта</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$db</span> = <span class="re0">$ARGV</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>; <span class="co1"># тук ще идва в коя база ще се записва</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$dump</span> = <span class="st0">&quot;/home/ivanatora/stats_ping/$target.log&quot;</span>; <span class="co1"># лога с крайните резултати</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$rrd_path</span> = <span class="st0">&quot;/home/ivanatora/rrd/temps/pings&quot;</span>; <span class="co1"># директорията с RRD базите</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://perldoc.perl.org/functions/open.html"><span class="kw3">open</span></a> <span class="br0">&#40;</span>FH, <span class="st0">&quot;&gt;&gt;&quot;</span>, <span class="re0">$dump</span><span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;$!&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="re0">$sec</span>,<span class="re0">$min</span>,<span class="re0">$hour</span>,<span class="re0">$mday</span>,<span class="re0">$mon</span>,<span class="re0">$year</span>,<span class="re0">$wday</span>,<span class="re0">$yday</span>,<span class="re0">$isdst</span><span class="br0">&#41;</span> = <a href="http://perldoc.perl.org/functions/localtime.html"><span class="kw3">localtime</span></a><span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/time.html"><span class="kw3">time</span></a><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$mon</span>++;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$year</span> += <span class="nu0">1900</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$time</span> = <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%02d/%02d/%4d %02d:%02d:%02d&quot;</span>, <span class="re0">$mday</span>, <span class="re0">$mon</span>, <span class="re0">$year</span>, <span class="re0">$hour</span>, <span class="re0">$min</span>, <span class="re0">$sec</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$output</span> = `/bin/ping -<a href="http://perldoc.perl.org/functions/q.html"><span class="kw3">q</span></a> -c100 -w100 <span class="re0">$target</span>`; <span class="co1"># пуска ping със 100 пакета и чака максимално 100 секунди за изпълнението на командата</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$output</span> =~ /<span class="br0">&#40;</span>\d+?<span class="br0">&#41;</span>% packet loss/<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$loss</span> = $<span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$percent</span> = <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%3d&quot;</span>, $<span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$output</span> =~ /rtt min\/avg\/max\/mdev = .+?\/<span class="br0">&#40;</span>.+?<span class="br0">&#41;</span>\//<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$avg</span> = $<span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> FH <span class="st0">&quot;$time : $percent% loss to $target Average: $1 ms<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># update RRD</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ts</span> = <a href="http://perldoc.perl.org/functions/time.html"><span class="kw3">time</span></a>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$mod</span> = <span class="re0">$ts</span> % <span class="nu0">300</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ts</span> -= <span class="re0">$mod</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$avg</span> =~ /^<span class="br0">&#40;</span>.+?<span class="br0">&#41;</span>\./;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$rtt</span> = $<span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; `/home/ivanatora/rrd/bin/rrdtool update <span class="re0">$rrd_path</span>/<span class="re0">$db</span>.rrd <span class="re0">$ts</span>:<span class="re0">$loss</span>:<span class="re0">$rtt</span>`; <span class="co1"># командата за ъпдейт на базата; TODO: да направя пътя до изпълнимия файл на rrdtool в променлива</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://perldoc.perl.org/functions/close.html"><span class="kw3">close</span></a> <span class="br0">&#40;</span>FH<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Малко изпреварвам времето, защото още не сме създали RRD базите. Каква е идеята на RRD? Round Robin Database е способ за запазване на постоянно изменяща се информация във времето, като всяка промяна се регистрира в цикличен буфер. Ако имаме един буфер със 12 слота и ъпдейтваме базата през 5 минути, във всеки момент ще имаме данните от предния час. Какво става с по-старите данни - губят ли се? Да. Ако ни трябват ще направим още един буфер, който ще се ъпдейтва на всяко цялостно извъртане на часовия буфер - ще взима средната стойност на всички измервания и ще го записва в един негов слот. Така ако този буфер има 24 слота ще имаме статистика на средната часова стойност на измерванията. Може да имате колкото си искате вторични буфери и всички се съхраняват в една и съща база и се ъпдейтват автоматично. Освен това в един буфер може да пазите стойностите на няколко променливи. Предимствата на RRD е че всяка промяна се регистрира, като размера на базата не нараства линейно във времето.<br />
До тук вероятно имаме лог с нещо такова:<br />
/home/ivanatora/stats_ping/dir.bg.log<br />
<code><br />
11/03/2009 00:05:01 :   0% loss to dir.bg Average: 7.271 ms<br />
11/03/2009 00:10:01 :   0% loss to dir.bg Average: 9.091 ms<br />
11/03/2009 00:15:01 :   0% loss to dir.bg Average: 7.466 ms<br />
11/03/2009 00:20:01 :   1% loss to dir.bg Average: 7.152 ms<br />
11/03/2009 00:25:01 :   0% loss to dir.bg Average: 8.273 ms<br />
11/03/2009 00:30:01 :   0% loss to dir.bg Average: 6.863 ms<br />
11/03/2009 00:35:01 :   0% loss to dir.bg Average: 11.690 ms<br />
</code><br />
Този лог може да използваме за каквото си искаме, а може и въобще да не го правим. Горния скрипт работи ъпдейтва директно rrdtool, така че ако не искате излишни логове да се пазят на машината ви насочете $dump = "/dev/null"; <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<br />
<strong>Създаване на RRD бази.</strong><br />
За всеки изследван хост ще направим по една база. В тази база ще се съхраняват стойностите за Round Trip Time и Packet Loss.<br />
Правим си следното bash скриптче (освен ако не ви мързи да го пишете на ръка за всяка база - може да имате и повече от три бази):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">NOW=</span>`<span class="kw2">date</span> +%s`</div>
</li>
<li class="li1">
<div class="de1">rrdtool create $<span class="nu0">1</span>.rrd --start <span class="re1">$NOW</span> --step <span class="nu0">300</span> \</div>
</li>
<li class="li2">
<div class="de2">DS:PacketLoss:GAUGE:<span class="nu0">300</span>:<span class="nu0">0</span>:<span class="nu0">100</span> \</div>
</li>
<li class="li1">
<div class="de1">DS:RTT:GAUGE:<span class="nu0">300</span>:<span class="nu0">0</span>:<span class="nu0">10000</span> \</div>
</li>
<li class="li1">
<div class="de1">RRA:LAST:<span class="nu0">0.5</span>:<span class="nu0">1</span>:<span class="nu0">288</span> \</div>
</li>
<li class="li1">
<div class="de1">RRA:AVERAGE:<span class="nu0">0.5</span>:<span class="nu0">6</span>:<span class="nu0">336</span> \</div>
</li>
<li class="li1">
<div class="de1">RRA:AVERAGE:<span class="nu0">0.5</span>:<span class="nu0">24</span>:<span class="nu0">360</span> \</div>
</li>
<li class="li2">
<div class="de2">RRA:AVERAGE:<span class="nu0">0.5</span>:<span class="nu0">288</span>:<span class="nu0">365</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Подробностите за синтаксиса можете да намерите в документацията на RRDtool. На кратко - създаваме база с 2 източника на данни (променливи, които ще следим): PacketLoss и RTT. Задават се интервалите на ъпдейт на всеки източник,минимални и максимални допустими стойности. След това се правят 4 Round Robin Archives (буферите, за които говорихме по-рано).<br />
Създаваме трите бази:<br />
<code><br />
[ivanatora@~/rrd/temps/pings]$ sh create_script.sh bg<br />
[ivanatora@~/rrd/temps/pings]$ sh create_script.sh gw<br />
[ivanatora@~/rrd/temps/pings]$ sh create_script.sh int<br />
</code><br />
Слагаме cronjob за изпълнение на ъпдейтващия скрипт на 5 минути:<br />
<code><br />
*/5 * * * * perl /home/ivanatora/perl_razni/ping_stats.pl 87.120.194.1 gw<br />
*/5 * * * * perl /home/ivanatora/perl_razni/ping_stats.pl dir.bg bg<br />
*/5 * * * * perl /home/ivanatora/perl_razni/ping_stats.pl ivanatora.info int<br />
</code><br />
Както видяхме скрипта приема два аргумента: адрес за ping и име на базата, която ъпдейтва.<br />
<strong>Рисуване на графиките</strong><br />
Ще имаме отделна графика за всяка следена величина. Може да комбинираме няколко от графиките на една, но само ако очаквате там приблизително еднакви резултати. Големите отклонения на величините карат rrdtool да измества разделителната способност на графиката и една от графиките в общата картинка не се вижда добре. Ще имаме два скрипта за чертане на графики - един за Round Trip Time и един за Packet Loss.<br />
/home/ivanatora/rrd/temps/pings/loss_graph.sh</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PATH=</span><span class="re1">$PATH</span>:/home/ivanatora/rrd/bin</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">DIR=</span>/home/ivanatora/rrd/temps/pings/</div>
</li>
<li class="li2">
<div class="de2">rrdtool graph <span class="re1">$DIR</span>/img/loss-$<span class="nu0">1</span>.png \</div>
</li>
<li class="li1">
<div class="de1">--<span class="re2">title=</span><span class="st0">&quot;&lt;$1&gt; Packet loss&quot;</span> \</div>
</li>
<li class="li1">
<div class="de1">--color CANVAS<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color BACK<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color GRID<span class="re3">#<span class="nu0">006600</span> \</span></div>
</li>
<li class="li2">
<div class="de2">--color MGRID<span class="re3">#<span class="nu0">003300</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color AXIS<span class="re3">#00ff00 \</span></div>
</li>
<li class="li1">
<div class="de1">--color FONT<span class="re3">#00ff00 \</span></div>
</li>
<li class="li1">
<div class="de1">--color SHADEA<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color SHADEB<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li2">
<div class="de2">--slope-mode \</div>
</li>
<li class="li1">
<div class="de1">--upper-limit <span class="nu0">100</span> \</div>
</li>
<li class="li1">
<div class="de1">--rigid \</div>
</li>
<li class="li1">
<div class="de1">--width <span class="nu0">480</span> \</div>
</li>
<li class="li1">
<div class="de1">--height <span class="nu0">300</span> \</div>
</li>
<li class="li2">
<div class="de2">--font DEFAULT:<span class="nu0">10</span>:Arial \</div>
</li>
<li class="li1">
<div class="de1">DEF:<span class="re2">loss=</span><span class="re1">$DIR</span>/$<span class="nu0">1</span>.rrd:PacketLoss:LAST \</div>
</li>
<li class="li1">
<div class="de1">DEF:<span class="re2">rtt=</span><span class="re1">$DIR</span>/$<span class="nu0">1</span>.rrd:RTT:LAST \</div>
</li>
<li class="li1">
<div class="de1">AREA:loss<span class="re3">#00FF00:</span><span class="st0">&quot;Packet loss (%)&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>/home/ivanatora/rrd/temps/pings/rtt_graph.sh</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PATH=</span><span class="re1">$PATH</span>:/home/ivanatora/rrd/bin</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">DIR=</span>/home/ivanatora/rrd/temps/pings/</div>
</li>
<li class="li2">
<div class="de2">rrdtool graph <span class="re1">$DIR</span>/img/rtt-$<span class="nu0">1</span>.png \</div>
</li>
<li class="li1">
<div class="de1">--<span class="re2">title=</span><span class="st0">&quot;&lt;$1&gt; Round trip time&quot;</span> \</div>
</li>
<li class="li1">
<div class="de1">--color CANVAS<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color BACK<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color GRID<span class="re3">#<span class="nu0">006600</span> \</span></div>
</li>
<li class="li2">
<div class="de2">--color MGRID<span class="re3">#<span class="nu0">003300</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color AXIS<span class="re3">#00ff00 \</span></div>
</li>
<li class="li1">
<div class="de1">--color FONT<span class="re3">#00ff00 \</span></div>
</li>
<li class="li1">
<div class="de1">--color SHADEA<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li1">
<div class="de1">--color SHADEB<span class="re3">#<span class="nu0">000000</span> \</span></div>
</li>
<li class="li2">
<div class="de2">--slope-mode \</div>
</li>
<li class="li1">
<div class="de1">--width <span class="nu0">480</span> \</div>
</li>
<li class="li1">
<div class="de1">--height <span class="nu0">300</span> \</div>
</li>
<li class="li1">
<div class="de1">--font DEFAULT:<span class="nu0">10</span>:Arial \</div>
</li>
<li class="li1">
<div class="de1">DEF:<span class="re2">loss=</span><span class="re1">$DIR</span>/$<span class="nu0">1</span>.rrd:PacketLoss:LAST \</div>
</li>
<li class="li2">
<div class="de2">DEF:<span class="re2">rtt=</span><span class="re1">$DIR</span>/$<span class="nu0">1</span>.rrd:RTT:LAST \</div>
</li>
<li class="li1">
<div class="de1">AREA:rtt<span class="re3">#00FF00:</span><span class="st0">&quot;Round trip time (ms)&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Тук можем да си поиграем с цветовете и крайния резултат да е доста eye-candy. Важните редове са DEF - където се извличат стойностите на променливите от базата и AREA - самото изчертаване. За повече подробности - документацията на RRDtool.<br />
След това правим един скрипт, който да задейства изчертаване на всички графики:<br />
/home/ivanatora/rrd/temps/pings/graph_all.sh</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">DIR=</span>/home/ivanatora/rrd/temps/pings/</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$DIR</span>/loss_graph.<span class="kw2">sh</span> int</div>
</li>
<li class="li2">
<div class="de2"><span class="re1">$DIR</span>/loss_graph.<span class="kw2">sh</span> <span class="kw3">bg</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$DIR</span>/loss_graph.<span class="kw2">sh</span> gw</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$DIR</span>/rtt_graph.<span class="kw2">sh</span> int</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$DIR</span>/rtt_graph.<span class="kw2">sh</span> <span class="kw3">bg</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$DIR</span>/rtt_graph.<span class="kw2">sh</span> gw</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>И поставяме съответната задача в crontab:<br />
<code><br />
*/5 * * * * sh /home/ivanatora/rrd/temps/pings/graph_all.sh<br />
</code><br />
В резултат всичките изображения се намират в директорията pings/img/. Остава да направим красива HTML страничка, която да събира всичко в едно.<br />
Резултата можете да го видите <a href='http://87.120.194.120/tests/netstat/'>тук</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2009/03/11/%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%ba%d0%b0%d1%87%d0%b5%d1%81%d1%82%d0%b2%d0%be%d1%82%d0%be-%d0%bd%d0%b0-%d0%bd%d0%b5%d1%82%d0%b0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ах този фреймрейт&#8230;</title>
		<link>http://blog.ivanatora.info/2009/02/03/%d0%b0%d1%85-%d1%82%d0%be%d0%b7%d0%b8-%d1%84%d1%80%d0%b5%d0%b9%d0%bc%d1%80%d0%b5%d0%b9%d1%82/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b0%25d1%2585-%25d1%2582%25d0%25be%25d0%25b7%25d0%25b8-%25d1%2584%25d1%2580%25d0%25b5%25d0%25b9%25d0%25bc%25d1%2580%25d0%25b5%25d0%25b9%25d1%2582</link>
		<comments>http://blog.ivanatora.info/2009/02/03/%d0%b0%d1%85-%d1%82%d0%be%d0%b7%d0%b8-%d1%84%d1%80%d0%b5%d0%b9%d0%bc%d1%80%d0%b5%d0%b9%d1%82/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 16:25:50 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[сорс]]></category>
		<category><![CDATA[филми]]></category>

		<guid isPermaLink="false">http://ivanatora.info/?p=219</guid>
		<description><![CDATA[Не ми харесва когато се окаже че субтитрите за някой филм не съвпадат с кадрите на филма. Резултата е постоянно избързване или изоставане на субтитрите спрямо действието, което с течение на времето се увеличава все повече и повече. Някой от умните съвременни плеъри имат опция за смяна на framerate на субтитърния файл. Но повечето го [...]]]></description>
			<content:encoded><![CDATA[<p>Не ми харесва когато се окаже че субтитрите за някой филм не съвпадат с кадрите на филма. Резултата е постоянно избързване или изоставане на субтитрите спрямо действието, което с течение на времето се увеличава все повече и повече. Някой от умните съвременни плеъри имат опция за смяна на framerate на субтитърния файл. Но повечето го нямат.<br />
По-неприятното е когато всички български сайтове за субтитри имат само една версия на субтитрите, които ви трябват, и то тази версия е за фреймрейт, който е различен от този на филма ви. Тогава или постоянно коригирате субтитрите (бутони Z и X в mplayer) или ги зарязвате и гледате филма в оригинал. Поздрави на хората, които могат от първо слушане да разбират говорим диалектен и жаргонен английски език. Завиждам им.<br />
Алтернативата е да си оправите субтитрите - в нета има доста програмки, които нагласят фреймрейта. Всъщност цялата философия е да се смени времето на появяване на всяка реплика по една проста формула, за това реших да се поупражня и да си напиша моя програмка.<br />
Представям ви - <a href='http://ivanatora.info/test/subconv.c'>subconv.c</a>. Програмата за сега работи само със субтитри във формат MicroDVD, а в кода има инструкции за експлоатация. Много неща трябва да се пипнат там, което ще направя когато отново ме стегне шапката че не мога да гледам нещо <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2009/02/03/%d0%b0%d1%85-%d1%82%d0%be%d0%b7%d0%b8-%d1%84%d1%80%d0%b5%d0%b9%d0%bc%d1%80%d0%b5%d0%b9%d1%82/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Грижа за очите и душата</title>
		<link>http://blog.ivanatora.info/2008/06/11/%d0%b3%d1%80%d0%b8%d0%b6%d0%b0-%d0%b7%d0%b0-%d0%be%d1%87%d0%b8%d1%82%d0%b5-%d0%b8-%d0%b4%d1%83%d1%88%d0%b0%d1%82%d0%b0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b3%25d1%2580%25d0%25b8%25d0%25b6%25d0%25b0-%25d0%25b7%25d0%25b0-%25d0%25be%25d1%2587%25d0%25b8%25d1%2582%25d0%25b5-%25d0%25b8-%25d0%25b4%25d1%2583%25d1%2588%25d0%25b0%25d1%2582%25d0%25b0</link>
		<comments>http://blog.ivanatora.info/2008/06/11/%d0%b3%d1%80%d0%b8%d0%b6%d0%b0-%d0%b7%d0%b0-%d0%be%d1%87%d0%b8%d1%82%d0%b5-%d0%b8-%d0%b4%d1%83%d1%88%d0%b0%d1%82%d0%b0/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 03:36:09 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://ivan.tu-plovdiv.info/blog/?p=93</guid>
		<description><![CDATA[През мен са минали доста сорсове, писани от различни хора. Целта на този пост не е да ви уча как да пишете професионално (къде дават дипломи за програмисти ), а да пишете разбираемо. Винаги пишете с идеята, че някой друг след вас ще трябва да ви променя кода. Още по-добре - пишете с идеята, че [...]]]></description>
			<content:encoded><![CDATA[<p>През мен са минали доста сорсове, писани от различни хора. Целта на този пост не е да ви уча как да пишете професионално (къде дават дипломи за програмисти <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), а да пишете разбираемо. Винаги пишете с идеята, че някой друг след вас ще трябва да ви променя кода. Още по-добре - пишете с идеята, че вие самия ще трябва да си променяте кода след месеци... и няма да разберете какво сте написал.<br />
Защо това е важно? Ъпгрейди винаги се налагат - хората искат добавяне на функции. Бъгове винаги се получават, колкото и безгрешно да пишете. Условията на средата се променят, входните параметри се променят, и накрая нещо ще трябва да се фиксва.<br />
Рано или късно всеки сорс минава през преразглеждане. Мислете за колегата, на когото ще му се наложи да се оправя из вашите сорсове. Не ви е направил нищо лошо - не му тровете нервите. Не го карайте да ви псува.</p>
<p>Ето няколко основни правила за писане на четим код.<br />
- Научете български. Научете и английски. Нека програмата ви да е поне граматически правилна.<br />
- Пишете коментари - по много. Знам че в момента на писането всичко ви е ясно и програмата ви е в главата. След седмица или месец няма да помните че сте писал съответния код.<br />
- Пишете документация. Поне описание на файловете и на включените библиотеки. Ако използвате функции, които са описани в други файлове, добре е да пишете кое от къде идва.<br />
<code><br />
....<br />
include("../../../../sys.php");<br />
include("../../../lib.php");<br />
include("../../../../../pre.php');<br />
....<br />
check($alpha);<br />
</code><br />
От къде е дошла check()? Какво прави? Идете и преровете горните файлове, които може да са по сто хиляди реда код, а може и да include()-ват още сто файла.<br />
- Именувайте променливите и функциите според това какво правят. Използвайте кратки имена, не по-дълги от 3-4 думи. Използвайте долни черти между думите, или пишете думите заедно, но всяка следваща дума да започва с главна буква. Не използвайте едносрични имена - не се опитвайте да пишете 'бързо' - пишете 'четимо'. Не използвайте имена с номерация - ако имате няколко променливи, които имат еднаква фукция, може би е по-добре да ги вкарате в масив?<br />
Лоши наименования:<br />
<code><br />
check() //какво се проверява?<br />
dosomeprettyboringstuffandmore() //опитайте се да го напишете няколко пъти<br />
test_directories_check_users_update_db_on_exist() //ако една функция трябва да прави много неща, може би е по-добре да я разделите на няколко функции<br />
$var //ами вижда се че е променлива<br />
$var1, $var2, $var3 //още по-зле<br />
</code><br />
Добри наименования:<br />
<code><br />
run_query()<br />
$thumb_path<br />
</code><br />
- В много езици можете да използвате return value от една функция, като го пуснете като параметър на следващата функция и така навържете верига, която ви дава краен резулатат. НЕ ГО ПРАВЕТЕ! Удобно е, бързо е, изкушаващо е... и е убиец на мозъчни клетки. Особено ако работите със ваши функции.<br />
<code><br />
$tmp .= (int $result[$_]). " (" .(sprintf "%.2f", 100 * $result[$_]/$votes). "%) " . "$inquiry{answer}[$_]<br/>\n" for(0..$#{$inquiry{answer}});<br />
</code><br />
- В същата връзка - избягвайте да пишете if then else на един ред, както и оператори за цикли.<br />
<code><br />
foreach (array_keys($outbond) as $urlname) if (preg_match($short_name_regex, $urlname, $m)) $output{"\"$shorturl\" -> \"{$m[1]}"} = true;<br />
else if ($debug) print "CATCH :: $urlname\n";<br />
</code><br />
Колкото и засукано да го напишете, няма да станете по-добър програмист, ако ще и сто оператора да наредите на един ред. Горното написано както трябва:<br />
<code><br />
foreach (array_keys($outbond) as $urlname){<br />
                if (preg_match($short_name_regex, $urlname, $m)){<br />
                        $imeto = $m[1];<br />
                        $output{"\"$shorturl\" -> \"$imeto\""} = true; //wsichko se typche v hasha $output<br />
                }<br />
                else {<br />
                        if ($debug) print "CATCH :: $urlname\n"; //neshto kato nepredvidena situaciq<br />
                }<br />
}<br />
</code><br />
- Троичния оператор (ternary operator) е хитър и удобен, и както всичко хитро и удобно описано до тук - с него не трябва да се злоупотребява. Няма да ви заболи ако си го напишете с if-then-else.<br />
Лош код:<br />
<code><br />
while(<PSX>) { $_ =~ / (\?)?(pts\/0)?[ ]+\w+[ ]+\w+:\w+ perl/ &#038;& !($_ =~ /bin/) &#038;& !($_ =~ /lost/) ? print "found! $`$'" : print "";<br />
$_ =~ /lost/ ? print "found .. self\n" : print "";}<br />
</code><br />
- Не редете дълги и много условия в един if. Ако все пак се налага - разбийте ги на редове. Например:<br />
<code><br />
if (<br />
                        !preg_match('!^/!', $one_link) &#038;&<br />
                        !preg_match("!^(http://)?$shorturl!", $one_link) &#038;&<br />
                        !preg_match("!^\?!", $one_link) &#038;&<br />
                        !preg_match("!^#!", $one_link) &#038;&<br />
                        !preg_match("!^[\w\d_-]+?\.php\?!", $one_link) &#038;&<br />
                        !preg_match("!mailto!", $one_link) &#038;&<br />
                        preg_match("!^http://!", $one_link)<br />
                ){.....</p>
<p></code><br />
- Не смесвайте PHP/Perl + HTML + JavaScript + CSS !!! Няма нищо по-гадно от това да видиш променливи, напъхани измежду двойни, escape-нати кавички, цели блокове код затворени в if-switch блокове. Ако се налага да пишете уеб, особено ако става дума за нещо по-голямо от 2-3 странички - използвайте template система.<br />
<code><br />
$tmp = "&lt;form action=\"$ENV{SCRIPT_NAME}\" method=\"post\"&gt;&lt;div&gt;<br />
  &lt;label&gt;$inquiry{title}&lt;/label&gt;&lt;br/&gt;&lt;br/&gt;\n";<br />
  $tmp .= "&lt;input type=\"radio\" name=\"answer\" value=\"$_\"/&gt; $inquiry{answer}[$_]&lt;br/&gt;\n" for(0..$#{$inquiry{answer}});<br />
  $tmp .= "&lt;br/&gt;&lt;input type=\"submit\" name=\"button\" value=\"Send\"/&gt;&lt;/div&gt;\n".<br />
  "&lt;/form&gt;\n";<br />
</code></p>
<p>Горните сорсове са писани както от мен така и от други хора. Предварително не се извинявам ако някой се засегне.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2008/06/11/%d0%b3%d1%80%d0%b8%d0%b6%d0%b0-%d0%b7%d0%b0-%d0%be%d1%87%d0%b8%d1%82%d0%b5-%d0%b8-%d0%b4%d1%83%d1%88%d0%b0%d1%82%d0%b0/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Карта на интернет</title>
		<link>http://blog.ivanatora.info/2008/06/03/%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25ba%25d0%25b0%25d1%2580%25d1%2582%25d0%25b0-%25d0%25bd%25d0%25b0-%25d0%25b8%25d0%25bd%25d1%2582%25d0%25b5%25d1%2580%25d0%25bd%25d0%25b5%25d1%2582</link>
		<comments>http://blog.ivanatora.info/2008/06/03/%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 10:08:25 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[нет]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivan.tu-plovdiv.info/blog/2008/06/03/%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82/</guid>
		<description><![CDATA[Нещо ме е хванала скуката. Пробвах да уча по Компютърни Архитектури, но резултата беше следобедна дрямка Така че за да се измъкна за малко от творческата дупка, упражних малко PHP и регулярни изрази. Резултата е налице - скрипт, който прави карта на 'интернет' По-точно приема като параметър URL и тръгва по изходящите от там връзки. [...]]]></description>
			<content:encoded><![CDATA[<p>Нещо ме е хванала скуката. Пробвах да уча по Компютърни Архитектури, но резултата беше следобедна дрямка <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Така че за да се измъкна за малко от творческата дупка, упражних малко PHP и регулярни изрази.<br />
Резултата е налице - скрипт, който прави карта на 'интернет' <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
По-точно приема като параметър URL и тръгва по изходящите от там връзки. Изходяща е връзка към домейн различен от домейна на URL-то. Не се следят броя връзки, нито въпросното URL се crawl-ва до всяка под-страница. Така от всеки домейн се преглежда само по едно URL, което означава че картата е далееече от точност <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Ама я си представете от някой голям портал като dir.bg колко връзки навън има... и как се представят графично. За графичното представяне използвам <a href="http://www.graphviz.org/">Graphviz</a>.<br />
Вижда се че тук-таме субдомейните се представят като отделни сайтове. Примерно според скрипта idg.bg и www.idg.bg са две различни неща. Това е така, защото субдомейна www <strong>наистина</strong> може да е съвсем друг сайт <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Скрипта не проверява съдържанието буква по буква за съвпадение.<br />
И естествено целия паяк има 'ограда', за да не тръгне да прави наистина карта на Интернет. Това което се вижда е на разстояние до 2 хопа от ivan.tu-plovdiv.info.<br />
Извинявам се на сайтовете, които се виждат вътре за спамопободния трафик към тях.<br />
Ето я й самата карта (не съм си играл с настройките за шарении):<br />
<a href="http://ivan.tu-plovdiv.info/blog/wp-content/uploads/2008/06/out.jpg" title="out.jpg"><img src="http://ivan.tu-plovdiv.info/blog/wp-content/uploads/2008/06/out.jpg" alt="out.jpg" /></a></p>
<p>А <a href='http://ivan.tu-plovdiv.info/blog/wp-content/uploads/2008/06/3_hops.jpg' title='3_hops.jpg'>тук</a> има същата карта, но този път се вижда малко по-далече - на 3 хопа разстояние. Всичко се върти около google, picasa, youtube, myspace... Хмм, виждат се и няколко бъга, които имат нужда оправяне <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2008/06/03/%d0%ba%d0%b0%d1%80%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5%d1%82/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Нищо интересно</title>
		<link>http://blog.ivanatora.info/2008/05/16/%d0%bd%d0%b8%d1%89%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%be/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25bd%25d0%25b8%25d1%2589%25d0%25be-%25d0%25b8%25d0%25bd%25d1%2582%25d0%25b5%25d1%2580%25d0%25b5%25d1%2581%25d0%25bd%25d0%25be</link>
		<comments>http://blog.ivanatora.info/2008/05/16/%d0%bd%d0%b8%d1%89%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%be/#comments</comments>
		<pubDate>Fri, 16 May 2008 05:50:00 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[ежедневие]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivan.tu-plovdiv.info/blog/2008/05/16/%d0%bd%d0%b8%d1%89%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%be/</guid>
		<description><![CDATA[Ами в последната седмица няма нищо интересно, за което да се пише. Заверките и изпитите са тук, всичко живо е изнервено. Курсовите работи и проектите тровят живота до дупка. Жегата в Пловдив и следобедното слънце блеснало в стаята ми допълнително нажежава атмосферата. Който не е видял котката на Ебаси, lol-ната от мен - може да [...]]]></description>
			<content:encoded><![CDATA[<p>Ами в последната седмица няма нищо интересно, за което да се пише. Заверките и изпитите са тук, всичко живо е изнервено. Курсовите работи и проектите тровят живота до дупка. Жегата в Пловдив и следобедното слънце блеснало в стаята ми допълнително нажежава атмосферата.<br />
Който не е видял котката на Ебаси, lol-ната от мен - може да го стори <a href="http://akrozia.org/?p=200">тук</a>.<br />
Драснах едно тъпо PHP скриптче за смяна на тапета - можете да си го свалите от <a href="http://ivan.tu-plovdiv.info/blog/wp-content/uploads/2008/05/change_wallpaperphp.gz">тук</a>. Това което прави е да сваля случайно дупе от <a href="http://babene.moskva.com/?do=Rub&amp;id=3">babene.ru</a> в temp директория и да ви го лепва на десктопа. Можете да си го пъхнете в crontab и всеки ден да сте с изненадващ нов тапет.<br />
FreeBSD-то на виртуалната машина все още върви. Разкарах му Х-а и почна да се държи по-добре <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Виртуалната машина перманентно превзе един от десктопите ми с Windows XP и си направих 7-ми десктоп във Fluxbox-a. Чудя се как нормалните хора живеят само с един десктоп в Windows.<br />
Открих топлата вода с Last.FM - можете да видите моя профил <a href='http://www.last.fm/user/ivanatora'>тук</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2008/05/16/%d0%bd%d0%b8%d1%89%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Имената на функциите всъщност били указатели</title>
		<link>http://blog.ivanatora.info/2008/03/26/%d0%b8%d0%bc%d0%b5%d0%bd%d0%b0%d1%82%d0%b0-%d0%bd%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8%d1%82%d0%b5-%d0%b2%d1%81%d1%8a%d1%89%d0%bd%d0%be%d1%81%d1%82-%d0%b1%d0%b8%d0%bb%d0%b8-%d1%83%d0%ba/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b8%25d0%25bc%25d0%25b5%25d0%25bd%25d0%25b0%25d1%2582%25d0%25b0-%25d0%25bd%25d0%25b0-%25d1%2584%25d1%2583%25d0%25bd%25d0%25ba%25d1%2586%25d0%25b8%25d0%25b8%25d1%2582%25d0%25b5-%25d0%25b2%25d1%2581%25d1%258a%25d1%2589%25d0%25bd%25d0%25be%25d1%2581%25d1%2582-%25d0%25b1%25d0%25b8%25d0%25bb%25d0%25b8-%25d1%2583%25d0%25ba</link>
		<comments>http://blog.ivanatora.info/2008/03/26/%d0%b8%d0%bc%d0%b5%d0%bd%d0%b0%d1%82%d0%b0-%d0%bd%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8%d1%82%d0%b5-%d0%b2%d1%81%d1%8a%d1%89%d0%bd%d0%be%d1%81%d1%82-%d0%b1%d0%b8%d0%bb%d0%b8-%d1%83%d0%ba/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 08:37:41 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[пинизи]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivan.tu-plovdiv.info/blog/?p=57</guid>
		<description><![CDATA[Днес ни показаха един пиниз, според който имената на функциите в С са всъщност указатели към началния адрес на функцията като алгоритмична структура в кодовия сегмент на програмата. Т.е. като имаш адреса можеш да стартираш функцията. Ето една програма, която показва файдата от цялата работа: &#160; #include &#60;stdio.h&#62; int test &#40;int a&#41;&#123; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Днес ни показаха един пиниз, според който имената на функциите в С са всъщност указатели към началния адрес на функцията като алгоритмична структура в кодовия сегмент на програмата. Т.е. като имаш адреса можеш да стартираш функцията.<br />
Ето една програма, която показва файдата от цялата работа:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> test <span class="br0">&#40;</span><span class="kw4">int</span> a<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;A: %d<span class="es0">\n</span>&quot;</span>,a<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> druga <span class="br0">&#40;</span><span class="kw4">int</span> a<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;B: %d<span class="es0">\n</span>&quot;</span>,a<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> a<span class="nu0">-1</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> plqk <span class="br0">&#40;</span><span class="kw4">int</span> <span class="br0">&#40;</span>*test<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw4">int</span> a<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Rez ot test(%d)<span class="es0">\n</span>&quot;</span>,<span class="br0">&#40;</span>*test<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; plqk<span class="br0">&#40;</span>test<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; plqk<span class="br0">&#40;</span>druga<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; plqk<span class="br0">&#40;</span>main<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> * p = <span class="br0">&#40;</span><span class="kw4">int</span> *<span class="br0">&#41;</span> test;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;test: %p<span class="es0">\n</span>&quot;</span>,test<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;druga: %p<span class="es0">\n</span>&quot;</span>,druga<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;p: %p<span class="es0">\n</span>&quot;</span>,p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>За неразбралите - функцията plqk() извиква някоя от другите функции, като точно коя се записва във <strong>формалния параметър</strong> на бляк() <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2008/03/26/%d0%b8%d0%bc%d0%b5%d0%bd%d0%b0%d1%82%d0%b0-%d0%bd%d0%b0-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%b8%d1%82%d0%b5-%d0%b2%d1%81%d1%8a%d1%89%d0%bd%d0%be%d1%81%d1%82-%d0%b1%d0%b8%d0%bb%d0%b8-%d1%83%d0%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Асемблер за линукс</title>
		<link>http://blog.ivanatora.info/2008/03/13/%d0%b0%d1%81%d0%b5%d0%bc%d0%b1%d0%bb%d0%b5%d1%80-%d0%b7%d0%b0-%d0%bb%d0%b8%d0%bd%d1%83%d0%ba%d1%81/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b0%25d1%2581%25d0%25b5%25d0%25bc%25d0%25b1%25d0%25bb%25d0%25b5%25d1%2580-%25d0%25b7%25d0%25b0-%25d0%25bb%25d0%25b8%25d0%25bd%25d1%2583%25d0%25ba%25d1%2581</link>
		<comments>http://blog.ivanatora.info/2008/03/13/%d0%b0%d1%81%d0%b5%d0%bc%d0%b1%d0%bb%d0%b5%d1%80-%d0%b7%d0%b0-%d0%bb%d0%b8%d0%bd%d1%83%d0%ba%d1%81/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 15:33:21 +0000</pubDate>
		<dc:creator>ivanatora</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[линукс]]></category>
		<category><![CDATA[сорс]]></category>

		<guid isPermaLink="false">http://ivan.tu-plovdiv.info/blog/?p=52</guid>
		<description><![CDATA[Днес доста учудващо ни накараха да пишем на асемблер, че и за x86 линукс. Сорса почти ни го метнаха на готово, ама се оказа че е доста елементарно. Което ме вкарва в малко размисъл относно природата на 'машинната инструкция' и 'асемблера', ама тези размишления са в разрез на всякакви правила и заучени положения и ако [...]]]></description>
			<content:encoded><![CDATA[<p>Днес доста учудващо ни накараха да пишем на асемблер, че и за x86 линукс. Сорса почти ни го метнаха на готово, ама се оказа че е доста елементарно. Което ме вкарва в малко размисъл относно природата на 'машинната инструкция' и 'асемблера', ама тези размишления са в разрез на всякакви правила и заучени положения и ако ги спомена някой разбирач ще ме насмели <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<blockquote><p> $ vim test.asm<br />
section .data<br />
msg db 'hello world',0xA   ; зареждаме текстов низ "здрасти" като променливата msg е указател към началния адрес (ех, това С), 0хА е знак 10, който познайте какво прави<br />
len equ $-msg                   ; променливата $ (долар) указвала текущия адрес, така че дължината на низа "здравей" ще се сметне лесно<br />
section .text<br />
global _start<br />
_start:                               ; входна точка<br />
mov EAX, 0x04                 ; изписването на текст на конзолата ставало през syscall от кърнела - функция с параметри. В ЕАХ се зарежда номера на функцията, а в следващите регистри параметрите. Функция номер 4 е изписване, която приема следните параметри:<br />
mov EBX, 0x01                 ; файлов дескриптор където ще се изписва<br />
mov ECX, msg                  ; съобщението<br />
mov EDX, len                   ; дължината му<br />
int 0x80                            ; а самото извикване на функцията става през прекъсване на 80h. Единственото възможно прекъсване (wtf)<br />
mov EAX, 0x01                ; пак ще извикваме функция, но този път за край на програмата (функция 1 - return)<br />
int 0x80<br />
$ nasm -f elf test.asm             # асемблираме кода<br />
$ ld -o test test.o                    # свързваме<br />
$ ./test                                     # изпълняваме<br />
hello world<br />
$ ls -lh test*                            # да видим общия размер на всичко току що създадено<br />
-rwxr-xr-x 1 ivanatora users  757 2008-03-14 20:26 test*<br />
-rw-r--r-- 1 ivanatora users  193 2008-03-14 20:30 test.asm<br />
-rw-r--r-- 1 ivanatora users  704 2008-03-14 20:30 test.o</p></blockquote>
<p>Да видим същия резултат постигнат на С:</p>
<blockquote><p> $ vim hello.c<br />
#include &lt;stdio.h&gt;<br />
int main(void){<br />
printf("Hello world\n");<br />
return 0;<br />
}<br />
$ gcc -o hello hello.c<br />
$ ./hello<br />
Hello world<br />
$ ls -lh hello*<br />
-rwxr-xr-x 1 ivanatora users 6.2K 2008-03-14 20:37 hello*<br />
-rw-r--r-- 1 ivanatora users   74 2008-03-14 20:37 hello.c</p></blockquote>
<p>Десет пъти по-голям изпълним файл. Ако същото се компилира пък в M$ Visual Studio, няма да говоря за размера <img src='http://blog.ivanatora.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ПП. Егх тоя гаден WordPress, нито шрифта е хубав нито индентациите са си на мястото, а и на всичкото отгоре се опитва да ми затвори тага &lt;stdio.h&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ivanatora.info/2008/03/13/%d0%b0%d1%81%d0%b5%d0%bc%d0%b1%d0%bb%d0%b5%d1%80-%d0%b7%d0%b0-%d0%bb%d0%b8%d0%bd%d1%83%d0%ba%d1%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

