Entries Tagged 'Решение проблем' ↓

Создание .enc файлов для XML::Parser

В дефолтной сборке XML::Parser’а отсутствует enc-файл для кодировки windows-1251. Поэтому XML::Parser ругается на XML-файлы, в начале которых указана кодировка windows-1251.

Как создать требуемый enc-файл для любой кодировки?

Очень просто.

  1. Идем на ftp://ftp.unicode.org/Public/MAPPINGS/ и находим требуемую кодировку. Для windows-1251 это будет ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT. Скачиваем этот файл.
  2. Устанавливаем (если ещё не установлен) модуль XML::Encoding.
  3. $ make_encmap windows-1251 CP1251.TXT >windows-1251.xml
  4. Открываем windows-1251.xml и редактируем первую строку. Дописываем свойство expat=’yes’.
  5. $ compile_encoding windows-1251.xml
  6. $ sudo cp windows-1251.enc /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi/XML/Parser/Encodings/ (в вашем случае путь может отличаться от моего)

Счастье есть: Proc::PID::File

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

Сегодня мне снова потребовалось обеспечить работу единственной копии скрипта (ну точнее трех разных скриптов, но это не важно), потому что решение программиста, который вроде бы сделал эту проверку через pid-файлы и Proc::ProcessTable, почему-то оказалось нерабочим.

Порылся в CPAN’е – и нашел: Proc::PID::File.

Использовать предельно просто:
use Proc::PID::File;
if ( my $pid = Proc::PID::File->running({dir=>'/opt/project/temp', verify=>1}) ) {
die 'Already running, pid='.$pid;
}

RT, Out of memory

Если RT-3.4.5 говорит “Out of memory”, то решается вот так:

dr_gonzo@gw rt-3.4.5 $ diff -u html/Elements/SetupSessionCookie \
/opt/rt3/share/html/Elements/SetupSessionCookie
--- html/Elements/SetupSessionCookie 2005-04-18 05:44:50.000000000 +0400
+++ /opt/rt3/share/html/Elements/SetupSessionCookie 2006-05-04 17:48:54.000000000 +0400
@@ -53,7 +53,7 @@
Pg => 'Apache::Session::Postgres',
# Oracle => 'Apache::Session::Oracle',
) unless $RT::WebSessionClass;
-my $session_class = $RT::WebSessionClass || $backends{$RT::DatabaseType} || 'Apache::Session::File';
+my $session_class = 'Apache::Session::File';
my $pm = "$session_class.pm"; $pm =~ s|::|/|g; require $pm;