タグ

ブックマーク / kazu-yamamoto.hatenablog.jp (25)

  • RSSリーダ BazQux と DNS キャッシュ - あどけない話

    BazQux(バズクックス)は、Google Reader の代替として密かに注目されている RSS リーダです。実装と運用を一人でやっている Vladimir Shabanov さんによると、BazQux のウリは、 高速である ブログのコメントも表示できる 複数のビューがある モバイルに対応している などらしいです。 BazQuxフロントエンドは、Ur/Web で記述されたコードから生成された JavaScript、バックエンドは Haskell だそうです。高速なのは、Haskell のおかげであると Vladimir さんは言っています。我々が開発している HTTP エンジンの Warp も使われているそうです。 現在、僕は Haskell 用の HTTP/2 ライブラリの作成に取り組んでおり、必要な技術を調べている過程で、redditでの議論のことを思い出しました。今回、よく

    RSSリーダ BazQux と DNS キャッシュ - あどけない話
  • Real World Haskell の古いところ - あどけない話

    Real World Haskell の内容が古くなってきたので、どこが古いかとか、それに変わる新しいものは何とか、まとめたいと思う。 Real World Haskell―実戦で学ぶ関数型言語プログラミング 作者: Bryan O'Sullivan,John Goerzen,Don Stewart,山下伸夫,伊東勝利,株式会社タイムインターメディア出版社/メーカー: オライリージャパン発売日: 2009/10/26メディア: 大型購入: 8人 クリック: 245回この商品を含むブログ (76件) を見る 1章 始めましょう 今でも通用する。 2章 型と関数 今でも通用する。 3章 型を定義し、関数を単純化する 今でも通用する。 4章 関数プログラミング ghc に --make オプションはもう不要。 5章 ライブラリを書く 5.14節では、"runghc Setup build" の

    Real World Haskell の古いところ - あどけない話
  • ByteString あれこれ - あどけない話

    Haskell で高速なプログラムを書くには ByteString の深い知識が必要となる。鍵となるのは、Data.ByteString.Internal というモジュールである。このモジュールは公開されているが、ドキュメントは隠されているので、詳しく知るためにはソースを読まないといけない。 定義 ByteString の定義は以下の通り。 data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload {-# UNPACK #-} !Int -- offset {-# UNPACK #-} !Int -- length なぜ構成子が BS ではなく、PS なのだろう? (追記:元々 PackedString という型名だったからと @ma0e さんに教えて頂きました。) ForeignPtr Word8 は、いわゆるバ

    ByteString あれこれ - あどけない話
  • 書評: Parallel and Concurrent Programming in Haskell - あどけない話

    Parallel and Concurrent Programming in Haskell: Techniques for Multicore and Multithreaded Programming 作者:Marlow, SimonO'Reilly MediaAmazon このには、その名が示すように Haskell (正確には GHC(Glasgow Haskell Compiler))が提供する並列(parallel)/並行(concurrent)プログラミング技術がまとめられている。著者は、GHC の主要開発メンバーである Simon Marlow 氏である。 彼は、長年、並列/並行の研究に携わっており、並列ガーベジコレクションを持つ GHC RTS (Runtime System) やいくつかの並列/並行ライブラリを実装している。そのため、並列/並行プログラミングには、驚く

    書評: Parallel and Concurrent Programming in Haskell - あどけない話
  • Haskell ポインタープログラミング - あどけない話

    早いもので、今年も12月25日となりました。メリークリスマス! うちのちびっ子怪獣たちも、サンタさんに書いた手紙通り、レゴをもらってご満悦のようです。 そして今日は、Haskell Advent Calendar 2013 の最終日でもあります。 Haskellらしい? 「純粋なコードで構成するのが Haskell らしいプログラムであり、IOはHaskellらしくない」という発言をよく耳にします。 確かに、命令プログラミングの世界から関数プログラミングの世界にやってきたとしたら、 不変データを使った永続データプログラミング 部品プログラミング 純粋なコードに対する性質テスト などには、衝撃を受けることでしょう。 でも、純粋なコードは、Haskell の世界の半分でしかありません。そこは、コンパイラーという保護者に守られた未成年の世界です。Simon Peyton Jones さんの言葉を

    Haskell ポインタープログラミング - あどけない話
  • Haskellでデザインレシピ - あどけない話

    お茶の水女子大学 理学部 情報科学科 准教授 浅井健一さんインタビューを読んで、思い出しだので書いておきます。 デザインレシピを使ったプログラミングを実践するなら Haskell が最適です。以下に簡単な例を示します。 目的 作成するプログラムが何をするのかを考える。何を受け取り何を返すのかを特定し、それをもとにプログラムのヘッダを作成する。 例として、数字の文字列を取り整数を返す関数 stringToInt を考えましょう。まず、関数の型注釈を書いて、体を undefined にしておきます。 module Foo where -- | Converting 'String' to 'Int. stringToInt :: String -> Int stringToInt = undefined コンパイルが通ることを確認しましょう。 例 プログラムの動きをより明確かつ具体的にするた

    Haskellでデザインレシピ - あどけない話
  • cabal 1.18 が提供するサンドボックスの小技 - あどけない話

    cabal 1.18 のサンドボックスがどういう機能か知らない人は、An Introduction to Cabal sandboxes か 2013年8月現在のHaskell開発環境をどうぞ。 それで、sandbox サブコマンドの--sandbox オプションが早速役に立ったというお話。 --sandbox オプション パッケージを Hackage に上げる場合、cabal sdist で tar.gz を作ります。 % cd ~/work/ghc-mod % cabal clean % cabal sdist Source tarball created: dist/ghc-mod-2.1.2.tar.gz 慎重な人は、必要なファイルが漏れてないか、untar して cabal test するでしょう。 % cd dist % tar zxvf ghc-mod-2.1.2.tar.g

    cabal 1.18 が提供するサンドボックスの小技 - あどけない話
  • GHC と gold - あどけない話

    GHCのコンパイル速度は、お世辞にも速いとは言えないのだが、一番イライラするのはリンクが遅いこと。これは GNU ld が遅いからである。という訳で、速いと言われる gold を使うためのメモ。 GHC 7.6.3 までは gold が使えない。なぜなら、GNU ld 固有のオプションである --hash-size と --reduce-memory-overheads がハードコードされており、これらを gold がサポートしてないからだ。 GHC 7.8 以降からは、リンカーに応じてオプションを変えるようになる。僕は GHC head で試した。以下のいずれかをやると、gold が使える。 ld のシンボリックリンクを ld.gold に向ける (Linux で binutils-gold をインストールするとこうなる。) cabal に --with-ld=ld.gold を指定する

    GHC と gold - あどけない話
  • 再帰ドリル(1):数値に対する素朴な再帰 - あどけない話

    注意:github に移動しました。 再帰を学ぶためのドリル。使用するプログラミング言語は Haskell。このシリーズは続くかもしれないし、途中で挫折するかもしれない。乞うご期待! 等差数列の和 差が1の等差数列の和を計算する関数 soap(sum of arithmetic progression) を考える。 soap 0 = 0 soap 1 = 0 + 1 soap 2 = 0 + 1 + 2 soap 3 = 0 + 1 + 2 + 3 soap 4 = 0 + 1 + 2 + 3 + 4 一歩手前を使うとどうなる? soap 0 = 0 soap 1 = soap 0 + 1 soap 2 = soap 1 + 2 soap 3 = soap 2 + 3 soap 4 = soap 3 + 4 再帰部を一般化するとどうなる? soap 0 = 0 -- 基底部 soap n

    再帰ドリル(1):数値に対する素朴な再帰 - あどけない話
  • Haskellでの時間の取り扱い - あどけない話

    Haskell には、以下のような時間用の型がある。この記事は、どれを使えばいいかの解説。 time ライブラリの Data.Time.Clock の UTCTime old-time ライブラリの System.Time の ClockTime base ライブラリの System.Posix.Types の EpochTime UTCTime 速度を気にしないなら、UTCTime を使う。getCurrentTime で現在の時間を取得できる。 パーサーやプリティプリンタは Data.Time.Format を参照のこと。TimeLocale は、old-locale ライブラリのを使う。old でない locale ライブラリがないのは、Haskell の恥の一つ。 Data.Time.Format は、信じられないぐらい遅い。たまにプリティプリントする用途にはいいが、Web サーバ

    Haskellでの時間の取り扱い - あどけない話
  • 代数データ型とラムダ式 - あどけない話

    代数データ型(バリアント)をラムダ式で表現する方法の備忘録。ラムダ式を表現するのに、実行可能な Haskell の無名関数を使う。間違いの指摘を歓迎します。 こんな感じ: \x y z ... f g h ... -> 引数をうまく組み合わせる x y z ... の部分が、直積を表す f g h ... の部分が、構成子で直和を表す Unit コンストラクタが1つ。 data Unit = Unit unit = \u -> u Bool(直和) 一般的な Bool のラムダ式表現に合わせて、True を先に書いておく。 data Bool = True | False true = \t f -> t false = \t f -> f 組(直積) data Pair x y = Pair x y pair = \x y p -> p x y fst = \c -> c true sn

    代数データ型とラムダ式 - あどけない話
  • コンパイルは(テストではなく)証明である - あどけない話

    「プログラムのテストはバグの存在を示すことにかけてはとても効率的な方法ですが、バグの不在を示すことにかけては絶望的なほどに不適切です。プログラムの信頼性を顕著に向上させる唯一の方法は、その正当性に対して説得力のある証明を与えることです」 -- Edsger W. Dijkstra 静的型付き言語では、コンパイル時に型が検査される。この型検査に関連して型推論という機能を持つ言語がある。型推論は、大きく分けて2つの意味で使われているようだ。 命令型言語の多くに見られる型推論:型検査の過程で、省略された型を補うこと 関数型言語の多くに見られる型推論:未知の型を変数として方程式を立て、方程式を解いて未知の型を求めること。型推論自体が型検査の役割を果たす この記事では、後者の型推論を話題にする。 静的型付き関数型言語の利点として、よく「コンパイルはテストである」という説明がなされる。プログラムは式で

    コンパイルは(テストではなく)証明である - あどけない話
  • 静的型付き言語プログラマから見た動的型付き言語 - あどけない話

    およそ20年前にAlan Kay の講演をきいたことがある。印象に残ったのは、彼が引き合いに出した McLuhan の言葉だ。 I don't know who discovered water, but it wasn't a fish. (拙訳)誰が水を発見したかは知らないが、発見者が魚でなかったことは確かだ。 誰しも信念という水の中を泳ぐ魚のような存在だ。思い切って飛び跳ね空気に触れてみなれば、自分が信念という水の中にいることに気付かない。 ある手法の利点を語るには、その手法の欠点や、他の手法の利点や欠点とできるだけ客観的に比較しなければ説得力がない。ただ、これを実践するのは難しい。この記事では、客観的になれているか自問自答しながら、動的型付き言語と静的型付き言語について比較してみようと思う。 僕は静的な C 言語から、動的な Perl、Lisp、JavaScript を経て、現在で

    静的型付き言語プログラマから見た動的型付き言語 - あどけない話
  • Lensことはじめ - あどけない話

    見ろ! Haskell が OOPL のようだ! さてさて、ようやく重い腰を上げて、Lens を勉強し始めましたよ。Haksell for allを見て勉強すればいいのかなと思ったんですが、解説しているパッケージが data-lens なので古いですね。 今、使うべきなのは、lens というパッケージらしいです。解説は、この README を読むのが一番だそうです。この README と Haskell for all をにらめっこしながら、Lens の getter と setter の機能を使ってみます。 背景 Haskell の代数データ型にはフィールドラベルが定義できて、これがいわゆる getter と setter の役割を果たします。Haskell for all から例を引用してみましょう。 data Point = Point { x :: Double , y :: Do

    Lensことはじめ - あどけない話
  • 型クラスとモナドと Free モナド - あどけない話

    要約:Free モナドは何が嬉しいのかを議論するためのたたき台。以下の2つの論文に載っている例を3つの方法で実装する。 Janis Voigtlander, "Asymptotic Improvement of Computations over Free Monads" Wouter Swierstra and Thorsten Altenkirch, "Beauty in the Beast -- A Functional Semantics for the Awkward Squad" モナド 最近、僕はモナドを次のように説明するようにしている。「モナドとは言語内DSLを実装するための API (あるいはフレームワーク)」 だから、何か言語内DSLを作るなら、それをモナドのインスタンスにすべきだ。ここでは、getChar と putChar という API を持つ簡単な DSL を考

    型クラスとモナドと Free モナド - あどけない話
  • Haskellと副作用 - あどけない話

    よく、Haskellには副作用がないと言われるが、それは間違いだ。確かに、Haskell には状態の変化(あるいは再代入)という副作用はない。しかし、入出力という副作用はある。この記事では、Haskell の副作用に対して、命令型プログラマーにすっきりと理解できる説明を試みたいと思う。 間違った方向への第一歩 Haskell の副作用に関する典型的な説明は、こんな感じだ。 Haskell にはあらゆるレベルで副作用がない。そのため、遅延評価が可能になる。遅延評価では、コードが記述順に実行/評価されるとは限らないので、入出力と相性が悪い。そこで、IO モナドが導入されている。IO モナドのおかげで、入出力に関するコードは記述順に実行され、外界に作用できる。 この説明を聞いて理解しろという方が無理である。説明が苦しい最大の理由は、Haskell にはあらゆるレベルで副作用がないと、間違った一歩

    Haskellと副作用 - あどけない話
  • Haskell での例外処理 - あどけない話

    リツイート数が30を超えたので、Haskell での例外処理について説明します。僕が思うに、Haskell での例外処理が分かりにくいのには、2つ理由があります。 ライブラリの混乱 パラダイムの違い 歴史的経緯により、Prelude にも Control.OldException にも Control.Exception にも catch があります。歴史的経緯を説明するのは面倒なので、これだけ覚えて下さい。「Control.Exception だけを使って、それ以外は忘れる」 そもそも純粋関数型で catch とか言われても分からないかもしれません。Haskell では、純粋な関数と IO とでは、例外処理の方法が異なります。命令的な catch などを使うのは IO です。純粋な関数には Maybe か、Either を使います。 純粋な関数 純粋な関数では、原則として例外を投げてはい

    Haskell での例外処理 - あどけない話
  • すごいHaskellたのしく学ぼう! - あどけない話

    ゾウこと「Learn You a Haskell for Great Good!」の訳が、ついに発売されます。 Learn You a Haskell for Great Good!: A Beginner's Guide 作者: Miran Lipovaca出版社/メーカー: No Starch Press発売日: 2011/04/15メディア: ペーパーバック購入: 1人 クリック: 1,024回この商品を含むブログ (7件) を見る 訳のタイトルは、「すごいHaskellたのしく学ぼう!」です。 すごいHaskellたのしく学ぼう! 作者: Miran Lipovača,田中英行,村主崇行出版社/メーカー: オーム社発売日: 2012/05/23メディア: 単行(ソフトカバー)購入: 25人 クリック: 580回この商品を含むブログ (73件) を見る すごいタイトルですね!

    すごいHaskellたのしく学ぼう! - あどけない話
  • 名詞の王国 - あどけない話

    「君のプログラミング言語で、これ、できる?」で紹介されていた「Execution in the Kingdom of Nouns」を訳してみました。英語よりも、つたない日語訳の方がよい方は、どうぞ。 おかしな訳があれば、教えて下さい。適宜、訂正します。 「C の関数はファーストクラスじゃないよ」などの突っ込みは、原文の著者へどうぞ。 名詞の王国での実行 彼らには気分ってものがある。ものによるが...特に動詞がそうだ。誇り高いことったらない...形容詞相手ならなんとでもできるが、動詞はどうしようもない...じゃが、このわしにかかれば皆思いのまま! -- ハンプティ・ダンプティ 世界のみなさん、こんにちは!今日は、邪悪な王 Java の物語と国中の動詞を滅ぼした彼の冒険について語ろう。 警告:この物語は幸福な結末を迎えない。心臓の弱い人や批判家向けではない。もし、あなたが怒りっぽい性格である

    名詞の王国 - あどけない話
  • /dev/random の秘密 - あどけない話

    たとえば SSH や PGP の鍵対を生成するときには、当の乱数が必要になる。疑似乱数ではダメだ。Unix 上で乱数を生成してくれるデバイスとしては、/dev/ramdom がある。/dev/ramdom には、真性乱数が蓄えられていて、read システムコールで必要なバイト数だけ読み込むことができる。 /dev/ramdom が真性乱数を生成する方法は、実に単純だ。ハードウェア割り込みの間隔を測るのである。今の間隔が直前の間隔よりも短ければ 1 を、長ければ 0 を真性乱数として蓄える(0 と 1 の割り当ては逆かもしれない)。つまり割り込みが、時刻 t1、t2、t3 に起こったとすると、t2 - t1 と t3 - t2 を比較するということだ。 /dev/ramdom は、ブロックデバイスなので、必要な量の真性乱数がなければ、read システムコールはブロックする。このブロックをで

    /dev/random の秘密 - あどけない話