Ruby on Rails用のemacs設定

Rubyモードのelファイルを取得

下記のコマンドでrubyをチェックアウト
svn co http://svn.ruby-lang.org/repos/ruby/trunk ruby
miscディレクトリにあるelファイルをすべて「~/.emacs.d」に移動。

rails-emacsの設定

下記のリンクからそれぞれelファイルを取得する。

.emacsの設定

下記のように設定を追加する。

; 念のため、ロードパスを通す
(setq load-path
(append
(list
(expand-file-name "~/.emacs.d/emacs-rails")
(expand-file-name "~/.emacs.d")
) load-path))


(defun try-complete-abbrev (old)
(if (expand-abbrev) t nil))

(setq hippie-expand-try-functions-list
'(try-complete-abbrev
try-complete-file-name
try-expand-dabbrev))

(setq rails-use-mongrel t)
(require 'rails)

以上で完了。

elisp入門めも


elisp
• 概要
◦ すべてが式(expression)
関数型言語
▪ 関数と関数呼び出しプログラミング
▪ 関数とは
▪ 副作用がない
▪ 引数を書き換えることを「破壊的」という
▪ 入力があって出力がある
◦ 例
▪ (+ 1 3) => 4
▪ (+ 3 4 5) => 12
▪ (setq foo "Foo") => "Foo" 
foo => "Foo"
▪ (if (= a b) (message "a equals to b") (message "a doesn't equal to b")))
▪ (defun my-hello-emacs () (message "hello emacs"))
▪ (let *1 => "foo"
▪ (cdr '("foo" . "bar")) => "bar"
• 関数
◦ (defun my-plus1 (n) (+ n 1)) ; (my-plus1 10)
◦ (defun my-plus (m n) (+ m n)) ;(my-plus 2 5)
*2 1 3)
◦ (fset 'my-plus2 '(lambda (n) (+ n 2)))
• シンボル(symbol)
◦ foo ; (setq foo "Foo")
◦ 任意のオブジェクトをさせる
• オブジェクト
◦ 型
vector
▪ cons
▪ string
▪ float
▪ 3.14
▪ 9.01
▪ integer
▪ 42
▪ 100
▪ symbol

*1:cnt 0) (lst '(1 8 7 11 3 2))) (mapcar '(lambda (n) (if (= (% n 2) 0) (setq cnt (1+ cnt)))) • クォート ◦ 評価しない ◦ (set (quote foo) "foo") ;(set 'foo "foo") • コンスセル(リスト) ◦ 二つのスロット(ポインタ)を持つオブジェクト ◦ 生成 ▪ ("foo" . "bar") ▪ (cons "foo" "bar") ◦ 参照 ▪ carとcdrのみで参照可能 ▪ (car '("foo" . "bar"

*2:lambda (m n) (+ m n

catalyst入門メモ

catalystインストール

Catalystの最低限のモジュールとよく使うモジュールをまとめてインストール。

sudo perl -MCPAN -e 'install Task::Catalyst'

 
 

Helloを作成

catalyst.plでHelloを作成。

$ catalyst.pl Hello
$ cd Hello

「lib/」には、アプリケーションのメインコードを置く。

  • lib/
    • Hello/
      • Controller
      • Model
      • View
    • Hello.pm

「root/」には、htdocs、テンプレート、CSSjavascriptを置く。

「script/」には、スクリプトが置いてある。

 
 

Hello World!」を表示するコントローラ

「lib/Hello/Controller/Root.pm」にhelloメソッドを作成

sub hello : Global {
   my ( $self, $c ) = @_;

   $c->response->body("Hello, World!");
}

テスト用サーバを起動する。
「-r」オプションを使うと、アプリケーションが変更された事を感知して自動で再起動するようになる。

$ perl script/hello_server.pl -r

http://localhost:3000/hello」にブラウザでアクセスする。
 
 

ViewとTemplateを使ってHello, World!

TT viewを作成。

$ script/hello_create.pl view TT TT

lib/Hello/View/TT.pmが作成される。
 
root/hello.ttテンプレートを作成する。

[% META title = 'Hello, World!' %]
<p>
   This is a TT view template, located in the 'root/' directory
</p>

 
lib/Hello/Controller/Root.pmにhelloメソッドを作成。

sub hello : Global {
   my ( $self, $c ) = @_;
   $c->stash->{template} = 'hello.tt';
}

 
http://localhost:3000/hello」でアクセスすると結果が表示される。
 
 

コントローラとアクションの作成

"Site"という名前のコントローラを作成。

$ script/hello_create.pl controller Site

lib/Hello/Controller/Site.pmが作成される。
 
Site.pmにtestメソッドを作成。

sub test : Local {
   my ( $self, $c ) = @_;

   $c->stash->{username} = 'Hato";
   $c->stash->{template} = 'site/test.tt';
}

Local属性は、"controller/method"という形のURLでアクセスできるようにする。
今の例だと"site/test"でアクセスできるようになっている。
 
テンプレートを指定しているが本来は必要ない。デフォルトでは、"controller/method.tt"のルールでテンプレートの名前が決まる。このルール以外で、テンプレートを指定したい場合は、ハッシュキー"template"に値をセットする。
 
rootディレクトリにsiteディレクトリを作成する。

$ mkdir root/site

"root/site"にtest.ttを作成する。

[% META title = 'Hello, World!' %]
<p> Hello, [% username %]! </p>

 
http://localhost:3000/site/testにアクセス。

synergyインストールメモ

synergyは、一つのマウスとキーボードで複数のマシンを操作できるようにしてくれる。
自分は、MacBookAirとwindowsXPのノートPCとLinuxのデスクトップを持っている。
これらすべてをMacBookAirのキーボードとタッチパッドで操作する。
ここでsynergyでは、
MacBookAirをサーバ、
windowsXPLinuxをクライアントとしている。
 
 

Leopardに対してのパッチを当ててコンパイル

http://d.hatena.ne.jp/zariganitosh/20080318/1205813394
こちらによると、Leopardでは、サーバーが起動してからしばらくして落ちてしまうらしい。
実際にこれを確認して悩んでた。
上記のURLの通り、パッチを当ててコンパイル

$ cd ./synergy-1.3.1
$ patch -p0 < ~/Downloads/synergy.patch
$ patch lib/platform/COSXKeyState.cpp < ~/Downloads/OSX_BusError.patch
$ ./configure
$ make
$ sudo make install

 
 

サーバーの設定

synergy.confを設定する。
設定に使うマシン名は、それぞれに設定されているホスト名が使われる。

まず、どんなマシンがあるのかを設定する。
例として、moe、larry、curlyみたいな設定がされているがこれは消す。

section: screens
hato-no-macbook-air.local:
HATONOTEPC:
localhost.localdomain:
end

次に上記で設定したマシンに関係を設定していく。
今回行なったのは、

という設定。設定ファイルには次のように記述する。

section: links
hato-no-macbook-air.local:
left = localhost.localdomain
right = HATONOTEPC

これに伴い、

という設定にする。

HATONOTEPC:
left = hato-no-macbook-air.local
localhost.localdomain:
right = hato-no-macbook-air.local
end

これで、Macの画面左端にポインタを持っていけば、Linuxの右端にポインタが現れ、
Macの画面右端にポインタを持っていけば、Windowsの左端にポインタが現れるような設定になった。
 
この設定ファイルを「/etc」ディレクトリに入れて、サーバを起動する。

$ /usr/local/bin/synergys --config /etc/synergy.conf

# 動作確認をするときのコマンド
$ /usr/local/bin/synergys -f --config /etc/synergy.conf

 
 

Linuxでのクライアントの起動と停止

Linuxでもソースをコンパイルしてインストール。
クライアントの場合は、設定は特にいらない。
下記のコマンドで、クライアントを起動。

$ /usr/local/bin/synergyc hato-no-macbook-air.local

これでクライアントは起動する。
停止はkillで行なう。

$ ps -x | grep synergy # pidを確認
$ kill

 
 

Windowsのクライアント

Windowsのクライアントはバイナリでインストールした。
サーバのIPもしくはホスト名を指定して起動。
 
 

ログイン時にサーバー起動

http://taishizi.blog105.fc2.com/blog-entry-133.html
自動起動に関してはこちらを参考にさせていただきました。
 
今回はapple scriptを利用してシェルスクリプトをログイン時に起動するように設定した。
まず

「アプリケーション>AppleScriptスクリプトエディタ」

で、エディタを起動して、下記のスクリプトを記述。

do shell script "/usr/local/bin/synergys --config /ect/synergy.conf"

このapple scriptでsynergyサーバーを起動する。
このスクリプトを適当なファイル名で保存する。
ログイン時にこのスクリプトを起動させる設定は

システム環境設定>アカウント>(自分のアカウント)>「ログイン項目」

で、保存したファイルを指定する。
これにより、ログイン時に起動するようになった。
 
 

日本語入力

http://wiki.nothing.sh/page/memo/Synergy
日本語に関してのパッチはこちらを参考にしました。
 
http://www.h5.dion.ne.jp/~pollux/
切り替えに関してはこちらの「CmdSpace」をインストールして対応しました。

HadoopによるAnalog2

まず最初に、下記のコードの様に、パッケージの宣言とインポートを行なう。Analogは、Sampleパッケージに所属する。(適切なパッケーイ名の付け方ってあるのかな)

package Sample;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

はじめのインポートブロック部分は、Javaの標準のクラスを読み込んでいて、次のインポートブロックでは、MapReduceに関するクラスを読み込んでいる。
Analogクラスは、org.apache.hadoop.conf.Configuredを継承し、org.apache.hadoop.util.Toolインタフェースを実装する事から始める。

public class Analog extends Configured implements Tool {
       ... code ...
}

Configuredクラスは、特定のXMLファイルから設定パラメータを読み込む役割を担っている。getconf()メソッドを呼び出すと、読み込みが完了する。このメソッドは、org.apache.hadoop.conf.Configurationのインスタンスを返す。このインスタンスは、XMLデータにあるname-valueのペアとして設定されたリソースを持っている。各リソースは、文字列またはorg.apache.hadoop.fs.Pathのインスタンスにより名付けられている。デフォルトでは、クラスパスから順に読み込まれるXMLファイルは下記の2つである。

  • hadoop-default.xml
    • このファイルは、Hadoopのデフォルト設定を含んでいる。例えば全体的な設定、ログ、I/O、ファイルシステムなどのプロパティなど。もしこれらの値を変えたいときは、Hadoop-site.xmlで設定を上書きする。
  • hadoop-site.xml
    • このファイルの設定により、値を設定できる。

リリースは、好きなだけ追加できる。追加していったものは、順に読み込まれる。Hadoop API documentationにaddResource()とaddFinalResourse()が紹介されている。addFinalResource()は、変更できないようなリソースを設定する関数である。
Analogは、toolインタフェースを実装している。このインタフェースは、コマンドラインからのオプション指定を扱う様々なメソッドをサポートしている。このインタフェースを使うと、run()メソッドを書く必要がある。このメソッドは、パラメータとして文字列の並びを引数として取り、Intを返す。Intは、実行が成功したかどうかを表わしている。
run()メソッドを書けば、mainメソッドでは、次のように書ける。

public static void main(String[] args) throws Exception {
       int res = ToolRunner.run(new Configuration(), new Analog(), args);
       System.exit(res);
}

org.apache.hadoop.util.ToolRunnerクラスは、Analog内で定義したrun()メソッドを起動する。ToolRunnerは、Toolインタフェースを実装しているクラスを走らすために使われる。このような仕組みによって、様々な入力オプションを取り扱うカスタムハンドラを書かなくて済む。
次にMapとreduceの記述部分。Analogでは内部で二つのクラスを書いた。下記の二つである。

  • Map
    • キーと値のペアを受け取り、キーと値のペアを1つ以上出力する機能を含む。
  • Reduce
    • 複数のMapから出力結果を集めて、集めたデータを出力する機能を含む。

AnalogのMapは下記のようになっている。

public static class MapClass extends MapReduceBase 
    implements Mapper<LongWritable, Text, Text, IntWritable> {
       public void map(LongWritable key, Text value,
       	              OutputCollector<Text, IntWritable> output,
		      Reporter reporter) throws IOException {
 	   String line = value.toString();
	   StringTokenizer itr = new StringTokenizer(line);
	   String tokens[] = new String[9];
	   for (int i = 0; i <= 8 && itr.hasMoreTokens(); i++) {
	       tokens[i] = itr.nextToken();
	   }

	   if (tokens[8] != null) {
	      word.set(tokens[8]);
	      output.collect(word, one);
	   }
   	}
}

mapはkey-valueペアを受け取る。keyはログファイル名、valueはログファイルの一行が入っている。文字列をスペース区切りでトークンに分け、9番目のトークン(ステータスコード)を取り出す。そして、keyをステータスコードvalueを1としたkey-valueのペアを作成する。OutputCollectorのインスタンスを用いて、作成したkey-valueペアをemitする。

次にReduce。Reduceは下記のようになっている。

public static class Reduce extends MapReduceBase
 implements Reducer<Text, IntWritable, Text, IntWritable> {
       public void reduce(Text key, Iterator<IntWritable> values,
       	      	   	  OutputCollector<Text, IntWritable> output,
			  Reporter reporter) throws IOException {
		int sum = 0;
		while (values.hasNext()) {
		      sum += values.next().get();
		}
		output.collect(key, new IntWritable(sum));
	}
}	      	       

最後に、設定したパラメータを読み込む。このパラメータは、MapReduceフレームワークに、key-valueがそれぞれどのような型になっているのか、MapとReduceすの名前は何か、をフレームワークに知らせる。これは下記のようにrun()メソッドで行なう。

public int run(String[] args) throws Exception {
   JobConf conf = new JobConf(getConf(), Analog.class);
   conf.setJobName("Analog");

まずorg.apache.hadoop.mapred.JobConfのインスタンスを作成する。このインスタンスは、設定を行なうものであり、Configureクラスを継承している。JobConfは、Hadoopフレームワークに実装したMapとReduceを転送する重要な役割を担っている。JobConfに適切な値を渡した後、runJob()メソッドを起動する。これは重要なメソッドでorg.apache.hadoop.mapred.JobTrackerクラスにある。JobClientは内部でorg.apache.hadoop.mapred.JobTrackerクラスとやり取りをしており、進行の追跡、ログのアクセス、クラスタのステータスの取得などの機能を使用できるようにしている。
 
このような形でAnalogをMapReduceアプリケーションとして作成した。

参考サイト

MapReduce programming with Apache Hadoop - このメモを書く際に「Writing a Hadoop MapReduce application」を参考にしました。