タグ

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

  • TLS 1.3 開発日記 その1 実装状況 - あどけない話

    これは、http2 Advent Calendar 2016の1日目の記事です。 現在、IETF で TLS 1.3 の標準化が大詰めを迎えています。僕も TLS 1.3 の標準化に参加しており、仕様の分かりにくい部分を直したり、TLS 1.3 を Haskell で実装したりしています。この開発日記のシリーズでは、TLS 1.3の仕組みを説明していこうと思います。 そもそも、なぜ TLS 1.3 が必要なのかは、TLSの動向をお読み下さい。なお、次のTLSのバージョンを何にするかは、現在もめていて、1.3ではなくなる可能性もあることに注意して下さい。 現在の実装 現在利用できる TLS 1.3 の実装の一覧は、Implementationsにまとまっています。僕がクライアントとしてよく使っているのは、Firefox Nightly、Chrome Canary、および picotls です

    TLS 1.3 開発日記 その1 実装状況 - あどけない話
  • HTTP/2から見えるTLS事情 - あどけない話

    これは HTTP/2 アドベントカレンダー19日目の記事です。 この記事はたくさんの資料を読んだ上で書きましたが、間違いとか勘違いとかがあるかもしれません。もしあれば、指摘していただけると幸いです。 実質的に必須となったTLS HTTP/2は、HTTP/1.1と同じく、暗号化なし/ありのポートとして、80と443を使います。そのため、通信開始時にHTTP/1.1とHTTP/2をネゴシエーションするための仕組みが、HTTP/2で定められています。 このように仕様としては暗号化なしのHTTP/2が定義されていますが、Firefox や Chrome が TLS を要求するために、実質的は暗号化ありが必須となっています。これは、米国の監視プログラムPRISMに代表される広域監視(pervasive surveillance)に対抗するために、IETFがさまざまな通信にプライバシの強化を要求する方

    HTTP/2から見えるTLS事情 - あどけない話
  • 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 あれこれ - あどけない話
  • 高速な累乗計算 - あどけない話

    累乗(x^n)を単純に計算すると、オーダーは O(n)となり効率が悪いです。そこで、nを2の累乗に分解して計算する高速化手法が一般に知られています。 たとえば、3 の 11 乗を計算する場合を考えましょう。11 は 1 + 2 + 8 に分解できます。 この累乗の系列では、ある値は一つ前の値を2乗することで計算できます。たとえば、こうです。 3^1 = 3 3^2 = 3 * 3 = 9 3^4 = (3^2)^2 = 9^2 = 81 3^8 = (3^4)^2 = 81^2 = 6561よって、3^11 は以下のように計算できます。 3^11 = 3^(1+2+8) = 3^1 × 3^2 × 3^8 = 3 × 9 × 6561 = 177147この方法のオーダーは、O(log2(n)) です。 遅延評価風に RSA のために高速な累乗計算を Haskell で実装したことがありまし

    高速な累乗計算 - あどけない話
  • Haskellの単体テスト最前線 - あどけない話

    この記事の最新版は、githubで管理されています。 これはHaskell Advent Calendar 2012の5日目の記事です。 Haskellで作成したパッケージに対して、単体テストを書くための最新情報をお届けします。 要約 要点は4つです。 利用者に見せたい振る舞いは、doctest で書く 利用者に見せたくない振る舞いは、hspec で書く テストを自動化するフレームワークとしては Cabal を使う doctest でも hspec でも、純粋なコードに対しては、できるだけ QuickCheck などの性質テストを書く この記事で一番伝えたいのは、3) です。例題としては、Base64 という符号化を取り上げます。Base64 は知っていると仮定して話を進めますので、知らない人はあらかじめ Wikipedia の Base64 の説明でも読んで下さい。 この記事で利用するコ

    Haskellの単体テスト最前線 - あどけない話
  • コンパイルは(テストではなく)証明である - あどけない話

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

    コンパイルは(テストではなく)証明である - あどけない話
  • Enumeratorは終了条件の検査からの解放だ - あどけない話

    長年の疑問の答えが Enumerator だった。今日はそんなお話です。 findを実装する Real World Haskell の第9章に UNIX の find コマンドを作る例があります。最初は安直に実装してみましょう。まず、ディレクトリの内容を得る補助関数と、ディレクトリが辿れるか調べる補助関数を用意します。 getValidContents :: FilePath -> IO [String] getValidContents path = filter (`notElem` [".", "..", ".git", ".svn"]) <$> getDirectoryContents path isSearchableDir :: FilePath -> IO Bool isSearchableDir dir = (&&) <$> doesDirectoryExist dir <

    Enumeratorは終了条件の検査からの解放だ - あどけない話
  • Haskellライブラリ入門 (2011年版) - あどけない話

    この記事では、基ライブラリである Prelude の関数をだいたい理解した人が、次に知るべきライブラリを紹介します。自由自在にリストを使いこなせ、正規表現がなくてもプログラミングができるんだなと実感した人を対象にしています。 この記事のテーマは、脱リストです。リストはとても柔軟ですが、リストで表現されている文字列は、メモリーをたくさん消費しますし、なにより遅いのです。実用的なプログラムを書くためには、必要に応じて適切なデータ構造を使う必要があります。 containers containersは、文字通りコンテナ型をいくつか集めたパッケージです。ハッシュの代替品やキューとして使えます。連想リストを使っているところは、すべて Data.Map などで置き換えることをお勧めします。 containers に入っているモジュールはすべて眺めましょう。そして、実装も読んでみましょう。(プログラミ

    Haskellライブラリ入門 (2011年版) - あどけない話
  • 使ってみよう Enumerator - あどけない話

    Enumerator Package - Yet Another Iteratee Tutorialは、Iteratee: 列挙ベースのI/Oよりは分かりやすいのですが、やっぱりよく分かりません。なぜなら、僕は使い方を知りたいのに、作り方が書いてあるからです。そこで、Enumerator ライブラリの使い方を簡単に紹介します。 登場人物 Iteratee 入力をもらって計算をします run_ で実行します IO モナドが指定されていれば、副作用を起こせます オートマトンと考えると分かりやすいです Iteratee 同士は (>>=) で合成できます Iteratee >>= Iteratee → Iteratee Enumerator Iteratee と ($$) で合成することにより、新たな Iteratee になります Enumerator $$ Iteratee → Iterate

    使ってみよう Enumerator - あどけない話
  • 関数合成の妙技 - あどけない話

    Haskell 初心者は括弧ばかりの Lisp のようなコードを書く。中級者になると、($) が多くなる。上級者(言い過ぎか?)になると、($) が消えて、(.) が多くなる。この記事では、上級者になるコツをちょっと教えちゃおう。 括弧だらけのコード では、以下の例について考えよう。 foo p xs = sum (filter p (map (+1) xs)) 括弧が多くて、いかにも初心者が書いたコードだ。foo は、以下のように動く。 foo even [1..6] → 12 ($) を使う では、括弧を ($) に置き換えてみよう。そうするには、一番右側にある閉じ括弧を消して、対応する開き括弧を ($) に置き換えればよい。だからこうなる。 foo p xs = sum $ filter p $ map (+1) xs だいぶ見やすくなった。 (.) を使う map (+1) xs

    関数合成の妙技 - あどけない話
    masakielastic2
    masakielastic2 2011/11/28
    カッコを減らして関数合成
  • 祝 「Scheme 手習い」復刻 - あどけない話

    めでたい! 「Scheme 手習い」が復刻しました。正確に言うと、復刻ではなく、新しい版に基づいた新しい訳です。 Scheme手習い 作者: Daniel P. Friedman,Matthias Felleisen,元吉文男,横山晶一出版社/メーカー: オーム社発売日: 2010/10/22メディア: 単行(ソフトカバー)購入: 5人 クリック: 129回この商品を含むブログ (34件) を見る 以前、マグロウヒル出版から出版されていた「Scheme手習い―直感で学ぶLisp」は、"The Little Lisper" の訳です。内容が、Common Lisp でもなく、Scheme でもない Lisp の方言によって書かれているのに、邦題に Scheme が入っていたのは、このの唯一の欠点だと僕は感じていました。 今回は、"The Little Schemer" の訳です。原書も訳

    祝 「Scheme 手習い」復刻 - あどけない話
  • Haskellの講義に関するQ&A - あどけない話

    岡山大学で、関数プログラミングの講義を一コマ担当しました。資料は、函数プログラミングの集いで使った関数プログラミングの道しるべを流用しました。ちゃんと用意しなくて、講義を受けた学生には申し訳ないです。 講義内容に関して質問を頂きました。同じような疑問を持つ人も多いと思いますので、担当教官の許可を得てここに公開します。 永続データプログラミングの意義は分かったが,破壊しないと効率が悪いのではないですか.配列のような構造が世の中には多い気がします.メモリは足りなくなりませんか. 基的に永続と呼ばれているデータは、共有の効率が高く、しかも不要になった部分はすぐに GC に回収されます。また、GHC の GC はすごく優秀であることが知られています。 Haskell では、下位のレイヤーではデータを破壊できて、たとえば固定長のバッファーを使い回すといったことも可能です。ただ、それは普通のプログラ

    Haskellの講義に関するQ&A - あどけない話
  • 2011年に Haskell を始める人のために - あどけない話

    適切な一歩を踏み出すか否かは、大きな違いを生みます。この記事では、2011年に Haskell を始める人のために、著者が考える最適な入門方法を示します。 Haskell Platform をインストールする 昔人気のあった Hugs は、もう保守されていません。現在は、GHC の時代です。GHC とライブラリをパッケージ化した Haskell Platform をインストールして下さい。 インタープリタが使いたい場合は、付いてくる ghci を使います。 コンパイラ -- ghc インタプリタ -- ghci スクリプト -- runghc GHC マニュアルの日語訳もあります。 プログラミングHaskell 次に、プログラミングHaskellを読んで関数プログラミングの「こころ」を理解しましょう。 プログラミングHaskell 作者: Graham Hutton,山和彦出版社/メー

    2011年に Haskell を始める人のために - あどけない話
  • Haskell から見た node.js - あどけない話

    誤訳 以前、「サーバサイドJavaScriptのNode.js、最初はCやHaskellを検討し失敗。開発者ライアン・ダール氏へのインタビュー」という記事が twitter で話題になっていました。 ―― なぜJavaScriptを選んだのでしょう? ダール氏 実は最初は違いました。最初はC、Lua、Haskellなどで失敗していました。そんなときV8(Chromeが採用しているJavaScriptエンジン)に気がついて、やろうとしていることに対してJavaScriptが完璧な言語だと突然ひらめいたのです。 ただでさえ、Haskell は遅いと誤解されているのに、このような悪意さえ感じらえる訳だと、さらに誤解が深まりそうです。原文にはこう書かれています。 Dahl: Originally I didn’t. I had several failed private projects doi

    Haskell から見た node.js - あどけない話
  • Haskell演習の草稿 - あどけない話

    プログラミングの経験はあるが、Haskell は使ったことがない人に、2時間ぐらいで Haskell のよさを教える演習のネタを考える。 Haskell の代表的な利点といえば、 型による厳密なプログラミング QuickCheck によるテストケースの自動生成 Persec によるパーサーの作成 だ。今回は、パーサーの作成は諦めて、上2つについて教えてみる。 リストの探索プログラム まず、連想リストを探索するプログラムを書く。標準では lookup という関数が用意されているが、これを search という名前で再発明する。オーダーは O(n)。 まず、型を考える。 search :: Eq k => k -> [(k,v)] -> Maybe v search = undefined 次に、実装を考える。 search :: Eq k => k -> [(k,v)] -> Maybe v

    Haskell演習の草稿 - あどけない話
  • Applicativeのススメ - あどけない話

    この記事の目的は、Applicative 信者による Applicative スタイルの布教です。 簡潔に結論を述べると、 foo = do a <- m1 b <- m2 return (f a b) のようなコードを書きたくなったら foo = f <$> m1 <*> m2 と書きましょうということ。 合い言葉は、「do と return をなくせ!」です。 FunctorとMonadの間 Functor を特殊化した型クラスがMonadで、Monadの方が強力です。なぜなら、メソッドが増えるからです。 Functorのメソッドはfmapです。fmapの別名を (<$>) といいます。(この記事では、(<$>) と liftM を同一視します。) そして、Monadのメソッドは、ご存知の通り (>>=) と return です。 FunctorとMonadの間にApplicative

    Applicativeのススメ - あどけない話
  • GHC と UTF-8 - あどけない話

    GHC が、どう UTF-8 を扱うか調べてみました。 コードへの埋め込み 文字列リテラルに UTF-8 が使えました。 str = " システム " どう扱っているのか、確かめてみます。 import Data.Char map ord str → [32,12471,12473,12486,12512,32] Char は1バイトではなく、UTF-8 の文字が収容できる大きさになっているようです。うまくできていますね。 UTF-8 ファイルの読み込み UTF-8 で " システム " と書いたファイルを用意し、以下のコードを実行して、読み込ませます。 main = do cs <- getContents print $ map ord cs 結果は、こうなりました。 → [32,227,130,183,227,130,185,227,131,134,227,131,160,32] 単

    GHC と UTF-8 - あどけない話
  • 正規表現を超える - あどけない話

    まずは、Audrey さんが言った Haskell の殺し文句を思い出して頂きたい。 正規表現ベースのパーサはメンテナンスしにくいのに気づいた? Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。 15分というのは誇張が入っていると思うが、正規表現が保守しにくく、Haskell の Parsec は強力で保守し易いのは事実だ。その理由を Perl と Haskell のコードを示しながら説明してみたいと思う。 Perl を愛する方に:この記事は Perl を攻撃するために書いたのではない。Perl を選んだのは、正規表現を広めた言語であり、僕がそれなりに Perl のコードを書けるためである。この記事の目的は、正規表現よりも関数型パーサー(Parsec)の方が優れていると示すことだ。 例題 この記事では例題として、IPv4 アドレスを解析する関数を書く

    正規表現を超える - あどけない話
  • 文章の書き方 - あどけない話

    2006年に IIJ の新人研修で「文章の書き方」という講義を担当しました。そのときの資料を何人もの人に個別に差し上げていたのですが、それも面倒になってきました。新人研修の担当者に問い合わせたところ、公開しても問題ないとのことでしたので、資料を公開します。 「文章の書き方」の資料

    文章の書き方 - あどけない話