Всем привет , это сумбурная статья, родилась из попытки улучшить написание сценариев для octave. Написана она потому что на wikibooks учебник не переведен, а подробный перевод каждой из этих тем , занял бы у меня кучу времени.
Также в статье представлено сравнение GUI для Octave и описание установки Octave на телефон n900 Nokia «R.I.P», знаменитый мобильник для гиков аналогов которому так и нет… Андроид не аналог, Убунтофон тоже(плачу и шлю проклятия M$ и лично Элопу)
Как многие заметили весь мир открытого ПО состоит из различных священных войн, за «лучший редактор», за «самую свободную лицензию» , за самый лучший ЯП, ОС и прочее…. Теперь меня волнует вопрос, есть две среды SciLab и GNU Octave , ну про плюсы первого известно много(это, встроенный аналог simulinka и книга пособие на русском языке от издательства AltLinux), но чем же тогда хорош Octave? это вопрос и его задаю всем кто глубоко работал с Octave, пока я для себя нашел один но существенный плюс, octave запускается на моем телефоне.
Table of Contents
Однострочные и многострочные комментарии
Ну здесь коротко, однострочные комментарии это конечно хорошо, но не когда вы создаете стены текста, пояснений или своих рассуждений. Исходная документация.
#Это однострочный комментарий %Это тоже однострочный комментарий #{ Вот тут уже можно развернуться по полной и не ограничивать себя строками!!! #}
И если написать небольшой комметарий к нашей функции или сценария, например так
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 ,больше не поддерживается (дата 15,03,2012) , о его замене GUI-Octave, поговорим дальше.
Gedit
В моей версии 2,30,4 очень слабая поддержка синтаксиса octave (имеются в виду функции), я подозреваю что такая же ситуация и в KDE-шном Kate. Из плюшек возможность создавать горячие клавиши с фрагментами кода, ну и запуск терминала в gedit.
Vim
Ну для телефона это все конечно не подходит , поэтому я попробовал поставить Vim, и оказалось что там очень хорошая поддержка синтаксиса, лучшая пожалуй. Как делать автодополнение для octave я не знаю, но вот подсветку , можно скачать отсюда. Там же описаны строчки которые надо добавить в vimrc.
GUI-Octave
Эта программа будет входить в официальные выпуски 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
Это частичный перевод официального руководства к 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
Нам понадобиться программа для построения графиков 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 ] };
Все перезагружаем телефон и радуемся!
Добавить комментарий