by shigemk2

当面は技術的なことしか書かない

アルドノア・ゼロの5話で出てきたエラー画面のコードを元ネタと見比べてみた

こんなツイートが出てきたので、アルドノア・ゼロの5話で出てきたエラー画面のコードを元ネタと見比べてみた

アニメで出てきたメッセージはこれ。

A font change leaves tons o-turds between
horizontal text lines
    Pease
    --Devon

PS: bug test code follows. for best results
mv .emacs .emacs-NOT
Open -a Emacs.app
mv .emacs-NOT .emacs
;; OS font bug demo
: stray dots inside a square brancket
(progn
  (insert "\n[] <- no screen turds\n[#
will fix it      ")
  (sit-for 0)
  (beginning-of-line)
  (forward-char)

元ネタ。 three or four MacOS font bugs

実際のコードはこんな感じ

A font change leaves tons-o-turds between horizontal text lines.

                Peace
                        --Devon

PS: bug test code follows, for best results
        $ mv .emacs .emacs-NOT
        $ Open -a Emacs.app
        $ mv .emacs-NOT .emacs
as I know no way to give switches to a MacOS Carbon app.

;; MacOS font bug demo: stray dots inside a square bracket
(progn
  (insert "\n[ ] <--no screen turds\n[#] <--screen turds look like [: ] but  
will fix it.                ")
  (sit-for 0)
  (beginning-of-line)
  (forward-char)
  (delete-char 1)
  (insert " ")
  (forward-char))

Emacs Lispの解説

  1. sit-for この関数は(処理待ちのユーザーからの入力がなければ)再表示を行い、 seconds秒休止するか、入力がくるまで待つ。 GNU Emacs Lisp¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë: Waiting
  2. beginning-of-line この関数は, 現在行の先頭にポイントを移動する GNU Emacs Lispリファレンスマニュアル: 29. バッファ内の位置
  3. forward-char この関数は, 前方へ, つまり, バッファの末尾に向けて (countが負であれば, 後方へ, つまり, バッファの先頭へ向けて) count文字分ポイントを移動するGNU Emacs Lispリファレンスマニュアル: 29. バッファ内の位置
  4. delete-char 次の文字を削除する GNU Emacs Manual

実行してみる

(progn
  (insert "\n[ ] <--no screen turds\n[#] <--screen turds look like [: ] but  
will fix it.                ")
  (sit-for 0)
  (beginning-of-line)
  (forward-char)
  (delete-char 1)
  (insert " ")
  (forward-char))
[ ] <--no screen turds
[#] <--screen turds look like [: ] but  
w ll fix it.                

iが消えて、空白が挿入され、最後の行の最初のlの次にポインタが挿入されている。

mmap

MMAP(2)                    Linux Programmer’s Manual                   MMAP(2)



名前
       mmap, munmap - ファイルやデバイスをメモリにマップ/アンマップする

書式
       #include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
       int munmap(void *addr, size_t length);

説明
       mmap() は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。新しいマッピングの開始アドレスは addr で指定される。マッピングの長さは length
       引き数で指定される。

       addr が  NULL の場合、カーネルがマッピングを作成するアドレスを選択する。この方法は最も移植性のある新しいマッピングの作成方法である。 addr が NULL でない 場
       合、カーネルはマッピングをどこに配置するかのヒントとして addr を使用する。Linux では、マッピングはすぐ近くのページ境界に作成される。新しいマッピングのアド
       レスは、呼び出しの返り値として返される。

       ファイルマッピングの内容は、ファイルディスクリプタ fd で参照されるファイル (もしくは他のオブジェクト) のオフセット offset から開始される length バイトのデ
       ータでサイズの倍数でファイルマッピングは無名マッピングの反対語である。 MAP_ANONYMOUS を参照)。 offset は sysconf(_SC_PAGE_SIZE) が返すページ
       なければならない。

       引き数 prot には、マッピングのメモリ保護をどのように行なうかを指定する (ファイルのオープンモードと矛盾してはいけない)。 prot には、 PROT_NONE か、以下のフ
       ラグをひとつ以上ビット毎の論理和 (OR) をとったものを指定できる。