わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

aを8000個

いきなりですが問題です.

Emacsで,「a」をちょうど8000個並べた文字列を作る,キー操作回数最小の操作を答えなさい.

aを100個,キー操作回数最小でと同様に,中身が空のバッファを開いた状態から始めます.長押し(離すまでずっと「a」が出る)は使用しないこととします.C-cなど,CtrlやMeta(Alt)やShiftを組み合わせたキーバインドは,それで1回とします.C-x C-fは(Ctrlを押しながらXとFの順に押すとしても)2回と数えます.
ここからは先月の記事と異なるアプローチをとります.というのもEmacsでは前置引数を使うことで,倍々にすることなく,必要とする字数を入力できるのでした.http://www.ysr.net.it-chiba.ac.jp/data/emacs/emacs21.htmlには,「ESC 1 0 0 aと打てば、aの文字が100文字分入力される」とあります.その前の説明文をもとにして,M-8 M-0 M-0 M-0 aという,たった5回のキー操作で,バッファは8000個のaで埋め尽くされます.
これを使って,演習科目で気になっていた点の解決を試みます.課題の一つに,「HTTPのステータスコード414を出せ」というのがありました.ステータスコード414とは,古くはRequest-URI Too Long*1,現在(RFC 7231)ではURI Too Long*2のことです.この課題より前に,httpd-2.4.29.tar.bz2を使用してApache HTTP Serverを一般ユーザの権限でビルドし,10080を待ち受けポート番号として起動しています.
10000バイトだとこのステータスコードが返ってきますが,5000バイトでは発生しません.なので,しきい値となるバイト数が8192(=2の13乗)であることは,見当がついていました.気になっていたのは,「長すぎる(Too Long)」と判断する対象が何なのかです.httpから始まるURI(URL)なのか,URLの:ポート番号のあとのスラッシュから始まるパスのことか,リクエストヘッダのことなのか….
検証にあたり,まずはEmacsで,request.txtという名前のファイルを新規に作成し,以下の内容にします.2行目は空行です.

GET / HTTP/1.0

そして端末で,以下のコマンドを実行します.なお「(」と「; sleep 1)」がないと,サーバに送りつけて,返答をもらえずに終了となってしまいます.

(cat request.txt; sleep 1) | telnet 127.0.0.1 10080

これで,「HTTP/1.1 200 OK」と出ます.空行のあとには,「It works!」を含む,1行で構成されたHTMLもあります.問題なく接続できました.
次にEmacsで,「GET /」の直後の空白のところにカーソルを移動させ,M-8 M-1 M-9 M-2 aと打ってから,C-x C-sで保存します.
そして,先ほどと同じコマンドを実行すると…「414 Request-URI Too Long」が得られました.
字数を減らしてみます.aの数が8177個までは「414 Request-URI Too Long」です.そこから1文字減らすと,「403 Forbidden」になりました.
中途半端な数にも思えますが,端末でls -l request.txtを実行することで,理由が分かりました.aの数が8176個のときの,このファイルのサイズは,8192バイトです.リクエストヘッダが8192バイトを超えると,ステータスコード414となる,という仮説が立てられます.
あれこれ変えて,検証してみます.aの数が8176個で,8192バイトのrequset.txtをもとに,

  • 「GET」を「POST」に変更すると…414
    • 「POST」のまま,aを1文字減らすと…403
      • 空行のあとに「aaa」を書くと(ファイルサイズは8192バイトを超えるけれども)…403
  • もとに戻して,改行を2バイト*3にすると…414

仮説は確かめられた,と言っていいでしょう.
これらの結果を踏まえ,学生向けの解説を,少し書き換えました.「リクエストヘッダ」について,授業中に示したRFC 7231の日本語訳*4には「要請ヘッダ」と表記されていたので,この語を使いました.

*1:https://tools.ietf.org/html/rfc2616#section-10.4.15

*2:https://tools.ietf.org/html/rfc7231#section-6.5.12

*3:EmacsのC-x RET fでutf-8-windowsでは,1行の字数が多いせいか,変更できませんでした.かわりに端末でnkf -Lw --overwrite request.txtを実行しました.

*4:https://triple-underscore.github.io/RFC7231-ja.html