django + lighttpd

Как заставить вместе работать lighttpd и django. Готовый пример конфигурации, которую необходимо складывать в vhosts.d:

$SERVER["socket"] == "0.0.0.0:8888" {
        server.document-root = "/srv/www/django/htdocs"

        url.access-deny = ( "~", ".inc", ".svn/" )

        fastcgi.server = (
                "/dispatch.fcgi" => (
                "main" => (
                        "socket" => "/srv/www/django/run/fcgi.sock",
                        "bin-path" => "/srv/www/django/manage.py runfcgi --pythonpath=/srv/www/django --settings=djangoapp.settings-production method=threaded",
                        "max-procs" => 2,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
                )
                ),
        )

        alias.url = ( "/static" => "/srv/www/django/htdocs", )

        url.rewrite-once = (
                "^(/static.*)$" => "$1",
                "^/favicon\.ico$" => "/static/favicon.ico",
                "^(/.*)$" => "/dispatch.fcgi$1"
        )
}

Предполагается, что проект лежит в /srv/www/django/, где для него существует рабочая версия настроек в файле settings-production.py. lighttpd сам запустит fcgi-сервер в количестве max-procs экземпляров. Опция check-local необходима для того, чтобы отключить проверку существования файлов на локальной машине, которую делает lighttpd; так как запрашиваемые URL существуют лишь в логике django, а не в файловой системе.

Для правильной работы тегов типа {% url %} необходимо добавить строчку FORCE_SCRIPT_NAME = '' в настройки проекта написанного на django, иначе ко всем ссылкам в начало будет добавляться название /dispatch.fcgi.

xrandr

RandR(The X Resize and Rotate Extension) — это расширение сервера x11 позволяющее динамически менять разрешение экрана, его размер, ориентацию и другие параметры без перезапуска X-сессии. Может быть очень полезен при подключении мультимедийного проектора к ноутбуку. Взаимодействие пользователя осуществляется с помощью одноименной утилиты xrandr, хотя оконные менеджеры предоставляют свои графические обертки для работы с RandR.

xrandr оперирует с выходами(outputs), самый простой способ узнать их наименования и поддерживаемые параметры: xrandr --prop. Общий синтаксис: xrandr --output name --command. Подключая или отключая VGA-устройства во время работы компьютера можно использовать команду xrandr --output VGA --auto для того, чтобы разрешить вновь подключенный выход, или выключить отсоединенный. Есть отдельная команда xrandr --output VGA --off.

Может возникнуть такая ситуация, что экраны должны быть сконфигурированы для показа одно экрана(как в случае мультимедийных проекторов), либо для показа разных участков(два монитора): xrandr --output VGA --same-as LVDS (варианты --left-of, --right-of, --above, --below).

Разрешения двух выходов могут не совпадать, можно использовать команду xrandr --output VGA --mode mode для установки нужной моды, список доступных покажет команда --prop.

Когда физическое отношение сторон экранов двух выходов в режиме --same-as не совпадает(например, если ноутбук 16:10, а мультимедийный проектор 4:3), необходимо либо вырезать нужную часть экрана командой xrandr --output VGA --pos xxy, установив левый верхний угол в позицию x, y., либо использовать команды --scale, которые к сожалению поддерживаются только начиная с версии 1.3 протокола. К счастью, например okular в режиме показа презентаций оставляет черные поля по бокам слайдов 4:3, таким образом использование --pos даже предпочтительно, позволяя отцентрировать выход проектора, отрезав черные поля.

cron: Permission denied

После обновления на openSUSE 11.2 перестали запускаться некоторые задачи cron'а. Описаны они были в отдельном файле, расположенном в /etc/cron.d и запускаться должны быть не от root, а от некоторого системного пользователя. Но вместо выполнения, в /var/log/messages обнаружились только записи вида "/usr/sbin/cron[47852]: Permission denied".

Ошибка, прямо скажем, не очень информативного содержания. openSUSE использует vixie-cron, снабженный дополнительными патчами, один из которых обеспечивает работу с PAM. В пакете идет так-же и файл /etc/pam.d/crond с настройками.

Исполнению скрипта мешал модуль pam_unix2.so(разработанный Thorsten Kukuk), т.к. этот модуль новой версии считает, что аккаунт заблокирован, если в файле /etc/shadow на месте пароля записан символ '!'. По некоторому стечению обстоятельств так и оказалось. Еще туда можно записать '*', как говорится, почувствуйте разницу.

"Argument list too long"

Какое количество аргументов можно запихнуть в командную строку? Как хорошо известно, исполнение новой программы запускается той или иной вариацией функции exec. А функции эти иногда могут возвращать ошибку E2BIG. Дословно процитировав man, можно было бы воскликнуть: "The total number of bytes in the environment (envp) and argument list (argv) is too large."

В Linux константа ARG_MAX определена в файле include/linux/limits.h, где так и написано 131072 байтов (это на переменные окружения и аргументы командной строки вместе).

Где-то между 2.6.22 и 2.6.23 ситуация немного изменилась, посмотрев в функцию get_arg_page(), что в файле fs/exec.c, можно заметить, что теперь размер ограничен четвертью стека, и, следовательно, может быть неограничен вовсе, т.к. размер стека может быть изменен перед запуском процесса, используя команду ulimit -s.

Простенький скрипт позволяющий поиграть с размером области для аргументов. Будет работать только на системах с ядрами новее, чем 2.6.23. На более старых всегда будет один и тот же результат — 131072.
#!/bin/sh

EXEBIN=/bin/true

pattern=$(perl -e 'print ("x" x 4095)."\n";')

ulimit -s $1
ulimit -s

arg=$pattern
while $EXEBIN $arg
do
        echo -n .
        arg="$arg $pattern"
done

echo $? ${#arg}

Обновление на openSUSE 11.2.

Сегодня успешно обновил openSUSE 11.1 до openSUSE 11.2 прямо на ходу, с помощью zypper dup. Процесс от начала обновления, до начала написания заметки в блоге занял ровно четыре часа.

Восемь шагов к совершенству:
  1. zypper mr -a -d
  2. zypper ar http://download.opensuse.org/distribution/11.2/repo/non-oss/ openSUSE-11.2-non-oss
  3. zypper ar http://download.opensuse.org/distribution/11.2/repo/oss/ openSUSE-11.2-oss
  4. zypper ar -f http://download.opensuse.org/update/11.2/ openSUSE-11.2-updates
  5. zypper refresh
  6. zypper in zypper
  7. zypper dup
  8. SuSEconfig

Замечу лишь, что при попытке сделать zypper in zypper было обновлено несколько пакетов, и после этого система оказалась в некоторой некондиции. Сначала я пробовал сделайть апдейт используя DVD, но dup сказал: "/bin/mount: error while loading shared libraries: libvolume_id.so.1: cannot open shared object file: No such file or directory". Поэтому нужно заранее позаботиться о наличии статически слинкованного mount в нужном месте, если необходимо использование DVD.

Новый zypper обладает параметром commit.downloadMode в конфигурационном файле /etc/zypp/zypp.conf. Его можно установить в позицию DownloadInAdvance, если существует недоверие к надежности используемого инетрнет-канала. Это заставит zypper сначала скачать все пакеты, затем их установить.

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

Настройка часового пояса

В этом сообщении собрана некоторая информация о настройке часового пояса в вашей(и не только вашей) системе.

В настоящее время, шкала времени на Земле построена на атомных стандартах частоты и называется TAI, хотя на практике используется другая шкала — UTC, отличающаяся от TAI на целое число секунд. Находясь в некоторой точке на Земле можно заметить, что местное гражданское время устанавливается административно, и, как правило, отличается на целое количество часов от UTC, момент восхода Солнца зависит от долготы вашего положения, и только UTC остается постоянным во всех точках Земли в один и тот же момент времени.

glibc использует файл /etc/localtime для определение настроек по-умолчанию, обычно этот файл является либо копией, либо символической ссылкой на один из заранее приготовленных файлов в /usr/share/zoneinfo. Необходимо выбрать тот, который вам необходим и использовать его.

Второй способ — использование переменной среды окружения TZ, о которой рассказывается тут: TZ Variable. Переменная имеет несколько форматов, позволяющих либо напрямую задать свойства вашего часового пояса(смещение, относительно всемирного времени и моменты перехода на летнее/зимнее), либо использовать один из подготовленных файлов в /usr/share/zoneinfo(например Europe/Moscow). Утилита tzselect позволит вам правильно задать значение переменной, основываясь на вашем местоположении и знаниях географии. Переменную TZ, прописанную в .profile, можно использовать как альтернативный способ задания часового пояса для конкретного пользователя(например если он работает удаленно).

uclibc, который используется в busybox и множестве встраиваемых устройств, от будильников до стиральных машин, не поддерживает /etc/localtime и /usr/share/zoneinfo (Glibc vs. uClibc differences). Необходимо использовать только переменную TZ, значение которой может быть глобально задано в файле /etc/TZ в качестве значения по-умолчанию. Символические имена для TZ типа Europe/Moscow тоже не допускаются. Значение для Москвы выглядит таким образом:
MSK-3MSD,M3.5.0,M10.5.0/3
Тут написано: часовой пояс MSK, три часа к западу, летний пояс MSD на час больше, действует с последнего воскресенья марта, по последнее воскресенье октября, смена пояса происходит в 3 часа. Для произвольного часового пояса можно составить используя описание Environment Variable Definition.

Формат даты для RPM

Просто оставлю здесь команду для получения текущей даты в формате rpm-spec, для последующего вписывания в раздел %changelog

LANG=C date +"%a %b %d %Y"


%changelog
* Sat Oct 03 2009 - email@host.com
- log message