shoorick: (Рыжий)
Отлаживаю скрипт, получаю развесистую структуру данных, чей дамп, сделанный модулем Data::Dumper, занимает почти 9000 строк. Вывел дамп на экран, потянулся к мышке, чтоб скопировать и засунуть в файл, да вовремя остановился — есть же простой метод: достаточно написать в отладчике всего пару строк:
use File::Slurp
write_file 'big-structure.pl', Dumper $structure

P. S. А если вместо Data::Dumper использовать Data::Dumper::Perltidy, результат получается более симпатичным.

update/07.04.2014: Иногда, когда содержимое в UTF-8, лучше писать так:
write_file 'big.txt', {binmode => ':utf8'},  $unicode-data
Впрочем, к данным, выводимым через Data::Dumper[::Perltidy], это не относится: там символы, не попадающие в ASCII, представлены как \x{HHH}, где HHH — шестнадцатеричный код символа.
shoorick: (Default)
Пытался преобразовать текст на UTF-8: хотел привести отсутствующую в КОИ-8 пунктуацию к виду, пригодному для HTML:
use HTML::Entities;
...
my $fixed  = encode_entities( $raw, "\x{460}-\x{2E2E}" );
Работало странно: тире преобразовывалось в —, а кавычки-ёлочки — нет. Причина оказалась простой — кавычки-ёлочки в юникоде находятся совсем не там, где остальные знаки пунктуации с пробелами — не в U+2000–U+205F, а гораздо ближе — их коды U+00AB и U+00BB, то есть, если перевести в десятичную систему счисления, 171 и 187. Ничего не напоминает? :-)

Поэтому более правильный вариант выглядит так:
my $fixed  = encode_entities( $raw, "\x{A0}-\x{40F}\x{460}-\x{2E2E}" );
shoorick: (Default)
Перловый модуль Lingua::Translit умеет транслитерировать нелатинский текст множеством способов. Для русской кириллицы таких способов — пять четыре:
#!/usr/bin/perl

use Lingua::Translit;

my $sample = 'Эй, жлоб! Где туз? Прячь юных съёмщиц в шкаф.';
my $tr;

for ( 'ALA-LC RUS', 'ISO 9', 'DIN 1460 RUS', 'GOST 7.79 RUS', 'GOST 7.79 RUS OLD' ) {
    $tr = new Lingua::Translit( $_ );
    printf "%17s %s\n", $_, $tr->translit( $sample );
}

Выводит:
       ALA-LC RUS  Ėĭ, zhlob! Gde tuz? Priach′ iunykh s″ëmshchits v shkaf.
            ISO 9  Èj, žlob! Gde tuz? Prâčʹ ûnyh sʺëmŝic v škaf.
     DIN 1460 RUS  Ėj, žlob! Gde tuz? Prjač' junych s"ëmščic v škaf.
    GOST 7.79 RUS  E`j, zhlob! Gde tuz? Pryach` yuny'x s``yomshhicz v shkaf.
GOST 7.79 RUS OLD  E`j, zhlob! Gde tuz? Pryach` yuny'x s``yomshhicz v shkaf.
shoorick: (Default)
Чтобы SAS.Планета, запущенная в убунте с вайном, отображала меню хотя бы на английском (а не вопросительными знаками), а также не дохла внезапно, ругаясь на Access violation, надо запускать её в локали ru_RU.UTF-8.
shoorick: (Default)
Ускоряем каталистовый сайт, переписываем слишком медленные запросы с DBIx::Class на обычный DBI. Попутно допилил напильником каталистовую модель, чтобы она поддерживала UTF-8 в MySQL, о чём и написал в [livejournal.com profile] ru_catalyst. Кому надо — пользуйтесь.
shoorick: (Default)
Процесс перевода каталистового приложения на новый сервер что-то затягивается: после установки всего необходимого приложение наконец-то запускается, но работать не хочет: сначала ругалось на Wide characters и помирало, теперь, после бубна и напильника, не ругается и, вроде, живёт, но выводит странную кашу: данные, пришедшие из БД и из конфирурационного файла, отображаются правильно, а вот содержимое шаблонов лишний раз перекодируется и выводится примерно так: помоÑ.

Читаю Using Unicode in Catalyst Applications — вижу, что некоторые рекомендации оттуда я как-то применял, но закомментировал: наверное, они были, как минимум, не нужны, а то и вредны. Продолжаю читать и пробовать...

upd/17:40: Отключил кэширование шаблонов в TT, чтобы глаза не мозолили, сделал всё, рекомендованное в Using Unicode in Catalyst Applications — заработало.
shoorick: (Default)
Bootylicious ругается на конфигурационный файл, если встретит в нём не-ASCII символы (то есть, с кодами больше 127), хочет, чтобы они были представлены в виде \uXXXX. Плохо :-(

Да и настройки он ищёт в bootylicious.json, а не в bootylicious.conf, как написано в документации.
shoorick: (Default)
Пытаюсь воткнуть свежезарелизенное в один из наших проектов. С одной стороны, конечно, надо придерживаться правила «Не сломалось — не чини», но, с другой, если модуль выложен на CPAN и, следовательно, уже не сильно связан с исходным проектом — нет смысла держать дубль. Пока натыкаюсь на ошибки:
Malformed UTF-8 character (unexpected continuation byte 0x80, with no preceding start byte) in pattern match (m//) at /usr/local/lib/perl5/site_perl/5.8.9/Lingua/RU/Inflect.pm line 254.
[error] Caught exception in engine "Wide character in memGzip at /usr/local/lib/perl5/site_perl/5.8.9/Catalyst/Plugin/Compress/Gzip.pm line 36"
Попробовал добавить в проблемный участок вызовы функций encode и decode:
my @name = Lingua::RU::Inflect::inflect_given_name(
    GENITIVE,
    decode('utf8', $student->user_id->lname),
    decode('utf8', $student->user_id->fname),
    decode('utf8', $student->user_id->sname),
);

push @name, shift @name; # ФИО → ИОФ
$c->stash->{'student_genitive'} = encode('utf8', join(' ', @name));
Вроде, заработало, но выглядит паршиво.

Надо бы perlunicode перечитать...
shoorick: (Default)
На перлбурге обслуждали мы с Анатолием [livejournal.com profile] sharifulinым его блиц-доклад про CPAN.
— А что хочешь выложить?
— Да есть у меня модуль для склонения русских имён.
— Так он, поди, у всех есть! :-) Каждый его пишет.
— Пишет, может, и каждый, да не каждый выкладывает.

Мне известен лишь один модуль, который склоняет имена — Lingua::RU::Sklon, но он мне не нравится:

  1. Кодировка модуля — вражеская CP1251 вместо правильной UTF-8.
  2. Идентификаторы образованы от сокр. рус. слов. VIN вместо ACCUSATIVE — неудобно.
  3. За три года модуль так и не ушёл дальше версии 0.01
Поэтому я выложил свой модуль. Теперь в скриптах можно написать так:
#!/usr/bin/perl -wl -CO

use utf8;
use Lingua::RU::Inflect ':all';

my @name = qw/Чайковский Пётр Ильич/;
my @inflected;
$, = ' ';

for ( NOMINATIVE .. PREPOSITIONAL ) {
    @inflected = inflect_given_name( $_, @name );
    push @inflected, shift @inflected;
    print @inflected;
}
Результат:
$ ./test-tchaikovsky.pl
Пётр Ильич Чайковский
Петра Ильича Чайковского
Петру Ильичу Чайковскому
Петра Ильича Чайковского
Петром Ильичом Чайковским
Петре Ильиче Чайковском
Работоспособность протестирована пока что в Mandriva Linux 2010.0, FreeBSD 6.2 и 7.2.

Ближайшие планы:

  1. Разобраться с кириллицей в документации (CPAN считает, что она написана в ISO8859-1, а не в UTF-8);
  2. Написать README, а не оставлять то, что сгенерировано автоматически;
  3. Сделать порт для FreeBSD.
  4. Найти (или организовать) список рассылки / IRC-канал / Jabber-конференцию / форум / вписать желаемое для обсуждения багов;
  5. Ускорить домашнюю связку trac+svn (где сейчас и живёт Lingua::RU::Inflect) либо перенести проект на какой-либо внешний более шустрый хостинг.
Дальние:
  1. Научить модуль склонять любые существительные и прилагательные — в конце концов, имена и фамилии склоняются аналогично: уже сейчас inflect_given_name( DATIVE, qw/Синий чайник/ ) возвращает qw/Синему чайнику/.
  2. Сделать блиц-доклад? :-)
P. S. Да, я знаю, что слово «склонение» переводится как «declension».

shoorick: (Default)
Дёшево и сердито (ну да, даже в перлдоке на модуль написано — quick and dirty)
#!/usr/bin/perl -nl -CD
use Text::Unidecode;
print unidecode( $_ );
Кириллицу успешно перекодирует. Используемые правила транслитерации слегка необычны: г→gh, e→ie, твёрдый знак вообще пропадает. Но всё равно получающийся текст достаточно понятен.
shoorick: (Default)
В тренировочных целях пробую переверстать в LaTeX галкину статью. Статья всё равно уже сдана в редакцию в формате ворда, поэтому сроки не поджимают: развлекаюсь не спеша.

Гугл и бубен, в общем-то, помогают, но общее количество странностей и используемых костылей несколько пугает. Всё оказывается не так-то просто...

Например, метод научного тыка, совмещённый с гуглением показал, что пакет listings, используемый для вставки кусков программного кода с подсветкой синтаксиса, не понимает UTF-8 — его пониманию доступны лишь восьмибитные кодировки. Пришлось вынести код в отдельные файлы и перекодировать. Перекодировать всю статью пока не решился — во-первых, UTF-8 — это сейчас у меня основная кодировка, а во-вторых, в статье встречается (хоть и не отображается пока) дореволюционная кириллица.
shoorick: (Default)
Как показал опыт, перл не хочет транслитерировать кириллицу из UTF-8. Может быть, и хочет, да я не ту цапу крутил не нашёл метода заставить его делать это. Но с другой стороны, зачем зацикливаться на перле? Можно и без перла:
sed \
-e 's/ё/yo/g' \
-e 's/Ё/Yo/g' \
-e 's/ж/zh/g' \
-e 's/Ж/Zh/g' \
-e 's/ц/ts/g' \
-e 's/Ц/Ts/g' \
-e 's/ч/ch/g' \
-e 's/Ч/Ch/g' \
-e 's/ш/sh/g' \
-e 's/Ш/Sh/g' \
-e 's/щ/shch/g' \
-e 's/Щ/Shch/g' \
-e 's/ю/yu/g' \
-e 's/Ю/Yu/g' \
-e 's/я/ya/g' \
-e 's/Я/Ya/g' \
-e "y/абвгдезийклмнопрстуфхъыьэ/abvgdezijklmnoprstufh'y'e/" \
-e "y/АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEZIJKLMNOPRSTUFH'Y'E/"
upd/04.04: забыл сначала к командам замены добавить g — без него sed, как и perl делает всего одну замену.
shoorick: (Default)
Странную фигню обнаружил с поведением перловых операторов s/// и tr/// . Точнее, обнаружил её ещё год назад, но сейчас снова обратил внимание на неё.

Итак, дана строка кириллического текста в UTF-8. Пытаемся делать замены текста с целью транслитерировать. Оператор s/// работает правильно, а вот tr/// выдаёт фигню. Поэтому скрипт, где используются оба этих оператора, выдёт странный результат:

Чё
Chyo
Чушь
ChENshEY
Сало
aEaba'aV
Исходник под катом )Сам скрипт — в UTF-8, данные в него поступают тоже в UTF-8.

shoorick: (Default)
Практика показала, что плеер iRiver T60 успешно справляется с тегами, записанными в UTF-8 — и у MP3, и у OGG. Во всяком случае, русские буквы отображает. Можно, конечно, провести эксперимент, подсунув ему тэг с текстом вида «яζы́к★» и посмотреть, что будет, да пока не до этого.
shoorick: (Default)
Установка mc из пакетов спасла отца русской демократии: mc наконец-то перестал использовать ncurses — понял, что есть slang. В результате ему почти не сносит крышу от UTF-8:
  Левая панель     Файл     Команда     Настройки     Пр
┌<─~/tmp/ы-αβγ-đ─────────v>┐┌──────────────────────────┐
│    Имя    │Разме│Атрибуты││Файл: utf8.txt            │
│/..        │-ВВЕР│drwxr-xr││Это файл                  │
│ utf8.txt  │  169│-rw-r--r││в кодировке UTF-8         │
│           │     │        ││С разными буквами,        │
│           │     │        ││не только русскими:       │
├──────────────────────────┤│Grünölstraße, Αλεξανδροσ, │
│ utf8.txt  │  169│-rw-r--r││a²×b·c³≠d                 │
└──────────────────────────┘└──────────────────────────┘
<F3><CF><D7><C5><D4>: <E4><CC><D1> <CF><D4><CD><C5><D4><
[as@country ~/tmp/ы-αβγ-đ]$                          [^]
1Помощь 2Меню   3Просмот4Правка 5Копия  6Перемес7НвКтлог
На самом деле я уже несколько месяцев как съехал под UTF-8.
shoorick: (Default)
ʞɔı̣ɹooɥs

Другие буквы: ɐəɟɓɯɹʇʌʍʎ
shoorick: (Default)
гўупый мой ўасковый
current music
Многолетнее занятие пением способствует, с одной стороны, такому развитию речевого аппарата и прилегающего к нему головного мозга, что занимающийся может без особых усилий осознанно картавить, шепелявить и не выговаривать всяких букв. Например, Л, как в уже упомянутом куррентмузыке. С другой стороны, занимающийся, в моменты, когда не прилагает таких усилий, может говорить и петь хорошо и правильно.

P. S. [livejournal.com profile] anyutka и [livejournal.com profile] mcilove привязали ко мне «Ундервуд» — уже вторую неделю слушаю. Злодеи!

P. P. S. Если в MP3 перегнать тэги в UTF-8 (например, когда лень писать скрипт, для этого есть EasyTag) и убрать ID3v1, то mpc и свежий winamp (проверено на 5.5) вполне справляются с русскими буквами.
shoorick: (Рыжий)
Выяснил, что можно задавать свои Compose-последовательности не редактированием общесистемного /usr/local/lib/X11/locale/en_US.UTF-8/Compose, а при помощи ~/.XCompose, что, имхо, более правильно.

Попробовал — работает.
shoorick: (Default)
Я как-то пытался съехать из-под родной КОИ-8 в новомодную UTF-8, после чего вернулся обратно, Ибо полночному командиру было плохо и неуютно в юникодном терминале. А ведь живущему под кедами доступно простое как топор решение: в konsole можно указать кодировку терминала: Settings → Encodings → Cyrillic (koi-8). И проблема почти решена: если по SSH зайти на соседний хост — всё хорошо. Но на своём — mc слегка чудит:
  п⌡п╣п╡п╟я▐ п©п╟п╫п╣п╩я▄     п╓п╟п╧п╩     п п╬п╪п╟п╫п╢п╟
┌<─/usr/home/as/tmp──────v>┐┌<─~/music/instrumental───v>┐
│   п≤п╪я▐  │п═п╟п│п░я┌я─п╦││  п≤п╪я▐  │п═п╟п│п▓я─п╣п╪я▐│
│ КОИ-8.txt │   23│-rw-r--r││/..       │п═п╔-│          │
│           │     │        ││ Мален~mp3│ 754K│▌п╩ 12 13:│
├──────────────────────────┤├───────────────────────────┤
│ КОИ-8.txt │   23│-rw-r--r││/..                        │
└──────────────────────────┘└───────────────────────────┘
Совет: Вы можете выбрать редактор для F4 с помощью переме
[as@country ~/music/instrumental]$                    [^]
1п÷п╬п╪п2п°п╣п╫я3п÷я─п╬я4п÷я─п╟п5п п╬п©п6п÷п╣я─п7п²п╡п я┌
Но если сделать хитрый ход конём: ssh localhost и уже из-под этой сессии запускать mc — картина меняется:
  Левая панель     Файл     Команда     Настройки     Пр/
┌<─/usr/home/as/tmp──────v>┐┌<─...aertsky/1998 - Вымя─v>┐
│    Имя    │Разме│Атрибуты││    Имя   │Разме│Время прав│
│ xorg.conf │15406│-rw-rw-r││*01 - ~mp3│4439K│н  9  2000│
│ КОИ-8.txt │   23│-rw-r--r││*02 - ~mp3│4595K│н  9  2000│
├──────────────────────────┤├───────────────────────────┤
│ КОИ-8.txt │   23│-rw-r--r││*01 - Восьмое Марта.mp3    │
└──────────────────────────┘└───────────────────────────┘
Совет: Используйте C-x t для копирования помеченных файло
[as@country /usr/home/as/music/d/Laertsky/1998 -      [^]
1Помощь 2Меню   3Просмот4Правка 5Копия  6Перемес7НвКтлог
Осталось ещё ljklient научить музыку по-русски определять...
shoorick: (Default)
Видя бардак с кодировками ID3-тэгов и помня, что, по стандарту, там не может быть ни UTF-8, ни КОИ-8, нашёл радикальный, но вполне корректный путь: перегнать коллекцию из mp3 в ogg vorbis, где с тэгами нет такого бардака, ибо они всегда в UTF-8. Да и сжатие там получше. Да и формат этот открытый...

Поискал конвертер в портах при помощи make search и, не заметив его в толпе софта, стал писать свой: традиционно, на перле.

Метод — ленивый до безобразия: взять файл, прочитать свойства и тэги (MP3::Info), декодировать звук (mpg123), послав его кодировщику (oggenc), попутно передав тэги, переведённые из windows-1251. Итого — 99 строк, 2 кБ (вместе с развесистыми комментариями). Работает. И называется, чтоб долго не думать, mp32ogg.

А потом выясняется, что в портах уже есть mp32ogg. И делает он то же самое. И тем же самым путём.

Не знаю, может ли он кодировку тэгов менять (ещё не проверял), но это, в общем-то, и не важно, ибо в портах нашёлся mp3unicode.

ЗЫ Но вот железные MP3-плееры да музцентры с магнитолами нечасто ogg понимают...

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 28th, 2025 12:11 am
Powered by Dreamwidth Studios