Tuesday, December 29, 2009

erlang lists:seq()を書いてみた

末尾再帰ではないですが


-module(seq).
-compile(export_all).

seq(X) -> seq(0,X,1).
seq(X,Y) -> seq(X,Y,1).

seq(X,X,_Z) -> [X];
seq(X,Y,Z) when X > Y , Z > 0 -> [];
seq(X,Y,Z) when Z > 0 -> [X | seq(X+Z, Y, Z)];
seq(X,Y,Z) -> lists:reverse(seq(Y, X, -1 * Z)).


でもこれだとX,Y,Zが整数かどうかしらべてやってないのでよろしくないとおもうので
is_Integer(X)をいれて判定、通らなければエラーで落ちる
もしZが正ならそのままseq_calを計算、負なら逆さにしてseq_calしてリバース

判定をしてからseq_calに処理を丸投げしました。


-module(seq).
-compile(export_all).

seq(X) when is_integer(X) -> seq_cal(0,X,1).
seq(X,Y) when is_integer(X),is_integer(Y) -> seq_cal(X,Y,1).
seq(X,Y,Z) when is_integer(X),is_integer(Y),is_integer(Z) ->
case Z > 0 of
true -> seq_cal(X,Y,Z);
false -> lists:reverse(seq_cal(Y, X, -1 * Z))
end.

seq_cal(X,X,_Z) -> [X];
seq_cal(X,Y,_Z) when X > Y -> [];
seq_cal(X,Y,Z) -> [X | seq_cal(X+Z, Y, Z)].




そうすると四つ目の引数に手続きを食わせるとか
つくってみたり。


seq(X,Y,Z,F) ->
lists:map(F,seq(X,Y,Z)).

結果
> seq:seq(1,5,1,fun (X) -> X+10 end).
[11,12,13,14,15]


reverseは遅いですね
そして末尾再起でもないし
書き直して比べてみよう

Sunday, December 27, 2009

julius 4.1.4 on OSX 10.6.2 (snow leopard) 入れました



Julius は,音声認識システムの開発・研究のためのオープンソースの 高性能な汎用大語彙連続音声認識エンジンです(http://julius.sourceforge.jp/ より抜粋)

こんな時間になってしまいました。
普通に入れようとしても入りませんでしたのでエントリーします。

jurius4.1.4 のjurius-4.1.4.tar.gzを
ダウンロードしておきます。

それでは、10.6.2へjurius4.1.4を入れていきましょう。
うまくいけばこんなことができます





web上にある情報の殆どがOSX10.5でのインストールデモだったので
苦戦しました。

インストールしてもマイクの入力をひろってくれません。
マイク入力を使うためにはPortAudioが必要だそうです。

PortAudio
Stable Releases
pa_stable_v19_20071207.tar.gz is current V19 posted December 7, 2007
をダウンロードしてきました。

こちらのインストールもチュートリアルをみるとOSX10.4,10.5対応で、
OSX10.6についての対応は書かれていません。

ここではアーキテクチャを選択してconfigureして通りました。


$ env CFLAGS='-arch i386' ./configure


---------
これでjuliusをいれれば動くはずですが

参考させていただいたぺーじで
libsndfileを入れていたので

./configure
$ make
$ sudo make install

でいれました。ここをとばしてもうまく行きそうですので
飛ばしてやってみてください。その結果を教えていただけるとたすかります。

---------

PortAudioが入った状態で
jurius-4.1.4へいきconfigureします

こちらもPortAudio同様 i386アーキテクチャーでconfigureしないと
juliusがportAudioを呼び出したときにエラーを吐いて落ちてしまいました。
以下の要領でインストールします。


$ env CFLAGS='-arch i386' ./configure --enable-words-int --with-mictype=portaudio --disable-zlib
$ make
$ sudo make install


これで入ったはずです。
ディクテーションを実行するためにはdictation-kitのjconfファイルが必要ですので

dictation-kitバージョン4.0 のdictation-kit-v4.0.tar.gz
をダウンロードします。

解凍してなたなかにあるfast.jconfをjulius実行時に指定します
そのまま実行すると文字化けするので文字コードを指定してください


$ julius -C fast.jconf -charconv EUC-JP UTF-8


以上です。

<<< please speak >>>
と出たあとに「わたしは まいにち こーひーをのむ」というと

pass1_best: 私 は 毎日 後期 五 飲む 。
sentence1: 私 は 毎日 、 コーヒー を 飲む 。

といった感じでディクテーションしてくれます。
感動しました。


Hena Hena Nikki を参考にさせていただきました。

Tuesday, December 08, 2009

Erlang Super Lite #3

ex2だけ予習した、ごめんなさい


%% ex2.erl
-module(ex2).
-compile(export_all).

create(N) ->
create_acc(N, []).

create_acc(N, L) ->
case N of
0 -> L;
_ -> create_acc(N-1,[N|L])
end.

reverse_create(N) ->
case N of
0 -> [];
_ -> [N|reverse_create(N-1)]
end.



メモ
%% cons | とappend ++
%% ==, /=, =:=, =/=, =<, >=
%% _hoge アンスコ変数
%% _ ワイルドカード
%% 変数は大文字から


メモ
%% case
%% if : あまりつかわない
%% ガード
%% パターンマッチ
%% ユーザ関数使用不可
%% BIF(ビルトインファンクション)
%% Access(hd, tl, length, ..)
%% 型変換(round, float, ...)
%% apply/3
%% I/O(get_line, read, write, format, ...)


メモ
%% try~catch
%% パターンマッチ
%% _:_ ->
%% throw
%% Debugger
%% > c(Module, [debug_info])


メモ9章に飛んで
%% 無名関数fun() -> ... end
%% lists:map(fun(X) -> X*2, Xs)
%% List内包
%% [Expression || Generators, Guards, Generators, ...]
%% [{X, Y} || X <- [1, 2, 3], Y <- [4, 5, 6]]
%% qsort