Архив метки: программирование

Hybris: поиск Solr по составному полю

Понадобилось как-то в SAP Hybris настроить поиск по составному полю (состоящему из нескольких атрибутов продукта). Так, чтобы при запросе вида «желтый ботинок» в листинге товаров сначала выдавались не просто товары желтого цвета, а именно желтые ботинки (а затем — остальные ботинки). Решить это регулировкой коэффициентов усиления поиска по отдельным свойствам (boost) не удалось, пришлось городить огород с созданием и индексацией составного поля.

Модель товара ProductModel

Итак, в предлагаемом примере товар (Product) имеет два атрибута (помимо прочих), по которым надо искать в связке:

  • Name — название товара
  • Color — его цвет
Читать далее Hybris: поиск Solr по составному полю

Добавление Inspections Replace Template в idea

В IntelliJ IDEA существует довольно удобный механизм для автоматической проверки (при необходимости — и преобразования) кода, под название Code inspections. Сложилось так, что мне понадобилось добавить к нему собственное поведение, служащее для замены способа преобразования непустого Optional в его значение внутри стрима (из стиля Java 8 в стиль Java 9+).

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

Читать далее Добавление Inspections Replace Template в idea

Знакомство с компьютерным форумом IT-talk

Года полтора назад я писал заметку про анонимайзеры — Анонимайзер как замена прокси. Проверка анонимайзеров на валидность, посвященную использованию публичных анонимайзеров вместо «классических» прокси. Поднять эту тему я решил после знакомства с публикацией Еще немного про Google Hack, размещенной в блоге Александра «afiskon». Собственно именно с неё и началось моё знакомство с его блогом, я подписался на RSS-канал и с тех пор регулярно его читаю.

Не так давно выяснил, что есть у Александра и свой форум на компьютерную тематику — IT Talk — который сейчас переживает второе рождение после объединения с security-teams.net. Процитирую описание тематитки с самого форума: «Форум о программировании, операционных системах, безопасности, сайтостроении, железе, девайсах, сетях и тп».
Читать далее Знакомство с компьютерным форумом IT-talk

Халявная реклама на twite.ru

Рекалама на twite.ru бесплатно!

Про сервис рекламы (и набора фолловеров) в твиттере, ЖЖ и фейсбуке — twite.ru — знают, полагаю, уже многие. Немало встречается заметок о том, как заработать в твайте (заработок в твайте сравни заработку в GoGetLinks, только вместо ссылок — перепосты и ретвиты). Проблема только в одном — там присутствует постмодерация и в момент вывода средств «наружу» администрация проверит ваш блоггерский аккаунт. Значит, придётся или раскручивать аккаунт под рекламу, или портить рекламой свой личный блог. Ни того, ни другого мне делать не захотелось.

Существует еще одна возможность распорядиться своими средствами на twite.ru — их можно перекинуть на свой «аккаунт рекламодателя», при этом не нужно проходить проверку модераторами, средства остаются в системе. Вывод простой — можно зарабатывать средства на рекламу своего сайта при помощи ботов. И если твиттер-аккаунт для добавления в систему в качестве рекламной площадки нужно минимально раскрутить, то ЖЖ добавляется элементарно и без всяких проверок (хотя для раскрученного ЖЖ-аккаунта естественно выдаются более привлекательные рекламные предложения).
Читать далее Халявная реклама на twite.ru

Perl YAPC::Russia — no threads + новинки Perl 5.14

Две презентации (под катом) с недавно прошедшей конференции YAPC::Russia (посвящённой языку Perl), которые мне захотелось сохранить для памяти.

  • no threads — обзор многопоточности (реализованной через модуль threads) в Perl с замерами скорости выполнения однопоточного и многопоточного приложения. Выводы — многопоточность через threads — не выход, время исполнения больше. Приводятся модули и краткие рецепты для реализации многопоточных элементов приложения, специфичные для каждого из возможных случаев распараллеливания вычислений — повышение производительности Perl-приложения при работе с сетью; при выполнении большого количества дисковых операций; при ограниченных вычислительных ресурсах (один процессор).
  • Что нового в Perl 5.14 — обзор новинок Perl версий 5.12 и 5.14 — самое заметное сжато и в примерах. Неплохая памятка, позволит не отстать от жизни 🙂 Самое заметное на мой взгляд — поддержка Unicode 6.0 и добавление в связи с этим новых модификаторов работы с регулярными выражениями. Ознакомиться и использовать по крайней мере «для себя» — полезно.

Читать далее Perl YAPC::Russia — no threads + новинки Perl 5.14

Mojolicious — знакомство с «вебом из коробки»

Mojolicious - веб из коробки

Что такое Mojolicious. Введение

Благодаря заметке на Хабре (в кэшэ Google) наконец-то решил познакомиться с набирающим популярность фреймворком для веб-разработки на Perl под названием Mojolicious. В общем-то я взял пример скрипта из этой заметки и сделал его чуть более интересным для себя, чтобы охватить немного больше документации по фреймворку (результат вполне работоспособен, его можно посмотреть здесь, а код и скриншот выложены в конце заметки). Сразу отмечу, что ни пример с Хабра, ни мой практически не отражают возможностей фреймворка, а только лишь иллюстрируют простоту его использования.

Итак, Mojolicious — фреймворк для разработки веб-приложений, основанный на «фреймворке для разработки фреймворков» Mojo, написанный на языке Perl человеком по имени Sebastian Riedel, одним из авторов Perl-веб-фреймворка Catalyst, фактически для его замены.

Чем мне показался особенно интересен Mojolicious? Во-первых тем, что он имеет встроенный веб-сервер, что в перспективе позволяет не только удобно разрабатывать и проверять приложение, но и распространять его для локального использования. При этом приложение получается универсальным и будет одинаково работоспособным как на локальной машине, так и на сервере. Во-вторых — Mojolicious зависит только от Perl, что также говорит в пользу «во-первых». В-третьих — наличием модуля Mojolicious::Lite, позволяющего создать лёгкие, маленькие, но полноценные приложения. И в-четвёртых — автоматической поддержкой разных режимов запуска (CGI, FastCGI, mod_perl, встроенный сервер и т.д.).
Читать далее Mojolicious — знакомство с «вебом из коробки»

Сравнение производительности сетевых библиотек в Perl

Когда задумал сделать парсер тИЦ для LJ Add/Remove Fiends — решил для начала проверить, какой способ загрузки страниц с показателями тИЦ из скрипта окажется быстрее, поскольку это в любом случае окажется самым узким местом в производительности парсера (любая обработка уже полученных данных, если она сделана без грубых ошибок типа бесконечного цикла, происходит гораздо быстрее загрузки этих данных по сети).

Для начала проверил на локальной машине (первый тест), затем на сервере (второй тест). Воспользовался модулем Benchmark::Timer, по сути он ставит метки начала и конца, после чего вычисляет разницу между ними (то же самое несложно получить с использованием Time::HiRes). У Benchmark::Timer правда есть дополнительная возможность — он может гонять тест до получения результата с заданной обеспеченностью и заданным процентом ошибки.

Третьим тестом, уже из чистого любопытства (поскольку результат был предсказуем) был тест многопоточной загрузки. Естественно этот вариант оказался быстрее любого из однопоточных, в среднем в два раза (при 15 потоках).

Выводы — библиотеки Perl не только выгодней с точки зрения безопасности, но и работают стабильно быстрее вызовов системных утилит. Самую медленную загрузку показал Wget, основывать парсер на нём — явно плохая идея. Многопточность естественно вне конкуренции. Подробности ниже.

Читать далее Сравнение производительности сетевых библиотек в Perl

Вставка PHP кода в WordPress записи и виджеты

Давно подумывал над тем, чтобы вставлять исполняемый код в посты, страницы и виджеты WordPress. Поскольку сам движок написан на PHP — логично вставлять именно его, хотя можно попробовать встроить например Perl, воспользовавшись CPAN-модулем PHP::Interpreter или PECL-модулем PHP под названием perl. Но PHP вставить естественно проще :).

Итак, как же вставить в WordPress PHP? Как и в большинстве других случаев, когда надо модифицировать движок — просто воспользоваться подходящим плагином.
Плагинов находится множество, я попробовал 4 штуки и остановился на Exec-PHP.
Он умеет всё, что мне было надо:

  • Вставлять исполняемый PHP код в посты (и соответственно — в страницы)
  • Втавлять код в виджеты

Прейдём к настройке плаина.

Настройка может оказаться не совсем очевидной — с административной страницы плагина всё сделать не получится. Чтобы исполнение PHP-кода в WordPress заработало, нужно убедиться в следующем:

  • Что пункт "WordPress должен исправлять некорректный XHTML код автоматически" в меню Настройки->Написание неактивен
  • Что выключен «графический» редактор в меню Пользователи->Ваш профиль (стоит галка на "Отключить «визуальное редактирование» при написании")
  • Что нужной группе пользователей (в WordPress это называется «ролью») разрешено исполнение PHP-кода (для роли «Administrator» должно быть разрешено по умолчанию)

При выполнении вышеперечисленных условий втавленный в записи, страницы и виджеты код должен успешно исполняться. Например мой скрипт для массового добавления друзей в ЖЖ, будучи вставленным в страницу WordPress, успешно работает!

Считаю не лишним напомнить про опасность исполнения неочищенного кода. Не знаю, поддерживает ли PHP какую-то аналогичую perl -T опцию, поэтому нужно просто помнить про очистку пользовательского ввода (использование недопустимых символов, размеры аргументов опций и т.п.), экранирование всех передаваемых в shell команд и их аргументов и так далее.

В остальном польза от встроенного в WordPress PHP кода очевидна — это полная свобода действий с содержимым блога, помноженная на простоту выполнения этих действий!

PHP — Personal Home Page Tools

Общие сведения о PHP

PHP скрипты, сео, курсы, примеры, плагин, wordpress
Язык PHP (Personal Home Page Tools, или, как он теперь называется, PHP: Hypertext Preprocessor) является представителем семейства скриптовых языков программирования. Название у языка говорящее, основная область его применения — разработка различных интернет-приложений (интернет-скриптов) и именно в этой области PHP наиболее распространён.

PHP — краткая история создания

Корнями PHP уходит к Perl, затем интерпретатор языка претерпел изменения в сторону большей веб-ориентированности и был переписан на С. Соответственно, PHP включает в себя черты обоих «родителей» — синтаксис похож на синтаксис С, ассоциативные массивы (хэши) и цикл foreach заимствованы у Perl.

PHP — основные особенности и функции

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

Функции PHP для веб-разработки

Помимо того, PHP обладает богатым набором встроенных инструментов для веб-программирования, среди которых стоит отметить основные:

  • Встроенные массивы данных, в которые автоматически загружаются переменные окружения сервера, а также параметры, извлекаемые из GET и POST-запросов;
  • В язык встроена поддержка основных СУБД (семейство SQL и другие распространённые СУБД);
  • Возможность отправлять HTTP-заголовки в автоматическом режиме;
  • Поддержка работы с сессиями, cookies, HTTP-авторизацией
  • Работа с файлами (в виде сокетов, удалённых и локальных файлов);
  • Обработка форм, включая XForms, обработка загружаемых на сервер файлов;

PHP и графические приложения

Кроме своего прямого предназначения — создания веб-страниц, PHP также может использоваться для разработки кросс-платформенных графических приложений, среды для разработки которых так же, как и сам язык, распространяются на условиях open-source.

Пример кода на PHP — создание и обработка веб-формы

Ниже приведён пример кода на PHP, выполняющий обработку html-формы. В примере пользователь вводит имя и выбирает пол, после чего нажимает кнопку «Ответить». PHP-скрипт получает данные из формы, производит над ними заданные действия и распечатывает результат в браузер.

Проверка имени пользователя не осуществляется, поскольку данные из формы никуда дальше не иду, но если вы планируете передавать их в рабочий скрипт или в системную утилиту — не лишним будет сделать проверку регулярным выражением (навроде такого: /^ [^/\.$?&*] $/ix) для отсечения ввода символов, которые в имени встречаться не должны. А при передаче системным утилитам пользовательского ввода — дополнительно использовать escapeshellarg.

Пример веб-формы

Как тебя зовут: ?
Ты или ?


Код для обработки формы на PHP


<form name="PHP_example_web_form" action="" method="post">
<table rows="2" cellspacing="8" cellpadding="4">
<tr><td>Как тебя зовут: </td><td><input type="text" name="u_name" value="" size="10" maxlength="20" />?</td></tr>
<tr><td>Ты <label><input type="radio" name="sex" value="m" checked="checked">мальчик</label></td>
<td> или <label><input type="radio" name="sex" value="w">девочка</label>?</td></tr>
</table>
<input type="submit" value="Ответить" />
</form>

<?php
// если в скрипт было что-то передано - начать обработку
if(count($_POST)>0){
// если переданное имя пользователя не пустое - продолжаем
if(count_chars($_POST['u_name'])>0){
unset($prefixes_m); // на всякий случай очистить массив
unset($prefixes_w); // то же

// если пол указан как мужской - выбрать прилагательное в мужском роде
if($_POST['sex'] === 'm'){
// массив с прилагательными
$prefixes_m = array('мужественный', 'великий', 'сообразительный', 'учёный', 'хитрый');
// выборка случайного элемента из массива
$prefix = $prefixes_m[rand(0,count($prefixes_m) - 1)];
}
// иначе если пол - женский - выбрать прилагательное женского рода
elseif($_POST['sex'] === 'w'){
$prefixes_w = array('прекрасная', 'нежная', 'восхитительная', 'обаятельная', 'неповторимая');
$prefix = $prefixes_w[rand(0,count($prefixes_w) - 1)];
}

// распечатать результат
print '<br /><hr><p>';
print '<div title="Приветствие" class="php-test" contenteditable="true">';
print 'Привет, '.$prefix .' '. $_POST['u_name'].'!';
print '</div></p>';
} // конец обработки имены
} // конец обработки формы
?>

Автоматическая проверка готовности загранпаспорта

Гос. органы идут в массы, постоянно вводят новые, удобные для граждан (по крайней мере на первый взгляд), формы взаимодействия.
К такому нововведению можно отнести и сервис проверки готовности загран. паспорта на сайте УФМС, расположенный по адресу http://www.ufms.spb.ru/checkzp.php. С помощью сервиса можно быстро узнать, готов ли загран. паспорт или еще находится в процессе оформления, введя в поля формы данные своего гражданского паспорта (также доступна проверка по данным из свидетельства о рождении).

Всё в принципе хорошо и удобно кроме одной мелочи — чтобы воспользоваться проверкой готовности — нужно периодически вспоминать о ней и заходить на сайт. По-моему, приделай УФМС автоматическое оповещение о готовности паспорта по электронной почте — сервис выглядел бы законченным и действительно удобным в использовании.

Но раз УФМС не идет на встречу гражданину, значит гражданин должен сам облегчить себе жизнь. Я решил сделать это используя три простых и доступных инструмента: консольный браузер lynx (для отправки данных формы POST-запросом), планировщик заданий cron (для периодической проверки готовности загран. паспорта) и утилиту поиска по тексту grep (для поиска нужной строки в дампе страницы), для чего написал простенький скрипт, который закинул в cron. Скрипт с указанным в кроне периодом проверяет готовность моего паспорта и присылает мне отчет на электронную почту (которая указана в настройках крона).


#!/bin/sh
echo "checkser=p&seriap=XXXX&numberp=YYYYYY&submit=%CF%F0%EE%E2%E5%F0%E8%F2%FC" | lynx -post_data -dump http://www.ufms.spb.ru:80/checkzp.php | grep 'Ваш заграничный'

Вместо ХХХХ нужно подставить серию своего гражданского паспорта (макс. 7 символов, что, как я понимаю, позволяет использовать серии старых паспортов, с римскими цифрами), а YYYYYY заменить соотв. на его номер (макс. 6 символов). Если запускать скрипт из-под английской локали, то шаблон для grep надо изменить с ‘Ваш заграничный’ на ‘Vash zagranichnyj’, поскольку скрипт отдаст страницу в латинице.

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

Дополнение:
Если сайт проверки готовности загранника постоянно «радует» сообщением о превышении числа запросов, можно пропустить их через tor. В этом случае удобно будет воспользоваться другим способом отправки форм POST-методом из lynx — записать автоматический скрипт, который и будет осуществлять проверку.

Посутпаем следующим образом:

  1. вызываем lynx с ключем cmd_log=имя_файла_куда_сохранить_скрипт:
    lynx -cmd_log=script_name http://www.ufms.spb.ru:80/checkzp.php,
    вводим серию и номер паспорта, отправляем запрос, дожидаемся загрузки страницы с ответом и закрываем браузер.
  2. в дополнение к tor устанавливаем torsocks — утилита несколько сырая, но дело своё делает исправно, перенаправляя траффик на tor (можно естественно использовать любой понравившийся прокси, указав его в качестве умолчального export http_proxy="address:port").
  3. вызываем lynx через torsocks или выбранный прокси с указанием использовать для автоматизации отправки данных формы записанный ранее файл скрипта с передачей результатов работы на разбор в grip:
    torsocks lynx -cmd_script=script_name http://www.ufms.spb.ru:80/checkzp.php | grep «Ваш заграничный»

Всё, автоматизация проверки готовности заграничного паспорта успешно проведена! Пока скрипт работает за человека, человек может расположиться у телевизора и спокойно отдохнуть :)