Tuesday, May 27, 2014

Emacs Lispファイルのヘッダコメントを自動挿入

.el なファイルの先頭にあるライセンスとかが書かれているアレをどうにか自動挿入したい。

そもそものアレの名前もわからない。 Library Headers - GNU Emacs Lisp Reference Manual によればヘッダコメントなるものらしい。

ヘッダコメントを自動挿入してくれるツールを探すと以下な記事あり。

EmacsWiki: Automatic File Headers

どうやら Auto Insert Mode なるものがある模様。

EmacsWiki: Auto Insert Mode

以下なマニュアルに、より噛み砕いた説明あり。

Autoinserting - Features for Automatic Typing

Auto Insert Mode お試し

適当に foo.el ファイルを開き M-x auto-insert すると以下な流れに。なお当方の Emacs は GNU Emacs 24.3.1 。

  1. Short description を訊かれる

    一行程度で書くものらしい。お試しで "Support for FOO" と入力してみる。 詳しくは Library Headers - GNU Emacs Lisp Reference Manual にあり。

  2. Keyword を訊かれる

    パッケージを M-x finder-by-keyword で探すときに使われるキーワードとのこと。 適当に "local" と入力しエンター。 詳しくは Library Headers - GNU Emacs Lisp Reference Manual にあり。

    なおプロンプトが表示されているときに C-h をタイプすると利用可能と思われるキーワードが表示される。 いつか使うかもしれないので簡単にメモ。

    • abbrev: 略記のハンドリング、タイピングショートカット、マクロ
    • bib: 参考文献一覧の機構
    • c: Cに関するプログラミング言語
    • calendar: カレンダとかタイムマネジメントなツール
    • comm: 通信、ネットワーク、リモートファイルアクセス
    • convenience: より速い編集に便利なもの
    • data: テキストでないデータの編集
    • docs: Emacs 文献の便宜
    • emulations: 他エディタのエミュレーション
    • extensions: Emacs Lisp言語の拡張
    • faces: テキストのフォントとカラー
    • files: ファイルの編集と操作
    • frames: Emacsのフレームとウィンドウシステム
    • games: ゲーム、ジョーク、娯楽
    • hardware: システムハードウェアとのインタフェース
    • help: オンラインヘルプシステム
    • hypermedia: テキストや他メディアタイプとの結びつけ
    • i18n: 国際化とキャラクタセットのサポート
    • internal: Emacs内部向けコード、ビルドプロセス、デフォルト
    • languages: 言語編集向けの専用モード
    • lisp: Emacs Lisp含むLispのサポート
    • local: あなたのサイトでのローカルコード
    • maint: Emacs 開発ツールおよび支援
    • mail: メールの閲読と投稿
    • matching: 検索、マッチング、並べ替え
    • mouse: マウスサポート
    • multimedia: 画像と音楽
    • news: USENET ネットニュースの閲読と投稿
    • outlines: 階層的なアウトラインとメモ取り
    • processes: プロセス、サブシェル、コンパイル
    • terminals: テキストターミナル(tty)
    • tex: TeX ドキュメントフォーマッタ
    • tools: プログラミングツール
    • unix: UNIX の機能とのインタフェースとエミュレータ
    • vc: バージョン管理
    • wp: 文書処理

以上により以下なヘッダコメントが foo.el ファイルに挿入される。

;;; foo.el --- Support for FOO

;; Copyright (C) 2014  Chiyanop

;; Author: chiyanop <chiyanop@local>
;; Keywords: local

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;;

;;; Code:



(provide 'foo)
;;; foo.el ends here

おしい。 Author の設定どうやるんだろ。あと This file is not part of GNU Emacs. なメッセージも一緒に入ってほしいところ。

Auto Insert Mode のカスタマイズ

結論は以下の設定。これを ~/.emacs.d/init.el とかに書いておくと所望するコメントが挿入されました。

(setq user-full-name "Your name")
(setq user-mail-address "Your email address")
(eval-after-load 'autoinsert
  '(setq auto-insert-alist
         (put-alist
          '("\\.el\\'" . "Emacs Lisp header")
          '("Short description: "
            ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str "

;; Copyright (C) " (format-time-string "%Y") "  "
            (getenv "ORGANIZATION") | (progn user-full-name) "

;; Author: " (user-full-name)
            '(if (search-backward "&" (line-beginning-position) t)
                 (replace-match (capitalize (user-login-name)) t t))
            '(end-of-line 1) " <" (progn user-mail-address) ">
;; Keywords: "
            '(require 'finder)
            '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x))))
                              finder-known-keywords)
                   v2 (mapconcat (lambda (x) (format "%12s:  %s" (car x) (cdr x)))
                                 finder-known-keywords
                                 "\n"))
            ((let ((minibuffer-help-form v2))
               (completing-read "Keyword, C-h: " v1 nil t))
             str ", ") & -2 "

\;; This file is not part of GNU Emacs.

\;; This program is free software; you can redistribute it and/or modify
\;; it under the terms of the GNU General Public License as published by
\;; the Free Software Foundation, either version 3 of the License, or
\;; (at your option) any later version.

\;; This program is distributed in the hope that it will be useful,
\;; but WITHOUT ANY WARRANTY; without even the implied warranty of
\;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
\;; GNU General Public License for more details.

\;; You should have received a copy of the GNU General Public License
\;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

\;;; Commentary:

\;; " _ "

\;;; Code:



\(provide '"
       (file-name-base)
       ")
\;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")
          auto-insert-alist)))

以降、設定に至るまでの云々。まずヘッダコメントの雛形はどのように定義されてるのか。

どうやら auto-insert-alist 変数に雛形が保持されているらしく M-x describe-variable して変数の説明を確認することに。

曰く auto-insert-alist は (CONDITION . ACTION) または ((CONDITION . DESCRIPTION) . ACTION) な要素からなるリストで、 CONDITION はファイル名にマッチする正規表現かメジャーモードのお名前、 DESCRIPTION はプロンプトか何かに使われる文字、 ACTION は挿入の骨組みになる部分、とある。

auto-insert-alist の初期値は autoinsert.el に定義されていて内容は以下。 ACTION がどの辺りに該当するのかわかりにくい。

    (("\\.el\\'" . "Emacs Lisp header")
     "Short description: "
     ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str "

;; Copyright (C) " (format-time-string "%Y") "  "
 (getenv "ORGANIZATION") | (progn user-full-name) "

;; Author: " (user-full-name)
'(if (search-backward "&" (line-beginning-position) t)
     (replace-match (capitalize (user-login-name)) t t))
'(end-of-line 1) " <" (progn user-mail-address) ">
;; Keywords: "
 '(require 'finder)
 ;;'(setq v1 (apply 'vector (mapcar 'car finder-known-keywords)))
 '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x))))
                   finder-known-keywords)
        v2 (mapconcat (lambda (x) (format "%12s:  %s" (car x) (cdr x)))
           finder-known-keywords
           "\n"))
 ((let ((minibuffer-help-form v2))
    (completing-read "Keyword, C-h: " v1 nil t))
    str ", ") & -2 "

\;; This program is free software; you can redistribute it and/or modify
\;; it under the terms of the GNU General Public License as published by
\;; the Free Software Foundation, either version 3 of the License, or
\;; (at your option) any later version.

\;; This program is distributed in the hope that it will be useful,
\;; but WITHOUT ANY WARRANTY; without even the implied warranty of
\;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
\;; GNU General Public License for more details.

\;; You should have received a copy of the GNU General Public License
\;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

\;;; Commentary:

\;; " _ "

\;;; Code:



\(provide '"
       (file-name-base)
       ")
\;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")

Autoinserting - Features for Automatic Typing によれば "Short description: " とそれ以降が ACTION にあたるらしい。 記法は Skeleton Language - Features for Automatic Typing によるもの。

さらに Skeleton Language - Features for Automatic Typing によれば "Short description: " はプロンプトに表示される文字で、それより後に続く要素が挿入されていく模様。

要は変数 user-full-name と user-mail-address を設定すればよさそう。 あと This program is… の前の行に This file is not part of GNU Emacs. を挿入してあげればよさげ。

かくかくしかじかで先に説明した設定に至りましたと。

これにて Emacs Lisp なパッケージを量産できるようになるのか。

Monday, May 26, 2014

gFab 2014/5/25

gFab okinawa に参加。本日から自分もモノづくりに参戦。 @mgwsuzuki 殿の以下なエントリを参考に。

カッティングする際はマシン内部の底に適当な紙をひく、 画像を焼きこむときはブツ側にマスキングテープをまく、 などなど参考になる技が多数展開。

以下、 MDF 板 2.5mm から切り出したブツ。

DSC_1431.JPG

いただいたネオジウム磁石とワッシャーを即興で仕込み、

DSC_1433.JPG

いちおうの完成形。

DSC_1432.JPG

蓋に結構重みがあることに気づいたので磁石なくてもいいかも。

MDF 板から煮汁が溶け出して切断面がそこはかとなくベトベト。 これ回避のため紙ひいたりテープ貼ったりするのですか、なるほど。

あとはものを挟み込むナニかを内側に取り付ければだが、 とりあえず百均を散歩して調達するとして。

さらに挟み込むナニを 3D プリンタで作れると面白みが増す予感。 今後の宿題ですな。

Saturday, May 24, 2014

DevOps Okinawa #4

DevOps Okinawa #4 参加してきました。進め方の書が以下。

http://okinawadevops.github.io/

すごい広島 さんの方式をさらに本格活用していく流れに。

PR のマージについても 2 名以上のメンバーによる Looks Good To Me をもってマージするルール。 LGTM ってのはコメントに :+1: とかするだけでいいみたい。 LGTM.in/g なんてのもあるらしい。

しかし取り急ぎ使いたい Gemfile が PR にあったので LGTM なルール無視しつつマージするとこれは出来ちゃった。 GitHub 的には :+1: のカウントには頓着無いようですな。 しかし設定とかすればできるだろうか。うーん、スルー。

すごい広島 さんの方式だと、開催にあわせて ひとつのマークダウンファイルをみんなで編集しているっぽい。 DevOps Okinawa #4 な方式は各個人でページを追加していく方式なようで、そこは違うみたい。

当方、だいぶ etherpad なるツールのお世話になっているので、 共同とゆえばどちらかというと GitHub よりそちらに流れたい勢ですが、 静的にしとくことはゆくゆく財産になりますゆえ、 どうか間をとりもってくれるツールを妄想する次第。

みんな思いのまま課題に取り組めた乙なもくもくでございました。

そのあとの飯会で ansible やら RHG やら SICP やら カーネル/VM やらデバイスファイルから向こう側へいく話やら、まーてんこ盛り。

SICP は英語で読むのがいいのかあ。

Saturday, May 17, 2014

JAWS-UG沖縄Docker祭り

参加してきました JAWS-UG沖縄 AWSハンズオン/もくもく勉強会 2014年5月

AWS なグループと、 Docker なグループに分かれるとのことで、自分は Docker なグループへ。

DSC_1420.JPG

こちらは AWS なグループ。

DSC_1421.JPG

ほとんどネットにある情報だけど、 他の人が Docker を使っている様子はまだ見たことがなかったのでひとまず収穫あり。

よくあるように Docker 使っていくうちにサーバがゴミ溜め化する現象ってのはなんとも防ぎようがない模様。 いまのところそういうモノだししょうがないかなあ。 ゴミ溜めも嫌いじゃないし。

つまるとこプロセスとリソースの分けのツールであるらしい。 仮想マシンと用途が似ているけど比較して云々するものじゃなさそうだし、 どちらが優れているか議論は遠慮するとして。

デプロイで楽できるかもしれない件。 今のところ自動構築ツールで充当できているし、うーん。 デプロイの標準手法としてさらに確立されるまで待ちますか。 つうかそもそも案件ベースではそんなサーバ台数いらないのでジレンマ感・・・

今後の展望については収穫ゼロかなあ。 まだまだ下位な機能でしかない模様。 リソース最適化な方面よりデプロイの方面が明るいのではないかと個人的に思うけど、 先に進むには上位のツールか何かがいくつか必要な気がする。どういったものだろう。

なお、後半の中継セッションは手持ちのプログラムの修復に勤しんでしまいました。 申し訳ない。 いきなり壊れるんだもの。

ひとまず妄想が掻き立てられました。

Sunday, May 11, 2014

gFab 2014/5/11

gFab okinawa にいってきました。

http://gfab-okinawa.github.io/

そろそろ当方も何か作ってみたく、ブックカバーなものを妄想しつつレーザーカッターの手ほどきを受けるなどしておりました。

DSC_1398.JPG

今回実験的に作ってもらったもの。ブックカバーの背の部分。

DSC_1407.JPG

自重でカバーが閉じるようにするにはまだ弾力が強い。 横幅をもう少し確保してあげるとよさげかもしれない。

設計は Inkscape でいける模様。

DSC_1378.JPG

ページ設定を最初にしてあげるのがコツっぽい。デフォルトの単位とカスタムサイズの単位はしっかり mm にしてあげると。

今回のブツのデータもいただきました。

https://gist.github.com/chiyano/fafbb117d0f42e810c4b

RasPi に V6

以下なブログ教えてもらいましたので、まずはこれを取っ掛かりにするとして、

http://mgwsuzuki.github.io/

しかしまず以下な JTAG ツールと USB シリアルなブツを入手する必要が、

DSC_1410.JPG

いやそのまえに Raspberry Pi を。まだまだ先は長い。

elisp関数を一時的に別な名前へ置き換える

Emacs Lisp の関数名を一時的に別な名前へ置き換えたい件で、 何使えばいいのかもよくわからないのでマニュアルを斜め読みした話。

ネットを漁ったところ defalias なるものがどうもよさげ、ということで以下なマニュアルを読む。

12.4 Defining Functions

結論。どうもそういった用途には defalias でなく fset を使うものらしい。サンプルは次回ポストするとして。

以下、メモ。ついでに defun についてもマジメに再確認。

defun name args [ doc ] [ declare ] [ interactive ] body

関数の定義は defun マクロでなされる。シンボル名を関数として定義する。

defun のフォームに見慣れない declare なるものが。 これは関数を obsolete として扱うなど特別な効果がある模様。 詳しくは 12.12 The declare Form 参照ってことで今回はスルー。

既存の関数の再定義に注意とある。関数の再定義は意図して行われることもあるため許されているらしい。

defalias name definition &optional doc

すでにある関数シンボル definition をシンボル name で定義するとある。 doc があれば name のドキュメントに使われるけど、なければ definition のものが使われると。

defalias の使いどころは、ソースコードの中に明示的に名前があらわれるようなところ。 defalias は、どのファイルに関数が定義されてるか記録するから。 defun も記録する。 この記録は unload-feature 関数でのアンロードに使われる模様。

この記録ってのが不要なら fset でいい模様。

あと car みたいなプリミティブな関数のシンボルの再定義はリスキーとある。

どうなるか一度試してみますか。

Wednesday, May 7, 2014

Okinawa.rb#117

117 回目の Okinawa.rb に参加させていただきました。

さっそく、なにやら @tompng さんのネタが展開されだした様子。

Minecraft のサーバを Sinatra でラップして Web API から呼べるようにしたとのこと。

訊いたところ、 Minecraft なるものはサーバサイドと画面サイドとに分かれた作りになっていて、 それぞれを実行することで Minecraft の世界が表示されるらしい。

https://minecraft.net/

サーバ側は標準入力を受けるようで、 これにコマンドを食わせると Minecraft の世界をある程度自由に弄れるとのこと。

このサーバサイドの標準入力を Sinatra でラップしたとのこと。なるほどー

https://gist.github.com/tompng/734b9562c8f3a10ad639

Minecraft のサーバサイドはフリーにダウンロードできて、クライアントサイドは商用であるとのこと。 買いたくなりました(笑)。

そういえば以下なブツは初めて実物を見させてもらいましたが、なかなかに固くて丈夫。 色々なブツに組み立てられそうな予感。

今回も楽しませていただきました。