esyr: (Default)
Building
esyr: (Default)
Вот эта девочка зачем-то фотографировала меня в метро. Всё бы ничего, но со вспышкой. На телефон (какую-то нокию N-серии). Сиречь, светодиод этот светил с секунду.

240

May. 3rd, 2010 04:27 am
esyr: (Default)
Read more... )
Read more... )
esyr: (eye 4)
esyr: (Default)
Вот интересно. Какой-то бот составляет структуру ЖЖ по кластерам. ИЧСХ, сюда я почему-то попал, а сюда — почему-то — нет. ЧЯДНТ?
esyr: (Default)
Что-то я подумал, что сайтов с заботливо структурированными учебными материалами куча, а в итоге никто ничего не знает, что где. Раньше был фдс-нет, где те же ссылки были, но теперь его нет. Посему, пусть у меня полежит, коли кто-то на порносайтик да заходит.

Собственно, сабж. Писал по памяти, так что много чего нет (забылось с годами). Если кто ещё что помнит — дополняйте.

Да, ешё практически перед самой смертью на фдс-нете выкладывалась подборка ботвы. Если кому надо, могу её захостить, только дайте, откуда её скачать.
esyr: (Default)
Вероятно, многие знают, что при помощи shell built-in read можно построчно читать всякое; особенно это актуально при считывании списка файлов, которые потенциально могут содержать пробелы (например, в выдаче ls или find) или чего-то подобного. Обычно это делается так:

Построчное чтение из файла:
while read line
do
  # code
done < file

Построчное чтение результата выполнения команды (вариант с перенаправлением):
ls | while read line
do
  # code
done

Вроде бы всё хорошо. Проблемы могут начаться в случае, когда во время чтения нужно изменять значения переменных. А именно, последний (и, кстати, наиболее часто используемый в случае, когда нужно обработать вывод команды, а не читать из файла) вариант приводит к созданию дочернего процесса (pipe же!), что приводит к тому, что все изменения переменных внутри тела цикла выполняются в подпроцессе и, как следствие, на процессе, в котором выполняется скрипт, не попадают. Это можно легко увидеть на следующем примере:
i=0; seq 1 3| while read line; do i=$(( $i + 1 )); done; echo $i
В bash и dash в результате будет выдан 0, в zsh и ksh (которые исполняют последний элемент пайплайна в текущем процессе в случае, если это shell built-in) — 3.
Обойти эту проблему можно несколькими способами. Один из них — использовать heredoc:
while read a b
do
  i=$(( $i + 1 ))
done <<EOF
`seq 1 3 | sed 's/^/1 /'`
EOF
echo $i
При этом, как можно видеть из примера выше, можно использовать произвольный пайплайн.
Очевидный недостаток этого решения — прежде, чем результат выполнения будет передан в цикл, он полностью будет получен. Это можно попытаться обойти, например, путём создания временного FIFO-файла:
fifofile=`mktemp`
rm "$fifofile"
mkfifo "$fifofile"

ls | sed 's/^/1 /' > "$fifofile" & # random command which output we need to parse
while read a b
do
  i=$(( $i + 1 ))
done < "$fifofile"
echo $i

rm "$fifofile"
Очевидно, что в данном случае строчка rm "$fifofile" будет выполнена после завершения цикла, что, по идее (так как read ждёт закрытия потока ввода), произойдёт только после завершения процесса, пишущего в FIFO и считывания из него всех данных.
Но всё же ощущается неаккуратность в виде наличия временных файлов. Тем более, что упражнение вида mktemp—rm—mkfifo теоретически может породить рейс. Можно попробовать соорудить конструкцию с созданием дескрипторов (like, exec 3<&0>&1):
exec 3<&0>&1

ls | sed 's/^/1 /' >&3 & # random command which output we need to parse
while read -u 3 a b
do
  i=$(( $i + 1 ))
done
echo $i

exec 3<&->&-

И, казалось бы, счастье есть: мы можем запихать произвольный пайплайн из процессов в этот дескриптор, а потом читать из него (или с помощью специального ключика у read, как в примере выше, или же просто <&3. Осталась одна маленькая проблема: если попытаться прибить скрипт до окончания его работы, то это ему ничуть не помешает. Посему, нужно повесить trap, который убивает дочерний процесс и завершает работу:
trap 'kill -9 $cpid; exit' TERM INT

exec 3<&0>&1

ls | sed 's/^/1 /' >&3 & # random command which output we need to parse
cpid=$!
while read -u 3 a b
do
  i=$(( $i + 1 ))
done
echo $i

exec 3<&->&-

Более аккуратного варианта как-то в голову не пришло. Если кто знает — поделитесь.

UPD. Таки приведённый вариант с дескрипторами работает только в zsh (не в dash). Буду думать, как его таки заимплементить.
esyr: (Default)

Появилась новая версия кросс-платформенного вики-сервера, написанного на языке Python — MoinMoin 1.9.2. В данной версии исправлен ряд серьёзных проблем с безопасностью, потенциально существовавших и в более старых ветках (начиная с 1.5). Разработчиками настоятельно рекомендуется обновиться до данной версии (или до версии 1.8.7, если обновление до ветки 1.9 невозможно или нежелательно по тем или иным причинам).

Ссылки:
esyr: (Default)
Что-то я смотрю на этот ваш формспринг и не понимаю, зачем он нужен. Что позволяет делать — понимаю, нафига — нет.
esyr: (Default)


Не буду ничего писать про конференцию: всю неделю до неё хронически недосыпал, да и на ней самой отдохнуть не удалось, нормально смог отоспаться только по приезду. Никаких остаточных впечатлений посему не наблюдается.

Немного быдлофоточек )
esyr: (Default)
esyr: (Default)




esyr: (ночь)
Многие почему-то так боятся того, что априори считают сложным. «Я не хочу учить матан, это сложно», «Я не хочу собирать модуль ядра, это сложно», «Я не буду читать "Искусство программирования", это сложно». Обычно подобные заявления делаются людьми, которые даже и не пытались это сложное сделать. И подобные заявления позволяют им не пытаться дальше. В то же время, большинство вещей, которые кажутся сложными, на самом деле таковыми не являются. Не все, но большинство. Но для того, чтобы выяснить, что сложно, а что — нет, нужно сначала попытаться это сделать. И не в духе «я погуглил, увидел хавту на стопицот страниц и забил» — объём не показатель сложности, а действительно попытаться. Разбираться с вещами, которые не получаются. Думать, там. Обычно, в итоге оказывается, что единственным препятствием были нежелание, лень и необходимость некоторого количества времени (заметим, что про собственно сложность тут ничего нет). И тогда вещи, которые ранее были названы сложными, в худшем случае оказываются громоздкими. Не более.

Я не утверждаю, что сложных вещей нет, их есть, и много. Но гораздо меньше, чем думают многие. И это ложное представление ограничивает этих многих в развитии. И это печально.
esyr: (ночь)
В этот раз как-то особенно отчётливо ощутил, что не понимаю, зачем радоваться смене циферок в такой искусственной вещи, как календарь. Ну, то есть, если раньше я как-то подчинялся стадному инстинкту, то сейчас он то ли сломался, то ли ещё что, но никакой радости от того, что 2009 поменялось на 2010, нет. Как, впрочем, и от смены любых одних цифр на любые другие.

A pile of.

Jan. 2nd, 2010 06:13 pm
esyr: (eye 4)
Метро ) Софтул 2009 )
Специально для пафосного небыдла, так боящегося потратить своё время: под катом нет ничего интересного, да.
esyr: (eye 4)
С 28 по 30 декабря с 13:00 по 19:00 в здании математического факультета МПГУ будет проходить московское отделение 26-й конференции Chaos Communication Congress.

В рамках московского отделения планируется просмотр трансляций отдельных выступлений в Германии (как записей, так и realtime), живое общение, и, при желании участников выступить с докладом, проведение оных.

Для участия в московском отделении необходимо зарегистрироваться.

Краткая информация о буквах CCC и 26C3 )

Контактная информация (организаторы):

Ссылки:

Про SSD

Dec. 20th, 2009 12:41 pm
esyr: (Default)
Таки приехала (спасибо, Броник!). Осталось забэкпортить драйвер в 24-е ведро и будет счастье.

Upd: Таки ничего бэкпортить не пришлось, старая версия лежала в git-репозитории ядра. Странно, что уже (минимум) восемь минорных версий оно в staging, ну да ладно. Ещё бы pcie hotplug работал, было бы вообще замечательно.

Profile

esyr: (Default)
esyr

October 2010

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 18th, 2017 03:09 am
Powered by Dreamwidth Studios