09022010 life
日曜は犬の餌を買いに。
二日連続ラーメンという娘の主張を退け、昼は福梅でうどんを。


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

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


今日は気温が高くて雪がほとんどとけてしまったので、日曜に行っといて良かった。
09022010 life
日曜は犬の餌を買いに。
二日連続ラーメンという娘の主張を退け、昼は福梅でうどんを。


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

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


今日は気温が高くて雪がほとんどとけてしまったので、日曜に行っといて良かった。
08022010 Haskell
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"
なんかごちゃごちゃとしてしまった。
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
ナイス!
06022010 Haskell
昨晩、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
...
これはアンセムといっても間違いない。
06022010 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―実戦で学ぶ関数型言語プログラミング05022010 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
それにしても計算論難しい。
04022010 work
エッセイ集なので興味があるとこから。
Emacsのアーキテクチャってあんまちゃんと考えたことなかったけど、11章読んだらあーなるほどと思った。Emacs-Lispももうちょっと使い倒して快適な環境を目指したい。
5章も面白かった。
これは既存のコードやサービスやインフラストラクチャを、論理的な名前を持ち、実装の詳細が漏れ出さないようなインターフェースに包み込んで再利用することで、多様な形態のやり取りに使えるようにしてくれる、強力なメカニズムとなります
これについてはRESTful Webサービスが詳しい
03022010 Linux
プロセス管理
execveシステムコールはそれまで使用していた空間を破棄し、新たな空間に別のプログラムをロードして実行を開始する。