9

Я уже публиковал несколько модификаций для некоторых функций из libc, оптимизированных для быстрой работы на современных процессорах (см. категорию Algorithms and Technologies).

Все эти функции были реализованы в поисковом движке DataparkSearch Engine. Поскольку производительность этих функций, особенно в сравнении со стандартной реализацией на конкретной платформе, зависит от используемых микропроцессора и уровня оптимизации компилятора, я добавил специальную процедуру тестирования на этапе конфигурирования DataparkSearch, выбирающую только те новые варианты функций, которые исполняются быстрее на платформе, где производится установка. Это позволяет получить максимальную производительность DataparkSearch на каждой платформе.
...читать далее "Небольшое ускорение"

Обнаружил, что нижеследующий код корректно исполняется в perl 5.8.5, но некорректно исполняется в perl 5.8.0:


sub StrToNum {
    my ($Str, $Check, $Magic) = @_;
    my $len = length($Str);

    for (my $i = 0; $i < $len; $i++) {
        $Check *= $Magic;
        $Check &= 0xFFFFFFFF;
        $Check += ord(substr($Str, $i, 1));
    }
    return $Check;
}

Решение для perl 5.8.0:


sub StrToNum {
    my ($Str, $pCheck, $pMagic) = @_;
    my $len = length($Str);
    $Check = Math::BigInt->new($pCheck);
    $Magic = Math::BigInt->new($pMagic);

    for (my $i = 0; $i < $len; $i++) {
        $Check *= $Magic;
        $Check &= 0xFFFFFFFF;
        $Check += ord(substr($Str, $i, 1));
    }
    return $Check;
}

Из всех шеллов мне нравится bash. Это дело личных пристрастий. Кому-то нравится ksh, кому-то zsh, кому-то ещё что-то. Не важно. Но bash идёт в составе пэкаджей для Solaris’а и устанавливается по умолчанию. И меня это порадовало. Как говорится одной проблемой меньше.

Теперь пробуем добавить нового пользователя. А то всё время входить root’ом, как-то даже и не привычно. Я знаю два варианта как легко добавить пользователя в Solaris’е. Один через утилиту системного администрирования идущую в составе OpenWindow. Второй – командой useradd. Ни каких «подводных камней» в обоих случаях я не встретил. Кроме этого, советую обратить внимание и на утилиту passmgmt.

И вот всплыла неожиданная вещь. Когда я захожу обычным юзером, то все настройки, в том числе и установка переменной PATH прописываются в ~/.bash_profile. Но если я потом ввожу su и получаю права суперюзера, то значение этой переменной сбрасывается. Что ж, это очень даже логично с точки зрения безопасности. Но немного не удобно. Долго я искал, как сделать так чтоб значение этой переменной при входе через su было таким, каким нужно мне. И man su мне таки помог: /etc/default/su. В этом файле прописываете нужные вам пути в переменную SUPATH и получаете удовольствие.

Следующим камнем преткновения оказалось отсутствие такой приятной командочки из FreeBSD как locate. Пришлось сперва с помощью catman собрать базу для apropos, а уж затемс его помощью, найти аналог locate: whereis и его друга – which.

Далее. Мне нужен любимый текстовый редактор joe. И оказывается он есть на http://www.sunfreeware.com/indexintel10.html. Прекрасно! Выкачиваем его от-туда и ставим. Хм, а как установить пэкадж? Легко! man pkgadd – классический ответ юниксоида. 🙂 Там чётко сказано, что надо сначала его разархивировать, а потом установить с помощью ключика –d. Очень хорошо. Доставляю ещё несколько любимых программ. Кстати, pkginfo очень даже полезная вещь. Особенно в комплекте с grep’ом.

Кстати, Solaris по умолчанию ставит кучу gnu-программ. И устанавливает он их в директорию /usr/sfw/bin.

Теперь надо бы скомпилировать какую-нибудь ба-а-альшую программу.

В одном из указанных выше источниках я прочитал, что идущий в составе Solaris’а gcc несколько странный и мол надо его сразу пересобрать из исходников. Я поддался на уговоры и пересобрал его. По-моему, я зря это делал. Всё же надо было для начала проверить, как отработает «штатный», устанавливаемый при инсталляции. Тем не менее, если вы всё же пересобрали его, то перед установкой свежей версии желательно не забыть удалить (pkgrm) старый вместе со всеми сопутствующими библиотеками.

Переходим непосредственно к компиляции. И вот тут настали первые грабли.

По началу, на небольших программах, всё шло хорошо. Но когда дело дошло до postgres’а, то тут всё и застопорилось. Конфигурационный скрипт ругался, что, мол, у него явно какие-то проблемы с путями к нужным библиотекам. Ну, такое мы проходили, и ldconfig нам поможет. А вот и нет! Не помогло. Нет такой программы. Зато нашлась другая – crle. И после прописывания необходимых путей всё заработало. У меня дефолтовый путь к библиотекам выглядит так: /lib:/usr/lib:/local/lib:
/usr/local/lib:/usr/local/pgsql/lib:/usr/sfw/lib
.

Следующими граблями оказался perl. Собственно, не сам perl, а то, что некоторые системные утилиты заточены под использование штатного perl 5.6.1. А собранный и установленный мной 5.8.7 не содержит кое-каких библиотек специфичных для Solaris’а. И, например, kstat просто отказался работать. Мне пока не удалось переустановить нужные библиотеки под новый perl. Но в этом случае помогает, то, что многие утилиты содержат явную ссылку на запуск интерпретатора perl’а из определённой директории: /usr/perl5/bin. Я просто слинковал в неё нужную версию perl’а и всё заработало. Понятно, что нормальной такую ситуацию назвать нельзя, но пока отложим её до лучших времён.


#!/usr/bin/perl

@nums = (1,4,5,9,10,40,50,90,100,400,500,900,1000,
                      'I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');

$cnt = 1999; $rn = "-> ";

$n = 12;
while($cnt > 0) {
    while($nums[$n] > $cnt) {$n--;}
    while($nums[$n] < = $cnt){
 $rn .= $nums[$n+13];
 $cnt -= $nums[$n];
    };
}
print "\n", $rn, "\n";