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

Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

Фикс на Debian:

a2enmod headers
/etc/init.d/apache2 restart

О жизни

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

стырено с http://oldmann.livejournal.com/166555.html

Ну а что, дорогие мои, не так? :)

ПХПшникам привед!

В коде генерации номеров уникальных пользовательских сессий и уникальных идентификаторов (uniqid) PHP найдена недоработка, позволяющая злоумышленнику предсказать другие номера последовательности, зная текущий номер сессии (например, войдя на форум можно подобрать номера сессий других пользователей). Проблема вызвана некорректной инициализацией генератора случайных чисел в PHP, начальные значение затравки для которого можно предсказать с достаточно высокой степенью вероятности.


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

Проверка IP адреса сервера на наличие в SpamHaus

http://www.spamhaus.org/lookup.lasso

Как настроить удаление СПАМа в SpamAssassin вместо его простой пометки?

Тут мануал: http://wiki.apache.org/spamassassin/DeletingAllMailsMarkedSpam

Использование PyGrub для загрузки Xen DomU

http://wiki.debian.org/PyGrub

Apache, Debian [emerg] (22)Invalid argument: couldn't grab the accept mutex

Вот такая радость в error.log Апача:
[Tue Mar 30 22:11:43 2010] [emerg] (22)Invalid argument: couldn't grab the accept mutex


Проблема решилась сама собой после насильного перезапуска процессов Апача и перезагрузки сервера. Если у кого есть "правильное" решение - прошу в комменты.

apt-get: 404 Not Found E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Бороться достаточно легко (это даже написано в самой ошибке):
apt-get update

Установка PHP curl на Debian 5 Lenny

Обновляем содержимое репозиториев:
apt-get update

Ставим пакет:
apt-get install -y php5-curl


Подключаем новйы модуль PHP к Апачу (иными словами, заставляем Апача перезагрузить свои модули и как следствие перезагрузить PHP расширения):
/etc/init.d/apache2 restart


Убеждаемся, что все подключилось:
php -m | grep curl
curl

Ура, вышел RHEL 5.5

http://www.nixp.ru/news/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BB%D1%81%D1%8F-%D1%80%D0%B5%D0%BB%D0%B8%D0%B7-Red-Hat-Enterprise-Linux-5-5.html

А вот более подробный технический релиз: http://www.opennet.ru/opennews/art.shtml?num=26021

Оффрелиз: http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.5/html-single/Release_Notes/

вторник, 30 марта 2010 г.

Защита от фишинга правилом .htaccess

Вот таким простым правилом можно легко срезать всех, кто направляет на Вас свой домен в каких-либо целях:


RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www.)?domain.ru$
RewriteRule ^$ http://google.com [R]


При таком раскладе, если Ваш сайт открыт не с Вашего домена, он получит редирект на Гугл.

Синхронизация времени в Debian

Устанавливаем пакет:
apt-get install -y ntp


Синхронизируем время:

/etc/init.d/ntp stop
ntpdate 0.rhel.pool.ntp.org europe.pool.ntp.org
/etc/init.d/ntp start

10 open source движков для управления программными проектами

http://www.cyberciti.biz/tips/open-source-project-management-software.html

Как в Linux создать раздел размером 2 терабайта и более?

Вот так, с использованием GPT: http://www.cyberciti.biz/tips/fdisk-unable-to-create-partition-greater-2tb.html

FreeBSD 8 c корнем на ZFS? Легко!

http://wiki.freebsd.org/ZFSOnRoot

Причем, во Фре 8 можно вообще _ВСЮ_ систему разместить на ZFS (вт.ч. даже и /boot), вот инфа по этому: http://lulf.geeknest.org/blog/freebsd/Setting_up_a_zfs-only_system/

Надо попробовать поставить :)

FreeBSD 8 - как разобрать RAID?

Имеем GEOM RAID:

gmirror status
Name Status Components
mirror/gm0 COMPLETE ad6
ad4


Задача - разобрать его и удалить метаданные с дисков:

Используем команду remove (Remove the given component(s) from the mirror and clear meta-data on it):
gmirror remove gm0 ad6
gmirror remove gm0 ad4


Вуаля:
gmirror status
Name Status Components
mirror/gm0 N/A N/A


Источник: http://www.freebsd.org/cgi/man.cgi?query=gmirror&sektion=8

Установка Subversion сервера на CentOS 5

Создаем репозиторий

Ставим пакеты:
yum install -y subversion


У Subversion сервера есть два типа хранилища fsfs (рекомендуется) и bdb. Если желаете их сравнить, вот ссылочка: http://svnbook.red-bean.com/en/1.1/ch05.html#svn-ch-5-sect-1.3 (по мне - почти однозначно побеждает fsfs).

Создаем папку для репозиториев:

mkdir /var/spool/svn


Создаем репозиторий:

svnadmin create /var/spool/svn/myrepo


Переходим в папку репозитория:

cd /var/spool/svn/myrepo


Созданный репозиторий имеет вот такую структуру:
conf dav db format hooks locks README.txt


Теперь нам необходимо предоставить доступ к репозиторию по сети.

Вариантов подключения к SVN репозиторию существует великое множество (аналогичный список можете просмотреть по команде svn --version):

* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol.
- handles 'http' scheme
- handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme


Мне более всего нравится вариант WebDAV / https (безопасность и удобная работа с сервером), его мы и будем использовать.

Ставим Apache Dav и поддержку SSL (ога, безопасность рулит всегда):
yum install -y httpd mod_dav_svn mod_ssl


Аактивируем запуск Апача при загрузке системы и запускаем его:
chkconfig httpd on
/etc/init.d/httpd start


Убеждаемся, что все необходимые модули успешно подключились к Апачу:

apachectl -M 2>&1 | grep dav
dav_module (shared)
dav_fs_module (shared)
dav_svn_module (shared)


а также проверяем, подключился ли SSL:

apachectl -M 2>&1 | grep ssl
ssl_module (shared)


Так как все операции с репозиторием теперь будут производиться от имени Apache, то необходимо его сделать владельцем файлов нашего репозитория:
chown -R apache.apache /var/spool/svn/myrepo/


Теперь необходимо показать Апачу, где находится наш репозиторий:
vi /etc/httpd/conf.d/subversion.conf


Добавляем там внизу следующее:
<Location /myrepo>
DAV svn
SVNPath /var/spool/svn/myrepo

# Require SSL connection for password protection.
SSLRequireSSL

AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /var/spool/svn/myrepo/conf/htpasswd
Require valid-user
</Location>


Создаем файл паролей с одним пользователем:

htpasswd -c /var/spool/svn/myrepo/conf/htpasswd nrg
New password:
Re-type new password:
Adding password for user nrg


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

htpasswd /var/spool/svn/myrepo/conf/htpasswd nrg2


Применяем настройки:

/etc/init.d/httpd restart


Пробуем открыть репозиторий по незащищенному соединению: http://domain.ru/myrepo и в ответ должны получить "You don't have permission to access" - это правильное поведение (в логах оно сопровождается следующими записями: "access to /var/www/html/myrepo failed, reason: SSL connection required"). После этого пробуем подключиться по httpS: https://domain.ru/myrepo и в ответ мы должны получить радостное "Revision 0: /", это повествует о том, что все рабоатет отлично и мы получили доступ к нашему репозиторию посредством WEB_DAV и SSL.

Теперь пробуем подключиться из SVN клиента:
svn co https://domain.ru/myrepo
Error validating server certificate for 'https://domain.ru:443':
....
(R)eject, accept (t)emporarily or accept (p)ermanently? p
Authentication realm: Authorization Realm
Password for 'nrg':
Checked out revision 0.

Сразу следом стоит создать папку trunk:
svn mkdir trunk
svn ci -m 'create trunk'

Вот и все — у Вас есть собственный, супер защищенный, доступный из любой точки мира SVN репозиторий!

Основано на: http://wiki.centos.org/HowTos/Subversion

Subversion: CentOS vs Debian - где он новее?

Debian: 1.5.1dfsg1-4
CentOS: 1.4.2


Побеждает Debian :)

Хотя в свете того, что на моем Маке Subversion старее динозавров это совершенно не важно, так что сделаем репо на CentOS :)

svn --version
svn, version 1.4.4 (r25188)

Создание собственного репозитория для CentOS

Ставим служебный софт:
yum install -y createrepo


Создаем папку для хранения пакетов:

mkdir -p /var/www/html/centos_repository
cd /var/www/html/centos_repository


Теперь необходимо положить тестовый пакет в наше репозиторий:
wget http://fastvps.googlecode.com/files/mpt-status-1.2.0_RC7-3.i386.rpm


Запускаем генерацию метаданных репозитория:
createrepo .


После этого будет сгенерирована служебная папка repodata с данными о всех наших пакетах:

./mpt-status-1.2.0_RC7-3.i386.rpm
./repodata
./repodata/repomd.xml
./repodata/other.xml.gz
./repodata/filelists.xml.gz
./repodata/primary.xml.gz


Теперь нам необходимо настроить Apache, чтобы указанная папка была полностью доступна по протоколу HTTP, это осильте сами, пожалуйста.

В итоге у нас получится веб-страница http://repo.domain.ru/centos_repository с одним файлом mpt-status-1.2.0_RC7-3.i386.rpm и папкой repodata, но "правильные" репозитории выглядят немного иначе: http://mirror.yandex.ru/epel/5/

То есть внутри папки репозитория создается папка 5, соответствующая версии дистрибутива, далее создаются подпапки под требуемые архитектуры i386, x86_64 или даже SRPMS, а уже внутри них располагаются rpm пакеты и папка repodata. Если так делают сильные мира сего, то и мы поступим аналогично, чтобы не получить помойки с пакетами (например, такой как у OpenVZ репозитория - http://download.openvz.org/kernel/branches/rhel5-2.6.18/current/ и как следствие этой "помойки" при установке пакетов из их репозитория приходится явно указывать его (пакета) платформу, то есть вместо "package" приходится писать "package.x86_64", что крайне неудобно).

Переделываем на "как правильно":
rm -rf /var/www/html/centos_repository
mkdir /var/www/html/centos_repository
cd /var/www/html/centos_repository
mkdir 5
cd 5
mkdir {i386,x86_64,SRPMS}
cd x86_64
wget http://fastvps.googlecode.com/files/mpt-status-1.2.0_RC7-3.i386.rpm
cd ..


Создаем repodata:

createrepo i386

Saving Primary metadata
Saving file lists metadata
Saving other metadata

createrepo x86_64/
1/1 - mpt-status-1.2.0_RC7-3.i386.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata

createrepo SRPMS/

Saving Primary metadata
Saving file lists metadata
Saving other metadata


Если же в процессе эксплуатации репозитория Вы планируете добавлять новые пакеты, то используйте другой синтаксис createrepo:
createrepo --update x86_64
createrepo --update i386
createrepo --update SRPMS


Теперь немного автоматизации для удобного апдейта репо:
vi /var/www/html/centos_repository/5/Makefile


Со следующим контентом:
update:
createrepo --update x86_64
createrepo --update i386
createrepo --update SRPMS


Теперь обновление репозториев при добавлении новых пакетов можно делать вот так:

make -C /var/www/html/centos_repository/5 update


Теперь наш репозиторий необходимо подключить к клиентской машинке (у меня она 64 битная, и с 32 битной мой пример работать не будет), создаем файл описание репозитория:
vi /etc/yum.repos.d/myrepo-centos.repo


Со следующим содержанием:

[myrepo-centos]
name=My Personal Yum Repo
baseurl=http://domain.ru/centos_repository/5/$basearch
enabled=1
# not secure
gpgcheck=0


Теперь запускаем yum и убеждаемся, что не выдано никаких ошибок в отношении нашего репозитория:
yum update


Получаем информацию о тестовом пакете в нашем репозитории:

yum info mpt-status
Loaded plugins: fastestmirror, versionlock
Loading mirror speeds from cached hostfile
* addons: ftp.plusline.de
* base: centos.copahost.com
* epel: mirror.andreas-mueller.com
* extras: ftp.plusline.de
* openvz-kernel-rhel5: openvz.copahost.com
* openvz-utils: openvz.copahost.com
* updates: centos.copahost.com
Reading version lock configuration
Available Packages
Name : mpt-status
Arch : i386
Version : 1.2.0_RC7
Release : 3
Size : 27 k
Repo : myrepo-centos
Summary : MPT Fusion raid inquiry tool
URL : http://www.drugphish.ch/~ratz/mpt-status/
License : GPL
Description: mpt-status give informations about raid status for LSI Fusion controllers.
: This is quite a modified version to the original mpt-status-1.0 package.


Ставим его (собственно, ради этого все и затевалось):

yum install -y mpt-status


Ну вот и все :)

Добавление новых пакетов в репозиторий

Просто кладем новые rpm в папку, соответствующую архитектуре и после этого делаем --update, как указано выше. Как результат увидим следующее:
make
createrepo --update x86_64
2/2 - vzprocps-2.0.11-6.13.swsoft.i386.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
createrepo --update i386
2/2 - vzprocps-2.0.11-6.13.swsoft.i386.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
createrepo --update SRPMS

Saving Primary metadata
Saving file lists metadata
Saving other metadata

Источник: http://blog.kagesenshi.org/2007/01/howto-creating-your-own-yum-rpm.html

понедельник, 29 марта 2010 г.

Где взять шаблоны ОС для OpenVZ?

Вот тут: http://download.openvz.org/template/precreated/

Как установить MaxClients больше 256 ?

Если просто написать MaxClients 257, то получим ошибку:

WARNING: MaxClients of 257 exceeds ServerLimit value of 256 servers, lowering MaxClients to 256. To increase, please see the ServerLimit


Правильно писать вот так:

ServerLimit 257
MaxClients 256


И после этого перезапуск Апача произойдет успешно:

/etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .

Установка iotop на CentOS пока невозможна :(

Офсайт сабжа: http://guichaz.free.fr/iotop/

В 0.4 версии iotop наконец-то начал поддерживать Python 2.4, поэтому появилась возможность его запускать на CentOS без особых извращений.

Ставим зависимости:
yum install -y python-ctypes


Проверяем наличие требуемых возможностей ядра (есть в ядрах от RHEL 164 и выше, а также в 128х ядрах OpenVZ):

zcat /proc/config.gz | egrep 'TASK_IO_ACCOUNTING|TASK_DELAY_ACCT'
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_IO_ACCOUNTING=y


Или вот так:

cat /boot/config-`uname -r` | egrep 'TASK_IO_ACCOUNTING|TASK_DELAY_ACCT'
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_IO_ACCOUNTING=y


Стягиваем дистрибутив:
cd /usr/src
wget http://guichaz.free.fr/iotop/files/iotop-0.4.tar.bz2
tar -xf iotop-0.4.tar.bz2
cd iotop-0.4


Запускаем:

./iotop.py


И при этом сильно обламываемся, получая в ответ "CONFIG_TASK_DELAY_ACCT not enabled in kernel, cannot determine SWAPIN and IO %"

Вот тут трабл :( По-видимому, при бэкапортинге io-аккаунтинга в новые rhel ядра (164+) интерфейс netlink для забора этих данных не бэкпортнули.

воскресенье, 28 марта 2010 г.

Установка PECL PHP uploadprogress на Debian

Что это и зачем, можно кратко прочесть вот здесь: http://pecl.php.net/package/uploadprogress

Ставим PECL:
apt-get install -y php-pear


Ставим зависимости для сборки:

apt-get install -y php5-dev


Собираем расширение:
pecl install uploadprogress


При этом с версией 1.0.1 может вылезти баг:

/tmp/pear/temp/uploadprogress/uploadprogress.c: In function ‘get_module’:
/tmp/pear/temp/uploadprogress/uploadprogress.c:478: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
make: *** [uploadprogress.lo] Error 1
ERROR: `make' failed


И что с ней делать... я не знаю :( Баг не исправлен. В итоге собрал на другой системе той же версии той же архитектуры и скопировал бинарик.

Если все ок, то после этого uploadprogress установится в папку расширений к PHP:

ls /usr/lib/php5/20060613+lfs | grep upload
uploadprogress.so


Создаем конфиг-файл:

echo "extension=uploadprogress.so" > /etc/php5/conf.d/uploadprogress.ini


Убеждаемся, что модуль подключился успешно:

php -m | grep upload
uploadprogress


Перезапускаем Апача:

/etc/init.d/apache2 restart

Как отключить "Checking for corrupt, not cleanly closed and upgrade needing tables.. " в Debian?

Этим в Debian занимается скрипт: /etc/mysql/debian-start. Открываем его:
vi /etc/mysql/debian-start

И комментируем следующую строку:
#check_for_crashed_tables;


После этого перезапуск будет выполняться быстрее:

/etc/init.d/mysql restart
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..

пятница, 26 марта 2010 г.

Частота процессора 0.000 мегагерц?

cat /proc/cpuinfo | grep 'cpu MHz'
cpu MHz : 0.000
cpu MHz : 0.000
[email protected]:~# uname -a
Linux sds.fastvps.ru 2.6.28-15-server #49-Ubuntu SMP Tue Aug 18 20:09:37 UTC 2009 x86_64 GNU/Linux


Кто сталкивался с подобным? Кристалл вот такой: Dual-Core AMD Opteron(tm) Processor 1218

Хранение данных в 21 веке =)

Key-value stores: Redis, Scalaris, Voldmort, and Riak.
Document stores: Couch DB, MongoDB, and SimpleDB.
Record stores: BigTable, HBase, HyperTable, and Cassandra.
Scalable RDBMSs: MySQL Cluster, ScaleDB, Drizzle, and VoltDB.


http://feedproxy.google.com/~r/HighScalability/~3/hn8ieaM2v24/paper-high-performance-scalable-data-stores.html

Отличная подборка статей по защите от DDoS атак

Рекомендую: http://www.antiddos.org/index.php?option=com_content&view=section&layout=blog&id=5&Itemid=48

Stackless Python

Вот нашел такой интересный проект: http://stackless.com/ Суть его в том, чтобы добавить в язык "микропотоки", то есть это как потоки в привычном понимании, но реализованные внутри самого интерпретатора и языка. Их использование на порядки проще, чем обычных потоков, так как все делает сам интерперататор. То есть, мы получаем все преимущества потоков без каких-либо затрат со своей стороны (никаки сложных межпроцессных взаимодействий).

Система комментариев на JavaScript jn js-kit

http://js-kit.com/

Ускорьте свои приложения - размещайте Ваш js код библиотек на Google

http://code.google.com/intl/ru-RU/apis/ajaxlibs/

Solaris Brand-Z

Это штука с возможностью запуска Linux приложений в Zones на Solaris.

Самый интересный вопрос - а как же производительность? А вот так:
What kind of performance can I expect for my Linux applications?
Our focus to this point has been on implementing the fundamental features of BrandZ/lx, but performance is an important goal for the final product. Our expectation is that at when we ship, most Linux applications will run with a minimal performance overhead of around 5% compared to the equivalent, native Linux environment.



первоисточник: http://hub.opensolaris.org/bin/view/Community+Group+brandz/brandz_lae_faq#performance

Как узнать подробности о модуле ядра?

Легко, командой modinfo module_name

Пример выдачи:

modinfo r8168
filename: /lib/modules/2.6.26-2-amd64/kernel/drivers/net/r8168.ko
version: 8.017.00-NAPI
license: GPL
description: RealTek RTL-8168 Gigabit Ethernet driver
author: Realtek and the Linux r8168 crew
srcversion: A1C7F4F267B431A9A62A658
alias: pci:v000010ECd00008168sv*sd*bc*sc*i*
depends:
vermagic: 2.6.26-2-amd64 SMP mod_unload modversions
parm: speed:force phy operation. Deprecated by ethtool (8). (array of int)
parm: duplex:force phy operation. Deprecated by ethtool (8). (array of int)
parm: autoneg:force phy operation. Deprecated by ethtool (8). (array of int)
parm: rx_copybreak:Copy breakpoint for copy-only-tiny-frames (int)
parm: use_dac:Enable PCI DAC. Unsafe on 32 bit PCI slot. (int)
parm: debug:Debug verbosity level (0=none, ..., 16=all) (int)

Oracle Database 10g Express Edition

Oracle Database 10g Express Edition (Oracle Database XE) is an entry-level, small-footprint database based on the Oracle Database 10g Release 2 code base that's free to develop, deploy, and distribute; fast to download; and simple to administer.

И все это совершенно бесплатно :)

Но со следующими лимитами:
Oracle Database XE can be installed on any size host machine with any number of CPUs (one database per machine), but XE will store up to 4GB of user data, use up to 1GB of memory, and use one CPU on the host machine.

То есть вне зависимости, какое у вас железо, будет использоваться 1 ядро и 1 гигабайт оперативной памяти. Ну что же, для бложика это будет предостаточно, можно будет поэкспериментировать с Интерпрайз СУБД :) И да - нативной поддержки 64 бит тоже нету, онли 32.

Ссылко: http://www.oracle.com/technology/products/database/xe/index.html

Подробности по делу Магнитского

http://www.novayagazeta.ru/data/2010/027/01.html

Упрощаем использование ssh посредством ssh_config

http://www.linuxjournal.com/content/use-sshconfig-simplify-your-life?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+linuxjournalcom+(Linux+Journal+-+The+Original+Magazine+of+the+Linux+Community)&utm_content=Google+Reader

Было:

# ssh -p 12022 example.dyndns.org


Стало:

# ssh server1


Как это сделать? :) Прошу по ссылке!

Новые драйвера для RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)

Брать вот тут: http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false#2

Самая новая версия: 8.017.00 датируется 2010/3/15, только вот не увижу в упор ChangeLog драйвера :(

Прямая ссылка: http://fastvps.googlecode.com/files/r8168-8.017.00.tar.bz2

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

Ричард Брансон выходит в космос

В пустыне недалеко Сан-Диего в Калифорнии в эти дни в небо поднялся в первый испытательный полет многофюзеляжный самолет "Белый Рыцарь", который послужит авиаматкой для доставки на высоту 15 км ракетоплана с космическими туристами на борту.

Об этом подробно пишет Independent в своем репортаже об успехах компании Virgin Galactic, принадлежащей известному британскому предпринимателю Ричарду Брансону.

Это означает, что уже через год, если все пойдет по плану, может состояться первый суборбитальный полет ракетоплана VSS Enterprise с двумя пилотами и 4 пассажирами на борту.

Компания продала уже 330 билетов на такие полеты каждый стоимостью 200 тысяч долларов каждый.

Вполне вероятно, пишет газета, что мы присутствуем при рождении отрасли космического туризма, которая к 2020 году может приносить своим основателям до 700 млн долларов в год.

взято с: http://www.bbc.co.uk/russian/uk/2010/03/100325_brit_press.shtml

Кластер РосГидромета

http://nag.ru/articles/article/17961/klastery-rosgidrometa-fotoprogulka-po-vc.html

ДЦ в Советском бункере

http://nag.ru/articles/article/17848/cod-v-sovetskom-bomboubezhische.html

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

Онлайн майндмэппинг для инновационных людей и бизнеса

http://www.mindmeister.com/ru/home

Любовь vs Ревность

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


(с) [Роберт Хайнлайн, "Чужак в стране чужой"]

Потырено с блога подруги, но url не светим )

Как победить MySQL too many connections без рестарта СУБД?

Так: http://www.mysqlperformanceblog.com/2010/03/23/too-many-connections-no-problem/

Как пересобрать nrpe на CentOS из src rpm пакета?

Вот возникла у меня такая необходимость, но сходу собрать по обычному мануалу http://phpsuxx.blogspot.com/2009/12/rpm-centos-5.html не получилось.

А не получилось по вот такой причине:

error: Failed build dependencies:
tcp_wrappers-devel is needed by nrpe-2.12-12.x86_64


Чтобы исправить проблему надо внести коррективы в SPEC:
cd SPECS/
vi nrpe.spec


И заменить:

%if 0%{?rhel}
BuildRequires: tcp_wrappers
%else
BuildRequires: tcp_wrappers-devel
%endif

на

%if 0%{?rhel}
BuildRequires: tcp_wrappers
%else
BuildRequires: tcp_wrappers
%endif


После такой замены все успешно соберется :)

Где взять mpt-status для CentOS?

Тут: http://mirror.intergenia.de/packages/rpm/centos/5/dedicated/ или тут http://code.google.com/p/fastvps/downloads/list

Создание репозитория для Debian

Вот натолкнулся на хороший мануал по сабжу: http://earruda.eti.br/blog/archives/10

И еще:
http://l10n-russian.alioth.debian.org/repository-howto.ru.html#id2462929

И еще:
http://forum.linuxopen.ru/showthread.php?t=224

nrpe и передача сообщений длиннее 1024 байт

В процессе работы с nrpe обнаружил у него фичу - если выдача запускаемой на удаленной машине команды больше 1024 байт, то выдача усекается до 1024 байт вне зависимости от полной длины. Меня, разумеется, такой расклад не устраивает - мне надо увеличить это значение хотя бы вдесятеро, до 10240 байт.

За этот [s]баг[/s] фичу отвечает константа MAX_PACKETBUFFER_LENGTH, объявленая в файле nrpe-2.12/include/common.h, так что для достижения требуемого поведения программы достаточно увеличить эту константу до 10024, а также скорректировать размер служебного буфера.

То есть нам надо внести следующие коррективы в файле include/common.h:
#define MAX_PACKETBUFFER_LENGTH 10240
#define MAX_INPUT_BUFFER 20480


Размер второго служебного буфера увеличивается сильно, но не думаю, что это сломает программу.

После внесения указанных правок необходимо пересобрать пакет, это можно сделать по моему мануалу: http://phpsuxx.blogspot.com/2009/12/rpm-centos-5.html

Мануал пока не проверен, так что все на собственный страх и риск :)

понедельник, 22 марта 2010 г.

Использование nrpe в своих корыстных целях

Задача такая - требуется вызов ряда команд на удаленном сервере. Первая мысль о реализации возникла сразу - ssh, но тут возникает проблема с тем, что нет возможности малой кровью ограничить список доступных команд и запретить доступ к файловой системе. Второй вариант был Zabbix Agent, но у него есть существенный недостаток, он не позволяет указать список команд, которые можно запускать, разрешаются либо все команды либо ни одной. Тут он полностью аналогичен SSH. Третий вариант пришел в голову немного позже - это nrpe, плагин удаленного мониторинга серверов. Он позволяет явно задать список доступных команд, а также является заведомо надежным продуктов присутствующем в почти каждом репозитории ПО. Так что реализовывать задачу будем именно на нем.

Гугл очень быстро помог, выдав отличный мануал по установке nrpe: http://blog.sozinov.eu/2007/05/nrpe-nagios.html, на его основе мы и будем двигаться дальше.

В рассмотрении у нас будет два узла - source и target, с первого мы будем запрашивать данные, а второй будет выполнять заданные нами команды.

Настраиваем target систему

На target:

# CentOS
yum install -y nrpe
# Debian
apt-get install nagios-nrpe-server


Далее все рассуждения я буду проводить для CentOS.

Включаем автозагрузку сервиса nrpe:
chkconfig nrpe on


Запускаем его:
/etc/init.d/nrpe start


Открываем конфиг:

vi /etc/nagios/nrpe.cfg


Далее заменяем 127.0.0.1 на IP source сервера:
allowed_hosts=127.0.0.1


Потом включаем передачу аргументов вызываемым программам:

dont_blame_nrpe=1


По поводу безопасности можете не волноваться, сам NRPE отфильтрует потенциально опасные символы, переданные в качестве аргументов, вот их список:
| ` & > < ' " \ [ ] { } ; !



И создаем тестовую команду без аргументов:

command[check_mdstat]=/bin/cat /proc/mdstat


Применяем изменения:
/etc/init.d/nrpe restart


И открываем слежение за логами nrpe:

tail -f /var/log/messages


Настраиваем source систему

Обращаю внимание, что все последующие рассуждения для Debian.
apt-get install -y nagios-nrpe-plugin


Запрашиваем выдачу нашего датчика:

/usr/lib/nagios/plugins/check_nrpe -H ip.ad.dr.es -c check_mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
1458830400 blocks [2/2] [UU]

unused devices:


Ну вот и все, не правда ли, очень удобно? :) Разве что меня смущает то, что /usr/lib/nagios/plugins/check_nrpe - бинарик, а не Python/Perl скрипт, но не думаю, что у nrpe такой сложный протокол, чтобы его нельзя было воспроизвести вручную.

Передача параметров

Теперь немного усложним задачу, будем запрашивать данные выдачи команды mdadm --detail /dev/N, где N будет задаваться вызывающей стороной.

На target машине создаем такую команду:

command[check_mdadm_detail]=/usr/bin/sudo /sbin/mdadm --detail $ARG1$


Применяем настройки:

/etc/init.d/nrpe restart


Так как mdadm для запуска требует полномочий суперпользователя, нам необходимо будет воспользоваться sudo.

Ставим sudo:
yum install -y sudo


Добавляем правило в sudoers:

vi /etc/sudoers



nrpe ALL=(ALL) NOPASSWD:/sbin/mdadm --detail *


Также отключаем требование tty для использования sudo (комментируем указанную строку):

# Defaults requiretty


Идем на source машину и вызываем команду:

/usr/lib/nagios/plugins/check_nrpe -H ip.ad.dr.es -c check_mdadm_detail -a /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Thu Feb 11 18:39:06 2010
Raid Level : raid1
Array Size : 4200896 (4.01 GiB 4.30 GB)
Used Dev Size : 4200896 (4.01 GiB 4.30 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Mon Mar 22 19:31:08 2010
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : d9c1ca66:181df062:776c2c25:004bd7b2
Events : 0.50

Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1



Ну вот теперь у нас есть RPC на все случи жизни :)

Если же у Вас параноя, как и у меня, то рекомендую закрыть NRPE также фаерволлом (xx.xx.xx.xx - IP source машины):

iptables -A INPUT -p tcp -s ! xx.xx.xx.xx --dport 5666 -j DROP

shell интерпретатор c ограничениями на запуск команд на Python

http://sourceforge.net/projects/lshell/

Зачем продлевать подписку на Red Hat?

Не всегда заказчикам решений на основе Открытого ПО очевидно, зачем продлевать подписку на поддержку. Вашему вниманию предлагаются аргументы на тему Зачем продлевать подписки на Red Hat:

1. Получение обновлений непосредственно с Red Hat Network по мере их появления.

Также в рамках каждой подписки работает система автоматического обновления. На неподписанных системах обновления необходимо искать самостоятельно в сети и вручную устанавливать на каждую машину. Red Hat, Inc. не несет ответственности за любой программный код скачанный не с официального сайта компании.

2. Подписка включает в себя техническую поддержку на русском языке вплоть до 24х7 и скоростью реакции 1 час (в зависимости от уровня подписки). Неподписанные системы не поддерживаются, и Red Hat, Inc. не несет ответственности за стабильность работы таких систем.

2.1. Поддержка продуктов третьих сторон.

Некоторые компании, например, Oracle, не поддерживают свои продукты на неподписанных системах.

3. Подписчики получают доступ к документации и исходным кодам.

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

5. Подписка не привязвна также и к архитектуре. Т.е. подписчики могут свободно переходить с одной архитектуры на другую, и также с 32-битных систем на 64-битные и обратно.

6. Подписчики получают патентную защиту в случае возникновения сомнений в законности использования компонентов дистрибутива.

7. Подписчики получают финансовые документы согласно российским нормам бух учета.

8.Подписчики получают от Red Hat именной сертификат, в котором прописаны приобретенные заказчиком подписки, их срок действия, дата выдачи сертификата и коды активации этих подписок.

Эта опция сделана специально для России для предъявления данного сертификата проверяющим органам. Тем, у кого нет активной подписки, ни Red Hat, ни VDEL никаких документов не предоставляют. Им необходимо самим доказывать легальность использования продуктов Red Hat.

Информация от первоисточника здесь: http://www.redhat.com/rhel/benefits/

Перевод взят здесь: http://209.85.135.132/search?q=cache:http://blog.diyakov.com/2010/03/10/why-renew-redhat/

NETDEV WATCHDOG: eth0: transmit timed out [551749.768446] r8169: eth0: link up


[547170.477425] NETDEV WATCHDOG: eth0: transmit timed out
[547170.492692] r8169: eth0: link up
[548329.580303] NETDEV WATCHDOG: eth0: transmit timed out
[548329.596441] r8169: eth0: link up
[551749.749525] NETDEV WATCHDOG: eth0: transmit timed out
[551749.768446] r8169: eth0: link up
[551988.965573] NETDEV WATCHDOG: eth0: transmit timed out
[551988.985381] r8169: eth0: link up
[552607.651479] NETDEV WATCHDOG: eth0: transmit timed out
[552607.668427] r8169: eth0: link up
[552733.603919] NETDEV WATCHDOG: eth0: transmit timed out
[552733.619383] r8169: eth0: link up


При такой проблеме на сетевых картах с драйвером 8169 его требуется откатывать на 8168, как это сделать - ищите в блоге.

воскресенье, 21 марта 2010 г.

There are unfinished transactions remaining. You mightconsider running yum-complete-transaction first to finish them.

Такая ошибка очень часто бывает, когда в процессе установки / обновления ПО процесс прерывается по какой-либо причине,

Ставим:
yum install -y yum-utils


Запускаем фикс:
yum-complete-transaction


Только БУДЬТЕ ОСТОРОЖНЫ, утилита себе на уме, мне разок предложила удалить 100+ пакетов для фикса транзакции :)

Найти все процессы в системе в D-статусе

ps fax | awk '{if($3 == "D"){print $0}}'
7003 ? D 41:28 | \_ nginx: worker process
22610 ? D 0:07 | \_ nginx: worker process


Что это и зачем - читать здесь: http://wiki.openvz.org/Processes_in_D_state

Обновление ядер и CentOS

При обновлении ядер в CentOS есть одна фишка - вновь установленное стандартное ядро всегда выбирается как default в GRUB, что очень неудобно при использовании нестандартных ядер (например, OpenVZ). Меня это долго бесило и вот сейчас я число случайно нашел, что такое поведение регулируется.


cat /etc/sysconfig/kernel
# UPDATEDEFAULT specifies if new-kernel-pkg should make
# new kernels the default
UPDATEDEFAULT=yes

# DEFAULTKERNEL specifies the default kernel package type
DEFAULTKERNEL=kernel


Полагаю, тут все очевидно. UPDATEDEFAULT - ставить ли новые ядра как стандартные. kernel - имя пакета со стандартным ядром:

rpm -qa | grep ^kernel
kernel-2.6.18-164.9.1.el5
kernel-2.6.18-164.11.1.el5
kernel-2.6.18-164.15.1.el5


Если же используется нестандартные ядра это имя может быть другим, например:
rpm -qa | grep ovzkernel
ovzkernel-2.6.18-128.2.1.el5.028stab064.8


Ну вот и все :) Корректировка пары параметров и Вам не придётся после каждого апдейта руками править grub.conf

суббота, 20 марта 2010 г.

АНДРЕЙ ЛОШАК о том, как государственные институции трещат по швам, и том, как реагировать на этот треск

Велкам: http://www.openspace.ru/society/projects/201/details/16563/page1/

Двоек не бывает!

— Ноль, ноль, ноль, один, один, один, один… А-а-а!!!
— Бендер, что такое?
— Жуткий кошмар! Нули и единицы повсюду. Кажется, я видел двойку. Настоящую двойку.
— Это просто сон, Бендер. Двоек не бывает.


Футурама =)

Облака по Ремарку

Я наблюдал за облаками… Облака — вечные изменчивые странники. Облака — как жизнь… Жизнь тоже вечно меняется, она так же разнообразна, беспокойна и прекрасна…


Разумеется, это Ремарк.

Одиночество

Одиночество — это самая важная составляющая человеческой жизни, человек понимает кто он, только когда он одинок.


Октавио Пас

Все, что нас не убивает...

То, что нас не убивает, делает нас сильнее. И злее, подлее, равнодушнее. Лучше бы убило, блин!
(с) Юлия Лемеш. Убить эмо

Ремарк


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


Эрих Мария Ремарк

Получение PTR для IP из Python на Debian 5 Lenny

Ставим:
apt-get install -y python-adns



#!/usr/bin/python

import DNS
import string

DNS.ParseResolvConf()


def get_ptr(ip):
a = string.split(ip, '.')
a.reverse()

name = string.join(a, '.') + '.in-addr.arpa'

x = DNS.DnsRequest(name,qtype='ptr')
x.req()

return x.response.answers[0]['data']

print get_ptr('67.195.37.179')



В результате получаем:

python dns.py
llf320063.crawl.yahoo.net

Пока мы развлекаемся с нанотехом, они ТВОРЯТ ИСТОРИЮ

http://www.virgingalactic.com

пятница, 19 марта 2010 г.

Активация SSH на VmWare ESXi

http://www.vm-aware.com/2008/07/enable-ssh-for-esxi/comment-page-1/

Еще задачка - где сидит руткит?

# ls /srv
# ls /var/tmp

#

Перегрузка OpenVZ ноды

Update 3/07/14:
Друзья! Эта страница почему-то пользуется дикой популярностью! Но ничего полезного на ней Вы не найдете. Просто потому, что эта проблема как таковая была вызвана железом/сетевой перегрузкой (все вместе) и не имела ни малейшего отношения к OpenVZ. А если у Вас траблы с OpenVZ, то лучше заходите на serverfault.com или bugzilla.openvz.org, если уверены, что баг имеет место быть.

Сегодня случилась прямо таки мистическая ситуация, до небес взлетел la при нормальной нагрузке на диск (почти нулевой io wait).

top - 13:08:25 up 135 days, 19:29,  1 user,  load average: 126.51, 133.37, 128.65
Tasks: 1347 total,   5 running, 1341 sleeping,   0 stopped,   1 zombie
Cpu(s): 10.0%us, 10.0%sy,  0.0%ni, 80.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  12264520k total, 11349032k used,   915488k free,   422904k buffers
Swap:  4200888k total,     6972k used,  4193916k free,  4878936k cached
iostat
Linux 2.6.18-128.2.1.el5.028stab064.7 (domain.ru) 03/19/10

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          5.12    0.01    2.28    8.02    0.00   84.57

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              51.63       105.36      1672.13 1236343602 19620913768
sda1              0.00         0.02         0.10     264472    1218016
sda2              0.00         0.00         0.01        880     116488
sda3             51.63       105.34      1672.02 1236078114 19619579264
sdb              52.18       114.53      1672.13 1343937770 19620913944
sdb1              0.00         0.02         0.10     273864    1218016
sdb2              0.00         0.00         0.01       1026     116488
sdb3             52.18       114.51      1672.02 1343662744 19619579440
md2             217.73       219.85      1659.34 2579740618 19470785496
md1               0.00         0.00         0.00       1602      38920
md0               0.02         0.05         0.09     537760    1079072


Как так?

А вот сегодня (14 апреля) еще одна бяка вылезла (причем, ban_log.py - это мой скрпит, который только читает лог файл как tail и делает редко вызовы iptables ):

top - 20:41:17 up 55 days, 11:50, 1 user, load average: 25.68, 19.27, 17.76
Tasks: 1128 total, 17 running, 1102 sleeping, 0 stopped, 9 zombie
Cpu(s): 15.0%us, 3.5%sy, 0.0%ni, 80.2%id, 0.6%wa, 0.0%hi, 0.7%si, 0.0%st
Mem: 12264520k total, 11928912k used, 335608k free, 460132k buffers
Swap: 4200888k total, 4812k used, 4196076k free, 6480140k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30932 root 16 0 50564 6828 2692 S 51.2 0.1 18:54.03 ban_log.py
8850 27 15 0 331m 17m 5692 S 24.8 0.1 591:14.64 mysqld
10954 33 16 0 214m 20m 4296 S 11.9 0.2 7:00.65 apache2


А вот сейчас, 28 апреля еще одна радость довела ла до 250:

xxx: kmemsize 6857 23751127 67108864 67108864 0
lockedpages 0 4 256 256 0
privvmpages 0 871814 921600 1228800 0
shmpages 0 1153 21504 21504 0
dummy 0 0 0 0 0
numproc 0 256 256 256 6143
physpages 0 296914 0 2147483647 0
vmguarpages 0 0 307200 307200 0
oomguarpages 0 310244 307200 307200 0
numtcpsock 0 319 7000 7000 0
numflock 0 130 188 206 0
numpty 0 1 16 16 0
numsiginfo 0 256 256 256 0
tcpsndbuf 0 2987296 28672000 28672000 0
tcprcvbuf 0 3848612 28672000 28672000 0
othersockbuf 0 231088 1126080 2097152 0
dgramrcvbuf 0 34732 262144 262144 0
numothersock 0 230 7000 7000 0
dcachesize 0 694628 3409920 3624960 0
numfile 0 3172 7000 7000 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 0 10 128 128 0


В логах же на VPS, породившем нагрузку следующее:

[Fri Mar 19 13:36:55 2010] [notice] mod_fcgid: process /var/www/paladiny/data/www/xxxx.php(30509) exit(server exited), terminated by calling exit(), return code: 0


И очень много раз:

cat error.log | grep 'terminated by calling exit' | wc -l
3968


А подозрения вот на это:
eAccelerator: shmmax should be at least 2MBPHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0
PHP Fatal error: Unable to start eAccelerator module in Unknown on line 0
[Fri Mar 19 15:06:34 2010] [notice] mod_fcgid: call /var/www/xxxx.php with wrapper /var/www/paladiny/data/php-bin/php
[Fri Mar 19 15:06:34 2010] [notice] mod_fcgid: process /var/www/xxxxx/index.php(16382) exit(server exited), terminated by calling exit(), return code: 254


Проблема возникла как раз после установки eAccelerator. Только вопрос - почему ОВЗ отказал? От того, что была "тяжелая" fork bomb ? То есть процессы PHP грузили процессор но сразу же дохли и на их место создавались новые и все это при большой посещаемости.

Апдейт: ваще, подозрения, что начинает тупить резалка проца, когда идет очень частый рефорк процессов.

Снова о дебилах

http://www.gks.ru/bgd/regl/b09_11/IssWWW.exe/Stg/d02/20-04.htm

Посмотрите цифры и сравните 2006и 2007й. Наверное, сайты просто уничтожаются кризисом ( которого тогда не было ) или, например, какими-либо сельскохозяйственными вредителями.

Зетабанк

Альфа-Банк был основан в 1990 году.
http://alfabank.ru/about/

Меня одного это смущает или нет? Не меня, не одного - http://www.alfagroup.ru/276/about.aspx

Методология Cobit

Лично для меня этого новое слово, встретилось на сайте BSGV в разделе вакансии :)

http://ru.wikipedia.org/wiki/Cobit

Снова хейт спич про АК

На этот раз ГТК Россия:

Я создал заказ, выбрав способ оплаты – наличные, но сейчас хочу оплатить его на сайте по кредитной карте. Как это сделать?

К сожалению, это невозможно. Вы можете создать новый заказ и оплатить его по пластиковой карте, либо оформить авиабилет по уже созданному, оплатив его в офисе представительства ГТК «Россия».


(с) http://www.rossiya-airlines.com/ru/tickets/zabronirovati_buy/faq/?id17=171&i17=8

9,5 правил ведения безопасного IT-бизнеса в России

Прошу: http://habrahabr.ru/blogs/my_business/87984/

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

Выполнение команд на удаленном сервере по SSH2 из Python /Paramiko

Ставим библиотеку Paramiko:
apt-get install -y python-paramiko



#!/usr/bin/python
# -*- coding: utf-8 -*-

import paramiko
import sys

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy() )

try:
ssh_connection = ssh.connect('domain.ru', username='xxxx', password='yyyyy')
except paramiko.AuthenticationException:
print "Auth failed"
ssh.close()
sys.exit(0)

( stdin, stdout, stderr ) = ssh.exec_command('cat /proc/mdstat')

for line in stdout.read().splitlines():
print line


ssh.close()



Вот пример запуска команды:

./ssh_command.py
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sdb1[1] sda1[0]
4200896 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
2104448 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
1458830400 blocks [2/2] [UU]

unused devices:



по материалам: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

Шаблонизатор CTPP

Используется в Рамблере, очень и очень быстрый, писан на C++:
http://ctpp.havoc.ru/

Поюзали - ацтой, с документацией полный абзац, тестовые примеры не работают. Вобщем - НЕ рекомендую.

Простите, но писец, причем полный

http://community.livejournal.com/ru_telecom/512460.html

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

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

Пример Python скрипта защиты от DoS / DDoS атак посредством анализа логов


#!/usr/bin/python
# -*- coding: utf-8 -*-

import tailer
import re
import os

ips = {}

for line in tailer.follow(open('/var/log/nginx/access.log')):
m = re.match('^(\d+.\d+.\d+.\d+).*?- 400 0 "-" "-" "-" 0.000--$', line)

if m:
print "Blank DoS request: %s" % line

ip = m.group(1)

print "ban ip: %s" % ip
os.system("ban_ip.sh %s" % ip)

m_bot = re.match("^(\d+.\d+.\d+.\d+).*?GET /someurl/ .*?$", line)

if m_bot:
ip = m_bot.group(1)


if ips.has_key(ip):
ips[ip] = ips[ip] + 1

if ips[ip] > 100:
print "ban ip %s" % ip
os.system("ban_ip.sh %s" % ip)
else:
ips[ip] = 0



print "Bot detected request %s ip: %s" % ( ips[ip], ip )
print line



В данном случае после 100 запросов к someurl бот будет забанен.

Python: обработка строк по мере поступления

Для решения этой задачи есть суперская утилита:
http://code.google.com/p/pytailer/


Ставим Python и easy_install:

apt-get install -y python python-setuptools


На CentOS команды иные:
yum install -y python-setuptools


Ставим tailer:

easy_install tailer


Пишем скрипт:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import tailer

for line in tailer.follow(open('/var/log/nginx/access.log')):
print line


Вот и все, можно теперь любым способом обрабатывать приходящие строки.

Простой скрипт для бана IP

vi /usr/bin/ban_ip.sh


#!/bin/sh

iptables -I INPUT -p tcp -s $1 --dport 80 -j DROP



chmod +x /usr/bin/ban_ip.sh




ban_ip.sh 11.22.33.44

О людях

OpenSource vs Коммерческий софт с закрытым кодом

В холиварах открытый код против закрытого почти всегда скатываются к "Майкрсофт/Adobe" против "наколенных поделок с открытым кодом на sf.net с полугодом от даты рождения". Причем, однако тенденция. Впрочем, в холиварах не менее редко скатываются "закрытая поделка васи пупкина" против "ядро Linux", что тоже однако, тенденция.

Что вот у людей за привычка сравнивать тепло с мягким и обвинять в том, что и первое и второе не кислые? =)

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

Очень много времени в день трачу на слежение за всевозможными форумами / страницами / почтой. Ищу способ, как удобно мониторить сайты без RSS на факт обновления содержимого?

Имхо, мне видится Jabber бот для этого. Отдаешь боту страницу и таймаут и есои ссылка меняется, приходит сообщение со ссылкой.

Heavy Rain - причина купить PS3?

Недавно посоветовали заценить ролики http://www.heavyrainps3.com/#/ru_RU/home

Что же, мегакруто, я скажу =) Много крат круче Max Payne, которого я всегда обажал :)

Игра по Метро 2033 для xBox 360

http://www.ozon.ru/context/detail/id/4995327/

Валим заказывать =)

Оценка производительности 14 серверов приложений на Python

http://www.opennet.ru/opennews/art.shtml?num=25827

Однако, mod_wsgi жуткий обжора :)

вторник, 16 марта 2010 г.

Диагностика проблем с почтой на сервере / VPS

Добрый вечер!

Сегодня решил написать об одной из самых частых и часто сложных проблем при работе с выделенными серверами / VPS - это проблемы с почтой, причем как входящей, так и исходящей. Итак, поехали.

Решение проблем с исходящей почтой

Симптомы - отправляем почту из скриптов, а она не доходит до получателя.

1. Проверьте хостнейм своего сервера. Это делается командой hostname, он должен быть корректным (вида domain.ru либо subdomain.domain.ru). Очень многие сервера отклоняют почту от серверов с некорректнми хостнеймами (например, myserver или my-server).
2. Проверьте, что в DNS имеется А запись для Вашего хостнейма, которая в идеале должна резволвится в IP адрес Вашего сервера. Это правило соблюдать желательно, но не обязательно, хотя так или иначе есть сервера, которые делают такую проверку и требуют, чтобы хостнейм был отражен в DNS.
3. Проверьте наличие PTR записи для основного IP Вашего сервера (обычно, это IP адрес интерфейс eth0). Сделать это можно так: http://phpsuxx.blogspot.com/2009/10/ptr.html При этом, крайне рекомендую в качестве PTR указывать существующий домен, желательно привязанный к этому же серверу. Это правило из разряда "это делать обязательно", так как такие почтовые системы как hc.ru и mail.ru с высокой вероятностью просто отбросят Вашу почту, если не увидят для Вашего IP обратного резолва
4. Проверьте, запущен ли почтовик на Вашем сервере. Почтовик обычно называется Postfix/Exim/Qmail/Sendmail, проверьте его наличе в выдаче ps aux либо попробуйте подключиться к нему телнетом: telnet localhost 25 и в ответ Вы должны получить нечто вот такое (вместо Exim, разумеется, должно быть написано имя Вашего почтовика):

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 sds.fastvps.ru ESMTP Exim 4.69 Tue, 16 Mar 2010 22:46:44 +0300


Если же в ответ Вы получаете "telnet: Unable to connect to remote host: Connection refused", то почтовик по всей видимости не установлен / не настроен / не запущен. За подробностями по этим пунктам, прошу в гугл.

Решение проблем с входящей почтой

1. Проверьте наличие MX для требуемого домена. Если не доходит почта на [email protected], то проверьте, какой Mail Exchange (почтовый сервер) обслуживает требуемый домен:

nslookup -type=MX nic.ru
Server: 213.133.99.99
Address: 213.133.99.99#53

Non-authoritative answer:
nic.ru mail exchanger = 5 relay2.RIPN.net.
nic.ru mail exchanger = 5 relay3.RIPN.net.
nic.ru mail exchanger = 10 relay4.RIPN.net.

Authoritative answers can be found from:


Если же в ответ на запрос Вы получаете ошибку, то значит ошибка в настройках DNS.

2. Проверьте, функционирует ли почтовый сервер, обслуживающий домен. Из предыдущего примера мы узнали, что домен обсушивается тремя почтовыми серверами (но обычно это один сервер), который нужно поочередно првоерить командой telnet:

telnet relay2.RIPN.net 25
Trying 195.209.146.172...
Connected to relay2.RIPN.net.
Escape character is '^]'.
220 relay2.ripn.net ESMTP Sendmail (RIPN); Tue, 16 Mar 2010 22:52:54 +0300


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

3. Человеческий фактор - проверьте в Вашей панели управления, активирована ли почта для домена и созданы ли ящики и не стоит ли случайно правило для отброса почты.

Продолжение следует, дополнение / возражения принимаются.

Chrome бесподобен

Уже 4 день сижу только на Хроме, багов не выявлено, проблем тоже. Возвращаться на всякие там тормозные фаерфоксы крайне не хочется. И Вам рекомендую =)

Allow from / Deny from + mod_rpaf

Решаются вот так: http://binblog.ru/2009/07/apache-mod_rpaf-htaccess/

Вот еще инфа по сабжу: http://www.opennet.ru/openforum/vsluhforumID8/6014.html

Производительность RAID10 в Linux

http://en.wikipedia.org/wiki/Non-standard_RAID_levels#Linux_MD_RAID_10

Похоже, это единственное место, где я нашел скорость random access.

Кратко по производительности выходит следующее:
линейное чтение как у stripe (raid0)
рандомное чтение иногда быстрее на 10-20% чем зеркальный рейд (raid1)
запись / рандомная запись аналогична по скорости другим зеркальным рейдам (raid1)

Так что профит фактически есть только при линейном чтении.

Вот еще обзор RAID1 vs RAID10: http://kendalvandyke.blogspot.com/2009/02/disk-performance-hands-on-part-6-raid.html

Google over IPv6

http://www.google.com/intl/en/ipv6/

Работа с Zeo из Python

Для начала ставим Zope/Zeo: http://phpsuxx.blogspot.com/2010/03/zope-2123-debian-5-lenny.html


#!/usr/bin/env python

from ZEO.ClientStorage import ClientStorage
from ZODB import DB
import transaction

class MyRemoteZODB(object):
def __init__(self, server, port):
server_and_port = (server, port)
self.storage = ClientStorage(server_and_port)
self.db = DB(self.storage)
self.connection = self.db.open()
self.dbroot = self.connection.root()

def close(self):
self.connection.close()
self.db.close()
self.storage.close()

# write data

mydb = MyRemoteZODB('localhost', 8100)
dbroot = mydb.dbroot

dbroot = mydb.dbroot
dbroot['a_number'] = 3
dbroot['a_string'] = 'Gift'
dbroot['a_list'] = [1, 2, 3, 5, 7, 12]
dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' }
dbroot['deeply_nested'] = { 1918: [ ('Red Sox', 4), ('Cubs', 2) ],1919: [ ('Reds', 5), ('White Sox', 3) ], }

transaction.commit()
mydb.close()

# read data

mydb = MyRemoteZODB('localhost', 8100)
dbroot = mydb.dbroot

for key in dbroot.keys():
print key + ':', dbroot[key]

mydb.close()



Как результат будет примерно такое:

a_list: [1, 2, 3, 5, 7, 12]
a_dictionary: {1918: 'Red Sox', 1919: 'Reds'}
a_string: Gift
Application:
a_number: 3
deeply_nested: {1918: [('Red Sox', 4), ('Cubs', 2)], 1919: [('Reds', 5), ('White Sox', 3)]}


Ну что, нравится? :)) О сокращении стоимости разработки при использовании вот такой штуки мне даже страшно думать! Даже если располагать базы только на SSD это будет все равно дико экономически эффективно.

Источник примеров: http://www.ibm.com/developerworks/aix/library/au-zodb/

Как сделать mdash на MacOS X без извращений?

Вот так:
alt+- = –
alt+shift=- = —


Всем любителям длинных тире посвящается.

Сброс пароля Zope

Это довольно легко:

cd /opt/zopeinstance
zpasswd.py inituser


Username: admin
Password:
Verify password:

Please choose a format from:[enter]

SHA - SHA-1 hashed password (default)
CRYPT - UNIX-style crypt password
CLEARTEXT - no protection

Encoding: [enter]
Domain restrictions:[enter]


взято с: https://mail.zope.org/pipermail/zope/2003-June/136938.html

Песенное

Однако, Meredith Brooks - Bitch отличная песня )))

Lyrics просто потрясающи =)

I hate the world today
You're so good to me
I know but I can't change
tried to tell you but you look at me like maybe I'm an angel
underneath
innocent and sweet
Yesterday I cried
You must have been relieved to see the softer side
I can understand how you'd be so confused
I don't envy you
I'm a little bit of everything
all rolled into one

Chorus:
I'm a bitch, I'm a lover
I'm a child, I'm a mother
I'm a sinner, I'm a saint
I do not feel ashamed
I'm your health, I'm your dream
I'm nothing in between
You know you wouldn't want it any other way

So take me as I am
This may mean you'll have to be a stronger man
Rest assured that when I start to make you nervous
and I'm going to extremes
tomorrow I will change
and today won't mean a thing

Chorus

Just when you think you've got me figured out
the season's already changing
I think it's cool you do what you do
and don't try to save me

Chorus

I'm a bitch, I'm a tease
I'm a goddess on my knees
when you hurt, when you suffer
I'm your angel undercover
I've been numbed, I'm revived
can't say I'm not alive
You know I wouldn't want it any other way

понедельник, 15 марта 2010 г.

Что использовать - Zope 3 или же Zope 2?

http://blogs.nuxeo.com/dev/2005/10/zope2-vs-zope3-faq.html

Частично цитирую:

Should I use Zope 2 or Zope 3?
Short answer:
If you need a product that runs on Zope 2, like for example CPS, Plone or Silva, you should use Zope 2. Otherwise you should use Zope3.


Ну и вкратце для любителей "оно лучше" / "оно хуже" отвечаю - "они разные" (Фактически, это разные ветки без совместимости между друг другом. Разве что названием совпадают), но если нужны все спец фичи - юзайте Zope 3 и не задумывайтесь особо :) Все остальные озвученые продукты сделаны на основе Zope 2 не от того, что Zope 3 плохой, а из-за того, что нет смысла их портировать на "другой" Zope 3.

Хотя с другой стороны, по означенной выше причине (Plone и ко), к 3ей версии скорее всего интерес меньше и как следствие проблемы с документацией и, возможно, со стабильностью работы. Также есть ориентированность тройки не на создание сайтов, а на обычную веб-разработку, что также немного сокращает целевую аудиторию.

Так что лично я для себя решил использовать Zope2.

Будущее наступило! ZODB

Хорошая статья по работе с объектной базой данных ZODB: http://www.komtet.ru/info/zope/vvedenie-v-zodb.-avtor-michel-pelletier а вот мануал по работе с ZODB / Zeo http://www.ibm.com/developerworks/aix/library/au-zodb/

А вот измерение скоростных характеристик: http://209.85.135.132/search?q=cache:opzIpUGB4w4J:zope3.ru/stati/testiruem-zodb-na-skorost+zodb&cd=4&hl=ru&ct=clnk&gl=ru

И вот еще - http://www.upfrontsystems.co.za/Members/roche/where-im-calling-from/zodb-benchmarks-revisited

И еще: http://www.upfrontsystems.co.za/Members/roche/where-im-calling-from/zodb-benchmarks/

Также есть очень меткая цитата про ZODB - "ZODB is a low-write high-read database".

Всем поклонникам критичного ко времени простоя софта на Венде посвящается

Надоело каждый раз искать ссылку, поэтому фиксирую здесь:
http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=лондонская+биржа+отказывается+от+windows

Великое множество объектных баз данных

http://en.wikipedia.org/wiki/List_of_object_database_management_systems

Из относительно знакомых это, конечно, Oracle, PostgreSQL (вот уж честно не знал, что он таков), ZODB.

Статья по архитектуре ядра

Прошу - http://iportnov.blogspot.com/2010/03/linux-10.html

воскресенье, 14 марта 2010 г.

Pylons: авторизация посредством AuthKit

Задачу с проверкой логина и пароля мы решили в прошлый раз, теперь хотелось бы в зависимости от логина пользователя давать или не давать ему доступ к определенным контроллерам. Действовать мы будем по мануалу: http://pylonsbook.com/en/1.1/authentication-and-authorization.html#the-authorization-decorator

Теперь открываем наш контроллер:
vi myapp/controllers/main.py


И в блок import ов добавляем следующее:

from authkit.authorize.pylons_adaptors import authorize
from authkit.permissions import RemoteUser, ValidAuthKitUser, UserIn


Теперь мы можем переписать контроллер private в более простом виде :
@authorize(RemoteUser())
def private(self):
return "You are authenticated!"


То есть в декораторе идет проверка является ли юзер залогиненым (установлено ли REMOTE_USER) и только после этого выполняет код метода. При этом в книге по Pylons крайне рекомендуется использовать ValidAuthKitUser() вместо RemoteUser(), так как второй просто проверяет не пустоту поля REMOTE_USER, но не убеждается, что это явно разрешенный в конфиге юзер. Как понимаете, ValidAuthKitUser более безопасен.

Теперь создадим контроллер, который будет доступен только пользователю admin2:

@authorize(UserIn(['admin2']))
def private2(self):
return "You are admin2!"


И если же попытаться войти на эту страницу от имени admin, то в ответ мы получим "403 Forbidden".

Кроме подключения авторизации через декораторы возможно ее использование как Middleware, подробно это описано вот здесь: http://pylonsbook.com/en/1.1/authentication-and-authorization.html#the-authorization-middleware

А вот так вот можно закрыть весь контроллер сразу (я крайне долго искал подобную фичу в Catalyst, но не нашел):

@authorize(ValidAuthKitUser())
def __before__(self):
pass


Ну вот, пожалуй, и хватит с авторизацией. Но замечу, что кроме описанных фич у AuthKit есть еще очень много всего вкусного, например, группы пользователей / роли (то есть можно гранулировано выдавать полномочия на те или иные подсистемы разным юзерам) / разрешения / поддержка OpenID а также искаробочная возможность привязывать юзеров только к определенным IP.

Pylons: аутентификация посредством AuthKit

Есть вот такая отличная библиотека для всего, что только можно вытворить с авторизацией / аутентификацией в веб-приложении (поддерживаются HTTP basic, HTTP digest, form, cookie OpenID ит.д.) http://authkit.org/. Также на офсайте AuthKit явно указано, что с Pylons он работает ну просто супер :) Вот ее мы и будем подключать, хотя есть еще аналоги в лице http://what.repoze.org/docs/1.0/ и http://static.repoze.org/whodocs/ При этом руководствоваться мы будем вот этой инструкцией: http://pylonsbook.com/en/1.1/authentication-and-authorization.html Также в случае проблем с пониманием "куда вставить этот код" использовалась вот эта сборочка: http://pypi.python.org/pypi/SimpleSite/0.3.0

Настроим аутентификацию (просто проверка логина/пароля без контроля прав доступа к различным ресурсам).

Устанавливаем:
easy_install authkit


Открываем конфигурацию middleware:
vi myapp/config/middleware.py


Добавляем в самый верх, в блок import:
import authkit.authenticate


Также ПЕРЕД блоком:

# Display error documents for 401, 403, 404 status codes (and
# 500 when debug is disabled)
if asbool(config['debug']):
app = StatusCodeRedirect(app)
else:
app = StatusCodeRedirect(app, [400, 401, 403, 404, 500])



С аналогичным отступом добавляем подключение auth middleware:

app = authkit.authenticate.middleware(app, app_conf)


Теперь нам необходимо сконфигурировать AuthKit:
vi development.ini


И в самый низ блока "[app:main]" добавляем следующее:

authkit.setup.method = form, cookie
authkit.form.authenticate.user.data = admin:qwerty
[без выравнивания по = раб. не будут ]admin2:qwerty2
authkit.cookie.secret = secret string
authkit.cookie.signoutpath = /main/signout


Таким образом мы создали одного пользователя и выбрали тип аутентификации - формы/куки, а также выбрали метод, при вызове которого будет происходить logout.

Теперь открываем наш контроллер:

vi myapp/controllers/main.py


После этого создаем там методы:

def private(self):
if request.environ.get("REMOTE_USER"):
return "You are authenticated as %s!" % request.environ.get("REMOTE_USER")
else:
response.status = "401 Not authenticated"
return "You are not authenticated"
def signout(self):
return "Successfully signed out!"


И пробуем открыть его через сеть: http://xx.xx.xx.xx:5000/main/private и там нам будет выдана форма, введя в которую admin/qwerty мы станем аутентифицированным пользователем. Проверка статус аутентификации проверяется по логину, который в случае успешной аутентификации помещается в request.environ.get("REMOTE_USER"). Чтобы "вылогиниться" нам необходимо просто посетить адрес http://xx.xx.xx.xx:5000/main/signout при этом куки файл, хранящий данные о залогинености будет удален.

Все, с аутентификацией закончено :)

Pylons: валидация форм посредством ToscaWidgets

В первой части статьи мы научились просто отображать формы: http://phpsuxx.blogspot.com/2010/03/pylons-toscawidgets.html Теперь мы добавим к этому функцию валидации входных данных от форм. На начальном этапе у Вас должен быть проект со всеми правками с прошлого примера. Руководствоваться мы будем вот этим: http://toscawidgets.org/documentation/tw.forms/tutorials/validate_pylons.html

Открываем код нашего контроллера:
vi myapp/controllers/main.py


Добавляем в самый верх подключение модуля валидации:

from tw.mods.pylonshf import validate


Чуть ниже него добавляем (устанавливаем дополнительный валидатор, чтобы год точно был целым числом):

test_form = twf.TableForm('test_form', action='/main/tosca_save', children=[
twf.HiddenField('id'),
twf.TextField('title'),
twf.TextField('year', size=4, validator=twf.validators.Int),
twf.CalendarDatePicker('release_date'),
twf.SingleSelectField('genera', options=['', 'Action', 'Comedy', 'Other']),
twf.TextArea('description'),
])


Также удаляем старый метод tosca и вместо него добавляем следующее:

def tosca(self, **kw):
return test_form()

@validate(form=test_form, error_handler='index')
def tosca_save(self, **kw):
return str(kw)


То есть, если данные валидны (в поле year целое число), они будут переданы обработчику tosca_save и выданы на экран. Иначе будет сделан "редирет" (в кавычках потому что будет просто выдано его содержимое ) на index контроллер. Ну вот теперь у нас есть крайне удобный способ обработки форм без тупой рутины :)

YUI3 прошу любить и жаловать!

http://developer.yahoo.com/yui/3/

jQuery UI рулит

http://jqueryui.com/home

Господа, а есть аналоги вот таких же комплексных виджетов?

Апдейт: YUI2 в этом вопросе еще сильнее рулит http://developer.yahoo.com/yui/examples/

Pylons: подключение ToscaWidgets к Pylons для работы с формами

Есть вот такая обалденная штука: http://toscawidgets.org/ К ней прилагается куча готовых виджетов, их можете найти здесь: http://pypi.python.org/pypi?:action=search&term=tw&submit=search

Ставим сам ToscaWidgets:

easy_install ToscaWidgets


Ставим виджет работы с формами (к слову, есть еще tw.dynforms, но о нем, думаю, позже):

easy_install tw.forms


Далее двигаемся по инструкции по интеграции ToscaWidgets с Pylons: http://toscawidgets.org/documentation/ToscaWidgets/install/pylons_app.html

Открываем настройки middleware:
vi myapp/config/middleware.py


Добавляем в самый верх:
import tw.api as twa


Далее после строки "CUSTOM MIDDLEWARE HERE" добавляем следующее:

app = twa.make_middleware(app, {
'toscawidgets.framework': 'pylons',
'toscawidgets.framework.default_view': 'mako',
})



Теперь открываем контроллер:
vu myapp/controllers/main.py


И в самый верх добавляем подключение виджета:

import tw.forms as twf


И внизу добавляем еще тестовый метод:

def tosca(self):
test_form = twf.TableForm('test_form', action='/main/tosca_save', children=[
twf.HiddenField('id'),
twf.TextField('title'),
twf.TextField('year', size=4),
twf.CalendarDatePicker('release_date'),
twf.SingleSelectField('genera', options=['', 'Action', 'Comedy', 'Other']),
twf.TextArea('description'),
])

return test_form()


И теперь вызываем со сети наш контроллер: http://xx.xx.xx.xx:5000/main/tosca и любуемся довольно миловидными формочками :)

Однако, у YUI Toolkit есть очень крутой Rich Text редактор!

http://developer.yahoo.com/yui/editor/

Контроль состояния процесса посредством pidstat

http://linuxpoison.blogspot.com/2010/03/how-to-monitor-process-on-linux-using.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/frEh+(Linux+Poison)&utm_content=Google+Reader

суббота, 13 марта 2010 г.

Установка PostgreSQL 8 на CentOS / Debian 5

Для любой БД есть список операций, которые надо делать везде и всегда, так вот по крайней мере в Постгерсе он не особо тривиален, в связи с этим этот небольшой очерк о том, как по быстрому завести Постгерс для работы :)

Установка:
yum install -y postgresql-server # Centos5 )
apt-get -y install postgresql-8.4 postgresql-8.4-postgis # Debian 5


Запуск:
/etc/init.d/postgresql start


Сначала небольшие манипуляции с авторизацией -- включаем вход по паролю:
/etc/postgresql/8.4/main/pg_hba.conf (для Убунт всяких и Дебиянов)
а для Центос:
/var/lib/pgsql/data/pg_hba.conf

Для Centos.

Комментим строку:
host all all 127.0.0.1/32 ident sameuser


И добавляем:
host all all 127.0.0.1/32 md5


su postgres (по соображениям безопасности Постгрес руту доступа не даёт)
createuser --pwprompt --superuser --no-createdb --no-createrole my_db_user
createdb my_test_database --owner my_db_user


psql my_test_database my_db_user --password -h 127.0.0.1

Удаление юзеров и баз данных осуществляется так:
dropuser -i my_db_user (но пока у юзера есть бд, у которых он значится владельцем, его удалить нельзя)
dropdb -i my_test_database

Прикольный рендер графов на JS+SVG

http://pavel-kudinov.livejournal.com/64525.html

CouchDb + Pylons - проще простого!

http://chrismoos.com/2009/02/03/couchdb-and-pylons-getting-started/

Крутой веб-фреймворк на С++

http://cppcms.sourceforge.net/wikipp/en/page/main

Установка CouchDB из testing на Debian 5 Lenny

Для тех, кто не в теме, что это такое, прошу вот сюда: http://couchdb.apache.org/ А вот техническое описание.

В дистрибутиве Debian 5 присутствует относительно немолодая версия CouchDb - 0.8.0-2, а в библиотеке интеграции с python крайне рекомендуются версии выше 0.9, поэтому использовать CouchDb из стабильного репозитория не получится. Но тут нем на помощь приходит testing репозиторий: http://packages.debian.org/testing/couchdb, где есть аж 0.10.1-1 версия CouchDB. Как правильно ставить ПО из testing можете прочитать вот здесь.

Управление СУБД CouchDB осуществляется посредством init.d скрипта:

/etc/init.d/couchdb start


Сразу заметил кучу косяков с init.d скриптами - при restart создаются новые инстанции CouchDB, а старые не убиваются (основная причина в том, что не работает /etc/init.d/couchdb stop). Так что будьте острожны, это может повлечь кучу side эффектов. Подробнее о баге: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=550782

Тестируем работу CouchDB:

wget -q -O- http://127.0.0.1:5984/
{"couchdb":"Welcome","version":"0.10.1"}


Отвечает она, как можно видеть, в формате JSON.

Включаем консоль администрирования.


CouchDB имеет крайне удобный интерфейс работы со своими внутренностями (в смысле с данными и конфигурацией самой CouchDB), который неприменно хотелось бы использовать.

Открываем файл конфигурации CouchDB:
vi /etc/couchdb/default.ini


Находим там следующее:

[httpd]
port = 5984
bind_address = 127.0.0.1


И заменяем на:

[httpd]
port = 5984
bind_address = 0.0.0.0


Останавливаем CouchDB (за кривой способ спасибо корявым init.d скриптам):
killall -u couchdb


И запускаем заново:
/etc/init.d/couchdb start


Открываем в браузере: http://xx.xx.xx.xx:5984/_utils/index.html и наблюдаем веб-панель для администрирования, где можно создавать / удалять базы данных. Создавать / редактировать и удалять "документы" и многое многое другое! Выглядит же все это так: http://couchdb.apache.org/screenshots.html

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

Как страшно жить!

Вот тут спокойно живешь и не знаешь о ТАКОМ: http://ru.wikipedia.org/wiki/Случаи_ложного_срабатывания_систем_предупреждения_о_ракетном_нападении

Позитиффф по третьей мировой, велкам=)

Рекомендую: http://u-96.livejournal.com/2038356.html

Сделаем планету разумнее вместе с IBM !

Прошу всех на сайт: http://www-05.ibm.com/innovation/ru/think/index.html?ca=neiotru_smart_planet-20090128&me=a&met=print&re=smart_planet?ca=content_body&met=ru_smarterplanet_opinions_planet

Там творится история :)

Гены помогают заглянуть в прошлое

Это потрясающе просто, у меня других слов нету! Прошу: http://www-05.ibm.com/innovation/ru/think/video_gallery.html?ca=neiotru_smart_planet-20090128&me=w&met=gallery&re=gateway

После перехода по ссылке выбираем слева: "Гены помогают заглянуть в прошлое".

Двоичный код против преступности

http://www-05.ibm.com/innovation/ru/think/video_gallery.html?ca=neiotru_smart_planet-20090128&me=w&met=gallery&re=gateway

После перехода по ссылке выбираем слева ролик "Полиция Нью-Йорка".

пятница, 12 марта 2010 г.

Разумное управление транспортными потоками улучшает условия жизни в городах. IBM

Крайне рекомендую всем к просмотру: http://www-05.ibm.com/innovation/ru/think/video_gallery.html?ca=neiotru_smart_planet-20090128&me=w&met=gallery&re=gateway

Фраза "внедрено за 2 месяца" просто поражает воображение. Даже представить такого не могу. Да и вообще, всем в теме ИТ крайне рекомендую посмотреть там ВСЕ ролики.

Как разрешить пользовательскому приложению забиндится на низкий (ниже, чем 1024) порт?

http://catap.ru/blog/2010/03/12/listen-privileged-port/

Полностью переехал на Chrome

Вот недавно эксперимента ради поставил Chrome 5.0.307.11 beta. Но запустить руки дошли только сегодня :) От первых впечатлений о скорости его работы, крышу снесло и я теперь работаю только на нем :) И Вам рекомендую, хотя бы попробовать.

Обзор средств виртулизации от IBM (обзор от них, а не средства)

http://markelov.blogspot.com/2010/03/system-x-virtualization-strategies.html

Зависимость качества проекта от языка реализации

Странно, но это есть. Почти всегда проект писаный на Перле выглядит как унылое испражнение из прошлого века, уж простите. Тому пример всякие там twiki, багзиллы прочая хренота. Софт на PHP выглядит аналогично - непритязательно, но задачу решает и ладно, с угребищным видом можно смирится. Софт на Яве почти всегда всецело повторяет саму Яву - монструозный, тормозной, неповоротливый и не интуитивный интерфейс.

А вот проекты на вских модных Питонах / Рубях часто выглядят очень няшно и удобны в использовании. Скажите - надумано? Нет, тенденция. Но все же я не обобщаю, есть и хорошие проекты на Перле и плохие на том же Руби. Но общая зависимость от этого ничуть не страдает.

Как причину такого я вижу уровень модности языков и понимание сущности веба (веб два нуль и все такое, ога) основной массой носителей языка. Перл по факту старый язык и основная масса его "носителей" выросли в эру веб один нуль пре бета. ПХП поновее, чуть захватили начало веб два нуль. Ну а Райлс и всякие там Джанго появились в эру веб два нуль. Ну а Ява, ну что о ней сказать? =) Я недавно тут писал про молоток, так что повторяться не буду.

Может именно поэтому, как считаете?

Также отмечу снижение сложности разработки. В те же времена Perl CGI приложений и простых ПХП движков без лежащих в основе крутых каркасных фреймворков даже до этапа "форма авторизации и десяток страниц" можно было идти несколько недель, сейчас же это делается за полчаса и можно сэкономленное время отдать на доводку красоты интерфейса :)

Ну и да - C/C++ вечны и обсуждению не подлежат, как само собой разумеющееся и вечное во все времена и при любой политической системе.

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

CentOS OpenVZ + ntpd = не синхронизируется время

Открываем конфиг:
vi /etc/ntp.conf


Заменяем там:

server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org


на:

server 0.centos.pool.ntp.org burst iburst
server 1.centos.pool.ntp.org burst iburst
server 2.centos.pool.ntp.org burst iburst


Перезапускаемся:

/etc/init.d/ntpd restart


Смотрим, подводится ли корректно время (расхождение должно сокращаться):

sntp time.nist.gov


Ну в итоге не помогло и сделал явный ntpdate. Так что этот мануал нужно дополнять еще добавлением спец опций ядра по ACPI.

источник: http://forum.openvz.org/index.php?t=msg&goto=7153&

Восстановление служебных логов после хакерской атаки на сервер

Можно сделать просто:
touch wtmp btmp

Быстрое удаление миллионов файлов на ext3

У ext3 есть одна замечательная особенность - удаление большого числа занимает ОГРОМНОЕ количество времени. Это происходит по вине журналирования, которое в данном конкретном случае нам только мешает.

Итак, имеем папку с 5 миллионами файлов:

find mod-tmp/ | wc -l
5482917


Отмонтируем файловую систему с папкой:
umount /mnt


Монтируем ее как ext2:

mount -t ext2 /dev/md2 /mnt


Очень быстро удаляем папку:

time rm -rf mod-tmp2

real 39m34.672s
user 0m1.108s
sys 1m14.433s


Ну, не супер быстро, но тем не менее намного быстрее, чем в случае с ext3.

ГТК Россия, поиск рейса

* Рекомендации, соответствующие условиям поиска, не найдены. Выберите другие критерии поиска и повторите запрос. (66002 [-1])


и

Обработать запрос сейчас невозможно. Рекомендуется повторить запрос через несколько минут. Приносим свои извинения за неудобство.


Это что за млять такой, а?

P.S. повторно баг не повторился, уже спасибо =) А-то прямой рейс тока у них ))

Сайт аэропорта Курумоч / Самара

Вот здесь можно посмотреть все рейсы с Самары на интересующую дату: http://airport.samara.ru/

Аэрофлот бонус и юзабилити

У сервиса https://www.aeroflotbonus.ru/ куча очевидных багов в юзабилити мастера регистрации. Уже один "неявный" намек на формат даты (11/11/11) уже много стоит. А то, что контрольный вопрос класса "ваше любимое блюдо" должен заполнять латиницей... ладно, написать один раз его латиницей я могу, но второй раз воспроизвести на память написание - увольте!

Техподдержка S7

Вчера наткнулся на баг при заказе билетов на сайте АК Сибирь, написал им в саппорт. Ответ пришел через 3 часа :) Ну что же, не блеск скорости реакции, конечно, но радует. Особенно на фоне ряда компаний, от которых вообще можно не получить ответа на почту, даже через год.

Как в Drupal назначить разные шаблоны для разных страниц?

Посредством модуля Taxonomy Theme http://drupal.org/project/taxonomy_theme, но для Drupal 6 он не был портирован, поэтому на замену к нему приходит модуль ThemeKey: http://drupal.org/project/themekey. Этот модуль позволяет задавать конкретную тему для категорий / отдельных страниц.

Как создать блок со скругленными краями?

Вот примерно вот так: http://dotrb.blogspot.com/2009/05/css-sprites-rounded-block.html

Как быстро создать свою тему для Drupal 6?

Копируем стандартную тему:
cp -R bluemarine/ mytheme


В папке темы есть ряд файлов различного назначения:

bluemarine.info - метафайл с информацией о теме, используется для нужд Drupal6
logo.png - логотип на теме
screenshot.png - скриншот темы
style-rtl.css - CSS стиль для варианта чтения "справа налево", нам не нужен
style.css - CSS стиль для варианта чтения "слева направо", как раз наш случай
comment.tpl.php - шаблон комментария
page.tpl.php - шаблон страницы, это самый главный шаблон, здесь фактически задано все, что Вы видите на главной стандартной Drupal странице и на всех остальных.
block.tpl.php - шаблон блоков (это левая либо правая части страницы; например, в стандартном случае это "User login")
box.tpl.php - шаблон блока, окружающего все элементы страницы. Например, такой окружает комментарии.
node.tpl.php - шаблон отображения страниц сайта, например, контролирует аннотации и заголовки статей


Переходим в папку темы:
cd mytheme


Переименовываем стандартную тему:
mv bluemarine.info mytheme.info


Открываем информационный файл темы:
vi mytheme.info


Ищем там:
name = Bluemarine


и заменяем на:
name = Mytheme


После этого в списке тем движка Drupal появится новая тема "Mytheme", переключаемся на нее, чтобы далее уже работать на живом пациенте :)

взято с: http://tips.webdesign10.com/how-to-make-a-drupal-theme и http://drupal.org/phptemplate

Как создавать темы оформления под Drupal?

http://tips.webdesign10.com/how-to-make-a-drupal-theme

Установка Drupal 6.16

Вот меня что-то сподвигло заняться сайтом :) Сам дистрибутив Друпала можно взять здесь: http://drupal.org/project/drupal, русификатор вот здесь. Русификатор лучше накатить до установки - распаковать в папку с движком. После этого во всех папках модулей появится папка translations с вложенным .po файлом перевода :)

С 5 апреля 2010 года в силу вступает новый Визовый кодекс ЕС

С 5 апреля 2010 года в силу вступает новый Визовый кодекс ЕС (Community Code on Visas). Он приводит в единую форму требования и правила выдачи виз гражданам третьих стран, желающих въехать на территорию членов Европейского Союза. Несколько интересных замечаний:


(с) http://abbra.livejournal.com/161063.html