24 Июль 2008 г.

Алгоритмы перестановок в Ruby

Понадобилось мне намедни генерировать перестановки. Пошукал гуглом, почитал умные книги. В итоге, наметилось три кандидата на реализацию.

Кандидат первый:

class Array
def perm(n = size)
if size < n or n < 0
elsif n == 0
yield([])
else
self[1..-1].perm(n - 1) do |x|
(0...n).each do |i|
yield(x[0...i] + [first] + x[i..-1])
end
end
self[1..-1].perm(n) do |x|
yield(x)
end
end
end
end

Кандидат второй: gem install permutation

Кандидат третий: встроенный метод Array#permutation в Ruby 1.9

Провел бенчмарк, результаты такие:

Ruby 1.8:

                          user     system      total        real
Array#perm 2.670000 0.070000 2.740000 ( 2.828519)
Permutation 1.950000 0.090000 2.040000 ( 2.157960)

Ruby 1.9:

                          user     system      total        real
Array#perm 2.150000 0.000000 2.150000 ( 2.289050)
Permutation 1.280000 0.000000 1.280000 ( 1.342824)
Array#permutation 0.290000 0.000000 0.290000 ( 0.290440)

Код теста:

require 'rubygems'
require 'permutation'
require 'benchmark'

class Array
def perm(n = size, &blk)
if n == 0
yield []
elsif n >= 0 and n <= size
self[1..-1].perm(n - 1) do |x|
(0...n).each do |i|
yield x[0...i] + [first] + x[i..-1]
end
end
self[1..-1].perm(n) do |x|
yield x
end
end
end
end

n = (0..8).to_a
Benchmark.bm(20) do |x|
x.report("Array#perm") { n.perm { |a| ;} }
x.report("Permutation") do
p = Permutation.new(9)
p.map { |a| ; }
end
if RUBY_VERSION >= '1.9'
x.report("Array#permutation") { n.permutation { |a| ; } }
end
end

13 Май 2008 г.

Firefox 3.0 strikes back!

После перехода с Firefox 2.0.x на 3.0, у меня перестала работать боковая кнопка на мыши, которая ранее заменяла мне кнопку Back в браузере. Очень я к ней привык и привязался. Поэтому потерю функциональности сильно переживал. Сегодня решил серьезно раскопать все и пофиксить.

Как оказалось, FF 3.0 начал по другому интерпретировать номера кнопок. Кнопки, которые ранее отвечали за back/forward, теперь начали отвечать за горизонтальный скроллинг. Включив в Xorg драйвер evdev для мыши и получив все 8 кнопок с моей Logitech MX-310, я перемаппил кнопки:

echo "pointer = 1 2 3 4 5 8 7 6" > ~/.Xmodmap

Кнопку forward вернуть на мышь не удалось - не хватает еще одной кнопки на мыши (тогда можно было бы написать 1 2 3 4 5 8 9 6 7).

27 Апрель 2008 г.

Идентификация разделов дисков by UUID

Иногда на Debian Linux всплывает глюк (возможно это глюк контроллера) - при загрузке он меняет местами винты. Как следствие, ОС не может найти root-раздел и вываливается в busybox. Одно из решений, отказаться от идентификации разделов через /dev/sdXN.

Рецепт прост:
  1. Запускаем /sbin/blkid и смотрим UUID для каждого раздела.
  2. В /etc/fstab вместо /dev/sdaN прописываем UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX (кавычки не ставим).
  3. В /boot/grub/menu.lst найти строчку (закомментированную) "kopt=root=/dev/sdaN ro" и заменить её на "kopt=root=UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ro".
  4. Запустить /sbin/update-grub
  5. Перезагрузиться.

Специальный google

Совсем недавно узнал, что в гугле можно искать какие то OS-специфичные вещи:
  1. http://www.google.com/linux
  2. http://www.google.com/bsd

18 Январь 2008 г.

Настройка аттрибутов модуля XVideo (Xv) в Xorg

После апгрейда на то ли Ubuntu 7.10, то ли Ubuntu 7.04, у меня все видеоролики стали выводится в очень темной гамме. Как удалось выяснить опытным путем, такой эффект давал только вывод через Xv (XVideo).

Недавно нашел решение этой проблемы:

sudo apt-get install xvattr
xvattr
Смотрим минимальные, максимальные и текущие значения аттрибутов XV_BRIGHTNESS, XV_CONTRAST. И меняем на желаемые. В моем случае оказалось, что стоит очень низкая яркость. После установки её в нейтральное положение все начало показываться весьма достойно.

xvattr -a XV_CONTRAST -v 4096
xvattr -a XV_BRIGHTNESS -v 0

22 Ноябрь 2007 г.

Виртуализация для частного хостинга

Недавно, в очередной раз надо было перенести все сайты с одного сервера на другой. Ситуация рядовая. Бывает клиент переезжает в другой датацентр, бывает покупает другой сервер. И даже несмотря на то, что у меня обычно на это уходит не более 3-4 часов, все равно это порядком надоедает и утомляет. Последний раз я решил придумать что нибудь, чтобы облегчить себе труд :)

Подумалось мне, что было бы неплохо переносить образ разделов сервера целиком, без всякой перенастройки. Естественно, при удаленном администрировании, просто взять образ винта и впихнуть на новый сервер - это верный путь к KVM и загрузки с LiveCD. Потому что перед загрузкой и ip надо сменить, да и банально образ может не полезть на винт. Поэтому решил пойти другим путем - запихнуть все что у меня крутится на сервере в какой нибудь виртуализатор.

Выбор пал на Xen. Поставил xen-ядро, поднял dom0 и начал думать, как это все настроить, чтобы и работало, и мне было удобно. Делать одну виртуальную машину, где будет работать всё-всё-всё не хотелось. Причин тому несколько, но основная - нужно было предусмотреть вариант, когда для каждого клиента пользующегося сервером, можно было бы выделить отдельную виртуальную машину с ограниченными ресурсами. Но зачем каждому клиенту настраивать свою почтовую подсистему и сервер баз данных, когда это все можно настроить один раз и для всех?

В итоге, получилось что то такое:

8 Ноябрь 2007 г.

ffmpeg в Debain Etch

Маинтейнеры в Debian как обычно жгут.
Ставим apt-get install ffmpeg и по ffmpeg -formats видим, что поддержки кодеков amr* нет (а они очень нужны, чтобы кодировать видео в формат .3gp).
Собираем из исходников (полученных по apt-get source ffmpeg) дебиановский пакет и опа - по умолчанию кодеки есть.

7 Апрель 2007 г.

Используйте открытые стандарты

Постер от создателей мозиллы:

Так же можно скачать в разных разрешениях для десктопа:

2 Март 2007 г.

Sun бесплатно раздает 2 DVD с OpenSolaris Start Kit

Заходим на http://get.opensolaris.org/. Регистрируемся, заполняем форму и, если верить тому что написано на сайте, через 2-4 недели к вам придут два DVD с OpenSolaris Start Kit, в который входит:

  1. Solaris Express — версия Соляриса, в которой реализованы все самые последние технологии: ZFS, DTrace, Containers, и сотни других уникальных фич.
  2. Live CDs — образы live-cd с дистрами Nexenta OS, BeleniX и SchilliX.
  3. Sun Studio compilers — родные компиляторы от Sun под Solaris SPARC и x86/x64 платформы.
  4. OpenSolaris source code - ну тут все понятно.

20 Февраль 2007 г.

Настройка Nginx для работы с Apache2+Subversion

Есть Apache2+mod_dav_svn. Висит на 127.0.0.1:80.

Есть Nginx с конфигурацией:

....
server {
listen aa.bb.cc.dd:443;
server_name .domain.tld;

ssl on;
ssl_certificate /etc/nginx/ssl-domain.tld.pem;
ssl_certificate_key /etc/nginx/ssl-domain.tld.pem;

location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
....

При выполнении команды svn copy на nginx приходит запрос приблизительно такого вида:

COPY /pathname HTTP/1.1
Host: domain.tld
Destination: https://domain.tld/another_pathname

Когда такой запрос проксируется на apache, то из-за того, что в команде
COPY источник - это URI со схемой http, а destination - URI со схемой https
(как это и указано в заголовке Destination), apache сразу возвращает код
502.

В принципе, поведение apache соответствует RFC2518:

502 (Bad Gateway) - This may occur when the destination is on another server and the destination server refuses to accept the resource.

В результаты, пользоваться в такой конфигурации subversion практически невозможно.

Если сделать вот такой финт, то все работает нормально:

....
set $fixed_destination $http_destination;
if ($http_destination ~* ^https(.*)$)
{
set $fixed_destination http$1;
}

proxy_pass http://127.0.0.1:80;
.....
proxy_set_header Destination $fixed_destination;
....

Будем надеяться, что в следующих версиях nginx это починят.