Rubellum fly light

ほぼPHP日記

Play framework with Scalaのデモでハマった

ふとScalaでWebアプリケーション作りたいなーと思ったので、Play frameworkをいじってみることに。
チュートリアルを参考にしてたのですが、いろいろハマったのでメモ。
とりあえず初期のプロジェクトが動作するところまでです。
(あと正直よくわからないことが多いので、とりあえずぼくはこれで動いたよってスタンスです)

環境

OS Arch Linux
Scala 2.9.1-1 (pacmanで確認)
Play framework 1.2.4-9 (yaourtで確認)
Scalaモジュール 0.9.1

インストール

$ sudo pacman -S scala
$ sudo yaourt install -S playframework
$ sudo play install scala-0.9.1  # 「〜 install scala」だけだと上手く動かなかった

「$ play install scala」だと、(現状では)バージョンが「0.9.0」のモジュールがインストールされるみたい。
これだと上手く動かないので「0.9.1」を指定してインストールする。

プロジェクト作成

$ play new hello --with scala-0.9.1  # helloはアプリケーション名
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /home/lib2/www/hello
~ What is the application name? [hello] 
~
~ Resolving dependencies using /home/lib2/www/hello/conf/dependencies.yml,
~
~ 	play->scala 0.9.1 (from playLocalModules)
~
~ Some dependencies have been evicted,
~
~	play 1.2.2 is overriden by play 1.2.4
~
~ Installing resolved dependencies,
~
~ 	modules/scala-0.9.1 -> /usr/share/playframework-1.2.4/modules/scala-0.9.1
~
~ Done!
~
~ OK, the application is created.
~ Start it with : play run hello
~ Have fun!
~

なんか1.2.2のフレームワークがほしいけど1.2.4がインストールされてるからそれ使うねって言われてるような気がするが、結果動いたのでよしとする(ぇ

プロジェクト起動

$ cd hello
$ play run

ポート9000番で起動します。
初回のアクセス時にはコンパイルなどが行われるので、起動がちょっと遅いです。
あと、自動で作成されたプロジェクトには間違いがあるので、Template execution error
が出ると思います。
起動自体はできているので、実際にアクセスしてみると綺麗にエラー箇所を表示してくれます。

f:id:rubellum:20120310175419p:image:w640


エラーメッセージ(上のやつから要約したもの)。

Template execution error
Execution error occured in template /app/views/main.scala.html: No route found

In /app/views/main.scala.html (around line 9)


どうやらテンプレートファイル(app/views/main.scala.html)に記述されているjqueryのバージョンが、実際に存在するものとで違っているようです。
(追記:もしかして Playの1.2.2 or 1.2.4, scalaモジュールの0.9.0 or 0.9.1 の整合性がおかしくなってる…?)


調べてみると、1.6.4が用意されています(バグ?)。

$ ls public/javascripts
jquery-1.6.4.min.js


そのため、テンプレート(app/views/main.scala.html)のソースコードを「1.6.4」に書き換えます。

@@ -6,7 +6,7 @@
-        <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script>
+        <script src="@asset("public/javascripts/jquery-1.6.4.min.js")" type="text/javascript"></script>


再度アクセスしなおすと、うまく表示できると思います。

f:id:rubellum:20120310175418p:image:w640

感想

htmlの参照するjsファイルがないのをエラーで表示できるのすごい。
以前Liftをいじったときより(デモの時点では)簡単だなーという印象を受けた。
まだ初期のデモプロジェクトしかいじってないので、とりあえず矢部がんばる。

あとScala書くときってエディタ何がいいんだろか。
いまemacsなんだけど。

新・Togetterのまとめをはてなダイアリーに丸投げ(引用)するブックマークレット

以前作ったTogetterのまとめをはてなダイアリーに丸投げ(引用)するブックマークレットが動かなくなったので直しました。
不具合確認をほとんどしてないので、問題あったら言ってくだしあ。


Hatena::Letが動かない…(*´Д`)
ので、リンク先の「Togetter 引用」をブックマークしてください。
ブックマークレット詳細のページに飛ぶ


ソースコード

/*
 * @title Togetter 引用
 * @description トゥギャりをはてダに投げます。getElementsByClassName()を使ってます。意外とやっつけです。Ver:2011/11/28
 * @include http://togetter.com/li/*
 * @license MIT License
 * @require 
 */

(function (option) {
	var i;
	var body = ">" + window.location.href + ":title>\n";
	var els = document.getElementsByClassName("balloon_module");
	var items = [];
	for (i = 0; i < els.length; i++) {
	    if (els[i].id !== "") {
	        items.push(els[i].id.match(/[.]*_([0-9]+)$/)[1]);
	    }
	}
	for (i = 0; i < items.length; i++) {
	    body += "twitter:" + items[i] + option + "\n";
	}
	body += "<<";
	window.location.href="http://d.hatena.ne.jp/edit?appendbody="+encodeURI(body);
})(":detail");

ArchLinux(on VirtualBox)にGuest Additionsをインストール

VirtualBox上のArchLinuxにGuest Additionsをインストールしたときのメモ。


※自分でいうのもアレですが、この記事は非常に怪しいです。。。


メニューから「Guest Additions」をインストール!
と意気揚々とインストールしてみたものの、ウィンドウの大きさを変えても中のGNOMEが大きさを変えてくれないという問題が。
公式Wiki通りにインストールしてもうまくいかなかったので、以下その対処メモ。
(ただし、途中でごにょごにょインストールしまくった結果動いたので、この方法は最短距離ではないと思われます)

インストール

$ sudo pacman -S virtualbox-archlinux-additions
$ sudo pacman -S virtualbox-modules  # 要らないかも?
$ sudo pacman -S virtualbox-archlinux-modules

/etc/rc.confを修正。

MODULES=(... vboxguest vboxsf vboxvideo)
...
DAEMONS=(... vbox-service)

これでウィンドウサイズを変更すると同時にデスクトップ画面の大きさも変わるようになった。

Ubuntu(11.04)にmikutterをインストールした(RVM)

今までLinuxTwitterクライアントとしてSaezuriやTweetDeckを使っていたのですが、
Linux版のAdobe AIRのサポートが終了してしまったため、新たにクライアントを探すことに。
いろいろ探してみた結果、mikutterが良い感じだったのでインストールしたよ、というお話。

環境

OS:Ubuntu 11.04 (64bit)
Ruby: ruby 1.9.3-p0 (RVM)


mikutterのHPでは、Rubyの動作条件が「1.8.7 or 1.9.1 or 1.9.2」となっていますが、
1.9.3でもたぶんきっと絶対なんとかなるでしょう。

インストール

RVMのインストールは省略します。


gtk2をインストール。

$ sudo apt-get install libgtk2.0-dev


gtk+(gem)をインストール。

$ gem install gtk+


mikutterをダウンロード。
安定版はそんなものなかった状態なので、最新の不安定版をダウンロード。
mikutter
解凍して「ruby mikutter.rb」で実行。
インストーラ? なんですか、それ。


ランチャーに登録したかったのですが、やり方がよくわからなかったので、
いちいち端末から実行しています。

さいごに

mikutterはソースコードもエンターテイメントですね!

au版iPhoneのezwebメールで即受信通知する方法

au版iPhoneではezwebメールの受信間隔が最大で15分程度ある。
そこでもっとはやく通知できる方法をないかなぁと探してみた(メールとか別に来ないんですけどね、はぁ…)。
んでどうやら「ezwebメールをBoxcarの通知用メールアドレスに自動転送して通知する方法」が簡単かつ早かったので(10秒かからないくらい)、以下そのやり方。

方法

Boxcarの設定

AppStoreから「Boxcar」で検索してインストール。
起動したら「Add a Service」を選択。
「Email Account」を選び、特に何もせず右上の「Save」。
「My Email」を選択し、右上の「Edit」ボタンを押す。
メニューの「Your Forwarding Address is:〜」に書かれているメールアドレスを覚えておく。

ezwebメールの自動転送設定

次に自動転送の設定。まずメール設定のアドレスを取得する。
iPhoneアプリの「メッセージ」(SMS?)で「#5000」宛に本文「1234」で送信。
するとURLが送られてくるのでアクセス。
このときWi-fiで接続してると「ページが開けません」と出てくるので3Gで接続しましょう。
ページを開いたら以下の通りにすすめる。
「メールアドレス変更・その他の設定」→「自動転送先」→暗証番号の入力(買ったときに書いたアレ)→フォームに先ほどのBoxcarのアドレスを入力し「送信」→完了画面。


以上です。
てけとうにメールを送信して確認してみてください。

さいごに

この方法だとBoxcar側に全部メールが転送されるので、国家機密バリのメールを受信する人は注意が必要ですね><

2011年10月に読んだ本

小説

10/1 告白
 登場人物の告白という形(回想チック)なのでスイスイ読めて、しかも面白かった。
 教室にあるはずの平和な日常が全然ないよこの学級。
10/14 とある飛空士への追憶
 次期女王の姫さまと一介の飛空士による長距離飛行。
 このせっていだけでよだれがじゅるり。
 展開はオーソドックスだったなぁ。
10/16 ジウ
 文庫3冊の重量級。ひたすらバイオレンス。
 歌舞伎町がアレします。
10/30 シャングリ・ラ
 超おもしろい。
 後半の超展開が超展開すぎて超展開。
 特に小夜子さんの活躍がマジぱねぇ。
 あと美邦こえぇ。

BrainfuckでGPGPU!

GPGPUできるBrainfuckをCUDAで実装してみました。
このBrainfuckを使用すると、SIMDな並列演算を行うことができます。
並列演算用の命令を2つ追加してるので純粋なBrainf*ckではないですね、はい。

拡張命令

記号を2つ追加しました。

記号 説明
{ 並列演算の開始.ポインタの指す要素分だけスレッドを用意
} 並列演算の終了

大雑把な説明

基本的に中括弧で囲まれた命令が並列実行されます。

+++{+ー+}>.  # 「+-+」が並列に実行されます

「{」命令が実行されると、ポインタが指している要素の値分だけスレッドが用意されます。

↓           
+++{+ー+}>.  |→0|0|0|0|

 ↓          
+++{+ー+}>.  |→1|0|0|0|

  ↓         
+++{+ー+}>.  |→2|0|0|0|

   ↓      
+++{+ー+}>.  |→3|0|0|0|  この場合3個のスレッドで実行するよ!

並列演算の実行時にスレッドが作られ、スレッドごとにメモリが用意されます。
このメモリはGPU上のメモリで、メインメモリからは独立してます(デバイスメモリ)。
メモリの先頭にはスレッドIDが格納されます。
スレッドIDとは「0〜スレッド数-1」の通し番号でスレッドを識別するものです。

↓    スレッドID=0  |→0|0| スレッドごとにメモリが用意される
↓    スレッドID=1  |→1|0|  先頭にはスレッドIDが格納
↓    スレッドID=2  |→2|0|
+ー+}  

スレッドは並列に実行されます。
「}」は終了マークです。

              
↓    スレッドID=0  |→0|0|
↓    スレッドID=1  |→1|0|
↓    スレッドID=2  |→2|0|
+ー+}

              
 ↓   スレッドID=0  |→1|0|
 ↓   スレッドID=1  |→2|0|
 ↓   スレッドID=2  |→3|0|
+ー+}

              
  ↓  スレッドID=0  |→0|0|
  ↓  スレッドID=1  |→1|0|
  ↓  スレッドID=2  |→2|0|
+ー+}

              
   ↓ スレッドID=0  |→1|0|
   ↓ スレッドID=1  |→2|0|
   ↓ スレッドID=2  |→3|0|
+ー+}

命令は共通の領域に保存されていますが、スレッドごとに違う命令も実行できます。

↓    スレッドID=0  |4|7|  こんな状況でもOK
 ↓   スレッドID=1  |5|8|
  ↓  スレッドID=2  |6|9|
+++

最終的にポインタが指している値をメインメモリにスレッドID順でコピーします。

              
   ↓ スレッドID=0  |→1|0|
   ↓ スレッドID=1  |→2|0|
   ↓ スレッドID=2  |→3|0|
+ー+}

# 並列演算の終了後

+++{+ー+}>.  |→3|1|2|3|  スレッド数の後ろに結果(1,2,3)がコピーされる.

あとはよしなに結果を使います。

実行例

一応簡単なサンプルコードだけ。
CUDAを使っているので、実行するにはNVIDIAのグラフィックボードが必要になります。

1. abcと出力するプログラム。

3個のスレッド(ID=0, 1, 2)に対して、中括弧内で97(10*10-3, つまり'a')を足してます。

+++{>++++++++++[<++++++++++>-]<---}.>.>.>.
abc
2. 'a'〜'z'を表示するプログラム。

スレッドを26個用意→スレッドIDに'a'(97)を足す→出力。

>>+++[<+++++++++>-]<-{>>+++++++++[<++++++++++>-]<+++++++<[>+<-]>}[>.[-]<[->+<]>-]

内部、CUDA的なお話

疲れてきたので簡単な説明だけで許してくださいごめんなさい(オイ。
というか途中でいろいろ面倒になって実装自体がアレな事になってます(オイオイ。


スレッドブロックは1つしか使ってません。
スレッド数は(n, 1, 1)で実行されます。

// CUDAで例えるとこういうこと
dim3 grid(1,1);
dim3 block(n, 1, 1);

並列演算時のメモリはシェアードメモリです。
1次元配列ですが、2次元配列的に使ってます。
「スレッド数×スレッドあたりの最大メモリ(とりあえず32にしてある)」です。
メモリは縦に使っていきます。

 0 1 2 … n-1 ←スレッドID
↓↓↓ 下向きに進んでいく
|0|1|2|…|n-1|  memory[threadId][0]
|0|0|0|…| 0 |    memory[threadId][1]

メモリを縦に使うことにした理由は、(繰り返しの命令([ ])がなければ)アクセスする要素が連続した場所になるため高速になるだろうと考えたからです。
(シェアードメモリでは関係ないかも)

ソースコード

githubに置いておきました。
もうギブハラ(Github・ハラスメント)も怖くない!
https://github.com/rubellum/cuda-brainfuck

おわりに

最近はGPGPUってあんまり言わないらしい(GPUコンピューティング?)。
正直、実装するよりBrainf*ckのコード考えたり、ブログに説明を書いたりする方が大変でした。