こんな夢をみた「ゆがんだ景色」

こんな夢を見た。

私は自動車にのっていた。 自動車は高度に自動制御されていて運転の必要はないが、見た目には現代の普通の自動車のようにハンドルもあり、ペダルもついていた。 窓はガラスではなくディスプレイになっていて、外の様子に情報を付け加えて表示する、いわゆる強化現実 (AR) を実装したものだった。

その自動車は山道を走っていた。 遠くに山城が見えた。 自動車には誰だかよくわからない同乗者がいた。 同乗者の説明によれば、城を中心にした観光地なのだという。

しばらくすると、 (窓に模した) ディスプレイの景色がゆがみ、まるで空中を走っているかのような状態になった。 観光地として城を強調するあまり、どこからでも城が見えるようにデータが補正されて、結果として無理のある映像になっているのだと同乗者が説明してくれた。

私はリセットスイッチ (通常の自動車ならばワイパーを動かすスイッチであるが、夢の中の私はなぜかそれをリセットスイッチと認識していた) を押したが、映像はゆがんだままだった。 与えられるデータがゆがんでいるので、やりなおしたところでゆがみは解消されないのだった。

Document ID: 2942e23018114c8c9f1bee809e2eceac

メモリストリーム

プログラミング言語 C における文字列というのはメモリの塊そのものです。 見えているままのデータがメモリ上のどこかに配置されています。 余計なことをしない単純さは機械の性能を引き出しやすい一方で、ちょっとしたことでもプログラマが手間をかけなければいけません。 もちろん、文字列を扱うライブラリを導入したり作ったりすればいくらでも複雑なことは出来るのですが、凝ったデータ構造は標準ライブラリとの組合せがやり難くなります。 そのあたりを考慮して使い勝手がよく汎用性が高い仕組みが作れないものかと私は考えていました。 そして、思い出したのは以前に作ったメモリをストリームとして読みだす仕組みのことです。

パイプでメモリをストリームにする - 主題のない日記

これと同様にメモリへの書き込みをストリームを通して出来る仕組みがあれば便利でしょう。 Scheme の文字列ポートによって、ファイル操作と同じ要領で文字列を構築できる便利さを私は知っています。

結果として出来たライブラリに memstream と名付けて Github に置きました。

GitHub - SaitoAtsushi/memstream: The library for access memory via stream.

例えば数をストリームに出力する関数があったとして、関数 open_output_memstream がオープンしたストリームを出力先にすればそのまま文字列を構築することが出来ます。 以下のように使えます。

#include <stdio.h>
#include <stdlib.h>
#include "memstream.h"

int count_three(FILE* fp) {
  int total=0;
  for(int i=3; i>0; i--)
    total += fprintf(fp, "%d\n", i);
  return total;
}

char* count_three_string(void) {
  FILE* fp=open_output_memstream();
  count_three(fp);
  fputc('\0', fp);
  size_t len;
  char* str = mclose(fp, &len);
  return str;
}

int main(void) {
  count_three(stdout);
  char* str=count_three_string();
  printf("%s\n", str);
  free(str);
  return 0;
}

ライブラリ memstream は Windows のパイプの機能を利用しています。 パイプの読書きのハンドルに対しては、シークを除いてはファイルに対しての読書きとほぼ同じ操作が可能なので、パイプのもう一旦で受取った情報を文字列として構築するという考え方です。

POSIX に有る open_memstream という機能とよく似ています。 インターフェイスも合わせることも考えたのですが、別スレッドで動いている都合上、タイミングを待つ必要があって現在の形に落ち着きました。

Document ID: 7f7c141b7a1c51ba27bf73ac15996653

奇妙な誤字

近頃はアマチュアによる小説作品がインターネット上でたくさん発表されている。 書いているのは素人であるし、編集者がいるわけでもないので誤字が多く含まれるのは仕方のないことではあるのだが、単なる漢字変換間違いではない奇妙な誤字を見ることがある。

そのひとつはカタカナの「ニ」であるべき箇所が漢数字の「二」になっているというものだ。 普通の入力システムでは文節や単語を単位とする変換になるのでカタカナから成る単語の内の一文字だけが漢字になるというのはどうにも()せない。 同じ人による(くせ)というわけでもなく、多くの人がこの間違いを頻繁にやっているのである。

とはいえ、カタカナの「ニ」も漢数字の「二」も音は同じ「ni」なので、私が知らない何かの入力システムではそういう打ち(そこな)いをしやすいこともあるのかもしれない。 などと思っていたのだが、カタカナの「ロ」であるべき箇所が漢字の「(くち)」になっているという事例もちょくちょく見る。 これは打ち(そこな)いで起こるようなものとも思えず、いったいどういうことなのかさっぱりわからない。

Document ID: 4ac8b6a47625b23b24e723b30c1bd8b0

Scheme で最速の Fizz Buzz を

プログラマの最低限の能力を測る試験として Fizz Buzz という問題が知られている。

基本的には 1 から 100 までの数値を表示するのだが、

  • 数値が 3 で割りきれるときは数値のかわりに Fizz と表示する
  • 数値が 5 で割りきれるときは数値のかわりに Buzz と表示する
  • 数値が 3 と 5 の両方で割りきれるとき (つまり 3 と 5 の最小公倍数である 15 で割りきれるとき) は数値のかわりに FizzBuzz と表示する

という規則を実現するプログラムを書くというものだ。

しばしば技巧的な要素を盛り込んで遊ぶ題材としても用いられる。

これを Common Lisp でなるべく高速に処理しようと試みている記事を先日読んだ。

Common Lispで最速のfizzbuzzを実装した話 - gos-k’s blog

要するに、実行するよりも前に文字列を組み立てておき、実行時には構築済みの文字列を表示するだけというメカニズムである。

私は、 Scheme (R6RS) で同様のことをしようとするとどうなるか考えてみた。

(import (rnrs))

(define-syntax make-fizzbuzz-string
  (lambda(ctx)
    (syntax-case ctx ()
      ((_ n)
       (integer? (syntax->datum #'n))
       (call-with-string-output-port
         (lambda(port)
           (do ((i 1 (+ i 1)))
               ((< (syntax->datum #'n) i))
             (display
              (cond
               ((zero? (mod i 15)) "fizzbuzz")
               ((zero? (mod i 5))  "buzz")
               ((zero? (mod i 3))  "fizz")
               (else i))
              port)
             (newline port))))))))

(define (fizzbuzz)
  (display (make-fizzbuzz-string 100)))

(fizzbuzz)

Guile で逆アセンブルするとこうなる。 (当初は Chez Scheme を使おうとしたのだが、逆アセンブル機能が提供されていなかった。)

0    (assert-nargs-ee/locals 0)      ;; 0 args, 0 locals
2    (toplevel-ref 1)                ;; #<procedure display (object #:optional port)>
4    (object-ref 2)                  ;; "1\n2\nfizz\n4\nbuzz\nfizz\n7\n8\nfizz\nbuzz\n11\nfizz\n13\n14\nfizzbuzz\n16\n17\nfizz\n19\nbuzz\nfizz\n22\n23\nfizz\nbuzz\n26\nfizz\n28\n29\nfizzbuzz\n31\n32\nfizz\n34\nbuzz\nfizz\n37\n38\nfizz\nbuzz\n41\nfizz\n43\n44\nfizzbuzz\n46\n47\nfizz\n49\nbuzz\nfizz\n52\n53\nfizz\nbuzz\n56\nfizz\n58\n59\nfizzbuzz\n61\n62\nfizz\n64\nbuzz\nfizz\n67\n68\nfizz\nbuzz\n71\nfizz\n73\n74\nfizzbuzz\n76\n77\nfizz\n79\nbuzz\nfizz\n82\n83\nfizz\nbuzz\n86\nfizz\n88\n89\nfizzbuzz\n91\n92\nfizz\n94\nbuzz\nfizz\n97\n98\nfizz\nbuzz\n" at /c/Users/saito/Documents/fast-fizzbuzz.scm:22:11
6    (tail-call 1)                                         at /c/Users/saito/Documents/fast-fizzbuzz.scm:22:2

構築済みの文字列を表示するだけになっていることがわかる。

Document ID: e2741c0cea07aa2fbddc630e30240a15

お潤い休み

私は香川県に生まれ育ち、両親もまたそうである。 父から聞いた話なのだが、父が子供の頃には雨の日の農業を休むことを「おーるい休み」と呼んでいたのだそうだ。 母は商業地の生まれなのでそれを知らなかった。 どういうわけかその日にはうどんを食べる習慣があって、父はそれを楽しみにしていたのだという。 休日に限らずうどんばっかり食ってるだろうに……、と突っ込んでおいた。

では「おーるい休み」とは何かというと、状況からして「お(うる)い休み」であろうと、それについてウェブ検索してみたのだが、驚くほど見付からない。 その言葉を使用している例すら見付からない。 かろうじてそれについて触れた郷土資料が存在するという情報だけが見付かった。

ウェブには大抵の情報があるような気がしていたが、そんなこともないという話である。 インターネットが普及する以前の情報は各地域の資料にあたらないとわからないことは多いのだ。 さらに言えば、地域情報にも限らない。 私はレトロなプログラミング言語 TL/1 について以前に調べたことがあるのだが、正確な情報はさっぱり見付からず、当時の雑誌を調べる必要があった。 コンピュータのことならインターネットに大抵の情報があるだろうと思っていたので、インターネットの限界を感じたのだ。

郷土資料を多数保管している図書館が資金不足で資料を破棄せざるを得ないという事例は少なくない。 その土地が積み重ねた歴史がそんなつまらない形で消えていくのは実に残念だと思うのだ。

Document ID: 40a36e534b22b12b8be7f5b3423e7f4e

縦書き ePub

ePub電子書籍フォーマットのひとつである。 私はウェブ上の文章を ePub 形式に変換して電子書籍端末 (Sony Reader) で読むということをよくやっている。 近頃の Windows ではデフォルトのウェブブラウザ (Microsoft Edge) が ePub に対応していて、特に指定しなければ拡張子が epub のファイルはこれで開かれるだろう。 その他、 Adobe Digital Edition というソフトが ePub を読むソフトとしてよく知られている。

ePubhtml5 の規格を基礎にしていて、文章そのものは xhtml5 形式で記述する。 CSS も利用可能だ。 そして縦書き文章にするときはその旨の指定を CSS 書くのだけれど、どうやら Microsoft EdgeAdobe Digital Edition とでは必要な指定が違うようなのだ。

色々といじって試した結果、両者できちんと縦書きにするには CSS に以下のような指定をすれば良いようだということがわかった。

html, body {
 writing-mode: vertical-rl;
 -epub-writing-mode: vertical-rl;
}

この他、ソフトによって極端に動作が重くなってしまうデータ構成なども過去に発見したことがあり、オープンスタンダードなフォーマットと言えどもソフトの都合に合わせる泥臭い作業が必要なのだという実態を感じた。

Document ID: f81a7565c777323b60f34e7f8fbeaa61

区切れ

ある日、母が新聞を見ながら「これがどうしても理解できん。 日本語として成り立ってないようにしか思えん」と言って示したのはテレビ番組表であった。 具体的には 2017 年 7 月 5 日の朝日新聞香川版のテレビ番組表、 OHK テレビの 7 時から 9 時の番組の箇所である。

おじゃMAP‼ 復活
結婚式企画2時間SP
「私、幸せになっても
いいのでしょうか?」
幼い子残し他界した夫
妻の再出発…結婚式を
香取ザキヤマが初司会
&プロデュースで感涙
▽意外と知られてない
穴場⁉香港ディズニー
3万円台で行けちゃう
衝撃のツアー‼◇N天

母は「他界した夫妻が再出発ってどういうこと?」と頭をひねっていた。 もちろんこれは読点を入れれば何の疑問もなく解釈できる。 「他界した夫、妻の再出発」である。

番組表は書ける文字数が少ないせいか無理に詰め込む傾向があり、ときにはこういったことが起こる。 興味深い事例であった。

Document ID: 2f2080a84d17e1d6f8f20a0f6a4fd862