<?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>Чудо{вищные} заметки &#187; tips</title>
	<atom:link href="http://miracle.rpz.name/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://miracle.rpz.name</link>
	<description>Sorry for my terrible english. My native language is PHP.</description>
	<lastBuildDate>Thu, 12 Jan 2012 20:42:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
		<item>
		<title>ты не один</title>
		<link>http://miracle.rpz.name/2008/09/23/remember-you-are-not-alone/</link>
		<comments>http://miracle.rpz.name/2008/09/23/remember-you-are-not-alone/#comments</comments>
		<pubDate>Tue, 23 Sep 2008 19:35:43 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[DailyWTF]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=115</guid>
		<description><![CDATA[Приключилась сегодня очень познавательная история, мораль которой должен понимать любой разработчик, детище которого обслуживает более одного пользователя. В рамках работ по выводу одного &#8220;неповоротливого асфальтоукладчика&#8221; на земную орбиту были проведены ряд его модернизаций. Испытания на тестовом полигоне показали что машина стала ездить на порядок быстрее и было решено доработки включить в работающий прототип(вроде и не [...]]]></description>
			<content:encoded><![CDATA[<p>Приключилась сегодня очень познавательная история, мораль которой должен понимать любой разработчик, детище которого обслуживает более одного пользователя.</p>
<p>В рамках работ по выводу одного &#8220;неповоротливого асфальтоукладчика&#8221; на земную орбиту были проведены ряд его модернизаций. Испытания на тестовом полигоне показали что машина стала ездить на порядок быстрее и было решено доработки включить в работающий прототип(вроде и не первая космическая, но уже есть чем гордиться!). Но на первом же серьёзном показе зверь-машина с чудо{вищным} грохотом рассыпалась у всех на глазах и я сел в лужу&#8230;</p>
<p>А теперь тоже самое, но по-русски, с выражением.<br />
Имеются ряд весьма тяжёлых для веба запросов к БД, результат которых условно не меняется в течении небольшого промежутка времени. Кеширование промежуточных результатов в самой БД нагрузку сняло на СУБД, но скрипты продолжали исправно тягать данные и это порой занимало внушительное время. Было решено результаты эти кешировать на стороне веб-сервера. Как хранилище был использован <a href="http://php.net/apc">apc</a>.</p>
<p>Первоначальный вариант выглядел примерно так:</p>
<pre class="php:nocontrols">
if (!$data = cache_get($key)) {
   $data = data_from_db();
   cache_set($key,$data,$expire_time)
}
</pre>
<p>Без излишеств, просто и со вкусом. Но позже выснилось что &#8220;всё не так просто&#8221; и в зависимости от некоторых космических характеристик и результатов выборки из базы будет меняется ещё одна переменная (меняется переменная&#8230; ого!).</p>
<pre class="php:nocontrols">
if (!$data = cache_get($key)) {
   $data = data_from_db();
   cache_set($key,$data,$expire_time);
   $other_data = some_function($data,$env);
   cache_set($other_key,$other_data,$expire_time);
} else {
   $other_data = cache_get($other_key);
}
</pre>
<p>Аляповато, но, чёрт возьми, работает&#8230;<br />
Работало&#8230;<br />
Должно было по идее работать&#8230;<br />
Но, почему-то оказавшись на боевом, изрядно нагруженном, сервере это не сработало. Вернее это работало&#8230;,  но не всё время&#8230; По истечении $expire_time периодически пропадали данные для $other_key. При отключении и/или очистке кеша работоспособность восстанавливалась&#8230; Кто виноват? Что делать? Кто за всё это ответит?!? Пришлось срочно пошевелить опилками.</p>
<p>Как мы все наверное догадываемся &#8211; реальный сервер обслуживает нереально много клиентов, причём не по очереди. И нет совершенно никаких гарантий на то, что между записью $key и $other_key не встрянет какой-либо маленький, но шустрый процесс (хотя нам это и не особо страшно), так же нет никаких оснований полагать что между выборкой $key и $other_key кто-то умный и большой не очистит кеш (целиком, или только $other_key &#8211; в данном эпизоде это не имеет значения).<br />
Оснований не было, но я был почему-то твёрдо уверен, что &#8220;это если и происходит, то с кем-то другим&#8221;. С пониманием проблемы конечно же пришло и простое решение, но ошибка, согласитесь, совсем не тривиальная.</p>
<p>Так что мораль сей басни: помни &#8211; ты не один!</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/09/23/remember-you-are-not-alone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Заборостроительный факультет</title>
		<link>http://miracle.rpz.name/2008/01/25/please-don-t-do-it/</link>
		<comments>http://miracle.rpz.name/2008/01/25/please-don-t-do-it/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 21:26:18 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[DailyWTF]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/2008/01/25/please-don-t-do-it/</guid>
		<description><![CDATA[Давно хотел уже &#34;выкрикнуть душою&#34;, а тут предоставился удобный случай. Итак курс лекций &#34;Вселенское твердолобие. Методы борьбы.&#34;. Заборы в коде. Вот cтрочка кода из первого попавшегося поста: setTimeout(&#39;setOpacity(\&#39;&#39;+obj+&#39;\&#39;, &#39;+i+&#39;)&#39;,50*i); Вот кто может объяснить наличие этих треклятых наклонных реек? Тут виноватого, мне кажется, не найти. Эти заборы встречаются практически в каждой бумажной(и не только) книжонке связанной [...]]]></description>
			<content:encoded><![CDATA[<p> Давно хотел уже &quot;выкрикнуть душою&quot;, а тут предоставился удобный случай. Итак курс лекций<em> &quot;Вселенское твердолобие. Методы борьбы.&quot;</em>.  </p>
<p> Заборы в коде.  </p>
<p> Вот cтрочка кода из <a href="http://nonsens.reallive.ru/?p=65">первого попавшегося поста</a>: </p>
<blockquote><p>setTimeout(&#39;setOpacity(\&#39;&#39;+obj+&#39;\&#39;, &#39;+i+&#39;)&#39;,50*i);</p></blockquote>
<p> Вот кто может  <a rel="tn" href="http://miracle.rpz.name/shared/dailywtf/whatyouwrote.jpg">объяснить</a> наличие этих треклятых наклонных реек? Тут виноватого, мне кажется, не найти. Эти заборы встречаются практически в каждой бумажной(и не только) книжонке связанной с программированием. Смело желаю их авторам жидко обосраться&hellip; Запоминаем (а лучше записываем): в нашем распоряжении имеется два вида &laquo;кавычек&raquo; &#8211; (&#39; и &quot;), <strike>и властью данной мн</strike> ой не так <strike>во имя чита</strike> вы вольны их использовать в произвольном порядке.<br />
<blockquote> setTimeout(&#39;setOpacity(&quot;&#39;+obj+&#39;&quot;, &#39;+i+&#39;)&#39;,50*i); </p></blockquote>
<p> Прежде чем нарисовать забор пойдите выпейте чаю. Если желание не прошло &#8211; налейте ещё&hellip;  <br />
Аналогичный же случай с <abbr title="Perl Compatible Regular Expression">pcre</abbr> &#8211; развею миф о том, что ограничителями регулярного выражения могут быть <strike>только</strike> заборные рейки? Сравните:<br />
<blockquote>        $re =  &#39;/(\d{2})\/(\d{2})\/(\d{4})/&#39;;</p></blockquote>
<p> и<br />
<blockquote>        $re = &#39;~(\d{2})/(\d{2})/(\d{4})~&#39;;</p></blockquote>
<p><strong>  P.S.</strong></p>
<p> Раз уж я доколебался до несчастной строчки с таймаутом, завершу атаку на твердолобие контрольным ударом с обоих флангов.<br />
Опять-таки луч кровавого поноса тому, кто научил вас передавать аргументом в setTimeout строку, тогда как по уму передать надо функцию. </p>
<blockquote><p>   setTimeout(function(){setOpacity(obj,i);},50*i);</p></blockquote>
<p> И никогда более не пишите setTimeout(&quot;func()&quot;,100);, иначе у вас будут ломкими ногти, появиться перхоть и насмерть замучают кариозные монстры.<br />
<blockquote>   setTimeout(func,100);</p></blockquote>
<p><strong>  P.P.S.</strong> <br />
Я надеюсь NoNseNs не примет близко к сердцу данный опус и поймёт всё правильно. Спасибо за внимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/01/25/please-don-t-do-it/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>NULL без палочки</title>
		<link>http://miracle.rpz.name/2008/01/23/null-and-linked-mssql-servers/</link>
		<comments>http://miracle.rpz.name/2008/01/23/null-and-linked-mssql-servers/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 20:47:16 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[DailyWTF]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/2008/01/23/null-and-linked-mssql-servers/</guid>
		<description><![CDATA[Второй раз сталкиваюсь с неспортивным поведением со стороны MSSQL. И дабы встретив третий не тратить на него полдня документирую. Имеется: два слинкованных MSSQL-сервера подключение к одному из них хранимая процедура на другом Требуется: вызвать эту процедуру c набором параметров и получить результат. Решение: exec LINKED_SERVER.SELECTED_DATABASE.dbo.procedure_name @param_2=value, @param_1=value, @param_3=value… Ничего не предвещает беды. Небо чистое, коннект [...]]]></description>
			<content:encoded><![CDATA[<p>Второй раз сталкиваюсь с неспортивным поведением со стороны MSSQL. И дабы встретив третий не тратить на него полдня документирую.</p>
<p><em>Имеется:</em></p>
<ol>
<li>два <strong>слинкованных MSSQL-сервера</strong></li>
<li>подключение к одному из них</li>
<li>хранимая процедура на другом</li>
</ol>
<p><em>Требуется:</em></p>
<ul>
<li>вызвать эту процедуру c набором параметров и получить результат.</li>
</ul>
<p><em>Решение:</em></p>
<blockquote><p>exec LINKED_SERVER.SELECTED_DATABASE.dbo.procedure_<span>name @param_2=value, @param_1=value, @param_3=value…</span></p></blockquote>
<p><strike>Ничего не предвещает беды. Небо чистое, коннект уверенный, лаг умеренный… и тут&#8230; растёт напряжение, давит тишина, в жилах стынет кровь и появляется леденящий душу ПИЗДЕЦ!</strike></p>
<p>Я не случайно параметры написал &#8220;вразнобой&#8221;. Казалось бы ничего криминального &#8211; они же именованы. И всё отлично покуда все параметры принимают какие-либо значения. Но как только окажется что <em>@param_2=null</em> (или @param_1) вы будете приятно удивлены загадочными сообщениями вроде &#8220;а почему это параметр_2 не передан?&#8221; или &#8220;зачем параметр_1 ты передал мне два раза?&#8221;. И будете долго  биться в истерике, когда окажется, что выполняя запрос сразу на нужном сервере, вы получаете нормальный результат без каких-либо сообщений об ошибках. Мистика?</p>
<p>Как удалось выяснить &#8211; параметр, который null на линкованный сервер попадает уже без имени (т.е. не <em>&#8220;@param_2=null,  @param_1=value, @param_2=value&#8221;</em>, a <strong>&#8220;NULL, @param_1=value, @param_3=value&#8221;</strong> и как следствие &#8211; этот самый NULL в данном случае будет считаться первым входным параметром в процедуре…</p>
<p>Решение было тривиальным(и глупым) &#8211; вынести все параметры, которые могут быть <strong>null</strong>, в конец объявления. Но если кто-то объяснит суть описываемого явления, и красивый выход из такого положения &#8211;  буду очень признателен.</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/01/23/null-and-linked-mssql-servers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: miracle.rpz.name @ 2012-02-06 16:53:57 by W3 Total Cache -->
