2008-02-21
linux format forever!
Интерфейс управления подпиской достаточно толковый, требуется минимум телодвижений, даже если подписываться на юридическое лицо. В понедельник распечатал и отнес в бухгалтерию счет, а сегодня журналы уже притаранил СПСР с курьером. Красота!
2008-02-20
user там, user здесь...
2008-02-19
начальник, дай виртуалки, ну ДАЙ!
Если зайти через SSH, то ulimit -a покажет такую картину:
core file size (blocks, -c) 0
data seg size (kbytes, -d) 131072
file size (blocks, -f) 1048576
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) 65536
open files (-n) 128
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 16384
cpu time (seconds, -t) 600
max user processes (-u) 96
virtual memory (kbytes, -v) 196608
core file size (512-blocks, -c) 0
data seg size (kbytes, -d) 32768
file size (512-blocks, -f) 2097152
locked memory (kbytes, -l) 6144
max memory size (kbytes, -m) 65536
open files (-n) 32
stack size (kbytes, -s) 6144
cpu time (seconds, -t) 15
max user processes (-u) 64
virtual mem size (kbytes, -v) 65536
sbsize (bytes, -b) unlimited
2008-02-16
Swig It!
Вкратце:
- качаем wget-ом исходники в ~/distro,
- tar -xzf tarball.tar.gz -C ~/usr/local
- cd ~/src/swig-xxx и ./configure --prefix ~/usr/local
- make install
- export PATH=$PATH:/home/user1234/usr/local/bin
Некоторое удивление я испытал, запуская в домашнем каталоге make. Иногда он мне отвечает Permission denied. Перавя и естественная реакция - ls -la /usr/bin/make, дабы увидеть, что воистину +x. Потом начинаю перебирать дебаговые ключи -v, -dA: с каким-то из них make запускается. Понять, почему иногда я вижу Permission denied, не смог (где же ты, strace?).
Важные узелки на память:
- компилировать C с ключем -fPIC
- для создания .so использовать g++ -shared -o desination.so
- при запуске LD_LIBRARY_PATH должен указывать туда, где лежит .so
2008-02-14
Запустить скрипт Perl или умереть
И тут я задумался: как же все это будет запускаться на машине клиента, под Windows, где Perl-а и нет в помине?! Лицензия ActivePerl запрещает распространять его дистрибутив, да если даже это и делать - из пушки по муравьям (с). И начал я искать способ конвертнуть Perl-скрипт в .exe.
Как ни странно, в теории оказалось есть несколько способов:
В итоге... PerlApp - платный, надо качать PerlStudio PRO, крякать и т.п. Ну никак не соответствует духу свободного ПО. Perl2exe - мало того, что платный, так и еще и требует положить дохрена dll-ек из дистрибутива к себе (утомительная итерационная игра с сомнительным результатом). А PAR для ActivePerl не возможен - судя по странице успешных компиляций содержимого CPAN, pp просто не поддерживается на Windows, т.к. в этой сточке горит веселая надпись "failed". Что-то мне кажется, ActiveState лукавит: ну кто станет поддерживать бесплатное решение, которое конкурирует с их же собственным платным?!..
Короче... Решил все на С написать! Кстати, в рекомендации rfc1321 и исходничек есть. Правда, особенно разбираться, как правильно подключать C-исходник к C++ в MSVC я не стал, поправил md5.h по своему разумению.
А правильнее все-таки было бы с Perl-ом...
2008-02-08
1) Поправить TWiki.pm так, чтобы не генерировалось \n\n перед Content-Length
2) Не использовать для шифрования паролей crypt. Я выбрал md5.
3) Очень долго мучился с кодировками, помогло отрубание нафиг WSYWSIG плугина. Думаю, это никак с хостингом не связано.
Tab в Firefox-е
Вернулся, проверил еще раз. Точно, работает! Правда, он работает, как lookup в командном режиме vim.
Почему я раньше этого не замечал?..
2008-02-07
Многоязычность в TWiki
Плугин довольно примитивен, и там есть пара недочетов. Первый - не работает инсталляционный скрипт. С этим все просто - руками рассовываем файлы по каталогам, ставим пермишены. Вторая проблема посложнее: при выборе языка плугин опирается на переменную LANGUAGE, которая сохраняется в сессии. В отсутствие таковой будет установлен дефолтовый английский (lib/TWiki/Plugins/ForUserLanguagesPlugin.pm, sub initPlugin):
$ul = TWiki::Func::getSessionValue( 'LANGUAGE' ) || 'en';
Но ведь хочется-то, чтобы было сразу на том языке, который нам понятен! Представьте себе ситуацию: заходите вы на wiki, там все по-анлгицки. Но справа вверху язык уже выбран - русский! Для того, чтобы получить русский вывод от этого плагина, надо переключиться на любой другой язык и обратно. Толко тогда getSessionValue( 'LANGUAGE' ) вернет 'ru'.
И я задумался, как это сделать без промежуточной переадресации, поскольку что-то менять в TWiki-скриптах меня пугало. Я подумал, что логичнее всего прислушаться к браузеру (так делает и сам TWiki, когда выбирает язык интерфейса пользователя) и вот, что в итоге получилось:
my $lang_det = TWiki::Func::getSessionValue( 'LANGUAGE' );
unless ($lang_det) {
my $accept_language = $ENV{HTTP_ACCEPT_LANGUAGE};
if ( $accept_language =~ /^\w+$/ ) {
$lang_det = $accept_language;
}
if ( $accept_language =~ /^\*$/ ) {
$lang_det = 'en';
}
if ( $accept_language =~ /,/ ) {
($lang_det) = $accept_language =~ /^(\w+?)/;
}
unless ($lang_det) {
$lang_det = 'en';
}
}
$ul = $lang_det;
Конечно, это далеко от совершенства, но работает для MSIE7, Netscape Navigator 9, Firefox 2, Mozilla 1.7.x. Ну и если будете совершенствовать, загляните в RFC2616 :)
2008-02-01
При обращении к bin/view/TWiki/WebHome сервер упорно выдает ошибку HTTP 502/ Bad Gateway. При этом заголовки выглядят очень забавно: если вывод успешен, я вижу:
HTTP/1.1 200 OK
Date: Thu, 31 Jan 2008 12:55:38 GMT
Content-Type: text/html; charset=ISO-8859-1
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=5
Server: Apache
Cache-Control: max-age=0
Expires: Thu, 31 Jan 2008 12:55:36 GMT
А в случае ошибки -
HTTP/1.1 502 Bad Gateway
Server: nginx/0.5.18
Date: Thu, 31 Jan 2008 12:54:32 GMT
Content-Type: text/html
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=5
Особенно интересна строка заголовка Server... Погуглив, нашел, что это мегасервер ngnix, и видимо через него балансируется нагрузка на виртуальный хостинг на машине (там FreeBSD 6).
Я повторил запрос уже с консоли хостинга (lynx - незаменимый текстовый браузер! памятка: не забыть поставить памятник разработчикам и пристрелить тех, кто утверждал, что текстовый браузер - это глупость), и снова полюбовался на 502/Bad Gateway.
Сослаться на собственную тупость не могу: развернуть TWiki на домашней машине под Debian 4.0 заняло ровно 7 минут.
Написал в поддержку... Первым ответом у меня тактично поинтересовались, смотрел ли я error_log и где находится скрипт. Я пояснил, а дальше в ответ - тишина.
И только я собрался звонить и голосом озвучивать свою проблему (ибо прошло более 4 суток с момента моего второго письма), я, чтобы не выглядеть идиотом, решил на всякий случай проверить, существует ли глюк до сих пор. Оказалось - уже поправили! А на следующий день пришел ответ, такого содержания:
Приносим извинения за задержку с ответом.
Исправления должны быть таковы:
--- lib/TWiki.pm.orig Tue Feb 5 20:36:07 2008
+++ lib/TWiki.pm Tue Feb 5 20:49:33 2008
@@ -603,7 +603,7 @@
# - too 5.8 dependent
# my $len = do { use bytes; length( $text ); };
my $len = length($text);
- $hdr =~ s/\n$/Content-Length: $len\n\n/s if $len;
+ $hdr =~ s/^(.*?)$/Content-Length: $len\n$1/s if $len;
} else {
$hdr = '';
}
В принципе, круто. Дело в том, что я смотрел на \n\n перед строкой Content-Length, но... это работало под Debian и я подумал, что так и надо. А зря... \n\n отделяет заголовки от контента, и я это великолепно знал...
Короче, засчитываем 1 балл в пользу техподдержки Мастерхост.