пятница, 17 декабря 2010 г.

CentOS: почтовые алиасы. Установка е-майла для root.

sudo vi /etc/aliases # задать алиас root: <мой e-mail>
sudo newaliases
echo "hello from `hostname`" | mail -s "test" root

Django | Стандартные цвета оповещений

Часто в каких-то своих проектах приходится писать свою систему оповещений (notifications) на сайте. И лучше использовать стандартное оформление, например из Django:

.information {
background: #dedfff;
color: #406299;
border-color:#5b7299;
}
.error {
background: #ffe1da;
border-color: #f34f4f;
color: #be0b0b;
}
.success {
background: #e2f9e3;
border-color: #9c9;
color: #080;
}
.warning {
background:#fff8bf;
border-color: #ffd324;
color:#eb830c;
}

суббота, 23 октября 2010 г.

Amazon. Виртуальные машины. Про дисковое пространство.

Оказалось, что в описании машин устаревшая информация о размерах дисков. Я долго ломал голову и пробовал уменьшать образы (к слову - это были тестовые образы по 20 - 40 гиг, и использовал я micro-instance, т.к. это самый дешевый вариант для тестов)... Но после уменьшения - машина либо не стартовала, либо не отвечала по ssh (что скорее всего означало то, что опять таки не запустилась).

Вобщем я рискнул и создал High Memory Extra Large, в инфо о котором написано о 420 Гиг диске. Выбрал образ Amazon 64bit. Ну и к моей радости после добавления я увидел, что к машине подключен образ всего то 10 Гиг! Ура!

Смысл в том, что мне не нужно было указанных 420 Гиг, а нужно было всего то 100-200. И очень не хотелось платить за излишек. Так что теперь и не придется.

Однако стоит упомянуть и про увеличение размера диска. Так вот - увеличение работает! Шаги :
  1. Сделать snapshot с нужного образа
  2. Сделать новый образ из snapshot`а, при этом будет возможность изменить размер
  3. Заменить исходный образ или подключить новый к машине
  4. Подмонтировать новый диск в lunix`e (странно, но при использовании образа амазоновского линукса, диски монтируются как xvda вместо sda)
  5. Воспользоватся resize2fs утилитой

Все! После - нужно перезапустить машину. Да, кстати, увеличивать можно даже тот образ, с которого загрузилась машина.

среда, 13 октября 2010 г.

MongoDB. Составные индексы.

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

Т.е. нет нужды как в SQL делать по несколько индексов (по разному составленных)!

UPDATE:
Пример:
Есть индекс A,B,C. Так вот, в запросах по A или A,B - будет работать индекс! А вот для B или B,C - нет.

вторник, 12 октября 2010 г.

1gb.ru + SSH = UTF-8? Решение

Что бы при работе через SSH правильно работала кодировка UTF-8 - нужно в ~/.bashrc добавить:
export LANG=ru_RU.utf8

VIM. Меню для смены кодировки

В vim можно создавать свои меню и если добавить в .vimrc следующие строки:
set wildmenu

set wcm=<Tab>

menu Encoding.koi8-r :e ++enc=koi8-r ++ff=unix<CR>

menu Encoding.windows-1251 :e ++enc=cp1251 ++ff=dos<CR>

menu Encoding.cp866 :e ++enc=cp866 ++ff=dos<CR>

menu Encoding.utf-8 :e ++enc=utf8 <CR>

menu Encoding.koi8-u :e ++enc=koi8-u ++ff=unix<CR>

map <F8> :emenu Encoding.<TAB>

То по нажатию F8 можно будет выбрать из меню, в какой кодировке редактировать текущий файл. По-моему, очень удобная фича.

Оригинал

среда, 29 сентября 2010 г.

Ubuntu-server | Cherokee web-server & RRDTool

В последних версиях (>1) замечательно интегрированы графики. Только вот при установке через apt-get почему то не устанавливается libplugin_rrd.so. Решение простое
sudo apt-get install libcherokee-mod-rrd

четверг, 26 августа 2010 г.

CouchDB | Если вдруг падает и не запускается...

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

CenoOS 5 + CouchDB 1.0.1. Как скомпилировать.

Удалось скомпилировать CouchDB 1.0.1 на CentOS 5.

Основная сложность была в том, что бы найти js библиотеку SpiderMonkey. А она - тут.

Компилировать так:
make BUILD_OPT=1 -f Makefile.ref && cp *.{h,tbl} /usr/include/ && cd Linux_All_OPT.OBJ && cp *.h /usr/include/ && mkdir -p /usr/{bin,lib}/ && cp js /usr/bin/ && cp libjs.so /usr/lib/

CouchDB компилируется как обычно
./configure
make
make install

вторник, 10 августа 2010 г.

Ура! Удалось на Centos 5 запустить cherokee + uwsgi

Наконец то получилось запустить это связку под Centos 5 (2.6.27.41-170.2.117.fc10.i686.PAE).

Версии:
  • Cherokee: 1.0.8
  • uwsgi: uWSGI 0.9.6-dev (скомпилировано под Python 2.6)

Все скомпилировано из свежих репозиториев. Ранее у меня не получалось настроить чероки - визард не находил uwsgi. Сейчас в новой версии - все супер!

FaceBook. fb:comments и страницы с русскими УРЛами.

Столкнулся с добавлением на сайт комментариев через API Facebook`а. В результате - пришлось прикрутить их javascript-API код.

Но получилась большая проблема - на страницах с русским УРЛом комментирование не работало. После нажатия на кнопку "Отправить" вылезало сообщение "Temporary error". Случайно обнаружил, что на страницах с английским УРЛом все работает. Стал копать описание. И смотреть, что отрисовывает API. И заметил, что в скрытом инпуте "xid" - мой русский урл! Ага! Почитав документацию понял, что это - уникальный ID страницы.

Так что решение простое - в fb:comments добавить xid="[тут_английский_id]". На моем примере - id получился article_134.

вторник, 3 августа 2010 г.

Ubuntu 10.04 Восстановление оконного менеджера и иконок на рабочем столе

Вчера "прошел квест" - восстанавливал оконный менеджер и иконки на десктопе. Так как в результате удаления какого-то софта, что то важное отвалилось. И я остался без десктопа - не было ни иконок, ни меню по правой кнопке. И у окон пропало оформление - рамка и кнопки с заголовком.

Как оказалось, оконный менеджер в последних версиях - это compiz. А декстоп - это наутилус, просто загруженный в стартапе.

Решение - добавить в "запускаемые программы" compiz и nautilus. Я думаю, что при первой инсталяции они прописаны где-то еще на запуск. Но и такой способ - вполне оправдан.

пятница, 9 июля 2010 г.

dot.Net c# - Подрезка и изменение размера изображения.

System.Drawing.Image image = System.Drawing.Image.FromFile(src);  
int srcWidth=image.Width;
int srcHeight=image.Height; 
int thumbHeight=(srcHeight/srcWidth)*thumbWidth;
Bitmap bmp = new Bitmap(thumbWidth, thumbHeight);  

System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp); 
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality  ; 
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 

System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, thumbWidth, thumbHeight);
gr.DrawImage(image, rectDestination, 0, 0, srcWidth, srcHeight, GraphicsUnit.Pixel);  

bmp.Save(dest); 
  
bmp.Dispose();
image.Dispose();

пятница, 23 апреля 2010 г.

MSSQL Managment studio - ошибка 0xc0010014 при добавлении нового плана

Понадобилось мне добавить новую задачу на MSSQL сервер. Решил воспользоваться графическим редактором студии. Элемент бросается перетаскиванием, но при попытке его редактировать - вылезает ошибка 0xc0010014.

Нашел лечение:
%windir%\syswow64\regsvr32 "%ProgramFiles(x86)%\Microsoft SQL Server\90\dts\binn\dts.dll"

среда, 14 апреля 2010 г.

IIS6+ nginx на одной машине

В связи с хайлоадом (перегрузкой) сервера с IIS6, решил посмотреть, что будет, если закрыть iis nginx`ом. И статичные файлы отдавать тоже nginx`ом. Однако что то не срослось - и iis не сбавил темпов загрузки процессора. Nginx вообще его не кушал.

пятница, 2 апреля 2010 г.

nginx под win32 как сервис

Nginx - штука гордая. Особенно под windows. Запускать нужно через start, чтоб отдельный процесс запустился. Озадачился запускать nginx как сервис. Проще всего через утилитку cygrunsrv.exe.

Тут тоже свои шаманства:
cygrunsrv.exe --install nginx -p c:\nginx\nginx.exe --neverexits -a "-p c:\nginx"

Ключ --neverexits нужен, т.к. nginx "форкается" (порождает отдельный процесс).
Ключ -a нужен что бы передать путь, где находится сам nginx. Иначе не найдет куда писать логи.

А вот прикрутить ротацию логов пока не получилось, ругается, что не может найти какой-то файл (смутно думаю, что пид-файл)

reload_logs.bat:
cd c:\nginx\logs\
ren access.log access-%DATE%.log
ren error.log error-%DATE%.log
cd ..
nginx -s reopen

четверг, 11 марта 2010 г.

XSL - ужас!

XSL - шаблоны. Вроде удобно, понятно. Циклы, проверки, подгрузка шаблонов. Но... как сделать обычный HTML-комментарий? Шаблонизатор съедает его!

Оказалось нужно
<!-- я коммент -->
мутировать в ужас:
<xsl:text disable-output-escaping="yes">&#60;!-- я коммент --&#62;</xsl:text>

Омг! И скрипты... тоже... нужно мутировать...

среда, 3 марта 2010 г.

Python 2.6 в CentOS5

Подсмотрено тут.

wget http://python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2

tar -xjf Python-2.6.4.tar.bz2

cd Python-2.6.4

yum install -y gcc make zlib-devel bzip2-devel openssl-devel readline-devel sqlite-devel gdbm-devel ncurses-devel

./configure --prefix=/opt/python26 --with-zlib=/usr/include

make

make install

ln -s /opt/python26/bin/python2.6 /usr/bin/python2.6

python2.6 -V

Теперь 2.6 версия вызывается через python2.6

Установка easy_install:

wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086

sh setuptools-0.6c11-py2.6.egg

ln -s /opt/python26/bin/easy_install-2.6 /usr/bin/easy_install-2.6

easy_install-2.6 --help

Соответственно вызывать через easy_install-2.6

Настройка работы с MSSQL с линукса (CentOS 5)

Столкнулся с написанием скриптов для работы на линукс-сервере с MsSQL-базой на питоне. Основная проблема - сообщение типа


pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier. (4004) (SQLExecDirectW)')


Как же так? Просто нужно настроить использование правильной версии драйвера.

Итак. Первое - запись о драйвере в /etc/odbcinst.ini
[FreeTDS]
Description=TDS driver
Driver=/usr/lib/libtdsodbc.so
Setup=/usr/lib/libtdsS.so
FileUsage=1

Второе - добавить запись о сервере в /etc/freetds.conf
[myServer]
    host=192.168.0.2
    port=1433
    tds version=8.0
Особенно прошу учесть "табы" перед параметрами! У меня без них запись не срабатывала!

Третье - добавить DSN-запись в /etc/odbc.ini
[myDNS]
Description=my dsn
Driver=FreeTDS
Database=my_db
Servername=myServer

Теперь код для работы с бд выглядит так:
import pyodbc
conn = pyodbc.connect("dsn=myDSN;UID=%s;PWD=%s;" % ('sa','pass'))
cursor=conn.cursor()
cursor.execute("select 'test' as x;")
row=cursor.fetchone()
if row:
    print row

Успехов!

четверг, 18 февраля 2010 г.

CouchDB | Тонкости map-функции

Никогда не пишите в map-функции
emit(doc._id, doc);

т.к. при вызове view на жестком диске создается индекс-файл, который будет содержать значения doc._id и doc!

UPDADE: doc - т.е. будут все поля документа.

Возвращайте только новые, просчитанные данные. Ибо есть ключик include_docs=true, при наличии которого БД отдаст кроме того, что в emit ещё и сами документы!

среда, 3 февраля 2010 г.

CouchDB | Простенький скрипт для keep-alive

CouchDB запускается как фоновый процесс. Но он не умеет подниматься в случае ошибки.
Вот пример простого скрипта, который через curl проверяет - активен ли процесс и если нет - перезапускает его:

#!/bin/bash

echo "Checking, is CouchDB is alive..."
#замените адрес на свой!
ANSWER=$(curl http://192.168.0.5:5984 -s)

if test $ANSWER
then
    echo "CouchDB is alive!"
else
    echo "Trying to restart..."

    /etc/init.d/couchdb restart
fi

Скрипт можно усложнить - например, после рестарта проверить - запустился ли. Если нет - отсылать письмо админу :-)

вторник, 26 января 2010 г.

Python + Psycopg2 + Win32 | Ошибка при большом кол-ве подключений к БД

Написав простецкий скрипт на питоне для копирования данных таблицы с MSSQL в PostgreSQL (+ конвертация некоторых полей) напоролся на ошибку - "psycopg.OperationalError, could not connect to server: Address already in use". Запускал скрипт я на Win32, Python2.6, Psycopg2 2.0.13. Долго ковырял гугль. Нашлась тема. И хотя она оказалась решенной ещё в 2006 году - я эту ошибку всё равно получал. Да, библиотека у меня судя по её номеру - намного "новее"...

Помучав мозг и посмотрев на код работы с psql, я увидел, что для вставки каждой строки данных я каждый раз открываю и закрываю соединение... Вот оно! А что, если открыть соединение 1 раз и кидать инсерты? Да, так и быстрее и не получаю ошибку! (вот в фоне уже 80К строк обработано, только нужно учесть, что я соединился с pgBouncer).

Ну или можно вставить time.sleep(3*60) после каждых 2К строк...

четверг, 21 января 2010 г.

Genius NetScroll 220 Laser | Мышь. Понижение чувствительности.

OMG! Все мучался - мышь ЛЕТАЕТ! Оказалось есть переключение dpi (влияет на чувствительность). Знаете как? ХАХА! Нажатием лк+пк+колеса!

УРА!

MSSQL | Подлость. Никогда не доверяйте!

Был обычный день. Настал момент в базе данных у одной таблицы сменить тип с text на ntext. А таблица на 500к строк. И важная - жуть! Ок, Sql managment studio создала скрипт. Интересно, но скрипт создавал временную таблицу, копировал в неё оригинальную, потом дропал оригинальную и переименовывал временную в название оригинала. Вроде - все нормально, все обернуто транзакциями.

Да вот только обернуто то не все вместе, а каждая команда по отдельности! Ну в результате - сначала мешали внешние ключи. А потом просто - оригинальная таблица дропнулась и временной не видно!? ВСЁ!

Прощайте данные!

Да, есть бекап. Ночной. Общий на 50Гиг. Шутки в сторону. Микрософт не научил студию восстанавливать таблицы по одной. Финиш. А точнее - пипец!

Но я умный. У меня есть машина-дублер. Правда она - на постгресе!

В общем поимел я секса с sqlcmd и конвертированием ~300Мегового бекапа в стиле INSERT INTO TABLE. Хорошо что была линукс-машина и хвала vim! Особенно его комманде глобальной замены %s/что_искать/на_что_менять/gn.

Для интереса - sqlcmd работает по стандарту. Т.е. каждая команда должна завершаться пинком командой GO. Но кроме того из-за огромного размера - каждый инсерт пришлось обернуть в транзакцию.

Типа:
begin tran;
insert into ...;
commit tran;
go

Ну и конечно же вызов sqlcmd с флагом кодировки -f 65001 (это utf-8).

Всё. Живем.