Sunday, July 26, 2009

Unix pipes: наводим красоту

Что такое pipe я думаю знают все пользователи unixlikes.
С помощью утилиты pv (pipe viewer) можно визуализировать поток данных через пайп, а также узнать пропускную способность и ETA.

Используется pv аналогично cat:

pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59

tar -cf - . | pv -s $(du -sb . | awk '{print $1}') | gzip > out.tgz
253MB 0:00:05 [46.7MB/s] [> ] 1% ETA 0:04:49




Saturday, July 25, 2009

Perl: особенности работы с хэшами

Для каждого хэша в скрипте существует единственый итератор, который совместно используется функциями each, keys и values. Он позволяет данным функциям отслеживать, где именно в хэше они находятся. Сброс итератора происходит автоматически, когда весь хэш прочитан или при вызове keys и values.

Типичный пример обхода хэша:
while (my ($key, $value) = each %hash) {
...
}


Если внутри цикла написать keys %hash, то цикл превратится в бесконечный (keys даже в void-контексте сбросит внутренний итератор хэша).

Вместо keys, кстати, можно написать Data::Dumper::Dumper(%hash) - эффект будет тот же. Поэтому, внутри цикла each не стоит вызывать какие-либо функции, которые так или иначе используют данный хэш.

Friday, July 10, 2009

wifi это зло

На работе стала обрываться wi-fi сеть. Железо: D-link DWA-510 на FreeBSD 7.2.
Перепробовал все режимы, каналы и всю прочую хрень из man ifconfig - нифига. Сеть появляется периодами на 5-10 минут и пропадает. Помогло только перетягивание компа на 3 метра по направлению к точке доступа.

Хотя даже на новом месте соотношение сигнал/шум показывает S:N -88:-95, т.е. 7 dB. Я подозреваю, что это далеко не оптимальное значение, но вроде все работает.

UPDATE:  тут приводятся примерные значения по SNR (Signal to Noise Ratio): 
  • > 40dB SNR = Excellent signal (5 bars); always associated; lightning fast.
  • 25dB to 40dB SNR = Very good signal (3 - 4 bars); always associated; very fast.
  • 15dB to 25dB SNR = Low signal (2 bars); always associated; usually fast.
  • 10dB to 15dB SNR = Very low signal (1 bar); mostly associated; mostly slow.
  • 5dB   to 10dB SNR = No signal; not associated; no go.
Если верить этому, мое соединение по-прежнему в красной зоне. Кто пользуется вайфаем - поделитесь своими цифрами (freebsd: ifconfig ral0 list scan, linux: iwconfig).

Wednesday, July 8, 2009

Условное включение элементов в список в Perl

Оригинальный способ включения элементов в список на основе некоторых условий:
my @list = (
($element1) x !!$condition1,
($element2) x !!$condition2,
($element3) x !!$condition3,
);

Очень даже лаконично. Однако надо учитывать, что значение, например, $element1 вычисляется в любом случае (даже если $condition1 дает FALSE).
Еще один зачОтный пример, перекликающийся с первым, - альтернатива тернарному "?:" :
$a = $ok ? $b : $c;
$a = ($c, $b)[!!$ok];

Thursday, July 2, 2009

странности в FreeBSD ports

Решил намедне скачать сырцы mysql6. Как известно, делается это командой make fetch в директории порта:
# cd /usr/ports/databases/mysql60-server && make fetch

В результате вывалилось следующее:
===>  mysql-server-6.0.11 cannot install: MySQL versions mismatch: mysql50-client is installed and wanted version is mysql60-client.
*** Error code 1
Stop in /usr/ports/databases/mysql60-server.

Похоже на баг системы портов.
Если запустить с установленной переменной окружения NO_IGNORE, то работает (в этом конкретном случае):
# NO_IGNORE= make fetch

В некоторых случаях понадобится установить и TRYBROKEN.
А если и это не помогает, придется выколупывать URL из Makefile-а и качать wget-ом.