Category Archives: Programming

[ПЕРЕВОД] Коллбеки императивны, обещания функциональны: крупнейшее упущение NodeJS.

Перевод статьи James Coglan Callbacks are imperative, promises are functional: Node’s biggest missed opportunity

“Главная особенность обещаний в том, что они невосприимчивы к изменяющимся обстоятельствам”
Франк Андервуд, “Карточный домик”

Возможно, вы часто слышите, что JavaScript это “функциональный” язык программирования. Его так называют просто потому, что функции в нём – объекты первого рода: многие другие особенности, присущие функциональным языкам, такие как неизменяемые данные, предпочтение циклам рекурсии, алгебраические системы типов, избежание побочных эффектов – полностью отсутствуют. И, хотя функции высшего порядка, безусловно, полезны и позволяют программирвать в функциональном стиле, но представление, что JS это функциональный язык, зачастую затмевает основной аспект функционального программирования – программирование со значениями.

Continue reading

Бенчмарк HTML парсеров

Переписывал на работе кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.

Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
На данный момент успел написать бенчмарки на Erlang, Python, PyPy, NodeJS и С в следующих комбинациях:

  • Erlang – mochiweb_html
  • CPython – lxml.etree.HTML
  • CPython – BeautifulSoup 3
  • CPython – BeautifulSoup 4
  • CPython – html5lib
  • PyPy – BeautifulSoup 3
  • PyPy – BeautifulSoup 4
  • PyPy – html5lib
  • Node.JS – cheerio
  • Node.JS – htmlparser
  • Node.JS – jsdom
  • C – libxml2 (скорее для справки)

В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.

Интрига: кто быстрее – Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C. Continue reading

Интеграция Redmine и Eclipse

Вступление

Логотипы eclipse и redmineБольшую часть времени разработчики проводят в двух местах – в IDE и в багтрекере/системе управления задачами (ну и, естественно, за гуглением/чтением всяких блогов, литературы etc). При этом, как правило, работая над конкретной задачей, разработчик использует весьма небольшое количество файлов проекта и возможностей IDE. Таким образом, все остальное окружение, не затронутое данной конкретной задачей, только отвлекает и сбивает с толку. Помочь решить эту проблему призван замечательный плагин для не менее замечательной IDE Eclipse под названием mylyn. Continue reading

Импорт GIT репозитория в пустой SVN

В статье кратко описано как импортировать существующий GIT репозиторий в чистенький SVN со всей историей коммитов и пр.

Первый вопрос, который напрашивается – ЗАЧЕМ?

Отвечаю – просто проект разрабатывался в моем локальном репозитории, а после заказчик попросил разместить его в SVN. Можно, конечно, сделать это все одним большим Initial коммитом, но хочется чтоб история тоже импортировалась. Continue reading

Учим Redmine рассылать почту через Gmail

Проблема в том, что если настроить уведомления по email через smtp стандартным методом:

# File: config/email.yml
production:
  delivery_method: :smtp
  smtp_settings:
    address: "smtp.gmail.com"
    port: '587'
    domain: "smtp.gmail.com"
    authentication: :plain
    user_name: "your_email@gmail.com"
    password: "your_password"

То при попытке отправить пробный email http://redmine.example.com/admin/test_email, он выдает ошибку
Во время отправки письма произошла ошибка (530 5.7.0 Must issue a STARTTLS command first. 16sm1075274ewy.14 )
Причиной тому служит обязательное использование TLS шифрования при работе с почтовым сервером Gmail, которое Redmine из коробки не поддерживает.
Добавить такой функционал несложно… Continue reading

Меняем favicon с помощью Jquery

Фавикон (иконка для веб-странички) добавляется таким тегом в HEAD страницы:
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
Если вдруг появится необходимость его динамически поменять, то, по аналогии с картинками, должно быть достаточно сменить href атрибут, но на самом деле браузеры на это никак не реагируют. Поэтому нужно удалить и создать заново этот тег.
Как это сделать на чистом JavaScript описано тут Управление иконками favicon из JavaScript – видим, что способ достаточно громоздкий.
В Jquery можно эту операцию проделать всего тремя строчками.

[codesyntax lang=”javascript”]function chFavicon(iconHref){
//получаем объект тега иконки
icon=$(":[rel=’shortcut icon’]");
//создаем копию объекта иконки
cache=icon.clone();
//меняем атрибут href на переданный функции
cache.attr("href", iconHref);
//переписываем тег иконки
icon.replaceWith(cache);
}[/codesyntax]

Протоколы прикладного уровня: SMTP

SMTP (англ. Simple Mail Transfer Protocol — простой протокол передачи почты) — это сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP.

ESMTP (англ. Extended SMTP) — масштабируемое расширение протокола SMTP. В настоящее время под «протоколом SMTP», как правило, подразумевают ESMTP и его расширения.

Сразу отмечу, что в настоящее время SMTP в чистом виде уже не используется, т.к. он даже не поддерживает элементарно авторизацию… Используется только ESMTP. Когда вы пользуетесь почтовым клиентом (Outlook, Thunderbird, Evolution, TheBat) происходит работа именно по этому протоколу.

Так вот, давайте попробуем элементарно отправить e-mail из консоли через почтовый сервер яндекса  (не важно, линукс у вас или виндоус). Continue reading

bash скриптик

Вот поразвлекался ночью…
Нужно было составить список фильмов на файлсервере и преобразовать его в список ссылок (BB кодов)
Ну, список получить не сложно оказалось, просто подмонтировал smbfilesystem к своей системе и сделал там ls
С преобразованием в ссылки оказалось сложнее т.к. имена файлов были как на английском, так и на русском так что нужно было преобразовать их в URL формат (т.е. что-то вроде %D4%E8%EB%FC%EC%FB%20%F1 )
Нарыл на эту тему описание схемы кодирования:
http://ru.wikipedia.org/
сам, как можно догадаться, его реализовать не смог, поэтому пришлось заюзать сервис Ответы Google там довольно быстро подсказали решение и в результате бессонной ночи и изучения мануалов по sed и awk получилось вот это чудо: Continue reading