ARPパケットに対する挙動からネットワーク上の盗聴者を特定する

通信が暗号化されていればまだ良いが, 自分の送受信しているパケットを同一ネットワーク上の信用できない者/物に無断で見られるのはやはり気持ちの良いものではない. 本エントリではそのような不届き者の存在を仮定して, その不届き者を比較的簡単に特定するといった試みを行う.

お断り

本エントリでの試行は当然ながら私個人のローカル LAN 上で行なっており, 同様の試行を公衆回線上などで行うと迷惑/法に抵触する可能性があるのでやめること. 本エントリに起因する直接的又は間接的な損害に関して, その理由及び原因を問わず著者(Roki) は一切の責任を負わない.

ネットワーク盗聴を検出する原理

ネットワークに接続するためには, 大抵コンピュータに NIC を装着して TCP/IP の設定を済まし, ハブに接続する. 同プロトコルにおける各コンピュータの通信では, IP アドレスと MAC アドレスによる論理情報と物理情報の組み合わせを利用して, 目的のコンピュータに対するパケットの送信を実現する. 通常, その過程で NIC は自分とは無関係であるパケットを破棄する. しかし NIC をプロミスキャスモードにすると, 自分とは無関係であるパケットを破棄せずに取り込むようになる. 盗聴者はこれを利用して, 同一ネットワーク上を流れる他人のパケットを取得できる.


ベジェ曲線

典型的なパラメトリック曲線の一種である, ベジェ曲線(Bézier curve)についての学習メモ. パラメトリック曲線とその一種であるエルミート曲線に関しては, 前回の記事を参照.

ベジェ曲線は, パラメータ t(0t1)t\\ (0 \leq t \leq 1) と複数の制御点 PiP_i から構成されるパラメトリック曲線の一種である1. 始点と終点の線分から成る, 次数 nn のベジェ曲線は n+1n+1 の制御点をもち (=P0,P1,,Pn= P_0, P_1, \cdots, P_n の制御点があるベジェ曲線を n1n-1 次ベジェ曲線という), この内分点を繰り返し取ることによって, 曲線を得ることができる. この始点と終点の線分を, セグメントといい, これが得られる曲線そのものになる2. まず, ここでは 2 次ベジェ曲線を描くとして, そのイメージをつけるために, 図3を用いてその概要を見る. なお, 2 次ベジェ曲線は true type フォントなどで使われている.

2 次ベジェ曲線を描画する途中経過

エルミート曲線

典型的なパラメトリック曲線の一種である, エルミート曲線についてのメモ.

パラメトリック曲線

そもそもパラメトリック曲線とは, 任意のパラメータから各々の座標を陽関数形式で表現できる曲線のことをいう. このとき定義できる関数 ff がパラメータ tt1 の多項式である場合, それを多項式曲線といい, 有理式である場合, それを有理曲線という. 例えば, 直線の方程式 y=m(xa)+by = m(x-a)+b は,

{x=ty=m(ta)+b\begin{cases} x=t \\ y=m(t-a)+b \end{cases}

とパラメタライズできる. この方程式では, パラメタライズせずとも, xx に 1 つの実数を代入すれば, 必ず yy が求まる(逆も言える)ことは明らかである. 次に, 3 次曲線 y2=x3+x2y^{2} = x^{3} + x^{2} について考える.


ghc パターンマッチの時間計算量

reddit で見かけて, ふと気になったのでメモ. GCC で C/C++ コードの switch 文および case 節をコンパイルするとき, case 節の数が一定以上を超えると, ジャンプテーブルを利用したアセンブリが吐き出される1. 同様にして, ghc はパターンマッチでジャンプテーブルが用いられる場合がある.


C++20 Calender and timezone library

  • 2018/03/27 01:50
  • C++

本エントリは, 元々 P0355R5 を参考にまとめを行った記事であるが, その後 P0355R7

  • sunといった曜日を表すリテラルが全てSunday, mayといった月を表すリテラルが全てMayといった形式に変更され, またこれらとstd::chrono::last_spec型のlast1std::literals::chrono_literals名前空間下からstd::chrono名前空間下に移動された.
  • system_clock::to_time_tsystem_clock::from_time_tを Deprecated としていたが, Deprecated でなくなった.

といった他に, 細かい文面の改修や, constexprがつけられるなどの変更が加えられたため, 本エントリにおいても, それに従い該当箇所を改変している (差分を示すことも考えたが, ただ見難くなるように感じたため, そのようなことはしなかった). これらの変更には対応したつもりだが, 細かい厳密な記述に関しては, やはり P0355 の最新リビジョンを追って確かめてほしい(そして, 間違った箇所があれば指摘くださると嬉しい).

要旨

先週, 米国フロリダ州ジャクソンビルで ISO C++ 委員会によって, C++技術仕様(TS, 実験的機能ブランチ) と次の国際標準(IS) C++20 に関する作業が行われた. 同会議で Reddit で紹介されているように, C++20 にいくつかの機能が追加された. そのうちの 1 つである, Calender and timezone library に関する新機能, 概要のメモ.

  • 全機能の網羅性を主軸としたエントリではない(が, 独断と偏見により重要に感じた内容は結果的に網羅してしまっている部分もある)ため注意
  • 以下, 特に断らない限り, 全てのコード片においてusing namespace std::chrono;, using namespace std::chrono_literals;がされているとする.
  • 以下, 特に断らない限り, 各コードブロック以外で言及される内容といった記述については, 名前空間 std::chronoを省略する.