Как использовать Riak в качестве БД для веб-приложений на пример в вебфреймворке Nitrogen.
SlideBlast
SlideBlast
.js
-файл. Доступно строготипизированное браузерное DOM API с поддержкой автодополнения, все зависимости разрешаются при компиляции..swf
-файл. haXe совместим с версиями Flash Players с 6ой по 10ую, либо со "старым" Flash 8 API, либо с современным AS3/Flash9+ API. haXe позволяет увеличить производительность и использовать нестандартные особенности языка при разработке Flash содержимого.mod_neko
для Apache), так и для command-line или desktop приложений, поскольку NekoVM может быть встроена (embedded) и дополнена сторонними DLL..php
-файл. Это позволяем использовать строготипизированный высокоуровневый язык, каким является haXe, сохранив полную совместимость с существующей серверной платформой и библиотеками.Date
, Xml
, Math
...), с одинаковым поведением на любой из целевых платформerl -man erlang_mode
. Документация достаточно подробная и содержит описания всех основных команд.Erlang
, а наиболее часто используемые могут быть выполнены используя сочетания клавиш, описанные ниже.erlang-start
, например, вот так:(add-to-list 'load-path ".....") (require 'erlang-start) (add-to-list 'auto-mode-alist '("\\.erl?$" . erlang-mode)) (add-to-list 'auto-mode-alist '("\\.hrl?$" . erlang-mode)) (setq erlang-root-dir "/opt/local/lib/erlang") (add-to-list 'exec-path "/opt/local/lib/erlang/bin") (setq erlang-man-root-dir "/opt/local/lib/erlang/man")
erlang-root-dir
и erlang-man-root-dir
задают корневого каталога, содержащего дистрибутив Erlang, а также каталога, содержащего документацию по Erlang.erlang-mode-hook
для установки различных параметров, например, вот так:(defun my-erlang-mode-hook () ;; when starting an Erlang shell in Emacs, default in the node name (setq inferior-erlang-machine-options '("-sname" "emacs")) ;; add Erlang functions to an imenu menu (imenu-add-to-menubar "imenu") ;; customize keys (local-set-key [return] 'newline-and-indent) ) ;; Some Erlang customizations (add-hook 'erlang-mode-hook 'my-erlang-mode-hook)
erlang-generate-new-clause
(она привязана к C-c C-j
) для вставки нового выражения в текущей точке — эта команда берет название функции из предыдущего выражения, и генерирует новое выражение, оставляя курсор в точке вставки параметров функции. В том случае, если параметры нового выражения почти совпадают с параметрами предыдущего, то вы можете воспользоваться командой erlang-clone-arguments
(C-c C-y
) для копирования параметров из предыдущего выражения и вставки их в текущее выражение.,
', ';
', '<
' и '>
' могут вести себя по разному. Так, если вы находитесь в конце выражения и нажимаете ;
, то автоматически будет вставлен шаблон для нового выражения, так как будто вы воспользовались командой erlang-generate-new-clause
. Аналогичным образом, ввод ,
в конце подвыражения, приведет к переходу на новую строку и выставлению правильного отступа.erlang-align-arrows
(C-c C-a
), которая выполняет выравнивание в выделенном регионе текста стрелок (->
) после выражений, что улучшает восприятие исходного кода за счет явного выделения границ выражений.erlang-mark-clause
(M-h
или C-c M-h
) для выделения выражения, или erlang-mark-function
(M-C-h
) для выделения функции целиком.comment-region
(C-c C-c
), которая вставит по одному знаку комментария (%
) в начало каждой строки региона. В том случае, если вы хотите удалить комментарий с региона, то вы можете воспользоваться командой erlang-uncomment-region
(C-c C-u
). Вы также можете воспользоваться командой comment-dwim
(M-;
) для того, чтобы закомментировать выделенный регион, или вставить однострочный комментарий в конце существующей строки.erlang-fill-paragraph
(M-q
) которая пытается правильно отформатировать текущий параграф комментария, что также позволяет улучшить читаемость исходного кода.TAB
вы вызовите команду erlang-indent-command
которая сделает правильный отступ для текущей строки. А для выделенного региона вы можете использовать стандартную командуindent-region
(M-C-\
). Существуют также отдельные команды для расстановки отступов в текущем выражении — erlang-indent-clause
, функции — erlang-indent-function
(C-c C-q
) и всем буфере — erlang-indent-current-buffer
.erlang-beginning-of-function
(C-a M-a
) иerlang-end-of-function
(C-a M-e
) перемещают курсор в начало и конец текущей функции Erlang2, а команды erlang-beginning-of-clause
(M-C-a
) и erlang-end-of-clause
(M-C-e
) выполняют перемещение курсора в начало или конец текущего выражения.TAGS
, который может быть сгенерирован либо с помощью утилиты etags
из поставки Emacs, либо с помощью модуля tags
из поставки Erlang.TAGS
вы можете использовать стандартные команды работы с тегами — find-tag
(M-.
), tags-apropos
, tags-search
(C-x t s
) и другие. erlang-mode добавляет следующие команды —erlang-find-tag
, которая является аналогом find-tag
, но позволяет указывать модуль, в котором необходимо производить поиск (если тег задан в форме module:
или module:tag
), erlang-find-next-tag
(M-+
), которая ищет следующий тег, и две команды erlang-find-tag-other-frame
(C-x 5 .
) и erlang-find-tag-other-window
(C-x 4 .
), которые открывают определение тега в новом фрейме или окне, соответственно.erlang-complete-tag
(M-TAB
) для дополнения имен известных функций, используя данные из файла TAGS
.Skeletons
меню Erlang
или используя команду tempo-template-erlang-XXX
, где XXX
— название шаблона. Для вставки шаблонов используется пакет tempoвходящий в состав Emacs. В настоящее время пакет предоставляет следующие классы шаблонов:if
, case
, receive
и т.д.;gen_server
,application
, gen_fsm
и т.д.erl
erl
запущенный в буфере Emacs (процесс запускается через comint
, так что пользователь может использовать стандартные возможности этого пакета, например перемещения по истории команд с помощью клавиш M-p
и M-n
). Этот же процесс используется erlang-mode для выполнения компиляции исходного кода.erl
пользователь может воспользоваться командой erlang-shell
, но он также может быть запущен неявно при выполнении команды компиляции или переключения в буфер*erlang*
с помощью команды erlang-shell-display
(C-c C-z
).erlang-compile
(C-c C-k
). В том случае если пользователь передаст этой команде префиксный аргумент, то компиляция будет осуществлена с использованием отладочных опций debug_info
и export_all
. Для просмотра результатов компиляции пользователь может воспользоваться командой erlang-compile-display
(C-c C-l
). Для перемещения между найденными ошибками используется команда erlang-next-error
(C-x `
). В том случае, если вы хотите заново переместиться на первую найденную ошибку, то вам необходимо передать префиксный аргумент этой команде, например, вот так — C-u C-x `
.edoc
;(add-to-list 'load-path "~/emacs/distel/elisp") (require 'distel) (distel-setup)
;; A number of the erlang-extended-mode key bindings are useful in the shell too (defconst distel-shell-keys '(("\C-\M-i" erl-complete) ("\M-?" erl-complete) ("\M-." erl-find-source-under-point) ("\M-," erl-find-source-unwind) ("\M-*" erl-find-source-unwind) ) "Additional keys to bind when in Erlang shell.") (add-hook 'erlang-shell-mode-hook (lambda () ;; add some Distel bindings to the Erlang shell (dolist (spec distel-shell-keys) (define-key erlang-shell-mode-map (car spec) (cadr spec)))))
erl-choose-nodename
(C-c C-d n
). А проверить доступность конкретного узла можно с помощью команды erl-ping
(C-c C-d g
), которая запросит у вас имя узла, и в случае его доступности загрузит на него модули, необходимые для реализации команд distel. Имя текущего узла всего отображается в строке статуса.Distel
меню Erlang
.erl-complete
(M-TAB
и M-?
). В том случае, если набираемая часть имени соответствует нескольким именам, то будет показан буфер со всеми возможными вариантами, в котором вы можете выбрать нужное вам.TAGS
, поскольку distel позволяет найти определение функции используя информацию от среды выполнения. Для перехода к определению нужной функции вы можете использовать команду erl-find-source-under-point
(M-.
) — по умолчанию, эта команда в качестве имени функции берет то имя, которое находится под курсором. Но вы можете изменить это поведение, если передадите префиксный аргумент (C-u
), или если переменная distel-tags-compliant
имеет не-nil
значение — в этом случае, у вас запросят имя функции, определение которой вы хотите найти. Чтобы вернуться назад, к точке вызова, вы можете использовать команду erl-find-source-unwind
(M-,
или M-*
).erl-refactor-subfunction
(C-c C-d f
) пользователь может выделить часть кода (пользователю необходимо выделить нужный блок с помощью стандартных команд) функции в отдельную функцию. При выполнении данной команды, у пользователя будет запрошено название новой функции, будет определен список переменных, используемых в данной функции, и выделенная часть кода будет заменена на вызов новой функции. Сама новая функция будет помещена в буфер обмена, откуда она может быть вставлена с помощью команды yank
(C-y
). Пример использования данной функции вы можете найти в документацииdistel.otp_doc
, который выполняет анализ файлов, и генерирует набор пар "сигнатура функции/ссылка на документацию". С помощью команды erl-find-sig
пользователь может получить список сигнатур функций, соответствующих заданному выражению, а затем может воспользоваться командой erl-find-doc
для отображения документации (для этого необходимо наличие пакета w3m). В том случае если имеется несколько функций, соответствующих запросу, то пользователь должен будет выбрать нужную функцию из списка.fdoc
, который также, как и otp_doc
, проводит анализ исходных текстов загруженных модулей и сохраняет собранные данные для последующего использования. Получить описание модуля или функции из базы данных fdoc
можно с помощью команды erl-fdoc-describe
(C-c C-d d
). А с помощью команды erl-fdoc-apropos
(C-c C-d a
) можно получить перечень функций, чьи названия или комментарий соответствуют заданному регулярному выражению. В том случае, если одна из команд получает префиксный аргумент, она вначале выполняет перестройку базы данных fdoc
, и только затем выполняет требуемую операцию.erl-eval-expression
(C-c C-d :
) пользователь может ввести в мини-буфере выражение на Erlang и получить результаты его вычисления. В том случае, если пользователь выделил регион кода, то этот код будет предложен в качестве значения по умолчанию. Кроме того, определены две команды, которые позволяют перегружать модули на выбранном узле. Это команда erl-reload-module
(C-c C-d L
), которая заново загружает модуль с заданным именем, и команда erl-reload-modules
(C-c C-d r
), которая заново загружает все обновленные используемые модули.*scratch*
в Emacs, которые позволяют вводить и выполнять отдельные выражения Erlang не создавая выделенных файлов с исходным кодом (пример работы вы можете увидеть на скриншоте ниже). Для начала работы в этом режиме, необходимо выполнить команду erl-ie-show-session
(C-c C-d e
), которая либо создаст новый, либо переключит в существующий буфер в котором пользователь может вводить команды. По умолчанию, буфер имеет название *ie sessions имя_узла*
. Внутри этого буфера, пользователь может вводить выражения и определения функций. Для вычисления выражения, которое находится перед курсором, используется команда erl-ie-eval-expression
(C-j
), а для вычисления определения функции — команда erl-ie-eval-defun
(C-M-x
).fprof
. Для работы с ним distel предоставляет две команды. С помощью команды fpropf
(C-c C-d p
) пользователь может ввести выражение Erlang и получить результаты выполнения этого выражения в режиме профилирования. А с помощью команды fprof-analyse
(C-c C-d P
) можно загрузить файл с уже имеющимися данными профилирования, и проводить их анализ в удобной форме. После проведения анализа, пользователь получает доступ к буферу, в котором перечислены все использованные в работе функции, и для каждой из них приводится следующая информация: Calls
— общее количество вызовов данной функции; ACC
— сколько времени (в миллисекундах) было затрачено на выполнение данной функции, включая вызов других функций, вызванных из нее; Own
— сколько времени выполнялась сама функция, без учета других функций, вызванных из нее. Пример вывода результатов профайлинга вы можете увидеть на рисунке ниже.+debug-info
компилятору erlc
или выполнить команду erlang-compile
с префиксным аргументом).Monitor
) и отдельные буфера для каждого из интерпретируемых модулей, которые выполняются в пошаговом режиме (буфер Attach
).edb-toggle-interpret
(C-c C-d i
), после этого, вы можете расставлять в исходном тексте точки останова с помощью edb-toggle-breakpoint
(C-x SPC
).Attach
, в который можно попасть через буфер Monitor
. Чтобы переключиться в буфер Monitor
, вы можете воспользоваться командой edb-monitor
(C-c C-d m
). В этом буфере отображается список отлаживаемых процессов и пользователю доступно несколько команд: RET
переключает в буфер Attach
, соответствующий выбранному процессу; q
скрывает буфер монитора, а k
удаляет буфер монитора, удаляет все точки останова и отключается от модуля отладки на выбранном узле.Attach
позволяет выполнять пошаговое выполнение кода конкретного модуля. В нем отображается исходный код модуля и метка, показывающая следующую выполняемую строку (в том случае, если выполнение было остановлено на какой-то из точек останова). В этом буфере пользователю доступны следующие команды:функция | клавиша | описание |
---|---|---|
edb-attach-step | SPC | выполнить следующее выражение, с заходом в вызываемую функцию (если это вызов функции) |
edb-attach-next | n | выполнить следующее выражение, без захода в вызываемую функцию |
edb-attach-continue | c | продолжить выполнение до следующей точки останова |
edb-attach-up | u | показать предыдущий фрейм стека |
edb-attach-down | d | показать следующий фрейм стека |
edb-toggle-breakpoint | b | переключить точку останова на текущей строке |
edb-attach-help | h | показать справку по пользованию данным буфером |
q | удалить буфер Attach без завершения отлаживаемого процесса |
edb-synch-breakpoints
(C-c C-d s
), которую необходимо использовать после перекомпиляции и перезагрузки модуля. Кроме того, для перезагрузки модулей рекомендуется использовать команду erl-reload-module
, а не загружать его вручную, поскольку эта команда позволяет сохранить все установленные точки останова и флаги интерпретации модулей.edb-save-dbg-state
(C-c C-d S
) для сохранения состояния отладчика, и edb-restore-dbg-state
(C-c C-d R
) для его восстановления.erl-process-list
(C-c C-d l
) и создает буфер, в который выводится различная информация о выполняемых процессах (пример показан на скриншоте ниже). В данном буфере пользователь может выполнять различные команды, которые позволяют получать более подробную информацию о процессе (RET
или i
), просматривать содержимое очереди сообщений (m
), выполнять трассировку процесса (b
). Пользователь может даже завершить процесс воспользовавшись командой k
. Чтобы покинуть этот буфер необходимо нажать q
, а чтобы обновить информацию — u
.(require 'flymake)
(defun flymake-erlang-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "~/emacs/bin/eflymake" (list local-file))))
#!/usr/bin/env escript -export([main/1]). main([File_Name]) -> compile:file(File_Name, [warn_obsolete_guard, warn_unused_import, warn_shadow_vars, warn_export_vars, strong_validation, report]).
.erl
, что делается с помощью следующего кода.(add-to-list 'flymake-allowed-file-name-masks
'("\\.erl\\'" flymake-erlang-init))
(add-hook 'find-file-hook 'flymake-find-file-hook)
(defun my-erlang-mode-hook () (flymake-mode 1)) (add-hook 'erlang-mode-hook 'my-erlang-mode-hook)
.erl
режим flymake будет включаться автоматически, и вы будете видеть результаты проверки по мере набора вашего кода. По умолчанию, строки содержащие ошибки выделяются светло-розовым цветом, а строки, вызывающие появление предупреждений — светло-голубым5. Пример вы можете увидеть на скриншоте:some_wrong_function
не существует, и поэтому Erlang не может ее найти и рапортует об ошибке. А объявление функции подсвечено из-за того, что параметр Fun
не используется в теле функции, что приводит к получению предупреждения.-include
) заголовочного файла;make
скомпилировать код на Erlang, который будет использоваться для индексации модулей..el
в то место, где их найдет Emacs, и добавить следующий код в ваш файл инициализации:(require 'esense-start) (setq esense-indexer-program "/path/to/esense.sh")
esense.sh
, который используется для индексации кода. Прочие настройки могут быть заданы используя группу настройки esense
.esense.sh
, в качестве параметра которому передается каталог с исходным кодом. (В первую очередь рекомендуется построить индексы для исходных текстов Erlang, поскольку наличие информации для некоторых модулей необходимо для работы пакета). Индексные файлы по умолчанию сохраняются в каталоге ~/.esense
.esense-initialize
, которая обновит информацию о существующих индексных файлах. После генерации индексов для исходных текстов, вы можете сгенерировать индексы для документации в формате HTML, так что ссылки на нее смогут использоваться в процессе работы.F1
(команда esense-do-something-at-point
) для выполнения практически всех операций. В зависимости от положения курсора, пакет выполняет одно из следующих действий:RET
или сочетания C-m
;-include
, то будет показан соответствующий заголовочный файл.C-F1
приведет к вызову команды esense-go-to-documentation
, что приведет к переходу к месту определения символа, находящегося под курсором (вернуться назад можно с помощью стандартной для etags
комбинации M-*
). А комбинация M-F1
(esense-go-to-function-documentation
) запросит имя функции и выполнит переход к ее определению.:
, #
, .
и ?
также приводят к выдаче списка возможных вариантов для функций из модуля, имен записей, членов записей или макросов, соответственно.flymake-warnline
.code:add_path
с нужным каталогом в файл инициализации ~/.erlang
.