<?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:blogger='http://schemas.google.com/blogger/2008' 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-6888322710677399759</id><updated>2024-09-02T14:50:10.129+06:00</updated><category term="freeswitch"/><category term="kerberos"/><category term="ldap"/><category term="python"/><category term="voip"/><category term="Инфраструктура Kerberos"/><category term="twisted"/><category term="g729"/><category term="plasma"/><category term="addpac"/><category term="linux"/><category term="py-configurator"/><category term="samba"/><category term="sipx"/><category term="Путешествие группы формант по голосовому тракту"/><category term="фигня"/><category term="cifs"/><category term="fs2web"/><category term="greenlet"/><category term="h323"/><category term="heimdal"/><category term="kde"/><category term="mod_opal"/><category term="nfs"/><category term="scfl"/><category term="upstart"/><category term="vim"/><category term="vnc"/><category term="идея"/><category term="книги"/><category term="мысли"/><category term="отрывки"/><category term="программа"/><title type='text'>Deepwalker</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>60</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-5558383318899285733</id><published>2014-02-01T18:41:00.003+07:00</published><updated>2014-03-12T12:19:17.000+07:00</updated><title type='text'>Беспарадигменный язык</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Почему все называют python мультипарадигменным, а что если он беспарадигменный? В самом деле, можно ли назвать python функциональным? Или ООП?&lt;br /&gt;
&lt;br /&gt;
У python всё смешано, нельзя обойтись без функций или без объектов. То есть ни одна из парадигм не полноценна, а значит у языка нет ни одной парадигмы - он беспарадигменный.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Не воспринимайте серьезно ;)&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/5558383318899285733/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/5558383318899285733' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5558383318899285733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5558383318899285733'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2014/02/blog-post.html' title='Беспарадигменный язык'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8037153705086263753</id><published>2012-12-14T01:45:00.002+07:00</published><updated>2012-12-14T01:45:46.245+07:00</updated><title type='text'>Ruby vs Python</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
С тех пор как влился в одну из команд mail.ru, где основной язык разработки ruby, могу холиворить сам с собой. Всем того же желаю - в ruby много хороших практик и удачных решений, что не будет лишним и в разработке python проекта.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8037153705086263753/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8037153705086263753' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8037153705086263753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8037153705086263753'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2012/12/ruby-vs-python.html' title='Ruby vs Python'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-1872395630600902362</id><published>2012-03-06T04:11:00.000+07:00</published><updated>2012-03-06T17:38:05.998+07:00</updated><title type='text'>Мэтрам django web разработки посвящается</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
Я так считаю - любую задачу можно решить на тьюринг полном языке, вопрос в удобстве. Вот одно&amp;nbsp;время программисты писали кругом goto и gosub, а потом пришла к ним мысль, что&amp;nbsp;это не совсем удобно.&lt;br /&gt;
&lt;br /&gt;
Но долгое время в сторону паскаля неслись смешки, и говорили - &amp;nbsp;нафиг нам ваши&amp;nbsp;break и continue, да я с goto решу выход из цикла на раз, в три раза элегантнее.&lt;br /&gt;
&lt;br /&gt;
А потом как-то обнаружилось, что без goto все таки лучше, а главное нагляднее -&amp;nbsp;не обязательно теперь программу в блок-схемах рисовать, чтобы прикинуть редьку к луку.&lt;br /&gt;
&lt;br /&gt;
Или вот можно писать::&lt;br /&gt;
&lt;br /&gt;
if key in map:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return map[k]&lt;br /&gt;
else:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return None&lt;br /&gt;
&lt;br /&gt;
А можно элегантнее действовать, можно написать `return map.get(k)`.&amp;nbsp;А говорят еще есть некий монадический Option путь, там вообще трава зеленее.&amp;nbsp;Но `if ... in ...` он проще и понятнее, я if уже двадцать лет знаю и умею, идите нафиг,&amp;nbsp;я еще в великой энциклопедии самого профессора Фортрана читал. Я может потом, как время будет,&amp;nbsp;прочту про хаскель сразу, и не буду писать ни одного `if` при разборе json. Но это&amp;nbsp;конечно как время будет, а то я же человек серьезный, я сайты пишу - много if-ов, некогда мне, некогда.&lt;br /&gt;
&lt;br /&gt;
Или вот про фреймворки все же - вот джанга она столп, а может столб, тут мнения разделились,&amp;nbsp;что в этих ваших интернетах вообще не редкость.&lt;br /&gt;
&lt;br /&gt;
Говорят под нее много приложений, хороших, бери пользуйся. Все написаны метрами, типа меня.&amp;nbsp;Православный goto, if и никакой монадической зауми.&lt;br /&gt;
&lt;br /&gt;
Или вот шаблоны - сказали логики в шаблонах ни-ни, ну вот и ни-ни - логику отображения быстренько&amp;nbsp;размазали по templatetags и тихо там у меня, революционеры гадкие, поди еще и на болотную ходили.&amp;nbsp;И макросы в шаблонах не нужны, и вызов функций с параметрами - от лукавого все это. А что тормозит,&amp;nbsp;то все от свершений.&lt;br /&gt;
&lt;br /&gt;
ORM слабый? Да пишите SQL уже, как все нормальные мужики. И формы наши эталон, CSRF у них талон, идите нафиг.&lt;br /&gt;
&lt;br /&gt;
И вообще, у меня все проекты на бейсике, я его хорошо знаю, еще со школы и зеленоэкранных ямашек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Но шутки в сторону. Скажите мне замшелые троглодиты из реально нереально серьезной веб разработки,&amp;nbsp;что, экономия на рендере шаблонов это лишнее для проектов с посещаемостью &amp;gt;1000? Более быстрая разработка&amp;nbsp;с более гибким ORM это лишнее? Да вы вообще БД используете, или планируете проект на sqlite запускать&amp;nbsp;в продакшн? Даже обработка URL в Werkzeug быстрее. Можно говорить что где-то это копейки, но когда все&amp;nbsp;копейки собираются во Flask, это уже становится серьезно, мимо проходить уже как-то непрофессионально,&lt;br /&gt;
и даже как-то стыдно.&lt;br /&gt;
&lt;br /&gt;
За пределами уютного мирка в злато-зеленых тонах кипит жизнь, возникают новые идеи и инструменты,&amp;nbsp;но всегда есть мэтры, которым некогда улучшать свои навыки - у них 1000 пользователей ждет, когда мэтр&amp;nbsp;напишет все if-ы.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/1872395630600902362/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/1872395630600902362' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/1872395630600902362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/1872395630600902362'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2012/03/django-web.html' title='Мэтрам django web разработки посвящается'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-2487112698797418327</id><published>2012-01-18T21:13:00.000+07:00</published><updated>2012-01-18T21:13:04.690+07:00</updated><title type='text'>SamaraPy</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Зависть великая штука.&amp;nbsp;Побывав на PyConUA я заразился чудной атмосферой живого общения с едино и разномышленниками. Я не уверен, что получится в Самаре найти достаточное число участников для SamaraPy, который более будет похож поначалу на KievPy, но я попробую.&lt;br /&gt;
&lt;br /&gt;
Подробности будут тут&amp;nbsp;&lt;a href=&quot;http://vk.com/club34256705&quot;&gt;http://vk.com/club34256705&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
В конце концов оказался же в этом городе Я!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/2487112698797418327/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/2487112698797418327' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2487112698797418327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2487112698797418327'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2012/01/samarapy.html' title='SamaraPy'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-5078795104222496237</id><published>2012-01-18T21:08:00.000+07:00</published><updated>2012-01-18T21:08:03.712+07:00</updated><title type='text'>FreeSWITCh, love over</title><content type='html'>&lt;p&gt;Я больше не занимаюсь FreeSWITCH по нескольким причинам. Первая - я теперь не сетевой администратор с горкой АТС, и не работаю в VoIP стартапе.&lt;/p&gt;
&lt;p&gt;Вторая - считаю разработчиков FreeSWITCH-а неадекватными по нескольким пунктам.&lt;/p&gt;

&lt;p&gt;1. Прием патчей. Когда у нас глюкало видео я искал проблему и нашел ее. Создал патч и отправил в жиру. После месяца боданий патч был принят с формулировкой &quot;а предыдущий пацанчик говорил что все работает отлично, но вы достали, хрен с вами&quot;. Многообщающе.&lt;/p&gt;

&lt;p&gt;2. Использование DMCA для блокировки репозитория с кодом g729 кодека. Нормальные люди вначале пишут и говорят - у вас тут мои копирайты, вы поправьте. В общем мне их мотивировка неясна - их права никак не были нарушены, но шило в попе творит чудеса.&lt;/p&gt;

&lt;p&gt;В общем как для профессионального разработчика для меня FreeSWITCH это один сплошной дурдом. Без причин с ним возиться я с ним возиться никакого желания не имею.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/5078795104222496237/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/5078795104222496237' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5078795104222496237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5078795104222496237'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2012/01/freeswitch-love-over.html' title='FreeSWITCh, love over'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-4282017406477209013</id><published>2010-02-23T14:13:00.003+06:00</published><updated>2022-03-30T13:41:36.764+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="greenlet"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="twisted"/><title type='text'>Django в неблокирующем стиле, или в погоне за Священным Граалем</title><content type='html'>Было опубликовано на Хабре.&lt;br /&gt;&lt;br /&gt;
&lt;h4&gt;Присказка&lt;/h4&gt;При чтении о Twisted, Tornado, Node.js, у многих python-программистов возникает вопрос - &quot;а вот если взять, и переписать Django в неблокирующем стиле?&quot;. Обычный ответ на этот вопрос - нет, не дождетесь. И правда, чтобы переписать целый фреймворк в макаронно-колбечном стиле, надо очень много сил, и большой заряд энтузиазма. Писать с колбеками, очень сомнительное удовольствие.&lt;br /&gt;
&lt;br /&gt;
Так бы и было, но как я писал в своей прошлой заметке, есть в python-мире greenlet-ы, которые легким движением руки помогают скрыть от программиста все эти асинхронные моменты, до определенной степени. В момент написания той заметки, к мысли заставить работать Django в неблокирующем режиме, я относился весьма скептически - ну в самом деле, кто за это возьмется?&lt;br /&gt;
&lt;br /&gt;
&lt;habracut&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Суть&lt;/h4&gt;А на самом деле все не так страшно, следите за руками - мы создаем WSGI ресурс в Twisted, начинаем слушать HTTP-запросы; каждый запрос мы отдаем в WSGI-обработчик Django, оборачивая его в гринлет; любые запросы, которые можно преобразовать в неблокирующие, передаем Twisted, который пнет наш гринлет в момент готовности данных; готово!&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
А что же у нас есть такого, что можно обратить в неблокирующий режим в первую очередь? В Django основным таким местом выступает база данных. Можно ли с ней общаться асинхронно? Абсолютно верно, но нужен специальный драйвер.&lt;br /&gt;
&lt;br /&gt;
С давних пор в Twisted есть такой - PGAsync. У него есть серьезные проблемы, он давно заброшен, но кто нам мешает подхватить упавшее знамя? Я сделал такую попытку, на данный момент драйвер работает стабильнее оригинала, но работа еще не закончена. Тем не менее, асинхронную БД для Django мы получить можем, и это будет Postgresql (ох, простите, пользователи Mysql, но кто вам мешает написать свой?). Драйвер используется в текущем проекте, разрабатываемом Imarto Networks http://imarto.net, и было решено выложить его для свободного использования. Я выложил его раньше готовности, только для демонстрации асинхронного Django, будьте снисходительны.&lt;br /&gt;
&lt;br /&gt;
Чтобы использовать его в Django, нам надо написать свой БД-бэкенд. Я наворотил что-то из бэкенда для psycopg2, обернув обращения к драйверу БД в функции передачи управления главному гринлету, то есть основному потоку программы. Стандартный wsgi-ресурс из twisted.web пришлось тоже немного переделать, ведь он теперь должен кидать запросы на обработку не в пул потоков, а в гринлеты.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Как пощупать&lt;/h4&gt;Исходники можно получить тут, там же тестовый django-проект - http://bitbucket.org/deepwalker/tx_green/&lt;br /&gt;
Исходники драйвера к БД - http://bitbucket.org/deepwalker/tx-postgresql/&lt;br /&gt;
&lt;br /&gt;
Для использования надо разместить pgasync, green_wsgi.py, tx_green.py, tx_postgresql в место, где интерпретатор сможет их найти. Затем в каталоге test_green_dj настраиваем параметры подключения к БД, ./manage.py syncdb, twistd -n - y server.py. Все, по адресу http://127.0.0.1:8001 встречаем наш тестовый проект.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Про тесты&lt;/h4&gt;Тесты, которые я проводил, относились в основном к проверке работы, прироста производительности я не измерял. Если кто-то потратит свое время на это доброе дело, буду благодарен, если поделитесь результатами.&lt;/habracut&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/4282017406477209013/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/4282017406477209013' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4282017406477209013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4282017406477209013'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2010/02/django.html' title='Django в неблокирующем стиле, или в погоне за Священным Граалем'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-2447745148068794582</id><published>2010-01-09T23:51:00.002+06:00</published><updated>2010-01-09T23:51:42.268+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="twisted"/><title type='text'>Озеленение Twisted</title><content type='html'>Как обычно, в праздники, в свободное время от затирки плитки и прочих прибиваний плинтуса, меня захватила очередная идея из цикла &quot;попробовать&quot;. На хабре проскочила статья о &lt;a href=&quot;http://habrahabr.ru/blogs/python/80062/&quot;&gt;Pyrant&lt;/a&gt;. Первой итерацией я взял и переделал основную часть протокола на Twisted - http://github.com/Deepwalker/tx-tokyo . И все было хорошо, наступление шло по всем фронтам, но тут я перешел к питоничной части pyrant, и понял что сделать yield a[megakey]=&#39;mega data string&#39;, вообще говоря невозможно. Это было очень печально, ведь в статье меня зацепило именно легкое обращение с данными в питоничной форме. Что же делать, Пух, спросил я себя? И вспомнил о &lt;a href=&quot;http://codespeak.net/py/0.9.2/greenlet.html&quot;&gt;greenlet-ах&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Помучавшись некоторое время, я переписал defer.inlineCallbacks на использование greenlet-ов и смог написать такой код:&lt;br /&gt;
&lt;code&gt;&lt;pre&gt;from twisted.internet import defer, protocol, reactor
from tx_green import inlineCallbacks
from greentokyo import Tyrant

@inlineCallbacks
def test_proto():
    t = Tyrant()
    print t.get_stats()

    t[&#39;kuku&#39;] = &#39;Green Tyrant!&#39;
    print t[&#39;kuku&#39;]

    reactor.stop()

if __name__==&#39;__main__&#39;:
    test_proto()
    reactor.run()
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Удобство в том, что greenlet-ы имеют важное отличие от генераторов - они не ограничены одной функцией. То есть при вызове t[&#39;kuku&#39;], на самом деле вызывается t.__getitem__, внутри которого мы и делаем вызов switch() для возврата управления основному циклу на время, пока мы ожидаем данные от сервера. Если бы мы попробовали сделать внутри t.__getitem__ yield, то мы бы просто сделали из него генератор, не получив никакой пользы.&lt;br /&gt;
&lt;br /&gt;
Неудобство состоит в том, что надо помнить обо всей этой начинке - будет плохо если вы будете ждать данные, а вместо этого вам упадет просто Deferred. И будет еще хуже, если вы забудете вернуть управление основному потоку - остановите все приложение. И еще в этом варианте не светит &quot;not twist your brain&quot;, потому что надо помнить и использовать возможности Twisted.&lt;br /&gt;
&lt;br /&gt;
Стоит обратить внимание, что в приведенном коде нет ничего, явно указывающего на возврат управления - вызовы greenlet.switch() скрываются в реализации питоничного Tyrant. То есть он заточен под эту реализацию. Если бы это было не так, то нам бы пришлось явно вызывать функцию wait из tx_green. Именно этот момент меня беспокоит - можно создать чуть ли не джангу, и обращения к БД через ORM будут работать также скрытно вызывая wait, но если забыться, то потенциально можно породить трудноуловимую ошибку, или новичок, как обычно не прочитав толком документацию, начнет запрашивать с какого-либо сервера странички через urllib и будет долго удивляться, почему сервер подтормаживает.&lt;br /&gt;
&lt;br /&gt;
Реализация расположена в моей &lt;a href=&quot;http://github.com/Deepwalker/deepwalker_sandbox&quot;&gt;песочнице&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Вот такой небольшой пост. Как всегда ожидаю приятного обсуждения, и надеюсь, что будут хорошие предложения по коду, как было в прошлой нашей встрече, со мной в амплуа постописателя. Спасибо за внимание.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/2447745148068794582/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/2447745148068794582' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2447745148068794582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2447745148068794582'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2010/01/twisted.html' title='Озеленение Twisted'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8400103367183176131</id><published>2009-12-13T16:03:00.000+06:00</published><updated>2009-12-13T16:03:03.764+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="twisted"/><title type='text'>Twisted в действии — memcache на python</title><content type='html'>&lt;h4&gt;Преамбула&lt;/h4&gt;В связи с выходными потратил немного времени на реализацию сервера Memcache с использованием python-фреймворка Twisted. В итоге я получил быстродействие в два раза более низкое, что я не считаю очень критичным, а также возможность реализовать парочку расширений оригинального протокола. Также возможны оптимизации, которые еще улучшат быстродействие.                                                                                                                                                      &lt;br /&gt;
Протокол не был реализован полностью - есть еще моменты над которыми можно поработать, но стандартные set/get вполне работоспособны и готовы к использованию.                                                                                             &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Средства&lt;/h4&gt;Для хранения кеша используем базовый класс dict. Как вы догадываетесь, реализация dict в python быстра, этот базовый тип используется в python настолько активно, что его не оставили без детальной оптимизации. Таким образом, мы автоматом имеем структуру для хранения кеша в памяти. Осталось реализовать протокол memcache, для предоставления доступа к dict другим программам.  &lt;br /&gt;
&lt;br /&gt;
Для реализации сервера используем Twisted. Есть множество вариаций неблокирующего IO для python на сегодня, но Twisted это уже классика, и имеет в своем арсенале достаточно средств для легкого решения подобных задач.                                  &lt;br /&gt;
&lt;br /&gt;
&lt;habracut /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Реализация сетевого протокола&lt;/h4&gt;Как реализуют протоколы? Первым делом вам конечно же нужно найти описание протокола. Я нашел его здесь - http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt                                                                             &lt;br /&gt;
&lt;br /&gt;
После прочтения протокола становится понятно, что от клиента мы получим одну или две строки, причем первую строку мы можем смело разбивать на элементы по пробелам. Вторая строка используется в командах, которые передают серверу данные - set, add, replace и т.п. Если вам хочется подробнее вникнуть в статью, то отправлю вас почитать описание самостоятельно, цели выложить его перевод сюда не было.                                                                                                       &lt;br /&gt;
&lt;br /&gt;
Вооруженные этим знанием, смотрим, что нам может предложить Twisted для решения этой задачи, и сразу находим LineOnlyReceiver - протокол из базовой поставки Twisted, который работает только с протоколами, обменивающимися строками, то есть то, что надо.                                                                                                                           &lt;br /&gt;
&lt;pre&gt;&lt;code&gt;                                                                                                                  
class MemcacheProtocol(LineOnlyReceiver):                                                                                    
    &quot;&quot;&quot;                                                                                                                      
    Реализует базис протокола - прием сообщений от клиента                                                                   
    и отдачу результата.                                                                                                     
    &quot;&quot;&quot;                                                                                             
    def lineReceived(self,line):            
        debug(repr(line))                   
        if not &#39;parameters&#39; in self.instruction:
            parameters = line.split(&#39; &#39;)        
            debug(&quot;Got new command &quot;+parameters[0])
            self.instruction[&#39;parameters&#39;]=parameters

            # Если данных не ожидается, то к исполнению
            if parameters[0] in Cache.oneline_commands:
                self.process()                         
        else:                                          
            # Получены данные к двухстрочной команде, к исполнению
            debug(&quot;Got data &quot;+line)                               
            self.instruction[&#39;data&#39;]=line                         
            self.process()                                        

    def process(self):
        # Cache.call возвращает генератор
        for line in Cache.call(self.instruction):
            # И мы отсылаем все что он нагенерирует отдельными строками
            debug(&quot;Send line &quot;+line)                                   
            self.sendLine(line)                                        
        # Готовы к дальнейшим инструкциям, насяльника!                 
        self.instruction={}                                            

    def connectionMade(self):
        debug(&quot;Connected!&quot;)  
        self.instruction={}  
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Как видно из кода, для собственно работы используется Cache. Это синглетон, по сути просто класс, методы которого обернуты декоратором @classmethod. Вызов Cache.call должен вернуть генератор, которые будет возвращать строки, которые, в свою очередь, наша реализация протокола, будет отдавать клиенту.                                                                           &lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Разбираем запрос от клиента&lt;/h4&gt;Первая строка это команда и параметры, разделенные пробелами, поэтому используем строковый метод split, и на выходе получаем список. Далее его надо разобрать на составляющие, перед тем как с данными начнет работать команда. Я использую класс, так как мне нравится перспектива обращаться к параметрам, указывая их через точку. Приведенный ниже код уже требует прочтения описания протокола, а для ленивых пара наводящих строк:                                                                            &lt;br /&gt;
&lt;pre&gt;Команды записи данных:                                                                                                       
&lt;command name&gt; &lt;key&gt; &lt;flags&gt; &lt;exptime&gt; &lt;bytes&gt; [noreply]\r\n                                                                 
cas &lt;key&gt; &lt;flags&gt; &lt;exptime&gt; &lt;bytes&gt; &lt;cas unqiue&gt; [noreply]\r\n                                                               

Получение данных:
get &lt;key&gt;*\r\n   
gets &lt;key&gt;*\r\n  
delete &lt;key&gt;\r\n 

Ну и тому подобное.
&lt;/pre&gt;Реализация разбора:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
class Instruction(object):
    def __init__(self, i):
        p = i[&#39;parameters&#39;]
        self.cmd = p.pop(0)

        # Проверяем noreply
        if p[-1]==&#39;noreply&#39;:
            self.reply=False
            # Выкидываем его
            p.pop(-1)       
        else:               
            self.reply=True 

        if self.cmd in Cache.storage_commands:
            # Если CAS то есть еще один параметр (т.е. особый случай)
            if self.cmd == &quot;cas&quot;:                                    
                self.unique = p.pop(-1)                              

            # Теперь все параметры однозначны, но мы хотим расширить протокол,
            # потому все не так просто, как dict(zip())                       
            self.bytes = p.pop(-1)                                            
            self.exptime = p.pop(-1)                                          
            self.flags = p.pop(-1)                                            
            self.data = i.get(&#39;data&#39;,None)                                    

        # incr, decr
        elif self.cmd in [&quot;incr&quot;,&quot;decr&quot;]:
            self.change_value = p.pop(-1)

        self.keys = p

    def __str__(self):
        return str(self.__dict__)
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;Реализация хранения кеша и работы с ним&lt;/h4&gt;Протокол мною сразу же был расширен, а именно есть возможность работы с вложенными данными. Кеш переделан в древовидный, и все операции, которые по стандарту указывают один ключ, могут указывать список ключей, разделенных пробелами. Впрочем от этого легко избавиться, но тогда будет совсем неясен смысл работы.                                                                                                                                                                                              &lt;br /&gt;
&lt;br /&gt;
В качестве единицы хранения реализован класс Entry, в котором содержится словарь(childs типа dict) с дочерними экземплярами Entry. Более того - верхней точкой в иерархии также является экземпляр класса Entry.                                          &lt;br /&gt;
&lt;br /&gt;
Здесь же я приведу фрагмент синглетона Cache:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
class Cache(object):
    # consts
    storage_commands = [&quot;set&quot;, &quot;add&quot;, &quot;replace&quot;, &quot;append&quot;, &quot;prepend&quot;,&quot;cas&quot;]
    oneline_commands = [&quot;get&quot;, &quot;gets&quot;,&quot;getn&quot;, &quot;delete&quot;, &quot;incr&quot;, &quot;decr&quot;, &quot;stats&quot;]

    # cache storage
    data = Entry(0,0,0)

    # cache operations
    @classmethod
    def call(cls, instruction):
        i = Instruction(instruction)
        debug(i)
        command = getattr(cls,i.cmd)
        return command(i)

    @classmethod
    def set(cls, i):
        &quot;set, поддержка вложенных ключей&quot;
        parent = cls.data.get_child(i.keys[:-1])
        if parent:
            parent.set_child(i.keys[-1], Entry(i.data,i.flags,i.exptime))
            yield &quot;STORED&quot;
        else:
            yield &quot;NOT_STORED&quot;

    @classmethod
    def get(cls, i):
        &quot;get, не обрабатывает вложенные ключи&quot;
        for key in i.keys:
            entry = cls.data.get_child([key])
            if entry:
                yield &#39; &#39;.join(( &quot;VALUE&quot;, key, entry.flags, str(len(entry.data)) ))
                yield entry.data
        yield &quot;END&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Код Entry и всего остального смотрим тут - http://github.com/Deepwalker/tx-cache/blob/master/mck.py</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8400103367183176131/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8400103367183176131' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8400103367183176131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8400103367183176131'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/12/twisted-memcache-python.html' title='Twisted в действии — memcache на python'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-5804262505866789282</id><published>2009-11-07T01:50:00.006+06:00</published><updated>2009-11-22T03:22:54.503+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="voip"/><category scheme="http://www.blogger.com/atom/ns#" term="отрывки"/><title type='text'>FreeSWITCH, сервис эха.</title><content type='html'>Обычно эхо делается так:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;приветствуем&lt;/li&gt;&lt;br /&gt;&lt;li&gt;бибикаем&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strike&gt;портим текст&lt;/strike&gt; записываем в файл&lt;/li&gt;&lt;br /&gt;&lt;li&gt;бибикаем&lt;/li&gt;&lt;br /&gt;&lt;li&gt;проигрываем файл&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strike&gt;откладываем скрипку&lt;/strike&gt; прощаемся&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Во FreeSWITCH есть более изящный вариант - приложение delay_echo. Единственный параметр это длительность задержки (буфера) перед воспроизведением звука обратно. Буфер размещается в памяти, диск не дергается, система не упирается в диск, но любит память. По моему восхитительно, учитывая еще и необходимость файлы стирать.&lt;br /&gt;&lt;br /&gt;&lt;font face=&quot;monospace&quot;&gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;1 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension name=&amp;quot;delay_echo&amp;quot;&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;2 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;condition field=&amp;quot;destination_number&amp;quot; expression=&amp;quot;^echo123$&amp;quot;&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;3 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;answer&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;4 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;sleep&amp;quot; data=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;5 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;playback&amp;quot; data=&amp;quot;/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-greeting.wav&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;6 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;playback&amp;quot; data=&amp;quot;/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-record_message.wav&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;7 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;sleep&amp;quot; data=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;8 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;gentones&amp;quot; data=&amp;quot;%(200,0,800)&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;&amp;nbsp;9 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--action application=&amp;quot;sched_broadcast&amp;quot; data=&amp;quot;+10 gentones::%(200,0,800)&amp;quot;/--&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;10 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;sched_transfer&amp;quot; data=&amp;quot;+20 after_echo XML public&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;11 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;delay_echo&amp;quot; data=&amp;quot;10000&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;12 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/condition&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;13 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;14 &lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;15 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension name=&amp;quot;delay_echo_next&amp;quot;&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;16 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;condition field=&amp;quot;destination_number&amp;quot; expression=&amp;quot;after_echo&amp;quot;&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;17 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;sleep&amp;quot; data=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;18 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;playback&amp;quot; data=&amp;quot;/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-goodbye.wav&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;19 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;sleep&amp;quot; data=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;20 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action application=&amp;quot;hangup&amp;quot;/&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;21 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/condition&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;22 &lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;font color=&quot;#ffff00&quot;&gt;&lt;b&gt;23 &lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/5804262505866789282/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/5804262505866789282' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5804262505866789282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5804262505866789282'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/11/freeswitch.html' title='FreeSWITCH, сервис эха.'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-5340977448637916513</id><published>2009-10-28T11:38:00.004+06:00</published><updated>2009-10-28T11:54:27.910+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="twisted"/><category scheme="http://www.blogger.com/atom/ns#" term="voip"/><title type='text'>Регистратор SIP на twisted.</title><content type='html'>Питонисты в курсе, что есть такая чудо библиотека для работы с сетевыми протоколами как Twisted. Она немного сложна поначалу, но после просветления становится совершенно необходимым инструментом.&lt;br /&gt;В стандартной поставке с ней идет множество уже реализованных протоколов - IMAP, XMPP, HTTP (в сочетании с обработкой URL через джанго и какой-нибудь библиотекой шаблонов весьма полезный инструмент) и т.д. Количество же протоколов, которые реализованы на/для Twisted не поддается подсчету. Таким образом Tornado может спать спокойно - сравнивать его с Twisted вообще некорректно.&lt;br /&gt;&lt;br /&gt;Среди стандартных протоколов нашел SIP - последний раз обновлялся 3 года назад, есть проект VoIP телефона shtoom, который также заглох. Но тем не менее вот вам регистратор на Twisted:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;# coding: utf-8&lt;br /&gt;&lt;br /&gt;from twisted.application import internet, service&lt;br /&gt;&lt;br /&gt;import sip&lt;br /&gt;&lt;br /&gt;DOMAIN=&#39;192.168.9.5&#39;&lt;br /&gt;&lt;br /&gt;application = service.Application(&quot;JuzzCallBack&quot;)&lt;br /&gt;&lt;br /&gt;sip.RegisterProxy.registry = sip.InMemoryRegistry(DOMAIN)&lt;br /&gt;sip.RegisterProxy.locator = sip.RegisterProxy.registry&lt;br /&gt;sip.RegisterProxy.debug = True&lt;br /&gt;proxy = internet.UDPServer(5060,sip.RegisterProxy())&lt;br /&gt;&lt;br /&gt;proxy.setServiceParent(application)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;И что удивительнее всего - он работает. На досуге хочется попробовать сделать простейший SIP-телефон, будет интересно. Назову его Shtoom ressurection, он не будет обладать даже функциями предшественника, и сдохнет на версии -0.1, ожидайте!</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/5340977448637916513/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/5340977448637916513' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5340977448637916513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5340977448637916513'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/10/sip-twisted.html' title='Регистратор SIP на twisted.'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-5480515926440024641</id><published>2009-10-14T02:29:00.003+07:00</published><updated>2009-10-14T02:36:44.668+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="twisted"/><title type='text'>HighLoad 2009</title><content type='html'>Из прослушки в онлайне интересующих меня секций вывел основной Highload  тренд - все быстро в асинхронность! Twisted как бы уже давно и прочно занял свою нишу, особенно в свете comet/longpoll технологий.&lt;br /&gt;&lt;br /&gt;А еще люди стали заботиться о целостности своего мозга и изобретать пути сокрытия асинхронной сущности программ в сопрограммах.Читаем &lt;a href=&quot;http://www.highload.ru/papers2009/12257.html&quot;&gt;тезисы&lt;/a&gt; и ссылки по теме ниже.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/5480515926440024641/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/5480515926440024641' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5480515926440024641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/5480515926440024641'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/10/highload-2009.html' title='HighLoad 2009'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-2092112666983976603</id><published>2009-05-06T09:36:00.004+07:00</published><updated>2009-05-06T09:57:16.730+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="h323"/><category scheme="http://www.blogger.com/atom/ns#" term="mod_opal"/><title type='text'>FreeSWITCH, mod_opal</title><content type='html'>В блоге &lt;a href=&quot;http://linktel.com.ua/blog/2009/05/05/mod_opal-status-beta-versiya/&quot;&gt;VoIP&lt;/a&gt; написали о mod_opal. А почему я вообще стараюсь не упоминать об этом модуле, как о прорыве в мир H323? Да потому, что мне кажется этот модуль плохо вливается в инфраструктуру FreeSWITCH. &lt;br /&gt;&lt;br /&gt;Самый главный минус модуля - RTP обрабатывается через Opal, то есть не используется RTP стек самого FreeSWITCH. Это в свою очередь означает, что кодеки надо делать под оба стека.&lt;br /&gt;&lt;br /&gt;Никакого Celt, Siren, G729 не будет, по крайней мере сразу. Последнего так уж точно, нет у меня лично никакого интереса писать еще один вариант.&lt;br /&gt;&lt;br /&gt;Ну и любой программист вам сразу скажет, что это ужасно поддерживается в разработке - два(!!!) RTP стека это двойная работа по отлову багов, разработке расширений и тому подобное. И нет никаких преимуществ от того, что глюками Opal занимаются его разработчики - ошибки в Opal также будут искать и в сообществе FreeSWITCH, причем гораздо активнее, чем в каких либо еще сообществах.&lt;br /&gt;&lt;br /&gt;Поэтому я не рассматриваю mod_opal как подходящий вариант ставящий точку в вопросе поддержки H323 в FreeSWITCH.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/2092112666983976603/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/2092112666983976603' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2092112666983976603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2092112666983976603'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/05/freeswitch-modopal.html' title='FreeSWITCH, mod_opal'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8635930011583710605</id><published>2009-04-25T23:12:00.002+07:00</published><updated>2009-04-25T23:17:21.563+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="kde"/><category scheme="http://www.blogger.com/atom/ns#" term="plasma"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Python, plasma, KDE 4.2</title><content type='html'>Бороздил интернет в поисках упоминания меня и наткнулся на интересную запись - http://neithere.livejournal.com/419237.html&lt;br /&gt;Понял почему не работали мои плазмоиды (недосуг было с ними разбираться). Дело было в одной маленькой строчке которую надо добавить в metadata.desktop:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;X-Plasma-MainScript=code/main.py&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Полезно почитать про себя любимого.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8635930011583710605/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8635930011583710605' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8635930011583710605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8635930011583710605'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/04/python-plasma-kde-42.html' title='Python, plasma, KDE 4.2'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-2685743720874283042</id><published>2009-04-23T20:54:00.003+07:00</published><updated>2009-04-23T21:04:21.295+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="фигня"/><title type='text'>Здравствуй, хозяин!</title><content type='html'>Первым дистрибутивом Linux, в котором я смог нормально начать работать, был Slackware. Произошло это потому, что он не обманывал меня всякими мастерами, в отличие от Mandrake. Так вот очень мне запомнились сообщения программы Fortune, которая выводит изречения, цитаты и прочее текстовое, что обладает достаточно малым размером.&lt;br /&gt;&lt;br /&gt;А есть так же программа &quot;cowsay&quot;, которая выводит в псевдографике персонажа с текстом как в комиксах. В частности изначально это была корова, но в моем дистрибутиве персонажей много. В общем я совместил Fortune и Cowsay, что не сильно то ново. Но главное я написал маленький скрипт, чтобы персонаж также выбирался случайным образом.&lt;br /&gt;&lt;br /&gt;Итого:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;kuku@kuku$ fortune | cowsay -f `python ~/rand_cow.py`&lt;br /&gt;kuku@kuku$ cat rand_cow.py&lt;br /&gt;import os&lt;br /&gt;import random&lt;br /&gt;# Хмм, а краткость то сестра криптографов...&lt;br /&gt;print random.choice([i[:-4] for i in os.listdir(&quot;/usr/share/cowsay/cows/&quot;)])&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/2685743720874283042/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/2685743720874283042' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2685743720874283042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2685743720874283042'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/04/blog-post_23.html' title='Здравствуй, хозяин!'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8343044733560172469</id><published>2009-04-21T04:27:00.003+07:00</published><updated>2009-04-21T04:33:05.902+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="g729"/><title type='text'>Новый вариант G729 для FreeSWITCH</title><content type='html'>В прошлый раз мне в комментариях подкинули исходники g729 для Asterisk с использованием библиотеки от ITU-T. С тех пор я и планировал переписать mod_g729 на его использование. Это может быть полезным если вы не используется x86 архитектуру, или вам влом качать 300 Мб с сайта Intel, или, в конце концов, вы один из тех, кто уже третью ночь воюет с адски непрофессионально написанным Makefile.&lt;br /&gt;Одним слово я собрался все таки и написал. Как вы понимаете, когда за дело берется администратор, а не программист, ваши риски серьезно увеличиваются. Так что берем, компилируем, ищем баги и тп. А я пойду уже спать, до побудки оставалось 4-е часа...&lt;br /&gt;&lt;br /&gt;http://github.com/Deepwalker/fs_itu_g729/tree/master</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8343044733560172469/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8343044733560172469' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8343044733560172469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8343044733560172469'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/04/g729-freeswitch.html' title='Новый вариант G729 для FreeSWITCH'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-7121411233693383963</id><published>2009-04-17T21:32:00.003+07:00</published><updated>2009-04-17T21:42:59.706+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><title type='text'>А все таки она развивается!</title><content type='html'>История такая - в городе Томске трафик в его пределах бесплатен. То есть вы платите за подключение и качаете сколько влезет на скорости до 100Mbit/s.&lt;br /&gt;Ну и логично совершенно вытекает, что в городе много зеркал всего. В частности есть зеркало для репозитариев Ubuntu - ubuntu.opentomsk.net, Slackware - slackware.tomsk.ru и тп.&lt;br /&gt;&lt;br /&gt;Так вот, не знаю почему, но репозитарии от 8.10 они грохнули и выложили 9.04. Волей не волей, а пришлось обновляться, и делал я это с замиранием сердца - я вообще часто свой рабочий компьютер держу на пике прогресса, и печального опыта у меня полно.&lt;br /&gt;&lt;br /&gt;Удивительно, но вместо этого я получил вылеченный баг с драйверами для видеокарточек Intel. Не мог не написать по одной причине - это у меня первый случай абсолютно бескровного перехода между релизами.&lt;br /&gt;&lt;br /&gt;P.S. Правда еще что то стало со шрифтами, но я не великий борец за их идеальное начертание и тп.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/7121411233693383963/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/7121411233693383963' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/7121411233693383963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/7121411233693383963'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/04/blog-post.html' title='А все таки она развивается!'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-10586084496138726</id><published>2009-02-17T11:58:00.005+06:00</published><updated>2009-02-20T09:50:34.263+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="fs2web"/><title type='text'>fs2web развивается</title><content type='html'>А я все продолжаю развивать fs2web - web-приложение для управления FreeSWITCH через xml_curl.&lt;br /&gt;&lt;br /&gt;Что уже есть:&lt;br /&gt;* поддержка привязки directory, то есть конфигурация пользователей;&lt;br /&gt;* поддержка dialplan, конфигурация номерного плана;&lt;br /&gt;* управление конференциями через xml_rpc.&lt;br /&gt;&lt;br /&gt;На данный момент все управление в основном работает через встроенную админку Django, что не мешает функционированию.&lt;br /&gt;&lt;br /&gt;В планах дальнейшее развитие - удобное редактирование номерного плана, поддержка шлюзов (gateways).&lt;br /&gt;&lt;br /&gt;Чего не хватает - не хватает пользователей, которые тестируют и желают развития.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Использование.&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Вам понадобится установленный фреймворк Django, желательно trunk версия, и lxml.&lt;br /&gt;&lt;br /&gt;Запуск - cd fs2web; ./manage.py runserver&lt;br /&gt;&lt;br /&gt;Для редактирования настроек надо зайти в административный интерфейс: http://127.0.0.1:8000/admin/&lt;br /&gt;Логин admin, пароль kuku.&lt;br /&gt;&lt;br /&gt;В conf/autoload_configs/xml_curl.conf.xml:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;configuration name=&quot;xml_curl.conf&quot; description=&quot;cURL XML Gateway&quot;&amp;gt;&lt;br /&gt;  &amp;lt;bindings&amp;gt;&lt;br /&gt;    &amp;lt;binding name=&quot;fs2web_user_fetcher&quot;&amp;gt;&lt;br /&gt;        &amp;lt;param name=&quot;gateway-url&quot; value=&quot;http://127.0.0.1:8000/user/get/&quot; bindings=&quot;directory&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/binding&amp;gt;&lt;br /&gt;    &amp;lt;binding name=&quot;fs2web_dialplan_fetcher&quot;&amp;gt;&lt;br /&gt;        &amp;lt;param name=&quot;gateway-url&quot; value=&quot;http://127.0.0.1:8000/dialplan/get/&quot; bindings=&quot;dialplan&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/binding&amp;gt;&lt;br /&gt;  &amp;lt;/bindings&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;И включить загрузку модуля xml_curl в conf/autoload_configs/modules.conf.xml</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/10586084496138726/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/10586084496138726' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/10586084496138726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/10586084496138726'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/02/fs2web.html' title='fs2web развивается'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-4379120261909019939</id><published>2009-02-09T16:59:00.003+06:00</published><updated>2009-02-09T17:03:02.550+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><title type='text'>freeswitch.ru</title><content type='html'>Создан проект русского wiki посвященного FreeSWITCH - &lt;a href=&quot;http://freeswitch.ru&quot;&gt;http://freeswitch.ru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сейчас там мало информации, так как времени пополнять ее сейчас также мало. И этим постом я приглашаю всех к работе над наполнением базы.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/4379120261909019939/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/4379120261909019939' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4379120261909019939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4379120261909019939'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/02/freeswitchru.html' title='freeswitch.ru'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-2463764031947047343</id><published>2009-01-20T13:19:00.000+06:00</published><updated>2009-01-20T17:10:59.635+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Путешествие группы формант по голосовому тракту"/><title type='text'>Путешествие группы формант по голосовому тракту. Глава вторая.</title><content type='html'>&lt;center&gt;&lt;i&gt;Обсуждение  плана. Прелести монтажа под открытым небом в хорошую погоду. - То же - в дурную погоду. Принимается компромиссное решение. Первые  впечатления от Монморенси. Не слишком ли он хорош для этого мира? Опасения отброшены как необоснованные. Заседание откладывается.&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Аналоговая сигнализация&lt;/h2&gt;&lt;br /&gt;Простейшая сигнализация используется в аналоговой телефонии - вы поднимаете трубку, а оттуда раздается радостный, располагающий к набору номера, гудок. Гудок вам посылает АТС, которая узнала о вашем проявлении интереса по снятой трубке =&gt; замкнутой цепи. Вы с радостью тыкаете кнопки, а телефон, также радостно, безусловно, отщелкивает ваши нажатия импульсами, или пропевает его комбинациями двух частот АТС. АТС, сама или с товарками быстренько разбирается в сути вашего щелкуче-певучего послания и найдя вашего адресата, подает сигнал его аппарату, что пора трезвонить, чем этот аппарат и займется со всей щенячьей радостью. А пока аппарат вызываемого абонента будет дергаться в параксизмах довольства, вы будете слышать длинные гудки, которые будут успокаивающе сообщать вам, что АТС о вас не забыла. Если аппарат дергался зря, и трубку никто так и не возьмёт, вы получите серию коротких гудков.&lt;br /&gt;&lt;br /&gt;Нетрудно заметить, что аналоговая сигнализация такого типа рассчитана отнюдь не на автоматику. Короткие и длинные гудки гарантировано не являются стандартными - ведь характеристика короткий/длинный вполне человеком воспринимается. А значит и заботиться тут не о чем. &lt;br /&gt;&lt;br /&gt;Руководствуясь подобными соображениями, создатели телефонных систем подарили незабываемую массу ощущений администраторам VoIP шлюзов - в форумах по Addpac можете почитать детективные истории по записи гудка занятости от АТС и последующего его анализа различными аудио редакторами. На самом деле все &lt;a href=&quot;http://deepwalker.blogspot.com/2008/04/addpac.html&quot;&gt;не так страшно&lt;/a&gt; с отбоем.&lt;br /&gt;&lt;br /&gt;А вот где и вправду очень обидно становится - это дозвон до абонента традиционной телефонной сети. Есть во FreeSWITCH такая переменная call_timeout (подобное есть в параметрах Dial в Asterisk), которая задает время попытки дозвониться. Если в течении скажем 20 секунд трубку никто не взял, то вызов уйдет в голосовую почту, например. Так вот если вы настроите переадресацию на свой сотовый аппарат, и захотите в случае неудачи перевести звонок в голосовую почту - ничего не выйдет. Шлюзу фактически невозможно определить идет ли вызов или уже кто то взял трубку (если это конечно не GSM шлюз, в GSM шлюзах с сигнализацией все хорошо). Также определить по коротким гудка занят ли абонент, или положил трубку после разговора, сложно.&lt;br /&gt;&lt;br /&gt;Да, конечно можно наворотить всяческих детекторов появления голоса в линии, но если я не сразу понимаю, что на том конце кто то соизволил дотянуться до трубки, то уж автоматика, с её процентами погрешности здесь никак не годится для серьезного использования - получится плохо, когда вызываемый уже взял трубку, а автоматика все еще размышляет - &quot;вот это голос, или не голос? Наверное все таки не голос, ждем дальше&quot;.&lt;br /&gt;&lt;br /&gt;Таким образом видно моё отношение к перспективам аналоговых стыков с городскими АТС - нет перспектив - аналоговая сигнализация в цифровом веке это атавизм, зачем эти костыли, когда АТС совершенно точно знает взяли на том конце трубку или нет. Весь вопрос всего лишь в том, что она об этом никак не сообщает, рассчитывая на то, что у аппарата человек, который признает собрата.&lt;br /&gt;&lt;br /&gt;Очевидно, что стык надо делать или цифровым (ну тут из вариантов я только E1 видел, и тот R1.5, и PRI еще поискать надо, хотя, возможно, где то есть еще и ISDN BRI), или делать VoIP стык. Сейчас уже многие провайдеры предоставляют городские телефоны через VoIP.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;В следующей серии зянятно-развлекательное описание протокола SIP.&lt;/i&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/2463764031947047343/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/2463764031947047343' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2463764031947047343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/2463764031947047343'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/12/blog-post_25.html' title='Путешествие группы формант по голосовому тракту. Глава вторая.'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-4673383042116320007</id><published>2009-01-04T04:06:00.005+06:00</published><updated>2009-01-05T14:18:52.595+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="g729"/><title type='text'>G.729 для FreeSWITCH готов</title><content type='html'>То есть я собрал из библиотек IPP, кодека для Asterisk, и mod_g729 от FreeSWITCH свой mod_g729. Кодирование работает прекрасно, декодирование пока вызывает вопросы.&lt;br /&gt;&lt;br /&gt;Забавный эффект - собеседника, подключенного по G.729 слышно, но есть артефакты, иногда, если сильно тараторить в трубку, фразы начинают долетать медленно. Хотя возможно во всем виновата связь - тестировал с удаленным шлюзом, так как найти G.729 в другом месте не смог.&lt;br /&gt;&lt;br /&gt;Забирайте &lt;a href=&quot;http://freehg.org/u/deepwalker/fs_g729/&quot;&gt;тут&lt;/a&gt;. Тестируйте, правьте код. &lt;br /&gt;&lt;br /&gt;Обсуждение &lt;a href=&quot;http://groups.google.ru/group/freeswitch-ru&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Обновление: тестирование с моим Nokia E61 показало хорошие результаты и на декодировании.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/4673383042116320007/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/4673383042116320007' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4673383042116320007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4673383042116320007'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2009/01/g729-freeswitch.html' title='G.729 для FreeSWITCH готов'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8609972641384938847</id><published>2008-12-31T14:21:00.008+06:00</published><updated>2008-12-31T14:40:37.269+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="g729"/><title type='text'>FreeSWITCH, кодеки, g729</title><content type='html'>А вы в курсе, что FreeSWITCH практически единственное решение в мире открытых исходников, которое поддерживает HD кодеки?&lt;br /&gt;&lt;br /&gt;Так недавно была добавлена поддержка кодеков Siren от компании Polycom. Была добавлена поддержка кодека celt! А кодек celt это 48 кГц - больше чем у CD записей. И это в полосе меньшей, чем у G.711 с 8 кГц. В общем жду когда эти кодеки можно будет попробовать в каком-нибудь IP-телефоне.&lt;br /&gt;&lt;br /&gt;Хотя чего ждать? FreeSWITCH может работать как программный IP-телефон. Фактически, linux+FS это готовая программная начинка для IP-телефона с огромными возможностями. 3-way конференция? Легко, причем в HD качестве. Правда пытался присмотреться к железу, на котором можно было бы подобное собрать, и понял что ничего в этом не понимаю - большинство попадавшихся плат были для разработчиков, то есть не для использования для сборки в каких либо продуктах, и откуда берут платы производители телефонов не понимаю. Видимо они их могут сами спроектировать.&lt;br /&gt;&lt;br /&gt;А пока я пытаюсь собрать/дописать кодек G.729. Программист на C из меня вообще никакой, так что утечки памяти гарантирую :) Исходники моего творчества лежат &lt;a href=&quot;http://freehg.org/u/deepwalker/fs_g729/&quot;&gt;тут&lt;/a&gt;, если кто то захочет помочь - милости прощу, с радостью свалю задачу человеку, который хорошо понимает значение всех этих звездочек. Если кому то просто интересно получить рабочий кодек (не гарантирую, что стабильный) заглядывайте, смотрите на прогресс.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8609972641384938847/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8609972641384938847' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8609972641384938847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8609972641384938847'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/12/freeswitch-g729.html' title='FreeSWITCH, кодеки, g729'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-4178532268189252304</id><published>2008-12-21T00:03:00.034+06:00</published><updated>2008-12-22T14:13:18.044+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Путешествие группы формант по голосовому тракту"/><title type='text'>Путешествие группы формант по голосовому тракту</title><content type='html'>&lt;center&gt;&lt;i&gt;Трое   монтажников связи. Страдания   Джорджа и Гарриса. Жертва ста семи помех.  Полезные рецепты. Средство против болезней голосового тракта у монтажников.  Монтажники  сходятся на том, что переутомились и что им нужен отдых. Неделя в море, вдали от лапши? Джордж  предлагает  путешествие  по  реке.  Монморенси  выдвигает возражение, лапша недостаточно удаляется.  Первоначальное  предложение  принято  большинством  трех против одного.&lt;/i&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Аналоговая телефония&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Все что нужно, чтобы связаться посредством двух телефонов - двухжильный провод и питание постоянным током (батарейка &quot;Крона&quot;, например). Эту нехитрую истину знают монтажники связи - десятилетия у каждого из представителей доблестной профессии в сумке болтается &lt;a href=&quot;http://izmer-ls.narod.ru/prozv.html&quot;&gt;переделанная трубка от советского дискового телефона.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;То есть сама основа аналогового телефонного разговора проста - в трубке установлен угольный микрофон, под действием звуковых волн сопротивление его меняется - происходит модуляция тока. На другом конце, под действием модулированного тока, вибрирует динамик - телефонный капсюль. Первые телефонные станции реализовывали именно эту схему - телефонистка соединяла шнурами двух абонентов.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Конечно же в современных телефонах микрофон вполне может оказаться пьезоэлектрическим, телефоны осуществляют тоновый, а не импульсный набор, а значит наборный круг им не подходит, да и вообще - телефон может оказаться и не аналоговым вовсе.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;В дисковых телефонах номер набирался &lt;a href=&quot;http://ru.wikipedia.org/wiki/Импульсный_набор&quot;&gt;серией импульсов&lt;/a&gt;, что в трубке слышалось как серия щелчков. Импульсный набор зародился во времена  &lt;a href=&quot;http://www.aboutphone.info/lib/oldbook/atsdsh.html&quot;&gt;декадно-шаговых АТС&lt;/a&gt;. Импульсы с телефонного аппарата напрямую управляли процессом набора номера на станции. Декадно-шаговые АТС были первыми автоматическими телефонными станциями.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;На сегодняшний день используются цифровые АТС и IP-АТС. То есть, конечно, в глухих лесах необъятной Родины можно найти и АТС декадно-шаговой системы, координатные АТС и прочие системы, но на новых объектах их не ставят, а в городах стараются заменять.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;АТС в телефонном тракте на начальном этапе играла роль источника питания и коммутатора - между абонентами одной АТС соединение устанавливало одну электрическую цепь. Конечно же на качестве связи отражалось всё - скрутки, станционные приборы, наводки, тепловые токи и т.д.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Цифра&lt;/h2&gt;&lt;br /&gt;Цифровая передача получила дорогу в жизнь на магистралях - передача аналогового сигнала на большие расстояния бесперспективна - помехи суммируются и сигнал становится невозможного для восприятия качества. Цифровой же сигнал замечательно регенерируется - достаточно распознать импульсы и сгенерировать такую же последовательность - на выходе повторителя такой же сигнал, каким он был десяток километров назад.&lt;br /&gt;&lt;br /&gt;Понятно, что в жизни не все так гладко - возможно изменение бита или нескольких, что требует в кодировании заложить избыточность, хотя для голоса это не так критично, при низкой вероятности ошибок.&lt;br /&gt;&lt;br /&gt;Человеческое ухо способно воспринимать звук с частотами от 20 герц до 24-25 килогерц. В соответствии с  &lt;a href=&quot;http://ru.wikipedia.org/wiki/Теорема_Котельникова&quot;&gt;теоремой Котельникова (Найквиста)&lt;/a&gt; для оцифровки сигнала требуется частота выборки в два раза большая частоты сигнала. В действительности, для передачи голоса, достаточно гораздо более узкой полосы - в телефонии принята полоса от 300 Гц до 3 кГц. То есть в этой полосе располагаются основные &lt;a href=&quot;http://en.wikipedia.org/wiki/Formant&quot;&gt;форманты&lt;/a&gt;, которые наиболее значимы для различимости речи. В телефонии используется частота дискретизации (выборки) 8 кГц. При использовании 8-ми бит на один шаг получаем 64 кбит/c. В IP-телефонии кодек с такими характеристиками называется G.711.&lt;br /&gt;&lt;br /&gt;Таким образом 64 кбит/c является стандартной скоростью передачи одного голосового канала в цифровой технике связи. С какой бы технологией вы не столкнулись - многоканальная связь, цифровая телефония, ISDN, ИКМ - везде под один голосовой канал отводится именно такая пропускная способность. Все скорости передачи в цифровой телефонии кратны 64 кбит/с и теперь вы знаете почему. Так же вам теперь понятно, почему сигнал ADSL, использующий частоты за голосовым спектром, не может быть пропущен через цифровые тракты, и обычно оканчивается на ближайшей городской АТС - телефония предполагает передачу сигнала с частотой не более 3 кГц.&lt;br /&gt;&lt;br /&gt;Модемы и факсы также спроектированы с учетом этих фактов. Поэтому, когда в IP-телефонии используется этот же кодек (G711,64 кбит/с), факсы путешествуют через такие каналы без проблем.&lt;br /&gt;&lt;br /&gt;Цифровые АТС работают именно с такими потоками. Если к цифровой АТС есть возможность подключить традиционные аналоговые телефоны - на входе их сигнал будет кодирован в цифровой и внутри АТС будет обрабатываться точно так же, как сигналы от цифровых телефонов.&lt;br /&gt;&lt;br /&gt;В данной серии были изложены основы и упомянута &lt;a href=&quot;http://ru.wikipedia.org/wiki/Теорема_Котельникова&quot;&gt;теорема Котельникова&lt;/a&gt;, а Монморенси совершил подвиг, зажав зубами кабель, и спас селекторное. В следующих сериях страшные истории про кодеки, SIP и SDP, а также продолжение серии о монтажнике Джордже.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Принимаются критические замечания, в том числе и в гугл-группе &lt;a href=&quot;http://groups.google.ru/group/freeswitch-ru&quot;&gt;freeswitch-ru&lt;/a&gt;.&lt;/i&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/4178532268189252304/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/4178532268189252304' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4178532268189252304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/4178532268189252304'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/12/blog-post.html' title='Путешествие группы формант по голосовому тракту'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-1968264555308874309</id><published>2008-12-12T14:36:00.011+06:00</published><updated>2008-12-15T12:22:06.924+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><title type='text'>FreeSWITCH, факсы</title><content type='html'>Итак, кое-что о факсах. Какими бы бурными темпами ни двигался интернет в каждый дом, факс остается весьма важным средством передачи документов. В протоколах VoIP этому моменту уделено внимание, специально для факсов создан протокол T.38.&lt;br /&gt;&lt;br /&gt;Временное отсутствие T.38 в FreeSWITCH я не считаю большой проблемой - на сегодняшний день лучше всего передаются факсы при использовании кодека G.711. T.38 будет реализован в обозримом будущем, а пока я опишу то, что уже есть.&lt;br /&gt;В FreeSWITCH был добавлен модуль mod_fax. Он предоставляет две функции - txfax и rxfax. На текущий момент поддерживается протокол T.30. Пример из &lt;a href=&quot;http://wiki.freeswitch.org/wiki/Mod_fax&quot;&gt;wiki&lt;/a&gt;:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;   &amp;lt;extension name=&quot;fax&quot;&amp;gt;&lt;br /&gt;      &amp;lt;condition field=&quot;destination_number&quot; expression=&quot;^fax$&quot;&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;answer&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;playback&quot; data=&quot;silence_stream://2000&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;rxfax&quot; data=&quot;/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;hangup&quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Обнаружение передачи факса.&lt;br /&gt;&lt;br /&gt;FreeSWITCH предоставляет специальную функцию для обнаружения тоновых сигналов в голосовом потоке - &lt;a href=&quot;http://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_tone_detect&quot;&gt;tone_detect&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;extension name=&quot;5555555&quot;&amp;gt;&lt;br /&gt;      &amp;lt;condition field=&quot;destination_number&quot; expression=&quot;^(5555555)$&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;tone_detect&quot; data=&quot;fax 1100 r +5000 transfer fax XML default&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;answer&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;sleep&quot; data=&quot;1000&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;ivr&quot; data=&quot;main&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;hangup&quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;br /&gt;    &amp;lt;extension name=&quot;fax&quot;&amp;gt;&lt;br /&gt;      &amp;lt;condition field=&quot;destination_number&quot; expression=&quot;^fax$&quot;&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;answer&quot; /&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;playback&quot; data=&quot;silence_stream://2000&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;rxfax&quot; data=&quot;/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;hangup&quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;А можно поставить обнаружение на всю сессию:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;!-- continue=&quot;true&quot; - означает, что надо продолжить выполнение номерного плана после этого пункта --&amp;gt;&lt;br /&gt;    &amp;lt;extension name=&quot;fax_tone_detect_permanent&quot; continue=&quot;true&quot;&amp;gt;&lt;br /&gt;      &amp;lt;!-- ловим любые звонки, так как .* означает любое кол-во любых символов --&amp;gt;&lt;br /&gt;      &amp;lt;condition field=&quot;destination_number&quot; expression=&quot;^.*$&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;!-- ставим обнаружение тона 1100 со стороны звонящего(r) бесконечное время(0)&lt;br /&gt;         В случае обнаружения тона передаем (transfer) на обработку в &quot;default&quot; номерной план&lt;br /&gt;         с номером &quot;fax&quot;--&amp;gt;&lt;br /&gt;        &amp;lt;action application=&quot;tone_detect&quot; data=&quot;fax 1100 r 0 transfer fax XML default&quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Таким образом прием факсов в FreeSWITCH организовать достаточно легко. Надеюсь реализация T.38 не заставит себя долго ждать.&lt;br /&gt;&lt;br /&gt;Слабым местом пока остается поддержка кодеков. Все заинтересованные уже знакомы с патентной системой США - практически все дистрибутивы в нашей стране имеют &quot;поддержку кодеков из коробки&quot;.&lt;br /&gt;G.729, G.723, AMR сейчас поддерживаются только в режиме без перекодирования. То есть использовать с этими кодеками голосовую почту, голосовые меню, запись разговоров затруднительно.&lt;br /&gt;&lt;br /&gt;Заколдованый круг - пока FreeSWITCH не поддерживает кодеки он не очень интересен у нас. А пока он не очень интересен - кодеки реализовывать некому.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/1968264555308874309/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/1968264555308874309' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/1968264555308874309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/1968264555308874309'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/12/freeswitch.html' title='FreeSWITCH, факсы'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-8468586322803897633</id><published>2008-11-23T17:00:00.003+06:00</published><updated>2008-11-23T17:05:32.996+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch"/><category scheme="http://www.blogger.com/atom/ns#" term="Инфраструктура Kerberos"/><title type='text'>Google-группы по kerberos и Freeswitch</title><content type='html'>Я создал две новых google-группы для обсуждения вопросов, связанных с kerberos и freeswitch. Просьба все свои вопросы задавать там - формат комментариев к блогу не очень хорошо подходит для подобных обсуждений.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. &lt;a href=&quot;http://groups.google.ru/group/ru-kerberos?msg=new&amp;lnk=gcis&amp;hl=ru&quot;&gt;ru-kerberos&lt;/a&gt;&lt;br /&gt;2. &lt;a href=&quot;http://groups.google.ru/group/freeswitch-ru?msg=new&amp;lnk=gcis&amp;hl=ru&quot;&gt;freswitch-ru&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/8468586322803897633/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/8468586322803897633' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8468586322803897633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/8468586322803897633'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/11/google-kerberos-freeswitch.html' title='Google-группы по kerberos и Freeswitch'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6888322710677399759.post-660282675278871884</id><published>2008-11-13T15:50:00.003+06:00</published><updated>2008-11-13T15:58:25.133+06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="plasma"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>plasma-mediacontroller</title><content type='html'>Почему то Am4rok, из Ubuntu 8.10, у меня не работает. Не разбирался, ведь те, кто следят за блогом, знают - теперь есть биндинги под python! Сделал себе свой велосипед - plasma-mediacontroller. Он конечно не так здорово смотрится, но главное он у меня работает.&lt;br /&gt;&lt;br /&gt;Если кому то будет интересен, можно продолжить разработку. Сейчас он работает только с Amarok, но нет ничего сложного в добавлении поддержки практически любого медиаплеера. Ведь большинство из них реализует стандартный интерфейс DBus для медиаплееров.&lt;br /&gt;&lt;br /&gt;Кому интересно - берите &lt;a href=&quot;http://github.com/Deepwalker/plasma-mediacontroller/tree/master&quot;&gt;тут&lt;/a&gt;. В первой записи о plasma-python есть инструкции по установке плазмоида.</content><link rel='replies' type='application/atom+xml' href='http://deepwalker.blogspot.com/feeds/660282675278871884/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6888322710677399759/660282675278871884' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/660282675278871884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6888322710677399759/posts/default/660282675278871884'/><link rel='alternate' type='text/html' href='http://deepwalker.blogspot.com/2008/11/plasma-mediacontroller.html' title='plasma-mediacontroller'/><author><name>Deepwalker</name><uri>http://www.blogger.com/profile/11174389329305818117</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>