Всем привет , это сумбурная статья, родилась из попытки улучшить написание сценариев для octave. Написана она потому что на wikibooks учебник не переведен, а подробный перевод каждой из этих тем , занял бы у меня кучу времени.

GUIOctave.png

Также в статье представлено сравнение GUI для Octave и описание установки Octave на телефон n900 Nokia «R.I.P», знаменитый мобильник для гиков аналогов которому так и нет… Андроид не аналог, Убунтофон тоже(плачу и шлю проклятия M$ и лично Элопу)

Как многие заметили весь мир открытого ПО состоит из различных священных войн, за «лучший редактор», за «самую свободную лицензию» , за самый лучший ЯП, ОС и прочее…. Теперь меня волнует вопрос, есть две среды SciLab и GNU Octave , ну про плюсы первого известно много(это, встроенный аналог simulinka и книга пособие на русском языке от издательства AltLinux), но чем же тогда хорош Octave? это вопрос и его задаю всем кто глубоко работал с Octave, пока я для себя нашел один но существенный плюс, octave запускается на моем телефоне.

Однострочные и многострочные комментарии

Ну здесь коротко, однострочные комментарии это конечно хорошо, но не когда вы создаете стены текста, пояснений или своих рассуждений. Исходная документация.

#Это однострочный комментарий
%Это тоже однострочный комментарий
#{
Вот тут уже можно развернуться
по полной и не ограничивать
себя строками!!!
#}

И если написать небольшой комметарий к нашей функции или сценария, например так

function melt(x)
#{
Это функция
предел твоих мечтаний!
это однострочник на Perl,
пользуйся и не думай
#}
   print("Hello word!!");
endfunction

То потом когда вы будете находиться в папке с этим сценарием или функцией, или пути этих папок будут прописаны в файле настроек. Вы можете ввести команду

>>> help rocket_met1
`rocket_met1' is a script from the file /home/valber/bmstu/10s/rocket _met1.m
Это функция 
предел твоих мечтаний!
это однострочник на Perl,
пользуйся и не думай
Additional help for built-in functions and operators is
available in the on-line version of the manual. Use the command
`doc <topic>' to search the manual index.
Help and information about Octave is also available on the WWW
at http://www.octave.org and via the help@octave.org
mailing list

Про doc …. как нибудь в следующий раз.

Различные варианты вывода сообщений

Раньше мой сценарий для octave представлял из себя набор переменных и комментарии к ним и когда приходилось его повторно запускать, надо было вспомнить, как и что и как называется, просмотреть комментарий, проверить единицы измерений и прочее.

#{ А вот тут мы протестируем некоторые формулы которые возможно даны
не с теми коэффициентами#}
U=150 %V
d33=6.7*10^(-12) %Kl/H
p = 5.3*10^3 %kg/m^3
c =5.3*10^3 %m/c
d =2.58/1000 %m
E =1.05*10^11 %Pa
nu_ma=0.8
k_i=4
s=pi*(12/100)^2/4
#printf('Мощность равна')
#printf('Мощность равна')
P=1.2*k_i*(U^2)*(d33^2)*(E^2)*nu_ma*s/(p*c*d*d)

И на экране это выглядит так

>>>U = 150
d33 = 6.7000e-12
p = 5300
c = 5300
d = 0.0025800
E = 1.0500e+11
nu_ma = 0.80000
k_i = 4
s = 0.011310
P = 2.5864
>>>

а теперь попробуем сделать красиво! Простейший способ это вставлять в промежутки сценария строки

A=[1,2;3,4]
'А сейчас мы перемножим матрицы!'
B=A*A
>>>Выглядит это так<<<
>>>A =
1 2
3 4
ans = А сейчас мы перемножим матрицы!
B=
7 10
15 22

Быстро, также можно воспользоваться функцией disp() , которая печатает либо строку ЛИБО переменную, а затем переходит на следующую строку.

A=1;
disp('Переменная A') disp(A)

А теперь краткая справка по printf, это функция пришла к нам из C. Вы пишите строку и вставляете в нее по порядку переменные %s — строки %d — простые числа (%e %g %f ) различные варианты вывода сложных чисел. Далее после того как вы написали строчку, вы в том же порядке что и в строке, указываете переменные входящие в неё. Пример для наглядности, и да заметьте перенос строк автоматически не производится!

ep=[1200,1400]; #диэлектрическая проницаемость
printf("Диэлектрическая проницаемость: %d - %d \n",ep(1),ep(2))
d33=[67,115]/10^12; %пьезомодуль по толщине Кл/Н
printf("пьезомодуль по толщине: %e - %e Кл/Н\n",d33(1),d33(2))
A0=[0.6,1]/10^10; %коэффициент электрических потерь
printf("коэффициент электрических потерь: %e - %e \n", A0(1) ,A0(2))
c=[4.1,5.3]*10^3; %скорость распространения звука в материале м/с
printf("скорость распространения звука в материале %f - %f м/с\n",c(1),c(2))
E=1.05*10^11; %модуль упругости(Юнга) Па
printf("модуль упругости(Юнга) E: %g Па\n",E)
p=[5.3,5.7]*10^3; %плотность кг/м^3
printf("плотность %g - %g кг/м^3\n",p(1),p(2));
tg_sig=[0.01,0.25]; %тангенс угла диэлектрических потерь
printf("тангенс угла диэлектрических потерь: %g - %g \n",tg_sig(1), tg_sig(2))

и то как это выглядит

>>>Диэлектрическая проницаемость: 1200 - 1400
пьезомодуль по толщине: 6.700000e-11 - 1.150000e-10 Кл/Н
коэффициент электрических потерь: 6.000000e-11 - 1.000000e-10
скорость распространения звука в материале 4100.000000 - 5300.000000 м/с
модуль упругости(Юнга) E: 1.05e+11 Па
плотность 5300 - 5700 кг/м^3
тангенс угла диэлектрических потерь: 0.01 - 0.25

Можно ли сделать цветной вывод сообщений в Octave

Маленькое замечание , возможно кто нибудь захочет сделать часть вывода цветным. Пока такая возможность не доступна как и не доступен пока описанная в документации поддержка echo (octave -x).

Почему нельзя делать цветной вывод, максимум что вы можете сделать цветным это приглашение вашего терминала PS1 в файле .octaverc . Возможно (не проверял)также изменить цвет для вывода сообщений об ошибках, как это сделано в qtOctave и использовать в некоторых функциях, вывод, как вывод ошибки, подробнее

Не знаю на сколько это интересно и нужно, просто уточнил у создателей, в рассылке.

Ввод и обработка параметров пользователя

Здесь мы рассмотрим применение простой команды input, есть и более сложные вещи, но это потом.

d=input("Введите диаметр излучающей поверхности в см: ");
%проверка от дураков
if (d<=0)||(d=>10)
    d=12;
endif
printf("Диаметр d=%d см\n",d)

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

dim=input ("Толщина диска мм: ");
if not ((dim>0) && (dim<10))
    dim=2.58;
endif
printf("Толщина диска %g мм\n",dim)

Различные редакторы для Octave

qtOctave

Изначально я пользовался редактором встроенным в qtOctave , он хорош тем что запускает необходимый скрипт по клавише F5 , обладает сносным автодополнением и подсветкой. Из минусов, подсветку в нем непонятно как настраивать и у меня с ней, глаза сломаешь, также маленькие косячки вроде этого

qtoctave.png

Ну и самое обидной qtOctave ,больше не поддерживается (дата 15,03,2012) , о его замене GUI-Octave, поговорим дальше.

Gedit

В моей версии 2,30,4 очень слабая поддержка синтаксиса octave (имеются в виду функции), я подозреваю что такая же ситуация и в KDE-шном Kate. Из плюшек возможность создавать горячие клавиши с фрагментами кода, ну и запуск терминала в gedit.

Vim

Ну для телефона это все конечно не подходит , поэтому я попробовал поставить Vim, и оказалось что там очень хорошая поддержка синтаксиса, лучшая пожалуй. Как делать автодополнение для octave я не знаю, но вот подсветку , можно скачать отсюда. Там же описаны строчки которые надо добавить в vimrc.

GUI-Octave

GUIOctave.png

Эта программа будет входить в официальные выпуски octave, официальная замена, написана на qt4 , но при этом пока не дотягивает до qtOctave. Требует для скачивания и установки mercurial>=1.8, , также вам понадобятся следующие пакеты: octave-headers; libqscintilla2-dev.

Подробнее о PPA на wiki octave

Теперь скачиваем:

hg clone http://www.octave.org/hg/octave
cd octave
./bootstrap && ./configure && make
./run-octave&

Плюсы

  • Командная строка теперь нормально работает и можно перемещаться по ней и история команд тоже работает
  • Есть доступ к документации, теперь и к оффлайновой тоже
  • Есть вроде горячие клавиши и их можно назначить
  • Есть подсветка синтаксиса и она полная
  • Есть подсказки используемых переменных и функций
  • Табличка с переменными также имеется
  • Сворачивание блоков, вроде if ,for, funcion также работает
  • Пошаговая отладка сценариев а также возможность ставить breakpoint-ы
  • Также есть ссылки на Bugrepport и octave forge и проект Agora для обмена кусками кода их обсуждением и прочий социальный кодинг и пока в зачаточном состоянии.

Минусы:

  • Нет загрузки пакетов с octave forge и их выбор, как это сделано в qtOctave
  • И главное, там пока нет ни каких команд которые вы можете выполнить для расчетов через GUI а не набрав команду.

В завершении хочу сказать что на GSoC проект Octave выложил следующие задачи, даже если octave и не войдет в GSoC можно понять, куда движется проект , что ему нужно.

Emacs Octave Support

EmacsOctaveSupport.png

Это частичный перевод официального руководства к Emacs Octave Support чем хорош Emacs … ну не знаю просто надоело переключатся из одного редактора в другой… для Python одно, для Maxima другое, для Octave третье, для wiki синтаксиса ещё что нибудь и у всех свои иногда не настраиваемые горячие клавиши и поведение.

Плюшек вроде комбинаций и того же запуска текста + IDE вещи вроде того что позволяет ECB, а из минусов:

  • Подсветка Emacs не обновляется с 2007 года. Зато она встроена везде даже сейчас когда я пишу статью Emacs рендерит Octave вставки.
  • Ну и нет любимого окна с переменными и историей команд в ECB

Маленькие замечания по использованию Emacs

  • C — зажатая клавиша CTRL
  • M — зажатая клавиша ALT или нажатая один раз ESC
  • LDF — это комбинация C-j

Как набрать C-c i l ? Берем зажимаем CTRL зажимаем с , теперь не отпуская первых двух по очередно жмем i затем l

Комбинации для редактирования кода:

  • C-h m Справка по моду
  • TAB Ззадает отступ для текущей линии в зависимости от предыдущего контекста
  • LFD Разрывает строку в указанном месте и переносит с учетом отступа
  • M-LFD Разрывает строку в указанном месте и вставляет знак переноса строки(набирать как ESC затем C-j)
zk=(-2400+sqrt(2400^2 \ -0.69*(180^2)))/(2*0.69)
  • С-c ; Закомментировать регион.Где регион это область выделения , ну или если визуального выделения нет , то от положения курсора до метки.
  • C-c : Раскомментировать регион, причем он раскомментирует то что было закомментровано в начале строки. Лучше не задумывааться о том что он считает регионом а выделять необходимый код и вводить команду комментирования, раскомментирования и выравнивания форматирования
  • M-C-q Восстанавливает покореженное форматирование (отступы), особенно это полезно после предыдущей функции раскомментирования(octave-indent-defun).
  • C-c C-p Переместиться на строчку назад игнорируя пустые строки и закомментированные строки. С числовым модификатором, перемещается на N строчек
  • C-c C-n Переместиться на строчку вперед игнорируя пустые строки и закомментированные строки. С числовым модификатором, перемещается на N строчек
  • C-c f octave-insert-defun ,эта функция создает шаблон функции, необходимо только ввести сначало имя, потом аргументы и в конце возвращаемое функцией значение.
  • M-; Переносит курсор на некоторое удаление от конца строки, и ставит комментарий

Регион,блок,функция

  • C-c ] Завершить указанны блок, ставит завершающее слово(endif,endfor),для ближайшей открытой конструкции
  • C-c M-C-h Если вы находитесь внутри блока (т.е. конструкции с началом и концом if … endif)
  • С-с С-а Перемещает курсор в начало функции или сценария
  • C-c C-e Перемещает курсор в конец функции , или сценария

Перемещения по тексту

Тут понадобиться некий пример:

for i=1:10 
    disp("Блок1") 
    y=i^2+1; 
    if y=10 
        disp("Подблок 1") 
        for j=1:10 
            disp("Подподблок 1") 
        endfor 
    endif 
    if i=5 
        disp("Подблок 2"); 
    endif 
endfor
  • C-c M-C-n Перейти к концу следующего блока , при этом блок должен находиться на одном уровне.Т.е. если вы поместите курсор на 2 строку нашего примера, и введете команду, то вы перейдете на 9 строчку, опять введите команду и вы перейдете на 13 строку, больше переходов не будет,т.к. это последний блок на данном уровне.
  • C-c M-C-p Перейти в начало следующего блока
  • C-c M-C-d Перейти к началу блока на уровень ниже.Поставьте курсор, после for в первой строке и введите комбинацию (CTRL-c затем , один раз нажать ESC а затем CTRL-d) и вы переместитесь на 4 строку, ещё раз нажав указанную комбинацию вы перейдете на 6 строку
  • C-c M-C-u Перейти к началу блока на уровень выше

Интерпретатор

  • M-x run-octave Открывает окно с интерпретатором octave
  • С-<стрелка вверх/вниз> Если курсор установлен в приглашение для ввода octave> то вы можете перемещаться по истории команд интерпретатора

Краткая справка по многооконности

  • С-x 2 Разбить указанное окно на две части по горизонтали
  • С-x 3 Разбить указанное окно на две части по вертикали
  • С-x 1 Оставить только одно окно
  • C-x 5 2 Создать новое окно с редактором Emacs
  • С-x С-b Просмотреть список буферов
  • С-x b название_буфера Сменить буфер текущего окна на название_буфера
  • С-x o Перейти в другое окно

Эти команды запускаются в редакторе с кодом вашего скрипта.

  • C-c i l Запустить текущую линию в интерпретаторе. С числовым модификатором запускает N линий начиная с этой.
  • C-c i b Запустить текущий блок в интерпретаторе (octave-send-block).
  • C-c i f Отправить функцию/сценарий в интерпретатор (octave-send-defun).
  • C-c i r Отправить в интерпретатор , выделенный регион (octave-send-region).
  • C-c i h Скрыть , открытый в каком-нибудь окне, интерпретатор Octave Inferior Octave (octave-hide-process-buffer).
  • C-c i s Показать интерпретатор , если он был скрыт (octave-show-process-buffer).
  • C-c i k Завершить процесс работы интерпретатора, или (octave-kill-process).

Аббревиатуры и автодополнение

Есть специальный подмод, работы с аббревиатурами octave-abbrev-start, или нажав ` вы включите этот мод, если набрать `? выведет список сокращений, он небольшой, для примера перейдите в пустую строку и нажмите `a затем Enter.

Позже будет статья о том как устроен мой конфиг к редактору Emacs, но уже сейчас можно точно сказать что основные его возможности получены из emacs-for-python , и конечно же не обошлось без поиска и настройки работы автодополнения.

Понадобится файл http://www.emacswiki.org/cgi-bin/wiki/download/ac-octave.el его надо будет поместь в ~/.emacs.d

;; Автоматическая загрузка Emacs Octave Support для .m файлов 
;;(autoload 'octave-mode "octave-mod" nil t)
;;(setq auto-mode-alist
;;      (cons '("\\.m$" . octave-mode) auto-mode-alist))
;;Автодополнение для Octave
(load-file "~/.emacs.d/ac-octave.el")
(require 'ac-octave)
(defun ac-octave-mode-setup ()
  (setq ac-sources '(ac-source-octave)))
;;(add-hook 'octave-mode-hook
;;        '(lambda () (ac-octave-mode-setup)))
;;Автоматическая подгрузка
;;(add-hook 'octave-mode-hook 'ac-octave-mode-setup)
(add-hook 'octave-mode-hook
          (lambda ()
            (ac-octave-mode-setup)
            (auto-complete-mode)))
;;(add-hook 'octave-mode-hook 'auto-complete-mode)

К сожалению … там что-то сломали и автоматический хук на включение автодополнения при включении octave-mode , но вы всегда можете сделать это вручную M-x auto-complete-mode

Установка GNU Octave на телефон Nokia N900

n900octave.png

Нам понадобиться программа для построения графиков gnuplot,octave. В консоли набираем #+begins_src sh root apt-get install gnuplot octave #+end_src

Как потом оказалось для того чтобы запускать ваши сценарии из командной строки octave, необходима программа less которая позволяет пролистывать текстовые файлы. И по воле случая , он почемуто находиться в репозитории Maemo Extras-Devel. Теперь необходимо обновить репозитории и поставить less.

apt-get update
apt-get install less

Советую сразу после установки less отключить этот репозиторий (не знаю на сколько это опасно, но я вас предупредил). Теперь вам необходимо от редактировать файл с клавишами вашей клавиатуры, потому как «^» значка , нет на аппаратной клавиатуре. Подробно об этом.. Итак в файле по адресу /usr/share/X11/xkb/symbols/nokia_vndr/rx-51, не забудьте сохранить старую версию файла , заменил следующую строчку со знаком эвро(он мне не нужен), значок ^ это не capet , а asciicircum.

// 3. row
key <AB01> { [ z, Z,  dollar,  dollar, Cyrillic_ya, Cyrillic_YA, dollar, dollar ] };
key <AB02> { [ x, X,  asciicircum, asciicircum, Cyrillic_che, Cyrillic_CHE, asciicircum, asciicircum ] };

Все перезагружаем телефон и радуемся!