<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>В лабиринте извилин</title>
	
	<link>http://www.charnad.com</link>
	<description>Блог-центр им. CharnaD</description>
	<lastBuildDate>Fri, 05 Mar 2010 16:08:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/charnad" /><feedburner:info uri="charnad" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Первая неделя в Германии</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/0wLkMUmH-e0/</link>
		<comments>http://www.charnad.com/blog/pervaya-nedelya-v-germanii/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 12:29:08 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Германия]]></category>
		<category><![CDATA[бюрократия]]></category>
		<category><![CDATA[немцы]]></category>
		<category><![CDATA[непривычное]]></category>
		<category><![CDATA[супермаркет]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=1015</guid>
		<description><![CDATA[
Вот и подходит к концу моя первая неделя пребывания в Германии. Я постараюсь записывать различные интересные вещи, которые со мной здесь случаются. Кое-что может весьма удивить человека, которому приходилось жить только в странах СНГ. (Хочу сразу оговориться, что мои слова не являются непреложной истиной, а лишь отражают мое видение. А я могу и ошибиться.)
Во-первых, немцы [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/deutschland/deutschland.gif" alt=""/></p>
<p>Вот и подходит к концу моя первая неделя пребывания в Германии. Я постараюсь записывать различные интересные вещи, которые со мной здесь случаются. Кое-что может весьма удивить человека, которому приходилось жить только в странах СНГ. (Хочу сразу оговориться, что мои слова не являются непреложной истиной, а лишь отражают мое видение. А я могу и ошибиться.)</p>
<p>Во-первых, немцы часто здороваются, встретив кого-либо, когда находятся в здании. Для меня это было достаточно удивительно, когда работники Auslandersamt (ведомство по делам иностранцев) здоровались со всеми людьми ожидающими в холле. В магазине кассирши так же здороваются и часто желают хорошего дня, когда рассчитаетесь. В целом немцы значительно более приветливы, особенно это заметно как раз на работниках бюрократического аппарата. В отношении Германии пока что слово "бюрократ" для меня не носит никакого негативного оттенка, ну просто не к чему придраться.</p>
<p>Мусор. Мусор, конечно же, здесь сортируют. В Саксонии мусор делят на пластик, бумагу, биомусор, стекло (стекло делят на 3 цвета: белый, зеленый и коричневый) и все остальное. Поначалу непонятно куда девать, например бумагу, в которую была завернута еда. Но, как обьяснил домовладелец, бумага есть бумага.</p>
<p>Про пиво и колбаски не спрашивайте, сам не ел, не видел как другие едят/пьют. Но в супермаркете выбор огромнейший. В Германии популярен напиток, который называется шорле. Это сок (почти всегда яблочный) смешанный с минералкой. Стоит, кстати, весьма дешево, что-то около 30 центов за 1,5 литра. В рублях это будет 13, в Санкт-Петербурге за 13 рублей можно только в туалет сходить, и то не везде.</p>
<p>Интересный факт: покупая напиток в бутылке часто надо платить pfand 25 центов (10 руб). Это такой залог за бутылку. Если вернешь ее в магазин - получишь обратно, не вернешь - не получишь. Таким образом немцы следят, чтобы не бросали пластик куда попало (он почти не разлагается, зато прекрасно перерабатывается). Тележки в супермаркете, кстати, взять можно за евро. Привезешь тележку обратно на стоянку - получишь евро обратно, а иначе считай оплатил труд человека, который сделает это за тебя.</p>
<p>Очень часто видим вечером окна первого этажа, которые никак не прикрыты, и прекрасно видно кто внутри и что делает. В России это непозволительная беспечность, а здесь повсеместно.</p>
<p>Вот такие мои небольшие замечания. Дальше, я думаю, буду писать все более развернуто и с фотографиями.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/pervaya-nedelya-v-germanii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/pervaya-nedelya-v-germanii/</feedburner:origLink></item>
		<item>
		<title>Исходники судоку</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/gZbp_2tcZus/</link>
		<comments>http://www.charnad.com/blog/isxodniki-sudoku/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:30:46 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sources]]></category>
		<category><![CDATA[sudoku]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=1005</guid>
		<description><![CDATA[ Я уже давно обещал выложить исходные коды судоку (поиграйте в судоку, если еще не играли). Я думал, что со временем исправлю код, сделаю лучше, но нет ни времени, ни желания. Поэтому лучше я выложу как есть, а вы уж сами улучшайте. Посмотреть код. Далее в посте будут комментарии.
Что касается алгоритма, то здесь все работает [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/php.gif" alt=""/> Я уже давно обещал выложить исходные коды судоку (<a href="http://www.charnad.com/blog/sudoku-na-php-i-jquery/">поиграйте в судоку</a>, если еще не играли). Я думал, что со временем исправлю код, сделаю лучше, но нет ни времени, ни желания. Поэтому лучше я выложу как есть, а вы уж сами улучшайте. <a href="http://pastie.org/private/0hqk6m0flopmpp1eurtjrg">Посмотреть код</a>. Далее в посте будут комментарии.<span id="more-1005"></span></p>
<p>Что касается алгоритма, то здесь все работает так. У нас есть поле 9х9, соответственно начнем мы с</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> generate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error_counter</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$row</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">;</span> <span style="color: #000088;">$row</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$col</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$col</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">;</span> <span style="color: #000088;">$col</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>$error_counter служит нам для защиты от тупиков. Сейчас вы увидите о чем речь.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error_counter</span> <span style="color: #339933;">&gt;</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">retry_after</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Row will be incremented to 0</span>
    <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$col</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error_counter</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Если количество ошибок при генерации вышло за определенные пределы - значит звезды сложились неудачно и что-то где-то не сходится. Поэтому генерация сбрасывается и начинается заново.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sudoku</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNum</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Вычисляем какие цифры подходят в текущую клетку</span>
    <span style="color: #000088;">$fit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fit</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #000088;">$col</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$percents</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$numbers</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$number</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$percents</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">percentage</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$number</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #339933;">,</span> <span style="color: #000088;">$col</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Here we get all numbers, that are most possible</span>
    <span style="color: #000088;">$available</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$max</span> <span style="color: #339933;">=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array_values</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$percents</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$fit</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$number</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$percents</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$max</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$available</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$number</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Вот тут и происходит вся магия. Сначала вычисляем какие числа могут встать в клетку (смотрим, чтобы по вертикали, горизонтали и в малом квадрате такой не было). Далее для каждого из этих чисел запускается мутная функция percentage. Она вычисляет, какой шанс у числа попасть в эту клетку. Допустим у нас осталось 4 свободные клетки и 4 числа. При этом первое число может попасть в 1 клетку из 4х, второе в две, третье в три, четвертое во все. Эта функция просто делит количество клеток куда число может попасть на количество пустых клеток. Таким образом, выпадет число, у которого меньше всего шансов попасть в другие клетки. При равенстве берем случайное.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//It can turn that sudoku generation isn't going well</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$available</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sudoku</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$cell</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$cell</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNum</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$row</span><span style="color: #339933;">--;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error_counter</span><span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>В переменной available хранятся те самые числа, которые могут попасть в текущую клетку и имеют наивысшую вероятность попасть. Если вдруг оказывается, что никакое число не может попасть, а ряд еще не закончился - то мы сбрасываем текущий ряд и начинаем генерировать его заново. Ну а если сбрасывается ряд (по умолчанию) 30 раз, тогда, как я уже говорил, перегенерируется вся головоломка.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error_counter</span> <span style="color: #339933;">&gt;</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">retry_after</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sudoku</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$col</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNum</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$available</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">mt_rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$available</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Тут все просто, если надо сбросить головоломку - идем в начало и сбрасываем. А если все в порядке - берем случайное число, если их несколько.<br />
Ну а все остальное по-моему достаточно просто и понятно.</p>
<p>That's all folks.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/isxodniki-sudoku/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/isxodniki-sudoku/</feedburner:origLink></item>
		<item>
		<title>PHP: эксклюзивный счетчик в Shared Memory</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/C2tlSg9C5b8/</link>
		<comments>http://www.charnad.com/blog/php-eksklyuzivnyj-schetchik-v-shared-memory/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 12:41:14 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ipc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[shared memory]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=992</guid>
		<description><![CDATA[
Я надеюсь что вы уже прочитали вводную статью про многопоточность в PHP, или вам это просто не требуется. Теперь я расскажу про счетчик, который будет доступен для потоков приложения, при этом доступ к нему будет эксклюзивным.

Разделяемая память - особая область памяти, которая доступа ВСЕМ процессам операционной системы. Доступ к определенному сегменту можно получить с помощью [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/php.gif" alt=""/></p>
<p>Я надеюсь что вы уже прочитали вводную статью про <a href="http://www.charnad.com/blog/mnogopotochnost-na-php/">многопоточность в PHP</a>, или вам это просто не требуется. Теперь я расскажу про счетчик, который будет доступен для потоков приложения, при этом доступ к нему будет эксклюзивным.</p>
<p><span id="more-992"></span></p>
<p>Разделяемая память - особая область памяти, которая доступа ВСЕМ процессам операционной системы. Доступ к определенному сегменту можно получить с помощью двух параметров: имени существующего файла и одного символа, который будет ключом System V IPC. Это нужно для того, чтобы несколько сегментов могли быть выделены основываясь на одном и том же файле. Звучит пока очень туманно, но сейчас я приведу пример, и надеюсь все станет понятно.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$t_key</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ftok</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'g'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$shmid</span> <span style="color: #339933;">=</span> <span style="color: #990000;">shmop_open</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$t_key</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'c'</span><span style="color: #339933;">,</span> <span style="color: #208080;">0755</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">shmop_write</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shmid</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">shmop_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$shmid</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Первой командой, специальной функцией ftok мы получили ключ, по которому будем получать доступ к сегменту разделяемой памяти. Первым параметром мы передали ему имя файла скрипта, а вторым букву 'g'. Почему 'g'? А просто так, можно взять любой символ.<br />
Во второй строке мы собственно открываем доступ к сегменту памяти. Первый параметр - наш ключ, второй параметр 'c' - флаг указывающий на то, что мы создаем сегмент памяти, при том, если он уже существуем - он открывается на чтение/запись. Третий параметр - права на доступ, четвертый - размер в байтах.<br />
В третьей строке мы записываем туда единицу, последний параметр - смещение.<br />
И наконец закрываем сегмент.<br />
Теперь по адресу, который определяется файлом скрипта и буквой 'g' в сегменте размером 64 байта лежит единица, и ее может достать любой процесс.</p>
<p>Теперь представим, что у нас программа работает в 50 потоков, она обрабатывает файл строчка за строчкой. Мы не хотим, чтобы программа два раза обрабатывала одну строку, поэтому кладем в разделяемую память номер строки, которая была обработана последней. И каждый процесс перед тем, как считать строчку берет из разделяемой памяти номер последней обработанной строки, прибавляет единицу, записывает обратно в разделяемую память и идет обрабатывать эту строчку. Следующий процесс возьмет уже строчку с номером на один больше. Все хорошо, все радуются, работает быстро. Однако случается так, что два процесса одновременно решили взять значение из памяти и взяли одинаковое значение и записали одинаковое. А представьте, что сразу 50 процессов одновременно считают значение. В общем дело ясное, что нам надо ограничить доступ к памяти одним процессом.</p>
<p>Как раз для таких случаев придуманы семафоры. Семафор (semaphore) - это такая сущность, которая позволяет ограниченному количеству процессов одновременно получать "зеленый свет" на выполнение чего-либо. Семафор, у которого такое количество равно 1 называется мьютексом (mutex). Именно мьютекс позволит нам не допускать в наш сегмент памяти больше одного процесса и остановит анархию.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$sem</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sem_get</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ftok</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'g'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">sem_acquire</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sem</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//тут может быть только один процесс</span>
<span style="color: #990000;">sem_release</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sem</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Мы получаем ключ для семафора точно таким же образом, как и для разделяемой памяти. Третий параметр - автоматическое "отпускание" семафора, если поток, который был впущен завершился. Те потоки, которые попытаются получить доступ к семафору, будут блокированы до тех пор, пока семафор не освободится. Это похоже на очередь в туалет. Один внутри, остальные снаружи. Один выходит, другой заходит и закрывается, другие продолжают ждать.
</p>
<p>Таким образом, создав ячейку памяти и создав семафор мы получаем счетчик, который позволит нам обрабатывать файл построчно не боясь, что одна строка будет обработана два раза. Для использования этого принципа я сделал класс Counter, который работает в моем многопоточном приложении. Взять его можно <a href="http://pastebin.org/86576">вот здесь</a>. А тут я приведу пример использования:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Ноль это наше начальное состояние счетчика</span>
<span style="color: #000088;">$counter</span> <span style="color: #339933;">=</span> Counter<span style="color: #339933;">::</span>_new<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'g'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Порождаем потомков</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> PROCESS_AMOUNT<span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$pid</span> <span style="color: #339933;">=</span> pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Error spawning new process'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Родительский процесс у нас ничего не будет делать</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Первый параметр - имя счетчика, и заодно часть ключа</span>
        <span style="color: #666666; font-style: italic;">//Второй параметр - увеличивать ли значение счетчика</span>
        <span style="color: #666666; font-style: italic;">//В данном случае мы просто читаем значение</span>
        <span style="color: #000088;">$counter</span> <span style="color: #339933;">=</span> Counter<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'g'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//TOTAL_LINES - количество строк в файле</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$counter</span> <span style="color: #339933;">&lt;</span> TOTAL_LINES<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">//Берем значение счетчика и увеличиваем его на 1</span>
            <span style="color: #000088;">$counter</span> <span style="color: #339933;">=</span> Counter<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'g'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">//Обарабатываем файл</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/php-eksklyuzivnyj-schetchik-v-shared-memory/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/php-eksklyuzivnyj-schetchik-v-shared-memory/</feedburner:origLink></item>
		<item>
		<title>Многопоточность на PHP</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/1VkZs6lDkS8/</link>
		<comments>http://www.charnad.com/blog/mnogopotochnost-na-php/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 12:05:36 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ipc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=988</guid>
		<description><![CDATA[
Хочу рассказать вам про многопоточные приложения, взаимодействие процессов (IPC) и применение всего этого на PHP. В качестве примера мы возьмем счетчик с эксклюзивным доступом, доступный для всех процессов.

Что такое многопоточность? Это способ разделения программы на отдельные сущности (процессы и треды(threads)) для обеспечивания параллельности выполнения. Зачем это нужно? Для ускорения работы. Ведь открывая какой-нибудь сайт вы [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/php.gif" alt=""/></p>
<p>Хочу рассказать вам про многопоточные приложения, взаимодействие процессов (IPC) и применение всего этого на PHP. В качестве примера мы возьмем счетчик с эксклюзивным доступом, доступный для всех процессов.</p>
<p><span id="more-988"></span></p>
<p>Что такое многопоточность? Это способ разделения программы на отдельные сущности (процессы и треды(threads)) для обеспечивания параллельности выполнения. Зачем это нужно? Для ускорения работы. Ведь открывая какой-нибудь сайт вы не хотите ждать пока сервер последовательно откроет его всем, кто запросил его до вас. Вы хотите сразу, поэтому сервер выделяет отдельный процесс или поток для обработки вашего запроса. </p>
<p>Сначала немного про многопточность в PHP. PHP не многопоточный язык, PHP не умеет работать с тредами. Однако мы можем использовать системные вызовы операционной системы для создания процессов. Это как если бы мы просто запускали PHP-CLI несколько раз. Основная команда pcntl_fork разделяет выполнение программы на 2 части: родительскую и дочернюю, при этом эта команда вернет идентификатор процесса. Если вернулся -1, значит произошла ошибка, если 0, значит мы в дочернем потоке, если число - значит в родительском. </p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pid</span> <span style="color: #339933;">=</span> pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Произошла ошибка'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pid</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// Мы в родительском потоке</span>
     pcntl_wait<span style="color: #009900;">&#40;</span><span style="color: #000088;">$status</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Ждем выполнения потомка</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">// Мы в потоке потомке</span>
     <span style="color: #666666; font-style: italic;">// Делаем что-нибудь</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>В этом примере мы разделили программу на 2 части. В родительском процессе мы ожидаем завершения дочернего, чтобы тот доложил об успешном завершении. В противном случае он останется висеть в системе, как процесс-зомби. А если мы хотим не 2 потока, а больше? Тогда вызываем pcntl_fork несколько раз.</p>
<p>Приведу пример, как можно использовать pcntl_fork для "демонизации" процесса. Демон (daemon) - процесс выполняющийся в фоновом режиме. Это бывает очень удобно для программ, которые выполняются долгое время и не требуют прямого общения с пользователем. В Windows службы - аналог демонов в *nix системах. Итак, у вас есть программа на PHP, выполняющаяся в командной строке и вы хотите, чтобы она работала в фоне. Конечно, вы всегда можете сделать так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">nohup</span> php script.php <span style="color: #000000; font-weight: bold;">&amp;</span></pre></div></div>

<p>Это запустит вашу программу в фоновом режиме, а весь вывод будет перенаправлять в nohup.out. Более того, программа не завершится с выходом пользователя из системы. Но для демонов более правильный вариант создать процесс-потомок, закрыть родительский процесс (да-да, почти как зомби), только мы еще назначим наш дочерний поток "лидером сессии", то есть он сам сможет порождать дочерние потоки.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Demonization</span>
<span style="color: #000088;">$child_pid</span> <span style="color: #339933;">=</span> pcntl_fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Если мы получили дочерний id, </span>
<span style="color: #666666; font-style: italic;">// то мы в родительском потоке</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$child_pid</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//Здесь мы уже в потомке, а родитель был закрыл</span>
<span style="color: #990000;">posix_setsid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Таким образом мы получим независимо выполняющуюся программу. Завершить ее можно командой kill pid, где pid - идентификатор процесса. Тот самый, который возвращается в родительский поток и представляет собой целое неотрицательное число, уникальное в системе.
</p>
<p>Возникает вопрос, зачем же нужны threads, если есть процессы? Дело в том, что треды выполняются в том же контексте, что и породивший его процесс, то есть все треды имеют общие ресурсы, например открытые файлы. Закрыв файловый дескриптор в одном треде, вы получите ошибку в другом, если попытаетесь прочитать этот файл с тем же дескриптором. В свою очередь процессам нужен особый способ обмениваться данными, если вы хотите открыть один и тот же файл в разных процессах. Для такого общения есть множество инструментов. Один из основных - сигналы.</p>
<p>Сигналы - это системные вызовы, влияющие на поведение процессов. Сигнал может завершить, приостановить, или послать особый сигнал, определенный пользователем. Помимо сигналов есть разделяемая память (shared memory) и семафоры (semaphores). Более подробно о них, и вообще об устройстве posix совместимых операционных систем советую вам поискать в интернете. Это было краткое введение в тему, для подготовки к следующей статье про <a href="http://www.charnad.com/blog/php-eksklyuzivnyj-schetchik-v-shared-memory/">счетчик в shared memory</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/mnogopotochnost-na-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/mnogopotochnost-na-php/</feedburner:origLink></item>
		<item>
		<title>Модальное окно на jQuery blockUI</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/P1tJwHToNlM/</link>
		<comments>http://www.charnad.com/blog/modalnoe-okno-na-jquery-blockui/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 18:53:35 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[blockUI]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[модальное окно]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=930</guid>
		<description><![CDATA[Создание модального диалога с помощью jquery плагина blockUI.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.charnad.com/blog/wp-content/uploads/pictures/blockui/blockui-modal.png" style="float: left; margin-right: 10px;">Я уже писал про создание модальных окон на jQuery с помощью Simplemodal, на этот раз я решил попробовать другой плагин и нашел для себя blockUI. Он потребует jQuery версии не ниже 1.2.3. Итак приступим.<span id="more-930"></span></p>
<p>Данные плагина:</p>
<ul>
<li>название: blockUI v2</li>
<li>размер: 15,6 кб без сжатия</li>
<li><a href="http://www.malsup.com/jquery/block/">сайт плагина</a>, <a href="http://github.com/malsup/blockui/raw/master/jquery.blockUI.js?v2.31">скачать</a>, <a href="http://www.malsup.com/jquery/block/#demos">демо</a></li>
</ul>
<p>На сайте разработчика он выглядит так:<br />
<img class="size-medium wp-image-79" src="http://www.charnad.com/blog/wp-content/uploads/pictures/blockui/blockui-demo.png" alt="" /></p>
<p>Для себя я подобрал определенные настройки, которые делают окна красивее. Во-первых, я хотел, чтобы модальное окно располагалось по центру экрана, а по умолчанию оно находится чуть левее. Во-вторых, я хотел сделать его похожим на модальные окна и дилалоги в Windows.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">blockUI</span>.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">css</span>.<span style="color: #660066;">border</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'0px'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//убираем серую границу</span>
$.<span style="color: #660066;">blockUI</span>.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">fadeIn</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">//ускоряем появление</span>
$.<span style="color: #660066;">blockUI</span>.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">fadeOut</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//и исчезновение</span>
$.<span style="color: #660066;">blockUI</span>.<span style="color: #660066;">defaults</span>.<span style="color: #660066;">css</span>.<span style="color: #660066;">left</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'40%'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//окно будет в центре</span></pre></div></div>

<p>Этот код нужно вставить в страницу после подключения плагина. Параметр left:40% зависит от ширины окна, в моем случае оно 275 пикселей.</p>
<p>Что же сделать, чтобы окно выглядело как в Windows? Я конечно не мастер верстки, но результат мне вполне подходит. Сначала делаем макет окна и даем ему стили.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;modal_dialog&quot;</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;display:none; cursor: default&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;dialog&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;dialog_title_bar&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;dialog_caption&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>www.charnad.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;rotes_kreuz&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
   <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;dialog_pane&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Наше модальное окошко<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">style</span>=<span style="color: #ff0000;">&quot;margin-top: 10px;&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;form</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">method</span>=<span style="color: #ff0000;">&quot;POST&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;yes&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Да&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;dialog_button&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
       <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;no&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Нет&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;close_dialog dialog_button&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Почему display: none? Потому что плагин автоматически переключит видимость. Теперь CSS:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.dialog</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">default</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#000000</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #6666ff;">.dialog</span> form <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Контейнер с заголовком */</span>
<span style="color: #6666ff;">.dialog</span> <span style="color: #6666ff;">.dialog_title_bar</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">17px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-image</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">dialog-caption-bg.png</span><span style="color: #00AA00;">&#41;</span> <span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Стиль текста заголовка */</span>
<span style="color: #6666ff;">.dialog</span> <span style="color: #6666ff;">.dialog_title_bar</span> <span style="color: #6666ff;">.dialog_caption</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">black</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">9pt</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Панель диалога */</span>
<span style="color: #6666ff;">.dialog</span> <span style="color: #6666ff;">.dialog_pane</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> buttonface<span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">10</span>%</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">10</span>%</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Кнопки диалога */</span>
<span style="color: #6666ff;">.dialog</span> <span style="color: #6666ff;">.dialog_button</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">80px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">25px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Красный крест, закрывающий окно */</span>
<span style="color: #6666ff;">.dialog</span> <span style="color: #6666ff;">.rotes_kreuz</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-image</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">rotes_kreuz.png</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">28px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">absolute</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">3px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">3px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Пути к картинкам, конечно же, поставьте свои. Сами картинки можно взять: <a href="http://www.charnad.com/blog/wp-content/uploads/pictures/blockui/dialog-caption-bg.png">фон заголовка</a>, <a href="http://www.charnad.com/blog/wp-content/uploads/pictures/blockui/rotes_kreuz.png">крест</a>.</p>
<p>Теперь Javascript, чтобы все у нас прыгало и бегало.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//По этим кнопкам модальное окно закрывается</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.rotes_kreuz, .close_dialog'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        $.<span style="color: #660066;">unblockUI</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//Эта кнопка будет вызывать наше окно</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#show_modal'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        $.<span style="color: #660066;">blockUI</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>message<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#modal_dialog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> css<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>width<span style="color: #339933;">:</span> <span style="color: #3366CC;">'275px'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//По кнопке &quot;Да&quot; будет отправляться форма </span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#modal_dialog #yes'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#modal_dialog form'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">submit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Можно скачать:<p><img align="absmiddle" src="http://www.charnad.com/blog/wp-includes/images/crystal/archive.png" height="20" /> <a href="http://www.charnad.com/download/blockUIdemo.zip" onclick="wpfilebase_dlclick(3, 'download/blockUIdemo.zip')" title="Download blockUI demo">blockUI demo</a> (31.1 KiB)</p> или посмотреть прямо здесь.<br />
<input type="button" id="show_modal" value="Показать модальное окно">
<script type="text/javascript" src="http://www.charnad.com/files/blockui-modal-demo/jquery.blockUI.js"></script><script type="text/javascript">$.blockUI.defaults.css.border = '0px';$.blockUI.defaults.fadeIn = 100;$.blockUI.defaults.fadeOut = 100;$.blockUI.defaults.css.left = '40%';$(document).ready(function() {$('.rotes_kreuz, .close_dialog').click(function() {$.unblockUI();return false;});$('#show_modal').click(function() {$.blockUI({message: $('#modal_dialog'), css: {width: '275px'}});});$('#modal_dialog #yes').click(function() {alert('Да!');});});</script></p>
<style type="text/css">.dialog {cursor: default;border: 1px solid #000000;}.dialog form {margin: 0px;}.dialog .dialog_title_bar {height: 17px;padding: 1px;background-image: url(http://www.charnad.com/files/blockui-modal-demo/dialog-caption-bg.png) ;}.dialog .dialog_title_bar .dialog_caption {color: black;font-family: sans-serif;font-size: 9pt;text-align: left;padding-left: 5px;padding-top: 1px;}.dialog .dialog_pane {background: buttonface;text-align: center;padding-left: 10%;padding-right: 10%;padding-top: 10px;padding-bottom: 10px;}.dialog .dialog_button {width: 80px;height: 25px;}.dialog .rotes_kreuz {background-image: url(http://www.charnad.com/files/blockui-modal-demo/rotes_kreuz.png);width: 28px;height: 15px;position: absolute;right: 3px;top: 3px;float: right;display: block;cursor: pointer;}</style>
<div id="modal_dialog" style="display:none; cursor: default" class="dialog">
<div class="dialog_title_bar">
<div class="dialog_caption">www.charnad.com</div>
<div class="rotes_kreuz"></div>
</div>
<div class="dialog_pane">
<div>Наше модальное окошко</div>
<div style="margin-top: 10px;">
<form action="" method="POST">
<input type="button" id="yes" value="Да" class="dialog_button"/>
<input type="button" id="no" value="Нет" class="close_dialog dialog_button" /></form>
</div>
</div>
</div>
<p>При желании, вы легко можете добавлять поля в форму диалога. У этого плагина есть еще одна интересная черта - оповещения типа Growl (оповещение вверху справа), о котором я надеюсь написать в следующий раз.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/modalnoe-okno-na-jquery-blockui/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/modalnoe-okno-na-jquery-blockui/</feedburner:origLink></item>
		<item>
		<title>Пара советов по SQLite</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/2lrtmqP7ciE/</link>
		<comments>http://www.charnad.com/blog/para-sovetov-po-sqlite/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:16:12 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=926</guid>
		<description><![CDATA[Если у вас возникают ошибки при работе с SQLite, то вот у меня пара решений. 
Если у вас ошибка "Unable to open database file" и при этом база читается, даже если вы дали права файлу БД 0777, то вам еще надо дать права на запись папке, в которой лежит файл. Дело в том, что при [...]]]></description>
			<content:encoded><![CDATA[<p>Если у вас возникают ошибки при работе с SQLite, то вот у меня пара решений. </p>
<p>Если у вас ошибка "Unable to open database file" и при этом база читается, даже если вы дали права файлу БД 0777, то вам еще надо дать права на запись папке, в которой лежит файл. Дело в том, что при открытии транзакции пишется файл dbfilename-journal. Так же под Windows эта проблема может означать наличие кириллических символов в пути к базе.</p>
<p>Если вы по привычке написали ON DUPLICATE KEY UPDATE ..., и не понимаете в чем ошибка - обратитесь к <a href="http://www.sqlite.org/lang_insert.html">официальному мануалу</a> и просто измените INSERT на REPLACE, а "ON DUPLICATE..." сотрите.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/para-sovetov-po-sqlite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/para-sovetov-po-sqlite/</feedburner:origLink></item>
		<item>
		<title>Ошибка PDO Invalid Argument и Unix socket</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/KfiSvkq9VtM/</link>
		<comments>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 14:56:32 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=910</guid>
		<description><![CDATA[
Такая ошибка возникла у меня после перехода на PHP 5.3. Решение я нашел на http://stackoverflow.com, можете там посмотреть, чтобы узнать про эту ошибку более подробно. Выглядит она вот так:

Warning: PDO::__construct&#40;&#41; &#91;pdo.--construct&#93;: &#91;2002&#93; Invalid argument &#40;trying to connect 
via unix://&#41; in /home/blah-blah-blah.php on line 9
&#160;
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002]
Invalid argument' in /home/blah-blah-blah.php:9 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" style="float:left;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/php.gif" alt=""/></p>
<p>Такая ошибка возникла у меня после перехода на PHP 5.3. Решение я нашел на http://stackoverflow.com, можете там посмотреть, чтобы узнать про эту ошибку более подробно. Выглядит она вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Warning: PDO::__construct<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>pdo.--construct<span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2002</span><span style="color: #7a0874; font-weight: bold;">&#93;</span> Invalid argument <span style="color: #7a0874; font-weight: bold;">&#40;</span>trying to connect 
via unix:<span style="color: #000000; font-weight: bold;">//</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php on line <span style="color: #000000;">9</span>
&nbsp;
Fatal error: Uncaught exception <span style="color: #ff0000;">'PDOException'</span> with message <span style="color: #ff0000;">'SQLSTATE[HY000] [2002]
Invalid argument'</span> <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php:<span style="color: #000000;">9</span> Stack trace: <span style="color: #666666; font-style: italic;">#0</span>
<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>blah-blah-blah.php<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>: PDO-<span style="color: #000000; font-weight: bold;">&gt;</span>__construct<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'mysql:host=localhost;dbname=db'</span>, <span style="color: #ff0000;">'USER'</span>, 
<span style="color: #ff0000;">'PASSWORD'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #666666; font-style: italic;">#1 {main} thrown in /home/blah-blah-blah.php on line 9</span></pre></div></div>

<p>Решается она так: вместо localhost, при написании DSN для PDO пишите 127.0.0.1. А так же стоит указать путь к сокету MySQL в php.ini: pdo_mysql.default_socket=/var/run/mysqld/mysql.sock</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/oshibka-pdo-invalid-argument-unix/</feedburner:origLink></item>
		<item>
		<title>Гелиос-81Н</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/UvxqGcPfllA/</link>
		<comments>http://www.charnad.com/blog/gelios-81n/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 19:40:38 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Фото]]></category>
		<category><![CDATA[d60]]></category>
		<category><![CDATA[гелиос-81н]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=891</guid>
		<description><![CDATA[
Как вы, возможно, помните я купил себе зеркалку Nikon D60. Я достаточно долго щелкал на китовый объектив и, естественно, захотел новых игрушек. Китовый объектив я отдал хозяину, а себе купил кит от D90 Nikkor 18-105mm f/3,5-5.6, а чуть позже Гелиос-81Н 50мм f/2. Сейчас я коротенько расскажу про Гелиос.

Все получилось относительно быстро. Я нашел статью в [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" title="Helios-81N" src="http://www.charnad.com/blog/wp-content/uploads/pictures/helios81n.png" alt="Helios 81N" />
<p>Как вы, возможно, <a href="http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/">помните</a> я купил себе зеркалку Nikon D60. Я достаточно долго щелкал на китовый объектив и, естественно, захотел новых игрушек. Китовый объектив я отдал хозяину, а себе купил кит от D90 Nikkor 18-105mm f/3,5-5.6, а чуть позже Гелиос-81Н 50мм f/2. Сейчас я коротенько расскажу про Гелиос.</p>
<p><span id="more-891"></span>
<p>Все получилось относительно быстро. Я нашел статью в интернете про то, что советская оптика от фотоаппаратов Киев 17,19,20 имеет байонет Н. А тот в свою очередь был скопирован с никоновского байонета, и поэтому они совместимы без переходников. Это же просто находка для никониста! Из всех объективов с таким байонетом наиболее доступным, и наиболее мне интересным был как раз 81й.
<a href="http://www.charnad.com/blog/wp-content/gallery/helios-81n/img_71172-vk.jpg" title="" class="shutterset_singlepic60" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/60__160x120_img_71172-vk.jpg" alt="img_71172-vk" title="img_71172-vk" />
</a>
Мой экземплярчик я нашел на Ebay. Продавец оказался из Ростова, и за несколько дней мы договорились, что за ~23$ я получаю его себе. Теперь мой фотоаппаратик выглядит вот так:</p>
<p>Немножко инфы про объектив. Выпускается в нескольких вариантах, если вы хотите поставить его на камеру Nikon - ищите с маркировкой Н. 81 просто и 81-Автомат не подойдут. Почти полным аналогом является Арсат-81Н, разница в чернении лепестков диафрагмы и просветлении. По слухам на Арсатах чернение лепестков осыпается - будьте внимательны. Объектив, естественно, полностью ручной. Диафрагма выставляется в пределах от 2 до 22 на объективе, наведение на резкость производится фокусировочным кольцом. Выдержку и ISO выставлять надо в камере в режиме M. Насколько мне известно, автоматически оценивать экспозицию сможет только D200, но если у вас есть деньги на D200 - наверняка, есть деньги и на современный объектив. Угол поля зрения 45°, разрешение (центр/край) - 40/20 лин/мм. Опять же по памяти этот объектив один из самых лучших по разрешающей способности.</p>
<p>Поначалу, конечно, тяжко все выставлять ручками, привык, понимаешь, к автоматике. Но теперь получаю несравнимое удовольствие от управления всем процессом. Ну и, конечно куда без фоточек. Пока их мало, но я буду выкладывать по мере появления более-менее достойных. Моя первая модель - киска по имени Ириска.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/helios-81n/dsc_3579.jpg" title="" class="shutterset_singlepic59" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/59__140x105_dsc_3579.jpg" alt="dsc_3579" title="dsc_3579" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/helios-81n/dsc_3581_2.jpg" title="" class="shutterset_singlepic61" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/61__140x105_dsc_3581_2.jpg" alt="dsc_3581_2" title="dsc_3581_2" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/helios-81n/dsc_3597_2.jpg" title="" class="shutterset_singlepic62" >
	<img class="ngg-singlepic" src="http://www.charnad.com/blog/wp-content/gallery/cache/62__140x105_dsc_3597_2.jpg" alt="dsc_3597_2" title="dsc_3597_2" />
</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/gelios-81n/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/gelios-81n/</feedburner:origLink></item>
		<item>
		<title>PHP: Получить строку по номеру</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/AY9OBA1gKzM/</link>
		<comments>http://www.charnad.com/blog/php-poluchit-stroku-po-nomeru/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 13:59:25 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[*nix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=884</guid>
		<description><![CDATA[
Мне нужно было получать строку из файла по порядковому номеру. То есть первую, десятую, 390815-ую, и т.д. Сначала мне хватало цикла fgets, который прокручивал до нужной строки. На строке 500000 такой способ у меня занимал уже почти минуту, что явно плохо. Stream_get_line был совем не быстрее, а даже медленнее процентов на 30.
Первый из костылей, пришедших [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" title="PHP" src="http://static.php.net/www.php.net/images/php.gif" alt="" width="120" height="67" />
<p>Мне нужно было получать строку из файла по порядковому номеру. То есть первую, десятую, 390815-ую, и т.д. Сначала мне хватало цикла fgets, который прокручивал до нужной строки. На строке 500000 такой способ у меня занимал уже почти минуту, что явно плохо. Stream_get_line был совем не быстрее, а даже медленнее процентов на 30.</p>
<p>Первый из костылей, пришедших мне в голову был fseek до значения в 500000 строк (посчитал байты), а оттуда уже крутил fgets. Но так как у меня идет обработка до 100 тысяч строк в сутки, то через пару дней опять пришлось высчитывать смещение для fseek. Опять же, требовался другой выход. И я его таки нашел.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getFileLine<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$line</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;head -n <span style="color: #006699; font-weight: bold;">$line</span> <span style="color: #006699; font-weight: bold;">$file</span> | tail -n 1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Head берет N первых строк файла, tail N последних. Все гениальное просто. 1 миллионная строка берется из файла за 1.027 сек, 40 миллионная - 30 секунд, что очевидно быстрее прокручивания fgets.  (Конечно, если не прыгать fseek до 40 миллионной записи и считывать 40000001-ую)</p>
<p>Конечно, решение ограничено *nix системами, но т.к. моя система и без того использует pcntl_fork, она уже была привязана к никсам, так что хуже мне не стало.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/php-poluchit-stroku-po-nomeru/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/php-poluchit-stroku-po-nomeru/</feedburner:origLink></item>
		<item>
		<title>Массовый UPDATE в MySQL</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/e85AowoCDek/</link>
		<comments>http://www.charnad.com/blog/massovyj-update-v-mysql/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 21:22:18 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=841</guid>
		<description><![CDATA[
Если вы хотите делать массовый апдейт в MySQL, то я могу вам предложить вот такой рецепт. Сначала вы создаете временную таблицу, циклом собираете массовый INSERT запрос и потом вставляете данные из временной таблицы в нужную. Выглядеть это может, например, так:

CREATE TEMPORARY TABLE ids &#40;value INT, url VARCHAR&#40;255&#41;&#41;;
INSERT INTO ids VALUES 
    &#40;0, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/mysql_logo.png" alt=""/>
<p>Если вы хотите делать массовый апдейт в MySQL, то я могу вам предложить вот такой рецепт. Сначала вы создаете временную таблицу, циклом собираете массовый INSERT запрос и потом вставляете данные из временной таблицы в нужную. Выглядеть это может, например, так:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TEMPORARY</span> <span style="color: #993333; font-weight: bold;">TABLE</span> ids <span style="color: #66cc66;">&#40;</span>value INT<span style="color: #66cc66;">,</span> url VARCHAR<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> ids <span style="color: #993333; font-weight: bold;">VALUES</span> 
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url1.ru'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url2.ru'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'http://url3.ru'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">UPDATE</span> blogs<span style="color: #66cc66;">,</span> ids <span style="color: #993333; font-weight: bold;">SET</span> my_value <span style="color: #66cc66;">=</span> ids<span style="color: #66cc66;">.</span>value <span style="color: #993333; font-weight: bold;">WHERE</span> blogs<span style="color: #66cc66;">.</span>url <span style="color: #66cc66;">=</span> ids<span style="color: #66cc66;">.</span>url;</pre></div></div>

<p>Поясню. Допустим, мне понадобилось обновить некое значение в таблице в соответствии с URL. Скажем, статистику интернет-магазинов. Я создал временную таблицу из тех значений, по котороым будет вестись поиск, и значений, которые я буду вставлять в нужную мне таблицу. Дальше, идет INSERT сразу нескольких строк. Его очень просто собирать в цикле из массива. Например вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$elements</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$aray</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$url</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$elements</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'('</span><span style="color: #339933;">.</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">', '</span><span style="color: #339933;">.</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">escape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$insert_string</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$elements</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>После чего, собственно апдейт со вставкой. Временная таблица исчезнет после окончания сессии БД. На то она и временная.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/massovyj-update-v-mysql/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/massovyj-update-v-mysql/</feedburner:origLink></item>
		<item>
		<title>Как в Kohana из-за Apache не работал Index Controller</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/c3FAkznCZ44/</link>
		<comments>http://www.charnad.com/blog/kak-v-kohana-iz-za-apache-ne-rabotal-index-controller/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 12:12:09 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=834</guid>
		<description><![CDATA[
Закончилась моя суточная эпопея с Kohana, когда я пытался всего лишь работать с контроллером по имени Index. Проблема заключалась в том, что когда я заходил по адресу http://somesite.ru/kohana/index/save с надеждой, что выполнится контроллер index, метод save я получал ошибку о том, что мол страницы save-то и не существует. Особенно странно было то, что эта ошибка [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/apache_feather.png" alt=""/>
<p>Закончилась моя суточная эпопея с Kohana, когда я пытался всего лишь работать с контроллером по имени Index. Проблема заключалась в том, что когда я заходил по адресу http://somesite.ru/kohana/index/save с надеждой, что выполнится контроллер index, метод save я получал ошибку о том, что мол страницы save-то и не существует. Особенно странно было то, что эта ошибка проявлялась только на рабочем сервере под Debian. Сначала я стал дебажить роутинг Коханы, но докопавшись до самых глубин, выяснилось, что Apache отдает неверный параметр сервера PATH_INFO, вместо 'index/save', в роутинг передавался просто 'save', и это уже трактовалось как контроллер. Я перепроверил на всех доступных мне shared хостингах, везде все было в порядке, кроме рабочего сервера. </p>
<p>Ладно, подумал я, и переустановил Apache. Но проблема не решилась. Ладно, снова подумал я, и включил unstable пакеты и установил распоследний Apache, но проблема по прежнему не решилась. Вот тут я уже стал впадать в панику. А я вам скажу, что было уже утро следующего дня, как я обнаружил проблему. Просмотрев конфиги Апача я не нашел ничего криминального. Я грешил уже и на mod_rewrite, и на Debian, и на все подряд. </p>
<p>Почти отчаявшись, я стал разбирать Апач по кусочкам, выключив все модули, кроме mod_rewite и mod_php. И вот тут все заработало. Выяснилось, что mod_negotitation считал, что раз я напрямую не указал index.php в URI, значит я ошибся. И милостливо переписывал имя контроллера index в index.php. </p>
<p>Проблема решилась выключением этого злополучного модуля. Потрачено почти сутки времени и килограмм нервов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kak-v-kohana-iz-za-apache-ne-rabotal-index-controller/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kak-v-kohana-iz-za-apache-ne-rabotal-index-controller/</feedburner:origLink></item>
		<item>
		<title>Судоку на PHP и jQuery</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/WSkYsVKBOyw/</link>
		<comments>http://www.charnad.com/blog/sudoku-na-php-i-jquery/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 16:06:22 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=800</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><iframe frameborder="0" width="480" height="500" align="center" src="http://dev.charnad.com/sudoku" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/sudoku-na-php-i-jquery/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/sudoku-na-php-i-jquery/</feedburner:origLink></item>
		<item>
		<title>Mercurial и NetBeans</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/lJnqiav4gxg/</link>
		<comments>http://www.charnad.com/blog/mercurial-i-netbeans/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 21:18:51 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=679</guid>
		<description><![CDATA[В продолжение истории про установку Mercurial я расскажу как настроить IDE NetBeans. По умолчанию плагин для работы с меркуриалом должен быть включен, если же нет, то идите в Tools -> Plugin и там включайте. 

Репозитарий инициируется в свойствах проекта.

Чтобы сохранить все текущие файлы, делаете commit в том же меню, где инициировали проект. Коммитится все локально, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/logo_netbeans.gif" alt="NetBeans logo" />В продолжение истории про установку Mercurial я расскажу как настроить IDE NetBeans. По умолчанию плагин для работы с меркуриалом должен быть включен, если же нет, то идите в Tools -> Plugin и там включайте. <span id="more-679"></span><br />
<img style="margin: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/hg-and-nb/hg-active.png" alt="Mercurial active" /><br />
Репозитарий инициируется в свойствах проекта.<br />
<img style="margin: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/hg-and-nb/hg-init.png" alt="Mercurial init" /><br />
Чтобы сохранить все текущие файлы, делаете commit в том же меню, где инициировали проект. Коммитится все локально, поэтому проблем тут, я думаю, не может быть никаких. (Если у вас выскакивает ошибка, что не найден Mercurial, якобы неверно указан PATH или еще что-нибудь, при том, что вы все точно указали - значит проект слишком большой. Эта проблема есть у NetBeans, попробуйте коммитить проект по частям)<br />
Проблемы начинаются, когда вы хотите сделать pull/push. Он начинается и идет бесконечно. Дело все в том, что авторизация по ssh для NetBeans проходит только с помощью пары ключей. У пользователей Линукса он уже должен быть в ~/.ssh. А те, у кого Windows, <a href="http://www.charnad.com/blog/ssh-pod-windows/">помните</a> мы вместе с ssh копировали ssh-keygen.exe, вот его и настала пора использовать. Запускаете и на все вопросы нажимаете просто Enter. Хотя, по желанию можете установить пароль. В папке, которую вы определили, как HOME, появится .ssh папка с двумя файлами id_rsa и id_rsa.pub (если вы не выбирали другое название). Если вы хотите работать с BitBucket, тогда содержимое pub файла копируете в ваш профиль на сайте. Если вы хотите пушить/пуллить на свой сервер, тогда у пользователя mercurial (или того, кто управляет репозиториями) в папке ~/.ssh создайте файл authorized_keys, если еще нет и добавьте строку с содержимым pub файла. Теперь у вас все должно работать.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/mercurial-i-netbeans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/mercurial-i-netbeans/</feedburner:origLink></item>
		<item>
		<title>Как подружились Mercurial, Windows и Debian.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/BeIq18Wqfp8/</link>
		<comments>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 01:52:44 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=657</guid>
		<description><![CDATA[Эта история началась трагически. Я случайно стер исходники проекта, над которым работал несколько дней. Бекапов не делал, svn забросил (я работаю один, без команды), для версионности вполне обходился Local History в Eclipse/NetBeans. Но эта потеря заставила меня как следует задуматься о том, чтобы все-таки использовать VCS, хотя бы для бекапа. Основной выбор был между Git [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/mercurial-logo.png" alt="Mercurial logo"/>Эта история началась трагически. Я случайно стер исходники проекта, над которым работал несколько дней. Бекапов не делал, svn забросил (я работаю один, без команды), для версионности вполне обходился Local History в Eclipse/NetBeans. Но эта потеря заставила меня как следует задуматься о том, чтобы все-таки использовать VCS, хотя бы для бекапа. Основной выбор был между Git и Mercurial (о достоинствах и недостатках CVS/SVN и прочих ищите в поисковиках). За Mercurial для меня сыграло то, что на Bitbucket был бесплатно доступен один приватный репозиторий, в отличии от Github, где все публично. А у меня на некоторых сайтах пароли в коде зашиты.<span id="more-657"></span></p>
<p>Установка Mercurial на Windows делается элементарно: Next, Next, Next, Ok. Скачать можно, например, <a href="http://mercurial.berkwood.com/">здесь</a>. Можете так же скачать <a href="http://bitbucket.org/tortoisehg/stable/wiki/download">TortoiseHg</a>, если вам нравится их TortoiseSVN. Под Linux еще проще.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> mercurial</pre></div></div>

<p> Для Eclipse IDE поищите плагин Eclipse Mercurial, а в NetBeans поддержка встроенная. Возможно вам понадобится прописать в системную переменную PATH путь к тому месту, куда вы установили Mercurial.</p>
<p>И все, вы можете пользоваться Меркуриалом. Ему, в отличии от SVN совершенно не нужно поднимать сервер. Все ваши изменения будут хранится в папке .hg в корне проекта. В отличии от svn Mercurial, Git и другие современные системы не суют свои папки в каждую папку проекта.</p>
<p>Вкратце расскажу о том, как начать работу с этой системой. Если у вас проект лежит локально, то в папке проекта в консоли введите</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg init</pre></div></div>

<p> Тем самым, вы инициируете проект в этой папке. Дальше, как в svn:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg add; hg commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">'Initial commit'</span>;</pre></div></div>

<p>Тем самым вы добавляете все файлы в текущей папке к проекту и сразу же коммитите с комментарием "Initial commit". Если же проект где-то выложен и вы хотите подключиться к нему, тогда клонируете его себе в пустую папку.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg clone адрес репозитория</pre></div></div>

<p>Я думаю, что как создать и закоммитить проект в IDE вы разберетесь.</p>
<p>Итак, бесплатные репозитории на BitBucket публичны (кроме всего одного приватного), а размер всего 150 мегабайт. Значит надо ставить свой "сервер". Здесь все оказалось довольно быстро и просто. Как установить Mercurial на Debian я уже выше написал. После чего создал нового пользователя mercurial с помощью adduser. Дал ему в распоряжение папку /home/mercurial, закачал на сервер коды проектов по папкам и инициировал в каждой проект Меркуриала. А потом просто в Windows сделал так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg pull <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>mercurial<span style="color: #000000; font-weight: bold;">@</span>myserver<span style="color: #000000; font-weight: bold;">/</span>myproject
hg update</pre></div></div>

<p> Если у вас Винда ругается на отсутствие ssh смотрите <a href="http://www.charnad.com/blog/ssh-pod-windows/">здесь</a>. Обьясню, что я сделал. Так как в Mercurial нет центрального сервера, то все репозитории равны. И вы всегда коммитите в свой локальный. А чтобы обменяться изменениями вы делаете pull (скачиваете) или push (закачиваете). Таким образом я скачал проект с сервера, чтобы удостоверится, что все работает. Надеюсь, что и у вас все получилось. А если нет - спрашивайте в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/</feedburner:origLink></item>
		<item>
		<title>SSH под Windows</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/ab23FHxVblU/</link>
		<comments>http://www.charnad.com/blog/ssh-pod-windows/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 00:53:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=651</guid>
		<description><![CDATA[Мне потребовалось получить ssh доступ к удаленной машине из под Windows. И, хотя PuTTY меня всем устраивал, в данном случае он помочь не мог - ssh требовался распределенной системе контроля версий Mercurial. Ну что ж, надо значит надо.
Чтобы запустить консольный OpenSSH клиент в Винде нужно поставить Cygwin, а так же пакеты zlib и openssh. Cygwin [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/ssh_pic.png" alt="" />Мне потребовалось получить ssh доступ к удаленной машине из под Windows. И, хотя PuTTY меня всем устраивал, в данном случае он помочь не мог - ssh требовался распределенной системе контроля версий Mercurial. Ну что ж, надо значит надо.<span id="more-651"></span></p>
<p>Чтобы запустить консольный OpenSSH клиент в Винде нужно поставить Cygwin, а так же пакеты zlib и openssh. Cygwin позволяет запускать линуксовые приложения под виндой. Я всегда довольно подозрительно отношусь к софту, который меняет поведение системы, поэтому собирал ssh не запуская инсталлятор Cygwin. (Для тех, кому не терпится - в конце есть все готовое, чтобы скачать.)</p>
<p>Для начала я сделал папку SSH в Program Files. На одном из <a href="http://www.cygwin.com/mirrors.html">этих</a> сайтов я скачал пакеты cygwin, zlib, openssh, openssl и minires. Из них нужно в нашу папку SSH положить файлы: cygwin1.dll из пакета cygwin, cygz.dll из zlib, ssh.exe и ssh-keygen.exe из ssh, cygcrypto-0.9.8.dll из openssl, и cygminires.dll из minires. Дальше идем в настройки переменных окружения, в PATH прописываем путь к папке SSH, а так же создаем переменную HOME и так же прописываем путь к папке SSH. Хочу, однако, отметить, что HOME можно не указывать, тогда ищите папку .ssh в папке вашего юзера. Например C:/Users/CharnaD/.ssh. Все!</p>
<p>
<img src="http://www.charnad.com/blog/wp-content/uploads/pictures/ssh_working.png" align="center" alt="Working ssh"/></p>
<p>Те, кто не хочет заморачиваться со всем этим, может просто скачать уже готовый архив с SSH: <p><img align="absmiddle" src="http://www.charnad.com/blog/wp-includes/images/crystal/archive.png" height="20" /> <a href="http://www.charnad.com/download/ssh_for_win.zip" onclick="wpfilebase_dlclick(2, 'download/ssh_for_win.zip')" title="Download SSH для Windows">SSH для Windows</a> (1.4 MiB)</p> Вам останется только прописать переменные окружения.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/ssh-pod-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/ssh-pod-windows/</feedburner:origLink></item>
		<item>
		<title>Как защитить upload</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/CwSdhNpKyqk/</link>
		<comments>http://www.charnad.com/blog/kak-zashitit-upload/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 02:14:50 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=638</guid>
		<description><![CDATA[Иногда в скриптах нужна возможность аплоада файлов. Картинок на сервер, архивов, чего угодно. Делается это все несложно, однако есть опасность, что некто сумеет обойти ваши фильтры и таки закачает php скрипт. Существует два метода и оба с помощью .htaccess.
Вариант первый:

php_value engine Off

Это отключит интерпретацию и скрипты злоумышленника не будут работать. Только свои скрипты не кладите [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/apache_feather.png" alt=""/>Иногда в скриптах нужна возможность аплоада файлов. Картинок на сервер, архивов, чего угодно. Делается это все несложно, однако есть опасность, что некто сумеет обойти ваши фильтры и таки закачает php скрипт. Существует два метода и оба с помощью .htaccess.<br />
Вариант первый:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">php_value engine Off</pre></div></div>

<p>Это отключит интерпретацию и скрипты злоумышленника не будут работать. Только свои скрипты не кладите рядом, иначе любой сможет их скачать в виде исходных кодов. Но есть одно "НО". Нужно настроить опцию AllowOverride в конфиге Apache. Насколько я понял хватит AllowOverride Options. На shared хостингах, где PHP работает в CGI режиме, этой фичей воспользоваться не получится.</p>
<p>Вариант второй, предложенный <a href="http://kobzarev.com/"><strong>mihdan</strong></a>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">RemoveHandler .php
AddType application<span style="color: #000000; font-weight: bold;">/</span>x-httpd-php-source .php
RemoveType .php
Options <span style="color: #660033;">-ExecCGI</span> <span style="color: #660033;">-Indexes</span></pre></div></div>

<p>Этот метод совместим с большим количеством хостингов и на данный момент видится более предпочтительным.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kak-zashitit-upload/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kak-zashitit-upload/</feedburner:origLink></item>
		<item>
		<title>Kohana и Formo</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/WMu_RasAi-I/</link>
		<comments>http://www.charnad.com/blog/kohana-i-formo/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 00:10:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[formo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[kohana]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=609</guid>
		<description><![CDATA[Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения.
О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить install. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/kohana_logo.png" alt=""/>Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения.<span id="more-609"></span></p>
<p>О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить install. Про то, как убрать index.php из адреса тоже пару слов всего: переименовать example.htaccess в .htaccess и убрать index.php из $config['index_page'] в конфиге.</p>
<p>Собственно постороение приложения на Кохане я начал с того, что захотел переписать на этом фреймворке скриптик по удаленному управлению сайтами. И первая задача - формочка добавления сайта в БД. И тут возникли первые проблемы. Компоненты для построения форм, которые описаны в туториалах: Forge и Formation. Я выбрал Formation, скачал, установил. Не работает, выдает ошибки. Гуглил, читал форумы, боролся. От безысходности постучался в аську к одному парню, который имел дело с Коханой и получил ответ, что Forge и Formation блин уже deprecated. Как вам такое? На сайте я не видел об этом ни слова. Может не там искал?</p>
<p>
Ладно, пошел я дальше искать модуль для создания формочек. Посоветовали мне Morf. Зашел на страничку проекта. А там такой тухляк.. полгода код не обновляется, висит один тикет и еще два закрыто. Понятно все, не надо нам добра такого. В общем остался последний модуль на который были все надежды - Formo.</p>
<p>Formo завелся сразу, подключился без особых хлопот.  Только вот одна проблема, форму мне выводит с помощью P и DIV, а мне проще в TABLE запихать. Стал искать способы заставить генерить форму по-другому. Модифицировал объект, менял настройки - фиг. Нашел в мануале статью по темплейтам, переделал под темплейт. Не работает. Оказалось пример приведен с использованием шаблонизаторов, коими я не пользуюсь. В итоге кое-как заставил генериться форму как надо.</p>
<p>С валидацеий тоже номер. Искал как в валидацию передать $_POST, чтобы сверить с установками. Оказалось, что Formo сама жрет POST. Так же сама делает repopulation, основываясь на имени таблицы и hidden инпуте. Пока этого не знаешь - пугаешься и мучаешься, когда узнаешь - становится просто и легко. После чего за два дня доделал простейший CRUD.</p>
<p>Общие впечатления о фреймворке на этот момент:<br />
1. Наименования классов xxx_Core, когда вызываются они new xxx(); ломает автокомплит из-за чего надо совать IDE отдельный файлик, где прописаны "class xxx extends xxx_Core {}".<br />
2. Документация местами ужасна. Референс мануал нормальный, референс есть референс. Но вот тьюториалов мало, документация модулей слабая, коммьюнити маленькое. В общем въезжать тяжело.<br />
3. Местами все все-таки достаточно просто. За 10 минут добавил себе пару нужных хелперов, за полчаса написал плагин к Formo. И то, и другое я выложу чуть попозже.<br />
4. Дурацкие сообщения об ошибках. Если я ошибся и сунул не тот параметр, который ожидается - вылезает Fatal error где-то в глубине ядра. О том, что это я ошибся в параметре, а не Кохана концы отбрасывает можно только догадываться.<br />
5. ORM успел посмотреть на уровне CRUD одной таблицы. Удобно.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kohana-i-formo/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kohana-i-formo/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 3.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/D6RJdCbY6Zw/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 13:53:26 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Прочее]]></category>
		<category><![CDATA[Фото]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=611</guid>
		<description><![CDATA[Окончание рассказа о моем двухдневном пребывании в Хельсинки, столице Финляндии. Начало истории можно прочитать тут: часть 1, часть 2. В этой части будет больше фотографий и меньше текста.
Во второй день, а это было воскресенье, мы пошли в торговый центр, который называется Itakeskus. Он как раз находится на той станции метро, до которой мы пешком шли [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" />Окончание рассказа о моем двухдневном пребывании в Хельсинки, столице Финляндии. Начало истории можно прочитать тут: <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/">часть 1</a>, <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/">часть 2</a>. В этой части будет больше фотографий и меньше текста.<span id="more-611"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0588.JPG" title="" class="shutterset_singlepic24" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/24__160x120_DSC_0588.JPG" alt="DSC_0588" title="DSC_0588" />
</a>
Во второй день, а это было воскресенье, мы пошли в торговый центр, который называется Itakeskus. Он как раз находится на той станции метро, до которой мы пешком шли во второй части. Финский торговый центр почти ничем не отличается от торговых центров в Питере или Москве. Много магазинов, местами кафешки, местами скамейки. В Итакескусе, кстати, можно часто услышать русскую речь. Те, кто едут в Хельсинки на экскурсию на больших автобусах заезжают туда. А вот в чем отличие от российских магазинов, так это в качестве товаров и скидках. Сами цены чуть выше питерских. Если бы евро не подорожал из-за кризиса - были бы ровно питерские. Однако местами можно найти распродажи, скажем развал футболок за 3/5/7 евро. Вот так мы и ходили и покупали все, что дешево, но при этом качественно и симпатично. Особой нужды в одежде не было, так что набрали футболок. Я, как и в любой стране, старался найти футболку с финским флагом. Нашел только с надписью Suomi (Финляндия по-фински), что в общем меня устроило.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0608.JPG" title="" class="shutterset_singlepic26" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/26__160x120_DSC_0608.JPG" alt="DSC_0608" title="DSC_0608" />
</a>
Заехали после магазина домой, закинули вещи и поехали в центр, на станцию Kaisaniemi. Мы там бегали во второй части по площади. А теперь пошли в другую сторону. И дошли до кафедрального собора. На синем небе белоснежный собор смотрится офигительно. Его делали на подобие питерского Исаакиевского собора, получилось вполне похоже. Не пофотаться на таком фоне просто грех.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0682.JPG" title="" class="shutterset_singlepic28" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/28__140x110_DSC_0682.JPG" alt="DSC_0682" title="DSC_0682" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0686.JPG" title="" class="shutterset_singlepic29" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/29__140x110_DSC_0686.JPG" alt="DSC_0686" title="DSC_0686" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0688.JPG" title="" class="shutterset_singlepic30" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/30__140x110_DSC_0688.JPG" alt="DSC_0688" title="DSC_0688" />
</a>
<br clear='all'><br />
Собор находится на Сенатской площади. Там же стоит памятник Александру 2, который собственно и сделал Хельскински столицей "княжества Финляндского". Прошли чуть дальше по улице к пристани. На одно здание села чайка. Я успел удачно ее сфотографировать. Не сразу даже понятно, что она не часть скульптуры.<br clear='all'><br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0713.jpg" title="" class="shutterset_singlepic39" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/39__140x110_dsc_0713.jpg" alt="dsc_0713" title="dsc_0713" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0721.JPG" title="" class="shutterset_singlepic31" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/31__140x110_DSC_0721.JPG" alt="DSC_0721" title="DSC_0721" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0775.jpg" title="" class="shutterset_singlepic40" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/40__140x110_dsc_0775.jpg" alt="dsc_0775" title="dsc_0775" />
</a>
<br clear='all'><br />
Набережная, к корой мы вышли прекрасна. Везде стоят яхты, в том числе парусные со штурвалами. Красота да и только. Ну и, конечно, Успенский собор. На портовых зданиях висели огромные винт и якорь.<br clear='all'><br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0729.jpg" title="" class="shutterset_singlepic41" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/41__160x120_dsc_0729.jpg" alt="dsc_0729" title="dsc_0729" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0773.JPG" title="" class="shutterset_singlepic32" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/32__160x120_DSC_0773.JPG" alt="DSC_0773" title="DSC_0773" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0777.JPG" title="" class="shutterset_singlepic34" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/34__160x120_DSC_0777.JPG" alt="DSC_0777" title="DSC_0777" />
</a>
<br clear='all'><br />
Нагулявшись, мы поехали домой. На станцию Kaisaniemi, как оказалось есть еще один очень интересный вход с "наскальной" живописью. Если бы не знак метро - я бы точно туда не пошел.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0815.JPG" title="" class="shutterset_singlepic35" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/35__140x110_DSC_0815.JPG" alt="DSC_0815" title="DSC_0815" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0822.JPG" title="" class="shutterset_singlepic36" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/36__140x110_DSC_0822.JPG" alt="DSC_0822" title="DSC_0822" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0839.JPG" title="" class="shutterset_singlepic37" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/37__140x110_DSC_0839.JPG" alt="DSC_0839" title="DSC_0839" />
</a>
<br clear='all'><br />
А на следующий день мы уехали в Питер.<br clear='all'><br />
Те, кто хочет посмотреть более подробную фотоисторию - прошу пожаловать в <a href="http://picasaweb.google.com/charnad/20090620#">Picasa</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 2.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/gBWXIeQ6AIw/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 21:00:38 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Прочее]]></category>
		<category><![CDATA[Фото]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=590</guid>
		<description><![CDATA[ Продолжение истории про то, как я ездил в Финляндию. Напомню, что в первой части я закончил рассказ на том, что мы с Викой дошли до странной скульптуры в конце улицы Itamerenkatu, что рядом с конечной станцией метро. Дальше этой скульптуры решили не ходить, чтобы не заблудиться.
По дороге назад к метро, мы заметили интересную особенность финских [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" /> Продолжение истории про то, <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/" target="_self">как я ездил в Финляндию</a>. Напомню, что в первой части я закончил рассказ на том, что мы с Викой дошли до странной скульптуры в конце улицы Itamerenkatu, что рядом с конечной станцией метро. Дальше этой скульптуры решили не ходить, чтобы не заблудиться.<span id="more-590"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0212.JPG" title="" class="shutterset_singlepic14" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/14__160x120_DSC_0212.JPG" alt="6. Подъезд" title="6. Подъезд" />
</a>
По дороге назад к метро, мы заметили интересную особенность финских адресов. У нас как, улица, дом, квартира. А у них улица, дом, подъезд, фамилия. Адрес говорят типа: улица такая-то, дом такой-то подъезд K, или подъезд J.  А там уж ищи по фамилии кто тебе нужен. Еще, рядом с каждым подъездом стоит устройство из трех щеток, щетиной направлены в общий центр. Как мы поняли, это сделано для того, чтобы зимой чистить ботинки от снега. Хотя по первости это было похоже на волосатую стоянку для велосипеда.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0254.JPG" title="" class="shutterset_singlepic16" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/16__160x120_DSC_0254.JPG" alt="7. Метро Kalasatama" title="7. Метро Kalasatama" />
</a>
Когда мы вернулись в метро, у нас еще оставалось минут 10 действия билета. Мы решили доехать до моста, с которого открывался красивый вид на Балтийское море (или это все еще считается Финским заливом). Станиця эта называется Kalasatama. С финского какая-то там гавань.  Оттуда мы пошли пешком. Позже выяснилось, что зря, но тогда мы были полны энтузиазма.
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0266.jpg" title="" class="shutterset_singlepic38" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/38__160x120_dsc_0266.jpg" alt="8. Финский залив" title="8. Финский залив" />
</a>
 Так как на карту мы не расчитывали, то старались идти вдоль линии метро. Чаще всего параллельно шла автомобильная дорога и не было пешеходной. Нам часто приходилось сворачивать и идти по соседним улочкам. В этом собственно и заключался кайф такого путешествия. Никто не старался показать лучшее, никто не вопил "посмотрите налево", мы сами смотрели куда хотели и что хотели. Нам открывался город таким, каким его видят местные финны.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0284.JPG" title="" class="shutterset_singlepic17" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/17__160x120_DSC_0284.JPG" alt="8. Цветочки" title="8. Цветочки" />
</a>
 На одной из улиц рядом с домом увидели красивый куст какого-то растения. У нас я таких не видел. Несколько раз по дороге попадались сороки. Опять же, в Питере я помню только один раз когда видел сороку - на следующий день после приезда из Хельсинки. Зато ворон и голубей у них значительно меньше. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0361.JPG" title="" class="shutterset_singlepic19" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/19__160x120_DSC_0361.JPG" alt="9. Подземный переход" title="9. Подземный переход" />
</a>
 Наша дорога периодически пересекала пути метро, образуя подобие подземного перехода. Но куда более интересных для фотографа. Мне кажется в таком месте можно делать шикарнейшие фотки.</p>
<p>Итак мы шли. Часа три-четыре заняла такая прогулка и уже порядком уставшие вышли к Itakeskus. Оставалось всего ничего - две станции метро до дома. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0527.JPG" title="" class="shutterset_singlepic21" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/21__160x120_DSC_0527.JPG" alt="10. Вокзал" title="10. Вокзал" />
</a>
 Идти сил не было, а платить два евро за часовой билет ради двух станций совсем не хотелось. Идти еще две станции мы уже точно не могли, поэтому купили билеты. И что же вы думаете? Решили использовать их по-максимуму) Сели и поехали обратно в центр до Kaisaniemi. Минут за 15 доехали, выскочили и побежали в сторону где по идее должны были быть достопримечательности. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0559.JPG" title="" class="shutterset_singlepic22" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/22__160x120_DSC_0559.JPG" alt="DSC_0559" title="DSC_0559" />
</a>
За 20 минут оббежали площадь, сфотали все, что было симпатичного (на фото - вокзал) и побежали обратно. Украшение эскалатора на Kaisaniemi простое, но очень симпатичное. Как росчерки светового пера. На этот раз уже сели в метро и ехали домой до самой Kontula.</p>
<p>Вот так закончился наш первый день. Мы уже порядком разобрались в схеме метро, попривыкли к городу. А на следующий день мы пошли по магазинам и поехали гулять в центр, туда где еще не были. Куда оказывается надо было ехать с самого начала. Но это будет в следующей части.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/</feedburner:origLink></item>
		<item>
		<title>Win32:Vitro</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/_lq-tfSpipM/</link>
		<comments>http://www.charnad.com/blog/win32vitro/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 14:43:03 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=586</guid>
		<description><![CDATA[Подцепил нынче эту заразу. Хотел кряк скачать, а скачал подлянку. Причем NOD и Avast промолчали. Avira ругнулась, но она на все кряки ругается. Ничто не предвещало беды. А теперь..
"The Vitro Trojan WILL, I repeat, WILL require you to back up your data, format your hard disk, then do a wipe of your drive, then reinstall [...]]]></description>
			<content:encoded><![CDATA[<p>Подцепил нынче эту заразу. Хотел кряк скачать, а скачал подлянку. Причем NOD и Avast промолчали. Avira ругнулась, но она на все кряки ругается. Ничто не предвещало беды. А теперь..</p>
<p>"The Vitro Trojan WILL, I repeat, WILL require you to back up your data, format your hard disk, then do a wipe of your drive, then reinstall Windows, all of the service packs and updates, all of your software, then restore your data. This IS the only way to get rid of it." Почитать еще можно <a href="http://www.lockergnome.com/savemybutt/2009/05/10/win32vitro-what-is-it/">тут</a>.<br />
(Тут сказано, что чтобы избавиться от этого вируса надо форматировать и очищать полностью весь жесткий диск, на котором он побывал, в том числе и внешние).</p>
<p>Хочу выразить свою искреннюю ненависть тем, кто его сделал. Горите в аду.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/win32vitro/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/win32vitro/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 1.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/i3VI-9eqkuM/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 10:33:04 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Прочее]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=564</guid>
		<description><![CDATA[
Съездил в Финляндию на пару дней. Вообще Финляндия просто райское место отдыха для Петербуржцев. Съездить туда стоит 15-20 евро, смотря как договоритесь. Ехать туда 6-7 часов. Вечером в пятницу поехал, в воскресенье вечером вернулся. Красота да и только. Самое сложное, конечно, с проживанием. У нас там знакомые, поэтому никаких проблем не было. Дальше буду рассказывать [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" /></p>
<p>Съездил в Финляндию на пару дней. Вообще Финляндия просто райское место отдыха для Петербуржцев. Съездить туда стоит 15-20 евро, смотря как договоритесь. Ехать туда 6-7 часов. Вечером в пятницу поехал, в воскресенье вечером вернулся. Красота да и только. Самое сложное, конечно, с проживанием. У нас там знакомые, поэтому никаких проблем не было. Дальше буду рассказывать и показывать (много фоток).</p>
<p><span id="more-564"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0159.JPG" title="" class="shutterset_singlepic9" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/9__160x120_DSC_0159.JPG" alt="1. Вид метро Kontula" title="1. Вид метро Kontula" />
</a>
В Финляндии я уже второй раз, но первый мы ездили в Иматру и жили в коттедже. Финнов-то почти не видели. В этот раз мы были в Хельсинки, меня и девушку мою отвели к метро и сказали:"Вот сюда тыкаешь, суешь 2 евро, получаешь билет на 1 час на метро/трамвай/автобус", и оставили нас одних. Делать нечего, спустились в метро. После Питерского, очень непривычно: у них станции чисто утилитарные, без изысков. Понятно теперь, почему наши станции иностранцы считают музеями. Метро у них почти везде наземное, и это прекрасно. Едешь, в окошко смотришь, красота. Много  зелени, залив, очень красиво все. (Хочу, кстати, заметить, что государственных языка в Финляндии два. Финский и шведский, поэтому все указатели как минимум на двух языках. Иногда еще добавляется английский.)<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0160.JPG" title="" class="shutterset_singlepic10" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/10__160x120_DSC_0160.JPG" alt="2. Карта метро" title="2. Карта метро" />
</a>
Станция, ближайшая к нашему дому называлась Kontula. Схема метро в Хельсинки вообще довольно простая, главное в Itakeskus не перепутать и не уехать на другую ветку. Для этого на каждой электричке на лбу и боках бегущие строки, где написана конечная станция следования. Сели в электричку, куда ехать - не знаем, полнейший шок, выходить не хочется. Так и доехали до конечной.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0162.JPG" title="" class="shutterset_singlepic11" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/11__160x120_DSC_0162.JPG" alt="3. Вика в вагоне" title="3. Вика в вагоне" />
</a>
 Вагоны у них в метро очень удобные. Они во-первых шире и вместительнее наших, во-вторых никто не портит сиденья, хотя они просто пластиковые. Я бы совсем не отказался, чтобы у нас было такое же метро, как в Хельсинки.<br />
Вышли мы на конечной станции и пошли по улице. Карта города была в рюкзаке, но от шока забыв про нее и не достали. Так и шли наугад. Вы смеетесь, а представьте себя первый раз в чужом городе, чужой стране, языка не знаем... ужас. На самом деле к тому времени(через полчаса где-то после того, как сели в метро) шок стал проходить и мы стали фотографировали все подряд. Дошли до конца улицы, где стояла странная скульптура.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0205.JPG" title="" class="shutterset_singlepic12" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/12__160x120_DSC_0205.JPG" alt="4. Странная композиция" title="4. Странная композиция" />
</a>
 Что это такое мы так и не узнали. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0210.JPG" title="" class="shutterset_singlepic13" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/13__160x120_DSC_0210.JPG" alt="5. Отражающий знак" title="5. Отражающий знак" />
</a>
<br />
Недалеко от скульптуры находилось трамвайное кольцо. Ни на трамвае, ни на автобусе мы не покатались, боялись уехать неизвестно куда. На карте были обозначеные некоторые маршруты, но рисковать не хотелось. Интересно, что во многих местах у них стоят отражающие знаки, чтобы были видно возможную опасность из-за угла. А может и для таких туристов, как мы))</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/</feedburner:origLink></item>
		<item>
		<title>SVN, Nginx и ошибка 405 Not Allowed</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/A6F0PbRifzY/</link>
		<comments>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/#comments</comments>
		<pubDate>Thu, 21 May 2009 20:19:32 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[блог]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[VDS]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=559</guid>
		<description><![CDATA[ Для тех у кого проблемы с commit в svn. У меня сегодня случилась ошибка "405 Not Allowed". Оказалось во всем виноват nginx, который я недавно поставил. Проблема, вероятно, появляется у тех, у кого VDS от FirstVDS.ru. Дело в том, что nginx автоматически сжирает конфига апача и настраивает кеширование. А тогда, когда вы пытаетесь закоммитить [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/svnlogo.png" alt=""/> Для тех у кого проблемы с commit в svn. У меня сегодня случилась ошибка "405 Not Allowed". Оказалось во всем виноват nginx, который я недавно поставил. Проблема, вероятно, появляется у тех, у кого VDS от FirstVDS.ru. Дело в том, что nginx автоматически сжирает конфига апача и настраивает кеширование. А тогда, когда вы пытаетесь закоммитить css, js или еще что-то, что nginx пытается проксировать, возникает ошибка. Я ее решил следующим способом - полностью закомментировал location в настройках субдомена svn.charnad.com, где указывается обработка статического контента, так как на это субдомене ничего не надо проксировтаь. После чего рестарт nginx'a и все отлично. Удачи.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/</feedburner:origLink></item>
		<item>
		<title>Symfony: плагин sfPropelToggler 1.0.0b</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/wN_u78jdD9E/</link>
		<comments>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/#comments</comments>
		<pubDate>Sat, 16 May 2009 11:58:36 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[sfPropelToggler]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[togglers]]></category>
		<category><![CDATA[переключатели]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=511</guid>
		<description><![CDATA[Не так давно я писал про тогглеры (переключатели) в Symfony. Вчера я поработал над ними и существенно упростил их принцип работы, теперь они доступны в качестве плагина. Сразу же дам ссылку, вы можете их скачать в виде PEAR package и просто zip-архив. Дальше я расскажу как этим плагином пользоваться.
Вообще, по правилам PEAR все инструкции написаны [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Не так давно я писал про <a href="http://www.charnad.com/blog/symfony-pereklyuchateli/">тогглеры (переключатели) в Symfony</a>. Вчера я поработал над ними и существенно упростил их принцип работы, теперь они доступны в качестве плагина. Сразу же дам ссылку, вы можете их скачать в виде <a href="http://www.charnad.com/files/sfpropeltoggler/sfPropelTogglerPlugin-1.0.0b.tgz">PEAR package</a> и просто <a href="http://www.charnad.com/files/sfpropeltoggler/sfPropelTogglerPlugin-1.0.0b.zip">zip-архив</a>. Дальше я расскажу как этим плагином пользоваться.<span id="more-511"></span></p>
<p>Вообще, по правилам PEAR все инструкции написаны в README. Но там по-английски. А тут я приведу русскую инструкцию. Итак.<br />
1. Надо или установить плагин, как PEAR пакет, или распаковать архив в папку plugins. Папка с плагином должна называться sfPropelTogglerPlugin. После этого вызовите команду symfony 'plugin:publish-assets' чтобы картинки из плагина скопировались в папку web/sfPropelTogglerPlugin. Если ничего не скопировалось - проверьте название папки плагина.<br />
2. В settings.yml вашего приложения впишите в пункт enabled_modules: [default, sfPropelToggler]. Если вы этого не сделаете - будет выскакивать ошибка о том, что модуль не активирован.<br />
3. В том файле, где будете подключать тогглер напишите</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">use_helper<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Toggler'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>4. Собственно сам переключатель может быть вставлен 2мя способами. Первый:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> toggler<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'table_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'field_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getState</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Где table -имя таблицы, field - поле, id - первичный ключ записи, а state - текущее состояние переключателя.<br />
Второй способ через объект:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> object_toggler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field_name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Где object - объект Пропела, а field_name - поле, которе будем переключать.
</p>
<p>На этом этапе у вас все должно заработать. Если же нет - спрашивайте в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/</feedburner:origLink></item>
		<item>
		<title>Панорамы и Autostitch</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/LqoY1fyZHWA/</link>
		<comments>http://www.charnad.com/blog/panorami-i-autostitch/#comments</comments>
		<pubDate>Fri, 15 May 2009 08:59:50 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Фото]]></category>
		<category><![CDATA[панорамы]]></category>
		<category><![CDATA[фотографии]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=498</guid>
		<description><![CDATA[Autostitch - это такая хорошая програмка, которая сшивает несколько изображений в одно, причем автоматически. Это очень удобно и легко, а так как я люблю панорамы - просто суперски. Чтобы не быть голословным - вот вам мои панорамки. Они уменьшены в 4-5 раз на самом деле.
Саму программку можно скачать на сайте автора.
Есть, конечно, некоторые недостатки. Например [...]]]></description>
			<content:encoded><![CDATA[<p>Autostitch - это такая хорошая програмка, которая сшивает несколько изображений в одно, причем автоматически. Это очень удобно и легко, а так как я люблю панорамы - просто суперски. Чтобы не быть голословным - вот вам мои панорамки. Они уменьшены в 4-5 раз на самом деле.</p>

<div class="ngg-galleryoverview" id="ngg-gallery-2-498">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-6" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/izokna_cr3_small.jpg" title=" " class="shutterset_set_2" >
								<img title="izokna_cr3_small.jpg" alt="izokna_cr3_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_izokna_cr3_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-7" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/zaliv_cr_small.jpg" title=" " class="shutterset_set_2" >
								<img title="zaliv_cr_small.jpg" alt="zaliv_cr_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_zaliv_cr_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-8" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/stachek_small.jpg" title=" " class="shutterset_set_2" >
								<img title="stachek_small.jpg" alt="stachek_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_stachek_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>


<p>Саму программку можно скачать на сайте <a href="http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html">автора</a>.<br />
Есть, конечно, некоторые недостатки. Например "фантомы". Это полупрозрачные куски машин, зданий, которые есть на одной фотографии, но нет на другой. Чтобы их не было - надо выбирать кадры, где нет машин вообще. А с прямыми руками и GIMP (Фотошопом) получится очень даже хорошо.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/panorami-i-autostitch/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/panorami-i-autostitch/</feedburner:origLink></item>
		<item>
		<title>Купил черного друга. Nikon D60</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/DVkBlH53pQI/</link>
		<comments>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/#comments</comments>
		<pubDate>Fri, 15 May 2009 08:18:37 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Фото]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=494</guid>
		<description><![CDATA[ Вдруг взбрендилось мне купить зеркалку. Мой первый фотик Panasonic LZ5, который верой и правдой служил мне и отщелкал 12 тысяч кадров подло украли. Временно я купил себе Canon A610, который меня кстати порадовал чуть более, чем полностью. Однако мыльница на 5 мегапикселей, пусть и с ручным фокусом и диафрагмой не могла удовлетворить всех моих [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/d60.gif" alt="" /> Вдруг взбрендилось мне купить зеркалку. Мой первый фотик Panasonic LZ5, который верой и правдой служил мне и отщелкал 12 тысяч кадров подло украли. Временно я купил себе Canon A610, который меня кстати порадовал чуть более, чем полностью. Однако мыльница на 5 мегапикселей, пусть и с ручным фокусом и диафрагмой не могла удовлетворить всех моих фотографических потребностей. Душа требовала нечто большего.<span id="more-494"></span></p>
<p>Первым делом в общем-то я стал смотреть на Canon, а конкретнее на 450D. Смотрел, смотрел, народ спрашивал, интересовался. Первая зеркалка, которую мне удалось потрогать оказалась Никоном Д60 с телеобъективом 70-300мм. Для тех, кто вдруг не знает, в зеркалке сам фотоаппарат - не больше половины, а то и меньше во всей системе. Огромную роль играет объектив, который может стоить больше самого фотоаппарата.</p>
<p>Что такое фокусное расстояние 300мм для человека, который считал, что его мыльницкий зум 6х это круто.. вы просто представить не можете. Это чистый восторг. В общем культурный шок имел место быть. Мой друг Паша, у которого я брал зеркалку сказал, что даст мне штатный объектив 18-55мм, если я куплю Никон. В общем я пошел и купил Никон. Такой же как у него, потому что денег у меня было не так много. Вот теперь и хожу с Никоном Д60 и штатным объективом 18-55мм.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/</feedburner:origLink></item>
	</channel>
</rss>
