FastNetMon

Thursday 29 October 2009

Flash, мониторинг использования приложения

Вот, прошу: http://www.mochibot.com/

Google Developer Day 2009 – вы участвуете!

Благодарим Вас за регистрацию на конференции Google Developer Day, которая пройдёт 10 ноября в Москве. Мы будем очень рады видеть Вас среди ее участников. Подробнее о конференции, ее расписании и о том, как добраться до места ее проведения, рассказано на сайте http://code.google.com/intl/ru/events/developerday/2009/home.html.

Eaccelerator + cannot create shared memory area

Столкнулся с ошибкой:

[Thu Oct 29 18:44:18 2009] [error] [client 95.79.241.196] PHP Warning: [eAccelerator] Can not create shared memory area in Unknown on line 0



Фиксица внесением в файл eaccelerator.ini

eaccelerator.shm_size="0"

Wednesday 28 October 2009

Генерация CSR

Что делать, если GoDaddy ругается: "Make sure the CSR you generate uses a 2048 or greater bit key lengthLearn more"

Но, прошу отметить тот факт, что Common Name для WildCard должно быть следующее: "*.domain.ru" (без кавычек, разумеется).

Генерируем приватный ключ:

openssl genrsa -des3 -out domain.key 2048


Генерируем CSR:

openssl req -new -key domain.key -out domain.csr

Можно прочесть информацию из уже сгенерированного CSR:
openssl req -text -noout -in host.csr



Источник: инструкцию

Конференция по управлению проектами

S.T.A.L.K.E.R на XBOX360

Ура!

S.T.A.L.K.E.R.: Call of PripyatGSC Game Worlds has confirmed that any port of S.T.A.L.K.E.R. on Xbox 360 will be released after the release of Call of Pripyat.

PHP-FPM на Debian5 + ISPManager

Каждый хочет иметь легковесный php fpm, но как его скрестить с панелью ISPManager ? В этой статье я расскажу, как сделать это с минимальными потерями времени и нервов :)

Открываем файл: vi /etc/apache2/ports.conf и комментируем строки:


#NameVirtualHost *:80
#Listen 80


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

/etc/init.d/apache2 restart



После этого убеждаемся, что Апач остался лишь на 443 порту и не забинден на 80й.

Теперь ставим nginx:

apt-get install -y --force-yes nginx


Далее нам необходимо собрать php-fpm, вот офсайт автора: http://github.com/dreamcat4/php-fpm


apt-get install -y libxml2-dev libjpeg62-dev make patch autoconf libpng-dev libfreetype6-dev libmysqlclient15-dev


Теперь ставим обновленный libevent (по мануалу с сайта автора fpm):


export LE_VER=1.4.12-stable
wget "http://www.monkey.org/~provos/libevent-$LE_VER.tar.gz"
tar -zxvf "libevent-$LE_VER.tar.gz"
cd "libevent-$LE_VER"
./configure --prefix=/opt/libevent && make
make install
export LIBEVENT_SEARCH_PATH="/opt/libevent"


Генерируем патч (полный список патчей вот здесь, а старые вот здесь):

export PHP_VER=5.3.0
# или
export PHP_VER=5.2.11
wget "http://launchpad.net/php-fpm/master/0.6/+download/php-fpm-0.6~$PHP_VER.tar.gz"
tar -zxvf "php-fpm-0.6~$PHP_VER.tar.gz"
"php-fpm-0.6-$PHP_VER/generate-fpm-patch"


Качаем исходники пхп:

wget "http://us.php.net/get/php-$PHP_VER.tar.gz/from/us.php.net/mirror"
tar xvfz "php-$PHP_VER.tar.gz"
cd "php-$PHP_VER"


Патчим пхп и собираем:

patch -p1 < ../fpm.patch ./buildconf --force mkdir fpm-build && cd fpm-build ../configure --with-fpm --prefix=/opt/php53 --with-libevent="$LIBEVENT_SEARCH_PATH" --with-mysql --with-gd --with-freetype-dir=/usr/include/freetype2 --with-jpeg-dir=/usr/lib && make # или ../configure --with-fpm --prefix=/opt/php52 --with-libevent="$LIBEVENT_SEARCH_PATH" --with-mysql --with-gd --with-freetype-dir=/usr/include/freetype2 --with-jpeg-dir=/usr/lib && make make install






Да, и общее замечание -- при изменении опций configure рекомендую делать make clean, иначе глюки обеспечены (у меня они возникли, когда jpeg не цеплялся, clean спас) :)

Добавляем fpm в автозапуск:

update-rc.d php-fpm defaults; invoke-rc.d php-fpm start



Открываем конфиг: /etc/php-fpm.conf и все вхождения nobody заменяем на www-data
Итак, запускаем php-fpm: /etc/init.d/php-fpm start

Убеждаемся, что все поднялось:

ps aux | grep fpm
root 13445 0.0 0.0 14392 2104 ? Ss 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf
www-data 13446 0.0 0.0 14392 1840 ? S 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf
www-data 13447 0.0 0.0 14392 1840 ? S 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf
www-data 13448 0.0 0.0 14392 1840 ? S 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf
www-data 13449 0.0 0.0 14392 1840 ? S 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf
www-data 13450 0.0 0.0 14392 1840 ? S 15:48 0:00 /opt/php53/bin/php-fpm --fpm-config /etc/php-fpm.conf



Теперь создаем папку: /var/www/fpmroot, там размещаем файл index.php со следующим контентом:
<?PHP phpinfo(); ?>



Теперь конфигурируем nginx, открываем файл vi /etc/nginx/sites-enabled/default

server {
listen 80;
server_name localhost;

access_log /var/log/nginx/localhost.access.log;

location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/fpmroot$fastcgi_script_name;
include fastcgi_params;
}
}


После этого перезапускам nginx: /etc/init.d/nginx restart

И любуемся результатом нашей работы :)

Источник: https://bugs.launchpad.net/php-fpm/+bug/397721

Magento на VPS или репо для PHP FPM

http://varien.com.ua/blog/ustanovka-magento-dlya-raboty-s-nginx-php-fpm-apc/

Tuesday 27 October 2009

Установка mod_rpaf Centos

rpm -ihv http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm


Теперь надо отключить этот репозиторий, чтобы система случаем чего лишнего не апнула vi /etc/yum.repos.d/centalt.repo:

enabled=0


Теперь ставим пакет:

yum -y --enablerepo=CentALT install mod_rpaf


Теперь конфигурируем: vi /etc/httpd/conf.d/00-rpaf.conf (вместо xx.xx.xx.xx вписываете айпи вашей машинки)



LoadModule rpaf_module /usr/lib/httpd/modules/mod_rpaf-2.0.so # 32 битные ОС
LoadModule rpaf_module /usr/lib64/httpd/modules/mod_rpaf-2.0.so # 64 битные ОС
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips xx.xx.xx.xx
RPAFheader X-Real-IP



/etc/init.d/httpd restart



Как проверить, работает ли установленный модуль (взято у Mchost).

На любом из доменов, которые расположены на Вашем сервере, разместите файл test.php с содержимым:

<?PHP
echo $_SERVER['REMOTE_ADDR'];
?>



Далее зайдите по ссылке http://domain.tld/test.php, где domain.tld - имя вашего домена. Если как результат отображается IP, отличающийся от IP вашего сервера, модуль работает корректно.

Premature optimization is the root of all evil

"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." - Donald Knuth.

Planet-4033 стандартный айпи, логин и пароль

Planet Wap-4033, 192.168.0.1. логин пароль, admin admin

Monday 26 October 2009

Забанить сайт по vhost в iptables?

iptables -I INPUT 1 -p tcp --dport 80 -m string --string "domain.ru" --algo kmp -j DROP

Как запустить fsck на clean ФС?

fsck.ext3 -f /dev/md2

Пути до папок c шаблонами аккаунт и www домена в ISPManager

/usr/local/ispmgr/etc/www.skel и /usr/local/ispmgr/etc/home.skel соответственно.

Установка ISPManager


wget "http://download.ispsystem.com/install.sh"
sh install.sh

Обновить PHP до 5.2 на Centos5

Довольно частая проблема многих клиентов многих хостингов :) Решается весьма несложно.

Создаем файл:
vi /etc/yum.repos.d/CentOS-Testing.repo


Со следующим контентом:

# CentOS-Testing:
# !!!! CAUTION !!!!
# This repository is a proving grounds for packages on their way to CentOSPlus and CentOS Extras.
# They may or may not replace core CentOS packages, and are not guaranteed to function properly.
# These packages build and install, but are waiting for feedback from testers as to
# functionality and stability. Packages in this repository will come and go during the
# development period, so it should not be left enabled or used on production systems without due
# consideration.

[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
includepkgs=php*



Обновляемся:

yum --enablerepo=c5-testing update php*


Источник: http://wiki.centos.org/HowTos/PHP_5.1_To_5.2

Установка Zend Optimizer на Debian / CentOS

Переходим /tmp, чтобы случайно не замусорить систему :)

cd /use/src


Для 32 битного Линукса делаем следующее:

wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
tar -xf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
cd ZendOptimizer-3.3.9-linux-glibc23-i386


А для 64 битного следующее:

wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz
tar -xf ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz
cd ZendOptimizer-3.3.9-linux-glibc23-x86_64


mkdir /opt/zend
mv data/5_2_x_comp/ZendOptimizer.so /opt/zend/


А чтобы подключить его на Дебияне достаточно в файл:
vi /etc/php5/conf.d/zend.ini


(а на Centos 5 в файле /etc/php.ini, в самом низу) поместить строки:
zend_extension=/opt/zend/ZendOptimizer.so


Перезапускаем Апача:
/etc/init.d/apache2 restart


Либо юзаем скрипт для Дебияна (только 64 битная версия):

wget http://fastvps.googlecode.com/svn/trunk/scripts/install_zend_debian.sh
sh install_zend_debian.sh

Saturday 24 October 2009

Отладка Zabbix

Для отладки Zabbix с разрешенного ущла можно использовать такую команду:
[root@host ~]# zabbix_get -s 127.0.0.1 -p 10050 -k proc.num[smartd]
1
[root@host ~]# zabbix_get -s 127.0.0.1 -p 10050 -k proc.num[mdadm]
1

Добавить свой сайт в индекс Google и Yandex? Легко!

Вот ссылки:

http://www.google.ru/addurl/?continue=/addurl
http://webmaster.yandex.ru/

Friday 23 October 2009

AdWords тоже модерирует объявления

Сейчас составил рекламу для AdWords, сейчас висит в статусе "Pending review". Хотя по куче откровенного спама (поиск мобильника по номеру и проч. ересь) не особо было похоже, что хоть кто-то их модерировал ранее...

Посылка email уведомлений в случае отказа soft raid в Centos/Debian 5

Чинить Рейд массив уже постфактум, когда "все сломалось", занятие не особо приятно, поэтому проблему нужно предупреждать!

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

Для начала настроим адрес администратора сервера: http://phpsuxx.blogspot.com/2009/06/root-email.html

Теперь открываем файл: /etc/mdadm.conf (на Debian: /etc/mdadm/mdadm.conf) там должно быть примерно следующее:

DEVICES /dev/sda* /dev/sdb*
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=a3a769a2:d63d791e:6fac0352:e67bc837
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=d923ab87:d19bc8a4:76f52a39:cd3e1a1b



Добавляем туда две строки:

MAILADDR support@domain.ru
MAILFROM server1@domain.ru


Перезапускаем монитор на Centos:

/etc/init.d/mdmonitor restart


Перезапускаем монитор на Debian:

/etc/init.d/mdadm restart


Убеждаемся, что монитор добавился в автозагрузку:

chkconfig --list | grep mdmonitor
mdmonitor 0:off 1:off 2:on 3:on 4:on 5:on 6:off


На Debian:

update-rc.d mdadm defaults


Теперь в случае, если рейд рассыпится, будет выслано уведомление на support@domain.ru (только проверьте пожалуйста, что у вас точно работает почта)

Кстати, вот очень интересный способ мониторинга Заббиксом: http://www.zabbix.com/forum/archive/index.php/t-3135.html

Мониторинг SMART на Centos и Debian

Ставим и запускаем демона smartd:

Для Centos:

yum install -y smartmontools
/etc/init.d/smartd start


Для Debian:


apt-get install smartmontools -y --force-yes


Теперь разрешаем автозапуск, открываем файл
vi /etc/default/smartmontools

и там убираем комментарий у записи: #start_smartd=yes

И запускаем:
/etc/init.d/smartmontools restart


Результат запуска можно посмотреть в Syslog (на Debian: /var/log/syslog, на Centos /var/log/messages ):

(C) 2002-8 Bruce Allen
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Home page is http://smartmontools.sourceforge.net/
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Opened configuration file /etc/smartd.conf
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Problem creating device name scan list
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sda, opened
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device /dev/sda: using '-d sat' for ATA disk behind SAT layer.
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sda, opened
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sda, found in smartd database.
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sda, is SMART capable. Adding to "monitor" list.
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sdb, opened
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device /dev/sdb: using '-d sat' for ATA disk behind SAT layer.
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sdb, opened
Oct 23 22:12:46 CentOS-53-32-minimal smartd[26841]: Device: /dev/sdb, found in smartd database.
Oct 23 22:12:47 CentOS-53-32-minimal smartd[26841]: Device: /dev/sdb, is SMART capable. Adding to "monitor" list.
Oct 23 22:12:47 CentOS-53-32-minimal smartd[26841]: Monitoring 0 ATA and 2 SCSI devices
Oct 23 22:12:47 CentOS-53-32-minimal smartd[26891]: smartd has fork()ed into background mode. New PID=26891.


После этого демон smartd будет добавлен в автозапуск:

chkconfig --list | grep smart
smartd 0:off 1:off 2:on 3:on 4:on 5:on 6:off


Теперь смотрим, какие диски у нас есть: ls -la /dev/ | grep sd

crw-rw---- 1 root tty 2, 61 Aug 24 08:22 ptysd
brw-r----- 1 root disk 8, 0 Aug 24 08:22 sda
brw-r----- 1 root disk 8, 1 Aug 24 08:22 sda1
brw-r----- 1 root disk 8, 2 Aug 24 08:22 sda2
brw-r----- 1 root disk 8, 3 Aug 24 08:22 sda3
brw-r----- 1 root disk 8, 16 Aug 24 08:22 sdb
brw-r----- 1 root disk 8, 17 Aug 24 08:22 sdb1
brw-r----- 1 root disk 8, 18 Aug 24 08:22 sdb2
brw-r----- 1 root disk 8, 19 Aug 24 08:22 sdb3
crw-rw---- 1 root tty 3, 61 Aug 24 08:22 ttysd


Итого, нас интересуют: /dev/sda и /dev/sdb

Теперь можем легко получить SMART информацию о любом из винтов: smartctl --all /dev/sdb в ответ нам будет выдано огромное количество информации :)

Теперь об автоматике, в конфиге smatd /etc/smartd.conf по сути одна настройка:

DEVICESCAN -H -m root

Она означает, что в случае возникновения проблем, которые обнаружит смарт будет послано письмо руту (-H Monitor SMART Health Status, report if failed).

Вот хорошая статья по настройке уведомлений в случае ошибок SMART: http://ksimute.trancom.ru/smart-hdd.shtml

Мониторинг software raid linux

Какие средства кто знает для мониторинга soft raid на linux ? Кроме /proc/mdstat ничего в голову не приходит.

Вот ещё способ:

mdadm --detail /dev/md2
/dev/md2:
Version : 00.90.03
Creation Time : Tue Jun 16 18:41:35 2009
Raid Level : raid1
Array Size : 293684160 (280.08 GiB 300.73 GB)
Used Dev Size : 293684160 (280.08 GiB 300.73 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 2
Persistence : Superblock is persistent

Update Time : Fri Oct 23 18:39:55 2009
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

UUID : 5345cce2:1e5da02a:776c2c25:004bd7b2
Events : 0.8

Number Major Minor RaidDevice State
0 8 3 0 active sync /dev/sda3
1 8 19 1 active sync /dev/sdb3



А вот так смотреть статус в виде, удобном для скриптов:
mdadm --detail /dev/md0 | grep 'State :' | awk '{print $3}'


Для массива в "нормальном состоянии" выдача скрипт будет "clean"

Перевод денег с AdSense на AdWords...

Самое странное и глупое, что он невозможен! Пруфлинк: http://adwords.google.com/support/aw/bin/answer.py?hl=en&answer=78521

Thursday 22 October 2009

MBA в Сколково

Да, хорошие у них цены я скажу... http://www.skolkovo.ru/content/view/747/654/lang,ru/

Microsoft Hyper-V Server

Наверное, никто этой фразы в моем блоге ожидать не мог, но, увы, это случилось :) Предлагаю Вашему вниманию обзор бесплатного продукта Microsoft Hyper-V Server (это гипервизор во многом аналогичный Xen, Citrix Xen Server и VmWare ESX/ESXi): http://www.microsoft.com/hyper-v-server/en/us/default.aspx Он абсолютно бесплатен (ну разве что вас попросят зарегистрироваться) и может быть скачен с сайта, но при этом не стоит забывать, что все виртуальные машины, которые Вы будет запускать внутри контенеров подлежать обязательному лицензированию (или использованию в течение триальных 180 дней согласно лицензии MS).

Кстати, а вот Вам об опыте внедрения сабжа, тык.

Железная платформа Last.fm



For those of you who think it can't be so hard to run this site, here are a few facts for you:

18 web nodes - newest ones are Dual-CPU dualcore Opteron 4GB RAM 1U.
12 profile database servers (soon to be Hadoop nodes) - 12-disk SCSI 8GB RAM dual Opteron 3U.
2 global database servers - 12-disk SCSI 16GB RAM dual Opteron 3U.
5 storage nodes - 12 SATA disks, 3TB each.
Plus another 20 or so general-purpose boxes for indexing, searching, charts, etc.

We have 5 racks' worth of equipment spread across 2 datacenters in east London. All in all about 140 CPU cores and 230GB of RAM.

Average bandwidth usage: 300 Megabits (10 megabits of that is solely HTML).
Total power supply: 24kW (102 amps), which probably costs us about £100/day.



потырено с: http://www.lastfm.ru/user/Russ/journal

Опенсорц решение для онлайн маркетинга

Прошу любить и любить: http://www.openx.org/ru

А между тем last.fm работает на PostgreSQL

Пруфлинк: http://www.lastfm.ru/user/Russ/journal/2008/02/21/zd_postgres_connection_pools%3A_pgpool_vs._pgbouncer

Вывести результат сканирования nmap в XML

Довольно легко:
nmap -oX - -A domain.ru

Wednesday 21 October 2009

Как тюнить Постгрес?

Привет, комарады! А кто подскажет, где искать мануалы по тюнингу PostgreSQL ? В идеале получить что-то наподобие MySQL'евых предефинед конфигов "small/middle/huge".

Сборка агента Zabbix 1.6

Версия Агента нам некритична, поэтому будем ставить его из репозитория Epel.

Установка Агента
Подключаем Epel:
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm


Ставим Агента:

yum install -y zabbix-agent


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

vi /etc/zabbix/zabbix_agentd.conf


И изменяем там следующие настройки:

Server=айпи _сервера_zabbix
Hostname=хостнейм_текущей_машинки
Timeout=30


Запускаем:

chkconfig zabbix-agent on
/etc/init.d/zabbix-agent start


Теперь надо добавить правило в фаерволл (перед COMMIT) для работы zabbix:

vi /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10050 -s 1.1.1.1 -j ACCEPT
/etc/init.d/iptables restart


Теперь после этого сервер необходимо добавить в мониторинг:


Включение сервера в мониторинг

1. Входим на: http://zabbix.ru
2. "Настройка" => "Узлы сети"
3. В списке выбираем "узлы сети", далее щелкаем "Создать узел сети"
4. Имя "server1.domain.ru" (хостнейм машинки)
5. Добавляем группу "Hosting"
6. Ставим: "Подключиться к IP адрес"
7. Вписываем DNS имя и IP машинки
8. Связать с шаблоном, жмем "добавить" и выбираем там "Template_Linux"
9. Тыкаем "Ok"

Pylons: CRUD для SQLAlchemy

Итак, мы дошли до самого интересного -- качественного CRUD интерфейса для работы с SQLAlchemy.

Вот ссылка: http://docs.formalchemy.org/current/ext/pylons.html#administration-interface

Запускаем:
paster create -t pylons_fa myapp


И конфигурируем следующим образом:

Enter admin_controller (Add formalchemy's admin controller) [False]: True
Enter template_engine (mako/genshi/jinja2/etc: Template language) ['mako']: mako
Enter sqlalchemy (True/False: Include SQLAlchemy 0.5 configuration) [False]: True



После этого конфигурируем модель: http://phpsuxx.blogspot.com/2009/10/pylons_18.html

Теперь открываем: http://127.0.0.1/admin

Но у меня закрался баг -- слетели стили и все стало жутко некрасиво (ошибка в стиле: "/admin/_static//admin.css" ).

Переходим в папку cd myapp/public/ и стаскиваем следующие файлы:

wget http://formalchemy.googlecode.com/hg/formalchemy/ext/pylons/resources/edit.png
wget http://formalchemy.googlecode.com/hg/formalchemy/ext/pylons/resources/add.png
wget http://formalchemy.googlecode.com/hg/formalchemy/ext/pylons/resources/admin.css
wget http://formalchemy.googlecode.com/hg/formalchemy/ext/pylons/resources/delete.png


Теперь открываем файл admin.css и заменяем все упоминания png файлов с ./edit.png на edit.png

А также добавляем строки:

.ui-icon-circle-plus {
background-image: url(add.png);
)


Теперь идем в папку: myapp/templates/forms/ и открываем файл: restfieldset.mako и там строчку:

href="${url('fa_static', path_i nfo='/admin.css')}"

меняем на

href="/admin.css"



Итого - вещь ОЧЕНЬ сырая и насмерть завязанная на Mako. Так что ищем альтернативы или пишем сами.

Установка системы мониторинга Zabbix Server 1.6.6 на CentOS 5 из исходного кода

Начало
Почти любая установка начинается со страницы Download http://www.zabbix.com/download.php. Zabbix исключением не будет, т.к. в репозитории CentOS его пакетов не обнаружено (в EPEL они есть, но версии 1.4.6, что сильно старо). Родной мануал по установке находится вот здесь: http://www.zabbix.com/documentation.php ; да, кстати, он в PDF, так что готовьтесь найти пдф ридер.

Подготовка
Создаём пользователя, под которым будет работать Zabbix:
useradd zabbix -m

Подключаем репозиторий Epel: http://phpsuxx.blogspot.com/2009/03/centos-rhel.html


Создаём БД, вариант для MySQL:
mysql -uroot -pyourpassword -e "CREATE DATABASE zabbix_server CHARSET 'utf8'";
mysql -uroot -pyourpassword -e "GRANT ALL PRIVILEGES ON zabbix_server.* TO 'zabbix'@'localhost' IDENTIFIED BY 'qwerty' WITH GRANT OPTION;"

Вливаем схемы таблиц:
1. переходим в папку create/schema/
2. mysql -uroot -pyourpassword -D zabbix_server -e "source mysql.sql;";
3. Идём в папку ../data
4. Повторяем операцию для images_mysql.sql и data.sql

Создаём БД, вариант для PostgreSQL:
yum -y install postgresql-devel # ставим библиотеки поддержки работы с PgSQL

Создаем БД для Zabbix: http://phpsuxx.blogspot.com/2009/03/postgresql-8-startup.html

Имя бд: zabbix_server, имя пользователя: zabbix_user

Проверяем соединение с БД: psql zabbix_server zabbix_user --password -h 127.0.0.1

Импортируем схему БД в нашу базу:
psql zabbix_server zabbix_user --password -h 127.0.0.1
\i create/schema/postgresql.sql
\i create/data/images_pgsql.sql
\i create/data/data.sql

Компиляция сервера
yum -y install gcc make curl-devel iksemel-devel net-snmp-devel

Для работы с MySQL команда конфигурации выглядит так:
./configure --prefix=/opt/zabbix_server --enable-server --with-mysql --with-libcurl --with-jabber --with-net-snmp

А для работы с PostgreSQL команда выглядит так:
./configure --prefix=/opt/zabbix_server --enable-server --with-pgsql --with-libcurl --with-jabber --with-net-snmp

make
make install
После этого сервер будет установлен в папку: /opt/zabbix_server

Конфигурирование
Дефалтовый конфиг сервера должен лежать по пути: /etc/zabbix/zabbix_server.conf
Его пример можно взять в папке misc/conf/zabbix_server.conf
mkdir -p /etc/zabbix/
cp misc/conf/zabbix_server.conf /etc/zabbix/

После этого в указанном файле надо прописать настройки бд, за них отвечают следующие параметры:
DBHost=localhost
DBName=zabbix_server
DBUser=zabbix_user
DBPassword=qwerty

Активация init скриптов
Для управления серверов через init.d создадим скрипт /etc/init.d/zabbix_server следующего содержания:


#!/bin/sh
#
# zabbix_server start/stop script for CentOS 4.x
# author: Chris Riley
# date: 2006-06-25
#
# chkconfig: 2345 55 45
# description: starts/stops zabbix_server
#
# processname: zabbix_server
# pidfile: /tmp/zabbix_server.pid
# config: /etc/zabbix/zabbix_server.conf

# Source function library.
. /etc/rc.d/init.d/functions

# Path to zabbix_server and its base path.
progdir="/opt/zabbix_server/sbin/"
prog="zabbix_server"
RETVAL=0

start() {
echo -n $"Starting $prog: "
daemon $progdir$prog
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog /tmp/$prog.pid
}
reload() {
echo -n $"Reloading $prog: "
killproc $prog -HUP
RETVAL=$?
echo
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f /tmp/$prog.pid ] ; then
stop
start
fi
;;
reload)
reload
;;
*)
echo $"Usage: $prog {start|stop|status|restart|condrestart|reload}"
exit 1
esac

exit $RETVAL



Даем право на исполнение: chmod +x /etc/init.d/zabbix_server
Добавляем в автозагрузку: chkconfig zabbix_server on

Запуск сервера
Теперь запускаем сервер и радуемся :)
/opt/zabbix_server/sbin/zabbix_server
ps aux | grep zabb -- а запустился ли ?)
tail /tmp/zabbix_server.log -- тут лог


Ну вот, впрчоем, и всё. Хотелось бы отметить, что это никоим образом не исчерпывающий мануал по установке, это лишь последовательность действий один раз приведшая к успеху :)

Если Вы настроились серьезно, то вот, прошу мануал по установке веб-интерфейс к Zabbix: http://phpsuxx.blogspot.com/2008/12/zabbix-php-centos-5.html

Pylons: работа с формами, FormAlchemy

Обнаружил замечательный инструмент работы с формами: FormAlchemy, он способен генерировать HTML формы из схемы бд SQLAlchemy

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


Открываем файл:
vim myapp/controllers/main.py
и добавляем в верху подключение модуля:
from formalchemy import FieldSet, Field


Теперь внизу добавляем новый контроллер для теста создания формы для добавления нового объекта:

def form_new(self):
fs = FieldSet(model.Person)
return fs.render()



Для редактирования полей существующего объекта используется следующий контроллер:

def form_edit(self):
my_person = meta.Session.query(model.Person).first()
fs = FieldSet(my_person)
return fs.render()



Также, разумеется, есть возможность изменять данные формы, верифицировать их и вносить измененный объект в базу, эти примеры можете посмотреть на офсайте и на странице проекта.

Тут следует отметить, что FA генерирует только набор полей, но не обрамляет все это в таги form и не добавляет управляющих элементов (submit, cancel).

Итого: штука крайне стремная и крайне сырая и мне НЕ НРАВИТСЯ. Продолжаем поиски дальше :)

Python/Pylons виджет-движок для веб?

Мммм очень интересная штука, концепцию которой я пока не особенно понял:
http://toscawidgets.org/ но подход выглядит очень суперски!

3D графика в браузерах? Легко!

Прошу! http://en.wikipedia.org/wiki/WebGL

За наводку thx davinchi

Pylons CRUD, как ?

Сейчас наткнулся на вот такое: http://pylonshq.com/project/pylonshq/wiki/LaurentsNotes Комрады, а какие есть готовые CRUD для Pylons/SQLAlchemy?

Вот еще интересная разработка: http://code.google.com/p/pails-admin/

Tuesday 20 October 2009

Конструктор сайтов, пожалуй, лучший в Мире

Вы думаете, что Яндекс народ или Укоз удобные конструкторы? Вы ошибаетесь =) Вот, прошу: http://yola.com

Создание форм онлайн? Легко!

http://www3.formassembly.com/

Обзор хостингов всего мира

Вот: http://www.hosting-review.com

Отличный блог по SaaS на русском

Вот подкидываю Вам отличный сайт по различному онлайн софту: http://www.livebusiness.ru

map reduce лего и просто?

Прошу ссылку на сию прелесть: http://discoproject.org/index.html

А вот пример кода на нем:

from disco.core import Disco, result_iterator

def fun_map(e, params):
return [(w, 1) for w in e.split()]

def fun_reduce(iter, out, params):
s = {}
for w, f in iter:
s[w] = s.get(w, 0) + int(f)
for w, f in s.iteritems():
out.add(w, f)

results = Disco("disco://localhost").new_job(
name = "wordcount",
input = ["http://discoproject.org/chekhov.txt"],
map = fun_map,
reduce = fun_reduce).wait()

for word, frequency in result_iterator(results):
print word, frequency

This is a fully working Disco script that computes word frequencies in a text corpus. Disco distributes the script automatically to a cluster, so it can utilize all available CPUs in parallel. For details, see Disco tutorial.


Очень интересный блог для любого хостера

Крайне рекомендую блог президента BlueHost (один из крупнейших в мире хостеров): http://www.mattheaton.com/

Monday 19 October 2009

Puppet, управление конфигурациями

Часть1: http://habrahabr.ru/blogs/linux/67471/
Часть2: http://habrahabr.ru/blogs/linux/68532/

Pylons: работа с моделью из внешних скриптов

Довольно часто приходится обращаться к данным БД не из MVC фреймворка, а из каких-либо связанных скриптов. Как это делать в случае SQLAlchemy мы разберемся сейчас =)

Переходим в папку проекта (myapp) и создаем файл mydbscript.py следующего содержания:


#!/usr/bin/python2.5
# -*- coding: utf-8 -*-

import sqlalchemy as sa
from myapp import model
import myapp.model.meta as meta

DB_URL = "mysql://my_db_user:qwerty@127.0.0.1/my_test_database"
#DB_URL = "postgres://my_db_user:qwerty@127.0.0.1:5432/my_test_database"

engine = sa.create_engine(DB_URL)
model.init_model(engine)

# а далее следует обычный код работы с БД

person_q = meta.Session.query(model.Person)
all_users = person_q.filter(model.Person.name=='Pavel').all()

for user in all_users:
print "User: ", user.name


Делаем скрипт исполняемым и запускаем:

chmod +x mydbscript.py
./mydbscript.py


Вот так довольно легко можно получить все прелести ORM из своего скрипта :)

Pylons: работа с БД средствами SQLAlchemy

Для начала подключаем необходимые для работы классы, в файле
vi myapp/controllers/main.py
в верху добавляем:


from myapp.model import meta
from myapp import model


Первое импортирует служебный класс meta, используемый для работы SQLAlchemy, а второе импортирует наши классы модели.

Теперь в файл
vi myapp/controllers/main.py
добавляем код записи в БД:

def db_write(self):
new_user = model.Person()
new_user.name = "Pavel"

meta.Session.add(new_user)
meta.Session.commit()



Теперь открываем нашу страницу через веб и следим, чтобы все прошло без ошибок:
http://127.0.0.1/main/db_write


Теперь напишем контроллер, который выдаст нам содержимое БД:


def db_read(self):
person_q = meta.Session.query(model.Person)
c.all_users = person_q.filter(model.Person.name=='Pavel').all()

return render("main/db_read.html")


Теперь необходимо создать шаблон:
vim myapp/templates/main/db_read.html


Вот его текст:


<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://genshi.edgewall.org/"
lang="en">
<ul>
<li py:for="item in c.all_users">${item.id}:${item.name}</li>
</ul>
</html>




Теперь открываем страницу: http://127.0.0.1/main/db_read и любуемся нашим креативом =)

Итак, нам осталось разобраться с формами, пагинацией и все, можно будет приступать к созданию новых клевых сервисов =)

Pylons: обработка GET/POST параметров

Итак, продолжим наполнять жизнью наш веб аппликейшен. Сейчас будем обрабатывать GET и POST параметры, передаваемые нашим контроллерам (для этого используется объект responce.params причем, GET и POST ключи собираются в один словарь для удобства). Это довольно легко, добавляем в файл

vi myapp/controllers/main.py

ещё один метод:


def show_params(self):
return request.params['my_param']


И теперь открываем http://127.0.0.1/main/show_params?my_param=value555 и видим, что параметр передался в тело веб-страницы :)

Аналог Data::Dumper в Python

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

import pprint

myvar = [1,2,3,4,5]
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(myvar)



Результат работы будет выглядеть так:
python suxx.py
[1, 2, 3, 4, 5]


А если требуется дамп структуры сохранить в переменной, то последнюю строку меняем на: print pp.pformat(request)

Pylons: работа с сессиями

Итак, продолжим мучать Pylons :) Сейчас нам для полного веб-счастья не хватает возможности временно сохранять данные между запросами пользователей, для этой цели мы будем использовать сессии (в Pylons они предоставяются компонентом Beaker).

Для тестов добавим в код файла
vi myapp/controllers/main.py
новый метод, count, который будет считать число открытий страницы для данного юзера:

def count(self):
if session.has_key('users_count'):
session['users_count'] = session['users_count'] + 1
else:
session['users_count'] = 0

session.save()

return "Users count: ", session['users_count']


Тут все довольно тривиально, за исключением строки "session.save()", в Pylons необходимо явно указывать, что изменения в сессии требуется сохранить, для этого и вызывается метод save().

Ну и еще - краткое описание внутренностей работы сессий. В cookie пользователю помещается переменная с именем веб-приложения (myapp) со значением "e18f7176b0832b030a5df1041b6ffb877d5377e11e93e0e7e783584523192c65e946fafd", что представляет собой хеш код, по которому производится идентификация владельца сессии. Время жизни сессии - до закрытия браузера.

Ну вот и все, теперь при каждом обновлении страницы http://127.0.0.1/main/count число будет увеличиваться.

Sunday 18 October 2009

Pylons: передача переменных из контроллера в шаблон

После того, как мы освоились с шаблонами пришло самое время научиться передавать переменные в шаблон, вещь ради которой все и затевалось. Открываем контроллер
vi myapp/controllers/main.py


и перед return добавляем строку
c.welcome_text = "Hello World from Variable!"

Теперь надо в шаблоне
vi myapp/templates/main/index.html


отобразить содержимое переменной: удаляем строку "Hello World from Template!" и вносим в него следующий код между тегов html: ${c.welcome_text}

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

Pylons: работа с шаблонами

Теперь попробуем заменить наш вбитый в код контроллера текст на шаблон, для этого делаем следующее.

Создаем папку для шаблонов данного контроллера:

mkdir myapp/templates/main


Создаем сам шаблон:
vim myapp/templates/main/index.html


Обращаю внимание, что шаблон не является обычным текстом, это xml документ с определенной структурой. Пример содержимого файла вот такой:


<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" lang="en">
Hello World from Template!
</html>


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

vi myapp/controllers/main.py

и заменяем
return 'Hello World'
на:
return render("main/index.html")

Теперь запускаем:
paster serve development.ini
и наблюдаем, что шаблон считался из файла (текст "Hello World from Template!" вместо "Hello World!"), а не из кода контроллера, что позволяет разделить разработку логики от разработки визуальной части.

Подробная документация по синтаксису шаблонов: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html

Pylons: создание первого контроллера

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

Создаем свой контроллер:
paster controller main


В результате этого действа будет создан файл: myapp/controllers/main.py, в котором будет один единственный класс (MainController) с одним методом, который покажет нам надпись "Hello world". Также будет создан файл myapp/tests/functional/test_main.py с тестами для данного контроллера, но они нам сейчас не нужны.

Перезапускаем приложение:
paster serve --reload development.ini
и открываем адрес: http://127.0.0.1/main/index

Теперь нам надо, чтобы эта страничка показывалась по адресу: http://127.0.0.1 Для этого открываем файл раутов (где производится настройка того, какой путь какой контроллер обрабатывает):

vi myapp/config/routing.py


И в после строки "# CUSTOM ROUTES HERE" добавляем:
map.connect('/', controller='main', action='index')
и сносим файл шаблона (иначе не будет рабтать новый раут):
rm myapp/public/index.html


Все, стандартный контроллер подключен как индексная страница и по адресу http://127.0.0.1 отображается веселое "Hello world!" :)

Документация по PostgreSQL

http://www.postgresql.org/docs/manuals/
http://www.opennet.ru/base/dev/postgres_notes.txt.html

По мере появление новых ссылок пост будет обновляться.

Аналог SHOW TABLES в PostgreSQL

Вот такая у него ма сивная замена:
select * from information_schema.tables where table_schema='public' and table_type='BASE TABLE';

Литература по Pylons

Вот суперская книга в открытом доступе: http://pylonsbook.com/
Перед полным погружением рекомендую прочесть: http://wiki.pylonshq.com/display/pylonsfaq/Home
Кукбук: http://wiki.pylonshq.com/display/pylonscookbook/Home
Очень хороший мануал: http://developer.co.ua/posts/view/pylons_python-frejmvork

Pylons: подключение базы данных

Теперь подключаем базу данных к Pylons.

Ставить все будем либо на Постгресе - http://phpsuxx.blogspot.com/2010/03/postgresql-8-centos-debian-5.html либо на MySQL (http://phpsuxx.blogspot.com/2009/12/mysql-debian5-lenny.html). От типа БД зависит только sqlalchemy.url и все.

Модуль для работы с PostgreSQL из Python:
apt-get install python-psycopg2


Модуль для работы с MySQL из Python
apt-get install -y python-mysqldb


Теперь указываем урл до бд в файле
vi development.ini


PostgreSQL:
sqlalchemy.url = postgres://my_db_user:qwerty@127.0.0.1:5432/my_test_database


MySQL:

sqlalchemy.url = mysql://my_db_user:qwerty@127.0.0.1/my_test_database


В самый верх файла (блок импорта) myapp/model/__init__.py добавляем:

import sqlalchemy as sa
from sqlalchemy import orm


А в самый его же низ (без отступов вообще!):

t_persons = sa.Table("persons", meta.metadata,
sa.Column("id", sa.types.Integer, primary_key=True),
sa.Column("name", sa.types.String(100), primary_key=True),
sa.Column("email", sa.types.String(100)),
)

class Person(object):
pass

orm.mapper(Person, t_persons)



Инициализируем БД (при этом из описанной нами схемы будет сгенерирован sql код для конкретной бд, в нашем случае это Постгрес):
paster setup-app development.ini


В ответ будет выдано примерно следующее:

Running setup_config() from servermon.websetup
23:50:21,962 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SELECT DATABASE()
23:50:21,963 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'character_set%%'
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'lower_case_table_names'
23:50:21,964 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,965 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW COLLATION
23:50:21,965 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,967 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] SHOW VARIABLES LIKE 'sql_mode'
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] DESCRIBE `persons`
23:50:21,968 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ROLLBACK
23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread]
CREATE TABLE persons (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100),
PRIMARY KEY (id, name)
)

23:50:21,969 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] ()
23:50:22,069 INFO [sqlalchemy.engine.base.Engine.0x...5c10] [MainThread] COMMIT


В самой же базе данных это принимает вид:

CREATE TABLE `persons` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`email` varchar(100) default NULL,
PRIMARY KEY (`id`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8


Кстати, хотелось бы напомнить, что если после деплоя схемы в базу вы ей измените и повторно запустите setup-app, то новые поля добавлены не будут. Как это побороть, я пока не понял.

Более полная документация: http://www.sqlalchemy.org/docs/ и http://pylonshq.com/docs/en/0.9.7/models/#working-with-sqlalchemy

Где скачать XCode Mac OS X?

Вот тут: http://developer.apple.com/technology/xcode.html

Кстати говоря, для обычного Leopard (не show) необходима версия Xcode: "Xcode 3.0"

Прямая ссылка на его скаку выглядит так: http://adcdownload.apple.com/Developer_Tools/xcode_3.0/xcode_3.0.dmg (но для этого нужен аккаунт на ADC, он бесплатный, его достаточно зарегистрировать и все). Ставим XCodeTools.mpkg для решения проблем с автокомплитом в PyDev (устанавливаются Developer версии библиотек).

Saturday 17 October 2009

Установка Pylons 0.9.7 на Debian 5 Lenny

Сейчас мы будем ставить все необходимое ПО для разработки на Pylons.

Ставим компилятор и make, они могут пригодится для установки некоторых расширений:
apt-get install make gcc python-dev build-essential


Ставим Python и easy_install:
apt-get install -y python python-setuptools


Сначала поставим библиотеки, которые нам пригодятся для работы.


Потрясающий шаблонизатор. Почему? Вот поэтому: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html
easy_install genshi


Пожалуй, лучший в мире ДЯП ORM
easy_install SQLAlchemy


Устанавливаем сам Pylons (здесь он актуальной версии, так что качать с сайта нет необходимости; также тут проблема в том, что стандартно ставится актуальная версия, а актуальная сейчас - 0.10rc1):
easy_install Pylons


А между делом, как искать пакеты через easy_install я так и не понял, поэтому юзаю: http://pypi.python.org/pypi

Теперь, когда весь софт стоит, можем приступать к созданию проекта:

cd
paster create -t pylons myapp


В процессе работы мастера на вопрос о выборе шаблонизатора выбираем: genshi, а на запрос "ставить ли SQLAlchemy" отвечаем утвердительно - True.

Теперь можно запускать проект :) Переходим в папку: myapp и выполняем команду (обращаю внимание на параметр --reload, он означает, что приложение будет перезапускаться автоматически при любых изменениях в файлах проекта ):

cd myapp
paster serve --reload development.ini


А теперь настал момент увидеть это чудо! Открываем http://127.0.0.1:5000 и падаем в экстазе :)

Если Вам нужно, чтобы приложение работало и после отключения от SSH консоли, запускайте его вот так:
nohup paster serve --reload development.ini &


Кстати, чтобы запустить сервер на всех интерфейсах в файле указанном ниже необходимо "127.0.0.1" заменить на "0.0.0.0".
vi development.ini


Офсайт проекта: http://pylonshq.com/

Tuesday 13 October 2009

Где скачать OpenOffice для Mac OS X

Вот в этой табличке: http://download.openoffice.org/other.html идем к пересечению столбца "Mac OSX Intel" и строки "Russian". Хотя, конечно, при первой возможности рекомендую купить MS Office для Мака. Нормальный. Платный.

Monday 12 October 2009

RAD

Пока не особо понял, что это, но штука очень занятная: http://www.openobject.com/

Debian: The following packages have been kept back

При обновлении системы вот такой облом выдался и несколько пакетов не захотели обновляться :( Решается легко:
apt-get dist-upgrade

Полностью удалить пакет на Debian

apt-get --purge remove nginx

Saturday 10 October 2009

Где скачать Pylons?

Вот тут: http://pylonshq.com/download На сайте полчаса искал блин, везде автоинсталляторы :(

Thursday 8 October 2009

О Мышах

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


(с) http://www.ashmanov.com/pap/bubble/#p3.3.11

Всем работающим в ИТ читать, срочно!

http://www.ashmanov.com/pap/bubble/

Wednesday 7 October 2009

О понимании софтвера вцелом

Принимаю следующие слова за непреложную истину и Вам советую.


...
На конференции мы учим относиться к технологиям "по взрослому" - если
технология подходит для решения задачи, то почему ее нельзя использовать?
Даже, если она написана компанией Microsoft.

Это тоже самое, что: "Ох, это спонсорский доклад, я на него не пойду не потому что он не интересен (я этого не знаю еще), а потому что он спонсорский". IMHO, так рассуждают новички. А профессионалы слушают спонсорский доклад Citrix на HighLoad++ / 2008, потом подходят к докладчику, знакомятся. А в результате получается Yota.

Об этой истории успеха будет рассказ на HighLoad++ 2009.


(с) Олег Бунин, рассылка nginx-ru


Хотя не упущу момента упомянуть, что под мои мелкие задачи винда ну никак вот не является "подходящей технологией" и вряд ли когда ей станет. Может, конечно, у меня просто нету денег на дорогие решения, но мне более важна независимость, когда я могу посредством своего и только своего ума без привлечения баснословных денег решить задачу на основе OSS решений и своих разработок.

Даже в вопросе малого бизнеса я вот посмотрю на адептов M$, когда им стартовый капитал в неск млн. придется чуть менее, чем полностью влить в покупку лицензий.

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

Monday 5 October 2009

Сборка Boost 1.34 CentOS 5

Все довольно стандартно, разве что СПЕК-файл можете взять в другом месте:


yum install rpmdevtools -y
useradd rpmbuild
su rpmbuild
rpmdev-setuptree
wget http://blog.tripthelight.net/boost-1.34.0-2.el5.src.rpm
rpm -ihv boost-1.34.0-2.el5.src.rpm
cd rpm/SPECS
rpmbuild -ba boost.spec
exit
cd /home/rpmbuild/rpm/RPMS/
rpm -Uhv boost-devel-1.34.0-2.el5.i386.rpm boost-1.34.0-2.el5.i386.rpm

Установка Mapnik как рендера к OpenStreetMap

Ставим саму баблиотеку Mapnik. Оффсайт: http://wiki.openstreetmap.org/wiki/Mapnik Оффмануал: http://trac.mapnik.org/wiki/CentOS/RHEL

Увы, но сначала придется ставить новый Boost т.к. в Центосе он старый (1.33).
http://phpsuxx.blogspot.com/2009/10/boost-134-centos-5.html


# к этому подходит 1.33 Буст
cd
svn co http://svn.mapnik.org/trunk mapnik-libs
cd mapnik-libs
apt-get remove python-mapnik
apt-get install libboost-thread1.35-dev libboost-regex1.35-dev libboost-python1.35-dev libboost-iostreams1.35-dev libtiff4-dev libpng12-dev libltdl3-dev libxml2-dev libfreetype6-dev postgresql-server-dev-8.3

# Для Ред-Хатов:
yum -y install freetype-devel libtool-ltdl-devel libpng-devel libtiff-devel libjpeg-devel gcc-c++ libicu-devel python-devel bzip2-devel
python scons/scons.py
python scons/scons.py install # на продакшенах так делать КРАЙНЕ нежелательно
# Для 32 битных платформ
echo "/usr/local/lib" | tee /etc/ld.so.conf.d/mapnik-i386.conf
# Для 64 битных платформ
echo "/usr/local/lib64" | tee /etc/ld.so.conf.d/mapnik-i386.conf
ldconfig


На Дебияне это не нужно:

cd /usr/lib
ln -s libboost_filesystem.so libboost_filesystem-mt.so
ln -s libboost_regex.so libboost_regex-mt.so
ln -s libboost_iostreams.so libboost_iostreams-mt.so
ln -s libboost_program_options.so libboost_program_options-mt.so
ln -s libboost_thread.so libboost_thread-mt.so
ln -s libboost_python.so libboost_python-mt.so


Тестируем:

cd /root/mapnic-libs/demo/python
python rundemo.py



Ставим сам рендер карт:
cd
svn checkout http://svn.openstreetmap.org/applications/rendering/mapnik
cd mapnik



открываем:
nano ./set-mapnik-env

export MAPNIK_TILE_DIR=/var/www/html/tiles/

# this empty if your database is on the local machine.
export MAPNIK_DBHOST="127.0.0.1"

# This is the name of the database where the OSM data is stored.
export MAPNIK_DBNAME="my_test_database"

# This is the username we should use to log into the PostgreSQL database.
export MAPNIK_DBUSER="my_db_user"

# This is the password we should use to log into the PostgreSQL database.
export MAPNIK_DBPASS="qwerty"

. ./set-mapnik-env
./customize-mapnik-map > osm.xml
mkdir -p /var/www/html/tiles/ # создаем папку для отрендереных "плиток"


Развертываем текстуры:

cd
cd mapnik
wget -c http://tile.openstreetmap.org/world_boundaries-spherical.tgz
wget -c http://tile.openstreetmap.org/processed_p.tar.bz2
wget -c http://tile.openstreetmap.org/shoreline_300.tar.bz2

tar xzf world_boundaries-spherical.tgz
tar -xjf processed_p.tar.bz2
tar xjf shoreline_300.tar.bz2 -C world_boundaries
mv processed_p.* world_boundaries



Запускаем генерацию имаджей

./generate_image.py


А вот координаты для генерации карты Российской Федерации:

ll = (0, 0, 180, 80)

z = 10
imgx = 500 * z
imgy = 1000 * z



А вот для карты Самары:

ll = (48, 48, 55, 55)
#---------------------------------------------------

z = 150
imgx = 50 * z
imgy = 50 * z


А вот конфиг для программы generate_tiles.py:

bbox = (40, 50 , 60, 65)
#bbox = (51, 52.95, 50, 53)
#---------------------------------------------------
minZoom = 1
maxZoom = 25

render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom, "World")


Теперь устанавливаем apache для раздачи "плиток" карт:

apt-get install -y apache2


Запускаем генератор карт:

cd
cd mapnik
./generate_tiles.py

Импорт osm в PostgreSQL

Cтягиваем карту России, вырезанную из planet.osm:
Сайт автора: http://osm.tesoro-shop.ru/
wget http://osm.tesoro-shop.ru/russia.osm.bz2
bunzip2 russia.osm.bz2
cat russia.osm | osm2pgsql - --username=my_db_user --password --database=my_test_database --host=127.0.0.1 --slim

Параметр slim предназначен для снижения потребления памяти; без него у меня карта не импортировалась даже на 4+ гб памяти, а cat чтобы программа не вылетала из-за большого размера файла.

Деплоймент OpenStreetMap на собственном сервере

Пошагово:
http://phpsuxx.blogspot.com/2009/03/centos-rhel.html
http://phpsuxx.blogspot.com/2009/10/osm2pgsql-centos.html
http://phpsuxx.blogspot.com/2009/03/postgresql-8-startup.html
http://phpsuxx.blogspot.com/2009/10/osm-postgresql.html
http://phpsuxx.blogspot.com/2009/10/mapnik-openstreetmap.html

Сборка osm2pgsql на Centos и Debian из исходников

yum -y install subversion gcc make geos-devel libxml2-devel bzip2-devel proj-devel gcc-c++ libpqxx-devel
apt-get install -y libgeos-dev libxml2-dev libpqxx-dev libbz2-dev
cd
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
cd osm2pgsql
make
./osm2pgsql


Ну вот и все :)

А на Debian 5 ещё проще, но старая версия не будет работать с новым Mapnik:
apt-get install -y osm2pgsql

Friday 2 October 2009

Yahoo Pipes

Вот таким доступным должно быть программирование в 21 веке: http://pipes.yahoo.com/pipes/

Thursday 1 October 2009