<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8935928809346815002</id><updated>2011-12-25T15:14:10.460+09:00</updated><category term='scheme'/><category term='book'/><category term='blog'/><category term='work'/><category term='food'/><category term='haskell'/><category term='sports'/><category term='life'/><title type='text'>mokehehe's blog</title><subtitle type='html'>Write blog in english.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-882825832808656842</id><published>2009-08-01T00:02:00.004+09:00</published><updated>2009-08-01T19:55:34.903+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Add Conditional, Logical and Ternary Operator to the Calculator</title><content type='html'>To enable calculator to use conditional branching, add conditional operator.&lt;br /&gt;It is good to add boolean type to calculator, but for my laziness, it is easy to use only Double type, and use 0.0 for express false and any other value to true.&lt;br /&gt;Next, add logical-and(&amp;&amp;) and logical-or(||) operator. Use these operator, we can imitate conditional branching:&lt;br /&gt;&lt;pre class="prettyprint"&gt;cond &amp;&amp; then || else&lt;/pre&gt;&lt;br /&gt;but when 'then' value is 0, this return 'else' value. So I must add ternary operator.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;import Text.ParserCombinators.Parsec&lt;br /&gt;import Text.ParserCombinators.Parsec.Expr&lt;br /&gt;import qualified Text.ParserCombinators.Parsec.Token as P&lt;br /&gt;import Text.ParserCombinators.Parsec.Language&lt;br /&gt;import Control.Monad (when)&lt;br /&gt;import System.IO&lt;br /&gt;&lt;br /&gt;type Environment = [(String, Double)]&lt;br /&gt;&lt;br /&gt;doAssign :: String -&amp;gt; Double -&amp;gt; Environment -&amp;gt; Environment&lt;br /&gt;doAssign var val env = (var, val) : filter ((/= var) . fst) env&lt;br /&gt;&lt;br /&gt;data MyParserState =&lt;br /&gt;    MyParserState {&lt;br /&gt;        global :: Environment&lt;br /&gt;        }&lt;br /&gt;    deriving (Show)&lt;br /&gt;&lt;br /&gt;type MyParser a = GenParser Char MyParserState a&lt;br /&gt;&lt;br /&gt;lexer :: P.TokenParser MyParserState&lt;br /&gt;lexer = P.makeTokenParser (haskellDef { reservedOpNames = [&amp;quot;*&amp;quot;,&amp;quot;/&amp;quot;,&amp;quot;+&amp;quot;,&amp;quot;-&amp;quot;,&amp;quot;**&amp;quot;, &amp;quot;==&amp;quot;, &amp;quot;/=&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;amp;&amp;amp;&amp;quot;, &amp;quot;||&amp;quot;, &amp;quot;?&amp;quot;, &amp;quot;:&amp;quot;] })&lt;br /&gt;&lt;br /&gt;naturalOrFloat = P.naturalOrFloat lexer&lt;br /&gt;parens         = P.parens lexer&lt;br /&gt;reservedOp     = P.reservedOp lexer&lt;br /&gt;identifier     = P.identifier lexer&lt;br /&gt;lexeme         = P.lexeme lexer&lt;br /&gt;&lt;br /&gt;expr = assignExpr&lt;br /&gt;&lt;br /&gt;assignExpr :: MyParser Double&lt;br /&gt;assignExpr = try(assign) &amp;lt;|&amp;gt; condExpr&lt;br /&gt;    where&lt;br /&gt;        assign = do&lt;br /&gt;            var &amp;lt;- identifier&lt;br /&gt;            lexeme $ char &amp;apos;=&amp;apos;&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;&lt;br /&gt;            updateState $ \st -&amp;gt; st{ global = doAssign var e (global st) }&lt;br /&gt;            return e&lt;br /&gt;&lt;br /&gt;condExpr :: MyParser Double&lt;br /&gt;condExpr = try(cond) &amp;lt;|&amp;gt; expr&amp;apos;&lt;br /&gt;    where&lt;br /&gt;        cond = do&lt;br /&gt;            c &amp;lt;- expr&amp;apos;&lt;br /&gt;            lexeme $ char &amp;apos;?&amp;apos;&lt;br /&gt;            t &amp;lt;- expr&lt;br /&gt;            lexeme $ char &amp;apos;:&amp;apos;&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;            return $ if isTrue c then t else e&lt;br /&gt;&lt;br /&gt;expr&amp;apos; :: MyParser Double&lt;br /&gt;expr&amp;apos; = buildExpressionParser table factor &amp;lt;?&amp;gt; &amp;quot;expression&amp;quot;&lt;br /&gt;    where&lt;br /&gt;        table = [&lt;br /&gt;            [unary &amp;quot;-&amp;quot; negate, unary &amp;quot;+&amp;quot; id],&lt;br /&gt;            [op &amp;quot;**&amp;quot; (**) AssocRight],&lt;br /&gt;            [op &amp;quot;*&amp;quot; (*) AssocLeft, op &amp;quot;/&amp;quot; (/) AssocLeft],&lt;br /&gt;            [op &amp;quot;+&amp;quot; (+) AssocLeft, op &amp;quot;-&amp;quot; (-) AssocLeft],&lt;br /&gt;            [op &amp;quot;==&amp;quot; (cmp (==)) AssocNone, op &amp;quot;/=&amp;quot; (cmp (/=)) AssocNone, op &amp;quot;&amp;lt;&amp;quot; (cmp (&amp;lt;)) AssocNone, op &amp;quot;&amp;lt;=&amp;quot; (cmp (&amp;lt;=)) AssocNone, op &amp;quot;&amp;gt;&amp;quot; (cmp (&amp;gt;)) AssocLeft, op &amp;quot;&amp;gt;=&amp;quot; (cmp (&amp;gt;=)) AssocNone],&lt;br /&gt;            [op &amp;quot;&amp;amp;&amp;amp;&amp;quot; (logiand) AssocLeft],&lt;br /&gt;            [op &amp;quot;||&amp;quot; (logior) AssocLeft]&lt;br /&gt;            ]&lt;br /&gt;        op s f assoc = Infix (do{ reservedOp s; return f } &amp;lt;?&amp;gt; &amp;quot;operator&amp;quot;) assoc&lt;br /&gt;        unary s f = Prefix (do{ reservedOp s; return f })&lt;br /&gt;        cmp op x y = if x `op` y then true else false&lt;br /&gt;        logiand x y = if isFalse x then x else y&lt;br /&gt;        logior  x y = if isTrue  x then x else y&lt;br /&gt;&lt;br /&gt;false = 0.0&lt;br /&gt;true = 1.0&lt;br /&gt;isFalse = (== false)&lt;br /&gt;isTrue = (/= false)&lt;br /&gt;&lt;br /&gt;factor :: MyParser Double&lt;br /&gt;factor = parenedExpr &amp;lt;|&amp;gt; floatLiteral &amp;lt;|&amp;gt; funcallOrVarref &amp;lt;?&amp;gt; &amp;quot;factor&amp;quot;&lt;br /&gt;&lt;br /&gt;parenedExpr :: MyParser Double&lt;br /&gt;parenedExpr = parens expr&lt;br /&gt;&lt;br /&gt;floatLiteral :: MyParser Double&lt;br /&gt;floatLiteral = do&lt;br /&gt;    norf &amp;lt;- naturalOrFloat&lt;br /&gt;    case norf of&lt;br /&gt;        Left i    -&amp;gt; return $ fromInteger i&lt;br /&gt;        Right f    -&amp;gt; return $ f&lt;br /&gt;&lt;br /&gt;funcallOrVarref :: MyParser Double&lt;br /&gt;funcallOrVarref = do&lt;br /&gt;    name &amp;lt;- identifier&lt;br /&gt;    do {&lt;br /&gt;        params &amp;lt;- lexeme formalparams;&lt;br /&gt;        case (applyFunc name params) of&lt;br /&gt;            Right v        -&amp;gt; return v&lt;br /&gt;            Left err    -&amp;gt; fail err&lt;br /&gt;    } &amp;lt;|&amp;gt; do&lt;br /&gt;        st &amp;lt;- getState;&lt;br /&gt;        case lookup name (global st) of&lt;br /&gt;            Nothing    -&amp;gt; fail $ &amp;quot;undefined variable: &amp;quot; ++ name&lt;br /&gt;            Just v    -&amp;gt; return v&lt;br /&gt;&lt;br /&gt;formalparams :: MyParser [Double]&lt;br /&gt;formalparams = do&lt;br /&gt;    lexeme $ char &amp;apos;(&amp;apos;&lt;br /&gt;    params &amp;lt;- expr `sepBy` lexeme (char &amp;apos;,&amp;apos;)&lt;br /&gt;    char &amp;apos;)&amp;apos;&lt;br /&gt;    return params&lt;br /&gt;&lt;br /&gt;applyFunc :: String -&amp;gt; [Double] -&amp;gt; Either String Double&lt;br /&gt;applyFunc fname params = call $ lookup fname functbl&lt;br /&gt;    where&lt;br /&gt;        functbl = [&lt;br /&gt;            (&amp;quot;sin&amp;quot;, (1, apply1 sin)),&lt;br /&gt;            (&amp;quot;cos&amp;quot;, (1, apply1 cos)),&lt;br /&gt;            (&amp;quot;tan&amp;quot;, (1, apply1 tan)),&lt;br /&gt;            (&amp;quot;log&amp;quot;, (1, apply1 log)),&lt;br /&gt;            (&amp;quot;sqrt&amp;quot;, (1, apply1 sqrt))&lt;br /&gt;            ]&lt;br /&gt;&lt;br /&gt;        call Nothing = Left $ fname ++ &amp;quot;: no function&amp;quot;&lt;br /&gt;        call (Just (argnum, fn))&lt;br /&gt;            | length params /= argnum    = Left $ fname ++ &amp;quot;: illegal argnum, &amp;quot; ++ show (length params) ++ &amp;quot; for &amp;quot; ++ show argnum&lt;br /&gt;            | otherwise                    = Right $ fn params&lt;br /&gt;&lt;br /&gt;        apply1 f [x]   = f x&lt;br /&gt;        apply2 f [x,y] = f x y&lt;br /&gt;&lt;br /&gt;repl :: String -&amp;gt; (String -&amp;gt; Bool) -&amp;gt; (String -&amp;gt; st -&amp;gt; (String, st)) -&amp;gt; st -&amp;gt; IO st&lt;br /&gt;repl prompt bQuit eval = loop&lt;br /&gt;    where&lt;br /&gt;        loop st = putStr prompt &amp;gt;&amp;gt; getLine &amp;gt;&amp;gt;= act st&lt;br /&gt;        act st s&lt;br /&gt;            | bQuit s = return st&lt;br /&gt;            | otherwise = do&lt;br /&gt;                let (res, st&amp;apos;) = eval s st&lt;br /&gt;                putStrLn res&lt;br /&gt;                loop st&amp;apos;&lt;br /&gt;&lt;br /&gt;calc :: MyParserState -&amp;gt; IO MyParserState&lt;br /&gt;calc = repl &amp;quot;&amp;gt; &amp;quot; (== &amp;quot;:q&amp;quot;) eval&lt;br /&gt;    where&lt;br /&gt;        eval line st = do&lt;br /&gt;            case (runParser stmt st &amp;quot;&amp;quot; line) of&lt;br /&gt;                Left err       -&amp;gt; (show err, st)&lt;br /&gt;                Right (v, st&amp;apos;) -&amp;gt; (show v, st&amp;apos;)&lt;br /&gt;        stmt = do&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;            eof&lt;br /&gt;            st &amp;lt;- getState&lt;br /&gt;            return (e, st)&lt;br /&gt;&lt;br /&gt;initialState = MyParserState genv&lt;br /&gt;    where&lt;br /&gt;        genv = [&lt;br /&gt;            (&amp;quot;pi&amp;quot;,    pi)&lt;br /&gt;            ]&lt;br /&gt;&lt;br /&gt;main = hSetBuffering stdout NoBuffering &amp;gt;&amp;gt; putStrLn &amp;quot;type &amp;apos;:q&amp;apos; to quit.&amp;quot; &amp;gt;&amp;gt; calc initialState &amp;gt;&amp;gt;= print &amp;gt;&amp;gt; putStrLn &amp;quot;Bye&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-882825832808656842?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/882825832808656842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=882825832808656842' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/882825832808656842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/882825832808656842'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/08/add-conditional-logical-and-ternary.html' title='Add Conditional, Logical and Ternary Operator to the Calculator'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-3641499676125323896</id><published>2009-07-31T23:38:00.001+09:00</published><updated>2009-08-01T00:01:14.785+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Add Variable Assignment and Reference to Calculator</title><content type='html'>To add variable assignment and reference to calculator,  we must add parser state.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="height:400px;"&gt;&lt;br /&gt;import Text.ParserCombinators.Parsec&lt;br /&gt;import Text.ParserCombinators.Parsec.Expr&lt;br /&gt;import qualified Text.ParserCombinators.Parsec.Token as P&lt;br /&gt;import Text.ParserCombinators.Parsec.Language&lt;br /&gt;import Control.Monad (when)&lt;br /&gt;import System.IO&lt;br /&gt;&lt;br /&gt;type Environment = [(String, Double)]&lt;br /&gt;&lt;br /&gt;doAssign :: String -&amp;gt; Double -&amp;gt; Environment -&amp;gt; Environment&lt;br /&gt;doAssign var val env = (var, val) : filter ((/= var) . fst) env&lt;br /&gt;&lt;br /&gt;data MyParserState =&lt;br /&gt;    MyParserState {&lt;br /&gt;        global :: Environment&lt;br /&gt;        }&lt;br /&gt;    deriving (Show)&lt;br /&gt;&lt;br /&gt;type MyParser a = GenParser Char MyParserState a&lt;br /&gt;&lt;br /&gt;lexer :: P.TokenParser MyParserState&lt;br /&gt;lexer = P.makeTokenParser (haskellDef { reservedOpNames = ["*","/","+","-","**"] })&lt;br /&gt;&lt;br /&gt;naturalOrFloat = P.naturalOrFloat lexer&lt;br /&gt;parens         = P.parens lexer&lt;br /&gt;reservedOp     = P.reservedOp lexer&lt;br /&gt;identifier     = P.identifier lexer&lt;br /&gt;lexeme         = P.lexeme lexer&lt;br /&gt;&lt;br /&gt;expr = assignExpr&lt;br /&gt;&lt;br /&gt;assignExpr :: MyParser Double&lt;br /&gt;assignExpr = try(assign) &amp;lt;|&amp;gt; expr'&lt;br /&gt;    where&lt;br /&gt;        assign = do&lt;br /&gt;            var &amp;lt;- identifier&lt;br /&gt;            lexeme $ char '='&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;&lt;br /&gt;            updateState $ \st -&amp;gt; st{ global = doAssign var e (global st) }&lt;br /&gt;            return e&lt;br /&gt;&lt;br /&gt;expr' :: MyParser Double&lt;br /&gt;expr' = buildExpressionParser table factor &amp;lt;?&amp;gt; "expression"&lt;br /&gt;    where&lt;br /&gt;        table = [&lt;br /&gt;            [unary "-" negate, unary "+" id],&lt;br /&gt;            [op "**" (**) AssocRight],&lt;br /&gt;            [op "*" (*) AssocLeft, op "/" (/) AssocLeft],&lt;br /&gt;            [op "+" (+) AssocLeft, op "-" (-) AssocLeft]&lt;br /&gt;            ]&lt;br /&gt;        op s f assoc = Infix (do{ reservedOp s; return f } &amp;lt;?&amp;gt; "operator") assoc&lt;br /&gt;        unary s f = Prefix (do{ reservedOp s; return f })&lt;br /&gt;&lt;br /&gt;factor :: MyParser Double&lt;br /&gt;factor = parenedExpr &amp;lt;|&amp;gt; floatLiteral &amp;lt;|&amp;gt; funcallOrVarref &amp;lt;?&amp;gt; "factor"&lt;br /&gt;&lt;br /&gt;parenedExpr :: MyParser Double&lt;br /&gt;parenedExpr = parens expr&lt;br /&gt;&lt;br /&gt;floatLiteral :: MyParser Double&lt;br /&gt;floatLiteral = do&lt;br /&gt;    norf &amp;lt;- naturalOrFloat&lt;br /&gt;    case norf of&lt;br /&gt;        Left i    -&amp;gt; return $ fromInteger i&lt;br /&gt;        Right f    -&amp;gt; return $ f&lt;br /&gt;&lt;br /&gt;funcallOrVarref :: MyParser Double&lt;br /&gt;funcallOrVarref = do&lt;br /&gt;    name &amp;lt;- identifier&lt;br /&gt;    do {&lt;br /&gt;        params &amp;lt;- lexeme formalparams;&lt;br /&gt;        case (applyFunc name params) of&lt;br /&gt;            Right v        -&amp;gt; return v&lt;br /&gt;            Left err    -&amp;gt; fail err&lt;br /&gt;    } &amp;lt;|&amp;gt; do&lt;br /&gt;        st &amp;lt;- getState;&lt;br /&gt;        case lookup name (global st) of&lt;br /&gt;            Nothing    -&amp;gt; fail $ "undefined variable: " ++ name&lt;br /&gt;            Just v    -&amp;gt; return v&lt;br /&gt;&lt;br /&gt;formalparams :: MyParser [Double]&lt;br /&gt;formalparams = do&lt;br /&gt;    lexeme $ char '('&lt;br /&gt;    params &amp;lt;- expr `sepBy` lexeme (char ',')&lt;br /&gt;    char ')'&lt;br /&gt;    return params&lt;br /&gt;&lt;br /&gt;applyFunc :: String -&amp;gt; [Double] -&amp;gt; Either String Double&lt;br /&gt;applyFunc fname params = call $ lookup fname functbl&lt;br /&gt;    where&lt;br /&gt;        functbl = [&lt;br /&gt;            ("sin", (1, apply1 sin)),&lt;br /&gt;            ("cos", (1, apply1 cos)),&lt;br /&gt;            ("tan", (1, apply1 tan)),&lt;br /&gt;            ("log", (1, apply1 log)),&lt;br /&gt;            ("sqrt", (1, apply1 sqrt))&lt;br /&gt;            ]&lt;br /&gt;&lt;br /&gt;        call Nothing = Left $ fname ++ ": no function"&lt;br /&gt;        call (Just (argnum, fn))&lt;br /&gt;            | length params /= argnum    = Left $ fname ++ ": illegal argnum, " ++ show (length params) ++ " for " ++ show argnum&lt;br /&gt;            | otherwise                    = Right $ fn params&lt;br /&gt;&lt;br /&gt;        apply1 f [x]   = f x&lt;br /&gt;        apply2 f [x,y] = f x y&lt;br /&gt;&lt;br /&gt;repl :: String -&amp;gt; (String -&amp;gt; Bool) -&amp;gt; (String -&amp;gt; st -&amp;gt; (String, st)) -&amp;gt; st -&amp;gt; IO st&lt;br /&gt;repl prompt bQuit eval = loop&lt;br /&gt;    where&lt;br /&gt;        loop st = putStr prompt &amp;gt;&amp;gt; getLine &amp;gt;&amp;gt;= act st&lt;br /&gt;        act st s&lt;br /&gt;            | bQuit s = return st&lt;br /&gt;            | otherwise = do&lt;br /&gt;                let (res, st') = eval s st&lt;br /&gt;                putStrLn res&lt;br /&gt;                loop st'&lt;br /&gt;&lt;br /&gt;calc :: MyParserState -&amp;gt; IO MyParserState&lt;br /&gt;calc = repl "&amp;gt; " (== ":q") eval&lt;br /&gt;    where&lt;br /&gt;        eval line st = do&lt;br /&gt;            case (runParser stmt st "" line) of&lt;br /&gt;                Left err       -&amp;gt; (show err, st)&lt;br /&gt;                Right (v, st') -&amp;gt; (show v, st')&lt;br /&gt;        stmt = do&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;            eof&lt;br /&gt;            st &amp;lt;- getState&lt;br /&gt;            return (e, st)&lt;br /&gt;&lt;br /&gt;initialState = MyParserState genv&lt;br /&gt;    where&lt;br /&gt;        genv = [&lt;br /&gt;            ("pi",    pi)&lt;br /&gt;            ]&lt;br /&gt;&lt;br /&gt;main = hSetBuffering stdout NoBuffering &amp;gt;&amp;gt; putStrLn "type ':q' to quit." &amp;gt;&amp;gt; calc initialState &amp;gt;&amp;gt;= print &amp;gt;&amp;gt; putStrLn "Bye"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;To make parser to have state, use "type MyParser a = &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-ParserCombinators-Parsec-Prim.html#t%3AGenParser"&gt;GenParser&lt;/a&gt; Char MyParserState a".&lt;br /&gt;&lt;li&gt;Assignment has to change parser's state, so it can't into buildExpressionParser's table. So add assignExpr parser.&lt;br /&gt;&lt;li&gt;For fail to assign parser, use &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-ParserCombinators-Parsec-Prim.html#v:try"&gt;try&lt;/a&gt; for retry parse.&lt;br /&gt;&lt;li&gt;For function's formal parameter parser, using &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-ParserCombinators-Parsec-Combinator.html#v:sepBy"&gt;sepBy&lt;/a&gt; make parser much simpler.&lt;br /&gt;&lt;li&gt;Environment use assoc-list for easy to implement, but it is better to use hash table, maybe.&lt;br /&gt;&lt;li&gt;Calculator must update state for each input, so change repl.&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-3641499676125323896?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/3641499676125323896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=3641499676125323896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/3641499676125323896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/3641499676125323896'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/07/add-variable-assignment-and-reference.html' title='Add Variable Assignment and Reference to Calculator'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-7907812271697271345</id><published>2009-07-31T23:18:00.002+09:00</published><updated>2009-07-31T23:37:45.655+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Add Embed Function to Calculator</title><content type='html'>Add embed functions (sin, cos, tan, log, sqrt), and enable to call it.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="height:400px;"&gt;&lt;br /&gt;import Text.ParserCombinators.Parsec&lt;br /&gt;import Text.ParserCombinators.Parsec.Expr&lt;br /&gt;import qualified Text.ParserCombinators.Parsec.Token as P&lt;br /&gt;import Text.ParserCombinators.Parsec.Language&lt;br /&gt;import Control.Monad (when)&lt;br /&gt;import System.IO&lt;br /&gt;&lt;br /&gt;lexer :: P.TokenParser ()&lt;br /&gt;lexer = P.makeTokenParser (haskellDef { reservedOpNames = ["*","/","+","-","**"] })&lt;br /&gt;&lt;br /&gt;naturalOrFloat = P.naturalOrFloat lexer&lt;br /&gt;parens         = P.parens lexer&lt;br /&gt;reservedOp     = P.reservedOp lexer&lt;br /&gt;identifier     = P.identifier lexer&lt;br /&gt;lexeme         = P.lexeme lexer&lt;br /&gt;&lt;br /&gt;expr :: Parser Double&lt;br /&gt;expr = buildExpressionParser table factor &amp;lt;?&amp;gt; "expression"&lt;br /&gt;    where&lt;br /&gt;        table = [&lt;br /&gt;            [unary "-" negate, unary "+" id],&lt;br /&gt;            [op "**" (**) AssocRight],&lt;br /&gt;            [op "*" (*) AssocLeft, op "/" (/) AssocLeft],&lt;br /&gt;            [op "+" (+) AssocLeft, op "-" (-) AssocLeft]&lt;br /&gt;            ]&lt;br /&gt;        op s f assoc = Infix (do{ reservedOp s; return f } &amp;lt;?&amp;gt; "operator") assoc&lt;br /&gt;        unary s f = Prefix (do{ reservedOp s; return f })&lt;br /&gt;&lt;br /&gt;factor :: Parser Double&lt;br /&gt;factor =&lt;br /&gt;    do {&lt;br /&gt;        parens expr;&lt;br /&gt;    } &amp;lt;|&amp;gt; do {&lt;br /&gt;        norf &amp;lt;- naturalOrFloat;&lt;br /&gt;        case norf of&lt;br /&gt;            Left i    -&amp;gt; return $ fromInteger i&lt;br /&gt;            Right f    -&amp;gt; return $ f&lt;br /&gt;    } &amp;lt;|&amp;gt;&lt;br /&gt;        funcall&lt;br /&gt;    &amp;lt;?&amp;gt;&lt;br /&gt;        "factor"&lt;br /&gt;&lt;br /&gt;funcall :: Parser Double&lt;br /&gt;funcall =&lt;br /&gt;    do {&lt;br /&gt;        fname &amp;lt;- identifier;&lt;br /&gt;        params &amp;lt;- lexeme formalparams;&lt;br /&gt;        case (applyFunc fname params) of&lt;br /&gt;            Right v        -&amp;gt; return v&lt;br /&gt;            Left err    -&amp;gt; fail err&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;formalparams :: Parser [Double]&lt;br /&gt;formalparams = lexeme (char '(') &amp;gt;&amp;gt; params False&lt;br /&gt;    where&lt;br /&gt;        params bComma =&lt;br /&gt;            do {&lt;br /&gt;                char ')';&lt;br /&gt;                return [];&lt;br /&gt;            } &amp;lt;|&amp;gt; do {&lt;br /&gt;                when bComma $ lexeme (char ',') &amp;gt;&amp;gt; return ();&lt;br /&gt;                e &amp;lt;- expr;&lt;br /&gt;                r &amp;lt;- params True;&lt;br /&gt;                return $ e : r;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;applyFunc :: String -&amp;gt; [Double] -&amp;gt; Either String Double&lt;br /&gt;applyFunc fname params = call $ lookup fname functbl&lt;br /&gt;    where&lt;br /&gt;        functbl = [&lt;br /&gt;            ("sin", (1, apply1 sin)),&lt;br /&gt;            ("cos", (1, apply1 cos)),&lt;br /&gt;            ("tan", (1, apply1 tan)),&lt;br /&gt;            ("log", (1, apply1 log)),&lt;br /&gt;            ("sqrt", (1, apply1 sqrt))&lt;br /&gt;            ]&lt;br /&gt;&lt;br /&gt;        call Nothing = Left $ fname ++ ": no function"&lt;br /&gt;        call (Just (argnum, fn))&lt;br /&gt;            | length params /= argnum    = Left $ fname ++ ": illegal argnum, " ++ show (length params) ++ " for " ++ show argnum&lt;br /&gt;            | otherwise                    = Right $ fn params&lt;br /&gt;&lt;br /&gt;        apply1 f [x]   = f x&lt;br /&gt;        apply2 f [x,y] = f x y&lt;br /&gt;&lt;br /&gt;repl :: String -&amp;gt; (String -&amp;gt; Bool) -&amp;gt; (String -&amp;gt; String) -&amp;gt; IO ()&lt;br /&gt;repl prompt bQuit eval = loop&lt;br /&gt;    where&lt;br /&gt;        loop = do&lt;br /&gt;            putStr prompt&lt;br /&gt;            s &amp;lt;- getLine&lt;br /&gt;            if bQuit s&lt;br /&gt;                then return ()&lt;br /&gt;                else putStrLn (eval s) &amp;gt;&amp;gt; loop&lt;br /&gt;&lt;br /&gt;calc :: IO ()&lt;br /&gt;calc = repl "&amp;gt; " (== ":q") (tostring . parse stmt "")&lt;br /&gt;    where&lt;br /&gt;        tostring (Right v)    = show v&lt;br /&gt;        tostring (Left err)    = show err&lt;br /&gt;        stmt = do&lt;br /&gt;            e &amp;lt;- expr&lt;br /&gt;            eof&lt;br /&gt;            return e&lt;br /&gt;&lt;br /&gt;main = hSetBuffering stdout NoBuffering &amp;gt;&amp;gt; putStrLn "type ':q' to quit." &amp;gt;&amp;gt; calc &amp;gt;&amp;gt; putStrLn "Bye"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Add factor to funcall parser.&lt;br /&gt;&lt;li&gt;Use &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-ParserCombinators-Parsec-Token.html#v:lexeme"&gt;lexeme&lt;/a&gt; to make strip whitespace parser.&lt;br /&gt;&lt;li&gt;Embed functions are stored in fixed table and can't add runtime.&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-7907812271697271345?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/7907812271697271345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=7907812271697271345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/7907812271697271345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/7907812271697271345'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/07/add-embed-function.html' title='Add Embed Function to Calculator'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-6097219370016637809</id><published>2009-07-31T22:50:00.005+09:00</published><updated>2009-07-31T23:17:12.860+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Make Simple Calculator Using Parsec</title><content type='html'>Make simple calculator using Parsec in Haskell. The calculator can use +, -, *, / and **(power).&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="height:400px;"&gt;&lt;br /&gt;import Text.ParserCombinators.Parsec&lt;br /&gt;import Text.ParserCombinators.Parsec.Expr&lt;br /&gt;import qualified Text.ParserCombinators.Parsec.Token as P&lt;br /&gt;import Text.ParserCombinators.Parsec.Language&lt;br /&gt;import System.IO&lt;br /&gt;&lt;br /&gt;lexer :: P.TokenParser ()&lt;br /&gt;lexer = P.makeTokenParser (haskellDef { reservedOpNames = ["*","/","+","-","**"] })&lt;br /&gt;&lt;br /&gt;naturalOrFloat = P.naturalOrFloat lexer&lt;br /&gt;parens         = P.parens lexer&lt;br /&gt;reservedOp     = P.reservedOp lexer&lt;br /&gt;&lt;br /&gt;expr :: Parser Double&lt;br /&gt;expr = buildExpressionParser table factor &amp;lt;?&amp;gt; "expression"&lt;br /&gt;   where&lt;br /&gt;       table = [&lt;br /&gt;           [unary "-" negate, unary "+" id],&lt;br /&gt;           [op "**" (**) AssocRight],&lt;br /&gt;           [op "*" (*) AssocLeft, op "/" (/) AssocLeft],&lt;br /&gt;           [op "+" (+) AssocLeft, op "-" (-) AssocLeft]&lt;br /&gt;           ]&lt;br /&gt;       op s f assoc = Infix (do{ reservedOp s; return f } &amp;lt;?&amp;gt; "operator") assoc&lt;br /&gt;       unary s f = Prefix (do{ reservedOp s; return f })&lt;br /&gt;&lt;br /&gt;factor :: Parser Double&lt;br /&gt;factor =&lt;br /&gt;   do {&lt;br /&gt;       parens expr;&lt;br /&gt;   } &amp;lt;|&amp;gt; do {&lt;br /&gt;       norf &amp;lt;- naturalOrFloat;&lt;br /&gt;       case norf of&lt;br /&gt;           Left i    -&amp;gt; return $ fromInteger i&lt;br /&gt;           Right f    -&amp;gt; return $ f&lt;br /&gt;   } &amp;lt;?&amp;gt;&lt;br /&gt;       "factor"&lt;br /&gt;&lt;br /&gt;repl :: String -&amp;gt; (String -&amp;gt; Bool) -&amp;gt; (String -&amp;gt; String) -&amp;gt; IO ()&lt;br /&gt;repl prompt bQuit eval = loop&lt;br /&gt;   where&lt;br /&gt;       loop = do&lt;br /&gt;           putStr prompt&lt;br /&gt;           s &amp;lt;- getLine&lt;br /&gt;           if bQuit s&lt;br /&gt;               then return ()&lt;br /&gt;               else putStrLn (eval s) &amp;gt;&amp;gt; loop&lt;br /&gt;&lt;br /&gt;calc :: IO ()&lt;br /&gt;calc = repl "&amp;gt; " (== ":q") (tostring . parse stmt "")&lt;br /&gt;   where&lt;br /&gt;       tostring (Right v)    = show v&lt;br /&gt;       tostring (Left err)    = show err&lt;br /&gt;       stmt = do&lt;br /&gt;           e &amp;lt;- expr&lt;br /&gt;           eof&lt;br /&gt;           return e&lt;br /&gt;&lt;br /&gt;main = hSetBuffering stdout NoBuffering &amp;gt;&amp;gt; putStrLn "type ':q' to quit." &amp;gt;&amp;gt; calc &amp;gt;&amp;gt; putStrLn "Bye"&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It is easy to make tokenizer to use &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-ParserCombinators-Parsec-Token.html#v:makeTokenParser"&gt;makeTokenParser&lt;/a&gt;.&lt;br /&gt;&lt;li&gt;Using &lt;a href="http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Expr.html#v:buildExpressionParser"&gt;buildExpressionParser&lt;/a&gt;, it is easy to make expression parser which has priority.&lt;br /&gt;&lt;li&gt;For printing prompt, use "&lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/System-IO.html#v:hSetBuffering"&gt;hSetBuffering&lt;/a&gt; stdout NoBuffering" for no buffering.&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-6097219370016637809?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/6097219370016637809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=6097219370016637809' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6097219370016637809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6097219370016637809'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/07/make-simple-calculator-using-parsec.html' title='Make Simple Calculator Using Parsec'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-255590859067544498</id><published>2009-04-25T14:40:00.008+09:00</published><updated>2009-04-25T19:33:08.684+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Using DirectX from Haskell</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_WYLt_kRBnr0/SfKjtyBkgWI/AAAAAAAAAu8/u61VBtxCUIo/s1600-h/tut2.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/SfKjtyBkgWI/AAAAAAAAAu8/u61VBtxCUIo/s200/tut2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5328501316050518370" /&gt;&lt;/a&gt;&lt;br /&gt;I try to use DirectX from Haskell. I heard that there were a bindings made by Esa Ilari Vuokko. I got archive, but I can't found the homepage or repositry now, archive only. Anyway, I try to use that bindins.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Prepare&lt;/h4&gt;&lt;br /&gt;This library are for MinGW/MSYS, and need transformation DirectX library for MinGW:&lt;br /&gt;&lt;pre class=prettyprint&gt;cd $DXSDK&lt;br /&gt;mkdir Mingw&lt;br /&gt;cd Mingw&lt;br /&gt;cp ../Lib/x86/*.lib .&lt;br /&gt;rm DxErr*.lib&lt;br /&gt;ls | xargs -n 1 reimp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Build&lt;/h4&gt;&lt;br /&gt;When I tried to compile Setup.hs, raised compile error. The library was made on GHC 6.4, and Its need to be change:&lt;br /&gt;&lt;pre class=prettyprint&gt; main = defaultMainWithHooks defaultUserHooks{preConf=conf, postConf=ok}&lt;br /&gt;     where&lt;br /&gt;-        ok _ _ _ _ = return ExitSuccess&lt;br /&gt;+        ok _ _ _ _ = return ()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Building base&lt;/h4&gt;&lt;br /&gt;When 'install', raise no 'LICENSE' file error. Copy it from root.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Building d3d&lt;/h4&gt;&lt;br /&gt;Need change d3d/DirectX9/D3D/Utility/Init.hs:&lt;br /&gt;&lt;pre class=prettyprint&gt;{- Comment out:&lt;br /&gt;import Graphics.Win32   ( WindowClosure, HWND, mkClassName, loadIcon,&lt;br /&gt;                        , loadCursor, createSolidBrush, rgb, registerClass&lt;br /&gt;                        , showWindow, updateWindow, sendMessage, WPARAM&lt;br /&gt;                        , LPARAM, LRESULT, WindowMessage, defWindowProc&lt;br /&gt;                        , createWindow, getMessage, translateMessage&lt;br /&gt;                        , dispatchMessage, allocaMessage )&lt;br /&gt;import Graphics.Win32   ( iDI_APPLICATION, iDC_ARROW, cS_VREDRAW, cS_HREDRAW&lt;br /&gt;                        , wS_OVERLAPPEDWINDOW, sW_SHOWNORMAL, wM_DESTROY&lt;br /&gt;                        , wM_QUIT, wM_KEYDOWN, vK_ESCAPE )&lt;br /&gt;-}&lt;br /&gt;import Graphics.Win32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Building d3dx&lt;/h4&gt;&lt;br /&gt;No problems.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Make test application&lt;/h4&gt;&lt;br /&gt;Ok, the library was installed. I had tried making &lt;a href="http://msdn.microsoft.com/en-us/library/bb206282(VS.85).aspx"&gt;DirectX's Tutorial 2: Rendering Vertices&lt;/a&gt;:&lt;br /&gt;&lt;script src="http://gist.github.com/101439.js"&gt;&lt;/script&gt;&lt;br /&gt;I got it! I want to make more sample.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-255590859067544498?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/255590859067544498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=255590859067544498' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/255590859067544498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/255590859067544498'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/using-directx-from-haskell.html' title='Using DirectX from Haskell'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WYLt_kRBnr0/SfKjtyBkgWI/AAAAAAAAAu8/u61VBtxCUIo/s72-c/tut2.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-1958163894485775750</id><published>2009-04-16T21:34:00.004+09:00</published><updated>2009-04-16T21:50:28.734+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>'Super Nario' move to github</title><content type='html'>I had making 'Super Nario Bros.' in Haskell.&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=gVLFGQGRsDw&amp;fmt=18"&gt;YouTube - Making 'Super Nario Bros.' in Haskell&lt;/a&gt;:&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/gVLFGQGRsDw&amp;hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/gVLFGQGRsDw&amp;hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.nicovideo.jp/watch/sm4842293"&gt;Haskellで敵を踏み潰したりするゲームを作ってみた‐ニコニコ動画&lt;/a&gt;:&lt;br /&gt;&lt;iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/sm4842293" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"&gt;&lt;a href="http://www.nicovideo.jp/watch/sm4842293"&gt;【ニコニコ動画】Haskellで敵を踏み潰したりするゲームを作ってみた&lt;/a&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Now, source codes move to Github's repository: &lt;a href="http://github.com/mokehehe/monao/tree/master"&gt;http://github.com/mokehehe/monao/tree/master&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And change name 'Nario' to 'Monao'. 'Monao' means 'Monadic man' in Japanese. Sounds like haskellish, huh? Please check it out, and give me advices!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-1958163894485775750?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/1958163894485775750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=1958163894485775750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1958163894485775750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1958163894485775750'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/super-nario-move-to-github.html' title='&apos;Super Nario&apos; move to github'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8117010077809393796</id><published>2009-04-16T02:02:00.004+09:00</published><updated>2009-04-16T02:08:50.630+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Using SDL-mixer in Haskell</title><content type='html'>I had tried to use SDL-mixer in Haskell several times, but always I hit the wall.&lt;br /&gt;Today, I found a good tutorial for SDL-mixer in C: &lt;a href="http://www.kekkai.org/roger/sdl/mixer/"&gt;SDL_Mixer Tutorial&lt;/a&gt;, and I try same sequence in Haskell again.&lt;br /&gt;But unfortunately, I've got some error.&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;$ ghc --make sdl-mixer-test2.hs&lt;br /&gt;Linking sdl-mixer-test2 ...&lt;br /&gt;/home/foo/.cabal/lib/SDL-mixer-0.5.2/ghc-6.8.2/libHSSDL-mixer-0.5.2.a(Samples.o): In function `s5wy_info':&lt;br /&gt;(.text+0x25d): undefined reference to `Mix_LoadWAV'&lt;br /&gt;collect2: ld はステータス 1 で終了しました&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It said, undefined reference to `Mix_LoadWAV'. In /usr/local/include/SDL/SDL_mixer.h,&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#define Mix_LoadWAV(file) Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are no function body. Maybe it has changed something.&lt;br /&gt;So I update &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-mixer"&gt;SDL-mixer&lt;/a&gt; and &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL"&gt;SDL&lt;/a&gt; to 0.5.5, and try again, then got it!&lt;br /&gt;&lt;br /&gt;Here are sample in Haskell, like original C version:&lt;br /&gt;&lt;script src="http://gist.github.com/95700.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8117010077809393796?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8117010077809393796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8117010077809393796' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8117010077809393796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8117010077809393796'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/using-sdl-mixer-in-haskell.html' title='Using SDL-mixer in Haskell'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-5015513422741426826</id><published>2009-04-09T08:52:00.013+09:00</published><updated>2009-04-15T01:08:14.702+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>A Picture Language on BiwaScheme</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Sd8Kw1hqRDI/AAAAAAAAAuc/d_gXqeESvzc/s1600-h/pict.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Sd8Kw1hqRDI/AAAAAAAAAuc/d_gXqeESvzc/s200/pict.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322985118693475378" /&gt;&lt;/a&gt;&lt;br /&gt;I am playing on BiwaScheme these days. &lt;a href="http://mono.kmc.gr.jp/~yhara/biwascheme/"&gt;BiwaScheme&lt;/a&gt; is the hotest implementation of Scheme on JavaScript. It run on your web browser!&lt;br /&gt;It has no functional references, specifications, and less runtime debug information, but maybe it could fix soon, and it almost works along to R6RS!&lt;br /&gt;Because of its famility of JavaScript, it is easy to use DHTML. So I decidede to make "A Picture Language" in &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#%_sec_2.2.4"&gt;SICP 2.2.4&lt;/a&gt;. It was easy job. I wrote a little Scheme code, and a little HTML. Got it!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.mokehehe.com/temp/scm2js/biwascheme/demo/pictlang.html"&gt;&lt;b&gt;A Picture Language&lt;/b&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;It's run on full scheme feature, so you can make any image that you want. If you want to draw a picture of mandara, just put code and push 'draw' button:&lt;br /&gt;&lt;pre class="prettyprint" style="height:200px;"&gt;&lt;br /&gt;(define (transform-painter painter origin corner1 corner2)&lt;br /&gt;  (lambda (frame)&lt;br /&gt;    (let ((m (frame-coord-map frame)))&lt;br /&gt;      (let ((new-origin (m origin)))&lt;br /&gt;        (painter&lt;br /&gt;         (make-frame new-origin&lt;br /&gt;                     (sub-vect (m corner1) new-origin)&lt;br /&gt;                     (sub-vect (m corner2) new-origin)))))))&lt;br /&gt;&lt;br /&gt;(define (flip-vert painter)&lt;br /&gt;  (transform-painter painter&lt;br /&gt;                     (make-vect 0.0 1.0)&lt;br /&gt;                     (make-vect 1.0 1.0)&lt;br /&gt;                     (make-vect 0.0 0.0)))&lt;br /&gt;&lt;br /&gt;(define (flip-horiz painter)&lt;br /&gt;  (transform-painter painter&lt;br /&gt;                     (make-vect 1.0 0.0)&lt;br /&gt;                     (make-vect 0.0 0.0)&lt;br /&gt;                     (make-vect 1.0 1.0)))&lt;br /&gt;&lt;br /&gt;(define (compose-painters . painters)&lt;br /&gt;  (lambda (frame)&lt;br /&gt;    (for-each (lambda (painter)&lt;br /&gt;                (painter frame))&lt;br /&gt;              painters)))&lt;br /&gt;&lt;br /&gt;(define (beside painter1 painter2)&lt;br /&gt;  (let ((split-point (make-vect 0.5 0.0)))&lt;br /&gt;    (let ((paint-left&lt;br /&gt;           (transform-painter painter1&lt;br /&gt;                              (make-vect 0.0 0.0)&lt;br /&gt;                              split-point&lt;br /&gt;                              (make-vect 0.0 1.0)))&lt;br /&gt;          (paint-right&lt;br /&gt;           (transform-painter painter2&lt;br /&gt;                              split-point&lt;br /&gt;                              (make-vect 1.0 0.0)&lt;br /&gt;                              (make-vect 0.5 1.0))))&lt;br /&gt;      (compose-painters paint-left paint-right))))&lt;br /&gt;&lt;br /&gt;(define (below painter1 painter2)&lt;br /&gt;  (let ((split-point (make-vect 0.0 0.5)))&lt;br /&gt;    (let ((paint-top&lt;br /&gt;           (transform-painter painter1&lt;br /&gt;                              (make-vect 0.0 0.0)&lt;br /&gt;                              (make-vect 1.0 0.0)&lt;br /&gt;                              split-point))&lt;br /&gt;          (paint-bottom&lt;br /&gt;           (transform-painter painter2&lt;br /&gt;                              split-point&lt;br /&gt;                              (make-vect 1.0 0.5)&lt;br /&gt;                              (make-vect 0.0 1.0))))&lt;br /&gt;      (compose-painters paint-top paint-bottom))))&lt;br /&gt;&lt;br /&gt;(define (split f1 f2)&lt;br /&gt;  (define (recur painter n)&lt;br /&gt;    (if (= n 0)&lt;br /&gt;        painter&lt;br /&gt;      (let ((smaller (recur painter (- n 1))))&lt;br /&gt;        (f1 painter (f2 smaller smaller)))))&lt;br /&gt;  recur)&lt;br /&gt;&lt;br /&gt;(define right-split (split beside below))&lt;br /&gt;(define up-split (split below beside))&lt;br /&gt;&lt;br /&gt;(define (corner-split painter n)&lt;br /&gt;  (if (= n 0)&lt;br /&gt;      painter&lt;br /&gt;      (let ((up (up-split painter (- n 1)))&lt;br /&gt;            (right (right-split painter (- n 1))))&lt;br /&gt;        (let ((top-left (beside up up))&lt;br /&gt;              (bottom-right (below right right))&lt;br /&gt;              (corner (corner-split painter (- n 1))))&lt;br /&gt;          (beside (below painter top-left)&lt;br /&gt;                  (below bottom-right corner))))))&lt;br /&gt;&lt;br /&gt;(define (mirror painter)&lt;br /&gt;  (below (flip-vert (beside (flip-horiz painter) painter))&lt;br /&gt;         (beside (flip-horiz painter) painter)))&lt;br /&gt;&lt;br /&gt;(mirror (corner-split %image 2))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You want to use BiwaScheme? Check &lt;a href="http://github.com/yhara/biwascheme/tree/master"&gt;github's master repository&lt;/a&gt; and pull it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-5015513422741426826?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/5015513422741426826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=5015513422741426826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5015513422741426826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5015513422741426826'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/picture-language-on-biwascheme.html' title='A Picture Language on BiwaScheme'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WYLt_kRBnr0/Sd8Kw1hqRDI/AAAAAAAAAuc/d_gXqeESvzc/s72-c/pict.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-6049457169024854363</id><published>2009-04-09T04:11:00.007+09:00</published><updated>2009-04-09T04:53:21.072+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>hsSDL can't install on GHC 6.10.2, Windows/Cygwin</title><content type='html'>I install newest version of &lt;a href="http://haskell.org/ghc/"&gt;GHC&lt;/a&gt;, 6.10.2, and I try to use &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL"&gt;Graphics.UI.SDL&lt;/a&gt;, but I can't.&lt;br /&gt;I didn't use &lt;a href="http://www.haskell.org/cabal/"&gt;cabal&lt;/a&gt;, tried to install manually. But it occured error in building C source part.&lt;div&gt;I edited sdl.cabal, add&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Include-Dirs: C:\SDL-1.2.12\include&lt;/div&gt;&lt;div&gt;Extra-Lib-Dirs: C:\SDL-1.2.12\lib&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;and change&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Extra-Libraries: SDL.dll SDLmain&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;"runghc Setup.lhs configure" is passed safely, but in "runghc Setup.lhs build", I got these errors:&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;$ runghc Setup.lhs build&lt;br /&gt;&lt;br /&gt;Setup.lhs:2:2:&lt;br /&gt;Warning: In the use of `defaultUserHooks'&lt;br /&gt;         (imported from Distribution.Simple):&lt;br /&gt;         Deprecated: "Use simpleUserHooks or autoconfUserHooks, unless you n&lt;br /&gt;eed Cabal-1.2&lt;br /&gt;         compatibility in which case you must stick with defaultUserHooks"&lt;br /&gt;Preprocessing library SDL-0.5.5...&lt;br /&gt;dist\build\Graphics\UI\SDL\General_hsc_make.o:General_hsc_make.c:(.text+0x0): mu&lt;br /&gt;ltiple definition of `main'&lt;br /&gt;C:\ghc\ghc-6.10.2/gcc-lib/libmingw32.a(main.o):main.c:(.text+0x0): first defined&lt;br /&gt;here&lt;br /&gt;C:\ghc\ghc-6.10.2/gcc-lib/libmingw32.a(main.o):main.c:(.text+0x104): undefined r&lt;br /&gt;eference to `WinMain@16'&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;linking dist\build\Graphics\UI\SDL\General_hsc_make.o failed&lt;br /&gt;command was: C:\ghc\ghc-6.10.2\gcc.exe -BC:\ghc\ghc-6.10.2\gcc-lib -IC:\ghc\ghc-&lt;br /&gt;6.10.2\include\mingw -LC:\temp\SDL-1.2.12\lib -lSDL.dll -lSDLmain -L/cygdrive/c/&lt;br /&gt;cygwin/usr/local/lib -lSDLmain -lSDL -lmingw32 -mwindows -LC:\ghc\ghc-6.10.2\bas&lt;br /&gt;e-4.1.0.0 -lwsock32 -lmsvcrt -lkernel32 -luser32 -lshell32 -LC:\ghc\ghc-6.10.2\i&lt;br /&gt;nteger-0.1.0.1 -LC:\ghc\ghc-6.10.2\ghc-prim-0.1.0.0 -LC:\ghc\ghc-6.10.2 -LC:\ghc&lt;br /&gt;\ghc-6.10.2/gcc-lib -lm -lffi -lgmp -lwsock32 dist\build\Graphics\UI\SDL\General&lt;br /&gt;_hsc_make.o -o dist\build\Graphics\UI\SDL\General_hsc_make.exe&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;What am I wrong?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I checked path, configure, and tried several times. But it never succeeded. So, I uninstall GHC 6.10.2, and downgrade to GHC 6.8.3, and try same sequence. then I can install. Why? Is there anyone to have same trouble?&lt;/div&gt;&lt;div&gt;In the past, when I tried to use &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLUT"&gt;Graphics.UI.GLUT&lt;/a&gt;, I've got same kinds of trouble. I want to use GHC 6.10.2, but its happens, I can't.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-6049457169024854363?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/6049457169024854363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=6049457169024854363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6049457169024854363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6049457169024854363'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/hssdl-cant-work-on-ghc-6102.html' title='hsSDL can&apos;t install on GHC 6.10.2, Windows/Cygwin'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-1895986423924285317</id><published>2009-04-01T21:46:00.012+09:00</published><updated>2009-04-01T22:50:34.570+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>AO bench in Haskell</title><content type='html'>&lt;a href="http://lucille.atso-net.jp/aobench/"&gt;AO bench&lt;/a&gt; (Ambient Occlusion benchmark) is a test program for any computer languages. It is simple algorithm, and get nifty image.&lt;br /&gt;I wrote AO bench in Haskell. First, I translated from C source, and got worked. But it was not good at all. It's not Haskell way. Haskell program must be clean, easy to read, and compact.&lt;br /&gt;I refactor it, so bit suit for Haskell way. But then, it got more slowly. Maybe I make anything to leak of memory. Please help me, and make Haskell fastest in all of the languages!&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="height:300px;"&gt;&lt;br /&gt;module Main () where&lt;br /&gt;&lt;br /&gt;import System (getArgs)&lt;br /&gt;import System.IO (withBinaryFile, IOMode(..), hPutStrLn)&lt;br /&gt;import System.Random.Mersenne&lt;br /&gt;import Data.Maybe (catMaybes, listToMaybe)&lt;br /&gt;import Data.List (sort)&lt;br /&gt;import qualified Data.ByteString.Char8 as B&lt;br /&gt;&lt;br /&gt;data Vec = Vec {&lt;br /&gt;      x :: Double,&lt;br /&gt;      y :: Double,&lt;br /&gt;      z :: Double&lt;br /&gt;    } deriving (Eq)&lt;br /&gt;&lt;br /&gt;data Isect = Isect {&lt;br /&gt;      isect_t :: Double,&lt;br /&gt;      isect_p :: Vec,&lt;br /&gt;      isect_n :: Vec&lt;br /&gt;    } deriving (Eq)&lt;br /&gt;&lt;br /&gt;instance Ord Isect where&lt;br /&gt;    i1 &amp;lt; i2   = isect_t i1 &amp;lt; isect_t i2&lt;br /&gt;    i1 &amp;gt; i2   = isect_t i1 &amp;gt; isect_t i2&lt;br /&gt;    i1 &amp;lt;= i2  = isect_t i1 &amp;lt;= isect_t i2&lt;br /&gt;    i1 &amp;gt;= i2  = isect_t i1 &amp;gt;= isect_t i2&lt;br /&gt;&lt;br /&gt;data Sphere = Sphere {&lt;br /&gt;      sphere_center :: Vec,&lt;br /&gt;      sphere_radius :: Double&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;data Plane = Plane {&lt;br /&gt;      plane_p :: Vec,&lt;br /&gt;      plane_n :: Vec&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;data Ray = Ray {&lt;br /&gt;      ray_org :: Vec,&lt;br /&gt;      ray_dir :: Vec&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;type Point = (Int, Int)&lt;br /&gt;&lt;br /&gt;-- Floatint-point Color&lt;br /&gt;type FColor = Vec&lt;br /&gt;&lt;br /&gt;sq :: Num a =&amp;gt; a -&amp;gt; a&lt;br /&gt;sq x = x * x&lt;br /&gt;&lt;br /&gt;clamp :: Ord a =&amp;gt; a -&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;clamp lower upper = min upper . max lower&lt;br /&gt;&lt;br /&gt;i2d :: Int -&amp;gt; Double&lt;br /&gt;i2d = toEnum&lt;br /&gt;&lt;br /&gt;fpcol2icol vec = (f2i (x vec), f2i (y vec), f2i (z vec))&lt;br /&gt;f2i = clamp 0 255 . floor . (* 255.99)&lt;br /&gt;&lt;br /&gt;drand48 :: IO Double&lt;br /&gt;drand48 = getStdGen &amp;gt;&amp;gt;= random&lt;br /&gt;&lt;br /&gt;justIf :: a -&amp;gt; Bool -&amp;gt; Maybe a&lt;br /&gt;val `justIf` cond&lt;br /&gt;    | cond      = Just val&lt;br /&gt;    | otherwise = Nothing&lt;br /&gt;&lt;br /&gt;zerovec = Vec { x = 0, y = 0, z = 0 }&lt;br /&gt;white = Vec { x = 1, y = 1, z = 1 }&lt;br /&gt;&lt;br /&gt;v0 `vadd` v1 = Vec (x v0 + x v1) (y v0 + y v1) (z v0 + z v1)&lt;br /&gt;v0 `vsub` v1 = Vec (x v0 - x v1) (y v0 - y v1) (z v0 - z v1)&lt;br /&gt;v0 `vscale` s = Vec (x v0 * s) (y v0 * s) (z v0 * s)&lt;br /&gt;&lt;br /&gt;v0 `vdot` v1 = (x v0 * x v1) + (y v0 * y v1) + (z v0 * z v1)&lt;br /&gt;&lt;br /&gt;v0 `vcross` v1 = Vec cx cy cz&lt;br /&gt;    where&lt;br /&gt;      cx = y v0 * z v1 - z v0 * y v1&lt;br /&gt;      cy = z v0 * x v1 - x v0 * z v1&lt;br /&gt;      cz = x v0 * y v1 - y v0 * x v1&lt;br /&gt;&lt;br /&gt;vlength c = sqrt $ c `vdot` c&lt;br /&gt;&lt;br /&gt;vnormalize c&lt;br /&gt;    | l &amp;gt; 1.0e-17        = c `vscale` (1.0 / l)&lt;br /&gt;    | otherwise                = c&lt;br /&gt;    where&lt;br /&gt;      l = vlength c&lt;br /&gt;&lt;br /&gt;vaverage :: [Vec] -&amp;gt; Vec&lt;br /&gt;vaverage vecs = vsum `vscale` (1.0 / i2d vecnum)&lt;br /&gt;    where vsum = foldl vadd zerovec vecs&lt;br /&gt;          vecnum = length vecs&lt;br /&gt;&lt;br /&gt;ray_sphere_intersect :: Ray -&amp;gt; Sphere -&amp;gt; Maybe Isect&lt;br /&gt;ray_sphere_intersect ray sphere =&lt;br /&gt;    isect `justIf` (d &amp;gt; 0.0 &amp;&amp; t &amp;gt; 0.0)&lt;br /&gt;    where&lt;br /&gt;      rs = ray_org ray `vsub` sphere_center sphere&lt;br /&gt;      b = rs `vdot` ray_dir ray&lt;br /&gt;      c = rs `vdot` rs - sq (sphere_radius sphere)&lt;br /&gt;      d = b * b - c&lt;br /&gt;      t = -b - sqrt d&lt;br /&gt;      hitpos = ray_org ray `vadd` (ray_dir ray `vscale` t)&lt;br /&gt;      isect = Isect {&lt;br /&gt;                isect_t = t,&lt;br /&gt;                isect_p = hitpos,&lt;br /&gt;                isect_n = vnormalize $ hitpos `vsub` sphere_center sphere&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;ray_plane_intersect :: Ray -&amp;gt; Plane -&amp;gt; Maybe Isect&lt;br /&gt;ray_plane_intersect ray plane =&lt;br /&gt;    isect `justIf` (abs v &amp;gt;= 1.0e-17 &amp;&amp; t &amp;gt; 0)&lt;br /&gt;    where&lt;br /&gt;      d = -(plane_p plane `vdot` plane_n plane)&lt;br /&gt;      v = ray_dir ray `vdot` plane_n plane&lt;br /&gt;      t = -(ray_org ray `vdot` plane_n plane + d) / v&lt;br /&gt;      isect = Isect {&lt;br /&gt;                isect_t = t,&lt;br /&gt;                isect_p = ray_org ray `vadd` (ray_dir ray `vscale` t),&lt;br /&gt;                isect_n = plane_n plane&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;orthoBasis :: Vec -&amp;gt; (Vec, Vec, Vec)&lt;br /&gt;orthoBasis n = (basis0, basis1, basis2)&lt;br /&gt;    where&lt;br /&gt;      basis2 = n&lt;br /&gt;      basis1'&lt;br /&gt;          | x n &amp;lt; 0.6 &amp;&amp; x n &amp;gt; -0.6  = Vec { x = 1, y = 0, z = 0 }&lt;br /&gt;          | y n &amp;lt; 0.6 &amp;&amp; y n &amp;gt; -0.6  = Vec { x = 0, y = 1, z = 0 }&lt;br /&gt;          | z n &amp;lt; 0.6 &amp;&amp; z n &amp;gt; -0.6  = Vec { x = 0, y = 0, z = 1 }&lt;br /&gt;          | otherwise                = Vec { x = 1, y = 0, z = 0 }&lt;br /&gt;      basis0 = vnormalize $ basis1' `vcross` basis2&lt;br /&gt;      basis1 = vnormalize $ basis2 `vcross` basis0&lt;br /&gt;&lt;br /&gt;hemisphereDirectionRay :: Vec -&amp;gt; Vec -&amp;gt; Double -&amp;gt; Double -&amp;gt; Ray&lt;br /&gt;hemisphereDirectionRay p n r1 r2 =&lt;br /&gt;    Ray { ray_org = p, ray_dir = r }&lt;br /&gt;    where&lt;br /&gt;      theta = sqrt r1&lt;br /&gt;      phi = 2.0 * pi * r2&lt;br /&gt;      v = Vec {&lt;br /&gt;            x = cos phi * theta,&lt;br /&gt;            y = sin phi * theta,&lt;br /&gt;            z = sqrt $ 1.0 - sq theta&lt;br /&gt;          }&lt;br /&gt;      -- local -&amp;gt; global&lt;br /&gt;      (basis0, basis1, basis2) = orthoBasis n&lt;br /&gt;      r = Vec {&lt;br /&gt;            x = x v * x basis0 + y v * x basis1 + z v * x basis2,&lt;br /&gt;            y = x v * y basis0 + y v * y basis1 + z v * y basis2,&lt;br /&gt;            z = x v * z basis0 + y v * z basis1 + z v * z basis2&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;randomHemisphereRay :: Vec -&amp;gt; Vec -&amp;gt; IO Ray&lt;br /&gt;randomHemisphereRay p n = do&lt;br /&gt;  r1 &amp;lt;- drand48&lt;br /&gt;  r2 &amp;lt;- drand48&lt;br /&gt;  return $ hemisphereDirectionRay p n r1 r2&lt;br /&gt;&lt;br /&gt;data Object = ObjSphere Sphere | ObjPlane Plane&lt;br /&gt;&lt;br /&gt;findRayObjIntersect :: Ray -&amp;gt; Object -&amp;gt; Maybe Isect&lt;br /&gt;findRayObjIntersect ray (ObjSphere sphere) = ray_sphere_intersect ray sphere&lt;br /&gt;findRayObjIntersect ray (ObjPlane  plane)  = ray_plane_intersect  ray plane&lt;br /&gt;&lt;br /&gt;isHitOccluder :: [Object] -&amp;gt; Ray -&amp;gt; Bool&lt;br /&gt;isHitOccluder objs ray =&lt;br /&gt;    not $ null $ catMaybes $ map (findRayObjIntersect ray) objs&lt;br /&gt;&lt;br /&gt;ambient_occlusion :: [Object] -&amp;gt; Int -&amp;gt; Isect -&amp;gt; IO FColor&lt;br /&gt;ambient_occlusion objs nao_samples isect = do&lt;br /&gt;  randomRays &amp;lt;- sequence $ replicate nsample $ randomHemisphereRay p n&lt;br /&gt;  let occludedNum = length [ray | ray &amp;lt;- randomRays, isHitOccluder objs ray]&lt;br /&gt;  return $ vscale white $ 1.0 - occludedRatio occludedNum&lt;br /&gt;    where&lt;br /&gt;      eps = 0.0001&lt;br /&gt;      n = isect_n isect&lt;br /&gt;      p = isect_p isect `vadd` (n `vscale` eps)&lt;br /&gt;      nsample = sq nao_samples&lt;br /&gt;      occludedRatio occludedSampleNum =&lt;br /&gt;          i2d occludedSampleNum / i2d nsample&lt;br /&gt;&lt;br /&gt;screenRay :: Int -&amp;gt; Int -&amp;gt; Point -&amp;gt; Ray&lt;br /&gt;screenRay w h (x, y) =&lt;br /&gt;    Ray { ray_org = zerovec, ray_dir = vnormalize (Vec { x = px, y = py, z = -1 }) }&lt;br /&gt;    where&lt;br /&gt;      px = (i2d x - w_2) / w_2&lt;br /&gt;      py = -(i2d y - h_2) / h_2&lt;br /&gt;      w_2 = i2d w / 2.0&lt;br /&gt;      h_2 = i2d h / 2.0&lt;br /&gt;&lt;br /&gt;findNearestIsect :: [Object] -&amp;gt; Ray -&amp;gt; Maybe Isect&lt;br /&gt;findNearestIsect objs ray =&lt;br /&gt;    listToMaybe $ sort $ catMaybes $ map (findRayObjIntersect ray) objs&lt;br /&gt;&lt;br /&gt;data Scene = Scene {&lt;br /&gt;      scene_objs :: [Object]&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;raytrace :: (Maybe Isect -&amp;gt; IO FColor) -&amp;gt; [Object] -&amp;gt; Ray -&amp;gt; IO FColor&lt;br /&gt;raytrace fShading objs ray =&lt;br /&gt;    fShading $ findNearestIsect objs ray&lt;br /&gt;&lt;br /&gt;oversampling :: (Point -&amp;gt; IO FColor) -&amp;gt; Int -&amp;gt; IO FColor&lt;br /&gt;oversampling fCalcCol nsubsamples =&lt;br /&gt;  mapM fCalcCol subpixels &amp;gt;&amp;gt;= return . vaverage&lt;br /&gt;    where&lt;br /&gt;      subpixels = [(u, v) | v &amp;lt;- [0 .. nsubsamples-1], u &amp;lt;- [0 .. nsubsamples-1]]&lt;br /&gt;&lt;br /&gt;renderSubsampledRayTracePixel :: (Ray -&amp;gt; IO FColor) -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Point -&amp;gt; IO FColor&lt;br /&gt;renderSubsampledRayTracePixel fTrace w h nsubsamples (x, y) =&lt;br /&gt;  oversampling calcCol nsubsamples&lt;br /&gt;    where&lt;br /&gt;      calcCol = fTrace . screenRay subedWidth subedHeight . subedPoint&lt;br /&gt;      subedPoint (u, v) = (x * nsubsamples + u, y * nsubsamples + v)&lt;br /&gt;      subedWidth = w * nsubsamples&lt;br /&gt;      subedHeight = h * nsubsamples&lt;br /&gt;&lt;br /&gt;renderScreen :: Int -&amp;gt; Int -&amp;gt; (Point -&amp;gt; IO col) -&amp;gt; IO [col]&lt;br /&gt;renderScreen w h fRenderPixel =&lt;br /&gt;  mapM fRenderPixel screenPixels&lt;br /&gt;    where&lt;br /&gt;      screenPixels = [(x, y) | y &amp;lt;- [0 .. h-1], x &amp;lt;- [0 .. w-1]]&lt;br /&gt;&lt;br /&gt;renderSceneByAmbientOcclusion :: Scene -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; IO [(Int, Int, Int)]&lt;br /&gt;renderSceneByAmbientOcclusion scene w h nsubsamples nao_samples = do&lt;br /&gt;  fimg &amp;lt;- renderScreen w h calcPixelColor&lt;br /&gt;  return $ map fpcol2icol fimg&lt;br /&gt;    where&lt;br /&gt;      calcPixelColor = renderSubsampledRayTracePixel (raytrace shading objs) w h nsubsamples&lt;br /&gt;      shading Nothing = return zerovec&lt;br /&gt;      shading (Just isect) = ambient_occlusion objs nao_samples isect&lt;br /&gt;      objs = scene_objs scene&lt;br /&gt;&lt;br /&gt;saveppm :: String -&amp;gt; Int -&amp;gt; Int -&amp;gt; [(Int, Int, Int)] -&amp;gt; IO ()&lt;br /&gt;saveppm fname w h img =&lt;br /&gt;    withBinaryFile fname WriteMode $ \fp -&amp;gt; do&lt;br /&gt;      hPutStrLn fp "P6"&lt;br /&gt;      hPutStrLn fp $ show w ++ " " ++ show h&lt;br /&gt;      hPutStrLn fp "255"&lt;br /&gt;      B.hPut fp $ B.pack $ map toEnum $ concatMap (\(r,g,b) -&amp;gt; [r,g,b]) img&lt;br /&gt;&lt;br /&gt;init_scene = Scene {&lt;br /&gt;               scene_objs = [&lt;br /&gt;                ObjSphere (Sphere { sphere_center = Vec { x = -2.0, y = 0.0, z = -3.5 }, sphere_radius = 0.5 }),&lt;br /&gt;                ObjSphere (Sphere { sphere_center = Vec { x = -0.5, y = 0.0, z = -3.0 }, sphere_radius = 0.5 }),&lt;br /&gt;                ObjSphere (Sphere { sphere_center = Vec { x =  1.0, y = 0.0, z = -2.2 }, sphere_radius = 0.5 }),&lt;br /&gt;                ObjPlane  (Plane  { plane_p = Vec { x = 0.0, y = -0.5, z = 0.0 }, plane_n = Vec { x = 0.0, y = 1.0, z = 0.0 } })&lt;br /&gt;               ]&lt;br /&gt;             }&lt;br /&gt;&lt;br /&gt;getParam idx defaultVal args&lt;br /&gt;    | length args &amp;gt; idx  = args !! idx&lt;br /&gt;    | otherwise          = defaultVal&lt;br /&gt;&lt;br /&gt;main = do&lt;br /&gt;  args &amp;lt;- getArgs&lt;br /&gt;  let width  = read $ getParam 0 "256" args&lt;br /&gt;  let height = read $ getParam 1 "256" args&lt;br /&gt;  let nsubsamples = read $ getParam 2 "2" args&lt;br /&gt;  let nao_samples = read $ getParam 3 "8" args&lt;br /&gt;&lt;br /&gt;  img &amp;lt;- renderSceneByAmbientOcclusion init_scene width height nsubsamples nao_samples&lt;br /&gt;  saveppm "ao.ppm" width height img&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-1895986423924285317?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/1895986423924285317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=1895986423924285317' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1895986423924285317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1895986423924285317'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2009/04/ao-bench-in-haskell.html' title='AO bench in Haskell'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-2975017689785341533</id><published>2008-05-10T08:13:00.001+09:00</published><updated>2008-05-10T08:15:50.912+09:00</updated><title type='text'>Three implementation models for scheme</title><content type='html'>I'm reading "&lt;a href="http://www.cs.indiana.edu/~dyb/papers/3imp.pdf"&gt;Three implementation models for scheme&lt;/a&gt;" these days. It describe how to implement scheme compiler and virtual machine. It is very good manual to novice scheme implementor.&lt;br /&gt;Now I'm trying to implement stack-based model. I couldn't really understand very well, at first read. Again, I'm reading chapter 4, with implementing step by step.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-2975017689785341533?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/2975017689785341533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=2975017689785341533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2975017689785341533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2975017689785341533'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2008/05/three-implementation-models-for-scheme.html' title='Three implementation models for scheme'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-3523426789627679823</id><published>2008-03-09T20:49:00.002+09:00</published><updated>2008-03-09T20:49:30.424+09:00</updated><title type='text'>Nicovideo</title><content type='html'>I enjoy this movie.&lt;br /&gt;&lt;iframe width="312" height="176" src="http://www.nicovideo.jp/thumb/sm2539470" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"&gt;&lt;a href="http://www.nicovideo.jp/watch/sm2535959"&gt;【ニコニコ動画】ニコニコ動画ランキング in YouTube　25-11&lt;/a&gt;&lt;/iframe&gt;&lt;br /&gt;How japanese anime, game, mad movie loved in the world!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-3523426789627679823?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/3523426789627679823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=3523426789627679823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/3523426789627679823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/3523426789627679823'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2008/03/nicovideo.html' title='Nicovideo'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8046238899418921351</id><published>2007-11-06T09:10:00.000+09:00</published><updated>2007-11-06T09:38:26.666+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Time Runs Away</title><content type='html'>Oh! It's already November! I can't believe it! I work hard every day, and time runs away so fast.&lt;br /&gt;&lt;br /&gt;Today I cook pasta even in the morning. Because shelf life of foods in my refrigerator is nearly dead line. Today's material is garlic chives, &lt;a href="http://en.wikipedia.org/wiki/Moyashi"&gt;moyashi&lt;/a&gt;, and default materials, such as garlic, capsicum annuum. No meet, Oh! what a vegetarian I am!&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/Ry-yDXGXdPI/AAAAAAAAAEo/RGRYoJ4LYEU/s1600-h/img604.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/Ry-yDXGXdPI/AAAAAAAAAEo/RGRYoJ4LYEU/s200/img604.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5129514271408354546" /&gt;&lt;/a&gt; Too many moyashi...? I don't care!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/Ry-x23GXdOI/AAAAAAAAAEg/qW7Vd25t_BA/s1600-h/img605.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/Ry-x23GXdOI/AAAAAAAAAEg/qW7Vd25t_BA/s200/img605.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5129514056659989730" /&gt;&lt;/a&gt; Complete! It's good taste. To human being, only salt and oil, it's can almost eat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8046238899418921351?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8046238899418921351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8046238899418921351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8046238899418921351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8046238899418921351'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/11/time-runs-away.html' title='Time Runs Away'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WYLt_kRBnr0/Ry-yDXGXdPI/AAAAAAAAAEo/RGRYoJ4LYEU/s72-c/img604.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-1806392418165481212</id><published>2007-08-12T14:17:00.000+09:00</published><updated>2007-08-12T14:37:23.598+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Too Hot...</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rr6ZwXvuuoI/AAAAAAAAAEA/OSWkjUOOT_o/s1600-h/img587.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rr6ZwXvuuoI/AAAAAAAAAEA/OSWkjUOOT_o/s200/img587.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5097680884516960898" /&gt;&lt;/a&gt;&lt;br /&gt;It is too hot these days. You know, when we see &lt;a href="http://en.wikipedia.org/wiki/Cumulonimbus_cloud"&gt;Cumulonimbus cloud&lt;/a&gt;, we feel summer.&lt;br /&gt;Because of this hot temperature, we can't stop using air conditioner. We can't think nothing without comfotable temperature using it. But it is bad spiral. We use it, so the Earth heat. Then we use it more and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-1806392418165481212?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/1806392418165481212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=1806392418165481212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1806392418165481212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1806392418165481212'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/08/too-hot.html' title='Too Hot...'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WYLt_kRBnr0/Rr6ZwXvuuoI/AAAAAAAAAEA/OSWkjUOOT_o/s72-c/img587.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-7372348836730415601</id><published>2007-08-09T07:57:00.000+09:00</published><updated>2007-08-27T22:02:14.060+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>FERMAT'S LAST THEOREM</title><content type='html'>I read a book, "&lt;a href="http://www.simonsingh.net/Fermat_Corner.html"&gt;FERMAT'S LAST THEOREM&lt;/a&gt;" by &lt;a href="http://www.simonsingh.net/"&gt;Simon Singh&lt;/a&gt;. It was very exciting. I didn't know, mathematics world has this exciting adventure in recent years!&lt;br /&gt;I think Simon Singh is very good storyteller. He tells essence of story. you don't need familiar with mathematics.&lt;br /&gt;&lt;br /&gt;Video:&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=8269328330690408516&amp;hl=en" flashvars=""&gt; &lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-7372348836730415601?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/7372348836730415601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=7372348836730415601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/7372348836730415601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/7372348836730415601'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/08/fermats-last-theorem.html' title='FERMAT&apos;S LAST THEOREM'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-2211431445053987895</id><published>2007-08-08T08:01:00.000+09:00</published><updated>2007-11-06T09:40:09.059+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Nuka-Duke</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rrj77nvuunI/AAAAAAAAAD4/sA4TT67w-UQ/s1600-h/img586.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5096099980069747314" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rrj77nvuunI/AAAAAAAAAD4/sA4TT67w-UQ/s200/img586.jpg" border="0" /&gt;&lt;/a&gt; I bought instant "&lt;a href="http://www.sbotodoke.com/app/catalog/goods?gdsid=08519"&gt;Nuka-Duke kit&lt;/a&gt;" (Nuka-Duke is similar to pickled cucumber) in super-market. Usually, &lt;span&gt;&lt;a href="http://en.wikipedia.org/wiki/Bran"&gt;Nuka-Doko&lt;/a&gt; &lt;/span&gt;need maintenance per day, and can use many times. But this kit don't need maintenance, and can use only about ten times.&lt;br /&gt;&lt;br /&gt;Nuka-Doko is little smelly. Oh, what strange food!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-2211431445053987895?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/2211431445053987895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=2211431445053987895' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2211431445053987895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2211431445053987895'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/08/nuka-duke.html' title='Nuka-Duke'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WYLt_kRBnr0/Rrj77nvuunI/AAAAAAAAAD4/sA4TT67w-UQ/s72-c/img586.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-9082511059698955912</id><published>2007-05-26T10:33:00.000+09:00</published><updated>2007-11-06T09:40:22.612+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Squid Ink Spaghetti</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/RleOl6aUJ5I/AAAAAAAAADk/JTJtr-eLqBM/s1600-h/img568.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5068676687614715794" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/RleOl6aUJ5I/AAAAAAAAADk/JTJtr-eLqBM/s200/img568.jpg" border="0" /&gt;&lt;/a&gt; I used retort "squid sumi &amp;amp; Pomodoro" source (&lt;a href="http://www.kewpie.co.jp/italiante/pasta04.html"&gt;Kewpie&lt;/a&gt;). It's easy and delicious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-9082511059698955912?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/9082511059698955912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=9082511059698955912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/9082511059698955912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/9082511059698955912'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/05/squid-ink-spaghetti.html' title='Squid Ink Spaghetti'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WYLt_kRBnr0/RleOl6aUJ5I/AAAAAAAAADk/JTJtr-eLqBM/s72-c/img568.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-1651055339567414794</id><published>2007-05-06T16:05:00.000+09:00</published><updated>2007-11-06T09:40:47.693+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Revenge of pasta</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rj1-SA-O9xI/AAAAAAAAADM/iAXSlksZOZY/s1600-h/img558.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rj1-SA-O9xI/AAAAAAAAADM/iAXSlksZOZY/s200/img558.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5061340404198078226" /&gt;&lt;/a&gt; I failed to cook spaghetti in &lt;a href="http://mokehehe.blogspot.com/2007/04/spaghetti.html"&gt;previous time&lt;/a&gt;. I think, it failed because of do not use salt and olive oil for boil pasta. I revenge by using them, and bell pepper, mushroom, garlic and chili pepper.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rj1-aQ-O9yI/AAAAAAAAADU/jCK4qiugon4/s1600-h/img559.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rj1-aQ-O9yI/AAAAAAAAADU/jCK4qiugon4/s200/img559.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5061340545931999010" /&gt;&lt;/a&gt; Complete! I use basilico paste on the last. It is convenient, and good taste.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;I enjoy cooking these days. There are some reason to recommend cooking for yourself. First reason, It's just fun. I usually work by using computer. It is very logical process and any error were not acceptable. Other hand, cooking is very flexible, any material and procedure is responsible on your idea. It's very fun.&lt;br /&gt;&lt;br /&gt;Second reason, it makes conversation. Every one eat food, therefore become common subject.&lt;br /&gt;&lt;br /&gt;Third reason, it is reasonable price compare to eat in restaurant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-1651055339567414794?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/1651055339567414794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=1651055339567414794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1651055339567414794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/1651055339567414794'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/05/revenge-of-pasta.html' title='Revenge of pasta'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WYLt_kRBnr0/Rj1-SA-O9xI/AAAAAAAAADM/iAXSlksZOZY/s72-c/img558.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-2748194274887256426</id><published>2007-05-04T15:32:00.000+09:00</published><updated>2007-11-06T09:41:24.435+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Cycling</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rj12mQ-O9uI/AAAAAAAAAC0/apXHt4-cHNc/s1600-h/img551.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rj12mQ-O9uI/AAAAAAAAAC0/apXHt4-cHNc/s200/img551.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5061331955997406946" /&gt;&lt;/a&gt; This week, we have a lot of holiday in Japan, we call this "Golden Week". I went to trip with my friend by bicycle. Along to &lt;a href="http://en.wikipedia.org/wiki/Arakawa_River"&gt;Arakawa-River&lt;/a&gt;, we went down to the sea. It was very open load, and I got relax feeling. Over 20km, we finally reached at the Tokyo-sea. Yeah, we did it!&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rj12wg-O9vI/AAAAAAAAAC8/MP-YukLVWF4/s1600-h/img553.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rj12wg-O9vI/AAAAAAAAAC8/MP-YukLVWF4/s200/img553.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5061332132091066098" /&gt;&lt;/a&gt; Then, we forward to &lt;a href="http://en.wikipedia.org/wiki/Tsukiji_fish_market"&gt;Tsukiji&lt;/a&gt;, Japanese famous fish market. There were too many crowd in nallow load.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rj126A-O9wI/AAAAAAAAADE/ymddyEuVHq8/s1600-h/img554.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rj126A-O9wI/AAAAAAAAADE/ymddyEuVHq8/s200/img554.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5061332295299823362" /&gt;&lt;/a&gt; We went to Conveyor-belt sushi bar, but because of lot of people, we had to wait in line about 30 minutes. But indeed near the sea, fish is delicious. we satisfied.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;Ahh, I was very tired. But it was very good trip. I refreshed by move body.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-2748194274887256426?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/2748194274887256426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=2748194274887256426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2748194274887256426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2748194274887256426'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/05/cycling.html' title='Cycling'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WYLt_kRBnr0/Rj12mQ-O9uI/AAAAAAAAAC0/apXHt4-cHNc/s72-c/img551.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-2363209544179436026</id><published>2007-04-21T20:57:00.000+09:00</published><updated>2007-11-06T09:36:43.686+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Spaghetti</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/Rin8dAVtn4I/AAAAAAAAACc/rXMDaZmGKKI/s1600-h/img544.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/Rin8dAVtn4I/AAAAAAAAACc/rXMDaZmGKKI/s200/img544.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5055849631937568642" /&gt;&lt;/a&gt; Today I'm gonna cook spaghetti. This is the first time I cook spaghetti. I only have a little pan. Can I make good?&lt;br /&gt;Today's ingredient what I use are pasta 200g, eggplant, carrot, and seasoning (peperonteno).&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;a href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rin8lgVtn5I/AAAAAAAAACk/-yiyydPPkeM/s1600-h/img546.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rin8lgVtn5I/AAAAAAAAACk/-yiyydPPkeM/s200/img546.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5055849777966456722" /&gt;&lt;/a&gt; Boiling pasta... Simple, but therefore difficult to make good one.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rin8twVtn6I/AAAAAAAAACs/WCgP9G0jug0/s1600-h/img548.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rin8twVtn6I/AAAAAAAAACs/WCgP9G0jug0/s200/img548.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5055849919700377506" /&gt;&lt;/a&gt; Complete! It looks not so good. And taste too. But I can eat because I made it. Next time I will make more good one.&lt;br /&gt;&lt;br /&gt;By the way, a can in picture is "&lt;a href="http://www.yebisubar.jp/thehop/index.html"&gt;YEBISU THE HOP&lt;/a&gt;". "Yebisu" is famous beer bland in Japan. Expensive (about 300 yen), but delicious, deep taste. "THE HOP" is more cheaper bland, using hop. I think Yebisu do not need to make this cheaper bland. Yebisu must be yearning bland.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-2363209544179436026?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/2363209544179436026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=2363209544179436026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2363209544179436026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/2363209544179436026'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/04/spaghetti.html' title='Spaghetti'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WYLt_kRBnr0/Rin8dAVtn4I/AAAAAAAAACc/rXMDaZmGKKI/s72-c/img544.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-5421603710019789061</id><published>2007-04-14T13:56:00.000+09:00</published><updated>2007-11-06T09:37:05.890+09:00</updated><title type='text'>Seminar</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/RiBfPW25dwI/AAAAAAAAACU/Mwl7A7DfKB0/s1600-h/img542.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/RiBfPW25dwI/AAAAAAAAACU/Mwl7A7DfKB0/s200/img542.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5053143499348211458" /&gt;&lt;/a&gt; Yesterday, I went to the university of Tokyo to listen a seminar. The seminar's speaker was &lt;a href="http://www.den.rcast.u-tokyo.ac.jp/~yuki/"&gt;Yuki Mori&lt;/a&gt;. She research about computer aided stuffed animal making tool. She made software, "&lt;a href="http://www.den.rcast.u-tokyo.ac.jp/~yuki/pillow/index-e.html"&gt;Pillow&lt;/a&gt;" and "&lt;a href="http://www.den.rcast.u-tokyo.ac.jp/~yuki/plushie/index-e.html"&gt;Plushie&lt;/a&gt;". It was very exciting seminar.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.den.rcast.u-tokyo.ac.jp/~yuki/plushie/plushie.png"&gt;&lt;br /&gt;She is going to talk on next &lt;a href="http://www.siggraph.org/s2007/"&gt;siggraph&lt;/a&gt;. Amazing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-5421603710019789061?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/5421603710019789061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=5421603710019789061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5421603710019789061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5421603710019789061'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/04/seminar.html' title='Seminar'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WYLt_kRBnr0/RiBfPW25dwI/AAAAAAAAACU/Mwl7A7DfKB0/s72-c/img542.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-6114225202687153271</id><published>2007-03-30T10:51:00.000+09:00</published><updated>2007-11-06T09:37:37.929+09:00</updated><title type='text'>Cherry blossoms!</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/RgxtXCyGE3I/AAAAAAAAACM/R101yQjAGrA/s1600-h/img538.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/RgxtXCyGE3I/AAAAAAAAACM/R101yQjAGrA/s200/img538.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5047529525026886514" /&gt;&lt;/a&gt; It is very fine day. I can walk around only wearing T-shirt. Cherry blossoms blooming in a park. They are beautiful! My heart got excite!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-6114225202687153271?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/6114225202687153271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=6114225202687153271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6114225202687153271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6114225202687153271'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/cherry-blossoms.html' title='Cherry blossoms!'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WYLt_kRBnr0/RgxtXCyGE3I/AAAAAAAAACM/R101yQjAGrA/s72-c/img538.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-5252545733009843555</id><published>2007-03-28T09:23:00.000+09:00</published><updated>2007-03-28T12:57:09.958+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Chimpan News Channel</title><content type='html'>Do you know "Chimpan News Channel"? It is japanese TV program, host is cute chimpanzee, invite japanese actor or actress, and talk about human and animals. 50% joke, 50% sirius or good story.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6wOiztVB-OQ"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6wOiztVB-OQ" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;This time, the host chimpanzee present some kind of animals in a zoo. The lesser panda and he are very friendly. It looks very happy. Other film &lt;a href="http://www.youtube.com/results?search_query=chimpan+news+channel"&gt;search from youtube&lt;/a&gt;. Please watch them!&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;And I find a interesting blog: &lt;a href="http://tvinjapan.com/blog/"&gt;TV in Japan ≫ This is what TV is like. In Japan.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-5252545733009843555?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/5252545733009843555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=5252545733009843555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5252545733009843555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/5252545733009843555'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/chimpan-news-channel.html' title='Chimpan News Channel'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-95552586711634481</id><published>2007-03-24T10:12:00.000+09:00</published><updated>2007-11-06T09:33:51.881+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>STARBUCKS</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/RgR7Jq891nI/AAAAAAAAACA/g_vDX0ZgxOg/s1600-h/img536.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/RgR7Jq891nI/AAAAAAAAACA/g_vDX0ZgxOg/s200/img536.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5045292888640837234" /&gt;&lt;/a&gt; I like Starbucks. I love hot "Caramel Macchiato", what is tasty flavor (&lt;a href="http://images.google.com/images?hl=ja&amp;q=starbucks+Caramel+Macchiato&amp;gbv=1"&gt;images&lt;/a&gt;). But it is too expensive! Last november, Starbucks make all menu's price up about 20 to 40 yen (&lt;a href="http://www.google.co.jp/search?num=50&amp;hl=ja&amp;inlang=ja&amp;ie=Shift_JIS&amp;oe=Shift_JIS&amp;q=%83X%83%5E%81%5B%83o%83b%83N%83X+%92l%8F%E3%82%B0&amp;lr=lang_ja"&gt;japanese news&lt;/a&gt;). Now, Caramel Macchiato is 360 yen. NO WAY!! I can't drink.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-95552586711634481?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/95552586711634481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=95552586711634481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/95552586711634481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/95552586711634481'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/starbucks.html' title='STARBUCKS'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WYLt_kRBnr0/RgR7Jq891nI/AAAAAAAAACA/g_vDX0ZgxOg/s72-c/img536.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8845396593581137262</id><published>2007-03-19T06:48:00.000+09:00</published><updated>2007-11-06T09:34:34.966+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Cooking curry</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rf2zw1_vtoI/AAAAAAAAABo/H-tRwN_cOcA/s1600-h/img532.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/Rf2zw1_vtoI/AAAAAAAAABo/H-tRwN_cOcA/s200/img532.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5043384809434363522" /&gt;&lt;/a&gt; Today I cook curry. In Japan, curry is a most famous food. Everybody knows it, and love to eat it. I make normal, traditional curry. Carrot, potato, onion. And meet today I use is pork with spareribs.&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rf2z5V_vtpI/AAAAAAAAABw/wLxUUWLSUXk/s1600-h/img533.jpg"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/Rf2z5V_vtpI/AAAAAAAAABw/wLxUUWLSUXk/s200/img533.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5043384955463251602" /&gt;&lt;/a&gt; Now I am cooking... It look tasty, isn't it?&lt;br /&gt;&lt;br /&gt;&lt;br clear=all&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rf20PF_vtqI/AAAAAAAAAB4/xrfPJ_gWFoE/s1600-h/img535.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_WYLt_kRBnr0/Rf20PF_vtqI/AAAAAAAAAB4/xrfPJ_gWFoE/s200/img535.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5043385329125406370" /&gt;&lt;/a&gt; Is curry famous in your country? What kind of curry do you eat? Please tell me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8845396593581137262?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8845396593581137262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8845396593581137262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8845396593581137262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8845396593581137262'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/cooking-curry.html' title='Cooking curry'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WYLt_kRBnr0/Rf2zw1_vtoI/AAAAAAAAABo/H-tRwN_cOcA/s72-c/img532.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8158324167301495420</id><published>2007-03-15T06:35:00.000+09:00</published><updated>2007-11-06T09:34:54.554+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Bicycle</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/Rfhqw1_vtnI/AAAAAAAAABg/fpoJy6Z6Z1Y/s1600-h/img528.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/Rfhqw1_vtnI/AAAAAAAAABg/fpoJy6Z6Z1Y/s200/img528.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5041897170201982578" /&gt;&lt;/a&gt; I bought a bicycle. And I go to office by this bicycle these days. It's about 30 minitus. This is very good exercise for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8158324167301495420?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8158324167301495420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8158324167301495420' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8158324167301495420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8158324167301495420'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/bicycle.html' title='Bicycle'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WYLt_kRBnr0/Rfhqw1_vtnI/AAAAAAAAABg/fpoJy6Z6Z1Y/s72-c/img528.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-929367094891201742</id><published>2007-03-14T11:02:00.000+09:00</published><updated>2007-11-06T09:35:24.918+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Go to Kyoto</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_WYLt_kRBnr0/RfdZ31_vtmI/AAAAAAAAABY/aWqFtjZzhyI/s1600-h/img513.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_WYLt_kRBnr0/RfdZ31_vtmI/AAAAAAAAABY/aWqFtjZzhyI/s320/img513.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5041597123786684002" /&gt;&lt;/a&gt; Today I went to Kyoto on bullet train. Before I went, at Tokyo statin, I have a time, I entered a coffee shop. Very Surprised me, this cheap cup of blend coffee is 300 yen! And taste too bad. No way!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_WYLt_kRBnr0/RfdZkF_vtlI/AAAAAAAAABQ/wTrv7E5p17U/s1600-h/img523.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_WYLt_kRBnr0/RfdZkF_vtlI/AAAAAAAAABQ/wTrv7E5p17U/s320/img523.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5041596784484267602" /&gt;&lt;/a&gt; In bullet train, there is a snow outside. There are very different weather in japan at same season.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-929367094891201742?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/929367094891201742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=929367094891201742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/929367094891201742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/929367094891201742'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/go-to-kyoto.html' title='Go to Kyoto'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_WYLt_kRBnr0/RfdZ31_vtmI/AAAAAAAAABY/aWqFtjZzhyI/s72-c/img513.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-4703415549761482821</id><published>2007-03-01T23:54:00.000+09:00</published><updated>2007-03-02T00:15:55.533+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sports'/><title type='text'>Futsal</title><content type='html'>Today, I play futsal. While 20:00 to 22:00, about 15 people, everyone are working on different company. But we enjoy playing futsal together.&lt;br /&gt;Futsal is very hard sports. Offence and diffence switch very quickly, dash and stop, turn cource, kick the ball, and so on.&lt;br /&gt;It's hard to play, but because of it, we addict to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-4703415549761482821?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/4703415549761482821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=4703415549761482821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4703415549761482821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4703415549761482821'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/03/futsal.html' title='Futsal'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8795261487021881188</id><published>2007-02-28T21:38:00.000+09:00</published><updated>2007-02-28T21:50:05.673+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Talk of Patent</title><content type='html'>Today I talk patent attorneies to some idea that I think to become patent. But again, in my fault, I can't speak the idea logically. I don't know patent law well. They said, the idea what I talk is very cheap work optimization. There is no special idea or advantage. I depressed much.&lt;br /&gt; I reconsider my idea, and I talk to them again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8795261487021881188?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8795261487021881188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8795261487021881188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8795261487021881188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8795261487021881188'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/talk-of-patent.html' title='Talk of Patent'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8214618901544801271</id><published>2007-02-27T20:43:00.000+09:00</published><updated>2007-02-27T21:18:44.117+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Presentation</title><content type='html'>Today, I have a presentaion in my office. It's about work flow presentation. But I couldn't do good presentation. I mumbled, and I couldn't talk any word. My boss took word, and helped me. I have to practice presentation skill, otherwise I can't be good business person.&lt;br /&gt;&lt;br /&gt; By the way, they said that tool must be easier than &lt;a href="http://www.adobe.com/products/flash/"&gt;Macromedia Flash&lt;/a&gt; or &lt;a href="http://www.adobe.com/products/director/"&gt;Director&lt;/a&gt;. What a lazy people! I can't say any word. But customer is always selfish, no no, customer have many probrem, and they need own solution. We must respond to those demand.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8214618901544801271?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8214618901544801271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8214618901544801271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8214618901544801271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8214618901544801271'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/presentation.html' title='Presentation'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-4390714784190514188</id><published>2007-02-23T22:16:00.000+09:00</published><updated>2007-02-23T23:07:34.957+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>A Dog of Flanders</title><content type='html'>I watch DVD of "&lt;a href="http://en.wikipedia.org/wiki/A_Dog_of_Flanders"&gt;A Dog of Flanders&lt;/a&gt;" these days. It's played on TV in japan at 1975, one of the series of "&lt;a href="http://en.wikipedia.org/wiki/World_Masterpiece_Theater"&gt;World Masterpiece Theater&lt;/a&gt;". And until today, it's very famous story and it's loved almost every people in japan.&lt;br /&gt;&lt;br /&gt; It's very sad story. It's original story is written in 1872. Nello who is the main character in the story is very poor. He can't go to school, and he work with his grandfather. In today, we can go to school usually. We are very fortunate.&lt;br /&gt;&lt;br /&gt;YouTube: &lt;a href="http://www.youtube.com/watch?v=IMfVDNaBB_I"&gt;The Dog of Flanders Opening (JPN)&lt;/a&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IMfVDNaBB_I"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IMfVDNaBB_I" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;How did you like it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-4390714784190514188?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/4390714784190514188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=4390714784190514188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4390714784190514188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4390714784190514188'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/dog-of-flanders.html' title='A Dog of Flanders'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-6384554971858705461</id><published>2007-02-19T22:00:00.000+09:00</published><updated>2007-02-19T22:52:51.586+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>My room</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_WYLt_kRBnr0/RdmiGmdsoII/AAAAAAAAAA0/OU7qNvfHeC0/s1600-h/img508.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5033232292851261570" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_WYLt_kRBnr0/RdmiGmdsoII/AAAAAAAAAA0/OU7qNvfHeC0/s320/img508.jpg" border="0" /&gt;&lt;/a&gt; I live in Tokyo, Japan. And this is my room. I live here alone. This type of apartment is called "one room manshion" in japan. But in fact, it's just a small apartment.&lt;br /&gt;I have a notebook PC. I use this to browse Internet mainly.&lt;br /&gt;This is a happy life.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-6384554971858705461?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/6384554971858705461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=6384554971858705461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6384554971858705461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/6384554971858705461'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/my-room.html' title='My room'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_WYLt_kRBnr0/RdmiGmdsoII/AAAAAAAAAA0/OU7qNvfHeC0/s72-c/img508.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-4449287233507362096</id><published>2007-02-19T07:23:00.000+09:00</published><updated>2007-02-19T07:40:42.029+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Recent comments</title><content type='html'>I wonder how do I put "Recent comments" to the sidebar. I enter config setting, but I can't find anything about it.&lt;br /&gt;Finally, I seach keyword by google, and I found (&lt;a href="http://at-aka.blogspot.com/2006/09/blogger-beta_4302.html"&gt;http://at-aka.blogspot.com/2006/09/blogger-beta_4302.html&lt;/a&gt;) (japanese). This goes,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select "Choose a New Page Element"&lt;/li&gt;&lt;li&gt;Click "Add a Page Element"&lt;/li&gt;&lt;li&gt;press "ADD TO BLOG" button of "Feed - Add content from a site feed to your blog."&lt;/li&gt;&lt;li&gt;Set Feed URL, &lt;a href="http://[youraccount].blogspot.com/feeds/comments/summary"&gt;http://[youraccount].blogspot.com/feeds/comments/summary&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Yeah, that's good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-4449287233507362096?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/4449287233507362096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=4449287233507362096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4449287233507362096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/4449287233507362096'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/i-wonder-how-do-i-put-recent-comments.html' title='Recent comments'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8935928809346815002.post-8473793718616225304</id><published>2007-02-19T00:36:00.000+09:00</published><updated>2007-02-19T00:38:57.556+09:00</updated><title type='text'>Hello</title><content type='html'>I am mokehehe. My english is very poor, but I study english and start writing blog in english. Please help and comment me. Thank you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8935928809346815002-8473793718616225304?l=mokehehe.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mokehehe.blogspot.com/feeds/8473793718616225304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8935928809346815002&amp;postID=8473793718616225304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8473793718616225304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8935928809346815002/posts/default/8473793718616225304'/><link rel='alternate' type='text/html' href='http://mokehehe.blogspot.com/2007/02/hello.html' title='Hello'/><author><name>mokehehe</name><uri>http://www.blogger.com/profile/09239319845435792717</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
