<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-43636803824802894</id><updated>2011-11-12T16:17:26.472+04:00</updated><category term='flaphone'/><category term='annoyances'/><category term='атака'/><category term='GSM'/><category term='мысли'/><category term='yate'/><category term='freeSWITCH'/><category term='postgresql'/><category term='robots.txt'/><category term='virtualdub'/><category term='продвижение'/><category term='red5phone'/><category term='индексация'/><category term='avisynth'/><category term='wine'/><category term='red5'/><category term='asterisk'/><category term='batch files'/><category term='онлайн'/><category term='маркетинг'/><category term='VDS'/><category term='openfire'/><category term='Mac'/><category term='debian'/><category term='voice recognition'/><category term='marketing'/><category term='video'/><category term='in focus'/><category term='бизнес'/><category term='виртуализация'/><category term='replication'/><category term='database'/><title type='text'>IT &amp; Telecom stuff</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-7065893470175951488</id><published>2011-07-26T01:17:00.005+04:00</published><updated>2011-07-26T01:34:09.217+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='индексация'/><category scheme='http://www.blogger.com/atom/ns#' term='robots.txt'/><title type='text'>Как защитить данные от индексирования</title><content type='html'>В интернете появляется все больше и больше случаев, когда личные данные пользователей оказываются проиндексированными поисковиками. В поисковые запросы попадают данные об почтовом адресе, о совершенных покупках в интернет-магазинах и прочие данные, которые предназначались только для данного человека (например, в разделе "статус заказа" в интернет-магазине).&lt;br /&gt;&lt;br /&gt;Анализ проблемы показывает, что правильный robots.txt может НЕ СПАСТИ ситуацию, несмотря на все заверения пресс-службы Яндекса о том, что во всем виноват только отсутствующий файл robots.txt.&lt;br /&gt;&lt;br /&gt;На самом деле проблема гораздо глубже. Вот типичный пример: интернет-магазин, на котором всю работу выполняет ОДИН единственный PHP скрипт, который, при запуске с разными параметрами, генерирует разные страницы сайта:&lt;br /&gt;&lt;br /&gt;мойсайт.ру/index.php - главная страница интернет-магазина&lt;br /&gt;мойсайт.ру/index.php?page=about - "страница" о компании&lt;br /&gt;мойсайт.ру/index.php?page=cart&amp;amp;user=pupkin - страница с покупками для пользователя Pupkin.&lt;br /&gt;&lt;br /&gt;Как видите, всё содержание сайт генерирует динамически, по информации из своей базы данных и по коду на PHP - и в этом случае глупая запись&lt;br /&gt;Disallow: /cgi-bin/&lt;br /&gt;&lt;br /&gt;конечно же не поможет, поскольку такого каталога нет на сайте, или в нем ничего не хранится и так.&lt;br /&gt;&lt;br /&gt;Ситуацию может спасти такая запись в robots.txt:&lt;br /&gt;&lt;blockquote&gt;Disallow: /index.php?page=cart&lt;/blockquote&gt;но не на долго, потому что если я поменяю порядок параметров в запросе:&lt;br /&gt;&lt;br /&gt;мойсайт.ру/index.php?user=pupkin&amp;amp;page=cart&lt;br /&gt;&lt;br /&gt;то этот адрес уже не попадет в список запретных для поискового робота.&lt;br /&gt;&lt;br /&gt;Самым правильным решением с ложившейся ситуации, на мой взгляд, является разбитие одного PHP скрипта на два: в одном производится работа с общедоступными данными, а второй предназначен исключительно для отображения статуса заказа.&lt;br /&gt;Назвав этот скрипт как mycart.php, мы можем запретить индексировать этот скрипт с любыми вариациями параметров к нему:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Disallow: /mycart.php&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-7065893470175951488?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/7065893470175951488/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7065893470175951488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7065893470175951488'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/07/blog-post.html' title='Как защитить данные от индексирования'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-4108552233293679656</id><published>2011-04-30T22:43:00.005+04:00</published><updated>2011-05-11T20:48:10.268+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><category scheme='http://www.blogger.com/atom/ns#' term='атака'/><title type='text'>Атака на FreeSWITCH закончилась</title><content type='html'>Уфф... DOS атака на мой сервер закончилась. Вот какой траффик порождала атака сегодня:&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/-u18rFoO3zEs/TbxYhxjlzJI/AAAAAAAAAN4/oFPyqRBtx58/s1600/traffic2.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Это уже после того, как я активировал iptables, соответственно мы видим, что исходящий трафик практически нулевой - мой телефонный сервер не отвечал на эту атаку, потому что до него запросы не доходили.&lt;br /&gt;&lt;br /&gt;Суммарно на мой сервер было отправлено 2475 Mb данных, атака длилась 30 часов. Сервер выдержал.&lt;br /&gt;&lt;br /&gt;Смотря внимательно на данные, которые &lt;a href="http://danxee.blogspot.com/2011/04/blog-post_29.html"&gt;отправляли&lt;/a&gt; хакеры на мой сервер, мы видим, что они в SIP пакетах использовали прокси (поле VIA), в результате телефонный сервер слал ответ не на сервер хакеров, а на другой сервер, таким образом мой собственный сервер выступал в роли хакерского сайта, долбящего пакетами совершенно невинный сервер! Пока я не заметил атаку, мой сервер успел отправить на невинную жертву 1 Гб данных! Сервер этот, кстати, был сайтом по нелегальному заработку - они предлагали отдать им деньги и зарабатывать 1% в день.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Причина атаки&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Я считаю, что атака была направлена не на меня, а на тот самый сайт по мошенническому заработку в сети, адрес которого стоит в поле VIA. Такой изощренный метод атаки, когда хакеры заставляют другие сайты атаковать на их жертвы.&lt;br /&gt;Возможно, этот сайт кого-то кинул на деньги, и его решили таким образом за'DDoS'ить.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Выводы&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;В результате всего этого я сделал для себя неожиданные открытия. Посмотрев другие логи на сервере в папке /var/log(sshd.log, apache2/error_log, messages, warn), я заметил, что мой сайт уже неоднократно пытались хакать! Были попытки подобрать пароль и имя пользователя при логине по SSH, были попытки произвести взлом через дыру в веб-сервере (&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;"client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23)"&lt;/span&gt;&lt;/span&gt;) - дыры не было, но я узнал про такой способ атаки.&lt;br /&gt;В результате тепеь у меня на сервере работает fail2ban с несколькими "тюрьмами", которые ловят и сажают в тюрьму злоумышленников, атакующих SSH, SIP, HTTP. Это уже лучше, чем быть совсем беззащитным перед атаками.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPD&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Атака, как оказалось, закончилась только на пару часов и продолжилась с новой силой в мае. Сегодня, 11-го мая, атака, по-видимому, окончательно прекратилась:&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/-0JRvec4fgxA/Tcq8fJYdRmI/AAAAAAAAAOI/cLoQJvntYaM/s1600/traffic3.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Суммарно хакеры нагнали мне траффика 21,1 Гб (!).&lt;br /&gt;&lt;br /&gt;Причиной атаки, как я уже понимаю, скорее всего стала цель получить доступ к моему телефонному серверу. Хакеры надеялись, что, получив доступ, они смогут делать бесплатные (т.е. за мой счет) телефонные звонки. Наивные.&lt;br /&gt;&lt;br /&gt;Сегодня моя защита на основе fail2ban поймала еще одну попытку взломать телефонный сервер - эта попытка была сразу же пресечена. Думаю подействует и очередной brute force атаки не будет, поскольку мой сервер перестал существовать в сети для атакующих и нет смысла делать атаку :)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-4108552233293679656?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/4108552233293679656/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/04/freeswitch.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/4108552233293679656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/4108552233293679656'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/04/freeswitch.html' title='Атака на FreeSWITCH закончилась'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-u18rFoO3zEs/TbxYhxjlzJI/AAAAAAAAAN4/oFPyqRBtx58/s72-c/traffic2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-1575692353143344896</id><published>2011-04-29T23:54:00.011+04:00</published><updated>2011-04-30T02:39:46.990+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><category scheme='http://www.blogger.com/atom/ns#' term='атака'/><title type='text'>Ну вот и первый хак</title><content type='html'>Меня можно поздравить, я вживую повстречался с хакерской атакой, направленной на подбор логина и пароля к моему телефонному серверу freeSwitch. Вот как это выглядит:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/-Qm9ApFAzGgI/TbsYMjBKu6I/AAAAAAAAANw/NuhARfAnWk0/s1600/traffic.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;За 10 часов атаки суммарно получается 670Мб входящего траффика и 1 Гб исходящего.&lt;br /&gt;&lt;br /&gt;Смотрим логи:&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;/usr/local/freeswitch/log # ll freeswitch.log.*&lt;br /&gt;-rw----r-- 1 root root   815562 Apr  2 03:07 freeswitch.log.2011-04-02-03-07-07.1&lt;br /&gt;-rw----r-- 1 root root      190 Apr  2 03:07 freeswitch.log.2011-04-02-03-07-07.2&lt;br /&gt;-rw----r-- 1 root root 10485904 Apr 29 15:13 freeswitch.log.2011-04-29-15-13-18.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 15:44 freeswitch.log.2011-04-29-15-44-41.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 16:12 freeswitch.log.2011-04-29-16-12-55.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 16:33 freeswitch.log.2011-04-29-16-33-08.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 16:53 freeswitch.log.2011-04-29-16-53-30.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 17:16 freeswitch.log.2011-04-29-17-16-00.1&lt;br /&gt;-rw----r-- 1 root root 10485835 Apr 29 17:39 freeswitch.log.2011-04-29-17-39-05.1&lt;br /&gt;-rw----r-- 1 root root 10485835 Apr 29 18:00 freeswitch.log.2011-04-29-18-00-45.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 18:21 freeswitch.log.2011-04-29-18-21-57.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 18:42 freeswitch.log.2011-04-29-18-42-27.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 19:03 freeswitch.log.2011-04-29-19-03-20.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 19:23 freeswitch.log.2011-04-29-19-23-07.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 19:41 freeswitch.log.2011-04-29-19-41-55.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 20:01 freeswitch.log.2011-04-29-20-01-10.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 20:19 freeswitch.log.2011-04-29-20-19-27.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 20:37 freeswitch.log.2011-04-29-20-37-57.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 20:57 freeswitch.log.2011-04-29-20-57-18.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 21:21 freeswitch.log.2011-04-29-21-21-10.1&lt;br /&gt;-rw----r-- 1 root root 10485899 Apr 29 21:39 freeswitch.log.2011-04-29-21-39-17.1&lt;br /&gt;-rw----r-- 1 root root  6906631 Apr 29 22:58 freeswitch.log.2011-04-29-22-58-56.1&lt;br /&gt;-rw----r-- 1 root root       71 Apr 29 22:58 freeswitch.log.2011-04-29-22-58-56.2&lt;br /&gt;/usr/local/freeswitch/log #&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вот как началась атака:&lt;br /&gt;&lt;span style="font-size:78%;"&gt;2011-04-29 06:41:38.351078 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [1610258589@myserverip] from ip 66.199.232.98&lt;br /&gt;2011-04-29 06:46:09.164120 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [3623987258@myserverip] from ip 66.199.232.98&lt;br /&gt;2011-04-29 14:39:42.604125 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [2917801763@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:42.616121 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [1882527475@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.139079 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [china@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.159069 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [koreea@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.170114 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [korea@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.179114 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [japan@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.343117 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [taiwan@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.350107 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [000000@myserverip] from ip 91.220.62.140&lt;br /&gt;2011-04-29 14:39:43.363118 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [00000000@myserverip] from ip 91.220.62.140&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;и дальше пошел перебор всех возможных цифровых и буквенных номеров SIP телефонов. На момент обнаружения мной этой атаки хакеры перебрали 1,3 млн. комбинаций!&lt;br /&gt;&lt;br /&gt;Пришлось в срочном порядке добавлять правило в iptables:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;iptables -I INPUT -s 91.220.62.140 -j DROP&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Это спасло.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Похоже, это DOS атака. Детали атаки такие (здесь IP адрес моего сервера замнен на &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;myserverip&lt;/span&gt;&lt;/span&gt; на всякий случай):&lt;br /&gt;&lt;br /&gt;FreeSWITCH получает пакет:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;REGISTER sip:myserverip SIP/2.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Via: SIP/2.0/UDP 91.220.62.36:5137;branch=z9hG4bK-1132046786;rport&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Content-Length: 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   From: "5988" &lt;/span&gt;&lt;/span&gt;&lt;sip:5988@myserverip&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Accept: application/sdp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   User-Agent: friendly-scanner&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   To: "5988" &lt;/span&gt;&lt;/span&gt;&lt;sip:5988@myserverip&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Contact: sip:123@1.1.1.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   CSeq: 1 REGISTER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Call-ID: 1008625951&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Max-Forwards: 70&lt;/span&gt;&lt;/span&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;FreeSWITCH ругается:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;2011-04-30 01:28:44.511139 [WARNING] sofia_reg.c:1246 SIP auth challenge (REGISTER) on sofia profile 'internal' for [5988@myserverip] from ip 91.220.62.140&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/blockquote&gt;&lt;br /&gt;FreeSWITCH отправляет ответ на хакерский сайт:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;SIP/2.0 401 Unauthorized&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;   Via: SIP/2.0/UDP 91.220.62.36:5137;branch=z9hG4bK-1132046786;rport=5137;received=91.220.62.140&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;   From: "5988" &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;sip:5988@myserverip&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   To: "5988" &lt;/span&gt;&lt;sip:5988@myserverip&gt;&lt;span style="font-family:courier new;"&gt;;tag=g0BXD9pv6mjBe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Call-ID: 1008625951&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   CSeq: 1 REGISTER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   User-Agent: FreeSWITCH-mod_sofia/1.0.head-git-e52e44e 2011-03-31 13-44-24 -0500&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, UPDATE, INFO, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Supported: timer, precondition, path, replaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   WWW-Authenticate: Digest realm="myserverip", nonce="a9360d6c-72a7-11e0-b622-f7c8239c6915", algorithm=MD5, qop="auth"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Content-Length: 0&lt;/span&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;br /&gt;Нашел замечательную утилиту &lt;a href="http://wiki.freeswitch.org/wiki/Fail2ban"&gt;fail2ban&lt;/a&gt;, чтобы в будущем рубить хакеров на корню.&lt;br /&gt;&lt;br /&gt;Настройка простая:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;zypper in fail2ban&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Создаем файл /etc/fail2ban/filter.d/freeswitch.conf&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;# Fail2Ban configuration file&lt;br /&gt;[Definition]&lt;br /&gt;failregex = .* SIP auth challenge .* from ip &lt;/span&gt;&amp;lt;HOST&amp;gt;&lt;span style="font-size:85%;"&gt;&lt;host&gt;&lt;br /&gt;ignoreregex =&lt;/host&gt;&lt;/span&gt;&lt;/host&gt;&lt;/blockquote&gt;&lt;host&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;Дописываем вот этот кусок в конец файла /etc/fail2ban/jail.conf&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;[freeswitch]&lt;br /&gt;enabled = true&lt;br /&gt;port = 5060,5061,5080,5081&lt;br /&gt;protocol = udp&lt;br /&gt;filter = freeswitch&lt;br /&gt;logpath = /usr/local/freeswitch/log/freeswitch.log&lt;br /&gt;action = iptables-allports[name=freeswitch, protocol=all]&lt;br /&gt;maxretry = 3&lt;br /&gt;findtime = 600&lt;br /&gt;bantime  = 18000&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Запускаем&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;blockquote&gt;/etc/init.d/fail2ban restart&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;И наслаждаемся результатом:&lt;br /&gt;Сюда будут добавляться заблокированные хосты:&lt;br /&gt;&lt;/host&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    /usr/local/freeswitch/conf # &lt;span style="font-weight: bold;"&gt;iptables -L fail2ban-freeswitch&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Chain fail2ban-freeswitch (1 references)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    target prot opt source destination&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    DROP all -- 91.220.62.140 anywhere&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    RETURN all -- anywhere anywhere&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    /usr/local/freeswitch/conf # &lt;span style="font-weight: bold;"&gt;cat /var/log/fail2ban.log&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,580 fail2ban.filter : DEBUG Found 91.220.62.140&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,581 fail2ban.filter : DEBUG Found 91.220.62.140&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,581 fail2ban.filter.datedetector: DEBUG Sorting the template list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,583 fail2ban.actions.action: DEBUG iptables -N fail2ban-freeswitch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    iptables -A fail2ban-freeswitch -j RETURN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    iptables -I INPUT -p all -j fail2ban-freeswitch returned successfully&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,583 fail2ban.actions.action: DEBUG iptables -n -L INPUT | grep -q fail2ban-freeswitch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,587 fail2ban.actions.action: DEBUG iptables -n -L INPUT | grep -q fail2ban-freeswitch returned successfully&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,587 fail2ban.actions.action: DEBUG iptables -I fail2ban-freeswitch 1 -s 91.220.62.140 -j DROP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,590 fail2ban.actions.action: DEBUG iptables -I fail2ban-freeswitch 1 -s 91.220.62.140 -j DROP returned successfully&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    2011-04-30 02:27:19,590 fail2ban.actions: WARNING [freeswitch] 91.220.62.140 already banned&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;&lt;sip:5988@myserverip&gt;Ура :)&lt;br /&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;/sip:5988@myserverip&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-1575692353143344896?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/1575692353143344896/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/04/blog-post_29.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1575692353143344896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1575692353143344896'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/04/blog-post_29.html' title='Ну вот и первый хак'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Qm9ApFAzGgI/TbsYMjBKu6I/AAAAAAAAANw/NuhARfAnWk0/s72-c/traffic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-5900428283722248749</id><published>2011-04-26T17:32:00.003+04:00</published><updated>2011-04-26T18:05:10.223+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='бизнес'/><category scheme='http://www.blogger.com/atom/ns#' term='маркетинг'/><category scheme='http://www.blogger.com/atom/ns#' term='продвижение'/><category scheme='http://www.blogger.com/atom/ns#' term='онлайн'/><title type='text'>Оффлайн бизнес должен идти в онлайн</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Описание проблемы&lt;/span&gt;&lt;br /&gt;Сейчас ни для кого не секрет, что успех своего малого бизнеса зависит не только от качества предоставляемых услуг, но и от того, насколько умело оффлайн бизнес интегрируется в онлайн, туда, где есть платежеспособные клиенты.&lt;br /&gt;&lt;br /&gt;В онлайне сейчас находится достаточно большое число ваших потенциальных клиентов, в связи с широким распространением интернета в домах и на телефонах обывателей. В то же время, рынок традиционных средств продвижения продукта или услуги сокращается. Скажите, вы когда-либо слышали по телевизору, читали в газете или видели на дорожном биллборде информацию о том, что ИП Пупкин на Сормовском шоссе предлагает скидку 50% на шиномонтаж?  Или то, что в подвальчике на Нартова открылось новое ателье по пошиву брюк на заказ? Названия выдуманные, но смысл нет: малому бизнесу зачастую не под силу организовать для себя хорошую оффлайновую рекламную кампанию, и в результате эти начинающие предприниматели ограничиваются простым: распечатыванием объявления "скидка 50%" на листе А4 на входной двери в предприятие, и публикацией рекламного сообщения в бесплатной рекламной газетенке, которую все равно никто не читает.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Трудности перехода&lt;/span&gt;&lt;br /&gt;Трудности, на мой взгляд, связвны с тем, что начинающие предприниматели, по натуре своей, находятся далеко от высоких интерент-технологий. Они этому нигде не учились, среди их знакомых - таких же ИПшников - никто так не делает, поэтому они ориентируются исключительно на "проходимость" места - т.е. на пассивную роль: авось кто-нибудь, проходя мимо нашего ателье/шиномонтажа, разглядит на нашей двери листочек с объявлением что "мы открылись" и с графиком работы. Авось ему как раз нужно будет пошить брюки или совершенно случайно потенциальный клиент будет на машине на зимней резине в апреле, и заедет к нам на шиномонтаж.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Пути решения проблемы&lt;/span&gt;&lt;br /&gt;Выход состоит в более тесной интеграции бизнеса с онлайн технологиями. Этот процесс начинается. Хотя Россия, как всегда, сильно отстает от запада, я уверен, будет и на нашей улице праздник, придет время, когда все будут онлайн.&lt;br /&gt;Я наблюдаю начало этой тенденции на примере фотографов, которые не только, как по старинке, публикуют свои фотографии на специализированных фото-сайтах, но и начинают пользоваться livejournal и вконтакте для раскрутки своего бренда, для привлечения на свою страничку в интернете потенциальных клиентов через распространение ссылки на ресурс довольными клиентами. Такие потуги кажутся наивными, поскольку технология "блог" известна уже лет эдак 10, а фотографы еще не научились писать правильные тексты в своем блоге, для повышения своего рейтинга в поисковых системах, не говоря уж о подключении к блоку аналитики.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Технологии, за которыми будущее&lt;/span&gt;&lt;br /&gt;Что нас ожидает в ближайшие пару лет? Более тесная "социализация", т.е. проникновение социальных сетей во все сферы жизни. Уход от персональных компьютеров, замена их сотовыми телефонами и коммуникаторами со встроенным веб-браузером. Компьютеры, и ноутбуки - это прошлый век, и нужны они только программистам. Все компьютеры опять превратятся в гигантских супермощных монстров и перетекут в дата-центры (облака), оставив у обывателей только "остатки" компьютерных технологий вроде телевизора с браузером, медиаплеера с торрент-клиентом, читалки книг с mp3-плеером, фотоаппарата со встроенной функцией редактирования фото/видео.&lt;br /&gt;&lt;br /&gt;Этим постом я открываю цикл статей на эту тему.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-5900428283722248749?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/5900428283722248749/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5900428283722248749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5900428283722248749'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/04/blog-post.html' title='Оффлайн бизнес должен идти в онлайн'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-4894137358982394951</id><published>2011-04-22T17:25:00.007+04:00</published><updated>2011-04-23T00:47:38.488+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Репликация базы данных PostgreSQL на основе SymmetricDS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr valign="top"&gt; &lt;td&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_SF5FFIwKIH0/TSwigXqiZ5I/AAAAAAAAAFU/CxkasZ33WRw/s200/logopg701-300x237.gif" border="0" width="200" height="157" /&gt;&lt;/td&gt;  &lt;td&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:x-large;"&gt;+ &lt;/span&gt;&lt;/b&gt;&lt;img src="http://symmetricds.codehaus.org/images/logos/SymmetricDS-Site.png" border="0" width="320" height="55" /&gt;&lt;br /&gt;&lt;br /&gt;В этой статье я расскажу, как настроить репликацию баз данных  PostgreSQL. Что такое репликация? По сути, это механизм автоматической  синхронизации содержимого баз данных, работающих на разных серверах.&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;В  результате репликации эти базы данных содержат абсолютно идентичные  данные. Это нужно например для того, чтобы обеспечить отказоустойчивость  системы (в случае падения первого сервера баз данных в работу вступает  второй), или чтобы осуществить балансировку нагрузки - разных клиентов  могут обслуживать разные сервера.&lt;br /&gt;Для экспериментов будем использовать дистрибутив линукса CentOS 5.3, хотя это не принципиально. Версия PostgreSQL, используемая в статье: 8.4.7. Она еще не умеет сама реплицироваться - это фича 9-й версии постгреса.&lt;br /&gt;&lt;br /&gt;Для репликации нужно как минимум два сервера баз данных, поэтому готовим два одинаковых сервера с базой данных PostgreSQL на каждом. У первого будет IP адрес 10.0.2.20, у второго - 10.0.2.21, у обоих гейтвей 10.0.2.2.&lt;br /&gt;Можно обойтись виртуальной машиной, например VirtualBox, создать в ней два виртуальных сервера и запустить их на своем собственном компе.&lt;br /&gt;&lt;br /&gt;В приведенных командах первым символом будет стоять знак # либо $, эти знаки означают, что команда запускается из-под root или из-под обычного пользователя, соответственно.&lt;br /&gt;Итак, какие действия нужно предпринять:&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Включаем сервис postgresql, если он еще не включен:&lt;br /&gt;&lt;pre class="programlisting"&gt;# chkconfig --level 3 postgresql on&lt;br /&gt;# service postgresql start&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь нам нужно создать базу данных. Создать ее "в лоб" не получится:&lt;br /&gt;&lt;pre class="programlisting"&gt;# createdb mytest&lt;/pre&gt;&lt;br /&gt;psql: FATAL: user "root" does not exist&lt;br /&gt;&lt;br /&gt;тут нужно создать роль в постгресе для линуксовского юзера. Создадим суперюзера в постгресе с логином "sa" и линуксовского пользователя с таким же именем, пароль будет тот же, "sa".&lt;br /&gt;&lt;pre class="programlisting"&gt;# adduser -m sa&lt;br /&gt;&lt;br /&gt;# su - postgres&lt;br /&gt;$ createuser -d -s -P sa&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;теперь можно создать таблицу "test", инициировав команду из-под юзера "sa":&lt;br /&gt;&lt;pre class="programlisting"&gt;# su - sa&lt;br /&gt;$ createdb mytest&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;теперь можно пользоваться утилитой psql:&lt;br /&gt;&lt;pre class="programlisting"&gt;psql mytest&lt;/pre&gt;&lt;br /&gt;Выход из этой утилиты осуществляется набором двух символов \q&lt;br /&gt;&lt;br /&gt;Ну что, теперь пора приступить к самой интересной части работы. Перед тем, как продолжить, убедимся, что у нас одновременно работают два сервера с работающим сервером баз данных postgreSQL на каждом.&lt;br /&gt;Сервера должны пинговать друг друга, потому что SymmetricDS использует HTTP протокол для синхронизации. Порты 8080 и 9090 на серверах не должны быть заблокированы фаерволлом.&lt;br /&gt;&lt;br /&gt;ОК. Для работы SymmetricDS нужен интерпретатор java и сама JRE 1.6, поэтому устанавливаем их на сервера, если это еще не было сделано:&lt;br /&gt;скачиваем с сайта java.com инсталлятор jre-6u24-linux, устанавливаем его (достаточно просто запустить этот файл),&lt;br /&gt;настраиваем символическую ссылку (если она по какой-то причине не создалась):&lt;br /&gt;&lt;pre class="programlisting"&gt;# ln -s /usr/java/latest/bin/java /usr/bin/java&lt;/pre&gt;&lt;br /&gt;и прописываем в командной строке путь к классам - без них SymmetricDS упадет с ошибкой что класс не найден.&lt;br /&gt;&lt;pre class="programlisting"&gt;$ CLASSPATH=/usr/java/latest/lib; export CLASSPATH&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Чтобы sym (главный исполнимый файл Symmetric DS) работал, также необходимо указать серверу БД, чтобы он слушал на внешнем сетевом интерфейсе (а не только на localhost) и чтобы он пускал юниксовских юзеров к себе. Это делается так, на каждом из наших двух серверов:&lt;br /&gt;1) раскомментировать эту строку в /var/lib/pgsql/data/postgresql.conf:&lt;br /&gt;&lt;pre class="programlisting"&gt;listen_addresses = '*'&lt;/pre&gt;&lt;br /&gt;2) указать метод trust для всех соединений в /var/lib/pgsql/data/pg_hba.conf:&lt;br /&gt;&lt;pre class="programlisting"&gt;local all all trust&lt;br /&gt;host all all 127.0.0.1/32 trust&lt;br /&gt;host all all ::1/128 trust&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3) Для поддержки переменных сессии в файл /var/lib/pgsql/data/postgresql.conf добавить строчку:&lt;br /&gt;&lt;pre class="programlisting"&gt;custom_variable_classes = 'symmetric'&lt;/pre&gt;&lt;br /&gt;4) перезапустить сервер БД:&lt;br /&gt;&lt;pre class="programlisting"&gt;# service postgresql restart&lt;/pre&gt;&lt;br /&gt;Проверить, что это работает, можно так:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql mytest -U sa -h localhost&lt;/pre&gt;&lt;br /&gt;Такого сообщения об ошибке быть не должно: psql: FATAL: Ident authentication failed for user "sa".&lt;br /&gt;Вместо этого должен открыться psql, как обычно.&lt;br /&gt;&lt;br /&gt;Далее.&lt;br /&gt;Теперь качаем собственно &lt;a href="http://sourceforge.net/projects/symmetricds/files/symmetricds/symmetricds-2.2/symmetric-ds-2.2.2-server.zip/download"&gt;SymmetricDS-2.2.2&lt;/a&gt;  и распаковываем на оба сервера:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ unzip symmetric-ds-2.2.2-server.zip&lt;br /&gt;$ cd symmetric-ds-2.2.2/samples&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Редактируем файлы root.properties и client.properties, которые лежат в этом каталоге samples. В них нужно раскомментировать строчки для  postgresql,  закомментировав или удалив другие варианты, и указать логин и пароль к базе (у нас  это sa).&lt;br /&gt;root.properties нужен только на первой ноде, client.properties - только на второй.&lt;br /&gt;Начнем по-порядку. Сначала делаем работы на первой ноде. Формиреум такой файл root.properties:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;root.properties&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:x-small;"&gt;# The class name for the JDBC Driver&lt;br /&gt;db.driver=org.postgresql.Driver&lt;br /&gt;&lt;br /&gt;# The JDBC URL used to connect to the database&lt;br /&gt;db.url=jdbc:postgresql://localhost/mytest&lt;br /&gt;&lt;br /&gt;# The user to login as who can create and update tables&lt;br /&gt;db.user=sa&lt;br /&gt;# The password for the user to login as&lt;br /&gt;db.password=sa&lt;br /&gt;registration.url=http://10.0.2.20:8080/sync&lt;br /&gt;sync.url=http://10.0.2.20:8080/sync&lt;br /&gt;# Do not change these for running the demo&lt;br /&gt;group.id=corp&lt;br /&gt;external.id=00000&lt;br /&gt;# Don't muddy the waters with purge logging&lt;br /&gt;job.purge.period.time.ms=7200000&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Создаем начальную базу данных на рутовой ноде:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql postgres -c "CREATE database mytest;"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для целей этого простого примера у нас в базе данных будет одна таблица t2, которая будет синхронизироваться (реплицироваться) в обе стороны. Создадим эту таблицу.&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --run-ddl create_sample.xml&lt;/pre&gt;&lt;br /&gt;здесь используется файл &lt;b&gt;create_sample.xml&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;database name="mytest"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table name="t2"&amp;gt;&lt;br /&gt;&amp;lt;column name="id" type="INTEGER" required="true" primaryKey="true" autoIncrement="true"/&amp;gt;&lt;br /&gt;&amp;lt;column name="mydata" type="VARCHAR" size="64" required="false" /&amp;gt;&lt;br /&gt;&amp;lt;column name="intval" type="DECIMAL" size="10,2" required="false" /&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/database&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Также надо в базе данных создать обработчики plpgsql - запускаем этот скрипт:&lt;br /&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ./create_func.sh&lt;/pre&gt;&lt;b&gt;create_func.sh&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:x-small;"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;psql mytest -U sa -h localhost -c "CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '\$libdir/plpgsql' LANGUAGE C;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;psql mytest -U sa -h localhost -c "CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '\$libdir/plpgsql' LANGUAGE C;"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;psql mytest -U sa -h localhost -c "CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator;"&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;теперь можно инициализировать систему SymmetricDS на рутовой ноде:&lt;br /&gt;&lt;b class="command"&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --auto-create&lt;/pre&gt;&lt;br /&gt;Вывод будет примерно такой:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:xx-small;"&gt;[sa@CENTOS1 samples]$ ../bin/sym -p root.properties --auto-create&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;Log output will be written to ../logs/symmetric.log&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;SymmetricLauncher - Option: name=properties, value={root.properties}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;SymmetricLauncher - Option: name=auto-create, value={}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PlatformFactory - The name/version pair returned for the database, PostgreSQL8,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt; was not mapped to a known database platform.  Defaulting to using just the database type of PostgreSql&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - The DbDialect being used is org.jumpmind.symmetric.db.postgresql.PostgreSqlDbDialect&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;ConfigurationService - Initializing SymmetricDS database.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - There are SymmetricDS tables missing.  They will be auto created.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - Starting auto update of SymmetricDS tables.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - Just installed sym_triggers_disabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - Just installed sym_node_disabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;PostgreSqlDbDialect - Just installed sym_fn_sym_largeobject&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;ConfigurationService - Auto-configuring config channel.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;ConfigurationService - Auto-configuring reload channel.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;ConfigurationService - Done initializing SymmetricDS database.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Всё получилось. Этот скрипт создал целых 26 таблиц для своей работы. Эти таблицы начинаются на sym_ и посмотреть их список можно, введя команду&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql mytest -c "select tablename from pg_tables where tablename like 'sym%';"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Далее. Конфигурим symmetricDS путем заполнения только что созданных таблиц&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --run-sql insert_sample.sql&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Данные для  заполнения такие:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;insert_sample.sql&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:xx-small;"&gt;------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Sample Data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into t2(mydata, intval) values('sdsdsdsds', 102);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Sample Symmetric Configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Nodes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node_group (node_group_id, description) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values ('corp', 'Central Office');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node_group (node_group_id, description) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values ('store', 'Store');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values ('store', 'corp', 'P');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values ('corp', 'store', 'W');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node (node_id, node_group_id, external_id, sync_enabled)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values ('00000', 'corp', '00000', 1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_node_identity values ('00000');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Channels&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_channel &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(channel_id, processing_order, max_batch_size, enabled, description)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('channel_t2', 1, 100000, 1, 't2 data from register and back office');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Triggers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_trigger &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(trigger_id,source_table_name,channel_id,last_update_time,create_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('trigger_t2','t2','channel_t2',current_timestamp,current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Example of a "dead" trigger, which is used to only sync the table during initial load&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_trigger &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(trigger_id,source_table_name,channel_id, sync_on_insert, sync_on_update, sync_on_delete, last_update_time,create_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('t2_dead','t2','channel_t2',0,0,0,current_timestamp,current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Routers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- In this example, both routers pass everything all the time.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_router &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(router_id,source_node_group_id,target_node_group_id,create_time,last_update_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('corp_store_identity', 'corp', 'store', current_timestamp, current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_router &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(router_id,source_node_group_id,target_node_group_id,create_time,last_update_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('store_corp_identity', 'store', 'corp', current_timestamp, current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Trigger Router Links&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;--&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_trigger_router &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(trigger_id,router_id,initial_load_order,last_update_time,create_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('trigger_t2','corp_store_identity',100,current_timestamp,current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_trigger_router &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(trigger_id,router_id,initial_load_order,last_update_time,create_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('trigger_t2','store_corp_identity', 200, current_timestamp, current_timestamp);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;-- Example of a "dead" trigger, which is used to only sync the table during initial load&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;insert into sym_trigger_router &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;(trigger_id,router_id,initial_load_order,last_update_time,create_time)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:xx-small;"&gt;values('trouter_dead','corp_store_identity', 300, current_timestamp, current_timestamp);&lt;/span&gt;&lt;/blockquote&gt;&lt;b class="command"&gt;&lt;/b&gt;&lt;br /&gt;Что означает вышеприведенный код?&lt;br /&gt;По сути, мы создаем конфигурацию для SymmetricDS - триггеры на изменение значений в полях таблиц. При каждом изменении  таблицы source_table_name (в нашем случае это таблица t2), перечисленной в конфигурации SymmetricDS в таблице sym_trigger, срабатывает код SymmetricDS. Он определяет, какие маршруты ассоциированы с данным конкретым триггером (см. sym_trigger_router).  Если указан только один маршрут, например, от первого сервера ко второму, то изменившиеся данные на втором сервере не будут доставлены на первый. В нашем случае имеется два канала, в обе стороны: от первого сервера ко второму и от второго к первому (см. sym_router).&lt;br /&gt;&lt;br /&gt;Запускаем на первом сервере собственно сервер репликации. Эта команда не отдаст управление, будет работать и валить логи на экран.&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --port 8080 --server&lt;/pre&gt;&lt;br /&gt;Разрешаем на первом сервере регистрацию (запускаем из другого окна терминала)&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --open-registration "store,1" &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Всё. Настройка сервера репликации на рутовой ноде завершена.&lt;br /&gt;&lt;br /&gt;Далее. Переходим на второй сервер и делаем настройки там. Создаем такой файл в каталоге symmetric-ds-2.2.2/samples:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;client.properties&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:x-small;"&gt; # The class name for the JDBC Driver&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;db.driver=org.postgresql.Driver&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# The JDBC URL used to connect to the database&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;db.url=jdbc:postgresql://localhost/mytest&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# The user to login as who can create and update tables&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;db.user=sa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# The password for the user to login as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;db.password=sa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# The HTTP URL of the root node to contact for registration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;registration.url=http://10.0.2.20:8080/sync&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# Do not change these for running the demo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;group.id=store&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;external.id=1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;job.routing.period.time.ms=2000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# This is how often the push job will be run.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;job.push.period.time.ms=5000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;# This is how often the pull job will be run.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:x-small;"&gt;job.pull.period.time.ms=5000&lt;/span&gt;&lt;/blockquote&gt;Создаем на втором сервере такую же базу данных:&lt;br /&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql postgres -c "CREATE database mytest;"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;и создаем в ней такие же триггеры и функции:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p client.properties --run-ddl create_sample.xml&lt;br /&gt;$ ./create_func.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Запускаем на втором сервере процесс репликации.&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p client.properties --port 9090 --server&lt;/pre&gt;&lt;br /&gt;На данном этапе у нас базы данных еще не реплицированы, репликация не началась. Оценим это. зайдем на первый сервер и наберем:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql mytest -c "select * from t2;"&lt;/pre&gt;&lt;br /&gt;Эта команда выведет нам содержимое таблицы на корневой ноде, там будет одна запись, созданная скриптом insert_sample.sql, который мы запускали только на рутовой ноде.&lt;br /&gt;Перейдем на второй сервер, наберем эту же команду там. Таблица будет пустая.&lt;br /&gt;&lt;br /&gt;Теперь самое основное: забрасываем на клиент начальный набор данных, вводя эту команду с первого сервера, и таким образом начинаем репликацию!&lt;br /&gt;&lt;pre class="programlisting"&gt;$ ../bin/sym -p root.properties --reload-node 1&lt;/pre&gt;&lt;br /&gt;Через пару секунд у нас на втором сервере содержимое таблицы t2 будет такое же! Ура!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Если у вас что-то пошло не так,например, вы указали неправильный IP адрес сервера для регистрации, то проще всего убить нашу базу данных (вместе со всеми 26 таблицами SymmetricDS) и начать всё с начала. Для этого надо вызвать команду на обоих серверах:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql postgres -c "drop databаse mytest;"&lt;/pre&gt;&lt;br /&gt;и начать заново, с этой строки (ищи ее выше:)&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql postgres -c "CREATE database mytest;"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь напишем скрипт на perl для закачки инфы в таблицу на корневом сервере.&lt;br /&gt;Для  моделирования реальной нагрузки он будет производить тысячи INSERT и  UPDATE в секунду, в цикле.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:x-small;"&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;use DBI;&lt;br /&gt;my $dbh = DBI-&amp;gt;connect("DBI:Pg:dbname=mytest", "sa", "sa");&lt;br /&gt;&lt;br /&gt;for(my $idval = 5000; $idval &amp;lt; 9000; $idval++)&lt;br /&gt;{&lt;br /&gt; $dbh-&amp;gt;do("insert into t2 (id,mydata, intval) values ($idval,'some data', $idval)");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;my $newval = 3434;&lt;br /&gt;my $interval = 0;&lt;br /&gt;for(my $j = 0; $j &amp;lt; 100000; $j++)&lt;br /&gt;{&lt;br /&gt;for(my $idval = 5000; $idval &amp;lt; 9000; $idval++)&lt;br /&gt;{&lt;br /&gt;   $newval++;&lt;br /&gt;   $interval++;&lt;br /&gt;   $dbh-&amp;gt;do("UPDATE t2 set intval=$newval where id=$idval");&lt;br /&gt;   printf ("UPD[%04d] id=%d val=%d\r", $j, $idval, $newval);&lt;br /&gt;   if($interval == 100)&lt;br /&gt;   {&lt;br /&gt;        $interval = 0;&lt;br /&gt;       `ping localhost -w 1 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1`;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;$dbh-&amp;gt;disconnect;&lt;br /&gt;&lt;br /&gt;print "\nOK\n";&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Запустив этот скрипт на root node, таблица будет постоянно меняться. На втором сервере мы сможем видеть, как изменения присылаются туда, с некоторой задержкой, например, так:&lt;br /&gt;&lt;pre class="programlisting"&gt;$ psql mytest -c "select * from t2 where id=5000;"&lt;/pre&gt;Значение intval для данной строки таблицы будет отставать от того, что печатается скриптом, работающим на первом сервере.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-4894137358982394951?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/4894137358982394951/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/04/postgresql-symmetricds.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/4894137358982394951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/4894137358982394951'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/04/postgresql-symmetricds.html' title='Репликация базы данных PostgreSQL на основе SymmetricDS'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SF5FFIwKIH0/TSwigXqiZ5I/AAAAAAAAAFU/CxkasZ33WRw/s72-c/logopg701-300x237.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-663435361206179518</id><published>2011-04-17T02:00:00.003+04:00</published><updated>2011-04-17T02:26:52.158+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voice recognition'/><title type='text'>Распознавание голоса с помощью технологий Google</title><content type='html'>В этом посте я расскажу, как сделать автоматическое распознавание голоса с помощью технологий Google.&lt;br /&gt;&lt;br /&gt;Что нам потребуется:&lt;br /&gt;- Perl с модулями JSON::XS и LWP, &lt;br /&gt;- утилита flac для работы со звуком,&lt;br /&gt;- исходный звуковой файл test.wav, 11025Hz mono 16 bit, для распознавания.&lt;br /&gt;&lt;br /&gt;Вкратце, что надо делать: отправить flac в POST-запросе на адрес гугловского сервиса, а как результат получить JSON с распознанным текстом.&lt;br /&gt;&lt;br /&gt;Код очень прост. Вот такой:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;use Encode;&lt;br /&gt;use JSON::XS;&lt;br /&gt;use LWP::UserAgent;&lt;br /&gt;$ua = LWP::UserAgent-&amp;gt;new;&lt;br /&gt;&lt;br /&gt;$file = "test.wav";&lt;br /&gt;$res = `flac $file &amp;gt;/dev/null 2&amp;gt;&amp;amp;1`;&lt;br /&gt;$flacfile = "$file";&lt;br /&gt;$flacfile =~ s/\.wav$/\.flac/;&lt;br /&gt;$filesize = -s "$flacfile";&lt;br /&gt;&lt;br /&gt;open(flac, "$flacfile");&lt;br /&gt;binmode flac;&lt;br /&gt;read(flac, $data, $filesize);&lt;br /&gt;close(flac);&lt;br /&gt;unlink("$flacfile");&lt;br /&gt;&lt;br /&gt;$url = 'http://www.google.com/speech-api/v1/recognize?xjerr=1&amp;amp;client=chromium&amp;amp;lang=ru-RU';&lt;br /&gt;my $req = HTTP::Request-&amp;gt;new(POST=&amp;gt;$url);&lt;br /&gt;$req-&amp;gt;content_type('audio/x-flac; rate=11025');&lt;br /&gt;$req-&amp;gt;content_length($filesize);&lt;br /&gt;$req-&amp;gt;content($data);&lt;br /&gt;&lt;br /&gt;$res = $ua-&amp;gt;request($req);&lt;br /&gt;$jstxt = JSON::XS-&amp;gt;new-&amp;gt;utf8-&amp;gt;decode($res-&amp;gt;content);&lt;br /&gt;$decoded = $jstxt-&amp;gt;{hypotheses}[0]-&amp;gt;{utterance};&lt;br /&gt;&lt;br /&gt;use utf8;&lt;br /&gt;print "\nDecoded:\n$decoded\n";&lt;br /&gt;no utf8;&lt;/blockquote&gt;&lt;br /&gt;Вот и всё :) Как видим, всё достаточно просто. Мы только что заюзали фичу гугла, которая, якобы, существует только в хроме для мобильных телефонов ("голосовой поиск"), причем мы ее заюзали нестандартным образом: нам не нужен поиск как таковой, нам нужен всего лишь промежуточный результат: распознанный голос.&lt;br /&gt;&lt;br /&gt;На вход гугловскому сервису подается звук в формате FLAC, который мы предварительно кодируем из исходного файла WAV. Потребуется указать частоту дискретизации звука: в моем случае это 11кГц (11025).&lt;br /&gt;&lt;br /&gt;Из проблем этого гугловского сервиса, которые стоит отметить:&lt;br /&gt;-он, похоже, еще очень сырой. Постоянно, вместо ответа с распознанным текстом приходят HTTP 500 Server Error.&lt;br /&gt;&lt;br /&gt;Я провел простой эксперимент: запустил распознавание звука 20 раз подряд.&lt;br /&gt;Для длинных звуковых файлов, размер которых больше 300.000 байт (11кГц моно 16 бит звук), сервис Гугла ни разу (!) не вернул результат, все 20 раз было Internal Server Error 500.&lt;br /&gt;При ограничении отправляемого звукового файла размером 200.000 байт (до кодирования его во flac) расклад стал такой: 6 из 20 запусков - Internal Error 500; при повторном запуске этого теста результаты лучше: 2 из 20 запусков вернули Error 500.&lt;br /&gt;Видимо, этот сервис заточен исключительно на поиск, когда юзер говорит поисковую фразу из 2-3 слов (типа, "пицца Нижний Новгород") и получает результаты поиска.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-663435361206179518?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/663435361206179518/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/04/google.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/663435361206179518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/663435361206179518'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/04/google.html' title='Распознавание голоса с помощью технологий Google'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-2447486047560082134</id><published>2011-03-31T02:27:00.007+04:00</published><updated>2011-03-31T23:15:23.978+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VDS'/><title type='text'>VDS защищается от неопытных пользователей</title><content type='html'>Похоже, системные администраторы в немецких дата-центрах сделали всё возможное, чтобы не дать неопытному человеку самостоятельно поднять сервер на VDS (скорее всего они пойдут в платную техподдержку).&lt;br /&gt;Вот пример: провайдер interserver.ru. Чтобы поднять обычный LAMP сервер на SUSE11.3, пришлось столкнуться со следующим:&lt;br /&gt;1) "Контейнер" (операционная система) содержит крайне урезанный набор пакетов. Практически ничего нет. это конечно хорошо, ничего лишнего, поскольку каждый мегабайт на счету, но... YaST2 не работает:&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 271px;" src="http://3.bp.blogspot.com/-C5oyLOh_M4w/TZOv8lF_DDI/AAAAAAAAANM/zYWnQhNWPRU/s400/yast2.jpg" alt="" id="BLOGGER_PHOTO_ID_5590005017781144626" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Это связано с тем, что не установлен пакет yast2-ncurses-pkg и в графическом интерфейсе yast его никак не установить.&lt;br /&gt;&lt;br /&gt;2) Делаем попытку каким-то образом установить недостающий пакет, не используя установщиков с интерфейсом пользователя. На счастье в SuSE есть такая утилита командной строки, как &lt;span style="font-weight:bold;"&gt;zypper&lt;/span&gt;.&lt;br /&gt;Но для начала надо его настроить, добавив репозитории. Тоже не всякий виндовый юзер сообразит как это делается. Вот так:&lt;br /&gt;zypper ar -n suse11.3 http://ftp.gwdg.de/pub/linux/misc/packman/suse/11.3/  suse11.3&lt;br /&gt;zypper ar -n opensuse11.3 http://download.opensuse.org/distribution/11.3/repo/oss/suse/ opensuse11.3&lt;br /&gt;&lt;br /&gt;3) Далее, нас, как оказывается, не спасает даже команда &lt;span style="font-weight:bold;"&gt;zypper in yast2-ncurses-pkg&lt;/span&gt;.&lt;br /&gt;Понимаем, что это было зря, поскольку теперь yast выдает ошибку "Error while creating client module sw_single"... Забиваем окончательно на yast, эту команду не вводим, чтобы не устанавливались лишние пакеты. Переходим на командную строку zypper. Все-таки командная строка - сила!&lt;br /&gt;&lt;br /&gt;4) Ура. Мы на втором уровне :) и теперь снова можем ставить недостающий софт на VDS! делаем это:&lt;br /&gt;zypper in mysql php php5-mysql mcrypt apache2-mod_php5&lt;br /&gt;&lt;br /&gt;Далее оказывается, что установить mysql на автозапуск командой &lt;span style="font-weight:bold;"&gt;chkconfig mysql 3 &lt;/span&gt;невозможно, поскольку есть бага в самом скрипте крона!&lt;br /&gt;&lt;blockquote&gt;# chkconfig mysql 3&lt;br /&gt;insserv: warning: script 'S10vzquota' missing LSB tags and overrides&lt;br /&gt;insserv: warning: script is corrupt or invalid: /etc/init.d/rc6.d/S00vzreboot&lt;br /&gt;insserv: warning: script 'vzquota' missing LSB tags and overrides&lt;br /&gt;insserv: warning: script 'S10vzquota' missing LSB tags and overrides&lt;br /&gt;insserv: warning: script is corrupt or invalid: /etc/init.d/rc6.d/S00vzreboot&lt;br /&gt;insserv: warning: script 'vzquota' missing LSB tags and overrides&lt;br /&gt;insserv: FATAL: service boot.shm has to exists for service boot.rootfsck&lt;br /&gt;insserv: exiting now!&lt;br /&gt;/sbin/insserv failed, exit code 1&lt;br /&gt;&lt;/blockquote&gt;Вставляем в начало скрипта &lt;span style="font-weight: bold;"&gt;/etc/init.d/rc6.d/S00vzreboot&lt;/span&gt; комменты так, как написано тут:&lt;br /&gt;&lt;a href="http://serverfault.com/questions/248325/debian-squeeze-vzquota"&gt;http://serverfault.com/questions/248325/debian-squeeze-vzquota&lt;/a&gt;&lt;br /&gt;Это избавит нас от части ошибок.&lt;br /&gt;&lt;br /&gt;Далее, делаем такие две команды:&lt;br /&gt;# mv /etc/init.d/rc6.d/S00vzreboot /etc/init.d/vzreboot&lt;br /&gt;# ln -s /etc/init.d/vzreboot /etc/init.d/rc6.d/S00vzreboot&lt;br /&gt;(спасибо &lt;a href="http://accessdlab.blogspot.com/2010/06/s00vzreboot-trouble.html"&gt;http://accessdlab.blogspot.com/2010/06/s00vzreboot-trouble.html&lt;/a&gt; за решение)&lt;br /&gt;&lt;br /&gt;Это приведет нас к такому сообщению об ошибке. Уже лучше:&lt;br /&gt;&lt;blockquote&gt;# chkconfig mysql 3&lt;br /&gt;insserv: FATAL: service boot.shm has to exists for service boot.rootfsck&lt;br /&gt;insserv: exiting now!&lt;br /&gt;/sbin/insserv failed, exit code 1&lt;br /&gt;&lt;/blockquote&gt;Эта ошибка из-за того, что в файле &lt;span style="font-weight: bold;"&gt;/etc/init.d/boot.rootfsck&lt;/span&gt; написано:&lt;br /&gt;&lt;blockquote&gt;# Required-Start:    boot.shm&lt;/blockquote&gt;А сервиса boot.shm в контейнере suse-11.3 нет. Поэтому просто удаляем слово &lt;span style="font-weight: bold;"&gt;boot.shm&lt;/span&gt; оттуда.&lt;br /&gt;&lt;br /&gt;Всё, после этого установить mysql как сервис получается, ура!&lt;br /&gt;&lt;br /&gt;перезапускаем апач:&lt;br /&gt;service apache2 restart&lt;br /&gt;&lt;br /&gt;И всё, LAMP работает, т.е. скрипты на PHP можно писать и тестировать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-2447486047560082134?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/2447486047560082134/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2011/03/vds.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/2447486047560082134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/2447486047560082134'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2011/03/vds.html' title='VDS защищается от неопытных пользователей'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-C5oyLOh_M4w/TZOv8lF_DDI/AAAAAAAAANM/zYWnQhNWPRU/s72-c/yast2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-5363772753226068353</id><published>2010-09-09T19:25:00.020+04:00</published><updated>2010-09-09T19:51:46.329+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='виртуализация'/><title type='text'>Виртуализация приложений. Обзор технологии. Часть 2. Ericom PowerTerm WebConnect</title><content type='html'>Теперь пришла очередь рассказать о чудном продукте, таком как &lt;span style="font-weight: bold;"&gt;Ericom PowerTerm WebConnect&lt;/span&gt;. Он тоже умеет присылать с сервера картинки работающих там приложений.&lt;br /&gt;&lt;br /&gt;Сразу скажу: продукт ужасен по своему пользовательскому интерфейсу (черт ногу сломит в настройках), а также у него просто ужасная документация. Замечательный пример по поводу того, как НЕ надо писать документацию. Я потратил 2 дня, чтобы разобраться, что там к чему, и вот пошаговая инструкция.&lt;br /&gt;&lt;br /&gt;Нам понадобится две Windows - системы, из одной сделаем сервер приложений, а вторую будем использовать как клиентскую машину, запуская изображения работающих приложений с сервера.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(1) &lt;/span&gt;Скачиваем &lt;a href="http://www.ericom.com/pdl.asp?pproduct=5&amp;amp;sp=1"&gt;дистрибутив&lt;/a&gt;, предварительно ответив на вопросы дурацкой анкеты. В нее можно вводить всё, что угодно, никакие поля не проверяются, email можно вводить в виде абракадабры, но с обязательной собачкой посередине :) В результате заполнения этой анкеты дается &lt;a href="http://www.ericom.com/demos/ptdj.exe"&gt;прямая ссылка&lt;/a&gt; на дистрибутив, 251 Мб.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(2) &lt;/span&gt;Устанавливаем, выбирая режим Evaluate - нам дастся 30 дней на изучение продукта.&lt;br /&gt;Установщик состоит из кучи продуктов, некоторые из которых взаимодействуют друг с другом, некоторые нет, есть даже такие продукты, которые устанавливаются в виде файла установщика.... И их надо потом еще раз устанавливать из каталога с продуктом... Понять, какие компоненты нужны для целей Application Streaming, а какие лишние, не представляется возможным, поэтому ставим всё, и на сервер, и на клиентские компьютеры.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj84JtulsI/AAAAAAAAAIk/x69qb-ImKLk/s1600/Term0.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 301px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj84JtulsI/AAAAAAAAAIk/x69qb-ImKLk/s400/Term0.jpg" alt="" id="BLOGGER_PHOTO_ID_5514935785325762242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В конце установки нажимаем Finish.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj9BF3wkgI/AAAAAAAAAIs/znnCTOXnl4A/s1600/Term3.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 301px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj9BF3wkgI/AAAAAAAAAIs/znnCTOXnl4A/s400/Term3.jpg" alt="" id="BLOGGER_PHOTO_ID_5514935938912915970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(3) &lt;/span&gt;Запуск и настройка на серверном компьютере.&lt;br /&gt;&lt;br /&gt;Для сервера установленного программного обеспечения не достаточно, несмотря на то, что мы при установке выбрали опцию "установить всё". Нужно обязательно поставить еще вот этот компонент, который установился в виде инсталляшки:&lt;br /&gt;C:\Program Files\Ericom Software\WebConnect 5.6\AddOns\TerminalServerAgent\PowerTermTerminalServerAgent.exe&lt;br /&gt;&lt;br /&gt;Также на серверном компьютере нужно остановить (задизэблить) сервис Windows Firewall, потому что он не даст нам работать.&lt;br /&gt;&lt;br /&gt;Запускаем Пуск - Программы - Ericom Software - PowerTerm WebConnect 5.6 - PowerTerm WebConnect Administration Tool. Появится окошко:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj9I3NghGI/AAAAAAAAAI0/bicarHHYIM0/s1600/Term4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 303px; height: 400px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj9I3NghGI/AAAAAAAAAI0/bicarHHYIM0/s400/Term4.jpg" alt="" id="BLOGGER_PHOTO_ID_5514936072416560226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Нажимаем Cancel, потому что сервер еще не запущен. В главном окне запускаем сервер:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj9Sh04TiI/AAAAAAAAAI8/5rQHtWvBIlo/s1600/Term5.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 269px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj9Sh04TiI/AAAAAAAAAI8/5rQHtWvBIlo/s400/Term5.jpg" alt="" id="BLOGGER_PHOTO_ID_5514936238474808866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;А уже потом выходим в меню Server-Connect, видим опять окошко авторизации, ничего там не меняем. Пароль пустой. Нажимаем Connect. Должно получиться зайти в админскую консоль, которая выглядит так:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj9aW5Yq-I/AAAAAAAAAJE/TYQQgdlbXxI/s1600/Term6.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 270px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj9aW5Yq-I/AAAAAAAAAJE/TYQQgdlbXxI/s400/Term6.jpg" alt="" id="BLOGGER_PHOTO_ID_5514936372979870690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;В ней сконфигурирована всякая ерунда, ее сразу же удаляем, потому что она иначе будет показываться клиентам. По правой кнопке над каждым элементом есть менюшка Delete.&lt;br /&gt;&lt;br /&gt;Потом нажимаем на иконку с человеком и задаем пароль для юзера user. Также ставим галочку Free User.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj97e40zJI/AAAAAAAAAJ0/Km7QmWxf3hw/s1600/Term7.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 314px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj97e40zJI/AAAAAAAAAJ0/Km7QmWxf3hw/s400/Term7.jpg" alt="" id="BLOGGER_PHOTO_ID_5514936942060686482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Также редактируем пользователя Administrator, нужно поставить галочку Allow Concurrent Machines, иначе не получится сконфигурировать клиентов. Как только все клиенты настроены, эту галочку надо обратно снять, чтобы администратор не смог залогиниться в утилиту с другого компа (сможет только с сервера через соединение к localhost).&lt;br /&gt;&lt;br /&gt;Теперь публикуем приложения, которые можно будет запускать через Remote Desktop с клиентских компьютеров:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj-BVT6MHI/AAAAAAAAAJ8/Q0y1Yu06RXw/s1600/Term8.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 270px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj-BVT6MHI/AAAAAAAAAJ8/Q0y1Yu06RXw/s400/Term8.jpg" alt="" id="BLOGGER_PHOTO_ID_5514937042569146482" border="0" /&gt;&lt;/a&gt;Должно открыться вот такое окошко:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj-LEB8o5I/AAAAAAAAAKE/BOJdip0ubKo/s1600/Term9.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 369px; height: 261px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj-LEB8o5I/AAAAAAAAAKE/BOJdip0ubKo/s400/Term9.jpg" alt="" id="BLOGGER_PHOTO_ID_5514937209729098642" border="0" /&gt;&lt;/a&gt;в нем ничего не меняем, нажимаем ОК, и дальше должно появиться окошко с выбором приложений для публикации, в котором выбираем приложения, которые будут использоваться удаленно юзерами.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj_HL78kMI/AAAAAAAAAKM/G1XIwdao050/s1600/TermA.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 295px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj_HL78kMI/AAAAAAAAAKM/G1XIwdao050/s400/TermA.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938242643562690" border="0" /&gt;&lt;/a&gt;Если это окошко не появилось, а вместо него появился MessageBox, который просит запустить Desktop View Service, то тут надо сделать так, как описано ниже. Вообще, интерфейс программы довольно поганый - она говорит, что надо запустить какой-то сервис, при этом абсолютно не понятно, как его запустить, где его взять, и почему она сама его не запустила, если он нужен... Есть подозрения, что он запускается сам при каких-то определенных условиях, например при вот этом.&lt;br /&gt;&lt;br /&gt;Если не получилось опубликовать сразу несколько приложений, получится опубликовать приложения по одному (а после этого получится и много опубликовать). Для этого выбираем такой пункт меню:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj_NoJhYEI/AAAAAAAAAKU/samvVSLH2r0/s1600/TermB.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 185px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj_NoJhYEI/AAAAAAAAAKU/samvVSLH2r0/s400/TermB.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938353295908930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Потом пробегаемся по мастеру:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj_Tpa1AKI/AAAAAAAAAKc/AS-6DdTj4hs/s1600/TermC.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 295px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIj_Tpa1AKI/AAAAAAAAAKc/AS-6DdTj4hs/s400/TermC.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938456716148898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Второй шаг. Многоточие около первого Edit Box может по странным причинам не работать, поэтому текст надо вбить от руки.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj_YxwPKUI/AAAAAAAAAKk/5nEMMergjP0/s1600/TermD.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 295px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj_YxwPKUI/AAAAAAAAAKk/5nEMMergjP0/s400/TermD.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938544852773186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Далее несколько шагов интуитивны; на 7 шаге надо поставить галочку у Disk Drives - тогда жесткие диски клиента примонтируются к серверу.&lt;br /&gt;&lt;br /&gt;Вот на этом шаге нельзя писать localhost в поле address, потому что тогда RemoteDesktop не сможет работать. Поэтому пишем IP адрес нашего сервера, все остальное не меняем:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj_l8S3zbI/AAAAAAAAAKs/hgSMqFZXI70/s1600/TermE.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 293px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj_l8S3zbI/AAAAAAAAAKs/hgSMqFZXI70/s400/TermE.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938771020697010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На этом же экране можно выбрать Load Balancer - это именно та штука, которая позволяет перенаправлять клиентов на свободный сервер, потому что тут ограничение то же, что и для SeamlessRDP - один клиент использует один сервер, и второй клиент не может запустить приложение с того же самого сервера. Ему нужен другой сервер, на котором точно так же нет залогиненного юзера.&lt;br /&gt;&lt;br /&gt;Доходим до последнего, 12-го шага. и тут обязательно надо нажать на кнопку Advanced, и прописать виндусовый логин и пароль для соединения с сервером.&lt;br /&gt;&lt;br /&gt;Итак, все готово!&lt;br /&gt;Вот что получилось после опубликования двух приложений на сервере:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj_sS5EcOI/AAAAAAAAAK0/lOuWdAYMUls/s1600/TermF.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 145px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/TIj_sS5EcOI/AAAAAAAAAK0/lOuWdAYMUls/s400/TermF.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938880165703906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(4) &lt;/span&gt;теперь настраиваем клиентские компьютеры.&lt;br /&gt;&lt;br /&gt;Тривиального способа запустить Application Zone, по-видимому, нет, делать всё придется через {censored}.&lt;br /&gt;Чтобы запустить Application Zone, нужно:&lt;br /&gt;- Залогиниться с клиентсокго компа как администратор на сервере&lt;br /&gt;- Запустить Application Zone&lt;br /&gt;- В этом приложении включить галочку "запускать при старте Windows" и помесить иконку на рабочий стол&lt;br /&gt;- потом можно запускать AppZone под непривилегированным пользователем.&lt;br /&gt;&lt;br /&gt;Делаем. Логинимся на наш сервер под администратором. Не забываем указать правильный IP адрес сервера.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj_yhl-PrI/AAAAAAAAAK8/irDIFOXaVg0/s1600/TermG.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 303px; height: 400px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIj_yhl-PrI/AAAAAAAAAK8/irDIFOXaVg0/s400/TermG.jpg" alt="" id="BLOGGER_PHOTO_ID_5514938987191353010" border="0" /&gt;&lt;/a&gt;После логина нажимаем на этот пункт меню:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIkACMzevwI/AAAAAAAAALM/-mKGL9dduLI/s1600/TermH.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 244px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/TIkACMzevwI/AAAAAAAAALM/-mKGL9dduLI/s400/TermH.jpg" alt="" id="BLOGGER_PHOTO_ID_5514939256488771330" border="0" /&gt;&lt;/a&gt;В трее запустится Application Zone, надо будет нажать на значок в трее и выбрать пункт Open Application Zone. Вот что получилось:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIkAIp8jbxI/AAAAAAAAALU/x8IMNMjwQkk/s1600/TermI.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIkAIp8jbxI/AAAAAAAAALU/x8IMNMjwQkk/s400/TermI.jpg" alt="" id="BLOGGER_PHOTO_ID_5514939367390670610" border="0" /&gt;&lt;/a&gt;В меню Options надо выбрать Create a Shortcut on the Desktop, и собственно это всё. Теперь можно закрыть Administration Tool и на сервере запрещать администратору логиниться с удаленного компьютера.&lt;br /&gt;&lt;br /&gt;Иконка, кстати, создалась на десктопе с нетривиальными параметрами (даже с буквами ю):&lt;br /&gt;"C:\Program Files\Ericom Software\WebConnect 5.6\bin\PtAgent.exe" /CREDFILE=WebConnect_ю_192.168.5.43_4001ю.dat   -efdю&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(5) &lt;/span&gt;Запуск удаленных приложений с компьютеров клиентов&lt;br /&gt;&lt;br /&gt;Разлогиниваемся с сервера!&lt;br /&gt;&lt;br /&gt;Запускаем Application Zone по иконке и логинимся как user, т.е. непривилегированным пользователем, потом нажимаем на значок в трее и выбираем пункт Open Application Zone.&lt;br /&gt;&lt;br /&gt;Нажимаем на иконку для запуска приложения и случается магия. Смотрите как красиво:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIkAQPazFvI/AAAAAAAAALc/Kx9dslS4sjA/s1600/TermJ.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 280px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/TIkAQPazFvI/AAAAAAAAALc/Kx9dslS4sjA/s400/TermJ.jpg" alt="" id="BLOGGER_PHOTO_ID_5514939497708721906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIkAW_pmAOI/AAAAAAAAALk/8ZLOFu9j0FE/s1600/TermK.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIkAW_pmAOI/AAAAAAAAALk/8ZLOFu9j0FE/s400/TermK.jpg" alt="" id="BLOGGER_PHOTO_ID_5514939613734895842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Звук передается тоже, правда прерывистый... занимаемый траффик 3 мегабита в секунду.&lt;br /&gt;&lt;/censored&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-5363772753226068353?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/5363772753226068353/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2010/09/2-ericom-powerterm-webconnect.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5363772753226068353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5363772753226068353'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2010/09/2-ericom-powerterm-webconnect.html' title='Виртуализация приложений. Обзор технологии. Часть 2. Ericom PowerTerm WebConnect'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/TIj84JtulsI/AAAAAAAAAIk/x69qb-ImKLk/s72-c/Term0.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-8984849863120875880</id><published>2010-09-09T16:22:00.004+04:00</published><updated>2010-09-09T19:47:25.076+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='виртуализация'/><title type='text'>Виртуализация приложений. Обзор технологии. Часть 1. SeamlessRDP</title><content type='html'>Виртуализация отдельных приложений в варианте, когда картинка работающего на сервере приложения гонится с сервера на юзерское устройство, называется Application Streaming. При этом на клиентский компьютер не устанавливается код приложения ни в каком виде, пользователь просто видит интерактивную картинку с содержимым приложения.&lt;br /&gt;&lt;br /&gt;Основные продукты на рынке, которые это умеют:&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Citrix XenApp&lt;/span&gt; (об нем в следующих выпусках; дистрибутив занимает 4,5 гига).&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Ericom PowerTerm WebConnect&lt;/span&gt; (об нем читайте &lt;a href="http://danxee.blogspot.com/2010/09/2-ericom-powerterm-webconnect.html"&gt;в этом посте&lt;/a&gt;, он тоже платный)&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;SeamlessRDP &lt;/span&gt;(опенсорс!). Об нем настоящая статья.&lt;br /&gt;&lt;br /&gt;Что потребуется для работы:&lt;br /&gt;1) Windows-Сервер в интернете (или в локальной сети). На него устанавливаем игры, приложения для использования пользователями. Для целей этой заметки используем локальный сервер 192.168.5.43.&lt;br /&gt;2) Также на сервер ставим надстройку над RDP - &lt;a href="http://www.cendio.com/seamlessrdp/seamlessrdp.zip"&gt;SeamlessRDP&lt;/a&gt;. Распаковать архив на сервере в папку C:\SRDP.&lt;br /&gt;3) &lt;a href="http://sourceforge.net/projects/rdesktop/"&gt;rdesktop &lt;/a&gt;- нужно скачать и скомпилять под CygWin-ом. Эта утилита будет использоваться на компах пользователей.&lt;br /&gt;4) X-сервер, любой, например &lt;a href="http://sourceforge.net/projects/xming/"&gt;Xming&lt;/a&gt;. Он тоже ставится на компах юзеров.&lt;br /&gt;&lt;br /&gt;Условия:&lt;br /&gt;- на сервере не должно быть залогиненного пользователя! Если там кто-то залогинен, то работать Application Streaming не будет.&lt;br /&gt;&lt;br /&gt;Что делаем:&lt;br /&gt;1) Запускаем X-сервер&lt;br /&gt;2) Запускаем&lt;br /&gt;rdesktop.exe -u Administrator -p пароль -a 16 -A -s "C:\SRDP\seamlessrdpshell.exe C:\Portables\Farm\fantastic farm.exe" 192.168.5.43&lt;br /&gt;3) Играем через Application Streaming - это картинка с удаленного сервера, выглядит, как будто я запустил игру со своего компьютера.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIjS0mM8gqI/AAAAAAAAAIc/FIODaEWFl84/s1600/game.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TIjS0mM8gqI/AAAAAAAAAIc/FIODaEWFl84/s400/game.jpg" alt="" id="BLOGGER_PHOTO_ID_5514889544765047458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Игра немножко тормозит, что естественно при передаче большого количества  видеоданных по сети. Поток данных с этой игры я намерял в размере  2,7  мегабит в сек.&lt;br /&gt;Если запустить офисные приложения, то тормозов не заметно.&lt;br /&gt;&lt;br /&gt;При закрытии игры/приложения автоматически происходит разлогинивание  пользователя с сервера, и сервер становится готов принимать новые  соединения по SeamlessRDP.&lt;br /&gt;&lt;br /&gt;Преимущества такого подхода: можно запускать Windows-приложения из-под Linux, поскольку команда rdesktop - родная для Linux, она есть в стандартном наборе утилит.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-8984849863120875880?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/8984849863120875880/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2010/09/1.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/8984849863120875880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/8984849863120875880'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2010/09/1.html' title='Виртуализация приложений. Обзор технологии. Часть 1. SeamlessRDP'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/TIjS0mM8gqI/AAAAAAAAAIc/FIODaEWFl84/s72-c/game.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-9104285014190038507</id><published>2010-06-04T12:11:00.007+04:00</published><updated>2010-06-04T13:11:14.211+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='мысли'/><category scheme='http://www.blogger.com/atom/ns#' term='wine'/><title type='text'>Причины вайнофобии</title><content type='html'>&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TAi19mwwzGI/AAAAAAAAAH4/9FB5lALlgi8/s1600/MAC_fail.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 400px; height: 182px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TAi19mwwzGI/AAAAAAAAAH4/9FB5lALlgi8/s400/MAC_fail.jpg" alt="" id="BLOGGER_PHOTO_ID_5478829016677928034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/TAi265wPuDI/AAAAAAAAAIA/LL3s2MeeHPg/s1600/MAC_fail2.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 400px; height: 183px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/TAi265wPuDI/AAAAAAAAAIA/LL3s2MeeHPg/s400/MAC_fail2.jpg" alt="" id="BLOGGER_PHOTO_ID_5478830069748054066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top"&gt;&lt;br /&gt;Вот так выглядит пользовательский интерфейс одного Windows-приложения, запущенного под Mac OS X 10.6.2 с использованием самого последнего Wine 1.2rc2. И это, кстати, не статическая страничка. Та же самая программа несколькими секундами позднее выглядит так, как показано на второй картинке.&lt;br /&gt;Это произошло после того, как был собран из исходников и установлен требующийся этому приложению libXrender-0.9.5.&lt;br /&gt;&lt;br /&gt;В этой заметке я попытаюсь провести анализ того, почему многим так страшно работать с Wine. Почему опытные разработчики открещиваются от wine? Я бы выделил  несколько причин.&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Во-первых&lt;/span&gt;, wine - это "не красиво". Это искусственное образование, которое, по сути, является попыткой придумать свой windows по опыту наблюдения над настоящей windows как над черным ящиком.&lt;br /&gt;К примеру, в wine есть собственная реализация библиотеки msxml3. Эта библиотека зачем-то нужна при регистрации COM-компонентов (dll), и regsvr32 падает на unhandled exception при использовании самописной msxml3. Именно поэтому есть такой "черный ход", когда самописная msxml3 подменяется на настоящую, взятую с windows (т.н. "нативная"). С нативной либой все нормально.&lt;br /&gt;Второй пример. Есть своя собственная реализация gdiplus. Эта библиотека нужна для работы с графикой. Так вот, самописная реализация не написана, похоже, чуть более чем на половину, поскольку простейшие тестовые примеры, использующие gdiplus, не работают. Доступный в исходных кодах пример использования gdiplus, который позволяет рисовать полигоны и потом рисовать между точками плавные линии, не работает! Полигоны рисуются, а вот перерисовывать прямые линии на кривые уже не может. Тут на помощь опять-таки приходит winetricks, когда с настоящей windows берется настоящая библиотека gdiplus. С ней все работает нормально.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Во-вторых&lt;/span&gt;, это очень сложно. Очень сложно вести разработку для wine, модифицировать его исходный код, ввиду следующих особенностей:&lt;br /&gt;- нет однозначного отображения пространства функций из Windows в Linux/Mac.&lt;br /&gt;- исходного кода очень много, сотни мегабайт.&lt;br /&gt;- существуют нетривиальные зависимости между компонентами системы. Например, показанные на картинках выше "эффекты" - это дело рук Xrender, компонента X11, т.е. реализации алгоритмов добавления "теней" вокруг окошек на основе использования альфа-канала (alpha blend). Именно так: чтобы система умела рисовать тени вокруг окошек, пришлось собрать из исходников Xrender (а это значит собрать вот такие пакеты в таком порядке: randrproto-1.3.1.tar.bz2 xineramaproto-1.2.tar.bz2 libXext-1.1.1.tar.bz2 libXfixes-4.0.4.tar.bz2 fixesproto-4.1.tar.bz2 compositeproto-0.4.1.tar.bz2 libICE-1.0.6.tar.bz2 X11-xshape-0.1.1.tar.gz libSM-1.1.1.tar.bz2 libXcomposite-0.4.1.tar.bz2 libXinerama-1.1.tar.bz2 libXrandr-1.3.0.tar.bz2 libXxf86vm-1.1.0.tar.bz2 libXi-1.3.tar.bz2 libXcursor-1.1.10.tar.bz2 renderproto-0.11.tar.bz2 libXau-1.0.5.tar.bz2 libpthread-stubs-0.3.tar.bz2 xcb-proto-1.6.tar.bz2 libxcb-1.6.tar.bz2 xtrans-1.2.5.tar.bz2 xextproto-7.1.1.tar.bz2 kbproto-1.0.4.tar.bz2 inputproto-2.0.tar.bz2 xproto-7.0.17.tar.bz2 libX11-1.3.3.tar.bz2 libXrender-0.9.5.tar.bz2 - 7 мб сильно сжатых исходников). И вот теперь получается, что в каком-то из этих пакетов ошибка, приводящая к такой вот красоте, как на картинках. Т.е. получается, что помимо исходников самого wine (126 мб), требуется еще ковыряться в багах X11 и возможно не только его.&lt;br /&gt;- существуют "баги на багах, которые дают фичу". То есть бага в windows библиотеках и в приложениях, в результате все работает как надо. А если перенести это все в wine, то работать все перестает.&lt;br /&gt;&lt;br /&gt;"Сложно" и "не красиво" это проблемы первого порядка. Если не иметь опыта управления проектами по разработке программного продукта, то эти две проблемы могут остановить любого.&lt;br /&gt;&lt;br /&gt;Мне же видится, что с этими проблемами можно что-то сделать, чтобы они не казались такими страшными. На мой взгляд, это:&lt;br /&gt;- разработка системы юнит-тестирования всего. Вообще всего. Это главная проблема, потому что это очень долго и трудоемко, но без этого никуда. Я подозреваю, что в самом "логове" (Microsoft) очередная сборка операционной системы проходит в буквальном смысле миллионы автоматических тестов. Тестируется каждый метод, каждая функция каждой библиотеки, и зоркие глаза тестовых скриптов внимательно следят за тем, чтобы все было как ожидается в тесте. При обнаружении баги проблемная dll локализуется, бага исправляется, запускается перетестирование.&lt;br /&gt;В wine ничего этого, похоже, нет. Есть 17-летняя работа по написанию этого wine, но нет тестов. Странно. В их понимании, видимо, "тестирование" - это запуски разных программ под wine и присваивание им уровней совместимости "золотой", "серебряный", "бронзовый" - т.е. функциональное тестирование, а не юнит-тестирование.&lt;br /&gt;- декомпозиция всех фич винды на маленькие тестовые примеры, эксплуатирующие одну конкретную фичу типа построения сплайнов по нескольким точкам.&lt;br /&gt;&lt;br /&gt;Вот если иметь перед собой набор из 5000 фич, которые не работают в wine, и планомерно, хладнокровно, фиксить эти фичи одна-за-одной, то будет прогресс. Но это очень дорого по людям и затратам. И поэтому такой вариант не случится, поскольку он не окупит затрат.&lt;br /&gt;&lt;br /&gt;Люди из WineSkin сделали уже очень многое. Они как раз решают две задачи, важные с точки зрения практического применения wine под Mac OS:&lt;br /&gt;- они вкручивают в него собственную сборку X11&lt;br /&gt;- добавляют обертку для представления wine + win приложение в качестве настоящего приложения Mac, с маковским меню.&lt;br /&gt;&lt;br /&gt;На данный момент я вижу работу в использовании наработок wineskin + прохаченный winetricks'ом набор библиотек (т.е. некоторые dll подменены на настоящие). Но это не решит всех проблем. Рано или поздно, придется ковыряться в этом наборе из сотен мегабайт исходного кода... Вот скажем, где зарыта бага, ведущая к таким красивым картинкам? Ответ нетривиальный...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-9104285014190038507?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/9104285014190038507/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2010/06/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/9104285014190038507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/9104285014190038507'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2010/06/blog-post.html' title='Причины вайнофобии'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/TAi19mwwzGI/AAAAAAAAAH4/9FB5lALlgi8/s72-c/MAC_fail.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-7520865585647088097</id><published>2010-05-22T22:10:00.010+04:00</published><updated>2010-05-26T21:14:02.206+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='wine'/><title type='text'>Сборка вина под тигром</title><content type='html'>Наконец-то удалось собрать wine под Mac OS Tiger 10.4.11. Не думал, что это представляет из себя такие сложности.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/S_gk-YFhUlI/AAAAAAAAAHs/LSJaVwS9LfU/s1600/mac_wine.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 400px; height: 210px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/S_gk-YFhUlI/AAAAAAAAAHs/LSJaVwS9LfU/s400/mac_wine.jpg" alt="" id="BLOGGER_PHOTO_ID_5474166001104933458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;td valign="top"&gt;&lt;br /&gt;&lt;br /&gt;Почему Tiger? Потому, что у меня в виртуальной машине более старшие версии хакинтоша (Leopard, Snow Leopard) не ставятся: уже на момент запуска инсталлятора идет бесконечный ребут. Подозрения на то, что этому инсталлятору нужна поддержка VT-x в процессоре.&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Итак, что нам потребуется.&lt;br /&gt;&lt;a href="http://adcdownload.apple.com/Developer_Tools/xcode_2.5_developer_tools/xcode25_8m2558_developerdvd.dmg"&gt;XCode 2.5&lt;/a&gt; - на более старых версиях не собирается вообще. Эту версию Xcode придется скачать и установить, т.к. на установочном диске идет версия 2.4.1. (Для leo нужна уже другая версия Xcode, 3.1.4).&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/flex/"&gt;flex-2.5.35&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kernel.org/pub/software/scm/git/git-1.7.1.tar.bz2"&gt;git-1.7.1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://downloads.sourceforge.net/freetype/freetype-2.3.12.tar.bz2"&gt;freetype-2.3.12&lt;/a&gt;&lt;br /&gt;&lt;a href="http://zlib.net/zlib-1.2.5.tar.bz2"&gt;zlib-1.2.5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/fontforge/files/fontforge-source/fontforge_full-20100501.tar.bz2/download"&gt;fontforge&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pkg-config.freedesktop.org/releases/"&gt;pkgconfig-0.18&lt;/a&gt;&lt;br /&gt;&lt;a href="http://fontconfig.org/release/fontconfig-2.8.0.tar.gz"&gt;fontconfig-2.8.0&lt;/a&gt; - конфигурировать с префиксом /usr/X11R6&lt;br /&gt;&lt;a href="http://www.ijg.org/files/jpegsrc.v8b.tar.gz"&gt;jpeg-8b&lt;/a&gt;&lt;br /&gt;&lt;a href="http://prdownloads.sourceforge.net/libpng/libpng-1.4.2.tar.gz?download"&gt;libpng-1.4.2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dl.maptools.org/dl/libtiff/"&gt;tiff-3.9.2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Потом скачиваем последние исходники wine:&lt;br /&gt;&lt;pre&gt;git clone git://source.winehq.org/git/wine.git ~/wine-git&lt;br /&gt;&lt;/pre&gt;И после этого все должно собраться. Сборка идет оочень долго: на 2 ггц компе это целый день. Как видим на скриншоте, папка с исходниками wine после его компиляции занимает 770 мегабайт, а папка с установленным wine - 180 мегабайт.&lt;br /&gt;&lt;br /&gt;Далее такие настройки для запуска wine:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;export DISPLAY=:0.0&lt;br /&gt;x&amp;amp;&lt;br /&gt;xhost +local:&lt;br /&gt;export WINEPREFIX=/Users/danx/Public/work/.wine&lt;br /&gt;export PATH=/Users/danx/Public/work/bin:$PATH&lt;br /&gt;winecfg (здесь согласиться установить gecko)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-7520865585647088097?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/7520865585647088097/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2010/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7520865585647088097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7520865585647088097'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2010/05/blog-post.html' title='Сборка вина под тигром'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/S_gk-YFhUlI/AAAAAAAAAHs/LSJaVwS9LfU/s72-c/mac_wine.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-5243847732364258329</id><published>2009-11-28T23:01:00.011+03:00</published><updated>2009-11-30T20:56:06.424+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualdub'/><category scheme='http://www.blogger.com/atom/ns#' term='avisynth'/><title type='text'>Пакетное перекодирование видео: cmd.exe + virtual dub + avisynth</title><content type='html'>В этом посте я расскажу, как правильно переконвертировать видео в нужный формат, используя только опен-сорсовые решения. Переконвертация будет на примере видео роликов от 5DMk2.&lt;br /&gt;&lt;br /&gt;Для работы потребуются:&lt;br /&gt;* Windows XP&lt;br /&gt;* Avisynth, скачать и установить c одноименного сайта в домене org&lt;br /&gt;* Virtual Dub, лежит тоже на своем сайте.&lt;br /&gt;* K-lite codec pack с набором DirectShow кодеков&lt;br /&gt;&lt;br /&gt;Ависинт используется для того, чтобы виртуал даб открывал неизвестные ему видеофайлы - а таких сейчас большинство: например, MOV, MKV файлы с кодеком H.264 и др.&lt;br /&gt;&lt;br /&gt;Вкратце - мы будем на примере одного файла создавать данные для автоматической перекомпрессии подобных ему видеофайлов с аналогичными параметрами компрессии.&lt;br /&gt;&lt;br /&gt;Итак, шаги:&lt;br /&gt;(1) Настраиваем кодеки:&lt;br /&gt;Пуск-&gt;Программы-&gt;K-Lite Codec Pack-&gt;Configuration-&gt;ffdshow audio decoder -- ставим вот это поле в "all supported", иначе звука в видеоролике не будет:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/SxGEaMdxysI/AAAAAAAAAHE/BRGUPVaEYcc/s1600/audioconf.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 334px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/SxGEaMdxysI/AAAAAAAAAHE/BRGUPVaEYcc/s400/audioconf.jpg" alt="" id="BLOGGER_PHOTO_ID_5409250213006265026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Пуск-&gt;Программы-&gt;K-Lite Codec Pack-&gt;Configuration-&gt;ffdshow video decoder&lt;br /&gt;Здесь надо сделать такие настройки для правильного декодирования цвета:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGFGgvacBI/AAAAAAAAAHM/CVDXZkPZLGs/s1600/videoconf.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 334px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGFGgvacBI/AAAAAAAAAHM/CVDXZkPZLGs/s400/videoconf.jpg" alt="" id="BLOGGER_PHOTO_ID_5409250974363185170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(2) Пишем простенький скрипт на ависинте, и сохраняем этот текст в файл с именем "3.avs":&lt;br /&gt;&lt;blockquote&gt;DirectShowSource("PROCESS.MOV", fps=30).ConvertToYUY2(matrix="Rec709").TemporalSoften(4,4,8,15,2)&lt;/blockquote&gt;&lt;br /&gt;Параметр fps задает частоту кадров исходного видео, если она по каким-то причинам некорректно самоорпеделится. Тут важным параметром является matrix, который правильно конвертирует цвета.&lt;br /&gt;&lt;br /&gt;(3) Далее открываем этот текстовый файл в virtual dub как видео, переключаем в меню Audio в Fill Processing Mode, потом Audio-&gt;Compression выставляем в AC3 384 Kbit/s (тут можно выбрать нужный аудио кодек по желанию; мои эксперименты показывают, что если выбрать MP3, то будет рассинхронизация аудио и видео в фильме).&lt;br /&gt;&lt;br /&gt;(4) Выставляем компрессию видео: Video-&gt;Compression. Я выбираю XVID кодек и выставляю его настройки так:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGGs8RFiqI/AAAAAAAAAHU/C1mLfa2Ww_o/s1600/videocomp.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 313px; height: 400px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGGs8RFiqI/AAAAAAAAAHU/C1mLfa2Ww_o/s400/videocomp.jpg" alt="" id="BLOGGER_PHOTO_ID_5409252734098836130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(5) Теперь самое интересное: нажимаем File-&gt;Save as AVI и не забываем поставить внизу галочку.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/SxGHIi73mRI/AAAAAAAAAHc/pG1Sp6FkKss/s1600/saveavi.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/SxGHIi73mRI/AAAAAAAAAHc/pG1Sp6FkKss/s400/saveavi.jpg" alt="" id="BLOGGER_PHOTO_ID_5409253208335292690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(6) Потом переходим в File-&gt;Job Control и выбираем в этом меню пункт Save Job List и сохраняем файл описания будущей перекодировки как process.job.&lt;br /&gt;&lt;br /&gt;(7) Теперь редактируем файл process.jobs - меняем вот эти строки&lt;br /&gt;&lt;blockquote&gt;VirtualDub.subset.Clear();&lt;br /&gt;VirtualDub.subset.AddRange(0,100);&lt;br /&gt;VirtualDub.video.SetRange();&lt;br /&gt;VirtualDub.project.ClearTextInfo();&lt;br /&gt;// -- $reloadstop --&lt;br /&gt;VirtualDub.SaveAVI("E:\\Photo\\2009_11_28\\MVI_0034.avi");&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;на такие:&lt;br /&gt;&lt;blockquote&gt;VirtualDub.subset.Delete();&lt;br /&gt;VirtualDub.video.SetRange();&lt;br /&gt;VirtualDub.project.ClearTextInfo();&lt;br /&gt;// -- $reloadstop --&lt;br /&gt;VirtualDub.SaveAVI(VirtualDub.params[0]);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Все остальные строчки оставляем без изменения.&lt;br /&gt;&lt;br /&gt;(8) Теперь все готово для автоматической перепаковки видеофайлов. Это будет делать вот этот скрипт:&lt;br /&gt;&lt;pre&gt;@echo off                           &lt;br /&gt;&lt;br /&gt;del /q /s PROCESS.MOV &gt;nul 2&gt;&amp;amp;1&lt;br /&gt;FOR %%i IN (*.mov) do (&lt;br /&gt; if not exist %%~ni.avi (&lt;br /&gt;   echo.&lt;br /&gt;   echo.&lt;br /&gt;   echo Re-compressing %%i&lt;br /&gt;   ren %%i PROCESS.MOV&lt;br /&gt;   set TM=!TIME::=!&lt;br /&gt;   "C:\Program Files\VirtualDub\vdub.exe" /i recode.job %%~ni.avi  &gt;nul&lt;br /&gt;   set TM2=!TIME::=!&lt;br /&gt;   set /A RES=!TM2:~0,2!*3600 + !TM2:~2,2!*60 + !TM2:~4,2! - !TM:~0,2!*3600 - !TM:~2,2!*60 - !TM:~4,2!&lt;br /&gt;   set /A HRS=!RES! / 3600&lt;br /&gt;   set /A MINS=!RES! - !HRS!*3600&lt;br /&gt;   set /A MINS=!MINS! / 60&lt;br /&gt;   set /A SECS=!RES! - !HRS!*3600 - !MINS!*60&lt;br /&gt;   if !MINS! LSS 10 set MINS=0!MINS!&lt;br /&gt;   if !SECS! LSS 10 set SECS=0!SECS!&lt;br /&gt;   echo Elapsed time !HRS!:!MINS!:!SECS!&lt;br /&gt;   ren PROCESS.MOV %%i&lt;br /&gt; )&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Этот скрипт написан на языке командного интерпретатора cmd.exe. Чтобы он правильно работал, надо создать в реестре вот этот ключик DelayedExpansion = 1:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGJILJMKbI/AAAAAAAAAHk/7svtuFFPHfk/s1600/reg.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 150px;" src="http://4.bp.blogspot.com/_PHEWnO6OCjY/SxGJILJMKbI/AAAAAAAAAHk/7svtuFFPHfk/s400/reg.jpg" alt="" id="BLOGGER_PHOTO_ID_5409255400971970994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Этот ключик говорит о том, чтобы cmd.exe использовал отложенное связывание переменных со значениями. Это необходимо, т.к. иначе внутри цикла переменные бы не обновлялись. Чтобы они стали обновляться, необходимо обращаться к ним по имени типа !VAR! а не %VAR%.&lt;br /&gt;&lt;br /&gt;Вот, вроде все. Этот скрипт будет перекодировать все видеофайлы в текущей директории с один раз указанными параметрами, и в качестве бонуса скрипт будет выводить, сколько времени заняло перекодировать каждый файл.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-5243847732364258329?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/5243847732364258329/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/11/cmdexe-virtual-dub-avisynth.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5243847732364258329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5243847732364258329'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/11/cmdexe-virtual-dub-avisynth.html' title='Пакетное перекодирование видео: cmd.exe + virtual dub + avisynth'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/SxGEaMdxysI/AAAAAAAAAHE/BRGUPVaEYcc/s72-c/audioconf.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-284319821736615114</id><published>2009-08-13T22:54:00.009+04:00</published><updated>2009-08-14T00:07:39.588+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openfire'/><category scheme='http://www.blogger.com/atom/ns#' term='red5'/><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><category scheme='http://www.blogger.com/atom/ns#' term='red5phone'/><category scheme='http://www.blogger.com/atom/ns#' term='flaphone'/><title type='text'>Red5+ openfire + Jetty + mjsip = red5phone</title><content type='html'>Вот и настал день, когда я познакомился с Red5 на деле. Никогда не думал, что это произойдет 12 августа 2009 года. Сказать откровенно, эта технология заинтересовала меня пару месяцев назад, и я даже делал дежурные лукапы в википедии насчет того, что же это такое. Еще тогда я понял что это что-то нереально крутое, но поскольку не было необходимости эти технологии применять, то я благополучно оставил их в покое.&lt;br /&gt;&lt;br /&gt;И вот необходимость в этих технологиях пришла. Началось с того, что мне потребовалось "завести" флешовый софтфон, по образу и подобию flaphone, про который я уже как-то упоминал в этом блоге. Было очень интересно разобраться, что же это такое, флешовый телефон, как он может работать, на каких принципах построена его работа.&lt;br /&gt;&lt;br /&gt;Сначала я не подозревал ничего загадочного и свято верил в то, что на флеше можно писать SIP user agent-ов... Даже предполагал о существовании какой-то реализцации SIP стека, портированного под адобовский Action Script.&lt;br /&gt;&lt;br /&gt;Но не тут-то было. Еще по опыту программирования на Swift 3D я знал, что флеш (точнее, flex) - настолько тупой язык, что не умеет делать ничего кроме анимации и проигрывания аудио (т.е. видео ролик - формат flv это он и есть), плюс работа с клавиатурой и мышью. Как же видеоролик может работать как SIP soft phone?&lt;br /&gt;&lt;br /&gt;Разгадка оказалась гениальная.&lt;br /&gt;&lt;br /&gt;Начну с небольшой теории. Флеш - это клиент RTMP, т.е. потребитель стримингового аудио и видео, которое в простейшем случае просто хранится на сервере, льется в флеш клиента и таким образом получается та самая анимация во флеш-роликах.&lt;br /&gt;Так вот. для того, чтобы флеш работал как SIP телефон, необходим Flash Server, или RTMP сервер. Red5 это и есть Flash Server.&lt;br /&gt;&lt;br /&gt;Red5 написан на Java. Он сидит на компе-сервере, рядом с ним сидит сервлет-контейнер Jetty, который фактически является не чем иным, как веб-сервером, способным у себя на сервере исполнять Java-сервлеты.&lt;br /&gt;Вот эта дружная парочка Red5 + Jetty может жить как сама по себе (это называется standalone Red5 server), либо они могут паратизировать внутри openfire.&lt;br /&gt;Openfire это XMPP сервер (т.е. Jabber-сервер), но для него существует плагин Red5.&lt;br /&gt;&lt;br /&gt;Итак, гремучая смесь openfire + red5 + Jetty сидит на сервере, она написана на Java, требует себе Java SE JDK 1.6, и также внутри red5 зашит mjsip - опен-сорсовый java-вский SIP стек.&lt;br /&gt;Вот и разгадка головоломки. За SIP соединение с телефонным сервером отвечает mjsip стек внутри Java-вского приложения Red5 (кстати, он стоит как web service на Jetty).  Red5 занимается перепаковкой RTP пакетов с payload (со звуком или видео) в протокол RTMP и стримит эти данные на флешовый "телефон" в клиентском браузере. В обе стороны от флеша до red5 и обратно ходят управляющие сообщения, которые на стороне red5 преобразуются в SIP сообщения.&lt;br /&gt;Таким образом, все флешовые софт-телефоны, на самом-то деле, живут внутри red5 на стороне сервера, а на клиентской стороне висят только их флешовые анимашки.&lt;br /&gt;&lt;br /&gt;Ну а теперь к практическому занятию. Давайте соединим FreeSWITCH и флешовый телефон. Для этого нам потребуется такие компоненты (ставить в указанном порядке):&lt;br /&gt;1) FreeSWITCH в поставляемой по дефолту настройке&lt;br /&gt;2) Java SE JDK 1.6 последняя. На момент написания поста была последняя Update 16, скачиваем и ставим: http://java.sun.com/javase/downloads/index.jsp&lt;br /&gt;3) openfire. С ним все проще, т.к. внутри него уже есть Jetty и поэтому отдельный веб-сервер (Jetty, Tomcat или JBoss) и отдельный Red5 сервер ставить не надо. Скачиваем и ставим последнюю версию openfire отсюда: http://www.igniterealtime.org/projects/openfire/index.jsp. На момент написания поста последняя версия была 3.6.4.&lt;br /&gt;4) Red5 openfire plugin: Скачиваем с сайта http://www.igniterealtime.org/projects/openfire/plugins-beta.jsp. Он помечен как beta, вот прямая &lt;a href="http://www.igniterealtime.org/projects/openfire/plugins-beta/red5.war"&gt;ссылка&lt;/a&gt;. Скачиваем этот файл и подкладываем его в папку "C:\Program Files\Openfire\plugins\"&lt;br /&gt;&lt;br /&gt;В интернете еще ссылаются на некий загадочный sip.zip, который уже из многих мест, где он лежал, удален. Практика показывает, что без этого файла все работает: весьма вероятно, плагин red5 уже содержит в себе эту функциональность.&lt;br /&gt;&lt;br /&gt;Далее запускаем openfire, заходим на страницу его администрирования и прощелкиваем все пункты кнопкой Далее. Тут важно именно щелкать эти кнопки по-порядку, а не пропускать некоторые - иначе openfire (точнее Jetty) вылетает в server failure.&lt;br /&gt;После прощелкивания админки все готово к работе. Сформируется такой адрес для Red5: http://localhost:7070/red5/. Вот на этот адрес и надо зайти из браузера.&lt;br /&gt;&lt;br /&gt;Все. Мы увидели в веб-страничке flash softphone, который надо зарегистрировать на FreeSWITCH и можно будет делать звонки.&lt;br /&gt;&lt;br /&gt;Но! тут один нюанс: в этом софтфоне (он называется red5phone)  бага, он не умеет авторизовываться, если пароль не пустой. Поэтому надо сделать пустой пароль для вашего внутреннего номера:&lt;br /&gt;"C:\Program Files\FreeSWITCH\conf\directory\default\1000.xml"&lt;br /&gt;&lt;br /&gt;     &lt;param name="password" value=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Потом запускаем FreeSWITCH, прописываем в red5phone такие параметры:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_PHEWnO6OCjY/SoRqkgAsSHI/AAAAAAAAAGc/Yfe4Jye181E/s1600-h/red5phone.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 288px; height: 248px;" src="http://1.bp.blogspot.com/_PHEWnO6OCjY/SoRqkgAsSHI/AAAAAAAAAGc/Yfe4Jye181E/s400/red5phone.jpg" alt="" id="BLOGGER_PHOTO_ID_5369533831033145458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Здесь IP-адрес - это адрес, на котором установлен FreeSWITCH, и voila!&lt;br /&gt;&lt;br /&gt;Можно звонить! Вот показан пример как я с обычного софтфона звоню на флешфон:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/SoRs3elnNDI/AAAAAAAAAGk/5PX7yZ9oAvQ/s1600-h/red5phone4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/SoRs3elnNDI/AAAAAAAAAGk/5PX7yZ9oAvQ/s400/red5phone4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5369536356091900978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Насчет глючности Red5Phone - радует что для него доступны исходные коды. Счастье есть :)&lt;br /&gt;&lt;br /&gt;Follow-up касательно сообщения из первого поста про flaphone: "пока не разобрался, почему flaphone не может коннектиться к моему телефонному серверу".&lt;br /&gt;Все теперь понятно, почему: потому что чтобы flaphone звонил, ему тоже нужен RTMP сервер! И поэтому он жестко завязан в коде на свой родной Netconnector URL своего RTMP сервера.&lt;br /&gt;Кстати, flaphone сначала использовал именно Red5 в качестве RTMP сервера, потом они перешли на коммерческий продукт Wowza, а сейчас и вовсе &lt;a href="http://blog.flaphone.com/index.php/2008/08/29/flashphone_wowza_zingaya/"&gt;сами написали&lt;/a&gt; свою реализацию RTMP сервера.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-284319821736615114?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/284319821736615114/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/08/red5-openfire-jetty-mjsip-red5phone.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/284319821736615114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/284319821736615114'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/08/red5-openfire-jetty-mjsip-red5phone.html' title='Red5+ openfire + Jetty + mjsip = red5phone'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PHEWnO6OCjY/SoRqkgAsSHI/AAAAAAAAAGc/Yfe4Jye181E/s72-c/red5phone.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-1518564857803734731</id><published>2009-07-22T17:33:00.011+04:00</published><updated>2009-07-23T10:54:24.876+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><category scheme='http://www.blogger.com/atom/ns#' term='yate'/><title type='text'>Соединяем Yate + FreeSWITCH</title><content type='html'>Задача: соединить две телефонные сети, одну на базе Yate, вторую на базе FreeSWITCH, воедино, чтобы пользователи могли через "восьмерку" звонить из одной сети в другую.&lt;br /&gt;&lt;br /&gt;Начальные условия: пусть у нас Yate будет установлен по адресу 192.168.3.220, а сервер FreeSWITCH - по адресу 192.168.3.217.&lt;br /&gt;На стороне FreeSWITCH номер телефона 1019 используется для входящего транка с Yate. При этом CLID звонящего подменяется на строку "From Yate".&lt;br /&gt;&lt;br /&gt;Решение:&lt;br /&gt;На стороне Yate:&lt;br /&gt;&lt;br /&gt;acctfile.conf&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;[freeswitch]&lt;br /&gt;enabled=yes&lt;br /&gt;protocol=sip&lt;br /&gt;username=1019&lt;br /&gt;description=freeswitch account&lt;br /&gt;authname=1019&lt;br /&gt;password=1234&lt;br /&gt;number=1019&lt;br /&gt;domain=192.168.3.217&lt;br /&gt;registrar=192.168.3.217:5060&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Yate должен быть принудительно авторизорван на FreeSWITCH с использованием этого кода, поскольку FreeSWITCH по умолчанию не пускает к себе юзеров из чужого домена.&lt;br /&gt;&lt;br /&gt;regexroute.conf:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;^8\(.*\)$=sip/sip:\1;line=freeswitch;caller=From Yate&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Здесь все, что написано после слова freeswitch, можно удалить, и тогда CLID будет передаваться настоящий, равный внутреннему номеру абонента в сети Yate.&lt;br /&gt;&lt;br /&gt;На стороне FreeSWITCH:&lt;br /&gt;&lt;br /&gt;dialplan/default/yate.xml:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;pre&gt;&amp;lt;extension name="yate_extens"&amp;gt;&lt;br /&gt; &amp;lt;condition field="destination_number" expression="^8(\d+)$"&amp;gt;&lt;br /&gt;   &amp;lt;action application="set" data="hangup_after_bridge=true"/&amp;gt;&lt;br /&gt;   &amp;lt;action application="bridge" data="sofia/external/$1@192.168.3.220"/&amp;gt;&lt;br /&gt;   &amp;lt;action application="hangup"/&amp;gt;&lt;br /&gt; &amp;lt;/condition&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;Оказалось это совсем не сложно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-1518564857803734731?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/1518564857803734731/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/07/yate-freeswitch.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1518564857803734731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1518564857803734731'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/07/yate-freeswitch.html' title='Соединяем Yate + FreeSWITCH'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-2503428674201221116</id><published>2009-07-17T22:38:00.015+04:00</published><updated>2009-07-18T11:45:34.278+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='batch files'/><title type='text'>Мой workflow для high quality car audio</title><content type='html'>Последнее время я коллекционирую и слушаю только lossless музыку (в формате APE или FLAC), при этом предпочитаю &lt;a href="http://www.exactaudiocopy.de/"&gt;рипать аудио диск&lt;/a&gt; целиком, получая в результате два файла (*.APE и *.CUE). Конвертация звука в APE делается автоматически, на лету во время рипа, если в системе установлен &lt;a href="http://www.monkeysaudio.com/"&gt;Monkey's Audio&lt;/a&gt; и Exact Audio Copy должным образом настроен.&lt;br /&gt;Вот в таком виде я и слушаю музыку на компьютере:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/SmDHBR1PBSI/AAAAAAAAAGU/lL6qhx3pXHE/s1600-h/psb1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/SmDHBR1PBSI/AAAAAAAAAGU/lL6qhx3pXHE/s400/psb1.jpg" alt="" id="BLOGGER_PHOTO_ID_5359502381351372066" border="0" /&gt;&lt;/a&gt;используя для этого Winamp с плагином &lt;a href="http://www.winamp.com/plugins/details/143011"&gt;CUE Player&lt;/a&gt;, который, для целей отображения в трек-листе Winamp-а, разбивает этот имадж диска на треки согласно информации в CUE файле. Очень удобно.&lt;br /&gt;&lt;br /&gt;Но, когда дело доходит до прослушивания музыки не на компьютере, а в машине, на обычной CD-MP3 автомагнитоле, то приходится специально для магнитолы делать mp3-шки из этих lossless рипов. Вот как я их делаю:&lt;br /&gt;&lt;br /&gt;1) Распаковываю APE файл в WAV, используя консольную утилиту от Monkey's Audio, потом редактирую CUE файл, заменяя в нем подстроку "ape" на "wav". Эти действия делаются автоматически при запуске вот этого батничка в каталоге, показанном на скриншоте выше.&lt;br /&gt;&lt;br /&gt;--- файл ape2wav.bat ---&lt;br /&gt;&lt;pre&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;@echo off&lt;br /&gt;&lt;br /&gt;if "%1%" == "GO" (&lt;br /&gt;&lt;br /&gt;  FOR /F "usebackq tokens=*" %%j IN (%2) DO (&lt;br /&gt;   FOR /F "usebackq tokens=1,2 delims=." %%k IN ('%%j') DO (&lt;br /&gt;     FOR /F "usebackq tokens=1,3 delims=" %%m IN ('%%k') DO (&lt;br /&gt;       FOR /F "usebackq tokens=1 delims=e" %%o IN ('%%l') DO (&lt;br /&gt;         if "%%o" == "ap" (&lt;br /&gt;            echo 1 &gt; equal&lt;br /&gt;            echo %%m.wav" WAVE&lt;br /&gt;         )&lt;br /&gt;       )&lt;br /&gt;     )&lt;br /&gt;   )&lt;br /&gt;   if NOT EXIST equal (&lt;br /&gt;     echo %%j&lt;br /&gt;   ) else del equal&lt;br /&gt;  )&lt;br /&gt;) else (&lt;br /&gt;&lt;br /&gt;  IF EXIST unpacked del /Q unpacked&lt;br /&gt;  mkdir unpacked &gt; nul 2&gt;&amp;amp;1&lt;br /&gt;&lt;br /&gt;  FOR %%i IN (*.ape) do (&lt;br /&gt;    mac "%%i" "unpacked\%%~ni.wav" -d&lt;br /&gt;    copy "%%~ni.cue" "unpacked\" &gt; nul 2&gt;&amp;amp;1&lt;br /&gt;  )&lt;br /&gt;&lt;br /&gt;  cd unpacked&lt;br /&gt;&lt;br /&gt;  FOR %%i IN (*.cue) do (&lt;br /&gt;    call ape2wav.bat GO "%%i" &gt; "%%~pni.tmp"&lt;br /&gt;    del "%%i"&lt;br /&gt;    ren "%%~pni.tmp" "%%i"&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/pre&gt;--- end ---&lt;br /&gt;&lt;br /&gt;В этом коде есть бага, которую пока руки не доходят пофиксить: если в имени файла, упомянутом внутри CUE файла, есть точка (не считая точки перед расширением), то этот алгоритм не может заменить расширение ape на wav. Если ее зафиксить, то объем кода возрастет еще, хотя и сейчас видно, какое это извращение - писать на чистом batch языке алгоритмы поиска и замены подстрок в файлах.&lt;br /&gt;&lt;br /&gt;2) В Exact Audio Copy выбираю меню "разделить WAV-файл согласно Cue Sheet"-&gt;"с зазорами"&lt;br /&gt;3) Ну и собственно финал: кодирую в MP3 с максимальным качеством:&lt;br /&gt;&lt;br /&gt;-- wav2mp3.bat --&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;for /R %%i in (*.wav) do (&lt;br /&gt;  cd "%%~di%%~pi"&lt;br /&gt;  lame --alt-preset extreme "%%~nxi" "%%~ni.mp3"&lt;br /&gt;  del "%%~nxi"&lt;br /&gt;) &lt;/span&gt;&lt;/blockquote&gt;&lt;/pre&gt;-- end --&lt;br /&gt;&lt;br /&gt;В этом шаге используется LAME для кодированя в MP3, причем с экстремальным пресетом - это наилучший по качеству способ сжатия аудио данных с переменным битрейтом.&lt;br /&gt;&lt;br /&gt;P.S. Люблю программировать батнички под Windows :)  Такие извращения порой получаются, особенно если делать какую-то нетривиальную задачу, изящно выглядящую на perl/sed/awk. В этом примере переменная "%%~di%%~pi" это цветочки :)&lt;br /&gt;&lt;br /&gt;P.P.S. Для полного щастья осталось научиться из скрипта вызывать функцию разбития большого WAV на куски согласно информации в CUE файле - тогда вся операция будет состоять из запуска одного скрипта.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-2503428674201221116?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/2503428674201221116/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/07/workflow-high-quality-car-audio.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/2503428674201221116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/2503428674201221116'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/07/workflow-high-quality-car-audio.html' title='Мой workflow для high quality car audio'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_PHEWnO6OCjY/SmDHBR1PBSI/AAAAAAAAAGU/lL6qhx3pXHE/s72-c/psb1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-1438009956305414649</id><published>2009-07-13T22:29:00.012+04:00</published><updated>2009-07-14T01:08:57.642+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='annoyances'/><title type='text'>Fixed: HHCTRL 1903 Event Logger</title><content type='html'>Наконец-то поймал того &lt;strike&gt;зверя за яйца&lt;/strike&gt;, кто вываливает мне в системный журнал каждые полчаса вот такие вот события:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/Slt_Z-6NqTI/AAAAAAAAAGE/8pBawvM08b0/s1600-h/hhctrl1903.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer; width: 361px; height: 400px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/Slt_Z-6NqTI/AAAAAAAAAGE/8pBawvM08b0/s400/hhctrl1903.jpg" alt="" id="BLOGGER_PHOTO_ID_5358016266047957298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ссылка, приведенная в описании этого эвента, говорит ни много ни мало о том, что "MS05-026: Уязвимость в элементе управления HTML Help делает возможным удаленный запуск программного кода". В результате я стал security concerned и стал искать, кто же это меня хачит на моем домашнем ноутбуке.&lt;br /&gt;На ноуте стоит WinXP SP3 со всеми последними апдейтами. Установлен DoctorWeb 5 с последними базами. Запускаю полное сканирование всех дисков в максимальных настройках эвристики - ничего не находит.&lt;br /&gt;Окей, скачиваю широко известную в узких кругах программу &lt;a href="http://fileforum.betanews.com/detail/Spybot-Search-Destroy/1043809773/1"&gt;SpyBot S&amp;amp;D&lt;/a&gt; - она также ничего не находит. Пробую искать троянов программой &lt;a href="http://fileforum.betanews.com/detail/AdAware/965718306/1"&gt;Ad-Aware&lt;/a&gt;, она тоже ничего страшного не находит. Иду, скачиваю демо-версию (на месяц) &lt;a href="http://www.kaspersky.ru/kaspersky_anti-virus_downloads"&gt;антивируса Касперского&lt;/a&gt;.&lt;br /&gt;Касперский действительно находит кое-что, но это оказалось не помогло:&lt;br /&gt;- сообщил мне что мой плеер Winamp (который я обновлял пару недель назад) - имеет страшную уязвимость и заставил проапгрейдиться на последнюю версию 5.56.&lt;br /&gt;- vmware 5.5, из-под которой я запускаю Linux, тоже оказалось с уязвимостью&lt;br /&gt;- Самый неожиданный результат сканирования касперским: оказывается, одна из программ от Adobe (Adobe Bridge) тащит с собой старую версию Adobe flash player plugin, в котором есть уязвимость. При этом Adobe Updater обновляет Flash player plugin в системных путях, но не обновляет в папке с Adobe Bridge (!) - жесть, кто вообще тестировал Adobe Updater?&lt;br /&gt;&lt;br /&gt;Но и касперский ничего не находит. И тут я вспомнил про замечательную программу procmon.exe от компании sysinternals, которая у меня много лет входит в список любимых системных утилит. Скачал &lt;a href="http://soft.softodrom.ru/ap/Process-Monitor-p6464"&gt;последнюю версию&lt;/a&gt; и обнаружил потрясающую связь &lt;a href="http://omega-it.blogspot.com/2009/04/blog-post.html"&gt;с вот этим постом&lt;/a&gt;, взглянув на то, кто же автор этой программы. Никогда не запоминал фамилии, поэтому раньше Русинович и sysinternals/procmon у меня никогда не ассоциировались.&lt;br /&gt;&lt;br /&gt;Итак, что же нам сказал Procmon? А он нам совершенно недвусмысленно сказал, что этот OCX контрол пытается раз в полчаса использовать не кто иной, как сам Dr.Web (!) - точнее, DrWebUpW.exe, модуль, который обновляет антивирусные базы доктора веба:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_PHEWnO6OCjY/SluSKOwtUgI/AAAAAAAAAGM/l0X0co6deBs/s1600-h/drwebupd.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 374px; height: 400px;" src="http://3.bp.blogspot.com/_PHEWnO6OCjY/SluSKOwtUgI/AAAAAAAAAGM/l0X0co6deBs/s400/drwebupd.jpg" alt="" id="BLOGGER_PHOTO_ID_5358036886146077186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Пипец! Сам антивирус регулярно создает опасные ситуации, во время которых исполняются уязвимые части кода, которые могут привести к security issues!&lt;br /&gt;На кой ляд доктор веб, при обновлении своих баз, использует эту библиотеку, которая позволяет использовать справку к программе в формате CHM?&lt;br /&gt;При этом, перед тем как загрузить эту библиотеку и вызвать из нее функцию (уж не HtmlHelp() ли?), Доктор веб проверяет, не приаттачен ли к событию загрузки этой библиотеки дебаггер (!):&lt;br /&gt;проверяется на существование вот этот ключ реестра:&lt;br /&gt;HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\hhctrl.ocx&lt;br /&gt;&lt;br /&gt;Кажется, &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2005/12/19/505449.aspx"&gt;вот зачем&lt;/a&gt; апдейтер доктора веба постоянно лезет в реестр и проверяет этот ключик при выкачивании обновлений:&lt;br /&gt;Evil can be done with the Image File Execution Options key. Malware can install themselves as the "debugger" for a frequently-run program (such as Explorer) and thereby inject themselves into the execution sequence.&lt;br /&gt;(короче говоря, хочет быть уверенным, что скачанный файл с базами не перехвачен и не подменен вирусом... Только я ума не приложу, как можно с помощью hhctrl.ocx выкачивать апдейты из интернета..).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;В процессе разборок было выяснено, что вот &lt;a href="http://securityvulns.ru/Hdocument451.html"&gt;такой вот&lt;/a&gt; эксплоит на базе HHCTRL (сохранить &lt;span name="Document"&gt;&lt;span class="fixed"&gt;отмеченное как sp2rc.htm в файл)&lt;/span&gt;&lt;/span&gt; доктором вебом с последними базами не опознается как опасный (вообще DrWeb не реагирует!), тогда как касперский его ловит сразу же. Касперский рулит.&lt;br /&gt;Кстати, даже движок этого блога не допускает приведения текста этого эксплоита непосредственно в тексте записи (наверное тоже догадывается что этот код вредоносный).&lt;br /&gt;&lt;br /&gt;Итак, что мы имеем? По непонятным причинам Dr.Web использует hhctrl.ocx (CLSID ADB880A6-D8FF-11CF-9377-00AA003B7A11) для того, чтобы скачивать апдейты. При этом случается неизвестная ошибка 1903 с модуле hhctrl, что подозрительно. Также мы знаем, что именно этот модуль hhctrl, будучи внедренным в html (который, возможно, скачивается в качестве апдейтов и потом парсится), позволяет закоспромизить систему...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-1438009956305414649?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/1438009956305414649/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/07/fixed-hhctrl-1903-event-logger.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1438009956305414649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1438009956305414649'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/07/fixed-hhctrl-1903-event-logger.html' title='Fixed: HHCTRL 1903 Event Logger'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PHEWnO6OCjY/Slt_Z-6NqTI/AAAAAAAAAGE/8pBawvM08b0/s72-c/hhctrl1903.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-3907914046985069722</id><published>2009-07-01T11:19:00.007+04:00</published><updated>2009-07-01T21:36:52.997+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><title type='text'>Debian 5.0.0 kernel failure</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PHEWnO6OCjY/SksOpA0MCjI/AAAAAAAAAF8/X2LZWZ7rXUg/s1600-h/debian-failure.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 306px;" src="http://2.bp.blogspot.com/_PHEWnO6OCjY/SksOpA0MCjI/AAAAAAAAAF8/X2LZWZ7rXUg/s400/debian-failure.jpg" alt="" id="BLOGGER_PHOTO_ID_5353388679816284722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Мой Debian 5.0.0, работающий под VmWare, после загрузки оконного менеджера показывает вот такую вот картинку. Версия ядра, идущая в комплекте с этим дистрибутивом - 2.6.26. Эта картинка ни на что не влияет - система работает как ни в чем ни бывало. Отправил этот упс разработчикам, нажав на кнопку Yes. Надо будет ради интереса посмотреть в dmesg на предмет того, что там было не так.&lt;br /&gt;Скачал исходники ядра 2.6.30, пересобрал с абсолютно идентичным конфигом (как и для 2.6.26), ядро поставилось и этот kernel oops больше не появляется, наступило щастье :)&lt;br /&gt;Надо будет еще раз пересобрать ядро, включив в нем оптимизацию под Pentium M (процессор хост-машины), и еще надо отключить SMP, ибо у меня не многопроцессорная система. Ядро из дистрибутива идет с поддержкой SMP, что совершенно лишнее.&lt;br /&gt;&lt;br /&gt;UPD: Посмотрел, что пишет dmesg:&lt;br /&gt;&lt;br /&gt;[    0.000000] WARNING: strange, CPU MTRRs all blank?&lt;br /&gt;[    0.000000] ------------[ cut here ]------------&lt;br /&gt;[    0.000000] WARNING: at arch/x86/kernel/cpu/mtrr/main.c:696 mtrr_trim_uncached_memory+0x178/0x183()&lt;br /&gt;[    0.000000] Modules linked in:&lt;br /&gt;[    0.000000] Pid: 0, comm: swapper Not tainted 2.6.26-1-686 #1&lt;br /&gt;[    0.000000]  [&lt;c012256f&gt;] warn_on_slowpath+0x40/0x66&lt;br /&gt;[    0.000000]  [&lt;c02b957b&gt;] _spin_lock_irqsave+0x16/0x2f&lt;br /&gt;[    0.000000]  [&lt;c02b9609&gt;] _spin_unlock_irqrestore+0xd/0x10&lt;br /&gt;[    0.000000]  [&lt;c0122a10&gt;] release_console_sem+0x173/0x18c&lt;br /&gt;[    0.000000]  [&lt;c0122e87&gt;] vprintk+0x2d2/0x2de&lt;br /&gt;[    0.000000]  [&lt;c010cd84&gt;] mtrr_wrmsr+0xf/0x2e&lt;br /&gt;[    0.000000]  [&lt;c0122ea7&gt;] printk+0x14/0x18&lt;br /&gt;[    0.000000]  [&lt;c03873d7&gt;] mtrr_trim_uncached_memory+0x178/0x183&lt;br /&gt;[    0.000000]  [&lt;c038506c&gt;] setup_arch+0x254/0x6bb&lt;br /&gt;[    0.000000]  [&lt;c0122ea7&gt;] printk+0x14/0x18&lt;br /&gt;[    0.000000]  [&lt;c037f5e4&gt;] start_kernel+0x62/0x2d7&lt;br /&gt;[    0.000000]  =======================&lt;br /&gt;[    0.000000] ---[ end trace 4eaa2a86a8e2da22 ]---&lt;br /&gt;&lt;br /&gt;По информации kerneloops.org, эта проблема (BIOS bug (often in VMWare) where the MTRR's are set up incorrectly or not at all) на втором месте по частоте воспроизведения.&lt;br /&gt;Ссылка на отправленный мной упс разработчикам: &lt;a href="http://kerneloops.org/raw.php?rawid=108125"&gt;вот&lt;/a&gt;.&lt;br /&gt;Но у меня этой проблемы уже нет в новом ядре.&lt;/c037f5e4&gt;&lt;/c0122ea7&gt;&lt;/c038506c&gt;&lt;/c03873d7&gt;&lt;/c0122ea7&gt;&lt;/c010cd84&gt;&lt;/c0122e87&gt;&lt;/c0122a10&gt;&lt;/c02b9609&gt;&lt;/c02b957b&gt;&lt;/c012256f&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-3907914046985069722?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/3907914046985069722/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/07/debian-500-kernel-failure.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/3907914046985069722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/3907914046985069722'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/07/debian-500-kernel-failure.html' title='Debian 5.0.0 kernel failure'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PHEWnO6OCjY/SksOpA0MCjI/AAAAAAAAAF8/X2LZWZ7rXUg/s72-c/debian-failure.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-7579421646263617838</id><published>2009-06-30T13:00:00.001+04:00</published><updated>2009-06-30T13:06:46.588+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSM'/><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>Сотовый телефон как FXO gateway</title><content type='html'>Вот &lt;a href="http://translate.google.ru/translate?prev=hp&amp;amp;hl=ru&amp;amp;js=n&amp;amp;u=http%3A%2F%2Finfo.linuxmall.cl%2Fwiki%2Findex.php%2FConectar_Asterisk_a_la_red_GSM_-_chan_mobile&amp;amp;sl=es&amp;amp;tl=en&amp;amp;history_state0="&gt;тут&lt;/a&gt; написаны интересные вещи: как настроить астериск так, чтобы он мог звонить "наружу" через сотовый телефон, подключенный к нему по блютуфу.&lt;br /&gt;Эта технология открывает неограниченные возможности в deployment решений на базе астериска - можно поднять телефонный сервер с выходом на межгород даже там, где нет PSTN - лишь бы сотовый мог поймать какую-нибудь сеть.&lt;br /&gt;&lt;br /&gt;Для создания второго FXO порта придется использовать еще один USB Bluetooth адаптер, поскольку телефоны не могут вешаться все на один блютуф.&lt;br /&gt;&lt;br /&gt;Таким образом можно и дома поднять телефонный сервер с IVR, присоединив свой собственный сотовый к астериску. Причем совершенно бесплатно! Уже хочу :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-7579421646263617838?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/7579421646263617838/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/fxo-gateway.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7579421646263617838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7579421646263617838'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/fxo-gateway.html' title='Сотовый телефон как FXO gateway'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-1713851616051419448</id><published>2009-06-29T23:29:00.000+04:00</published><updated>2009-06-30T11:23:15.094+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>Смешались в кучу кони, люди</title><content type='html'>Показательная &lt;a href="http://www.iksmedia.ru/issue/2009/5/2670187.html"&gt;статья&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;И еще об одной тенденции. в последнее время много говорят о программных IP-УАТС с открытым исходным кодом (open source). Самая известная из них – система Asterisk, но есть и масса других: &lt;span style="font-style: italic;"&gt;ASTLinux, FreePBX, Trixbox&lt;/span&gt;, Freeswitch, Call Weaver… Однако надо четко понимать, что к бесплатному софту придется покупать еще платы, например для подключения телефонов и выхода в ТфОП. Собрать такой конструктор можно и самому – было бы время... И все-таки, на мой взгляд, системы типа Asterisk еще сыроваты для применения в качестве  серьезных корпоративных решений. Им недостает проверенных средств отказоустойчивости и управляемости, что очень важно для солидных заказчиков.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Пока пишутся такие статьи - будет хлеб у нас :) Слова выделены мной.&lt;br /&gt;(В перечислении с типом "программные IP-УАТС с открытым исходным кодом" присутствуют: операционная система и две веб-морды, которые не являются IP-УАТС. Показателен так же пассаж про "надо покупать платы" и "конструктор").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-1713851616051419448?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/1713851616051419448/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/blog-post_29.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1713851616051419448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/1713851616051419448'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/blog-post_29.html' title='Смешались в кучу кони, люди'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-5608948251496170759</id><published>2009-06-25T21:42:00.000+04:00</published><updated>2009-06-25T23:39:37.418+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>Сборка астериска</title><content type='html'>Скачал последний тарболл астериска, решил собрать и посмотреть на него вживую.&lt;br /&gt;&lt;br /&gt;Понравилась текстовая картинка, которую выдает ./configure в процессе своей работы:&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;config.status: creating include/asterisk/autoconfig.h&lt;br /&gt;&lt;br /&gt;           .$$$$$$$$$$$$$$$=.. &lt;br /&gt;        .$7$7..          .7$$7:.&lt;br /&gt;      .$$:.                 ,$7.7&lt;br /&gt;    .$7.     7$$$$           .$$77&lt;br /&gt; ..$$.       $$$$$            .$$$7&lt;br /&gt;..7$   .?.   $$$$$   .?.       7$$$.&lt;br /&gt;$.$.   .$$$7. $$$$7 .7$$$.      .$$$.&lt;br /&gt;.777.   .$$$$$$77$$$77$$$$$7.      $$$,&lt;br /&gt;$$$~      .7$$$$$$$$$$$$$7.       .$$$.&lt;br /&gt;.$$7          .7$$$$$$$7:          ?$$$.&lt;br /&gt;$$$          ?7$$$$$$$$$$I        .$$$7&lt;br /&gt;$$$       .7$$$$$$$$$$$$$$$$      :$$$.&lt;br /&gt;$$$       $$$$$$7$$$$$$$$$$$$    .$$$.&lt;br /&gt;$$$        $$$   7$$$7  .$$$    .$$$.&lt;br /&gt;$$$$             $$$$7         .$$$.&lt;br /&gt;7$$$7            7$$$$        7$$$ &lt;br /&gt;$$$$$                        $$$  &lt;br /&gt;$$$$7.                       $$  (TM)&lt;br /&gt;$$$$$$$.           .7$$$$$$  $$ &lt;br /&gt; $$$$$$$$$$$$7$$$$$$$$$.$$$$$$ &lt;br /&gt;   $$$$$$$$$$$$$$$$.           &lt;br /&gt;&lt;br /&gt;configure: Package configured for:&lt;br /&gt;configure: OS type  : linux-gnu&lt;br /&gt;configure: Host CPU : i686&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;Здорово, правда? :)&lt;br /&gt;&lt;br /&gt;Скомпилял, запустил, астериск при этом сразу отконнектился от консоли и стал работать в бэкграунде. Подключил к нему консоль (asterisk -r) и появилось еще одно забавное сообщение, игра слов:&lt;br /&gt;&lt;br /&gt;Connected to Asterisk 1.6.2.0-beta3 currently running on alpha (pid = 25741)&lt;br /&gt;&lt;br /&gt;(beta запущена на alpha, alpha это хостнейм моего сервера).&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-5608948251496170759?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/5608948251496170759/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/blog-post.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5608948251496170759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5608948251496170759'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/blog-post.html' title='Сборка астериска'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-6346680433027507068</id><published>2009-06-23T18:57:00.000+04:00</published><updated>2009-06-24T01:09:40.697+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='in focus'/><category scheme='http://www.blogger.com/atom/ns#' term='freeSWITCH'/><title type='text'>Настройка freeSWITCH</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;Попалась отличная &lt;/span&gt;&lt;a style="font-family: arial;" href="http://robsmart.co.uk/2009/06/02/freeswitch_linksys3102/"&gt;статья&lt;/a&gt;&lt;span style="font-family:arial;"&gt; по настройке freeSWITCH. Попробую его поставить.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Начал с того, что выкачал из репозитория последнюю версию сорцов. Их оказалось 300 мегов!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;danx@alpha:~/freeswitch$ svn checkout http://svn.freeswitch.org/svn/freeswitch/trunk freeswitch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Checked out revision 13912.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;danx@alpha:~/freeswitch$ du -ms .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;300&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;svn, похоже, выкачивает сорцы в запакованном виде при выполнении команды checkout.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Собираем:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;./bootstrap.sh (7,5 минут работы)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;./configure (13,5 минут)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;(включил русский язык в modules.conf - нужно, чтобы оно говорило по-русски; сконфигурить это потом надо будет &lt;a href="http://freeswitch.ru/wiki/fs-say-ru"&gt;так&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;make all install sounds-install moh-install (2 часа сборки и все готово!)&lt;br /&gt;&lt;br /&gt;В результате папка с прогой заняла 486 мегов после сборки, сам freeSWITCH установился в /usr/local/freeswitch/ и занял там 65 мегов.&lt;br /&gt;&lt;br /&gt;Готово!&lt;br /&gt;&lt;br /&gt;FreeSWITCH Version 1.0.trunk (13912) Started.&lt;br /&gt;Crash Protection [Disabled]&lt;br /&gt;Max Sessions[1000]&lt;br /&gt;Session Rate[30]&lt;br /&gt;SQL [Enabled]&lt;br /&gt;&lt;br /&gt;Итак, все работает. Звонки (локальные) совершаются, практически ничего в конфигах не менял. Функционал очень богат. Понравилась программа.&lt;br /&gt;Пока нет VoIP шлюза, чтобы можно было совершать городские звонки, но это в будущем.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-6346680433027507068?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/6346680433027507068/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/freeswitch.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/6346680433027507068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/6346680433027507068'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/freeswitch.html' title='Настройка freeSWITCH'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-7373948106197830028</id><published>2009-06-22T13:00:00.001+04:00</published><updated>2009-06-22T13:56:05.597+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><category scheme='http://www.blogger.com/atom/ns#' term='yate'/><title type='text'>Asterisk или Yate?</title><content type='html'>Стою перед выбором - какой из IP PBX выбрать для проекта.&lt;br /&gt;&lt;br /&gt;Критерии выбора такие:&lt;br /&gt;* Достаточное количество документации и community по продукту&lt;br /&gt;* Наличие большого числа телефонных фич, от sipping 19 до IVR и CDR&lt;br /&gt;* Гибкость конфигурации&lt;br /&gt;* Возможность написания собственных конфигураторов&lt;br /&gt;* Стабильная работа, в идеале "пять девяток".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-7373948106197830028?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/7373948106197830028/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/asterisk-yate.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7373948106197830028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7373948106197830028'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/asterisk-yate.html' title='Asterisk или Yate?'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-7132126049365743265</id><published>2009-06-16T14:42:00.000+04:00</published><updated>2009-06-16T16:24:17.019+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><title type='text'>Кастомеры мигрируют с Asterisk обратно на Cisco</title><content type='html'>Вот &lt;a href="http://blog.tmcnet.com/blog/tom-keating/cisco/shsu-switches-back-to-cisco-call-manager-from-asterisk.asp"&gt;тут&lt;/a&gt; пишут, что один крупный университет в США перешел на Астериск 3 года назад, с благой целью экономить на ежегодных затратах на лицензии и поддержку своей телефонной сети. Однако через 3 года ситуация поменялась и университет опять возвращается к Cisco. При этом их уже не смущают затраты на поддержку и на лицензии.&lt;br /&gt;Все дело в том, что из универа уходят перцы, которые хорошо знали астериск, и которые, на самом деле, переписывали даже его и затачивали под университетские требования, поддерживали свой кастомный бранч в астериске. Они теперь уходят и смотреть за звездочкой теперь будет некому. Поэтому универ переходит на Cisco, поскульку специалистов CCVP (Cisco Certified Voice Proffesional) можно найти на улице, а вот перцев со знаниями астериска наврядли.&lt;br /&gt;Кстати, а уходят специалисты по астериску из того универа потому, что они крутые фичи написали и закоммитили их в основной бранч астериска, в результате чего Digium предложил им работу :)&lt;br /&gt;&lt;br /&gt;Поучительная история... Кастомерам все же надо предлагать простые в поддержке решения.&lt;br /&gt;&lt;br /&gt;Еще факт: &lt;a href="http://blog.tmcnet.com/sip-and-serve-by-a-foodie/2009/04/sipits_the_rage_part_ii_or_whos_buying.html"&gt;около 90% всех предприятий используют VoIP для своих внутренних разговоров&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-7132126049365743265?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/7132126049365743265/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/asterisk-cisco.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7132126049365743265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/7132126049365743265'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/asterisk-cisco.html' title='Кастомеры мигрируют с Asterisk обратно на Cisco'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-8463622842501163068</id><published>2009-06-11T14:41:00.000+04:00</published><updated>2009-06-23T19:01:12.845+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='in focus'/><title type='text'>Meet the gurus</title><content type='html'>&lt;a href="http://www.asterisk-tag.org/wiki/Programm_26.05.2008_%28English_Track%29#11:15_-_12:00_Uhr:_Diana_Cionoiu_.28Yate.29"&gt;Информация&lt;/a&gt; для изучения: куча видеоматериалов от основателей IP PBX.&lt;a href="http://www.asterisk-tag.org/wiki/Programm_26.05.2008_%28English_Track%29#11:15_-_12:00_Uhr:_Diana_Cionoiu_.28Yate.29"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-8463622842501163068?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/8463622842501163068/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/meet-gurus.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/8463622842501163068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/8463622842501163068'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/meet-gurus.html' title='Meet the gurus'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-43636803824802894.post-5108802801399178123</id><published>2009-06-11T12:45:00.002+04:00</published><updated>2009-08-13T23:47:50.691+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flaphone'/><category scheme='http://www.blogger.com/atom/ns#' term='yate'/><title type='text'>Music on hold и Yate</title><content type='html'>В локалке на данный момент разведены сип клиенты, среди которых мне понравился 3CX VOIP Phone для Windows &lt;a href="http://www.3cx.com/downloads/3CXVoIPPhone3.msi"&gt;(прямая ссылка тут)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Мощь и гибкость в настройке Йэйта поражает. Достаточно легко настраиваются конференц-комнаты, есть возможность писать свои модули расширения и неимоверно крутые дайлпланы. На удивление красиво реализована привязка к базе данных для авторизации клиентов.&lt;br /&gt;&lt;br /&gt;Технологии, тем временем, не дремлят. Поставил флафон под эйр (flaphone) - написанный на флеше софтфон, который можно также встраивать в веб-страницы. Пока не разобрался, почему он не хочет регистряться на моей сип проксе внутри локальной сети (192.168.0.100). То, что он заточен под коммерческих сип провайдеров типа sipnet, это понятно. Может быть его и не предполагали использовать в внутрикорпоративных сетях.&lt;br /&gt;&lt;br /&gt;Сейчас разбираюсь с moh. В конфиге в качестве примеров приведены команды cat для сбрасывания музыки на stdout - интересно где он такую команду найдет под винду, скорее всего надо использовать type :)&lt;br /&gt;&lt;br /&gt;Проблема в том, что сервер отвечает 503-ей ошибкой... Скорее всего он не может найти mpg123, хотя я эту программу скачал и она есть в путях...&lt;br /&gt;&lt;br /&gt;moh.conf:&lt;br /&gt;default=while true; do mpg123 -q -m -r 8000 -s C:\sounds\*.mp3; done&lt;br /&gt;&lt;br /&gt;regexroute.conf:&lt;br /&gt;^777$=moh/default&lt;br /&gt;&lt;br /&gt;Лог:&lt;br /&gt;&amp;lt;sip/1:ALL&amp;gt; YateSIPConnection::YateSIPConnection(011C4440,011A8E88) [011C5168]&lt;br /&gt;&amp;lt;INFO&amp;gt; Could not classify call from 'sergey', wasted 0 usec&lt;br /&gt;&amp;lt;CdrBuilder:INFO&amp;gt; Got message 'call.route' for untracked id 'sip/1'&lt;br /&gt;&amp;lt;INFO&amp;gt; Routing call to '777' in context 'default' via 'moh/default' in 0 usec&lt;br /&gt;&amp;lt;sip/1:MILD&amp;gt; Call rejected error='noconn' reason='&lt;span style="font-weight: bold;"&gt;Could not connect to target&lt;/span&gt;' [011C5168]&lt;br /&gt;&amp;lt;sip/1:ALL&amp;gt; YateSIPConnection::~YateSIPConnection() [011C5168]&lt;br /&gt;&amp;lt;sip/1:ALL&amp;gt; YateSIPConnection::hangup() state=0 trans=011A8E88 error='noconn' code=503 reason='Could not connect to target' [011C5168]&lt;br /&gt;&amp;lt;sip:INFO&amp;gt; Sending code 503 011C4A48 to 192.168.0.100:3180&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPD: Ура, работает Music On Hold.... Но только в debian Linux - свежескомпиленный из исходников Йейт смог у меня проиграть музыку на холде.... Качество фиговое конечно, т.к. линукс стоит в виртуальной машине на том же относительно древнем ноутбуке, что и клиент.&lt;br /&gt;Под Виндой не работает moh. Жалко. Придется дебажить как-нибудь.&lt;br /&gt;&lt;sip:lynx@192.168.0.100&gt;&lt;sip:777@192.168.0.100&gt;&lt;sip:777@192.168.0.100:5060&gt;&lt;/sip:777@192.168.0.100:5060&gt;&lt;/sip:777@192.168.0.100&gt;&lt;/sip:lynx@192.168.0.100&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/43636803824802894-5108802801399178123?l=danxee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danxee.blogspot.com/feeds/5108802801399178123/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://danxee.blogspot.com/2009/06/linksys-spa3102-yate.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5108802801399178123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/43636803824802894/posts/default/5108802801399178123'/><link rel='alternate' type='text/html' href='http://danxee.blogspot.com/2009/06/linksys-spa3102-yate.html' title='Music on hold и Yate'/><author><name>S. Danilov</name><uri>http://www.blogger.com/profile/11002747125377439904</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry></feed>
