Понадобилось мне сделать фильтрацию списка кейвордов, отдаваемых GKT. Казалось бы, велика задача, перечислить в регулярке допустимые символы и удалить остальные. И всё было бы так просто, если бы половина пользователей не была родом из европы и их кейворды не включали так называемые умлауты.
Записки обо всём, с чем приходится столкнуться по работе и что полезно не забывать. python, php, ZendFramework, NOSQL и т.д.
17 октября 2012 г.
27 августа 2012 г.
Алгоритм k-means [Кластерный анализ и Python]
Наконец дошли руки дописать цикл заметок о кластерном анализе.
Тема данной заметки алгоритм k-means и пример работы с ним на языке python.
11 июня 2012 г.
Полезные мелочи при работе в серверном окружении (linux)
Есть у меня такая традиция - полезные консольные команды при работе с линуксом складывать в текстовый файл. Да вот только уж больно он разросся, так что выложу сюда и буду дополнять =)
14 мая 2012 г.
Очистка Zend_Cache по расписанию
Часто бывает, что некоторую информацию можно хранить в кеше вечно, инвалидируя её только непосредственно при обновлении (в моём случае - по расписанию).
Казалось бы, какие проблемы? Кроновские скрипты написаны в контексте зендовского приложения, кеш подключается автоматически - осталось только взять да почистить по тегам методом clean().
Но не тут то было!
Казалось бы, какие проблемы? Кроновские скрипты написаны в контексте зендовского приложения, кеш подключается автоматически - осталось только взять да почистить по тегам методом clean().
Но не тут то было!
5 мая 2012 г.
PyQt4, QWebView и flash plugin
Вдогонку к посту про запуск PyQt4 на сервере без иксов опишу как добавить в QWebView флеш плагин.
4 мая 2012 г.
PyQt4 на сервере без иксов (centos)
Понадобилось мне запустить бота, написанного на PyQt4 на сервере без иксов (обычная vds centos под Xen-ом). Что из этого вышло смотрите далее.
2 мая 2012 г.
PyQt4 и результаты всех побочных запросов QWebView
Столкнулся с непреодолимой траблой при написании небольшого клиента на webkit-е через PyQt4.
Как появится решения, опубликую полностью, пока же только ссылка.
Как появится решения, опубликую полностью, пока же только ссылка.
3 апреля 2012 г.
Zend, headMeta() и уязвимость UTF-7
Месяц тонкостей в информационной безопасности на хабре нашёл отражение и в моих постах =)
Старая шутка с уязвимостью UTF-7 живёт и по сей день. Лечится просто - располагайте meta-тег с кодировкой самым первым в шапке.
Старая шутка с уязвимостью UTF-7 живёт и по сей день. Лечится просто - располагайте meta-тег с кодировкой самым первым в шапке.
ICQ и странный спам
Сегодня с самого утра аська полна сообщениями по типу
В общем хрен его знает, ну его к чёрту эту маилрушечку.. *ушёл в джабер* =)
(10:35:04 AM) НИКВ нете пишут, мол такое бывает прилетает в ответ от сервера на твоё сообщение при подозрениях твоего аккаунта на спам или долгий офлайн. Мне оно летит сразу от всех собеседников, которым я ничегошеньки не писал. Сдаётся мне клиент нечто служебное шлёт только что вышедшим в сеть и ловит эту ерунду =(: As a security precaution, please click the link to verify your ICQ account http://validate.icq.com/icq/validate.html?uid=ВАШ_UID&sid=195812676&lang=en.
В общем хрен его знает, ну его к чёрту эту маилрушечку.. *ушёл в джабер* =)
1 апреля 2012 г.
Zend и Atom feed
Стандартный рецепт по созданию фида формата Atom для приложения на зенде.
Copy Source | Copy HTML
- public function newsfeedAction()
- {
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $news = $this->_helper->modelLoad('News')->listAll();
- //описание фида (для импорта отдельный формат)
- //http://framework.zend.com/manual/en/zend.feed.importing.html
- $feedArray = array(
- 'title' => 'Новости',
- 'link' => $this->view->url(array( ), 'newsRss', true),
- 'charset' => 'UTF-8',
- 'description' => 'Новости - наши новости самые новостные в мире!',
- 'email' => 'support@test.ru',
- 'entries' => array()
- );
- //добавляем записи в фид
- foreach ($news as $item)
- {
- $feedArray['entries'][] = array(
- 'title' => $item['title'],
- 'link' => $this->view->url(array( 'idN' => $item['id'] ), 'newsView', true),
- 'description' => $item['desc'],
- 'content' => $item['text'],
- 'lastUpdate' => $item['timestamp']
- );
- }
- Zend_Feed::importArray($feedArray, 'atom')->send();
- }
27 марта 2012 г.
Zend, AJAX и защита от CSRF
Очень многие не заботятся о защите форм на своих проектах от CSRF-атак, а зря - я, например, через эту уязвимость карму кое где накручиваю (тссс!). А между тем защититься проще некуда.
Если это обычная форма, то в Zend-е есть чудесный элемент Zend_Form_Element_Hash. Просто добавляете его в формы и дишите ровно.
Однако, если у вас много интерактивных форм работающих на AJAX-е, то придётся написать свой небольшой велосипедик. Свой вариант я и представлю.
Если это обычная форма, то в Zend-е есть чудесный элемент Zend_Form_Element_Hash. Просто добавляете его в формы и дишите ровно.
Однако, если у вас много интерактивных форм работающих на AJAX-е, то придётся написать свой небольшой велосипедик. Свой вариант я и представлю.
14 марта 2012 г.
ВКонтакта забанил nethouse =(
Забанили чудесный проектик, к которому имею хоть и посредственное, но всё же отношение.
http://nethouse.ru/blog/25
Очереднойлучик бу в сторону управленцев контактоты=(
http://nethouse.ru/blog/25
Очередной
12 марта 2012 г.
Неожиданные траблы с vds от majordomo
С некоторого времени в шаблонах ОС для впс-ок от мажордомо завелись iptables с предустановленными правилами.
Если как и я попались на дедлок при смене порта ssh, или там ntpdate не синхронизируется - проверьте /etc/sysconfig/iptables, там всё нестандартное перекрыто к чертям =)
Если как и я попались на дедлок при смене порта ssh, или там ntpdate не синхронизируется - проверьте /etc/sysconfig/iptables, там всё нестандартное перекрыто к чертям =)
28 февраля 2012 г.
Иерархический алгоритм [Кластерный анализ и Python]
Наконец собрался написать о некоторых алгоритмах кластерного анализа и их реализации на Python. В большинстве своём это будет краткое описание алгоритма и разбор готового решения, без глубокого объяснения "что это и как работает". Как следствие, если Вы ещё не знакомы с теорией по кластерному анализу, лучше начать с неё (ссылки на хорошие источники будут предоставлены) иначе сложно будет понять зачём делается тот или иной шаг.
Поскольку это первый пост из цикла, опишу тестовый набор данных, который будет использоваться в этом и всех последующих алгоритмах.
Для работы я возьму данные по энергетической ценности продуктов, безжалостно слитые где-то в интернете. В этом наборе каждый продукт описан тремя переменными - количеством белков, жиров и углеводов на сто грамм.
Разбиение данного набора на кластеры даст нам представление о схожих по обозначенным параметрам продуктах и наглядно продемонстрирует результаты работы алгоритмов.
Для тех, кто не знаком с кластерным анализом вообще, посоветую следующие источники (гуглятся легко):
- Воронцов К. В. Лекции по алгоритмам кластеризации и многомерного шкалирования.
- Kaufman L., Rousseeuw P. J. Finding Groups in Data: An Introduction to Cluster Analysis. — John Wiley & Sons, 1990.
- Jain A. K., Murty M. N., Flynn P. J. Data Clustering: A Review. (http://www.csee.umbc.edu/nicholas/clustering/p264-jain.pdf)
- Нейский И. М. Классификация и сравнение методов кластеризации
- Сегаран Т. Programming Collective Intelligence.
- Kogan J., Nicholas C., Teboulle M. Clustering Large and High Dimensional data. (http://www.csee.umbc.edu/~nicholas/clustering/ )
- J. C. Gower and G. J. S. Ross «Minimum Spanning Trees and Single Linkage Cluster Analysis»
- Мандель И. Д. Кластерный анализ.
- Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze, Introduction to Information Retrieval, Cambridge University Press. 2008. (http://nlp.stanford.edu/IR-book/)
15 февраля 2012 г.
Amazon EC2 и sshfs
Примерно так подключается
sshfs ec2-user@ec2-176-34-193-222.eu-west-1.compute.amazonaws.com:/ ~/Documents/ftpAmazon -o IdentityFile=~/test.pem
sshfs ec2-user@ec2-176-34-193-222.eu-west-1.compute.amazonaws.com:/ ~/Documents/ftpAmazon -o IdentityFile=~/test.pem
30 декабря 2011 г.
Graphviz [заметки о визуализации графов на python]
В последней заметке цикла будет рассмотрена самая, пожалуй, популярная бибилотека для визуализации графов graphviz. Биндинги для неё существуют для большинства популярных языков, в том числе и для python.
В отличии от рассмотренных ранее библиотек, graphviz предназначен исключительно для визуализации. Никаких алгоритмов внутри вы не найдёте. Поэтому чаще всего для манипулирования графами берут другие библиотеки, а полученные результаты представляют в виде dot-файла и отдают graphviz.
В отличии от рассмотренных ранее библиотек, graphviz предназначен исключительно для визуализации. Никаких алгоритмов внутри вы не найдёте. Поэтому чаще всего для манипулирования графами берут другие библиотеки, а полученные результаты представляют в виде dot-файла и отдают graphviz.
29 декабря 2011 г.
graph-tool [заметки о визуализации графов на python]
Третья заметка цикла посвящена python модулю graph-tool.
Базируется он на шибко резвой Boost Graph Library (BGL), а для визуализации использует graphviz.
Вообще, у BGL есть собственные биндинги на Python, однако
Итак, ближе к телу =)
Базируется он на шибко резвой Boost Graph Library (BGL), а для визуализации использует graphviz.
Вообще, у BGL есть собственные биндинги на Python, однако
- BGL-Python bindings are no longer being maintained.
- BGL не имеет инструментов для визуализации и нацеленна на использование в паре с graphviz.
- Готовые яйца под питон так и не появились, а ставить руками столь широкие вещи весьма трудоёмко.
Итак, ближе к телу =)
27 декабря 2011 г.
iGraph [заметки о визуализации графов на python]
Тема второй заметки о визуализации графов - библиотека igraph, имеющая биндинги под python. Для визуализации она использует библиотеку Cairo.
Документация библиотеки детальная и подробнейшая, но абсолютно лишена даже базовых примеров. Примеры однако доступны в бета версии туториала - там всё детально и подробно расписано, правда на R =)
Что касается визуализации - то данный раздел туториала ещё не сделан, что в целом не сильно мешает.
По аналогии с предыдущей заметкой мерить будем время работы и пиковое потребление памяти алгоритма расстановки графа. Исходные данные для работы взяты идентичные использованным в тойже первой заметке цикла.
Документация библиотеки детальная и подробнейшая, но абсолютно лишена даже базовых примеров. Примеры однако доступны в бета версии туториала - там всё детально и подробно расписано, правда на R =)
Что касается визуализации - то данный раздел туториала ещё не сделан, что в целом не сильно мешает.
По аналогии с предыдущей заметкой мерить будем время работы и пиковое потребление памяти алгоритма расстановки графа. Исходные данные для работы взяты идентичные использованным в тойже первой заметке цикла.
22 декабря 2011 г.
NetworkX [заметки о визуализации графов на python]
В заметках этого цикла будут рассмотренны несколько известных библиотек для визуализации графов, имеющие python-api.
В каждой заметке произведено сравнение скорости работы различных алгоритмов расстановки графов, а также примерные значения требуемой памяти.
Все сравнения я буду производить на невзвешенном ориентированном графе, включающем около 5 тысяч вершин и 18 тысяч рёбер.
Тестовая машинка - 4GB RAM + i3 540 3.07 GHz (x4).
Мерить будем пиковое значение памяти и время работы, поскольку для меня именно эти метрики являются критичными.
В каждой заметке произведено сравнение скорости работы различных алгоритмов расстановки графов, а также примерные значения требуемой памяти.
Все сравнения я буду производить на невзвешенном ориентированном графе, включающем около 5 тысяч вершин и 18 тысяч рёбер.
Тестовая машинка - 4GB RAM + i3 540 3.07 GHz (x4).
Мерить будем пиковое значение памяти и время работы, поскольку для меня именно эти метрики являются критичными.
7 декабря 2011 г.
NetBeans 7.* и Python
Из стандартных плагинов недоступна, однако же есть дев версия плагина.
- Идём в Tools -> Plugins -> Settings
- Жмакаем кнопочку Add
- Называем новый источник как угодно и вставляем ссыль http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz
- Обратно Available Plugins и жмакаем кнопочку Reload Catalog
- Ищем питон и ставим как обычно
Matplotlib и "FloatingPointError: underflow encountered in multiply"
Случилось мне столкнуться с мистической ошибкой при использовании matplotlib - библиотеки для рисования графиков и визуализации различных математических результатов, имеющей крайне Matlab Like API =)
Ошибка поставляется вместе с тучным traceback-ом, указывающим в итоге на
File "/usr/lib/python2.6/site-packages/numpy/ma/core.py", line 772, in __call__
return umath.absolute(a) * self.tolerance >= umath.absolute(b)
Тобишь ошибочка гдето внутрях ядра numpy, который библиотека юзает для своих целей.
Мистика заключается в том, что получить эту ошибку мне удалось только в связке версий 1.0.1 и 1.6.1 для matplotlib и numpy соответственно и только на python-е версии 2.6.5.
Ошибка поставляется вместе с тучным traceback-ом, указывающим в итоге на
File "/usr/lib/python2.6/site-packages/numpy/ma/core.py", line 772, in __call__
return umath.absolute(a) * self.tolerance >= umath.absolute(b)
Тобишь ошибочка гдето внутрях ядра numpy, который библиотека юзает для своих целей.
Мистика заключается в том, что получить эту ошибку мне удалось только в связке версий 1.0.1 и 1.6.1 для matplotlib и numpy соответственно и только на python-е версии 2.6.5.
10 ноября 2011 г.
Переводим cron-скрипты на Zend
Часто бывает, что cron-скрипты Zend приложений работают с теми же ресурсами, что и само приложение. Само собой, хочется перенести эти скрипты в привычное окружение зенда. Один из вариантов этой процедуры я и приведу.
Сразу оговорюсь - представленная реализация наверняка не самая лучшая и имеет множество изъянов, да и некоторые моменты у меня самого вызывают вопросы (просто когда понадобилось перенести все крон скрипты на зенд времени на детальное рассмотрение небыло совершенно). Поэтому буду рад всем фидбеками и замечаниям по коду =)
Сразу оговорюсь - представленная реализация наверняка не самая лучшая и имеет множество изъянов, да и некоторые моменты у меня самого вызывают вопросы (просто когда понадобилось перенести все крон скрипты на зенд времени на детальное рассмотрение небыло совершенно). Поэтому буду рад всем фидбеками и замечаниям по коду =)
19 октября 2011 г.
Zend cache manager + application.ini
Если кешей в приложении на зенде много (а так обычно и бывает, если у вас не хоум пейдж), рекомендую использовать их через специальный кеш менеджер, для которого существует соответствующий ресурс приложения.
В принципе, пример не сильно отличается от оф доки, разве что Вы также нарвались на упоминания в оной неких статический методов класса Zend_Cache_Manager, которых давно уже нет в коде =)
В принципе, пример не сильно отличается от оф доки, разве что Вы также нарвались на упоминания в оной неких статический методов класса Zend_Cache_Manager, которых давно уже нет в коде =)
17 октября 2011 г.
Отдача .PDF с помощью Zend
Бывает результатом работы action-а зенда является отдача файла.
По хорошему, файлы надо отдавать напрямую сервером, но бывает файл генерится автоматически да ещё отталкиваясь от прав. В этом случае от зенда уже не отмазаться =))
По хорошему, файлы надо отдавать напрямую сервером, но бывает файл генерится автоматически да ещё отталкиваясь от прав. В этом случае от зенда уже не отмазаться =))
13 октября 2011 г.
Zend и контроль доступа
Основы контроля доступа в приложениях на зенде разжёваны в интернетах вдоль и поперёк, поэтому подробно рассматривать эту тему я смысла не вижу.
Если вкратце:
Если вкратце:
- Создали ACL (статически или динамически)
- Определили роль юзера (как правило используются сессии)
- Проверили наличие привилегии к ресурсу
- Разрешили или отказали (способов отказа как правило несколько, от редиректа до исключения)
MongoDB под python (основы)
Решил запостить основные рецепты дабы не потерялись. Постепенно буду пополнять.
Сборник cоветов по компонентам Zend-а
В процессе рефакторинга часто встречаются различные "прелести", оставшиеся от старых версий тех или иных библиотек. Есть такие и у зенда. Буду дополнять этот сборник по мере работы.
29 сентября 2011 г.
Absolute URL and helper url() (view/action)
Столкнулся с забавным поведением внешне идентичных view хелпера url() и одноимённого action хелпера.
Делаем в контроллере следущее:
var_dump(
$this->view->url(array(), 'staticRegisterActivate', true),
$this->_helper->url->url(array(), 'staticRegisterActivate', true)
);
Видим два урла:
http://dseye.local/registertoken.html
и
/registertoken.html
Почему при одинаковом коде в обоих хелперах (там по 2 строки) мы получаем разный вариант? И заодно как же поступить - в контроллере нужно брать абсолютный урл по роутеру (не хотелось бы ещё и serverUrl туда приплетать).
Есть подозрение что хелпер вида что то ещё рендерит перед тем как роутер заасемблить, но подтверждений не нарыл =(
Так что тревога отменяется =)
Делаем в контроллере следущее:
var_dump(
$this->view->url(array(), 'staticRegisterActivate', true),
$this->_helper->url->url(array(), 'staticRegisterActivate', true)
);
Видим два урла:
http://dseye.local/registertoken.html
и
/registertoken.html
Почему при одинаковом коде в обоих хелперах (там по 2 строки) мы получаем разный вариант? И заодно как же поступить - в контроллере нужно брать абсолютный урл по роутеру (не хотелось бы ещё и serverUrl туда приплетать).
Есть подозрение что хелпер вида что то ещё рендерит перед тем как роутер заасемблить, но подтверждений не нарыл =(
UPD:
Докопался до причины =)) Оказалось это я сам переопределил стандартный хелпер вида для вывода абсолютных адресов
$this->view->serverUrl() . $router->assemble($urlOptions, $name, $reset, $encode)
28 сентября 2011 г.
Libcurl + c-ares (установка из сорцов)
c-ares дают возможность делать асинхронные
DNS запросы через pycurl (биндинги для libcurl). Мне это понадобилось для скоростного краба на питоне.
Под Windows все уже в порядке (.exe сетапник уже включает в себя скомпилированную поддержку 'c-ares').
На сервере же (Linux/FreeBSD) приходится ставить ручками (О_о). Далее приложу инструкцию для линуксы.
Под Windows все уже в порядке (.exe сетапник уже включает в себя скомпилированную поддержку 'c-ares').
На сервере же (Linux/FreeBSD) приходится ставить ручками (О_о). Далее приложу инструкцию для линуксы.
26 сентября 2011 г.
Zend_Log + application.ini + multiply logs
Понадобилось более сложная логика в Zend_Log и сразу хотелось сделать по хорошему, через application.ini
Удалось не всё =(
Удалось не всё =(
Подписаться на:
Сообщения (Atom)