Saturday, November 5, 2011

Arch Linux: 2 месяца, полет нормальный

Почти два месяца прошло с тех пор, как я принял волевое решение перейти с FreeBSD на Arch Linux (пока только на десктопе). Можно подвести первые итоги и сравнить эти две ОС.


  1. Приложения



    В конечном счете пользователя любой ОС интересует не сама ОС, а приложения, которые можно на ней запускать. В Arch Linux нужные мне приложения установить и использовать оказалось гораздо проще. Асroread, flashplugin, skype, truecrypt - список можно продолжать дальше. Под FreeBSD эти приложения не портированы (и вряд ли когда-либо будут).

    Единственный плюс фряхи для разработчика imho - огромное количество Perl/Python модулей в портах, что упрощает их установку и обновление.




  2. Обновление системы



    За это время я успел 3-4 раза полностью обновить систему с помощью pacman -Syu, влючая обновление kernel с 2.6 до 3.0, а затем до 3.1. Все обновления прошли быстро и беспроблемно. Менеджер пакетов сохраняет все сообщения в лог-файл, etc. В общем, тут огромный прорыв по сравнению с FreeBSD.

    Кроме того я окончательно убедился, что сборка софта из исходников на десктопе - это нонсенс. Смысл часами компилить то, что через неделю-две придется обновлять? Одновременно исчезает целый класс проблем, когда прилага просто тупо не компилируется.



  3. Удобства



    Какое-то время назад я искал тулзу, которая бы в FreeBSD позволяла использовать профили сетевых настроек. Например, для беспроводной сети X использовать статический адрес, для Y - DHCP и т.д. Т.е. чтобы можно было включить лаптоп и автоматически применить нужные сетевые настройки. Под FreeBSD я на тот момент ничего подходящего не нашел, а вот в арче обнаружил netcfg.



Вывод: для меня очевидно, что в качестве десктопа Arch Linux удобнее и проще, чем FreeBSD. Осталось только разобраться в системе хотя бы до того уровня, как я успел разобраться в FreeBSD :)

Wednesday, September 14, 2011

Как найти путь к Perl-модулю по имени

Одно из основных преимуществ Perl перед тем же Python - наличие 100500 качественных модулей на CPAN, готовых к включению в любой проект.

Естественно, иногда бывает необходимо посмотреть код модуля. А для этого потребуется путь к нему в файловой системе. Рассмотрим несколько подходов к этой проблеме.

  • %INC, @INC

  • Самый простой способ - спросить у Perl :) Пути к модулям, подгруженным с помощью do, require и use можно найти в хэше %INC. Ключами хэша являются имена модулей, преобразованные в относительный путь, а значениями соответственно полные пути к модулям. Например, чтобы вывести путь к модулю Encode можно использовать следующий one-liner:
    $ perl -E 'use Encode; say $INC{"Encode.pm"}'


    Если модуль по каким-то причинам не компилируется, в %INC он не заносится. Поэтому, более универсальным решением будет использовать @INC, проверяя наличие модуля в каждой папке. Для удобства можно написать функцию bash:
    get_path() {
    path="${1//:://}.pm"
    location=""
    for dir in $(perl -e 'print "@INC"'); do
    if [ -r "$dir/$path" ]; then
    location="$dir/$path"
    break
    fi
    done
    echo $location
    }

  • perldoc


  • Во многих случаях для нахождения пути к модулю или бинарнику можно использовать perldoc -l Modname или perldoc -lm Modname

    • perldoc -l ищет не только в @INC, но и в $PATH. Если в файле нет POD-документации, путь не выводится.


    • perldoc -lm ищет только в @INC, но выводит путь даже если в файле нет POD-документации.



  • module_info

  • Также можно использовать тулзу module_info, которая идет с модулем Module::Info:

    $ module_info CGI::FormBuilder

    Name: CGI::FormBuilder
    Version: 3.0501
    Directory: /usr/local/lib/perl5/site_perl/5.14.1
    File: /usr/local/lib/perl5/site_perl/5.14.1/CGI/FormBuilder.pm
    Core module: no

Wednesday, September 7, 2011

Заметки по установке Arch Linux

Начнем знакомство с Arch Linux. И начнем его, конечно, с установки :)
Надо сказать, что Arch Linux имеет отличную wiki. Здесь очень подробно и доступно описаны установка системы, Xorg и т.д. - просто пользуемся поиском. Ну и несколько советов от меня:

  • Для установки удобно использовать флэшку, на которую записан netinstall-образ. Записать образ можно простой командой dd if=archlinux.iso of=/dev/sd[x].

  • При использовании в процессе установки беспроводного соединения потребуется сконфигурить его вручную (что также документировано). Для простоты можно использовать сетевой кабель и DHCP.

  • На этапе установки лучше выбирать минимум пакетов, групп base и base-devel достаточно. (Иначе тупо качаться долго будет).

  • Хорошим способом документирования своих действий будет сохранение всех изменений конфигов в системе контроля версий. (Кое-какие идеи по этому поводу можно почерпнуть здесь).

  • Многие полезные приложения, модули Perl, etc. содержатся в пользовательском репозитории (AUR). Для работы с ним желательно установить какой-нибудь из менеджеров. Лично мне приглянулся yaourt, т.к. он прозрачно интегрируется с родным pacman и довольно удобен.

Tuesday, August 23, 2011

Хранение конфигов unix-систем в VCS (или git sucks)

Как известно, большинство конфигурационных файлов в Unix-системах - это простые текстовые файлы. Они идеально подходят для хранения в системах контроля версий. Большинство статей по этой теме, которые мне встречались, советуют использовать git. Но по-моему, subversion (централизованная система) для этого подходит лучше.

Как это делаю я (заодно сравним subversion и git):

  1. Все конфиги хранятся в одном репозитории. Это упрощает изменение конфигов для нескольких хостов одновременно, в одном коммите. Соответственно, на каждой машине нужен чекаут определенной части репозитория (e.g. папки, в которой хранятся конфиги для данного хоста).



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




  2. Каждая машина работает только со своими конфигами, т.е. с нее нельзя получить доступ к конфигам других машин.



    Subversion дает возможность контроля доступа к отдельным частям репозитория на стороне сервера (apache+mod_authz_svn). Тут я пожалуй сделаю такую оговорку: следует избегать копирования файлов внутри репозитория при одновременном ограничении доступа к частям репозитория. Например, если некий конфигурационный файл был скопирован из другого хоста (i.e. папки), и у пользователя нет прав на просмотр этой папки, тот же svn log будет работать некорректно. Выход - в использовании svn add вместо svn copy. В остальном схема хорошо себя зарекомендовала. Git, естественно, контроля доступа не поддерживает.




  3. Есть набор "глобальных" файлов, общих для всех хостов (например, настройки vim или screen).



    Subversion поддерживает механизм externals, который идеально подходит для этой цели. В git такой функции нет.



Sunday, August 14, 2011

Почему FreeBSD - не лучший выбор для десктопа

FreeBSD плавно уходит с моего десктопа, уступая место Arch Linux.
Ниже кратко о недостатках FreeBSD, которые, на мой взгляд, серьезно ограничивают ее применение в качестве десктопа (особенно для новичков).

  1. Убогий инсталлятор, хуже наверно только в OpenBSD.

  2. Графический интерфейс не устанавливается автоматически.

  3. Древняя и тормознутая файловая система по умолчанию (UFS2), которая очень не любит внезапных отключений питания.

  4. Отсутствие сборок под FreeBSD таких приложений как Skype, Flash Player, Acrobat Reader и т.д. Конечно, их можно запустить в режиме эмуляции Linux, но логичнее запускать их изначально под Linux.

  5. Явно недостаточная поддержка оборудования. Я не говорю про какую-то экзотику. Довольно расспространенные звуковые и сетевые карточки могут не поддерживаться.

  6. Отсутствие в базовой системе средств для обновления пакетов. Есть сторонние проги, опять же со своими недостатками (portupgrade, portmaster).

  7. Порты как основной способ установки софта. Установить массивное приложение из портов (KDE, java, openoffice) можно лишь обладая значительным запасом времени (порядка нескольких часов, а на не очень современных машинах и суток).

  8. Отсутствие поддержки кодировки utf-8 в консоли, только однобайтные кодировки. Ну, тут без комментариев.

  9. Низкая популярность системы, соответственно сложнее получить ответы на свои вопросы в интернете.


В принципе, все вышеперечисленное не мешает FreeBSD оставаться неплохой серверной ОС. В руках того, кто знает систему, она может показать производительность даже лучшую, чем иной Linux из коробки.

Tuesday, July 12, 2011

FreeBSD: как разрешить непривилегированным пользователям биндить порты ниже 1024?

в FreeBSD, как и в других UNIX-подобных ОС, только root может запускать процессы, которые слушают TCP/UDP порты с номером < 1024. Сделано это в целях безопасности.

Снять данное ограничение можно установкой двух параметров sysctl:

  • net.inet.ip.portrange.reservedlow

  • net.inet.ip.portrange.reservedhigh



Эти параметры задают диапазон привилегированных портов, которые может открыть только root. К примеру, если установить верхнюю границу в 79, обычный пользователь сможет запустить веб-сервер.

Sunday, June 26, 2011

The Pragmatic Programmer

На днях дочитал "The Pragmatic Programmer", в оригинале. Отличная книга, заслуженное второе место в рейтинге SO.

В конце книги имеется отрывная карта, в которой собрано 70 советов. Ниже 10 из них (перевод мой):

(2) Думай! о том, что делаешь в процессе работы
Выключай автопилот и бери управление. Постоянно относись критически к тому, что делаешь.


(4) Не живи с разбитыми окнами
Исправляй недостатки дизайна, неверные решения и плохой код как только видишь их.


(8) Регулярно инвестируй в свой портфель знаний
Сделай обучение привычкой.


(11) DRY - Don't Repeat Yourself
Каждая часть знания должна иметь единственное, однозначное, авторитетное представление в пределах системы.


(16) Используй прототипы для обучения
Прототипирование - изучающий навык. Его значение - не в коде, который ты создаешь, а в тех уроках, которые ты получаешь.


(23) Используй системы контроля версий
Система контроля версий - это машина времени для твоей работы: ты можешь вернуться назад.


(42) Отделяй представления от моделей
Повышай гибкость с минимумом усилий, проектируя приложение в терминах моделей и представлений.


(49) Тестируй свой код, или это сделают пользователи
Тестируй безжалостно. Не заставляй пользователей искать баги за тебя.


(61) Не используй ручные процедуры
Shell-скрипт или пакетный файл всегда выполнит одни и те же инструкции, в том же порядке.


(66) Находи баги один раз
Каждый баг должен обнаруживаться вручную лишь один раз. Впоследствии он должен проверяться автоматическими тестами.

Friday, May 6, 2011

Perl: как определить, содержится ли определенный элемент в массиве


  1. В Perl версии 5.10 и выше можно использовать оператор ~~ (smart match):
    use 5.010;

    if ( $item ~~ @array ) {
    print "The array contains $itemn";
    }

    Этот оператор обходит массив в поиске нужного элемента и останавливается, как только будет найден первый элемент. (Этим он выгодно отличается от grep).

    Стоит отметить, что оператор ~~ работает "рекурсивно", т.е.
    if ($scalar ~~ @array) { ... }

    эквивалентно
    if ($scalar ~~ $array[0] or $scalar ~~ $array[1] ...) { ... }


  2. Если версия Perl < 5.10, либо поиск по массиву требуется проводить более одного раза, оптимальным способом будет преобразовать массив в хэш и использовать поиск по хэшу:
    my @array = qw(item1 item2 item3);
    my %hash = map { $_ => 1 } @array;

    if ($hash{$item}) {
    print "The array contains $itemn";
    }


  3. Для однократных тестов также подходит функция first из стандартного модуля List::Util. Как и оператор ~~, она возвращает первый найденный элемент. Но в Perl 5.10 и выше все же лучше использовать ~~, т.к. он гораздо быстрее за счет отсутствия накладных расходов на вызов функции.


  4. Если массив относительно небольшой, и ~~ не поддерживается, то можно просто использовать grep в скалярном контексте. В этом случае возвращается число найденных элементов:

    if (my $found = grep $_ eq $item, @array) {
    print "The array contains $itemn";
    }



  5. Для небольших целых чисел можно также использовать индексированный массив:
    my @numbers = (2, 3, 5, 7, 11);
    my @is_contained;
    @is_contained[@numbers] = (1) x @numbers;

    if ($is_contained[$item]) {
    print "The array contains $item";
    }

Thursday, April 14, 2011

Perl: особенности looks_like_number

Для того, чтобы определить, является ли выражение валидным числом, в Perl, как правило, используется функция looks_like_number из модуля Scalar::Util.
looks_like_number EXPR
Returns true if perl thinks EXPR is a number. See looks_like_number in perlapi.


Полезно знать, что по мнению Perl числами являются такие строки:
"1."
".1"
"+1"
"01"
"1,1" (если включена соответствующая локаль)
"n1"
"1n"
"n1n"
"Inf"
"Infinity"
"NaN"
"0 but true"


Операции с этими "числами" не вызывают предупреждений компилятора:
perl -Mwarnings -E 'say "0 but true" + 1'
1
Для сравнения:
perl -Mwarnings -E 'say "0 but foo" + 1'
Argument "0 but foo" isn't numeric in addition (+) at -e line 1.
1

Sunday, April 3, 2011

Инструменты для тестирования веб-сервисов


  • soapUI
    Графическая тулза, основанная на Java, с обширным функционалом.

  • wsdlpull
    Консольная утилита для вызова веб-сервисов, используя WSDL. Умеет логгировать SOAP запросы/ответы. Пример:
    $ wsdlpull http://nbrb.by/Services/ExRates.asmx?WSDL 
    LastDailyExRatesDate
    LastDailyExRatesDateResult:2011-04-04T00:00:00


Tuesday, March 15, 2011

pf: no IP address found for wlan0

Недавно заметил, что при загрузке ноута стала проскакивать ошибка
no IP address found for wlan0
/etc/pf.conf:18 could not parse host specification

Незадолго до этого интерфейс был настроен на использование DHCP. Оказывается, pf норовит стартануть раньше, чем DHCP-клиент. Поэтому, если в правилах фаервола в качестве адресов используются имена интерфейсов, pf обламывается.

Решение простое - надо указывать имена интерфейсов в круглых скобках. В этом случае правила будут обновляться автоматически при измененииях адреса. Пример:
rdr on wlan0 proto tcp from any to (wlan0) port 81 -> (wlan0) port 80

P.S. pf рулит.

Wednesday, February 2, 2011

Замыкания и предопределенные переменные Perl

Замыкание в Perl - это функция (процедура), которая ссылается на одну или более лексические переменные, объявленные вне функции. Такая функция "запоминает" окружение, в котором она была создана.

Довольно распространенная ошибка при создании замыканий - использование в теле функции специальных переменных Perl ($_, $@, $1, etc). Все эти переменные являются глобальными, соответственно создать замыкание с их использованием невозможно.

Пример:
my @a = map sub { print "$_n" }, 1..3;
$_->() for @a;

CODE(0x284769ec)
CODE(0x284769ec)
CODE(0x284769ec)


Кстати, еще одно интересное наблюдение. При создании анонимных функций в цикле, ссылка на функцию, не являющуюся замыканием, имеет постоянный адрес. Ссылка же на замыкание будет все время разная для каждого "экземпляра" замыкания:
my @a = map { my $x = $_; sub { $x } } 1..3;
print "$_n" for @a;

CODE(0x284768d4)
CODE(0x28428a14)
CODE(0x28428bf4)

Sunday, January 16, 2011

FreeBSD: выбор версии исходного кода

При установке/обновлении системы из исходного кода, встает вопрос выбора версии: отслеживать какую то ветку или тупо обновиться до определенного релиза.

Собственно, ниже варианты выбора:

  • Ветка CURRENT. Самые свежие исходники, в процессе разработки. Может включать экспериментальные фичи и вообще не собираться. Для обычного пользователя интереса не представляет.
    Эта ветка имеет cvsup тэг ".", или "HEAD".

  • Ветка STABLE. Эта ветка является "стабильной" только по сравнению с CURRENT. Сюда попадают изменения, протестированные в CURRENT. Вполне подходит для десктопов, т.к. достаточно стабильна и включает новые фичи.

    Поскольку ветка отслеживает код для некой основной версии, cvsup тэг для нее имеет вид RELENG_8.


  • Security-ветка. Эта ветка является стабильной. Код в ней не меняется с момента создания, за исключением обновлений, связанных с безопасностью и критическими багами. Для отслеживания security-ветки после установки системы можно использовать конфигурационный файл /usr/share/examples/cvsup/standard-supfile.

    cvsup тэг для данной ветки имеет вид RELENG_8_1.

  • Release. Релиз - это просто снимок дерева исходного кода в определённый момент времени, которому присваивается конкретное имя (тэг), например RELENG_8_1_0_RELEASE. IMHO, на практике используются только в установочных дисках.

Saturday, January 1, 2011

Защитное вождение

Недавно наткнулся в сети на серию статей о защитном вождении: 70 Rules of Defensive Driving (перевод)

Несколько полезных, на мой взгляд, советов из "70 правил":

Правило 1: Будь внимателен
"Я его не видел!" - это одно из самых популярных оправданий после столкновения. Был ли другой автомобиль невидим? В сущности, все аварии - результат невнимательности одного или обоих водителей. Невнимательность может быть вызвана сонливостью, усталостью, разговором, "гипнозом автострады" и т. п.


Правило 2: Никому не доверяй
Сидя за рулем, смотри за тем, другим парнем, в оба, и оставляй для себя достаточно места. Предугадывай его ошибки и будь готов к ним.


Правило 3: Уступи дорогу
Сомневаешься, кто имеет право проезда - уступи дорогу. Когда речь идет о безопасности, важен не принцип, а результат.



Правило 6: Пристегивайся

Правило 12: Смотри вдаль
Многие водители смотрят всего-то на 5..8 секунд вперед, хотя должно быть 15..20, а-то и дальше. Это дает время на распознавание потенциальной угрозы, пока она не стала реальной проблемой.


Правило 15: Будь предсказуем
Очень важно быть предсказуемым на дороге. Сюрпризы здесь - опасны.


Правило 17: Помни о "мертвых" зонах

Правило 20: Будь осторожен на перекрестках
Перекрестки опасны. По статистике, более 80% городских аварий, приведших к травмам или летальным исходам, произошли именно на регулируемых перекрестках.


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