четверг, 11 ноября 2010 г.

Сумма чисел, среднее и стандартное отклонение с помощью awk

Для файла в одну колонку сумма и среднее считается так:
cat data.dat | awk '{sum +=$1} END {print "Сумма=" sum, "Среднее="sum/NR}'
Если нужно посчитать среднее в каждой строке то:
$cat data1.dat
.530 .539 .601 .613 .618
.493 .532 .599 .634 .591
.405 .436 .530 .536 .537
.430 .424 .524 .542 .515
.482 .530 .528 .550 .550
.473 .535 .540 .554 .546
.527 .562 .611 .598 .607
$cat data1.dat | awk '{sum=0; n=0; for (i=1; i<=NF; i++) {sum +=$i; ++n} print sum/n}' 0.5802 0.5698 0.4888 0.487 0.528 0.5296 0.581
Если нужно посчитать среднее и стандартное отклонение в каждом столбце то:
cat data1.dat | awk '{ for (i=1; i<=NF; i++) (sum[i]+= $i) (sumsq[i]+=$i^2)} END {for (i in sum) print sum[i]/NR, sqrt(sumsq[i]/NR-(sum[i]/NR)^2)}'

четверг, 22 апреля 2010 г.

Преобразование Bruker 1r в текстовый файл

Исходные файлы Bruker и fid и 1r двоичные и смотреть их можно только в специальных ЯМР программах. А если надо сделать какой-нибудь специальный анализ, например, деконволюцию участка спектра, то нужно преобразовать (конвертировать) формат bruker в обычный текстовый файл. И затем исследовать его обычными программами (gnuplot, scilab).

В Линукс есть встроенная команда od (octal dump):
od -An -i -v -w4 1r > 1r.txt

Полученный файл содержит только интенсивности сигнала (только значения по Y). Как получить значения X:

В файле proc (в той же дирректории, в которой лежит и 1r) есть параметры $SI и $XDIM. Первый это число точек в 1r. Его можно получить также командой:
cat 1r.txt | wc -l

Как правильно назвать $XDIM я не знаю. Но если разделить $SI на $XDIM то получится ширина спектра в ppm. Соответственно 1/$XDIM это число ppm на одну точку fid.

Теперь значения переменных нужно подставить в команду
cat 1r.txt | awk '{print ($SI-NR)*(1/$XDIM)-$Sdvig,$1}' > 1r.csv

Здесь NR - порядковый номер строки. $SI - NR - задает правильное направление шкалы ppm. $Sdvig - переменная, которая нужна, что-бы правильно расположить спектр относительно стандарта (например, метанола). В моем случае $Sdvig бы равен примерно 1.

Внимание. Направление шкалы в gnuplot (0->10) отличается от направления шкалы в ЯМР программе (10->0).

Или все команды вместе:
od -An -i -v -w4 1r > 1r.txt; SI=$(cat 1r.txt | wc -l); XDIM=$(cat proc | grep XDIM | awk '{print $2}'); cat 1r.txt | awk -v SI=$SI -v XDIM=$XDIM '{print (SI-NR)*(1/XDIM)-1,$1}' > 1r.csv

четверг, 14 января 2010 г.

Восстановление удаленных файлов в Linux ext3

И все таки это случилось.
rm -rf там где этого ни в коем случае не надо делать. Все, данных больше нет, и назад пути тоже нет. Потому что файловая система ext3
In order to ensure that ext3 can safely resume an unlink after a crash, it actually zeros out the block pointers in the inode, whereas ext2 just marks these blocks as unused in the block bitmaps and marks the inode as "deleted" and leaves the block pointers alone.

Чтобы ext3 могла надежно восстановится после сбоя, она обнуляет указатели блоков в инод, в то время как ext2 просто помечает эти блоки как не используемые в индексе блоков, инод как "стертый" и оставляет указатели блоков как есть.

На практике это означает, что разработчики файловой системы ext3 в целях повышения надежности сделали невозможным восстановление стертых файлов. Однако, поскольку ext3 журналируемая файловая система. Когда Вы стираете файл, копия указателя блока записывается в журнал. То есть, найти этот указатель блока все таки можно. Значит можно восстановить данные. Все зависит от скорости с которой вы отключите жесткий диск.
Программу для восстановления данных с ext3 написал Carlo Wood. И она есть в репозитории AltLinux. Установите пакет ext3grep.

Как действовать:
Отмонтировать жесткий диск, на котором была выполнена команда rm и примонтировать его в режиме только "чтение". Важно! Программа восстанавливает данные стертые до последнего отключения диска. То есть шансы восстановить данные резко падают, если вы монтировали диск (перезагружали компьютер) несколько раз.
Данные восстанавливаются по команде:
ext3grep /dev/sdb1 --restore-file home/my-file
Здесь /dev/sdb1 имя жесткого диска, а home/my-file - путь к файлу, который вы хотите восстановить. Обратите внимание, что путь не начинается с /. То есть если вы монтируете диск с корневой файловой системой, то путь к папке /home/ivan/ будет home/ivan/. Восстановленные файлы находятся в папке RESTORED_FILES в текущем каталоге.
При первом вызове программа сканирует жесткий диск и составляет индекс. Это долго. Зато последующие вызовы работают очень быстро. Чтобы восстановить все что возможно:
ext3grep /dev/sdb1 --restore-all

пятница, 8 января 2010 г.

nfs сервер и клиент в Altlinux 5.0

В AltLinux пятой платформы все нужное уже есть. Остались кой-какие настройки и небольшой трюк для автоматического монтирования каталогов на клиентских машинах. (У Вас должны быть права root)
Настройка сервера:
В файле /etc/exports в первом столбце перечисляются экспортируемые каталоги (эти каталоги должны существовать). Во вотором столбце перечислены опции для этих каталогов, а в третьем указано, кто имеет к ним доступ. По умолчанию в exports прописаны два каталога public и share:
/srv/public -ro,insecure,no_subtree_check *
/srv/share -rw,insecure,fsid=0,sec=krb5 *
Параметры: ro - только для чтения, rw - чтение и запись.
insecure не значит "небезопасно". insecure обозначает, что nfs может использовать любой номер порта. При использовании secure, nfs ограничена номерами меньшими 1024.
Параметр no_subtree_check означает, что система не будет каждый раз перепроверять путь к файлу. Важный параметр fsid=0. Он обозначает что данный каталог (в нашем случае /srv/share) будет корневым для всех остальных экспортируемых каталогов. То есть нужно чтобы все остальные каталоги, которые Вы экспортируете, в том числе и public, были внутри этого share. Файл по умолчанию, тем не менее, работает. На всякий случай лучше перепишем файл exports так:
/srv/ -ro,insecure,fsid=0,sec=krb5 *
/srv/home -rw,insecure,no_subtree_check *
/srv/public -ro,insecure,no_subtree_check *
/srv/share -rw,insecure,no_subtree_check *
Здесь мы заодно экспортируем каталог home. В AltLinux 5.0 server домашние каталоги пользователей создаются в папке /srv/home/.
Настройка клиентов:
В файле /etc/fstab для каждого монтируемого каталога добавить строчку вида.
192.168.1.1:/srv/share /file_server nfs
Здесь в начале указывается имя или ip адрес сервера и экспортируемый каталог, затем папка в которую нужно этот каталог монтировать на локальном компьютере. Далее указывается тип файловой системы и за ней опции. Опции могут, например, улучшить быстродействие. Читайте man nfs.
Теперь, все указанные в fstab файловые системы можно примонтировать командой mount -a от лица root. Вообще говоря запись в fstab указывает, что эти системы должны монтироваться при загрузке. На практике этого не происходит и вот почему.
Автоматическое монтирование
Несколько лет назад для загрузки сетевых интерфейсов в linux стал использоваться network manager. При включении компьютера сначала стартует этот network manager и загружает сеть, а уже затем монтируются сетевые файловые системы. Логично. Однако, программа которая монтирует сетевые файловые системы начинает работать, когда network manager уже закончил работу, но сеть еще не успела загрузиться. Получается сбой. И Вам приходится монтировать системы nfs вручную, уже после загрузки компьютера.
Что бы этого не происходило надо добавить в строчку sleep 5 в начало файла (сразу после строчек комментариев в начале файла) /etc/init.d/netfs.
netfs это скрипт, который монтирует сетевые файловые системы, sleep 5 обозначает - ждать пять секунд. Можно попробовать и три секунды :)

четверг, 7 января 2010 г.

Подключение клиента AltLinux 5.0 школьный к серверу LDAP

Свежеустановленный AltLinux 5.0 школьный уже включает (в отличие от ubuntu) все необходимые библиотеки. Ничего устанавливать не надо. Нужно настроить модули nss и pam. В AltLinux настройки ldap для nss и pam разнесены в два файла, nss_ldap.conf и pam_ldap.conf в дирректории /etc:
$su
#cd /etc
Для подключения нового компьютера к серверу LDAP надо в обоих файлах указать:

#имя хоста или ip адрес вашего сервера LDAP:
host 192.168.2.1
#корневую директорию сервера LDAP
base dc=example,dc=organisation,dc=ru
#учетную запись администратора LDAP
rootbinddn cn=admin,dc=example,dc=organisation,dc=ru

При таком способе связи с сервером LDAP необходимо хранить пароль администратора LDAP на локальном компьютере. Пароль хранится в файле /etc/ldap.secret, принадлежит пользователю root и имеет права 600. (Доступен для чтения и записи только пользователю root). Поэтому от лица пользователя root надо выполнить команду.
#echo ваш_пароль > /etc/ldap.secret
#chmod 600 /etc/ldap.secret
Чтобы никто не смог узнать пароль, прочитав файл истории ваших команд, лучше очистить историю команд.
#history -c
Теперь нужно указать системе, что Вы хотите использовать LDAP для аутентификации. В AltLinux возможные сценарии аутентификации уже прописаны в /etc/pam.d/
Переключение между ними осуществляется с помощью команды control (находится в /usr/sbin/)
#control system-auth ldap
Все. Теперь можно проверять.

среда, 6 января 2010 г.

Смена hostname в Alt Linux 5.0

В Alt Linux нет обычного файла /etc/hostname. Есть файл /etc/HOSTNAME, который на самом деле является ссылкой на /proc/sys/kernel/hostname. Чтобы изменить имя хоста нужно редактировать файл /etc/sysconfig/network.