<?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-6435848814103979986</id><updated>2012-01-05T23:18:41.855+04:00</updated><category term='linux'/><category term='о жизни'/><category term='system'/><category term='tricks'/><category term='powerpc'/><category term='другое'/><category term='arch'/><category term='C'/><category term='kernel'/><category term='debian'/><category term='новости'/><category term='games'/><category term='юмор'/><category term='настройка'/><title type='text'>Записки системного программиста</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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>43</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6435848814103979986.post-4990108678112787126</id><published>2010-05-09T20:26:00.004+04:00</published><updated>2010-05-09T20:29:03.089+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Домашняя страница INSTEAD</title><content type='html'>Арендовал доменное имя syscall.ru и купил хостинг. В связи с этим, визитная страница INSTEAD теперь находится по адресу: &lt;a href="http://instead.syscall.ru"&gt;http://instead.syscall.ru&lt;/a&gt;. Так что, добро пожаловать.&lt;br /&gt;&lt;br /&gt;Возможно, через некоторое время на syscall.ru переедет и этот блог... Когда/если дойдут руки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-4990108678112787126?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/4990108678112787126/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=4990108678112787126' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4990108678112787126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4990108678112787126'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2010/05/instead.html' title='Домашняя страница INSTEAD'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-3786958060962609701</id><published>2010-02-26T20:27:00.007+03:00</published><updated>2010-03-09T10:56:44.260+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Материалы по Linux Crypto API</title><content type='html'>В этом сообщении буду собирать ссылки на ресурсы по Linux Crypto API и XFRM. Информации очень мало, а исходный код довольно многоуровневый.&lt;br /&gt;&lt;a href="http://www.linuxjournal.com/article/6451?page=0,0"&gt;The Linux Kernel Cryptographic API&lt;/a&gt;&lt;br /&gt;&lt;a href="http://book.itep.ru/6/ipsec.htm"&gt;Технология IpSec&lt;/a&gt;&lt;br /&gt;&lt;a href="http://diploma-thesis.siewior.net/html/diplomarbeitch4.html"&gt;Crypto API in kernel&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mail-archive.com/linux-crypto@vger.kernel.org/"&gt;Linux Crypto&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-3786958060962609701?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/3786958060962609701/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=3786958060962609701' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3786958060962609701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3786958060962609701'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2010/02/linux-crypto-api.html' title='Материалы по Linux Crypto API'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1822123029537339461</id><published>2010-02-14T18:19:00.005+03:00</published><updated>2010-02-14T18:27:48.266+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Настройка ресурсов X приложений</title><content type='html'>Лучшим терминалом, на мой взгляд, является uxterm. Настройка uxtermа осуществляется в базе данных ресурсов X11. Для того, чтобы не менять системных файлов и не мучаться с xrdb можно сделать следующим образом.&lt;br /&gt;&lt;br /&gt;Определить путь к ресурсам как:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;export XUSERFILESEARCHPATH=$HOME/app-defaults/%N&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А в ~/app-defaults/ положить свои (настроенные) версии файлов из /usr/share/X11/app-defaults.&lt;br /&gt;&lt;br /&gt;Моя настройка UXTerm обычно заключается в следующем:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;*VT100.font2: -xos4-terminus-medium-r-normal--16-*-*-*-*-*-iso10646-1&lt;br /&gt;*VT100.font: -xos4-terminus-medium-r-normal--20-*-*-*-*-*-iso10646-1&lt;br /&gt;*VT100.font3: -xos4-terminus-medium-r-normal--17-*-*-*-*-*-iso10646-1&lt;br /&gt;*VT100.font4: -xos4-terminus-medium-r-normal--24-*-*-*-*-*-iso10646-1&lt;br /&gt;*VT100.font5: -xos4-terminus-medium-r-normal--12-*-*-*-*-*-iso10646-1&lt;br /&gt;*VT100.font6: -xos4-terminus-medium-r-normal--14-*-*-*-*-*-iso10646-1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;А XTerm-color:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;*VT100*foreground: gray90&lt;br /&gt;*VT100*background: black&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1822123029537339461?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1822123029537339461/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1822123029537339461' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1822123029537339461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1822123029537339461'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2010/02/x.html' title='Настройка ресурсов X приложений'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-5107548868791028368</id><published>2010-02-14T18:14:00.008+03:00</published><updated>2010-02-14T18:29:28.428+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>URQ игры в LINUX или INSTEAD 1.1.2</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_xgyj6ddxG9k/S3gT2xxjOFI/AAAAAAAAACU/hnGNSsOuNzI/s1600-h/1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_xgyj6ddxG9k/S3gT2xxjOFI/AAAAAAAAACU/hnGNSsOuNzI/s200/1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5438118381844904018" /&gt;&lt;/a&gt;&lt;br /&gt;С выходом INSTEAD 1.1.1 стало возможно играть в игры, написанные на URQL. &lt;br /&gt;&lt;br /&gt;Подробности, на нашем &lt;a href="http://instead.pinebrush.com/forum/viewtopic.php?id=149"&gt;форуме&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Среди URQL игр есть несколько шедевров. Скачать urq модуль и несколько игр можно по ссылке выше.&lt;br /&gt;&lt;br /&gt;Надеюсь, с выпуском 1.1.2 немного отдохнуть. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-5107548868791028368?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/5107548868791028368/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=5107548868791028368' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5107548868791028368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5107548868791028368'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2010/02/urq-instead.html' title='URQ игры в LINUX или INSTEAD 1.1.2'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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://1.bp.blogspot.com/_xgyj6ddxG9k/S3gT2xxjOFI/AAAAAAAAACU/hnGNSsOuNzI/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6435848814103979986.post-646239934794497680</id><published>2010-01-08T21:53:00.006+03:00</published><updated>2010-02-14T18:28:49.555+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>"Карантин" на Instead 1.0.5</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_xgyj6ddxG9k/S0d_8OKjpNI/AAAAAAAAACM/nyi3AnXue7Y/s1600-h/quarantine1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_xgyj6ddxG9k/S0d_8OKjpNI/AAAAAAAAACM/nyi3AnXue7Y/s200/quarantine1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5424444948762305746" /&gt;&lt;/a&gt;&lt;br /&gt;Все, надоело. Наверное, последняя игра от меня. :) В обозримом будущем.&lt;br /&gt;&lt;br /&gt;Вышла очередная версия интерпретатора INSTEAD.&lt;br /&gt;&lt;br /&gt;Одновременно с выпуском версии 1.0.5 объявлено открытое бета-тестирование квеста-визуальной новеллы с нелинейным сюжетом: «Карантин». История о борьбе экипажа полярной станции со злом.&lt;br /&gt;&lt;br /&gt;* &lt;a href="http://code.google.com/p/instead-games/wiki/Screenshots"&gt;Скриншоты.&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://instead.googlecode.com"&gt;Проект.&lt;/a&gt;&lt;br /&gt;* &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=4415986&amp;lastmod=1263136079500"&gt;Новость на LOR.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-646239934794497680?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/646239934794497680/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=646239934794497680' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/646239934794497680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/646239934794497680'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2010/01/instead-105.html' title='&quot;Карантин&quot; на Instead 1.0.5'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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://1.bp.blogspot.com/_xgyj6ddxG9k/S0d_8OKjpNI/AAAAAAAAACM/nyi3AnXue7Y/s72-c/quarantine1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6435848814103979986.post-2338171490489757236</id><published>2009-11-06T21:17:00.002+03:00</published><updated>2009-11-06T21:23:22.268+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Новости INSTEAD'а</title><content type='html'>Да, INSTEAD стал съедать мое свободное время. :) Во-первых вышли 2 части квеста "Зеркало", о чем мы попиарились на &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=4197690&amp;lastmod=1257531233248"&gt;lor'е&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Хорошо, что INSTEAD каждый раз встречают довольно тепло. Уж не знаю что тут первичнее -- то, что мы все братья - линуксоиды, или потому что игры неплохие?&lt;br /&gt;&lt;br /&gt;Вышла версия 0.9.3 -- главная особенность -- масштабирование тем. Теперь можно выставлять разрешение не зависимо от темы.&lt;br /&gt;&lt;br /&gt;Готовимся к выпустку 1.0.0, так как нам предложили участвовать в &lt;a href="http://www.ifwiki.ru/%D0%9A%D0%A0%D0%98%D0%9B_2009"&gt;КРИЛ-2009&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-2338171490489757236?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/2338171490489757236/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=2338171490489757236' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2338171490489757236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2338171490489757236'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/11/instead.html' title='Новости INSTEAD&apos;а'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1761643533982123040</id><published>2009-09-15T19:56:00.004+04:00</published><updated>2009-09-15T20:00:52.297+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>INSTEAD 0.9</title><content type='html'>Что-то много времени стал на него тратить... Но так или иначе -- вышла 0.9. Напомню, что есть два неплохих квеста. Плюс один паршивый концепт.(см. форум: &lt;a href="http://instead.pinebrush.com"&gt;http://instead.pinebrush.com&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;Страница проекта: &lt;a href="http://instead.googlecode.com"&gt;http://instead.googlecode.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1761643533982123040?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1761643533982123040/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1761643533982123040' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1761643533982123040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1761643533982123040'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/09/instead-09.html' title='INSTEAD 0.9'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-5661851030025326431</id><published>2009-08-27T12:19:00.003+04:00</published><updated>2009-08-27T12:24:21.983+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Новая версия instead (0.8.6). Новая игра: 'Одна старая история'.</title><content type='html'>Игра довольно тепло встречена на &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=3989407&amp;lastmod=1251360061806"&gt;lor&lt;/a&gt;. История, которую я начинал писать еще на Inform. Довольно короткая и простая. &lt;a href="http://ifwiki.ru/STEAD"&gt;Скриншоты&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-5661851030025326431?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/5661851030025326431/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=5661851030025326431' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5661851030025326431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5661851030025326431'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/08/instead-086.html' title='Новая версия instead (0.8.6). Новая игра: &apos;Одна старая история&apos;.'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1733714666799446117</id><published>2009-08-14T18:54:00.005+04:00</published><updated>2009-08-15T10:57:41.355+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>mmap для нулевого адреса</title><content type='html'>Прочитал на lor статью про новую &lt;a href="http://www.linux.org.ru/view-message.jsp?msgid=3958582"&gt;уязвимость&lt;/a&gt;. Прочитал, что в качестве идеи эксплоита лежит возможность выполнить код по нулевому виртуальному адресу. Тут-то я и задумался... Каким образом пользовательское приложение может это (сформировать код по 0 VA) сделать? В эксплоите был код:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Этот код у меня в системе не работает... Начал смотреть дальше, и вот что выяснилось.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lwn.net/Articles/342573/"&gt;Здесь&lt;/a&gt; описывается тот факт, что для нужд wine (выполнения 16 битного кода) в ядре разрешается делать mmap на 0 адрес (/proc/sys/vm/mmap_min_addr). Самое интересное, что в статье утверждается, что в Ubuntu при установке wine эта возможность включается для системы в целом. Кроме того, в следствии особенностей архитектуры SELinux, по умолчанию, системы с включенным SELinux (как я понял) также разрешают пользователям делать mmap 0 адреса.&lt;br /&gt;&lt;br /&gt;Интересно. :)&lt;br /&gt;&lt;br /&gt;UPD: Кроме того, если в системе есть pulseaudio с установленным suid root, то эксплоит будет загружен через pulseaudio -L и mmap будет уже делаться от пользователя с euid == 0 (и выполнится успешно). Правда, в таком случае можно получить рута более простым способом -- так как мы и так уже получили привилегии администратора. Довольно нечестный прием. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1733714666799446117?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1733714666799446117/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1733714666799446117' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1733714666799446117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1733714666799446117'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/08/mmap.html' title='mmap для нулевого адреса'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-2147774052457828130</id><published>2009-08-14T08:41:00.003+04:00</published><updated>2009-08-14T08:45:30.287+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>INSTEAD 0.8</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_xgyj6ddxG9k/SoTr3W0cYII/AAAAAAAAABk/KbjUwDpgrOs/s1600-h/Game1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 120px;" src="http://4.bp.blogspot.com/_xgyj6ddxG9k/SoTr3W0cYII/AAAAAAAAABk/KbjUwDpgrOs/s200/Game1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5369675991983349890" /&gt;&lt;/a&gt;&lt;br /&gt;Выложил работу над ошибками 0.7.7&lt;br /&gt;&lt;br /&gt;* -debug опция -- печатает backtrace при ошибках + создает консоль для отладочных сообщений в Win версии;&lt;br /&gt;* stead.lua немного переписан, теперь позволяется больше вольностей + новые методы (см. док-цию);&lt;br /&gt;* ошибки в движке;&lt;br /&gt;* опечатки в игре;&lt;br /&gt;* исправленный vroom;&lt;br /&gt;* еще более правильная реакция на ошибки в играх;&lt;br /&gt;* русский язык в инсталляторе для windows + ярлык на стол + запуск после установки;&lt;br /&gt;&lt;br /&gt;Все, перерыв. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-2147774052457828130?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/2147774052457828130/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=2147774052457828130' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2147774052457828130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2147774052457828130'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/08/instead-08.html' title='INSTEAD 0.8'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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://4.bp.blogspot.com/_xgyj6ddxG9k/SoTr3W0cYII/AAAAAAAAABk/KbjUwDpgrOs/s72-c/Game1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6435848814103979986.post-8856103361518126582</id><published>2009-08-04T17:43:00.011+04:00</published><updated>2009-08-31T17:55:15.187+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Новая версия instead -- 0.7.7</title><content type='html'>Готовится к выпуску 0.7.7. Эта версия -- попытка сделать instead более универсальным и готовым для использования сторонними писателями игр. Я не собирался делать релиз до своей следующей игры (если она вообще будет), но после того, как я узнал о людях, которые пытаются его использовать, я решил что смысл в новой версии есть.&lt;br /&gt;&lt;br /&gt;Скачать windows и unix версии можно как всегда &lt;a href="http://instead.googlecode.com"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Список изменений ниже...&lt;br /&gt;&lt;br /&gt;  * исправление опечаток&lt;br /&gt;  * 3 режима размещения картинки (в том числе и встроенный в текст)&lt;br /&gt;  * механизм выбора тем представлен в меню и настройках&lt;br /&gt;  * режим свободного скроллинга (таскание мышкой)&lt;br /&gt;  * ускорение отрисовки текста (x4-x5 раз)&lt;br /&gt;  * слоты для загрузки/сохранения игр&lt;br /&gt;  * звук на реакцию движка&lt;br /&gt;  * выделение наклонным шрифтом событий сцены&lt;br /&gt;  * изменена тема по умолчанию (картинка теперь не мешает тексту, так как скроллируется с ним),&lt;br /&gt;  * добавлена тема 'Книга' -- оптимальная для книг-игр с вертикальными картинками&lt;br /&gt;  * позиция скроллирования не сбрасывается при реакции движка&lt;br /&gt;  * фильтр событий мыши (случайные двойные клики и т.д.)&lt;br /&gt;  * полноэкранный режим по Alt-Enter&lt;br /&gt;  * другие улучшения интерфейса&lt;br /&gt; &lt;br /&gt;  * обновлена документация (новые объекты, расширения движка)&lt;br /&gt;  * игры и темы кроме системного каталога ищутся также в  ~/.instead/games ~/.instead/themes (unix версия)&lt;br /&gt;  * консольная версия не входит в поставку по умолчанию&lt;br /&gt;  * параметры командной строки: -alsa, -fullscreen, -window&lt;br /&gt;  * исправлено множество ошибок&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-8856103361518126582?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/8856103361518126582/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=8856103361518126582' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/8856103361518126582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/8856103361518126582'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/08/instead-077.html' title='Новая версия instead -- 0.7.7'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-930336506620910174</id><published>2009-07-15T12:46:00.002+04:00</published><updated>2009-07-15T12:49:24.966+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='юмор'/><title type='text'>Политкорректность в документации perl.</title><content type='html'>Только что друг обнаружил в своем Debian. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get install perl-doc&lt;br /&gt;man perlreftut&lt;br /&gt;/* ищем строчку Bush */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Наблюдаем такой текст:&lt;br /&gt;&lt;br /&gt;Think of the President of the United States: &lt;em&gt;a messy, inconvenient bag of blood and bones&lt;/em&gt;.  But to talk about him, or to represent him in a computer program, all you need is the easy, convenient scalar string "George Bush".&lt;br /&gt;&lt;br /&gt;Без комментариев. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-930336506620910174?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/930336506620910174/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=930336506620910174' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/930336506620910174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/930336506620910174'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/07/perl.html' title='Политкорректность в документации perl.'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-4958698456973010054</id><published>2009-07-15T11:22:00.006+04:00</published><updated>2009-07-15T12:46:14.296+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Новости</title><content type='html'>Вернулся из отпуска. За это время описание INSTEAD появилось в блоге об INDY играх.  &lt;br /&gt;&lt;br /&gt;(&lt;a href="http://gamin.ru/2009/06/22/instead#comments"&gt;http://gamin.ru/2009/06/22/instead&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Кроме того, вышел первый номер электронного журнала с моей статьей о написании INSTEAD и игры "Возвращения квантового кота."&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://lingametech.com/"&gt;Сайт журнала&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Люди высказывают пожелания в том смысле, что неплохо бы написать новую историю...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-4958698456973010054?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/4958698456973010054/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=4958698456973010054' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4958698456973010054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4958698456973010054'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/07/blog-post.html' title='Новости'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-2186557655347966648</id><published>2009-05-21T09:01:00.008+04:00</published><updated>2009-09-01T10:01:43.584+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Вышла Windows версия instead.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://instead.googlecode.com/svn/trunk/doc/1.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://instead.googlecode.com/svn/trunk/doc/1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Приятель сделал Windows порт моей игрушки. INSTEAD -- это движок для текстовых квестов-визуальных историй. Unix и Windows версии могут быть загружены с сайта проекта: &lt;a href="http://instead.googlecode.com"&gt;http://instead.googlecode.com&lt;/a&gt;. На данный момент есть один (неплохой) квест/визуальная история -- "Возвращение квантового кота." Идет в дистрибутиве с движком.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-2186557655347966648?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/2186557655347966648/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=2186557655347966648' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2186557655347966648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2186557655347966648'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/05/windows-instead.html' title='Вышла Windows версия instead.'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-3181841603022394009</id><published>2009-05-07T13:59:00.013+04:00</published><updated>2009-05-07T17:05:59.869+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Краткий обзор tiling window managers (ion3, wmii, dwm, ratpoison, musca)</title><content type='html'>Я не знаю, как нормально и просто перевести &lt;a href="http://en.wikipedia.org/wiki/Tiling_window_manager"&gt;tiling wm&lt;/a&gt; на русский (может быть, фреймовые оконные менеджеры?), поэтому я так и буду писать: tiling wm. Если вы не знаете, что это такое вообще, то речь идет об оконных менеджерах, способ работы с которыми довольно сильно отличается от работы с привычными windows-like интерфейсами... Тогда, зачем это все нужно?&lt;br /&gt;&lt;br /&gt;Скажу честно, мне нравиться играть с компьютером. И первый tiling-wm я поставил просто из любопытства. Кажется, это был wmii. Я его тогда не понял. "Что за идиотизм?" -- примерно так подумал я тогда... Но со временем, как-то незаметно, я "подсел" на tiling wm и теперь меня не заманишь гламурной стилизацией под vista или macos x.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Дело в том, что все tiling wm полностью или почти полностью "освобождают" пользователя от мышки. Это раз. Во-вторых -- пространство экрана используется наиболее эффективно -- оно разбито на не перекрывающиеся области -- фреймы, в которых расположены одно или несколько окон.&lt;br /&gt;&lt;br /&gt;В третьих -- почти всегда tiling оконный менеджер означает минимализм. Который может казаться даже абсурдным, но после игр с компизом и как бывший пользователь Apple Powerbook с ответственностью заявляю -- это глоток свежего воздуха. Интерфейс хорош, когда его не замечаешь. Конечно, вы должны понимать, что это все сказано программистом. Впрочем, и Linux -- это система прежде всего для программистов. (А также всех тех, кто находится в зоне влияния программиста. :)&lt;br /&gt;&lt;br /&gt;И все же, хватит лирики. Цель этой небольшой статьи -- кратко перечислить все те tiling wm, которые я пробовал и указать на их недостатки.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ion3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Очень похоже, что этот оконный менеджер, вместе с larswm, породил новую волну интереса к tiling wm. &lt;a href="http://modeemi.fi/%7Etuomov/ion/"&gt;ion3&lt;/a&gt; образец оконного менеджера с ручным (manual) tiling. Это значит, что разбивка на фреймы производится пользователем. Этот подход имеет свои сильные и слабые стороны. Очень хорошо, что можно создавать произвольные конфигурации разбиения. Плохо -- что вообще нужно это делать. (Это действительно недостаток???). ion3 поддерживает tabbing, то-есть, в одном фрейме может быть несколько окон и они будут отображены в виде закладок фрейма.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://modeemi.fi/~tuomov/ion/screenshots/ion3-2.png"&gt;&lt;img width=640 src="http://modeemi.fi/~tuomov/ion/screenshots/ion3-2.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ion3 конфигурируется на скрипте lua. Что делает его очень гибким, но возможно, иногда сложным. В целом -- ion3 образец хорошего tiling wm с manual tiling и я некоторое время использовал его, но в какой-то момент немногочисленные недостатки победили и стали для меня критичными настолько, чтобы отказаться от ion3 в пользу других wm.&lt;br /&gt;&lt;br /&gt;Итак, недостатки:&lt;br /&gt;&lt;br /&gt;1) Довольно мутные настройки по-умолчанию. В основном это касается клавишных комбинаций. Да -- к ним можно привыкнуть, но до конца я так и не смог этого сделать. Перенастроить? Но их столько, что написание своего конфигурационного файла (вообще-то даже файл&lt;em&gt;ов&lt;/em&gt;, на lua...) превращается в нудное занятие. Попробуйте полностью перенастроить vim? Захотелось даже вспомнить fvwm... Кто знает, тот поймет.&lt;br /&gt;&lt;br /&gt;2) Кроме того, есть какая-то общая неинтуитивность, которую сложно описать формально. Но это превращается в кошмар, когда окон слишком много и они вдруг начинают ломать, кропотливо созданную схему разделения...&lt;br /&gt;&lt;br /&gt;3) Есть еще один нюанс, он заключается в характере (без сомнения, талантливого) автора (Tuomo Valkonen). Вы можете почитать то, что он пишет в своем &lt;a href="http://modeemi.fi/%7Etuomov/b/"&gt;"блоге"&lt;/a&gt;. Уверяю вас, увлекательное чтиво... В общем, ion3 не входит в arch linux, в debian он является частью non-free, не смотря на открытые исходные коды... Но вообще-то, для меня это не было решающим недостатком.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;wmii&lt;/b&gt;&lt;br /&gt;Автор пытался сделать оконный менеджер, который бы вобрал в себя лучшее из существующих tiling wm.  В чем-то это удалось -- довольно простой (по сравнению с ion3) manual tiling wm.&lt;br /&gt;&lt;br /&gt;Правда, в какой-то момент автор увлекся идеями &lt;a href="http://ru.wikipedia.org/wiki/Plan_9"&gt;Plan 9&lt;/a&gt; и сделал управление &lt;a href="http://ru.wikipedia.org/wiki/Wmii"&gt;wmii&lt;/a&gt; через подобие файловых операций со специальными файлами, но в общем, это можно воспринимать как некую пикантность. А вот отсутствие возможности создания горизонтальных фреймов в manual tiling wm это уже странно. &lt;br /&gt;&lt;a href="http://wmii.suckless.org/screenshots/wmii-20080117-thumb.png"&gt;&lt;img width=640 src="http://wmii.suckless.org/screenshots/wmii-20080117-thumb.png"&gt;&lt;/a&gt;&lt;br /&gt;И понятно, что часто это не нужно (речь идет о том, что wmii позволяет разбивать пространство экрана на столбцы, но не на строки), но если уж давать возможность управления фреймами, то давать ее полностью. Получаем странную комбинацию: неплохой в общем-то wm, но как бы "недоделанный". И явно слабее по функционалу, чем ion3. Ни то, ни се, говоря по-человечески. :)&lt;br /&gt;&lt;br /&gt;Еще одним недостатком может служить тот факт, что интерес автора к этому wm сильно ослаб.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;dwm&lt;/b&gt;&lt;br /&gt;В какой-то момент автор wmii решил, что выбрал неверный путь и избрал новую парадигму, на сайте &lt;a href="http://suckless.org/"&gt;suckless.org&lt;/a&gt; можно прочитать минималистичный манифест: "Dedicated to software that sucks less". Не больше не меньше, вот они -- характеры хакеров. :) Но что это значит для нас? А то, что автор (как я понимаю) взял идею &lt;a href="http://www.safereconnect.com/fnurt/larswm/"&gt;larswm&lt;/a&gt; и реализовал ее в виде нового &lt;em&gt;динамического&lt;/em&gt; оконного менеджера &lt;a href="http://dwm.suckless.org/"&gt;dwm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Идея проста: хорошо -- manual tiling wm слишком сложные? Теперь вам вообще не надо будет думать о разбиении!!! Что это значит? Это значит, что просто так заниматься раскладыванием фреймов у вас не получится. Есть понятие разбиения -- layout -- и переключившись на него, все окна сами занимают свои фреймы. Например основной layout dwm это главное окно слева (самое большое) и стек (столбец) подчиненных окон справа.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dwm.suckless.org/screenshots/dwm-20070930.png"&gt;&lt;img width=640 src="http://dwm.suckless.org/screenshots/dwm-20070930.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Есть layout (monocle) которые все окна максимизирует на весь экран, и есть layout (float), когда оконный менеджер ведет себя почти как обычный, позволяя произвольно перемещать окна и задавать им произвольные размеры.&lt;br /&gt;&lt;br /&gt;Есть еще одна особенность dwm, автор поставил своей целью писать минималистское ПО, это отразилось на dwm следующим образом: конфигурация осуществляется путем правки простого .h файла и перекомпиляции. Размер кода dwm -- менее 2000 строк. Вы еще читаете этот текст? А все, оказывается, не так уж и страшно! Во первых, почти наверняка вы -- программист и компилятор уже стоит в системе. Во-вторых -- время пересборки меньше секунды. В третьих -- код настолько прост что создает ощущение тем, что вы им действительно владеете. В том смысле, что если вам что-то не нравится -- вы это просто пишите. Такой подход дал любопытный эффект -- для dwm доступно множество патчей, в числе которых -- разные схемы размещения (layouts).  Вышло множество форков, например, &lt;a href="http://www.blogger.com/%20http://www.peereboom.us/scrotwm/html/scrotwm.html"&gt;scrot wm&lt;/a&gt;. Появились клоны dwm написанные на разных языках и/или библиотеках. Наверное самые известные:&lt;br /&gt;&lt;a href="http://www.xmonad.org/"&gt;xmonad&lt;/a&gt; -- реализация на языке haskell. (Минимализм на функциональном языке программирования? Да уж...).&lt;br /&gt;&lt;a href="http://awesome.naquadah.org/"&gt;awesome&lt;/a&gt; -- "навороченная" версия dwm.&lt;br /&gt;&lt;br /&gt;Но на мой взгляд, все они уступают dwm в плане ясности мысли и простоты использования, при условии -- что вы -- программист.&lt;br /&gt;&lt;br /&gt;С dwm у меня получилась сложная история, и поэтому, я остановлюсь на нем подробнее.&lt;br /&gt;&lt;br /&gt;Запуск программ в dwm осуществляется или по горячим клавишам, или через программу dmenu. Идея dmwenu замечательна!!! Вы набираете часть названия программы, и по мере того, как вы это делаете -- количество вариантов в списке - строке постепенно сокращается. Это очень просто и страшно удобно! dmenu может использоваться и в других оконных менеджерах.&lt;br /&gt;&lt;br /&gt;В dwm нет рабочих столов, но есть понятие тегов. Так вот эта идея и может стать тем "недостатком", который может отпугнуь пользователя. Идея рабочих столов очень привычна, и поэтому когда ты переключаешься с тега на тег и видишь, что текущий layout не изменился ты злишься и не понимаешь, зачем автор придумал такой идиотизм? Я в начале решал проблему с помощью патчей, благо они есть -- которые превращают теги в рабочие столы, но потом, я как-то просек фишку и оказалось, что dwm именно то, что он есть!&lt;br /&gt;&lt;br /&gt;Просто вам придется свыкнуться с мыслью, что окна не нужно размещать руками. Вы просто распихиваете их по тегам, и тегов можно не бояться делать много. Одновременно на экране может быть отображено несколько тегов. Произвольные окна можно перенаправлять к произвольным же тегам. layout служит только одной простой цели -- есть основное окно с которым вы работаете -- и другие окна -- на которые вы смотрите краем глаза. Конечно, вы можете сделать любое окно основным.&lt;br /&gt;&lt;br /&gt;Отдельная история -- статусная строка. Это строка в которой кроме информации о тегах (кстати, в этой же строке dwm помечает urgent окна -- это очень удобно, например, когда приходит сообщение в pidgin вы это сразу увидите) можно вывести любую текстовую информацию. Вы можете послать туда вывод &lt;a href="http://conky.sourceforge.net/"&gt;conky&lt;/a&gt; или своего скрипта. В прошлых версиях dwm эта информация посылалась через конвейер (dwm считывал ее из stdin). В последних версиях эта информация считывается как имя root окна. Элегантно, хоть и немного странно.&lt;br /&gt;&lt;br /&gt;Основное достоинство dwm -- его простота и ясность идеи. Недостаток? Это отсутствие manual tiling и вы не можете разбить окна произвольно (конечно, если не считать float layout). Малое количество типов layout? Но, оказывается, после того, как мы поняли, что такое тэги -- необходимость в них отпадает. И все-таки, и все-таки иногда хочется возможности ручного разбития фреймов.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ratpoison&lt;/b&gt;&lt;br /&gt;Хорошее название. ratpoison: Say good-bye to the rodent -- написано на &lt;a href="http://www.nongnu.org/ratpoison/"&gt;сайте&lt;/a&gt; проекта. Первое впечатление -- это кошмар! Это по ту сторону добра и зла! Но при ближайшем рассмотрении оказывается, что это довольно интересный оконный менеджер, со своими интересными идеями. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nongnu.org/ratpoison/shot2.png"&gt;&lt;img width=640 src="http://www.nongnu.org/ratpoison/shot2.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Это manual tiling wm. И мне он показался проще ion3, но к сожалению он имеет следующие существенные недостатки:&lt;br /&gt;1) Отсутствует понятие как рабочих столов, так и тэгов. Вместо этого, нам предлагается использовать группы, которые означают лишь то, что разные окна находятся в списке активных окон. Без визуального подтверждения этого факта, довольно быстро начинаешь выходить из себя. Есть возможность сделать рабочие столы с помощью внешних скриптов, но.... Это страшно -- вызывать внешню программу каждый раз, когда я переключаю рабочий стол?&lt;br /&gt;&lt;br /&gt;2) Отсутствует возможность работать с окнами традиционно. Да -- это иногда нужно. Не так часто -- но нужно. Нам предлагается запускать в таких случаях из ratpoison другой wm -- временно. Это ужасно. :)&lt;br /&gt;&lt;br /&gt;3) Мышкой нельзя сделать вообще ничего. А все-таки, иногда хочется и мышкой повозить. :)&lt;br /&gt;&lt;br /&gt;Автор развивает свои идеи в &lt;a href="http://www.nongnu.org/stumpwm/"&gt;stumpwm&lt;/a&gt; -- оконном менеджере написанном на lisp. Поэтому не могу сказать ничего, так как не являюсь адептом этого языка.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;musca&lt;/b&gt;&lt;br /&gt;Новая надежда... Я следил за &lt;a href="http://aerosuidae.net/musca.html"&gt;musca&lt;/a&gt; с момента первых версий. Автор вдохновился ratpoison и dwm и сделал -- гибрид! Удивительный эффект -- довольно простой и все еще легкий (менее 3000 строк кода) manual tiling wm. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.users.on.net/~mythago/musca1.png"&gt;&lt;img width=640 src="http://www.users.on.net/~mythago/musca1.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я даже немного вовлекся в процесс разработки и посылал автору патчи и багфиксы... Автор плодил версии с невероятной скоростью -- версия в день или два. И каждый раз было что-то приятное, но качество кода было непредсказуемым. В начале я мирился с ошибками, но когда этот wm упал во время моей работы второй раз я понял, что с меня хватит.&lt;br /&gt;&lt;br /&gt;Внешне, практически без архитектурных недостатков, но внутренне -- все еще полный скрытых багов и отвечающий неопределённым поведением в не тестируемых ситуациях. Автор в каждой новой версии вводит какие-то новые фичи, часто ломая старое... В общем, противоречивые чувства.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Надежда галактики...&lt;/b&gt;&lt;br /&gt;Итак, после неудачного опыта с musca я безуспешно пробовал вернуться к ion3 и wmii. А затем, неожиданно, снова открыл для себя dwm. На данный момент это тот wm которому я могу доверять. В тоже время он не идеален... Что бы я хотел? Я бы хотел стабильную musca с функциями dwm. Тогда бы это был идеальный tiling wm. Пока же я успешно борюсь с позывами написать "еще один" wm. :) Я думаю -- это болезнь... :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-3181841603022394009?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/3181841603022394009/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=3181841603022394009' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3181841603022394009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3181841603022394009'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/05/tiling-wm.html' title='Краткий обзор tiling window managers (ion3, wmii, dwm, ratpoison, musca)'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6435848814103979986.post-6476675613136798537</id><published>2009-04-21T15:27:00.003+04:00</published><updated>2009-04-21T15:35:14.430+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Наклонный шрифт Terminus и сглаживание</title><content type='html'>Интересная особенность поведения freetype. Настраивая цветовые схемы в gvim, столкнулись с тем, что наклонный шрифт Terminus на моей машине сглаживается, а на другой машине -- нет. Долго думали. Ответ оказался простым.&lt;br /&gt;&lt;br /&gt;На моей системе не был установлен xfonts-terminus-oblique. И freetype мне этот наклонный шрифт, видимо, делала сама. Заодно -- сглаживая.&lt;br /&gt;&lt;br /&gt;На другой машине использовался готовый растровый/не сглаживаемый oblique.&lt;br /&gt;&lt;br /&gt;Вот такая вот регрессия от использования oblique версии terminus вместе с xft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6476675613136798537?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6476675613136798537/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6476675613136798537' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6476675613136798537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6476675613136798537'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/04/terminus.html' title='Наклонный шрифт Terminus и сглаживание'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-7939887553620179978</id><published>2009-04-09T18:08:00.004+04:00</published><updated>2009-04-09T18:17:29.214+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Применение специальных возможностей GCC в яде Linux</title><content type='html'>На www.ibm.com появилась &lt;a href="http://www.ibm.com/developerworks/ru/library/l-gcc-hacks/index.html?S_TACT=105AGX99&amp;S_CMP=GR01"&gt;статья&lt;/a&gt;, в чем-то перекликающаяся с моими постами:&lt;a href="http://syslogblog.blogspot.com/2008/10/blog-post.html"&gt;http://syslogblog.blogspot.com/2008/10/blog-post.html&lt;/a&gt; и &lt;a href="http://syslogblog.blogspot.com/2009/01/gcc.html"&gt;http://syslogblog.blogspot.com/2009/01/gcc.html&lt;/a&gt;. Некоторые вещи, которые показались интересными:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Определение адреса, откуда была вызвана функция. level -- глубина стека.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void * __builtin_return_address( unsigned int level );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Предварительная выборка. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void __builtin_prefetch( const void *addr, int rw, int locality );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-7939887553620179978?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/7939887553620179978/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=7939887553620179978' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7939887553620179978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7939887553620179978'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/04/gcc-linux.html' title='Применение специальных возможностей GCC в яде Linux'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-6290727124633668570</id><published>2009-03-19T16:28:00.002+03:00</published><updated>2009-03-19T16:34:39.959+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Слежение за дисковыми операциями</title><content type='html'>Иногда бывает полезно узнать, что за процессы пишут/читают с диска. Для этого можно воспользоваться механизмом отладки блокового ввода/вывода:&lt;br /&gt;&lt;br /&gt;echo "1" &gt; /proc/sys/vm/block_dump&lt;br /&gt;&lt;br /&gt;И смотреть в dmesg: dmesg -c. При этом желательно остановить syslog, так как запись в syslog будет появляться в dmesg вызывая цепную реакцию. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6290727124633668570?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6290727124633668570/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6290727124633668570' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6290727124633668570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6290727124633668570'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/03/blog-post.html' title='Слежение за дисковыми операциями'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-234683518590816334</id><published>2009-02-26T18:28:00.005+03:00</published><updated>2009-02-26T18:43:55.765+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>readdir и  d_type</title><content type='html'>Все-таки нужно всегда внимательно читать маны. Возьмём, например, фрагмент кода (на котором все и произошло):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;while ((de = readdir(d))) {&lt;br /&gt;        if (de-&gt;d_type != DT_DIR)&lt;br /&gt;                continue;&lt;br /&gt;        if (!is_game(de-&gt;d_name))&lt;br /&gt;                continue;&lt;br /&gt;        n ++;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И вроде бы все нормально, но читаем man readdir и видим: 'If the file type could not be determined, the value DT_UNKNOWN is returned in d_type.' То есть вроде бы есть поле, вроде бы может вернуть тип. Но может и не вернуть. И что интересно, действительно не возвращает иногда. Например на raiserfs. Но не только. Интересно. И в notes:&lt;br /&gt;&lt;br /&gt;Under  glibc,  programs can  check  for  the  availability  of  the  fields  not  defined  in  POSIX.1  by testing whether the macros _DIRENT_HAVE_D_NAMLEN, _DIRENT_HAVE_D_RECLEN, _DIRENT_HAVE_D_OFF, or _DIRENT_HAVE_D_TYPE are defined.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-234683518590816334?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/234683518590816334/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=234683518590816334' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/234683518590816334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/234683518590816334'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/02/readdir-dtype.html' title='readdir и  d_type'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-6630204814937543780</id><published>2009-02-21T08:41:00.003+03:00</published><updated>2009-02-21T15:27:09.473+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><title type='text'>LOR effect</title><content type='html'>Запостил новость про INSTEAD на linux.org.ru. И вот: We are sorry, but this site has exceeded its bandwidth limit at this time. Не ожидал от гугла. Перенес проект на &lt;a href="http://instead.googlecode.com"&gt;http://instead.googlecode.com&lt;/a&gt; и запросил еще один проект на sourceforge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6630204814937543780?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6630204814937543780/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6630204814937543780' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6630204814937543780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6630204814937543780'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/02/lor-effect.html' title='LOR effect'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-4248018284551033836</id><published>2009-02-19T22:21:00.002+03:00</published><updated>2009-02-19T22:24:14.653+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Внутренний релиз моей игрушки</title><content type='html'>Собственно, выложил для тестирования. Описание и скриншоты -- &lt;a href="http://sites.google.com/site/sdlinstead/"&gt;http://sites.google.com/site/sdlinstead/&lt;/a&gt;. Кратко -- смесь визуальной новеллы, текстовой адвенчуры и квеста из 90-х. Пока для Linux, возможно будет для Win и Maemo. Пишите, если попробовали.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-4248018284551033836?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/4248018284551033836/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=4248018284551033836' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4248018284551033836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4248018284551033836'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/02/blog-post.html' title='Внутренний релиз моей игрушки'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1892773149394276437</id><published>2009-02-18T16:40:00.004+03:00</published><updated>2009-02-19T14:04:32.366+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arch'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Linux на hp6710b/Arch Linux</title><content type='html'>Купил ноут: HP6710b -- рабочая лошадка. Что порадовало -- работает suspend to ram!!! То, чего так не хватало после сноса MacOS X на powerbook'е. В качестве эксперимента -- поставил Arch Linux. С момента установки прошло 4 дня -- можно поделиться впечатлениями...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Скажу откровенно -- после непосредственно установки было сильное желание поставить Debian, но было жаль потраченных усилий, и некоторые вещи мне действительно понравились, поэтому оставил... Через пару дней уже не испытывал дискомфорта, но все-еще испытываю удивление... И так, в чем специфика?&lt;br /&gt;&lt;br /&gt;Пакетный менеджер есть, сильно слабее Debian'овского, но зато проще и свои функции выполняет нормально. И вот, допустим ставим на систему gnome... И что видим? Gnome -- полностью голый, не сглаженные шрифты, нет powermanager'a. Почему? Потому-что были получены только самые необходимые зависимости. Если вы знаете систему -- вы поставите dbus, hal, gnome-extras, xft и что-нибудь еще... Но что вы обнаруживаете?&lt;br /&gt;&lt;br /&gt;Скрипты сервисов кладутся в /etc/rc.d и все. Для того, чтобы они прогружались при загрузке -- нужно в системном конфиге задать переменную шелла, в которой перечислены нужные сервисы. @ в начале означает фоновый запуск. ! - отключенный сервис. Порядок загрузки и собственно что загружать -- на совести "пользователя". Никаких ранлевелов. Ну с недостатками такой схемы все ясно -- а достоинства? Все ОЧЕНЬ просто. Скрипты быстрые. Система грузится моментально. Все под контролем.&lt;br /&gt;&lt;br /&gt;Еще пример: ставим audacious (плеер), не играет mp3. Правильно, нужно доставить audacious-plugins. :) &lt;br /&gt;&lt;br /&gt;В Arch linux пакеты не делятся на dev и двоичные. С одной стороны это должно приводить к расходованию дискового пространства. С другой стороны -- это сильно упрощает репозиторий и облегчает жизнь "пользователю", который часто что-то компилирует :) Удивительно -- но Arch у меня сейчас занимает меньше места, чем Debian, видимо из-за меньших зависимостей.&lt;br /&gt;&lt;br /&gt;UPD: Сегодня (19 февраля) это уже не так. :)&lt;br /&gt;&lt;br /&gt;Репозиторий Arch гораздо меньше, чем Debian. Debian абсолютный лидер в этом смысле, но есть AUR, поддерживаемый пользователями Arch, который позволяет дособрать интересующие пакеты из исходников (с вытягиванием нужных зависимостей). Таким образом я поставил wine. Минусы подхода очевидны. Ну а плюсы?&lt;br /&gt;&lt;br /&gt;Всегда очень новые пакеты. Мобильный дистрибутив.&lt;br /&gt;&lt;br /&gt;Еще хочется отметить хорошую Wiki и форум -- где практически все проблемы уже кем-то обсуждались.&lt;br /&gt;&lt;br /&gt;Какие проблемы встретил? Firefox не хватает flash plugin из gnash-gtk -- в итоге на форуме нашел другое решение проблемы. Цветовая схема mutt была ужасна -- взял конфиг из debian. :) Был какой-то глюк с апдейтом -- но как то легко победился -- я даже не понял, что точно произошло. Иксы вешали машину, пока я не отконфигурил их с помощью специально предназначенной для этого утилиты. :) Вроде все. Теперь каждый день узнаю что-то новое.  В общем, дистрибутив для программистов, более-менее знающих систему, и для романтиков. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1892773149394276437?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1892773149394276437/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1892773149394276437' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1892773149394276437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1892773149394276437'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/02/linux-hp6710barch-linux.html' title='Linux на hp6710b/Arch Linux'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-6287267171798131032</id><published>2009-01-29T21:19:00.002+03:00</published><updated>2009-01-29T21:23:35.142+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Вышел reTracked #2</title><content type='html'>Ура! Буквально позавчера вышел долгожданный диск reTracked#2. Это качественные ремэйки олдскульной трекерной музыки. Уже на закачке... :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://retracked.org/dl2.html"&gt;Ссылка для скачивания.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6287267171798131032?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6287267171798131032/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6287267171798131032' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6287267171798131032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6287267171798131032'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/retracked-2.html' title='Вышел reTracked #2'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-5425988504950304078</id><published>2009-01-28T12:02:00.003+03:00</published><updated>2009-01-28T12:14:50.286+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><title type='text'>Безопасное удаление файлов</title><content type='html'>Давно не покупал "Компьютерру". А тут начал вдруг опять читать. В последнем номере (768) в статье "Мифы и легенды высоких технологий" сообщается об &lt;a href="http://sansforensics.wordpress.com/2009/01/15/overwriting-hard-drive-data/"&gt;исследовании&lt;/a&gt; вопроса безопасного перезатирания (удаления) данных на винчестере. Авторы исследования констатируют, что единственной перезаписи данных вполне достаточно, а вероятность восстановления хотя бы байта информации -- ничтожна. &lt;br /&gt;&lt;br /&gt;Все смотрим man shred. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-5425988504950304078?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/5425988504950304078/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=5425988504950304078' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5425988504950304078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5425988504950304078'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/blog-post_28.html' title='Безопасное удаление файлов'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-3501571545259708244</id><published>2009-01-22T13:35:00.003+03:00</published><updated>2009-01-22T14:48:23.749+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Расширения GCC</title><content type='html'>Довольно интересная глава в книжке &lt;a href="http://www.linuxtopia.org/online_books/programming_tool_guides/linux_using_gnu_compiler_collection/c-extensions.html"&gt;Red Hat Enterprise Linux 4: Using the GNU Compiler Collection (GCC)&lt;/a&gt;. Большинство вещей широко известны, но некоторые из них показались мне очень любопытными, чтобы о них написать.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;b&gt;Локальные метки&lt;/b&gt;&lt;br /&gt;__label__ label;&lt;br /&gt;или&lt;br /&gt;__label__ label1, label2, /* … */;&lt;br /&gt;Метка становится локальной для того блока, в котором она объявлена, например, из ядра:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&amp;&amp;__here; })&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь мы видим, кстати, еще один интересный трюк.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Переопределяемые метки&lt;/b&gt;&lt;br /&gt;Можно взять адрес метки с помощью оператора &amp;&amp;. Тип результата будет void*. Значение является константным и его можно использовать везде, где допускается константа этого типа. Один из примеров был приведен выше.  Другой пример -- использование с goto, например:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void *ptr;&lt;br /&gt;/* … */&lt;br /&gt;ptr = &amp;&amp;foo;&lt;br /&gt;goto *ptr;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Или еще хуже:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static void *array[] = { &amp;&amp;foo, &amp;&amp;bar, &amp;&amp;hack };&lt;br /&gt;goto *array[i];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Нас предупреждают, что переходы между метками разных функций непредсказуемы. &lt;br /&gt;Следующий пример, иллюстрирует адресную арифметику. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static const int array[] = { &amp;&amp;foo - &amp;&amp;foo, &amp;&amp;bar - &amp;&amp;foo,&lt;br /&gt;                             &amp;&amp;hack - &amp;&amp;foo };&lt;br /&gt;goto *(&amp;&amp;foo + array[i]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Вложенные функции&lt;/b&gt;&lt;br /&gt;Оказывается, gcc позволяет определять вложенные функции. Например:&lt;br /&gt;&lt;pre&gt;hack (int *array, int size)&lt;br /&gt;{&lt;br /&gt;  void store (int index, int value)&lt;br /&gt;    { array[index] = value; }&lt;br /&gt;&lt;br /&gt;  intermediate (store, size);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Массивы с нулевым размером&lt;/b&gt;&lt;br /&gt;Широко используется в качестве последнего элемента структуры (размер которой может варьироваться). Например:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;struct line {&lt;br /&gt;  int length;&lt;br /&gt;  char contents[0];&lt;br /&gt;};&lt;br /&gt;struct line *thisline = (struct line *)&lt;br /&gt;  malloc (sizeof (struct line) + this_length);&lt;br /&gt;thisline-&gt;length = this_length;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Важным является то, что в стандарте ISO C90 приходится использовать размер массива равным 1, что затрудняет вычисления правильного размера структура, а в стандарте ISO C99 нужно использовать массив с неопределенным числом элементов ([]).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Автоматические массивы с переменным размером&lt;/b&gt;&lt;br /&gt;Пример.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;FILE *&lt;br /&gt;concat_fopen (char *s1, char *s2, char *mode)&lt;br /&gt;{&lt;br /&gt;  char str[strlen (s1) + strlen (s2) + 1];&lt;br /&gt;  strcpy (str, s1);&lt;br /&gt;  strcat (str, s2);&lt;br /&gt;  return fopen (str, mode);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Или,даже, так:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;struct entry&lt;br /&gt;tester (int len, char data[len][len])&lt;br /&gt;{&lt;br /&gt;  /* … */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Макросы с переменным числом параметров&lt;/b&gt;&lt;br /&gt;По стандарту ISO C99:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Другой вариант, давно поддерживаемый gcc:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define debug(format, args...) fprintf (stderr, format, args)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Правда, по стандарту C нельзя опустить третий параметр, и, например запись: debug ("A message") -- будет ошибочной. Чтобы решить эту проблему, можно использовать ##:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Инициализаторы&lt;/b&gt;&lt;br /&gt;Инициализация массивов по ISO C99 (GCC позволяет делать так и в C89)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int a[6] = { [4] = 29, [2] = 15 };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Синоним:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int a[6] = { 0, 0, 15, 0, 29, 0 };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Еще одно расширение GNU:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Почти как meta tables в Lua. :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Диапазоны в case&lt;/b&gt;&lt;br /&gt;А это вообще убойная вещь, например:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;case 'A' ... 'Z':&lt;br /&gt;case 1 ... 5:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пробелы вокруг точек &lt;i&gt;обязательны&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Если эти примеры показались для вас интересными, рекомендую прочитать всю главу.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-3501571545259708244?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/3501571545259708244/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=3501571545259708244' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3501571545259708244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3501571545259708244'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/gcc.html' title='Расширения GCC'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-710936195710049239</id><published>2009-01-18T21:48:00.003+03:00</published><updated>2009-01-19T09:11:17.502+03:00</updated><title type='text'>Разнообразие...</title><content type='html'>Еще несколько альтернативных операционных систем, кроме DragonFly BSD.&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.helenos.org/"&gt;Helen OS&lt;/a&gt; - Микроядро. &lt;br /&gt;&lt;a href="http://web.syllable.org/pages/index.html"&gt;Syllable&lt;/a&gt; - скриншоты приятны на вид.&lt;br /&gt;&lt;a href="http://www.haiku-os.org/"&gt;Haiku-os&lt;/a&gt; - open source BeOS.&lt;br /&gt;&lt;br /&gt;Если/когда дойдут руки посмотреть эти игрушки, опишу свои впечатления.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-710936195710049239?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/710936195710049239/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=710936195710049239' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/710936195710049239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/710936195710049239'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/blog-post_18.html' title='Разнообразие...'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-4734239706141465606</id><published>2009-01-15T20:34:00.003+03:00</published><updated>2009-01-15T21:02:44.888+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Разочарования...</title><content type='html'>Что-то все больше разочарований. Сначала Debian, со своей параноидальной борьбой за чистоту рядов и бюрократией... А теперь вот, заглянул в ядро Ubuntu и что вижу?&lt;br /&gt;&lt;br /&gt;Все патчи свалены в один файл. Причем один из патчей -- это совершенно не нужный мне AppArmor, затрагивающий vfs слой (то есть фактически, ломающий совместимость для потенциально интересных патчей). Раскрутить это монолитное безобразие очень тяжело и вряд-ли оправданно. В общем, делаю вывод, что большие дистрибутивы обладают довольно существенным недостатком -- инертностью. Когда/если у меня появится новый ноутбук буду пробовать ArchLinux и DragonFly BSD. Про rpm-based дистрибутивы речь, конечно,  даже не идет -- это уже просто куча хлама.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-4734239706141465606?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/4734239706141465606/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=4734239706141465606' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4734239706141465606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4734239706141465606'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/blog-post_15.html' title='Разочарования...'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-7262109352922519201</id><published>2009-01-03T19:32:00.002+03:00</published><updated>2009-01-03T19:46:54.416+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Для чего существуют правила?</title><content type='html'>Не так давно натолкнулись на тот факт, что в Debian-lenny покоцанное от firmware ядро. Сильно расстроило даже не то, что сетевуха не завелась, а то, что политика заставляет разработчиков делать какие-то странные действия. Например, orig файл уже не совсем (далеко не совсем) vanilla ядро из kernel.org.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;В общем, испытали потрясение. Фанатизм страшная штука, подумал я. Слепая борьба за принцип -- всегда вылезет где-нибудь боком. Принцип или правила не существуют сами для себя -- они носят служебную функцию... В общем, уже начал подумывать об arch linux, когда прочитал новость: &lt;a href="http://www.opennet.ru/opennews/art.shtml?num=19618"&gt;http://www.opennet.ru/opennews/art.shtml?num=19618&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Это радует. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-7262109352922519201?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/7262109352922519201/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=7262109352922519201' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7262109352922519201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7262109352922519201'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2009/01/blog-post.html' title='Для чего существуют правила?'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-8599450822873146060</id><published>2008-12-09T16:32:00.007+03:00</published><updated>2008-12-23T11:34:26.180+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Что такое derived work или в чем несвобода gpl?</title><content type='html'>В тексте лицензии GPLv2 используется такое понятие как "derived". Если говорить конкретно, то речь идет о том, что если ваша программа есть порожденная работа от GPLv2 проекта, то и она должна быть выпущена под GPLv2. Но что считать порожденной работой? &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Например, если я пишу игру на SDL, является ли код игры derived? Или у нас есть драйвер модема для Linux -- должен ли он быть открыт? Вопрос почти философский, и тем не менее (или -- тем более) требующий выяснения.&lt;br /&gt;&lt;br /&gt;Наверное, самое простое и удачное правило (&lt;a href="http://kerneltrap.org/node/4674"&gt;Linux: EXPORT_SYMBOL_GPL vs EXPORT_SYMBOL&lt;/a&gt;), выглядит так:&lt;br /&gt;&lt;i&gt;"if work A would not exist (or would be radically different) if work B did not exist, then A is a derivative work of B."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;По-моему очень точно соответствует действительности. Драйвер устройства может быть в общем случае написан для любой системы. По крайней мере большая часть драйвера может быть независима от API ядра. В тоже время модуль к оконному менеджеру выпущенному под лицензией GPLv2, даже выделенный в отдельный проект -- должен быть выпущен под той-же лицензией.&lt;br /&gt;&lt;br /&gt;Довольно давно, в коде ядра Linux некоторые из символов стали экспортироваться как EXPORT_SYMBOL_GPL, что означает возможность их использования только в GPL модулях. Похоже, такую идею можно назвать попыткой решить вопросы лицензионной политики программным способом. (Если используешь функцию/подсистему специфичную для ядра Linux -- то ты работаешь над GPL проектом.)&lt;br /&gt;&lt;br /&gt;Вообще, интересно отметить, что здесь лицензия GPL оказывается не "просто свободной" лицензией (как часто привычно думается), а довольно прагматичным способом решить те задачи, которые поставил Столлман. Гильдия программистов -- пользователей лицензии GPLv2, имеют полную свободу модифицировать код проекта, но платят за это своей работой и что самое интересное, &lt;i&gt;НЕсвободой&lt;/i&gt; освободить проект из под GPL лицензии и сделать его общественным достоянием в полном смысле, например, выпустив его под не-copyleft BSD-лицензией.&lt;br /&gt;&lt;br /&gt;В тоже время выпустив проект под BSD-лицензией, мы можем получить GPL продукт на его основе, в следствии совместимости BSD с GPL.&lt;br /&gt;&lt;br /&gt;Если вас также, как и меня, заинтересовали подобные вопросы, то рекомендую ознакомиться со статьей: &lt;a href="http://www.unesco.ru/files/docs/ci/foss/GPL-Freedom-edited.pdf"&gt;Владимир Осинцев. Всегда ли General Public License – это свобода?&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-8599450822873146060?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/8599450822873146060/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=8599450822873146060' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/8599450822873146060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/8599450822873146060'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/12/dirived-work-gpl.html' title='Что такое derived work или в чем несвобода gpl?'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1666848279649017357</id><published>2008-12-09T16:23:00.002+03:00</published><updated>2008-12-09T16:32:07.811+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>notify-send</title><content type='html'>Когда я использовал Mac, мне очень нравилась подсистема оповещений о событиях &lt;a href="http://growl.info/"&gt;growl&lt;/a&gt;. Это такие всплывающие сообщения о каких-либо событиях требующих внимания. Довольно неожиданно обнаружил, что и в Linux есть подобная &lt;a href="http://www.galago-project.org/news/index.php"&gt;штука&lt;/a&gt;. В дебиане: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apt-get install libnotify-bin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И теперь можно, например, поставить сборку и узнать об ее окончании по всплывающему сообщению.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;make; notify-send "Compilation is end"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1666848279649017357?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1666848279649017357/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1666848279649017357' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1666848279649017357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1666848279649017357'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/12/notify-send.html' title='notify-send'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-5045129551433137802</id><published>2008-11-22T16:49:00.005+03:00</published><updated>2008-11-22T20:57:29.445+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>НЕ-модули безопасности (lsm)</title><content type='html'>Странная судьба у хорошего, казалось-бы, начинания - &lt;a href="http://en.wikipedia.org/wiki/Linux_Security_Modules"&gt;lsm&lt;/a&gt;. Моя работа связана с модификацией ядра и я, когда перешли к использованию ядра 2.6.xx, был очень рад использовать хуки lsm там, где это возможно. Потом, с каждой версией я с ужасом наблюдал как колбасится интерфейс lsm. Как уходят из него все больше и больше нужных кухов (например post_mknod нет, а socket_post_create есть) и как мечется мысль разработчиков в поисках "правильного" пути. А потом, потом они сказали что модули больше не модули. &lt;a href="http://lwn.net/Articles/239697/"&gt;security: Convert LSM into a static interface&lt;/a&gt;. А потом убрали возможность дергать security функции из модулей. В общем, похоже теперь lsm годен только для SELinux и немногочисленных модулей в составе ядра... :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-5045129551433137802?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/5045129551433137802/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=5045129551433137802' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5045129551433137802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5045129551433137802'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/11/lsm.html' title='НЕ-модули безопасности (lsm)'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-3876991050387696164</id><published>2008-11-22T16:39:00.004+03:00</published><updated>2008-11-22T16:48:14.544+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Неизвестная известная snprintf</title><content type='html'>Довольно часто при работе с форматными строками на C используется функция snprintf. При этом, типичной является конструкция, например, следующего вида:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for (...) {&lt;br /&gt;        offset += snprintf(buf + offset, PAGE_SIZE - offset, " %02x", val);&lt;br /&gt;        ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Постепенно заполняем буфер форматированной строкой. При этом часто негласно принимается такое предположение, что функция вернет количество записанных в буфер байт (не считая последнего 0). Интересно, что это не всегда так.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Дело в том, что если почитать man по snprintf, то мы обнаружим, что в случае если размер буфера не достаточен для строки, то функция возвращает количество байт без последнего 0, которые БЫЛИ БЫ записаны, в случае, если БЫ размер буфера  БЫЛ БЫ достаточен! То есть, если в приведенном выше примере произойдет отсечение результата, то на следующей  итерации цикла мы полезем за границу буфера с отрицательным размером буфера (тип которого приведется к беззнаковому size_t)!&lt;br /&gt;&lt;br /&gt;Интересно, что в реализации ядра Linux, функция vsnprintf содержит такую проверку:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if (unlikely((int) size &lt; 0)) {&lt;br /&gt;        /* There can be only one.. */&lt;br /&gt;        static char warn = 1;&lt;br /&gt;        WARN_ON(warn);&lt;br /&gt;        warn = 0;&lt;br /&gt;        return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;То-есть, если в результате итераций в первом примере мы получаем отрицательный размер буфера, мы об этом узнаем... ;)&lt;br /&gt;&lt;br /&gt;Кроме того, в ядре Linux есть реализация функции scnprintf, которая выглядит следующим образом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int scnprintf(char * buf, size_t size, const char *fmt, ...)&lt;br /&gt;{&lt;br /&gt;        va_list args;&lt;br /&gt;        int i;&lt;br /&gt;&lt;br /&gt;        va_start(args, fmt);&lt;br /&gt;        i = vsnprintf(buf, size, fmt, args);&lt;br /&gt;        va_end(args);&lt;br /&gt;        return (i &gt;= size) ? (size - 1) : i;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как видим, это та функция, которая всегда возвращает число записанных в буфер байт не считая 0 и -1 если размер буфера 0. Хотя в документации написано: "If size is &lt;= 0 the function returns 0", и это мне не понятно, так как из кода следует, что все-таки это будет -1.&lt;br /&gt;&lt;br /&gt;А вот другой пример контроля за размером буфера:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for (i = 0; i &lt; npids; i++) &lt;br /&gt;        cnt += snprintf(buf + cnt, max(sz - cnt, 0), "%d\n", a[i]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Правда типы sz и cnt в данном случае не size_t, а int, что не очень красиво.&lt;br /&gt;&lt;br /&gt;Ну и, наконец, можно просто проверять накопленное смещение:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if ((offset += snprintf(...)) &gt;= buffsize) {&lt;br /&gt;        /* ... error handling ... */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Приятной особенностью поведения функции snprintf является тот факт, что мы можем вычислять размер буфера для отформатированной строки за счет передачи нулевого размера буфера. Например:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sz = snprintf(NULL, 0, " ..... ", .... ) + 1;&lt;br /&gt;ptr = malloc(sz);&lt;br /&gt;snprintf(ptr, sz, " .... ", ... );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ссылки: &lt;a href="http://lwn.net/Articles/69419/"&gt;snprintf() confusion' 2004 by corbet&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-3876991050387696164?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/3876991050387696164/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=3876991050387696164' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3876991050387696164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3876991050387696164'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/11/snprintf.html' title='Неизвестная известная snprintf'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1172025871061491853</id><published>2008-11-09T21:04:00.006+03:00</published><updated>2008-11-09T21:29:21.454+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Неизвестная известная strncpy</title><content type='html'>Для начала небольшой эксперимент с подвохом. Исходный код test.c&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;char *mystrncpy(char *dest, const char *src, size_t n)&lt;br /&gt;{&lt;br /&gt;        size_t i;&lt;br /&gt;        for (i = 0 ; i &lt; n &amp;&amp; src[i] != '\0' ; i++)&lt;br /&gt;                dest[i] = src[i];&lt;br /&gt;        if (i &lt; n)&lt;br /&gt;                dest[i] = '\0';&lt;br /&gt;        return dest;&lt;br /&gt;}&lt;br /&gt;#define BUFF_SIZE 4096&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;        int i;&lt;br /&gt;        char buff[BUFF_SIZE];&lt;br /&gt;        for (i = 0; i &lt; 0x100000; i++) {&lt;br /&gt;#ifdef STRNCPY&lt;br /&gt;                strncpy(buff, "test", sizeof(buff));&lt;br /&gt;#else&lt;br /&gt;                mystrncpy(buff, "test", sizeof(buff));&lt;br /&gt;#endif&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Тест выполняет 0x100000 копирований строки. Причем при сборке с ключом -DSTRNCPY будет использоваться функция glibc, в противном случае будет использоваться "самописная" mystrncpy. Проверяем...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ gcc test.c -O2 -DSTRNCPY&lt;br /&gt;peter@crashed:/tmp$ time ./a.out &lt;br /&gt;real    0m6.368s&lt;br /&gt;peter@crashed:/tmp$ gcc test.c -O2&lt;br /&gt;peter@crashed:/tmp$ time ./a.out &lt;br /&gt;real    0m0.062s&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Интересно, разница видна, как говорится, невооруженным глазом. Да, да... Мы не ошиблись -- примитивная функция mystrncpy работает быстрее на порядок!!! В чем подвох? &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Если мы внимательно прочитаем man по strncpy, то ответ будет быстро найден: мы забыли, что функция strncpy всегда дополняет нулями целевой буфер! Довольно часто для C программиста эта особенность не является важной и функция strncpy используется для пересылки строки в другой буфер. Но чем длиннее принимающий буфер, тем дольше будет выполняться вызов strncpy! Большинство программистов избегает лишних вызовов strlen, но в данном случае даже strlen и memcpy сработают быстрее одного strncpy. Вот такая неизвестная известная функция.&lt;br /&gt;&lt;br /&gt;Другой неприятной особенностью функции strncpy является некоторая запутанность логики в том смысле, что мы можем вообще не получить null terminated string если размер буфера оказался мал. Из-за этой особенности strncpy часто используется совместно с занулением последнего байта буфера. То есть копирование выглядит примерно так:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;strncpy(buff, string, sizeof(buff) - 1);&lt;br /&gt;buff[sizeof(buff)-1] = 0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Но и этот вариант не является идеальным. Мы не можем отследить факт отсечения строки, который мог произойти во время копирования.&lt;br /&gt; &lt;br /&gt;Похожие вещи обстоят и с другой функцией: strncat. Любопытно, что в ядре Linux довольно широко используется strncpy с большими буферами и далеко не всегда заполнение нулями необходимо. &lt;br /&gt;&lt;br /&gt;Архитектурно-независимая реализация strncpy в ядре:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;char *strncpy(char *dest, const char *src, size_t count) &lt;br /&gt;{ &lt;br /&gt;        char *tmp = dest; &lt;br /&gt; &lt;br /&gt;        while (count) { &lt;br /&gt;                if ((*tmp = *src) != 0) &lt;br /&gt;                        src++; &lt;br /&gt;                tmp++; &lt;br /&gt;                count--; &lt;br /&gt;        } &lt;br /&gt;        return dest; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;То-есть strncpy ведет себя также как и glibc версия -- цикл всегда выполняется count (размер буфера) раз.&lt;br /&gt;&lt;br /&gt;Замечательно, что в OpenBSD 2.4 были включены функции strlcpy/strlcat. &lt;a href="http://www.usenix.org/events/usenix99/millert.html"&gt;strlcpy and strlcat--Consistent, Safe, String Copy and Concatenation (at USENIX99)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Если кратко, то это именно те функции, которые чаще всего и нужны. Они, например, всегда гарантируют получение null-terminated string в буфере без лишних усилий. Кроме того, не зануляют остаток буфера. Вот как реализована strlcpy в ядре Linux:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;size_t strlcpy(char *dest, const char *src, size_t size)&lt;br /&gt;{&lt;br /&gt;        size_t ret = strlen(src);&lt;br /&gt;&lt;br /&gt;        if (size) {&lt;br /&gt;                size_t len = (ret &gt;= size) ? size - 1 : ret;&lt;br /&gt;                memcpy(dest, src, len);&lt;br /&gt;                dest[len] = '\0';&lt;br /&gt;        }&lt;br /&gt;        return ret;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Те самые strlen с memcpy о которых мы говорили в начале. Как видим из кода, по результату функции можно определить было ли отсечение результата или нет. &lt;br /&gt;&lt;br /&gt;На данный момент, если верить &lt;a href="http://en.wikipedia.org/wiki/Strlcpy"&gt;Википедии&lt;/a&gt;, многие библиотеки и приложения содержат в себе копии реализаций strlcpy/strlcat. Там же можно прочитать и про спорные моменты по введению и использованию этих функций. &lt;br /&gt;&lt;br /&gt;Что, однако, настораживает:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp/linux-2.6-2.6.26$ grep -R "strlcpy" --include "*.c" * -l | wc -l&lt;br /&gt;419&lt;br /&gt;peter@crashed:/tmp/linux-2.6-2.6.26$ grep -R "strlcpy" --include "*.c" * -l | while read f; do grep "strncpy" $f; done | wc -l&lt;br /&gt;38&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Как видим в ядре Linux практически везде, где используется strlcpy, strncpy не используется, но и наоборот также.  Это скорее похоже на привычку программистов, чем на систему.&lt;br /&gt;&lt;br /&gt;Ну и в заключение код strlcat из ядра Linux.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;size_t strlcat(char *dest, const char *src, size_t count)&lt;br /&gt;{       &lt;br /&gt;        size_t dsize = strlen(dest);&lt;br /&gt;        size_t len = strlen(src);&lt;br /&gt;        size_t res = dsize + len;&lt;br /&gt;&lt;br /&gt;        /* This would be a bug */&lt;br /&gt;        BUG_ON(dsize &gt;= count);&lt;br /&gt;&lt;br /&gt;        dest += dsize;&lt;br /&gt;        count -= dsize;&lt;br /&gt;        if (len &gt;= count)&lt;br /&gt;                len = count-1;&lt;br /&gt;        memcpy(dest, src, len);&lt;br /&gt;        dest[len] = 0;&lt;br /&gt;        return res;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1172025871061491853?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1172025871061491853/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1172025871061491853' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1172025871061491853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1172025871061491853'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/11/strncpy.html' title='Неизвестная известная strncpy'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-6600873863965429165</id><published>2008-11-09T16:22:00.006+03:00</published><updated>2008-11-09T20:00:02.735+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='system'/><title type='text'>Перехват функций glibc на примере fakeroot</title><content type='html'>Пакет fakeroot был создан специально для системы сборки Debian. Идея fakeroot в том, чтобы за счет перехвата функций glibc сделать (непривилегированную) среду в которой файловые операции выполняются так, как будто бы они выполнялись от привилегированного пользователя. В свою очередь это дает возможность создавать архивы с произвольными правами содержимых файлов. &lt;br /&gt;&lt;span class="fullpost"&gt; Например, как будучи обычным пользователем создать архив в котором владелец архивных файлов является root? А в fakeroot это возможно.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ id&lt;br /&gt;uid=1000(peter) gid=1000(peter) группы=20(dialout),24(cdrom),25(floppy),29(audio),60(games),100(users),1000(peter)&lt;br /&gt;peter@crashed:/tmp$ &gt; test.txt&lt;br /&gt;peter@crashed:/tmp$ ls -la test.txt &lt;br /&gt;-rw-r--r-- 1 peter peter 0 Ноя  9 14:35 test.txt&lt;br /&gt;peter@crashed:/tmp$ fakeroot&lt;br /&gt;root@crashed:/tmp# ls -la test.txt &lt;br /&gt;-rw-r--r-- 1 root root 0 Ноя  9 14:35 test.txt&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чудеса. В данном случае мы видим, что из среды fakeroot мы видим не реальные права файла, а подмененные. Также, если создать файл в среде fakeroot, то реальные права будут принадлежать пользователю, но в среде fakeroot они будут казаться принадлежащими root. Хорошо -- мы уже догадались как это работает...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ fakeroot&lt;br /&gt;root@crashed:/tmp# env | grep fake&lt;br /&gt;LD_PRELOAD=libfakeroot-sysv.so&lt;br /&gt;LD_LIBRARY_PATH=/usr/lib/libfakeroot:/usr/lib64/libfakeroot:/usr/lib32/libfakeroot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итак, fakeroot перехватывает библиотечные вызовы, например stat, с помощью механизма LD_PRELOAD. Данный способ перехвата широко известен и заключается в том, что линкер загружает заданные в LD_PRELOAD (или в файле /etc/ld.preload) библиотеку(и) раньше других и если в библиотеке определены требуемые функции (в нашем случае функции glibc) то они заменяют собой функции оригинальной библиотеки. Конечно, данный механизм не работает для suid программ, иначе это было бы нарушением безопасности.&lt;br /&gt;&lt;br /&gt;Но как вызвать оригинальную функцию glibc из подмененной? Код fakeroot показывает нам это:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void *get_libc(){&lt;br /&gt;#ifndef RTLD_NEXT &lt;br /&gt; void *lib=0;&lt;br /&gt; if(!lib){.&lt;br /&gt;   lib= dlopen(LIBCPATH,RTLD_LAZY);&lt;br /&gt; }&lt;br /&gt; if (NULL==lib) {&lt;br /&gt;   fprintf(stderr, "Couldn't find libc at: %s\n", LIBCPATH);&lt;br /&gt;   abort();&lt;br /&gt; }&lt;br /&gt; return lib;&lt;br /&gt;#else &lt;br /&gt;  return RTLD_NEXT;&lt;br /&gt;#endif &lt;br /&gt;}&lt;br /&gt;/* .... */&lt;br /&gt;*(next_wrap[i].doit)=dlsym(get_libc(), next_wrap[i].name);&lt;br /&gt;/* ... */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как видим, для получения символа из glibc мы либо непосредственно берем адрес модуля с помощью dlopen, или с помощью макроса RTLD_NEXT (если он доступен) берем адрес следующего модуля, и после этого берем адрес требуемой функции через dlsym. Затем можно вызвать функцию по указателю. &lt;br /&gt;&lt;br /&gt;Макрос RTLD_NEXT определен в &lt;dlfcn.h&gt; только если при сборке определен флаг _GNU_SOURCE. В качестве примера напишем перехват функции fopen.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#define _GNU_SOURCE&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;dlfcn.h&amp;gt; &lt;br /&gt;FILE *fopen(const char *path, const char *mode)&lt;br /&gt;{&lt;br /&gt;    FILE *(*real_fopen)(const char *, const char *);&lt;br /&gt;    real_fopen = dlsym(RTLD_NEXT, "fopen");&lt;br /&gt;    fprintf(stderr,"fopen: %s %s\n", path, mode);&lt;br /&gt;    return real_fopen(path, mode);&lt;br /&gt;}&lt;br /&gt;peter@crashed:/tmp$ gcc -shared hack.c -o hack.so -ldl -lc&lt;br /&gt;peter@crashed:/tmp$ LD_PRELOAD=./hack.so gcc hack.c&lt;br /&gt;fopen: /tmp/ccKDaDBH.s w+b&lt;br /&gt;fopen: hack.gcda r+b&lt;br /&gt;fopen: /tmp/ccKDaDBH.s r&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Но вернемся к fakeroot. Попробуем выполнить следующие действия:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ fakeroot&lt;br /&gt;root@crashed:/tmp# mknod hda b 3 0&lt;br /&gt;root@crashed:/tmp# ls -la hda&lt;br /&gt;brw-r--r-- 1 root root 3, 0 Ноя  9 16:07 hda&lt;br /&gt;root@crashed:/tmp# chown peter hda&lt;br /&gt;root@crashed:/tmp# ls -la hda&lt;br /&gt;brw-r--r-- 1 peter root 3, 0 Ноя  9 16:07 hda&lt;br /&gt;root@crashed:/tmp# exit&lt;br /&gt;exit&lt;br /&gt;peter@crashed:/tmp$ ls -la hda&lt;br /&gt;-rw-r--r-- 1 peter peter 0 Ноя  9 16:07 hda&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Оказывается, не все так просто! fakeroot делает видимость выполнения запрещенных файловых операций практически не отличимой от роли настоящего root! Невозможно добиться такого эффекта только за счет подмены вызовов glibc, ведь библиотека инициализируется каждый раз во время загрузки очередной программы, а fakeroot каким-то образом "помнит" проделанные операции в пределах своей сессии... &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ fakeroot&lt;br /&gt;root@crashed:/tmp# ps ax | grep fake&lt;br /&gt; 3429 pts/0    S      0:00 /bin/sh /usr/bin/fakeroot&lt;br /&gt; 3437 ?        Ss     0:00 /usr/bin/faked-sysv&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итак, fakeroot это не только библиотека, но и демон, поддерживающий хэш-таблицы выполненных файловых операций. Такой подход позволяет практически полностью виртуализировать файловые операции и решить довольно-таки утилитарную задачу Debian...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6600873863965429165?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6600873863965429165/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6600873863965429165' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6600873863965429165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6600873863965429165'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/11/glibc-fakeroot.html' title='Перехват функций glibc на примере fakeroot'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-2535687295244536667</id><published>2008-11-05T13:07:00.003+03:00</published><updated>2008-11-05T13:18:13.514+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='о жизни'/><title type='text'>О жизни</title><content type='html'>Сегодня выписался из больницы. Аппендицит. Сейчас отчетливо чувствую мысль: какой же все-таки фигней я занимаюсь....&lt;br /&gt;&lt;br /&gt;В больнице замирает время, почти как в Церкви... Больница -- это организм. В больнице любые люди становятся ближе. В больнице все выглядит по иному. В больнице чувствуешь жизнь. В больнице ты любишь дом. Домой. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-2535687295244536667?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/2535687295244536667/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=2535687295244536667' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2535687295244536667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2535687295244536667'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/11/blog-post.html' title='О жизни'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-5566363231085963107</id><published>2008-10-23T12:36:00.009+04:00</published><updated>2008-10-25T17:31:22.877+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Маленькие полезности (.inputrc, .vimrc, grep, wget ....)</title><content type='html'>У каждого пользователя Linux со временем накапливаются решения/настройки/способы работы с системой, которые можно отнести к категории "маленькие полезности".&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;b&gt;Файл .inputrc&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set input-meta on&lt;br /&gt;set output-meta on&lt;br /&gt;set convert-meta off&lt;br /&gt;set completion-ignore-case on&lt;br /&gt;set completion-query-items 100&lt;br /&gt;set show-all-if-ambiguous on&lt;br /&gt;set bell-style none&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В программах использующих readline (bash...) автодополнение файлов не учитывает регистр, не пищит и не требует повторного нажатия &lt;tab&gt; если встречается несколько вариантов. Мелочь, а приятно... Также к полезности можно отнести биндинги readline (man readline). Например, гораздо быстрее использовать ctrl-a/ctrl-e для перехода в начало/конец строки и даже ctrl-h для удаления символа, чем привычные, но далеко расположенные home/end/backspace,&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Файл .bashrc&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;alias grep='grep --color=auto'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Цветной grep.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Файл .vimrc&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:syntax on&lt;br /&gt;:colorscheme elflord&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Подсветка синтаксиса.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;" Set spelling language.  &lt;br /&gt;set spelllang=ru &lt;br /&gt;" Toggle spell checking for the current buffer with Ctrl-i &lt;br /&gt;map &lt;silent&gt; &amp;lt;F7&amp;gt; :setlocal invspell&amp;lt;CR&amp;gt; &lt;br /&gt;imap &lt;silent&gt; &amp;lt;F7&amp;gt; &amp;lt;C-o&amp;gt;:setlocal invspell&amp;lt;CR&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Проверка орфографии по F7 (vim &gt;=7.0). При этом словарь может быть скачан из сети автоматически. Правда для этого надо выполнить первое включение орфографии от root, чтобы у vim'а было достаточно прав для записи словаря в систему.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set mouse=a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Задействовать мышку в vim.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:au BufReadPost * if line("'\"") &gt; 1 &amp;&amp; line("'\"") &lt;= line("$") | exe "normal! g'\"" | endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Автоматический переход к последней запомненной позиции в редактируемом файле.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set keymap=russian-jcuken&lt;br /&gt;set iminsert=0&lt;br /&gt;set imsearch=0&lt;br /&gt;" Toggle layout for the current buffer&lt;br /&gt;function ToggleRu()&lt;br /&gt;    if &amp;iminsert == 0&lt;br /&gt;        set iminsert=1&lt;br /&gt;    else&lt;br /&gt;        set iminsert=0&lt;br /&gt;    endif&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;map &lt;silent&gt; &amp;lt;M-space&amp;gt; :call ToggleRu()&amp;lt;CR&amp;gt;&lt;br /&gt;imap &lt;silent&gt; &amp;lt;M-space&amp;gt; &amp;lt;C-o&amp;gt;:call ToggleRu()&amp;lt;CR&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Переключение раскладки по alt-space с помощью keymap. При этом независимо от раскладки в Vim работают все команды!!! &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Файл /etc/x11/xorg.conf&lt;/b&gt;&lt;br /&gt;Секция InputDevice для клавиатуры:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    Option         "XkbLayout" "us,ru"&lt;br /&gt;    Option         "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Переключалка на русскую раскладку по ctrl+shift, индиктор -- лампочка scroll lock'a.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Аварийный интернет. Автоматическая авторизация в сети goldenwifi или неожиданные возможности wget&lt;/b&gt;&lt;br /&gt;Если в организации по какому-нибудь недорозумению нет интернета, нас почти наверняка спасет goldenwifi. Ставим squid, оплачиваем карточку и вперед... Одна загвоздка -- веб авторизация которая напрягает... Ниже приводится bash скрипт, который демонстрирует возможности wget в этом направлении... ;)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;LOG=/var/log/wifi.log&lt;br /&gt;ADDR=start.goldenwifi.ru&lt;br /&gt;INETADDR=www.ru&lt;br /&gt;&lt;br /&gt;function login_gwifi()&lt;br /&gt;{&lt;br /&gt;        /usr/bin/wget --save-cookies /tmp/cookies.txt \&lt;br /&gt;--post-data 'lang=ru&amp;screen=normal&amp;url=http%3A%2F%2Fwww.yandex.ru%2F&amp;mode=normal&amp;p1uname=USERNAME&amp;p2uname=goldenwifi.ru&amp;password=PASSWORD&amp;is_limits_checkbox=1&amp;show_limits=1' \&lt;br /&gt;https://start.goldenwifi.ru:2443/cgi-bin/status.cgi -q -O /dev/null&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function check_loop()&lt;br /&gt;{&lt;br /&gt;        while /bin/ping -A -c 10 -W6 $ADDR &gt;/dev/null 2&gt;&amp;1; do&lt;br /&gt;                if ! /bin/ping -c 10 -W6 $INETADDR &gt;/dev/null 2&gt;&amp;1; then&lt;br /&gt;                        echo `/bin/date`" - trying login..." &gt;&gt; $LOG&lt;br /&gt;                        login_gwifi&lt;br /&gt;                fi&lt;br /&gt;                sleep 60&lt;br /&gt;        done&lt;br /&gt;        echo `/bin/date`" - no inet found..." &gt;&gt; $LOG&lt;br /&gt;        return 1&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function daemon()&lt;br /&gt;{&lt;br /&gt;        echo `/bin/date`" - wifi daemon running..." &gt;&gt; $LOG&lt;br /&gt;        while [ 1 ]; do&lt;br /&gt;                check_loop&lt;br /&gt;                while ! /usr/local/bin/wifiup &gt;&gt; $LOG 2&gt;&amp;1; do&lt;br /&gt;                        sleep 10&lt;br /&gt;                done&lt;br /&gt;        done&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;daemon&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-5566363231085963107?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/5566363231085963107/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=5566363231085963107' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5566363231085963107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/5566363231085963107'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/inputrc-vimrc-grep-wget.html' title='Маленькие полезности (.inputrc, .vimrc, grep, wget ....)'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-1871761145392042358</id><published>2008-10-11T18:48:00.003+04:00</published><updated>2008-10-11T19:29:58.954+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Что такое /dev/shm?</title><content type='html'>Если в своей Linux системе вы посмотрите на вывод команды mount, то в одной из строк скорее всего вы увидите что-то вроде:&lt;br /&gt;&lt;pre&gt;tmpfs on /dev/shm type tmpfs (rw)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Многие знают, что такое tmpfs, и даже используют эту файловую систему размещающую данные в памяти (например, монтируя ее в /tmp), но наверняка не многие знают зачем она смонтирована именно в /dev/shm? Что за странное место для временного хранилища?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Название /dev/shm наводит на мысль о механизме межпроцессного взаимодействия IPC shared memory. Но нетрудно убедиться, что для привычного System V IPC эта файловая система не требуется. Вызов shmget, например,  не обращается к файловой системе, пространство имен поддерживается ядром. Так зачем /dev/shm? Оказывается, в glibc, кроме System V shared memory IPC есть реализация POSIX IPC. И вот эта реализация и использует /dev/shm. Убеждаемся в этом:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;peter@crashed:/tmp$ vim test.c&lt;br /&gt;&lt;br /&gt;#include &lt;sys/mman.h&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;        shm_open("xxx", 0, 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;peter@crashed:/tmp$ gcc test.c -lrt&lt;br /&gt;peter@crashed:/tmp$ strace -e open ./a.out &lt;br /&gt;...&lt;br /&gt;open("/dev/shm/xxx", O_RDONLY|O_NOFOLLOW|O_CLOEXEC) = -1 ENOENT (No such file or directory)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-1871761145392042358?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/1871761145392042358/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=1871761145392042358' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1871761145392042358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/1871761145392042358'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/devshm.html' title='Что такое /dev/shm?'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-2777179700075084796</id><published>2008-10-08T08:59:00.013+04:00</published><updated>2008-10-09T18:42:13.400+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='настройка'/><title type='text'>Быстрая настройка mutt, fetchmail, procmail, spamassassin и exim4 с несколькими smarthost в Debian lenny или "Just For Fun"</title><content type='html'>Только вчера настроил эту связку. Зачем? На моем убитом ноуте icedove работает довольно нешустро. Кроме того, я использую &lt;a href="http://en.wikipedia.org/wiki/Dwm"&gt;dwm&lt;/a&gt;, а в нем удобно пользоваться программами, не требующими для своей работы мыши. В общем, некоторым людям это нравится. Не факт, кстати, что приведенная ниже схема оптимальна, но -- it works. Итак -- поехали.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;b&gt;Ставим exim4&lt;/b&gt;&lt;br /&gt;dpkg-reconfigure exim4-config&lt;br /&gt;Отвечаем на вопросы следующим образом:&lt;br /&gt;1) Второй пункт (отправка через smarthost, прием по smtp или fetchmail);&lt;br /&gt;2) localhost (имя системы);&lt;br /&gt;3) 127.0.0.1 (слушать соединения на:);&lt;br /&gt;4) пусто (другие места назначения);&lt;br /&gt;5) пусто (IP адреса для которых разрешена релейная передача почты);&lt;br /&gt;6) smtp.mail.ru::587 (или другой основной для вас smtp сервер);&lt;br /&gt;7) нет (не скрывать имя в исходящей почте);&lt;br /&gt;8) нет (минимум dns запросов?);&lt;br /&gt;9) Maildir в домашнем каталоге;&lt;br /&gt;10) да - разделить на конфигурационные файлы;&lt;br /&gt;&lt;br /&gt;В результате, содержимое файла /etc/exim4/update-exim4.conf.conf выглядит примерно так:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;dc_eximconfig_configtype='smarthost'&lt;br /&gt;dc_other_hostnames=''&lt;br /&gt;dc_local_interfaces='127.0.0.1'&lt;br /&gt;dc_readhost=''&lt;br /&gt;dc_relay_domains=''&lt;br /&gt;dc_minimaldns='false'&lt;br /&gt;dc_relay_nets=''&lt;br /&gt;dc_smarthost='smtp.mail.ru::587'&lt;br /&gt;CFILEMODE='644'&lt;br /&gt;dc_use_split_config='true'&lt;br /&gt;dc_hide_mailname='false'&lt;br /&gt;dc_mailname_in_oh='true'&lt;br /&gt;dc_localdelivery='maildir_home'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь создаем файл /etc/exim4/passwd.client с правами -rw-r----, root:Debian-exim.&lt;br /&gt;В этот файл будут добавляться логины и пароли для smtp серверов. В случае с gmail.com в файл придется также добавить некоторые имена, которые не очевидны вначале, но информация о требуемой аутентификации к которым все-равно появилась бы у вас в /var/log/exim4/mainlog, так что делаем заранее, если пользуетесь gmail. Пример файла:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;gmail-smtp-msa.l.google.com:login@gmail.com:password&lt;br /&gt;gmail-smtp.l.google.com:login@gmail.com:password&lt;br /&gt;*.google.com:login@gmail.com:password&lt;br /&gt;smtp.gmail.com:login@gmail.com:password&lt;br /&gt;smtp.mail.ru:login2:password2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь у нас exim4 отправляет почту через один заданный smarthost, который вы выбрали при конфигурации exim4 вначале. Наша задача -- в зависимости от того, с какого адреса исходит почта -- выбирать нужный нам smarthost, например mail.ru или gmail.com (пароли к которым мы и прописали). Админ я посредственный, а про exim вообще ничего не знаю, поэтому содрал схему настройки &lt;a href="http://www.futureware.biz/mantisdemo/view.php?id=4329"&gt;отсюда&lt;/a&gt;.&lt;br /&gt;В файл /etc/exim4/conf.d/router/200_exim4-config_primary перед smarthost: дописываете следующую конструкцию (я думаю вы можете создать файл 199_exim4-config_auto_smarthost с этим содержимым, но для простоты будем идти по проверенной дороге :)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;smarthost_auto:&lt;br /&gt;  condition = ${extract{smart_host}{${lookup{$sender_address}lsearch{/etc/exim4/smtp_users}{$value}fail}}}&lt;br /&gt;  driver = manualroute&lt;br /&gt;  domains = ! +local_domains&lt;br /&gt;  route_list = "* ${extract{smart_host}{${lookup{$sender_address}lsearch{/etc/exim4/smtp_users}{$value}fail}}} byname"&lt;br /&gt;  transport = remote_smtp_smarthost&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Хорошо, теперь создаем файл /etc/exim4/smtp_users с правами -rw-r---- root, Debian-exim.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;login2@mail.ru:   user=peter   smart_host=smtp.mail.ru   auth_name=login2   auth_pass=password2&lt;br /&gt;login@gmail.com:    user=peter   smart_host=smtp.gmail.com   auth_name=login@gmail.com   auth_pass=password2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим, две схемы немного секутся и в целом получилось коряво (пароли в двух местах), но в файле passwd.client у меня хранятся пароли &lt;i&gt;только&lt;/i&gt; для gmail, так что оставил пока так.&lt;br /&gt;&lt;br /&gt;Все -- теперь exim настроен. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ставим fetchmail&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Тут все просто -- fetchmail забирает нашу почту. Пример конфига .fetchmailrc:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;poll pop.mail.ru proto pop3&lt;br /&gt;        user "login2" there is "peter" here has password "password2"&lt;br /&gt;poll pop.gmail.com proto pop3&lt;br /&gt;        user "login@gmail.com" there is "peter" here has password "password" ssl&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Права на файл: -rw-------. Можете повесить fetchmail на cron, я его запускаю в режиме демона: fetchmail -d60. Теперь вы можете проверить хождение почты от pop сервера в ваш каталог ~/Maildir. Осталась последняя миля. ;)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mutt -- дело мутное(c)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ставим mutt. Из каталога /usr/share/doc/mutt/examples берем sample.muttrc.gz и распаковываем его как ~/.muttrc. Меняем/добавляем следующие строки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set folder=~/Mail               # where i keep my mailboxes&lt;br /&gt;set spoolfile=~/Maildir&lt;br /&gt;mailboxes =inbox&lt;br /&gt;mailboxes =sent&lt;br /&gt;set mbox=+inbox&lt;br /&gt;set mbox_type="Maildir"&lt;br /&gt;set assumed_charset="koi8-r:cp1251:utf-8"&lt;br /&gt;set send_charset="koi8-r"&lt;br /&gt;set editor=vim #ваш любимый редактор&lt;br /&gt;set from="login2@mail.ru" # ваше from по-умолчанию&lt;br /&gt;set use_from=yes&lt;br /&gt;set envelope_from=yes&lt;br /&gt;set alias_file=~/.mail_aliases # where I keep my aliases&lt;br /&gt;set allow_8bit=yes # never do Q-P encoding on legal 8-bit chars&lt;br /&gt;set ascii_chars=yes&lt;br /&gt;set record=+sent                # default location to save outgoing mail&lt;br /&gt;set copy=yes                    # always save a copy of outgoing messages&lt;br /&gt;set delete=yes     &lt;br /&gt;set move=no&lt;br /&gt;set edit_headers&lt;br /&gt;alternative_order text/enriched text/plain text/html.&lt;br /&gt;set thorough_search=yes # поиск в теле письма если кодировка письма и системы не совпадают&lt;br /&gt;set auto_tag&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для данной конфигурации (spool и есть mbox) необходимо сделать символьную ссылку inbox: cd ~/Mail; ln -s ../Maildir inbox. Теперь у вас в каталоге ~Mail будут следующие ящики: inbox (входящая почта -- как ссылка на Maildir), sent -- посланные письма. Другая конфигурация -- это когда письма из спула (Maildir) перемещаются в ящик прочитанных писем (mbox). Для этой схемы необходимо удалить ссылку, и переопределить set move=yes. Все -- дальше если вы войдете во вкус, сами расширите свой конфигурационный файл, разобъете его на несколько частей, добавите ящики, настроите сортировку писем и т.д. и т.п. Главное, что теперь можно попробовать послать письмо и проследить его путь. :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Быстрый старт&lt;/b&gt;&lt;br /&gt;m -- написать сообщение;&lt;br /&gt;c -- выбрать ящик (например, sent);&lt;br /&gt;d -- удалить;&lt;br /&gt;s -- переместить в другой ящик;&lt;br /&gt;g -- ответить всем;&lt;br /&gt;r -- ответить;&lt;br /&gt;t -- пометить сообщение;&lt;br /&gt;q -- выйти;&lt;br /&gt;вверх/вниз -- ходим по письмам;&lt;br /&gt;пробел/ "-" -- смотрим длинное письмо вперед/назад;&lt;br /&gt;q -- выход;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;procmail&lt;/b&gt;&lt;br /&gt;Теперь предположим, вы подписаны на списки рассылки и хотите, чтобы каждая рассылка хранилась в своем ящике. Нет ничего проще! ;) Ставим procmail. Создаем файл ~/.procmailrc (по мотивам &lt;a href="http://linux.ucla.edu/guides/mailguide.php3"&gt;&lt;b&gt;этой&lt;/b&gt;&lt;/a&gt; статьи).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;LINEBUF=4096&lt;br /&gt;VERBOSE=off&lt;br /&gt;MAILDIR=$HOME/Mail&lt;br /&gt;DEFAULT=$HOME/Mail/inbox/&lt;br /&gt;FORMAIL=/usr/bin/formail&lt;br /&gt;SENDMAIL=/usr/sbin/sendmail&lt;br /&gt;PMDIR=$HOME/.procmail&lt;br /&gt;LOGFILE=$PMDIR/log&lt;br /&gt;INCLUDERC=$PMDIR/rc.maillists&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Создаем каталог .procmail. В нем файл -- rc.maillists. Например:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:0:&lt;br /&gt;* ^TOdwm@suckless.org&lt;br /&gt;dwm/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Создаем каталог: mkdir ~/Mail/dwm и письма рассыли dwm сыпятся в dwm. Если что-то не так, смотрим log в .procmail.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;spamassassin -- боремся со спамом!&lt;/b&gt;&lt;br /&gt;В каталоге ~/.procmail/ создаем файл rc.spam.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;:0fw&lt;br /&gt;#* &lt; 256000&lt;br /&gt;| spamassassin&lt;br /&gt;&lt;br /&gt;:0&lt;br /&gt;* ^X-Spam-Status: Yes&lt;br /&gt;junk/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В .procmailrc дописываем строчку:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;INCLUDERC=$PMDIR/rc.spam&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Создаем каталог со спамом: mkdir ~/Mail/junk. В .muttrc дописываем следующие строки:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;macro index S "|/usr/bin/spamassassin -r"&lt;br /&gt;macro index H "|/usr/bin/sa-learn --ham  --no-sync --single"&lt;br /&gt;macro index R "!/usr/bin/sa-learn --sync"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;На сообщениях, для которых spamassassin дал ошибку, в mutt будем нажимать H. На тех, которые пропустил: S. После первого же письма в домашнем каталоге будет создан каталог .spamassassin. В нем будет лежать файл user_prefs, который при необходимости можно посмотреть и отредактировать. &lt;br /&gt;&lt;br /&gt;Ну и для полного счастья можно поставить rss2email и настроить чтение RSS-новостей через mutt. &lt;br /&gt;&lt;br /&gt;P.S. А вообще-то, весь этот процесс, который мы наблюдаем выше, можно объяснить проще -- это игра. Just For Fun(с) как говорится. И без всяких 3D аккселераторов... ;) Иначе имеем подмену цели на средство к ее достижению - а это уже клиника... В общем, я предупредил... :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-2777179700075084796?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/2777179700075084796/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=2777179700075084796' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2777179700075084796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/2777179700075084796'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/mutt-fetchmail-exim4-smarthost-debian.html' title='Быстрая настройка mutt, fetchmail, procmail, spamassassin и exim4 с несколькими smarthost в Debian lenny или &quot;Just For Fun&quot;'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-3229955649659912541</id><published>2008-10-06T14:17:00.005+04:00</published><updated>2008-10-08T08:59:37.308+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='другое'/><title type='text'>Слон, которого проглотила змея</title><content type='html'>&lt;pre&gt;&lt;br /&gt;peter@crashed:~$ aptitude moo&lt;br /&gt;В этой программе нет пасхальных яиц.&lt;br /&gt;peter@crashed:~$ aptitude -v moo&lt;br /&gt;В этой программе на самом деле нет пасхальных яиц.&lt;br /&gt;peter@crashed:~$ aptitude -v -v moo&lt;br /&gt;Разве не было сказано, что в этой программе нет пасхальных яиц?&lt;br /&gt;peter@crashed:~$ aptitude -v -v -v moo&lt;br /&gt;Прекратите!&lt;br /&gt;peter@crashed:~$ aptitude -v -v -v -v moo&lt;br /&gt;Хорошо, хорошо, если я дам вам пасхальное яйцо, вы уйдёте?&lt;br /&gt;peter@crashed:~$ aptitude -v -v -v -v -v moo&lt;br /&gt;Всё, вы победили.&lt;br /&gt;&lt;br /&gt;                               /----\&lt;br /&gt;                       -------/      \&lt;br /&gt;                      /               \&lt;br /&gt;                     /                |&lt;br /&gt;   -----------------/                  --------\&lt;br /&gt;   ----------------------------------------------&lt;br /&gt;peter@crashed:~$ aptitude -v -v -v -v -v -v moo&lt;br /&gt;Что это? Это слон, которого проглотила змея, конечно.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;crashed:/home/peter# apt-get moo&lt;br /&gt;         (__) &lt;br /&gt;         (oo) &lt;br /&gt;   /------\/ &lt;br /&gt;  / |    ||   &lt;br /&gt; *  /\---/\ &lt;br /&gt;    ~~   ~~   &lt;br /&gt;...."Have you mooed today?"...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Взято &lt;a href="http://www.linuxhaxor.net/2007/09/12/five-easter-eggs-for-linux/"&gt;&lt;b&gt;отсюда&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-3229955649659912541?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/3229955649659912541/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=3229955649659912541' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3229955649659912541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/3229955649659912541'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/blog-post_06.html' title='Слон, которого проглотила змея'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-6313885266132730941</id><published>2008-10-04T14:15:00.007+04:00</published><updated>2008-11-09T21:13:40.467+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Трюки в коде ядра Linux.</title><content type='html'>В коде ядра встречаются конструкции, которые можно назвать трюками программирования. Многие из них оказываются полезными, чтобы их запомнить и использовать.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Двойное отрицание&lt;/b&gt;&lt;br /&gt;Иногда можно встретить двойное логическое отрицание. Например:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#define likely(x)        __builtin_expect(!!(x), 1)&lt;/pre&gt;&lt;br /&gt;На самом деле, тут мы еще видим реализацию одного из способов оптимизации, но об этом в другой раз. Пример содержит двойное отрицание. Зачем?&lt;br /&gt;&lt;br /&gt;Если x является логическим выражением, то двойное отрицание не нужно, но что будет если в коде мы напишем что-то вроде:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;int counter=0x100;&lt;br /&gt;/* ... */&lt;br /&gt;if (likely(counter))&lt;/pre&gt;&lt;br /&gt;И тут становится понятно, что двойное отрицание выражения всегда дает булевую величину (0 или 1). Его можно назвать приведением к булевому типу, что довольно непривычно звучит в C. &lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Выравнивание&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;/* align addr on a size boundary - adjust address up/down if needed */&lt;br /&gt;#define _ALIGN_UP(addr,size)    (((addr)+((size)-1))&amp;(~((size)-1)))&lt;br /&gt;#define _ALIGN_DOWN(addr,size)  ((addr)&amp;(~((size)-1)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ну, тут все понятно.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Комментарии с помощью препроцессора&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;#if 0&lt;br /&gt;                        /* XXX: let's do this when we verify it is OK */&lt;br /&gt;                        if (ret &amp; VM_FAULT_OOM)&lt;br /&gt;                                ret = -ENOMEM;&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим, удобно для быстрого отключения/включения кода, особенно если внутри уже есть комментарии /* ... */.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Необычное сравнение с константой&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        if (NULL == siocb-&gt;scm)&lt;br /&gt;                siocb-&gt;scm = &amp;tmp_scm;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Помогает избежать ошибок, когда вместо сравнения (==) по ошибке ставится знак присваивания (=).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Является ли значение степенью 2?&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bool is_power_of_2(unsigned long n)&lt;br /&gt;{&lt;br /&gt;        return (n != 0 &amp;&amp; ((n &amp; (n - 1)) == 0));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;do { /*...*/ } while(0)&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# define cap_clear(c)         do { (c) = __cap_empty_set; } while (0)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Очень часто используется при определении макросов, широко известный трюк. Теперь раскрытие макроса может использоваться как вызов функции, так как при раскрытии код будет полностью размещен в своем блоке, который выполнится один раз (while(0)). Внутри блока можно определять переменные. Например:&lt;br /&gt;&lt;pre&gt;#ifndef swap&lt;br /&gt;#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0)&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Использование goto&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Можно долго говорить, что использование goto в C это плохо, но никакое правило не может быть универсальным. Иначе -- фарисейство или фанатизм... ;)&lt;br /&gt;&lt;pre&gt;grep "goto" -R * | wc -l&lt;/pre&gt; в дереве исходников ядра дает результат больший чем 50 тысяч.&lt;br /&gt;&lt;br /&gt;В большинстве случаев это попытка избежать большей вложенности кода при отработке ошибочных систуаций и освобождении ресурсов. Например:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;static long do_sys_truncate(const char __user * path, loff_t length)&lt;br /&gt;{&lt;br /&gt;        struct nameidata nd;&lt;br /&gt;        struct inode * inode;&lt;br /&gt;        int error;&lt;br /&gt;&lt;br /&gt;        error = -EINVAL;&lt;br /&gt;        if (length &lt; 0) /* sorry, but loff_t says... */&lt;br /&gt;                goto out;&lt;br /&gt;        /* ... */&lt;br /&gt;        inode = nd.path.dentry-&gt;d_inode;&lt;br /&gt;&lt;br /&gt;        /* For directories it's -EISDIR, for other non-regulars - -EINVAL */&lt;br /&gt;        error = -EISDIR;&lt;br /&gt;        if (S_ISDIR(inode-&gt;i_mode))&lt;br /&gt;                goto dput_and_out;&lt;br /&gt;        /* ... */&lt;br /&gt;        error = vfs_permission(&amp;nd, MAY_WRITE);&lt;br /&gt;        if (error)&lt;br /&gt;                goto mnt_drop_write_and_out;&lt;br /&gt;        /* ... */&lt;br /&gt;put_write_and_out:&lt;br /&gt;        put_write_access(inode);&lt;br /&gt;mnt_drop_write_and_out:&lt;br /&gt;        mnt_drop_write(nd.path.mnt);&lt;br /&gt;dput_and_out:&lt;br /&gt;        path_put(&amp;nd.path);&lt;br /&gt;out:&lt;br /&gt;        return error;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это гораздо проще, чем вложенные друг в друга блоки или излишнее разбиение на функции.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Возвращение кодов ошибок с типом "указатель".&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пример кода:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        char *tmp = getname(filename);&lt;br /&gt;        int fd = PTR_ERR(tmp);&lt;br /&gt;        if (!IS_ERR(tmp)) {&lt;br /&gt;                /* ... */&lt;br /&gt;        }&lt;br /&gt;        return fd;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь видно, что getname возвращает указатель, который тем-не менее, может содержать признак ошибки. Здесь, кстати, нужно быть осторожным! Так как это противоречит практике возвращать признак ошибки как NULL. Нужно всегда четко понимать, что возвращает функция ядра в случае ошибки: NULL или PTR_ERR. Например, если написать следующий код:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        char *tmp = getname(filename);&lt;br /&gt;        if (!tmp)&lt;br /&gt;                return NULL;&lt;br /&gt;        /* ... do something .. */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это уже уязвимость, хотя выглядит прилично. Если не знать что возвращает getname...&lt;br /&gt;&lt;br /&gt;Реализация механизма крайне проста, и сама по-себе тянет на трюк.&lt;br /&gt;&lt;pre&gt;#define MAX_ERRNO       4095&lt;br /&gt;#define IS_ERR_VALUE(x) unlikely((x) &gt;= (unsigned long)-MAX_ERRNO)&lt;br /&gt;&lt;br /&gt;static inline long IS_ERR(const void *ptr)&lt;br /&gt;{&lt;br /&gt;        return IS_ERR_VALUE((unsigned long)ptr);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Как видим, указатель содержит отрицательное значение ошибки. Таким образом, выброшенный диапазон адресов приходится на последние 4Kb виртуального адресного пространства, который функция никогда не вернет. Очевидно, что превращение кода ошибки в указатель -- это приведение типа:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static inline void *ERR_PTR(long error)&lt;br /&gt;{&lt;br /&gt;        return (void *) error;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Вообще, все это дело терпимо для кода ядра Linux, но совсем нехорошо заниматься такими трюками в пользовательском (предположительно переносимом) коде, так-как все-таки это предполагает, что приведение long в void* и назад -- обратимы.&lt;br /&gt;&lt;br /&gt;Вот и все на сегодня. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-6313885266132730941?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/6313885266132730941/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=6313885266132730941' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6313885266132730941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/6313885266132730941'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/blog-post.html' title='Трюки в коде ядра Linux.'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-257944958249857950</id><published>2008-10-04T09:26:00.015+04:00</published><updated>2008-10-04T14:52:03.845+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Компиляция выбранного модуля в дереве сборки ядра Linux 2.6.</title><content type='html'>make -c &amp;lt;KERNEL TREE&amp;gt; SUBDIRS=&amp;lt;MODULES RELATIVE PATH&amp;gt; modules&lt;br /&gt;Например. Весь каталог:&lt;br /&gt;&lt;pre&gt;make -C /usr/src/linux-source-2.6.26 SUBDIRS=drivers/macintosh modules&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Выбранный модуль:&lt;br /&gt;&lt;pre&gt;make -C /usr/src/linux-source-2.6.26 SUBDIRS=drivers/macintosh therm_adt746x.ko &lt;br /&gt;&lt;/pre&gt;&lt;span class=fullpost&gt;Минимальный Makefile своего модуля:&lt;br /&gt;&lt;pre&gt;obj-m    := our_module.o&lt;br /&gt;KDIR    := /lib/modules/$(shell uname -r)/build&lt;br /&gt;PWD    := $(shell pwd)&lt;br /&gt;default:&lt;br /&gt; $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-257944958249857950?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/257944958249857950/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=257944958249857950' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/257944958249857950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/257944958249857950'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/linux-26.html' title='Компиляция выбранного модуля в дереве сборки ядра Linux 2.6.'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-7437665506742841402</id><published>2008-10-02T09:53:00.007+04:00</published><updated>2008-10-05T11:16:58.955+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>dd или cat?</title><content type='html'>Привычка использовать команду dd всегда, когда чтение/запись идет с блоковым устройством у линуксоида, как говорится, в крови. Но ведь команда cat в linux тоже позволяет читать/писать двоичные данные? Заглянув в код команды cat, мы увидим, что сегодня она уже не такая простая какой была когда-то в первых UNIX.&lt;span class="fullpost"&gt;&lt;br /&gt;Простейший путь:&lt;br /&gt;&lt;pre&gt;      insize = ST_BLKSIZE (stat_buf);&lt;br /&gt;/* ... */&lt;br /&gt;      /* Select which version of `cat' to use.  If any format-oriented&lt;br /&gt;         options were given use `cat'; otherwise use `simple_cat'.  */&lt;br /&gt;/* ... */&lt;br /&gt;          insize = max (insize, outsize);&lt;br /&gt;          inbuf = xmalloc (insize + page_size - 1);&lt;br /&gt;&lt;br /&gt;          ok &amp;= simple_cat (ptr_align (inbuf, page_size), insize);   &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Макрос ST_BLKSIZE довольно наворочен, но в Linux, его значение действительно будет соответствовать размеру блока устройства. Кстати, а &lt;a href="http://minnie.tuhs.org/UnixTree/1972_stuff/s1/frag25.html"&gt;&lt;b&gt;вот как&lt;/b&gt;&lt;/a&gt; выглядела команда cat в 1972 году. Еще интересная штука, это выравнивание буффера на границу страницы. :) В &lt;a href="http://osdir.com/ml/gnu.core-utils.bugs/2004-04/msg00095.html"&gt;&lt;b&gt;этом&lt;/b&gt;&lt;/a&gt; письме говорится зачем это сделано.  &lt;i&gt;"I can't measure any performance improvements on my host, but I suspect that aligning I/O buffers can make a real&lt;br /&gt;difference with some device drivers on some hosts, and it shouldn't hurt on other hosts."&lt;/i&gt; -- вот так то. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Код команда dd почти в 3 раза больше cat. И, в общем, понятно почему. В dd чтение и запись всегда блочные и полностью конфигурируемые. По умолчанию размер блока 512 (что почти всегда плохо). Вывод команды dd также выполняет блочную запись, а не просто вывод данных на stdout (хотя по умолчанию это так). &lt;br /&gt;Посмотрим на рутины чтения данных в cat:&lt;br /&gt;&lt;pre&gt;size_t&lt;br /&gt;safe_rw (int fd, void const *buf, size_t count)&lt;br /&gt;{&lt;br /&gt;/* .... */&lt;br /&gt;  for (;;)&lt;br /&gt;    {&lt;br /&gt;      ssize_t result = rw (fd, buf, count);&lt;br /&gt;&lt;br /&gt;      if (0 &lt;= result)&lt;br /&gt;        return result;&lt;br /&gt;      else if (IS_EINTR (errno))&lt;br /&gt;        continue;&lt;br /&gt;/* ... */ &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* ..simple_cat.. */&lt;br /&gt;for (;;)&lt;br /&gt;    {&lt;br /&gt;      /* Read a block of input.  */&lt;br /&gt;&lt;br /&gt;      n_read = safe_read (input_desc, buf, bufsize);&lt;br /&gt;   /* ... */&lt;br /&gt;      if (n_read == 0)&lt;br /&gt;        return true;&lt;br /&gt;      /* Write this block out.  */&lt;br /&gt;      {&lt;br /&gt;        /* The following is ok, since we know that 0 &lt; n_read.  */&lt;br /&gt;        size_t n = n_read;&lt;br /&gt;        if (full_write (STDOUT_FILENO, buf, n) != n)&lt;br /&gt;          error (EXIT_FAILURE, errno, _("write error"));&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и в dd:&lt;br /&gt;&lt;pre&gt;static ssize_t&lt;br /&gt;iread (int fd, char *buf, size_t size)&lt;br /&gt;{&lt;br /&gt;  for (;;)&lt;br /&gt;    {&lt;br /&gt;      ssize_t nread;&lt;br /&gt;      process_signals ();&lt;br /&gt;      nread = read (fd, buf, size);&lt;br /&gt;      if (! (nread &lt; 0 &amp;&amp; errno == EINTR))&lt;br /&gt;        return nread;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;/* ... dd_copy ... */&lt;br /&gt;      nread = iread (STDIN_FILENO, ibuf, input_blocksize);&lt;br /&gt;&lt;br /&gt;      if (nread == 0)&lt;br /&gt;        break;                  /* EOF.  */&lt;br /&gt;&lt;br /&gt;      if (nread &lt; 0)&lt;br /&gt;        {&lt;br /&gt;          error (0, errno, _("reading %s"), quote (input_file));&lt;br /&gt;          if (conversions_mask &amp; C_NOERROR)&lt;br /&gt;            {&lt;br /&gt;              print_stats ();&lt;br /&gt;              /* Seek past the bad block if possible. */&lt;br /&gt;              if (!advance_input_after_read_error (input_blocksize - partread))&lt;br /&gt;                {&lt;br /&gt;                  exit_status = EXIT_FAILURE;&lt;br /&gt;&lt;br /&gt;                  /* Suppress duplicate diagnostics.  */&lt;br /&gt;                  input_seekable = false;&lt;br /&gt;                  input_seek_errno = ESPIPE;&lt;br /&gt;                }&lt;br /&gt;              if ((conversions_mask &amp; C_SYNC) &amp;&amp; !partread)&lt;br /&gt;                /* Replace the missing input with null bytes and&lt;br /&gt;                   proceed normally.  */&lt;br /&gt;                nread = 0;&lt;br /&gt;              else&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;          else&lt;br /&gt;            {&lt;br /&gt;              /* Write any partial block. */&lt;br /&gt;              exit_status = EXIT_FAILURE;&lt;br /&gt;              break;&lt;br /&gt;            }&lt;br /&gt;/* ... */&lt;br /&gt;     if (n_bytes_read &lt; input_blocksize)&lt;br /&gt;        {&lt;br /&gt;          r_partial++;&lt;br /&gt;          partread = n_bytes_read;&lt;br /&gt;          if (conversions_mask &amp; C_SYNC)&lt;br /&gt;            {&lt;br /&gt;              if (!(conversions_mask &amp; C_NOERROR))&lt;br /&gt;                /* If C_NOERROR, we zeroed the block before reading. */&lt;br /&gt;                memset (ibuf + n_bytes_read,&lt;br /&gt;                        (conversions_mask &amp; (C_BLOCK | C_UNBLOCK)) ? ' ' : '\0',&lt;br /&gt;                        input_blocksize - n_bytes_read);&lt;br /&gt;              n_bytes_read = input_blocksize;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;      else&lt;br /&gt;        {&lt;br /&gt;          r_full++;&lt;br /&gt;          partread = 0;&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И мы видим, что вроде бы все одинаково, но цикл чтения команды cat, это последовательное чтение. А цикл чтения dd это ВСЕГДА поблочное чтение, и если по каким-то причинам, произошло чтение меньшего количества байт, чем в блоке, dd имеет возможность пропустить "плохие" входные данные.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/150697/is-dd-better-than-cat"&gt;&lt;b&gt;Здесь&lt;/b&gt;&lt;/a&gt; один из участников темы высказал следующую мысль. Разделение чтения/записи на блочное и не блочное -- сложилось исторически. На традиционных Unix блоковые диски были доступны и как блоковые и как символьные устройства. dd была нужна для работы с блочным устройством, а cat умела работать только с символьными. Поэтому сегодня, различие между этими командами скорее функциональное, чем архитектурное.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-7437665506742841402?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/7437665506742841402/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=7437665506742841402' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7437665506742841402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/7437665506742841402'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/dd-cat.html' title='dd или cat?'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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-6435848814103979986.post-4320453784208310757</id><published>2008-10-01T11:10:00.011+04:00</published><updated>2008-10-04T15:12:23.765+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='powerpc'/><title type='text'>Debian Linux на PowerBook 12" 1.5Ghz или videoram error</title><content type='html'>Года 4 назад купил я себе Powerbook. Это был последний ноут от Apple на архитектуре PowerPC, чем меня и порадовал. Еще-бы, ведь на него чисто физически невозможно поставить M$ Win! MacOS X мне очень понравился и я даже впоследствии снес с ноута мною же установленный linux. Но о MacOS X как-нибудь в другой раз.&lt;br /&gt;&lt;br /&gt;Была у ноута неприятная особенность -- очень сильно он грелся. Ну то есть вроде бы и должен был греться алюминевый корпус, но когда я смотрел на температуру видеокарты при какой-нибудь мало-мальской нагрузке -- сердце мое екало.&lt;br /&gt;&lt;br /&gt;И вот, в один кошмарный день случился кернел паник и при загрузке системы я увидел "снежок" на экране... Не знаю почему -- но я ухватился за мысль об умирающем винчестере (тем более что действительно имелись с ним проблемы в виде бэд блоков) и решил разобрать свой ноут сам... Даааа -- историю о 60 винтиках, трех сломанных отвертках и 30 ватном паяльнике переносим на другой раз... Винчестер я все-таки поменял,переустановил ОС и начал снова радоваться жизни... До следующего снежка... Теперь при перезагрузке с экраном творилось нечто страшное -- вертикальные полоски, рябь и зависание. Тут-то я и догадался потестить видюху -- ну и конечно получил сквозь рябые полоски сообщение: videoram error.&lt;br /&gt;&lt;br /&gt;А надо сказать, что этот ноут на данный момент моя единственная домашняя машина. Вот тут-то я и вспомнил о Linux. Дело в том, что в Single mode MacOS X грузился -- проблемы начинались только при запуске Aqua. И я подумал, что может быть Linux (не зная об 3d аккселерации -- видео от NVidia а архитектура PPC -- драйверов с 3Д нет физически) позволит мне протянуть время до покупки новой машины. И вот здесь начинается самое интересное. &lt;span class="fullpost"&gt;Лихорадочно разбрасывая завалы пыльных дисков в шкафу я нащупал его -- сетевой диск для установки Debian!!! И понеслось...&lt;br /&gt;&lt;br /&gt;Первое и самое главное -- оборудование работает все. Ну то есть, кроме модема -- так как не пробовал. Второе -- работает даже мультитач, то есть, если кто не знает, в MacOS X есть такая приятная особенность -- скроллинг двумя пальцами по точпаду -- очень удобно -- так вот, и это тоже настраивается. Третье -- на убитой видюхе работают X11 (без акселерации правда). Работает hibernate to disk (но не в ram). Работают кнопки Fn. И даже температурный контроль. А теперь обо всем этом без лирики.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Убитая видеокарта&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Параметр к ядру (yaboot.conf):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; append="quiet video=nvidiafb:noaccel"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Параметры в Xorg.conf&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Section "Device"&lt;br /&gt; Option     "SWcursor" "True"&lt;br /&gt; Option     "NoAccel" "False"&lt;br /&gt; Option     "ShadowFB"  "True"&lt;br /&gt; Option     "FlatPanel" "True"&lt;br /&gt; Option     "DualHead" "False"&lt;br /&gt; Identifier  "Card0"&lt;br /&gt; Driver      "nv"&lt;br /&gt; VendorName  "nVidia Corporation"&lt;br /&gt; BoardName   "NV34M [GeForce FX Go5200]"&lt;br /&gt; BusID       "PCI:0:16:0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Мультитач&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;  Identifier  "Mouse0"&lt;br /&gt;  Option      "Device" "/dev/input/mice"&lt;br /&gt;  Driver          "synaptics"&lt;br /&gt;  Option          "SendCoreEvents"        "true"&lt;br /&gt;  Option          "Protocol"              "auto-dev"&lt;br /&gt;  Option          "MinSpeed"              "0.4"&lt;br /&gt;  Option          "MaxSpeed"              "1"&lt;br /&gt;  Option          "AccelFactor"           "0.07"&lt;br /&gt;  Option          "FingerLow"             "3"&lt;br /&gt;  Option          "FingerHigh"            "10"&lt;br /&gt;  Option          "HorizScrollDelta"      "40"&lt;br /&gt;  Option          "VertScrollDelta"       "40"&lt;br /&gt;  Option          "SHMConfig"             "on"&lt;br /&gt;  Option          "RTCornerButton"        "0"&lt;br /&gt;  Option          "LTCornerButton"        "0"&lt;br /&gt;  Option          "MultiFingerButton"     "2"&lt;br /&gt;  Option          "MultiFingerLock"       "1"&lt;br /&gt;  Option          "VertTwoFingerScroll"   "on"&lt;br /&gt;  Option          "HorizTwoFingerScroll"  "on"&lt;br /&gt;  Option          "PalmDetect"            "on"&lt;br /&gt;  Option          "TapButton1"            "0"&lt;br /&gt;  Option          "TapButton2"            "0"&lt;br /&gt;  Option          "TapButton3"            "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чтобы работали опции MultiFingerLock и MultiFingerButton я использовал следующий патч: &lt;a href="http://ubuntu-virginia.ubuntuforums.org/showthread.php?t=626112&amp;amp;page=2"&gt;http://ubuntu-virginia.ubuntuforums.org/showthread.php?t=626112&amp;amp;page=2&lt;/a&gt;. Он позволяет эмулировать клики мыши 2 и 3-й кнопкой на точпаде за счет касания двумя и тремя пальцами и нажатия единственной кнопки точпада Powerbook'а.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hibernate&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Настроить hibernate to ram у меня не получилось, но судя по сообщениям в интеренете оно и не работает на 12" Powerbook. Hibernate to disk получился только с переходом на suspend2 или &lt;a href="http://www.tuxonice.net/"&gt;TuxOnIce&lt;/a&gt; и установкой скриптов hibernate. (apt-get install hibernate). При этом в файле /etc/hibernate/common.conf изменены следующие строки:&lt;br /&gt;&lt;pre&gt;UnloadAllModules yes&lt;br /&gt;LoadModules auto&lt;br /&gt;SwitchToTextMode yes&lt;br /&gt;IncompatiblePrograms xmms audacious mpd&lt;br /&gt;RestartServices alsa-utils powernowd laptop-mode anacron pbbuttonsd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В файле /etc/hibernate/suspend2.conf:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SuspendDevice swap:/dev/hda5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В файле /etc/hibernate/hibernate.conf оставлен только метод suspend2.&lt;br /&gt;Параметры к ядру теперь:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;append="quiet video=nvidiafb:noaccel,1024x768-16@60 resume=swap:/dev/hda5"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чтобы hibernate активировался при закрытии крышки я установил пакет pbbuttonsd и в конфиге /etc/power/pmcs-pbbuttonsd внес правку:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;emergency)&lt;br /&gt;shutdown -h now "Low battery - system will go down now!"&lt;br /&gt;;;&lt;br /&gt;shutdown)&lt;br /&gt;shutdown -h now "User requested shutdown - system will go down now!"&lt;br /&gt;   ;;&lt;br /&gt;suspend)  #HERE IT IS!!!&lt;br /&gt;   hibernate --kill &amp;amp;&lt;br /&gt;   exit 0&lt;br /&gt;   ;;&lt;br /&gt;*)&lt;br /&gt;cd `dirname $0`&lt;br /&gt;PATH=$PATH:$PWD&lt;br /&gt;[ -d ${1}.d ] &amp;amp;&amp;amp; run-parts --arg="$1" --arg="$2" --arg="$3" ${1}.d&lt;br /&gt;run-parts --arg="$1" --arg="$2" --arg="$3" event.d&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;А в /etc/pbbuttonsd.conf заменил suspend-to-ram на suspend-to-disk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Температурный режим&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пока я пересобирал ядро, ноутбук умирал 2 раза -- от перегрева. После второго раза я попробовал cpudyn и powernowd, последний мне понравился больше. Конфиг /etc/default/powernowd:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;OPTIONS="-q -m2 -l40 -u80"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Задает щадящий режим процессора. Кроме того для жетского управления можно менять гувернера:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cpufreq-selector -g powersave&lt;br /&gt;cpufreq-selector -g performance&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;или&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;cpufreq-selector -g userspace -- обратно к управлению от powernowd.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И все-равно мне показалось, что модуль therm_adt746x (на моей машинке он давал доступ к датчикам температур и управлению скоростью вращения вентилятора) плохо управляет вентилятором. Ноутбук по-прежнему перегревался.&lt;br /&gt;Исходный текст драйвера показал его способ управления вентиляторами.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;int var = th-&gt;temps[i] - th-&gt;limits[i];&lt;br /&gt;if (var &gt; -1) {&lt;br /&gt;   int step = (255 - fan_speed) / 7;&lt;br /&gt;   if (abs(var - th-&gt;last_var[fan_number]) &lt; started =" 1;" new_speed =" fan_speed" new_speed =" fan_speed;"&gt; 255)&lt;br /&gt;           new_speed = 255;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;То есть, если совсем грубо -- максимальное вращение вентилятора приходится на гранично-допустимую температуру + 7. Максимальная скорость 255.&lt;br /&gt;Файл /etc/modprobe.d/adt&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;options therm_adt746x limit_adjust=-12 fan_speed=220&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Что соотвествует границе температуры GPU в 56 градусов, при этом скорость вентилятора будет составлять 220 и дайдет 255 при 56 + 7 градусов. Довольно аггресивно, но прохладно. Кроме того я поменял дефултные значения границ с:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static u8 default_limits_local[3] = {70, 50, 70};    /* local, sensor1, sensor2 */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;на&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;static u8 default_limits_local[3] = {70, 55, 70};    /* local, sensor1, sensor2 */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;чтобы после корректировки limit_ajust'ом они составили: (58, 43, 58), а не (58, 38, 58) что уже явно слишком (для CPU).&lt;br /&gt;После этих изменений температурный режим ноутбука при 100% загрузке не приводил к перегреву.&lt;br /&gt;&lt;br /&gt;Обновление: Таки перегрелся. Вентилятора powerbook 12" не хватает, чтобы выдерживать такую низкую температуру. Еще одно решение, оставить автоматический режим работы вентилятора и не делать коррекцию температур. Исходный код therm_adt746x.c.  Закомментировать строки:&lt;br /&gt;&lt;pre&gt;        if (fan_speed == -1)&lt;br /&gt;                fan_speed = 64;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Необходимо убрать параметры fan_speed и limit_ajust из параметров модуля. При этом датчики будут доступны в Linux, но вентилятор останется работать в автоматическом режиме -- похоже этот режим немного умнее той логики, что реализована в драйверве. Максимальная температура в этом режиме составила 63/66C для CPU и GPU соотвественно.&lt;br /&gt;&lt;b&gt;Мелочи&lt;/b&gt;&lt;br /&gt;Файл /etc/rc.local&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;echo "ide-disk" &gt; /sys/class/leds/pmu-front-led/trigger&lt;br /&gt;/sbin/fnset -u&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Лампочка защелки играет роль лампочки активности ide. Функциональные клавиши работают по умолчанию, а клавиши Powerbook'a (яркость, громкость и прочее) совместно с нажатой Fn.&lt;br /&gt;&lt;br /&gt;wifi и bluetooth работают из коробки, только для wifi нужна проприетарная прошивка (о необходимости которой скажет ядро -- см. dmesg при активации интерфейса).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итоги&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Линукс очень хорош в своей гибкости и вывернутости наизнанку. Фактически он спас мне домашний ноут, на котором я и пишу сейчас эту статью... А поставив в качестве оконного менеждера dwm, я понял, что бук мне еще послужит... ;)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6435848814103979986-4320453784208310757?l=syslogblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syslogblog.blogspot.com/feeds/4320453784208310757/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6435848814103979986&amp;postID=4320453784208310757' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4320453784208310757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6435848814103979986/posts/default/4320453784208310757'/><link rel='alternate' type='text/html' href='http://syslogblog.blogspot.com/2008/10/debian-powerbook-12-15ghz-videoram.html' title='Debian Linux на PowerBook 12&quot; 1.5Ghz или videoram error'/><author><name>gl00my</name><uri>http://www.blogger.com/profile/08856410672407087167</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></feed>
