25 апреля 2008

nxfree && nxclient

Замечательно. При включении USE флага ствится клиент nxclient, который блокирует сервер. Первый раз вижу такой бред:

[0:0]init.d> E -av nxserver-freenx
These are the packages that would be merged, in order:

Calculating dependencies... done!
.....
[ebuild R ] net-misc/nxserver-freenx-0.7.2-r2 USE="arts nxclient* -cups -esd" 0 kB
[ebuild N ] net-misc/nxclient-3.2.0 3,773 kB
[blocks B ] net-misc/nxclient (is blocking net-misc/nxserver-freenx-0.7.2-r2

Что-то не то творится в датском королевстве. Хорошо хоть, на машине, на которой предполагается запускать клиента, стоит убунту.

22 апреля 2008

Udev usb-flash automount

Организовал монтирование флешек с помощью udev + /etc/fstab. Причин для такого подхода несколько:
1. Ужасный экспириенс от демонов автомонтирования в suse (и ещё более ужасный - от mandriva)
2. Любовь к юниксвею и бритве Оккама
3. Особенности опций mount (8)
4. Я отставший от жизни маргинал и не знаю, как это делается в правильных остальных дистрибутивах
Реализуется всё один правилом для udev:


1 kernel=="sd[a-z]", name="%k", symlink+="usb%m", group="users"
2 action=="add", kernel=="sd[a-z][0-9]", symlink+="usb%n", group="users", name="%k"
3 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/mkdir -p /mnt/usb%n"
4 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/sed -i '$a\/dev/%k /mnt/usb%n vfat rw,noauto,noexec,nodev,noatime,users,iocharset=koi8-r,codepage=866,uid=1000,gid=100 0 0' /etc/fstab"
5 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/mount /dev/%k"
6
7 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/umount -l /dev/%k"
8 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/rmdir /mnt/usb%n"
9 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/sed -i '/\/dev\/%k.*/d' /etc/fstab"

идея которого проста - при появлении устройства создавать для него строку в /etc/fstab (потому что только так можно заюзать опцию users, позволяющую омонтировать устройство кому угодно, а не только руту, от имени которого оно будет смонтировано udev'ом) и монтировать, при извлечении - удалять строку.
Юзабельность - отличная. Само монтируется, при наличии нормального DE можно добиться создания ярлычков и открытия окон, легко отмонтируется (из трея например штуками типа kwikdisk).

Пугливый питон

File "/usr/lib/python2.5/encodings/koi8_r.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2013' in position 19: character maps to

Знакомо? А всё потому, что какой-то имбецил решил, будто мне, как пользователю, будет очень приятно, если программа, автор которой не подозревает о существовании кодировок, отличных от utf8, будет валиться из-за того, что стандартный модуль написан по принципу юнит-теста "Fail first".
А вот ежели заменить в этом пресловутом koi8_r.py errors на 'ignore' (то есть независимо от того, как предполагает это делать разработчик, игнорировать все ошибки), то всё работает (грязный хак, ибо накипело). "Выполняется любой ценой", что и есть, мать их, правильное поведение для пользовательского приложения.
Вот представим себе ушастого, вчера оторвавшегося от подола матушки-винды, пользователя. Запускает он программу, а там такое. Плюнул, ушёл. Или полез докапываться до истины, написал разработчику. Тот ни в зуб ногой, типа моя твоя не понимайт. И он таки прав, у него такая ситуация принципиально не возникает, потому что он, например, говорит на iso-8859-1. Плюнул, ушёл.
Ненавижуидиотов.

16 апреля 2008

Про GIMP

Второй раз уже в ридере пробегает новость (вторая - вот эта, первую уже потерял) заставляющая вспомнить байку от sdfgh153:

Жена недавно огорошила. Показывает мне две фотки, и спрашивает - мне пойдёт такая причёска? Присмотрелся - видно, что это оригинал и концепт, но отредактировано чистенько так. Спрашиваю - как сделала? А она мне на иконку GIMP показывает - в этом, мол, нарисовала на мах.

А вы говорите, фотошоп. Отличная тема для спекуляций, но все они сводятся к моей любимой фразе - все зависит от круга задач.

Сайт для расширения сознания

Категорически пропустив торжественный вынос тела (чтобы низко не летало), сообщаю вам пренеприятнейшее известие: запущен defun.ru. Памятуя о том, что даже мимолётный трёп в джаббере с одним из основателей расширил моё сознание настолько, что оно ускорило один из моих прототипов в 3500 раз, - настоятельно рекоммендую.
Расширивать и углубливать!

03 апреля 2008

Я не люблю Google Reader за

Про преимущества гугльридера понаписано немало, про недостатки молчат почему-то. А переодически возникающие раздражения забываются, а осадочек остаётся. Так вот чтобы не забыть и, возможно, как-то побороть, напишу про то, что мне не нравится в Google Reader.
Чертовски медленный. Достаточно быстро он работает только в webkit based браузерах, и, с большой натяжкой, в последних публичных бетах огнелиса(в котором переодически отваливаются кейбиндинги). Это для меня огромный минус, ибо для меня http=opera.
Отсутствуют фильтры. Из-за этого некоторые ленты читать невозможно, ибо информационный overhead, который ничем не отсекается. Сторонние сервисы фильтрации либо убоги, либо не работают с кириллицей. Or both. Довольно странно, с учётом того, что в rss используется utf.
Дубликаты. Есть блоги, есть планеты блогов, есть непустое пересечение блогов и планет. Отписаться от чего-то одного тоже нельзя, ибо перекрываются не всегда полностью. Например, из этого блога только часть постов уходит в планету Runix (посты с тэгом linux). Человек, читающий и планету и меня мои посты с тэгом linux будет видеть дважды. Или даже трижды, с учётом следующего пункта.
Shareflood. Друзья расшаривают посты, которые ты читаешь и сам. Самый яркий пример - bash.org.ru.

02 апреля 2008

Запросы. Хранимые процедуры. Производительность.

Пост сквозь спички в глазах, потому сумбурный.
В ходе эксперимента установил, что запросы (на чистом sql) выполняются немного медленнее, чем хранимые процедуры.
Есть запрос, есть хранимая процедура, которая в цикле возвращает результаты того же запроса построчно (RETURN NEXT). Запрос выполняется за 75-85 мс с вероятностью 75% (приблизительно), процедура - 55-75 мс. К чему бы это?
Ладно, если уж пишется спагетти-код, то на эту мелочь можно и закрыть глаза. Интереснее следующее - первое выполнение запроса занимает около 450 мс, что закономерно, ибо составляется план выполнения запроса. При создании процедуры план (как я понимаю) сохраняется вместе с ней. Вопрос в том, насколько часто при использовании чистого запроса будет составляться его план? Если используется много чистых запросов? Много серверов приложений?