Analitycs

пятница, 30 декабря 2011 г.

Samsung GT-C3322 Duos + Mac + Kies + долгая телефонная история в довесок

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

неБОЛЬШАЯ предыстория

Я никогда не пользовался iPhone в течении долгого времени.

Изначально - как большой любитель Palm, пользовался их КПКшниками и отдельно мобильниками, потом достаточно долго - PocketPC (простыми и с телефонными модулями). Когда я заинтересовался Маками - у меня вовсю работал Asus 750 - достаточно неплохой по тем временам агрегат, который меня вполне устраивал.


Через несколько лет он начал издыхать, но проблема в том, что моем мозгу стоит какая-то черта - телефон более чем за 700$ должен еще как минимум стирать носки, выводить гулять ребенка, раздавать торренты и делать еще много каких полезных вещей. Моя же зеленая пресноводная жаба не понимает, что в случае iPhone за 30к ты получаешь все тоже самое, что и за 10, просто чуть лучше. Причем именно покупки Маков у нее приступов не вызывают, а вот на телефоны она почему-то она начинает меня душить, причем сильно-сильно.

В итоге, после того как мой Asus издох - плюнув и матюгнувшись я пошел и спонтанно взял один из самых дешевых Samsung - GT-E1175T за (как сейчас помню - 1390 рублей). На удивление - телефон умел не только звонить, принимать SMS, хранить контакты и играть радио, но и оказался достаточно крепкой электронной штучкой. Причем он доказал это работоспособностью в условиях эксплуатации в чрезвычайно агрессивной среде - квартире с мелким (и очень непоседливым) ребенком. В итоге - его (телефон) неоднократно роняли, грызли, кидали и есть подозрение - даже играли им в футбол.


 Отдельной скупой мужской слезы удостоился пункт меню ИГРА. Вы просекли фишку? Не "Игры", не "программы" - а именно ИГРА. Вдобавок хочу добавить, что аккумулятор живет что-то около недели до сих пор - спустя уже больше полутора лет от начала работы.

Единственный критичный для меня минус - полное отсутствие синхронизации контактов

В итоге - не телефон, а просто мега-девайс за смешную цену. Причем им было очень хорошо троллить пытавшихся меня подколоть адроидоводов - у многих из них был разрыв шаблона при виде любителя Apple с ТАКИМ телефоном.

Нет, за это время, конечно же было желание обновиться - и я решил попробовать именно  iPhone.

С ним у меня отношения странные, совсем не как у Apple fanboy - я почему-то именно к нему сравнительно равнодушен, в отличие от iPad и Маков.

Но я честно предпринял попытку - мне привезли джейлбрекнутый американский аппарат, который проработал у меня примерно 2 часа - ровно столько нужно чтобы вставить симку, немного поиграться, сделать пару тестовых звонков и обновить прошивку через iTunes... ;-( А фигли - я же привык к iPad. Ну и в итоге, разумеется, я получил характерный кирпич с яблочком на спине.

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

В итоге его, конечно, потом оживили, но я понял, что мы с ним не сошлись характерами и  теперь с ним ходит моя вторая половинка.

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

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

Но тут, зайдя в питерский магазин я увидел вполне себе приличный телефончик от Samsung - GT-C3322 Duos, который еще и умел две симки одновременно и стоил порядка 3500р. Я возбудился - и подумал - "была не была" (с), возможно - это то что нужно. Взял не отходя от кассы, и вечером начал с ним разбираться.

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

Теперь, собственно - история

Прихожу домой, начинаю эксперименты - по Bluetooth только работа с файлам, синхрится не хочет. Хорошо, будем по официальному - скачиваю с официального сайта Samsung Kies, немного улыбаюсь - "iTunes - как ты изменилась" (с) и подрубаю телефон.

Поскрипев пару минут шайтан-программа заявила - "ваше устройство не поддерживается". Штирлиц удивился еще раз заглянул в меню телефона - "синхронизировать с Kies". Минутная пауза - еще попытка. Тоже самое - вид сбоку. У меня тихая паника - "не работает, хотя должно".

Хорошо, ищу альтернативы - качаю всяческие MissedSync, FoneSync, SyncMate и иже с ними. Ни один из них этот агрегат не видит. "Моя в панике" (с), в мозгу - "stack overflow"  - ибо написано русским по белому - "Синхрить с Kies", но - не работает.

Немного почитав и подумав - решил проверить на Windows. Раскопал на одном из внешних винтов виртуалку с Виндой, сдул с нее пыль и согнал тараканов, запускаю, ставлю Kies для Windows - телефон увиделся! Ок, ладно, начинаю перепрошить... не получается, вам не хватает 3000 Мб свободного места для обновления прошивки. Лааадно, даю образу жесткого диска побольше, перезапускаю - то же самое. То есть - обновить прошивку из виртуалки НЕЛЬЗЯ.

Ладно, проехали. Давайте займемся синхронизацией - ибо эта задача приоритетней. Правда на этой виртуалке кроме Webmoney и Kies нет больше практически больше ничего, так что всяких Outlook там отродясь не было.

Отлично, в Kies есть синхронизация с Google - логинюсь, но после 3 минут обработки - заявление - у вас дескать СЛИШКОМ МНОГО КОНТАКТОВ. В моем мозгу уже полный разрыв шаблона, но я нахожу альтернативный вариант - в Google Contacts я создаю группу людей с мобильными телефонами (поиск по  "+7 (9" )  и сохраняю ее в CSV файл.

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

Я от души выматерился и ушел спать. На все про все вчера было потрачено более 3 часов.

Итог

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

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

Итоги 2011 года

Этот год был примечателен тем, что впервые за много-много лет я устроил себе отдых - не работал и занимался преимущественно моделями почти 3 месяца. Никогда себе такого долгого отпуска не позволял, но накопилось...


Работу оставлю за кадром, кому нужно - те знают ;-)

По технологиям - занимался десктопными приложениями для MacOS на Python+Qt, написанием различных плагинов для хостинг-систем (типа ISPManager), распределенными системами для этого же хостинга, ну и самые разные веб-сервисы - эти как обычно.

Занялся этим блогом - потихоньку пишу/перевожу. Вроде  кто-то читает... и даже есть посетители из Мексики ;-)

Модельные итоги
Самолёты - 3 штуки
Еще Ил-10, отдельной статьей не выкладывал


ВИМ/солдатики - суммарно около 10 фигур, половина - заказные.

 


Аниме и фантастика - 13 штук. Тут многое сделано вместе с женой, - преимущественно -  все на заказ старым и новым клиентам-коллекционерам фигурок.






Сложно сказать, сколько именно моего - допустим 50% от гараж китов, мелкие - все мои целиком.

БТТ - 1 танчик


Ну и вышла еще одна книжка - но уже в соавторстве с коллегами.

Что потом? Как обычно - работать - кодить и пилить ;-)

вторник, 27 декабря 2011 г.

Twisted или Tornado - без разницы - все идиоты

Внимание - Важное сообщение для блоггеров-питонистов!


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

Похоже, что уже всем стало ясно что "матч века" - Twisted.web против Tornado от Friendfeed показал, что ни одна из сторон не особо победила, но и не особо проиграла - и в тоже время стопудово - что обе стороны выглядят достаточно глупо.


Во-первых, Twisted. Сейчас моя компания использует его за небольшую часть функциональности, потому что ТОГДА - это был самый простой способ, что мы нашли для отправки трафика через различные сетевые интерфейсы на Linux машинах. Мы никогда не имели с ним никаких проблем. Единственная причина, по которой мне необходимо его когда-нибудь тронуть - это чтобы увидеть, как что работает.

Тем не менее, Twisted, вероятно, самая запарная программная библиотека. Каждый раз, когда я открываю этот код, я чувствую, что я забрел в ночной бар на берегу Джерси, где все пьяные в хлам и уже давно сорвали свои рубашки. Twisted классная библиотека, но в тоже время - НЕДОСТАТОЧНО классная, чтобы действительно называться "Twisted". Это Python- программистская версия одежды и бейсболок Ed Hardy, которая все еще висит в стороне (модная вещь, которая не используется). Когда я копался в этом коде и мои коллеги спрашивают меня, что случилось, единственным адекватным ответом было я "НЕ СЕЙЧАС, шеф - я запускаю этот хренов реактор ".

Теперь вы можете понять, почему появилась и существует такая хрень, как Tornado.

Хотя я постоянно не рекомендую делать такие вещи как Tornado - Friendfeed все-таки ее сделали. Из тех графиков, которые я видел, Tornado просто незначительно быстрее, чем Twisted на обслуживании большого количества одновременных запросов. НЕЗНАЧИТЕЛЬНО. Очевидно, в Friendfeed полагали, что достаточно небольшая разница в скорости была достаточным основанием тратить свое время и что-то переписывать заново- что обычно и делает каждый разработчик, которому становится скучно на работе. Веб-фреймворк на Python? О боже - как это оригинально! Я думаю, что это один из последних уроков книжки "Изучи Python за 24 часа".

В Friendfeed потратили много времени, пытаясь оптимизировать количество запросов в секунду, отображаемого на графике, но, возможно, им следовало бы тратить больше времени на оптимизацию ВОТ ЭТОГО графика - вместо первого:

Во всяком случае, когда речь идет о выборе Twisted vs Торнадо для веб-фреймворка, я использую Django. Почему? Потому что это работает, и мое время ценно.

Достаточно вольный перевод вот этой заметки. Спасибо автору

Кстати, достаточно интересно пишет, хотя и многие слова приходится долго думать - перед тем как перевести на русский.

понедельник, 26 декабря 2011 г.

Как избавиться от залипающих клавиш в VmWare vSphere Console для Linux Guest?

Возможно, вам знакома эта проблема...

Вы залогинены в vSphere клиент, у вас открыта Linux консоль виртуалки и когда вы что-то печатаете в ней - вместо одного символа появляются несколько одинаковых. Если честно - безумно раздражает, особенно когда нужно что-то сделать БЫСТРО на удаленной машине.

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

Вот тут рецепт как это сделать, правя .vmx файл, но я предпочитаю делать это прямо в клиенте vSphere.
  • Входим в клиент и "застреливаем гостя" (с) ;-)  "Shut Down Guest" (прости, друг ;-) )
  • Клик на "Edit Settings"
  • Выбираем вкладку "Options"
  • В списке под "Advanced" выбираем "General"
  • Справа нажимаем кнопку "Configuration Parameters"
  • Клик на "Add Row"
  • Вписываем имя новой переменной "keyboard.typematicMinDelay" и значение "2000000"
  • Перезагружаем виртуалку

Теперь вы сможете Войти как "root", вместо "rrrroooooott". ;-)

Весьма вольный перевод вот этой заметки, спасибо автору.

воскресенье, 25 декабря 2011 г.

Как оптимизировать сервер? - реальные данные - теория без практики мертва

Это судьба - вслед за вчерашней заметкой про оптимизацию выделенного сервера на сайте были опубликованы весьма интересные материалы, которые привели к росту просмотров страниц на 54 тысячи - это составляет рост примерно 140%.

Итак, график LI

Скачок достаточно большой, но давайте посмотрим, как машина, настроенная по описанным ранее методикам с этим справилась - на графиках Munin еще видны вчерашние значения, так что можно сравнить с ними (хотя бы на глаз).


Трафик, прокачанный через firewall - разумеется, вырос, причем - значительно



Процессы и потоки - увеличились



MySQL немного изменился в пределах погрешности; коннекты - не изменились.





Memcache немного подрос, но незначительно


А самое главное - ЦПУ и Load Average практически не изменились

Вывод

nginx с кешом HTML страниц сильно спасает от резких скачков нагрузки от незарегестрированных пользователей.

Рискну предположить, что создатели многих супер-пупер-мега-стартапов, постоянно падающих от пресловутого великого и ужасного Хабраэффекта, об этом не знают ;-)

З.Ы. Люблю, когда теоретические выкладки подтверждаются практическими данными.


суббота, 24 декабря 2011 г.

Как настроить сервер? или оптимизация сайтов на PHP (Nginx, PHP, MySQL, Memcache)

Если вы владелец приличного сайта - то рано или поздно вам прийдется подкручивать свой выделенный(виртуальный) сервер, на котором разросшийся за несколько лет веб-проект начинает подтормаживать.

Если же вы еще и не профессиональный HighLoad Linux-админ, а, например, разработчик (как я), то в процессе настройки прийдется ловить много-много граблей...  ;-)

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

Ниже рассматривается достаточно часто встречаемая комбинация для сайтов: nginx + php (nginx+apache c php немного отличается - вместо fastcgi_xxx будет proxy_xxx).

Да, и считаем, что сейчас все компоненты вашей системы (nginx, php, mysql, memcache) крутятся на одной машине - как оно обычно и бывает на частных ресурсах.

PHP


  • Пускаем как fastcgi через сокет
  • Pconnect к базе - спорно
  • Не забываем акселератор (моя юзает eAccelerator) - хотя тоже есть спорные моменты

eAccelerator


Только для production машин можно отключить проверку Modified time - это абсолютно не подходит, если на сервере идет отладка скриптов - иначе будете ловить постоянные глюки и проблемы - включать только после того как сайт стал стабилен.

eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="0"
eaccelerator.shm_only="1"

Временые диски

tmpfs для /tmp и сессий PHP - все это сносится в память, если ее достаточно. В /etc/fstab добавляем

tmpfs                   /tmp                    tmpfs   defaults        0 0
tmpfs /var/lib/php tmpfs size=200M,nr_inodes=1m,nosuid 0 0

MySQL

  • Проверяем, включен ли query кэш
  • Также используем сокет
  • Если в вашей CMS используется таблица сессий - ставим для них тип MEMORY (если нет текстовых полей) - это приведет к сбросу всех залогиненных пользователей при перезагрузке сервера, но добавит немного скорости. Ну или если это неприемлемо - то надеюсь, она уже переведена в InnoDB? ;-)
  • Определяем оптимальное количество коннектов - статистика хотя бы за месяц (я юзаю munin). Ставим в 1.5-2 раза больше среднего.
Более подробно про оптимизацию MySQL можно прочитать тут.

Memcache

Если вся солянка крутится на одной машине - то также используем коннект через сокеты (по умолчанию не используется - стоит ip адрес). В таком варианте работы memcache возможны проблемы с некоторыми средствами мониторинга memcache (которые работают также по IP).

Не забываем в PHP использовать сжатие при работе с MEMCACHE.

Nginx

Ограничиваем число коннектов и запросов, особенно на ресурсоемкие скрипты
http {
...
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    limit_zone three $binary_remote_addr 10m;

Включаем кэширование для неавторизованных гостей

http {
...
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=wholepage:50m inactive=15d max_size=5000m;
        location ~ .*\.php$ {
            limit_conn three 20;
            include         /etc/nginx/fastcgi.conf;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
            #access_log  /var/log/nginx/domain.access.log  my_combined;
            fastcgi_cache wholepage_guest;
            fastcgi_cache_valid 301 302 304 10m;
            fastcgi_cache_valid 200 360m;
            fastcgi_cache_valid 404 5s;
            fastcgi_cache_key "$request_method|$host|$request_uri";
            fastcgi_pass_header "Set-Cookie";
            fastcgi_ignore_headers "Cache-Control" "Expires";
            fastcgi_cache_bypass $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
            fastcgi_no_cache $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
    }
Где phpbb_session - имя куки по которой идет авторизация

Все запросы с ?nocache=1 и PHPSESSID попадают на PHP-бэкенд сразу без кэша не забываем открыть скрипт, по которому идет авторизация (в том числе и всякие капчи - их можно переписать на ?nocache=1) - тут возможно прийдется немного поковыряться и в коде CMS тоже.

        location /register.php {
                limit_conn three 20;
                include         /etc/nginx/fastcgi.conf;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
        }

Nginx - общие рекомендации

Очень нежелательно использовать location с регекспами - только простые префиксы вида
location /mymodule {}
Если от регекспов никак не избавится - то лучше их обрамлять простым location (Причина - сложноуловимые перехлесты в логике парсинга URL - кто за кем будет следовать)
location /mymodule {
  location ~ \/mymodule\/(.*)\.php$ {
    чего-то
  }

}

Отрубаем access лог для картинок

Разумеется - это только основные моменты оптимизации, на самом деле их гораздо больше. А какие трюки для уменьшения нагрузки на сервер знаете вы? Пишите в комментах.

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

Как удалить MacPorts?

Недавно при миграции на новый макбук я допустил стратегическую ошибку - полностью восстановился из архива TimeMachine и наступил на грабли - старый-то ноут был 32-битный, а новый - уже 64 бита.

После 2 дней попыток обойти все баги перекомпиляции MacPort, решил их снести к чертовой матери и попробовать собрать все начисто.

Итак, как удалить MacPorts?


# port -f uninstall installed

После чего ставлю/собираю заново то, что нужно - пока "коробочка жужжит" (с) ;-)

Если же нужно вычистить всю жизнедеятельность MacPorts из системы, то


$ sudo rm -rf /opt/local \
    /Applications/DarwinPorts  /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 /Library/Tcl/macports1.0 \
    ~/.macports

Да, если у вас вторая версия - то удаляемые каталоги, разумеется, меняются на те, что у вас. 

Найдено тут, HomeBrew ставить не собираюсь. ПОКА не собираюсь, во всяком случае.

среда, 21 декабря 2011 г.

Как сохранить/восстановить настройки-сайты/Sites в Panic Coda под MacOS?

Вот всем хороша Coda, но при восстановлении данных из бекапа или переносе профиля на другую машину - часто теряются настройки проектов - Sites. А если их много... и там прошита куча паролей... то жить честному разработчику становиться совсем грустно;-(

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

~/Library/Preferences/com.panic.Coda.plist

Где ~/ ваш домашний каталог.

P.S. И да, принимаю поздравления с долгожданным новым Pro 13' (MD314RS/A). Теперь Aperture ведет себя вполне прилично - и даже матрица нормальная, без цветовых искажений ;-) ;-)

/me почти счастлив ;-)




воскресенье, 18 декабря 2011 г.

Skyrim: The Dragonborn Comes - Female Cover by Malukah

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



Our Hero, our Hero, claims a warrior's heart
I tell you, I tell you, the Dragonborn comes
With a Voice wielding power of the ancient Nord art
Believe, believe, the Dragonborn comes

It's an end to the evil of all Skyrim's foes
Beware, beware, the Dragonborn comes
For the darkness has passed and the legend yet grows
You'll know, you'll know, the Dragonborn comes

Dovahkiin, Dovahkiin
Naal ok zin los vahriin
Wah dein vokul mahfaeraak ahst vaal
Ahrk fin norok paal graan
Fod nust hon zindro zaan
Dovahkiin, fah hin kogaan mu draal

пятница, 16 декабря 2011 г.

Волшебный пендель

Решил ввязаться в небольшую сетевую авантюру - поучаствовать в блогоконкурсе "Волшебный пендель", но как известный скептик и циник - ничего хорошего от этого не жду ;-)

Цели блога на ближайший год

  • не потерять интерес и возможность вести блог;
  • писать в месяц по два более-менее приличных поста и несколько технических заметок;

Целевая аудитория блога

  • разработчики и админы, которым могут быть полезны те задачи, которые я решаю; 
  • люди, уставшие от копи-пасты в блогах;
  • мои знакомые и друзья;

Выполнение условий конкурса

Я участник самого полезного конкурса от Сергея Первушина "Волшебный Пендель для вашего блога"!. Благодаря этому конкурсу я могу стать успешным и известным блоггером. А еще я могу выиграть ценные призы:
1. 3 000 рублей и книга, единственная официальная биография Стива Джобса – “Стив Джобс. Биография“.
2. 2 000 рублей и книга, которая перевернет представления о бизнесе – “Rework. Бизнес без предрассудков“.
3. 1 000 рублей и книга, которая поможет вам потрясти воображение людей – “WOW-факторы. Пора потрясти воображение людей!“.
+ все победители получат "свежий" видеокурс от Александра Борисова "Как стать блоггером тысячником".

Определять победителей будет экспертное, независимое жюри:
1. Михаил Шакин (shakin.ru).
2. Дмитрий Голополосов (blog.dimok.ru).
3. Александр Борисов (isif-life.ru).

Ты тоже можешь принять участие в этом конкурсе. Узнай легко выполнимые условия и стань по-настоящему упешным блоггером.

Скептические комментарии

>Я участник самого полезного конкурса

Сильно сомневаюсь в его полезности, но посмотрим...

>Благодаря этому конкурсу я могу стать успешным и известным блоггером.

Не уверен, что именно об этом я мечтал всю свою жизнь ;-)

>А еще я могу выиграть ценные призы:

Вот воистину - "nobody cares" (с). Призы как таковые - неинтересны, интересен - процесс и полученный результат эксперимента.

>Михаил Шакин (shakin.ru)

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

>Дмитрий Голополосов (blog.dimok.ru).

Уважаю как человека, успешно ведущего бизнес в Интеренете, но вот блог - увы - стал абсолютно неинтересен. Давно отписался. 

>Александр Борисов (isif-life.ru).

Первый раз слышу, блог сейчас читаю - пока с отношением к автору не определился.

>все победители получат "свежий" видеокурс от Александра Борисова "Как стать блоггером тысячником".

Почему "свежий" написано в кавычках?  Не самый лучший способ анонса своего продукта - подобное написание эпитета вопринимается как сарказм.

Ладно, посмотрим что из этого получится...

пятница, 9 декабря 2011 г.

HeadHunt: нужны Highload Python, AppManager и тестеры

Мы ищем несколько человек - специалистов по highload Python, один application manager и хороших тестировщиков в СПб.

"Мы" - это ООО «Стрим», дочерняя компания ОАО «МТС»

Разработчик платформенных решений ( Python, Highload)

Обязанности:

  • разработка и дальнейшее сопровождение серверной части медийных сервисов для проекта Омлет.ру (в первую очередь сервиса управления и распространения легального видео-контента);
  • консультирование по вопросам высоконагруженных систем.
Требования:
  • опыт разработки на Python от 2 лет;
  • хорошее знание SQL, опыт работы, а так же оптимизации и тюнинга СУБД PostgreSQL или MySQL;
  • опыт работы с no-SQL решениями,  в проектах по запуску высоконагруженных веб-сервисов (от 500 тыс показов в сутки);
  • аналитический склад ума, коммуникабельность, знание основ ООП, хорошая математическая база;
  • дополнительными плюсами являются: знание и опыт применения различных языков программирования, новейших технологий, самообучение и саморазвитие, английский язык, опыт создания несложных UI
Если будет практический опыт Tornado/Twisted - вам большой такой плюс.

Специалист по передаче в эксплуатацию (application manager)

позиция подразумевает деятельность на стыке разработка ПО – эксплуатация, т.е. задачи связанные с передачей в эксплуатацию после разработки и тестирования. Подразумевает навыки системного администрирования, навыки написания документации, разумную дотошность.

Задачи:
  • написание скриптов деплоя приложений или настройка специализированной среды развертывания приложений;
  • приемка серверных приложений после тестирования;
  • передача приложения в эксплуатацию;
  • валидация документации по установке приложений;
  • написание документации по эксплуатации;
  • анализ поведения приложений при эксплуатации, выявление сложностей эксплуатации приложений; 
Требования к кандидату:
  • владение linux на уровне базового администрирования;
  • владение windows на уровне продвинутого пользователя;
  • опыт написания скриптов на shell;
  • знание одного из языков: php, ruby, python;
  • опыт написания документации;
  • аналитический склад ума;

Специалист по тестированию

Обязанности:
  • тестирование серверных компонент видео-сервиса и всего сервиса в целом, в том числе - автоматизация тестирования и нагрузочное тестирование
Требования:
  • образование в сфере ИТ, желательно понимание основ программирования;
  • опыт функционального и нагрузочного тестирования от 2 лет;
  • хорошее знание SQL;
  • опыт работы в проектах по запуску высоконагруженных веб-сервисов (от 500 тыс. показов в сутки);
  • аналитический склад ума, коммуникабельность, знание основ ООП;
  • владение инструментами JMeter или аналогичными;
  • дополнительными плюсами являются: знание и опыт применения различных языков программирования, знание английского языка.
Условия для всех вакансий:
  • вся белая ЗП, оформление по ТК;
  • ненормированный рабочий день;
  • 31 день оплачиваемого отпуска;
  • испытательный срок 3 мес.
  • ДМС после прохождения испытательного срока;
  • корпоративная мобильная связь;
  • квартальные и годовые бонусы;

Если ваше резюме удовлетворяет требованиям на 3/4 - смело шлите его на michael(dot)neradkov(dog)gmail(dot)com. 

Буду признателен, если поделитесь информацией со своими знакомыми.

Заранее спасибо!



четверг, 8 декабря 2011 г.

Итоги 2.5 месяцев отдыха...

В сентябре я понял, что уже года 4 практически не отдыхал - и устроил себе 2.5 месяца отдыха от работы.

Итоги этого мероприятия - ниже
  • 4 заказных гараж кита
     
  •  2 самолета, один - из них заказной
     
  • Значительное количество доработок на сайте,
  • Два проекта на подработке - увы, никуда от них не получилось деться ;-)
А теперь - снова работать.

суббота, 3 декабря 2011 г.

Как сделать sharding картинок в PHP между несколькими серверами?

Сегодня небольшой хак - боюсь, что скоро их будет тут больше, чем методически грамотных решений. ;-(

Когда вам нужно разшардить картинки/статические ресурсы по разным поддоменам для ускорения загрузки - можно использовать очень-очень грязный хак.

Дано

4 поддомена:
  • http://st1.xxx.ru
  • http://st2.xxx.ru
  • http://st3.xxx.ru
  • http://s4.xxx.ru
По ним и нужно раскидывать превьюшки - особенно это актуально, когда их много на страницах.

Функция получения url для превьюшки картинки после небольшой доработки выглядит так

 public function thumb_url($file = false) {
  $path = $this->path_by_file($file);
  $url = CMS_URL.'/'.$path.'/thumbs/'.$file;
  
  $key = md5($url) & 3;
  
  $static_url = 'http://st'.($key+1).'.xxx.ru/'.$path.'/thumbs/'.$file;
  
  return $static_url;
 }

Чем плох этот вариант?

В случае если добавится еще сервер, то из-за изменения функции распределения - пропадут все кеши у пользователей - и все картинки будет грузиться заново. Неприятно, но несмертельно.

А вот если так делать под большой нагрузкой для ключей сложных данных (которые рассчитываются сложно) - будет совсем плохо-плохо - полный пересчет кеша.

Короче - не делайте так.

А как правильно?

А как в том случае сделать подобное распределение методически грамотно  - это тема для отдельного поста. Может  быть и напишу, но позже.

Секс в Skyrim: поисковики веселят

"Читал перед сном статистику посещений блога, долго думал" (с)

Ключевые слова для поиска

  • cannot use object of type example as array
  • fatal error: cannot use object of type stdclass as array
  • innodb_file_per_table что это
  • innodb_table_per_file
  • macos 10.6.8 зимнее время
  • rake time:zones moscow time zone 2011
  • как исправить время в snow leopard
  • посмотреть соедтнения netstat
  • распространение app с dylib
  • секс в skyrim
Сильно задумался... ;-)



вторник, 29 ноября 2011 г.

Как включить показ ошибок PHP в браузере?

Классический вопрос всех похапешников - "как показать ошибки PHP скрипта в окне браузера"

error_reporting(E_ALL);
ini_set("display_errors", 1);

P.S. Причем сам постоянно забываю, как точно пишется эта конструкция - особенно после переключения с языка на язык. Ненавижу переключать контекст мозга ;-)

четверг, 24 ноября 2011 г.

Почему не любят SEOшников?

Дело было вечером, делать было нечего, читал Reeder и наткнулся там на одну якобы аналитическую статью какого-то мегасеошника - прочитал,  разозлился и решил выплеснуть сюда немного негатива.

Как и везде - люди бывают разные, но похоже, что ни одна профессия не вызывает такой нелюбви, как SEOшники.

Не спорю - люди разные бывают, есть и весьма достойные представители у этого занятия, но  всем известно, что лучше всего запоминаются - именно худшие представители.

Причин подобной нелюбви много, перечислю основные.

1) Маленький возраст бОльшей части сеошников

Когда 14 летний парень начинает строить из себя специалиста по SEO, SMM и контекстной рекламе, имея за душой один мелкий бложик и 20 фидов в ГуглоРидере как источник знаний - это еще ладно, допустим.

Но ведь это только начало, "возраст - это единственный недостаток, который проходит сам по себе - со временем" (с)

Дальше начинается - хуже.

2) Неумение писать и нежелание это делать

Знаете, что я больше всего ненавижу в сети? Копи-паст и рерайт, в который воткнуты реферральные ссылки. Если тебе нечего сказать/написать - так может - не стоит и браться?

Что, денег захотелось? Ну так иди работай - пиши, рисуй, код лабай, точи на заводе что-нибудь, переводи что-нибудь на худой конец - но не засирай интернет копи-пастой, пожалуйста.

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

Да и своего времени хотя бы пожалей - уж если чужого не жалко.

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

3) Вопиющий непрофессионализм/профанация

Чем больше человек знает, тем меньше в нем уверенности, что он знает много. Обратное - верно Как не почитаешь очередного мегасеошника - знает все обо всем, правда - преимущественно по другим блогам ;-)

4) ТИЦедрочерство

Простите мой французский, это вообще смешно. Будете писать интересно - будут ссылки, будет трафик, будет ТИЦ.

5) Нарушения причинно-следственной связи - ярко выраженный "культ карго"

Когда я смотрю якобы аналитическую статью, в которой человек пишет про исследования CTR объявлений Яндекс-Директа, основываясь на данных порядка 600 показов до изменения и потом 600 показов после...  вот именно тут хочется биться головой о стену...

Потому что финальный вывод  - "вот CTR подрос, значит мое предположение верно - все делайте как я"... Неверен в принципе!

Мальчики и девочки!

На статистических данных меньше 100 000 показов любые псевдоаналитические построения - пустая трата времени. Туева хуча случайных и неучтенных вами факторов полностью уничтожают всякую логическую конструкцию - там могло произойти все что угодно

Вот, например:
 * в прошлый раз пришло 3 человека с английских IP, которые вообще ни фига не понимают по-русски - зачем им кликать?
* и вообще - таки показалась ли подобным людям реклама?
* время в которое смотрели? Из дома или с работы? Параметры поведения - разные
* с каких устройств ходили люди?
* что это были за люди? Гики рекламу почти игнорируют, в отличии от простых людей...

И так далее - продолжать набор таких факторов можно почти до бесконечности.

Вы все это учли? - Нет? Ну так значит грош цена вашим подобным исследованиям.

Единственная возможность как-то нивелировать подобные нюансы - брать длительные промежутки времени и большое количество показов. Ну не 600 же штук!!!

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

Тут нужно смотреть не пиковое значение величины сразу после изменения - а последующую за ним плавную кривую - на протяжении хотя бы месяца при учете набора достаточного количества показов.

Уф, "доклад окончен" (с) - сегодня что-то прорвало.



Как сделать автодополнение git в MacOS X?

При установке git возникает ошибка и автодополнение не работает

-bash: __git_ps1: command not found

Лечение (работаю со SnowLeopard)

Ставим MacPorts из .dmg, затем в консоли

$ sudo port selfupdate
$ sudo port install git-core +bash_completion

Если нужна дополнительная работа с SVN и docs, вторую строчку заменяем на:


$ sudo port install git-core +bash_completion +doc +svn

Затем добавляем в ваш ~/.profile или ~/.bash_profile:

# MacPorts Bash shell command completion
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

среда, 23 ноября 2011 г.

Как распаковать содержимое rpm-пакета?

Довелось недавно устанавливать дополнительный софт на одну виртуалку со сломанным дистрибутивом. Предыдущий админ воткнул посторонние пакеты, переломав зависимости. Так как надо было поставить обычную софтинку на PHP - решил просто расковырять RPM пакет.

Обычный rpm-пакет - это архив формата cpio вместе с некоторым набором метаданных.

Распаковать его можно

# rpm2cpio package.rpm | cpio -dimv

Параметры и флаги



  • имя rpm-файла, который необходимо распаковать и перенаправить вывод на архиватор cpio.
  • -i - распаковать архив,
  • -d - сохранить структуру директорий.
  • -v - вывести список распакованных файлов,
  • -m - наследовать даты модификаций извлекаемых файлов.
  • PHP - хак быстрого логгирования в файл


    Если вам в зубы выдали какой-то очередной супер-мега-пупер проект на PHP, в дебрях которого нет возможности и желания разбираться, однако нужно что-то быстро пофиксить с отладкой, (причем доступа к php error_log нету) - то можно быстро воткнуть небольшой полезный хак.

    Это дополнительный метод в класс (или просто - функция) с минимальным количеством кода.

       function log($msg) {
           file_put_contents(SUPER_CMS_ROOT_PATH.'/cache/php-debug.log',"\n".$msg, FILE_APPEND);
       }
    

    Соотвественно, после отладки ее можно либо убить, либо оставить, закомментировав содержимое.

    P.S. И да -про некошерность данного метода и недопустимости этого при учете всех методик программирования - я в курсе, не нужно возбуждаться. ;-)
    Просто нужно пофиксить и отладить - БЫСТРО.

    воскресенье, 20 ноября 2011 г.

    Как на python проверить, открыт ли какой-то port?


    from socket import socket, gethostbyname, AF_INET, SOCK_STREAM
    
    target = "localhost"
    targetIP = gethostbyname(target)
    port = 80
    s = socket(AF_INET, SOCK_STREAM)
    
    result = s.connect_ex((targetIP, port))
    
    if(result == 0) :
     print 'Port %d is open' % (port,)
    s.close()
    

    суббота, 19 ноября 2011 г.

    Как запустить приложение MacOS X из terminal.app с передаваемым файлом?

    Когда работаешь в консоли - иногда лень тянуться к мышке, а запустить какой-то сложный редактор нужно. Тогда используется полезная программа open

    $ open -a TextMate ./README

    Ненавидишь соседей?

    "Хочешь я убью соседей, что мешают спать?" (c)

    Простенько, функциональненько, иногда может пригодится ;-)

    Различные комбинации - в стиле Ссора+Секс, Ребенок с барабаном+Новорожденный заставляют задуматься ;-)

    Ну и колоночки с усилителем нужны помощнее ;-)

    Короче, вам сюда - FanSwitcher

    пятница, 18 ноября 2011 г.

    Skyrim vs Fallout

    Приехал Skyrim... Xbox, бедняга, будет теперь работать на износ - двое игроков в одной квартире не дадут бедной железке отдохнуть.

    Воспитательница в детском саду уже спросила - "что за странную группу вы слушаете? Ребенок напевает какую-то новую музыку и размахивает дрыном" ;-) ;-)

    Ну а в целом - весьма нравится. Расписывать не буду - и так везде на каждом сайте описания валяются.

    Правда, можно  продолжить старую цитату с башорга - если раньше "запускаешь Fallout 3 - а там Oblivion" (с), то теперь - запустил Skyrim - а там... Fallout New Vegas ;-)

    понедельник, 14 ноября 2011 г.

    Как реализовать периодические задачи в Twisted? (cron vs LoopingCall)

    Первое что делают все программисты на Twisted, чтобы сделать периодические задачи - это лезут в cron. Я сам так раньше делал - и, к сожалению, не было никого рядом, чтобы стукнуть меня бамбуковой палкой по рукам.

    Есть же методически грамотное, ВСТРОЕННОЕ решение - и нашел я его сегодня случайно, когда искал совершенно другую вещь.

    from twisted.internet.task import LoopingCall
    
    #==============================================================================
    class MySuperServer(MyServer, twisted.web.server.Site):
        '''
        мой собственный веб-сервер, с блекджеком и шлюхами ;-)
        '''
    
        def __init__(self):
            lp = LoopingCall(self.checkStatus)
            lp.start(1.0) # период в секундах    
    
        def checkStatus(self):
            #self._log('Looping call')
            pass
    

    пятница, 11 ноября 2011 г.

    Chef creating new cookbook - rake aborted! Don't know how to build task

    При попытке создания нового cookbook для Chef по некоторым мануалам вываливается ошибка

    # rake new_cookbook COOKBOOK=xxx CB_PREFIX=site-
    rake aborted!
    Don't know how to build task 'new_cookbook'
    

    Причина - прямое использование rake тут было deprecated, потом вообще убрали. Теперь труЪ-путь для подобных операций - только использование knife, командной утилиты Chef.

    
    
    # knife cookbook create xxx
    

    Вот не люблю ruby за это очень сильно - ведь был же суслик... а теперь его нету. ;-(

    четверг, 10 ноября 2011 г.

    Синхронизация времени на CentOS/Fedora

    Как поправить разошедшееся время на CentOS/Fedora

    $ sudo yum update tzdata -y
    

    Проверить/выставить

    $ cat /etc/sysconfig/clock 
    ZONE="Europe/Moscow" 

    И под конец запустить

    $ sudo chkconfig --level 345 ntpd on && sudo service ntpd start
    

    Подрезано тут (спасибо sanjek65)

    среда, 9 ноября 2011 г.

    PHP header("HTTP/1.0 404 Not Found") показывает пустую страницу

    При отправке из PHP скрипта HTTP ошибки 404 - показывается белая страница, хотя в настройках вашего веб сервера явно задана собственная красивая страничка для этой ошибки.

    Как лечить?

    Просто считать содержимое файла с красивой 404 ошибкой и вывести его HTML в поток - примерно так
    if ($is404) {
     $html = file_get_contents(YOUR_ROOT_PATH.'/404.htm');
     header("HTTP/1.0 404 Not Found");
     echo $html;
     exit();
    }
    
    

    четверг, 3 ноября 2011 г.

    Python, Twisted, logging - Как логгировать несколько процессов/демонов в один файл?

    Давайте поговорим немного про логгирование в Python.

    Да, меня это ДЕЙСТВИТЕЛЬНО беспокоит, и я хочу об этом поговорить ;-)

    Совсем недавно столкнулся с тем, что достаточно серьезный проект при портировании с Linux на MacOS потерял логгирование. Ну нет лог файла - и все тут. Полез в код разбираться - выяснилось, что разработчики очень любили изобретать велосипеды и делали логгирование через файл, открытый ручками и обычную запись туда переменных - прямо в файл. Все это работало... до поры до времени. Пришлось на скору руку переписывать.

    В общем, мораль сей басни такова...

    Есть в Python СТАНДАРТНЫЙ модуль logging  - его и нужно использовать для разного типа логгирования. Батарейка-то уже включена ;-)

    Чтобы пример кода не был совсем тривиальным - приведу решение для той ситуации, когда у нас есть несколько многопроцессных РАЗНЫХ демонов на Twisted на одной машине, а еще и cron-скрипт запускается время от времени. И всю жизнедеятельность этого дурдома нужно логгировать в один файл

    import os
    import logging
    from twisted.python import log                                                                                   
    
    CURRENT_PATH = os.path.realpath(os.path.dirname(__file__))
    
    # Все это "по уму" обычно запихивается в нормальный конфиг-файл
    LOG_DIR = os.path.join(CURRENT_PATH, 'logs')                            
    LOG_FILE = os.path.join(LOG_DIR, 'super-puper.log')  
    LOG_LEVEL = logging.INFO
     
    # инициализируем
    FORMAT = ('%(asctime)-15s %(levelname)s %(message)s') 
    
    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR) 
     
    logging.basicConfig(format=FORMAT, filename=LOG_FILE, handler=logging.handlers.RotatingFileHandler)   
    observer = log.PythonLoggingObserver(loggerName='twisted')
    observer.start()
    observer.logger.setLevel(LOG_LEVEL)  
    
    # класс-примесь для логгирования - в принципе - необязательно, реализация может быть разная - хоть функциями
    class BasicLogClass():
    
        def _log(self, msg):
            log.msg(msg, logLevel=logging.INFO)
    
        def _error(self, msg):
            log.msg(msg, logLevel=logging.ERROR)
    
        def _warning(self, msg):
            log.msg(msg, logLevel=logging.WARNING)
    

    В данном варианте работоспособность не проверял, но логика применения именно такая - выкусил из работающего проекта.

    Кстати, если у кроновских скриптов нет использования twisted'овского reactor, то могуть быть проблемы, нужно подумать. Как вариант - использовать развилку в инициализации и логгировании без применения observer, но не уверен.

    вторник, 1 ноября 2011 г.

    Как исправить переход на зимнее время в MacOS X Snow Leopard 10.6.8?

    Проблема 2011 года подкралась незаметно - новые машины с Lion не пострадали, а вот Snow Leopard честно перевел часы, не зная о новом приказе президента РФ.

    Варианта решения два

    1) Поставить другой TimeZone в настройках

    2) Отхачить по аргентинскому рецепту (первый хак для консоли, второй для GUI)

    mkdir temp
    cd temp
    curl -O http://www.iana.org/time-zones/repository/releases/tzdata2011m.tar.gz
    tar zxvf tzdata2011m.tar.gz
    sudo zic europe
    
    curl -O http://www.opensource.apple.com/tarballs/ICU/ICU-400.42.tar.gz
    tar zxvf ICU-400.42.tar.gz
    cp tzdata2011m.tar.gz ICU-400.42/icuSources/tools/tzcode/
    cd ICU-400.42/icuSources
    ./runConfigureICU MacOSX --with-data-packaging=archive
    gnumake
    sudo install -o root -g wheel -m 0644 -Sp data/out/icudt40l.dat /usr/share/icu/icudt40l.dat
    cd ../../..
    rm -rf temp
    
    
    Источник 

    понедельник, 31 октября 2011 г.

    Денежные переводы с сайта Билайн.Деньги в страны ближнего зарубежья

    А ребята из RURU времени не теряют ;-)

    Билайн и универсальная платежная система RURU реализовали на сайте «Билайн.Деньги» сервис безадресных денежных переводов в страны ближнего зарубежья: Украина, Таджикистан, Армения, Грузия, Молдавия, Киргизия. В планах партнеров расширение географии переводов. Ранее абоненты «Билайн» могли совершать денежные переводы UNISTREAM (ЮНИСТРИМ) в страны СНГ, используя средства мобильного счета абонентов «Билайн», на сайте ruru.ru или при помощи SMS запроса на единый сервисный номер 7878. Также переводы были доступны через мобильное приложение «Платежный мир RURU» для смартфонов на базе Android и iOS. Теперь абоненты «Билайн» могут воспользоваться этой услугой на сайте «Билайн.Деньги» - money.beeline.ru.

    Источник

    Как переименовать home directory в MacOS?

    Так как я свою текущую систему не очень грамотно восстанавливал из бекапа с TimeCapsule,  то у меня в имени пользователя появился пробел (/Users/michael_xiiii\ 1), в связи с чем я постоянно и ловил проблемы на различных компиляциях. Под конец меня это достало, и я решился мигрировать. Разумеется - перед миграцией необходимо тщательно забекапится.

    Теперь - пошаговая инструкция, как переименовать папку пользователя в MacOS.

    1. Включить  root пользователя в MacOS (Надеюсь, что все в курсе - как это сделать?). 
    2. Войти как root. 
    3. Перейти в папку /Users. 
    4. Выберать главную папку с коротким именем, которую вы хотите изменить, и переименовать ее - как необходимо. Имейте в виду, что короткое имя должно быть все в нижнем регистре, без пробелов и содержать только латинские буквы. (прим. нижнее подчеркивание и цифры вроде тоже без особых проблем) 
    5. Использовать Пользователи и группы (Accounts в Mac OS X v10.6.8 или более ранней) в Системных настройках, чтобы создать нового пользователя с именем учетной записи или ником, которое использовалось в предыдущем шаге. 
    6. Нажмите OK, когда появится сообщение что "Такая папка Пользователя уже существует "ВАШ_LOGIN". Хотели бы Вы использовать эту папку для домашней папки для этой учетной записи"?  Примечание: Это исправит права доступа/владения - во избежание проблем.
    7. Выбрать "Выйти" из главного меню Apple. 
    8. Войти в качестве вновь созданного пользователя. 
    9. Вы должны получить доступ ко всем вашим оригинальным файлам (на рабочем столе, в документах и в других папках). Убедившись, что все ваши данные доступны, можно удалить старую учетную запись пользователя. 
    10. Отключить корневого пользователя.
    Найдено у Apple.

    33

    Сабж, собственно.

    Вроде недавно 16 отмечал, а уже 33 - и галактика до сих пор полностью не захвачена, к сожалению.

    Ну хоть Apertur'у сегодня обновили - к фотографиям своим достучался. Почти праздник ;-)

    пятница, 28 октября 2011 г.

    Распространение приложений на twisted

    Как выяснилось - nobody cares по поводу фигурок, так что продолжу сношать вам мозг выкладывать технические статьи и старые переводы.

    Моя работа — создание различных приложений на Twisted для работы с многочисленными веб-сервисами. В отличие от проектов на TurboGears, которые я распространяю как eggs с помощью easy_install (через setuptools) у меня не было удобного способа «выкатить» проекты на Twisted.

    До этого момента.

    Twisted преодставляет удобную систему плагинов, которые позволяют приложениям встраиваться в «twistd» стартер.

    Только одна проблема — полное отсутствие приличной документации об этом процессе.

    Ниже я хочу привести небольшой рассказ о том, как можно собрать простое приложение в пакет twisted. На самом деле — я возьму известный туториал — Twisted finger и допишу шаг №12: «Как создать пакет для finger как приложение Twisted для twistd» (aka «Пропущенный шаг»).

    Step 12: How to package the finger service as an installable Twisted application plugin for twistd

    Создайте структуру каталогов, как показано ниже

    finger
    finger/__init__.py
    finger/finger.py
    MANIFEST.in
    setup.py
    twisted
    twisted/plugins
    twisted/plugins/finger_plugin.py
    

    finger/finger.py — приложение finger отсюда. twisted/plugins — структура каталогов, содержит файл finger_plugin.py, который будет описан ниже.

    Обратите внимание — никаких файлов __init__.py в каталогах twisted и twisted/plugins — это важно!

     finger_plugin.py реализует интерфейсы IServiceMaker и IPlugin.
    # ==== twisted/plugins/finger_plugin.py ====
    # - Zope modules -
    from zope.interface import implements
    
    # - Twisted modules -
    from twisted.python import usage
    from twisted.application.service import IServiceMaker
    from twisted.plugin import IPlugin
    
    # - Finger modules -
    from finger import finger
    
    class Options(usage.Options):
        synopsis = "[options]"
        longdesc = "Make a finger server."
        optParameters = [
            ['file', 'f', '/etc/users'],
            ['templates', 't', '/usr/share/finger/templates'],
            ['ircnick', 'n', 'fingerbot'],
            ['ircserver', None, 'irc.freenode.net'],
            ['pbport', 'p', 8889],
        ]
        
        optFlags = [['ssl', 's']]
    
    class MyServiceMaker(object):
        implements(IServiceMaker, IPlugin)
        
        tapname = "finger"
        description = "Finger server."
        options = Options
        
        def makeService(self, config):
            return finger.makeService(config)
    
    serviceMaker = MyServiceMaker()
    


    setup.py стандартный файл установщика. Обратите внимание на аргументы «packages» и «package_data» в функции setup() и функцию- refresh_plugin_cache(), которая вызывается после того, как полностью отработает setup()s. Последняя вручную сбросит кэш плагинов Twisted (twisted/plugins/dropin.cache).
    # ==== twisted/plugins/finger_plugin.py ====
    '''setup.py for finger.
    
    This is an extension of the Twisted finger tutorial demonstrating how
    to package the Twisted application as an installable Python package and
    twistd plugin (consider it "Step 12" if you like).
    
    Uses twisted.python.dist.setup() to make this package installable as
    a Twisted Application Plugin.
    
    After installation the application should be manageable as a twistd
    command.
    
    For example, to start it in the foreground enter:
    $ twistd -n finger
    
    To view the options for finger enter:
    $ twistd finger --help
    '''
    
    __author__ = 'Chris Miles'
    
    
    import sys
    
    try:
        import twisted
    except ImportError:
        raise SystemExit("twisted not found.  Make sure you "
                         "have installed the Twisted core package.")
    
    from distutils.core import setup
    
    def refresh_plugin_cache():
        from twisted.plugin import IPlugin, getPlugins
        list(getPlugins(IPlugin))
    
    if __name__ == '__main__':
        
        if sys.version_info[:2] >= (2, 4):
            extraMeta = dict(
                classifiers=[
                    "Development Status :: 4 - Beta",
                    "Environment :: No Input/Output (Daemon)",
                    "Programming Language :: Python",
                ])
        else:
            extraMeta = {}
    
        setup(
            name="finger",
            version='0.1',
            description="Finger server.",
            author=__author__,
            author_email="you@email.address",
            url="http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html",
            packages=[
                "finger",
                "twisted.plugins",
            ],
            package_data={
                'twisted': ['plugins/finger_plugin.py'],
            },
            **extraMeta)
        
        refresh_plugin_cache()
    

    MANIFEST.in содержит одну строчку, которая, как я полагаю, указывает distutils изменить существующий пакет Twisted (для установки twisted/plugin/finger_plugin.py) и нечто наподобие. graft twisted Это все для того, чтобы можно было начать установку пакета обычным способом:

    $ python setup.py install

    После этого нужно запустить twistd — чтобы убедится, чтто приложение установилось нормально и доступно. Посмотрите на опции twistd:

    $ twistd --help
    
    Usage: twistd [options]
    
     ...
    
    Commands:
     athena-widget Create a service which starts a NevowSite with a single
     page with a single widget.
     ftp An FTP server.
     telnet A simple, telnet-based remote debugging service.
     socks A SOCKSv4 proxy service.
     manhole-old An interactive remote debugger service.
     portforward A simple port-forwarder.
     web A general-purpose web server which can serve from a
     filesystem or application resource.
     inetd An inetd(8) replacement.
     vencoderd Locayta Media Farm vencoderd video encoding server.
     news A news server.
     words A modern words server
     toc An AIM TOC service.
     finger Finger server.
     dns A domain name server.
     mail An email service
     manhole An interactive remote debugger service accessible via
     telnet and ssh and providing syntax coloring and basic
     line editing functionality.
     conch A Conch SSH service.
    
    
    
    Посмотрим опции нашего сервера finger в плагине:

    $ twistd finger --help
    Usage: twistd [options] finger [options]
    
    Options:
    
     -s, --ssl 
     -f, --file= [default: /etc/users]
     -t, --templates= [default: /usr/share/finger/templates]
     -n, --ircnick= [default: fingerbot]
     --ircserver= [default: irc.freenode.net]
     -p, --pbport= [default: 8889]
     --version 
     --help Display this help and exit.
    
    Make a finger server.
    
    
    
    Запустим сервер finger в консоли:

    $ sudo twistd -n finger --file=users
    
    2007/12/23 22:12 +1100 [-] Log opened.
    2007/12/23 22:12 +1100 [-] twistd 2.5.0 (/Library/Frameworks/Python.framework/
    Versions/2.5/Resources/Python.app/Contents/MacOS/Python 2.5.0) starting up
    2007/12/23 22:12 +1100 [-] reactor class: 
    2007/12/23 22:12 +1100 [-] finger.finger.FingerFactoryFromService starting on 79
    2007/12/23 22:12 +1100 [-] Starting factory 
    2007/12/23 22:12 +1100 [-] twisted.web.server.Site starting on 8000
    2007/12/23 22:12 +1100 [-] Starting factory 
    2007/12/23 22:12 +1100 [-] twisted.spread.pb.PBServerFactory starting on 8889
    2007/12/23 22:12 +1100 [-] Starting factory 
    2007/12/23 22:12 +1100 [-] Starting factory 
    

    twistd предоставляет многочисленные полезные возможности — такие как запуск демона, указания расположения лог и pid файлов и т.д…

    К сожалению Twisted и setuptools не очень хорошо взаимодействуют вместе, так что я не смог упаковать мое приложение Twisted как egg, нужно повозится с системой разрешения зависимостей setuptools, или установить используя easy_install.

    Ссылки



    Источник, хабра