пятница, 23 сентября 2011 г.

I bought a new Amazon Kindle 3g and thought I could read some Turkish clips in order to learn this language. But there are so many verbal forms and cases for both nouns and adjectives,  one could possibly say - as many as in our Russian tongue - and I soon found it really hard. Then I tried to search for inline Kindle Turkish-to-English dictionary in the net. There are some "online" ones and there are some "Windows" ones, but I was unhappy not to find a good mobi formatted one. I tried to make one then, and after some days - I succeded. 

First of all, I downloaded a Babylon setup and extracted the much needed BLG file. Then I used UnpackBLG.exe in wine to extract a TXT file - option Terms - Outside. This TXT was processed by two Perl scripts, one (A) removing empty lines and tab-delimiting them, and correctly stuffing UTF symbols instead of the bad ones from UnpackBLG.exe output, the other (B) one splitting Pipe-delimited verbal forms and cases into separate lines:


A:

$line1=~ s/\n/\t/g if ($line1 =~ /(.+)\n/);
$line1=~ s/þ/ÅŸ/g;#s cedilla, shekure
$line1=~ s/ý/ı/g;#i grave
$line1=~ s/ü/ü/g;#u dotted
$line1=~ s/ö/ö/g;#o dotted
$line1=~ s/ð/ÄŸ/g;#g capped
$line1=~ s/â/â/g;#a capped
$line1=~ s/ç/ç/g;#c cedilla, cocuk
$line1=~ s/Þ/ÅŸ/g;#s cedilla, shekure
$line1=~ s/Ý/Ä°/g;#i grave
$line1=~ s/Ü/Ãœ/g;#u dotted
$line1=~ s/Ö/Ö/g;#o dotted
$line1=~ s/Ð/ÄŸ/g;#g capped
$line1=~ s/Â/â/g;#a capped
$line1=~ s/Ç/Ç/g;#c cedilla, cocuk
$line1=~ s/é/é/g;#French e

B:

if ($line1 =~ /(.+) \| (.+)/) {
    my ($pipes, $meaning) = split('    ', $line1);
    my @list = split(' \| ',$pipes);

    my $counter = 0;
    foreach my $line (@list) {
        my $str = '';
        if(!$counter) {
            $str = $line.'    '.$meaning."\n";
        } else {
            $str = $line.'    '.$list[0]."\n";
        }
        $counter++;
        print OUTF $str unless ($str =~ /\//);
    }
} else {

    print OUTF $line1;
}

I manually removed a couple of trash lines that were infused by UnpackBLG, those that tab2opf.py couldn't swallow:

python tab2opf.py -utf turk.txt 2>&1>err

At last, I got an .opf file and 138x2Mb XML files to feed to mobigen:

wine mobigen/mobigen.exe turk.opf -unicode

The desktop 2-core, it took an hour rattling HDD and my fears of losing it, but finally - it worked, thank God.

Here is the 40MB zipped file - http://82.146.44.218/turk.zip


Put it directly to Kindle docs directory via USB (no conversion requred). Then choose it as primary dictionary for Turkish texts. You would usually need push the button twice - first, reducing form to infinitive, second, getting the meaning of it,  - it's the most handy way, I think.

By the way, you know how to clip web sites to your Kindle? Look where I clip Turkish newspapers for reading on my Kindle.

воскресенье, 24 апреля 2011 г.

семафор для пары серверов

Допустим, некий интернет-проект работает на паре независимых серверов у разных провайдеров с разными доменными именами, на одном из которых (медленном - slow) в корне через .htaccess идет редирект на второй (быстрый - fast).  [Именно так, к слову, обстоит дело с нашим теннисным клубом где fast  -  tennismatchmachine.com , а slow - motivation.ru .] Медленный каждые три часа забирает с быстрого снимок БД и заливает у себя. Каким образом, в случае отказа fast-сервера, slow-сервер надежно узнает об этом и отменит редирект? И как, когда потом восстановит его обратно? Решаем задачу:

A. На трех хостах, включая fast, кладем незамысловатый скриптик reply_self:

#!/usr/bin/perl

use CGI;
$query      = new CGI;
print $query->header;
my $me=`/bin/hostname`;
$chop($me);
my $addr=$ENV{'REMOTE_ADDR'};
print $me."!";
print $addr."\n";



B. А на slow каждую минутe запускаем нечто вроде :

#!/usr/bin/perl

my $tainted = 0;

my $tested_host = 'tennismatchmachine.com';
$test_host_url = 'http://'.$tested_host.'/scripts/reply_self';
my $first_link_ip = 'onnnemoreee.ru';
my $first_link_test_url = 'http://'.$first_link_ip.'/protected/reply_self';
my $second_link_ip = 'anotttheer.ru';
my $second_link_test_url = 'http://'.$second_link_ip.'/scripts/reply_self';

my $user = 'wget';
my $passwd = 'dumbasspassword';

local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required

&Connect(0);


unless ($tainted) {
    
    &Connect(1);
    unless ($tainted) {
        &Connect(2);
        unless ($tainted) {
            sleep(30);
            &Connect(0);
        }

    } else {
        sleep(30);
        &Connect(0);    
    }
}


if (!(-f './tmm_flag_down') && $tainted && $tainted ne '3') {
system("echo > ./tmm_flag_down");
system("date >> ./tmm_changed");
system("echo 'DOWN' >> ./tmm_changed");
system("echo '==============' >> ./tmm_changed");
system("./if_mail_tmm_changed.sh");
system("/bin/rm -f ./public_html/.htaccess");
system("cd public_html;/bin/ln -s ./.htaccess.home ./.htaccess;cd ..;");
} elsif (-f './tmm_flag_down' && $tainted eq '3') {
system("/bin/rm -f ./tmm_flag_down");
system("date >> ./tmm_changed");
system("echo 'UP' >> ./tmm_changed");
system("echo '==============' >> ./tmm_changed");
system("./if_mail_tmm_changed.sh");
system("/bin/rm -f ./public_html/.htaccess");
system("cd public_html;/bin/ln -s ./.htaccess.tmm ./.htaccess;cd ..;");
}


sub Connect {
my $p = shift;
my $test_url;

if ($p eq '0') {
    $test_url = $test_host_url;
} elsif ($p eq '1') {
    $test_url = $first_link_test_url;
} elsif ($p eq '2') {
    $test_url = $second_link_test_url;
}
 
my $wget_cmd = 'wget --timeout=5 --http-user '.$user.' --http-passwd '.$passwd.' -O - '.$test_url;
eval {
    
alarm 5;
system($wget_cmd.' 2>/dev/null 1>/dev/null');
open (IN, '-|', $wget_cmd.' 2>&1')
    or die ("Can't wget");

my $r = '';

   while (!eof(IN)) {
    my $q = readline (*IN);

        $q =~ /(\S+)!(\d+\.\d+\.\d+\.\d+)/;
    
    if ($1 && $r ne $1) {

        $r = $1;
        $tainted = ($1 =~ /^tennismatchmachine/) ? 3 : 4;
        last if ($tainted eq '3');
    
    }
   }

close (IN);

alarm 0;
};
} #end Connect

Voila!

вторник, 22 марта 2011 г.

Без Cisco делаем Server Pool

Простая и оригинальная схема, реализованная мной у клиентов.

A. Исходные:

Есть локальная сеть 25 рабочих станций (на схеме - "клиенты"), которые используют Linux-сервер (unix1) как шлюз в Сеть.

На этом боксе работают :
  • а) squid (прокси-сервер) - для брожения по Интернету; 
  • б) Cyrus IMAP - для складирования корпоративной почты; непосредственно из локальной сети (ЛС) он принимает почту от sendmail; с POP3 у провайдера почту ему периодически доставляет fetchmail
  • в) sendmail - для отправки почты из ЛС на relay-сервер провайдера, или на свой Cyrus (см. выше); 
  • г) cacheing DNS-сервер named - нужен и для squid, и для sendmail
  • д) HTTP-сервер apache - для возможности извне скачивать файлы со своего веб-узла; 
  • е) Samba-сервер,чтобы из ЛС можно было складировать файлы в папки apache.

Сервер unix1, а через него локальная сеть, соединяется с Интернетом через двух провайдеров:


Распределение трафика по каналам выполнено с помощью iptables/netfilter таким образом, чтобы ключевые сервисы ходили через более надежный, но дорогой кабельный канал, а трафик от squid и ёмкие внешние закачки - через неограниченный по объему трафика, но менее устойчивый и менее быстрый беспроводной канал. Для этого на unix1 задействованы два сетевых интерфейса - один (eth0) непосредственно соединяется с кабельным модемом, второй (eth1) через общий коммутатор ЛС - с Wimax устройством.

И вот, все это хозяйство успешно работает несколько лет, иногда правда случаются неприятности - то винчестер ахнет, то провайдер тихо умрет на неопределенный срок. Для минимизации неприятных последствий, от этого есть защита - полное резервное копирование жесткого диска с возможностью загрузки и работы со второго запасного диска, а также набор скриптов, которые смотрят круглосуточно через оба канала и переключают трафик в зависимости от доступности провайдеров.

Однако, нет пока защиты от полного выхода из строя сервера unix1!

Тут на ум приходят сами слова Server Pool - не для того, чтобы раскидать по кластеру огромный, но однообразный трафик, а для того, чтобы дублировать функции основного сервера и в случае его поломки немедленно восстановить все рабочие процессы.

B. Server Pool

Итак, закупаем необходимое железо и собираем в 1U-корпусе сервер-"дублер" unix2, после чего устанавливаем на него в точности то же самое ПО, которое работает на основном сервере. Но лучше сразу сообразить, какие адреса поставить на сетевых интерфейсах. Очевидно, нужно выбрать IP в тех же сегментах WAN и LAN, что и на основном сервере. Для этого в схему подключения добавляется простой хаб для микса обоих серверов unix1 и unix2 на входе кабельного модема.

Здесь конечно можно бы и остановиться - действительно, когда работают два одинаковых сервера (но с разными IP-адресами), в случае поломки основного всегда есть возможность за какое-то время перенести все функции на запасной сервер. Например, написать скрипт, который бы менял на unix2 IP адреса на те же, что были у поломанного unix1, затем перезагрузка и вроде бы все снова заработает. Однако, есть та проблема, что коммутатор держит у себя в памяти таблицу соответствия MAC-адресов, поэтому для реальной замены нужно будет еще и как-то перегрузить эту таблицу на коммутаторе (flush). Если коммутатор может выполнить эту процедуру удаленно, например, по SNMP, то и замечательно. Однако, в противном случае придется после замены IP еще и перезагружать коммутатор. Можно попробовать еще и MAС-адреса на unix2 изменить, но все равно у такой схемы достаточно много минусов - взять хотя бы синхронизацию серверов до и после переключения ! Это нетривиальная задача, если вдуматься.

Конечно, было бы неплохо подключить оба сервера через некоторое устройство, которое бы их мониторило и переключало трафик с основного на запасной, как это делается после Health Monotoring Probe на дорогих моделях Cisco Catalyst. Ведь тогда нам не придется менять адреса на запасном сервере. Если же такого устройства нет и менять адреса мы не хотим, тогда очевидно на всех рабочих станциях локальной сети после замены сервера пришлось бы переписать настройки браузеров, Outlook и т.п., что конечно тоже возможно, но крайне нежелательно.

Итак? Вперед в магазин за Cisco ..? 3000$ ??

Нет, для нашего случая достаточно 200$ - нужно купить небольшой load balancer (LB) на два WAN-выхода. Неважно, чтобы он сам переключал каналы - достаточно, чтобы это можно было сделать через веб-интерфейс администратора. Также добавим по третьей сетевой карте (eth2, 10.0.0.0) на оба сервера, если их там еще нет, но лучше сразу motherboard с тремя.

WAN-выходы с LB направим на эти дополнительные сетевые интерфейсы серверов - WAN1 -> unix1, WAN2 -> unix2. Соединим один из восьми входов LB с коммутатором ЛС и присвоим LB адрес из сегмента нашей ЛС.

Перепишем настройки на клиентах ЛС  - укажем как gateway адрес LB, а в качестве адреса прокси и почтового сервера - некоторый фиктивный IP адрес в сегменте  172.16.0.0, который на серверах пусть будет недостижим, но пакеты на который будет отлавливать netfilter и перенаправлять на свои порты:

$IPTABLES -A POSTROUTING -o eth1 -p tcp -m tcp -d 172.16.0.1 -j SNAT --to-source 192.168.4.201 -t nat
$IPTABLES -A PREROUTING -s 10.0.0.202 -i eth2 -p tcp -m tcp --dport 3128 -d 172.16.0.1 -j REDIRECT --to-ports 3128 -t nat
$IPTABLES -A PREROUTING -s 10.0.0.202 -i eth2 -p tcp -m tcp --dport 993 -d 172.16.0.1 -j REDIRECT --to-ports 993 -t nat
$IPTABLES -A PREROUTING -s 10.0.0.202 -i eth2 -p tcp -m tcp --dport 25 -d 172.16.0.1 -j REDIRECT --to-ports 25 -t nat


Теперь осталось запустить на unix2 скрипты, которые будут смотреть на unix1 через оба интерфейса eth0 и eth1 (таким образом выполняя health monitoring probe) и при обнаружении факта "падения"  основного сервера переключать wget-скриптом трафик через LB с WAN1 на WAN2.



среда, 2 марта 2011 г.

Filezilla and Co. - Обзор ПО для managed FTP под Линукс. D. Motivation File Browse

4. Motivation File Browse

Лицензия GPL
февраль 2011

программа является сокращенным вариантом GPL-релиза моей perl-программы tmm (http://sourceforge.net/projects/tclub). Для работы используется javascript-интерфейс; админы и клиенты видят разные окна одной программы, похожие, но с разными наборами функций. Например, админ может создать логин клиента, задать или изменить пароль.


В этой оригинальной программе у веб-пользователей совсем нет домашних каталогов, вместо них есть "тикеты" на закачку файлов, которые хранятся в базе данных. Таким образом, авторизовавшись на входе в программу, клиент видит таблицу своих тикетов. В каждом тикете указаны срок действия тикета, название файла, ссылка на старт закачки и комментарии создавшего тикет админа.

Контроль за файлами осуществляется через Samba; каких-то дополнительных функций по работе с файловой системой у самой программы не предусмотрено, кроме пожалуй, возможности автоматически  удалять временные файлы после из успешной закачки.

В качестве "рабочей" лошади http-сервера использован популярный GPL пакет perlball. Для хранения и обработки пользовательских данных используется СУБД PostgreSQL; для javascript- интерфейса - библиотеки Mootools.

Ниже приведен отчет о "боевых" сравнительных  испытаниях Motivation File Browse и GoAnywhere Services:

GoAnywhere Services vs. Motivation File Browse

1. Условия тестирования

Скачивался пробный файл (37 Mb), время скачивания на скорости 100 Kbyte/sec ~ 6 минут.

Во время скачивания я устраивал следующие "неприятности":

A. Выключал и снова включал интерфейс скачивания (ifconfig);
Б. Перезапускал сеть (network restart);
С. Включал/выключал запрет на пакеты на порт скачивания (iptables)

==============
1. GA Services имеет 2 интерфейса HTTPS:
 
a) Enhanced
b) Basic

Работа в интерфейсе Enhanced начинается с запуска Java-апплета. Апплет удачно стартует на моем браузере Firefox 3.6 с установленным обновлением Java, но только с первого запуска.
 
Попытки поменять интерфейс с Enhanced на Basic и обратно на Enhanced в браузере после запуска апплета почти всегда приводят к тому, что окно Enhanced-апплета повторно не появляется - требуется перезапуск браузера.

Кроме того, в Enhanced-интефейсе нельзя приостановить начатую загрузку, т.е. у апплета нет такой функции. Можно совсем отменить закачку, перегрузив апплет.


NB: После того, как закачка началась, обновление страницы браузера (т.е. перезапуск апплета) приводит к отмене загрузки !

Устойчивость к помехам - нулевая. Иначе говоря, любая из "неприятностей", указанных выше, убивает закачку и требует перезапуска апплета.

Интерфейс Basic не требует запуска Java-апплета и использует Firefox Download Manager, однако как указанные помехи, так и просто попытка приостановить закачку через функцию Download Manager убивает закачку. Похоже на то, что сервер не поддерживает Range-запросы.

=============
Моя программа:

Для скачивания используется Firefox Download Manager. Закачка может быть приостановлена и возобновлена в Download Manager без всяких проблем, в 100% случаев. Кроме того, только в одном случае (выключение  и повторное включение канала скачивания), и то в одном эпизоде, произошла отмена закачки; во всех остальных случаях устраиваемых "неприятностей" закачка успешно возобновлялась с того места, на котором была остановлена помехой.





четверг, 24 февраля 2011 г.

Filezilla and Co. - Обзор ПО для managed FTP под Линукс. C. GoAnywhere Services

3. GoAnywhere Services

http://www.goanywheremft.com/products/services
версия 2.0.2 (февраль 2011)

Цена: лицензия от 1495$
ОС: Linux, Windows, MacOS, AIX, HP-UX, Solaris

Данный пакет от фирмы Linoma Software (США) предлагается как отдельный модуль в интегральной корпоративной схеме, включающей также GoAnywhere Director и GoAnywhere Gateway. Это реализованный на Java интерфейс к собственным FTP/SFTP/HTTP/HTTPS серверам, идущим в пакете.  Предоставляется бесплатная 30-дневная лицензия.




Окно


Веб-интерфейс администратора выполнен как меню Java-апплетов, использующих Apache Tomcat. У программы приятный дизайн, присущий только Java. Tomcat идет вместе с пакетом, отдельно устанавливать его не нужно. Легкость инсталляции и продуманная начальная конфигурация характеризуют это ПО с лучшей стороны.

Пользователи

Ведется отдельный реестр для пользователей с правами администраторов и для Web-пользователей. Предусмотрен весь стандартный спектр конфигурации прав доступа. Редактирование настроек для Web-пользователей выполнено на высоком уровне. Очень неплохо реализован File Manager - механизм доставки в папки веб-пользователей файлов для закачки; пользователи с правами администраторов выкладывают файлы в папки веб-пользователей через функцию Upload.




Закачки

Логи закачек ведутся непрерывно, и есть возможность вернуться к логам всех предыдущих сессий, фильтровать логи по именам пользователей, их IP, именам файлов, а также по всем событиям протокола - логин, file transfer и т.д. Каждая строка-элемент таблицы логов раскрывается с выводом всевозможной информации о данном событии в журнале.

Резюме: отличная программа, использующая по максимуму преимущества Линукса и Unix-подобных систем.



Filezilla and Co. - Обзор ПО для managed FTP под Линукс. B. WingFTP

2. Wing FTP Server

http://www.wftpserver.com
версия 3.7.5 (23/Jan/2011)


Цена: от 1600$ за сайт на Linux с неограниченным числом клиентов
ОС: Windows, Linux, MacOS, Solaris

Окно

Итак, 30-дневная бесплатная лицензия для начала. Административный интерфейс вызывается через браузер (http://127.0.0.1:5466) Здесь есть поддержка 13(!) языков, но пока, к сожалению, нет русского. Интуитивный web-интерфейс - слева раскрывающиеся меню, справа окно, в котором можно, например, смотреть за логами закачек. Гладкий, чрезвычайно "отмытый" веб-интерфейс административной программы включает даже lua-консоль для любителей печатать скрипт-команды на этом языке.

Пользователи

Простой и одновременно объемный контроль за FTP-клиентами - имена, пароли, домашние каталоги, права - все это, конечно, есть, - и работает как надо. Сложная структура предлагается в настройках IP и файловых масок, времени доступа к сервисам. Для удобства, реализованы домены как структурный элемент доступа к ресурсам.


Закачки

Логи закачек можно просматривать в текущей сессии сервера, т. е. , например, не нашел я здесь способа смотреть, как и что качал вчера. Вручную, конечно, можно отыскать нужный лог. Однако, специфика некоторых проектов предполагает масштабируемый поиск по логам с фильтрацией по именам файлов, пользователей и т. п. Все это удобно делать прямо в рабочем окне админа, если такая возможность предусмотрена.

Резюме: очень продвинутая программа для контроля за пользователями предоставляемых FTP и HTTP ресурсов; несомненно, уровень сложности настроек значительно выше, чем у Filezilla, что, однако, может в какой-то степени и "отпугнуть".




среда, 23 февраля 2011 г.

Filezilla and Co. - Обзор ПО для managed FTP под Линукс. A. Filezilla

1. Filezilla Server

Цена: 0$ (лицензия GPL, поставляется с открытым кодом, компилируется средствами разработки для Windows)
ОС: Windows (Linux под Wine)

Очень легкий пакет для инсталляции под Линукс - запускается:
wine /home/alex/FileZilla_Server-0_9_37.exe и далее без остановок по всем пунктам до желаемого результата:


Окно

Сервер на 21-ом и административный интерфейс запускаются раздельно как .exe файлы; в окне интерфейса отражаются обычный FTP-лог, а также состояние текущих закачек (в нижнем фрейме окна).

Пользователи

Создать аккаунт FTP пользователя  и/или изменить пароль, группу очень просто.


Закачки

К сожалению, нет возможности устанавливать временные ограничения и иные атрибуты для предлагаемых к закачке файлов. Кроме того, в административном окне просмотр логов весьма ограничен и нет фильтрации.

Резюме: достойная программа, в большинстве случаев подходит для легких и средних FTP-проектов, не требующих каких-то особенных функций контроля за качками.