четверг, 23 декабря 2010 г.

Подводные камни дробных чисел

В PHP такой код выдаёт странный, на первый взгляд, результат:
$x = (0.1+0.7)*10;
echo $x, "\n";
printf("%d\n", $x);
echo (int)$x, "\n";
printf("%0.10f\n", $x);
Казалось бы, должна быть всегда восьмёрка. Но этот код выдаст:
8
7
7
8.0000000000
Всё становится ясно, если в код добавить такую строку:
printf("%0.20f\n", $x);
Получим число 7.99999999999999911182
Т.е. в памяти была далеко не восьмёрка, а приведение типа просто отбрасывает дробную часть. Если округлить результат, то точность повысится:
$x = round((0.1+0.7)*10);
echo $x, "\n";
printf("%d\n", $x);
echo $x, "\n";
printf("%0.10f\n", $x);
printf("%0.20f\n", $x);
Выдаст:
8
8
8
8.0000000000
8.00000000000000000000
Поэтому стоит избегать использовать числа с плавающей точкой там, где требуется целочисленный результат.

Twitter

Завёл аккаунт на Twitter: http://twitter.com/Ktak_007

понедельник, 6 декабря 2010 г.

StarDict -> GoldenDict

Сегодня заменил  некогда любимый StarDict на GoldenDict.

StarDict давно уже подглючивал - падал при выделении слова в режиме сканирования, не воспроизводил озвучивание слова.

Вычитал на LOR о другом словарике - GoldenDict - и решил его попробовать. Благо, в Debian этот пакет ставится лёгким движением руки: apt-get install goldendict

Приятно, что мне не пришлось ничего настраивать - новый словарик подхватил все настройки словарей от StarDict и хорошо с ними работает:


Сканирование есть, звук есть. Всё зашибись. Один недостаток - я в Гноме, а GoldenDict на Qt. Но на фоне поедания памяти фаерфоксом мне ничего не страшно :-)

P.S. 20 декабря обнаружил, что StarDict нормально сканирует и звук выдаёт. Наверное, какое-то обновление помогло. Но, всё равно, GoldenDict красивее.

четверг, 2 декабря 2010 г.

Паковать музыку в формате flac и CD "Два в одном"

Уже, наверное, несколько лет ничего сам не паковал. А тут вдруг решил паковать имеющиеся CD в формат flac - для удобства, чтобы всё было
под рукой.

При вставке CD мой Debian Squeeze автоиматически запускает программу Sound Juicer 2.28.2, которая, вроде бы, умеет паковать в формат flac. Попытка упаковать им оказалась неудачной - в файлах с расширением .flac оказалось нечто непрослушиваемое в формате, похожем на mp3.

Вспомнил, что когда-то грабил и паковал в формат mp3 программкой Grip. Поставил (apt-get install grip из-под рута) и запустил. Кажется, она совсем не изменилась, хотя я помню её со времён GTK1:


Видим, что Grip автоматически по базе freedb.freedb.org определил название диска, исполнителя и названия треков.

Чтобы начать паковать, необходимо:
  1. До запуска grip установить пакет flac: apt-get install flac из-под рута
  2. Выбрать требуемые треки. Чтобы выбрать все треки, надо кликнуть по слову "Извлечение" на скриншоте
  3. В разделе Конфигурация/Сжатие проверить, что выбрана программа сжатия flac
  4. Для корректного задания полей flac, командую строку рекомендую сделать такой: -V -8 -T "TITLE=%n" -T "ARTIST=%a" -T "ALBUM=%d" -T "DATE=%y" -T "TRACKNUMBER=%t" -T "GENRE=%G" -o %m %w (почему-то grip сам не умеет правильно подставлять поля во flac, хотя в mp3 теги расставляет корректно)
  5. Формат сжатого файла сделал таким: ~/music/%A/%d/%t. %n.%x (понять подставляемые значения %A, %d, %t и других можно в справке, в самом низу текста: Помощь/Конфигурирование Grip)
  6. Теперь переходим на вкладку Извлечение и нажимаем кнопку "Извлечь и сжать". Вуа-ля! Grip начинает читать диск и параллельно паковать.
Однако это не всё. Если бы диск содержал один альбом, я бы успокоился. Но на скриншоте можно видеть, что  я вставил в CDROM диск, на который записаны два альбома - "Paranoid" и "Technical Ecstasy". Grip создаёт структуру файлов по описанию. В итоге в каталоге ~/music/ у меня появился каталог "Black Sabbath" (это исполнитель), а в нём один каталог-название альбома "ParanoidTechnical Ecstasy" (слеш пропал из названия, т.к. grip по дефолту вырезает неудобные символы). А мне хотелось бы хранить эти альбомы по отдельности - так, как их выпустили в оригинале. Что бы провернуть сие, я воспользовался утилитой metaflac, входящей в уже установленный пакет flac.

Сначала я разделил каталог "ParanoidTechnical Ecstasy" на два: "Paranoid" и "Technical Ecstasy". В первый я переместил песни с 1-ой по 8-ую, во второй - все остальные.

Какие проблемы остались? Это неправильные теги. Просмотреть теги flac-файла можно командой metaflac --list <файл.flac>.

В альбоме Paranoid необходимо исправить только название альбома: 
metaflac --remove-tag=ALBUM *
metaflac --set-tag='ALBUM=Paranoid' *
Удаление необходимо т.к. --set-tag не заменяет тег, а добавляет второй.
С первым альбомом полностью разобрался.

В альбоме "Technical Ecstasy" так же просто, исправляем название альбома: 
metaflac --remove-tag=ALBUM *
metaflac --set-tag='ALBUM=Technical Ecstasy' *

И год выхода альбома (здесь проставился год выхода Paranoid - 1970):
metaflac --remove-tag=DATE *
metaflac --set-tag='DATE=1976' *

По аналогии так можно менять любые теги.

Теперь начинается самое интересное! В этом альбоме у меня файлы имеют вид:
09. Back Street Kids.flac
10. You Wont Change Me.flac
11. Its Alright.flac
12. Gypsy.flac
13. All Moving Parts Stand Still.flac
14. RocknRoll Doctor.flac
15. Shes Gone.flac
16. Dirty Women.flac

Надо заменить номера файлов. Выполняем с командной строки:
i=1; for f1 in *; do f2=`echo $f1 | sed 's/^[0-9][0-9]//'`; printf "mv '$f1' '%02d$f2'\n" $i; i=$((i+1)); done | sh

То же самое с номерами треков - они начинаются с девятки, а должны с единицы:
metaflac --remove-tag=TRACKNUMBER *
i=1; for f1 in *; do printf "metaflac --set-tag='TRACKNUMBER=%02d' '$f1'\n" $i; i=$((i+1)); done | sh

Вуа-ля! У меня два альбома из одного диска с правильными тегами!

Думаю, не упростить ли теперь процесс разбивки альбома на части - написать какую-нибудь GUI-прожку с кнопками. Или патч к Grip написать?

четверг, 18 ноября 2010 г.

Язык Си для скриптов

Читая статью Загрузка Linux без ядра за 25 секунд решил проверить, заработает ли такой код на языке Си:


Далее делаем программу запускаемой (chmod +x test.c) и можно запускать командой ./test.c

Действительно, работает!

Смысл такого подхода: иногда не хватает либо доступных средств скриптового языка, либо производительности. Но держать компилируемую программу там, где по сути нужен скрипт, неудобно.

А здесь в одном флаконе и мощь языка Си, и скорость запуска, и скриптовый подход "подправил-запустил", и компиляция в машинный код.

Осталось только попытаться применить это на практике.

вторник, 16 ноября 2010 г.

Obama weather's fail

Только что попытался добавить погоду в Новосибирске в свой блог с Obama weather. Делаю как написано по ссылке get it into your blog - и ничего.

Начал смотреть, что к чему:

$ GET http://blog_me.obama-weather.com/T2JhbWEvbS9SU1hYMDA3Nw==
Could not connect to memcache

Хе-хе, кто ж так сайты пишет!

понедельник, 15 ноября 2010 г.

Почему я перестал использовать mp3

Почему я перестал использовать mp3?

1. Я люблю слушать альбомами - тем списком и в той последовательности так, как задумал автор. Упаковщик mp3, даже если он выкладывал альбом, зачастую выбрасывает некоторые треки на свой вкус. Мой вкус не всегда совпадает со вкусом упаковщика.

2. Обнаружилось, что есть такие "умные" упаковщики, которые берут чужой mp3 в формате 128 kbit, перепаковывают в 320 kbit и думают, что они повысили качество :-D. Выяснять своими ушами, чего там напаковали эти горемыки, нет никакого желания.

3. Чтобы получить (субъектвно) идеальный mp3, необходимо раздобыть CD с хорошим звуком (а ведь бывают и CD, сделанные из некачественных mp3). А если я раздобыл такой CD, то зачем мне теперь паковать его в mp3? Можно и так послушать.

4. Часто на CD имеет место такой эффект - звук следующего трека начинается в конце предыдущего, а звук предыдущего заканчивается в конце следующего. Слушая CD, паузы между песнями нет. Но слушая mp3, появляется пауза. Можно, конечно, настроить программный плеер, чтобы играл без пауз. Но есть же треки, между которыми пауза должна быть. А аппаратные mp3 плееры чаще всего таких настроек - убрать паузу - не имеют.

пятница, 29 октября 2010 г.

Visio <=> Dia

Обалдеть! Оказывается, Microsoft Visio и Dia умеют обмениваться данными! Для этого всего лишь надо использовать формат файлов .vdx - обе программы понимают этот формат.

Правда, как в случае создания документа в Dia с передачей в Visio, так и в случае создания документа в Visio, с последующей передачей в Dia, вид документа получается, мягко говоря, неидеальный - потребуется редактирование. Но зачастую это лучше, чем рисовать схемы заново.

четверг, 9 сентября 2010 г.

XLS-формат

Что, блин, за мода, выкладывать прайсы в формате Excel?! Зачем тогда сайт? Давайте через файлопомойку на ftp-сервере ещё файлы раздавайте! И все описания с картинками там же сложите, в формате doc :-)

раздел страницы: Каталог (открыть в Google ВикиКомментариях)

среда, 18 августа 2010 г.

Мой третий компьютер - Орион-128

После Радио-86РК и Спектрума решил собрать Орион-128, опубликованный в журнале Радио. Нормальной печатной платы мне раздобыть не удалось, поэтому решил изготовить плату самостоятельно. Это позволило изготовить плату, раза в три или в четыре большую по площади, чем оригинальная плата:



Однако, качественно нарисовать дорожки вручную для меня оказалось весьма затруднительно, поэтому я вытравил только разводку питания на микросхемы, а остальные соединения делал проводами:
На плате предусмотрено место под 256KB памяти (против 128KB на оригинальной), место под контроллер Floppy-дисков, и макетная часть для экспериментов.

Чтобы запустить Орион, оставалось впаять только панельку микросхемы ПЗУ. Но на дворе стоял 1994 год, я нашёл себе подработку на IBM PC 386, и интерес к Ориону как-то незаметно пропал. Так он и остался недоделанным :-(

Мой второй компьютер - Spectrum

В продолжение темы о первых своих самодельных компьютерах представляю фотографию компьютера Спектрум, Ленинградский вариант, собранного следующим после Радио-86РК, году эдак в 1992:

Корпус был куплен для Радио-86РК, но использован здесь. Клавиатура - специально для Спектрума - куплена уже собранной. Чтобы заполнить дыру между корпусом и клавиатурой, использовал обыкновенные в то время школьные линейки. Повернуть их циферками наружу показалось мне симпатичнее, чем тыльной стороной. Процессор здесь - аналог Z80 производства Sharp, мог работать на удвоенной частоте, с тыльной стороны корпуса есть переключатель частоты. Кроме того, здесь неоригинальная прошивка 1992 года, позволяла записывать программы на магнитофон с удвоенной скоростью. Включая эту фичу и щёлкая тумблером частоты я записывал на кассеты в четыре раза больше программ, чем мог бы на стандартном Спектруме.

Открывать корпус не стал, зато на заднем фоне умилительный бонус "Джостик" :-) Кстати, он как новый ещё.

Где-то потерялся заменитель джойстика - блок герконовых кнопок с проводами. Найду - фотку выложу.

Мой первый компьютер - Радио-86РК

Заходил тут недавно в гости к родителям и обнаружил свои первые компьютеры. Самая первая самоделка - Радио-86РК:

Сей чудный корпус был подарен одним хорошим знакомым, у которого уже был к тому времени Спектрум и РК-шка его не интересовала.
Кнопки с печатной платой клавиатуры я заказал наложенным платежом по объявлению в журнале Радио то ли из Москвы то ли из Питера. По удивительному стечению обстоятельств, клавиатура идеально вошла в этот корпус. Только печатную плату дополнительных клавиш пришлось травить самому.
Открыв корпус в целях поиска ностальгических ощущений, я вспомнил, как прикрутил к РК-шке программатор ПЗУ (оранжевая панелька), как я установил на эту плату новую память - целых 64KB на микросхемах РУ5! Чтобы комп смог видеть дополнительную память понадобилось прикрутить контроллер внешних устройств, чтобы убрать внешние устройства из адресного пространства. Эта микросхема висит над процессором на зелёных проводах кверху ножками. Только переделку я так и не закончил, и РК-шка по сей день видит только 32KB :-(

пятница, 6 августа 2010 г.

hp-setup и Bonjour

Сегодня подключал сетевой принтер с помощью утилиты hp-setup. Вообще говоря, подключать этой утилитой сетевые принтеры в Linux гораздо проще чем в Windows, благодаря использованию утилитой hp-setup протокола Bonjour. Однако, сегодня подключение было не таким простым. Сетевые принтеры были обнаружены, но подключение к ним не происходило. Как выяснилось, во время какого-то апгрейда системы (Debian Squeeze/Testing) был отключён запуск демона avahi, отвечающего за приём сообщений Bonjour. Видимо, процедуру поиска принтеров утилита hp-setup реализует самостоятельно, а для работы с найденным принтером уже требуется avahi-daemon. Почему создатели hp-setup не догадались проверять работоспособность avahi-daemon перед началом общения с принтером, для меня загадка.

Метод лечения был прост. В файле /etc/default/avahi-daemon значение AVAHI_DAEMON_DETECT_LOCAL=1 было заменено на AVAHI_DAEMON_DETECT_LOCAL=0 и выполнена команда /etc/init.d/avahi-daemon start

понедельник, 28 июня 2010 г.

Палатки

Заходил в пятницу в Спорт-Мастер. Понравились две палатки. Первая состоит из двух как бы отдельных палаток с пространством посередине:
Вот ценник с описанием:

Ещё больше понравилась другая палатка, в которой можно стоять в полный рост и даже поставить столик в тамбуре:

Она немного подороже:

Что смущает - как-то сильно дёшево. Специально зафотал ценники, чтобы было видно описание. Буду думать.