Category Archives: Мысли вслух

Синонимы в SOLR – заметки на бегу

Written by elwood

Прочёл статью http://nolanlawson.com/2012/10/31/better-synonym-handling-in-solr/. И есть некоторые мысли по этому поводу.

Парень пишет что можно включать SynonymFilterFactory на query и index. В query не работают синонимы из нескольких слов и неправильно бустятся документы, содержащие редкие синонимы (которые по идее должны быть внизу). А в index – ну понятно, распухает индекс, плохо ищется всё и подсветка лагает. Дока по солру таки-рекомендует юзать путь через index. В общем ему пришлось патчить query-парсер чтоб заработали синонимы из нескольких слов.

Моё мнение – в index нельзя врубать синонимы, потому что это концептуально неверно, и порет содержимое документов. Думаю, это в общем довольно сильно портит релевантность, и странно, что этот момент он не описал. Синонимы должны отрабатывать на query, конечно. То, что не пашут синонимы из нескольких слов – это баг солра, должно настраиваться так, чтобы такие синонимы тоже работали. Но в принципе этой штукой можно пренебречь, так как синонимов из 2 слов не больно и много (мы ж не Яндекс делаем). Плюс, он почему-то в качестве синонимов приводит странный пример “собака-дворняга” ну это какбэ не больно и синонимы. Синонимы в солре в моем понимании это вещи, которые на 99% эквивалентны. Айфон и iPhone. И для них проблема буста отпадает. А вообще для решения проблемы с бустом редких синонимов можно применить приём – скопировать поле в поле_exact и добавить по нему дополнительный вес. То есть если запрос точно совпадает с содержимым документа, этот документ будет выше. Соответственно, все синонимичные доки будут ниже, что и требуется.

Так что всё норм. Надо только научить солр парсить синонимы-фразы из запроса. Но в нашем случае даже это не нужно. А вот что реально нужно – учёт словоформ (стемминга) – почему-то у него не отражено в статье. Но в принципе у меня стоит стеммер по словарю OpenOffice + стеммер лайтовый, и он умеет понимать, что “айфонов” == “айфон” == “iPhone”.

Исследование Chrome Secure Shell

Written by elwood

Узнал о приложении Secure Shell – ssh-клиенте и эмуляторе терминала, работающем в броузере. Меня удивило, что эта штука, написанная на js, действительно работает – неужели протокол ssh с шифрованием действительно был реализован на javascript? Или он проксирует данные через внешний сервер, передавая туда сочетания клавиш, а обратно получая команды для эмулятора терминала в plain text ? При этой мысли по спине пробежал холодок. Я только что подключался к одному серверу и ввёл там правильный пароль. Если догадка верна, то мой пароль мог легко попасть к злоумышленникам. В общем, пришлось поковырять поглубже, чтобы выяснить, как всё работает.

После изучения FAQ, исходников и файлов, поставляемых с расширением, выяснено было следующее:

  • Это приложение написано в рамках проекта Chromium OS, и его исходники открыты.

  • Оно действительно написано на js, но реализации ssh в нём нет, но есть нативный плагин, встроенный в расширение при помощи технологии Native Client. В нём-то и лежит реализация ssh-протокола, а доступ к нему осуществляется через джаваскриптовое API, предоставляемое броузером Google Chrome.

  • Но механизм проксирования также присутствует ! Называется он Relay Server, и иногда работает. Из документации непонятно, при каких ситуациях используется именно этот режим. Написано что по умолчанию используется native client, но можно и специально заставить использовать relay, указав его опции в строке Relay options. Почему-то списка доступных настроек найти не удалось. По исходникам тоже непонятно, в каком случае используется native client, а в каком – relay server. Исходные коды гуглового relay сервера закрыты, в комментариях написано, что “Вы можете написать такой сервер сами, вам достаточно зареверсинжинирить такой-то js-файл”.

  • Есть джавский relay-сервер в открытых источниках: https://github.com/zyclonite/nassh-relay/
    Демосервер, на нём можно проверить работу https://relay.wsn.at/

    Заодно мы узнаём опции, которые нужно добавить в строку relay options:

    --proxy-host=relay.wsn.at --proxy-port=443 --use-ssl

    Решил проверить этот сервер, не вводя там правильного пароля – всё заработало, но строка Loading Native Client всё равно смущает. Попробовал удалить ssh_client_nl_x86_64.nexe, после этой операции Secure Shell не хотел подключаться, хотя опции для релея были.

  • Вот ещё один relay-server, здесь уже на пейтоне: https://github.com/raptium/hashi

    Выглядит очень лаконично, по сравнению с джавской реализацией. Заодно узнаём ещё один способ задания relay-server:

    To connect via the relay server, use USER@SSH_SERVER[:SSH_PORT]@RELAY_SERVER as the destination in the secure shell.

  • Native Client – очень интересная фигня. Файлы nexe, поставляемые с расширением, разные для разных процессорных платформ, но одинаковые для операционных систем. То есть ssh_client_nl_x86_64.nexe может успешно использоваться и на Windows, и на Linux, и на Mac OS X, главное чтобы система была 64-битная. Это обстоятельство меня смутило, т.к. проводя первичный осмотр в Total Commander, я обнаружил, что эти файлы начинаются с ELF, а значит, что это либо работает только на линуксах, либо где-то дальше в файле лежат нативные файлы в других форматах – PE, dylib. Такой типа самопальный fat executable. Но всё оказалось ещё интереснее. Выяснилось, что гугл в этом месте не хранит нативный готовый код, а какой-то байткод, получаемый на выходе nacl-toolchain. В сети упоминался байткод LLVM, но тут пока неясно, в чём отличие pexe от nexe. pexe не зависит от платформы, nexe-зависит. Интересно, чем они отличаются внутри. С этим пока разобраться не удалось.

    Дополнительный прикол заключаются в том, что эти бинарники безопасны, хотя и содержат нативный код. Дело в том, что они могут быть собраны только с теми библиотеками, которые портированы в nacl-ports. А верификатор броузера при загрузке этого кода проверяет, не содержит ли он потенциально небезопасных инструкций – к таким, например, относятся syscall и int.

Общий вывод

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

Впечатления от KDevelop

Written by elwood

KDevelop-logo

Ковыряясь с багом в Konsole, попробовал “родную” IDE для программирования под KDE – KDevelop. Мне нужно было чтобы IDE умела:

  • Импортировать проект из cmake-файла
  • Редактировать C++ код с более или менее удобной навигацией
  • Собирать проект, желательно одной кнопкой
  • Запускать проект в отладчике, желательно одной кнопкой

Сначала думал попробовать Eclipse, так как нашел в сети инфу о каком-то плагине, который по cmake-файлу умеет генерировать eclipse project, но в jabber конфочке мне подсказали, что KDevelop умеет это делать из коробки.

В общем, с первым пунктом KDevelop вполне справился. Единственное замечание: импорт не работает, если вы выбираете папку с проектом, к которой у KDevelop нет доступа. Я скачал исходники из-под рута, а KDevelop был запущен под обычным пользователем. Проблема заключается в том, что KDevelop не сообщает о сути ошибки, а просто молча ничего не делает. Возможно, эта проблема уже исправлена в более свежих версиях (я работал с KDevelop в Debian, в который как известно, попадают не самые свежие версии пакетов). Работает также импорт из обычных make-файлов (которые появляются после выполнения ./configure). Так я сымпортировал туда же проект xterm (то есть для обычного make сначала нужно выполнить ./configure, а потом импортировать проект в KDevelop).

KDevelop-overview

Второй пункт тоже отработал замечательно – навигация по С++ действительно хороша, IDE умеет переходить не только по Ctrl+Click к объявлению функции, но и по клику на сигнатуру объявления функции – к её определению. Также хорошо показываются комментарии к функциям. Есть навигация вперёд-назад по Cmd+Right/Left. Тела макросов показываются при наведении мышкой. Неприятный момент: если отсутствуют нужные библиотеки, их инклуды подсвечиваются красным, и после установки требуемых заголовочных файлов это уже не исправляется, пришлось перезапускать IDE. Впрочем, это мелочь.

При сборке проекта нужно сконфигурировать хитрое окошко. В качестве исполняемого файла, который будет запускаться, можно выбрать таск, определённый в make-файле:

KDevelop-Launches-1

А можно выбрать просто путь к исполняемому файлу, который появится в результате сборки:

KDevelop-Launches-2

Для отладчика мне хватило прописать “gdb”:

KDevelop-Launches-3

Вообще, я не шарю в том, как устроены make-файлы, и для меня то, как KDevelop определяет по названию таски то, что мне действительно нужно запустить, тайна. Как-нибудь, может быть, разберусь и в этой загадке мироздания.

Кнопка Build selection вроде бы должна собирать только тот проект, который у меня сейчас под курсором мыши, но почему-то собираются все проекты. Непонятно, но фиг с ним, думается, что в противном случае было бы больше проблем.

Debug запускает выбранный Launch под отладчиком. С Konsole такое почему-то не заработало, но можно было сначала нажать Execute, а потом приаттачиться к процессу. Отладчик вполне работоспособен, хотя трассировка хромает не по-детски. Лучше ставить брейкпоинты. Несколько раз вылетало в одном и том же месте (gdb слетал, программа продолжала работать) – при наведении мыши на локальную переменную, которая должна содержать строку в unicode. Потом вроде починилось, но осадок остался. Видимо, отладка ещё довольно сырая, и уповать на неё не стоит.

В целом, впечатление хорошее. Раньше я для написания мелких тестовых программ на Си пользовался CodeBlocks, теперь, наверное, буду использовать KDevelop. В первую очередь, из-за хорошей поддержки make и cmake и удобной навигации по коду.