タグ

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

  • 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 の古いところ - あどけない話
  • Maybe モナドの秘密 - あどけない話

    Real World Haskell 読書会での Maybe モナドに関する議論をまとめておきます。 case と Maybe モナドの導入には、必ずといっていいほど、Maybe が使われます。たとえば、子供をキーとして検索すると、父親を得られる DB があるとします。 type DB = [(String,String)] db :: DB db = [ ("Bob","Dave") , ("Dave","Steve") , ("Steve","Tony") ] コードを簡潔にするために、DB を検索するための補助関数を導入します。 lookup' :: DB -> String -> Maybe String lookup' = flip lookup これらと case を使って、ひいおじいさんを探すコードを書くとこうなります。 -- コード1 findGGFather :: Str

    Maybe モナドの秘密 - あどけない話
  • 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 ポインタープログラミング - あどけない話
  • Building GHC head on Mavericks with Xcode 5 - あどけない話

    Updated on 4 Dec 2013. I upgraded to Mavericks and Xcode 5. There is still "gcc" but it is in fact "clang": % which gcc /usr/bin/gcc % gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix Which introduce

    Building GHC head on Mavericks with Xcode 5 - あどけない話
  • [Haskell] GHC 7.8 と静的/動的ライブラリ - あどけない話

    これまで Twitter でさんざん間違った情報を流してきましたので、反省して正しい情報を書いておきます。おそらく、これで間違いないです。 GHC 7.8 自体 GHC 7.8 自体は動的リンクされます ちなみに、GHC 7.8 から、GHC 自体が -O2 でコンパイルされます。(これまでは -O。) このため、GHC 7.8 には最適化に起因したバグが潜んでいる可能性があります GHC 7.8 は、以下のライブラリを提供します 静的ライブラリ 動的ライブラリ (GHCi 用) プロファイル用の静的ライブラリ GHCi GHCi は、動的ライブラリを使います。 Cabal cabal でビルドすると、以下のようになります。 プログラムは、静的リンクされます ライブラリは、静的ライブラリと動的ライブラリの両方が作られます 動的ライブラリは、GHCi 用です という訳で、ビルドが2倍遅くなり

    [Haskell] GHC 7.8 と静的/動的ライブラリ - あどけない話
  • 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 が提供するサンドボックスの小技 - あどけない話
  • 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での時間の取り扱い - あどけない話
  • 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 - あどけない話
  • Hash-flooding DoS と SipHash - あどけない話

    以前、僕が実装している web サーバ Mighty が、Haskell で書いているにも関わらず、セグメンテーションフォールトを起こしていた。調べたところ hashable ライブラリがリンクする C の DJBX33X が、SipHash に変わったことが原因だった。このときから SipHash が気になっていたし、以前社内で説明した "Efficient Denial of Service Attacks" との関係も知りたかったので、少し調べてみた。この記事は、その覚え書き。 Hash-flooding DoS の歴史 1998 年に Alexander Peslyak 氏が Phrack Magazine で、Hash-flooding DoS を受けたことを報告している。ハッシュは、N 個の要素を挿入するのに通常 O(N) かかるが、ハッシュ値がすべて衝突する最悪の場合では O

    Hash-flooding DoS と SipHash - あどけない話
  • GHC の STG に関するまとめ - あどけない話

    理解が深まれば、適宜更新します。 G-machine グラフ簡約のためのスタックマシン 関数適用が連なる spine (背骨)を持ち、愚直にカリー化を実現する 簡約のたびに、それぞれの項を更新 ローカル関数はラムダリフティングしてグローバル関数に直す必要がある ラムダリフティングされた関数はスーパーコンビネータと呼ばれる Gコード push/enter 方式 Spineless G-machine Spineless: 引数が充足している関数は、一気に呼び出す このころまでに標準の G-machine も spineless だったらしい サンクは共有されているときだけ更新 (これが重要) G コードに対して 5 つの新しいコードを追加 push/enter 方式 Spineless Tagless G-machine Tagless: 統一された書式になって、先頭の tag がなくなった

    GHC の STG に関するまとめ - あどけない話
  • リストの畳み込みと展開 - あどけない話

    リストの畳み込みには、foldr が使われる。 foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ ini [] = ini foldr op ini (x:xs) = x `op` foldr op ini xs Data.List には、この双対となる関数 unfoldr が定義してある。 unfoldr :: (a -> Maybe (b,a)) -> a -> [b] unfoldr f x = case f x of Nothing -> [] Just (z,x') -> z : unfoldr f x' unfoldr は種からリストを生成する。 既存の関数 unfoldr をプリミティブと考えて、他の関数を定義してみる。まずは、iterate。 iterate :: (a -> a) -> a -> [a] iterate f =

    リストの畳み込みと展開 - あどけない話
  • guard の動作原理を考える - あどけない話

    「リストモナドの動作原理を考える」の続きで、guard の動作原理を考えてみます。 guard は、リスト内包表記では、こんな感じに書けます。 [x | x <- [1,2], x < 2] → [1] これを do で書き直すと、こうなります。 do x <- [1,2] guard (x < 2) return x guard の定義は、Contorol.Monad の中にあって、こういう風になっています。 guard :: (MonadPlus m) => Bool -> m () guard True = return () guard False = mzero 僕には return () が何を意味するのか、さっぱり分かりませんでした。 do から >>= へ変形 上記の do を >>= へ変形するとこうなります。 [1,2] >>= (\x -> guard (x < 2)

    guard の動作原理を考える - あどけない話
  • 型クラスとモナドと 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 モナド - あどけない話
  • 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ことはじめ - あどけない話
  • コンパイルは(テストではなく)証明である - あどけない話

    「プログラムのテストはバグの存在を示すことにかけてはとても効率的な方法ですが、バグの不在を示すことにかけては絶望的なほどに不適切です。プログラムの信頼性を顕著に向上させる唯一の方法は、その正当性に対して説得力のある証明を与えることです」 -- 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 を経て、現在で

    静的型付き言語プログラマから見た動的型付き言語 - あどけない話
  • GHC でスタックトレース - あどけない話

    これまで GHC では、スタックトレースを取ることが有効なデバッグ方法ではなかった。 なぜなら遅延評価では、(再帰であってもなくても)末尾呼び出しは単なるジャンプになるから、スタックを使わないのである。スタックに戻る場所を積むのは、case と of の中で評価される式だけだ。(つまり、ここは正格に評価される。) この問題を解決するために GHC 7.4.2 から、わざわざスタックにログを残して、スタックトレースが取れるようになった。すなわち、最新の Haskell Platform をインストールしていれば、この機能を使えるということだ。 例として、以下のプログラムを考えよう。 module Main where main :: IO () main = print $ foo 3 + 1 foo :: Int -> Int foo x = x * 2 + bar x bar :: In

    GHC でスタックトレース - あどけない話