<?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>Odd, even, odd, even... &#187; tips and tricks</title>
	<atom:link href="http://blog.hno3.org/tag/tips-and-tricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hno3.org</link>
	<description>&#34;Real efficiency comes from elegant solutions, not optimized programs.&#34;</description>
	<lastBuildDate>Thu, 22 Apr 2010 16:47:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>rsync: cannot delete non-empty directory</title>
		<link>http://blog.hno3.org/2009/10/19/rsync-perishable-rules/</link>
		<comments>http://blog.hno3.org/2009/10/19/rsync-perishable-rules/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:56:31 +0000</pubDate>
		<dc:creator>wireman</dc:creator>
				<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[exclude]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://blog.hno3.org/?p=131</guid>
		<description><![CDATA[A p (modifier) indicates that an (include/exclude/...) rule is perishable, meaning that it is ignored in directories that are being deleted. (из man rsync)

Има няколко причини, поради които rsync може да ви върне следната грешка:
cannot delete non-empty directory: some_dir_name

Ако сте използвали -b или --backup. Тогава rsync не трие нищо от destination. За да модифицирате това [...]]]></description>
			<content:encoded><![CDATA[<p><code class=\'prettyprint\' >A <strong>p</strong> (modifier) indicates that an (include/exclude/...) rule is <em>perishable</em>, meaning that it is ignored in directories that are being deleted.</code> <em>(из <code class=\'prettyprint\' >man rsync</code>)</em><br />
</p>
<p>Има няколко причини, поради които <code class=\'prettyprint\' >rsync</code> може да ви върне следната грешка:</p>
<pre>cannot delete non-empty directory: some_dir_name</pre>
<ol class="spacy">
<li><strong>Ако сте използвали <code class=\'prettyprint\' >-b</code> или <code class=\'prettyprint\' >--backup</code>.</strong> Тогава <code class=\'prettyprint\' >rsync</code> не трие нищо от <code class=\'prettyprint\' >destination</code>. За да модифицирате това поведение, вижте описанието на <code class=\'prettyprint\' >--backup</code> в <code class=\'prettyprint\' >man rsync</code>.</li>
<li><strong>Ако ползвате <code class=\'prettyprint\' >--exclude</code> правила.</strong> Тези правила &#8220;предпазват&#8221; файлове в <code class=\'prettyprint\' >destination</code> от изтриване, от което следва, че папка, изтрита в <code class=\'prettyprint\' >source</code> няма да може да бъде изтрита в <code class=\'prettyprint\' >destination</code>, ако съдържа &#8220;предпазени&#8221; от правилата файлове, дори да сте задали <code class=\'prettyprint\' >--delete --force</code>. Решението е да дефинирате <code class=\'prettyprint\' >exclude</code>-правилото като <em>perishable</em>.
<p>Например, ако синхронизирате директориите <code class=\'prettyprint\' >source</code> и <code class=\'prettyprint\' >destination</code>, които са под <code class=\'prettyprint\' >subversion</code>-контрол с <code class=\'prettyprint\' >rsync</code>, можете да ползвате следната команда:</p>
<pre>rsync -rv --delete --force --filter 'exclude,p .svn' 'source' 'destination'</pre>
<p>В случя избягваме синхронизирането на системните за <code class=\'prettyprint\' >subversion</code> директории <code class=\'prettyprint\' >.svn</code>, като въпреки това твърдим, че правилото, &#8220;защитаващо&#8221; <code class=\'prettyprint\' >.svn</code>-директориите от прехвърляне, не важи в директории, които подлежат на изтриване (т.е. правилото е <em>perishable</em>).
	</li>
</ol>
<p>За повече информация, вижте секцията <code class=\'prettyprint\' >FILTER RULES</code> и потърсете вътре за &#8220;perishable&#8221; в <code class=\'prettyprint\' >man rsync</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hno3.org/2009/10/19/rsync-perishable-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP-функции any() и all()</title>
		<link>http://blog.hno3.org/2009/08/13/php-any-all/</link>
		<comments>http://blog.hno3.org/2009/08/13/php-any-all/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 22:05:49 +0000</pubDate>
		<dc:creator>wireman</dc:creator>
				<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://blog.hno3.org/?p=123</guid>
		<description><![CDATA[Потрябва ми удобството на тези две хубави функции, all() и any(), каквито например ги има в Пайтън. Въпреки богатата база от функции в PHP, бързото ми търсене не показа нищо подобно, което да е вградено, затова:

function all() {
	$args = func_get_args();

	if (count($args) == 1 &#038;&#038; is_array($args[0])) {
		return call_user_func_array(__FUNCTION__, $args[0]);
	}

	foreach ($args as $value) {
		if (!$value) {
			return false;
		}
	}
	return [...]]]></description>
			<content:encoded><![CDATA[<p>Потрябва ми удобството на тези две хубави функции, <code class=\'prettyprint\' >all()</code> и <code class=\'prettyprint\' >any()</code>, каквито например ги има в Пайтън. Въпреки богатата база от функции в PHP, бързото ми търсене не показа нищо подобно, което да е вградено, затова:</p>
<pre class="prettyprint">
function all() {
	$args = func_get_args();

	if (count($args) == 1 &#038;&#038; is_array($args[0])) {
		return call_user_func_array(__FUNCTION__, $args[0]);
	}

	foreach ($args as $value) {
		if (!$value) {
			return false;
		}
	}
	return count($args) > 0;
}
</pre>
<p>Функцията <code class=\'prettyprint\' >any()</code> е почти аналогична. Ако ви интересува и нейната пълна реализация, както и нещо като unit-тест, вижте пълния текст на този пост.</p>
<p><span id="more-123"></span></p>
<p>Ето го и нещото, приличащо на unit-тест:</p>
<pre class="prettyprint">
function any() {
	$args = func_get_args();

	if (count($args) == 1 &#038;&#038; is_array($args[0])) {
		return call_user_func_array(__FUNCTION__, $args[0]);
	}

	foreach ($args as $value) {
		if ($value) {
			return true;
		}
	}
	return false;
}

function all() {
	$args = func_get_args();

	if (count($args) == 1 &#038;&#038; is_array($args[0])) {
		return call_user_func_array(__FUNCTION__, $args[0]);
	}

	foreach ($args as $value) {
		if (!$value) {
			return false;
		}
	}
	return count($args) > 0;
}

$tests = array(
	array(
		'any',
		false,
		array(false, false, false),
	),
	array(
		'any',
		false,
		array(),
	),
	array(
		'any',
		true,
		array(false, 1, false),
	),
	array(
		'any',
		true,
		array(false, false, false, "string"),
	),
	array(
		'any',
		false,
		array(false, null, false, "", false),
	),
	array(
		'all',
		false,
		array(false, false, false),
	),
	array(
		'all',
		false,
		array(),
	),
	array(
		'all',
		false,
		array(false, 1, false),
	),
	array(
		'all',
		false,
		array(false, false, false, "string"),
	),
	array(
		'all',
		false,
		array(false, null, false, "", false),
	),
	array(
		'all',
		true,
		array(true, "sth", 123, true, true, 1, -7),
	),
);

$total = $ok = $failed = 0;
$summary = '';

function test($func, $expected, $args) {
	global $total, $ok, $failed, $summary;
	$total ++;
	$signature = $func . '(' . implode(',', array_map(create_function('$arg', 'return var_export($arg, true);'), $args)) . '), expected: ' . var_export($expected, true);

	try {
		$result = call_user_func_array($func, $args);
	} catch (Exception $e) {
		echo 'E';
		$failed ++;
		$summary .= $signature . "\n";
		$summary .= $e->getMessage() . "\n";
		return false;
	}

	if ($result === $expected) {
		echo '.';
		$ok ++;
		return true;
	} else {
		echo 'F';
		$failed++;
		$summary .= $signature . ", but got: " . var_export($result, true) . "\n";
		return false;
	}
}

foreach ($tests as $test_case) {
	list($func, $expected, $args) = $test_case;
	test($func, $expected, $args);
	test($func, $expected, array($args));
}

if ($failed == 0) {
	echo "\n\nALL TESTS PASSED.";
}

echo "\n\n";
echo "Tests: $total\n";
echo "OK:    $ok\n";
if ($failed > 0) {
	echo "FAIL:  $failed\n";
}

echo "\n$summary\n";
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.hno3.org/2009/08/13/php-any-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чакалене на IP/host за наличие на пинг</title>
		<link>http://blog.hno3.org/2009/08/12/monitoring-ip-for-ping/</link>
		<comments>http://blog.hno3.org/2009/08/12/monitoring-ip-for-ping/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 14:10:08 +0000</pubDate>
		<dc:creator>wireman</dc:creator>
				<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[shell scripting]]></category>
		<category><![CDATA[tips and tricks]]></category>

		<guid isPermaLink="false">http://blog.hno3.org/?p=118</guid>
		<description><![CDATA[Съвсем скоро (да кажем, преди 10 минути) ми се наложи да чакам да се появи пинг към дадено IP. За целта си написах shell-скриптчето, показано по-долу, което да ми &#8220;каже&#8221; нещо, в момента, в който се появи ping към съответното IP. Някой може да го намери за полезно:

dimitardimitrov@Midori:~$ cat monitor-host.sh
#!/bin/bash

if [ "$#" -lt 1 ]
then
	echo [...]]]></description>
			<content:encoded><![CDATA[<p>Съвсем скоро (да кажем, преди 10 минути) ми се наложи да чакам да се появи пинг към дадено IP. За целта си написах shell-скриптчето, показано по-долу, което да ми &#8220;каже&#8221; нещо, в момента, в който се появи ping към съответното IP. Някой може да го намери за полезно:</p>
<pre class="prettyprint">
dimitardimitrov@Midori:~$ cat monitor-host.sh
#!/bin/bash

if [ "$#" -lt 1 ]
then
	echo "Usage: $0 host.to.monitor"
	exit 1
fi 

host="$1"

while true
do
	ping -c 1 $host
	if [ "$?" -eq "0" ]
	then
		say The host is now online! I repeat: "The host is now online!".
		exit
	fi
	sleep 1
done
</pre>
<p>За да работи, е необходимо да имате команда <code class=\'prettyprint\' >say</code>, която да прави каквото се очаква :) Може да бъде заменена и с нещо друго, разбира се. Чувствайте се свободни да ползвате това парче &#8220;код&#8221; както искате.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hno3.org/2009/08/12/monitoring-ip-for-ping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
