RSS

日々のメモ書き

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時半から槍に登ろうとする無謀なおばやんもいたな。
  • 夏の縦走は水の心配ばかりしなきゃいけないのが嫌いだ。本当は小屋に頼りたくなかったが小屋で買ってしまった。雨の日が多かったからまだましでこれで毎日晴れていたら大変だな。沢は水の心配だけはしなくていいのは楽だ。
  • テント内でガス炊くのも平気になったな。火事には気をつけましょう。
  • 一度歩くと山域の位置関係とか大体わかるようになるもんだ。
  • 常念岳の登山道のちょっと外れた岩の間にペーパーがつっこんであった。蝶ヶ岳の山頂の外れにも…。

< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 >