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の本と電子工作の本の中間くらいの内容。
これ読んだらテスター欲しくなった。
キットはこれがいいらしい。
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のモナド変換子の章を読むべし的な流れになってる。
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
それにしても計算論難しい。
ビューティフルアーキテクチャをつまみ読み
エッセイ集なので興味があるとこから。
- 5章 リソース指向アーキテクチャ:「Web上にある」こと
- 11章 GNU Emacs:漸進的機能追加方式が持つ力(ジム・ブランディ)
Emacsのアーキテクチャってあんまちゃんと考えたことなかったけど、11章読んだらあーなるほどと思った。Emacs-Lispももうちょっと使い倒して快適な環境を目指したい。
5章も面白かった。
これは既存のコードやサービスやインフラストラクチャを、論理的な名前を持ち、実装の詳細が漏れ出さないようなインターフェースに包み込んで再利用することで、多様な形態のやり取りに使えるようにしてくれる、強力なメカニズムとなります
これについてはRESTful Webサービスが詳しい
Linuxカーネル2.6解読室 Part II
プロセス管理
execveシステムコールはそれまで使用していた空間を破棄し、新たな空間に別のプログラムをロードして実行を開始する。
やさしい分子薬理学—分子構造から薬理活性へ
分子薬理学と銘打っているが、内容はStructure-Based Drug Design(SBDD)よりな感じがする。
中身読んでないけど、薬理的な知識よりは、生化学、有機化学、量子化学あたりの知識があった方が楽しく読めるような。
カバー見てそう思った。
SBDDはタンパク質を巨大な化合物だとみなせば有機化学だし、巨大な電子雲だとみなせば巨大な量子化学系だし、化合物(ここでいうリガンド)をネットワークを構成するアトミックな物質とみなせば分子生物学だし、薬理のメカニズムに組み込めば分子薬理学だし、視点を変えれば新たな発見があったりするので面白いし、まだまだやらなきゃいけないことが多いので魅力的な分野だと思う。



武蔵野電波のブレッドボーダーズ―誰でも作れる!遊べる電子工作
Sanwa デジタルマルチメーター PM-3
ENGINEER(エンジニア) マイキット KS-01
タローズバーバー カットレザー(本体)
計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)
ビューティフルアーキテクチャ
RESTful Webサービス
Linuxカーネル2.6解読室
やさしい分子薬理学―分子構造から薬理活性へ― [CD-ROM付]