суббота, 31 декабря 2011 г.

Всех с наступающим Новым Годом!

Желаю всем как можно больше аптайма, как можно больше новых релизов любимого ПО и любимых ОС :) Как можно меньше критичных багов! А еще побольше улыбок и удовлетворения от работы! :)

четверг, 29 декабря 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 таблицу, так как кончилось место, зарезервированное под таблицы данного типа, чтобы исправить проблему, нужно увеличить лимит.

vim /etc/mysql/my.cnf

В блок [mysqld] добавляем:
max_heap_table_size=2048M

Перезапускаем СУБД:
/etc/init.d/mysql restart

понедельник, 26 декабря 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 :
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

среда, 21 декабря 2011 г.

Удобная работа с MySQL из Python посредством oursql

Зачем? Во-первых, MySQL DB в чистом виде черезчур аскетичен и нет таких удобных вещей как плейсхолдеров (параметризированных запросов), а без них работать с MySQL совершенно не камильфо. Модуль написан на C, так что не стоит бояться тормозов.

Ставим зависимости:
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()

Вот так вот легко и просто :)

понедельник, 19 декабря 2011 г.

Как собрать в MySQL таблице только уникальные данные?

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

Очень просто - добавить для поля ограничение 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/

Получить номер 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}'

воскресенье, 18 декабря 2011 г.

Не работает LOAD DATA INFILE от рядового пользователя MySQL

При этом, от рута LOAD DATA INFILE работает отлично.

Как пофиксить? Нужно нашему пользователю дать дополнительные права:

grant file on *.* to db_user@localhost;
flush privileges;

суббота, 17 декабря 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

Просмотр статистики 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

пятница, 16 декабря 2011 г.

Увеличение числа рабочих потоков у PowerDNS Recursor

Осуществляется в файле:
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

Установка SQLAlchemy на Debian 6 Squeeze

Ставим нужные пакеты (С-зависимости необходимы для сборки бинарных библиотек, ускоряющих работу SQLAlchemy):
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

Очень грамотная и правильная мысль при решении нетрвиальных задач

Обращаю внимание именно на второй ответ!

При ответе на вопросы в рамках office hours (то есть ответы на вопросы от учеников от преподавателей курса) было как минимум два интерсных вопроса-ответа. Далее вольный перевод по памяти с моими возможными добавками:

Ученик: Почему вы делаете эти курсы бесплатно для всех?

Себастиан: Мы делаем это из-за вас (показывает в экран). because of you! Так восхитительно делиться знаниями с таким огномных количеством людей. У меня никогда не было такой огромной группы!

Ученик: Что вы посоветуете читать?

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

Взято с: http://vostryakov.ru/blog/38-intoduction-ai/

pip или easy_install?

Есди верить официальной документации pip, то именно его нужно использовать, так как он являестя более новой заменой для easy_install:
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

Встрчайте приемника Pylons - Pyramid !

http://www.pylonsproject.org/

Простейшее многопоточное приложение на 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

четверг, 15 декабря 2011 г.

Отличная статья по асинхронному DNS резволвингу посредством adns из Python

http://www.catonmat.net/blog/asynchronous-dns-resolution/

Ставить сие чудо очень просто:
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).

Ресурс для всех по IPv6 от RIPE !

http://www.ipv6actnow.org/

Все, что Вы хотите знать об IPv6 Вы найдете на нем!

26 рекомендаций по улучшению безопасности PHP

http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html

Какой, по мнению Red Hat, планировщик в Линукс лучше вссего для СУБД

Deadline, потому что.

Вышел Solaris 11!

Лучше поздно, чем никогда :) Не могу такое событие оставить без вниамния http://www.opennet.ru/opennews/art.shtml?num=32267

Новый язык программирования от Red Hat - Ceylon

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

Виртуальная машина для выполнения 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" и заменить на что-нибудь недоброе, но как говорят... либо никак, либо хорошо.

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

http://www.vmguru.nl/wordpress/2011/11/updated-enterprise-hypervisor-comparison/

Добавление возможности управления виртуальными машинами через Web интерфейс на VmWare ESXi

http://www.virtuallyghetto.com/2011/12/ghetto-webaccess-for-esxi.html

Супер инициатива в области виртулизации - Open Stack

http://openstack.org/

среда, 14 декабря 2011 г.

Защита от 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.

вторник, 13 декабря 2011 г.

Ускорение скорости резолвинга за счет использования PowerDNS recursor на Debian Squeeze

Итак, имеем необходимость в частых 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:

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

пятница, 2 декабря 2011 г.

Debian Squeeze и часовой пояс Киева

В связи с рядом обсуждений в Раде, так не понятно, отменили переход на летнее время или нет. В итоге из-за этой неопределенности, в Debian Squeeze некорректные данные по часовой зоне Киева.

До фикса:
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

четверг, 1 декабря 2011 г.

Установка CentOS 6 по VNC

В инсталляторе корректируем первый пункт через tab и дописываем "vnc". После этого будет предложено выбрать сетевую карту и сконфигурировать ее.

После этого, машина напишет, что VNC запущен и укажет порт и айпи: Please manually connect your vnc client to 192.168.1.110:1 to begin install. После этого подключаемся VNC клиентом и ставим ОС. Очень актуально в случаях, когда по тем или иным причинам не запускается графический инсталлятор, но в то же время требуется кастомная разбивка, которая отсутсвтует в текстовой версии инсталлера.

Проблема с кастомной разбивкой дисков при CentOS 6 text install

К сожалению, нет возможности настроить разделы вручную, об этом сказано в документации:
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.