<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0YMQXY8cCp7ImA9WhVUFUU.&quot;"><id>tag:blogger.com,1999:blog-6888322710677399759</id><updated>2012-05-21T13:19:40.878+07:00</updated><category term="linux" /><category term="фигня" /><category term="мысли" /><category term="twisted" /><category term="cifs" /><category term="heimdal" /><category term="программа" /><category term="отрывки" /><category term="идея" /><category term="voip" /><category term="Инфраструктура Kerberos" /><category term="plasma" /><category term="vnc" /><category term="fs2web" /><category term="kde" /><category term="greenlet" /><category term="mod_opal" /><category term="sipx" /><category term="ldap" /><category term="addpac" /><category term="scfl" /><category term="py-configurator" /><category term="python" /><category term="книги" /><category term="upstart" /><category term="h323" /><category term="samba" /><category term="vim" /><category term="nfs" /><category term="Путешествие группы формант по голосовому тракту" /><category term="kerberos" /><category term="g729" /><category term="freeswitch" /><title>Deepwalker</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://deepwalker.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://deepwalker.blogspot.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&amp;v=2" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Deepwalker" /><feedburner:info uri="deepwalker" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkUMRHcycCp7ImA9WhVSEE4.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-06T17:38:05.998+07:00</app:edited><title>Мэтрам django web разработки посвящается</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-1872395630600902362?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/QiQKBqxhxTk" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=1872395630600902362" title="Комментарии: 9" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/1872395630600902362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/1872395630600902362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/QiQKBqxhxTk/django-web.html" title="Мэтрам django web разработки посвящается" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>9</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2012/03/django-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MRXgyeCp7ImA9WhRVGEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-18T21:13:04.690+07:00</app:edited><title>SamaraPy</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Зависть великая штука.&amp;nbsp;Побывав на PyConUA я заразился чудной атмосферой живого общения с едино и разномышленниками. Я не уверен, что получится в Самаре найти достаточное число участников для SamaraPy, который более будет похож поначалу на KievPy, но я попробую.&lt;br /&gt;
&lt;br /&gt;
Подробности будут тут&amp;nbsp;&lt;a href="http://vk.com/club34256705"&gt;http://vk.com/club34256705&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
В конце концов оказался же в этом городе Я!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-2487112698797418327?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/jxlZ_SCSt1w" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=2487112698797418327" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2487112698797418327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2487112698797418327?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/jxlZ_SCSt1w/samarapy.html" title="SamaraPy" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2012/01/samarapy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EMQnk6eip7ImA9WhRVGEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-18T21:08:03.712+07:00</app:edited><title>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. Прием патчей. Когда у нас глюкало видео я искал проблему и нашел ее. Создал патч и отправил в жиру. После месяца боданий патч был принят с формулировкой "а предыдущий пацанчик говорил что все работает отлично, но вы достали, хрен с вами". Многообщающе.&lt;/p&gt;

&lt;p&gt;2. Использование DMCA для блокировки репозитория с кодом g729 кодека. Нормальные люди вначале пишут и говорят - у вас тут мои копирайты, вы поправьте. В общем мне их мотивировка неясна - их права никак не были нарушены, но шило в попе творит чудеса.&lt;/p&gt;

&lt;p&gt;В общем как для профессионального разработчика для меня FreeSWITCH это один сплошной дурдом. Без причин с ним возиться я с ним возиться никакого желания не имею.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-5078795104222496237?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/6Aqv0VkaERc" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=5078795104222496237" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5078795104222496237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5078795104222496237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/6Aqv0VkaERc/freeswitch-love-over.html" title="FreeSWITCh, love over" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2012/01/freeswitch-love-over.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HSH85fSp7ImA9WxBVGUw.&quot;"><id>tag:blogger.com,1999:blog-6888322710677399759.post-4282017406477209013</id><published>2010-02-23T14:13:00.002+06:00</published><updated>2010-02-23T14:13:59.125+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-23T14:13:59.125+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twisted" /><category scheme="http://www.blogger.com/atom/ns#" term="greenlet" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Django в неблокирующем стиле, или в погоне за Священным Граалем</title><content type="html">Было опубликовано на Хабре.&lt;br /&gt;
&lt;img src="http://img7.imageshack.us/img7/588/holygrail051.jpg" alt="image"/&gt;&lt;br /&gt;
&lt;h4&gt;Присказка&lt;/h4&gt;При чтении о Twisted, Tornado, Node.js, у многих python-программистов возникает вопрос - "а вот если взять, и переписать Django в неблокирующем стиле?". Обычный ответ на этот вопрос - нет, не дождетесь. И правда, чтобы переписать целый фреймворк в макаронно-колбечном стиле, надо очень много сил, и большой заряд энтузиазма. Писать с колбеками, очень сомнительное удовольствие.&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;img src="http://img198.imageshack.us/img198/8702/notegif.png" alt="image"/&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-4282017406477209013?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/XHx-i9Bzc0Y" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=4282017406477209013" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4282017406477209013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4282017406477209013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/XHx-i9Bzc0Y/django.html" title="Django в неблокирующем стиле, или в погоне за Священным Граалем" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2010/02/django.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IEQ3w9cCp7ImA9WxBQEEg.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-09T23:51:42.268+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twisted" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Озеленение Twisted</title><content type="html">Как обычно, в праздники, в свободное время от затирки плитки и прочих прибиваний плинтуса, меня захватила очередная идея из цикла "попробовать". На хабре проскочила статья о &lt;a href="http://habrahabr.ru/blogs/python/80062/"&gt;Pyrant&lt;/a&gt;. Первой итерацией я взял и переделал основную часть протокола на Twisted - http://github.com/Deepwalker/tx-tokyo . И все было хорошо, наступление шло по всем фронтам, но тут я перешел к питоничной части pyrant, и понял что сделать yield a[megakey]='mega data string', вообще говоря невозможно. Это было очень печально, ведь в статье меня зацепило именно легкое обращение с данными в питоничной форме. Что же делать, Пух, спросил я себя? И вспомнил о &lt;a href="http://codespeak.net/py/0.9.2/greenlet.html"&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['kuku'] = 'Green Tyrant!'
    print t['kuku']

    reactor.stop()

if __name__=='__main__':
    test_proto()
    reactor.run()
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Удобство в том, что greenlet-ы имеют важное отличие от генераторов - они не ограничены одной функцией. То есть при вызове t['kuku'], на самом деле вызывается t.__getitem__, внутри которого мы и делаем вызов switch() для возврата управления основному циклу на время, пока мы ожидаем данные от сервера. Если бы мы попробовали сделать внутри t.__getitem__ yield, то мы бы просто сделали из него генератор, не получив никакой пользы.&lt;br /&gt;
&lt;br /&gt;
Неудобство состоит в том, что надо помнить обо всей этой начинке - будет плохо если вы будете ждать данные, а вместо этого вам упадет просто Deferred. И будет еще хуже, если вы забудете вернуть управление основному потоку - остановите все приложение. И еще в этом варианте не светит "not twist your brain", потому что надо помнить и использовать возможности 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="http://github.com/Deepwalker/deepwalker_sandbox"&gt;песочнице&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Вот такой небольшой пост. Как всегда ожидаю приятного обсуждения, и надеюсь, что будут хорошие предложения по коду, как было в прошлой нашей встрече, со мной в амплуа постописателя. Спасибо за внимание.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-2447745148068794582?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/FvrorpPvO6U" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=2447745148068794582" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2447745148068794582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2447745148068794582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/FvrorpPvO6U/twisted.html" title="Озеленение Twisted" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2010/01/twisted.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIMQnk9fCp7ImA9WxBTFkQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T16:03:03.764+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twisted" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>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):                                                                                    
    """                                                                                                                      
    Реализует базис протокола - прием сообщений от клиента                                                                   
    и отдачу результата.                                                                                                     
    """                                                                                             
    def lineReceived(self,line):            
        debug(repr(line))                   
        if not 'parameters' in self.instruction:
            parameters = line.split(' ')        
            debug("Got new command "+parameters[0])
            self.instruction['parameters']=parameters

            # Если данных не ожидается, то к исполнению
            if parameters[0] in Cache.oneline_commands:
                self.process()                         
        else:                                          
            # Получены данные к двухстрочной команде, к исполнению
            debug("Got data "+line)                               
            self.instruction['data']=line                         
            self.process()                                        

    def process(self):
        # Cache.call возвращает генератор
        for line in Cache.call(self.instruction):
            # И мы отсылаем все что он нагенерирует отдельными строками
            debug("Send line "+line)                                   
            self.sendLine(line)                                        
        # Готовы к дальнейшим инструкциям, насяльника!                 
        self.instruction={}                                            

    def connectionMade(self):
        debug("Connected!")  
        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['parameters']
        self.cmd = p.pop(0)

        # Проверяем noreply
        if p[-1]=='noreply':
            self.reply=False
            # Выкидываем его
            p.pop(-1)       
        else:               
            self.reply=True 

        if self.cmd in Cache.storage_commands:
            # Если CAS то есть еще один параметр (т.е. особый случай)
            if self.cmd == "cas":                                    
                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('data',None)                                    

        # incr, decr
        elif self.cmd in ["incr","decr"]:
            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 = ["set", "add", "replace", "append", "prepend","cas"]
    oneline_commands = ["get", "gets","getn", "delete", "incr", "decr", "stats"]

    # 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):
        "set, поддержка вложенных ключей"
        parent = cls.data.get_child(i.keys[:-1])
        if parent:
            parent.set_child(i.keys[-1], Entry(i.data,i.flags,i.exptime))
            yield "STORED"
        else:
            yield "NOT_STORED"

    @classmethod
    def get(cls, i):
        "get, не обрабатывает вложенные ключи"
        for key in i.keys:
            entry = cls.data.get_child([key])
            if entry:
                yield ' '.join(( "VALUE", key, entry.flags, str(len(entry.data)) ))
                yield entry.data
        yield "END"
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Код Entry и всего остального смотрим тут - http://github.com/Deepwalker/tx-cache/blob/master/mck.py&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-8400103367183176131?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/bIr4klEZp6o" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=8400103367183176131" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8400103367183176131?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8400103367183176131?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/bIr4klEZp6o/twisted-memcache-python.html" title="Twisted в действии — memcache на python" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/12/twisted-memcache-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIDRXs7eyp7ImA9WxNbGE4.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-22T03:22:54.503+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="отрывки" /><category scheme="http://www.blogger.com/atom/ns#" term="voip" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>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="monospace"&gt;&lt;br /&gt;&lt;font color="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&gt;&lt;b&gt;14 &lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&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="#ffff00"&gt;&lt;b&gt;23 &lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-5804262505866789282?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/Dz5inswsoVY" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=5804262505866789282" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5804262505866789282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5804262505866789282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/Dz5inswsoVY/freeswitch.html" title="FreeSWITCH, сервис эха." /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/11/freeswitch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UCRnc6eCp7ImA9WxNVF00.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T11:54:27.910+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twisted" /><category scheme="http://www.blogger.com/atom/ns#" term="voip" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Регистратор 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='192.168.9.5'&lt;br /&gt;&lt;br /&gt;application = service.Application("JuzzCallBack")&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, ожидайте!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-5340977448637916513?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/PscaSAB_VY0" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=5340977448637916513" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5340977448637916513?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5340977448637916513?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/PscaSAB_VY0/sip-twisted.html" title="Регистратор SIP на twisted." /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/10/sip-twisted.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEERXg9cCp7ImA9WxNWFEs.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T02:36:44.668+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twisted" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>HighLoad 2009</title><content type="html">Из прослушки в онлайне интересующих меня секций вывел основной Highload  тренд - все быстро в асинхронность! Twisted как бы уже давно и прочно занял свою нишу, особенно в свете comet/longpoll технологий.&lt;br /&gt;&lt;br /&gt;А еще люди стали заботиться о целостности своего мозга и изобретать пути сокрытия асинхронной сущности программ в сопрограммах.Читаем &lt;a href="http://www.highload.ru/papers2009/12257.html"&gt;тезисы&lt;/a&gt; и ссылки по теме ниже.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-5480515926440024641?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/U16jV2Woydg" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=5480515926440024641" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5480515926440024641?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/5480515926440024641?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/U16jV2Woydg/highload-2009.html" title="HighLoad 2009" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/10/highload-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEHR3k4eCp7ImA9WxJSFUo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T09:57:16.730+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="h323" /><category scheme="http://www.blogger.com/atom/ns#" term="mod_opal" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>FreeSWITCH, mod_opal</title><content type="html">В блоге &lt;a href="http://linktel.com.ua/blog/2009/05/05/mod_opal-status-beta-versiya/"&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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-2092112666983976603?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/mXulU7MS_n8" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=2092112666983976603" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2092112666983976603?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2092112666983976603?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/mXulU7MS_n8/freeswitch-modopal.html" title="FreeSWITCH, mod_opal" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/05/freeswitch-modopal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUAQHs9eyp7ImA9WxJTFko.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-25T23:17:21.563+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="kde" /><category scheme="http://www.blogger.com/atom/ns#" term="plasma" /><title>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;Полезно почитать про себя любимого.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-8635930011583710605?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/HiDKwtuF7cU" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=8635930011583710605" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8635930011583710605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8635930011583710605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/HiDKwtuF7cU/python-plasma-kde-42.html" title="Python, plasma, KDE 4.2" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/04/python-plasma-kde-42.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCQHwyfSp7ImA9WxJTFEQ.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T21:04:21.295+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="фигня" /><title>Здравствуй, хозяин!</title><content type="html">Первым дистрибутивом Linux, в котором я смог нормально начать работать, был Slackware. Произошло это потому, что он не обманывал меня всякими мастерами, в отличие от Mandrake. Так вот очень мне запомнились сообщения программы Fortune, которая выводит изречения, цитаты и прочее текстовое, что обладает достаточно малым размером.&lt;br /&gt;&lt;br /&gt;А есть так же программа "cowsay", которая выводит в псевдографике персонажа с текстом как в комиксах. В частности изначально это была корова, но в моем дистрибутиве персонажей много. В общем я совместил 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("/usr/share/cowsay/cows/")])&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-2685743720874283042?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/UEmmQgUgE3M" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=2685743720874283042" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2685743720874283042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2685743720874283042?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/UEmmQgUgE3M/blog-post_23.html" title="Здравствуй, хозяин!" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/04/blog-post_23.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYMRHc7eip7ImA9WxJTEks.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T04:33:05.902+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="g729" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>Новый вариант 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&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-8343044733560172469?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/BSjVfVWPJg0" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=8343044733560172469" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8343044733560172469?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8343044733560172469?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/BSjVfVWPJg0/g729-freeswitch.html" title="Новый вариант G729 для FreeSWITCH" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/04/g729-freeswitch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QDSHk7fip7ImA9WxVaGUo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T21:42:59.706+07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><title>А все таки она развивается!</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. Правда еще что то стало со шрифтами, но я не великий борец за их идеальное начертание и тп.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-7121411233693383963?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/rzrQryX5JDg" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=7121411233693383963" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/7121411233693383963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/7121411233693383963?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/rzrQryX5JDg/blog-post.html" title="А все таки она развивается!" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08HRXw9eyp7ImA9WxVWEU0.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-20T09:50:34.263+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fs2web" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>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="xml_curl.conf" description="cURL XML Gateway"&amp;gt;&lt;br /&gt;  &amp;lt;bindings&amp;gt;&lt;br /&gt;    &amp;lt;binding name="fs2web_user_fetcher"&amp;gt;&lt;br /&gt;        &amp;lt;param name="gateway-url" value="http://127.0.0.1:8000/user/get/" bindings="directory"/&amp;gt;&lt;br /&gt;    &amp;lt;/binding&amp;gt;&lt;br /&gt;    &amp;lt;binding name="fs2web_dialplan_fetcher"&amp;gt;&lt;br /&gt;        &amp;lt;param name="gateway-url" value="http://127.0.0.1:8000/dialplan/get/" bindings="dialplan"/&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&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-10586084496138726?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/_zSvKmCWMUs" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=10586084496138726" title="Комментарии: 12" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/10586084496138726?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/10586084496138726?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/_zSvKmCWMUs/fs2web.html" title="fs2web развивается" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>12</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/02/fs2web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQMQ3s-eCp7ImA9WxVXEUo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-09T17:03:02.550+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>freeswitch.ru</title><content type="html">Создан проект русского wiki посвященного FreeSWITCH - &lt;a href="http://freeswitch.ru"&gt;http://freeswitch.ru&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Сейчас там мало информации, так как времени пополнять ее сейчас также мало. И этим постом я приглашаю всех к работе над наполнением базы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-4379120261909019939?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/iBX8yBeeIQo" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=4379120261909019939" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4379120261909019939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4379120261909019939?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/iBX8yBeeIQo/freeswitchru.html" title="freeswitch.ru" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/02/freeswitchru.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BSHg4fSp7ImA9WxVRFEk.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-20T17:10:59.635+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Путешествие группы формант по голосовому тракту" /><title>Путешествие группы формант по голосовому тракту. Глава вторая.</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="http://deepwalker.blogspot.com/2008/04/addpac.html"&gt;не так страшно&lt;/a&gt; с отбоем.&lt;br /&gt;&lt;br /&gt;А вот где и вправду очень обидно становится - это дозвон до абонента традиционной телефонной сети. Есть во FreeSWITCH такая переменная call_timeout (подобное есть в параметрах Dial в Asterisk), которая задает время попытки дозвониться. Если в течении скажем 20 секунд трубку никто не взял, то вызов уйдет в голосовую почту, например. Так вот если вы настроите переадресацию на свой сотовый аппарат, и захотите в случае неудачи перевести звонок в голосовую почту - ничего не выйдет. Шлюзу фактически невозможно определить идет ли вызов или уже кто то взял трубку (если это конечно не GSM шлюз, в GSM шлюзах с сигнализацией все хорошо). Также определить по коротким гудка занят ли абонент, или положил трубку после разговора, сложно.&lt;br /&gt;&lt;br /&gt;Да, конечно можно наворотить всяческих детекторов появления голоса в линии, но если я не сразу понимаю, что на том конце кто то соизволил дотянуться до трубки, то уж автоматика, с её процентами погрешности здесь никак не годится для серьезного использования - получится плохо, когда вызываемый уже взял трубку, а автоматика все еще размышляет - "вот это голос, или не голос? Наверное все таки не голос, ждем дальше".&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;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-2463764031947047343?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/Zx3Sfsbn7b0" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=2463764031947047343" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2463764031947047343?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/2463764031947047343?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/Zx3Sfsbn7b0/blog-post_25.html" title="Путешествие группы формант по голосовому тракту. Глава вторая." /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/12/blog-post_25.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIHQ3syfSp7ImA9WxVSEUk.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-05T14:18:52.595+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="g729" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>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="http://freehg.org/u/deepwalker/fs_g729/"&gt;тут&lt;/a&gt;. Тестируйте, правьте код. &lt;br /&gt;&lt;br /&gt;Обсуждение &lt;a href="http://groups.google.ru/group/freeswitch-ru"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Обновление: тестирование с моим Nokia E61 показало хорошие результаты и на декодировании.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-4673383042116320007?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/0N_XpjZB-G4" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=4673383042116320007" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4673383042116320007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4673383042116320007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/0N_XpjZB-G4/g729-freeswitch.html" title="G.729 для FreeSWITCH готов" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2009/01/g729-freeswitch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8HRnw9cSp7ImA9WxVTF0w.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-31T14:40:37.269+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="g729" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>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="http://freehg.org/u/deepwalker/fs_g729/"&gt;тут&lt;/a&gt;, если кто то захочет помочь - милости прощу, с радостью свалю задачу человеку, который хорошо понимает значение всех этих звездочек. Если кому то просто интересно получить рабочий кодек (не гарантирую, что стабильный) заглядывайте, смотрите на прогресс.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-8609972641384938847?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/lMCnNUzvkXw" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=8609972641384938847" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8609972641384938847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8609972641384938847?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/lMCnNUzvkXw/freeswitch-g729.html" title="FreeSWITCH, кодеки, g729" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/12/freeswitch-g729.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUINSX4_fCp7ImA9WxRaGU4.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-22T14:13:18.044+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Путешествие группы формант по голосовому тракту" /><title>Путешествие группы формант по голосовому тракту</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;Все что нужно, чтобы связаться посредством двух телефонов - двухжильный провод и питание постоянным током (батарейка "Крона", например). Эту нехитрую истину знают монтажники связи - десятилетия у каждого из представителей доблестной профессии в сумке болтается &lt;a href="http://izmer-ls.narod.ru/prozv.html"&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="http://ru.wikipedia.org/wiki/Импульсный_набор"&gt;серией импульсов&lt;/a&gt;, что в трубке слышалось как серия щелчков. Импульсный набор зародился во времена  &lt;a href="http://www.aboutphone.info/lib/oldbook/atsdsh.html"&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="http://ru.wikipedia.org/wiki/Теорема_Котельникова"&gt;теоремой Котельникова (Найквиста)&lt;/a&gt; для оцифровки сигнала требуется частота выборки в два раза большая частоты сигнала. В действительности, для передачи голоса, достаточно гораздо более узкой полосы - в телефонии принята полоса от 300 Гц до 3 кГц. То есть в этой полосе располагаются основные &lt;a href="http://en.wikipedia.org/wiki/Formant"&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="http://ru.wikipedia.org/wiki/Теорема_Котельникова"&gt;теорема Котельникова&lt;/a&gt;, а Монморенси совершил подвиг, зажав зубами кабель, и спас селекторное. В следующих сериях страшные истории про кодеки, SIP и SDP, а также продолжение серии о монтажнике Джордже.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Принимаются критические замечания, в том числе и в гугл-группе &lt;a href="http://groups.google.ru/group/freeswitch-ru"&gt;freeswitch-ru&lt;/a&gt;.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-4178532268189252304?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/mqQSaZ_-X4k" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=4178532268189252304" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4178532268189252304?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/4178532268189252304?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/mqQSaZ_-X4k/blog-post.html" title="Путешествие группы формант по голосовому тракту" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/12/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYGR3c5fCp7ImA9WxRaE08.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-15T12:22:06.924+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>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="http://wiki.freeswitch.org/wiki/Mod_fax"&gt;wiki&lt;/a&gt;:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;   &amp;lt;extension name="fax"&amp;gt;&lt;br /&gt;      &amp;lt;condition field="destination_number" expression="^fax$"&amp;gt;&lt;br /&gt;        &amp;lt;action application="answer" /&amp;gt;&lt;br /&gt;        &amp;lt;action application="playback" data="silence_stream://2000"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="rxfax" data="/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="hangup"/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;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="http://wiki.freeswitch.org/wiki/Misc._Dialplan_Tools_tone_detect"&gt;tone_detect&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;extension name="5555555"&amp;gt;&lt;br /&gt;      &amp;lt;condition field="destination_number" expression="^(5555555)$"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="tone_detect" data="fax 1100 r +5000 transfer fax XML default"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="answer"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="sleep" data="1000"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="ivr" data="main"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="hangup"/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;br /&gt;    &amp;lt;extension name="fax"&amp;gt;&lt;br /&gt;      &amp;lt;condition field="destination_number" expression="^fax$"&amp;gt;&lt;br /&gt;        &amp;lt;action application="answer" /&amp;gt;&lt;br /&gt;        &amp;lt;action application="playback" data="silence_stream://2000"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="rxfax" data="/usr/local/freeswitch/fax/${caller_id_number}-${strftime(%Y-%m-%d-%H-%M-%S)}.tiff"/&amp;gt;&lt;br /&gt;        &amp;lt;action application="hangup"/&amp;gt;&lt;br /&gt;      &amp;lt;/condition&amp;gt;&lt;br /&gt;    &amp;lt;/extension&amp;gt;&lt;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="true" - означает, что надо продолжить выполнение номерного плана после этого пункта --&amp;gt;&lt;br /&gt;    &amp;lt;extension name="fax_tone_detect_permanent" continue="true"&amp;gt;&lt;br /&gt;      &amp;lt;!-- ловим любые звонки, так как .* означает любое кол-во любых символов --&amp;gt;&lt;br /&gt;      &amp;lt;condition field="destination_number" expression="^.*$"/&amp;gt;&lt;br /&gt;        &amp;lt;!-- ставим обнаружение тона 1100 со стороны звонящего(r) бесконечное время(0)&lt;br /&gt;         В случае обнаружения тона передаем (transfer) на обработку в "default" номерной план&lt;br /&gt;         с номером "fax"--&amp;gt;&lt;br /&gt;        &amp;lt;action application="tone_detect" data="fax 1100 r 0 transfer fax XML default"/&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;Слабым местом пока остается поддержка кодеков. Все заинтересованные уже знакомы с патентной системой США - практически все дистрибутивы в нашей стране имеют "поддержку кодеков из коробки".&lt;br /&gt;G.729, G.723, AMR сейчас поддерживаются только в режиме без перекодирования. То есть использовать с этими кодеками голосовую почту, голосовые меню, запись разговоров затруднительно.&lt;br /&gt;&lt;br /&gt;Заколдованый круг - пока FreeSWITCH не поддерживает кодеки он не очень интересен у нас. А пока он не очень интересен - кодеки реализовывать некому.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-1968264555308874309?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/dWzqz0NlPM4" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=1968264555308874309" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/1968264555308874309?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/1968264555308874309?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/dWzqz0NlPM4/freeswitch.html" title="FreeSWITCH, факсы" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/12/freeswitch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHQ3cyfip7ImA9WxRUFE4.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-23T17:05:32.996+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Инфраструктура Kerberos" /><category scheme="http://www.blogger.com/atom/ns#" term="freeswitch" /><title>Google-группы по kerberos и Freeswitch</title><content type="html">Я создал две новых google-группы для обсуждения вопросов, связанных с kerberos и freeswitch. Просьба все свои вопросы задавать там - формат комментариев к блогу не очень хорошо подходит для подобных обсуждений.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://groups.google.ru/group/ru-kerberos?msg=new&amp;lnk=gcis&amp;hl=ru"&gt;ru-kerberos&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://groups.google.ru/group/freeswitch-ru?msg=new&amp;lnk=gcis&amp;hl=ru"&gt;freswitch-ru&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-8468586322803897633?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/N9Y47fArNZM" height="1" width="1"/&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.g?blogID=6888322710677399759&amp;postID=8468586322803897633" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8468586322803897633?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/8468586322803897633?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/N9Y47fArNZM/google-kerberos-freeswitch.html" title="Google-группы по kerberos и Freeswitch" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/11/google-kerberos-freeswitch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQERH84eyp7ImA9WxRVFUo.&quot;"><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><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T15:58:25.133+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="plasma" /><title>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="http://github.com/Deepwalker/plasma-mediacontroller/tree/master"&gt;тут&lt;/a&gt;. В первой записи о plasma-python есть инструкции по установке плазмоида.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-660282675278871884?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/lyaHHRvF_40" height="1" width="1"/&gt;</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.g?blogID=6888322710677399759&amp;postID=660282675278871884" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/660282675278871884?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/660282675278871884?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/lyaHHRvF_40/plasma-mediacontroller.html" title="plasma-mediacontroller" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/11/plasma-mediacontroller.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQNQnkzfCp7ImA9WxRVE0w.&quot;"><id>tag:blogger.com,1999:blog-6888322710677399759.post-7705525698184880424</id><published>2008-11-10T15:31:00.002+06:00</published><updated>2008-11-10T16:19:53.784+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-10T16:19:53.784+06:00</app:edited><title>8.10, dkms, nvidia, btrfs</title><content type="html">Итак, раз уж в рубунтнете поднялась мода описывать свой опыт по общению с разного вида "козлами" (у кого насколько переводческой фантазии хватит), присоединюсь к этому движению. Да, я тоже обновился до 8.10, чему очень рад. Собственно рад я в основном новой фишке - DKMS.&lt;br /&gt;&lt;br /&gt;Некоторое время у меня задурил драйвер Nvidia - я особо не разбирался конечно, и с налету решить не удалось - вместо модуля nvidia_new, который новой версии, грузился старый nvidia. В 8.10 эту часть работы с модулями заменили на DKMS.&lt;br /&gt;&lt;br /&gt;Итак, а что это? А это такая система автоматической сборки модуля под ваше ядро. Предположим поставили вы себе 2.6.28, а DKMS тут как тут - тут же соберет модуль и установит его под новое ядро. То есть думать о том, что вы там такого стороннего в ядро напихали, каждый раз совершенно не надо.&lt;br /&gt;&lt;br /&gt;И тут у нашего повествования этакий плавный переход. Связующее звено у двух повествований все тот же DKMS. Я экспериментировал с Btrfs, а так как это новая файловая система, планируемая (авторами, когда нибудь : )) ) к включению в ядро, и вообще чтобы корень на нее помещать, то представляет собой она собственно модуль ядра. А модулями ядра у нас теперь ведает - DKMS.&lt;br /&gt;&lt;br /&gt;Итак, чтобы вы тоже приобщились к 21 веку, и познали прелесть COW (copy-on-write) систем, дам вам указание верного пути, то есть dkms.conf.&lt;br /&gt;Стягиваем исходники модуля ядра и кладем их в /usr/src/btrfs-0.16 (ну вот такая вот у нас текущая версия). В том же каталоге создаем dkms.conf следующего содержания:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;MAKE[0]=make&lt;br /&gt;BUILT_MODULE_NAME[0]=btrfs&lt;br /&gt;DEST_MODULE_LOCATION[0]="/kernel/fs/btrfs"&lt;br /&gt;PACKAGE_NAME="btrfs"&lt;br /&gt;PACKAGE_VERSION="0.16"&lt;br /&gt;CLEAN="make clean"&lt;br /&gt;AUTOINSTALL="yes"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Далее следует серия команд для запуска модуля в работу:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;root:host~# dkms add -m btrfs -v 0.16&lt;br /&gt;root@rni-15:~# dkms add -m btrfs -v 0.16&lt;br /&gt;&lt;br /&gt;Creating symlink /var/lib/dkms/btrfs/0.16/source -&gt;&lt;br /&gt;                 /usr/src/btrfs-0.16&lt;br /&gt;&lt;br /&gt;DKMS: add Completed.&lt;br /&gt;root:host~#&lt;br /&gt;root:host~# dkms build -m btrfs -v 0.16&lt;br /&gt;&lt;br /&gt;Kernel preparation unnecessary for this kernel.  Skipping...&lt;br /&gt;&lt;br /&gt;Building module:&lt;br /&gt;cleaning build area....&lt;br /&gt;make KERNELRELEASE=2.6.27-7-generic............&lt;br /&gt;cleaning build area....&lt;br /&gt;&lt;br /&gt;DKMS: build Completed.&lt;br /&gt;&lt;br /&gt;root:host~# dkms install -m btrfs -v 0.16&lt;br /&gt;Running module version sanity check.&lt;br /&gt;&lt;br /&gt;btrfs.ko:&lt;br /&gt; - Original module&lt;br /&gt;   - No original module exists within this kernel&lt;br /&gt; - Installation&lt;br /&gt;   - Installing to /lib/modules/2.6.27-7-generic/updates/dkms/&lt;br /&gt;&lt;br /&gt;depmod........&lt;br /&gt;&lt;br /&gt;DKMS: install Completed.&lt;br /&gt;&lt;br /&gt;root:host~# modprobe btrfs&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Отлично, теперь скачайте утилиты для работы с btrfs и посмотрите, что вам может дать эта система. А может она вам дать снимки, тома, контрольную сумму всех блоков, raid различных уровней и многое другое. Работает гораздо живее zfs которая на fuse. Но не стоит пока размещать на ней /home or /.&lt;br /&gt;&lt;br /&gt;Кстати о снимках, если вы пересилите себя, и доберетесь до самого первого поста этого блога, то увидите там бесподобную идею поставить /etc/ под контроль версий. Идея умерла с того момента, как я познакомился с концепциями zfs и btrfs - это наше файловое будущее.&lt;br /&gt;&lt;br /&gt;Подробности, одни из, &lt;a href="http://xgu.ru/wiki/Btrfs"&gt;тут&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-7705525698184880424?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/FrSGeanVXGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://deepwalker.blogspot.com/feeds/7705525698184880424/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6888322710677399759&amp;postID=7705525698184880424" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/7705525698184880424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/7705525698184880424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/FrSGeanVXGk/810-dkms-nvidia-btrfs.html" title="8.10, dkms, nvidia, btrfs" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/11/810-dkms-nvidia-btrfs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQBRHo5eip7ImA9WxRVFUo.&quot;"><id>tag:blogger.com,1999:blog-6888322710677399759.post-3386934921890775812</id><published>2008-10-30T01:24:00.013+06:00</published><updated>2008-11-13T15:59:15.422+06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T15:59:15.422+06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="plasma" /><title>Мой первый плазмоид</title><content type="html">Я поклонник KDE и python. С удивлением я, как и многие другие, смотрел на KDE 4.0. После вылизанного 3.5 это было конечно страшно. Особенно мне не хватало kicker и его "кикоидов". Но время идет, проект продолжает развиваться невзирая на возню анонимов на веб просторах, и теперь наконец то есть привязки plasma для python, а значит теперь я сам себе автор плазмоидов.&lt;br /&gt;&lt;br /&gt;Мой первый плазмоид страшно кособок, но тем не менее показателен. Итак, по устоявшейся традиции среди Qt-шников, будем делать свой браузер. Правда этот, удивительный своей неординарностью, экземпляр, мы встроим прямо в рабочий стол.&lt;br /&gt;&lt;br /&gt;Этот код просто вставьте в командную строку, он создаст структуру каталогов, файлы, соберет пакет, и установит его для текущего пользователя.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkdir -p wwwv/contents/code&lt;br /&gt;cd wwwv&lt;br /&gt;cat &gt; metadata.desktop &lt;&lt; EOF&lt;br /&gt;[Desktop Entry]&lt;br /&gt;Encoding=UTF-8&lt;br /&gt;Name=WWW viewer&lt;br /&gt;Type=Service&lt;br /&gt;ServiceTypes=Plasma/Applet&lt;br /&gt;X-Plasma-API=python&lt;br /&gt;Icon=chronometer&lt;br /&gt;&lt;br /&gt;X-KDE-PluginInfo-Author=Mikhail Krivushin&lt;br /&gt;X-KDE-PluginInfo-Email=mkrivushin@yandex.ru&lt;br /&gt;X-KDE-PluginInfo-Name=plasma-wwwv&lt;br /&gt;X-KDE-PluginInfo-Version=1.0&lt;br /&gt;X-KDE-PluginInfo-Website=http://deepwalker.blogspot.com&lt;br /&gt;X-KDE-PluginInfo-Category=Tests&lt;br /&gt;X-KDE-PluginInfo-Depends=&lt;br /&gt;X-KDE-PluginInfo-License=GPL&lt;br /&gt;X-KDE-PluginInfo-EnabledByDefault=true&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;cat &gt; contents/code/main.py &lt;&lt; EOF&lt;br /&gt;#! /usr/bin/python                                                 &lt;br /&gt;&lt;br /&gt;from PyQt4.QtCore import *&lt;br /&gt;from PyQt4.QtGui import * &lt;br /&gt;from PyQt4 import QtWebKit&lt;br /&gt;from PyKDE4.kdecore import *&lt;br /&gt;from PyKDE4.kdeui import *  &lt;br /&gt;from PyKDE4.plasma import Plasma&lt;br /&gt;import plasma                   &lt;br /&gt;&lt;br /&gt;class PyWWWvApplet(plasma.Applet):&lt;br /&gt;    def __init__(self,parent,args=None):&lt;br /&gt;        plasma.Applet.__init__(self,parent)&lt;br /&gt;&lt;br /&gt;        self.url = None&lt;br /&gt;        self.clicked = QPoint()&lt;br /&gt;&lt;br /&gt;    def init(self):&lt;br /&gt;        KGlobal.locale().insertCatalog("www")&lt;br /&gt;&lt;br /&gt;        self.setHasConfigurationInterface(False)&lt;br /&gt;        self.setAspectRatioMode(Plasma.IgnoreAspectRatio)&lt;br /&gt;&lt;br /&gt;        self.dialog = None&lt;br /&gt;&lt;br /&gt;        self.theme = Plasma.Svg(self)&lt;br /&gt;        self.theme.setImagePath("widgets/background")&lt;br /&gt;        self.theme.setContainsMultipleImages(False)&lt;br /&gt;        self.theme.resize(self.size())&lt;br /&gt;&lt;br /&gt;        self.webview = Plasma.WebContent()&lt;br /&gt;        self.mlayout = QGraphicsLinearLayout(Qt.Vertical)&lt;br /&gt;        self.eline = Plasma.LineEdit()&lt;br /&gt;        self.mlayout.addItem(self.eline)&lt;br /&gt;        self.mlayout.addItem(self.webview)&lt;br /&gt;        self.setLayout(self.mlayout)&lt;br /&gt;&lt;br /&gt;        self.connect(self.eline,SIGNAL('returnPressed()'),self.open_page)&lt;br /&gt;&lt;br /&gt;        self.webview.setUrl(KUrl('http://127.0.0.1/'))&lt;br /&gt;        self.webview.update()&lt;br /&gt;&lt;br /&gt;    def open_page(self):&lt;br /&gt;        page = self.eline.text()&lt;br /&gt;        #print "Go to %s"%page&lt;br /&gt;        self.webview.setUrl(KUrl(page))&lt;br /&gt;        self.webview.update()&lt;br /&gt;&lt;br /&gt;    def shape(self):&lt;br /&gt;        if self.theme.hasElement("hint-square-clock"):&lt;br /&gt;            return plasma.Applet.shape(self)&lt;br /&gt;        path = QPainterPath()&lt;br /&gt;        path.addEllipse(self.boundingRect().adjusted(-2, -2, 2, 2))&lt;br /&gt;        return path&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    def constraintsEvent(self, constraints):&lt;br /&gt;        if constraints &amp; Plasma.SizeConstraint:&lt;br /&gt;            self.resize(self.size())&lt;br /&gt;&lt;br /&gt;def CreateApplet(parent):&lt;br /&gt;    return PyWWWvApplet(parent)&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;zip -r ../wwwv.zip .&lt;br /&gt;&lt;br /&gt;plasmapkg -i wwwv.zip&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Конечно же надо поставить соответствующие привязки. Так как я уже на 8.10, то просто сделал aptitude install python-plasma.&lt;br /&gt;&lt;br /&gt;Далее располагайте плазмоид на рабочем столе и удивляйтесь мощи моего гения. Теперь же я, пожалуй, отправлюсь спать. А вы, дорогие мои, утомляйте неутомимый google бесчисленными запросами - "plasma python qt webkit" в поисках ответа на вопрос - а как же сделать, чтобы оно использовало прокси?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6888322710677399759-3386934921890775812?l=deepwalker.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Deepwalker/~4/Q0z3nEaULT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://deepwalker.blogspot.com/feeds/3386934921890775812/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6888322710677399759&amp;postID=3386934921890775812" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/3386934921890775812?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6888322710677399759/posts/default/3386934921890775812?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Deepwalker/~3/Q0z3nEaULT4/blog-post.html" title="Мой первый плазмоид" /><author><name>Михаил Кривушин</name><uri>https://profiles.google.com/100921657259536473882</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-4502zEkouaI/AAAAAAAAAAI/AAAAAAAAAJg/8tL9ASztORA/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://deepwalker.blogspot.com/2008/10/blog-post.html</feedburner:origLink></entry></feed>

