2012年1月30日月曜日

マイdot.emacsを調査してみた


本当は作りたい物があったんだけど、自分のemacsにjavascriptモードが無かったためそれを追加した。でもあれ、そもそもemacs-lispっていつもサンプルから拾うだけであんまり中身知らないなあと思って調べてみた。

初めてemacsに出会ったのは大学1回生時の授業であるけど
emacs-lispに興味を持ったことは今までついぞ無かったのであった。

まず、自分の構成は以下
~/.emacs.d/
   init.el
   /site-lisp

ホームディレクトリ直下の".emacs.d"配下に設定を集めています。
こうすると、設定がディレクトリごとコピーできるのでポータブルになるとWEB+DB vol.58に書いてありました。site-lisp配下には外から取ってきたemacs-lispをぽいぽい入れていきます。
# あ、そういえばこれ買いました。神本。


内容ですが、長いので3部に分けます予定です(いつまでに書ききれるか分からんけど)。
  • 第1部:イントロダクション、load-path設定等
  • 第2部:メジャーモード等設定
  • 第3部:文字コードとか見た目の設定とかこまいとこ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; load-path

まずはload-pathに関する設定から。たぶんここの設定はみんな似たり寄ったりだと思う。
S式のままだと関数と変数をぱっと見分けられないので、javascript風に変換してみる。


↓↓


完全に見た目の分かりやすさだけのために変換します。
(dynamic scopeとlexical scopeの)変数スコープの違い等の言語的特質は無視で。
スコープの話はこの機会に少し勉強したので、また別途まとめたい。

1行目:let句でローカル変数"default-directory"に値を束縛する。束縛する値は、expand-file-name関数の戻り値。expand-file-name関数は、文字列が表すパスを絶対パスに置き換えます。let句の構成は以下になり、最初のvarlist-to-bindで、変数に値を束縛します。"(hoge 1)":hogeという変数に1を設定します!みたいな感じで。そして、その後にその"hoge"を使用した処理を書くスタイルになるかと思います。
(let varlist-to-bind body...)
今回のvarlist-to-bind(束縛変数リスト)はこの"default-directory"だけ。今回のケースだと2行目以降がbody(実行文)にあたる。

2行目:add-to-list関数でリストに値をいれてるんだけど、この関数は値の重複を許さないので、動きとしてはSetに値をぶっこんでいることに近い。"load-path"という変数に、さきほど束縛したdefault-directoryを挿入しています。"load-path"というのは、Emacs が*.el や*.elc(emacs-lispをバイトコンパイルしたもの)を探す順を指定するための変数です。シェル変数の$PATHのイメージ。load-path、いっぱい入ってます。
("/Users/hoge/.emacs.d/site-lisp" "/usr/share/emacs/22.1/site-lisp" "/usr/share/emacs/site-lisp" "/usr/share/emac\
s/22.1/lisp" "/usr/share/emacs/22.1/lisp/url" "/usr/share/emacs/22.1/lisp/textmodes" "/usr/share/emacs/22.1/lisp/\
progmodes" "/usr/share/emacs/22.1/lisp/play" "/usr/share/emacs/22.1/lisp/obsolete" "/usr/share/emacs/22.1/lisp/ne\
t" "/usr/share/emacs/22.1/lisp/mh-e" "/usr/share/emacs/22.1/lisp/mail" ...)

3,4行目:normal-top-level-add-subdirs-to-load-pathという(長い!)関数が存在するかを確認して、存在したら呼び出す。この関数は、ディレクトリを再帰的に探索し、見つかったディレクトリを load-path に追加します。

これで、"~/.emacs.d/site-lisp"配下に追加した*.elやら*.elcやらが読み込まれるようになるということですね。何気ない顔してコピペ、というのはいい加減卒業しないとなあという今日この頃。

続きは、(あるかもしれない)第二部で。

.emacs.d、Githubに置いてみました。
https://github.com/k-ori/emacs.d

# syntax-highlight、amazonのiframeのバナー張ると動かないのか!
# http://blog.heartofsword.net/archives/794

2012年1月8日日曜日

githubとの遭遇


// k-ori@github

下記を参考にしながら、Github初めて触ってみました(アカウントは前から持ってたけど)。
ナウなヤングのためのgithub入門講座 -基本機能からdotfiles管理まで-

watch機能とやらが使えるらしく、下記を検索してさがして、とりあえずwatchしてみる。書かれている通りに!
GitHub人気レポジトリランキング Best50 全解説

followもofficialチュートリアル通りにやってみる。書かれている通りに。マニュアル人間です。
「お前このページに来るとは、さては初心者だなー」とか「お前は、なんでこんなクールガイをfollowしないんだい?」とか言われながら(ニュアンスは妄想です)。
Help.GitHub - Be Social

あと、gitのpushまでのコマンドを忘れたとき用に、addからpushまでのコマンドをシェルにしてpush。
自分で自分をpushするシェルがfirst pushです。
addからpushまで一気になんて・・・とか細かいことはいいんです。自分で自分をpushしてみたかっただけなんです。

fizz-buzz challenge


以下の記事を読んでいて、初めて見る単語「fizzbuzz問題」。
Scala的な考え方 - Scalaがとっつきにくいと思っている人へ
こういうものらしい。

http://ja.wikipedia.org/wiki/Fizz_Buzz
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood が FizzBuzz問題 (FizzBuzz Question)として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。
また、実際に「制限時間2分以内」「剰余(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」等の縛りでゲーム条件を満たすコード記述の腕試しをする者が続出した。

その場で、自分で書いてみたコードは以下。
工夫点は、「3で割り切れる」というロジックと「5で割り切れる」というロジックが重複するので、その結果をキャッシュしたというだけヽ(`Д´#)ノ

調べてみたら、"FizzBuzz" = "Fizz" + "Buzz"であることを利用して短くまとめている回答もメジャーのよう。javaだとこんな感じ。


しかし、圧巻はPerl。短いなあ。$_で直前に評価した値が参照できる点が効いてるのか。



以下のページがよくまとまってて、引用させていただいた。
Fizz Buzz Test

しかし、中にはスタックトレースでFizzBuggする変態さんもいるようでw


Javaでちゃんと数字も表示されるFizzBuzz書いた

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javaapplication1.FizzBuzzNewClass.main(FizzBuzzNewClass.java:18)
Caused by: java.lang.StackOverflowError

at 8911.fizzbuzz(FizzBuzzNewClass.java:80)
at 8910.number(FizzBuzzNewClass.java:32)
at 8909.number(FizzBuzzNewClass.java:40)
at 8908.fizz(FizzBuzzNewClass.java:58)
at 8907.number(FizzBuzzNewClass.java:34)
at 8906.buzz(FizzBuzzNewClass.java:75)
at 8905.fizz(FizzBuzzNewClass.java:56)
at 8904.number(FizzBuzzNewClass.java:34)

ちなみに、この記事Hacker Schoolには、FizzBuzzCodeを応募時に貼付けさせている。

このボリューム、間違いなく3日坊...

2012年1月7日土曜日

syntaxHighlighter so cool

また、blogを作ってみた。何個目だろう。 今回は、syntaxHighlighterを使ってみたくて、作ってみた。



シンタックスハイライト、かわいいな! あとは、3日坊主にならないようにモチベーションを維持するだけです。

メモ
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/