長野に遊びにきた

流れで、長野で年越しをすることになった。獺祭久しぶりに飲んだわ。

1356901647

ひたし豆

1356901645

わらび

1356901640

つけもの。奈良漬けが美味しかった。

1356901641

きりたんぽ。鶏が重要なファクター

1356901644

YesodのWidgetsとMessage

Yesodを使ってみて混乱したのがどこまでがHamletの構文でどこからがYesodの拡張なのだろうかというあたり。

WidgetsはYesodで追加された仕組みで、whamletとか^{footer}といった記法もYesodのものだと理解した。ついでにCore見て確認しておいた。

{-# LANGUAGE OverloadedStrings, TypeFamilies, TemplateHaskell,
             QuasiQuotes, MultiParamTypeClasses #-}
import Yesod

data Messages = Messages

mkYesod "Messages" [parseRoutes|
/            RootR       GET
/set-message SetMessageR POST
|]

instance Yesod Messages where
  defaultLayout widget = do
    pc <- widgetToPageContent widget
    mmsg <- getMessage
    hamletToRepHtml [hamlet|
$doctype 5
<html>
  <head>
    <title>#{pageTitle pc}
    ^{pageHead pc}
  <body>
    $maybe msg <- mmsg
      <p>Your message was: #{msg}
    ^{pageBody pc}
|]

instance RenderMessage Messages FormMessage where
  renderMessage _ _ = defaultFormMessage

getRootR :: Handler RepHtml
getRootR = defaultLayout $ do
  setTitle "My Page Title"
  toWidget [lucius| p { color: red; } |]
  toWidgetHead [hamlet| <meta name=keywords content="session sample">|]
  [whamlet|
<form method=post action=@{SetMessageR}>
             My Message is: #
             <input type=text name=message>
             <input type=submit>
|]

postSetMessageR :: Handler ()
postSetMessageR = do
  msg <- runInputPost $ ireq textField "message"
  setMessage $ toHtml msg
  redirect RootR

main :: IO ()
main = warpDebug 3000 Messages

Wisgetsのようにjs,css,htmlをまとめて管理できる仕組みはいいかもと思う反面、デザイナーとの分業って難しくなるんじゃないのかなぁと思うんだけどどうなんだろ?僕の場合は全部独りでやるからこういう仕組みのほうがあってるかなと思うんだけど。

それからcssの設定とか競合しないもんかね?

ProductName Developing Web Applications With Haskell and Yesod
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )


BlazeHtmlを使ってみた

高速だと言われているBlazeHtmlのチュートリアルをトレースしてみた。

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad (forM_)
import Text.Blaze.Html5 
import qualified Text.Blaze.Html5 as H
import Text.Blaze.Html.Renderer.String

numbers :: Int -> Html
numbers n = docTypeHtml $ do
            H.head $ H.title "BlazeTest"
            H.body $ do
              p "A list of natural numbers:"
              ul $ forM_ [1 .. n] (li . toHtml)

main :: IO ()
main = putStrLn $ renderHtml $ numbers 5

あれ、このヒトってHakyllの作者じゃないか。

APIドキュメント見たら、やはりHakyll.Web.Blazeで使えるようになっていた。

shakespeare-textで値を文字列に埋め込む

Shakespearean Templatesを読んでいてHTML,CSS,Javaxcriptじゃなくてふつうの文字列でもデータ埋め込みが出来ることを知った。

{-# LANGUAGE QuasiQuotes, OverloadedStrings #-}
import Text.Shakespeare.Text
import qualified Data.Text.Lazy.IO as TLIO
import Data.Text (Text)
import Control.Monad (forM_)

data Item = Item
    { itemName :: Text
    , itemQty :: Int
    }

items :: [Item]
items =
    [ Item "apples" 5
    , Item "bananas" 10
    ]

main :: IO ()
main = forM_ items $ \item -> TLIO.putStrLn
    [lt|You have #{show $ itemQty item} #{itemName item}.|]

pythonのformatメソッドのように使えそうだ。

ProductName Developing Web Applications With Haskell and Yesod
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )


ペーパーマリオ スーパーシール面白い

本を100冊位処分したら4000円くらいになったので子供の暇つぶし用にペーパーマリオを買ってやったんだが、これはなかなかおもしろい。

ProductName ペーパーマリオ スーパーシール

任天堂 / 3891円 ( 2012-12-06 )


アクションを極めなくても、コインとスロットと強力なシールを組み合わせれば子供でも進めていけそうだし、バランス良くできているなぁと思った。

SQLAlchemyのmany-to-manyのsecondaryにunique制約をかけたい

同じ外部キー同士の組み合わせが重複して登録されないようにしたい。Objectでチェックするよりはデータベースに任せたかったのでこんな風にしてみた。

patents_tags = db.Table('patents_tags',
     db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
     db.Column('patent_id', db.Integer, db.ForeignKey('patent.id')),
     db.UniqueConstraint('tag_id', 'patent_id', name='tag_patent')
)

ちなみに単に複数の属性をuniqueにしたいんだったら__table_args__を使えばよろしい。

ProductName Essential Sqlalchemy
Rick Copeland
Oreilly & Associates Inc / 2556円 ( 2008-06 )


2012年に読んだ本

今年読んだ本で良かったもの。

すごいHaskellたのしく学ぼう!

これはピカイチだった。RWHで停滞感が漂いまくっていた僕のHaskell理解力がかなり上がったのは間違いない。そういえば、最近Haskellしか書いてないなぁと2012年のエントリに付けられたタグを数えたらHaskell 90, Python 70, javascript 44だった。

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


あとはtwitterで色々教えてもらったりとか、三島Haskell無名関数の会が出来てモチベーションが上がったりとか色々タイミングが良かったということもあるが。来年も引き続きハスケりたい。

型というか、閉じている、自己同型といったイメージは数学ガールが良いかも

ProductName 数学ガール ガロア理論 (数学ガールシリーズ 5)
結城 浩
ソフトバンククリエイティブ / 1995円 ( 2012-06-01 )


チケット駆動開発

自分の仕事にアジャイルな要素を入れたいというのはここ数年ずっと考えていて、やっと来年すこし取り組めそうで嬉しい。

僕のチケット駆動に対する期待は、創薬研究への応用なので、チケット駆動開発の背景にある考え方がぎっしり詰まった本書は、色々な発見や再発見があったり、今の仕事のアナロジーを見つけたりとかなり満足度の高い本だった。

ProductName チケット駆動開発
小川 明彦
翔泳社 / 3444円 ( 2012-08-24 )


今年システムを少し運用してみて、意識の高低のバラツキを吸収する仕組みとしてゲーミフィケーション的なものも考えて行かないといけないし、受動的な情報伝達手段も考えて行かないといけないなぁと感じた。

(そもそも潜在的に)意識の高いマネジメント層は、能動的に情報アクセスしない研究者層(というより労働者層)が存在することを理解できないので、「そんなのホームに登録しておけばいいだけなんんじゃないか?」なんて言うんだけど、それすら能動的な情報アクセスなんだよなぁ。

デジタルサイネージのようなものにも手を出してみたい。

ProductName 幸せな未来は「ゲーム」が創る
ジェイン・マクゴニガル
早川書房 / 2940円 ( 2011-10-07 )


JavascriptとTitanium Mobile

今年はクライアントサイドのMVCも熱かった。去年Javascriptを勉強してた時には、まさかiPhoneアプリの方に進んでいくとは思わなかったが。

ステートフルJavaScriptはjavascript MVCフレームワークの本でSpine.jsの解説に近い。そしてこの知識はTitanium MobileでJavascriptを使ったiPhoneアプリ開発で役立つ!

AlloyはTitaniumのためのMVCフレームワークでBackbone.jsを使ってつくられている。これを使うとjavascriptを利用してiPhoneアプリとかAndroidアプリが作れちゃうわけだ(下のエントリ参照)。

バージョンあげたら実機転送がうまくいかなくなって、最近は停滞気味ですが、来年はもうちょっと力を入れて取り組みたいと思っている(なんかアプリをリリースしたい)。

それから僕はCoffeeScriptが好きなので使っていますが、他にもNode.jsのテンプレートエンジン(Jade,eco,ejs)なんかも使えるので好みの開発スタイルを探求するためにCoffeeScriptやNode.jsの入門書もあわせて読んでおくとよいかも。

ProductName サーバサイドJavaScript Node.js入門
清水俊博
アスキー・メディアワークス / 3990円 ( 2012-10-26 )


過去に読んだ本

snapでさくっと作るウェブサーバー

snap init しないで動かす場合は、ハンドラとルータを書いてquickHttpServeで動かせばいい。

ハンドラの型がSnap ()で、route関数をパスとハンドラの組みのリストに適用した結果もまたSnap ()型なのはなんとなく不思議だなぁと。

{-# LANGUAGE OverloadedStrings #-}

import Snap.Core
import Snap.Http.Server

hello :: Snap ()
hello = writeText "Hello, Snap!"

app :: Snap ()
app = route [("/", hello)]

main :: IO()
main = quickHttpServe app

snapのソースコードを読んでみるのもイイかもしれないと思った。

24 Days of Hackage

24 Days of Hackageを見つけたので楽しく読んでいた。

面白かったのが

特にoptparse-applicativeはpythonのoptparseに似ていて使いやすそうだった。

こんな感じでオプションのパーズとかhelpなんかをよろしくやってくれる。

import Options.Applicative

data Sample = Sample
  { hello :: String
  , quiet :: Bool }

sample :: Parser Sample
sample = Sample
  <$> strOption
      ( long "hello"
      <> metavar "TARGET"
      <> help "Target for the greeting" )
  <*> switch
      ( long "quiet"
      <> help "Whether to be quiet" )

greet :: Sample -> IO ()
greet (Sample h False) = putStrLn $ "Hello, " ++ h
greet _ = return ()

main :: IO ()
main = execParser opts >>= greet
  where
    opts = info (helper <*> sample)
      ( fullDesc
      <> progDesc "Print a greeting for TARGET"
      <> header "hello - a test for optparse-applicative" )

実際にサンプルを動かしてみると使いやすそう

$ ./optest 
Usage: optest --hello TARGET [--quiet]

$ ./optest --hello Haskell
Hello, Haskell

$ ./optest --help
hello - a test for optparse-applicative

Usage: optest --hello TARGET [--quiet]
  Print a greeting for TARGET

Available options:
  -h,--help                Show this help text
  --hello TARGET           Target for the greeting
  --quiet                  Whether to be quiet

yesod-tutorialがわかりやすい

Yesodの本のBlogのサンプルはスニペットすぎて微妙にわかりにくて困ったなぁと、yesodのチュートリアルを探していたら見つけたyesod-tutorialが分かりやすかった。gitのログとdiff見ながら進めていけば、どこが変更されたのかすぐわかるし。

個人的にはFormのところが理解できてかなりハッピーだった。

電子書籍にGit組み込んでdiffれるようになってたりすれば作って学ぶ系の本は良い感じかもしれないと思った。

ProductName Developing Web Applications With Haskell and Yesod
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )