<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Записки программиста</title>
	<atom:link href="http://saterenko.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://saterenko.ru</link>
	<description></description>
	<pubDate>Mon, 15 Feb 2010 06:12:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Апгрейд ноута</title>
		<link>http://saterenko.ru/2010/02/15/%d0%b0%d0%bf%d0%b3%d1%80%d0%b5%d0%b9%d0%b4-%d0%bd%d0%be%d1%83%d1%82%d0%b0/</link>
		<comments>http://saterenko.ru/2010/02/15/%d0%b0%d0%bf%d0%b3%d1%80%d0%b5%d0%b9%d0%b4-%d0%bd%d0%be%d1%83%d1%82%d0%b0/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 06:12:11 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[macbook]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=122</guid>
		<description><![CDATA[Проапгрейдил свой макбук&#8230; Достало что на Tiger новый софт стал глючить либо вообще отказывается ставиться. Купил Snow Leopard. Но это не самое главное, самое главное, что купил SSD Transcend на 128Gb. Хотел взять Intel X25-E 80Gb, но его найти не удалось, а вернее задолбался искать, а потому взял Transcend, тем более что он по тестам [...]]]></description>
			<content:encoded><![CDATA[<p>Проапгрейдил свой макбук&#8230; Достало что на Tiger новый софт стал глючить либо вообще отказывается ставиться. Купил Snow Leopard. Но это не самое главное, самое главное, что купил SSD Transcend на 128Gb. Хотел взять Intel X25-E 80Gb, но его найти не удалось, а вернее задолбался искать, а потому взял Transcend, тем более что он по тестам не сильно отстаёт от Intel в посведневных задачах&#8230;</p>
<p>По новой системе пока никаких особых впечатлений кроме возможости поставить Google Chrom и другой нужный софт&#8230; А вот винт радует&#8230; Явное увеличение скорости загрузки приложений&#8230; В общем, я доволен <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2010/02/15/%d0%b0%d0%bf%d0%b3%d1%80%d0%b5%d0%b9%d0%b4-%d0%bd%d0%be%d1%83%d1%82%d0%b0/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Были получены исходники 3300 глобальных интернет-проектов</title>
		<link>http://saterenko.ru/2009/09/23/%d0%b1%d1%8b%d0%bb%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b5%d0%bd%d1%8b-%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b8-3300-%d0%b3%d0%bb%d0%be%d0%b1%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85/</link>
		<comments>http://saterenko.ru/2009/09/23/%d0%b1%d1%8b%d0%bb%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b5%d0%bd%d1%8b-%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b8-3300-%d0%b3%d0%bb%d0%be%d0%b1%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 09:38:02 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[разное]]></category>

		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=119</guid>
		<description><![CDATA[Про сабж можно почитать на хабре: http://habrahabr.ru/blogs/infosecurity/70330/.
]]></description>
			<content:encoded><![CDATA[<p>Про сабж можно почитать на хабре: <a href="http://habrahabr.ru/blogs/infosecurity/70330/">http://habrahabr.ru/blogs/infosecurity/70330/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/09/23/%d0%b1%d1%8b%d0%bb%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b5%d0%bd%d1%8b-%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%bd%d0%b8%d0%ba%d0%b8-3300-%d0%b3%d0%bb%d0%be%d0%b1%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Диван лучше табуретки</title>
		<link>http://saterenko.ru/2009/08/21/%d0%b4%d0%b8%d0%b2%d0%b0%d0%bd-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d1%82%d0%b0%d0%b1%d1%83%d1%80%d0%b5%d1%82%d0%ba%d0%b8/</link>
		<comments>http://saterenko.ru/2009/08/21/%d0%b4%d0%b8%d0%b2%d0%b0%d0%bd-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d1%82%d0%b0%d0%b1%d1%83%d1%80%d0%b5%d1%82%d0%ba%d0%b8/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 12:45:34 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[машина]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=117</guid>
		<description><![CDATA[Старенький пассат месяц стоял во дворе, ждал пока хозяин накопит на ремонт. Это был долгий месяц. Непогода покрыла его слоем пыли, хотя нет, в Москве это не пыль, непогода покрыла его слоем грязи. Пока он спал, кто-то подмял ему заднюю дверь. Потом приказал долго жить аккумулятор, но хозяин вовремя поменял его на новый. Пока пассат [...]]]></description>
			<content:encoded><![CDATA[<p>Старенький пассат месяц стоял во дворе, ждал пока хозяин накопит на ремонт. Это был долгий месяц. Непогода покрыла его слоем пыли, хотя нет, в Москве это не пыль, непогода покрыла его слоем грязи. Пока он спал, кто-то подмял ему заднюю дверь. Потом приказал долго жить аккумулятор, но хозяин вовремя поменял его на новый. Пока пассат ждал ремонта, хозяин катался на микре хозяйки, с механикой. Сначала ругался, потом привык и даже стал думать, что маленькая машинка на механике &#8212; это очень даже хорошо.</p>
<p>Во вторник его отвезли в больничку. Не смотря на то, что дорога была близкая, ехал он долго. Четырежды хозяин останавливался, остужал двигатель и доливал холодной воды в радиатор. А сегодня его забрали, здорового и бодренького. Заправили полный бак бензина и поехали кататься. Кататься просто так, а не по делам. Видимо хозяин соскучился, ведь старый диван всегда лучше новой табуретки <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/08/21/%d0%b4%d0%b8%d0%b2%d0%b0%d0%bd-%d0%bb%d1%83%d1%87%d1%88%d0%b5-%d1%82%d0%b0%d0%b1%d1%83%d1%80%d0%b5%d1%82%d0%ba%d0%b8/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Так ли страшен серый волк?</title>
		<link>http://saterenko.ru/2009/07/28/%d1%82%d0%b0%d0%ba-%d0%bb%d0%b8-%d1%81%d1%82%d1%80%d0%b0%d1%88%d0%b5%d0%bd-%d1%81%d0%b5%d1%80%d1%8b%d0%b9-%d0%b2%d0%be%d0%bb%d0%ba/</link>
		<comments>http://saterenko.ru/2009/07/28/%d1%82%d0%b0%d0%ba-%d0%bb%d0%b8-%d1%81%d1%82%d1%80%d0%b0%d1%88%d0%b5%d0%bd-%d1%81%d0%b5%d1%80%d1%8b%d0%b9-%d0%b2%d0%be%d0%bb%d0%ba/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 07:16:30 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[latency]]></category>

		<category><![CDATA[сеть]]></category>

		<category><![CDATA[хранилища]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=114</guid>
		<description><![CDATA[Исследовал тему хранилищ типа ключ/значение и обратил внимание, что все тесты на производительность сетевых хранилищ производились в однопоточном режиме. Типа &#8220;Tokyo Cabinet крутая бибилиотека, выдаёт порядка 17К запросов в секунду на дисковой базе данных, но через сеть (Tokyo Tyrant) всего 1.6К запросов в секунду&#8221;, а потом &#8220;latency &#8212; это зло&#8221;. Но почему-то не видел многопоточных [...]]]></description>
			<content:encoded><![CDATA[<p>Исследовал тему хранилищ типа ключ/значение и обратил внимание, что все тесты на производительность сетевых хранилищ производились в однопоточном режиме. Типа &#8220;Tokyo Cabinet крутая бибилиотека, выдаёт порядка 17К запросов в секунду на дисковой базе данных, но через сеть (Tokyo Tyrant) всего 1.6К запросов в секунду&#8221;, а потом &#8220;latency &#8212; это зло&#8221;. Но почему-то не видел многопоточных тестов, как это бывает в реальных web-приложениях со множеством фронтендов. И не видел клиентских библиотек, работающих по событийной схеме, а не по схеме &#8220;послал запрос, жду ответа, ненавижу latency&#8221;. Ведь в этих случаях latency будет не так страшна, или я где-то не прав?</p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/07/28/%d1%82%d0%b0%d0%ba-%d0%bb%d0%b8-%d1%81%d1%82%d1%80%d0%b0%d1%88%d0%b5%d0%bd-%d1%81%d0%b5%d1%80%d1%8b%d0%b9-%d0%b2%d0%be%d0%bb%d0%ba/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Российская география</title>
		<link>http://saterenko.ru/2009/03/27/%d1%80%d0%be%d1%81%d1%81%d0%b8%d0%b9%d1%81%d0%ba%d0%b0%d1%8f-%d0%b3%d0%b5%d0%be%d0%b3%d1%80%d0%b0%d1%84%d0%b8%d1%8f/</link>
		<comments>http://saterenko.ru/2009/03/27/%d1%80%d0%be%d1%81%d1%81%d0%b8%d0%b9%d1%81%d0%ba%d0%b0%d1%8f-%d0%b3%d0%b5%d0%be%d0%b3%d1%80%d0%b0%d1%84%d0%b8%d1%8f/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 08:12:55 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[ipgeobase]]></category>

		<category><![CDATA[maxmind]]></category>

		<category><![CDATA[география]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=99</guid>
		<description><![CDATA[Гео-база maxmind окончательно задолбала своими приколами, когда треть Москвы определяется как область в Великобритании. Могу себе представить как она определяет географию для других городов России. В поисках нормальной базы ip-адресов России нашёл ipgeobase.ru. Бесплатная, поддерживаемая, актуальная база для России. Но когда дело дошло до парсинга, меня её формат взбесил. Вместо того, чтобы сделать так, как [...]]]></description>
			<content:encoded><![CDATA[<p>Гео-база maxmind окончательно задолбала своими приколами, когда треть Москвы определяется как область в Великобритании. Могу себе представить как она определяет географию для других городов России. В поисках нормальной базы ip-адресов России нашёл <a href="http://ipgeobase.ru/">ipgeobase.ru</a>. Бесплатная, поддерживаемая, актуальная база для России. Но когда дело дошло до парсинга, меня её формат взбесил. Вместо того, чтобы сделать так, как делают те же maxmind, где последовательно располагаются блоки адресов, они реализовали структуру со множественными вложениями, парсер для которой, без поллитра не напишешь.</p>
<p>Поломав голову над парсером, я его родил и решил выложить доработанный скрипт для тех, кому не хочется мучаться самому <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Скачать скрипт можно тут: <a href="http://saterenko.ru/files/ipgeobase.php.gz">ipgeobase.php.gz</a>.</p>
<p>Для работы скрипта нужен файл cidr_ru_block.txt из архива <a href="http://ipgeobase.ru/files/db/Main/db_files.tar.gz">db_files.tar.gz</a>. Запускаться скрипт должен в том же каталоге, что и cidr_ru_block.txt. После работы скрипта появляются 3 файла: ipgeobase-states.dat, ipgeobase-cities.dat, ipgeobase-ips.dat. </p>
<p>В ipgeobase-states.dat храняться области в формате [идентификатор области]\t[название области].<br />
В ipgeobase-cities.dat храняться города в формате [идентификатор города]\t[идентификатор области]\t[название города].<br />
В ipgeobase-ips.dat храняться диапазоны ip-адресов в формате [IP от]\t[IP до]\t[идентификатор области]\t[идентификатор города].</p>
<p>При повторном запуске скрипт начитывает данные из ipgeobase-states.dat и ipgeobase-cities.dat (если они есть). Таким образом, при появлении новых городов или областей, идентификаторы &#8220;старых&#8221; записей не изменятся. IP храняться в виде беззнакового 32-битного числа.</p>
<p>Как-то так, надеюсь кому-то мой труд облегчит жизнь <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/03/27/%d1%80%d0%be%d1%81%d1%81%d0%b8%d0%b9%d1%81%d0%ba%d0%b0%d1%8f-%d0%b3%d0%b5%d0%be%d0%b3%d1%80%d0%b0%d1%84%d0%b8%d1%8f/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Такси в День Святого Валентина</title>
		<link>http://saterenko.ru/2009/02/15/%d1%82%d0%b0%d0%ba%d1%81%d0%b8-%d0%b2-%d0%b4%d0%b5%d0%bd%d1%8c-%d1%81%d0%b2%d1%8f%d1%82%d0%be%d0%b3%d0%be-%d0%b2%d0%b0%d0%bb%d0%b5%d0%bd%d1%82%d0%b8%d0%bd%d0%b0/</link>
		<comments>http://saterenko.ru/2009/02/15/%d1%82%d0%b0%d0%ba%d1%81%d0%b8-%d0%b2-%d0%b4%d0%b5%d0%bd%d1%8c-%d1%81%d0%b2%d1%8f%d1%82%d0%be%d0%b3%d0%be-%d0%b2%d0%b0%d0%bb%d0%b5%d0%bd%d1%82%d0%b8%d0%bd%d0%b0/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 09:52:12 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[такси]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=96</guid>
		<description><![CDATA[Вчера возникла необходимость воспользоваться такси для поездки от дома до The Real McCoy на Баррикадной. Google запросу &#8220;такси москва&#8221; выдал кучу предложений. 
В одном месте на звонок не ответили, но перезвонили через 20 минут и, не представившись, спросили зачем звонили. Это было неожиданным, потому что на сайте был указан &#8220;многоканальный телефон&#8221;, а на деле оказался [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера возникла необходимость воспользоваться такси для поездки от дома до <a href="http://www.mccoy.ru/">The Real McCoy</a> на Баррикадной. Google запросу &#8220;такси москва&#8221; выдал кучу предложений. </p>
<p>В одном месте на звонок не ответили, но перезвонили через 20 минут и, не представившись, спросили зачем звонили. Это было неожиданным, потому что на сайте был указан &#8220;многоканальный телефон&#8221;, а на деле оказался мобильный частного таксиста.</p>
<p>Вторым сайтом был <a href="http://www.500-50-50.ru/">www.500-50-50.ru</a>. Вот эти ребята натурально удивили и порадовали. Приятная девушка приняла заказ. Секунд через 10 пришла SMS-ка о том, что заказ принят, с указанием куда и в какое время подать такси. Такси было заказано на 18:30. В районе 16:30 часов пришла SMS-ка с указанием модели машины, госномером, именем водителя и его мобильным телефоном. В 18:25 пришла SMS-ка о том, что такси ждёт у подъезда. Доехали без приключений. Через минуту после приезда пришла SMS-ка со &#8220;спасибками&#8221;, указанием стоимости поездки (290 рублей) и указанием что на накопительный счёт капнуло 14 рублей. В общем, молодцы, порадовали.</p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/02/15/%d1%82%d0%b0%d0%ba%d1%81%d0%b8-%d0%b2-%d0%b4%d0%b5%d0%bd%d1%8c-%d1%81%d0%b2%d1%8f%d1%82%d0%be%d0%b3%d0%be-%d0%b2%d0%b0%d0%bb%d0%b5%d0%bd%d1%82%d0%b8%d0%bd%d0%b0/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Пулированный связный список</title>
		<link>http://saterenko.ru/2009/02/04/%d0%bf%d1%83%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d1%81%d0%b2%d1%8f%d0%b7%d0%bd%d1%8b%d0%b9-%d1%81%d0%bf%d0%b8%d1%81%d0%be%d0%ba/</link>
		<comments>http://saterenko.ru/2009/02/04/%d0%bf%d1%83%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d1%81%d0%b2%d1%8f%d0%b7%d0%bd%d1%8b%d0%b9-%d1%81%d0%bf%d0%b8%d1%81%d0%be%d0%ba/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 08:01:45 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[c]]></category>

		<category><![CDATA[оптимизация]]></category>

		<category><![CDATA[связные списки]]></category>

		<category><![CDATA[структуры данных]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=84</guid>
		<description><![CDATA[Решил поделиться недавно написанной библиотекой для организации связного списка. Реализация должна была производить минимум операций по выделению и освобождению памяти при частых операциях по добавлению, удалению и перемещению элементов внутри списка.
Основная идея, заложенная в реализацию &#8212; это использование пула выделенной памяти. Моя библиотека, реализующая пул памяти, не подразумевает повторное использование памяти, которая была освобождена всвязи [...]]]></description>
			<content:encoded><![CDATA[<p>Решил поделиться недавно написанной библиотекой для организации связного списка. Реализация должна была производить минимум операций по выделению и освобождению памяти при частых операциях по добавлению, удалению и перемещению элементов внутри списка.</p>
<p>Основная идея, заложенная в реализацию &#8212; это использование пула выделенной памяти. Моя библиотека, реализующая пул памяти, не подразумевает повторное использование памяти, которая была освобождена всвязи с удалением элемента. Писать универсальную библиотеку, которая позволяла бы использовать память повторно, не посчитал целесообразным, потому как под разные данные выделяется память разного размера и контроль за свободными кусками снизит производительность пула. В случае со связными списками, мы имеем дело с кусками памяти одного размера, а потому проблем с контролем освобождённых кусков памяти нет.<span id="more-84"></span></p>
<p>В результате получилась библиотека со следующим набором функций:</p>
<p>cor_list_t    *cor_list_init(int size);<br />
int             cor_list_pool_expand(cor_list_t *l);<br />
void           cor_list_destroy(cor_list_t *l);</p>
<p>cor_list_init &#8212; инициализация списка заданного размера (минимальный размер установлен в 16 элементов). Каждый раз, при добавлении нового элемента, когда не останеться свободных, пул будет расширятся на заданный размер. Размер стоит подобрать так, чтобы операции расширения были как можно более редкими.</p>
<p>cor_list_pool_expand &#8212; расширение списка. Эта функция вызывается при вставке новых элементов, если свободных нет. Принудительно вызывать эту функцию не требуется.</p>
<p>cor_list_destroy &#8212; освобождение памяти, занятой списком. </p>
<p>Остальные функции работы со списком написаны в виде макросов, для увеличения скорости работы:</p>
<p>#define cor_list_insert_head(_pv, _l)<br />
#define cor_list_insert_tail(_pv, _l)<br />
#define cor_list_insert_after(_pv1, _pv2, _l)<br />
#define cor_list_insert_before(_pv1, _pv2, _l)<br />
#define cor_list_delete(_pv, _l)<br />
#define cor_list_move_head(_pv, _l)<br />
#define cor_list_move_tail(_pv, _l)<br />
#define cor_list_first(_pv, _l)<br />
#define cor_list_last(_pv, _l)<br />
#define cor_list_next(_pv)<br />
#define cor_list_prev(_pv)<br />
#define cor_list_value(_pv)</p>
<p>cor_list_insert_head &#8212; вставка новго элемента (_pv) в начало списка (_l). _pv &#8212; это указатель, который указывает на встравленный элемент.</p>
<p>cor_list_insert_tail &#8212; вставка нового элемента (_pv) в конец списка (_l).</p>
<p>cor_list_insert_after &#8212; вставка нового элемента (_pv1) после элемента (_pv2) в списке (_l). </p>
<p>cor_list_insert_before &#8212; вставка нового элемента (_pv1) перед элементом (_pv2) в списке (_l).</p>
<p>cor_list_delete &#8212; удаление элемента (_pv) из списка (_l).</p>
<p>cor_list_move_head &#8212; перемещение элемента (_pv) в начало списка (_l).</p>
<p>cor_list_move_tail &#8212; перемещение элемента (_pv) в конец списка (_l).</p>
<p>cor_list_first &#8212; получение в _pv первого элемента в списке (_l).</p>
<p>cor_list_last &#8212; получение в _pv последнего элемента в списке (_l).</p>
<p>cor_list_next &#8212; получение в _pv элемента, следующего за элементом _pv. Т.е. в _pv передаётся текущий элемент, и в него же сохраняется следующий. Если достигнут конец списка, возвращается NULL.</p>
<p>cor_list_prev &#8212; получение в _pv элемента, предыдущего, по отношению к элементу _pv.</p>
<p>cor_list_value &#8212; получение значения элемента _pv.</p>
<p>Исходники: <a href="http://saterenko.ru/files/cor_list.h">cor_list.h</a>, <a href="http://saterenko.ru/files/cor_list.c">cor_list.c</a>.</p>
<p>Если кому-то пригодится, буду рад <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/02/04/%d0%bf%d1%83%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%bd%d1%8b%d0%b9-%d1%81%d0%b2%d1%8f%d0%b7%d0%bd%d1%8b%d0%b9-%d1%81%d0%bf%d0%b8%d1%81%d0%be%d0%ba/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Мыслим перпендикулярно</title>
		<link>http://saterenko.ru/2009/01/30/%d0%bc%d1%8b%d1%81%d0%bb%d0%b8%d0%bc-%d0%bf%d0%b5%d1%80%d0%bf%d0%b5%d0%bd%d0%b4%d0%b8%d0%ba%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%be/</link>
		<comments>http://saterenko.ru/2009/01/30/%d0%bc%d1%8b%d1%81%d0%bb%d0%b8%d0%bc-%d0%bf%d0%b5%d1%80%d0%bf%d0%b5%d0%bd%d0%b4%d0%b8%d0%ba%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%be/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 07:16:32 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[битовые операции]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=87</guid>
		<description><![CDATA[Продолжаем тему Битовых головоломок. Anight предложил интересную идею как можно реализовать поиск данных по битовым маскам. Сначала я не понял о чём мне говорят, но когда до меня дошло, я в очередной раз порадовался простоте и элегантности решения от anight-а.
Теперь о самом решении. Задача стоит в том, чтобы максимально быстро выбрать набор данных, удовлетворяющих некоторому [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем тему <a href="http://saterenko.ru/2009/01/29/битовые-головоломки/">Битовых головоломок</a>. <a href="http://anight.livejournal.com/">Anight</a> <a href="http://saterenko.livejournal.com/17987.html">предложил интересную идею</a> как можно реализовать поиск данных по битовым маскам. Сначала я не понял о чём мне говорят, но когда до меня дошло, я в очередной раз порадовался простоте и элегантности решения от <a href="http://anight.livejournal.com/">anight</a>-а.</p>
<p>Теперь о самом решении. Задача стоит в том, чтобы максимально быстро выбрать набор данных, удовлетворяющих некоторому набору признаков, представленных в виде битовой маски. Далее предполагается, что мы работаем со 128-битным регистрами sse.</p>
<p>Мои идеи крутились вокруг деления битовой маски на куски по 128 бит и последовательной проверки каждого слова на соответствие поисковой маске. В результате получается матрица размерностью ceil(размер битовой маски / 128) по ширине и длинной в количество записей.</p>
<p>Новая идея в том, что мы строим матрицу, где строке соответствует один бит из битовой маски, а в столбцах у нас записи. Таким образом, у нас одно слово описывает один бит у 128 записей. Получается, что за одну операцию мы проверяем один бит у 128 записей. Если у нас n бит в маске, то мы проверим 128 записей за n операций. По-моему красиво <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Из плюсов вижу более компактное хранение (у нас не будет неиспользуемых бит в слове, если размер битовой маски не кратен 128) и большую скорость работы (мы проверяем только значимые биты, например, если у нас битовая маска 150 бит, то в первом варианте нам нужно 2 проверки на каждую запись, т.е. 256 операций на 128 записей, а во втором нам нужно 150 операций для проверки 128 записей). Из минусов вижу только более сложное формирование данных и поиска.</p>
<p>ИМХО красивая реализация <img src='http://saterenko.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/01/30/%d0%bc%d1%8b%d1%81%d0%bb%d0%b8%d0%bc-%d0%bf%d0%b5%d1%80%d0%bf%d0%b5%d0%bd%d0%b4%d0%b8%d0%ba%d1%83%d0%bb%d1%8f%d1%80%d0%bd%d0%be/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Битовые головоломки</title>
		<link>http://saterenko.ru/2009/01/29/%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d1%8b%d0%b5-%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%be%d0%bb%d0%be%d0%bc%d0%ba%d0%b8/</link>
		<comments>http://saterenko.ru/2009/01/29/%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d1%8b%d0%b5-%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%be%d0%bb%d0%be%d0%bc%d0%ba%d0%b8/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 06:56:41 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[программирование]]></category>

		<category><![CDATA[битовые операции]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=82</guid>
		<description><![CDATA[Давненько я тут не писал, совсем разленился&#8230; Решил написать о чём болит голова второй день&#8230;
Всё началось с того, что решил подумать, как ускорить перебор среди элементов со множеством полей. Можно по каким-то полям сделать индекс, но покрыть индексами всё не получается. Таким образом, в некоторых случаях, придётся использовать тупой перебор. 
Первое что приходит в голову [...]]]></description>
			<content:encoded><![CDATA[<p>Давненько я тут не писал, совсем разленился&#8230; Решил написать о чём болит голова второй день&#8230;</p>
<p>Всё началось с того, что решил подумать, как ускорить перебор среди элементов со множеством полей. Можно по каким-то полям сделать индекс, но покрыть индексами всё не получается. Таким образом, в некоторых случаях, придётся использовать тупой перебор. </p>
<p>Первое что приходит в голову для ускорения перебора &#8212; использование битовых операций. Сформировал маску и пошёл AND-ом по списку, красота. Но когда наткнулся на необходимость проверить что значение больше (или меньше) заданного, впал в ступор. Если диапазон значений меньше или равен количеству бит в целом, никаких проблем нет, а если диапазон шире, ступор.</p>
<p>Вот скажите, это я такой тупой, или стандартными логическими операциями нельзя проверить что одно число больше другого?</p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2009/01/29/%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d1%8b%d0%b5-%d0%b3%d0%be%d0%bb%d0%be%d0%b2%d0%be%d0%bb%d0%be%d0%bc%d0%ba%d0%b8/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Генератор словоформ на основе aspell</title>
		<link>http://saterenko.ru/2008/12/28/%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80-%d1%81%d0%bb%d0%be%d0%b2%d0%be%d1%84%d0%be%d1%80%d0%bc-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-aspell/</link>
		<comments>http://saterenko.ru/2008/12/28/%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80-%d1%81%d0%bb%d0%be%d0%b2%d0%be%d1%84%d0%be%d1%80%d0%bc-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-aspell/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 09:11:36 +0000</pubDate>
		<dc:creator>Андрей Сатеренко</dc:creator>
		
		<category><![CDATA[контекст]]></category>

		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://saterenko.ru/?p=78</guid>
		<description><![CDATA[В своё время я достаточно долго искал словари для использования их в контексте. В результате написал на php скрипт для генерации словоформ русского языка на основе словаря aspell. Кому надо, может скачать архив.
В архиве словарь aspell для русского языка в формате utf-8 и два скрипта, которые генерируют словоформы с разным форматом вывода. В результате получается [...]]]></description>
			<content:encoded><![CDATA[<p>В своё время я достаточно долго искал словари для использования их в контексте. В результате написал на php скрипт для генерации словоформ русского языка на основе словаря aspell. Кому надо, может <a href="http://saterenko.ru/files/dictionary.zip">скачать архив</a>.</p>
<p>В архиве словарь aspell для русского языка в формате utf-8 и два скрипта, которые генерируют словоформы с разным форматом вывода. В результате получается порядка 1.3М словоформ.</p>
]]></content:encoded>
			<wfw:commentRss>http://saterenko.ru/2008/12/28/%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80-%d1%81%d0%bb%d0%be%d0%b2%d0%be%d1%84%d0%be%d1%80%d0%bc-%d0%bd%d0%b0-%d0%be%d1%81%d0%bd%d0%be%d0%b2%d0%b5-aspell/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
