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
Столкнулся с ошибкой:
Фиксица внесением в файл eaccelerator.ini
[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" (без кавычек, разумеется).
Генерируем приватный ключ:
Генерируем CSR:
Можно прочесть информацию из уже сгенерированного CSR:
Источник: инструкцию
Но, прошу отметить тот факт, что 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.
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 и комментируем строки:
Перезапускаем Апача:
После этого убеждаемся, что Апач остался лишь на 443 порту и не забинден на 80й.
Теперь ставим nginx:
Далее нам необходимо собрать php-fpm, вот офсайт автора: http://github.com/dreamcat4/php-fpm
Теперь ставим обновленный libevent (по мануалу с сайта автора fpm):
Генерируем патч (полный список патчей вот здесь, а старые вот здесь):
Качаем исходники пхп:
Патчим пхп и собираем:
Да, и общее замечание -- при изменении опций configure рекомендую делать make clean, иначе глюки обеспечены (у меня они возникли, когда jpeg не цеплялся, clean спас) :)
Добавляем fpm в автозапуск:
Открываем конфиг: /etc/php-fpm.conf и все вхождения nobody заменяем на www-data
Итак, запускаем php-fpm: /etc/init.d/php-fpm start
Убеждаемся, что все поднялось:
Теперь создаем папку: /var/www/fpmroot, там размещаем файл index.php со следующим контентом:
Теперь конфигурируем nginx, открываем файл vi /etc/nginx/sites-enabled/default
После этого перезапускам nginx: /etc/init.d/nginx restart
И любуемся результатом нашей работы :)
Источник: https://bugs.launchpad.net/php-fpm/+bug/397721
Открываем файл: 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
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
Довольно частая проблема многих клиентов многих хостингов :) Решается весьма несложно.
Создаем файл:
Со следующим контентом:
Обновляемся:
Источник: http://wiki.centos.org/HowTos/PHP_5.1_To_5.2
Создаем файл:
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, чтобы случайно не замусорить систему :)
Для 32 битного Линукса делаем следующее:
А для 64 битного следующее:
А чтобы подключить его на Дебияне достаточно в файл:
(а на Centos 5 в файле /etc/php.ini, в самом низу) поместить строки:
Перезапускаем Апача:
Либо юзаем скрипт для Дебияна (только 64 битная версия):
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
Sunday, 25 October 2009
Быстрая проверка PTR записи
Вот так:
host domain.ru | tail -1 | awk '{print $4}' | nslookup `cat`
vdsmanager + openvz + Burstable RAM и privvmpages
В терминологии VDSManager, privvmpages -- это и есть Burstable. Два часа расследований :)
Зарегистрировать блог в Яндекс Блогах
Можно вот здесь: http://blogs.yandex.ru/add-catalogue.xml
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
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) там должно быть примерно следующее:
Добавляем туда две строки:
Перезапускаем монитор на Centos:
Перезапускаем монитор на Debian:
Убеждаемся, что монитор добавился в автозагрузку:
На Debian:
Теперь в случае, если рейд рассыпится, будет выслано уведомление на support@domain.ru (только проверьте пожалуйста, что у вас точно работает почта)
Кстати, вот очень интересный способ мониторинга Заббиксом: http://www.zabbix.com/forum/archive/index.php/t-3135.html
Этим мы сейчас и займемся, будем учить 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:
Для Debian:
Теперь разрешаем автозапуск, открываем файл
и там убираем комментарий у записи: #start_smartd=yes
И запускаем:
Результат запуска можно посмотреть в Syslog (на Debian: /var/log/syslog, на Centos /var/log/messages ):
После этого демон smartd будет добавлен в автозапуск:
Теперь смотрим, какие диски у нас есть: ls -la /dev/ | grep sd
Итого, нас интересуют: /dev/sda и /dev/sdb
Теперь можем легко получить SMART информацию о любом из винтов: smartctl --all /dev/sdb в ответ нам будет выдано огромное количество информации :)
Теперь об автоматике, в конфиге smatd /etc/smartd.conf по сути одна настройка:
Она означает, что в случае возникновения проблем, которые обнаружит смарт будет послано письмо руту (-H Monitor SMART Health Status, report if failed).
Вот хорошая статья по настройке уведомлений в случае ошибок SMART: http://ksimute.trancom.ru/smart-hdd.shtml
Для 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 ничего в голову не приходит.
Вот ещё способ:
А вот так смотреть статус в виде, удобном для скриптов:
Для массива в "нормальном состоянии" выдача скрипт будет "clean"
Вот ещё способ:
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
Вывести результат сканирования nmap в XML
Довольно легко:
nmap -oX - -A domain.ru
Wednesday, 21 October 2009
Как тюнить Постгрес?
Привет, комарады! А кто подскажет, где искать мануалы по тюнингу PostgreSQL ? В идеале получить что-то наподобие MySQL'евых предефинед конфигов "small/middle/huge".
Сборка агента Zabbix 1.6
Версия Агента нам некритична, поэтому будем ставить его из репозитория Epel.
Установка Агента
Подключаем Epel:
Ставим Агента:
Открываем конфиг-файл:
И изменяем там следующие настройки:
Запускаем:
Теперь надо добавить правило в фаерволл (перед COMMIT) для работы zabbix:
Теперь после этого сервер необходимо добавить в мониторинг:
Включение сервера в мониторинг
1. Входим на: http://zabbix.ru
2. "Настройка" => "Узлы сети"
3. В списке выбираем "узлы сети", далее щелкаем "Создать узел сети"
4. Имя "server1.domain.ru" (хостнейм машинки)
5. Добавляем группу "Hosting"
6. Ставим: "Подключиться к IP адрес"
7. Вписываем DNS имя и IP машинки
8. Связать с шаблоном, жмем "добавить" и выбираем там "Template_Linux"
9. Тыкаем "Ok"
Установка Агента
Подключаем 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
Запускаем:
И конфигурируем следующим образом:
После этого конфигурируем модель: http://phpsuxx.blogspot.com/2009/10/pylons_18.html
Теперь открываем: http://127.0.0.1/admin
Но у меня закрался баг -- слетели стили и все стало жутко некрасиво (ошибка в стиле: "/admin/_static//admin.css" ).
Переходим в папку cd myapp/public/ и стаскиваем следующие файлы:
Теперь открываем файл admin.css и заменяем все упоминания png файлов с ./edit.png на edit.png
А также добавляем строки:
Теперь идем в папку: myapp/templates/forms/ и открываем файл: restfieldset.mako и там строчку:
меняем на
Итого - вещь ОЧЕНЬ сырая и насмерть завязанная на Mako. Так что ищем альтернативы или пишем сами.
Вот ссылка: 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
Импортируем схему БД в нашу базу:
Компиляция сервера
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 следующего содержания:
Даем право на исполнение: 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
Почти любая установка начинается со страницы 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
Устанавливаем:
Открываем файл:
Теперь внизу добавляем новый контроллер для теста создания формы для добавления нового объекта:
Для редактирования полей существующего объекта используется следующий контроллер:
Также, разумеется, есть возможность изменять данные формы, верифицировать их и вносить измененный объект в базу, эти примеры можете посмотреть на офсайте и на странице проекта.
Тут следует отметить, что FA генерирует только набор полей, но не обрамляет все это в таги form и не добавляет управляющих элементов (submit, cancel).
Итого: штука крайне стремная и крайне сырая и мне НЕ НРАВИТСЯ. Продолжаем поиски дальше :)
Устанавливаем:
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/ но подход выглядит очень суперски!
http://toscawidgets.org/ но подход выглядит очень суперски!
Pylons CRUD, как ?
Сейчас наткнулся на вот такое: http://pylonshq.com/project/pylonshq/wiki/LaurentsNotes Комрады, а какие есть готовые CRUD для Pylons/SQLAlchemy?
Вот еще интересная разработка: http://code.google.com/p/pails-admin/
Вот еще интересная разработка: http://code.google.com/p/pails-admin/
Tuesday, 20 October 2009
Конструктор сайтов, пожалуй, лучший в Мире
Вы думаете, что Яндекс народ или Укоз удобные конструкторы? Вы ошибаетесь =) Вот, прошу: http://yola.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
Pylons: работа с моделью из внешних скриптов
Довольно часто приходится обращаться к данным БД не из MVC фреймворка, а из каких-либо связанных скриптов. Как это делать в случае SQLAlchemy мы разберемся сейчас =)
Переходим в папку проекта (myapp) и создаем файл mydbscript.py следующего содержания:
Делаем скрипт исполняемым и запускаем:
Вот так довольно легко можно получить все прелести ORM из своего скрипта :)
Переходим в папку проекта (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
Для начала подключаем необходимые для работы классы, в файле
Первое импортирует служебный класс meta, используемый для работы SQLAlchemy, а второе импортирует наши классы модели.
Теперь в файл
Теперь открываем нашу страницу через веб и следим, чтобы все прошло без ошибок:
http://127.0.0.1/main/db_write
Теперь напишем контроллер, который выдаст нам содержимое БД:
Теперь необходимо создать шаблон:
Вот его текст:
Теперь открываем страницу: http://127.0.0.1/main/db_read и любуемся нашим креативом =)
Итак, нам осталось разобраться с формами, пагинацией и все, можно будет приступать к созданию новых клевых сервисов =)
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 ключи собираются в один словарь для удобства). Это довольно легко, добавляем в файл
ещё один метод:
И теперь открываем http://127.0.0.1/main/show_params?my_param=value555 и видим, что параметр передался в тело веб-страницы :)
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
Прямого аналога я найти не смог, но его задачи отлично выполняет следующая несколько монструозная конструкция:
Результат работы будет выглядеть так:
А если требуется дамп структуры сохранить в переменной, то последнюю строку меняем на: print pp.pformat(request)
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).
Для тестов добавим в код файла
Тут все довольно тривиально, за исключением строки "session.save()", в Pylons необходимо явно указывать, что изменения в сессии требуется сохранить, для этого и вызывается метод save().
Ну и еще - краткое описание внутренностей работы сессий. В cookie пользователю помещается переменная с именем веб-приложения (myapp) со значением "e18f7176b0832b030a5df1041b6ffb877d5377e11e93e0e7e783584523192c65e946fafd", что представляет собой хеш код, по которому производится идентификация владельца сессии. Время жизни сессии - до закрытия браузера.
Ну вот и все, теперь при каждом обновлении страницы http://127.0.0.1/main/count число будет увеличиваться.
Для тестов добавим в код файла
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: передача переменных из контроллера в шаблон
После того, как мы освоились с шаблонами пришло самое время научиться передавать переменные в шаблон, вещь ради которой все и затевалось. Открываем контроллер
и перед return добавляем строку
Теперь надо в шаблоне
отобразить содержимое переменной: удаляем строку "Hello World from Template!" и вносим в него следующий код между тегов html: ${c.welcome_text}
Теперь перезапускаем приложение и любуемся переданным в шаблон текстом :)
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: работа с шаблонами
Теперь попробуем заменить наш вбитый в код контроллера текст на шаблон, для этого делаем следующее.
Создаем папку для шаблонов данного контроллера:
Создаем сам шаблон:
Обращаю внимание, что шаблон не является обычным текстом, это xml документ с определенной структурой. Пример содержимого файла вот такой:
Теперь открываем контроллер:
и заменяем
Теперь запускаем:
Подробная документация по синтаксису шаблонов: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html
Создаем папку для шаблонов данного контроллера:
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 на индексной странице сейчас показывает нам свой стандартный информер, что ну никак не вариант для реального приложения.
Создаем свой контроллер:
В результате этого действа будет создан файл: myapp/controllers/main.py, в котором будет один единственный класс (MainController) с одним методом, который покажет нам надпись "Hello world". Также будет создан файл myapp/tests/functional/test_main.py с тестами для данного контроллера, но они нам сейчас не нужны.
Перезапускаем приложение:
Теперь нам надо, чтобы эта страничка показывалась по адресу: http://127.0.0.1 Для этого открываем файл раутов (где производится настройка того, какой путь какой контроллер обрабатывает):
И в после строки "# CUSTOM ROUTES HERE" добавляем:
Все, стандартный контроллер подключен как индексная страница и по адресу http://127.0.0.1 отображается веселое "Hello world!" :)
Создаем свой контроллер:
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
По мере появление новых ссылок пост будет обновляться.
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
Перед полным погружением рекомендую прочесть: 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:
Модуль для работы с MySQL из Python
Теперь указываем урл до бд в файле
PostgreSQL:
MySQL:
В самый верх файла (блок импорта) myapp/model/__init__.py добавляем:
А в самый его же низ (без отступов вообще!):
Инициализируем БД (при этом из описанной нами схемы будет сгенерирован sql код для конкретной бд, в нашем случае это Постгрес):
В ответ будет выдано примерно следующее:
В самой же базе данных это принимает вид:
Кстати, хотелось бы напомнить, что если после деплоя схемы в базу вы ей измените и повторно запустите setup-app, то новые поля добавлены не будут. Как это побороть, я пока не понял.
Более полная документация: http://www.sqlalchemy.org/docs/ и http://pylonshq.com/docs/en/0.9.7/models/#working-with-sqlalchemy
Ставить все будем либо на Постгресе - 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 версии библиотек).
Кстати говоря, для обычного 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, они могут пригодится для установки некоторых расширений:
Ставим Python и easy_install:
Сначала поставим библиотеки, которые нам пригодятся для работы.
Потрясающий шаблонизатор. Почему? Вот поэтому: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html
Пожалуй, лучший в мире ДЯП ORM
Устанавливаем сам Pylons (здесь он актуальной версии, так что качать с сайта нет необходимости; также тут проблема в том, что стандартно ставится актуальная версия, а актуальная сейчас - 0.10rc1):
А между делом, как искать пакеты через easy_install я так и не понял, поэтому юзаю: http://pypi.python.org/pypi
Теперь, когда весь софт стоит, можем приступать к созданию проекта:
В процессе работы мастера на вопрос о выборе шаблонизатора выбираем: genshi, а на запрос "ставить ли SQLAlchemy" отвечаем утвердительно - True.
Теперь можно запускать проект :) Переходим в папку: myapp и выполняем команду (обращаю внимание на параметр --reload, он означает, что приложение будет перезапускаться автоматически при любых изменениях в файлах проекта ):
А теперь настал момент увидеть это чудо! Открываем http://127.0.0.1:5000 и падаем в экстазе :)
Если Вам нужно, чтобы приложение работало и после отключения от SSH консоли, запускайте его вот так:
Кстати, чтобы запустить сервер на всех интерфейсах в файле указанном ниже необходимо "127.0.0.1" заменить на "0.0.0.0".
Офсайт проекта: http://pylonshq.com/
Ставим компилятор и 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/
Wednesday, 14 October 2009
Аналог SHOW CREATE TABLE в PostgreSQL
pg_dump my_test_database --schema-only
Кто знает более правильное решение?
Фейсбук / Facebook опенсорц разработки
Опенсорс разработки Фейсбука: http://developers.facebook.com/opensource.php
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
Wednesday, 7 October 2009
О понимании софтвера вцелом
Принимаю следующие слова за непреложную истину и Вам советую.
(с) Олег Бунин, рассылка nginx-ru
Хотя не упущу момента упомянуть, что под мои мелкие задачи винда ну никак вот не является "подходящей технологией" и вряд ли когда ей станет. Может, конечно, у меня просто нету денег на дорогие решения, но мне более важна независимость, когда я могу посредством своего и только своего ума без привлечения баснословных денег решить задачу на основе OSS решений и своих разработок.
Даже в вопросе малого бизнеса я вот посмотрю на адептов M$, когда им стартовый капитал в неск млн. придется чуть менее, чем полностью влить в покупку лицензий.
Хотя, полагаю, весь мир работает в корпорациях, для которых миллионы -- не деньги и вообще, можно купить и внедрить любой софт чуть быстрее, чем мгновенно. И он всегда будет работать пропорционально своей стоимости. Все-гда!
...
На конференции мы учим относиться к технологиям "по взрослому" - если
технология подходит для решения задачи, то почему ее нельзя использовать?
Даже, если она написана компанией 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
На Дебияне это не нужно:
Тестируем:
Ставим сам рендер карт:
Развертываем текстуры:
Запускаем генерацию имаджей
А вот координаты для генерации карты Российской Федерации:
А вот для карты Самары:
А вот конфиг для программы generate_tiles.py:
Теперь устанавливаем apache для раздачи "плиток" карт:
Запускаем генератор карт:
Увы, но сначала придется ставить новый 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 чтобы программа не вылетала из-за большого размера файла.
Сайт автора: 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
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
Saturday, 3 October 2009
Этот момент настал
Ну что, Насть, на старт? :))
Friday, 2 October 2009
Yahoo Pipes
Вот таким доступным должно быть программирование в 21 веке: http://pipes.yahoo.com/pipes/
Thursday, 1 October 2009
О теме блога
Дабы отыграть тему блога решил добавить ссылок о сабже. Почему бы и нет http://modxcms.com/ ?
Установка Xerox 3117 в Mac OS X Leopard
Достаточно поставить пакет драйверов вот отсюда: http://www.guigo.us/mac/splix/
Subscribe to:
Posts
(
Atom
)