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

ひたし豆

わらび

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

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

29122012 Haskell
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の設定とか競合しないもんかね?
Developing Web Applications With Haskell and Yesod29122012 Haskell
高速だと言われている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で使えるようになっていた。
28122012 Haskell
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メソッドのように使えそうだ。
Developing Web Applications With Haskell and Yesod28122012 life
本を100冊位処分したら4000円くらいになったので子供の暇つぶし用にペーパーマリオを買ってやったんだが、これはなかなかおもしろい。
アクションを極めなくても、コインとスロットと強力なシールを組み合わせれば子供でも進めていけそうだし、バランス良くできているなぁと思った。
28122012 Python SQLAlchemy
同じ外部キー同士の組み合わせが重複して登録されないようにしたい。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__を使えばよろしい。
28122012 work Haskell javascript coffeescript Ti
今年読んだ本で良かったもの。
これはピカイチだった。RWHで停滞感が漂いまくっていた僕のHaskell理解力がかなり上がったのは間違いない。そういえば、最近Haskellしか書いてないなぁと2012年のエントリに付けられたタグを数えたらHaskell 90, Python 70, javascript 44だった。
あとはtwitterで色々教えてもらったりとか、三島Haskell無名関数の会が出来てモチベーションが上がったりとか色々タイミングが良かったということもあるが。来年も引き続きハスケりたい。
型というか、閉じている、自己同型といったイメージは数学ガールが良いかも
自分の仕事にアジャイルな要素を入れたいというのはここ数年ずっと考えていて、やっと来年すこし取り組めそうで嬉しい。
僕のチケット駆動に対する期待は、創薬研究への応用なので、チケット駆動開発の背景にある考え方がぎっしり詰まった本書は、色々な発見や再発見があったり、今の仕事のアナロジーを見つけたりとかなり満足度の高い本だった。
今年システムを少し運用してみて、意識の高低のバラツキを吸収する仕組みとしてゲーミフィケーション的なものも考えて行かないといけないし、受動的な情報伝達手段も考えて行かないといけないなぁと感じた。
(そもそも潜在的に)意識の高いマネジメント層は、能動的に情報アクセスしない研究者層(というより労働者層)が存在することを理解できないので、「そんなのホームに登録しておけばいいだけなんんじゃないか?」なんて言うんだけど、それすら能動的な情報アクセスなんだよなぁ。
デジタルサイネージのようなものにも手を出してみたい。
今年はクライアントサイドの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の入門書もあわせて読んでおくとよいかも。
27122012 Haskell
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のソースコードを読んでみるのもイイかもしれないと思った。
26122012 Haskell
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
25122012 Haskell
Yesodの本のBlogのサンプルはスニペットすぎて微妙にわかりにくて困ったなぁと、yesodのチュートリアルを探していたら見つけたyesod-tutorialが分かりやすかった。gitのログとdiff見ながら進めていけば、どこが変更されたのかすぐわかるし。
個人的にはFormのところが理解できてかなりハッピーだった。
電子書籍にGit組み込んでdiffれるようになってたりすれば作って学ぶ系の本は良い感じかもしれないと思った。
Developing Web Applications With Haskell and Yesod