Saturday, 31 December 2011
Всех с наступающим Новым Годом!
Желаю всем как можно больше аптайма, как можно больше новых релизов любимого ПО и любимых ОС :) Как можно меньше критичных багов! А еще побольше улыбок и удовлетворения от работы! :)
Thursday, 29 December 2011
MySQL Memory storage: Dec 29 18:55:07 stat mysqld: 111229 18:55:07 [ERROR] /usr/sbin/mysqld: The table 'domains' is full
Подобная ошибка также может быть выдана ПО, осуществляющим добавление данных в MEMORY таблицу, так как кончилось место, зарезервированное под таблицы данного типа, чтобы исправить проблему, нужно увеличить лимит.
В блок [mysqld] добавляем:
Перезапускаем СУБД:
vim /etc/mysql/my.cnf
В блок [mysqld] добавляем:
max_heap_table_size=2048M
Перезапускаем СУБД:
/etc/init.d/mysql restart
Monday, 26 December 2011
Логгирование выдачи интерактивных команд посредством утилиты script
Суть задачки легко можно понять по сабжу поста. Честно говоря, был искренне удивлен, найдя столь стандартное решение.
Запускаем интерактивное ПО в оболочке и выполняем там какие-либо действия:
Просмтриваем лог программы, в котором отразились все действия:
Запускаем интерактивное ПО в оболочке и выполняем там какие-либо действия:
script -q -a /var/log/mylog -c 'telnet ya.ru 80'
Trying 87.250.251.3...
Connected to ya.ru.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Server: nginx
Date: Mon, 26 Dec 2011 16:31:18 GMT
Content-Type: text/html; charset=windows-1251
Content-Length: 166
Connection: close
400 Bad Request
400 Bad Request
nginx
Connection closed by foreign host.
root@ovzgate:~#
Просмтриваем лог программы, в котором отразились все действия:
cat /var/log/mylog
Script started on Mon Dec 26 19:31:08 2011
Trying 87.250.251.3...
Connected to ya.ru.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Server: nginx
Date: Mon, 26 Dec 2011 16:31:18 GMT
Content-Type: text/html; charset=windows-1251
Content-Length: 166
Connection: close
400 Bad Request
400 Bad Request
nginx
Connection closed by foreign host.
CentOS 6 + OpenVZ = ужас с зависимостями при обновлении
Итак, имеется совершенно чистый CentOS 6 (без каких-либо репозиториев кроме стандартных) с установленным OpenVZ ядром. А также желание сделать: yum update (а также наличие обычных ядер в грядущем апдейте).
Это желание разбивается вдребезги конфликтом зависимостей kernel-firmware :
Если обновление ядра не критично, то можно забить и игнорировать ошибки:
А что делать если критично? Фиксить!
Итак, посмотрим, какие версии пакета firmware у нас есть:
Попробуем его снести:
Пробуем снова обновиться:
Увы, не помогло и появились ошибки, так как данный пакет нужен системе и от него зависит пара пакетов.
Ставим пакет обратно:
отключаем rhel-6 kernel репо (напротив rhel6 enabled=1 меняем на enabled=0):
Пробуем обновить:
Снова сносим нафиг пакет:
И успешно выполняем апдейт:
После этого, снова включаем репозиторий openvz (enabled=1) и еще раз обновляем систему:
Итого, kernel-firmware был почему-то замещен vzkernel-firmware. Скорее всего, при следующем апдейте ядра система вылетит снова. И баг, скорее всего, в OpenVZ репо, оно почему-то замещает собой стандартный пакет.
Итого, план фикса следующий:
1) Отключаем репо openvz (enabled=0): vi /etc/yum.repos.d/openvz.repo
2) Удаляем пакет: yum remove -y vzkernel-firmware
3) Обновляемся: yum update -y
4) Включаем репо openvz: vi /etc/yum.repos.d/openvz.repo
5) Обновляем систему (при этом, vzkernel-firmware будет установлен вновь): yum update -y
6) Устанавливаем новое ядро стандартным: vim /boot/grub/grub.conf
7) Радуемся :)
Описание бага в багзилле OpenVZ: http://bugzilla.openvz.org/show_bug.cgi?id=2129
Это желание разбивается вдребезги конфликтом зависимостей kernel-firmware :
Error: Package: kernel-2.6.32-220.2.1.el6.x86_64 (updates)
Requires: kernel-firmware >= 2.6.32-220.2.1.el6
Installed: vzkernel-firmware-2.6.32-042stab044.11.noarch (@openvz-kernel-rhel6)
kernel-firmware = 2.6.32-131.21.1.el6
Available: kernel-firmware-2.6.32-220.el6.noarch (base)
kernel-firmware = 2.6.32-220.el6
Available: kernel-firmware-2.6.32-220.2.1.el6.noarch (updates)
kernel-firmware = 2.6.32-220.2.1.el6
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
Если обновление ядра не критично, то можно забить и игнорировать ошибки:
yum update --skip-broken
А что делать если критично? Фиксить!
Итак, посмотрим, какие версии пакета firmware у нас есть:
rpm -qa |grep kernel-firm
vzkernel-firmware-2.6.32-042stab044.11.noarch
Попробуем его снести:
yum remove vzkernel-firmware-2.6.32-042stab044.11.noarch
Loaded plugins: fastestmirror
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package vzkernel-firmware.noarch 0:2.6.32-042stab044.11 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================================================================================================
Package Arch Version Repository Size
=========================================================================================================================================================================================
Removing:
vzkernel-firmware noarch 2.6.32-042stab044.11 @openvz-kernel-rhel6 3.9 M
Transaction Summary
=========================================================================================================================================================================================
Remove 1 Package(s)
Installed size: 3.9 M
Is this ok [y/N]: Y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Erasing : vzkernel-firmware-2.6.32-042stab044.11.noarch 1/1
Removed:
vzkernel-firmware.noarch 0:2.6.32-042stab044.11
Complete!
Пробуем снова обновиться:
yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centosg4.centos.org
* extras: centosg4.centos.org
* openvz-kernel-rhel6: mirror.softaculous.com
* openvz-utils: mirror.softaculous.com
* updates: mirror.nsc.liu.se
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:2.6.32-220.2.1.el6 will be installed
--> Processing Dependency: kernel-firmware >= 2.6.32-220.2.1.el6 for package: kernel-2.6.32-220.2.1.el6.x86_64
Package kernel-firmware is obsoleted by vzkernel-firmware, but obsoleting package does not provide for requirements
--> Finished Dependency Resolution
Error: Package: kernel-2.6.32-220.2.1.el6.x86_64 (updates)
Requires: kernel-firmware >= 2.6.32-220.2.1.el6
Available: kernel-firmware-2.6.32-220.el6.noarch (base)
kernel-firmware = 2.6.32-220.el6
Available: kernel-firmware-2.6.32-220.2.1.el6.noarch (updates)
kernel-firmware = 2.6.32-220.2.1.el6
Available: vzkernel-firmware-2.6.32-042stab044.11.noarch (openvz-kernel-rhel6)
kernel-firmware = 2.6.32-131.21.1.el6
You could try using --skip-broken to work around the problem
** Found 2 pre-existing rpmdb problem(s), 'yum check' output follows:
kernel-2.6.32-131.17.1.el6.x86_64 has missing requires of kernel-firmware >= ('0', '2.6.32', '131.17.1.el6')
vzkernel-2.6.32-042stab044.11.x86_64 has missing requires of kernel-firmware >= ('0', '2.6.32', '131.21.1.el6')
Увы, не помогло и появились ошибки, так как данный пакет нужен системе и от него зависит пара пакетов.
Ставим пакет обратно:
yum install -y vzkernel-firmware
отключаем rhel-6 kernel репо (напротив rhel6 enabled=1 меняем на enabled=0):
vi /etc/yum.repos.d/openvz.repo
Пробуем обновить:
yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centosg4.centos.org
* extras: centosg4.centos.org
* openvz-utils: mirror.softaculous.com
* updates: mirror.nsc.liu.se
openvz-utils | 1.2 kB 00:00
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:2.6.32-220.2.1.el6 will be installed
--> Processing Dependency: kernel-firmware >= 2.6.32-220.2.1.el6 for package: kernel-2.6.32-220.2.1.el6.x86_64
--> Running transaction check
---> Package kernel-firmware.noarch 0:2.6.32-220.2.1.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================================================================================================
Package Arch Version Repository Size
=========================================================================================================================================================================================
Installing:
kernel x86_64 2.6.32-220.2.1.el6 updates 24 M
Installing for dependencies:
kernel-firmware noarch 2.6.32-220.2.1.el6 updates 6.2 M
Transaction Summary
=========================================================================================================================================================================================
Install 2 Package(s)
Total download size: 31 M
Installed size: 120 M
Is this ok [y/N]: Y
Downloading Packages:
http://mirror.nsc.liu.se/CentOS/6.2/updates/x86_64/Packages/kernel-2.6.32-220.2.1.el6.x86_64.rpm: [Errno 14] PYCURL ERROR 7 - "couldn't connect to host"
Trying other mirror.
(1/2): kernel-2.6.32-220.2.1.el6.x86_64.rpm | 24 MB 00:05
(2/2): kernel-firmware-2.6.32-220.2.1.el6.noarch.rpm | 6.2 MB 00:01
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.1 MB/s | 31 MB 00:27
Running rpm_check_debug
Running Transaction Test
Transaction Check Error:
file /lib/firmware/3com/3C359.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/3com/typhoon.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/acenic/tg1.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/acenic/tg2.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/adaptec/starfire_rx.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/adaptec/starfire_tx.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/advansys/3550.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/advansys/38C0800.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/advansys/38C1600.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/advansys/mcode.bin from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
file /lib/firmware/atmsar11.fw from install of kernel-firmware-2.6.32-220.2.1.el6.noarch conflicts with file from package vzkernel-firmware-2.6.32-042stab044.11.noarch
Error Summary
-------------
Снова сносим нафиг пакет:
yum remove vzkernel-firmware-2.6.32-042stab044.11.noarch
И успешно выполняем апдейт:
yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centosg4.centos.org
* extras: centosg4.centos.org
* openvz-utils: mirror.softaculous.com
* updates: mirror.nsc.liu.se
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:2.6.32-220.2.1.el6 will be installed
--> Processing Dependency: kernel-firmware >= 2.6.32-220.2.1.el6 for package: kernel-2.6.32-220.2.1.el6.x86_64
--> Running transaction check
---> Package kernel-firmware.noarch 0:2.6.32-220.2.1.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================================================================================================
Package Arch Version Repository Size
=========================================================================================================================================================================================
Installing:
kernel x86_64 2.6.32-220.2.1.el6 updates 24 M
Installing for dependencies:
kernel-firmware noarch 2.6.32-220.2.1.el6 updates 6.2 M
Transaction Summary
=========================================================================================================================================================================================
Install 2 Package(s)
Total size: 31 M
Installed size: 120 M
Is this ok [y/N]: Y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : kernel-firmware-2.6.32-220.2.1.el6.noarch 1/2
Installing : kernel-2.6.32-220.2.1.el6.x86_64 2/2
Installed:
kernel.x86_64 0:2.6.32-220.2.1.el6
Dependency Installed:
kernel-firmware.noarch 0:2.6.32-220.2.1.el6
Complete!
После этого, снова включаем репозиторий openvz (enabled=1) и еще раз обновляем систему:
yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centosg4.centos.org
* extras: centosg4.centos.org
* openvz-kernel-rhel6: mirror.softaculous.com
* openvz-utils: mirror.softaculous.com
* updates: mirror.nsc.liu.se
openvz-kernel-rhel6 | 951 B 00:00
openvz-utils | 1.2 kB 00:00
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package kernel-firmware.noarch 0:2.6.32-220.2.1.el6 will be obsoleted
---> Package vzkernel-firmware.noarch 0:2.6.32-042stab044.11 will be obsoleting
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================================================================================================
Package Arch Version Repository Size
=========================================================================================================================================================================================
Installing:
vzkernel-firmware noarch 2.6.32-042stab044.11 openvz-kernel-rhel6 2.9 M
replacing kernel-firmware.noarch 2.6.32-220.2.1.el6
Transaction Summary
=========================================================================================================================================================================================
Install 1 Package(s)
Total download size: 2.9 M
Is this ok [y/N]: Y
Downloading Packages:
vzkernel-firmware-2.6.32-042stab044.11.noarch.rpm | 2.9 MB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : vzkernel-firmware-2.6.32-042stab044.11.noarch 1/2
Erasing : kernel-firmware-2.6.32-220.2.1.el6.noarch 2/2
Installed:
vzkernel-firmware.noarch 0:2.6.32-042stab044.11
Replaced:
kernel-firmware.noarch 0:2.6.32-220.2.1.el6
Complete!
Итого, kernel-firmware был почему-то замещен vzkernel-firmware. Скорее всего, при следующем апдейте ядра система вылетит снова. И баг, скорее всего, в OpenVZ репо, оно почему-то замещает собой стандартный пакет.
Итого, план фикса следующий:
1) Отключаем репо openvz (enabled=0): vi /etc/yum.repos.d/openvz.repo
2) Удаляем пакет: yum remove -y vzkernel-firmware
3) Обновляемся: yum update -y
4) Включаем репо openvz: vi /etc/yum.repos.d/openvz.repo
5) Обновляем систему (при этом, vzkernel-firmware будет установлен вновь): yum update -y
6) Устанавливаем новое ядро стандартным: vim /boot/grub/grub.conf
7) Радуемся :)
Описание бага в багзилле OpenVZ: http://bugzilla.openvz.org/show_bug.cgi?id=2129
Wednesday, 21 December 2011
Удобная работа с MySQL из Python посредством oursql
Зачем? Во-первых, MySQL DB в чистом виде черезчур аскетичен и нет таких удобных вещей как плейсхолдеров (параметризированных запросов), а без них работать с MySQL совершенно не камильфо. Модуль написан на C, так что не стоит бояться тормозов.
Ставим зависимости:
Собираем oursql:
Вот пример кода, которого достаточно для удобной работы с MySQL:
Визуально, модуль работает не просто быстро, а ОЧЕНЬ быстро! Что очень радует!
Офсайт: http://packages.python.org/oursql/
Ставим зависимости:
apt-get install -y libmysqlclient-dev python-mysqldb
Собираем oursql:
pip install oursql
Вот пример кода, которого достаточно для удобной работы с MySQL:
#!/usr/bin/python
import oursql
import stat_config
conn = oursql.connect(host='127.0.0.1', user='db_user', passwd='db_password', db='db_name')
# return rows as dicts
curs = conn.cursor(oursql.DictCursor)
# return row as arrays
# curs = conn.cursor()
curs.execute("SELECT * FROM domains WHERE domain_id = ? LIMIT ?", (1, 10))
for row in curs:
print row
Визуально, модуль работает не просто быстро, а ОЧЕНЬ быстро! Что очень радует!
Офсайт: http://packages.python.org/oursql/
Профилирование проектов на Python
apt-get install -y python-profiler
Запускаем скрипт:
python -m profile login_to_mysql.py
test data
6 function calls in 0.000 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(execfile)
1 0.000 0.000 0.000 0.000 :0(setprofile)
1 0.000 0.000 0.000 0.000:1( )
1 0.000 0.000 0.000 0.000 login_to_mysql.py:3()
1 0.000 0.000 0.000 0.000 profile:0(execfile('login_to_mysql.py'))
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000 testinclude.py:4()
Вот так вот легко и просто :)
Monday, 19 December 2011
Как собрать в MySQL таблице только уникальные данные?
Вот потребовалось собирать в таблице только уникальные данные. Причем, требуется, чтобы при добавлении значение, которое уже есть в таблице, новая запись просто игнорировалась. Как это сделать?
Очень просто - добавить для поля ограничение UNIQUE, а при использовании INSERT использовать конструкцию вида: INSERT IGNORE INTO ips (ip) VALUES('11.22.33.44'). При этом, не будет выдаваться ошибка при вставке значения, которое уже имеется в таблице, но и не будет осуществляться само добавление.
Очень просто - добавить для поля ограничение UNIQUE, а при использовании INSERT использовать конструкцию вида: INSERT IGNORE INTO ips (ip) VALUES('11.22.33.44'). При этом, не будет выдаваться ошибка при вставке значения, которое уже имеется в таблице, но и не будет осуществляться само добавление.
Где можно взять актуальное содержимое Full BGP таблицы?
Вот тут в текстовом формате: ftp://archive.routeviews.org/oix-route-views/
А вот тут в бинарном (MRT TABLE DUMP V2 ): ftp://archive.routeviews.org/bgpdata/2011.12/RIBS/
Подробнее о проекте: http://routeviews.org/
А вот тут в бинарном (MRT TABLE DUMP V2 ): ftp://archive.routeviews.org/bgpdata/2011.12/RIBS/
Подробнее о проекте: http://routeviews.org/
Получить номер ASN по IP адресу
Для этого есть замечательный быстрый сервис (впрочем, искомую информацию всегда можно найти руками): http://asn.cymru.com/
И тогда все можно сделать в одну строку:
apt-get install -y ipv6calc
И тогда все можно сделать в одну строку:
host -t txt `ipv6calc 159.253.17.1 --in ipv4addr --out revipv4 | sed 's/.in-addr.arpa.//'`.origin.asn.cymru.com | sed 's/"//' | awk '{print $4}'
Sunday, 18 December 2011
Не работает LOAD DATA INFILE от рядового пользователя MySQL
При этом, от рута LOAD DATA INFILE работает отлично.
Как пофиксить? Нужно нашему пользователю дать дополнительные права:
Как пофиксить? Нужно нашему пользователю дать дополнительные права:
grant file on *.* to db_user@localhost;
flush privileges;
Saturday, 17 December 2011
Использование замкнутых циклов в Python
Возможно, с темой поста не все так гладко, но постараюсь описать, что я хотел. Имеется задача - создается заданное число классов и каждый класс должен получить при иницилизации 1 из нескольких (адреса серверов) идентификаторов. Как это реализовать красиво и нэтивно? Сразу в голову пришел кольцевой цикл и он, оказывается, уже есть в Питоне :)
Вот такой простенький код:
Вот такой простенький код:
from itertools import cycle
my_cycle = cycle( [1,2,3] )
>>> print my_cycle.next()
1
>>> print my_cycle.next()
2
>>> print my_cycle.next()
3
>>> print my_cycle.next()
1
>>> print my_cycle.next()
2
>>> print my_cycle.next()
3
Friday, 16 December 2011
Просмотр статистики PowerDNS recursor
rec_control get-all
all-outqueries 17950
dlg-only-drops 0
outgoing-timeouts 342
tcp-outqueries 0
throttled-out 14
throttled-outqueries 14
unreachables 58
answers-slow 307
answers0-1 228
answers1-10 0
answers10-100 2746
answers100-1000 3102
case-mismatches 0
chain-resends 2
client-parse-errors 0
edns-ping-matches 0
edns-ping-mismatches 0
ipv6-outqueries 0
no-packet-error 7896
noedns-outqueries 17949
noerror-answers 5694
noping-outqueries 0
nsset-invalidations 103
nxdomain-answers 15
over-capacity-drops 0
qa-latency 50242
questions 11548
resource-limits 0
server-parse-errors 0
servfail-answers 5839
spoof-prevents 0
tcp-client-overflow 0
tcp-questions 0
unauthorized-tcp 0
unauthorized-udp 0
unexpected-packets 0
cache-entries 15959
cache-hits 228
cache-misses 6155
concurrent-queries 0
negcache-entries 168
nsspeeds-entries 7474
packetcache-entries 6100
packetcache-hits 5165
packetcache-misses 6383
sys-msec 2129
throttle-entries 516
uptime 1055
user-msec 1760
Увеличение числа рабочих потоков у PowerDNS Recursor
Осуществляется в файле:
Директивой:
После этого необходим перезапуск (Debian 6 Squeeze):
Итого:
vim /etc/powerdns/recursor.conf
Директивой:
threads=12
После этого необходим перезапуск (Debian 6 Squeeze):
/etc/init.d/pdns-recursor restart
Итого:
cat /var/log/daemon.log |grep pdns | grep threads
Dec 13 19:04:28 stat pdns_recursor[11710]: Launching 2 threads
Dec 15 18:39:33 stat pdns_recursor[3534]: Launching 2 threads
Dec 15 18:40:21 stat pdns_recursor[3569]: Launching 2 threads
Dec 16 21:37:11 stat pdns_recursor[15655]: Launching 2 threads
Dec 16 22:53:09 stat pdns_recursor[17691]: Launching 12 threads
Thursday, 15 December 2011
Установка SQLAlchemy на Debian 6 Squeeze
Ставим нужные пакеты (С-зависимости необходимы для сборки бинарных библиотек, ускоряющих работу SQLAlchemy):
Ставим библиотеку:
Ставим библиотеку для поддержки требуемого движка СУБД:
Убеждаемся, что все установилось корректно:
Все!
Написано на базе инструкции: http://phpsuxx.blogspot.com/2009/10/pylons_18.html
apt-get install -y python-pip gcc python2.6-dev
Ставим библиотеку:
pip install sqlalchemy
Ставим библиотеку для поддержки требуемого движка СУБД:
apt-get install -y python-mysqldb
Убеждаемся, что все установилось корректно:
python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.7.4'
>>>
Все!
Написано на базе инструкции: http://phpsuxx.blogspot.com/2009/10/pylons_18.html
Очень грамотная и правильная мысль при решении нетрвиальных задач
Обращаю внимание именно на второй ответ!
Взято с: http://vostryakov.ru/blog/38-intoduction-ai/
При ответе на вопросы в рамках office hours (то есть ответы на вопросы от учеников от преподавателей курса) было как минимум два интерсных вопроса-ответа. Далее вольный перевод по памяти с моими возможными добавками:
Ученик: Почему вы делаете эти курсы бесплатно для всех?
Себастиан: Мы делаем это из-за вас (показывает в экран). because of you! Так восхитительно делиться знаниями с таким огномных количеством людей. У меня никогда не было такой огромной группы!
Ученик: Что вы посоветуете читать?
Себастиян: Ничего не читайте. Выберите задачу, которая вам интересна (она может быть даже уже решена кем-то) и попробуйте решить ее. И когда вы ее решите своим способом, то потом вы можете почитать как она решалась другими. И я так же гарантирую (что-то вроде этого слова), что пока вы решаете такого рода задачи вы увидите около 10 задач, которые еще не решены и вот их-то и будет понастоящему интересно решать.
Взято с: http://vostryakov.ru/blog/38-intoduction-ai/
pip или easy_install?
Есди верить официальной документации pip, то именно его нужно использовать, так как он являестя более новой заменой для easy_install:
Кроме этого, у pip есть функция uninstall, которая ставит его на голову выше easy_install!
Установка на Debian:
Источник: http://www.pip-installer.org/en/latest/index.html
pip is a tool for installing and managing Python packages, such as those found in the Python Package Index. It’s a replacement for easy_install.
Кроме этого, у pip есть функция uninstall, которая ставит его на голову выше easy_install!
Установка на Debian:
apt-get install -y python-pip
Источник: http://www.pip-installer.org/en/latest/index.html
Простейшее многопоточное приложение на Python
#!/usr/bin/python
from threading import Thread
import time
class testThread(Thread):
def __init__(self, number):
Thread.__init__(self)
self.number = number
def run(self):
time.sleep(2)
print "Hello from thread %d" % self.number
threads_list = []
for i in range (1,10):
test_thread_object = testThread(i)
threads_list.append(test_thread_object)
test_thread_object.start()
for thread in threads_list:
thread.join()
Вот трейс исполнения:
time python threads.py
Hello from thread 3Hello from thread 1
Hello from thread 5
Hello from thread 6
Hello from thread 4Hello from thread 2
Hello from thread 7Hello from thread 9
Hello from thread 8
real 0m2.050s
user 0m0.035s
sys 0m0.015s
Вообще, очень красиво и лаконично все. Да и по отзывам, в отличие от Перла, у Питона с многопоточностью все хорошо.
Источники: http://www.wellho.net/solutions/python-python-threads-a-first-example.html и http://docs.python.org/library/threading.html#thread-objects
Отличная статья по асинхронному DNS резволвингу посредством adns из Python
http://www.catonmat.net/blog/asynchronous-dns-resolution/
Ставить сие чудо очень просто:
Результаты обоих вариантов (slow и fast) на моей машине примерно следующие:
Это при условии, что на машине работал локальный DNS резольвер (PowerDNS).
Ставить сие чудо очень просто:
apt-get install -y python-adns
Результаты обоих вариантов (slow и fast) на моей машине примерно следующие:
python slow.py
It took 31.14 seconds to resolve 100 hosts.
python fast.py
It took 7.30 seconds to resolve 100 hosts.
Это при условии, что на машине работал локальный DNS резольвер (PowerDNS).
Wednesday, 14 December 2011
Вышел Solaris 11!
Лучше поздно, чем никогда :) Не могу такое событие оставить без вниамния http://www.opennet.ru/opennews/art.shtml?num=32267
Виртуальная машина для выполнения PHP от Facebook
Прошу: https://www.facebook.com/notes/facebook-engineering/the-hiphop-virtual-machine/10150415177928920 ! Весьма интересный проект, рекомендую с описанием ознакомиться всем.
Яндекс Спамооборона - RIP
Все, коммерческая версия данного продукта более не продается: http://so.yandex.ru/news/2011/index.xml#2011-07-04, всем клиентам рекомендуют переход на SaaS решение "Яндекс Почта для домена".
Вспоминая, сколько дней у меня заняла борьба с кривостями скриптов, настоящая война с выжиранием ресурсов демоном so, а также проверка демона so на факт жизнедеятельонсти всевозможными могниторингами... хочется удалить приписку "RIP" и заменить на что-нибудь недоброе, но как говорят... либо никак, либо хорошо.
Вспоминая, сколько дней у меня заняла борьба с кривостями скриптов, настоящая война с выжиранием ресурсов демоном so, а также проверка демона so на факт жизнедеятельонсти всевозможными могниторингами... хочется удалить приписку "RIP" и заменить на что-нибудь недоброе, но как говорят... либо никак, либо хорошо.
Защита от DDoS сайтов в Chrome
Если часто обновлять страничку, которая выдает код 5xx, то на 2й-3й раз Chrome выдаст предупреждение, что так делать не нужно:
In order to prevent Distributed Denial of Service (DDoS) attacks from being perpetrated by web pages and extensions that run within Chrome, the HTTP throttling mechanism keeps track of errors requesting a given URL (minus the query parameters), and after a few 5xx errors in a row, starts exponentially increasing an interval during which requests to the given URL are disallowed.
You may enable or disable the feature below. Please let us know if the feature is causing problems for your web site. More details and contact information at http://dev.chromium.org/throttling.
Throttle HTTP requests if the server has been overloaded or encountered an error.
Tuesday, 13 December 2011
Ускорение скорости резолвинга за счет использования PowerDNS recursor на Debian Squeeze
Итак, имеем необходимость в частых DNS запросах:
Скорость, как видно, очень низкая и подобная скорость реакции может стать узким горлышком приложения.
Чтобы исправить подобное поведение, можно поставить локальный кэширующий DNS, мне нравится PowerDNS Recursor:
После установки необходимо сделать установленный DNS сервер основным в системе:
И в самый верх добавляем следующее, а имеющиеся записи комментируем диезом:
Повторяем тест:
Все, результат достигнут, на множестве одинаковых запросов будет достигаться серьезное повышение скорости работы.
time for i in `seq 1 100`; do host ya.ru > /dev/null; done
real 0m4.938s
user 0m0.160s
sys 0m0.149s
root@stat:~# time for i in `seq 1 1000`; do host ya.ru > /dev/null; done
real 0m50.746s
user 0m1.601s
sys 0m1.465s
Скорость, как видно, очень низкая и подобная скорость реакции может стать узким горлышком приложения.
Чтобы исправить подобное поведение, можно поставить локальный кэширующий DNS, мне нравится PowerDNS Recursor:
apt-get install -y powerdns-recursor
После установки необходимо сделать установленный DNS сервер основным в системе:
vim /etc/resolv.conf
И в самый верх добавляем следующее, а имеющиеся записи комментируем диезом:
nameserver 127.0.0.1
Повторяем тест:
time for i in `seq 1 1000`; do host ya.ru > /dev/null; done
real 0m3.400s
user 0m1.456s
sys 0m1.735s
root@stat:~# time for i in `seq 1 1000`; do host ya.ru > /dev/null; done
real 0m3.520s
user 0m1.532s
sys 0m1.735s
root@stat:~# time for i in `seq 1 1000`; do host ya.ru > /dev/null; done
real 0m3.487s
user 0m1.452s
sys 0m1.782s
Все, результат достигнут, на множестве одинаковых запросов будет достигаться серьезное повышение скорости работы.
HTTP PUT vs POST для загрузки файлов, что лучше?
По инфе с stackoverflow:
Информация из мана cURL подтверждает, что для загрузки файлов PUT - лучший вариант:
The PUT method, though not as widely used as the POST method is perhaps the more efficient way of uploading files to a server. This is because in a POST upload the files neede to be combined together into a multipart message and this message has to be decoded at the server. In contrast, the PUT method allows you to simply write the contents of the file to the socket connection that is established with the server.
Информация из мана cURL подтверждает, что для загрузки файлов PUT - лучший вариант:
5. PUT
The perhaps best way to upload data to a HTTP server is to use PUT. Then
again, this of course requires that someone put a program or script on the
server end that knows how to receive a HTTP PUT stream.
Put a file to a HTTP server with curl:
curl --upload-file uploadfile http://www.example.com/receive.cgi
Saturday, 10 December 2011
Вышел CentOS 6.1 !
Ну наконец-то! Ссылка: http://www.centos.org/
Как убрать warning у Python Paramiko: No handlers could be found for logger "paramiko.transport"
Фиксится легко, достаточно перед кодом с paramiko указать логгер:
paramiko.util.log_to_file('paramiko.log')
Friday, 2 December 2011
Debian Squeeze и часовой пояс Киева
В связи с рядом обсуждений в Раде, так не понятно, отменили переход на летнее время или нет. В итоге из-за этой неопределенности, в Debian Squeeze некорректные данные по часовой зоне Киева.
До фикса:
Фикс (пакет от wheezy):
После фикса:
Выпиcка из баг-трекера Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=647830
До фикса:
zdump -v /usr/share/zoneinfo/Europe/Kiev | grep 2011
/usr/share/zoneinfo/Europe/Kiev Sun Mar 27 00:59:59 2011 UTC = Sun Mar 27 02:59:59 2011 EET isdst=0 gmtoff=7200
/usr/share/zoneinfo/Europe/Kiev Sun Mar 27 01:00:00 2011 UTC = Sun Mar 27 04:00:00 2011 FET isdst=0 gmtoff=10800
Фикс (пакет от wheezy):
wget http://ftp.us.debian.org/debian/pool/main/t/tzdata/tzdata_2011n-1_all.deb
dpkg -i tzdata_2011n-1_all.deb
После фикса:
zdump -v /usr/share/zoneinfo/Europe/Kiev | grep 2011
/usr/share/zoneinfo/Europe/Kiev Sun Mar 27 00:59:59 2011 UTC = Sun Mar 27 02:59:59 2011 EET isdst=0 gmtoff=7200
/usr/share/zoneinfo/Europe/Kiev Sun Mar 27 01:00:00 2011 UTC = Sun Mar 27 04:00:00 2011 EEST isdst=1 gmtoff=10800
/usr/share/zoneinfo/Europe/Kiev Sun Oct 30 00:59:59 2011 UTC = Sun Oct 30 03:59:59 2011 EEST isdst=1 gmtoff=10800
/usr/share/zoneinfo/Europe/Kiev Sun Oct 30 01:00:00 2011 UTC = Sun Oct 30 03:00:00 2011 EET isdst=0 gmtoff=7200
Выпиcка из баг-трекера Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=647830
Thursday, 1 December 2011
Установка CentOS 6 по VNC
В инсталляторе корректируем первый пункт через tab и дописываем "vnc". После этого будет предложено выбрать сетевую карту и сконфигурировать ее.
После этого, машина напишет, что VNC запущен и укажет порт и айпи: Please manually connect your vnc client to 192.168.1.110:1 to begin install. После этого подключаемся VNC клиентом и ставим ОС. Очень актуально в случаях, когда по тем или иным причинам не запускается графический инсталлятор, но в то же время требуется кастомная разбивка, которая отсутсвтует в текстовой версии инсталлера.
После этого, машина напишет, что VNC запущен и укажет порт и айпи: Please manually connect your vnc client to 192.168.1.110:1 to begin install. После этого подключаемся VNC клиентом и ставим ОС. Очень актуально в случаях, когда по тем или иным причинам не запускается графический инсталлятор, но в то же время требуется кастомная разбивка, которая отсутсвтует в текстовой версии инсталлера.
Проблема с кастомной разбивкой дисков при CentOS 6 text install
К сожалению, нет возможности настроить разделы вручную, об этом сказано в документации:
Источник: http://wiki.centos.org/Manuals/ReleaseNotes/CentOS6.0
The text installer has limited capabilities compared to the GUI installer. Most notably there is no support for configuring partition layout, storage methods or package selection. Please refer to the official documentation for details. Here you can find some useful information on creating and using kickstart files which can be used to perform advanced configuring without the need for the GUI installer.
Источник: http://wiki.centos.org/Manuals/ReleaseNotes/CentOS6.0
Как запустить инсталлятор CentOS 6 в текстовом режиме?
В окне выбора опций установки tab на первом пункте и дописываем через пробел: text.
Subscribe to:
Posts
(
Atom
)