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

<channel>
	<title>Записки программиста &#187; arti</title>
	<atom:link href="http://arti.kz/author/arti/feed" rel="self" type="application/rss+xml" />
	<link>http://arti.kz</link>
	<description></description>
	<lastBuildDate>Fri, 17 Jun 2011 03:56:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>2011 или все-таки 2010?</title>
		<link>http://arti.kz/1045-2011-%d0%b8%d0%bb%d0%b8-%d0%b2%d1%81%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8-2010</link>
		<comments>http://arti.kz/1045-2011-%d0%b8%d0%bb%d0%b8-%d0%b2%d1%81%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8-2010#comments</comments>
		<pubDate>Mon, 03 Jan 2011 07:12:00 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[ISO year]]></category>
		<category><![CDATA[Zend_Date]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=1045</guid>
		<description><![CDATA[Наткнувшись на эту запись: Осторожно: Ваш iPhone тоже празднует, довольно ухмыльнулся, как счастливый пользователь Android. Но не тут-то было &#8211; как оказалось, не только продукция Apple обладает таким интересным свойством. К счастью, Android не был подвержен этой &#171;фиче&#187; (или я этого не заметил), однако, например, невнимательное использование Zend_Date вело к тому, что 1 и 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Наткнувшись на эту запись: <a href="http://habrahabr.ru/blogs/apple/111069/">Осторожно: Ваш iPhone тоже празднует</a>, довольно ухмыльнулся, как счастливый пользователь Android. Но не тут-то было &#8211; как оказалось, не только продукция Apple обладает таким интересным свойством. К счастью, Android не был подвержен этой &laquo;фиче&raquo; (или я этого не заметил), однако, например, невнимательное использование Zend_Date вело к тому, что 1 и 2 января 2011 года отображались как 1 и 2 января 2010. Все дело в использовании конструкции типа $date-&gt;toString(&#8216;YYYY&#8230;&#8217;), что кажется вполне безопасным. Однако из документации можно узнать, что заглавная Y означает номер года в стандарте ISO, который, в свою очередь, начинается с недели, в которую попадает первый четверг нового года по григорианскому календарю. Первый четверг 2011 года это 6 января, значит по ISO новый год начинется 3-го января, а 1 и 2-е относятся к 2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/1045-2011-%d0%b8%d0%bb%d0%b8-%d0%b2%d1%81%d0%b5-%d1%82%d0%b0%d0%ba%d0%b8-2010/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разбор задач 3-го этапа Республиканской олимпиады школьников</title>
		<link>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be</link>
		<comments>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be#comments</comments>
		<pubDate>Sun, 17 May 2009 15:26:35 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=930</guid>
		<description><![CDATA[Олимпиада прошла давно, но немного времени для разбора нашлось только сейчас. Архив олимпиады (задачи, тесты и решения) можно найти где обычно. Задача А. Мухи Задача является вариацией довольно известной математической задачи. Главное &#8211; понять, что каждая муха всегда будет двигаться строго к соседке. В этом случае скорости мух всегда будут направлены друг к другу под [...]]]></description>
			<content:encoded><![CDATA[<p>Олимпиада прошла давно, но немного времени для разбора нашлось только сейчас. Архив олимпиады (задачи, тесты и решения) можно найти <a title="Архив 3-го этапа Республиканской олимпиады 2009" href="http://olympiads.kz/node/192">где обычно</a>.</p>
<h3>Задача А. Мухи</h3>
<p>Задача является вариацией довольно известной математической задачи. Главное &#8211; понять, что каждая муха всегда будет двигаться строго к соседке. В этом случае скорости мух всегда будут направлены друг к другу под одним углом, а рассматривая движение с точки зрения какой-то из мух, можно заметить, что на расстояние между ней и соседкой влияет ее скорость и проекция скорости соседки на прямую, содержащую скорость этой мухи. В результате получим, что время, через которое мухи встретятся равно T = D / (V + V cos(? &#8211; 2 ? / N)). Ну а расстояние, которое пройдет каждая из мух, легко вычисляется по магической формуле: S = VT = D / (1 + cos(? &#8211; 2 ? / N)).</p>
<h3>Задача B. Числа</h3>
<p>Из-за небольших ограничений задачу можно было решать множеством разных способов. Один из них &#8211; воспользоваться довольно стандартным приемом в таких задачах. Сначала немного преобразуем задачу: посчитаем, сколько раз будет выписана каждая цифра от 1 до 9, а затем посчитаем сумму. Заметим, что F(A, B, Y) = F(1, B, Y) &#8211; F(1, A &#8211; 1, Y), где A, B &#8211; границы интервала, а Y &#8211; цифра, количество которой считается. Теперь научимся считать F(1, X, Y). Для этого сначала предподсчитаем D[N] = F(1, 10^N &#8211; 1, 1). Это несложно делается по рекуррентному соотношению D[N] = D[N - 1] * 10 + 10 ^ (N &#8211; 1). Далее нужно разложить X на цифры и считать количество чисел с заданным префиксом, который нужно перебирать. Здесь проще привести код:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">i64 count<span style="color: #008000;">&#40;</span>i64 x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	i64 result <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> n <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
		a<span style="color: #008000;">&#91;</span>n<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> x <span style="color: #000040;">%</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
		x <span style="color: #000040;">/</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000040;">&amp;</span>gt<span style="color: #008080;">;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> t <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				<span style="color: #000040;">++</span>t<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			result <span style="color: #000040;">+</span><span style="color: #000080;">=</span> D<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> t <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>j <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				<span style="color: #000040;">--</span>t<span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #000040;">++</span>t<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	result <span style="color: #000040;">+</span><span style="color: #000080;">=</span> t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> result<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><span id="more-930"></span></p>
<h3>Задача C. Опасный маршрут</h3>
<p>Один из вариантов решения &#8211; использовать алгоритм Краскала для построения остовного дерева. Уберем из графа все ребра и будем добавлять их обратно в порядке увеличения стоимости. Как только образуется путь из вершины 1 в вершину N &#8211; следует остановиться и вывести стоимость последнего добавленного ребра.</p>
<h3>Задача D. Горки</h3>
<p>В этой задаче также существует множество подходов. Ну а то, что в качестве ответа нужно вывести только сумму высот, добавляется множество алгоритмов, строящих неправильную последовательность, но дающих правильную сумму. Вот один из подходов. Главная проблема в этой задаче &#8211; это наличие одинаковых элементов в количестве превышающем (N + 1) / 2. Если таковых элементов нет, то всегда можно построить N / 2 горок с N / 2 наибольшими числам в качестве высот. Если же такие элементы есть, то нужно действовать хитрее. Допустим, что наиболее часто встречающееся число равно K. Если имеются числа, большие K, то используем их в качестве высот горок из двух элементов, один из которых будет равен K. Поместим эти горки в начале последовательности. В оставшейся части также будем строить горки из двух элементов (пока это возможно), но наибольшим элементом в каждой из них будет уже K.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> l <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k <span style="color: #000040;">!</span><span style="color: #000080;">=</span> m<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> MAXN<span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> k<span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			b<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
			<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			b<span style="color: #008000;">&#91;</span>l<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
			<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> r <span style="color: #000080;">=</span> n <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> k<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r <span style="color: #000080;">&lt;</span> l<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		b<span style="color: #008000;">&#91;</span>r<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> k<span style="color: #008080;">;</span>
		<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r <span style="color: #000080;">&lt;</span> l<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		b<span style="color: #008000;">&#91;</span>r<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
		<span style="color: #000040;">--</span>c<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<h3>Задача E. Синоптики</h3>
<p>Также несложная задача на использование стека. Пройдем по последовательности слева направо и будем выполнять следующие действия для каждого числа: вытащим из стека все числа, меньшие текущего числа, а затем добавим это число. При этом, число на верхушке стека перед добавлением нового числа будет указывать на искомый день.</p>
<h3>Задача F. Телепорт</h3>
<p>Построим граф, определяемый условием задачи. При этом в качестве стоимости ребер, означающих маршруты дирижаблей, положим стоимости этих билетов на эти дирижабли, а в качестве стоимости ребер между планетами возьмем большое число, например, 10^6. Затем запустим на этом графе обычный алгоритм Дейкстры. Понятно, что наилучший путь будет использовать как можно меньше переходов между планетами из-за их большой стоимости. Пусть в результате получено число X, тогда количество переходов между планетами будет равно X / 10^6, а стоимость маршрута &#8211; X % 10^6.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/930-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-3-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Qwit 0.8 &#8211; it&#039;s finally here!</title>
		<link>http://arti.kz/843-qwit-08-its-finally-here</link>
		<comments>http://arti.kz/843-qwit-08-its-finally-here#comments</comments>
		<pubDate>Sun, 01 Mar 2009 16:11:08 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Qwit]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=843</guid>
		<description><![CDATA[Сегодня собрал и залил очередную версию Qwit. Этот релиз &#8211; первый, с тех пор как у проекта появилась команда: в течение последнего месяца мне предложили помощь несколько человек. Главная особенность релиза &#8211; наконец-то появились Direct Messages и поиск, спасибо Валентину. Также имеется конфигурируемый ReTweet, за что спасибо kiracatgirl. Ну и перевод на турецкий язык от [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-844" title="Qwit" src="http://arti.kz/wp-content/uploads/2009/03/qwit-219x300.png" alt="Qwit" width="219" height="300" />Сегодня собрал и залил очередную версию <strong>Qwit</strong>. Этот релиз &#8211; первый, с тех пор как у проекта появилась команда: в течение последнего месяца мне предложили помощь несколько человек. Главная особенность релиза &#8211; наконец-то появились Direct Messages и поиск, спасибо <a title="Рабочие будни" href="http://gritsinger.com"><strong>Валентину</strong></a>. Также имеется конфигурируемый ReTweet, за что спасибо <strong>kiracatgirl</strong>. Ну и перевод на турецкий язык от <strong>U?ur ?etin</strong>. А также несколько бакфиксов и возможность использовать twitter-compatible сервисы (типа identi.ca) от меня.</p>
<p>Скачать собранные пакеты для Linux и Windows можно как всегда на <a title="Qwit" href="http://code.google.com/p/qwit/">http://code.google.com/p/qwit/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/843-qwit-08-its-finally-here/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Автоматическое переключение прокси</title>
		<link>http://arti.kz/809-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8</link>
		<comments>http://arti.kz/809-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8#comments</comments>
		<pubDate>Mon, 16 Feb 2009 18:58:36 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Lifehack]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=809</guid>
		<description><![CDATA[В прошлый раз я писал о том, как можно настроить прокси сразу во всех браузерах. Там была такая фраза: &#171;Процедура смены прокси: приходим домой &#8211; раскоментируем первую строку, на работу &#8211; комментируем. Да и скриптик для это несложно написать.&#187; Ну вот собственно я и написал: #!/bin/bash &#160; if /sbin/iwconfig 2&#62;/dev/null &#124; grep &#34;wlan0.*home&#34; then cp [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-810" title="Opera" src="http://arti.kz/wp-content/uploads/2009/02/operalogo.png" alt="Opera" width="179" height="150" />В прошлый раз я писал о том, как можно <a href="http://arti.kz/722-настройка-прокси-во-всех-браузерах/" title="Настройка прокси во всех браузерах одновременно">настроить прокси сразу во всех браузерах</a>. Там была такая фраза: &laquo;Процедура смены прокси: приходим домой &#8211; раскоментируем первую строку, на работу &#8211; комментируем. Да и скриптик для это несложно написать.&raquo; Ну вот собственно я и написал:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>iwconfig <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;wlan0.*home&quot;</span>
<span style="color: #000000; font-weight: bold;">then</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac.home <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac
<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>iwconfig <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;wlan0.*work&quot;</span>
<span style="color: #000000; font-weight: bold;">then</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac.work <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac
<span style="color: #000000; font-weight: bold;">else</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac.home <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>proxy.pac
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<p>home &#8211; название сети дома, work &#8211; на работе.</p>
<p>Ну а для полного счастья вызов скрипта добавляется в cron с периодичностью в 1 минуту:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>arti<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>setupProxy.sh</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://arti.kz/809-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%be%d0%b5-%d0%bf%d0%b5%d1%80%d0%b5%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Настройка прокси во всех браузерах одновременно</title>
		<link>http://arti.kz/722-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%b1%d1%80%d0%b0%d1%83%d0%b7%d0%b5%d1%80%d0%b0%d1%85</link>
		<comments>http://arti.kz/722-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%b1%d1%80%d0%b0%d1%83%d0%b7%d0%b5%d1%80%d0%b0%d1%85#comments</comments>
		<pubDate>Tue, 27 Jan 2009 11:01:15 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Lifehack]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=722</guid>
		<description><![CDATA[Мне по долгу службы часто приходится менять настройки прокси на своем ноутбуке: дома прокси нет, на работе один прокси, в универе &#8211; другой. Ну а то, что я пользуюсь несколькими браузерами, и централизованное место установки прокси в KDE у них не уважается только усугубляет положение. Постоянно залазить в одни и те же настройки, менять исключения [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-746" title="Internet" src="http://arti.kz/wp-content/uploads/2009/01/internet.png" alt="Internet" width="189" height="200" />Мне по долгу службы часто приходится менять настройки прокси на своем ноутбуке: дома прокси нет, на работе один прокси, в универе &#8211; другой. Ну а то, что я пользуюсь несколькими браузерами, и централизованное место установки прокси в KDE у них не уважается только усугубляет положение. Постоянно залазить в одни и те же настройки, менять исключения и т.п. &#8211; надоедает довольно быстро. Решил я от этого избавиться и нашел довольно симпатичный способ &#8211; может кому-то тоже пригодится.</p>
<p>Наверное многие замечали в настройках прокси почти любой программы поле &laquo;<strong>Автоматическая конфигурация прокси</strong>&raquo; куда просили ввести адрес скрипта конфигурации. Как оказалось, этот скрипт &#8211; <strong>PAC-файл</strong> (proxy auto-config) просто функция на JavaScript, что позволяет довольно просто и удобно вводить гибкие правила и исключения для прокси.</p>
<p>Вот пример простой настройки:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> FindProxyForURL<span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span> host<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// Эта строка для домашнего интернета</span>
<span style="color: #006600; font-style: italic;">//	return &quot;DIRECT&quot;;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Все остальное для рабочего</span>
<span style="color: #006600; font-style: italic;">// Local</span>
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>shExpMatch<span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;*://localhost/*&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> shExpMatch<span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;*.localhost/*&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> shExpMatch<span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;*.lo/*&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;DIRECT&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// Work</span>
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>shExpMatch<span style="color: #009900;">&#40;</span>url<span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;*://work.kz/*&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;DIRECT&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;PROXY 12.34.56.78:9000&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Скрипт помещается в любое место и в поле &laquo;Автоматическая конфигурация прокси&raquo; во всех программах вводится полный путь к нему. Например, /home/arti/proxy.pac.</p>
<p>Процедура смены прокси: приходим домой &#8211; раскоментируем первую строку, на работу &#8211; комментируем. Да и скриптик для это несложно написать. Точно работает в Linux и должно работать в Windows.</p>
<p><span id="more-722"></span></p>
<hr style="width: 20%;" />Любите смотреть <a href="http://t-films.ru/">фильмы онлайн</a>. Тогда вам сюда!</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/722-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d0%ba%d1%81%d0%b8-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-%d0%b1%d1%80%d0%b0%d1%83%d0%b7%d0%b5%d1%80%d0%b0%d1%85/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Qwit 0.7</title>
		<link>http://arti.kz/718-qwit-07</link>
		<comments>http://arti.kz/718-qwit-07#comments</comments>
		<pubDate>Tue, 27 Jan 2009 04:48:33 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Qwit]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=718</guid>
		<description><![CDATA[А тем временем разработка клинта для твиттера Qwit понемногу продвигается. К Новому году я собрал все что было в SVN в очередную версию. Основные изменения: кэширование сообщений &#8211; теперь при очередном запуске Qwit старые сообщения берутся с диска; пересмотрена структура диалога настроек &#8211; используются табы; ну и как всегда пофиксены маленькие баги. Скачать архив с [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" title="Qwit" src="http://arti.kz/wp-content/uploads/2008/08/qwit-home4-202x300.png" alt="" />А тем временем разработка <strong>клинта для твиттера Qwit</strong> понемногу продвигается. К Новому году я собрал все что было в SVN в очередную версию.</p>
<p>Основные изменения:</p>
<ul>
<li><strong>кэширование сообщений</strong> &#8211; теперь при очередном запуске <strong>Qwit</strong> старые сообщения берутся с диска;</li>
<li>пересмотрена структура <strong>диалога настроек</strong> &#8211; используются табы;</li>
<li>ну и как всегда пофиксены <strong>маленькие баги</strong>.</li>
</ul>
<p>Скачать архив с исходными текстами или бинарную версию можно с со страницы на <a title="Qwit на Google Code" href="http://code.google.com/p/qwit">Google Code</a> или на <a title="Qwit на KDE-Apps" href="http://www.kde-apps.org/content/show.php/Qwit?content=90792">KDE-Apps</a>.</p>
<p>Ну а в SVN уже есть 2 перевода: на турецкий и русский языки.<br />
<span id="more-718"></span></p>
<hr style="width: 20%;" />А этот проект будет интересен тем, кто участвует в <a href="http://yaci.ru/linkomauliya/">линкомаулии</a>. Участники в реальном времени могу общаться, следить за результатами и последними статьями из блогосферы на эту тему.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/718-qwit-07/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разбор задач 2-го этапа Республиканской олимпиады школьников</title>
		<link>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be</link>
		<comments>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be#comments</comments>
		<pubDate>Thu, 22 Jan 2009 15:41:24 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=671</guid>
		<description><![CDATA[На прошлой неделе буквально одновременно с V Международной Жаутыковской олимпиадой прошел 2-й этап Республиканской олимпиады школьников, для Алматы являющийся районным. Задачи были довольно несложные, но для полного решения требовалась некоторая сообразительность. Условия задач, тесты к ним и решения как всегда можно найти в правильном месте. Задача A. Окружность Во-первых, будем считать, что A1 &#60; B1 [...]]]></description>
			<content:encoded><![CDATA[<p>На прошлой неделе буквально одновременно с <strong>V Международной Жаутыковской олимпиадой</strong> прошел<strong> 2-й этап Республиканской олимпиады школьников</strong>, для Алматы являющийся районным. Задачи были довольно несложные, но для полного решения требовалась некоторая сообразительность. <strong>Условия задач</strong>, <strong>тесты</strong> к ним и <strong>решения</strong> как всегда можно найти в <a title="Архив II этапа Республиканской олимпиады 2009 года" href="http://olympiads.kz/node/179">правильном месте</a>.</p>
<h3>Задача A. Окружность</h3>
<p>Во-первых, будем считать, что A1 &lt; B1 и A2 &lt; B2 (если это не так, то добьемся этого поменяв числа в соответствующей паре местами). Далее, нарисовав один-два случая можно заметить, что хорды будут пересекаться или касаться только в трех случаях:</p>
<ul>
<li>они совпадают, то есть обе вершины общие:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>B1 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
<li>одна вершина общая:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">==</span> B1<span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">==</span> B2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
<li>вершины разные, и для каждой хорды выполняется следующее условие: если окружность разрезать по этой хорде, то вершины другой хорды должны быть в разных частях окружности:

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">&lt;</span> A2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>A2 <span style="color: #000080;">&lt;</span> B1<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>A1 <span style="color: #000080;">&lt;</span> B2<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>B2 <span style="color: #000080;">&lt;</span> B1<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span></pre></div></div>

</li>
</ul>
<p>Все решение заключается в проверке этих трех условий.</p>
<p><span id="more-671"></span></p>
<h3>Задача B. Делители</h3>
<p>Пусть число Z имеет делитель X. Это значит, что существует такое целое положительное Y, что Z = X * Y. Однако, отсюда следует, что и Y является делителем Z. То есть для любого делителя X &lt; sqrt(Z) найдется также делитель Y &gt; sqrt(Z) и наоборот. Получаем, что наличие у числа Z делителя не равного sqrt(Z) не влияет на четность количества делителей. Осталось два случая:</p>
<ul>
<li>sqrt(Z) &#8211; целое число (соответственно, являющееся делителем Z), тогда ко всем парным делителям добавляется один непарный, и количество делителей получается нечетным;</li>
<li>sqrt(Z) &#8211; нецелое число, тогда количество делителей не изменяется и остается четным.</li>
</ul>
<p>Таким образом, задача сводится к определению, является ли Z квадратом целого числа. Ну а проверить это можно, десятком различных способов: от взятия вещественного корня до бинарного поиска.</p>
<h3>Задача C. Выгода</h3>
<p>Интуиция просто умоляет отсортировать оба массива по убыванию и вывести сумму A[i] * B[i] для всех i от 1 до min(N, M) в качестве ответа.И, как ни странно, это решение будет правильным.</p>
<p>Понятно, почему нужно брать наибольшие min(N, M) чисел из каждого массива. Докажем, почему произведения нужно брать именно в таком порядке.</p>
<p>Оставим в каждом массиве по K = min(N, M) наибольших чисел. Затем отсортируем массив A по убыванию. Теперь нужно расставить числа в массиве B так, чтобы сумма A[i] * B[i] была оптимальным ответом.</p>
<p>Общий метод решения в таких случаях следующий: возьмем два соседних элемента, посчитаем искомую функцию в обоих возможных порядках и посмотрим, какое условие должно выполняться для оптимального ответа.</p>
<p>В нашем конкретном случае:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>
&nbsp;
B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> A<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span></pre></div></div>

<p>помня, что A[i] &gt; A[i + 1], разделим обе части на A[i] &#8211; A[i + 1]:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> B<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span></pre></div></div>

<p>Таким образом, получили, что массив B также должен быть отсортирован по убыванию.</p>
<h3>Задача D. Лень</h3>
<p>Пусть ученик выучит X вопросов. Тогда в худшем случае N &#8211; A из них ему не попадутся на экзамене. Ну а остальных должно быть не меньше B чтобы получить пятерку. В общем, получается нужно выучить N &#8211; A + B вопросов.</p>
<h3>Задача E. Спираль</h3>
<p>Стандартная и довольно известная задача на реализацию. Нужно просто сделать то, что просят в задаче.</p>
<h3>Задача F. Степень</h3>
<p>Самая интересная задача и контеста. Во-первых, понятно, что нужно использовать быстрое возведение в степень. Но возникает проблема &#8211; при возведении в степень нужно считать промежуточные произведения довольно больших чисел, которое не вмещается в int64. В качестве обходного пути можно предложить посчитать произведение двух чисел, используя алгоритм быстрого возведения в степень. Более точно смотрите статью о <a title="A * B % C" href="http://arti.kz/18-a-b-c/">вычислении A * B % C</a>.</p>
<hr style="width: 20%;" />Дом Игрушки &laquo;Макси Тойз&raquo; предлагает <a href="http://www.maxitoys.ru/">детские игрушки оптом</a>. Товары отвечает самым строгим требованиям качества и безопасности!</p>
<p>Собрались делать ремонт? Заменить старые окна поможет <a href="http://www.oknamaster.ru/">www.oknamaster.ru &#8211; компания</a> предлагает производство и монтаж пластиковых окон в Москве.</p>
<p>А вы знали, что бывает <a href="http://www.urcomcity.ru">лицензия на вывоз мусора</a>? Разобраться с этим и другими видами лицензий поможет Юркомсити.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/671-%d1%80%d0%b0%d0%b7%d0%b1%d0%be%d1%80-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87-2-%d0%b3%d0%be-%d1%8d%d1%82%d0%b0%d0%bf%d0%b0-%d1%80%d0%b5%d1%81%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%b0%d0%bd%d1%81%d0%ba%d0%be/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Об одном алгоритме поиска простых чисел</title>
		<link>http://arti.kz/555-%d0%be%d0%b1-%d0%be%d0%b4%d0%bd%d0%be%d0%bc-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b5-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d1%81%d1%82%d1%8b%d1%85-%d1%87%d0%b8%d1%81</link>
		<comments>http://arti.kz/555-%d0%be%d0%b1-%d0%be%d0%b4%d0%bd%d0%be%d0%bc-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b5-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d1%81%d1%82%d1%8b%d1%85-%d1%87%d0%b8%d1%81#comments</comments>
		<pubDate>Sat, 10 Jan 2009 14:44:03 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Алгоритмы]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=555</guid>
		<description><![CDATA[Как-то, ради интереса, я решил поискать в Сети материалы о нахождении всех простых чисел в диапазоне от 1 до N за линейное время. Нашлись некоторые статьи на английском, но описанные алгоритмы были несколько сложны для реализации. К сожалению, поиски на русском не увенчались успехом &#8211; были какие-то оптимизации, пытающиеся уменьшить объем памяти, константу в оценке [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ru.wikipedia.org/wiki/Эратосфен"><img class="alignright size-full wp-image-598" title="Эратосфен" src="http://arti.kz/wp-content/uploads/2009/01/eratosthenes.jpg" alt="Эратосфен" width="200" height="279" /></a><em>Как-то, ради интереса, я решил поискать в Сети материалы о нахождении всех <a title="Простое число" href="http://ru.wikipedia.org/wiki/Простое_число">простых чисел</a> в диапазоне от 1 до N за линейное время. Нашлись некоторые статьи на английском, но описанные алгоритмы были несколько сложны для реализации. К сожалению, поиски на русском не увенчались успехом &#8211; были какие-то оптимизации, пытающиеся уменьшить объем памяти, константу в оценке времени, но ничего за O(N), так что я решил восполнить данный пробел.</em></p>
<h3>Определение проблемы</h3>
<p>Для начала, вспомним, что существует так называемое <a title="Решето Эратосфена" href="http://ru.wikipedia.org/wiki/Решето_Эратосфена">решето Эратосфена</a>, позволяющее решать нашу задачу за O(N ln ln N):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">bool</span> notPrime<span style="color: #008000;">&#91;</span>MAXN <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> primes<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> sieve<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> primesCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> sqrt_n <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">sqrt</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span>n<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>notPrime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			primes<span style="color: #008000;">&#91;</span>primesCount<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000080;">&lt;=</span> sqrt_n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> i <span style="color: #000040;">*</span> i<span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;=</span> n<span style="color: #008080;">;</span> j <span style="color: #000040;">+</span><span style="color: #000080;">=</span> i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
					notPrime<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> primesCount<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Почему решето работает не за линейное время? Потому что одно число в нем может вычеркиваться несколько раз (во внутреннем цикле) . Если добиться, чтобы каждое число вычеркивалось не более одного раза, то, очевидно, алгоритм будет линейным.</p>
<p><span id="more-555"></span></p>
<h3>Решение</h3>
<p>Чтобы сделать это, нам понадобится заменить массив <strong>notPrime[]</strong> на массив <strong>int leastPrime[MAXN + 1]</strong>. <strong>leastPrime[x]</strong> будет хранить индекс минимального простого числа в <strong>primes[]</strong>, на которое делится <strong>x</strong>. Очевидно, что <strong>primes[leastPrime[x]] = x</strong> для простого <strong>x</strong>. Также, вместо того чтобы вычеркивать числа вида <strong>k * i</strong>, где <strong>i</strong> &#8211; простое, будем вычеркивать числа вида <strong>primes[k] * i</strong>, где <strong>i</strong> &#8211; это любое число, а <strong>primes[k] &lt;= primes[leastPrime[i]</strong>]:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> leastPrime<span style="color: #008000;">&#91;</span>MAXN <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> primes<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> advancedSieve<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> n<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> primesCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;=</span> n<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>leastPrime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			primes<span style="color: #008000;">&#91;</span>primesCount<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
			leastPrime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> primesCount<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> leastPrime<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>j<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> t <span style="color: #000080;">=</span> primes<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> i<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t <span style="color: #000080;">&lt;=</span> n<span style="color: #008000;">&#41;</span> leastPrime<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> j <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> primesCount<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Так как любое составное число однозначно представимо в виде <strong>primes[k] * i</strong>, где <strong>primes[k] &lt;= primes[leastPrime[i]]</strong>, то каждое из них в цикле во внутреннем цикле будет пройдено ровно один раз. Также ровно один раз в перед внутренним циклом будет обработано каждое простое число. Таким образом, каждое из чисел обрабатывается ровно один раз и, следовательно, получаем линейный алгоритм.</p>
<h3>Заключение</h3>
<p>На практике алгоритм работает примерно в 2 раза быстрее приведенного простого варианта решета и примерно столько же, сколько и оптимизированный вариант.</p>
<p>Преимущества алгоритма:</p>
<ul>
<li>линейная оценка времени работы (против O(N ln ln N) у решета)</li>
<li>параллельно с простыми числами алгоритм вычисляет минимальный простой делитель каждого числа от 1 до N, что позволяет, если нужно, производить разложение чисел на простые множители за время, линейное от количества множителей.</li>
</ul>
<p>Недостатки алгоритма:</p>
<ul>
<li>большая константа из-за постоянного умножения во внутреннем цикле, избавится от которого пока не понятно как;</li>
<li>требования к памяти: алгоритм требует обязательного хранения списка простых чисел (в простом решете это необязательно), а также массива длины O(N), причем для каждого числа необходимо хранить количество битов, вмещающее sqrt(N) (против решета, в котором для одного числа достаточно хранить один бит).</li>
</ul>
<p>Файлы:</p>
<ul>
<li><a href="http://arti.kz/wp-content/uploads/2009/01/sieve-vanilla.cpp">простое решето</a>;</li>
<li><a href="http://arti.kz/wp-content/uploads/2009/01/sieve-optimized.cpp">оптимизированный вариант простого решета</a>;</li>
<li><a href="http://arti.kz/wp-content/uploads/2009/01/advanced-sieve-vanilla.cpp">продвинутое решето</a>;</li>
<li><a href="http://arti.kz/wp-content/uploads/2009/01/advanced-sieve-optimized.cpp">оптимизированный вариант продвинутого решета</a>.</li>
</ul>
<p><strong>P.S.</strong> Спасибо <strong>Андрею Лопатину</strong>, который рассказал об этом алгоритме на школьных сборах, где я и подслушал его.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/555-%d0%be%d0%b1-%d0%be%d0%b4%d0%bd%d0%be%d0%bc-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc%d0%b5-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0-%d0%bf%d1%80%d0%be%d1%81%d1%82%d1%8b%d1%85-%d1%87%d0%b8%d1%81/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Screencast: TopCoder SRM 430</title>
		<link>http://arti.kz/603-screencast-topcoder-srm-430</link>
		<comments>http://arti.kz/603-screencast-topcoder-srm-430#comments</comments>
		<pubDate>Wed, 07 Jan 2009 06:54:46 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Олимпиады]]></category>
		<category><![CDATA[Скринкасты]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=603</guid>
		<description><![CDATA[Очередной screencast &#8211; TopCoder Single Round Match 430. Не очень удачный, но демонстрирует терпение и настойчивость Залито на RuTube по причине временного запрета загрузки на Kiwi. Музыка для фона отсюда: http://www.penmachine.com/podcast/. Ну а после просмотра скринкаста, можно почитать про мировой экономический кризис: статьи, факты, мнения, выводы.]]></description>
			<content:encoded><![CDATA[<p>Очередной screencast &#8211; TopCoder Single Round Match 430. Не очень удачный, но демонстрирует терпение и настойчивость <img src='http://arti.kz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Залито на RuTube по причине временного запрета загрузки на Kiwi.</p>
<p style="text-align: center;">
<object width="470" height="353"><param name="movie" value="http://video.rutube.ru/9f7e94ae227323fc2df17c301ee72e55"></param><param name="wmode" value="window"></param><param name="allowFullScreen" value="true"></param><embed src="http://video.rutube.ru/9f7e94ae227323fc2df17c301ee72e55" type="application/x-shockwave-flash" wmode="window" width="470" height="353" allowFullScreen="true" ></embed></object>
</p>
<p>Музыка для фона отсюда: <a title="Penmachine Podcast" href="http://www.penmachine.com/podcast/">http://www.penmachine.com/podcast/</a>.</p>
<p><span id="more-603"></span></p>
<hr style="width: 25%;" />Ну а после просмотра скринкаста, можно почитать про <a href="http://crisis-huisis.ru/">мировой экономический кризис</a>: статьи, факты, мнения, выводы.</p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/603-screencast-topcoder-srm-430/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Chroot как средство усмирения пингвинов</title>
		<link>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2</link>
		<comments>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2#comments</comments>
		<pubDate>Wed, 24 Dec 2008 17:57:20 +0000</pubDate>
		<dc:creator>arti</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://arti.kz/?p=488</guid>
		<description><![CDATA[Многие пользователи GNU/Linux любят устраивать holywars по поводу, какой же дистрибутив лучше: приходя в новый коллектив пытаются поставить на сервер их &#171;единственный верный&#187; Gentoo/Debian/Slackware вместо &#171;убогих&#187; RedHat/Ubuntu, им начинают противостоять злые админы и просто иноверцы и так далее. Описанный далее прием позволяет без особого ущерба нервной системе обеим сторонам работать в своем любимом окружении на [...]]]></description>
			<content:encoded><![CDATA[<p><em><img class="alignright size-full wp-image-491" title="Дерущиеся пингвины" src="http://arti.kz/wp-content/uploads/2008/12/penguins.jpg" alt="Дерущиеся пингвины" width="250" height="171" />Многие пользователи GNU/Linux любят устраивать holywars по поводу, какой же дистрибутив лучше: приходя в новый коллектив пытаются поставить на сервер их &laquo;единственный верный&raquo; Gentoo/Debian/Slackware вместо &laquo;убогих&raquo; RedHat/Ubuntu, им начинают противостоять злые админы и просто иноверцы и так далее. Описанный далее прием позволяет без особого ущерба нервной системе обеим сторонам работать в своем любимом окружении на одной и той же машине одновременно.</em></p>
<p>Те, кто имел опыт работы в <strong>Gentoo</strong>, знают, насколько продумана и удобна здесь система <strong>установки пакетов из исходных кодов</strong>: автоматическое установка зависимостей, управление параметрами компиляции и т.д. Но, к сожалению, не всегда на рабочем сервере удается поставить ту систему, которую мы хотим, и приходится работать с тем, что есть. Так было и в этот раз&#8230;</p>
<p>Сначала опишу типичный процесс компиляции на системах отличных от <strong>Gentoo</strong>, а потом расскажу, как все замечательно в ней, и как добиться этого же где угодно. Показывать буду на примере одного пакета и одной системы, но большая часть сказанного относится и к любым другим конфигурациям. В качестве систем используются: &laquo;убогий&raquo; <strong>RedHat-like</strong> дистрибутив и &laquo;единственно верная&raquo; <strong>Gentoo</strong>.</p>
<p><span id="more-488"></span></p>
<p>Для работы над одним проектом мне необходимо было установить <a title="VLC" href="http://www.videolan.org/"><strong>VLC</strong></a> на сервер, на котором крутилась система на основе <strong>RedHat</strong>. В процессе изучения вопроса было выяснено, что под <strong>RedHat</strong> и ему подобное имеется только, насколько я понял, сторонняя сборка версии 0.8.6 (для сравнения, последняя версия <strong>VLC</strong> &#8211; 0.9.8a), что не вполне приемлемо для данного вида ПО (имеется ввиду, что linux-софт для обработки мультимедиа сейчас активно развивается, и в новых версиях могут быть жизненно необходимые возможности). Таким образом было принято решение &#8211; ставить из исходников. So, let&#8217;s have game started!</p>
<p><strong>Level 1</strong></p>
<p>Скачан архив, запущен стандартный <strong>./configure</strong> и началось: у тебя нету библиотеки <strong>xxx</strong>, добавь опцию <strong>&#8211;disable-xxx</strong> или установи эту библиотеку и начни сначала. И так несколько раз подряд, пока не надоело. Изучение вопроса продолжилось, в результате чего был найден каталог <strong>extras/contrib</strong>, в нем скрипт <strong>bootstrap</strong>, создающий <strong>Makefile</strong>, благодаря которому все зависимости (в идеале) должны сами скачаться и откомпилироваться. <strong>Level 2</strong></p>
<p>Итак, поехали:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>bootstrap
<span style="color: #c20cb9; font-weight: bold;">make</span>
...
fribidi-run.Tpo <span style="color: #660033;">-c</span> fribidi-run.c  <span style="color: #660033;">-fPIC</span> <span style="color: #660033;">-DPIC</span> <span style="color: #660033;">-o</span> .libs<span style="color: #000000; font-weight: bold;">/</span>fribidi-run.o
fribidi-run.c: In <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #ff0000;">'fribidi__new_run__internal__'</span>:
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #ff0000;">'PAGE_SIZE'</span> undeclared <span style="color: #7a0874; font-weight: bold;">&#40;</span>first use <span style="color: #000000; font-weight: bold;">in</span> this <span style="color: #000000; font-weight: bold;">function</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #7a0874; font-weight: bold;">&#40;</span>Each undeclared identifier is reported only once
fribidi-run.c:<span style="color: #000000;">70</span>: error: <span style="color: #000000; font-weight: bold;">for</span> each <span style="color: #000000; font-weight: bold;">function</span> it appears in.<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #c20cb9; font-weight: bold;">make</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #000000; font-weight: bold;">***</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>fribidi-run.lo<span style="color: #7a0874; font-weight: bold;">&#93;</span> Error <span style="color: #000000;">1</span>
...</pre></div></div>

<p>Ладно, отключаем fribidi:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span>
...
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ld</span>: <span style="color: #000000; font-weight: bold;">/</span>...<span style="color: #000000; font-weight: bold;">/</span>vlc-0.9.8a<span style="color: #000000; font-weight: bold;">/</span>extras<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libz.a<span style="color: #7a0874; font-weight: bold;">&#40;</span>compress.o<span style="color: #7a0874; font-weight: bold;">&#41;</span>: relocation R_X86_64_32 against <span style="color: #000000; font-weight: bold;">`</span>a <span style="color: #7a0874; font-weight: bold;">local</span> symbol<span style="color: #ff0000;">' can not be used when making a shared object; recompile with -fPIC
/.../vlc-0.9.8a/extras/contrib/lib/libz.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
...</span></pre></div></div>

<p>Узнаем, как включить <strong>-fPIC</strong> (достаточно добавить ее в <strong>CFLAGS</strong> и <strong>CXXFLAGS</strong> в переменных окружения либо в <strong>Makefile</strong>), и с нехорошим предчувствием продолжаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span>
...
aclocal.m4:<span style="color: #000000;">17</span>: error: this <span style="color: #c20cb9; font-weight: bold;">file</span> was generated <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #c20cb9; font-weight: bold;">autoconf</span> <span style="color: #000000;">2.61</span>.
You have another version of autoconf.  If you want to use that,
you should regenerate the build system entirely.
...</pre></div></div>

<p>Тихо ругаемся, но не сдаемся: мы упорные, а <strong>Google</strong> &#8211; умный. Оказывается, надо сделать <strong>libtoolize &#8211;copy &#8211;force &amp;&amp; aclocal</strong> в папке соотетствующего пакета. Что-ж продолжаем&#8230;  Сделав это еще несколько раз и отключив установку нескольких некомпилирующихся пакетов, и переходим на следующий уровень.</p>
<p><strong>Level 3</strong></p>
<p>Теперь время комипилировать сам <strong>VLC</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--disable-qt4</span> <span style="color: #660033;">--disable-skins2</span> <span style="color: #660033;">--disable-glx</span> <span style="color: #660033;">--disable-fribidi</span>
<span style="color: #c20cb9; font-weight: bold;">make</span>
...
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">ld</span>: <span style="color: #000000; font-weight: bold;">/</span>...<span style="color: #000000; font-weight: bold;">/</span>vlc-0.9.8a<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">/</span>extras<span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libavcodec.a<span style="color: #7a0874; font-weight: bold;">&#40;</span>fft_mmx.o<span style="color: #7a0874; font-weight: bold;">&#41;</span>: relocation R_X86_64_32 against <span style="color: #000000; font-weight: bold;">`</span>a <span style="color: #7a0874; font-weight: bold;">local</span> symbol<span style="color: #ff0000;">' can not be used when making a shared object; recompile with -fPIC
/.../vlc-0.9.8a/./extras/contrib/lib/libavcodec.a: could not read symbols: Bad value
collect2: ld returned 1 exit status</span></pre></div></div>

<p>К сожалению, от этой ошибки избавиться уже не удалось &#8211; видимо бубен утратил волшебную силу <img src='http://arti.kz/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Альтернатива</strong></p>
<p>С приятной теплотой думаем, как это просто сделать в <strong>Gentoo</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.use <span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #000000; font-weight: bold;">&amp;</span>amp; emerge <span style="color: #660033;">-av</span> vlc</pre></div></div>

<p>К сожалению, Gentoo на рабочий сервер поставить не получится, но тут, вспоминается магическое слово &#8211; <strong><a title="Change Root" href="http://en.wikipedia.org/wiki/Chroot">chroot</a></strong>&#8230; Поначалу идея кажется слегка нелепой, но немного раздумий и убедительных доводов &laquo;против&raquo; не находится:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">su</span> -
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> gentoo
<span style="color: #7a0874; font-weight: bold;">cd</span> gentoo
<span style="color: #c20cb9; font-weight: bold;">wget</span> ...<span style="color: #000000; font-weight: bold;">/</span>stage3-amd64-<span style="color: #000000;">2008.0</span>.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">tar</span> xjvpf stage3-amd64-<span style="color: #000000;">2008.0</span>.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">wget</span> ...<span style="color: #000000; font-weight: bold;">/</span>portage-latest.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">tar</span> xjvf portage-latest.tar.bz2 <span style="color: #660033;">-C</span> usr<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> ..
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-t</span> proc none gentoo<span style="color: #000000; font-weight: bold;">/</span>proc
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">bind</span> <span style="color: #000000; font-weight: bold;">/</span>dev gentoo<span style="color: #000000; font-weight: bold;">/</span>dev
<span style="color: #c20cb9; font-weight: bold;">chroot</span> gentoo <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
env-update
<span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>profile
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;media-video/vlc a52 aac aalib fbcon flac httpd id3tag libcaca libv4l2 live matroska rtsp theora v4l v4l2 vlm x264&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>portage<span style="color: #000000; font-weight: bold;">/</span>package.use
emerge <span style="color: #660033;">-av</span> vlc</pre></div></div>

<p>Конечно experienced-users должны будут еще настроить <strong>/etc/make.conf</strong>. Ну и желательно добавить непривилегированного юзера.</p>
<p><strong>Final level</strong></p>
<p>Запускать установленные программы можно прямо из <strong>chroot</strong>-окружения, что по идее должно быть немного безопасней в случае, если в запускаемой программе обнаружатся какие-нибудь уязвимости. Но в принципе можно попробовать вынести ее из <strong>chroot</strong>. Здесь может возникнуть проблема с используемыми библиотеками, но, думаю, ее можно будет обойти. Может быть попробую и напишу об этом позже.</p>
<hr />Проблемы с компьютером? Попробуйте <a href="http://www.pc-msk.ru/">компьютерную помощь</a>.</p>
<p><a href="http://www.video-style.kz">фотограф</a></p>
]]></content:encoded>
			<wfw:commentRss>http://arti.kz/488-chroot-%d0%ba%d0%b0%d0%ba-%d1%81%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b2%d0%be-%d1%83%d1%81%d0%bc%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d0%bd%d0%b3%d0%b2%d0%b8%d0%bd%d0%be%d0%b2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

