<?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; code</title>
	<atom:link href="http://blog.hno3.org/tag/code/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>Mon, 09 May 2011 11:48:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<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 [...]]]></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 [ "$#" [...]]]></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>

