tag:blogger.com,1999:blog-60109146060476205272024-03-04T23:16:00.006-08:00Дневник triklozoid'a.triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-6010914606047620527.post-61178210935140639472014-02-01T10:37:00.000-08:002014-02-01T10:37:25.573-08:00Пингвины с чёткими яблоками или ставим Ubuntu на Macbook Pro Retina<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<p>2 года успешно пользовался макбуком 2010ого года c ubuntu 12.04, но у него со временем стал быстро садиться аккумулятор, пришло время поменять его на новенький Macbook Pro Late 2013. Подобные извращения люди уже описывали, но как-то они не везде сошлись с моим опытом, поэтому решил им поделиться. Этот способ не убивает MacOS, можно грузиться и в неё.</p>
<span class="fullpost">
<p><img alt="" src="http://triklozoid.ru/img/tuxapple.jpg" /></p>
<h2>Ставим загрузчик</h2>
<p>Сначала я прочитал <a href="http://habrahabr.ru/post/207100/">статью</a>, где используется стандартный макбуковский загрузчик, но там много магии, не особенно подробно описанной, у меня было мало времени(все-таки ноутбук нужен для работы, а не чтобы ставить на него линукс неделями), поэтому я плюнул и пошёл проверенным методом, который работал с предыдущим устройством. А именно поставил <a href="http://www.rodsbooks.com/refind/">rEFInd</a>. Самый простой(и рекомендованный его разработчиком) способ установки это из макоси. </p>
<p>Качаем binary zip file <a href="http://www.rodsbooks.com/refind/getting.html">отсюда</a></p>
<p>Распаковываем, открываем консоль, запускаем install.sh</p>
<div class="codehilite"><pre><span class="nv">$ </span>./install.sh
Not running as root; attempting to elevate privileges via sudo....
Password:
Installing rEFInd on OS X....
Installing rEFInd to the partition mounted at <span class="s1">'/'</span>
Copied rEFInd binary files
Copying sample configuration file as refind.conf; edit this file to configure
rEFInd.
Installation has completed successfully.
</pre></div>
<h2>Берём нужный образ и пишем его на флешку</h2>
<p>В этой версии макбука, загрузчик умеет грузить обычный убунтовый образ с флешки(для этого после включения нужно держать alt), поэтому лучше качать его, а не *-mac вариант.</p>
<p>Люди пишут, что у них всё было хорошо с 13.10, но у меня почему-то нет. Проблемы были с драйвером видеоадаптера и при загрузке в установщик или liveCD режим, изображение было во-первых очень мелкое(retina же!), во-вторых с какими жуткими искажениями цветов и самого изображения. Параметрами ядра при загрузке за короткое время мне это исправить не удалось(<a href="http://help.ubuntu.ru/wiki/kms">читал тут</a>), но было понятно, что проблема в драйвере, а драйвер в ядре, поэтому стоит попробовать ядро посвежее. Чтобы не мелочиться, решил попробовать 14.04(если вы читаете это через 5 лет, то тогда было полгода до релиза). Качал <a href="http://cdimage.ubuntu.com/daily-live/current/">отсюда</a>, вариант PC amd64. И о чудо, тут всё работало. Практически. :-) </p>
<p>Изображение было таким же мелким, но это легко исправлялось простой сменой разрешения. </p>
<p>Образ на флешку можно ставить через <a href="http://unetbootin.sourceforge.net/#install">unetbootin</a> как-то так:
<img alt="" src="http://triklozoid.ru/img/unetbootin.png" /></p>
<h2>Собственно установка</h2>
<p>Дальше установка как обычно, отрезаем место от раздела макоси, разбиваем по вкусу, grub ставим в тот же раздел, где точка монтирования /.(вообще у меня не спрашивал, видимо нынешние установщики делают так по дефолту). Перезагружаемся, выбираем в rEFInd вновь появившийся пункт меню и загружаемся в новую систему.</p>
<h2>Постустановка и впечатления</h2>
<p>Проверял немного, работает wifi(c проприетарными драйверами bcmwl-kernel-sources), засыпает и просыпается от крышки, звук есть. Поставил awesome, накатил свои конфиги и наступило счастье. :-)
Сегодня замерил батарею, в умеренном режиме(немного торрентов, немного видео, почти всё время музыка, браузер и wifi) проработал 6,5 часов, осталось 7 процентов. </p>
<h2>Зачем это?!</h2>
<p>Ко всем подобным постам самый популярный вопрос: "а зачем?!". Отвечу заранее. Макбук с точки зрения железа мне нравится. Экран, клавиатура, тачпад, достаточно мощная конфигурация при приличном времени работы. Макось мне не то, чтобы не нравится, но у меня уже есть настроенная среда, которую я подпиливал под себя последние несколько лет, привык к ней и мне в ней удобно и всё нравится. Я пробовал настроить макось в том же ключе, быстро у меня не получилось, а много времени на это жалко. Ломать свои привычки я не хочу.</p>
<p>Еще варианты/примеры: </p>
<ul>
<li><a href="http://habrahabr.ru/post/207100/">упомянутый с хабра</a></li>
<li><a href="http://www.betweendots.com/topic/28-how-to-install-ubuntu-on-a-macbook-pro-retina-2013/">еще один</a></li>
<li><a href="http://mcaleely.com/jh/ToT/2013/07/04/ubuntu-13-04-macbookpro-10-2/">другой</a></li>
<li><a href="http://blindvic.blogspot.ru/2013/12/installing-kubuntu-1310-on-macbook-pro.html">третий</a></li>
</ul>
</span>
triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-48822343334608088412014-01-11T07:45:00.000-08:002014-01-11T08:12:48.531-08:00Параллельные вычисления в python одной строкой(перевод)<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<p>Перевод<a href="https://medium.com/building-things-on-the-internet/40e9b2b36148"> статьи "Parallelism in one line"</a></p>
<p><strong>Disclaimer</strong>: Если вы умеете читать на английском, читайте оригинал, переводчик из меня так себе. </p>
<p>У python ужасная репутация в параллельных вычислениях. Если забыть про обычные аргументы о потоках и GIL(которые довольно справедливы), настоящую проблему с параллельными вычислениями в python я вижу не в техническом аспекте, а скорее в педагогическом. Основные руководства про мультипоточность и мультипроцессинговость в Python слишком тяжеловесны. Они начинаются с каких-то глубоких вещей и заканчиваются до того, как объясняют что-то действительно полезное, применимое в ежедневных задачах. </p>
<span class="fullpost">
<h3>Традиционный пример.</h3>
<p>Беглый просмотр первых результатов DDG по запросу <a href="https://duckduckgo.com/?q=Python+threading+tutorial">Python threading tutorial</a>, демонстрирует, что практически каждый первый из них говорит об одном и том же и базируется на похожей Class + Queue модели. </p>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">Queue</span>
<span class="k">class</span> <span class="nc">Consumer</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queue</span><span class="p">):</span>
<span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">=</span> <span class="n">queue</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="c"># queue.get() блокирует текущий поток до получения данных</span>
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="c"># Проверяем, является ли текущее сообщение "Poison Pill"</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">msg</span> <span class="o">==</span> <span class="s">'quit'</span><span class="p">:</span>
<span class="c"># Если является, выходим из цикла</span>
<span class="k">break</span>
<span class="c"># Обработка(в данном случае печать) элемента очереди</span>
<span class="k">print</span> <span class="s">"I'm a thread, and I received </span><span class="si">%s</span><span class="s">!!"</span> <span class="o">%</span> <span class="n">msg</span>
<span class="c"># Всегда будь дружелюбен!</span>
<span class="k">print</span> <span class="s">'Bye byes!'</span>
<span class="k">def</span> <span class="nf">Producer</span><span class="p">():</span>
<span class="c"># Queue используется для доступа к данным из разных потоков</span>
<span class="n">queue</span> <span class="o">=</span> <span class="n">Queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
<span class="c"># Создаём воркер</span>
<span class="n">worker</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">(</span><span class="n">queue</span><span class="p">)</span>
<span class="c"># Вызываем внутренний run() метод, чтобы запустить поток</span>
<span class="n">worker</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="c"># переменная, чтобы следить когда мы начали</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="c"># Пока меньше 5 секунд</span>
<span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span> <span class="o"><</span> <span class="mi">5</span><span class="p">:</span>
<span class="c"># Вычислить часть данных и положить их в очередь</span>
<span class="n">queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s">'something at </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span>
<span class="c"># Вздремнуть немного, чтобы избежать огромного количества сообщений</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="c"># Используем "poison pill" метод, чтобы убить поток</span>
<span class="n">queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s">'quit'</span><span class="p">)</span>
<span class="c"># Ждем, пока поток закроется</span>
<span class="n">worker</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">Producer</span><span class="p">()</span>
</pre></div>
<p>Хм, да тут пахнет Java.</p>
<p>Но я не хочу создать впечатление, как будто я думаю, что Producer/Consumer способ взаимодействия с мультипоточностью/мультипроцессностью неправильный - потому что это определённо не так. Это отличный подход для целого ряда задач. Тем не менее, я практически уверен, что это не самый лучший вариант для ежедневных скриптовых задач.</p>
<h3>Проблемы(как я их вижу).</h3>
<p>Во-первых, вам нужен класс, который по сути не делает ничего полезного. Во-вторых, вы должны обслуживать очередь через которую вы должны передавать объекты, и в конце концов, вам нужны методы на обоих концах цепочки, чтобы делать собственно то, что вам нужно.(например использовать другую очередь, если вы хотите сохранить результаты)</p>
<h4>Больше обработчиков - больше проблем</h4>
<p>Теперь вы захотите сделать набор таких обработчиков, чтобы попытаться выжать какое-то ускорение из Python. Ниже пример кода из отличного учебника от IBM по многопоточности. Это очень распространённый сценарий, где вы решаете задачу загрузить веб страницы в нескольких потоках.</p>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">Queue</span>
<span class="kn">import</span> <span class="nn">urllib2</span>
<span class="k">class</span> <span class="nc">Consumer</span><span class="p">(</span><span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">queue</span><span class="p">):</span>
<span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_queue</span> <span class="o">=</span> <span class="n">queue</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">content</span> <span class="o">==</span> <span class="s">'quit'</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="k">print</span> <span class="s">'Bye byes!'</span>
<span class="k">def</span> <span class="nf">Producer</span><span class="p">():</span>
<span class="n">urls</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">'http://www.python.org'</span><span class="p">,</span> <span class="s">'http://www.yahoo.com'</span>
<span class="s">'http://www.scala.org'</span><span class="p">,</span> <span class="s">'http://www.google.com'</span>
<span class="c"># и т.д.</span>
<span class="p">]</span>
<span class="n">queue</span> <span class="o">=</span> <span class="n">Queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
<span class="n">worker_threads</span> <span class="o">=</span> <span class="n">build_worker_pool</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="c"># Добавляем ссылки на обработку</span>
<span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
<span class="n">queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="c"># Добавляем poison pill</span>
<span class="k">for</span> <span class="n">worker</span> <span class="ow">in</span> <span class="n">worker_threads</span><span class="p">:</span>
<span class="n">queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s">'quit'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">worker</span> <span class="ow">in</span> <span class="n">worker_threads</span><span class="p">:</span>
<span class="n">worker</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
<span class="k">print</span> <span class="s">'Done! Time taken: {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_time</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">build_worker_pool</span><span class="p">(</span><span class="n">queue</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="n">workers</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size</span><span class="p">):</span>
<span class="n">worker</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">(</span><span class="n">queue</span><span class="p">)</span>
<span class="n">worker</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="n">workers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">worker</span><span class="p">)</span>
<span class="k">return</span> <span class="n">workers</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">Producer</span><span class="p">()</span>
</pre></div>
<p>Работает прекрасно, но посмотрите на весь этот код! Вы должны написать методы, списки потоков, чтобы следить за ними, и что хуже всего, если вы склонны к dead-lock также как и я, куча конструкций <strong>join</strong> дадут вам возможность ошибиться. И это становится всё сложнее и сложнее. </p>
<p>Чего мы добились, написав столько кода? Практически ничего. Весь этот код это чистая обвязка, он не несёт полезной нагрузки и содержит много мест, чтобы в них ошибиться(Чёрт! Да я забыл вызвать task_done() у объекта очереди, пока писал это(Я слишком ленив, чтобы исправить это и сделать другой скриншот)) и это слишком много кода, который делает слишком мало. К счастью, есть способ лучше.</p>
<h3>Вступление: Map</h3>
<p>Map это небольшая классная функция, и ключ к простому добавлению распараллеливания в ваш код на Python. Для тех, кто с ней не знаком, map это что-то пришедшее из функциональных языков, таких как Lisp. Это функция, которая сопоставляет другую функцию последовательности, например так: </p>
<div class="codehilite"><pre><span class="n">urls</span> <span class="o">=</span> <span class="p">[</span><span class="s">'http://www.yahoo.com'</span><span class="p">,</span> <span class="s">'http://www.reddit.com'</span><span class="p">]</span>
<span class="n">results</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">,</span> <span class="n">urls</span><span class="p">)</span>
</pre></div>
<p>Это применяет метод <strong>urlopen</strong> к каждому элементу последовательности и сохраняет все результаты в список. Это более-менее эквивалентно такому: </p>
<div class="codehilite"><pre><span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">urls</span><span class="p">:</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">))</span>
</pre></div>
<p><strong>Map</strong> совершает итерацию по последовательности, применяет фукнцию и сохраняет результы в список.</p>
<p>Что это даёт нам? Дело в том, что с правильными библиотеками, map может выполнять это параллельно поразительно просто.</p>
<p>Параллельная версия map предоставляется двумя библиотеками: <strong>multiprocessing</strong>, и её малоизвестный, но в равной степени фантастический потомок <strong>multiprocessing.dummy</strong>.</p>
<p>Небольшое отступление: Как так? Никогда не слышали о потоковом клоне <strong>multiproccessing</strong> названном dummy? Я тоже не слышал до самого недавнего времени. В доментации на multiprocessing есть всего одно предложение о нём. И оно сводится к "О да, и такое есть". Это слишком скромно для него, поверьте мне. </p>
<p><strong>Dummy</strong> это точный клон модуля <strong>multiprocessing</strong>. Единственное отличие в том, что multiprocessing работает с процессами, а dummy использует потоки(что приносит все их ограничения. Таким образом всё, что применимо к одному, можно применить и к другому. Что особенно хорошо, для исследовательских задач, когда вы не до конца уверены, вызов какого-то фреймворка будет потреблять CPU или IO.</p>
<h3>Начнём.</h3>
<p>Чтобы получить доступ к параллельным версиям <strong>map</strong>, первым делом нужно импортировать модули, которые её содержат. </p>
<div class="codehilite"><pre><span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pool</span>
<span class="kn">from</span> <span class="nn">multiprocessing.dummy</span> <span class="kn">import</span> <span class="n">Pool</span> <span class="k">as</span> <span class="n">ThreadPool</span>
</pre></div>
<p>И создать набор объектов</p>
<div class="codehilite"><pre><span class="n">pool</span> <span class="o">=</span> <span class="n">ThreadPool</span><span class="p">()</span>
</pre></div>
<p>Эта короткая инструкция делает всё, что мы делали за 7 строк в функции build_worker_pool из example2.py. А именно, она создаёт набор обработчиков, запускает их и сохраняет в переменной, для простого доступа. </p>
<p>Набор объектов принимает несколько параметров, но сейчас нас интересует только первый: processes. Он устанавливает количество обработчиков в наборе. По умолчанию он равен количеству ядер в вашем процессоре. </p>
<p>В общем случае, при использовании мультипроцессинга для решения требовательных к процессорному времени задач, больше ядер означает быстрее.(Но есть <em>много</em> но). В других случаях, при использовании мультипоточности и задач связанных с сетью, всё может быть по разному, и можно поэкспериментировать с размером набора обработчиков.</p>
<div class="codehilite"><pre><span class="n">pool</span> <span class="o">=</span> <span class="n">ThreadPool</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="c"># Устанавливает размер набора в 4</span>
</pre></div>
<p>Если вы запустите слишком много потоков, больше времени будет тратиться на переключение между ними, чем на полезную работу, поэтому имеет смысл поиграть со значением, чтобы найти оптимальное для этой задачи. </p>
<p>Теперь обработчики созданы и простая параллелизация буквально у нас на кончиках пальцев, давайте перепишем задачу из example2.py</p>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">urllib2</span>
<span class="kn">from</span> <span class="nn">multiprocessing.dummy</span> <span class="kn">import</span> <span class="n">Pool</span> <span class="k">as</span> <span class="n">ThreadPool</span>
<span class="n">urls</span> <span class="o">=</span> <span class="p">[</span>
<span class="s">'http://www.python.org'</span><span class="p">,</span>
<span class="s">'http://www.python.org/about/'</span><span class="p">,</span>
<span class="s">'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html'</span><span class="p">,</span>
<span class="s">'http://www.python.org/doc/'</span><span class="p">,</span>
<span class="s">'http://www.python.org/download/'</span><span class="p">,</span>
<span class="s">'http://www.python.org/getit/'</span><span class="p">,</span>
<span class="s">'http://www.python.org/community/'</span><span class="p">,</span>
<span class="s">'https://wiki.python.org/moin/'</span><span class="p">,</span>
<span class="s">'http://planet.python.org/'</span><span class="p">,</span>
<span class="s">'https://wiki.python.org/moin/LocalUserGroups'</span><span class="p">,</span>
<span class="s">'http://www.python.org/psf/'</span><span class="p">,</span>
<span class="s">'http://docs.python.org/devguide/'</span><span class="p">,</span>
<span class="s">'http://www.python.org/community/awards/'</span>
<span class="c"># etc..</span>
<span class="p">]</span>
<span class="c"># Создаём набор обработчиков</span>
<span class="n">pool</span> <span class="o">=</span> <span class="n">ThreadPool</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="c"># Открываем ссылки в собственных потоках и возвращаем результаты</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">pool</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">,</span> <span class="n">urls</span><span class="p">)</span>
<span class="c">#закрываем набор и ждём, пока работа будет закончена</span>
<span class="n">pool</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">pool</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
</pre></div>
<p>И что у нас получилось? Код, который решает задачу состоит из 4 строк, 3 из которых только подготовка к реальной работе. Вызов map с лёгкостью делает всё то же, что и наш предыдущий 40 строчный пример. Ради смеха, я замерил время выполнения обоих подходов с разным размером набора обработчиков. </p>
<div class="codehilite"><pre><span class="n">Sigle</span> <span class="kr">thread</span><span class="o">:</span> <span class="mf">14.4</span> <span class="n">seconds</span>
<span class="mi">4</span> <span class="n">Pool</span><span class="o">:</span> <span class="mf">3.1</span> <span class="n">seconds</span>
<span class="mi">8</span> <span class="n">Pool</span><span class="o">:</span> <span class="mf">1.4</span> <span class="n">seconds</span>
<span class="mi">13</span> <span class="n">Pool</span><span class="o">:</span> <span class="mf">1.3</span> <span class="n">seconds</span>
</pre></div>
<p>Потрясающе! И также показывает, что правильно поиграть со значением размера набора обработчиков. На моей машине любое значение больше 9 минимизует время выполнения. </p>
<h3>Второй пример из реального мира</h3>
<p>Изготовление тысяч миниатюр</p>
<p>Давайте сделаем что-то, что потребляет много процессора. Подходящая задача для меня это манипуляция большими папками с изображениями. Одна из трансформаций это создание миниатюр. </p>
<h4>Для одного процесса, без распараллеливания.</h4>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">PIL</span>
<span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pool</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="n">SIZE</span> <span class="o">=</span> <span class="p">(</span><span class="mi">75</span><span class="p">,</span><span class="mi">75</span><span class="p">)</span>
<span class="n">SAVE_DIRECTORY</span> <span class="o">=</span> <span class="s">'thumbs'</span>
<span class="k">def</span> <span class="nf">get_image_paths</span><span class="p">(</span><span class="n">folder</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">folder</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span>
<span class="k">if</span> <span class="s">'jpeg'</span> <span class="ow">in</span> <span class="n">f</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">create_thumbnail</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">im</span><span class="o">.</span><span class="n">thumbnail</span><span class="p">(</span><span class="n">SIZE</span><span class="p">,</span> <span class="n">Image</span><span class="o">.</span><span class="n">ANTIALIAS</span><span class="p">)</span>
<span class="n">base</span><span class="p">,</span> <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">save_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">SAVE_DIRECTORY</span><span class="p">,</span> <span class="n">fname</span><span class="p">)</span>
<span class="n">im</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">save_path</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">folder</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span>
<span class="s">'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840'</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">folder</span><span class="p">,</span> <span class="n">SAVE_DIRECTORY</span><span class="p">))</span>
<span class="n">images</span> <span class="o">=</span> <span class="n">get_image_paths</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span>
<span class="k">for</span> <span class="n">image</span> <span class="ow">in</span> <span class="n">images</span><span class="p">:</span>
<span class="n">create_thumbnail</span><span class="p">(</span><span class="n">Image</span><span class="p">)</span>
</pre></div>
<p>Немного подправлено для примера, в реальности, папка передаётся в программу, собираются все изображения в ней, создаются миниатюры и кладутся в свою отдельную папку.
На моём компьютере, это занимает 27.9 секунд для обработки 6000 изображений. </p>
<p>Если мы заменим цикл for на вызов параллельного map:</p>
<div class="codehilite"><pre><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">PIL</span>
<span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pool</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="n">SIZE</span> <span class="o">=</span> <span class="p">(</span><span class="mi">75</span><span class="p">,</span><span class="mi">75</span><span class="p">)</span>
<span class="n">SAVE_DIRECTORY</span> <span class="o">=</span> <span class="s">'thumbs'</span>
<span class="k">def</span> <span class="nf">get_image_paths</span><span class="p">(</span><span class="n">folder</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">folder</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span>
<span class="k">if</span> <span class="s">'jpeg'</span> <span class="ow">in</span> <span class="n">f</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">create_thumbnail</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
<span class="n">im</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">im</span><span class="o">.</span><span class="n">thumbnail</span><span class="p">(</span><span class="n">SIZE</span><span class="p">,</span> <span class="n">Image</span><span class="o">.</span><span class="n">ANTIALIAS</span><span class="p">)</span>
<span class="n">base</span><span class="p">,</span> <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">save_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">SAVE_DIRECTORY</span><span class="p">,</span> <span class="n">fname</span><span class="p">)</span>
<span class="n">im</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">save_path</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">folder</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span>
<span class="s">'11_18_2013_R000_IQM_Big_Sur_Mon__e10d1958e7b766c3e840'</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">folder</span><span class="p">,</span> <span class="n">SAVE_DIRECTORY</span><span class="p">))</span>
<span class="n">images</span> <span class="o">=</span> <span class="n">get_image_paths</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span>
<span class="n">pool</span> <span class="o">=</span> <span class="n">Pool</span><span class="p">()</span>
<span class="n">pool</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">create_thumbnail</span><span class="p">,</span> <span class="n">images</span><span class="p">)</span>
<span class="n">pool</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">pool</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
</pre></div>
<p><strong>5.6 секунд!</strong></p>
<p>Это очень заметное ускорение, полученное заменой лишь нескольких строк кода. Продакшен версия этого даже еще быстрее, потому что задачи потребляющие процессор и ввод-вывод, разделены там в соотвествующие отдельные процессы и потоки. Однако, благодаря прозрачной природе map и отсутствию необходимости ручного управления потоками, на самом деле просто смешивать и сочетать эти подходы, и результат получается простой, надёжный и легко поддающийся отладке. </p>
<p>Собственно это оно. Параллельные вычисления одной(практически) строкой.</p>
</span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com1tag:blogger.com,1999:blog-6010914606047620527.post-47324630061909140322013-11-20T13:18:00.000-08:002013-11-20T13:25:13.384-08:00Еще одни микрозаметки из django и md файлов.<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
Заметил(в последние три года), что blogger не самая удобная платформа для мелких заметок для себя. Хранить их в локальных файлах тоже не очень хочется, чтобы не терять возможности посмотреть их с другого компьютера. Есть много онлайн сервисов для этого, но с текстовым редактором они интегрируются слабо, да еще и временами перестают существовать(я пользовался catch.com, пока он не закрылся). Поэтому решил поднять какую-нибудь простенькую штуку на своём сервере. Вот что получилось.
<span class="fullpost"><br />
За основу я взял django, и к шаблону проекта дописал буквально пару строк. <br />
<pre><code>django-admin.py startproject myblog
cd myblog
python manage.py startapp blog
</code></pre>
myblog/urls.py<br />
<pre><code>from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'interface.views.post'),
url(r'^(?P<post_id>\w+)/$', 'interface.views.post'),
)
</code></pre>
blog/views.py<br />
<pre><code>import markdown
import interface.static as s
from django.http import HttpResponse
def post(request, post_id='index'):
f = open(s.POST_PATH % post_id, 'r')
result = s.PAGE_TEMPLATE % markdown.markdown(f.read().decode('utf-8'))
f.close()
return HttpResponse(result)
</code></pre>
И еще вам пригодится <a href="http://triklozoid.ru/css/markdown.css">css файл</a><br />
На всякий случай вот еще <a href="https://github.com/triklozoid/simple-md-blog">репозиторий</a> целиком.
Теперь я пишу свой поток сознания прямо в sublime в markdown разметке, нажимаю "сохранить", SFTP плагин загружает файл в папку на сервере и он тут же правильно отображается в браузере.
Понятно, что это не продакшен решение для миллионов пользователей, но такой задачи у меня и не было.
Если кто-то увидел в этом страшный велосипедизм и знает разумные способы, как добиться такого же результата, делитесь. </div>
</span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com0tag:blogger.com,1999:blog-6010914606047620527.post-86828066958396501572013-10-10T13:04:00.000-07:002013-10-10T13:10:16.823-07:00Клонируем пингвинов или как быстро сделать много одинаковых рабочих окружений с синхронизацией.<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
У меня задача была такой: есть несколько школьников(до 10 человек) со своими ноутбуками. На них винда разных версий и степени рабочести. Хотелось как-то задешево сделать им всем одинаковое рабочее окружение на их компьютерах, ничего им не сломав. И совсем хорошо потом иметь между этими окружениями какую-то синхронизацию. Решал я это так: </br>
<span class="fullpost">
Вообще ничего сверъестественного я не делал, пост больше как подтверждение возможности реализации такой идеи.</br>
А что делал-то: </br>
1. Купил флешки kingston на 8GB. </br>
2. Поставил на одну из них Xubuntu через VirtualBox(можно и обычным методом, но это нужно выключать компьютер и внимательно выбирать диск при разметке. Установка через VB таких проблем лишена) </br>
3. Загрузился снова через VirtualBox, поставил обновления и нужный софт, настроил синхронизацию. </br>
4. С помощью dd клонировал эту флешку на все остальные. </br>
Собственно всё. Теперь немного подробнее. </br>
<h3>Вот флешки:</h3> </br>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg17YFBfGGTDpTz6xl2_kJQnAFtuY9OFTzVuDnN77qnfG3Kc73oED_eKEfPgSaB5GxcDIuOUBb0nz7TRPWB0UGA7H5C2qX9rLF4ur_wynZv8HZw-IJllwUFXBjbrvQlhNRbU8D1dEyUGk-6/s1600/20131010_225747.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg17YFBfGGTDpTz6xl2_kJQnAFtuY9OFTzVuDnN77qnfG3Kc73oED_eKEfPgSaB5GxcDIuOUBb0nz7TRPWB0UGA7H5C2qX9rLF4ur_wynZv8HZw-IJllwUFXBjbrvQlhNRbU8D1dEyUGk-6/s400/20131010_225747.jpg" /></a></div>
Для теста взял 4 штуки, если проблем не выявится, докуплю еще.
<h3>Ставим линукс.</h3>
Качаем образ нужного линукса:
<pre style='color:#000000;background:#ffffff;'><html><body style='color:#000000; background:#ffffff; '><pre>
wget http<span style='color:#800080; '>:</span><span style='color:#696969; '>//mirror.yandex.ru/ubuntu-cdimage/xubuntu/releases/12.04.3/release/xubuntu-12.04.3-desktop-i386.iso</span>
</pre></pre>
Создаём виртуальную машину
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuuD70pR3GtI8BRrzp8BQMxMfX1T0tuh_f3LWAuiAugjPnWCIyqa6df7vPW-Xcp2WcTJRLeXNv9Xf3IgKEPcBcjTSIaNF4yEEVBxCTgTEQbng3xMmO2hNsY_ihgicw7afpV3x6rAZqkNcu/s1600/Screenshot+-+10102013+-+08:26:04+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuuD70pR3GtI8BRrzp8BQMxMfX1T0tuh_f3LWAuiAugjPnWCIyqa6df7vPW-Xcp2WcTJRLeXNv9Xf3IgKEPcBcjTSIaNF4yEEVBxCTgTEQbng3xMmO2hNsY_ihgicw7afpV3x6rAZqkNcu/s400/Screenshot+-+10102013+-+08:26:04+PM.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkVPKrlIC7gGrRtq-EbiYbotTMR5CEMn_TRBagb3w0k20fsBFsbCJLd2m3DMfRizOfQhf4hZsJSkVL_U0RqdNZ86iBXQCpRR8LLoN00-Qp57Ejqcr14PmpRpnxUzBgFHJw9co0NgUogGuC/s1600/Screenshot+-+10102013+-+08:26:24+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkVPKrlIC7gGrRtq-EbiYbotTMR5CEMn_TRBagb3w0k20fsBFsbCJLd2m3DMfRizOfQhf4hZsJSkVL_U0RqdNZ86iBXQCpRR8LLoN00-Qp57Ejqcr14PmpRpnxUzBgFHJw9co0NgUogGuC/s400/Screenshot+-+10102013+-+08:26:24+PM.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE5L0rE3py_vVo2jCazvwluEOdoxAuknK8YqTAxsSQBzxqL1zy0492qlaw0v54I1jWsqxOYTdy3DPc0OBwloy88E3wEcD3YkvFWXuBqsM-0sYS5CBY0_UF_1ZdDTZnw8yHThjD9d2Z3VKq/s1600/Screenshot+-+10102013+-+08:26:40+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE5L0rE3py_vVo2jCazvwluEOdoxAuknK8YqTAxsSQBzxqL1zy0492qlaw0v54I1jWsqxOYTdy3DPc0OBwloy88E3wEcD3YkvFWXuBqsM-0sYS5CBY0_UF_1ZdDTZnw8yHThjD9d2Z3VKq/s400/Screenshot+-+10102013+-+08:26:40+PM.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDi7Kzy6ae3aiwcCXulgi1PYRZHWU3eHDg-0V5Tm42pGP7O-3d4mqSljTcTB5euIx45rMHdv9drX-XGBMhm7w5MUy1QONFx1X_QV9t_GCG53WbupZKdGcY_4E_JETnJtv6M9ZwqJ7z0urR/s1600/Screenshot+-+10102013+-+08:27:33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDi7Kzy6ae3aiwcCXulgi1PYRZHWU3eHDg-0V5Tm42pGP7O-3d4mqSljTcTB5euIx45rMHdv9drX-XGBMhm7w5MUy1QONFx1X_QV9t_GCG53WbupZKdGcY_4E_JETnJtv6M9ZwqJ7z0urR/s400/Screenshot+-+10102013+-+08:27:33+PM.png" /></a></div>
Подключаем флешку.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGVrMQ3T8xqiUpIyseIita01UkNvsxdJwxLpi4SLHBDLQsIVlqNEOCWCounDasVziq3Yqajlz5ryu8EE7jNSRH6mKIvF0al7aEcH9Zn0Fi8x2jU4nQpfZ2Q7eBLqeM23zF4vA77V79sb8S/s1600/Screenshot+-+10102013+-+08:40:07+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGVrMQ3T8xqiUpIyseIita01UkNvsxdJwxLpi4SLHBDLQsIVlqNEOCWCounDasVziq3Yqajlz5ryu8EE7jNSRH6mKIvF0al7aEcH9Zn0Fi8x2jU4nQpfZ2Q7eBLqeM23zF4vA77V79sb8S/s400/Screenshot+-+10102013+-+08:40:07+PM.png" /></a></div>
Немного отмечу процесс разбивки диска. Сейчас в компьютерах относительно много ОЗУ(от 1ГБ), и восьмигиговая флешка по сравнению с этим не такая большая. Поэтому я предпочитаю отдавать всё под / и не делать swap. Если так почему-то вообще нельзя делать никогда, расскажите мне почему.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnkNE9zrj1q6SHHzrM6_wARAUEMSbcZR7IIWoQD0zEEVFsV06QBDbEvuUE4sgxyEpzG873nwcR465tbrmaKEVeaHBDkp15nuKNt4pQ_sKx8HFx-_uQ95mW0HtOqERuvMYZb4zXbd53iFOT/s1600/Screenshot+-+10102013+-+08:41:56+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnkNE9zrj1q6SHHzrM6_wARAUEMSbcZR7IIWoQD0zEEVFsV06QBDbEvuUE4sgxyEpzG873nwcR465tbrmaKEVeaHBDkp15nuKNt4pQ_sKx8HFx-_uQ95mW0HtOqERuvMYZb4zXbd53iFOT/s400/Screenshot+-+10102013+-+08:41:56+PM.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixMeFUYL3yuFSOBqphTFZ8lAJdifoUuZpmSR4hy5_aWdrAD_PhB7G9KQOT70ucCTLxCg3Zj0lqeY8N9UHl9GDTtF4keg_NoDdzlEUlWwkQVsc-7WWDlYqeLhT3B74CtK54rwlvAH0xkNvE/s1600/Screenshot+-+10102013+-+08:42:43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixMeFUYL3yuFSOBqphTFZ8lAJdifoUuZpmSR4hy5_aWdrAD_PhB7G9KQOT70ucCTLxCg3Zj0lqeY8N9UHl9GDTtF4keg_NoDdzlEUlWwkQVsc-7WWDlYqeLhT3B74CtK54rwlvAH0xkNvE/s400/Screenshot+-+10102013+-+08:42:43+PM.png" /></a></div>
<h3> Включаем и настраиваем. </h3>
Поставился, теперь попробуем в него загрузиться.
По умолчанию VirtualBox так не умеет, но несложно его научить. Хотя официальный представить Oracle и уверяет, что это невозможно.
Нужно добавить своего пользователя в группу disk
<pre style='color:#000000;background:#ffffff;'><html><body style='color:#000000; background:#ffffff; '><pre>
usermod -aG disk triklozoid
</pre></pre>
После этого перелогиниться и выполнить такую команду:
<pre style='color:#000000;background:#ffffff;'><html><body style='color:#000000; background:#ffffff; '><pre>
sudo VBoxManage internalcommands createrawvmdk -filename ~<span style='color:#40015a; '>/temp/usbdisk.vmdk</span> -rawdisk <span style='color:#40015a; '>/dev/sdb</span>
</pre></pre>
где </br>
~/temp/usbdisk.vmdk это где создать файла диска </br>
а </br>
/dev/sdb устройство вашей флешки </br>
В настойках виртуальной машины добавляем диск: </br>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVb-InfmV2GimvBuL-W3Ij4pYjVH9suNZBMbHVe_jZSkX75W9bYICqehrv0hM6dE0cng5UABXp_C1Tmvhpv2Zet-7Qam38yD4_SIjrYhCEOdSSPEYmm0gepR8oNP9MwNjR0RR_seEigxxH/s1600/Screenshot+-+10102013+-+11:21:51+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVb-InfmV2GimvBuL-W3Ij4pYjVH9suNZBMbHVe_jZSkX75W9bYICqehrv0hM6dE0cng5UABXp_C1Tmvhpv2Zet-7Qam38yD4_SIjrYhCEOdSSPEYmm0gepR8oNP9MwNjR0RR_seEigxxH/s400/Screenshot+-+10102013+-+11:21:51+PM.png" /></a></div>
На этом этапе могут появиться какие-нибудь ошибки доступа, нужно проверять права на свежесозданный файл ~/temp/usbdisk.vmdk </br>
Теперь включаем машину, она должна нормально загрузиться с флешки. </br>
Делаем sudo apt-get update && sudo apt-get upgrade(yum, pacman, emerge или что там у вас). </br>
Устанавливаем нужные приложения, настраиваем что нужно. </br>
<h3> Про синхронизацию </h3>
Для синхронизации я использовал <a href="http://disk.yandex.ru/download">клиент Яндекс.Диска</a> под линукс. </br>
Качаем cтавим настраиваем по <a href="http://help.yandex.ru/disk/cli-clients.xml">официальным докам.</a> </br>
Я использовал такую схему: Зарегистрировал один новый аккаунт на яндексе. Сделал папку у себя и дал доступ на чтение новому аккаунту.
И авторизовался в линукс клиенте новым аккаунтом. </br>
Можно конечно как-то усложнить схему и сделать на каждой флешке отдельный аккаунт, но мне лень. :-)
<h3> Клонирование. </h3>
После того, как настройка всего закончена, можно приступить к магии dd. </br>
Хотя команда очень простая, совсем не магическая, если кто знает магические ключи, которые улучшают всё в миллион раз, делитесь. </br>
<red>КОМАНДУ ЗАПУСКАТЬ АККУРАТНО, С УСТРОЙСТВАМИ НЕ ОШИБАТЬСЯ</red></br>
А то всё потрёте нафиг.
<pre style='color:#000000;background:#ffffff;'><html><body style='color:#000000; background:#ffffff; '><pre>
dd <span style='color:#800000; font-weight:bold; '>if</span>=<span style='color:#40015a; '>/dev/sdb</span> <span style='color:#797997; '>of</span><span style='color:#808030; '>=</span><span style='color:#40015a; '>/dev/sdc</span> <span style='color:#797997; '>bs</span><span style='color:#808030; '>=</span>16M
</pre></pre>
if - откуда</br>
of - куда </br>
bs - размер блока</br>
<h3> Конец </h3>
Собственно на этом всё, всё работает, можно пробовать. Работает достаточно шустро(особенно питоновая консоль :-)), проблем с железом пока не было.
Кроме синхронизации папки с файлами, хотелось бы конечно и набор пакетов тоже синхронизировать, например, через puppet, но на первое время хватит и такого.
</span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-8555037439601390932013-09-09T11:33:00.000-07:002013-09-09T11:50:56.049-07:00Делимся Linux скриншотами в один клик<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
Это супер короткий пост-заметка, как в Linux сохранять скриншоты на Яндекс.Диск и сразу получать ссылку.
<span class="fullpost">
Ставим консольный клиент <a href="http://disk.yandex.ru/download/" target="_blank">отсюда</a>.
Делаем такой скрипт:<br />
<br />
<pre><tt><i><span style="color: #9a1900;">#!/bin/bash</span></i>
xfce4<span style="color: #990000;">-</span>screenshooter <span style="color: #990000;">-</span><b><span style="color: blue;">s</span></b> <span style="color: #990000;">~</span><span style="color: red;">/Yandex.Disk/screenshots/</span> <span style="color: #990000;">-</span>r
yandex<span style="color: #990000;">-</span>disk sync
yandex<span style="color: #990000;">-</span>disk publish <span style="color: red;">"$(ls -td ~/Yandex.Disk/screenshots/*|head -n 1)"</span><span style="color: #990000;">|</span>xclip</tt></pre>
<br />
Первую строчку естественно можно заменить на запуск вашей любимой скриншотилки, если ей можно передать параметр, куда сохранять файл.
Команду <b>xclip</b> можно заменить на <b>xclip -selection clipboard</b>, если вы хотите вставлять ссылку не средней кнопкой мыши, а по ctrl+v. Подробнее например <a href="http://linuxtidbits.wordpress.com/2008/02/22/command-line-to-clipboard" target="_blank">здесь.</a>
</span></div>
triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com0tag:blogger.com,1999:blog-6010914606047620527.post-58010843915590491672010-10-24T04:08:00.000-07:002010-10-24T04:35:09.260-07:00GIMP печатает пустые листы.После очередного обновления своего Archlinux'а, обнаружил следующую проблему: при печати из GIMP в превью нет изображения и на печать выводится пустой лист. Через неделю нагуглил-таки решение, выкладываю. <br /><span class="fullpost"><br />Сначала я поставил gutenprint плагин, из него всё работало, но я не нашёл как там менять качество печать и решил починить стандартную функцию печати. На launchpad(!) нашёл совет какого-то доброго человека, что нужно сделать downgrade библиотеки cairo до версии <a href=http://cairographics.org/releases/cairo-1.8.10.tar.gz>1.8.10.</a> Так и сделал. <br />Сначала нужно удалить установленную у нас версию cairo.<br /><code><br />sudo pacman -Rnd cairo<br /></code><br />Потом качаем, распаковываем, собираем и ставим версию 1.8.10.<br /><code><br />wget http://cairographics.org/releases/cairo-1.8.10.tar.gz<br />tar xf cairo-1.8.10.tar.gz<br />cd cairo-1.8.10<br />./configure --prefix=/usr/lib<br />make <br />sudo make install<br /></code><br />Запускаем GIMP, наблюдаем положительный результат, радуемся и надеемся, что в следующем релизе cairo или GIMP'a всё починят и оно будет работать без дополнительных костылей и ударов молотком. :-)<br /><br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com2tag:blogger.com,1999:blog-6010914606047620527.post-29781175302727403722010-04-26T00:06:00.000-07:002010-04-26T11:17:13.466-07:00Настройка Wifi на нетбуке HP Mini 501 под Tiny Core LinuxПару месяцев назад приобрёл себе новый нетбук. Дефолтный <a href="http://ru.wikipedia.org/wiki/SLED">SLED</a> меня не порадовал своей тормознутостью, захотелось чего-нибудь быстрого и экзотичного. И вот на welinux наткнулся на заметку про Tiny Core. Понравилось, поставил, столнулся с проблемой неработающего Wifi. Начал копать и откопал.<br /><br /><br /><br /><span class="fullpost"><br />Для начала нужно определить название Wifi чипа.<br />Для этого используем lspci. В Tiny Core по умолчанию этой команды нет, необходимо установить пакет pci-utils.<br />Анализируем вывод и находим такую строчку:<br /><code><br />08:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)<br /></code><br />Из неё делаем вывод, что чип у нас broadcom bcm4312.<br />Далее идем на <a href="http://linuxwireless.org/en/users/Drivers/b43">linuxwireless.org</a> и читаем мануал.<br />Пишут там следующее<br /><code><br />lspci -vnn | grep 14e4<br /><br />08:00.0 Network controller [0280]: Broadcom Corporation BCM4312 802.11b/g [14e4:<span style="font-weight: bold;font-size:130%;" >4315</span>] (rev 01)<br /></code><br />Отсюда можно узнать точную модель. В данном случае "4315".<br />На сайте есть таблица, по которой можно понять поддерживается ли ваш чип и какой версией ядра.<br />Напротив моего чипа в таблице было следующее:<br /><code><br />supported 2.6.32 and later<br /></code><br />А ядро по умолчанию в Tiny Core 2.6.29. "Надо собрать своё" - догадался Штирлиц.<br />Будем собирать. Для сборки нам понадобится, как минимум, gcc и make. Их надо поставить через пакетный менеджер.<br />Качаем с kernel.org текущее стабильное ядро.<br /><code><br />wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.bz2<br />tar xf linux-2.6.33.2.tar.bz2<br />cd linux-2.6.33.2<br /></code><br />Качаем стандартный для Tiny Core конфиг ядра <a href="http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/2.x/release/src/">тут</a>. (Main - Downloads - Current Release - src), кладем в папку с исходниками ядра и переименовываем в ".config"<br /><code><br />wget http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/2.x/release/src/config-2.6.29.1-tinycore<br />mv config-2.6.29.1-tinycore .config<br /></code><br />Далее включаем конфигуратор, правим, если что нужно править(я ничего не трогал), выходим, перезаписываем .config и приступаем к сборке.<br /><code><br />make menuconfig<br />make<br />make bzImage<br />make modules<br />make INSTALL_MOD_PATH=./mod_dir modules_install<br /></code><br /><br />Собранные модули нужно добавить в initrd следующим образом(<a href="http://wiki.tinycorelinux.com/tiki-index.php?page=Remastering">инструкция</a>[eng]:<br /><code><br />mkdir extract<br />cp /mnt/sda1/boot/tinycore.gz ./extract<br />cd extract<br />zcat tinycore.gz | sudo cpio -i -H newc -d<br />rm -rf lib/modules/2.6.29.1-tinycore<br />cp -r ../mod_dir/lib/modules/2.6.33.2-tinycore ./<br />cd ..<br />sudo depmod -b extract 2.6.29.1-tinycore<br />sudo ldconfig -r extract<br />find extract| sudo cpio -o -H newc | gzip -2 > ../tinycore.gz<br />advdef -z4 tinycore.gz<br /></code><br />Всё собрано, осталось перенести в нужное место и подготовить загрузчик.<br /><code><br />cp tinycore.gz /mnt/sda1/boot/tinycore2.gz<br />cp arch/x86/boot/bzImage /mnt/sda1/boot/bzImage2<br /></code><br />Далее открываем /mnt/sda1/boot/grub/menu.lst любым редактором и добавляем туда.<br /><code><br />title tinycore2<br />kernel /boot/bzImage_tr quiet<br />initrd /boot/tinycore2.gz<br /></code><br />Сохраняем, перезагружаемся.<br />После перезагрузки набираем iwconfig.<br />Должен появиться наш интерфейс.<br />Но и это еще не всё!<br />Еще нам нужна прошивка. Cтавим из репозитория b43-fwcutter. А потом делаем так(тоже с linuxwireless)<br /><code><br />wget http://mirror2.openwrt.org/sources/broadcom-wl-4.150.10.5.tar.bz2<br />tar xjf broadcom-wl-4.150.10.5.tar.bz2<br />cd broadcom-wl-4.150.10.5/driver<br />sudo b43-fwcutter wl_apsta_mimo.o<br />sudo mkdir /lib/firmware<br />sudo cp -r b43 /lib/firmware/<br /></code><br />Ну и перезагружаем модуль:<br /><code><br />sudo rmmod b43<br />sudo modprobe b43<br /></code><br />Далее "sudo wicd-start" ну и wicd-curses, например. Где и видим-таки наши долгожданные сети.<br />Проверил, работает, не ломается при переходе в suspend и обратно. В общем всё супер.<br />В качестве бонуса после пересборки ядра заработала прокрутка на тачпаде, с которой достаточно долго ковырялся до этого.<br /><br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com4tag:blogger.com,1999:blog-6010914606047620527.post-70880259034823507522009-12-19T02:50:00.000-08:002009-12-20T02:11:03.912-08:00Прошивка Cyanogen Mod в HTC Magic.Обзавелся таким девайсом и сразу же решил чего-нибудь эдакое туда залить.<br />Прочитал <a href="http://habrahabr.ru/blogs/android/67604/">этот</a> обзор и выбрал прошивку <a href="http://www.cyanogenmod.com/">Cyanogen Mod</a>. Успешно ее залил, рассказываю как у меня это получилось.<br /><span class="fullpost"><br />Для начала нужно определить тип вашего устройства. Их бывает два: 32А и 32В. Отличаются аппаратной частью, в частности объемом оперативной памяти. Делается это следующим образом.<br />1. Выключаем полностью телефон.<br />2. Удерживая кнопку Назад(со стрелкой) нажимаем кнопку включения.<br />3. Должен появиться вот такой веселый экранчик Fastboot.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheOdLJ4NyB0F3ayobCIfmyKcqH39NCgan81ANvpohoRr6sj-KGRXSuOqRJcago31sK96oaiqFkcD3_mneQjT6UDW2kgGQPEPt050fpa3Qzi19Y5JOUbhhT40sRglfWk5WfCk_cQ2TijUjO/s1600-h/photo2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheOdLJ4NyB0F3ayobCIfmyKcqH39NCgan81ANvpohoRr6sj-KGRXSuOqRJcago31sK96oaiqFkcD3_mneQjT6UDW2kgGQPEPt050fpa3Qzi19Y5JOUbhhT40sRglfWk5WfCk_cQ2TijUjO/s400/photo2.jpg" alt="" id="BLOGGER_PHOTO_ID_5417042172825450914" border="0" /></a><br />4. На нем я подчеркнул красным интересующие нас цифры и букву. Как видно, у меня оказалась версия 32В. И дальше рассказ идет про нее. Если у вас вдруг 32А, то чем отличается ее прошивка можно почитать на <a href="http://wiki.cyanogenmod.com/index.php/Main_Page">wiki(eng)</a> CyanogenMod.<br />Теперь нам надо скачать следующие файлы:<br /><a href="http://wiki.cyanogenmod.com/index.php/Install_the_Latest_Android_sdk">Последний Android SDK.</a><br /><a href="http://developer.htc.com/adp.html#s2">Бинарник утилиты fastboot.</a><br /><a href="http://cyanogenmod.com/download/recovery/cm-recovery-1.4.img">Последнюю CM recovery.</a><br /><a href="http://dx.infernix.net/DRC83_base_defanged.zip">Образ базового Android 1.6.</a><br /><a href="http://wiki.cyanogenmod.com/index.php/Latest_version">Сам CyanogenMod.</a><br />Суммарно все весит мегабайт 150, поэтому, если вы не счастливый обладатель N-мегабитной безлимитки, лучше все поставить на загрузку и сходить погулять.<br /><br />Скачали - едем дальше.<br />Распаковываем архив с SDK, например в /usr/local/. Папку tools для удобства желательно добавить в PATH. Бинарник fastboot кладем в tools и делаем исполняемым(chmod +x fastboot). Оставшиеся 3 файла копируем в корень SD карты.<br />Телефон подключаем к компьютеру проводом, загружаем опять в fastboot(экран с тремя зелеными андройдами).<br />На компьютере в терминале из под суперпользователя выполняем<br /><code><br />fastboot boot cm-recovery-1.4.img<br /></code><br />В выводе терминала должно появиться:<br /><code><br />downloading 'boot.img'... OKAY<br />booting... OKAY<br /></code><br />а телефон загрузится в Recovery mode.<br />Теперь, собственно сам процесс прошивки.<br />1. Выбираем пункт wipe data/factory reset. (очистка данных и сброс на заводские настройки)<br />2. Потом пункт apply any zip from sd, в нем выбираем DRC83_base_defanged.zip. Соглашаемся кнопкой Home(с домиком), ждем.<br />3. Ни в коем случаем <span style="font-weight: bold;">НЕ надо</span> перезагружать устройство.<br />4. Снова пункт apply any zip from sd, но теперь выбираем update-cm-4.2.x-signed.zip. Опять соглашаемся, опять ждем.<br />5. Вот теперь можно перезагрузиться соответствующим пунктом или нажатием на Home+Back.<br />6. Первый раз Magic будет грузиться долго, наберитесь терпения и ничего не трогайте.<br /><br />Все, с прошивкой закончено, еще пара дополнительных моментов.<br />Можно установить напостоянную Recovery Mode. Для этого:<br />1. Подключаем загруженный и работающий аппарат к компьютеру проводом.<br />2. Последовательно выполняем команды в терминале компьютера(если вы не используете sudo, то сервер надо запускать из-под root):<br /><code><br />adb kill-server<br />sudo adb start-server<br />flash_image recovery /sdcard/cm-recovery-1.4.img<br /></code><br />И все, теперь, если при включении держать кнопку Home, телефон загрузится в Recovery Mode.<br /><br />На этой прошивке встретилась небольшая проблема с Android Маркетом. Он вывешивает лицензионное соглашение, а кнопки "Принять" там нет. Чтобы обойти это надо в настройках(Меню -> Настройки -> Язык и текст -> Основной язык) выбрать English, принять соглашение(под ним появится кнопка Accept), а потом обратно включить Русский.<br /><br />И напоследок расскажу, как поставить удобную экранную клавиатуру от HTC - Touch input.<br />1. Качаем ее <a href="http://n0rp.chemlab.org/android/apps/HTC_IME.apk">отсюда.</a><br />2. Закидываем на SD карту.<br />3. Открываем с помощью файлового менеджера, например Astro File Manager(ставится из маркета).<br />4. Теперь ее надо включить. Идем в Настройки - Регион и ввод текста, ставим галочку напротив Touch Input. Потом в любом поле ввода удерживаете палец и из меню выбираете Touch input.<br />5. Чтобы появилось переключение на русский, надо повернуть телефон горизонтально. <span style="color: rgb(192, 192, 192);">:-)</span><br /><br />Вроде бы ничего не забыл, если соберусь расскажу о общих впечатлениях от устройства и приложениях. </span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-65491993724486277552009-12-11T00:07:00.000-08:002009-12-14T12:47:08.306-08:00Мышь в 3D приложениях под wine.Сейчас многие не очень новые игры с легкостью запускается под wine, но в трехмерных их представителях бывают проблемы с мышью, из-за которых играть становится невозможно. <br />Я это починил и делюсь как <br /><span class=fullpost><br />Я пробовал это решение на двух играх: Aliens versus Predator(3D action) и Clusterball(аркадная леталка)<br />Проблема примерно в следующем: мышь перемещается только в пределах разрешения экрана, из-за этого нельзя развернуться больше чем на 180 градусов в AvP, а в леталке поворачивать можно только короткими рывками. <br />Ход действий таков:<br />Надо скачать архив с исходниками, например так:<br /><code><br />wget http://downloads.sourceforge.net/project/wine/Source/wine-1.1.33.tar.bz2?use_mirror=sunet<br /></code><br />Потом распаковываем их <br /><code><br />tar xf wine-1.1.33.tar.bz2<br /></code><br />Переходим в папку с нужном файлом<br /><code><br />cd ./wine-1.1.33/dlls/dinput<br /></code><br />Создаем здесь файл mouse.patch со следующим <a href="http://bugs2.winehq.org/attachment.cgi?id=11303">содержанием</a>(взят <a href="http://bugs.winehq.org/show_bug.cgi?id=6971">отсюда</a>, там много других еще есть, для определенных игр и т.д.)<br /><code><br />--- dlls/dinput/mouse.c_old 2008-03-03 11:14:47.000000000 +0100<br />+++ dlls/dinput/mouse.c 2008-03-10 19:23:21.000000000 +0100<br />@@ -306,7 +306,7 @@<br /> wdata = pt1.y;<br /> }<br /> <br />- This->need_warp = (pt.x || pt.y) && dwCoop & DISCL_EXCLUSIVE;<br />+ This->need_warp = (hook->pt.x<2 || hook->pt.y<2 || hook->pt.x>((2 * This->win_centerX)-2) || hook->pt.y>((2 * This->win_centerY)-2) );<br /> break;<br /> }<br /> case WM_MOUSEWHEEL:<br /></code><br />и накладываем патч<br /><code><br />patch -p1 mouse.c mouse.patch<br /></code><br />Потом переходим в папку с исходниками, и командуем обычные:<br /><code><br />./configure<br />make<br />sudo make install<br /></code><br />Перед make install желательно убедиться, чтобы в системе не был установлен пакет родной wine, если установлен - удалить. <br />Должно собраться и поставиться без ошибок. <br />Потом идем в папку с игрой и запускаем как обычно<br /><code><br />wine AvP.exe<br /></code><br />У меня главное меню запускается в окне, но потом разворачивается на весь экран и работает нормально. <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv_vXAzQauYCjY4xYxqghKBRZMd8E7kFCFpK6klh_hz18KDNSeY19-Ad0abVeJBdm4-Wtn-BqN8QoVj0IfzHk6clLV1IW9eTKDSmBDdP1CpXyerMkaXHa7lj59FR8VmTR0xSfbPMiW0VFf/s1600-h/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-3.png+"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv_vXAzQauYCjY4xYxqghKBRZMd8E7kFCFpK6klh_hz18KDNSeY19-Ad0abVeJBdm4-Wtn-BqN8QoVj0IfzHk6clLV1IW9eTKDSmBDdP1CpXyerMkaXHa7lj59FR8VmTR0xSfbPMiW0VFf/s400/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA+%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0-3.png+" border="0" alt=""id="BLOGGER_PHOTO_ID_5415191797781960738" /></a><br />Решение конечно не лучшее, как минимум потому, что не рекомендуется ставить софт из исходников в пакетных дистрибутивах без сборки пакета. Но зато работает. <br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-41053937376771072502009-12-04T09:38:00.000-08:002009-12-04T10:45:50.809-08:00MOC + last.fm + русские тэги в UTF-8Прочитал про этот плеер, понравился, начал пользоваться. Нашлись два маленьких неприятных момента: кривое отображение моих русскоязычных utf-8 тэгов и отсутствие скробблинга на last.fm. Чуток поковырявшись, оба решил, делаю пометку, чтобы не забыть как. <br /><span class=fullpost><br />У меня нет раздела с windows, вся музыка хранится на ext3 разделе и тэги сконвертированы в utf-8 с помощью <a href="http://sourceforge.net/projects/tag2utf/">tag2utf</a>. Но MOC отображает их точками, а если в конфиге выставить параметр ID3v1TagsEncoding=UTF-8, то решеточками. Оказалось, что проблема в тэгах ID3v1 и чтобы ее решить, надо их поудалять, а оставить ID3v2. Чтобы решать проблему комплексно, одновременно с конвертированием, надо делать так:<br />Ставим пакет <span style="font-weight:bold;">python-mutagen</span>(в ubuntu называется так). И даем команду<br /><code><br />find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1<br /></code><br />Команда перебирает все mp3 файлы в текущем каталоге и подкаталогах, обрабатывая их нужным образом. Готово, теперь вся наша музыка в пригодном для переваривания MOC'ом виде. <br /><br />Теперь к скробблингу. Для его организации нам будет нужна опция OnSongChange в конфиге. Ее наличие зависит от версии MOC. Мне пришлось обновиться на вариант devel(2.5.0-alpha4), так как в обычном этой опции не было. <br />Кроме этого надо поставить пакет <span style="font-weight:bold;">lastfmsubmitd</span>. В конфиге(/etc/lastfmsubmitd.conf) прописать данные своего аккаунта. Если будет ругаться на отсутствие данных аккаунта, значит что-то с правами доступа к этому файлу. <br />Потом создать скрипт <a href="http://files.lukeplant.fastmail.fm/public/moc_submit_lastfm">moc_submit_lastfm</a>, вот такого содержания:<br /><code><br />#!/usr/bin/env python<br /><br />from datetime import datetime<br />from optparse import OptionParser<br />from subprocess import call, Popen, PIPE<br />import time<br /><br />parser = OptionParser()<br />parser.add_option("-a", "--artist", dest="artist")<br />parser.add_option("-t", "--title", dest="title")<br />parser.add_option("-A", "--album", dest="album")<br />parser.add_option("-l", "--length", dest="length")<br /><br /># Treating everything as bytestrings throughout seems to work OK even<br /># with non-ASCII characters in song titles etc (at least with a UTF-8<br /># locale).<br /><br />def still_playing(artist, album, title):<br /> p = Popen(["mocp", "-i"], stdout=PIPE)<br /> out, err = p.communicate()<br /> lines = out.split("\n")<br /> for s in ["Artist: %s" % artist, "Album: %s" % album, "SongTitle: %s" % title]:<br /> if not s in lines:<br /> return False<br /> return True<br /><br />def submit_to_lastfm(artist, album, title, length):<br /> args = ["/usr/lib/lastfmsubmitd/lastfmsubmit", "--artist", artist, "--title", title, "--length", length]<br /> if album is not None:<br /> args.extend(["--album", album])<br /> call(args)<br /><br />def main():<br /> options, args = parser.parse_args()<br /> if any(not options.__dict__.get(k) for k in ["artist", "title", "length"]):<br /> print "All of artist, album, length must be specified"<br /> exit(1)<br /> if ":" in options.length:<br /> mins, secs = options.length.split(":")<br /> length = int(mins) * 60 + int(secs)<br /> else:<br /> length = int(options.length)<br /> # wait until song is half played<br /> wait = length/2<br /><br /> start = datetime.now()<br /> while True:<br /> time.sleep(5)<br /> if not still_playing(options.artist, options.album, options.title):<br /> exit(1)<br /> if (datetime.now() - start).seconds > wait:<br /> submit_to_lastfm(options.artist, options.album, options.title, options.length)<br /> exit(0)<br /><br />if __name__ == '__main__':<br /> import sys<br /> main()<br /></code><br />И в конфиге .moc/config задать вышеуказанную OnSongChange:<br /><code><br />OnSongChange = "/home/triklozoid/bin/moc_submit_lastfm --artist %a --title %t --length %d --album %r"<br /></code><br />заменив путь на путь к созданному Вами скрипту. <br /><br />Вот и все, вроде ничего не забыл. <br /><br />Про скробблинг прочитал <a href="http://lukeplant.me.uk/blog/posts/moc-and-last-fm/">здесь</a>, про перекодирование <a href="http://blog.bookwar.info/?p=63">здесь</a>, про MOC <a href="http://mydebianblog.blogspot.com/2009/07/mocp-music-on-console-player.html">тут</a> и <a href="http://vonderer.blogspot.com/2006/10/music-on-console-xmms.html">там</a>. <br /><br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-15118894911847882862009-11-18T05:39:00.000-08:002009-11-18T06:10:37.969-08:00Быстрый поиск в pidgin.В данный момент использую pidgin в качестве IM и частенько пользуюсь просмотром журналов. И обратил внимание, что поиск работает неприлично долго: от 3 до 10 секунд при размере журнала 500 кб. Не знаю с чем это может быть связано, но это натолкнуло меня на мысль: а не изобрести ли мне велосипед?<br />Встречаем..<br /><span class="fullpost"><br />Вдохновился вот <a href="http://linsovet.com/content/pidgin-script-alternative-search">этим</a> постом, даже пытался переделать скрипт под себя, но с shell скриптом вообще не знаком, поэтому решил соорудить что-то свое на perl(с которым тоже конечно на "Вы", но что-то <span style="color: rgb(192, 192, 192);">плохо</span>работающее соорудить могу).<br /><br /><code><br /><PRE><br />#!/usr/bin/perl<br />#тут у нас интерпретатор<br /><br />#все серьёзно :)<br />use strict;<br />use warnings;<br /><br />#подключаем поддержку utf-8<br />use utf8;<br />use encoding 'UTF-8';<br />use Encode qw(encode decode is_utf8);<br />use open ':utf8';<br /><br />#тут можно указать свою любимую оперу или, скажем elinks<br />my $browser="firefox";<br />#импорт домашней директории из оболочки<br />chomp(my $home=`echo \$HOME`);<br /><br />#ввод данных<br />print "Введите ICQ номер собеседника:\n";<br />chomp(my $icq_number=<STDIN>);<br /><br />print "Введите значение для поиска:\n";<br />chomp (my $find_value=<STDIN>);<br /><br />#удаление временной директории<br />`rm -r $home/temp_icq_hist/ >/dev/null`;<br />#создание пустой временнной директории<br />`mkdir $home/temp_icq_hist >/dev/null`;<br />#создание копии логов заданного номера<br />`cp -r $home/.purple/logs/icq/347298877/$icq_number \$HOME/temp_icq_hist/`;<br /><br />#открываем дескриптор файла с результатами поиска<br />open RESULT, ">", "$home/temp_icq_hist/result.htm";<br /><br />#пишем в него эту строку для правильного определения кодировки<br />print RESULT '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">';<br /><br />#объявляем переменные<br />my (@file_strings,$i,$flag,$anchor_number);<br /><br />#получаем список файлов с логами<br />opendir DIR, "$home/temp_icq_hist/$icq_number";<br />my @files=readdir DIR ;<br /><br />#сортируем его в обратном порядке<br />@files=reverse sort @files;<br /><br />#для каждого из файлов..<br />foreach (@files) {<br /><br />#открываем дескриптор очередного файла логов<br />open FILE, "$home/temp_icq_hist/$icq_number/$_";<br />#читаем файл целиком в массив<br />@file_strings=<FILE>;<br /><br />#открываем дескриптор для этого же файла на запись<br />open FILE, ">", "$home/temp_icq_hist/$icq_number/$_";<br /><br />#обнуление счетчика якорей<br />$anchor_number=0;<br />#начинаем построчную обработку<br />for ($i=0;$i<scalar(@file_strings);$i++){<br /><br />#если есть совпадение с искомым значением начаем писать<br />if ($file_strings[$i]=~/$find_value/i){<br /><br />#в файл логов пишем строку с присоединенным якорем<br />print FILE "<a name=\"$anchor_number\"></a>$file_strings[$i]";<br /><br />#в файл результатов пишем ссылку на якорь, предыдущую строку, текущую и следующую<br />print RESULT "<hr> <br /><a href=$icq_number/$_#$anchor_number>$_</a><br><br />$file_strings[$i-1];<br />$`<span style=\"background: rgb(153, 255, 153)\">$&</span>$'<br />$file_strings[$i+1]";<br />#увеличиваем счетчик на единицу, чтобы избежать обработки двух строк <br />$i++;<br />#номер якоря<br />$anchor_number++;<br /> }<br />#если совпадения нет, просто пишем строку в логи<br />else {<br />print FILE $file_strings[$i];<br />}<br /> }} <br />#закрытие дескриптора результатов<br />close RESULT;<br /><br />#открываем файл браузером<br />`$browser $home/temp_icq_hist/result.htm` <br /></PRE><br /></code><br />И эта жуткая штука выполняется за время в пределах полутора секунд, что меня вполне устроило. Кроме того получил немного опыта и много удовольствия от процесса. <br />Замечания, критика, предложения по улучшению и пожелания больше никогда не брать в руки текстовый редактор приветствуются. ;)<br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-35680806963943113022009-10-05T02:31:00.000-07:002009-10-13T00:40:03.369-07:00Допиливаем IceWM под себя.Уже довольно продолжительное время использую IceWM в качестве оконного менеджера и постепенно улучшаю свое существование в нем разными полезными и удобными вещами.<br />В этой заметке попытаюсь поделиться ими с людьми.<br /><span class="fullpost"><br /><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIKoxFasD2j9JVnZHFf2uI1g-OvhK_GjoIt8ztj7acAht-TLZGqT6ilWg0PTOvehWBXTYl347w0dcOyIt-7akjjDsnFF1KK4oZ58ogDnHSG7oATutrf8JIEJMxHBdbcHQyw6SYdCQ0Y0Pb/s800/icewm.png" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIKoxFasD2j9JVnZHFf2uI1g-OvhK_GjoIt8ztj7acAht-TLZGqT6ilWg0PTOvehWBXTYl347w0dcOyIt-7akjjDsnFF1KK4oZ58ogDnHSG7oATutrf8JIEJMxHBdbcHQyw6SYdCQ0Y0Pb/s800/icewm.png" /><br />Я проделывал все это под Ubuntu, но в принципе советы универсальны для любого дистрибутива, только приложения нужно устанавливать через свой менеджер пакетов.<br /><br /><span style="font-weight: bold;font-size:130%;" >Переключение раскладки.</span><br />Тут есть два момента:<br />1. Раскладка должна переключаться(обязательно)<br />2. Должен отображаться индикатор(желательно)<br />Первый я традиционно решаю с помощью xorg.conf, вписывая туда в секцию "InputDevice" следующие буквы:<br /><code><br />Identifier "Generic Keyboard"<br />Driver "kbd"<br />Option "XkbRules" "xorg"<br />Option "XkbModel" "pc105"<br />Option "XkbLayout" "us,ru"<br />Option "XkbOptions" "grp:alt_shift_toggle"<br /></code><br />Второй момент решается быстро и безболезненно установкой пакета fbxkb. Есть конечно другие варианты, но мне этого более чем хватило, остальные даже пробовать не стал.<br /><span style="font-weight: bold;"><br /><span style="font-size:130%;">Календарь</span></span><br />На примере календаря продемонстрирую один интересный момент в тонкой настройке системы.<br />Итак, нам нужно настроить кнопочку в трее, по которой рядом с ней будет появляться календарь, а потом исчезать, опять же по нажатию.<br />Ставим пакет xcalendar. По одноименной команде появляется этот календарь, но появляется где попало и вообще, на <strike><span style="color: rgb(153, 153, 153);">виндовый</span></strike>привычный календарь похож мало. Чтобы привести его в божеский вид, нужно использовать конфигурационный файл winoptions, из папки ~/.icewm. Он позволяет тонко настраивать поведение окна для каждого приложения. Сначала, с помощью команды xprop необходимо узнать имя окна приложения. Запускаем в терминале:<br /><code><br />xprop|grep WM_CLASS<br /></code><br />Курсор изменяется на плюсик и ткнув в нужное окошко, в терминале появится строка вроде этой:<br /><code><br />WM_CLASS(STRING) = "xcalendar", "XCalendar"<br /></code><br />Здесь, значение в первых кавычках, это как раз нужное нам имя.<br />Создаем файл ~/.icewm/winoptions с такие содержанием:(если файл уже есть, то дописать в конец)<br /><code><br />xcalendar.tray: Exclusive<br />#создать иконку в трее и не создавать кнопку на панели<br />xcalendar.geometry: +800+800<br />#расположить окно в правом нижнем углу(цифры должны соответствовать выбранному разрешению)<br />xcalendar.dTitleBar: 0 <br />#не отображать заголовок окна<br />xcalendar.icon: /usr/share/icons/Human/24x24/apps/menu-editor.png<br />#иконка<br />xcalendar.allWorkspaces: 1<br />#отображать на всех рабочих столах<br />xcalendar.ignoreQuickSwitch: 1 <br />#не отобрать в списке окон по Alt+Tab<br /></code><br />Об остальных опциях можно почитать в <a href="file:///usr/share/doc/icewm/html/icewm.html">документации. </a><br /><br /><span style="font-weight: bold;font-size:130%;" >Заметки </span><br />Изначально использовал tomboy, но какой-то он слишком задумчивый(видимо из-за Mono), поэтому поменял его на zim. Какой-то специальный функционал меня не интересует, просто иметь возможность чего-нибудь быстренько записать и потом не потерять.<br />Пару моментов, как сделать, чтобы он правильно запускался и не мешал.<br />Заходим в Правка-Настройки-Дополнения и ставим галочку напротив TrayIcon. После этого можно запускать автоматически следующей командой:<br /><code><br />zim --iconify ~/Notes/<br /></code><br />где ~/Notes/ - адрес вашего блокнота.<br /><span style="font-weight: bold;"><br /><span style="font-size:130%;">Автозапуск</span></span><br />Автозапуск приложений при старте icewm реализуется с помощью скрипта startup, который должен лежать в директории "/home/username/.icewm/".<br />Он должен быть выполняемым (chmod +x startup).<br />Вот пример моего файла:<br /><code><br />xcalendar &<br />rfcomm-dev-create &<br />gnome-power-manager &<br />zim --iconify ~/Notes/ &<br />fbxkb &<br />nm-applet &<br /></code><span style="font-size:130%;"><br /></span><span style="font-weight: bold;font-size:130%;" >Файловый менеджер и автомонтирование накопителей. </span><br />Обе задачи решаются с помощью pcmanfm. Легкий и обладает достаточным фукционалом. Проблемы с монтированием могут возникать достаточно экзотические, в зависимости от конкретного дистрибутива. Решаются с помощью google и прямых рук. ;)<br />Кроме того он может управлять рабочим столом, отображать фон и значки.<br /><br />Для настройки сети я использую гномовский апплет, который запускается командой <span style="font-weight: bold;">nm-applet</span>.<br /><br /><span style="font-weight: bold;">Состояние батареи. </span><br />Для контроля состояния батареи раньше похожим образом использовал gnome-power-manager, но недавно в preferences наткнулся на родной индикатор. Параметр выглядит так:<br /><code>TaskBarShowAPMStatus=1 </code><br />Симпатичную цветную батарейку он, правда, не показывает, но ее заменяют вполне информативные цифры, которые при питании от батареи отображают примерное оставшееся время работы, а при работе от сети процент заряда аккумулятора. <span style="font-weight: bold;"><span style="font-weight: bold;"></span></span><span style="font-weight: bold;"></span><br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Шрифты.</span></span><br />Еще скажу немного о <span>шрифтах.</span> Есть <a href="http://techwork.ru/2008/08/30/how-to-make-good-fonts-in-ubuntu/">очень хорошая и полная статья</a> по их настройке, но там очень много шагов, а я расскажу какими ограничился я и результат меня устроил. У меня десятидюймовый экран от eeePC.<br />1. Измерил линейкой ширину экрана: 22 см. Сделал расчет по формуле<br />1024 точек / (22 см / 2,54) = 118 точек на дюйм<br />2. Открыл gnome-appearance-properties, на вкладке Шрифты включил "Субпиксельное сглаживание". Потом в кнопке Подробнее указал полученное выше значение.<br />Все, после этого шрифты стали заметно глаже и симпатичнее. Кому этого мало, прошу по <a href="http://techwork.ru/2008/08/30/how-to-make-good-fonts-in-ubuntu/">ссылке.</a><br /><br /><br />В принципе это все, что я успел на данный момент <strike>наломать</strike> настроить.<br />Также рекомендую почитать замечательные статьи о <a href="http://mydebianblog.blogspot.com/2006/10/icewm.html">настройке,</a> <a href="http://mydebianblog.blogspot.com/2007/04/icewm.html"> темах </a>и <a href="http://mydebianblog.blogspot.com/2008/05/icewm-10.html">возможностях</a> IceWM.<br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com6tag:blogger.com,1999:blog-6010914606047620527.post-78663487581206035742009-09-03T00:08:00.000-07:002009-09-03T00:51:30.822-07:00Кто сожрал трафик или просмотр tcp соединений под linux'ом.Еще в далекие темный времена использования неправильных ОС, частенько возникала проблема пропажи трафика, особенно остро встающая при подключении к интернет через gprs. Под windows это может быть связано с вирусами, но могут и какие-то совершенно честные приложения внезапно надумать обновиться. Недавно столкнулся с этим же под линуксом и вскоре нашел решение. <br /><span class=fullpost><br />Заключается оно в использовании встроенной утилиты <b>netstat.</b><br />Все делается проще некуда, команда:<br /><code><br />netstat -tp<br /></code><br />выведет нам примерно такую табличку:<br /><code><br />Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name<br />tcp 0 0 gprs-internet:52725 buddychat-m02b ESTABLISHED 5101/pidgin <br />tcp 0 0 gprs-internet:46308 sablino:afs3-f ESTABLISHED 6364/firefox <br />tcp 0 0 gprs-internet:58030 bos-m053b-sdr2 ESTABLISHED 5101/pidgin <br />tcp 0 0 gprs-internet:51400 ww-in-f125.goo ESTABLISHED 5101/pidgin <br /></code><br />Наибольший интерес представляет последний столбец(добавляемый ключом <span style="font-weight:bold;">-p</span>), который позволяет вычислить нарушителя. <br />Также можно добавить ключ <span style="font-weight:bold;">-c</span> и тогда информацию будет обновляться раз в секунду. <br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-69389343496647331762009-07-10T07:07:00.000-07:002009-07-10T07:23:39.603-07:00Громкость записи звука в LinuxДавно не давала жить спокойно такая проблема. При записи звука с помощью Audacity, записывалось не пойми что(в плане каналов), а иногда ничего, просто тишина. Недавно, чисто случайно, натолкнулся на ее решение. Решил сделать пометку на память. <br /><span class=fullpost><br />В виндоус для этого открывался Регулятор громкости, там в параметрах выбиралось "Запись" и вот они желанные ручки. Правда работали они не всегда, но это уже мелочи. <br />Я предполагал, что в линуксе все должно быть также, но добраться до них никак не получалось. Решение до ужаса просто:<br />Запускаем в терминале <br /><br /><code> alsamixer -V Capture</code><br /><br />И все. Видим как раз то, что нам надо. Работает замечательно и как надо, я никаких проблем не нашел.<br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com0tag:blogger.com,1999:blog-6010914606047620527.post-38616469674631941032009-01-08T10:49:00.000-08:002009-01-28T04:17:55.631-08:00Выбор и настройка сканера в Linux.После долгих мытарств, я все-таки решил свою проблему со сканером.<br /><span class="fullpost"><br /><br />После мучительных и продолжительных попыток, я отчаялся заставить работать свой старый сканер <span style="font-weight: bold;">Benq 5000</span>, и, решив подойти к проблеме кардинально, купил другой.<br />В начале пару слов о старом. На сайте SANE обещают поддержку на уровне "good", то есть пригодную для "day-to-day use". Я пытался заставить его работать в течении примерно полутора лет. Он замечательно определялся в sane-</span><span class="fullpost">find-scanner, цеплялся xsane'ом, но при попытке запуска предварительного просмотра упорно выдавал "Ошибка ввода-вывода при работе с устройством". Я пытался воткнуть разные прошивки, но бестолку. Потом, совсем недавно узнал(к сожалению уже не помню где), что на самом деле так и должно быть. Поддержка на уровне good, это без режима предварительного сканирования, только черно-белое и только в разрешении 1200dpi. Какой уж тут "day-to-day", этим же вообще пользоваться невозможно. Перезагружаться в windows ради сканера мне уже порядком надоело, поэтому я нашел-таки выход, хоть и немного странный. Я ставил VirtualBox с поддержкой usb, туда винду и родные дрова. И настраивал сохранение изображений сразу в об</span><span class="fullpost">щую папку. Не супер конечно, но всё же лучше, чем перезагружаться...<br />И вот теперь, пока после Нового года остались недотраченные деньги <span style="color: rgb(192, 192, 192);">:)</span> решил избавиться от этой проблемы до конца. Я сразу стал искать, у каких сканеров лучше всего отношения с линуксом и пришел к выводу, что у Epson'ов. Вывод я такой сделал, побывав вот на <a href="http://www.avasys.jp/lx-bin2/linux_e/scan/DL1.do">этой</a> странице. Там можно скачать драйвера практически для всех их современных моделей.<br />Базой по поддержке SANE я не стал пользоваться по 2 соображениям. Про одно я уже говорил, сканер обозначенный как good, на самом деле едва ли может хоть что-то сделать. А второе заключается в том, что сканеры(я смотре</span><span class="fullpost">л epson'овские) с поддержкой уровня "complete" или уже не продаются или стоят больше 15 тысяч... Мне же ничего сверхъестественного не было нужно, просто возможность нормально сканировать документы и изображения. Поэтому, побродив по Маркету, а выбрал самую дешевую модель, а именно <span style="font-weight: bold;">Perfection V10</span>.<br />Теперь пару слов о настройке. Обратите внимание на "пару слов". Не инструкция на 5 страницах, из которых примерно половина консольные команды, а именно пара слов. На моей системе (Sabayon) вся настройка заключалась в уст</span><span class="fullpost">ановке пакета iscan. Предполагаю, что на абсолютном большинстве пакетных систем все будет аналогочно. Если же такого пакета вдруг в репозиториях не окажется, то по вышеуказанной ссылке можно скачать исходники в .tar.gz и собрать все самому. Больше делать ничего не пришлось. Я включил xsane, нажал "Предварительное сканирование" и вуаля! Несколько секунд на прогрев и начинает появляться изображение. Я чуток поигрался, попробовал цветной и черно-белый </span><span class="fullpost">режим в разных разрешениях, все работает, как по маслу. Если вдруг столкнусь с какой-нибудь проблемой, обязательно здесь ее опишу.<br />На этом закругляюсь, очень надеюсь, что этот пост кому-нибудь поможет сделать правильный выбор при покупке.<br />Выглядит он примерно так:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk2rTB41hJRbDeGjQMWoPKlB1-S3sgBJ_M4S0Xbqa0LiLuhea4uJNcidGIcRtY-V16JPjdbj18T6NjnTgKbSJ_i7pzHl5olRp4RLGYF5kbCCxxD7WGdawfUydCCUaPumXrdD-NSfgP59Ok/s1600-h/p1010093.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 299px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk2rTB41hJRbDeGjQMWoPKlB1-S3sgBJ_M4S0Xbqa0LiLuhea4uJNcidGIcRtY-V16JPjdbj18T6NjnTgKbSJ_i7pzHl5olRp4RLGYF5kbCCxxD7WGdawfUydCCUaPumXrdD-NSfgP59Ok/s400/p1010093.jpg" alt="" id="BLOGGER_PHOTO_ID_5289075270702569970" border="0" /></a><br /><span class="fullpost"><br /></span><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-50127215867526553912008-11-12T00:09:00.001-08:002008-11-13T22:17:02.788-08:00Кодировки в текстовых файлах.Коротенькая заметка по конвертированию текстовых файлов в utf8 в качестве памятки.<br /><span class="fullpost"><br />Доставшееся виндовое наследие в виде каких-то заметок, записок, рецептов, стихов и прочих текстовых документиков долго не давало мне покоя, из-за того, что хранилось оно в кодировке CP1251.<br />Чтобы спать спокойно, нужно все это перевести в utf8. Желательно легко, быстро и все сразу. Такой способ есть. Для этого нам понадобится программа enconv, входящая в пакет enca. Работать с ней до безобразия просто. Команда<br /><br /><span style="font-weight: bold;">enconv zametki.txt</span><br /><br />автоматически определяет кодировку файла и конвертирует в родную кодировку локали с перезаписью файла.<br />Соответственно, чтобы сконвертировать все разом, нужно скомандовать примерно следующее:<br /><br /><span class="fullpost"><span style="font-weight: bold;">find /home/user/ -name "*.txt" |enconv</span></span><br /><br />и все станет великолепно. Файлы которые уже в utf8, enconv не трогает, они остаются без изменений.<br /><br />Но все равно остается шанс столкнуться с файлом в ненавистной cp1251. С этим можно бороться двумя способами.<br />1. Поставить leafpad. Никаких особых достоинств типа подсветки синтаксиса или автодополнения кода у него нет, но зато он замечательно автоматически определяет кодировку файла и отображает его в читаемом виде. К тому же он достаточно легкий и быстрый.<br />2. Можно допилить стандартный гномовский gedit по <a href="http://www.openkazan.info/gedit_windows-1251_utf8">инструкции</a>, посоветованной мне товарищем Cucumber. Я попробовал, у меня все заработало.<br />Огромное спасибо коментаторам, с их подачи пост был практически полностью переписан.<br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com12tag:blogger.com,1999:blog-6010914606047620527.post-71922832130060429592008-09-09T22:20:00.000-07:002008-11-25T12:02:15.765-08:00Мои впечатления о eeePC.Недавно стал счастливым обладателем этого замечательного девайса и хотел поделиться впечатлениями от его использования. <br /><span class="fullpost"><br />Их существует достаточно много разновидностей, моя называется eeePC 1000.<br />Характеристики Intel Atom 1.6/1024MB RAM/40Gb SSD/Bluetooth/Wi-fi/10" дисплей.<br />Продавался он с предустановленным линуксом - Xandros. Поначалу нравилось, непривычное ощущение, вроде и линукс, а вроде и все работает. Потом выяснилось, что на самом деле не все. Набор приложений в репозиториях, которые можно подключить (включая всякие левые) откровенно беден и версии давно устаревшие. Вообщем я понял, надо ставить что-то свое. Остановил свой выбор на Debian Lenny. Давно хотел где-нибудь дебиан попробовать, но все как-то у меня с ним не складывалось. В этот раз сложилось.<br />Ставил я его по <a href="http://wiki.debian.org/DebianEeePC/HowTo/Install">этой</a> инструкции. Все делал как написано и никаких проблем при установке не возникло. После установки, впрочем, проблем тоже не было. Практически все работает, проще сказать, что не работает. Не работают частично Fn клавиши. В частности клавиша переключения режимов работы WiFi/Bluetooth. Это означает, что включить или выключить эти устройства можно только из биоса. Особых проблем это не доставляет, у меня они все время включены, благо батарейка это позволяет.<br />К слову о батарейке. Это один из очень заметных существенных плюсов. В режиме набора текстов он без труда работает 6 часов, при максимальной яркости экрана. Фильмы я смотреть не пробовал, но уверен, что в режиме просмотра фильма со звуком - 3,5..4 часа он протянет.<br />По поводу экрана. Размер у него оптимальный. Он настолько мал, насколько это возможно без создания критических неудобств. Кроме того, изображение на нем вполне разборчиво даже в прямом солнечном свете.(сказывается то, что он матовый).<br />Клавиатура. Клавиатура тоже удобная(ну, насколько может быть удобной клавиатура ноутбука...), за исключением одной досадной детали. Это правый шифт. Постоянно попадаешь на кнопку вверх. Но со временем все равно привыкаешь.<br />Тачпад. Туговаты кнопки, нажимать приходится с усилием. Зато Multitouch очень удобная штука. Изображения масштабировать это скорее игрушки, но вот использование двух пальцев для эмуляции колесика мыши - очень удобная штука. Привык мгновенно и теперь на всех других ноутбуках пытаюсь прокручивать страницы аналогичным образом.<br />Вес и размер меня устраивает. Таскаю его целый день с собой и к вечеру плечо не отваливается, как это было раньше с моим HP nx6110.<br />Вот он, красавец.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlTeQ-DgmwFnpomg0Fc_Hyfoxm1nQ5yhsmOcYqXKLO8JZf6J-MhJS0TXo15mC0ZHqkq6pKR9IqmeSTybuzOyfMErQeGQyagSD8GBJAxNpY6jvCZLRBVyJGqs29_O6IgOROnikNAR1blu_T/s1600-h/eeePC.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlTeQ-DgmwFnpomg0Fc_Hyfoxm1nQ5yhsmOcYqXKLO8JZf6J-MhJS0TXo15mC0ZHqkq6pKR9IqmeSTybuzOyfMErQeGQyagSD8GBJAxNpY6jvCZLRBVyJGqs29_O6IgOROnikNAR1blu_T/s400/eeePC.JPG" alt="" id="BLOGGER_PHOTO_ID_5272684604836619938" border="0" /></a><br /><br />Резюмируя, могу сказать, что доволен я, как слон, и о потраченных деньгах ничуть не жалею.<br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-32319044667581573632008-08-29T12:09:00.000-07:002008-11-25T12:03:00.507-08:00qutIM - лучший icq клиент под linux.Небольшая заметка о молодом и подающем огромные надежды ICQ клиенте.<br /><span class=fullpost><br />Сбылась моя давнишняя мечта. Теперь можно нормально пользоваться аськой под линуксом. Именно <span style="font-weight: bold;">нормально</span>, без всяких оговорок и извечных отмазок в духе "эта функция не работает? да на фиг она тебе, я вот не пользуюсь и все в порядке".<br />Никаких проблем с кодировками. Передача файлов, х-статусы. Чудеса да и только. И это несмотря на то, что текущая версия программы на момент написания заметки 0.1.1.<br />В репозитории ее найти пока еще сложновато, но собранные бинарные пакеты для популярных дистрибутивов есть на <a href="http://qutim.org">сайте программы.</a> <br />Тех, кто уже не первый месяц(год) пользуется линуксом программка скорее всего не заинтересует, так как уже давно найдено свое решение проблемы. Я, к примеру, привык к jabber'у с icq транспортом. Невысокая стабильность и проблемы с поддержкой асечных сервисов компенсируется для меня сохранением истории сообщений в gmail'е. (пользуясь аськой на работе, дома, в гостях, в дороге с телефона и обладая изрядной рассеянностью и забывчивостью, считаю, что это очень полезно.)<br />Но, раньше, когда мне требовалось передать/принять файл или воспользоваться поиском, мне приходилось извращаться, запуская qip под wine'ом. Теперь для этого я использую qutim. Это значительно проще и идеологически правильнее. <span style="color: rgb(204, 204, 204);">:)</span><br />А уж для людей, которые переходят на линукс, qutim станет просто незаменимой вещью.<br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com6tag:blogger.com,1999:blog-6010914606047620527.post-71690075937841086712008-06-22T06:37:00.000-07:002009-07-13T14:56:32.276-07:00Интернет в каждый дом!Решил поделиться очередным(и надеюсь завершающим) эпизодом из саги о моем домашнем интернете.<br /><br /><span class="fullpost"><br /><br />Небольшая предыстория.<br />Я живу в деревне Сидоровка, примерно в 650 метрах от более или менее цивилизованного города Краснознаменска(который, в свою очередь находится в 20 км от МКАДа). Мечтаю о нормальном интернете уже давно и основательно. Первоначально приходилось довольствоваться gprs'ом, потом "проапгрейдил" его до спутникового.(долго собирался написать о его настройке под линуксом, но так наверное уже и не соберусь)<br />Продумывал варианты подключения по радиоканалу(<a href="http://www.enforta.com/">www.5g.ru</a>), но не очень устраивала цена. Примерно 20 тыс рублей за подключение и 2000 рублей в месяц за безлимитку 128 кбит.<br />Потом набрел на сайт <a href="http://www.wifiantenna.org.ua/">http://www.wifiantenna.org.ua/</a>, прочитал там про увеличение радуса действия wifi с помощью самодельных антенн и загорелся идеей протянуть беспроводную сеть.<br /><br />Я использовал следующее оборудование:<br />Роутер Dlink DIR-300 - 1 шт. (1200 рублей)<br />Точка доступа Dlink DWL-2100AP - 2 шт. (3000 рублей обе)<br />Контейнер пластмассовый для еды - 1 шт. (250 рублей)<br />Кабели: витая пара и обычный кабель для проводки. (500 рублей)<br /><br />Процесс проходил достаточно беспорядочно и хаотично, делать я пытался все сразу, но здесь попытаюсь изложить более упорядочено.<br /><br />Первым пунктом нужно найти сам интернет. Мне в этом деле повезло. У меня в крайнем доме города живет друг, которого без особого труда удалось убедить подключиться к местному провайдеру "напополам".<br /><br />Вторым пунктом идет установка вышеперечисленного оборудования.<br />Без особых проблем настроил роутер по <a href="http://www.d-link.ru/technical/faq_internet_54.php">мануалу.</a> В один порт подключил компьютер друга, в другой одну из точек доступа. Существенная проблема состояла в том, что окна у друга выходят на улицу в направлении, противоположном моему дому. Поэтому пришлось протаскивать провода по подъезду. Я тащил витую пару и питание по двум отдельным проводам. Читал про Power over Ethernet, но показалось, что протащить 15 метров 2 проводов, вместо одного проще.<br />Точку я подвесил на улице(5 этаж), для усиления сигнала и защиты от злоумышленников :). От дождя ее защищает пластмассовый контейнер, а вот что с ней будет на морозе я пока не знаю, с тревогой жду зимы. В спецификации конечно же указано, что она предназначена исключительно для работы в помещении, но вселяют надежду отзывы о нормальной работе при температуре до -25. Никаких специфических настроек я не делал, режим AP, шифрования нет.<br />Вторая точка стоит в помещении на подоконнике. Она соединена со свитчем в моей комнате витой парой и работает в режиме AP Repeater. При этом к ней можно цепляться по wifi и через свитч подключать любое количество компьютеров проводами.<br /><br />Третьим пунктом доллжно было быть подключение антенн, но тут вышло небольшое недоразумение. Оказалось, что на таком расстоянии коннект великолепно устанавливается и без всяких антенн. Можно было конечно чисто из интереса попробовать, но антенны еще не доделаны, а интернет-то он вот, бери и пользуйся. Я так и поступил.<br />Пользуюсь и не устаю радоваться. Скорость, отзывчивость и стабильность, по сравнению со спутником, возрасли в разы. Ping www.google.com - в районе 80 мс. По сравнению с 700-900 на gprs и 1200-1500 на спутнике это просто супер.<br /><br /><br /><br /><br /><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx6x4PAsnu9HSj5P1lDph0HwVbfRsaI7de5ODYvnjbx8pm_RP6CU1A6bLmoUneD1upNDuLW7eTIjTUC4oe7ek6eARdKVk9SyRG4zPAXzqPmZx11bTBCSzcr-BJIzyPZafdhk72wyaKlj_T/s1600-h/123.PNG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx6x4PAsnu9HSj5P1lDph0HwVbfRsaI7de5ODYvnjbx8pm_RP6CU1A6bLmoUneD1upNDuLW7eTIjTUC4oe7ek6eARdKVk9SyRG4zPAXzqPmZx11bTBCSzcr-BJIzyPZafdhk72wyaKlj_T/s400/123.PNG" alt="" id="BLOGGER_PHOTO_ID_5216666886756095346" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPszDuXXZ9dEiD50QrH8zmZ0SzCbHoM-beJWU9Q_bhyOXNWWad1iHBlw70i0GybKFBipptOIJTn-ZKrnWz2LZpUOSdjuqKV37UHbtCGPFux53kEvkPEEslPzyi45NEaxPeEuhh88lU0nsT/s1600-h/DSC00030.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPszDuXXZ9dEiD50QrH8zmZ0SzCbHoM-beJWU9Q_bhyOXNWWad1iHBlw70i0GybKFBipptOIJTn-ZKrnWz2LZpUOSdjuqKV37UHbtCGPFux53kEvkPEEslPzyi45NEaxPeEuhh88lU0nsT/s400/DSC00030.JPG" alt="" id="BLOGGER_PHOTO_ID_5216667885529812594" border="0" /></a><br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOhy99hbgBiHJxQEKhgkYHVpDdGUAoCx5F4cS5iJ2_tYJVcls5n6Zcts-r9uYLg0umKk77jdT9huaK87Ds9MYfrWEV-ID4elYGshSr34xjuBX0dn_uo4FKxreC0CCLfUcn4iL_kAvZKrEQ/s1600-h/DSC00034.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOhy99hbgBiHJxQEKhgkYHVpDdGUAoCx5F4cS5iJ2_tYJVcls5n6Zcts-r9uYLg0umKk77jdT9huaK87Ds9MYfrWEV-ID4elYGshSr34xjuBX0dn_uo4FKxreC0CCLfUcn4iL_kAvZKrEQ/s400/DSC00034.JPG" alt="" id="BLOGGER_PHOTO_ID_5216785532293664354" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjob3svUUqvEnU5ZiG7X817gO57U0QyH1mM53VvJGt1w-Xo9Spge_zS4dtSXZ3eyW4Ec3QpClGiTeIUJgCjrjs1qYkXsivC1bFDeyoZ8fyKxNmXl1tKvWrnCczHIRxxEME7YxbErpVG4C0n/s1600-h/DSC00031.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjob3svUUqvEnU5ZiG7X817gO57U0QyH1mM53VvJGt1w-Xo9Spge_zS4dtSXZ3eyW4Ec3QpClGiTeIUJgCjrjs1qYkXsivC1bFDeyoZ8fyKxNmXl1tKvWrnCczHIRxxEME7YxbErpVG4C0n/s400/DSC00031.JPG" alt="" id="BLOGGER_PHOTO_ID_5216908833664199986" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZZE-14nNvkY9yc0T8EkqzgRz28FAuDYHc_XiucCZnbBlqHvmw_xZRz1tQSAkuw18U_EzGFRhDKptSjP8QqKivgoaI5YfcBO_FBb1qrBaEiPUfQbSijkTaipemNVKGIuFVvIRG1WyQ1Z5Y/s1600-h/DSC00033.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZZE-14nNvkY9yc0T8EkqzgRz28FAuDYHc_XiucCZnbBlqHvmw_xZRz1tQSAkuw18U_EzGFRhDKptSjP8QqKivgoaI5YfcBO_FBb1qrBaEiPUfQbSijkTaipemNVKGIuFVvIRG1WyQ1Z5Y/s400/DSC00033.JPG" alt="" id="BLOGGER_PHOTO_ID_5216908838763215602" border="0" /></a><br /><br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-29628774139209119482008-03-31T10:30:00.000-07:002008-04-03T15:36:52.933-07:00Конвертирование музыки из wma в mp3Предисловие.<br />Я поменял шаблон блога на более жизнерадостный(но правда тоже из стандартных, были мысли найти что-то пооригинальнее, но пока лень. может как-нибудь соберусь) и изменил название, посчитав его неактульным. В связи с этим возможно появление постов не связанных с GNU/Linux.<br /><br /><span class="fullpost"><br /><br />Регулярно возникает проблема, когда кто-нибудь приносит мне музыку в каком-то непонятном формате.(wma) И хотя Amarok его замечательно воспроизводит, но при прослушивании возникает какой-то дискомфорт. Еще в далекие времена, когда я использовал windows я уже не любил этот формат музыки, а уж сейчас и подавно. Но до недавнего времени я ленился подойти к этому вопросу вплотную и клянчил у мамы ноутбук с виндой, чтобы сконвертировать очередной альбомчик. Но тут все-таки решил перебороть свою лень и в течении 15 минут нашел решение проблемы.<br />Фактически я здесь помещаю перевод <a href="http://www.linuxquestions.org/linux/answers/Applications_GUI_Multimedia/Convert_WMA_to_MP3">этой </a>статьи с небольшим изменением в скрипте, потому что так "не работало".<br />Нам потребуется mplayer и lame. Mplayer я думаю входит в репозитории любого дистрибутива. А вот lame в мандривовском репозитории я не нашел. Но сильно не расстроился и воспользовался сайтом <a href="http://www.rpmseek.com/">rpmseek.com.</a> Нашел там пакет для 2006 версии, скачал, установил - все работает.<br /><br />Последовательность действий:<br />1. Создаем любимым текстовым редактором файл, например wmamp3.<br />2. Вбиваем туда следующее содержимое:<br /><pre class="my_code_box"><br /><span style="font-weight: bold;">#!/bin/bash</span> <span style="font-weight: bold;"><br /><br />current_directory=$( pwd )</span><br /><br /><span style="font-weight: bold;">#убираем пробелы</span> <span style="font-weight: bold;"><br />for i in *.wma; do mv "$i" `echo $i | tr ' ' '_'`; done</span> <span style="font-weight: bold;"><br /><br />#убираем верхний регистр</span><br /><span style="font-weight: bold;">for i in *.[Ww][Mm][Aa]; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done</span> <span style="font-weight: bold;"><br /><br />#распаковываем в wav и пакуем в mp3</span><br /><span style="font-weight: bold;">for i in *.wma ; do mplayer -vo null -vc dummy -af resample=44100 -ao pcm:waveheader $i && lame -m s audiodump.wav -o $i; done</span><br /><span style="font-weight: bold;"><br />#меняем расширение на правильное</span> <span style="font-weight: bold;"><br />for i in *.wma; do mv "$i" "`basename "$i" .wma`.mp3"; done</span> <span style="font-weight: bold;">rm audiodump.wav</span><br /><br /></pre><br />3. Сохраняем файл, ставим на него флаг выполняемости<br /><br /><span style="font-weight: bold;">chmod +x wmamp3<br /><br /></span>4. Переносим куда-нибудь в /bin или /usr/bin.<span style="font-weight: bold;"><span style="font-weight: bold;"><br /><br />sudo mv wmamp3 /usr/bin<br /><br /></span></span>5. И пробуем использовать примерно так:<span style="font-weight: bold;"><span style="font-weight: bold;"><br /><br />wmamp3 file_name<br /><br /></span></span><span><span>6. Можно использовать для всех файлов в папке по маске:</span></span><span style="font-weight: bold;"><span style="font-weight: bold;"><br /><br />wmamp3 *<br /><br /></span></span><span><span>Время на конвертацию в среднем до 20 секунд на песню.<br /><br /></span></span>Заранее отвечу на вопрос: "Почему не в ogg?" Мой телефон, который я изредка использую в качестве плеера, его не поддерживает.<br /><br /></span>triklozoidhttp://www.blogger.com/profile/07530456792850064827noreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-5262416797509305212008-03-03T08:31:00.000-08:002008-03-03T09:20:50.284-08:00Впечатления о Skylink.Еще в конце декабря приобрел таки себе модем, по сей день пользуюсь, решил поделиться ощущениями.<br /><span class=fullpost> <br />Модем я выбрал Anydata ADU-300A, основываясь на отзывах нескольких человек на форумах, что мол в линуксе работать должно. <br />И не обманули меня, точно работает. Только есть одна небольшая тонкость, в ядра до 2.6.18 включен какой-то недоделаный модуль для работы с этими модемами. На всех последних дистрибутивах уже таких не найти, но у меня на сервере стоит ASP10, и там было ядро 2.6.17. Особых проблем это не вызвало, скачал rpm'ку с ядром 2.6.20 и все заработало на ура.<br />По поводу собственно интернета. Во-первых оказалось, что в моей местности(МО 20 км от МКАД по Минскому шоссе) уровень сигнала низковат и соединение нестабильное. Поэтому пришлось купить переходник под внешнюю антенну. Саму внешнюю антенну мне купить не удалось, потому что они как раз к моему приезду в офис закончились. Я припаял к переходнику FM антенну от старого тюнера. Как ни странно помогло. <br />Скорость до обещанных 2.4 Мбит(300 Кб/сек) по технологии EVDO ни разу не поднималась. Максимум 150 килобайт причем где-то в районе с 3 до 6 утра. В часы пик падает до 10-15 кбайт, средняя примерно 30 - 40. Что радует по сравнению с gprs, так это время отклика: стабильно меньше 150 мс.<br /><br />Подключался я на тарифный план "Ночной безлимит", с целью закачки больших объемов трафика. Вообщем свое назначение он выполняет, за ночь можно гигабайта 1,5 выкачать.(если конечно с нормального сайта качать).<br />Единственное, что смущает, сейчас в скайлинке какие-то непонятные вещи творятся. Вроде бы людей насильно переводят с одних тарифов на другие и прочее. Меня пока ничего такого не коснулось, но уже начинаю опасаться.<br /></span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-16049899134486234692007-09-29T13:37:00.000-07:002007-12-14T11:53:36.608-08:00Выбор дистрибутива.Да уж, мои самые страшные предположения оправдались, регулярные публикации новых статей оказались для меня непосильной задачей.<br />Но не буду отчаиваться и сдаваться и попытаюсь писать что-нибудь полезное хотя бы нерегулярно.<br /><span class=fullpost><br />После того, как по причине собственной криворукости упал мой ASP, мне пришла мысль попробовать что-нибудь новенькое. С тех пор я нахожусь в подвешенном состоянии поиска дистрибутива своей мечты.<br />В данный момент у меня установлено: Mandriva и MOPSlinux на десктопе, ALTLinux на ноутбуке и ASPLinux на сервере. Кроме того я пробовал Ubuntu. Было еще несколько дистрибутивов, в основном с дисков LinuxFormat, но в них мне встретились достаточно крупные проблемы еще на стадии установке, поэтому я даже названий их не запомнил. Несколько раз пытался ставить Gentoo, но каждый раз безуспешно. <br />Поверхностно набросаю впечатления от всех, вышеперечисленных дистрибутивов. <br /><br />Mandriva Linux 2007 Free<br />User Friendly. И этим все сказано. Никаких проблем при установке. Единственный пока дистрибутив, в котором настройку wifi на ноутбуке мне удалось произвести буквально в несколько кликов мышью.(через ndiswrapper, при условии наличия виндовых драйверов). Очень качественная локализация. Расстраивают только кракозябры в тегах в Amarok, но совсем недавно избавился от этого, конвертировав теги всей моей музыки в utf8. Из минусов отмечу высокое ресурсопотребление(особенно с KDE), и как следствие - низкая скорость работы. И если на десктопе это еще не так бросается в глаза, то на ноутбуке от Mandriva пришлось отказаться. Чуть не забыл, самое заметное в дистрибутиве - Mandriva Control Center. Классная штука, особенно для людей, которые не в состоянии сходу набрать что-нибудь в духе <br />sudo mount -t ntfs /dev/sda8 /mnt/extvol -o iocharset=utf8. <br />При наличий определнных знаний и умений и при необходимости тонкой настройки ее ценность падает очень существенно. <br /><br />ALTLinux<br /><br />С установкой проблем тоже никаких не возникло. Порадовала высокая скорость работы в KDE даже на ноутбуке. С русским языком проблем, естественно, никаких нет. Впервые здесь увидел аудиоплеер под названием Juk. Что в нем понравилось, так это опять же скорость работы. Больше ничего особо выдающегося не заметил. Beryl из коробки не работает. Напильник я к нему не прикладывал, так как не больно то и нужен.<br /><br />ASPLinux<br />Мой первый дистрибутив. Использовал его с 9 по 11.2 версию. То, с чего началось мое знакомство с миром linux. Сейчас установлен на сервере. Ничем к себе внимание не привлекает, что не может не радовать. Хотя поводы есть, у меня не реже раза в 2 дня отключается свет. В незапамятные времена виндовс на десктопе больше месяца не жил, а сервер у меня стоит уже с июля месяца и все в порядке. Когда я использовал его на десктопе, мне казалось, что он очень нестабильный, постоянно падает. Сейчас я понимаю, что был неправ, потому что если насильно втыкать пакеты уровня glibc от другого дистрибутива, не той версии да еще и с ключом --nodeps, то ничего хорошего ждать понятно не стоит.<br /><br />Ubuntu Linux<br />Установка никаких проблем не вызвала. С оборудованием проблем не было. Единственное, что сильно не понравилось, это жизненная необходимость хорошего интернет подключения. Мое поключение к хорошим явно не относится, поэтому для меня это серьезный минус. <br /><br />MOPSLinux<br />Один из последних дистрибутивов, который я пробовал. Российская сборка на основе Slackware. Имеет собственный менеджер пакетов mpkg. Что понравилось - скорость. Локализация тоже на высоте. Очень легко установился проприетарный драйвер для Nvidia.(хотя может я уже наловчился, но помню в ASP я мучался достаточно долго). Из минусов - достаточно бедный репозиторий(я уже не говорю про дебиановский, с его десятками тысяч пакетов, но в сравнении с мандривой или ASP выбор откровенно не радует).<br /><br />Подведя итог этому краткому обзору могу для себя могу сделать вывод, что дистрибутив своей мечты я еще не нашел. Возможно так и не найду и придется делать самому.(LFS?) Или перестать уже метаться и остановиться на каком-нибудь одном дистрибутиве, изучив его более детально. Пока решения этому вопросу у меня нет. Буду рад, если мой пост кому-то поможет.<br /></span>Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-6010914606047620527.post-39043631845062298482007-09-25T10:56:00.000-07:002007-09-26T12:08:33.005-07:00Чертовщина.Хочу поделиться душещипательной историей в духе научной фантастики, произошедшей со мной в это воскресенье, 23 сентября. <br /><span class=fullpost><br />Все началось достаточно безобидно. У меня закончилось место на "корне". Я подумал, что это явный знак, что пора более грамотно разбить(какой подходящее слово) свой жесткий диск. До этого момента он был разбит достаточно бестолково. Первый раздел с windows xp, следующий для данных, в ntfs, следующий опять же в ntfs, с установленной в ознакомительных целях пол-года назад вистой, потом своп и корень. Первоначально linux ставился(как наверное и у многих) второй системой, поэтому для него оставалось места совсем немного.<br />Для решения этой задачи, я решил использовать программу Acronis Disk Director, которой уже много раз пользовался до этого. Загрузился с ее диска, сделал все как надо, раздел с вистой удалил, с данными уменьшил, своп передвинул, нажал "применить" и перезагрузился. Каково же было мое удивление когда ASPLoader(кто не в курсе - это собственный загрузчик дистрибутива ASPLinux) не смог загрузить мою систему. Я не поверил в это, попробовал еще несколько раз, но безуспешно. С горя загрузил xp. Как ни странно он загрузился. Я вспомнил, что когда-то давно устанавливал драйвер для чтения ext2/ext3 разделов. Этот драйвер видел мой раздел, но прочесть с него ничего не смог и предлагал его отформатировать. К этому моменту я уже плохо понимал происходящее, решил чуток отдохнуть, послушать музыку. <br />Все вышесказанное происходило на настольном компьютере, а на рядом стоящем ноутбуке все это время было загружена Mandriva и играла музыка. Буквально через 3 минуты после того, как я решил отдохнуть музыка внезапно прервалась. Я сильно удивился, ведь такого никогда раньше не было, попытался выяснить причину, но ничего не смог сделать. Ноутбук завис намертво, и не хотел: ни перезагружать иксы, ни выходить в консоль, ни хотя бы просто перезагрузиться по Ctrl+Alt+Delete. Я подержал кнопку выключения, он выключился, я минуту посидел в раздумьях и снова включил его. Появился grub, я выбрал мандриву, появился загрузочный экран и все опять повисло. И опять намертво. Я включал-выключал ноутбук несколько раз и все время с тем же результатом. В отчаянии попробовал загрузить винду(кстати лицензионную). Она загрузилась, проработала секунд 30 и вывесила BSOD. Перезагрузка - не загрузилась совсем, перезагрузка - минута работы и очередной BSOD(с совершенно другой ошибкой и другими адресами). Окончательно потеряв способность трезво оценивать ситуацию я не придумал ничего лучше как пойти спать.(часов в 8 вечера). <br />Через 2 дня итог. Пропавший раздел так и не появился. Все опробованные мною средства для восстановления эффекта не имели. Ноутбук больше никаких выкрутасов не подкидывал, все грузится и работает без сбоев.(хотя я ничегов плане ремонта не делал) <br />Вывод. Не подходить к компьютеру в полнолуние. А если серьезно, то бекап, бекап и еще раз бекап. Единственное, что, как мне кажется, сможет помочь в подобной ситуации.<br /></span>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-6010914606047620527.post-60853986677670270922007-09-07T20:59:00.000-07:002008-11-25T12:01:41.550-08:00Wifi на ноутбуке HP nx6110Хочу поделиться своими действиями в ходе моей недавней битвы с wifi адаптером моего ноутбука. <br />Дано: <br />Ноутбук HP Compaq nx6110 со встроенным в него wifi адаптером Broadcom BCM4318<br />Dlink Access Point DWL-2100AP<br />Беспроводная сеть настроена с ключом WPA.<br />Задача:<br />Сделать так, чтобы все это работало.<br /><span class=fullpost><br />Первым делом, нужно установить драйвера. Теоретически, в дистрибутив входит драйвер для таких адаптеров, но практически, он только намертво зажигает индикатор, и на этом его полезные функции заканчиваются. Поэтому мы будем использовать ndiswrapper и драйвера для Windows.<br />Ndiswrapper(если еще не установлен) устанавливается командой <br /><br /><span style="font-weight:bold;">yum install ndiswrapper</span><br /><br />Драйвера для windows можно скачать <a href="ftp://ftp.gateway.com/pub/hardware_support/drivers/win_xp/portable/m360/D00464-001-001.exe">отсюда.</a><br />Распаковать этот exe'шник можно командой<br /><br /><span style="font-weight:bold;">unzip <b style="color:black;background-color:#ffff66">D00464</b>-<b style="color:black;background-color:#ffff66">001</b>-<b> 001</b>.exe</span><br /><br />если конечно у вас установлен пакет unzip.<br />Потом, в папке, куда все это распаковалось нужно вбить:<br /><br /><span style="font-weight:bold;">ndiswrapper -i bcwml5.inf</span><br /><br />Должно появиться что-то вроде этого:<br /><span style="font-style:italic;">Installing bcmwl5<br />Forcing parameter IBSSGMode|0 to IBSSGMode|2<br />Forcing parameter IBSSGMode|0 to IBSSGMode|2</span><br /><br />Следом нужно запустить 3 команды<br /><br /><span style="font-weight:bold;">ndiswrapper -m <br />ndiswrapper -da <br />ndiswrapper -di</span> <br /><br />Здесь я не уверен, возможно что-то из этого запускать не обязательно. Но мне было лень перезагружаться 3 раза, чтобы проверить, поэтому я сразу вбил все 3. <br />После этого надо перезагрузиться, чтобы проверить эффект. Синенький индикатор wifi должен загораться и гаснуть при нажатии на кнопку. Если так и происходит, то можно порадоваться, половина дела сделана. Если ваша wifi сеть открытая, без всяких ключей шифрования, то делать больше почти ничего не придется. <br />Но если вам не повезло, то приступайте ко второй части - настройке wpa_supplicant.<br /><br />Для начала его необходимо установить стандартным образом<br /><br /><span style="font-weight:bold;">yum install wpa_supplicant</span><br /><br />Запускается он у меня командой <br /><br /><span style="font-weight:bold;">wpa_supplicant -Dwext -c /etc/wpa_supplicant.conf -iwlan0 -d</span><br /><br />wpa_supplicant.conf представляет собой следующее:<br /><br />network=<br />{<br />psk="my_psk"<br />scan_ssid=1<br />ssid="triklozoid_wlan"<br />}<br /><br />И когда wpa_supplicant запущен, я поднимаю соединение командой<br /><br /><span style="font-weight:bold;">ifup wlan0</span><br /><br />После этого все начинает работать. Некоторые параметры просто подбраны подстановкой от балды всех возможных вариантов, "пока не заработает". Например, при запуске wpa_supplicant параметр -Dwext. Мануал говорит, что с драйвером ndisrapper необходимо использовать одноименный драйвер для wpa_supplicant. Но, по абсолютно не понятной мне причине, с ним ничего не работает, а вот когда пропишешь -Dwext, работает. Остальные взяты из различных статей по настройке.<br /><br />Ссылки по этой тебе:<br /><br /><a href=http://www.opennet.ru/base/net/wifi_intro.txt.html>www.opennet.ru</a><br /><a href=http://noc.ifmo.ru/itmo-wi-fi-linux.html>noc.ifmo.ru</a><br /><a href=http://silinio.webhost.ru/linux_wificlient.html>http://silinio.webhost.ru</a><br /><a href=http://www.ampersand.com/nx6110_fc5/>http://www.ampersand.com/</a><br /><a href=http://datenroulette.de/blog/index.php?blog=1&cat=19>http://datenroulette.de/</a><br /><br /></span>Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-6010914606047620527.post-42784287309711263052007-08-12T04:22:00.000-07:002008-11-25T12:02:35.276-08:00Сборка ядра.По-моему неплохо для первой темы. Конечно начинать нужно не с этого, но я как раз сейчас этим занимался и решил рассказать по горячим следам, пока ничего не забыл.<br /><span class=fullpost><br />По умолчанию в 11.2 идет ядро 2.6.17. Набрав в консоли из-под рута yum install kernel, с подключенным репозиторием asplinux-updates, можно быстро и безболезненно обновить ядро до версии 2.6.20. Мне этого показалось мало, ядро не самое новое, да и поковыряться в нем самому нельзя. Поэтому я решил установить последнее стабильное ядро из исходников. Для этого скачиваем с <a href=http://www.kernel.org/pub/linux/kernel/v2.6/>kernel.org</a> файл linux-2.6.22.2.tar.bz2 . Потом переносим файл в более подходящую папку.<br><br /><span style="font-weight:bold;">mv linux-2.6.22.2.tar.bz2 /usr/src/</span> <br><br />распаковываем архив<br /><br /><span style="font-weight:bold;">tar -xf linux-2.6.22.2.tar.bz2</span><br /><br />переходим появившуюся папку<br /><br /><span style="font-weight:bold;">cd linux-2.6.22.2</span><br /><br />там набираем<br /><br /><span style="font-weight:bold;">make menuconfig</span><br /><br />Появляется меню конфигурирования ядра. Теперь начинается самое интересное. Многие советуют копировать конфиг с установленного ядра или брать готовые конфиги под определенную архитектуру. Так сделать конечно можно, но по своему опыту могу сказать, что это совсем не гарантирует, что ядро нормально запустится с первого раза. Мне, чтобы ядро нормально работало, потребовалось сделать следующее.<br />Первым делом я включил поддержку своего SATA контроллера. Без нее ядро выдавало Panic kernel в самом начале и грузиться наотрез отказывалось. Когда ядро начало загружаться, я просмотрел остальные сообщения об ошибках. Ошибки выдавали сервисы hidd, auditd и где-то в конце проскакивало сообщение об отсутствии fuse. Кроме этого не работал звук, сетевая карта и nvidia модуль ядра.<br />Исправлял я это таким образом <br />hidd - <span style="font-style:italic;">Networking -> Networking support -> Bluetooth subsystem support -> HIDP protocol support =Y</span><br /><br />auditd - <span style="font-style:italic;">General setup -> Auditing support </span><br /><br />fuse - <span style="font-style:italic;">File systems -> Filesystem in Userspace support </span> <br /><br />звук(звуковая карта PCI SB Audigy) <br /><span style="font-style:italic;">-> Device Drivers -> Sound -> Advanced Linux Sound Architecture -> PCI Devices -> Emu10k1 (SB Live!, Audigy, E-mu APS)</span><br /><br />Когда вы закончили(в очередной раз?) конфигурирование ядра, нужно вбить магические команды:<br /><br /><span style="font-weight:bold;">make<br />sudo make install<br />make modules<br />sudo make modules install</span><br /><br />В качестве загрузчика я использую ASPLoader, и этими командами ядро туда вписывается автоматически. Поэтому после них можно сразу перезагружаться и проверять работоспособность.<br /><br />Потом у меня были небольшие проблемы с модулем nvidia. Для его установки нужно скачать последний бинарник с <a href=http://us.download.nvidia.com/XFree86/Linux-x86/100.14.11/NVIDIA-Linux-x86-100.14.11-pkg1.run>драйверами.</a><br />Потом нужно выключить Х-сервер и из-под рута в консоли этот файл запустить. По поводу выключения Х. Можно выставить в /etc/inittab id:3:initdefault: и перезагрузиться, но есть способ чуть быстрее, это нажать Ctrl+Alt+Backspace, а потом 2 раза Ctrl+C.<br />Следующей проблемой было то, что драйвер не смог найти исходники моего ядра. Это решается опцией --kernel-source-path=путь. После этого модуль без ошибок компилируется, но при перезагрузке выдает module not found. Я подозреваю где-то можно указать к нему путь, но я не нашел, поэтому просто сделал так.<br /><br /><span style="font-weight:bold;">mkdir /lib/modules/2.6.22.2/extra/<br />mkdir /lib/modules/2.6.22.2/extra/nvidia/<br />cp /lib/modules/2.6.22.2/video/nvidia.ko /lib/modules/2.6.22.2/extra/nvidia/</span><br /><br />И тогда наконец-то все загрузилось и заработало.<br /><br />Еще хотел сказать по поводу make clean. Во всех инструкциях по сборке ядер настойчиво рекомендуют делать его перед каждой пересборкой. Не могу сказать насколько это оправдано, но мне часто было лень из-за одного мааааленького дополнительного крестика ждать полной пересборки 20-30 мин. Поэтому я пересобирал без make clean. И работало все замечательно. Make clean я делал всего раза 3, когда у меня компиляция прерывалась на середине с ошибкой.<br /><br />Вот собственно и все чем я хотел поделиться по этому вопросу. Если вспомню еще что-нибудь, обязательно допишу. <br /><br />P.S. Забыл предупредить, это не инструкция "от и до", а всего лишь описание некоторых особенностей и оно предполагает, что читатель уже знаком с чем-то вроде <a href=http://community.asplinux.ru/documents/faq72/ >этого</a>, конкретнее <a href=http://community.asplinux.ru/documents/faq72/05_10.html>этого</a>, ну и вообще хорошо если <a href=http://www.linux.org.ru/books/HOWTO/Kernel-HOWTO.html >здесь.</a><br /></span>Unknownnoreply@blogger.com0