FastNetMon

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

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 :
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, так что не стоит бояться тормозов.

Ставим зависимости:
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'). При этом, не будет выдаваться ошибка при вставке значения, которое уже имеется в таблице, но и не будет осуществляться само добавление.

Где можно взять актуальное содержимое 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}'

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

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

Отличная статья по асинхронному 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 Вы найдете на нем!

Wednesday 14 December 2011

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/

Защита от 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 запросах:
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

Friday 2 December 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

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

Проблема с кастомной разбивкой дисков при 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.

Monday 28 November 2011

Когда оканчивается поддержка дистрибутива Debian Lenny?

Явно это нигде не указано:
Q: How long will security updates be provided?

A: The security team tries to support a stable distribution for about one year after the next stable distribution has been released, except when another stable distribution is released within this year. It is not possible to support three distributions; supporting two simultaneously is already difficult enough.


А Debian 6 Squeeze вышел 8 фефраля 2011 года: http://www.debian.org/releases/stable/index.ru.html

Путем недолгого продолжения логических рассуждений, понимаем, что окончание поддержки выпадает на февраль 2012 года.

Источник: http://www.debian.org/security/faq

Friday 25 November 2011

FreeBSD - загрузка с USB

При загрузке FreeBSD с usb, очень распространена ситуация, когда система не дождалась инициализации USB и выдала "кант маунт рут", но в dmesg при этом видно, что флешка подмонтировалась, но с задержкой.

Для борьбы с этим, нужно увеличить таймаут ожидания root устройства:
vi /boot/loader.conf

И добавить там:
kern.cam.boot_delay=10000

Источник: http://forums.freebsd.org/showthread.php?t=23349

Monday 21 November 2011

VDSManager & CentOS 6 = все очень странно работает

У нас чистый CentOS 6 с VDSManager создает контейнеры с некорректными настройками памяти - мы задаем гигабайт, два, пять, а памяти все равно 256 мб. А виной тому, что неявно используется не шаблон ve-basic, а шаблон ve-vswap:
ls /etc/vz/conf/ | grep vswap
ve-vswap-1024m.conf-sample
ve-vswap-256m.conf-sample
ve-vswap-512m.conf-sample

Который в принципе не совместим со старым типом к настроек UBC. Больше информации можете прочесть либо у меня в блоге http://phpsuxx.blogspot.com/2011/11/ubc-openvz-rhelcentos-6.html либо в оф источнике: http://wiki.openvz.org/VSwap

Порылись в проблеме поглубже, выяснилось следующее - так ведет себя новый vzctl, я сейчас просто руками создавал VPS и он сам вкатил щаблон ve-swap:
strace -o trace -f /usr/sbin/vzctl create 56131 --ostemplate debian-6.0-x86_64 --ipadd 176.9.219.67 --hostname test.ru

Лог стрейса внизу:
26170 link("/vz/lock/56131.lckqsZEVT", "/vz/lock/56131.lck") = 0
26170 unlink("/vz/lock/56131.lckqsZEVT") = 0
26170 rt_sigaction(SIGINT, {SIG_IGN, [], SA_RESTORER, 0x7fed4b433980}, NULL, 8) = 0
26170 stat("/etc/vz/conf/56131.conf", 0x7fffb7f445b0) = -1 ENOENT (No such file or directory)
26170 stat("/etc/vz/conf/ve-vswap-256m.conf-sample", {st_mode=S_IFREG|0644, st_size=1581, ...}) = 0
26170 stat("/etc/vz/conf/ve-vswap-256m.conf-sample", {st_mode=S_IFREG|0644, st_size=1581, ...}) = 0
26170 open("/etc/vz/conf/ve-vswap-256m.conf-sample", O_RDONLY) = 5
26170 open("/etc/vz/conf/56131.conf", O_RDWR|O_CREAT, 0100644) = 6
26170 read(5, "# Copyright (C) 2000-2011, Para"..., 4096) = 1581
26170 write(6, "# Copyright (C) 2000-2011, Para"..., 1581) = 1581
26170 read(5, "", 4096) = 0
26170 close(5) = 0
26170 close(6) = 0
26170 open("/etc/vz/conf/ve-vswap-256m.conf-sample", O_RDONLY) = 5
26170 stat("/etc/vz/conf/ve-vswap-256m.conf-sample", {st_mode=S_IFREG|0644, st_size=1581, ...}) = 0
26170 fstat(5, {st_mode=S_IFREG|0644, st_size=1581, ...}) = 0
26170 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fed4bdb3000
26170 read(5, "# Copyright (C) 2000-2011, Para"..., 4096) = 1581
26170 read(5, "", 4096) = 0

Иными словами, ранее он молча подозревал, что используется шаблон ve-basic, но с новой версии он юзает ve-swap, который не совместим со старым вариантом настроек UBC.

Вот так.. в итоге - без напильника ничего не работает вообще.

Итого фикс:
/etc/vz/vz.conf
@@ -33,7 +33,7 @@
## Defaults for containers
VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEID
-CONFIGFILE="vswap-256m"
+CONFIGFILE="basic"
DEF_OSTEMPLATE="centos-5"

Friday 18 November 2011

RandomPool_DeprecationWarning: This application uses RandomPool, which is BROKEN in older releases

Имеем баг:
python -c "import paramiko"
/usr/lib/python2.6/dist-packages/Crypto/Util/randpool.py:40: RandomPool_DeprecationWarning: This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken
RandomPool_DeprecationWarning)

Чтобы пофиксить открываем Питон-файл:
vim /usr/lib/python2.6/dist-packages/Crypto/Util/randpool.py

И комментируем следующие строки:
#warnings.warn("This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken",
# RandomPool_DeprecationWarning)

После этого проблема исчезнет, но, обращаю внимания, это немного некорректный фикс.

Использование замены UBC в OpenVZ для RHEL/CentOS 6

В версии OpenVZ для 2.6.32 есть два варианта ограничения ресурсов контейнера, старый классический UBC и новый - vSwap.

Для создания VPS с классическими лимитами можно использовать команду:
vzctl create 101 --ostemplate debian-5-x86_64 --config basic --hostname testvps.fastvps.ru

UB параметры контейнера будут иметь следующий вид:
cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
101: kmemsize 2737572 4407296 14372700 14790164 0
lockedpages 0 0 2048 2048 0
privvmpages 1378 14003 65536 69632 0
shmpages 0 0 21504 21504 0
dummy 0 0 0 0 0
numproc 10 36 240 240 0
physpages 5174 10811 0 9223372036854775807 0
vmguarpages 0 0 33792 9223372036854775807 0
oomguarpages 914 914 26112 9223372036854775807 0
numtcpsock 4 4 360 360 0
numflock 1 4 188 206 0
numpty 0 0 16 16 0
numsiginfo 1 18 256 256 0
tcpsndbuf 69760 69760 1720320 2703360 0
tcprcvbuf 65536 65536 1720320 2703360 0
othersockbuf 6936 8456 1126080 2097152 0
dgramrcvbuf 0 1288 262144 262144 0
numothersock 32 33 360 360 0
dcachesize 1383859 1440285 3409920 3624960 0
numfile 127 245 9312 9312 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 20 20 128 128 0

Конфиг контейнера тоже будет выглядить как и раньше:
cat /etc/vz/conf/101.conf
# Copyright (C) 2000-2011, Parallels, Inc. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

# UBC parameters (in form of barrier:limit)
KMEMSIZE="14372700:14790164"
LOCKEDPAGES="2048:2048"
PRIVVMPAGES="65536:69632"
SHMPAGES="21504:21504"
NUMPROC="240:240"
PHYSPAGES="0:unlimited"
VMGUARPAGES="33792:unlimited"
OOMGUARPAGES="26112:unlimited"
NUMTCPSOCK="360:360"
NUMFLOCK="188:206"
NUMPTY="16:16"
NUMSIGINFO="256:256"
TCPSNDBUF="1720320:2703360"
TCPRCVBUF="1720320:2703360"
OTHERSOCKBUF="1126080:2097152"
DGRAMRCVBUF="262144:262144"
NUMOTHERSOCK="360:360"
DCACHESIZE="3409920:3624960"
NUMFILE="9312:9312"
AVNUMPROC="180:180"
NUMIPTENT="128:128"

# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="2G:2.2G"
DISKINODES="200000:220000"
QUOTATIME="0"

# CPU fair scheduler parameter
CPUUNITS="1000"
HOSTNAME="testvps.fastvps.ee"
VE_ROOT="/vz/root/$VEID"
VE_PRIVATE="/vz/private/$VEID"
OSTEMPLATE="debian-5.0-x86_64"
ORIGIN_SAMPLE="basic"
IP_ADDRESS="176.9.54.124"


vzctl create 101 --ostemplate debian-5-x86_64 --config vswap-256m --hostname testvps.fastvps.ru

В итоге получим следующий вид параметров BC:
cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
101: kmemsize 3369468 4431872 121634816 134217728 0
lockedpages 0 0 32768 32768 0
privvmpages 2461 14151 9223372036854775807 9223372036854775807 0
shmpages 18 354 9223372036854775807 9223372036854775807 0
dummy 0 0 0 0 0
numproc 10 33 9223372036854775807 9223372036854775807 0
physpages 5989 10780 0 65536 0
vmguarpages 0 0 0 9223372036854775807 0
oomguarpages 1145 1145 0 9223372036854775807 0
numtcpsock 5 6 9223372036854775807 9223372036854775807 0
numflock 2 4 9223372036854775807 9223372036854775807 0
numpty 0 0 9223372036854775807 9223372036854775807 0
numsiginfo 0 21 9223372036854775807 9223372036854775807 0
tcpsndbuf 87200 104640 9223372036854775807 9223372036854775807 0
tcprcvbuf 81920 98304 9223372036854775807 9223372036854775807 0
othersockbuf 6936 28720 9223372036854775807 9223372036854775807 0
dgramrcvbuf 0 2312 9223372036854775807 9223372036854775807 0
numothersock 32 36 9223372036854775807 9223372036854775807 0
dcachesize 1535996 1595162 60817408 67108864 0
numfile 180 250 9223372036854775807 9223372036854775807 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 20 20 9223372036854775807 9223372036854775807 0

И намного более простой конфиг VPS:
cat /etc/vz/conf/101.conf
# Copyright (C) 2000-2011, Parallels, Inc. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

# This config is valid for VSwap-enabled kernel (which currently means
# any RHEL6-based kernel, i.e. 042test* or 042stab*).

# UBC parameters (in form of barrier:limit)
PHYSPAGES="0:256M"
SWAPPAGES="0:512M"
KMEMSIZE="116M:128M"
DCACHESIZE="58M:64M"
LOCKEDPAGES="128M"
PRIVVMPAGES="unlimited"
SHMPAGES="unlimited"
NUMPROC="unlimited"
VMGUARPAGES="0:unlimited"
OOMGUARPAGES="0:unlimited"
NUMTCPSOCK="unlimited"
NUMFLOCK="unlimited"
NUMPTY="unlimited"
NUMSIGINFO="unlimited"
TCPSNDBUF="unlimited"
TCPRCVBUF="unlimited"
OTHERSOCKBUF="unlimited"
DGRAMRCVBUF="unlimited"
NUMOTHERSOCK="unlimited"
NUMFILE="unlimited"
NUMIPTENT="unlimited"

# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="2G:2.2G"
DISKINODES="200000:220000"
QUOTATIME="0"

# CPU fair scheduler parameter
CPUUNITS="1000"
HOSTNAME="testvps.fastvps.ru"
VE_ROOT="/vz/root/$VEID"
VE_PRIVATE="/vz/private/$VEID"
OSTEMPLATE="debian-5.0-x86_64"
ORIGIN_SAMPLE="vswap-256m"
IP_ADDRESS="176.9.54.124"
NAMESERVER="213.133.98.98 213.133.100.100 213.133.99.99"

Вот так :)

Больше информации: http://wiki.openvz.org/VSwap

Sunday 13 November 2011

Fibre vs fiber

Имея дело с оптико-волоконным оборудованием, часто встречаешься с обоими вариантами написания. Так в чем же отличие?

Очень просто, fiber - предпочитаемое написание в случае Американского английского, а fibre в случае Британского, Канадского, Австралийского и Индийского английского.

Источник: http://www.grammarist.com/spelling/fiber-fibre/

Friday 11 November 2011

В каких отношениях находятся Quagga и Zebra?

Quagga - это продвинутый вариант Zebrba, так как Zebra уже несколько лет как остановилась в развитии: http://ru.wikipedia.org/wiki/Quagga

Wednesday 12 October 2011

libcap-ng на CentOS 6

Весьма полезная утилитка:
yum install -y libcap-ng-utils

/usr/bin/netcap
ppid pid acct command type port capabilities
1 1439 root sshd tcp 22 full
1 1516 root master tcp 25 full
1 1334 rpcuser rpc.statd tcp 55144 net_bind_service +
1439 2129 root sshd tcp 22 full
1 1439 root sshd tcp6 22 full
1 1334 rpcuser rpc.statd tcp6 41515 net_bind_service +
1 1334 rpcuser rpc.statd udp 46340 net_bind_service +
1 1334 rpcuser rpc.statd udp 662 net_bind_service +
1 1334 rpcuser rpc.statd udp6 60407 net_bind_service +

Friday 7 October 2011

Ручная генерация содержимого shadow файла на примере Debian 6 Squeeze

Итак, препарировать будем Debian 6.

Вот такой вид имеет запись в shadow файле для пользователя root:
cat /etc/shadow| grep root
root:$6$KlLePXXM$vak689Mz42.4HncLulKHvzWFqiVQ1KzBe6h1BZqf9.E1q9w8VJtAs9TbYbSh9h4F5rwISZqD4s9PXLvZsTjEc1:15250:0:99999:7:::

Где, 6 - это тип хеша, используемого для генерации пароля, 6 соответствует SHA-512. Далее идет salt (соль) строка "KlLePXXM", с ней хешируется наш пароль для повышения его криптостойкости. Соль может достигать 16 символов в длину. Далее следует как раз хеш пароля: vak689Mz42.4HncLulKHvzWFqiVQ1KzBe6h1BZqf9.E1q9w8VJtAs9TbYbSh9h4F5rwISZqD4s9PXLvZsTjEc1.

Вот так можно воспроизвести мой пароль, приведенный выше, это qwerty11:
mkpasswd -m sha-512 --salt=KlLePXXM qwerty11

В ответ будет выдана строка:
$6$KlLePXXM$vak689Mz42.4HncLulKHvzWFqiVQ1KzBe6h1BZqf9.E1q9w8VJtAs9TbYbSh9h4F5rwISZqD4s9PXLvZsTjEc1

Как видите, они идентичны.


К сожалению, данная утилита отсутствует в RH (RHEL 6) дистрибутивах и там нужно искать обходной путь, я его нашел (источник):
perl -e 'print crypt(q/qwerty11/, q/$6$KlLePXXM$/), "\n"'
$6$KlLePXXM$vak689Mz42.4HncLulKHvzWFqiVQ1KzBe6h1BZqf9.E1q9w8VJtAs9TbYbSh9h4F5rwISZqD4s9PXLvZsTjEc1

Источник: http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html

sed - удаление строки из файла

Это довольно просто:
sed '/nrg/d' '/etc/shadow'

При этом будет удалена строка, содержащая подстроку "nrg".

ext4 & Debian 6 Squeeze

Разработчики Debian рекомендуют ext4 (production ready) как стандартную ФС начиная с Debian Squeeze 6

Источник: http://wiki.debian.org/Ext4

Monday 3 October 2011

Сколько места нужно grub?

The GRUB development team generally recommends embedding GRUB before the first partition, unless you have special requirements. You must ensure that the first partition starts at least 31 KiB (63 sectors) from the start of the disk; on modern disks, it is often a performance advantage to align partitions on larger boundaries anyway, so the first partition might start 1 MiB from the start of the disk.

Источник: http://www.gnu.org/software/grub/manual/grub.html

guestfish и очень медленный tar-in

Это победить очень легко, вместо:
moount /dev/vda1 /
используем:
mount-options "" /dev/vda1 /

Источник: http://libguestfs.org/FAQ.html#slowwrites

Замена OpenSSH ключей на Debian 6 Squeeze

Итак, стоит задача - регенерировать ключи OpenSSH сервера.

Певроначальная попытка просто удалить ключи в надежде, что регенерируются сами ничего не дала, к сожалению:
rm /etc/ssh/ssh_host_*

При перезагрузке была выдана ошибка:
Starting OpenBDS Secure Shell Server: sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key

Чтобы ее не выдавало, нужно было сразу выполнить команду:
dpkg-reconfigure openssh-server

Он создаст новые ключи и задача будет выполнена.

Источник: http://www.cyberciti.biz/faq/howto-regenerate-openssh-host-keys/

Continious Release или обновление CentOS до версии 6.1

Если Вы используете CentOS 6 и хотите иметь обновленное ПО как в RHEL 6.1, то сделать это так:

64 бита:
wget http://mirror.centos.org/centos/6/extras/x86_64/RPMS/centos-release-cr-6-0.el6.centos.x86_64.rpm
rpm -ihv centos-release-cr-6-0.el6.centos.x86_64.rpm


32 бита:
wget http://mirror.centos.org/centos/6/extras/i386/RPMS/centos-release-cr-6-0.el6.centos.i686.rpm
rpm -ihv centos-release-cr-6-0.el6.centos.i686.rpm

После этого запускаем yum update и ждем пока система будет обновлена до актуальной версии. Обращаю внимание, данное "пред обновление" в будущем не вызовет никаких проблем (по заявлениям мейнтенеров CentOS) и как только выйдет CentOS 6.1 обновиться до новой версии будет очень просто.

Источник: http://lists.centos.org/pipermail/centos-announce/2011-September/018078.html

Sunday 2 October 2011

Как добавить SRPM репо в CentOS 6 (CentOS 6.0 source repository, SRPM)

Создаем файл репозитория:
vim /etc/yum.repos.d/CentOS-SRPMS.repo

Добавляем в него следующую информацию:
[base-SRPMS]
name=CentOS-$releasever - Base SRPMS
baseurl=http://mirror.centos.org/centos/$releasever/os/SRPMS
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates-SRPMS]
name=CentOS-$releasever - Updates SRPMS
baseurl=http://mirror.centos.org/centos/$releasever/updates/SRPMS
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Monday 19 September 2011

VirtualBox + Mac OS 32 бита + 64 битный Core 2 Duo = запуск 64 разрядной Windows 2008

file /bin/bash /bin/bash: Mach-O universal binary with 2 architectures /bin/bash (for architecture i386): Mach-O executable i386 /bin/bash (for architecture ppc7400): Mach-O executable ppc
Как такое вообще возможно на 32 битной версии Mac OS? А вот так:
1.6 64-bit guests Starting with Version 2.0, VirtualBox also supports 64-bit guest operating systems. Starting with Version 2.1, you can even run 64-bit guests on a 32-bit host operating system, so long as you have sufficient hardware. In detail, 64-bit guests are supported under the following conditions: 1. You need a 64-bit processor with hardware virtualization support (see chapter 1.2, Software vs. hardware virtualization (VT-x and AMD-V), page 10). 2. You must enable hardware virtualization for the particular VM for which you want 64-bit support; software virtualization is not supported for 64-bit VMs. Note: On most systems, the hardware virtualization features first need to be enabled in the BIOS before VirtualBox can use them. 3. If you want to use 64-bit guest support on a 32-bit host operating system, you must also select a 64-bit operating system for the particular VM. Since supporting 64 bits on 32-bit hosts incurs additional overhead, VirtualBox only enables this support upon explicit request. On 64-bit hosts, 64-bit guest support is always enabled, so you can simply install a 64-bit operating system in the guest.
Источник: http://geekswithblogs.net/twickers/archive/2009/02/06/129243.aspx

Windows 7 + VirtualBox = не работает printscreen

Нужно делать скриншот вот так: Host (нажать и отпустить), Alt+PrintScreen! http://forum.virtualbox.org/viewtopic.php?f=9&t=8434&start=0&hilit=printscreen

Работа с WIndows SMB из Mac OS

Достаточно в Сафари указать идентификатор протокола и все заработает: smb://192.168.1.5

nmap для Mac OS X

http://nmap.org/download.html#macosx

Отличная статья про RESTful PHP

http://habrahabr.ru/blogs/php/46032/

Tuesday 13 September 2011

Статистические данные проекта speed test

http://www.netindex.com/

Работа с geoip из Perl в Debian

Устанавливаем ПО:
apt-get install -y libgeo-ip-perl

Вызываем из кода:
perl -e 'use Geo::IP; my $gi = Geo::IP->open("/usr/share/GeoIP/GeoIP.dat", GEOIP_STANDARD); print $gi->country_code_by_addr("81.21.yy.xx");'

В ответ скриптом будет выдан

Saturday 10 September 2011

Как расшифровывается KVM?

Очень банально - Keyboard Video Mouse.

Что такое WD IntelliPower

IntelliPower is a fine-tuned balance of spin speed, transfer rate, and caching algorithms designed to deliver both significant power savings and solid performance. Additionally, GreenPower drives consume less current during start up allowing more drives to spin up simultaneously resulting in faster system readiness.

Источник: http://wdc.custhelp.com/app/answers/detail/a_id/3665/p/227%2C294/session/L3RpbWUvMTMxNTY3NjAyMS9zaWQvX0ludXdMRGs%3D

Friday 2 September 2011

OpenVZ для CentOS 6 признан стабильным! Ура!

http://openvz.livejournal.com/38801.html

Вышел Parallels Virtuozzo Containers 4.6 !

Ограничение I/O диска

Задавайте ограничения на пропускную способность, доступную контейнерам для выполнения I/O-операций на диске. Ограничение пропускной способности I/O диска поможет предотвратить воздействие отдельных контейнеров на производительность всех остальных. Обеспечивает сервис-провайдерам защиту от DoS-атак и перерасхода ресурсов подписчиками. Позволяет предлагать VPS или облачные услуги с ограничением I/O диска.

Ограничения I/O диска при резервном копировании и миграции

Задайте ограничения на характеристики I/O диска для определенных процессов, включая резервное копирование, восстановление и миграцию, чтобы исключить риск снижения производительности всего сервера.

Учет I/O диска

Подробная статистика I/O диска доступна для каждого контейнера. С помощью этой статистики сервис-провайдеры могут следить за характеристиками I/O и процессами отдельных контейнеров. Эту информацию можно использовать для выявления контейнеров, которые создают самую большую нагрузку на I/O диска, что позволяет своевременно увидеть возможности для дополнительных продаж.

Улучшения vzstat

Помимо статистики учета i/o диска также доступна улучшенная статистика расхода процессорных ресурсов. Статистическую информацию можно легко получить через групповой и текстовый режимы, что упрощает интеграцию со сценариями и сторонними решениями.

Офссылка: http://www.parallels.com/ru/products/pvcl/whatsnew/#accounting

Thursday 25 August 2011

Отладка плагинов munin

Осуществляет вот примерно такой командой:
/usr/bin/munin-cron --debug --nofork --host srv1.domain.ru --service if_eth0

Tuesday 23 August 2011

Потребление электричества Датацентрами мира

По оценкам Greenpeace, потребление электроэнергии всеми Дата-Центрами мира, составляет от 1,5 до 2 процентов от общемирового спроса и с каждый год эта потребность увеличивается на 12%. Если бы Интернет был страной, то он бы занял пятое место по объему потребления электроэнергии после России и Японии.



Источник: http://telecombloger.ru/7971

Thursday 18 August 2011

Подсчет pps в Линуксе

Если с просмотром утилизации канала в Линукс нет никаких проблем, что с просмотром числа пакетов в секунду на приеме/передаче - небольшие сложности.

Вариант 1: iptraf

Устанавливаем:
yum install -y iptraf
apt-get install -y iptraf

Используем:
iptraf - Detailed interface statistics │ - eth0

Вариант 2: tcpstat

Устаналиваем:
apt-get install -y tcpstat
yum install -y tcpstat

Используем:
tcpstat -o "%p\n" -i eth0 1

В ответ будет выдано примерно следующее:
418.00
606.00
559.00
1645.00
1695.00
491.00
334.00
536.00
416.00

Вариант 3: собственный скрипт.

Написать его крайне легко, а для получения данных можно использовать приведенные ниже источники:
ifconfig eth0 | grep pack
RX packets:6494715125 errors:0 dropped:28045132 overruns:0 frame:0
TX packets:7270808826 errors:0 dropped:0 overruns:0 carrier:0
cat /sys/class/net/eth0/statistics/tx_packets
cat /sys/class/net/eth0/statistics/rx_packets

Online конвертер pps в bps и наоборот

http://www.ccievault.net/index.php/tools

Tuesday 9 August 2011

MySQL: миграция с ENUM на VARCHAR

Перед началом работ необходимо сделать бэкап.

Итак, есть поле таблицы:
`status` enum('new','suspended','complete') default NULL,

Напрямую, насколько я понял, конвертировать его в VARCHAR нельзя. Поэтому пойдем по пути через промежуточное поле, создаем его:
alter table mod_ressrvlist add newstatus varchar(255) not null;

Итого, у нас теперь два поля в табоице:
`status` enum('new','suspended','complete') default NULL,
`newstatus` varchar(255) NOT NULL,

Итак, сейчас у нас следующее содержимое таблиц:
select status, newstatus from sometable;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| suspended | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| suspended | |
| new | |
| new | |
| new | |
| new | |
| new | |
| suspended | |
| new | |
| suspended | |
| new | |
| new | |
| suspended | |
| new | |
| new | |
+-----------+-----------+

Копируем значения:
update sometable set newstatus = status;

Итого:
sql> select status, newstatus from mod_ressrvlist;
+-----------+-----------+
| status | newstatus |
+-----------+-----------+
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| suspended | suspended |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| suspended | suspended |
| new | new |
| new | new |
| new | new |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
| suspended | suspended |
| new | new |
| new | new |
+-----------+-----------+

После этого переименовываем старую таблицу:
ALTER TABLE sometable CHANGE status oldstatus enum('new','suspended','complete') default NULL;

Переименовываем новую в требуемое имя:
ALTER TABLE sometable CHANGE newstatus status varchar(255) NOT NULL;

Стираем старый филд с enum:
alter table sometable drop oldstatus;


Првоеряем новый тип поля:
`status` varchar(255) NOT NULL,

Делаем контрольную выборку:
select status from sometable;
+-----------+
| status |
+-----------+
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| suspended |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| suspended |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| new |
| suspended |
| suspended |
| new |
| new |
| new |
| new |
| new |
| suspended |
| new |
| suspended |
| new |
| new |
| suspended |
| new |
| new |
+-----------+

Все! :)

MySQL - добавление нового значения в поле типа ENUM

Допустим, ранее было вот такое поле в некой таблице:
`status` enum('new','suspended') NOT NULL,

Но в один прекрасный момент понадобилось добавлять в этот самый enum что-то еще:
ALTER TABLEsome_table MODIFY status enum('new','suspended', 'complete')

Вуаля:
`status` enum('new','suspended','complete') default NULL,

Фишка тут еще в том, что новое значение нужно добавить в конец существующего списка:
Changing the definition of an ENUM or SET column by adding new enumeration or set members to the end of the list of valid member values, as long as the storage side of the data type does not change. For example, adding a member to a SET column that has 8 members changes the required storage per value from 1 byte to 2 bytes; this will require a table copy. Adding members in the middle of the list causes renumbering of existing members, which requires a table copy.

Источник: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Tuesday 2 August 2011

В Bind 9 исправлен баг, который приводил к очень долгой загрузке на большом числе зон

http://www.isc.org/community/blog/201107/major-improvement-bind-9-startup-performance

И мы были подвержены этому багу...

Запуск arcconf на read only (ro) файловой системе

Итак, есть сервер с контроллером Adaptec, ФС которого перешла в RO. Очевидный вариант - проверить состояние массива утилитой arcconf, но она не срабатывает!

arcconf getconfig 1 ld
Could not open log file: /var/log/UcliEvt.log

После выдачи ошибки команда блокируется. Первое предположение было, что открытие лог файла необходимо для работы программы, но strace открыл глаза на источник проблемы:

umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = 0 (Timeout)
umask(077) = 022
open("/var/lock/.aac0lock", O_RDWR) = -1 EROFS (Read-only file system)
umask(022) = 077
poll(0, 0, 50) = -1 EINTR (Interrupted system call)

То есть, программа не могла создать лок-файл. Фиксится легко:
mount -t tmpfs none /var/lock

Все, после этого сработало на ура:
arcconf getconfig 1 ld
Could not open log file: /var/log/UcliEvt.log
Controllers found: 1
----------------------------------------------------------------------
Logical device information
----------------------------------------------------------------------
Logical device number 0
Logical device name : Device 0
RAID level : 10
Status of logical device : Optimal
Size : XXXXX MB
Stripe-unit size : 256 KB
Read-cache mode : Enabled
MaxIQ preferred cache setting : Enabled
MaxIQ cache setting : Disabled
Write-cache mode : Enabled (write-back)
Write-cache setting : Enabled (write-back)
Partitioned : Yes
Protected by Hot-Spare : No
Bootable : Yes
Failed stripes : No
Power settings : Disabled
--------------------------------------------------------
Logical device segment information
--------------------------------------------------------
Group 0, Segment 0 : Present (0,0) 6SJ0ET5R0000M124SKJU
Group 0, Segment 1 : Present (0,1) 6SJ0DRBM0000M125DK6G
Group 1, Segment 0 : Present (0,2) 6SJ0EET40000M125DNTK
Group 1, Segment 1 : Present (0,3) 6SJ0ERJZ0000M1214JZD



Command completed successfully.
Could not open log file: /var/log/UcliEvt.log

Демоны на PHP

http://sergey89.ru/notes/php-multi-threaded-daemon-part-one/

Friday 29 July 2011

Корректная очистка Nginx кэша

Достаточно лишь удалить файлы кэша:
find /var/lib/nginx/cache -type f -exec rm {} \;

Либо вот так:

for i in `find /var/lib/nginx/cache -type f`; do rm $i ; done

Источник: http://forum.nginx.org/read.php?2,2600,2602

Thursday 28 July 2011

Команда для анализа ключей в содержимом кэша nginx

for i in `find /var/lib/nginx/cache/ -type f`; do cat $i | grep -a KEY; done | sort | uniq

В ответ будет выдан спсиок ключей закэшированных страниц.

Tuesday 26 July 2011

Реальная пропускная способность гигабитного Ethernet

http://rickardnobel.se/archives/526

Новая схема лицензирования в vSphere 5 - на основании vRAM

http://rickardnobel.se/archives/620

Технические ограничения в бесплатной версии ESXi (vSphere Server) 5

Весьма и весьма неприятны, теперь для виртуальной машины потолок - 8 гб оперативной памяти:
How much vRAM does a VMware vSphere Hypervisor license provide?
A vSphere Hypervisor license includes a vRAM entitlement of 8GB.

Update от октября 2011 года (по той же ссылке, информация была изменена):
How much vRAM does a VMware vSphere Hypervisor license provide?
vSphere Hypervisor license provides a vRAM entitlement of 32GB per server, regardless of the number of physical processors. vSphere Hypervisor can be used on servers with maximum physical RAM capacity of 32GB.

Источник: http://www.vmware.com/products/vsphere-hypervisor/faq.html

Резонный вопрос - это для одной VM или для всех?

Согласно весьма популярному блогу по сабжеквой теме - это для всех виртуальных машин суммарно.

The concept of vRAM is defined in the licensing documents as the total amount of RAM given to all virtual machines

Источник: http://rickardnobel.se/archives/620

А вот еще немного информации от русскоязычного ресурса vmgu.ru.

егодня мы хотим рассказать о новой версии VMware ESXi 5, которая (не волнуйтесь) останется в бесплатном варианте (правильно бесплатную версию VMware ESXi 5 нужно называть VMware vSphere Hypervisor). Но поскольку правила лицензирования теперь изменились (об этом там же), то нужно знать о важном ограничении, которое повлияет на большинство пользователей малого и среднего бизнеса, а именно:

Бесплатный VMware ESXi 5 позволяет использовать сколько угодно виртуальных машин на сервере, который имеет сколько угодно процессоров и ядер, но совокупная сконфигурированная память всех включенных виртуальных машин не должна превышать 8 ГБ.

8 ГБ на весь сервер или на один физический процессор сервера? Пока точно неизвестно (я и чуваки склоняемся к первому варианту).

Что такое сконфигурированная память виртуальной машины? Это та, которую вы выставляете в настройках при ее создании.

Звучит как шутка, не правда ли - 8 ГБ памяти для всех запущенных виртуальных машин на сервере с бесплатным VMware ESXi 5 (а может 16 ГБ на двухпроцессорном сервере)? Но это так. Понятно дело, что для VMware ESXi 4.1 у вас на сервере для виртуальных машин, зачастую, выставлено гораздо больше памяти. Но этот тот способ, за счет которого VMware заставит вас купить хотя бы VMware vSphere 5 Essentials, где уже для каждого физического процессора сервера позволяется использовать 24 ГБ сконфигурированной памяти виртуальных машин (а значит, 48 ГБ на двухпроцессорный сервер).

Не удивляйтесь, это нормально в капиталистическом мире, где халява имеет тенденцию заканчиваться. Еще не верите? Тогда идем в VMware vSphere Hypervisor FAQ и читаем:



How much vRAM does a VMware vSphere Hypervisor license provide?

A vSphere Hypervisor license includes a vRAM entitlement of 8GB.



Хочется знать, то такое vRAM? Не проблема - vRAM is the entitlement of pooled virtual memory used across all active virtual machines on the system.

Ну и, конечно, вам хочется знать, что произойдет, если вы превысите планку Entitled vRAM. В этом случае, после лимита в 8 ГБ, новая виртуальная машина просто не включится (это предварительная информация). Все очень просто - hard limit.

А вот какие улучшения и новые возможности появятся в бесплатном VMware ESXi 5:

8 виртуальных процессоров для виртуальной машины (vCPU)
Улучшенный фаервол для VMware ESXi 5 (см. видео тут)
Поддержка устройств USB 3.0
GUI для редактирования количества виртуальных ядер на виртуальный процессор
USB-устройства, подключаемые к ВМ со стороны клиента
Поддержка больших томов VMFS и RDM (до 64 ГБ) в VMFS 5
Поддержка EFI BIOS и гостевых ОС Mac OS 10.6
Поддержка смарт-карт для доступа к консоли виртуальных машин
Поддержка 3D-графики и Windows Aero
Становится понятным, что теперь возможны два варианта: или под давлением общественности VMware повысит планку используемой памяти для бесплатного VMware ESXi 5, или пользователи начнут массовые миграции на Microsoft Hyper-V и Citrix XenServer, которые потихоньку набирают силу в сегменте малого и среднего бизнеса.

Оставайтесь с нами. Еще интереснее дальше будут вещи. Кстати, по vSphere 5 появился еще вот такой интересный документик.


Источник: http://www.vmgu.ru/news/vmware-esxi-5-free

Sunday 24 July 2011

Скачать steam для Mac OS X

http://store.steampowered.com/about/

Немного мыслей про виртуализацию - Linux KVM

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

Разумеется, текущее состояние KVM далеко от production-ready решений по виртуализации от конкурентов, но все движется к тому, что в районе RHEL 6.2-6.4 это будет очень и очень серьезная технология, которая потеснит текущих игроков рынка и сильно. Не буду углубляться в подробности, но одно лишь рвение Intel в ее (KVM) развитии стоит внимания да и не только Intel, кому интересно: http://www.openvirtualizationalliance.org/ в данном консорциуме состоят Intel, HP, IBM, Red Hat. Конечно, я не умаляю крутости Ситрикса и VmWare, но с такой могучей четверкой еще надо потягаться будет.

А вот несколько слов от одного из ведущих разработчиков KVM - Avi Kivity, http://kerneltrap.org/node/8088 в его интервью очень хорошо объясняется, в чем отличия KVM от других систем виртуализации.

Изначально опубликовано: http://forum.searchengines.ru/showthread.php?p=9229954

Saturday 23 July 2011

Две наиболее нужных команды при разработке на PHP, позволяющие сэкономить море времени

Вот эти две команды, заставят PHP выдавать все ошибки и предупреждения, которые у него имеются:
error_reporting(E_ALL^E_STRICT);
ini_set('display_errors','On');

Изменение итерируемой структуры из цикла foreach в PHP

Стандартно итерация производится так:
foreach ( $invitems as $item ) {

И если попробовать сделать что-то в стиле: $item['soma_key'] = 'some_val', то как ожидается это не сработает (в отличие от Perl, там такое поведение стандартно).

Чтобы такой механизм заработал, нужно немного скорректировать вид цикла:
foreach ( $invitems as &$item ) {

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

Куда жаловаться на недобросовестную рекламу от Google?

http://adwords.google.com/support/aw/bin/request.py?hl=ru&contact_type=feedback&origin=cluster&rd=1

iPhone приложение для планирования и учета расхода личных средств - Budget

http://moneynews.ru/AuthorsArticle/14185/

Очень простой профайлинг кода на PHP - PHP Quick Profiler

Наткнулся на сий замечательный софт - PHP Quick Profiler: http://particletree.com/features/php-quick-profiler/

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

Модуль для логгирования POST запросов в Apache

Вот описание: http://freshmeat.net/projects/mod_log_post

Вот официальный сайт загрузки (требуется регистрация): http://ftp.robert-scheck.de/linux/mod_log_post/

А вот зеркало без регистрации: http://fastvps.googlecode.com/files/mod_log_post-0.1.0.tar.gz
cd /usr/src
wget http://fastvps.googlecode.com/files/mod_log_post-0.1.0.tar.gz
tar -xf mod_log_post-0.1.0.tar.gz
cd mod_log_post-0.1.0
apt-get install -y apache2-dev
./configure
make install
После этого модуль скопируется в: /usr/lib/apache2/modules, а конфиг его добавится в /etc/apache2/conf.d/log_post.conf.

Открываем конфиг:
vim /etc/apache2/conf.d/log_post.conf

Там заменяем:
LoadModule log_post_module modules/mod_log_post.so
на
LoadModule log_post_module /usr/lib/apache2/modules/mod_log_post.so

И применяем изменения:
/etc/init.d/apache2 restart


tail -f /var/log/apache2/post_log




Friday 22 July 2011

lighttpd на Debian - деактивация поддержки IPv6

Как сторонний эффект включенной поддержки IPv6 - накрасивые логи в стиле:
::ffff:178.77.77.77 - [22/Jul/2011:21:12:08 +0200] "GET /media/js/tools.js HTTP/1.1" 200 8163 "http://www.domain.ru/dedicated/?gclid=xxxxx" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"


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

Комментируем строки:
# include_shell "/usr/share/lighttpd/use-ipv6.pl"

Применяем настройки:
/etc/init.d/lighttpd restart

Wednesday 20 July 2011

Как прервать исполнение кода в Smarty 2?

Очень часто хочется прервать какой-либо процесс внутри Smarty шаблона, но если сделать return, то остановится рендеринг всего шаблона, а не только {php} блока. Единственное решение этой проблемы, которое я нашел - выносить такой код в отдельные файлы и подключать их через {include}. И тогда return в инклуд файле не будет прерывать рендеринг основного шаблона.

Saturday 9 July 2011

Обновление файлов и папок рекурсивно

Итак, есть задача - имеется некая файловая иерархия, где в корневой папке имеются и файлы и папки, в которых в свою очередь имеются вложенные файлы и папки. Кроме этого, имеется аналогичная файловая иерархия, но с только новыми файлами (файлы лежат как в корне, так и во вложенных папках). Задача - нужно из второй файловой иерархии скопировать все папки/файлы и в случае их наличия в первой - переписать их. Пусть первая иерархия - folder, вторая - folderpatch.


Первая попытка была в стиле:
mv folderpatch/* folder

Но в ответ меня встретило:

mv: cannot move `test1' to `../test1': Directory not empty
mv: cannot move `test2' to `../test2': Directory not empty
mv: cannot move `test3' to `../test3': Directory not empty

То есть, пропатчить файлы внутри папок не получится никак.

Но для cp преград нету!
cp -af folderpath/* folder

После этого измененные/новые файлы из папки folderpatch заменят файлы в корне папки folder, а также файлы во вложенных папках папки folder.

Источник: http://www.cafewebmaster.com/update-overwrite-files-and-directories-recursively-linux-mv-cp-commands

Thursday 7 July 2011

Распаковка rar архивов на Linux / Mac OS с сохранением иерархии папок

У unrar есть два варианта распаковки:
e Extract files to current directory
x Extract files with full path

Чтобы сохранить структуру папок, нужно использовать x:
unrar x

Ваня, респект!

Sunday 3 July 2011

Как заставить Linux перезагрузиться при возникновении panic ошибки?

Для этого достаточно задать параметр kernel.panic в файле /etc/sysctl.conf и применить изменения. При установке данного параметра в нулевое значение перезагрузки при panic происходить не будет, при установке в любое положительное значение (строго больше нуля) будет происходить перезагрузка через заданное количество секунд.

Итого, добавляем в файл /etc/sysctl.conf строку
kernel.panic = 15
После этого применяем изменения:
sysctl -p

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

Saturday 2 July 2011

Как получить бесплатный Windows 2008 R2 на 180 дней?

http://technet.microsoft.com/ru-ru/evalcenter/dd459137.aspx


Там выбираем: "Загрузка 64-разрядных версий (Standard, Enterprise, Datacenter и Web" и щелкаем "Начните прямо сейчас", после этого регистрируемся/логинимся и начнется загрузка триал версии^ файла с именем в стиле: xxxx_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso