Haskell でリンクレイヤーにおける ICMP パケットの構築, 送受信および解析による ping の実装

Haskell で低レイヤーのネットワークプログラミングをそういえばしたことがなかったので, 何か実装してみたかったのだが特別ネタも思いつかないので, とりあえずイーサヘッダ, IP ヘッダ等を含む, 生の ICMP Echo/Reply パケットを扱ってみることとした.

ICMP パケットは IP パケットであるので, 通常は ICMP パケット部分のみを構築してPF_INET等で開いたソケットに送りつけたり, recv 等すれば送受信においては必要十分であるが, これではあまり面白みがないので, リンクレイヤーから扱うこととした.

生の ICMP パケットを扱うということは, ICMP データの自作はもちろん, イーサヘッダ, IP ヘッダの自作が必要となる. またイーサヘッダを自作するということは, MAC アドレスを解決しなければならないので, 最低限 ARP パケットの送受信および解析機能の自作が必要となることを意味する. ARP パケットの自作を要するということは, デフォルトゲートウェイやサブネット環境などを取得する機能も必要である. これらを自作してみた.


三角関数の公式の導出

  • 2018/09/06 09:00

参考文献 1 では, 高木貞治氏の書いた解析概論の緒言として示されている三角関数の古典的な導入法の問題点と, それに対する合理的な導入, 定義に関する記述があり, 興味深かったので読んでいたのだが, ふと高校数学 Ⅲ の「普通な」加法定理や積和, 和積の公式, 導関数の導出などが頭から抜けていたので, 復習がてら書くことにした. 一応, このエントリで言う三角関数 cosθ,sinθ\cos\theta,\sin\theta の定義は高校数学の範囲で言われる定義と同様であり, 次のとおりである.

高校数学における cosθ,sinθ\cos\theta, \sin\theta

直行座標平面上の原点 O(0,0)O(0,0) を中心とする半径 11 の円 CCx0,y0x\geq 0,y\geq 0 の部分を C+C_{+} としたとき, 弧度法によると, 点 A(1,0)A(1,0), C+C_{+} 上の点 P(x,y)P(x,y) を角 AOPA O Pθ (0<θπ2)\theta\ (0\lt\theta\leq\frac{\pi}{2}) となるようにとれば, 孤 APA P の長さは 角 AOPA O P そのもの, すなわち θ\theta である. このとき x=cosθ,y=sinθx=\cos\theta,y=\sin\theta である.

よくよく考えてみれば, この定義では, 孤 APA P の長さおよび実数 0<θπ20\lt\theta\leq\frac{\pi}{2} に対し孤 APA P の長さが θ\theta となる C+C_{+} 上の点 PP が存在することについて, 特に説明しておらず, 定義としては不十分な点があることが考えられる. 参考文献 1 にはこの問題に対する考察が綴られており, 読みやすい文体で書かれているので興味があれば読んでみることを勧める. 本エントリはそのような意味で, 特に面白みもなくただ単に高校数学 Ⅲ までの三角関数の内容を復習しているだけのものとなっているので, その点は悪しからず.


Haskell で D-Bus から systemd unit を制御する

D-Bus とはメッセージバスシステムであり, アプリケーション間で互いにやりとりを行うためのプロセス間通信実装の 1 つである. システムデーモン(新しいハードウェアデバイスの追加やプリンタキューの変更などのイベント等)と, ユーザー単位のログインセッションデーモン(ユーザーアプリケーション間の一般的なIPC)を提供する1.

現代的な Linux カーネルの init プロセスにて起動される systemd デーモンおよびその補助デーモンは, D-Bus にいくつかの API を公開している. 私の観測範囲内において, C や Python, Go 等でこれらを利用する例はそこそこ見たことがあるのだが, Haskell での取り組みは一切見たことがなかったので, 少々これらで遊んで見た日記として本エントリに記す.


AWS EC2 の各種環境を自動構築して distcc による分散コンパイルを実行する

クラウド上でなにか作れというような大学の課題で, 入力パラメータに応じて AWS EC2 インスタンス及びネットワーク周辺と distcc の環境構築を実行して, その上で分散コンパイルをして S3 へアップロードできれば, そこそこクラウドでやった意味があるといえるのかななどと思いつき, 軽い気持ちで作ってみた記録.


AWS SNS + S3 でバケット内の状態を即座に EC2 に反映するまで

ウェブアプリケーションが EC2 上で動作していて, そのコンテンツ内容を S3 バケットによって管理しているシチュエーションにおいて, S3 バケットの状態を即座にそのウェブアプリケーションに反映させたいという事例はよくあると思う(ステージング云々は, 一旦置いておくとして). 本エントリは, AWS SNS による HTTP リクエストをトリガーに, S3 バケットの状態を EC2 上のコンテンツへ即座に反映するための構造と簡単な実装について取り上げる.