Posted by
okkez
Fri, 15 Jun 2007 16:05:00 GMT
行ってきました。
第16回 Ruby 勉強会@関西
RubyKaigi2007レポート
ちょっと参加者の数が少ないような気がしたので外に探しに行っている間に終わってた。「Ruby」っていう関数型言語の話が聞けたので良かったかなぁ。写真とかどれくらい使われたのか全然把握してない。
丸投げシリーズ: Ruby + Win32OLE + Adobe Illustrator
折紙で豆本を作るのはサービスが開始されたら実際に使ってみたい。何かのカンファレンスとかのときに配ると楽しそう。
Win32OLEは私も愛用してます。主に Excel に入力されたデータを加工してソースコードにするという感じです。
初級者向けレッスン
例外とメソッドについて。量は多かったけど、ほぼ時間通りに説明できたと思う。
今回もサカイさんに喋ってもらう。今回も漢字の読みを間違っていたので緊張していたのでしょう。演習課題はみんな出来ていたようで、今回の難易度設定はちょうどよかったみたいです。
スライド、配布資料、解答は明日か明後日くらいにアップします。
# 最近、妙に疲れてるのです。
30分で分かる継続の使い方
継続の使い方がやっとわかったような気がしました。けど、使わないだろうな。
というか恐くて使えない。
懇親会についてはmixiで。
Posted in Ruby |
Posted by
okkez
Wed, 06 Jun 2007 13:52:00 GMT
Haskell で書いたのを参考に書き直してみた。
なんとなく Haskell っぽくなった?
convert.erl
-module(convert).
-compile(export_all).
-import(lib_misc,[p/1]).
old_roman_unit(1000) -> "M";
old_roman_unit( 500) -> "D";
old_roman_unit( 100) -> "C";
old_roman_unit( 50) -> "L";
old_roman_unit( 10) -> "X";
old_roman_unit( 5) -> "V";
old_roman_unit( 1) -> "I".
i2r(Num) ->
lists:flatten(i2r(Num, [1000, 500, 100, 50, 10, 5, 1])).
i2r(_,[]) ->
[];
i2r(Num, [H|T]) ->
lists:duplicate(Num div H, old_roman_unit(H)) ++ i2r(Num rem H, T).
Posted in Programming, Ruby |
Posted by
okkez
Wed, 06 Jun 2007 12:16:00 GMT
ちょっとだけ改善してみたのでまた公開しておく。
コマンドライン引数を一つ受け取って10進数をローマ数字に変換してくれる。
使い方
$ runghc convert.hs 10 #=> X
$ runghc convert.hs 999 #=> DCCCCLXXXXVIIII
convert.hs
import System
import Numeric
main = do cs <- getArgs
let [(n,_)] = readDec $ head cs
putStrLn $ i2r n
old_roman_unit :: Int -> Char
old_roman_unit n
| n == 1000 = 'M'
| n == 500 = 'D'
| n == 100 = 'C'
| n == 50 = 'L'
| n == 10 = 'X'
| n == 5 = 'V'
| n == 1 = 'I'
| otherwise = 'Q'
i2r :: Int -> String
i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1]
i2r2 :: Int -> [Int] -> String
i2r2 _ [] = []
i2r2 n (u:us) =
replicate (n `div` u) (old_roman_unit u) ++ i2r2 (n `mod` u) us
Posted in Programming |
Posted by
okkez
Tue, 05 Jun 2007 16:47:00 GMT
意味があるかどうかわからないけど、なんとなく書いてみた。
戦略は Erlang の場合と同じ。なんとなく Erlang の時よりすっきりしている気がしなくもない。
convert.hs
main = putStrLn $ unlines $ map i2r [1..4999]
old_roman_unit :: Int -> Char
old_roman_unit n
| n == 1000 = 'M'
| n == 500 = 'D'
| n == 100 = 'C'
| n == 50 = 'L'
| n == 10 = 'X'
| n == 5 = 'V'
| n == 1 = 'I'
| otherwise = 'Q' -- 本当は例外?を投げたい気がする
i2r :: Int -> String
i2r n = i2r2 n [1000, 500, 100, 50, 10, 5, 1] []
i2r2 :: Int -> [Int] -> String -> String
i2r2 _ [] str = str
i2r2 n (u:us) str =
i2r2 (n `mod` u) us (str ++ replicate (n `div` u) (old_roman_unit u))
最後の行がちょっと微妙な気がする。誰か Haskell っぽく書くとこうなるってのを教えてくれるとうれしい。
今度逆も書いてみる。
Posted in Programming |
コメントはありません |
Posted by
okkez
Sun, 03 Jun 2007 00:22:00 GMT
昨日、帰宅後に書いた奴の逆バージョン。
D(500), L(50), V(5) が複数ある場合のチェックは抜けてるけど大体できたので書いておく。
to_integer
r2i(Str) ->
[H|T] = [1000, 500, 100, 50, 10, 5, 1],
{Matched, Unmatched} =
lists:partition(fun(X) ->
[X] =:= old_roman_unit(H) end, Str),
check(Str, Matched),
lists:sum(lists:map(fun({Num, L}) ->
Num * length(L) end,
r2i(T, Unmatched, [{H, Matched}]))).
r2i([], _, L) ->
L;
r2i([H|T], Str, L) ->
{Matched, Unmatched} =
lists:partition(fun(X) ->
[X] =:= old_roman_unit(H) end, Str),
check(Str, Matched),
r2i(T, Unmatched, [{H, Matched}|L]).
check(Orig, L) ->
if length(Orig) < length(L) ->
false;
true ->
case lists:all(fun({X,Y}) -> X =:= Y end,
lists:zip(lists:sublist(Orig,1,length(L)),L)) of
true -> true;
false -> throw('ArgumentError')
end
end.
自分で作った lib_misc:p/1 がかなり便利。Ruby の Kernel#p というか Ruby1.9 の Kernel#tap ぽく使える。
Erlang勉強会#1
Posted in Programming |
Posted by
okkez
Sat, 02 Jun 2007 16:50:00 GMT
Erlang 勉強会#1の宿題ができたので公開。
to_roman_numeral
-module(math).
-export([i2r/1,to_s/2]).
-import(lib_misc,[p/1]).
old_roman_unit(N) when N =:= 1000 -> "M";
old_roman_unit(N) when N =:= 500 -> "D";
old_roman_unit(N) when N =:= 100 -> "C";
old_roman_unit(N) when N =:= 50 -> "L";
old_roman_unit(N) when N =:= 10 -> "X";
old_roman_unit(N) when N =:= 5 -> "V";
old_roman_unit(N) when N =:= 1 -> "I".
i2r(Num) ->
[H|T] = [1000, 500, 100, 50, 10, 5, 1],
{Div, Mod} = {Num div H, Num rem H},
lists:flatten(i2r(Mod, T, to_s(old_roman_unit(H),Div))).
i2r(_,[],Str) ->
Str;
i2r(Num, [H|T], Str) ->
{Div, Mod} = {Num div H, Num rem H},
if
Div > 0 ->
i2r(Mod, T, Str ++ to_s(old_roman_unit(H), Div));
true ->
i2r(Mod, T, Str)
end.
to_s(C, Num) ->
if Num > 0 ->
lists:map(fun(_) -> C end,lists:seq(1,Num));
true ->
[]
end.
ダサい部分はたくさんあるけど自力で書いたのが偉いと思ったので公開。エラーメッセージの読み方がなんとなくわかってきたような気がする。
ついでに。
lib_misc
-module(lib_misc).
-export([p/1]).
p(X) ->
io:format("~p~n",[X]),
X.
こんな感じで使う。
関数の途中の値を知りたいときに使うと便利かも?
sample
to_s(C, Num) ->
if Num > 0 ->
lib_misc:p(lists:map(fun(_) -> C end,lists:seq(1,Num)));
true ->
[]
end.
Posted in Programming |
コメントはありません |
Posted by
okkez
Mon, 28 May 2007 15:07:00 GMT
なんとなく思い立って Haskell で書いてみた。
FizzBuzz と余り変わらない感じですね。
99 bottles of beer
main = putStr $ unlines [sing x | x <- reverse [1..1000]]
sing :: Int -> String
sing n = unlines [ (show n) ++ bottle n ++ " of beer on the wall"
,(show n) ++ bottle n ++ " of beer"
,"Take one down and pass it around"
,(show $ n - 1) ++ (bottle $ n - 1) ++ " of beer on the wall"]
bottle :: Int -> String
bottle n | n == 1 = " Bottle"
| otherwise = " Bottles"
Posted in Programming |
Posted by
okkez
Mon, 28 May 2007 10:54:00 GMT
Emacs で C-x r t や C-x r d で矩形編集できるのを知ったので(多分他にもある)xyzzyにもあるはずと思って探してみたらあったので .xyzzy に設定した。
.xyzzy
(global-set-key '(#\C-x #\r #\d) 'delete-rectangle)
(global-set-key '(#\C-x #\r #\t) 'string-rectangle)
他には kill-rectangle とか yank-rectangle とか設定すると便利そうな感じはしたけどちょうど割り当てたいキーがなかったので今回は見送った。
Posted by
okkez
Sat, 26 May 2007 02:03:00 GMT
Haskell
import System
main = putStr $ unlines [fb(x) | x <- [1..100]]
fb n | n `mod` 15 == 0 = "FizzBuzz"
| n `mod` 5 == 0 = "Buzz"
| n `mod` 3 == 0 = "Fizz"
| otherwise = show n
Erlang
-module(fizzbuzz).
-export([fizzbuzz/0,fb/1]).
fizzbuzz() -> [ fb(X) || X <- lists:seq(1,100)].
fb(N) when N rem 15 =:= 0 -> "FizzBuzz";
fb(N) when N rem 5 =:= 0 -> "Buzz";
fb(N) when N rem 3 =:= 0 -> "Fizz";
fb(N) -> N.
Erlang の方の動かし方。(インストールは略)
1> c(fizzbuzz.erl). %=> コンパイル
{ok,fizzbuzz}
2> fizzbuzz:fizzbuzz. %=> 関数呼び出しの括弧は必要
** 1: illegal expression **
3> fizzbuzz:fizzbuzz().
[1,
2,
"Fizz",
4,
"Buzz",
"Fizz",
7,
8,
"Fizz",
"Buzz",
11,
"Fizz",
13,
14,
"FizzBuzz",
16,
17,
"Fizz",
19,
"Buzz",
"Fizz",
22,
23,
"Fizz",
"Buzz",
26,
"Fizz",
28,
29|...] %=> リストの出力は省略される
4>
Posted in Programming |
コメントはありません |