Yoichi's diary


2015-02-01

_ おかいもの

りんくうのアウトレットへ。一日買い物に付き合ってくれた息子のため、最後に観覧車に乗ったが、はしゃぐので揺れて怖かった。

_ ガス遮断

夜、ガスファンヒーターが突然ピーピー言って止まった。電源ボタン押しても同じ状況で、ガスコンロも付かなかったので、こりゃガスが止まってるわと。室外のメーターの所に行ってぽちっとしたら復旧出来て、特にガス漏れしてる気配もなかったので、誤検出だったのかな。


2015-02-02

_ ブレーカー

炊飯器とオーブントースターと湯沸し器を同時利用したら台所のブレーカーが落ちた。炊飯の途中だったのは自動的に復帰してくれたようで、お弁当は救われた。

動作中の電源断というのはありがちな異常系処理としてちゃんと考慮されているのだろう。

_ [DevLove] ウェブデザイン・ウェブ開発に必要なこと

細川さんのお話で、Webの歴史の話において、最初は伝えたいコンテンツがあって、それを伝えるためにWebができたというところから、紆余曲折の末、ふたたび「伝えたいコンテンツ」が何であるかを一番重要なこととして中心に据えるという考え方に戻ってきたという話は興味深かった。 コンテンツは必ずしも文字列ではないとは思うけど、lynx とか w3m とかでwebブラウジングをしていた時期がしばらくあったなと思い出しながら聞かせていただきました。

また、ウェブデザインという仕事について、クライアントが何を伝えたいかを理解し、それをどう表現するか、どういうシステムで運用していくのかを提案していくというのが広い意味でのウェブデザインのお仕事だと理解しました。クライアントのビジネスの観点で大事な部分が何かを意識することの重要さを改めて知れた気がします。


2015-02-05

_ すごいHaskell読書会 in 大阪 2週目 #13

第11章 ファンクターからアプリカティブファンクターへ。

ghci> fmap (+3) (Just 5)
Just 8
ghci> liftA (+3) (Just 5)
Just 8
ghci> (+3) <$> (Just 5)
Just 8
ghci> fmap (+3) [1..5]
[4,5,6,7,8]
ghci> liftA (+3) [1..5]
[4,5,6,7,8]
ghci> (+3) <$> [1..5]
[4,5,6,7,8]
ghci> fmap (+3) readLn
5
8
ghci> liftA (+3) readLn
5
8
ghci> (+3) <$> readLn
5
8
ghci> (fmap (+4) (*3)) 2
10
ghci> (liftA (+4) (*3)) 2
10
ghci> ((+4) <$> (*3)) 2
10
ghci> pure (+) <*> Just 3 <*> Just 5
Just 8
ghci> fmap (+) (Just 3) <*> Just 5
Just 8
ghci> (+) <$> Just 3 <*> Just 5
Just 8
ghci> liftA2 (+) (Just 3) (Just 5)
Just 8
ghci> pure (+) <*> [1,2] <*> [3,4]
[4,5,5,6]
ghci> fmap (+) [1,2] <*> [3,4]
[4,5,5,6]
ghci> (+) <$> [1,2] <*> [3,4]
[4,5,5,6]
ghci> liftA2 (+) [1,2] [3,4]
[4,5,5,6]
ghci> pure (+) <*> readLn <*> readLn
3
5
8
ghci> fmap (+) readLn <*> readLn
3
5
8
ghci> (+) <$> readLn <*> readLn
3
5
8
ghci> liftA2 (+) readLn readLn
3
5
8
ghci> (pure (+) <*> (*4) <*> (*3)) 1
7
ghci> (fmap (+) (*4) <*> (*3)) 1
7
ghci> ((+) <$> (*4) <*> (*3)) 1
7
ghci> (liftA2 (+) (*4) (*3)) 1
7

2015-02-08

_ くまもんファン感謝祭 in OSAKA

くまもんやしまねっこに初めて会えた。くまもんは遠くから見ただけでしたが、しまねっこには息子がハグしてもらってた。他にもご当地キャラがいろいろ来てた。

シークレットゲスト、誰かと思ってたら予想外のエスパーさん登場。ゴム手袋の芸を生で見れた(くまもんに割ってもらっていたが)


2015-02-11

_ 初めてのBitbucket

使おうとしたツールのドキュメントの間違いを見つけたのでプルリクエスト出してみた。

  • アカウント登録。yoichi は埋まっていたので twitter account と同じく yoichi22 にした。
  • プルリクエストのワークフロー を見て、GitHub同様にWebブラウザ上でfork, pull-request すればいいと理解。
    • (すぐ後で読むものを間違ってたと気付くのだが)
    • Webブラウザ上で Fork
  • git clone したら "fatal: repository ... not found" ではじかれる。
  • しばらく悩んだ後で、git じゃなくて mercurial のレポジトリだと気付く。
  • command not found: hg
  • brew install mercurial して hg clone したらリポジトリ持ってこれた。
  • ~/.hgrc を作成して username の設定を書いた。
  • hg log だとコミットログの一行目だけ出るようだ。
    • hg log -v だとログが全部見れる。
    • git のように pager に勝手に食わしてくれたりはしない
  • 周辺のログを参考にコミットログ書いてコミット
  • hg push
  • Webブラウザ上でpull-request発行。
  • ちゃんと勉強せずに適当に git + GitHub の調子でやってしまったけど、流儀に合ってないところとかないかな。

2015-02-13

_ [Windows] chcp.exe

日本語版のVisual Studioを使って Jenkins でビルドしたときに、 ビルドログではちゃんと読めるのに、Warnings plugin の詳細で見ると日本語の警告文字列が化けるという状況で長い間放置していた(文字化けしていないasciiの部分で警告番号と場所はわかるので我慢しながら使っていた)。

ビルド待ちの時間に手を動かす気が出てきたので、対策検討。 まずはメッセージを英語にして逃げられないかと、 devenv /LCID でEnglishのid 1033 を指定してみたが、警告は日本語のままだった。

If the specified language is not available on the user's system, the /LCID switch is ignored.

なので日本語版でインストールした場合は日本語のメッセージしか入ってないものと思われる。

次に、出力のエンコーディングを変えてやればどうだろうと思い、msbuild とか devenv のオプションを見たがそんなものはなかったので、"cmd.exe output encoding” で検索して What encoding/code page is cmd.exe using にたどり着いて、chcp.exe の存在を知った。

さて、Jenkinsのバッチの実行で msbuild を叩いていたのだが、その手前に

chcp 65001

と書いてutf-8で出力するようにしたところ、 Warnings plugin の集計結果の日本語の警告文字列が化けずに表示されました(参照: Chcp, Code Page Identifiers)

これで楽しく警告を読めます。

(追記) Jenkins自体が出すメッセージとの兼ね合いで「コンソール出力」が化けてしまうので、環境変数 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8 の設定も必要だった。


2015-02-20

_ ふぐ

せっかく大阪に居て河豚の店をよく見るのに行ったことがなかったので、同僚と行きました。 てっさ、唐揚、焼き河豚と、ひれ酒をいただきました。特に焼き河豚がホルモンっぽくておいしかった。


2015-02-24

_ [checkio] reached level 15

朝の電車でGhost Detectを解いたらレベルアップしていた。


2015-02-26

_ [Haskell] すごいHaskell読書会 in 大阪 2週目 #14 第12章 モノイド

@wristさんの発表。 IHaskell Notebook というツールを使って発表されていた。

Foldableがちゃんと理解できていないので帰ってから復習。 リストを例として使う。

import Data.Monoid
import qualified Data.Foldable as F

data MyList a = Nil | Cons a (MyList a) deriving (Show)
instance F.Foldable MyList where
    foldMap f Nil = mempty
    foldMap f (Cons h t) = (f h) `mappend` (F.foldMap f t)

F.foldrを使ってみると、期待した動作をしている:

ghci> let t = Cons 1 $ Cons 2 $ Cons 3 $ Cons 4 Nil
ghci> t
Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))
ghci> F.foldr (+) 0 t
10
ghci> F.foldr (*) 1 t
24

F.foldrは以下で定義されている。

F.foldr :: F.Foldable t => (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo . f) t) z

ここで、 Endo は Data.Monoid にて自身への写像からなる、 id を単位元、関数合成を二項演算とするモノイドとして定義されている(Endo は endomorphisms から来てる)

newtype Endo a = Endo { appEndo :: a -> a }
               deriving (Generic)

instance Monoid (Endo a) where
        mempty = Endo id
        Endo f `mappend` Endo g = Endo (f . g)

一般的な形だとイメージがつかめなかったので、具体例として上で出てきた F.foldr (+) 0 t で考えてみる。

F.foldr (+) 0 t
= appEndo (F.foldMap (Endo . (+)) t) 0

先にF.foldMap を適用するの部分を見ていくと、

F.foldMap (Endo . (+)) t
= F.foldMap (Endo . (+)) (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil))))
= ((Endo . (+)) 1) `mappend` (F.foldMap (Endo . (+)) (Cons 2 (Cons 3 (Cons 4 Nil))))
...
= ((Endo . (+)) 1) `mappend` ((Endo . (+)) 2) `mappend` ((Endo . (+)) 3) `mappend` ((Endo . (+)) 4) `mappend` mempty
= (Endo (1 +)) `mappend` (Endo (2 +)) `mappend` (Endo (3 +)) `mappend` (Endo (4 +)) `mappend` (Endo id)
= Endo ((1 +) . (2 +) . (3 +) . (4 +) . id)
= Endo ((1 +) . (2 +) . (3 +) . (4 +))

したがって

F.foldr (+) 0 t
= appEndo (Endo ((1 +) . (2 +) . (3 +) . (4 +))) 0
= ((1 +) . (2 +) . (3 +) . (4 +)) 0
= 1 + (2 + (3 + (4 + 0)))

たしかに右畳み込みになっている。

本を読んだだけだとfoldrにおけるMonoidの役割がよくわかっていなかったけど、MyList a の場合だと a -> a の写像の空間が Monoid になってて、それを利用して foldr を定義していると理解できた。(具体例を書いて理解できただけで、一般のFoldableに対してちゃんと理解できたわけではないが)

_ [Haskell] すごいHaskell読書会 in 大阪 2週目 #15

今回全然追いつけてなかったので、このまま引き離されるとまずいと思い発表者立候補した。次回まで2週間弱しかないので頑張って準備する。


2015-02-27

_ 参観日

小学校の発表会で、入学してからもうすぐ一年の今までであったことをふりかえる劇を観せてもらいました。 自分の出番でないときにもじっと座っていたし、出番のときははっきりと大きな声でせりふを言っていて、 一年間の幼稚園の発表会からずいぶん成長したものだなと感動しました。僕も負けずに成長しないと。