virthualenvwrapperでmkvhenvしたら自動的にworkhonするようにした

mkvhenvっていうmkvirtualenvに対応するコマンドを用意した。mkvirthualenvしたあとにworkhonするのはめんどくさかったので、かなり快適になった。

「数学的推論が世界を変える」がおもしろい

Haskellなんかの型推論とか量子論をかじっているヒトが読むとかなり面白いと思う。述語理論、ゲーム理論、ゲーデルの不完全性定理なんかを説明して最後に確率的クリピキモデルに至るという内容。事例で金融の話が度々登場する。

僕はチューリングの定理(対角論法は知ってたけど)を理解できたのと、金融で不確定性原理が出てくるのが「原子の観測はミクロなのにマクロな市場でも表れるのか!」と驚いたが、結局介入しないと観測できないということから来てるんだろうなぁと解釈した。

  • 相互推論は様相論理の一つとみなすことができる
  • チューリングの定理が成り立つポイントはチューリングマシンを自然数で表すことができることである
  • ソロスの「再帰性」は「何の影響も与えることなく、外側から世界を理解することができない」ことを意味している
  • 確率的クリピキモデル

他にはボトムの意味をもうちょっと深く理解したのが、意外な収穫。

ProductName 関数プログラミング入門 ―Haskellで学ぶ原理と技法―
Richard Bird
オーム社 / 3990円 ( 2012-10-26 )


ゲーデルの不完全性定理を知るには数学ガールが良いとおもう。

ProductName 数学ガール ゲーデルの不完全性定理 (数学ガールシリーズ 3)
結城 浩
ソフトバンククリエイティブ / 1890円 ( 2009-10-27 )


Haskellで型宣言に型クラスを使う

今まで型宣言には具体的な型を書くものだと思っていたのだけど、型クラスを書いてもいいのね

myequal :: (Eq a) => a -> a -> Bool
myequal a b = a == b

RWHの15.8(Hiding the IO monad)では型クラスを使って抽象化していた。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan
オライリージャパン / 3990円 ( 2009-10-26 )


Free Monadを調べている

Free Monadとは

さて、この「Freeモナド」について、オレオレ定義で簡単に言葉にすると。「Functorと組み合わせて様々な挙動を実現できるモナド」です。capriccioso String Creating(Object something){ return My.Expression(something); }

つまるところ

要はFree Monadは、Pureな値が何かの型によってリストのように順々にくるまれた構造をもつデータ型を表していて、Listにおけるfoldのような畳み込みと同様に、Impureな部分をたどっていってPureな部分に到達するまでfmapを繰り返して処理を行いますみょんさんの

もう少し圏論的な説明は

じゃあこの操作を普通の関手でもできるようにしてやろうということを考えると自然とFreeモナドが構成できる。直和が定義できる圏であれば、自由モノイドを作るのと同じ要領でモナドを作ればよい。北海道苫小牧市出身のPGが書くブログ

実際どう使うか

インターフェースを定義するみたいなイメージでいいのかな、Functorが具象クラスで。

RWHの15章を読みなおすのもいいらしい(これから読む)。

YesodのBlogのExampleがちょっとわかりにくい

Yesod本のBlogのExampleがyesod initでできるスキャフォールドとかけ離れていてわかりにくい。

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


Foundation.hsとかに丁寧なコメント書いてあるだろうっていうツッコミもあるだろうけど、写経できるに越したことはないよなぁと思う。

wikiのほうを先にやるかな。

YesodのdefaultLayout

defaultLayoutがどうなっているのか気になったので、ソースコードを追いかけてみた。

messageの処理とwidget埋め込みをやるようになっていた。

defaultLayout :: GWidget sub a () -> GHandler sub a RepHtml
defaultLayout w = do
    p <- widgetToPageContent w
    mmsg <- getMessage
    hamletToRepHtml [hamlet|
$newline never
$doctype 5

<html>
    <head>
        <title>#{pageTitle p}
        ^{pageHead p}
    <body>
        $maybe msg <- mmsg
            <p .message>#{msg}
        ^{pageBody p}
|]

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


YesodでAjax

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

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


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 )