вторник, 6 октября 2015 г.

Нечёткий поиск с Elasticsearch

Что такое Elasticsearch прекрасно описано в wikipedia, поэтому здесь это описывать не вижу смысла. Совсем кратко и на свой лад — замечательная штука для поиска по большой базе (десятки тысяч документов, но не миллиарды) с возможностью нечёткого поиска, т.е. в запросе могут быть ошибки, опечатки, пропуски или даже не та раскладка. Замечательность elasticsearch'а в простоте разворачивания, простоте наполнения базы и простоте поиска.

Перед началом работы нужно установить Elasticsearch из пакетов, либо скачать архив и распаковать. После остаётся его запустить (bin/elasticsearch) и можно смотреть в браузере (http://localhost:9200/) как оно работает.

Для "потестить" можно всё делать через браузер/curl.

Добавление документа
$ curl -XPUT 'http://localhost:9200/test/doc/1' -d '{"name":"имя пользователя"}'
здесь
    test — индекс
    doc — doc_type (можно считать подиндексом индекса)

Поиск
$ curl -XGET 'http://localhost:9200/test/doc/_search?pretty=true' -d '{"query":{"fuzzy":{"name":"плзователь"}}}'
Ну или смотрим в браузере
(pretty=true в запросе просто чтобы в ответ получить json не в одну строку, а нормально отформатированный)


Для работы с Elasticsearch из python'а есть "родной" модуль elasticsearch и сторонний pyelasticsearch. Сторонний появился чуть раньше официального, но с определённой версии работает через официальный (т.е. для работы с ним нужно ставить оба модуля), развивается и дальше и старается быть более pythonic, нежели официальный.


понедельник, 5 октября 2015 г.

Свой startup script for systemd

Мне для работы удобно использовать виртуалку VirtualBox в качестве виртуального разработческого сервера. Легко конфигурируема, легко переносима, максимально изолированное окружение и в основную систему нет необходимости ставить пакеты, нужные только для проектов. Опять же — никаких конфликтов версий имеющегося ПО. Так как в качестве редактора я использую Komodo Edit, который отлично ходит по SSH, то неплохо бы всегда иметь активную виртуалку, а ответственность за её запуск возложить на кого-нибудь ещё, и не контролировать это дело самостоятельно. Отсюда и возникла необходимость в своём скрипте для systemd:


/etc/systemd/system/virtualbox.centos7.service

[Unit]
Description=VBox "centos7"
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/VBoxHeadless -s centos7 --vrdp=off
ExecStop=/usr/bin/VBoxManage controlvm centos7 acpipowerbutton
RemainAfterExit=no
User=george
TimeoutStopSec=8

[Install]
WantedBy=multi-user.target


Остаётся выполнить 
$ systemctl enable virtualbox.centos7
и виртуалка сама стартует при включении и гасится при выключении компьютера.

вторник, 25 августа 2015 г.

Убрать …received a naive datetime while time zone support is active

Просто чтобы не забыть. Вдруг опять пригодится.

При заполнении базы данными (в моём случае с default=datetime.now в модели) django может сыпать варнинги:
DateTimeField ModelName.field_name received a naive datetime while time zone support is active.

Так как в моём случае это бесполезная информация :) , то нужно просто отключить ругань в консоль. Делается добавлением кода:

import warnings
warnings.filterwarnings(
        'ignore', r"DateTimeField .* received a naive datetime",
        RuntimeWarning, r'django\.db\.models\.fields')

вторник, 18 августа 2015 г.

OpenSSH 7. Возвращаем авторизацию по ключам

Return simple authorization by public keys

У меня на большинство серверов настроена авторизация по ключам. Удобно — один раз разблокировал связку ключей и ходишь по серверам не отвлекаясь на ввод паролей. Когда пароли на все сервера разные, это действительно удобно.
Но после обновление ssh до 7 версии у меня вдруг постоянно стал запрашиваться пароль при подключении к серверам, как будто никаких ключей и не было никогда прописано. Либо я один с такой проблемой, либо просто обновился рано, но готового ответа нагуглить не удалось, а решается всё просто.
В новой версии добавилась опция PubkeyAcceptedKeyTypes (ссыль), без которой имеющиеся ключи стали игнорироваться.
Идём в /etc/ssh/ssh_config и добавляем PubkeyAcceptedKeyTypes=+ssh-dss . Всё. Опять авторизация по ключам работает.


Проверить причину "неавторизации" можно включением дебага (или verbose) при попытке коннекта:
$ ssh -v hostname

В моём случае в выводе присутствовало:
debug1: Skipping ssh-dss key /home/george/.ssh/id_dsa for not in PubkeyAcceptedKeyTypes
debug1: Next authentication method: password


Dirty tags ;) : ssh ignore keys, ssh want password, enable ssh key logon