Cellar Door

28 июля 2005

Scientific software

Краткий экскурс в область свободного ПО для научных вычислений был вдохновлен прочтением посвященного данной теме цикла А. Зубинского. Я описываю лишь краткие впечатления, вызванные упомянутыми там инструментальными средствами. Сами статьи можно легко найти, введя в форму поиска на странице itc.ua фразу "научные вычисления"...

Nickle
Скриптовый язык Nickle известен в первую очередь как язык быстрого прототипирования научных задач. Вторая область применения вычислительных способностей Nickle состоит в качестве более мощной замены классических UNIX-вычислителей bc, dc и expr. Синтаксис Nickle предельно приближен к таковому у C, а семантика обнаруживает общие черты с функциональными языками программирования, например LISP или ML. В документе, представленном на USENIX, разработчики отмечают, что идеи, впоследствии реализованные в Nickle, были заимствованы из C, C++, Icon, ML, Java, Modula-3, Perl, Python, Scheme, sed, awk, bc, dc, expr. Компактность и мобильность реализации же косвенно указывают на происхождение из академической среды [и почему ине вспоминается Lua?]. Присутствует реализация основных примитивов многопоточного программирования, например реализована работа с семафорами и мьютексами. Среди установленных примеров нашлась библиотека, реализующая алгоритм RSA в менее чем 30 строках кода (размер импортируемого модуля с реализациями некоторых численных алгоритмов - еще около 30 строк). А на сайте был обнаружен и порт референсной ANSI C реализации алгоритма шифрования Rijndael на языке Nickle.
Для меня Nickle оказался более чем интересной разработкой, видимо, способной заставить меня отложить запланированное знакомство с Forth.

Yorick
Yorick - универсальная языковая среда для решения вычислительных задач. Среда предсавляет собой интерпретатор "еще одного" скриптового языка. Yorick содержит весьма обширную библиотеку функций, в т.ч. для обработки данных в распостраненных в научной среде формате HDF и NetCDF, допускает использование сторонних расширений на C и Fortran. Фактически Yorick принадлежит к тому же классу ПО, что и коммерческий Matlab или GNU Octave...
Есть возможность интеграции Yorick с Emacs, и сие таинство не сложнее, чем подключение Slime, описанное мною ранее в заметке о Lisp.
Подсистему визуализирования данных Yorick разработчик характеризует как наипростейшую из возможных реализаций набора из базовых графообразующих функций, способных производить основные графические элементы, которыми изобилуют научные издания. Впрочем системы визуализации научных данных крайне сложны, среди них к классу свободного ПО относится OpenDX, основанная на "освобожденных" IBM исходных текстов системы IBM Data Explorer. Приведу лишь цитату из описания соответствующего порта системы FreeBSD:

Data Explorer can be used to add visualization capabilities to existing applications. It is used by companies and institutions for applications in a large variety of visualization fields including computational fluid dynamics, medical imagery, computational chemistry, and engineering analysis. For example, it is currently
being used to:

* Identify and manage portfolio risk worldwide for a large
multinational banking group.
* Depict oil-flow simulations to improve drilling success-rates and increase reservoir yields.
* Piece together over 5,000 ceiling fragments from a 1,200-year-old temple in Peru.
* Help insurance agents identify opportunities to cross-sell product offerings.
* Visualize developing weather patterns to improve the accuracy of weather forecasts.

Итог краток: в свободных версиях UNIX, по сей день являющейся основной инструментальной ОС в научной среде, достаточно элегантных и полезных разработок, зачастую балансирующих на тонкой грани искусства и ремесла, способных увлечь человека далекого от основных областей их применения и имеющего крайне поверхностное представление о них.
Все упомянутые прогаммные системы присутствуют в коллекции портов FreeBSD, а также в виде прекоммпилированных пакетов на ftp-сервере проекта.
Ссылки: язык Nickle, официальная страница среды Yorick, unofficial home page, а также посвященная ей страница на dmoz.org, сайт проекта OpenDX.

18 июля 2005

FreeBSD 6.0-BETA1

Уже несколько дней как cvsupом обновил верой и правдой служивший мне FreeBSD 5.4 до 6.0-BETA1, произошло это кажется на следующий день после того, как эта ветка утратила статус CURRENT. Положительных впечатлений вобщем-то побольше, чем отрицательных. Из последних главное то, что в связи с переменой версии glib абсолютно все программы, использующие gtk (и первой и второй версии), да и некоторые другие, станут ругаться на локаль при запуске. Большинство из них при этом работоспособности не теряют (в т.ч. GNOME и XFCE), но особо проблемные потребуют либо пересборки (или поиска соответствуего пакета на ftp-сервере FreeBSD), либо запуска в режиме совместимости с помощью порта /usr/ports/misc/localedata. Perl тоже следует пересобрать. Идеальным вариантом конечно был бы глобальный portupgrade... Плюсов было замечено больше. Более быстрая реакция на действия пользователя (может следствие изменения частоты системных часов - кто читал, например, "The Design and Implementation of the FreeBSD Operating System" by Marshall Kirk McKusick, George V. Neville-Neil вспомнит что их есть четыре штуки - hardclock, softclock, statclock, profclock :)), так или иначе "шестерка" собранная с уровнем оптимизации -O визуально быстрее, чем 5.4 с -O2. Очень порадовали изменения в звуковой подсистеме, фактически это лучшее, что могло случится со стареньким emu10k1. Еще радуют включение VESA-патча, работа в режиме чтения с reiserfs и ext2fs, drm-драйвера (в т.ч. для readeon) и PF той же версии, что и в OpenBSD 3.7
Кстати и в 5.4 и 6.0 мною по разу были замечены досадные зависания, на которые можно было ответить только reset'ом.

10 июля 2005

OpenBSD Packet Filter

Сегодня разбирался с пакетным фильтром pf. Краткие впечатления - божественно. ИМХО о таком сочетании простоты, мощи и гибкости остальные open-source файрволы (и, как пишут, многие коммерческие - сам pf нередко приравнивают к продукции небезызвестной CheckPoint) могут только мечтать. Рабочий конфиг (без nat) можно поместить менее чем в 10 строчек, превосходно читабельных кстати. А функции stateful inspection, scrub, ALTQ дают понять, что это творение совсем другого класса, чем iptables, ifpw или ifpilter... Вот результат моих сегодняшних экспериментов, конфиг для DHCP-подключения (без NAT):

ext_if="ppp0"
udp_serv = "{ domain }"
tcp_serv = "{ 6 }"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

#set loginterface $ext_if

scrub in on $ext_if all fragment reassemble no-df min-ttl 20 max-mss 1440
scrub on $ext_if all reassemble tcp
scrub out on $ext_if all random-id no-df

# silently drop TCP non-SYN packets, the remaining ruleset only deals with
# TCP SYNs, which always create state when passed. the ruleset basically
# deals with 'connections', not packets, beyond this point.
#
block out quick proto tcp all flags /S
block in quick proto tcp all flags /S
block out quick proto tcp all flags A/A
block in quick proto tcp all flags A/A
#
# Some anti-fingerprinting techniques
#
block in quick proto tcp all flags SF/SFRA
block in quick proto tcp all flags SFUP/SFRAU
block in quick proto tcp all flags FPU/SFRAUP
block in quick proto tcp all flags F/SFRA
block in quick proto tcp all flags U/SFRAU
block in quick proto tcp all flags P/P

# block and log everything by default
#
block in log all
block out all

# block anything coming from source we have no back routes for
#
block in log from no-route to any

# block and log outgoing packets that don't have my address as source, they are
# either spoofed or something is misconfigured (NAT disabled, for instance),
#
block out log quick on $ext_if inet from !($ext_if) to any

# silently drop broadcasts (cable modem noise)
#
block in log quick on $ext_if from any to 255.255.255.255

# RFC 1918 - block private networks
#
block in log quick on $ext_if inet from $priv_nets to any
block out log quick on $ext_if inet from ($ext_if) to $priv_nets

pass quick on lo0 all keep state

# ICMP
#
pass out on $ext_if inet proto icmp from ($ext_if) to any icmp-type 8 code 0 keep state
#pass in on $ext_if inet proto icmp from any to ($ext_if) icmp-type 8 code 0 keep state

# UDP
#
pass out on $ext_if inet proto udp from ($ext_if) to any keep state
#pass in on $ext_if inet proto udp from any to ($ext_if) port $udp_serv keep state

# TCP
#
pass out on $ext_if inet proto tcp from ($ext_if) to any modulate state flags S/SA
#pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_serv synproxy state flags S/SA

Историческая справка: pf был написан в течении лета-осени 2001 года Daniel Hartmeier и сообществом разработчиков OpenBSD, к чему их вынудили проблемы с лицензированием кода ipfilter, а сейчас он доступен пользователям OpenBSD, FreeBSD, NetBSD и DragonFly.
Вот два лучших ресурса по теме:
http://www.benzedrine.cx/pf.html
https://www.solarflux.org/pf/
А русскоязычная документация например здесь: часть 1, часть 2.