Twitter купил Posterous 

Эту интересную новость я узнал из письма, упавшего мне на почтовый ящик сегодня ночью. Мне вообще было интересно знать, куда движется Twitter последнее время. Учитывая развитие блоггинговых возможностей у конкурентов (Facebook, Google Plus), было бы опрометчиво, на мой взгляд, со стороны руководства Twitter стоять на месте. Трудно рассматривать Posterous в качестве конкурента Twitter, хотя бы по нишевости контента, посещаемости и другим характеристикам. Как следствие, сомневаюсь что это обычное поглощение (как было, например, у Facebook и Friendfeed. В результате покупки Facebook фактически умертвил сервис, о чём я писал тут и упоминал тут). Скорее всего, это именно “приобретение” квалифицированного персонала и работающего функционала для развития основного проекта (похоже, это такие “модные” веяния в менеджменте IT-компаний последнее время). Безусловно, что Twitter имеет несколько иную направленность, нежели Facebook или Google Plus. Однако же, кое-чем их функционал всё-таки перекликается. Плюс, я не исключаю возможность того, что руководство Twitter, подгоняемое волной развития и роста популярности социальных сетей, может усилить социальную составляющую своего сервиса. Хотя, учитывая появление в сети таких проектов, как Diaspora или даже DuckDuckGo, стоит отметить, что эта самая волна многим уже порядком надоела, и, видимо, за максимумом постепенно последует спад. Короче, посмотрим.

Twitter acquires Posterous, mail letter

Init-скрипт для Spawn-FCGI 

Утилитка Spawn-FCGI, предназначенная для запуска процессов в FastCGI-режиме и являющаяся частью проекта Lighthttpd, уже давненько используется многими без самого Lighty. Связано это с её чрезвычайной полезностью, стабильностью и быстротой работы. Три года назад разработчики Lighthttpd даже вынесли её в отдельный проект. Не смотря на растущую популярность PHP-FPM, Spawn-FCGI находит своих “клиентов”. Причем, не только среди запускающих посредством неё PHP-процессы. Недавно мне понадобилось поднять именно Spawn-FCGI для PHP на Debian-сервере. Проблемка в том, что пакет, поставляющий утилиту, не содержит в себе так необходимого для нормального управления init-скрипта. Об этом, кстати, есть баг-репорт. Неприятность затрагивает Debian и, как следствие, Ubuntu и, возможно, её производные. Поскребя по интернету, я нашел-таки скриптик от народных умельцев. Кое-чего в нём для меня не хватало, так что я устранил этот недостаток. Ниже — скрипт с отсебятинкой, работает на Squeeze и не жалуется.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#! /bin/sh
#
# spawn-fcgi Startup script for the nginx HTTP Server
#
# chkconfig: - 84 15
# description: Loading php-cgi using spawn-cgi
# HTML files and CGI.
#
### BEGIN INIT INFO
# Provides: spawn-fcgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop php-cgi using spawn-fcgi
# Description: Start and stop php-cgi using spawn-fcgi
### END INIT INFO
# Author: Ryan Norbauer
# Modified: Geoffrey Grosenbach http://topfunky.com
# Modified: David Krmpotic http://davidhq.com
# Modified: Kun Xi http://kunxi.org
# Modified: http://drumcoder.co.uk/
# Modified: http://olezhek.net/
SCRIPTNAME=$(basename $0)
DAEMON=/usr/bin/spawn-fcgi
FCGIHOST=127.0.0.1
FCGIPORT=9000
FCGIUSER=www-data
FCGIGROUP=www-data
FCGIAPP=/usr/bin/php-cgi
FCGICHILDREN=5
PIDFILE=/var/run/$SCRIPTNAME.pid
DESC="Spawn-FCGI"
# You can change settings for this script by editing /etc/default/$SCRIPTNAME
[ -r /etc/default/$SCRIPTNAME ] && . /etc/default/$SCRIPTNAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
test -x $FCGIAPP || exit 0
start() {
# $DAEMON -a $FCGIHOST -p $FCGIPORT -u $FCGIUSER -g $FCGIGROUP -f $FCGIAPP -P $PIDFILE -C $FCGICHILDREN 2> /dev/null || echo -en "\n already running"
$DAEMON -a $FCGIHOST -p $FCGIPORT -u $FCGIUSER -g $FCGIGROUP -P $PIDFILE -C $FCGICHILDREN -- $FCGIAPP 2> /dev/null || echo -en "\n already running"
}
stop() {
kill -QUIT `cat $PIDFILE` || echo -en "\n not running"
}
restart() {
kill -HUP `cat $PIDFILE` || echo -en "\n can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: "
start
;;
stop)
echo -n "Stopping $DESC: "
stop
;;
restart|reload)
echo -n "Restarting $DESC: "
stop
# One second might not be time enough for a daemon to stop,
# if this happens, d_start will fail (and dpkg will break if
# the package is being upgraded). Change the timeout if needed
# be, or change d_stop to have start-stop-daemon use --retry.
# Notice that using --retry slows down the shutdown process somewhat.
sleep 1
start
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
exit 3
;;
esac
exit $?

Скопировать текст в файл, файл поместить в директорию /etc/init.d/, накинуть прав на выполнение:

# chmod +x /etc/init.d/<your filename>

Прописать в автозагрузку:

# update-rc.d <your filename> defaults

Готово. Само собой, для работы скрипта требуется наличие Spawn-FCGI и CGI-интерфейса, процессы которого будут плодиться. В данном случае, я использовал php-fastcgi. Как я упоминал выше, Spawn-FCGI, в общем-то, без разницы, какие CGI-процессы плодить. Это может быть и CGI для Python, например. Кстати, предпоследняя версия этого скрипта как раз была предназначена для запуска CGI для Mercurial — а это Python. Для того, чтобы этот скрипт запускал что-то другое, достаточно поменять значение переменной FCGIAPP на нужное, скопировать скрипт под другим именем и опять прописать в автозагрузку. Скрипт изменен таким образом, чтобы дополнительные настройки для него можно было менять, не редактируя сам скрипт — через файл /etc/default/<your file name>.

Java-плагин в Ubuntu/Mint: что и где 

Поскольку об этой мелочи я постоянно забываю, я решил написать про неё в блог. Речь идет о Java-плагине для браузеров в Ubuntu/Mint. Этот плагин можно установить при помощи aptitude:

sudo aptitude install sun-java6-plugin

Однако, этого недостаточно, чтобы плагин был обнаружен и “воспринят” браузером. Для этого нужно создать символьные ссылки на библиотеку плагина для нужных браузеров. Причём, от дистрибутива к дистрибутиву путь, по которому размещён этот файл, изменяется. Поэтому, перед тем как раскидывать линки, лучше уточнить путь к файлу libnpjp2.so. В Linux Mint 11/Ubuntu Natty amd64 библиотека плагиина размещается по пути /usr/lib64/jvm/java-6-sun/jre/lib/amd64/. В Linux Mint 12/Ubuntu Oneiric этот путь уже эквивалентен /usr/lib/jvm/java-6-sun/jre/lib/. Eсли платформа не amd64, а x86, то путь тоже поменяется. Само собой, что нужно, чтобы браузеры и библиотека были скомпилированы под одну платформу. Для Opera директория с плагинами обычно размещается по пути /usr/lib/opera/plugins, для Firefox — /usr/lib/mozilla/plugins. Туда и нужно линковать. Выглядеть это будет примерно так:

cd /usr/lib/opera/plugins && sudo ln -s /usr/lib64/jvm/java-6-sun/jre/lib/amd64/libnpjp2.so
cd /usr/lib/firefox/plugins && sudo ln -s /usr/lib64/jvm/java-6-sun/jre/lib/amd64/libnpjp2.so

Real deal от Google, по идее, “подхватывает” этот плагин автоматически. Отмечу, что я использовал для примера выше путь к libnpjp2.so для Mint 11/Ubuntu Natty.

После создания символьных ссылок следует перезапустить браузеры, чтобы они подключили плагин. У Opera, на месте, где должен загружаться апплет, может появиться сообщение, что плагин не обнаружен. Чтобы заработало, нужно просто покликать по этой области. Chrome у меня пожаловался на то, что плагин устарел. Возможно, это было связано с тем, что уже есть седьмая версия Java. В любом случае, единственную альтернативу запуску апплета, которую сейчас может предложить Chrome — установку Java из самораспаковывающегося архива либо из rpm-пакета — для deb-систем нет смысла использовать.

Wordpress: admin.php поедает память 

Сегодня обнаружил пренеприятную вещь. Если в WP, будучи авторизованным, производить какие-либо действия, через некоторое время сайт перестаёт отзываться и выпадает в осадок на непродолжительное время. После этого всё опять начинает работать, как ни в чём не бывало, до следующего такого же события. Я полез в логи в поисках источника проблемы. В /var/log/syslog я нашел исчерпывающую информацию:

Dec 22 20:39:41 < хост убран > suhosin[19857]: ALERT - script tried to increase memory_limit to 268435456 bytes which is above the allowed value (attacker '< ip убран >', file 'wp-admin/admin.php', line 109)

Оказалось, что это полезняшка-Suhosin прибивает скрипт wp-admin/admin.php по причине того, что последний по непонятной причине начинает жрать очень уж много памяти. Гораздо больше, чем задано в настройках PHP. Начав копаться в движке, я обнаружил, что разработчики весьма щедро одарили свой движок памятью (wp-includes/default-constants.php:27):

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}

Подобная запись присутствовала в WP и раньше. Тогда значение просто было жёстко прописано в те же 256Мб. В конфиге php у меня установлено максимальное значение в 128Мб. Именно по этой причине Suhosin и валил выполняющийся скрипт.

На данный момент я не очень представляю, чего же такого делает admin.php, что требует больше 128 мегабайт памяти. Особенно учитывая, что это происходит во время отправки комментария. Не смотря на то, что скрипту требуется память, я решил не раздвигать установленные в 128Мб рамки. Скорее наоборот, я решил придавить Wordpress этими 128 мегабайтами. Как видно из кода выше, это совсем нетрудно сделать — достаточно определить константу WP_MAX_MEMORY_LIMIT в wp-config.php:

define( 'WP_MAX_MEMORY_LIMIT', '128M' );

Тогда вышеупомянутый код в wp-includes/default-constants.php не будет выполняться. Конечно, это полурешение. Более того, я ожидаю, что, если скрипту понадобится больше 128Мб, он также будет убиваться, но уже интерпретатором PHP. Однако, я все же посмотрю, как оно будет работать.

Как зарезервировать instance на Amazon 

У Amazon есть много вариантов использования их вычислительного облака. И это относится не только к широкой линейке тарифов. Можно сказать, что количество тарифов можно умножить на два, поскольку инстансы бывают двух типов — on-demand и reserved. Их отличие только в стоимости. Первый удобно заказывать, когда необходимо взять вычислительную мощность на время, меньшее чем 1 год. В других случаях действительно выгоднее брать reserved-тип либо комбинировать оба. В принципе, ничто не мешает гонять on-demand instance годами, но финансовые потери в такой ситуации будут существенны, да и глупо это. [ ... ]