Tuesday 25 December 2007

обработка научных данных в gnuplot

Gnuplot предоставляет широчайшие возможности для обработки и визуализации результатов эксперимента, работа в потоковом режиме позволяет использовать скрипт для создания графиков, что может быть очень удобнопри повторном проведении эксперимета - достаточно просто записать данные в текстовый файл и запустить скрипт.
Пусть мы имеем файл с данными эксперимента, записанными по колонкам:
//file.dat
#x y
0.1 1
0.2 1.4
0.3 1.5
0.4 2.0
0.5 2.5
0.6 2.8
0.7 3.7

скрипт для создания графика будет выглядеть так:
//plot
#!/usr/bin/gnuplot
set term postscript eps enhanced color
f(x) = a*x+b
fit f(x) 'file.dat' using 1:2 via a,b
set output 'graph.ps'
set title 'simple curve'
set xlabel 'x'
set ylabel 'y'
if(b<0) plot 'file.dat' using 1:2 notitle, a*x+b title sprintf("f(x) = %3.4f*x %3.4f",a,b);else
plot 'file.dat' using 1:2 notitle, a*x+b title sprintf("f(x) = %3.4f*x + %3.4f",a,b)

1 строка определяет интерпретатор то есть gnuplot,
2 строка определяет формат выходного файла : postscript расширенный цветной
3 строка определяет функцию которой мы хотим аппроксимировать данные
4 строка делает следующее: аппроксимировать данные из файла 'file.dat' функцией f(x) используя 1 и второй столбцы
по параметрам a и b
5 строка устанавливает выходной файл 'graph.ps'
6 строка устанавливает заголовок листа
7,8 строки устанавливают метки по осям
9,10 строкипроверяют знак b: если b отрицательно, то построить точки данных из файла с использованием 1 и 2 столбцов не используя легенду и построить функцию к которой это приближено используя легенду, формируемую sprintf, если b положительно то делаются то же самое, только в легенде появляется знак "+", дело в том, что
отрицательные числа выводятся со знаком "-" перед ними, а "+" перед положительными числами автоматически не выводится.

sprintf("f(x) = %3.4f*x %3.4f",a,b) подставляет в строку, выделенную кавычками, значения a и b вместо %3.4f, что означат: дробное число, 3 знака до запятой и 4 после, для целых чисел вместо "f" нужно использовать "d".

Также gnuplot позволяет производить простейшие операции с данными, они производятся непосредственно над столбцами, можно применять такие операции как: sqrt(), log(), *.
Для использования этих функций скрипт должен выглядеть следующим образом:


//plot
#!/usr/bin/gnuplot
set term postscript eps enhanced color
f(x) = a*x+b
fit f(x) 'file.dat' using (log($1)):2 via a,b
set output 'graph.ps'
set title 'simple curve'
set xlabel 'x'
set ylabel 'y'
if(b<0) plot 'file.dat' using (log($1)):2 notitle, a*x+b title sprintf("f(x) = %3.4f*x %3.4f",a,b);else
plot 'file.dat' using (log($1)):2 notitle, a*x+b title sprintf("f(x) = %3.4f*x + %3.4f",a,b)

Также можно использовать русские буквы, для этого в начало скрипта нужно вставить set encoding koi8r (utf8 поддерживается с версии 4.3)

Ещё можно получить ошибки для коэффициентов аппроксимации, добавив в скрипт set fit errorvariables, при этом ошибка соответствующая имя_переменной будет доступна в переменной имя_переменной_err .

Полезные материалы по gnuplot
много полезной информации
официальная документация
здесь много примеров(на английском)

Thursday 4 October 2007

кривые зависимости eclipse в debian lenny

При установке eclipse в debian lenny возникли некоторые проблемы: при выполнении команды apt-get install eclipse ставился только пакет eclipse, не подтягивая по зависимостям ни джава-машину, ни, что самое главное sdk, пришлось ему сделать apt-get install sun-java6-bin sun-java6-fonts sun-java6-jre sun-java6-plug
и apt-get install eclipse-gcj для установки sdk.

проблемы с установкой MatLab2007a в debian

Обновлял MatLab, всё как обычно: создал папку /opt/matlab, скопировал туда license.dat, стал запускать sh /media/cdrom/install от рута и получил сообщение о запрете выполнения скриптов, всё решилось очень просто: надо было в /etc/fstab добавить опцию exeс, которая разрешает выполнение файлов на диске.Подобных проблем при установке MatLab2006 не возникало Далее для установки можно использоватодну из команд:
sh /media/cdrom/install
sh /media/cdrom/install -t для текстового режима
Примечание: возможно на некоторых системах для работы графического инсталлятора для получения рутовской консоли нужно использовать команду sux.

хорошая статья по установке MatLab тут.

Sunday 2 September 2007

Настройка GPRS подключения в Linux через bluetooth

Буду писать о граблях, на которые я наступил, настраивая GNU/Linux, начну с настройки bluetooth и gprs:

настройка bluetooth+gprs в GNU/Linux
OS Debian etch 4.0 GNU/Linux kernel 2.6.21
bluetooth dongle Belkin BU-2083
phone Nokia 6021
bluez-utils 3.7-1
Для работы bluetooth в GNU/Linux были использованы драйвера Bluez, поставляемые с ядром.Ставим драйвера apt-get install bluez-utils, также необходимо наличие pppd.
Работоспособность bluetooth можно определить с помощью команды(от рута)
# hciconfig -a
hci0: Type: USB
BD Address: 00:0A:3A:6F:0A:76 ACL MTU: 1017:8 SCO MTU: 64:8
UP RUNNING PSCAN
RX bytes:7844 acl:182 sco:0 events:203 errors:0
TX bytes:3506 acl:161 sco:0 commands:61 errors:0
Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: ACCEPT MASTER
Name: 'malafeev-0'
Class: 0x000100
Service Classes: Unspecified
Device Class: Computer, Uncategorized
HCI Ver: 2.0 (0x3) HCI Rev: 0x2073 LMP Ver: 2.0 (0x3) LMP Subver: 0x4127
Manufacturer: Broadcom Corporation (15)
UP означает, что адаптер работает, если не работает то необходимо исправить файл
/etc/bluetooth/hcid.conf, вот то что у меня(я исправил autoinit,security,class 0x100 это компютер):

#
# HCI daemon configuration file.
#

# HCId options
options {
# Automatically initialize new devices
autoinit yes;

# Security Manager mode
# none - Security manager disabled
# auto - Use local PIN for incoming connections
# user - Always ask user for a PIN
#
security auto;

# Pairing mode
# none - Pairing disabled
# multi - Allow pairing with already paired devices
# once - Pair once and deny successive attempts
pairing multi;

# Default PIN code for incoming connections
passkey "1234";
}

# Default settings for HCI devices
device {
# Local device name
# %d - device id
# %h - host name
name "%h-%d";

# Local device class
class 0x100;

# Default packet type
#pkt_type DH1,DM1,HV1;

# Inquiry and Page scan
iscan enable;
pscan enable;

# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept,master;

# Default link policy
# none - no specific policy
# rswitch - allow role switch
# hold - allow hold mode
# sniff - allow sniff mode
# park - allow park mode
lp rswitch,hold,sniff,park;
}


Перезапускаем сервисы Bluetooth
# /etc/init.d/bluetooth restart
Restarting bluetooth: hcid sdpd rfcomm.

От обычного пользователя даём команду :
$ hcitool scan
Scanning ...
00:16:BC:D6:92:1D Nokia 6021
записываем mac-адрес телефона.
Связь с телефоном можно проверить так:
# l2ping 00:16:BC:D6:92:1D
Ping: 00:16:BC:D6:92:1D from 00:0A:3A:6F:0A:76 (data size 44) ...
0 bytes from 00:16:BC:D6:92:1D id 0 time 31.91ms
0 bytes from 00:16:BC:D6:92:1D id 1 time 9.62ms
0 bytes from 00:16:BC:D6:92:1D id 2 time 8.39ms

Список поддерживаемых профилей bluetooth можно получить с помощью команды:
$ sdptool browse phone_mac, где phone_mac-mac адрес телефона.

При связывании телефон запросит pin, этот-же pin необходимо ввести в компьютер, в старых версиях bluez использовалась утилита pin_helper, путь к которой прописывался в файле /etc/hcid.conf, в новых версиях используется утилита passkey-agent, идём в /usr/share/doc/bluez-utils/examples, распаковываем и собираем утилиту(от рута, понадобится пакет libdbus-1-dev), далее запускаем её
./passkey-agent --default 1234, она будет висеть и передавать в bluez указанный pin.


Далее начлось самое интересное, необходимо связать телефон с /dev/rfcommX , где X-номер порта, у меня X=0, это можно сделать двумя способами:
1) с помощью правки файла /etc/bluetooth/rfcomm.conf(необходимо внести mac-адрес телефона), что я и сделал, затем, выполнил команду
# echo ATZ > /dev/rfcomm0, телефон запросил pin, я ввёл 1234, телефон сказал подключено затем через несколько секунд отключено.
2)с помощью команды rfcomm connect :
rfcomm connect rfcomm0 00:16:BC:D6:92:1D 1
при первом подключении телефон запросит pin(passkey-agent должен быть запущен)

Далее необходима настройка pppd:
1)В файл /etc/ppp/peers/mts записываем
/dev/rfcomm0 57600
connect '/usr/sbin/chat -v -f /etc/ppp/chat/mts'
noauth
defaultroute
lock
debug
novjccomp
nopcomp
noaccomp
nodeflate
novj
nobsdcomp
default-asyncmap
ipcp-accept-local
ipcp-accept-remote
usepeerdns
user mts
nodetach
2) в /etc/ppp/chat/mts записываем
TIMEOUT 5
ECHO ON
ABORT '\nBUSY\r'
ABORT '\nERROR\r'
ABORT '\nNO ANSWER\r'
ABORT '\nNO CARRIER\r'
ABORT '\nNO DIALTONE\r'
ABORT '\nRINGING\r\n\r\nRINGING\r'
'' \rAT
TIMEOUT 12
OK ATH
OK ATE1
OK AT+CGDCONT=1,"IP","internet.mts.ru"
OK ATD*99***1#
CONNECT
3) в файл /etc/ppp/pap-secrets записываем
mts ppp0 "mts"

подключаемся pppd call mts(от рута)

Friday 31 August 2007

первый пост

Ну вот и я создал блог, это мой первый пост, надо начинать учиться)