Ruby勉強会@関西-16

ホタテフライとハンバーグ

に参加しています。B校舎かと思っていたらJ校舎でした。ちょー遅刻しました。右の写真は勉強会前に坂の下の「里」って喫茶店で食べたホタテフライとハンバーグの定食です。最近勉強会前には大概このお店でご飯を食べてるような気がします。
以下、個人的なメモです。
RubyKaigi2007レポート

  • ホーム感/アウェイ感
  • マスコット。まじろう。MDD(マスコット駆動開発)。
  • RejectKaigi。写真なし。
  • 質疑応答。
  • AP4R。まじろうしか記憶に残っていないのでは。
  • ムギチョコを食べながら開発合宿。
  • OSC2007@京都の話。
  • リジェクト会議で出せなかったネタ by うじひさくん。裏初級者レッスン。関数型言語Ruby構文解析が甘いのでシンタックスエラーは自分で検出すること。おまじない多し。return 1 if n == 1はパターンマッチ。関数を返す関数を作るのが関数型言語Ruby流。map。map[fib][1,2,3,4,5,6,7]。変数名・関数名は、大文字の方がいい。副作用のある式は、自分で使わないようにする。型推論は、.classでヒントがでる。

丸投げシリーズ: Ruby + Win32OLE + Adobe Illustrator

  • いきなりプレゼンを生成するデモ。
  • 紙をミニ本にする折り線を生成するデモ。
  • 志村さん。印刷会社でプログラマ。自動組版とか。折り紙。ちよちゃんのお父さん。ハロ。ハロ展開図。雪の結晶。蛙。猫。Rubyで。
  • はじまり。動物折り紙を作って欲しい。展開図が欲しい。折り方の説明が欲しい。後工程のためには、Adobe Illustratorが望ましい(イラストレータさんとかデザイナさんのために)。
  • Illustrator。最近はマクロに対応。いろいろなスクリプトに対応。VBすなわち、Win32OLEで動く。「北野勇作どうぶつ図鑑」にまとまった。ハヤカワ文庫JA
  • デモを書いたソース。Illustratorは、WIN32OLE.connectで繋ぐのがいいみたい(.newではなく)。rescue WIN32OLERuntimeError。ASRでダブルクリックした場合に、$0 == __FILE__が使えないのでクイックハックで回避。
  • ブログを本にしよう。というサービス。魔法使い成長日記? 手書きフォント。WebObjectsJava。サンプル企画。企画中。折り紙。ブログを投げるとPDFで展開図が返ってくる。リーダーが「俺には折れない」とのこと。
  • 参考サイト。Illustratorの自動化の本はあんまりない。イラレでべんり。
  • デモ。雪の結晶。角度変えただけの繰り返し。イラストレータによるとコピペで十分らしい。
  • デモ。LLDN 計算機。イラストレータ上で、<%= 1 + 2 * 3 %>。何故か動かなかった。
  • 質疑応答。
  • WindowsMacと両方で動くようにしたい。JavaScriptRubyは使えない。メッセージボックスができない。
  • タスクが残ったらどうするか? XPのどこかからタスクの一覧をとるコマンドラインツールが提供されているみたい。

Ruby初級者レッスン

  • okkezさん。最近関数型言語にはまっています。
  • サカイさん。世界不思議発見を見てからチェコスロバキアに行きたいです。
  • 今回のゴール。メソッド定義の仕方を知る。例外の使い方を知る。
  • 名前重要。
  • 末尾。まつを。
  • 全てのインストールされているRubyで実行する。出る例外が違っている場合がある。
  • 組込み関数。pは皆大好き。
  • アプリケーションはできればStandardErrorを継承して作る。
  • 今回のお題の回答は以下です。sendはeval系でNGのような気もしますが。そうか、fold[lr]1は、injectの引数なしだったのですね。勉強になりました。
#!/usr/bin/env ruby

class InvalidOperatorError < StandardError; end

def calc(op, *ns)
  if op != '+' and op != '-' and op != '*' and op != '/'
    raise("不正なオペレータです。`#{op}'")
  end
  if op == '/' and not ns[1 .. -1].all? {|n| n != 0}
    raise(ZeroDivisionError, '0で割られました。')
  end
  ns.inject {|r, n| r.send(op, n) }
end

if $0 == __FILE__
  args = ARGV.join(' ').split(/\s/)
  op = args.shift
  ns = args.map {|a| a.to_i }
  begin
    p calc(op, *ns)
  rescue => ex
    p ex
  end
end

Haskellの結果。

module Main (main) where

import System.Environment (getArgs)

calc :: String -> [Int] -> Int
calc _   [] = undefined
calc "+" xs = foldl1 (+) xs
calc "-" xs = foldl1 (-) xs
calc "*" xs = foldl1 (*) xs
calc "/" xs @ (_ : xs')
  | all (/= 0) xs' = foldl1 div xs
  | otherwise      = error "divided by 0."
calc _ _ = undefined

main :: IO ()
main = do
  args <- getArgs
  let (op : ns) = words $ head $ args
      ns'       = map read ns
  print $ calc op ns'

サイロスさんのレポート

  • 前夜祭。サイン会。いいなぁ。
  • ブーン。これするだけためだけに。

30分で分かる継続の使い方

  • Rubyを使わせたければ中高生相手に先手必勝だろう。ということでスターターキット。
  • 30分を20分に訂正。
  • 継続って何?
  • 順次実行...以外にワープがある。これがcallcc。
  • RPGセーブポイントに似ている。callccでセーブ。cc.callでロード。callccの返り値。
  • 継続は凄い!
  • 3重ループを1発で脱出。catch/throwでできる。throw : escape。
  • メソッドを少しずつ実行する。ゲームのイベント処理。wait_okをどのように実装すればよいか。ユーザからの入力をブロックしたくない(非同期処理)。状態遷移のプログラムを書くのも面倒。
  • 全探索を簡単に。あるマンションに5人の男が住んでいる。。。普通はループにする。callccを使うとListモナドぽくなる。前田さんの日記にあるみたい。
  • eachを「少しずつ」回す。C++風のイテレータ。require 'generator'(標準添付)。Hashでもできる。一回回すごとにセーブする。pppというライブラリ。pデバッグの時に変数名を自動で付けられないか。ppp :x。呼び出し元のbindingが欲しい。非常に魔術的。set_trace_func、eval、callccの3つがでてきている。1.8.5以降だと動かない。需要はないのか。
  • 継続は危い!
  • バグの原因になりやすい。
  • 油断するとRubyが落ちる。2回freeされるなど。
  • 継続を使うと「スパゲッティプログラム」が書ける。
  • 他人に読めないコードになりやすい。callccは見えないところに。継続は楽しい。でもバグの原因になりやすい。

二次会

  • 琵琶湖開発合宿。6月末。奇跡的に身体が空いています。参加する方向で調整します。と、その前にHIGHER ORDER PERLを買わなきゃ。紀伊国屋が安いらしい。
  • 首から下げてたちっちゃいハーモニカ吹いた。「聖者の行進」です。意外とウケてたように思います。ちょっとうれしい。