うつの初期症状および要因の一例

この記事はつらぽよ Advent Calendar 2013 - Adventarの4日目です。

現在適応障害からのうつ病で休職しています。
休職を決定するまでの初期症状を振り返ってみます。
あくまで一例であり、また全部がうつによるものかは分かりませんが、心当たりのある方は医師に相談を。

起床時の脱力感・めまい

目が覚めて意識はあるものの、体を動かすことができません。
起きあがるために腕で体を支え、腹筋を動かし...といった一連の動作を想像するだけで心が折れたり、力が入らなかったりします。
起きあがれてもふらついたり座りこんで立ち上がれないことがあります。
主にこの症状のため遅刻・欠勤が増え、休職することになりました。

行動の切り替えが遅くなる

何かしているときに別の行動へ移らず、ぼーっとしている時間が長くなります。
てきぱきと仕事や家事を片付けることができず、余計に疲れが溜まります。

動悸・呼吸困難

主に職場で、ふと気付くと動悸がしたり呼吸が乱れていることがありました。

集中力・短期記憶の低下

メールソフトを開いてから何をするのか思い出せなくなったり、作業の途中で何をしているのか分からなくなることがありました。
傍から見て分かるほど目立つものではありませんでしたが、仕事への影響はありますし、それ自体が自分に自信を持てなくなる恐怖でもありました。

進捗どうですか?

この記事は進捗Advent Calendar 2013 - connpassの3日目です。

艦これは2-4攻略に向けて航空戦力の拡充を図っているところです。
先日のイベントではE-2をギリギリ抜けました。
いずれにせよ電と鳥海のかわいさにはなんら問題ありませんのでご安心ください。
あとクッキーは現在3GCPS, 累計56エクサクッキーです。

進捗なんですか?

さて本題ですが、7/15よりつらぽよなことがあったのでのんびりまったりすることを課題としています。何も考えずに日々を過ごせるほどできた人間ではないので、マンガとか小説とか読んでいます。そこで、この4ヶ月半に読んだ量でどのくらいのんびりまったりできたか進捗を評価しようと思います。

進捗どうですか?

]

進捗158冊、30.0kgです。
上3つがマンガで120冊、23.4kg。最後の1つがその他小説などで38冊、6.6kgです。

進捗どうしますか?

まだまだのんびりまったり力が足りていないと思われるので、今後も精進したいと思います。
特に実家にいる今のうちに弟の蔵書は読破しておきたいところです。

4日目は @aster_ism さんです。進捗どうですか?

scheMe repL in emacs with geiser

この記事は LL/ML Advent Calendar 第2ラインの7日目です。
Scheme 開発環境の Geiser を紹介します。

Gieser とは

GeiserEmacs 向け Scheme 開発環境で、処理系と連携した REPL の機能を重視しています。
処理系に依存する各種機能や REPL から利用する付属プログラムは、標準では Guile と Racket をサポートしています。本記事では Racket を利用していきます。

インストールと起動

ソースコードからのインストールもできますが、Marmalade や el-get 標準添付のレシピからもインストールできます。
今回は package.el を使い Maramalade からインストールしました。

package.el は Emacs のパッケージ管理ライブラリで、Marmalade のような対応したサイトからパッケージをダウンロードしコンパイル、設定をしてくれます。Emacs 24 以降では標準添付されています。
以下を設定し M-x package-install でgeiser を選択します。

(require 'package)
(add-to-list 'package-archives
  '("marmalade" . "‌http://marmalade-repo.org/packages/"))
(package-initialize)

今回は Racket を利用するので、geiser 用に以下を設定します。

(setq geiser-racket-binary "/path/to/racket")
(setq geiser-active-implementations '(racket))

2行目は起動する Scheme 処理系のリストで、デフォルトでは Guile とのリストになっています。今回その状態でうまく起動できなかったため、念のために設定してあります。

設定が済んだら Scheme ファイルを開きます。モードラインに Racket/A などと表示されていると思います。
ここで M-x run-geiser を実行すると REPL が起動します。ミニバッファに"Racket REPL up and running!" と表示されていれば成功です。

終了方法

さて起動ができたら、まずは終了方法を確認するよう皆さんは学校で習いましたね?
REPL のバッファにカーソルを移したら、C-cC-q で紳士的に終了だ。
また C-u を付けると直ちに処理系のプロセスを殺す。慈悲はない。

このときまだバッファが残っていますね? ここで C-cC-z を入力すると REPL の入力履歴や Scheme コードのバッファとの関連付けを維持したまま REPL を再開することができます。
これはエラーで処理系が終了した場合にも有効だ。
またプロセスが生きているときは、C-cC-z で REPl バッファとコードのバッファを往復できる。

Autodoc

処理系にモジュールを読み込ませることで、補完や定義へのジャンプなどの機能が使えるようになります。
ここでモジュールとは処理系によって異なりますが、Racket の場合は適当なファイルで問題ありません。
REPL に

,enter "path/to/code"

と入力するとそのファイルの内容が補完などの候補になります。

コード上および REPL 上で定義済みの手続きやリテラル値にカーソルを合わせると、ミニバッファに引数やその値が表示されます。とくに、define-syntax や case-lambda のように手続きの場合分けができるものは候補をそれぞれ表示してくれます。

Jump

シンボルにカーソルを合わせて M-. で定義にジャンプしてくれます。その後 M-, でジャンプ元に戻れるお行儀の良さが嬉しいですね。
REPL に読み込ませてある手続きやマクロであれば、マクロから生成した定義にも飛んでくれます。処理系からの情報に加え Geiser 自身もコードを読んでいるようで、完全ではないそうです。

補完

モジュール内で定義済みのシンボルを補完してくれます。
Emacs Lisp で補完候補を返す関数を定義してあるため、auto-complete などからも利用しやすそうです。

その他の機能

その他の気になる機能について触れておきます。

  1. Geiser の概要には Macro Expansion とありますがそれらしい機能が見当たりません...
  2. 今回やったような Emacs から起動するプロセスではなく、付属のプログラムでサーバ化した処理系プロセスにTCPで接続できるようです。単に別プロセスのものを利用するだけでなく、ネットワーク越しの利用もできるようです。
  3. Guile, Racket 以外で利用するにはどうするのか。

多分色々(SchemeEmacs Lisp も)書かなきゃいけない気がします。

ことりちゃんかわいい

最後におまけです。
Racket には画像をオブジェクトとして扱う機能があり、それに対応して Geiser には REPL 上に画像を表示する機能があります。

Emacs 上に表示されていることりちゃん画像の著作権者は mzp さんです。
ことりちゃんかわいい

まとめ

- Emacs 向け Scheme 開発環境 Geiser を紹介しました。
- 洗練された機能が揃っています。
- 処理系の情報を活用するために設定が必要なので、 Gauche などの設定もしていきたいところ。
- ことりちゃんかわいい

Anything-BibTeX を作りました

bibtex を選択し参照の形で挿入する Anything 情報源 Anything-BibTeX を作りました。
Emacs に標準添付の RefTeX を利用しています。
この記事は Emacs Advent Calendar jp: 2011 : ATND の 27日目の記事です。

そもそも bibtex ってなにさ

論文などを執筆する際には、参考文献が重要になります。参考文献の書き方は学会などによって異なりますが、文献のタイトルや筆者、発表された学会など記入する項目は大体同じです。
そこで文献の情報を一つのファイルに集めておき、tex で論文を執筆する際に書式を設定することでファイルから参考文献を自動生成する bibtex というツール(および文献情報の書式)が使われるようになりました。
RefTeX は tex ファイルの作成を支援するマイナーモードで、参考文献のほか図や数式に対する参照の入力を補助してくれます。

使ってみる

gist で公開しています。
Anything-RefTeX を導入する際には、auto-install.el を利用して

(auto-install-from-url "https://raw.github.com/gist/1523216/b8060f8c0792988e862a42f27a18e1d4d35d965d/anything-bibtex.el")

load-path の指すディレクトリに anything-bibtex.el を置いたら

(require 'anything-bibtex)

で情報源が追加されます。

Emacs Lisp の変数 reftex-default-bibliography が設定されているか、
\bibliography コマンドが使われている tex ファイルのバッファで利用できます。
M-x anything-call-source などからお試しください。

\bibliography コマンドが使われている tex ファイルのバッファで anything-bibtex を呼び出すと、始めに正規表現を要求されます。

対象となっている bib ファイルから正規表現にマッチした文献情報が抜き出され、anything で選択できるようになります。
候補はそれぞれ文献情報をひくためのキー、著者や発表した年などの情報、文献のタイトルが含まれています。

これらの中から選択すると、対応した文献情報を参照する tex コマンドが埋め込まれます。

感想

なんだか大袈裟な小見出しになってしまいましたが、太古の昔から言われている「再利用性」とかの話です。
今回 Anything 情報源を作るにあたって、始めは適当なデータを返してくれる関数を探してそれを使えばいいやと思っていました。しかしいざコードを見てみると、

  • 状況に合わせて適切なデータを作る→それをバッファに書き込む
  • 入力をミニバッファから受け取って→それを元にデータを作る

といった関数が多く、なかなか適当な関数が見つかりませんでした(下に挙げる未実装の機能はこの理由から妥協した結果であるものもあります)。
副作用は別の関数で実行し、入力を引数として受け取ってデータを作り返すというように分割してあると、Anything や auto-complete などで利用しやすく便利になるのではないでしょうか。

今後の課題

より効率の良い/簡潔に書ける関数やイディオムがありそうなので、それらを取り入れ改善したいです。

  • marmalade への登録

今流行りの package.el からも使えるよう marmalade にも登録してみたかったのですが、うまくいきませんでした。
Add Package をクリックするとログイン状態に関わらずログイン名とパスワードを要求され、そこでログインに成功してもトップの画面に飛ばされてしまいます。
また marmalade.el をサーバーの url を設定して使ってみたところ、ログイン時に返ってきたトークンをうまく解釈できなかったようで失敗してしまいました。
今回は時間もないので諦めましたが、また後日改めて挑戦しようと思います。

  • 区切り文字の修正

連想リストを anything 情報源としてバッファに書き出し、選択された文字列から連想リストを復元できるようリストの内容をセミコロン ; で区切っています。
これは文献情報によっては問題になりそうです。
連想リストへ復元できるようにするうまい方法があれば修正したいと思います。

  • 機能追加
    • tex ファイル内の文献情報 thebibliography の利用

bibtex は文献情報を tex ファイルとは別のファイルに集めると前述しましたが、tex ファイルに文献情報を直接書くこともできます。
今回は後者の場合に対応していません。

  • RefTeX の設定を利用

今回は書式の設定など RefTeX の柔軟な機能を利用できていない最低限の実装となっています。

  • 複数候補

RefTeX では複数の候補を選択できます。persistent-action で頑張ればできそうな気もしますが、そういう用途で使うものではないようにも見えます。

RefTeX の実装に従って最初に正規表現で候補を絞っていますが、バッファから候補を探して選ぶのではなく Anything を使うのだから、これは不要かと思います。

Emacs の why-mode のためのあれこれ

これは、Theorem Proving Advent Calendar の11日目の記事になります。
Why の Emacs 上での開発環境について紹介します。
ちっとも証明してないですが、凄い方々の凄い記事の間の箸休めということで一つ。

why-mode

tmiya さんによる3日目の記事で紹介されてた Why3 には、Emacs 向けの開発環境になるwhy.el が付属しています。Emacs の load-path が指しているディレクトリにこれを置き、

   (require 'why-mode "why.el")

とすれば読み込めます。なお require の第二引数はオプションで、省略した場合には第一引数に .el を付けたファイル名を探すようです。
しかしこの why.el は、コメントを見るに2002年に作られたものらしく、現在の Why3 では使えない機能も一部あります。この記事では、why.el を前提に3つの拡張を提案します。

Emacs じゃないけれど

ところで、zsh 向けのコマンド引数補完用ファイルも付属しています。2箇所ほど whyml3 と書かれているところを why3ml に修正して適切な場所に置くことで使えます。各種オプションやその引数をガイドしてくれ、ヘルプとしても大変便利です。

コメント

Emacs のデフォルトのキーバインドでは M-; でコメントの挿入ができます。ところが why-mode にはこのコメントとしてどんな記号を入力してやるかという設定がありません。
以下でコメントを認識させてやることができます。

(defun why-comment-setting ()
  (make-local-variable 'comment-start)
  (setq comment-start "(* ")
  (make-local-variable 'comment-end)
  (setq comment-end " *)")
  (make-local-variable 'comment-multi-line)
  (setq comment-multi-line t)
  )
(add-hook 'why-mode-hook 'why-comment-setting)

なおせっかくの複数行コメントなのに、複数行の範囲をコメントアウトするときも一行づつコメントアウトされてしまいますが、仕様です :-)

flymake

Emacs の標準機能として、プログラムのエラー箇所を表示する flymake というものがあります。構文や型システムに慣れないうちは特に助かります。これを WhyML 向けに設定してやります。
flymake は処理系のエラーメッセージに対して、一つのエラーにつき一行のメッセージという仮定を置いています。一方 why3ml は複数行のエラーメッセージを出力することがあるため、そのままでは利用できません。
幸か不幸か、why3ml はエラーを発見したら直ちに停止するため、一度の変換で最大一つのエラーしか報告できません。そこで flymake がエラーメッセージを読み込む直前に一行に纏めてやります。

(defvar flymake-read-multiple-lines nil)
(make-variable-buffer-local 'flymake-read-multiple-lines)
(set-default 'flymake-read-multiple-lines nil)

(defun fold-lines (list)
  (if list
      (concat (car list) " " (fold-lines (cdr list)))
    ""))

(defadvice flymake-split-output (after flymake-output-split-multilines)
  (when flymake-read-multiple-lines
    (let ((lines (car ad-return-value))
          (residual (cadr ad-return-value)))
      (setq ad-return-value
            (list (list (fold-lines lines))
                  residual)))))
(ad-activate 'flymake-split-output)

flymake-read-multiple-lines を t にすると全てのエラーメッセージを一行に纏めるようになります。あとは why-mode でのこの変数の設定をしつつ他の言語と同じように設定してやります。

(defun flymake-why-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 "why3ml" (append '("--type-only") (list local-file)))))
(defconst flymake-allowed-why-file-name-masks '("\\.mlw" flymake-why-init))

(defvar flymake-whyml-err-line-patterns '("^File \"\\(.+\\)\", line \\([0-9]+\\), characters \\([0-9]+-[0-9]+\\)\\(.*\\)" 1 2 3 4))

(defun flymake-whyml-start ()
  (interactive)
  (setq flymake-read-multiple-lines t)
  (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
    (setq flymake-check-was-interrupted t))
  (ad-activate 'flymake-post-syntax-check)
  (add-to-list 'flymake-allowed-file-name-masks flymake-allowed-why-file-name-masks)
  (add-to-list 'flymake-err-line-patterns flymake-whyml-err-line-patterns)
  (flymake-mode t))

(add-hook 'why-mode-hook 'flymake-whyml-start)

図では Why3 付属のサンプルプログラムを変更し、 型エラーを起こさせています。赤くなっている行では int 型を引数に取る関数に int 型でない変数を適用しています。
またエラーメッセージが下部のミニバッファに表示されています。flymake でのエラーメッセージの表示方法はいくつか考案されていて、これはそのうちの一つです(標準の表示方法である flymake-display-err-menu-for-current-line はエラー箇所が見えなくなることがあるので、今回は使いませんでした)。

compile

端末に戻らず、Emacs から証明器を動かした方が便利な場合もあるかと思います。
compile コマンドは、外部コマンドを非同期に実行してくれます。

私は smart-compile を利用して、以下のように設定しています。

(add-to-list 'smart-compile-alist
 '("\\.mlw$" . "why3ml -P alt-ergo %f --timelimit 1"))

図は Why3 付属のサンプルプログラムを実行してみたものです。ファイル中の命題をそれぞれ証明した結果が出力されています。証明結果については色を付けられると良さそうですね。

まとめと今後の課題

Emacs 上での Why 開発環境として、コメント入力の定義、flymake、compile を紹介しました。

今後以下の点ができたら嬉しいなと考えています。

  • 個別の命題の証明

compile では全ての命題を一挙に証明していますが、Why は 指定した命題だけを証明器に投げることができます。Emacs 上で命題の一覧から選択して証明、現在カーソルのある命題を証明といったことができるとインクリメンタルな開発がしやすくなると思います。

  • メジャーモード

付属の why.el は色付けやインデントの挙動などがイマイチで、それらの点に改良の余地があります。

自己紹介

流行りに乗って Advent Calendar に参加してみたくなったのではてダ始めました。
投稿テストを兼ねて自己紹介をとりとめもなく書いてみます。

身分

現在大学院生です。プログラムの静的検証を研究しています。
来年からは名古屋の方で就職予定。

プログラミング

といっても自分で何かを作ったりしていないような。
好きな言語は Scheme
Gauche をメインに使っていますが研究関連で Racket を目にすることも多い。

Haskell を勉強するといって全然進んでいない。
定理証明に興味のあるお年頃なので、研究も兼ねて時々 Why や Coq と格闘しています。

Emacs 大好き

でも Vim ユーザにはコンプレックスが。
何にせよキーボードから手を離したくない、マウスなんて遠すぎる。

最近よく使っている大きなものは以下の通りでしょうか。アルファベット順で。

  • anything
  • auto-complete
  • el-get
  • ddskk
  • magit
  • mew
  • org-mode
  • twittering-mode
  • yasnippet

その他

メインには MacbookAir Lion + MacPorts
最近 homebrew 派が多くて肩身が狭い気がします。
それと Ubuntu 11.10 と Windows7デュアルブートが一台。

最近 Redmine に興味を持ってローカルでこそこそ使っています。
でも org-mode ともっとびしばし連携してほしい。

VCS は git しか使えません。
Windows で何か開発するなら mercurial あたりの方がよさそうですが。

ブラウザは Firefox + KeySnail。
いじりがいがありそうなのでそのうちプラグイン書きたいですね。