<?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>CTAPbIu_MABP&#039;s BLOG &#187; PHP</title>
	<atom:link href="http://mabp.kiev.ua/category/programming/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>apach 2.2 &amp; php 5.3</title>
		<link>http://mabp.kiev.ua/2011/05/07/apach-2-2-php-5-3/</link>
		<comments>http://mabp.kiev.ua/2011/05/07/apach-2-2-php-5-3/#comments</comments>
		<pubDate>Sat, 07 May 2011 11:01:20 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1359</guid>
		<description><![CDATA[Наша песня хороша, начинай сначала. А если учитывать опыт приобретенный во Львове то можно даже сказать: Наша пісня гарна й нова, починаймо її знову.... Я оттягивал этот момент как мог, но вот мне на ноут пришлось устанавливать php. зайдя на пхп.нет в раздел загрузок я скачал самый свежий и начал ставить. Теперь эта ебаная херня [...]]]></description>
			<content:encoded><![CDATA[<p>Наша песня хороша, начинай сначала. А если учитывать опыт приобретенный во Львове то можно даже сказать: Наша пісня гарна й нова, починаймо її знову....</p>
<span id="more-1359"></span>

<p>Я оттягивал этот момент как мог, но вот мне на ноут пришлось устанавливать php. зайдя на пхп.нет в раздел загрузок я скачал самый свежий и начал ставить. Теперь эта ебаная херня не предлагает установиться как модуль апача, ну похуй. поставил как было начал фачить апач.конф искать пхп5апач2-2.длл и тд. не заработало. потом прочитал что для апача надо использовать не вц9 а вц6 версию, что бы это не значило, и все повторилось. Но эта ебаная хуйня снова не заработала, а ведь я еще тредсайф не пробовал ставить... Кароче я взял старый дистрибутив 5.3.1 где он еще предлагал установиться как модуль и все заработало. А мораль сей басни такова что инсталятор пхп всегда был уёбищным и всегда им останется.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/05/07/apach-2-2-php-5-3/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Google Analytics for WordPress</title>
		<link>http://mabp.kiev.ua/2010/09/12/google-analytics-for-wordpress/</link>
		<comments>http://mabp.kiev.ua/2010/09/12/google-analytics-for-wordpress/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 15:28:35 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[hate]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1254</guid>
		<description><![CDATA[Плагин, блядь, такой есть Google Analytics for WordPress. Авторы - уебки, мудОфилы и ебут гусей. История вопроса началась тут, когда свеже-написанный скрипт вдруг почему-то не заработал у читателей. Я потратил 2 часа пока перебрал скрипт на локальной машине. Честно говоря первых пол часа я потерял из-за своей собственной тупости, я забыл что flowplayer работает тока [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин, блядь, такой есть <a href="http://yoast.com/wordpress/google-analytics/" rel="nofollow external">Google Analytics for WordPress</a>. Авторы - уебки, мудОфилы и ебут гусей.</p>

<span id="more-1254"></span>

<p>История вопроса началась <a href="http://mabp.kiev.ua/2010/09/11/flowplayer/">тут</a>, когда свеже-написанный скрипт вдруг почему-то не заработал у читателей. Я потратил 2 часа пока перебрал скрипт на локальной машине. Честно говоря первых пол часа я потерял из-за своей собственной тупости, я забыл что flowplayer работает тока с сервера, сука. Все это время я отлаживал в фаербаге, в том числе и на сайте где скрипт и так работал, это была роковая ошибка. Потом я как-то начал дебажить в Opera через Dragonfly и о чудо, заметил строку которая меня повергла в полный ахуй.</p>

<pre>
Uncaught exception: TypeError: 'jQuery("#videoDialog").dialog' is not a function

Error thrown at line 3, column 1 in <anonymous function>($) in http://mabp.kiev.ua/content/examples/flowplayer.js:
    var player = $f("player", 
called from line 19, column 41125 in <anonymous function: ready>() in http://mabp.kiev.ua/wp-includes/js/jquery/jquery.js?ver=1.3.2:
    this.call(document,o)
called via Function.prototype.call() from line 12, column 15654 in <anonymous function: each>(G, K, F) in http://mabp.kiev.ua/wp-includes/js/jquery/jquery.js?ver=1.3.2:
    for(var J=G[0];H<I&#038;&K.call(J,H,J)!==false;J=G[++H])
called via Function.prototype.call() from line 19, column 41019 in <anonymous function: ready>() in http://mabp.kiev.ua/wp-includes/js/jquery/jquery.js?ver=1.3.2:
    o.each(o.readyList,function(){this.call(document,o)});
called from line 19, column 41621 in <anonymous function>() in http://mabp.kiev.ua/wp-includes/js/jquery/jquery.js?ver=1.3.2:
    o.ready()
</pre>

<p>Сначала я воспользовался <a href="http://ru.wikipedia.org/wiki/Бритва_Хэнлона" rel="nofollow external">Бритвой Хэнлона</a> и подумал что у меня не загрузился jQuery IU. Попробовал загрузить руками - не вышло. Перебрал все скрипты на сайте по очереди отключая все. Хуй!</p>

<p>Перечитал ошибку еще раз и понял что меня наебали: какой-то наглый, говнокодистый, плагин подключает на сайт jquery.js?ver=1.3.2 из админки. Я просто брызнул лучами поноса во все стороны от такой наглости. Еще буквально пол часа и гадкий, богомерзкий плагин Google Analytics for WordPress был вычислен.</p>

<p>Код был закомментирован а плагин публично обосран в блоге и наступило счастье.</p>
<pre><code class="javascript">
//line 67
wp_enqueue_script('jquery');

// line 1280+
function track_comment_form_head() {
    if (is_singular()) {
        global $post;
        $yoast_ga_options = get_option('Yoast_Google_Analytics');
        if ( yoast_ga_do_tracking() &#038;& $yoast_ga_options["trackcommentform"] &#038;& ('open' == $post->comment_status) )
            wp_enqueue_script('jquery');    
    }
}
add_action('wp_print_scripts','track_comment_form_head');
</code></pre>

<p>Для тех кто не понял почему у меня работало в FF - я был залогинен под админом, а админу подключать этот скрипт не надо.</p>

<p>Авторы этой хуеты, если вы читаете этот наполненный гневом и ненавистью пост подумайте о следующем: не все на свете тупые обезьяны тыкающие карандашиком в клавиатуру, некоторые уже подключили себе jQuery, если уж сильно приспичило его использовать, побеспокойтесь что бы проверить может он уже есть, и если он слишком старый подгрузите новый аккуратно в замыкании используя noConflict чтобы не попортить людям сайт.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/09/12/google-analytics-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Быстрый и грязный хак вордпресса</title>
		<link>http://mabp.kiev.ua/2009/12/18/quick-and-dirty-wordpress-hack/</link>
		<comments>http://mabp.kiev.ua/2009/12/18/quick-and-dirty-wordpress-hack/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 16:15:24 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1167</guid>
		<description><![CDATA[Продолжая тему блогов которых я читаю, не могу сказать что все даже очень популярные авторы заботятся об удобстве чтения своих статей. Наглядный пример это блоги на вордпрессе. По умолчанию вордпресс заменяет [простите за английский, но так наверное будет лучше] double quotation marks (") на double angels («») не очень вникая в очередность, поэтому можно встретить [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжая <a href="http://mabp.kiev.ua/2009/12/08/fucking-siteowners/">тему</a> блогов которых я читаю, не могу сказать что все даже очень популярные авторы заботятся об удобстве чтения своих статей. Наглядный пример это блоги на вордпрессе. </p>
<span id="more-1167"></span>
<p>По умолчанию вордпресс заменяет [простите за английский, но так наверное будет лучше] double quotation marks (") на double angels («») не очень вникая в очередность, поэтому можно встретить »слово» в »кавычках«. Так же заменяются quotation marks (') на apostrophe (’), three dots (...) на ellipses (…), two or three hyphens (---) на dash (—) и тд. Конечно есть парачка поправок, типа того что если в кирилических доменах xn-- заменилось на xn— то оно заменится обратно, но это не спасает.</p>
<p>В результате всех этих замен становиться совершенно невозможно постить код потому что вместо</p>
<pre><code class="javascript">
"This' 'cause of you...".test(/[0-9--]/);
</code></pre>
<p>Получается</p>
<pre><code class="javascript">
«This’ ’cause of you…«.test(/[0-9—]/);
</code></pre>
<p>Регулярка, кстати, правильная.</p>
<p>Но нашим доблестным сайтоводам ванна по колено и холодильник по плечё, нет чтоб сделать удобно, они постят как есть. При этом если скопировать то что получается в результате то оно никогда работать не будет.</p>
<p>Но это в лучшем случаи в худшем если запостить статью содержащую javascript и сделать там логический отступ в два перевода каретки то этот двойной отступ заменится на &lt;p&gt;&lt;/p&gt; после чего скрипт перестанет работать.</p> 
<p>Не помню но кажетсья было еще пару подобных прелестей, но результат один - геморой при разборе примера кода.</p> 
<p>Вобщем я это все пишу для того чтобы показать вам дорогие мои сайтоводы как это побороть. Открываем файл \wordpress\wp-includes\formatting.php и в первой же функции (если у вас wp 2.8.6) под названием wptexturize ищем кусок</p>
<pre><code class="php">
for ( $i = 0; $i < $stop; $i++ )
</code></pre>
<p>Ровно перед ним надо влепить вот таую конструкцию</p> 
<pre><code class="php">
$cockney = $cockneyreplace = $static_characters = $static_replacements = $dynamic_characters = $dynamic_replacements = array();
</code></pre>
<p>Есть правда подозрения что вообще всю функцию надо закоментарить, но тогда что-то ломается, не помню что, давно проверял. Дальше больше, надо найти функцию wpautop и заменить ее полностью на:</p>
<pre><code class="php">
function wpautop($pee, $br = 1) {
	if ($br) {
		$pee = preg_replace_callback('/&lt;(script|style|code|pre).*?&lt;\/\\1&gt;/s', create_function('$matches', 'return str_replace("\n", "&lt;WPPreserveNewline /&gt;", $matches[0]);'), $pee);
		$pee = preg_replace('|&gt;\s*&lt;|', '&gt;&lt;', $pee);
		$pee = preg_replace('|(?&lt;!&lt;br /&gt;)\s*\n|', "&lt;br /&gt;\n", $pee); // optionally make line breaks
		$pee = str_replace("&gt;&lt;", "&gt;\n&lt;", $pee);
		$pee = str_replace('&lt;WPPreserveNewline /&gt;', "\n", $pee);
	}
	return $pee;
}
</code></pre>
<p>Все. После этого можно поcтить любой код и любые символы (посмотрите код этой статьи тут все символы "настоящие", а не мнемоники &amp;nbsp;). Будут траблы пишите в каменты.</p> 
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/12/18/quick-and-dirty-wordpress-hack/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Non-triming space</title>
		<link>http://mabp.kiev.ua/2009/12/01/non-triming-space/</link>
		<comments>http://mabp.kiev.ua/2009/12/01/non-triming-space/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 17:16:30 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[regex]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1143</guid>
		<description><![CDATA[Когда Женя показал мне свою заметку о неубиваймом пробеле я подумал это недостатки php и сказал, что в Java такой фигни нет и не будет. Оказалось показалось, Java тоже грешит этой фигней. package ua.kiev.mabp; /** * Created by IntelliJ IDEA. * User: CTAPbIu_MABP * Date: 01.12.2009 * Time: 18:48:00 */ public class TrimDemo { public [...]]]></description>
			<content:encoded><![CDATA[<p>Когда Женя показал мне свою <a href="http://vedeney.org.ua/php/trim-function-doesnt-clean-out-ascii-code-160/" rel="nofollow external">заметку</a> о неубиваймом пробеле я подумал это недостатки php и сказал, что в <a href="http://mabp.kiev.ua/category/programming/java/">Java</a> такой фигни нет и не будет. Оказалось показалось, <a href="http://mabp.kiev.ua/category/programming/java/">Java</a> тоже грешит этой фигней.</p>
<span id="more-1143"></span>
<pre><code class="java">
package ua.kiev.mabp;

/**
 * Created by IntelliJ IDEA.
 * User: CTAPbIu_MABP
 * Date: 01.12.2009
 * Time: 18:48:00
 */
public class TrimDemo {
    public static void main(String[] args) {
        System.out.print("".concat(String.valueOf(new char[]{160, 160, 160})).trim().length());
    }
}
</code></pre>

<p>И еще <a href="http://www.jstoolbox.com/2009/11/01/funkciya-trim/" rel="nofollow external">лик</a> в тему</p>


]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/12/01/non-triming-space/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pattern: Decorator</title>
		<link>http://mabp.kiev.ua/2009/08/03/pattern-decorator/</link>
		<comments>http://mabp.kiev.ua/2009/08/03/pattern-decorator/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 21:35:36 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1097</guid>
		<description><![CDATA[Сколько раз обещаю себе больше не писать на PHP, и всеравно пишу. Вот и недавно разродился небольшим классом реализующим шаблон декоратор. class Decorator { protected $obj; public function __construct($name,$args=null){ if (is_object($name)) { $this->obj = $name; } else if($args) { $reflection = new ReflectionClass($name); $this->obj = $reflection->newInstanceArgs($args); } else { $this->obj = new $name; } } [...]]]></description>
			<content:encoded><![CDATA[<p>Сколько раз обещаю себе больше не писать на <a href="http://mabp.kiev.ua/category/programming/php/">PHP</a>, и всеравно пишу. Вот и недавно разродился небольшим классом реализующим шаблон декоратор.</p>
<span id="more-1097"></span>
<pre><code class="php">
class Decorator {
	protected $obj;
	public function __construct($name,$args=null){
		if (is_object($name)) {
			$this->obj = $name;
		} else if($args) {
			$reflection = new ReflectionClass($name);
			$this->obj = $reflection->newInstanceArgs($args);
		} else {
			$this->obj = new $name;
		}
	}

	public function __call($name,$args){
		if($args)
			return call_user_func_array(array($this->obj,$name), $args);
		else
			return $this->obj->{$name}();
	}
}
</code></pre>

<p>Все началось как пример <a href="http://pyha.ru/forum/topic/3067.msg61203#msg61203" rel="nofollow external">одному долбаёбу на форуме</a>, а закончилось как небольшой но прикольный класс. Естественно сначала я пару раз переписал пример, потом потестил его на локальном сервере и только потом написал эту статью, так что в классе есть небольшие изменения.</p>

<p>На вопрос нах вообще нуже декоратор я отвечать не буду - читайте вики или еще что-то. А вот на вопрос как это работает отвечу. Для начала создадим класс который нужно декорировать.</p>

<pre><code class="php">
class MyClass {
	private $property;
	public function __construct($property){
		$this->property = $property;
	}
	public function printMethodName(){
		echo __METHOD__;
	}
	
	public function printMyArgument($arg){
		echo $arg;
	}
	
	public function printMyProperty(){
		echo $this->property;
	}
	public function myDecoratedMethod(){
		echo "Decorated Method!";
	}
}
</code></pre>

<p>Как понятно методы особой смысловой нагрузки не несут, а только показывают что были вызваны именно они. Теперь создадим класс производный от декоратора, который будет декорировать последний метод класса MyClass.</p>

<pre><code class="php">
class ConcreteDecorator extends Decorator {
	public function myDecoratingMethod(){
		return $this->myDecoratedMethod();
	}
}
</code></pre>

<p>Теперь это все можно использовать примерно вот таким образом:</p>

<pre><code class="php">
$myObj = new ConcreteDecorator("MyClass", array("String passed via constructor"));

$myObj->printMyProperty();
$myObj->printMethodName();
$myObj->printMyArgument("String passed via printMyArgument");
$myObj->myDecoratingMethod();
</code></pre>

<p>Но что-то как-то некрасиво получается, надо бы добавить в после каждого метода обрыв строки, для этого создадим еще один декоратор:</p>

<pre><code class="php">
class MyNewLineDecorator extends Decorator {
	public function __call($name,$args){
		parent::__call($name,$args);
		echo "&lt;br /&gt;";
	}
}
</code></pre>

<p>И добавим его в код.</p>

<pre><code class="php">
$myObj = new ConcreteDecorator("MyClass", array("String passed via constructor"));
$myObj = new MyNewLineDecorator($myObj);

$myObj->printMyProperty();
$myObj->printMethodName();
$myObj->printMyArgument("String passed via printMyArgument");
$myObj->myDecoratingMethod();
</code></pre>

<p>В результате получаем:</p>
<pre>
String passed via constructor&lt;br /&gt;
MyClass::printMethodName&lt;br /&gt;
String passed via printMyArgument&lt;br /&gt;
Decorated Method!&lt;br /&gt;
</pre>

<p>Приятного использования.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/08/03/pattern-decorator/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Pattern: Singleton</title>
		<link>http://mabp.kiev.ua/2009/04/04/pattern-singleton/</link>
		<comments>http://mabp.kiev.ua/2009/04/04/pattern-singleton/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 23:01:26 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=999</guid>
		<description><![CDATA[Шаблон проектирования Singleton (одиночка) используется для того чтобы класс можно было создать только один раз. На практике он применяется вместе с другим шаблонами проектирования такими как pattern Registry и pattern ServiceLocator class Singleton { private static $instance; // object /** * Private constructor does nothing * */ final private function __construct(){ /* ... */ } [...]]]></description>
			<content:encoded><![CDATA[<p>Шаблон проектирования Singleton (одиночка) используется для того чтобы класс можно было создать только один раз. На практике он применяется вместе с другим шаблонами проектирования такими как <a href="http://mabp.kiev.ua/2008/04/17/pattern_registry/">pattern Registry</a> и <a href="http://mabp.kiev.ua/2008/05/02/pattern_service_locator/">pattern ServiceLocator</a></p>
<span id="more-999"></span>

<pre><code class="php">
class Singleton {
	private static $instance; // object

	/**
	 * Private constructor does nothing
	 *
	 */
	final private function __construct(){
		/* ... */
	}

	/**
	 * Return the single instance of object
	 *
	 * @return object
	 */
	public static function &#038; __instance(){
		if (!isset(self :: $instance))
			self :: $instance = new self;
		return self :: $instance;
	}
}

$single = Singleton::__instance();
</code></pre>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/04/04/pattern-singleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: плагин переводчик заголовков</title>
		<link>http://mabp.kiev.ua/2009/03/28/wordpress-plugin-title-translator/</link>
		<comments>http://mabp.kiev.ua/2009/03/28/wordpress-plugin-title-translator/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 15:36:35 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[goo]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[translate]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=962</guid>
		<description><![CDATA[Позавчера можно сказать девственности лишился, написал свой первый плагин под WordPress. Функционал не сложный, но нужный. Когда сохраняешь статью ссылка делается из названия с удалением всяких нецензурных символов и заменой пробелов на тире. Но никто же своим страницам не даёт русские ссылки, это плохо во-первых для SEO, а во-вторых просто не читабельно потому что буквы [...]]]></description>
			<content:encoded><![CDATA[<p>Позавчера можно сказать девственности лишился, написал свой первый плагин под <a href="http://mabp.kiev.ua/tag/wordpress/">WordPress</a>. Функционал не сложный, но нужный. Когда сохраняешь статью ссылка делается из названия с удалением всяких нецензурных символов и заменой пробелов на тире. Но никто же своим страницам не даёт русские ссылки, это плохо во-первых для <a href="http://mabp.kiev.ua/tag/seo/">SEO</a>, а во-вторых просто не читабельно потому что буквы преобразуются в ASCII коды, да еще и по 6 символов на букву! Так например слово 'бля' будет зашифровано как %d0%b1%d0%bb%d1%8f. А переводить каждый раз руками все заголовки лень, вот я и прикрутил свой <a href="http://mabp.kiev.ua/2008/08/28/google_translate/">Google Transtator</a> к <a href="http://mabp.kiev.ua/tag/wordpress/">WordPress'у</a>.</p>
<span id="more-962"></span>
<p>Естественно я сначала попытался найти плагин реализующий подобный функционал в репозитории <a href="http://mabp.kiev.ua/tag/wordpress/">WordPress'а</a>, но там был только перевод с китайского на английский, что мне немного не подходило ;). Поскольку опыта в написании плагинов под <a href="http://mabp.kiev.ua/tag/wordpress/">WordPress</a> у меня не было я взял за основу именно этот плагин выкинув из него все лишнее, на мой взгляд и дополнив его своим <a href="http://mabp.kiev.ua/2008/08/28/google_translate/">Google Transtator'ом</a>. Получилось я думаю не очень плохо, зато я переписал его под <a href="http://mabp.kiev.ua/category/programming/php/">PHP5</a>и поправил объектную модель. Все что у меня получилось вы можете увидеть ниже.</p>

<pre><code class="php">
&lt;?php
/*
Plugin Name: TitleTranslate
Plugin URI: http://mabp.kiev.ua/2009/03/28/wordpress-plugin-title-translator/
Version: 1.0
Description: Translate title fot permanent link
Author: CTAPbIu_MABP
Author URI: http://mabp.kiev.ua/
*/

if(!class_exists('TitleTranslate')):
class TitleTranslate{
	private $slug_name;
	private $slug_title;

	public function __construct($wp_version){
		add_filter('title_save_pre', array(&#038;$this,'get_from_title'), 0);
		add_filter('name_save_pre', array(&#038;$this,'put_to_name'), 0);
		if($wp_version &gt; 2.4 &#038;& strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') &#038;& $_POST['action'] === 'sample-permalink'){
			add_filter('sanitize_title', array(&#038;$this,'ajax_slug'),0);
		}
	}

	public function ajax_slug($name){
		remove_filter('sanitize_title', array(&#038;$this,'ajax_slug'), 0);
		$name = $this-&gt;put_to_name($name);
		add_filter('sanitize_title', array(&#038;$this,'ajax_slug'), 0);
		return $name;
	}

	public function get_from_title($title){
		$this-&gt;slug_name = '';
		$this-&gt;slug_title = $title;
		return $title;
	}

	public function put_to_name($name){

		if(!empty($this-&gt;slug_name))
			return $this-&gt;slug_name;
		
		if(empty($name) &#038;& !empty($this-&gt;slug_title))
			$name = $this-&gt;slug_title;
				
		$translation = $this-&gt;translate($name);
		$translation = sanitize_user(sanitize_title($translation), true);
		return $translation ? $translation : $name;
	}
	
	public function translate($str, $from='ru', $to='en'){
		$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
		if (!$fp) {
			//trigger_error("$errstr ($errno)&lt;br /&gt;\n", E_USER_WARNING);
			return "";
		} else {
			$out = "GET /translate_a/t?client=t&#038;sl=".$from."&#038;tl=".$to."&#038;text=".urlencode($str)." HTTP/1.1\r\n";
			$out .= "Host: www.google.com\r\n";
			$out .= "User-Agent: Mozilla/5.0\r\n";
			$out .= "Accept-Encoding: deflate\r\n";
			$out .= "Connection: Close\r\n\r\n";
			
			fputs($fp, $out);
			$res = "";
			while (!feof($fp)) {
				$res .=  fgets($fp, 1024);
			}
			fclose($fp);
		}
		
		$res = explode("\r\n\r\n",$res);
		$res = explode("\r\n",$res[1]);
		return substr($res[1],0,1) == '[' ?
			substr($res[1],2,strpos($res[1],'"',2)-2) :
			substr($res[1],1,-1);
	}
}
endif;

new TitleTranslate($wp_version);
?&gt;
</code></pre>

<p>А если кто-то захочет <a href="http://mabp.kiev.ua/content/source/TitleTranslate.phps" title="source code" rel="nofollow">скачать</a> то вот ссылка на файл. Устанавливается так же как и все остальные плагины копированием *.php файла в папку wp-content/plugins.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/28/wordpress-plugin-title-translator/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Счастливый билетик</title>
		<link>http://mabp.kiev.ua/2009/03/07/lucky-coupon/</link>
		<comments>http://mabp.kiev.ua/2009/03/07/lucky-coupon/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 12:03:26 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[algorithms]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=813</guid>
		<description><![CDATA[Вчера речь зашла о 'счастливых талончиках', если кто на общественном транспорте не ездит то это такие талончики у которых серийный номер состоит из 6 цифр и сумма первых трёх равна сумме последних трёх. Так вот стало очень интересно какая вероятность того что тебе попадется 'счастливый талончик', для этого я решил написать функцию на PHP, но [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера речь зашла о 'счастливых талончиках', если кто на общественном транспорте не ездит то это такие талончики у которых серийный номер состоит из 6 цифр и сумма первых трёх равна сумме последних трёх. Так вот стало очень интересно какая вероятность того что тебе попадется 'счастливый талончик', для этого я решил написать функцию на <a href="http://mabp.kiev.ua/category/programming/php/">PHP</a>, но Apache под руками не оказалось и я написал на <a href="http://mabp.kiev.ua/category/programming/javascript/">JavaScript</a>. Сначала я думал что оптимальный алгоритм это разделение строки на две части, сложение цифр первой и второй половины, и сравнение.</p>
<span id="more-813"></span>
<pre><code class="javascript">
function is_lucky(num){
	num = num.toString(); // на всякий случай
	var l = num.length, part = [], sum = [0,0];
	if (l%2 || !/^[0-9]+$/.test(num))
		return false;
	part[0] = num.substring(0,l/2).split("");
	part[1] = num.substring(l/2,l).split("");
	for(var i in part)
		for(var j in part[i])
			sum[i] += parseInt(part[i][j]);
	return sum[0] == sum[1];
}
</code></pre>

<p>Но потом когда я думал как бы это выглядело на <a href="http://mabp.kiev.ua/category/programming/java/">Java</a>, я нашел способ попроще. Достаточно сложить все числа первой половины и отнять от полученного все числа второй половины, если в результате ноль то билетик счастливый.</p>

<pre><code class="javascript">
function is_lucky(num){
	var l = num.length, sum = 0;
	if (l%2 || !/^[0-9]+$/.test(num))
		return false;
	for(var i in num)
		sum += parseInt(num[i]) * (i&lt;l/2?1:-1);
	return !sum;
}
</code></pre>
<p>Реализация на PHP</p>
<pre><code class="php">
function is_lucky($num){
	$l = strlen($num);
	$sum = 0;
	if ($l%2 || !preg_match("/^[0-9]+$/", $num))
		return false;
	for($i=0;$i&lt;$l;$i++)
		$sum += $num[$i] * ($i&lt;$l/2?1:-1);
	return !$sum;
}
</code></pre>
<p>А еще я подумал что раз уж <a href="http://mabp.kiev.ua/category/programming/php/">PHP</a> и <a href="http://mabp.kiev.ua/category/programming/javascript/">JavaScript</a> языки нетипизированные то стоит проверять что засунули в функцию и добавил туда регулярку /^[0-9]+$/</p>

<p>Реализация на Java</p>
<pre><code class="java">
package ua.kiev.mabp;

/**
 * Created by IntelliJ IDEA.
 * User: CTAPbIu_MABP
 * Date: 07.03.2009
 * Time: 11:40:21
 */

public class LuckyCoupon {
    public static void main(String[] args) {
        System.out.print(isLucky(463571));
    }

    public static Boolean isLucky(Integer num) {
        char[] c = num.toString().toCharArray();
        int sum=0;
        for (int i=0,l=c.length;i&lt;l;i++)
            sum += c[i] * (i&lt;l/2?1:-1);
        return sum==0;
    }
}
</code></pre>
<p>Но вернемся к тому зачем нам это нужно было, а нужно было посчитать количество счастливых билетиков. Для этого чуть усложним наш класс добавив в метод main цикл и дополнительный метод который из числа в формате '123' сделает число в формате '000123' и передаст на обработку уже имеющемуся методу для проверки.</p>
<pre><code class="java">
package ua.kiev.mabp;

/**
 * Created by IntelliJ IDEA.
 * User: CTAPbIu_MABP
 * Date: 07.03.2009
 * Time: 11:40:21
 */

public class LuckyCoupon {
    public static void main(String[] args) {
        int counter = 0;
        for(int i=0;i&lt;1000000;i++)
            if (isLucky(i))
                counter++;
        System.out.print(counter);
    }

    public static Boolean isLucky(Integer num) {
        int l = 6 - num.toString().length();
        String str = "";
        for (int i=0;i&lt;l;i++)
            str += "0";
        return isLucky(str+num);
    }

    public static Boolean isLucky(String num) {
        char[] c = num.toCharArray();
        int sum=0, i=0, l=c.length;
        while (i&lt;l)
            sum += c[i] * (i++&lt;l/2?1:-1);
        return sum==0;
    }
}
</code></pre>
<p>В результате получим число 55252, далее пользуясь только калькулятором узнаем что 55252/1000000*100 = 5,5252% . То есть вероятность получить из рук кондуктора счастливый билетик чуть более чем пять с половиной процентов, а те кто играет в линейку или вов знают что это достаточно большой шанс.</p>

<p>Но удивляет другое удивляет симметричность появления таких числе, я хотел нарисовать график, но подумал что график на 1000 позиций будет очень большим поэтому приведу тут только часть матрицы. Ах да матрицы... Матрица получается в том случаи если посчитать сколько 'счастливых талончиков' в каждой тысяче, и записывать в ряд делая обрыв строки после каждого значения. В общем не с моим талантом объяснять смотрите и запускайте код. Этим надо заменить метод main из прошлого примера.</p>

<pre><code class="java">
    public static void main(String[] args) {
        int counter = 0;
        Integer[] num = new Integer[1000];
        for(int i=0;i&lt;1000000;i++)
            if (isLucky(i)){
                counter++;
                Integer d = ((Double)Math.floor(i++/1000)).intValue();
                if (num[d] == null)
                    num[d] = 0;
                num[d]++;
            }
        for (int i=0;i&lt;1000;i++){
            String str = num[i].toString();
            System.out.print((str.length()&lt;2?"0"+str:str) + (i%10==9?"\n":" "));
        }
    }
</code></pre>

<p>Так вот вернемся к матрице, она получаеться вот такая</p>

<pre>
01 03 06 10 15 21 28 36 45 55
03 06 10 15 21 28 36 45 55 63
06 10 15 21 28 36 45 55 63 69
10 15 21 28 36 45 55 63 69 73
15 21 28 36 45 55 63 69 73 75
21 28 36 45 55 63 69 73 75 75
28 36 45 55 63 69 73 75 75 73
36 45 55 63 69 73 75 75 73 69
45 55 63 69 73 75 75 73 69 63
55 63 69 73 75 75 73 69 63 55
</pre>

<p>Cледующая часть будет начинаться с 03 (06, 10, 15 ...) и заканчиваться на 63 (69, 73, 75...), тоесть самый правый столбик с каждым цыклом переходит в первый ряд и так пока 01 не окажеться в правом нижнем углу.</p>

<p>А в школе мне математика была не интересна...</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/03/07/lucky-coupon/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>break $me;</title>
		<link>http://mabp.kiev.ua/2009/01/24/break-me/</link>
		<comments>http://mabp.kiev.ua/2009/01/24/break-me/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 11:05:44 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Голоса в голове]]></category>
		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=518</guid>
		<description><![CDATA[Удивительно что такое большое количество людей не знает, что оператор break в PHP может принимать параметр который указывает какое количество вложенных циклов нужно остановить. Более того он может принимать переменную, что вряд ли полезно, но радует наличием возможности. Об этом мелким шрифтом написано в мануале, но судя по количеству кода, где я видел его использование, [...]]]></description>
			<content:encoded><![CDATA[<p>Удивительно что такое большое количество людей не знает, что оператор break в <a href="http://mabp.kiev.ua/category/programming/php/">PHP</a> может принимать параметр который указывает какое количество вложенных циклов нужно остановить. Более того он может принимать переменную, что вряд ли полезно, но радует наличием возможности. Об этом мелким шрифтом написано в мануале, но судя по количеству кода, где я видел его использование, даже самые одаренные гуру читают ман по диагонали.</p>
<span id="more-518"></span>
<pre><code class="php">
while(true){
	for($_=array(4);;){
		foreach($_ as $val){
			switch($_[]=$val){
				default:
					break $val;
			}
		}
	}
}
</code></pre>

<p>В примере $_ использовано для того чтобы сделать цикл foreach бесконечным, а switch добавлен просто для красоты примера, можно было бы еще do{}while(); добавить, но по-моему простого while вполне достаточно.</p>
<p>А вместо этого начинаются всякие пляски с бубном типа:</p>

<pre><code class="php">
for($break=false;;){
	for(;;){
		$break=true;
		break;
	}
	if($break){
		break;
	}
}
</code></pre>

<p>Можно же  как минимум красивее написать...</p>
<pre><code class="php">
for($break=false;!$break;){
	for(;!$break;){
		$break=true;
	}
}
</code></pre>

<p>Эта конструкция по большому счету эквивалентна label в <a href="http://mabp.kiev.ua/category/programming/java/">Java</a> и <a href="http://mabp.kiev.ua/category/programming/javascript/">JavaScript</a></p>

<pre><code class="java">
label:
for (;;) {
	for (;;) {
		break label;
	}
}
</code></pre>

<p>Оператор continue работает точно также!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/01/24/break-me/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Translate</title>
		<link>http://mabp.kiev.ua/2008/08/28/google_translate/</link>
		<comments>http://mabp.kiev.ua/2008/08/28/google_translate/#comments</comments>
		<pubDate>Thu, 28 Aug 2008 16:15:14 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://mabp.localhost/?p=221</guid>
		<description><![CDATA[Сейчас пытаюсь возродить свой бывший сайт под названием ForbidenWish. Там много книг и вносить их в БД вручную я не собираюсь, поэтому написал небольшой скрипт который обходит директории, парсит имена файлов и заносит их в базу. Вот в один момент я понял что простая транслитерация названия книги это не интересно, а иногда и глупо получалось, [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас пытаюсь возродить свой бывший сайт под названием ForbidenWish. Там много книг и вносить их в БД вручную я не собираюсь, поэтому написал небольшой скрипт который обходит директории, парсит имена файлов и заносит их в базу. Вот в один момент я понял что простая транслитерация названия книги это не интересно, а иногда и глупо получалось, и я вспомнил про форум ДКлаб у них там при создании темы заголовок переводиться на английски (причем весьма неплохо) и подставляется в url. Я практически уверен что Котеров не писал переводчик и просто пользуется каким-то сервисом, первое что мне пришло в голову - Google. Сначала думал парсить html страницу но потом понял что там все намного проще и перевод забирается <a href="http://mabp.kiev.ua/category/programming/javascript/">javascript'ом</a>, В общем после непродолжительных изысканий я придумал вот эту функцю.</p>
<span id="more-221"></span>

<pre><code class="php">
function translate($str, $from='ru', $to='en'){
	$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		trigger_error("$errstr ($errno)&lt;br /&gt;\n", E_USER_WARNING);
		return "";
	} else {
		$out = "GET /translate_a/t?client=t&#038;sl=".$from."&#038;tl=".$to."&#038;text=".urlencode($str)." HTTP/1.1\r\n";
		$out .= "Host: www.google.com\r\n";
		$out .= "User-Agent: Mozilla/5.0\r\n";
		$out .= "Accept-Encoding: deflate\r\n";
		$out .= "Connection: Close\r\n\r\n";
		
		fputs($fp, $out);
		$res = "";
		while (!feof($fp)) {
			$res .=  fgets($fp, 1024);
		}
		fclose($fp);
	}
	
	$res = explode("\r\n\r\n",$res);
	$res = explode("\r\n",$res[1]);
	return stripslashes(substr($res[1],1,-1));
}
</code></pre>


<p>Но таким образом гугл отказывается переводить больше чем 2 килобайта текста, если нудно переводить большие объемы по нужно использовать пост запрос</p>

<pre><code class="php">
function translate($str, $from='en', $to='ru'){
	$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
	if (!$fp) {
		trigger_error("$errstr ($errno) \n", E_USER_WARNING);
		return "";
	} else {
		$text = "text=".urlencode($str);
		$out = "POST /translate_a/t?client=t&#038;sl=".$from."&#038;tl=".$to." HTTP/1.1\r\n";
		$out .= "Host: www.google.com\r\n";
		$out .= "User-Agent: Mozilla/5.0\r\n";
		$out .= "Accept-Encoding: deflate\r\n";
		$out .= "Content-length: ".strlen($text)."\r\n";
		$out .= "Connection: Close\r\n\r\n";
		$out .= $text;
		
		fputs($fp, $out);
		$res = "";
		while (!feof($fp)) {
			$res .=  fgets($fp, 1024);
		}
		fclose($fp);
	}
	
	$res = explode("\r\n\r\n",$res);
	$res = explode("\r\n",$res[1]);
	return stripslashes(substr($res[1],1,-1));
}
</code></pre>

<p>Так можно обработать до 32 килобайт за раз!</p>
<p>Если кому пригодиться - оставьте коммент!</p>

<p><strong>UPD</strong> Реализация на <a href="http://mabp.kiev.ua/category/programming/cpp/">С++</a> от Lupascu Ion с небольшой доработкой от меня</p>

<pre><code class="cpp">
String GoogleTranslator::TranslateText(String from, String to){
	//... need to add proxy
	//http_client.Proxy("");
	String url = "www.google.com/translate_a/t?client=t&#038;sl=" + from + "&#038;tl=" + to + "&#038;ie=utf-8&#038;oe=utf-8";
	http_client.URL(url);
	//http_client.Agent("Mozilla/5.0");
	http_client.TimeoutMsecs(5000);
	http_client.Post();
	http_client.PostData(String("text=").Cat()&lt;&lt;UrlEncode(inputwindow.textfrom.Get(CHARSET_UTF8)));
	//http_client.Headers("Accept-Encoding: deflate\r\n");
	String result = http_client.ExecuteRedirect();
	
	if (!IsNull(result)){
		if(result.StartsWith("\"")){// is string
			result.Remove(0, 1);
			result.Remove(result.GetLength()-1, 1);
		}
		else{ // is terms
			//... need to parse terms
		};
		
		return result;
	}
	else
		return String("Error:").Cat()&lt;&lt;Nvl(http_client.GetError(), "")
			&lt;&lt;"\n, status: "&lt;&lt;http_client.GetStatusCode()&lt;&lt;", "&lt;&lt;http_client.GetStatusLine()
			&lt;&lt;"\n, header: "&lt;&lt;http_client.GetHeaders();
}
</code></pre>

<p><strong>UPD</strong> Есть предложение вместо </p>
<pre><code class="php">
return stripslashes(substr($res[1],1,-1));
</code></pre>
возвращать 
<pre><code class="php">
return json_decode($res[1]);
</code></pre>
Но на этом сраном хостинге с тех пор как им занимается компания HostBizUa перестали ставить свежие версии ПО, и у меня стоит древний <a href="http://mabp.kiev.ua/category/programming/php/">PHP 5.1.6</a> в котором этой функции нет, поэтому я использую такое мудачество чтобы со словарем проблем не было.
<pre><code class="php">
return substr($res[1],0,1) == '[' ?
	substr($res[1],2,strpos($res[1],'"',2)-2) :
	substr($res[1],1,-1);
</code></pre>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2008/08/28/google_translate/feed/</wfw:commentRss>
		<slash:comments>105</slash:comments>
		</item>
	</channel>
</rss>

