Hakellでテンポラリディレクトリやテンポラリファイル

テンポラリファイルをエディタでいじって、保存するとテンポラリファイルの内容を読んでHsSyckでパースして出力する

import System.IO
import System.Process
import System.Directory
import System.Environment
import Control.Monad (liftM)
import Data.Yaml.Syck

main :: IO ()
main = do
  tmpdir <- getTemporaryDirectory
  (pathOfTempFile, h) <- openTempFile tmpdir "temp.yaml"
  editor   <- liftM (lookup "EDITOR") getEnvironment
  case editor of Just ed -> (>>= waitForProcess) . runCommand $ ed ++ " " ++ pathOfTempFile
                 Nothing -> error "command error\n"
  hClose h

  inpStr <- readFile pathOfTempFile
  yamlstr <- parseYaml inpStr
  print yamlstr

  removeFile pathOfTempFile
  return ()

HoogleGHCの標準ライブラリドキュメントが手放せない身体になってきた。

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


もっとHaskellの本出ないかなぁ。Principles of Biomedical InformaticsのHaskell阪みたいなのとか。

ProductName Principles of Biomedical Informatics
Ira J. Kalet PhD
Academic Press / 8335円 ( 2008-10-15 )


福梅 - Yuzuka - こどものくに

日曜は犬の餌を買いに。

二日連続ラーメンという娘の主張を退け、昼は福梅でうどんを。

1265714576 1265714582

1265714589

さらに裏手のyuzukaでパンを購入。

1265714570

そのまま、十里木経由でこどもの国で雪遊び。

1265714564

1265714595 1265714601

今日は気温が高くて雪がほとんどとけてしまったので、日曜に行っといて良かった。

HaskellでPitを使う

perlにもConfig::Pitあるし、Pythonにもあるしという状況なので、Haskellでネットワークのちょろっとしたものを書くときにもパスワードをハードコードしないで、pitのやつを使いたかった。

module HsPit (
            pitGet,
            pitSet
           )
where

import System.FilePath ((</>))
import System.Directory
import Data.Yaml.Syck

pitGet :: String -> IO [(String,String)]
pitGet query = do
  home <- getHomeDirectory
  do yaml <- parseYamlFile (home </> ".pit" </> "default.yaml")
     case n_elem yaml of
       EMap list -> return $ map (\keyval -> (,) ((fromYaml . fst) keyval) ((fromYaml . snd) keyval)) $ concatMap (fromEMap . snd) $ filter checkElem list
           where checkElem ynode = ((n_elem . fst) ynode) == (EStr (packBuf query))
       otherwise -> return []
       where 
         fromYaml MkNode {n_elem=EStr str}   = unpackBuf str
         fromEMap MkNode {n_elem=EMap nodes} = nodes

pitSet = error "Not implemented"

HsSyckの使い方はPugsのYamlコードを参考にした。

で、例えばtwitterでつぶやくときには

import Network.HTTP
import Network.URI
import Codec.Binary.Base64.String
import Data.Maybe
import HsPit

tweet username password msg = simpleHTTP req where 
    req = Request uri POST [ah] "" where
        ah = Header HdrAuthorization $ "Basic " ++ encode (username ++ ":" ++ password)
        uri = fromJust $ parseURI $ "http://twitter.com/statuses/update.xml?" 
              ++ urlEncodeVars [("status", msg)]

main = do 
  userdata <- pitGet "twitter"
  case lookup "username" userdata of Just username ->
                                         case lookup "password" userdata of Just password ->
                                                                                tweet username password "tWeet"

なんかごちゃごちゃとしてしまった。

ブレッドボーダーズ

読んだ。Arduinoの本と電子工作の本の中間くらいの内容。

ProductName 武蔵野電波のブレッドボーダーズ―誰でも作れる!遊べる電子工作
スタパ齋藤,船田戦闘機
オーム社 / ¥ 2,520 ()
在庫あり。

これ読んだらテスター欲しくなった。

ProductName Sanwa デジタルマルチメーター PM-3

三和電気計器 / ¥ 3,280 ()


キットはこれがいいらしい。

ProductName ENGINEER(エンジニア) マイキット KS-01

エンジニア / ¥ 5,565 ()


HaskellでYAML

HaskellでYAMLを扱うライブラリはyaml,HsSyckがあるんだけどlibyamlのバインディングであるyamlのほうは使い方がわからん。

なので、HsSyckの使い方を覚えた。

import Data.Yaml.Syck

global_tag  = mkNode $ EStr $ packBuf "Item 1"
name_tag    = mkNode $ EStr $ packBuf "name"
name_value  = mkNode $ EStr $ packBuf "kzfm"
email_tag   = mkNode $ EStr $ packBuf "address"
email_value = mkNode $ EStr $ packBuf "xxx@gmail.com"
pass_tag    = mkNode $ EStr $ packBuf "password"
pass_value  = mkNode $ EStr $ packBuf "snail"

item = mkNode $ EMap [(name_tag,name_value),(email_tag,email_value),(pass_tag,pass_value)]
node = mkNode $ EMap [(global_tag,item)]

main = do
  emitYamlFile "test.yaml" node

作成されたtest.yamlの中身

--- 
? "Item 1"
: 
  ? "name"
  : >-
    kzfm

  ? "address"
  : >-
    xxx@gmail.com

  ? "password"
  : >-
    snail

これをperlでparseしてみる

use YAML;
my $filename = "test.yaml";
my $doc = YAML::LoadFile($filename);
print YAML::Dump($doc);

実行結果

---
Item 1:
  address: xxx@gmail.com
  name: kzfm
  password: snail

ナイス!

カットレザー

息子の髪をカットレザーで整えてみた。

意外に簡単でそこそこの仕上がりに満足

hoogleをローカルで

昨晩、String -> ByteStringに変換する関数がわかんね的なことをtweetしたらHoogeleで型検索出来ることを教えてもらった。

Hoogle 激ヤバ!マスト!!!!(ローカルに)

というわけで、ローカルで検索できるように

sudo cabal install hoogle

これだけ。

~/.cabal/binにhoogleっていうコマンドがインストールされるのでパス通しておく。

$ hoogle "String -> ByteString"
Data.ByteString.Char8 pack :: String -> ByteString
Data.ByteString.Lazy.Char8 pack :: [Char] -> ByteString
Prelude read :: Read a => String -> a
Text.Read read :: Read a => String -> a
Data.String fromString :: IsString a => String -> a
...

これはアンセムといっても間違いない。

Haskellのプログラムの中でエディタを使ってファイルをいじる

週末はニューラルネットの実装でもするつもりでいたのに、突然

Haskellのプログラムの中でファイルをエディットして保存したら、そのファイルの中身を読む

ということをやりたくなってしまった。要するにHaskellでこれがやりたくなった

import System.FilePath ((</>))
import System.Directory
import System.Process
import System.Environment
import Control.Monad (liftM)

main = do 
  home     <- getHomeDirectory
  (file:_) <- getArgs
  editor   <- liftM (lookup "EDITOR") getEnvironment
  case editor of Just ed -> (>>= waitForProcess) . runCommand $ ed ++ " " ++ (home </> file)
                 Nothing -> error "command error\n"
  inpStr <- readFile $ home </> file
  print inpStr

最初、

runCommand $ ed ++ " " ++ (home </> file)

って書いてて、あーブロックされてないんだろうなぁと。探したらどう書く?にあった。

あと、RWHのモナド変換子の章を読むべし的な流れになってる。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

アッカーマン関数をHaskellで

計算論を読んでたらアッカーマン関数が出てたのでHaskellで書いてみた。

ack 0 n = n + 1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) $ ack m (n-1)

定義をそのまま書き下せばいい。

*Main> ack 1 2
4
*Main> ack 3 2
29
*Main> ack 3 4
125

それにしても計算論難しい。

ProductName 計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)
高橋 正子
近代科学社 / ¥ 3,570 ()
在庫あり。

ビューティフルアーキテクチャをつまみ読み

エッセイ集なので興味があるとこから。

  • 5章 リソース指向アーキテクチャ:「Web上にある」こと
  • 11章 GNU Emacs:漸進的機能追加方式が持つ力(ジム・ブランディ)

ProductName ビューティフルアーキテクチャ

オライリージャパン / ¥ 3,150 ()
在庫あり。

Emacsのアーキテクチャってあんまちゃんと考えたことなかったけど、11章読んだらあーなるほどと思った。Emacs-Lispももうちょっと使い倒して快適な環境を目指したい。

5章も面白かった。

これは既存のコードやサービスやインフラストラクチャを、論理的な名前を持ち、実装の詳細が漏れ出さないようなインターフェースに包み込んで再利用することで、多様な形態のやり取りに使えるようにしてくれる、強力なメカニズムとなります

これについてはRESTful Webサービスが詳しい

ProductName RESTful Webサービス
Leonard Richardson,Sam Ruby
オライリー・ジャパン / ¥ 3,990 ()
在庫あり。