日々のメモ書き
Debian Developerが綴るメモ
レコード構文とアズパターン
調べても結構使い方を書いてないな…。
data B = B { x ::String, y ::String } update_b2 bb@B{} = bb{x ="ccc"} update_b3 bb@B{x=x2} = bb{x =x2 ++ "ccc"} update_b4 bb@B{y=y2} = bb{x =y2 ++ "ccc" } main = do let b = B { x = "aaa", y = "bbb"} b2 = update_b2 b b3 = update_b3 b b4 = update_b4 b putStrLn $ x b putStrLn $ y b putStrLn $ x b2 putStrLn $ y b2 putStrLn $ x b3 putStrLn $ y b3 putStrLn $ x b4 putStrLn $ y b4
実行結果
aaa bbb ccc bbb aaaccc bbb bbbccc bbb
gtk2hs - timeout
timeoutAddで定期処理のテスト
module Main where import Control.Monad.Trans(liftIO) import Graphics.UI.Gtk main = do initGUI window <- windowNew windowSetDefaultSize window 640 400 on window deleteEvent (liftIO $ do mainQuit return False) widgetShowAll window timeoutAdd (putStrLn "Hello" >> return True) 1000 mainGUI
祝・女子五輪出場
まあリーグ戦なんだからあんなもんだよねー。ロスタイムに同点にされたときにはその場はさすがにショックだが中国が二連勝するほど強いチームだったらこんな戦績なわけねーからとほぼ安心していたら。中国は最初の10分だけだったな。オーストラリア戦の内容だったら最終戦は控えを中心にしても十分やれる程度の相手だし選手の見極めに使える。1位も2位も関係ないんだから。
北朝鮮戦はひどい内容だったな。最後の試合の終わらせ方もひどい。クリアをタッチに蹴り出せ蹴り出しもせずに相手に取られてってなんじゃこりゃですよ。85分でキープに入ったのは結果論だからなんとも言えないが。まだまだ難しいですな。
カレログ
昔携帯アプリの開発をしたことがあって携帯のGPSのデータが取れるということで遊んだことがあったがアプリが勝手に送信できるようになったらいろいろできておもしろいねー(そのころは技術的に不可能だった)などという話をしたこともあったが本当にやってしまうというかできるようになるとは時代も進んだねーおじさんついてけないよー(棒)というどうでもいい感想である。
ウズベキスタン戦
- 驚くほど選手のコンディションがボロボロ
- おかげで守備というか1対1がボロボロ
- あとはぐだぐだ。阿部のアンカーが悪かったのかどうかすらわからん。
- なんとか同点頑張った。ここが強さか。アウェーで引き分けでまずまず大丈夫か。
- よく考えたら前回WC出場国とアジアカップベスト4が同じ組にいるってきついな。
- 本田がいて前線でキープしてくれるとやっぱりありがたいのだ。
- ウズベキスタンのロングシュートはほぼ明後日の方向に飛ぶのでありがたかった。
- 川島様ですな。
- 審判普通だったね
gtk2hs - key event
キーイベントを拾った上でキーで操作できるようにした。コールバックの中でデータを変更する方法する作法がわからないMVarを使ったけどそれでいいの?命令的な書き方でいいのかどうか…。うーん、わからない。
module Main where import Graphics.UI.Gtk import Graphics.Rendering.Cairo import Control.Monad.Trans(liftIO) import Control.Concurrent.MVar main = do initGUI mv <- newMVar (0,0) window <- windowNew widgetSetSizeRequest window 640 400 on window exposeEvent $ exposeHandler mv on window keyPressEvent $ tryEvent $ onKeyboard window mv on window deleteEvent (liftIO $ do mainQuit return True) widgetShowAll window mainGUI exposeHandler mv = do drawWin <- eventWindow liftIO $ do val <- readMVar mv renderWithDrawable drawWin $ do rectangle 50 50 100 100 fill setSourceRGB 1 0 0 arc (200+(fst val)) (200+(snd val)) 30 0 (1 * pi) fill stroke return True onKeyboard window mv = do keyName <- eventKeyName [] <- eventModifier liftIO $ case keyName of "r" -> putStrLn "Key r pressed!" "a" -> do modifyMVar_ mv (\x -> return ((fst x)-1, snd x)) widgetQueueDraw window "d" -> do modifyMVar_ mv (\x -> return ((fst x)+1, snd x)) widgetQueueDraw window "w" -> do modifyMVar_ mv (\x -> return ((fst x), (snd x)-1)) widgetQueueDraw window "s" -> do modifyMVar_ mv (\x -> return ((fst x), (snd x)+1)) widgetQueueDraw window _ -> putStrLn "Other key pressed!"
IOrefを使ったバージョン。今の自分のHaskellの知識ではこれが精一杯。
module Main where import Graphics.UI.Gtk import Graphics.Rendering.Cairo import Control.Monad.Trans(liftIO) import Data.IORef main = do initGUI mv <- newIORef (0,0) window <- windowNew widgetSetSizeRequest window 640 400 on window exposeEvent $ exposeHandler mv on window keyPressEvent $ tryEvent $ onKeyboard window mv on window deleteEvent (liftIO $ do mainQuit return True) widgetShowAll window mainGUI exposeHandler mv = do drawWin <- eventWindow liftIO $ do val <- readIORef mv renderWithDrawable drawWin $ do rectangle 50 50 100 100 fill setSourceRGB 1 0 0 arc (200+(fst val)) (200+(snd val)) 30 0 (1 * pi) fill stroke return True onKeyboard window mv = do keyName <- eventKeyName [] <- eventModifier liftIO $ case keyName of "r" -> putStrLn "Key r pressed!" "a" -> do modifyIORef mv (\x -> ((fst x)-1, snd x)) widgetQueueDraw window "d" -> do modifyIORef mv (\x -> ((fst x)+1, snd x)) widgetQueueDraw window "w" -> do modifyIORef mv (\x -> ((fst x), (snd x)-1)) widgetQueueDraw window "s" -> do modifyIORef mv (\x -> ((fst x), (snd x)+1)) widgetQueueDraw window _ -> putStrLn "Other key pressed!"
予選第一戦
男女とも。
女子は今まで控え選手中心だったからというのもさらにつらくしているか。一点入れば調子に乗るんだろうけど。ちょっとそのあたりは残念だったけど。
男子。北朝鮮が引き分け狙いの最善の手を頑張ってきたというところか。ちょっとお上品なプレーが多かったか。前線でキープとかドリブル突破とか。本田がいない部分をカバーできてなかったか。内田のクロスが明後日に飛ぶのはなんとかならんのか?昔と比べると北朝鮮相手にこんだけ一方的に押し込めるようになったというのは点差以上の進歩を感じる。テコンドーをする南半分とは違って北朝鮮はまともなサッカーやってくれるね。
gtk2hs + Cairo
Cairoでdrawing。monadがどうのとかいう話があって理論面ではややこしいが真似して書いてそのうち理解できるかな?一つのサンプルをそのままコピペできずにいろいろ繋ぎあわせるので頭を使う。
module Main where import Graphics.UI.Gtk import Graphics.Rendering.Cairo import Control.Monad.Trans(liftIO) main = do initGUI window <- windowNew widgetSetSizeRequest window 640 400 on window exposeEvent $ do drawWin <- eventWindow liftIO $ do putStrLn "expose" renderWithDrawable drawWin $ do rectangle 50 50 100 100 fill setSourceRGB 1 0 0 arc 200 200 30 0 (1 * pi) fill stroke return True on window deleteEvent (liftIO $ do mainQuit return False) widgetShowAll window mainGUI
gtk2hs
次はHaskellでGTK+をやるぞと思ったものの結構ややこしいので基礎から調査。
module Main where
import Control.Monad.Trans(liftIO) import Graphics.UI.Gtk main = do initGUI window <- windowNew windowSetDefaultSize window 640 400 -- onDestroy window mainQuit
on window deleteEvent (liftIO mainQuit >> return False) widgetShowAll window mainGUI
普通にウィンドウが表示されます。 イベントの扱いが昔の資料の書き方はdeprecated。liftIOなんか使うのか。
module Main where import Graphics.UI.Gtk main = do initGUI window <- windowNew button <- buttonNewWithLabel "Hello World" onClicked button (putStrLn "Hello World") -- onClicked button $ do -- putStrLn "Hello World" containerSetBorderWidth window 10 containerAdd window button onDestroy window mainQuit widgetShowAll window mainGUI
ボタンがつきます。コメント内は昔の実装。いまはdeprecated扱い。なんとなくわかった。
北アルプス縦走メモ
わりとどうでもいい話。
- みんなザックカバー使ってんな。防水袋で対処したけど。防水袋も上から濡れてきたとかやな話はあったけど。何が悪かったんだろう。濡れるととにかく大変。
- やたらとみんなでかくて軽そうなザックが多い。小屋泊まりでしょ?60リットルよりでかいザックでおばやんが片手で持てる荷物って一体何を持ってきてるんだ。
- 中高年多いね。17時半から槍に登ろうとする無謀なおばやんもいたな。
- 夏の縦走は水の心配ばかりしなきゃいけないのが嫌いだ。本当は小屋に頼りたくなかったが小屋で買ってしまった。雨の日が多かったからまだましでこれで毎日晴れていたら大変だな。沢は水の心配だけはしなくていいのは楽だ。
- テント内でガス炊くのも平気になったな。火事には気をつけましょう。
- 一度歩くと山域の位置関係とか大体わかるようになるもんだ。
- 常念岳の登山道のちょっと外れた岩の間にペーパーがつっこんであった。蝶ヶ岳の山頂の外れにも…。