7 апреля 2014 г.

Проверка валидности картинки на Python

Встала задачка проверить валидность скаченной картинки на питоне. Картинок много, способов тоже. Пошёл тестить.

2 апреля 2014 г.

Netbeans 8 и java.lang.OutOfMemoryError: GC overhead limit exceeded

Решил я тут давеча обновить себе нетбинсу до 8й версии (пора бы уже). Скачал как водится sh скриптик и давай ставить. И вот какое дело - на 25% вылетает установщик с исключением вида java.lang.OutOfMemoryError: GC overhead limit exceeded.

12 июня 2013 г.

Firefox addon sdk и cookie

Если вдруг в аддоне для firefox, написанном с помощью jetpack sdk, вам понадобится дотянуться до юзерских кук, то вы знаете что делать =)
Copy Source | Copy HTML
  1. var { Cc, Ci } = require('chrome');

  2. var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);

  3. var uri = ios.newURI(TABS.activeTab.url, null, null);

  4. var cookieSvc = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService);

  5. cookie = cookieSvc.getCookieString(uri, null);

18 апреля 2013 г.

Netbeans 7.3 и js const

После перехода на netbeans версии 7.3 все js const стали подсвечиваться ошибкой =( И это при том, что основной фишкой 7.3 стала поддержка html5 и иже с ним.
Если вкратце - раньше  нетбинса использовала парсер Rhino, от фоксы, а в 7.3 перешла на некий Nashorn, православный, строго по спецификации ECMAScript 5 работающий. Ну а в ECMAScript 5 нет никакого const =(

Подробности



13 апреля 2013 г.

sdk/simple-storage и событие OverQuota

Небольшая заметочка для тех, кто использовал simple-storage механизм из sdk для расширений firefox.
Если вам вздумается проверить работу события OverQuota, выстреливающего (вы не поверите) при превышении квоты, имейте в виду - проверка квоты и выстрел события происходят по таймеру, причём с хорошей такой задержкой. 
Так что если хотите потестить работу функции очистки при наступлении квоты - запускайте приложение и ждите минут 5-10.

Всё это релевантно для sdk версии 1.14

22 ноября 2012 г.

wkhtmltopdf и долгий javascript

Случилось так, что необходимо мне было сгенерировать pdf на основе html странички с большим количеством графиков на js.  Сделал с помощью wkhtmltopdf и вроде бы всё работало, но иногда графики отрисовывались не полностью. Складывалось впечатление, что в какой то случайный момент времени вебкиту надоедает ждать исполнение кода и он делает скриншот того, что уже уже есть.

15 ноября 2012 г.

Google location / gl / hl и разные наборы кодов стран


По идее в gl используются те же коды стран, что и в таргетинге (самый верхний уровень таргетинга). Однако сравнение показало, что в gl есть дополнительные 6 кодов стран, неизвестные таргетингу:
Syrian Arab Republic     sy
Myanmar     mm
Iran, Islamic Republic of     ir
Korea, Democratic People's Republic of     kp
United Kingdom     uk
Cuba     cu
Sudan     sd
И если ещё со всякими Суданами и Северными Кореями я могу смириться (не иначе как толталитаризм повлиял на политику гугла), то куда же делось Объединённое Королевство?!
Оказалось, в случае gl оно проходит с кодом UK (что логично), а в случае location с кодом GB (O_o).
Работают вроде оба варианта в обоих параметрах, поэтому ничего сломаться не должно, но нервы потрепало (:

PS: на всякий случай уточню, какие типы таргетов к каким относятся
Copy Source | Copy HTML
  1. countryColums = ['Country','Region']

  2. regionColums = ['Autonomous Community','Canton','Department','County','Governorate','Region','Prefecture','Province','State','Territory','Union Territory']

  3. cityColums = ['City','Municipality']

  4. ignoredColums = ['DMA Region','Postal Code','Congressional District']

6 ноября 2012 г.

Highcharts и wkhtmltopdf

Пробовали сохранять графики хайчартов в пдф с помощью данной тулзы? Тогда наверное сталкивались с таким видом всех линий?

Лечится следующим образом
options.plotOptions.animation = false
options.plotOptions.shadow = false
options.plotOptions.enableMouseTracking = false

26 октября 2012 г.

Nginx, proxy_pass и urldecode

Есть у меня на проекте урл, который отвечает за поисковую строку. Но урл не обычный, а вида site.com/info/(.*). Внутри этой регулярки могут встречаться различные символы, которые необходимо энкодить (ну там пробелы, плюсы и так далее).
И всё бы работало нормально, не заведи админы вдруг nginx проксёй к апаче. Благодаря ему запросы вида /info/test+%2B+term (заэнкоженый плюс отделённый пробелами) стали доходить до апача как /info/test+++term, что после декодирования воспринималось уже как три пробела.

Ubuntu и marble mouse

Решил я перейти от мышки к трекболу. Волей случая стал обладателем marble mouse. Вот только беда, что родных дров под линух нет, а без скроллинга и средней кнопки не жизнь =)
Пришлось прописывать конфиг самому.

17 октября 2012 г.

php, utf8 и умлауты

Понадобилось мне сделать фильтрацию списка кейвордов, отдаваемых GKT. Казалось бы, велика задача, перечислить в регулярке допустимые символы и удалить остальные. И всё было бы так просто, если бы половина пользователей не была родом из европы и их кейворды не включали так называемые умлауты.

11 июня 2012 г.

Полезные мелочи при работе в серверном окружении (linux)

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

14 мая 2012 г.

Очистка Zend_Cache по расписанию

Часто бывает, что некоторую информацию можно хранить в кеше вечно, инвалидируя её только непосредственно при обновлении (в моём случае - по расписанию).
Казалось бы, какие проблемы? Кроновские скрипты написаны в контексте зендовского приложения, кеш подключается автоматически - осталось только взять да почистить по тегам методом 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-тег с кодировкой самым первым в шапке.

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
  1. public function newsfeedAction()

  2.     {

  3.         $this->_helper->layout->disableLayout();

  4.         $this->_helper->viewRenderer->setNoRender();


  5.         $news = $this->_helper->modelLoad('News')->listAll();


  6.         //описание фида (для импорта отдельный формат)

  7.         //http://framework.zend.com/manual/en/zend.feed.importing.html

  8.         $feedArray = array(

  9.             'title'       => 'Новости',

  10.             'link'        => $this->view->url(array( ), 'newsRss', true),

  11.             'charset'     => 'UTF-8',

  12.             'description' => 'Новости - наши новости самые новостные в мире!',

  13.             'email'       => 'support@test.ru',

  14.             'entries'     => array()

  15.         );


  16.         //добавляем записи в фид

  17.         foreach ($news as $item)

  18.         {

  19.             $feedArray['entries'][] = array(

  20.                 'title'       => $item['title'],

  21.                 'link'        => $this->view->url(array( 'idN' => $item['id'] ), 'newsView', true),

  22.                 'description' => $item['desc'],

  23.                 'content'     => $item['text'],

  24.                 'lastUpdate'  => $item['timestamp']

  25.             );

  26.         }


  27.         Zend_Feed::importArray($feedArray, 'atom')->send();

  28.     }

27 марта 2012 г.

Zend, AJAX и защита от CSRF

Очень многие не заботятся о защите форм на своих проектах от CSRF-атак, а зря - я, например, через эту уязвимость карму кое где накручиваю (тссс!). А между тем защититься проще некуда.

Если это обычная форма, то в Zend-е есть чудесный элемент Zend_Form_Element_Hash. Просто добавляете его в формы и дишите ровно.
Однако, если у вас много интерактивных форм работающих на AJAX-е, то придётся написать свой небольшой велосипедик. Свой вариант я и представлю.

14 марта 2012 г.

ВКонтакта забанил nethouse =(

Забанили чудесный проектик, к которому имею хоть и посредственное, но всё же отношение.
http://nethouse.ru/blog/25 
Очередной лучик бу в сторону управленцев контактоты=(

12 марта 2012 г.

Неожиданные траблы с vds от majordomo

С некоторого времени в шаблонах ОС для впс-ок от мажордомо завелись iptables с предустановленными правилами.
Если как и я попались на дедлок при смене порта ssh, или там ntpdate не синхронизируется - проверьте /etc/sysconfig/iptables, там всё нестандартное перекрыто к чертям =)

28 февраля 2012 г.

Иерархический алгоритм [Кластерный анализ и Python]


Наконец собрался написать о некоторых алгоритмах кластерного анализа и их реализации на Python. В большинстве своём это будет краткое описание алгоритма и разбор готового решения, без глубокого объяснения "что это и как работает". Как следствие, если Вы ещё не знакомы с теорией по кластерному анализу, лучше начать с неё (ссылки на хорошие источники будут предоставлены) иначе сложно будет понять зачём делается тот или иной шаг.

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

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

Для тех, кто не знаком с кластерным анализом вообще, посоветую следующие источники (гуглятся легко):
  1. Воронцов К. В. Лекции по алгоритмам кластеризации и многомерного шкалирования.
  2. Kaufman L., Rousseeuw P. J. Finding Groups in Data: An Introduction to Cluster Analysis. — John Wiley & Sons, 1990.
  3. Jain A. K., Murty M. N., Flynn P. J. Data Clustering: A Review. (http://www.csee.umbc.edu/nicholas/clustering/p264-jain.pdf)
  4. Нейский И. М. Классификация и сравнение методов кластеризации
  5. Сегаран Т. Programming Collective Intelligence.
  6. Kogan J., Nicholas C., Teboulle M. Clustering Large and High Dimensional data. (http://www.csee.umbc.edu/~nicholas/clustering/ )
  7. J. C. Gower and G. J. S. Ross «Minimum Spanning Trees and Single Linkage Cluster Analysis»
  8. Мандель И. Д. Кластерный анализ.
  9. Christopher D. Manning, Prabhakar Raghavan and Hinrich Schütze, Introduction to Information Retrieval, Cambridge University Press. 2008. (http://nlp.stanford.edu/IR-book/)
Итак, тема данного поста Иерархические алгоритмы кластерного анализа и их реализация на Python. Поехали =)

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

30 декабря 2011 г.

Graphviz [заметки о визуализации графов на python]

В последней заметке цикла будет рассмотрена самая, пожалуй, популярная бибилотека для визуализации графов graphviz. Биндинги для неё существуют для большинства популярных языков, в том числе и для python.

В отличии от рассмотренных ранее библиотек, graphviz предназначен исключительно для визуализации. Никаких алгоритмов внутри вы не найдёте. Поэтому чаще всего для манипулирования графами берут другие библиотеки, а полученные результаты представляют в виде dot-файла и отдают graphviz.

29 декабря 2011 г.

graph-tool [заметки о визуализации графов на python]

Третья заметка цикла посвящена python модулю graph-tool.
Базируется он на шибко резвой Boost Graph Library (BGL), а для визуализации использует graphviz.
Вообще, у BGL есть собственные биндинги на Python, однако
  • BGL-Python bindings are no longer being maintained.  
  • BGL не имеет инструментов для визуализации и нацеленна на использование в паре с graphviz.
  • Готовые яйца под питон так и не появились, а ставить руками столь широкие вещи весьма трудоёмко.
Думаю именно по этим причинам была написана graph-tool.

Итак, ближе к телу =)

27 декабря 2011 г.

iGraph [заметки о визуализации графов на python]

Тема второй заметки о визуализации графов - библиотека igraph, имеющая биндинги под python. Для визуализации она использует библиотеку Cairo.

Документация библиотеки детальная и подробнейшая, но абсолютно лишена даже базовых примеров. Примеры однако доступны в бета версии туториала - там всё детально и подробно расписано, правда на R =)
Что касается визуализации - то данный раздел туториала ещё не сделан, что в целом не сильно мешает.

По аналогии с предыдущей заметкой мерить будем время работы и пиковое потребление памяти алгоритма расстановки графа. Исходные данные для работы взяты идентичные использованным в тойже первой заметке цикла.

22 декабря 2011 г.

NetworkX [заметки о визуализации графов на python]

В заметках этого цикла будут рассмотренны несколько известных библиотек для визуализации графов, имеющие python-api.
В каждой заметке произведено сравнение скорости работы различных алгоритмов расстановки графов, а также примерные значения требуемой памяти.
Все сравнения я буду производить на невзвешенном ориентированном графе, включающем около 5 тысяч вершин и 18 тысяч рёбер.
Тестовая машинка - 4GB RAM + i3 540 3.07 GHz (x4).

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