10 января 2012 г.

java и чтение unicode BOM

Ошибка древняя, как гавно мамонта, запишу здесь для истории. Проблема в том, что стандартными методами ридеров и стримов (с указанием, разумеется, соответствующих кодировок) в Java осуществлена неполная поддержка юникодовских кодировок, а именно полное игнорирование любых BOM-ов (в начале файлов). То есть если вы сохраните файл в любую юникодную кодировку «плохим» редактором (например, в виндовом блокноте), приложив BOM, то в Java без костылей прочитать не получится никак.

Баг на сане был открыт ещё в 2001 году, на данный момент помечен как «исправляться не будет», с объяснением «иначе некоторый софт может сломаться», т.е. баги тоже должны быть обратно совместимы ;) В каментах к багу много негодований, но обсуждение правильности этого решения пусть останется за рамками этой заметки.

На данный момент (конец jdk6 - начало jdk7) ошибка не исправлена и исправляться не собирается.

В качестве решения предлагается обрабатывать BOM-ы самостоятельно в коде. Готовые классы-обёртки находятся здесь: http://koti.mbnet.fi/akini/java/unicodereader/.

Например, UnicodeReader оттуда работает как замена InputStreamReader в такой конструкции:
new InputStreamReader( new FileInputStream( new File( "config.txt" ) ), "UTF-8" )
и является просто обёрткой над ним, создавая InputStreamReader внутри себя с кодировкой согласно прочитанным BOM из файла, либо указанной в конструкторе (как и в конструкторе InputStreamReader) конкретной дефолтной кодировке.

1 декабря 2011 г.

расчёт dpi монитора и настройка в linux (черновик)

Началось с того, что меня бесило, что gnome ставил 96 dpi мне, хотя, очевидно, настоящий dpi другой. Также запросто может быть (у меня на прошлом мониторе был) совершенно разное значение DPI по горизонтали и вертикали. Потом я перестал пользоваться gnome и начал сталкиваться с такой же настройкой в целом во всей системе. Как и положено в linux это приводило к гемору и тому, что иногда это работало, иногда нет, итп. И руководство давности годовой из инета оказывались неактуальными совершенно, потому что всё уже deprecated и работает по-другому.

[!]з.ы. по сути это черновиком так и осталось, так что пользы мало.

13 ноября 2011 г.

django: предпросмотр картинки (поля ImageField) в админке

Выводить буду предпросмотр в таблице списка элементов модели (у меня это Image — "картинка") и, самое главное, в форме редактирования модели.

4 ноября 2011 г.

linux: fedora 16 64 yum защищённые версии multilib

В бете федоры 16 x86_64 при попытке вытянуть через yum зависимости для i686 пишет что-то типа:

Ошибка: Защищённые версии multilib ....

Решается включением репозитория updates-testing:

yum install пакет.i686 --enablerepo=updates-testing

22 сентября 2011 г.

linux: flac cue ape разрезание на треки

Часто музыкальные альбомы представляют из себя цельный flac. К нему, как правило, прилагается cue-файл с метаданными, который описывает раскладку треков в нём. Иногда это неудобно: нельзя отделить треки, проблема с проигрывателями (мы же в linux, не так ли;) и т.д. Мы хотим разрезать изначальный музыкальный файл на отдельные flac-треки, чтобы было всё красиво, с метаданными, с тегами. На самом деле cue используется с любыми форматами, а не только с flac. Наша изначальная задача разбивается на две: работа с cue и резка flac/ape/… . Кодировать на выходе будем во flac.

21 сентября 2011 г.

Java regexp: при использовании appendReplacement или replaceAll внезапно происходит Illegal group reference

Это странное поведение некоторых методов regexp с некоторыми случайными параметрами одно время убило мне пару часов отладки. Сам виноват, ибо проглядел в доках указание на специальное значение символов '$' и '\'. Не подумал, что из-за них может выкидываться java.lang.IllegalArgumentException, про который нет ничего в явадоках этих методов.

13 сентября 2011 г.

linux: изменить UID/GID юзера в системе

Сабж надобится иногда для того, чтобы аккуратно перевести систему на другой дистрибутив. Или чтобы корректно работали общие ресурсы в сети. И т.д. Всё примитивно, просто памятка. Проверяю под федорой и арчем, но способ универсальный. Мне надо поменять uid (1000 вместо 500) юзера dimon и назначить ему другую основную группу — 100(users) вместо 500(dimon).