あどけない話

インターネットに関する技術的な話など

Haskell

TLS 1.3 開発日記 その10 NSSサーバ

TLS 1.3 のテスト用に公開されているNSSサーバは2つあります。 https://franziskuskiefer.de:9913/ https://tls13.crypto.mozilla.org/ Haskell TLS 1.3 client では、前者とフルハンドシェイクできるのですが、後者は handshake error を返してきます。一方…

TLS 1.3 開発日記 その9 NewSessionTicket

kazuho さんと議論したメモ:サーバが送るNewSessionTicketは、当然セッションチケットを入れないければならない。以下の構造では ticket がそれにあたる: struct { uint32 ticket_lifetime; uint32 ticket_age_add; opaque ticket; Extension extensions; …

TLS 1.3 開発日記 その8 開発メモ

これは、http2 Advent Calendar 2016の25日目の記事です。この記事では、HaskellでTLS 1.3を開発した際に難しかった点をまとめます。自分のための覚書です。TLS 1.3のみをフルスクラッチで書くと、そこまで難しくないのかもしれませんが、TLS 1.2以前と共存…

TLS 1.3 開発日記 その7 0RTT

これは、http2 Advent Calendar 2016の24日目の記事です。この記事では、TLS 1.3 の4番目のハンドシェイクである 0RTT について説明します。0RTTとは、アプリケーションが目的の通信を始めるまでに、下位の層でパケットのやりとりがないことを意味します。準…

TLS 1.3 開発日記 その6 Pre Shared Key

これは、http2 Advent Calendar 2016の13日目の記事です。今日は、TLS 1.3 の第三番目のハンドシェイクである PSK (Pre Shared Key)について説明します。みなさんは、Pre Shared Key という言葉から何をイメージしますか? 多くの方は、通信路の暗号化に使う…

TLS 1.3 開発日記 その5 Hello Retry Request

これは、http2 Advent Calendar 2016の12日目の記事です。今日は、第2番目のハンドシェイクである HRR (Hello Retry Request)について説明します。HRR とは、サーバがクライアントに Hello を再要求し、フルハンドシェイクをやり直すハンドシェイクです。以…

TLS 1.3 開発日記 その4 フルハンドシェイク

これは、http2 Advent Calendar 2016の8日目の記事です。今回はTLS 1.3のフルハンドシェイクについて書きます。 TLS 1.2のフルハンドシェイク おさらいとして、RFC5246からTLS 1.2のフルハンドシェイクの図を少し変更して抜粋します。角カッコは暗号化されて…

TLS 1.3 開発日記 その3 バージョン

これは、http2 Advent Calendar 2016の7日目の記事です。今回はTLSのバージョンについて書きます。TLSのバージョンは、Client Hello と Server Hello を交換することで決めます。 Client Hello TLS 1.3 の Client Hello は、TLS 1.2 と互換性を維持するため…

TLS 1.3 開発日記 その2 暗号スイート

これは、http2 Advent Calendar 2016の3日目の記事です。今回は暗号スイートについて書きます。TLS 1.2 の暗号スイートは、たとえば以下のような感じでした。 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 これは次のような意味です。 鍵交換は使い捨て楕円Diffie…

TLS 1.3 開発日記 その1 実装状況

これは、http2 Advent Calendar 2016の1日目の記事です。現在、IETF で TLS 1.3 の標準化が大詰めを迎えています。僕も TLS 1.3 の標準化に参加しており、仕様の分かりにくい部分を直したり、TLS 1.3 を Haskell で実装したりしています。この開発日記のシリ…

重複したフィールドラベル

Haskell 2010 では、同じファイルに重複したフィールドラベルを定義できない。たとえば、以下はエラーになる。 data Foo = Foo { same :: Int } data Bar = Bar { same :: Float } -- これはダメ この問題を解決する案は、OverloadedRecordFields と呼ばれ、…

GHC とスペースとリーク

これはHaskellスペースリーク Advent Calendar 2015の17日目の記事です。 :sprint と MonomorphismRestriction サンクのリークを防ぐには、どの式がサンクかを理解する必要がある。そのために便利なのが、GHCiの:sprint コマンドだ。MonomorphismRestriction…

スレッドリーク

これはHaskellスペースリーク Advent Calendar 2015の14日目の記事です。スレッドリークとは一般的に、終了させることを忘れたスレッドが残り続けることを言う。これは終了させ忘れたのが悪いという他ない。一方で、GHC では、スレッドを終了させたにもかか…

にせ末尾再帰

これはHaskellスペースリーク Advent Calendar 2015の8日目の記事です。IOのコードは、普通に書けば末尾呼び出しの最適化が効く形になる。たとえば、こんな感じ: foo :: Char -> String -> IO Int foo a b = do c <- bar a b zoo b c woo c woo :: Int -> I…

複数のGHCを共存させる

GHC 7.8.1 がリリースされ、type family がうまく扱えない問題が発覚したため、すぐに GHC 7.8.2 がリリースされました。このおかげで Yesod が、うまくビルドできるようになりました。しばらくして、GHC 7.8.3 もリリースされる気配があります。また、一ヶ…

RSSリーダ BazQux と DNS キャッシュ

BazQux(バズクックス)は、Google Reader の代替として密かに注目されている RSS リーダです。実装と運用を一人でやっている Vladimir Shabanov さんによると、BazQux のウリは、 高速である ブログのコメントも表示できる 複数のビューがある モバイルに対応…

ByteString あれこれ

Haskell で高速なプログラムを書くには ByteString の深い知識が必要となる。鍵となるのは、Data.ByteString.Internal というモジュールである。このモジュールは公開されているが、ドキュメントは隠されているので、詳しく知るためにはソースを読まないとい…

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…

cabal 1.18 が提供するサンドボックスの小技

cabal 1.18 のサンドボックスがどういう機能か知らない人は、An Introduction to Cabal sandboxes か 2013年8月現在のHaskell開発環境をどうぞ。それで、sandbox サブコマンドの--sandbox オプションが早速役に立ったというお話。 --sandbox オプション パッ…

GHC と gold

GHCのコンパイル速度は、お世辞にも速いとは言えないのだが、一番イライラするのはリンクが遅いこと。これは GNU ld が遅いからである。という訳で、速いと言われる gold を使うためのメモ。GHC 7.6.3 までは gold が使えない。なぜなら、GNU ld 固有のオプ…

Mac に ThreadScope をインストールする方法

ThreadScope は、GHC が生成する event log を可視化ツールです。以前、試行錯誤して Mac にインストールしたときのメモが出て来ました。並列並行本が出版された今、需要が高いような気もするので、公開しておきます。Parallel and Concurrent Programming i…

Lensことはじめ

見ろ! Haskell が OOPL のようだ! さてさて、ようやく重い腰を上げて、Lens を勉強し始めましたよ。Haksell for allを見て勉強すればいいのかなと思ったんですが、解説しているパッケージが data-lens なので古いですね。今、使うべきなのは、lens という…

PFAD(1): The smallest free number

与えられた自然数リストの中に存在しない最小の自然数を求める問題。(ここでの自然数は 0 から始まる。)素朴には、以下のように実装できる。 minfree :: [Int] -> Int minfree xs = head $ [0..] \\ xs (\\) :: Eq a => [a] -> [a] -> [a] us \\ vs = filter…

GHC でスタックトレース

これまで GHC では、スタックトレースを取ることが有効なデバッグ方法ではなかった。 なぜなら遅延評価では、(再帰であってもなくても)末尾呼び出しは単なるジャンプになるから、スタックを使わないのである。スタックに戻る場所を積むのは、case と of の中…

tailをなくしたフィボナッチ数列

以下の内容は比較的どうでもいいことなので、暇な人だけ読んで下さい。Haskell では、head と tail という関数は使うなと言われる。なぜなら、引数が空リストのときにエラーを返すからである。純粋な関数は全域関数であるべきだが、head と tail は div など…

Yesod の設定

web アプリのき開発中はローカルホストで検証し、実際のサービスはリバースプロキシの後ろで運用する方法は、たったこれだけ: yesod init する config/settings.yml を適切に変更 yesod init すると、Foundation.hs に以下のようなコードがある。 instance …

doの中のif

Haskellの文法はかなり心地よいが、もちろん嫌な点もある。その代表例が、do の中の if 式である。if は一つの式を成す必要があるので、以下のように行を下げないといけない。 deleteFile :: FilePath -> IO () deleteFile file = do exist <- doesFileExist…

なぜConduitなのか?

Iteratee という概念は、Haskell 界に適切な資源管理と合成可能な IO をもたらした。そして、以下の3つのパッケージが乱立することになった。 iteraee enumerator iterIO 昨年の ICFP の際、Iteratee の生みの親である Oleg さんに「この状況をどう思ってい…

HaskellとテストとBDD

Haskellでの BDD を実践するとどうなるかを考えるためのメモ。 型 豊かなデータ型とセクシーな型システムを持つ Haskell では、型が以下のような意味を持つ。 仕様 保守性の向上 簡単なドキュメント 設計図 BDD では、テストの用語ではなく設計の用語を使っ…

ハッシュテーブル攻撃とHaskell

以下を理解しようとしたときのメモ: Efficient Denial of Service Attacks on Web Application Platforms slides n.runs-SA-2011.004 - web programming languages and platforms - DoS through hash table 概要 外部からのデータに対して、効率の悪いアル…