02012013 life
捕まえた

捕獲方法
01012013 life
去年とは違い、まったりと年を越した。

今年はHaskellでひとつくらいはウェブアプリケーションを作るのと、AlloyでつくったiPhoneアプリを幾つかリリースできればと思っている。
それから山歩きくらいは再開したい。
31122012 life
子供の雪遊びのために、そり遊びしてきた。それほど混んでなくて良かった。昨日の雨でちょっとアイスバーンっぽくなっていたけどソリにはまったく関係ないし。

もともと、子供の面倒を見るつもり120%だったので、板を持っていかなかったのだけど、ちょっと滑れそうだったのでレンタルした。
けど、短いのしかないし、ビンががたがたしてるし、右足マイナス振ってないし(これはしょうがないけど)で、4,5本滑ったら良くなってしまった。
夜に美味しいワインが控えているので疲れる前にやめておいた。
というわけで今年の更新は最後だ。今からワインをがぶがぶしてくる。
31122012 Haskell
Yesod本の写経。addJullius, AddHamletでtoWidgetを使えというdeprecated warningが出たので本家サイトのように書きなおした。
hamletはtoWidgetよりはwhamletのほうが見やすいかな。
{-# LANGUAGE QuasiQuotes, TypeFamilies, OverloadedStrings #-} {-# LANGUAGE MultiParamTypeClasses, TemplateHaskell #-} import Yesod data R = R mkYesod "R" [parseRoutes| / RootR GET /#String NameR GET |] instance Yesod R getRootR = defaultLayout $ do setTitle "Homepage" addScriptRemote "http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" toWidget [julius| $(function(){ $("#ajax a").click(function(){ jQuery.getJSON($(this).attr("href"), function(o){ $("div").text(o.name); }); return false; }); }); |] let names = words "Larry Moe Curly" [whamlet| <h2>AJAX Version <div #results> AJAX results will be placed here when you click # the names below <ul #ajax> $forall name <- names <li> <a href=@{NameR name}>#{name} <h2>HTML Version <p> Clicking the names below will redirect the page # to an HTML version <ul #html> $forall name <- names <li> <a href=@{NameR name}>#{name} |] getNameR name = do let widget = do setTitle $ toHtml name [whamlet|Looks like you have Javascript off Name: #{name}|] let json = object ["name" .= name] defaultLayoutJson widget json main = warpDebug 3000 R
Developing Web Applications With Haskell and Yesod29122012 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__を使えばよろしい。