вторник, 13 декабря 2011 г.

Django: value too long for type character varying(50)

Попал на непонятно откуда вылезающую ошибку "value too long for type character varying(50)". Оказалось - в Meta у модели слишком длинное название было (verbose_plural). В следствии чего django не мог создать права для app.

среда, 2 ноября 2011 г.

Munin-node-win32. Баг с внешними плагинами.

История такова: очень не хотелось писать плагин для Win-сервера, однако пришлось. Хитрый плагин считывает лог веб-сервера и в результате я получаю графики времени генерации страниц сайта. Я отслеживал некоторые тяжелые страницы.

Однако всё испортил баг в munin-node-win32!

А именно - сервером мунина не считывался конфиг плагина из-за перевода строки windows-way.

Ужас. Пришлось поставить Visual C++, взять с github'а исходники, исправить их, скомпилировать... И вот он - http://github.com/funvit/munin-node-win32

Исполняемый файл - в каталоге Release. Всё работает, проверил в win 2003 server.

среда, 22 июня 2011 г.

CentOS. MySQL - ошибка при запуске (481)

В очередной раз поднимая очередной сервер, попал на ошибку запуска mysql. Ругался, что файл переводов ошибок содержит только 480 строк, а нужно - 481.

Как оказалось, установилась версия 5.0.92 из репозитория CentALT.

Так вот, если отключить репозиторий (я просто файл репозитория убрал) - то ставится 5.0.77, которая нормально запускается!

вторник, 21 июня 2011 г.

CentOS 5. Установка nginx

Сперва подключить репозиторий
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

потом установить
yum install nginx

среда, 8 июня 2011 г.

Gitolite - добавление пользователя

Добавить пользователя или другое рабочее место (например - лаптоп) - легко:

1. Сгенерировать rsa ключ
2. скопировать его на сервер в папку tmp
3. переключиться на пользователя, на котором успановлен gitolite (у меня - git)
sudo su - gitolite
4. добавить ключь gl-setup /tmp/user.pub

все!

вторник, 17 мая 2011 г.

пятница, 6 мая 2011 г.

Django + MongoDB

Рабочая связка

* django-nonrel
* django-mongodb-engine
* djangotoolbox (setup.py mongo-engine поставит сам)
* permission-backend-nonrel (вернет группы и права в систему доступа)

Работает админка. У моделей можно использовать OneToOneField и ManyToManyField.

Обязательно в settings.py добавить:
* djangotoolbox
* permission_backend_nonrel

Модели пишутся стандартно.

Минус - у моделей всегда id=ObjectId. Не смотрел, возможно ли это изменить.

Локализация

Русская локализация работает только если локаль в settings = ru.

Не забывать:
* создать каталог locale в корне проекта
* django-admin.py makemessages -l ru (создает файл для переводов)
* django-admin.py compilemessages

Начальная установка проекта

django-admin.py startproject mySite
правка settings.py
django-admin.py syncdb
зайти через консоль монго в django_site и выбрать id сайта ( db.django_site.findOne() ) - он нужен в settings (пример: "4dc3b2ef8ddf87288d00001d").

четверг, 24 марта 2011 г.

MongoDB обновление множества записей

Обнаружил неприятную особенность. При частом использовании:

update(
    query={Field:{$in:[x],$nin:[y]}},
    update={$addToSet:{Field:z}},
    multi=true
}

монго плодит кучу под-процессов (и соединений) и сильно лочит коллекцию. Что приводит к 90% локу и зависанию скрипта.

Скрипт - в цикле обновляет поля.

Помогает использование вместо мулти-обновления - обновления каждой записи по одной (под-цикл в скрипте).

Gitolite - удобно!

Очень советую использовать на сервере с git-репозиториями gitolite. Инструкция. Обязательно ставить под пользователем git.

Gitosis у меня не заработал - при push выдавал неизлечимую ошибку.

четверг, 10 февраля 2011 г.

Clodo.ru - не оправдывает моих надежд

Вчера (9.02.2011) была последняя капля. LA достиг 10 и машина умерла. В панели весело отображалось 2ТБ из 15 ГБ диска. Это интересно как???

Кроме того, когда я поднял минимум памяти с 512 до 1,5 ГБ и перезапустил сервер - ничего не изменилось. Как было 512 так и осталось (т.е. выше никак не росло).

Сегодня опять мой скрипт довел сервер до la 8.

Срочно уползаю на selectel.ru! Там la нормально держится на 3-4 и память честно выделяется...

среда, 9 февраля 2011 г.

Clodo.ru - обязательно ставьте fail2ban.

Сегодня слегка озадачился - а не атакуют ли мой сервер (который вообще то никак не фигурирует в интернете)?

sudo cat /var/log/secure* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort | uniq -c

232 Feb 1
800 Feb 2
 15 Feb 4
 15 Feb 7
238 Feb 8

Ого!!! Срочно ставлю fail2ban!

Шаги такие:
1. поставить пакет (yum install fail2ban)
2. настроить конфиг (ssh jail, проверьте правильность имени файла лога!)
3. прописать емаил для рута (sudo vi /etc/aliases)
4. включить fail2ban (/etc/init.d/fail2ban start)
5. добавить его в init.d (chkconfig fail2ban on)

P.S.: проверьте - установлен ли sendmail (/usr/sbin/sendmail)!

четверг, 3 февраля 2011 г.

YML и СЕОшные развлечения

По работе столкнулся с интересной ситуацией - многие интернет магазины используют трюк с подменой символов в названии товаров. Т.е. есть слово "cумка". Они заменяют букву "с" на английскую "c".

Зачем? Да вот какой-то гений понял, что это даст больше уникального контента для поискового робота. Ладно. Всё по-умному - заменяют только в названии товара, а в описании обязательно дублируют слово в правильном виде.

Кому интересно - вбейте в поисковики (советую гугл) "сумка" (и замените первую букву). Результат вас поразит.

Но всё бы хорошо, но эти горе-сеошники совсем не понимают, что они портят контент сайта. Почему? Да потому что, когда интернет-магазин вдруг решит работать с Яндекс-Маркетом... Да, да! Название товара то - уникальное... И кривое.

Хотя возможно яндекс это знает и заменяет обратно. Но вот мне дают xml-файл. Я его обрабатываю и вижу битые слова. И мне приходится как то это решать!

П.С.: Намного проще было бы сео-умникам пнуть своих программистов, что бы те написали ма-а-аленький скрипт...

понедельник, 17 января 2011 г.

MongoDB. Реализация транзакции между двумя коллекциями.

Привычной SQL-транзакции в mongodb нет. Однако есть атомарные команды для изменения документа (одного!). Что позволяет реализовать двойную бух-запись.

Пример: есть коллекция организаций и журнал сумм на списание с организаций.

Получается такая реализация:

Вместо выполнения всей sql-транзакции - в коллекцию журнала добавляется запись о списании суммы с организации. Всё. Остальное - делает робот-скрипт (в этом примере - он работает строго в один поток!)

Что делает робот:
1. Находит не обработанную запись в коллекции журнала
2. В коллекции организаций у соответствующей организации за одну команду изменяется баланс и лог-поле (типа LogId + TimeStamp) Важно!: предварительно нужно проверить - не совпадает ли идентификатор журнальной записи с LogId. Если совпало - то значит скрипт запущен после сбоя, и уменьшать баланс не надо!
3. В коллекции журнала записи добавляется флаг "Обработана"=true

На 2 и 3 шаге нужно проверять getLastError(safe-mode) - если произошла ошибка - можно повторить шаг (только не бесконечно, а, например, 10 раз. если все плохо - то нужно как-то оповестить админа или программиста).

Это - очень упрощенный вариант. Только для понятия логики.

пятница, 14 января 2011 г.

MongoDB + Munin = графики

На сайте mongodb оказалась не работающая (для меня) инструкция. Покопав гугл нашел решение:

Плагины нужно скопировать в /usr/share/munin/plugins
и сделать симлинки по пути /etc/munin/plugins
потом проверить конфиг ноды:

munin-node-configure
...
mongo_btree                | yes  |
mongo_conn                 | yes  |
mongo_lock                 | yes  |
mongo_mem                  | yes  |
mongo_ops                  | yes  |
...

перезапустить ноду:
sudo /etc/init.d/munin-node restart

Вот теперь на веб-странице графиков появилась группа mongodb.

P.S.: https://github.com/erh/mongo-munin/