たまりば

  パソコン・インターネット パソコン・インターネット  三鷹市 三鷹市

【お知らせ】ファイルが消えています
2018年12月29日 11:06

こちらでお知らせするのを忘れていましたが、ブログでない方のWentWayUp(Annex)のサイトが、先日プロバイダのコース終了により消滅しました。
それだけならよいのですが、このブログで何らかのファイルをダウンロードできる状態に置くためにも同サイトの領域を使っていましたので、現在ダウンロードできない状態になっております。

何かあればコメント欄やTwitterで言っていただけると対応できるかもしれません。

なるべく早く復旧させたいとは思っているものの、私は怠惰なのでなかなか作業が進みません。
無料かせいぜい月数百円くらいでファイルとできればサイトもできれば広告なしで保持したいとこなんですが、そういうサービスを探して比較するのが面倒で。
ストレージ系のサービスはたいていファイル置き場としての利用を禁じていますし。

---2019/01/12追記
GitHub Pagesよさそう。  

  • ポケットプリンタ制御
    2018年12月22日 17:40

    この記事はGame Boy Advent Calendar 2018の22日めです。

    最近ゲームボーイのプログラミングがマイブームだ。
    ところでポケットプリンタってあるよね。
    動く機械って萌えるよね。

    というわけでやってみた。
    使うのはもちろん使い慣れたPICマイコン。
    ちょうど最近電子ペーパーを試すのに使っていたPIC16F1508が手頃だったのでこれを使うことにした。(電子ペーパーについてもブログに書こうと思っているのだが…)
    なお固有の機能は特に使っていないのでEnhancedミッドレンジならどれでも容易に移植できるはず。SPI送信のみとかわざわざ機能調べるほうがめんどい。

    ポケットプリンタ(海外名はGameboy Printer)の制御方法の情報は下記2サイトによくまとまっている。
    In Depth: The Game Boy Printer
    https://shonumi.github.io/articles/art2.html
    Furrtek.org : Reversing GameBoy Printer
    http://furrtek.free.fr/?a=gbprinter (原文フランス語)
    http://furrtek.free.fr/?a=gbprinter&i=2 (英語; 未翻訳部あり)

    さらに実際の送受信内容のダンプが公開されているのが嬉しい。
    http://furrtek.free.fr/noclass/gbprinter/hexdump.txt
    チェックサムが「1バイトごとの和を2バイトで」という珍しい形式なのでこれが無ければ理解は困難だっただろう。

    これらサイトの情報を元に、「最低限動くプログラム」を作った。
    最初のプログラムというものは単純なら単純なほどよい。バグも入りにくいし、他人も参考にしやすい。

    具体的には、
    ・印刷する画像サイズは最小の160×16(ヘッドの1行分)
    ・上下のマージンは手動でフィードすればよいので0
    ・データの圧縮はしない(そもそも白黒でないとほとんど圧縮されなそうだし、圧縮しなくても送信に1秒掛からないし)
    ・データは送信のみ、プリンタからの返答は見ない
    ・statusコマンドのポーリングによる印刷終了判定もしない
    ・各種データはプログラムに直書き
    ・EnhancedミッドレンジPICのデータは14bit中8bitしか使えない簡易な読み方と全部読める読み方があるが、楽な前者
    ・電源ONで自動で1回だけ送信
    といった感じ。

    用紙は感熱紙自体は容易に手に入る。サイズが合わないのでノコギリで切って…
    http://furrtek.free.fr/?a=gbpcable&i=2
    「No paper ? Take a used receipt」
    なるほどその手があったか!
    不要なレシートならそのへんに落ちている。

    電池を用意し(多いなあ…)
    電池6本

    以前GBAと通信を試したときに通信ケーブル変換コネクタをばらして作った線でつないで(コネクタが入手できなければ本体をばらして線をつなぐのが早いと思う)
    GB通信ケーブルからつなぐ線

    …動かない。
    色々チェックし見つけたバグを修正したがやはり動かない。

    出力は確かに出ている。クロック線とデータ線も間違っていない。
    簡略化のためにプリンタからの応答を見なかったのはまずかったか…とも思ったがそれ以前にプリンタからのSO(Serial Out; 分かりやすくいえばMISO)線に何も出ていない。
    何も出ていないというのはつまり、常にHigh-Zになっている。
    出力していない時の信号が不定でHigh-Zにするのはまだ分かるとして、[furrtek]によれば何か信号を入れたら00が返ってくるように書かれているのだが。

    線にLEDをつないでのデバッグではこのくらいが限度だ。
    仕方ない。重い腰を上げオシロスコープを引っ張り出してきて(先日のPCのクラッシュで制御ソフトが消えていたのでインストールもして)確認してみる。
    PICからポケットプリンタへの信号
    想定どおりである。(電源の都合上この時は電圧が違うが本番は5Vで動かしている)
    ポケモンカードGBから印刷して実機の信号も見てみる。
    ゲームボーイからポケットプリンタへの信号
    こちらも想定どおりである。困った。

    実機と違うところといえば、以下2点。
    速度は[furrtek]には「1kHz以下(もっといけるかも)」くらいに書いてあったので、1kHz以下でプログラムが簡単なところとして約650Hz。
    実機の速度は約8kHzだが、ふつう同期シリアル信号というものは遅い分には問題が無いものだ。
    怪しいのは電源投入時だ。線をつないでから
    プリンタ電源ON→PIC電源ON→300msほど待つ→送信開始
    というシーケンスで操作しているが、このPIC側電源投入時にクロック線が暴れて不正なデータが入っているのかもしれない。
    しかし、先頭のマジックバイト8833というのはこの辺の同期ズレをリセットするためのものではないのか?
    つまり、電源投入時から(バイト単位でなく)ビット単位で信号を見て「1000100000110011」のパターンがあったらそこで同期するという仕組みではないのか。

    まあ他に打つ手も無いのでこの2つを修正してみることにした。
    通信速度は8kHz弱に。念のため上の画像でも見える1バイトごとに半bit分くらい止まる部分も実機に合わせた。
    PIC電源投入時の待ち時間を5秒ほどに伸ばし、電源投入シーケンスを
    PIC電源ON→(5秒の間に)プリンタ電源ON→送信開始
    とした。

    すると、
    ポケットプリンタ_ハローワールド
    成功!

    どちらが効いたのか片方づつ試すと、なんと両方とも必要だった。
    650Hzの速度では、全く反応しない。
    電源投入時のシーケンスを最初のものに戻すと、まれに成功するもののほとんど反応しない。(20回ほど試し2回成功)
    再び両方修正後のコードで何度か試すと、ほぼ確実に成功する。(失敗は接触不良か?)

    これは不思議である。
    遅い信号を弾くのはノイズを信号と判断しないためではないのだろうか。そうであれば300ms空けたところでリセットしていてほしい。
    一方そうでないなら、挿抜時のノイズを無視するためにマジックバイトがあるのではないのだろうか。そうであれば挿抜時にどんなノイズが乗っても正しく信号を受けてほしい。

    何か間違っているかもしれないが、おそらく動くようにはなった。
    もっとちゃんとした画像表示もそのうちやりたい。

    [余談]
    ・折角買った感熱紙だし切った。
    感熱紙のロールをノコギリで切った
    …55分掛かった。間に1時間の休憩を入れて。
    学研のふろくじゃなくまともなノコギリを持っておいたほうがいいな。

    ・画像データは以下のようにして作った。
    GIMPで描く
    ハローワールド
    ペイントで8×8ドットごとに並び替える(背景色を変えるとやりやすい)
    ハローワールド_並び替え
    上下反転・色反転、GIMPでトーンカーブを使って上位bitと下位bitのデータを作る
    bit分割
    モノクロビットマップで保存
    バイナリエディタで開く
    テキストエディタで適宜置換

    ・何度か試したの図↓
    何度か試した

    コード:

        list p=16F1508
        #include p16F1508.inc
        radix dec

        ;     Vdd +-v-+ Vss
        ;     RA5 |   | RA0/DAT
        ;     RA4 |   | RA1/CLK 4_1
        ;1_0 (RA3)|   | RA2 CLC1
        ;     RC5 |   | RC0 CLC2
        ;21/4 RC4 |   | RC1
        ;2_0  RC3 |   | RC2
        ;3_1  RC6 |   | RB4 3_0
        ;1_1  RC7 |   | RB5 4_0
        ;CLC3 RB7 +---+ RB6

        __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
        __CONFIG _CONFIG2, _WRT_OFF & _STVREN_OFF & _BORV_LO & _LPBOR_OFF & _LVP_OFF

    #define DATPIN 4
    #define CLKPIN 5

        cblock 0x20

        endc
        cblock 0x70
            cntl, cnth, suml, sumh
            dat, bitcnt, waitcnt, portbuf
        ;    temp, temp2
        endc

        org 0
        goto init

        org 4
    init:
        banksel OSCCON
        movlw b'01101010'
        ;        ^^^^ || IRCF 1101=4MHz (※クロックを4MHzにすると1命令1μsで計算しやすい)
        ;             ^^ SCS SystemClockSelect 1x = internal
        movwf OSCCON

        banksel 0
        clrf PORTC
        clrf PORTB
        movlw b'00110000'
        movwf PORTA

        banksel TRISC
        clrf TRISA
        clrf TRISB
        clrf TRISC

        banksel ANSELC
        clrf ANSELC
        clrf ANSELB
        clrf ANSELA

        banksel 0

        clrf cntl
        clrf cnth
        clrf suml
        clrf sumh
        clrf dat
        clrf bitcnt
        clrf waitcnt
        clrf portbuf

        ;少し待つ
        ;//65536*5=327 680
        ;11*65536*7=5046272
        movlw .11
        movwf waitcnt

        decfsz cntl,F
        goto $+2
        decfsz cnth,F
        goto $+2
        decfsz waitcnt,F
        goto $-5

        ;init
        movlw .4
        movwf cntl
        movlw .1 ;プログラムの都合で+1
        movwf cnth
        movlw high(cmd_init)
        movwf FSR0H
        movlw low(cmd_init)
        movwf FSR0L
        call sendcmd

        ;データ
        movlw 0x84
        movwf cntl
        movlw 0x02+1
        movwf cnth
        movlw high(cmd_data)
        movwf FSR0H
        movlw low(cmd_data)
        movwf FSR0L
        call sendcmd

        ;空データ
        movlw .4
        movwf cntl
        movlw .1
        movwf cnth
        movlw high(cmd_data0)
        movwf FSR0H
        movlw low(cmd_data0)
        movwf FSR0L
        call sendcmd

        ;print
        movlw .8
        movwf cntl
        movlw .1
        movwf cnth
        movlw high(cmd_print)
        movwf FSR0H
        movlw low(cmd_print)
        movwf FSR0L
        call sendcmd

        goto $ ;終了

        ;コマンド送信
        ;具体的には、「88,33,本体,チェックサム,ダミー×2」を送信
    sendcmd:   
        clrf suml
        clrf sumh

        ;magic byte 88,33
        movlw 0x88
        call sendbyte
        movlw 0x33
        call sendbyte

        ;本体
    sendcmdloop:
        moviw FSR0++
        addwf suml,F
        btfsc STATUS,C
        incf sumh,F
        call sendbyte

        decfsz cntl,F
        goto $+2
        decfsz cnth,F
        goto sendcmdloop
        ;チェックサム
        movf suml,W
        call sendbyte
        movf sumh,W
        call sendbyte
        movlw 0
        call sendbyte
        movlw 0
        call sendbyte
        return

        ;1バイト送信
        ;相手はクロック立ち上がりで読む
    sendbyte:
        movwf dat

        movlw .18 ;タイミングを現物合わせ
        movwf waitcnt
        decfsz waitcnt,F
        goto $-1

        movlw .8
        movwf bitcnt
        clrf waitcnt
        ;DAT,CLKをlowにした値を用意
        movf PORTA,W
        andlw ~((1<     movwf portbuf
    sendbyteloop:
        movlw .18 ;タイミングを現物合わせ
        movwf waitcnt
        decfsz waitcnt,F
        goto $-1

        movf portbuf,W ;読み込み
        rlf dat,F
        btfsc STATUS,C
        iorlw 1<     movwf PORTA ;書き込み

        movlw .20 ;タイミングを現物合わせ
        movwf waitcnt
        decfsz waitcnt,F
        goto $-1

        bsf LATA,CLKPIN ;クロック操作
        decfsz bitcnt,F
        goto sendbyteloop
        return

        ; magic 8833
        ;   cmd   comp  len L/H     sum L/H     dummy
    cmd_init:
        ;dt 0x88, 0x33,
        dt 0x01, 0x00, 0x00, 0x00; 0x01, 0x00, 0x00, 0x00
    cmd_init_len equ $-cmd_init ;やっぱりめんどいので直書きにする
    cmd_print:
        dt 0x02, 0x00, 0x04, 0x00
        dt 0x01, 0x00, 0xE4, 0x40
        ;  ???? margin palt exposure
    cmd_status:
        dt 0x0F, 0x00, 0x00, 0x00
    cmd_data0:
        dt 0x04, 0x00, 0x00, 0x00
    cmd_data:
        dt 0x04, 0x00, 0x80, 0x02
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x03,0x03,0x03,0x07,0x07,0x07
        dt 0x28,0x70,0xFC,0x78,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFE,0xFC,0xF8,0xFC
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x3E,0x7C,0x7F,0xFE,0x7F,0x7F
        dt 0x00,0x00,0x03,0x00,0x2F,0x1F,0x1F,0x3F,0x1F,0x3F,0x1F,0x1F,0x0F,0x1F,0x07,0x0F
        dt 0x03,0x00,0x87,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEC,0xF0
        dt 0x1E,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x7E,0x7E,0x7E
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x01,0x7F,0x3F,0x7F,0x3F
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x0F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF
        dt 0x03,0x01,0x07,0x0F,0x0F,0x0F,0x8F,0x47,0xCF,0xE7,0xC7,0xE7,0xE7,0xE3,0xE3,0xC3
        dt 0xDF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0
        dt 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x1F,0x0F,0x1F,0x0F,0x1F,0x1F
        dt 0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xE0,0xC0,0xE0,0xC0,0xCE,0xC1,0xFF,0xDF,0x9F,0xDF
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF
        dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xF8,0xF0,0xF8,0xF0,0xF0,0xF0
        dt 0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x7B,0x79,0x7B,0x79,0x7B,0x79,0x7B,0x79,0x7B
        dt 0xF8,0xF8,0xF8,0xF8,0xF0,0xF8,0xF8,0xF0,0xF8,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0
        dt 0x03,0x01,0x03,0x01,0x0B,0x01,0x11,0x09,0x39,0x19,0x18,0x39,0x78,0x39,0x39,0x78
        dt 0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF
        dt 0x00,0x01,0x00,0x01,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF
        dt 0xE7,0xEF,0xE7,0xEF,0xEF,0xE7,0xEF,0xE7,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x80
        dt 0x07,0x0F,0x0F,0x0F,0x0F,0x1F,0x3F,0x1F,0x3F,0x3F,0x3F,0x7F,0xFF,0x7F,0x7F,0xFF
        dt 0xFC,0xF8,0xFC,0xF8,0xF0,0xF8,0xF0,0xF8,0xF8,0xF0,0xE0,0xF0,0xE0,0xE0,0xC0,0xE0
        dt 0x3F,0x7F,0x7F,0x3F,0x3F,0x3F,0x3F,0x1F,0x0F,0x1F,0x0F,0x0F,0x07,0x0F,0x07,0x07
        dt 0x07,0x8F,0xC7,0x87,0xA7,0xC3,0xE3,0xC3,0xE1,0xE3,0xF1,0xF1,0xF9,0xF0,0xF0,0xF8
        dt 0xF0,0xE0,0xE0,0xF0,0xF0,0xF0,0xF8,0xF1,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xF8,0x70
        dt 0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7C,0xFE,0xFC,0xFE,0xFC,0xFC,0x60,0x80,0x00,0x00
        dt 0x3F,0x3F,0x1F,0x3F,0x3F,0x1F,0x14,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0xFF,0xFF,0xFC,0xFF,0xE8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0xC1,0xC3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x01,0x0F,0x07,0x1F,0x1F
        dt 0x3F,0x1F,0x1F,0x3F,0x3F,0x7F,0xFE,0x7F,0xFE,0xFE,0xFE,0xFC,0xFA,0xFC,0xFC,0xF8
        dt 0xDF,0x8F,0x07,0x8F,0x8F,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0xFF,0xFF,0xFB,0xFC,0x90,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0xE0,0xF0,0x01,0x00,0x01,0x01,0x01,0x03,0x03,0x07,0x0F,0x07,0x0F,0x3F,0x7F,0x7F
        dt 0x79,0xFB,0xF1,0xFB,0xF1,0xFB,0xF9,0xF3,0xF9,0xF3,0xE1,0xF3,0xF1,0xE3,0xE1,0xE3
        dt 0xE0,0xF0,0xE1,0xF0,0xE3,0xF1,0xE7,0xF3,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
        dt 0x79,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF0,0xC0,0xE0,0x40,0x80
        dt 0xFF,0xFF,0xFF,0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8,0xFC,0x78,0xFC
        dt 0xFF,0xFF,0xFF,0xFF,0x1F,0x7F,0x03,0x07,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00
        dt 0x80,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA ;※末尾の55AAはデバッグ時に使ったものの消し忘れ

        end
      

  • ゲームボーイの電池交換に導電インク
    2018年03月25日 03:01

    ファミコンやゲームボーイなど昔のゲームソフトにはデータの保持にボタン電池が使われている。
    (最初に知った時には驚いた。壊れなければ永遠に使えると思っていたゲームソフトにまさか寿命のある電池が入っているとは。しかもちっぽけなボタン電池。すぐにでも切れてしまいそうではないか。)
    古いソフトの電池を交換する上で何が問題かといえば配線の接続方法だ。
    元々はスポット溶接で留められている。これなら確実に導通がとれるだろう。しかし家庭にスポット溶接機はない。どうやって留めるか。
    まっとうな方法は既にタブが溶接された電池を買うことだ。電池ホルダーを使うのもよいだろう。
    しかしなぜか買う気にならない。その辺で売ってないとか割高とかの理由もあるが、たぶん専用品を使うのは負けた気がするという気持ちの問題が大きいと思う。

    溶接以外の方法をいろいろ試してみるのだが、なかなかうまくいかない。溶接の素晴らしさが分かる。
    リード線をテープで留めただけだと、すぐに接触不良でデータが飛ぶ。
    何かしっかりとテンションを掛けられる手段がないだろうか。
    リード線を熱収縮チューブで固定してテンションを掛ければどうかと試してみたが、駄目であった。しばらくしてデータが飛んだ。
    また厚みでケースに微妙に収まらず、無理やり閉じたらケースが膨らんだ。(もっともこれはCR2032を使ったのが悪かった。1616にすれば大丈夫だったかもしれない)
    もっとしっかりとテンションが掛かる物を考えるとクリップが思いつくが、GBソフトの狭いスペースに入るものはなかなかないだろう。
    電池に直接ハンダ付けするという最終手段もあるが、アルカリ電解液の詰まった電池に高熱を与えるのは大変危険なのであまりやりたくない。またそもそも材質がハンダをはじくのであまりしっかりと付いてくれない。

    そんなわけでなかなかこれといった方法が見つからなかったのだが、ふと導電インクが使えるのではないかと思い立った。
    以前何かに使えるかと思って買ったものの何にも使っていなかったものだ。
    「Bare Conductive Electric Paint」という名のもので、Amazonで売っている

    試してみると、予想以上によい。
    この種のカーボンタイプの導電インクは回路を描くには少々抵抗が大きいのだが、今回導線と電池表面の間のわずかな隙間を埋めるだけなので抵抗は無視できる。
    無視できる…と思うが念のため計ってみると30Ω。思ったよりはあるな。
    しかし電流はわずかなので抵抗による電圧降下は気にする必要はないだろう。計算したら1mVもないくらいだし実際計っても分からない。

    そして接着力だが、結構ある。剥がそうと思って力を入れれば線を引っ張って剥がしたり爪で引っ掻いて剥がしたりはできるが、意図せず剥がれるようなことは無さそうな程度にある。
    付きにくいハンダ付けよりはるかに信頼できる。

    最初に試したものがこちらだ。
    導電インクでGB電池接続_1個め
    導線の太さで厚みが出て、熱収縮チューブのときほどではないものの微妙にケースが膨らんでしまった。
    このあたりでそもそもGBソフトに使われている電池はCR2032でなくCR1616であったことに気づいたが、買いに行くのは面倒だし、うまくすれば入りそうなのでそのまま2032を使い続けることにした。
    もう1点問題があり、基板上に電池を固定するために斜めにテープを張ったのだが、カートリッジの上蓋は枠が出っ張っているので閉める時引っかかってしまう。

    それを踏まえて2個め。
    厚みを抑えるために芯線をバラして接着することにした。カプトンテープで絶縁をとってある。
    導電インクでGB電池接続_2個め1
    基板にはんだ付け。カートリッジのケースに入れてみると問題なく閉まった。
    導電インクでGB電池接続_2個め2
    固定はカプトンテープでは上手くできず、グルーガンで留めようかと思っていたのだが、ただ閉じるだけで振ってもガタつくこと無く一応固定されているようなのでそのままにしてしまった。

    1個めが2ヶ月半、2個めも1ヶ月ほど経つがどちらもデータを保持できている。

    (2018/12/22追記)
    ふと思い出して確認したところどちらもまだデータを保持できている。  

  • 謎の色名「honeydewtab」とlegacy color valueパース手順
    2018年03月24日 12:45

    HTMLやCSSで使うために140個の色名が定義されている。個人ホームページ全盛期のHowTo本にはよく載っていたものだが思えば最近あまり見ない気がする。
    HTMLを書いていてなんでもいいからとりあえず色を付けたい時一々カラーコードを書くよりredとかblueとか書くと楽なので便利だ。(cyanmagentayellowもあるがgreenは罠だ。緑100%はlimeだ。)

    ここで、謎の色名「honeydewtab」というものがある。
    詳しくはこちらのページを読んでほしいが、かいつまんで言うと
    ・なぜか色名として「honeydewtab」が載っている本やサイトがあった
    ・何らかの色が出るが、ブラウザにより異なる
    ・著者から連絡があり間違いだったと確認された
    ということだ。

    ここで不思議なのが何らかの色は出ること。
    存在しないのならなぜ無視されるのでなく何か出るのか。どういう解釈をされているのか。
    調べていると別のサイトで様々な文字列が実験されているのを見つけた。
    ここの「coffee」で見覚えのある色があって気づいた。これは#C0FFEE色だ。英単語として読める16進数は色々あり、中でもちょうど6文字でいい感じの色が出るC0FFEEは自サイトでもよく使うお気に入りだったのである。

    すると#を付けなくとも16進数として解釈されるのか。試してみると6文字の時は16進数字以外を"0"として解釈した値と一致している。
    謎はほぼ解けたもののhoneydewtabなど6文字以外の場合の規則は分からずじまいだった。

    その後HTMLの仕様を見ていた所「legacy color value」としてパース方法が定義されているのを見つけた。
    https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-a-legacy-colour-value
    簡単に説明すると、
    16進数字以外を'0'に置き換え、文字数が3の倍数になるよう末尾に'0'を足し、3分割。3つの要素それぞれの先頭から等しい数の'0'を、最低2桁は残して、除ける限り除く。各要素の先頭2桁を1バイトのRGBと解釈する。
    というものだ。(簡単に説明できなかった。)
    正式な簡略表記だと思っていた3桁表記(#369=#336699みたいなやつ)もlegacyだったのは意外だ。

    honeydewtabを例にパースしてみよう。
    honeydewtab
    000e0de00ab     16進数字以外は"0"に置き換える
    000e0de00ab0    3の倍数文字になるよう"0"を補う
    000e,0de0,0ab0  3等分する
     00e  de0  ab0  各部分において先頭から同数の"0"を消す
     00   de   ab   各部分の先頭2文字を取る
    #00deab         できあがり

    さて、この複雑なパース手順は何を意図したものだろうか。
    桁数が多い場合を考慮している点と、先頭2文字を取るところは、将来的に各色要素が3桁以上になった場合でも対応できるようにしつつその場合に各色8bitの環境でも適切な色を出せるように考えられているように見える。
    しかし、そう考えると3桁以上で頭が0の時は破綻する。
    例えば(000,012,0AB)という3桁の色表現があったとして、2桁に変換するなら(00,01,0A)となってほしいところだが、この手順では(00,12,AB)になる。
    してみるとこの仕様はまともに使えることを意図したものではなく、各ブラウザでまちまちだった挙動をなるべく保持しつつ矛盾のない1つの仕様にまとめたものなのではないだろうか。  

  • KanaFiveの画像を用意した(ついでにちょっと字形改良)
    2018年03月23日 00:33

    以前、KanaFiveという名の5×5ドットひらがなカタカナフォントを作った。調べてみると9年前だ。うわあ。
    最初はフォント作成サービスで仮名と一部の記号だけを作っただけであった。 → 5×5 ひらがなフォント
    次にJIS記号など大幅に増やしたものを画像として作成、仮名のみだが表示システムも作成した。 → 5×5フォント改 / JavaScriptフォント表示機
    そして最終的に多くのOSで使えるTTFフォントファイルとして作成した。記事にも書いてあるがこの際字形の改良もしている。 → 5×5ドットフォント完成版

    ありがたいことに数件使われているのを見かけた。
    以前、パーラービーズに使われたものと、
    最近micro:bitという名の5×5ドットのLEDの付いたマイコンボードがあり、これに使われているのを2件見かけた。
    こちらと、「micro:bitでひらがなを表示させてみよう
    こちらだ。

    さて、使われるのはたいへん嬉しいのだが、ひとつ気にかかることがある。
    何故か使われているのが古いものなのである。
    「何故か」というか、理由は明確で、PC上で文章を打つのに使うのでなければTTFファイルをダウンロードして文字を打つより画像から描き写す方が楽だからであろう。
    どれを使っても構わなくはあるのだが、自分としては上記の通り字形の改良をして最終版のTTFが最も優れているつもりなので、できればこれを使ってほしい。
    ということで今更ながら当該記事に最新版の画像も置くことにした。

    …のだが、困ったことに、その画像を作っている最中にも字形に気に入らないところが出てきて更に修正を加えることになってしまった。
    変更した文字は「あさでにむりるろわク」の10字、うち「あ」は結局初期のものに戻したものだ。ついでに「𛀀」「𛀁」を描いた気がしていたが描いていなかったので描いた。
    KanaFive_差分
    TTFの方も更新したいのだが、TTFを作成するにはまず今のPCにはFontForgeが入っていなかった気がするので確認して無かったら入れ、使い方を思い出し、当時散々悩まされた一部の文字が消える不具合とまた闘わなければならない。大変気が重い。
    というわけで残念ながら現在の最新版は仮名のみ画像である。仮名以外はTTF版が最新である。

    こちらにも貼っておこう。
    等倍画像と、
    KanaFive画像
    4倍の画像と、
    KanaFive画像_×4
    プログラムで使う用に置換しやすい感じのテキスト。
    ひらがな清音
    _@___
    @@@_@
    _@_@_
    @_@_@
    @@__@
    -----
    @__@_
    @___@
    @___@
    @_@_@
    _@___
    -----
    _@@__
    @@@@_
    ____@
    ____@
    _@@@_
    -----
    _@@__
    @@@@@
    ___@_
    _@@__
    @__@@
    -----
    _@___
    @@@_@
    _@___
    @@@@_
    @@__@
    -----
    _@_@_
    @@@_@
    _@_@_
    _@_@_
    @__@_
    -----
    @@@@_
    _@@@@
    ___@_
    @____
    _@@@_
    -----
    __@@_
    _@___
    @____
    _@___
    __@@_
    -----
    @__@_
    @_@@@
    @__@_
    @__@_
    @__@_
    -----
    _@@@_
    ___@_
    _____
    @____
    _@@@@
    -----
    __@__
    @@@@@
    ___@_
    @____
    _@@@@
    -----
    @____
    @____
    @____
    @___@
    _@@@_
    -----
    ___@_
    @@@@@
    _@_@_
    __@@_
    ___@_
    -----
    _@_@_
    @@@@@
    _@_@_
    _@___
    __@@_
    -----
    _@__@
    ___@_
    @@@@@
    _@___
    __@@@
    -----
    _@___
    @@@__
    _@_@@
    @____
    @_@@@
    -----
    _@___
    @@@@@
    _@@@_
    ____@
    _@@@_
    -----
    @@@@_
    ____@
    ____@
    ____@
    __@@_
    -----
    @@@@@
    ___@_
    __@__
    __@__
    ___@@
    -----
    @__@_
    @_@__
    _@___
    @____
    _@@@@
    -----
    _@___
    @@_@@
    ___@_
    _@@@@
    _@@@_
    -----
    @_@@@
    @____
    @____
    @_@__
    @__@@
    -----
    @___@
    _@@@_
    @_@_@
    @@_@@
    ___@@
    -----
    _@___
    @@@@_
    _@__@
    @@_@@
    _@_@@
    -----
    _@@@_
    @_@_@
    @_@_@
    @_@_@
    _@@__
    -----
    @__@_
    @_@@@
    @__@_
    @_@@@
    @_@@_
    -----
    @@___
    _@_@@
    @__@_
    @__@_
    _@@__
    -----
    _@@__
    _____
    __@__
    @_@_@
    @_@_@
    -----
    _____
    _@@__
    @__@_
    ____@
    _____
    -----
    @_@@@
    @__@_
    @_@@@
    @__@_
    @_@@@
    -----
    @@@@@
    _@@@_
    __@__
    @@@@_
    @@@_@
    -----
    @@___
    _@_@_
    _@@@@
    @@_@_
    @@_@_
    -----
    _@___
    @@@_@
    _@___
    @@__@
    _@@@_
    -----
    @___@
    _@@@_
    @@_@@
    @_@_@
    @@__@
    -----
    @@@__
    _@___
    @@@__
    _@__@
    __@@_
    -----
    _@__@
    @@@@_
    _@__@
    _@___
    _@___
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    @_@__
    @@@@_
    @_@_@
    @_@_@
    @_@@_
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    __@__
    __@@@
    __@__
    @@@@_
    @@@_@
    -----
    @_@@_
    @____
    @@@@_
    ____@
    @@@@_
    -----
    @___@
    @___@
    @@__@
    ____@
    __@@_
    -----
    @@@@@
    __@@_
    ____@
    @@__@
    @@@@_
    -----
    _@___
    @@@@_
    _@_@_
    @@_@_
    _@_@@
    -----
    @@@@@
    __@@_
    ____@
    @___@
    _@@@_
    -----
    _@_@_
    @@@_@
    _@__@
    @@__@
    _@_@_
    -----
    @@___
    _@@@_
    @@__@
    @@_@@
    @@_@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _@@@_
    ___@_
    _@@_@
    _@@@_
    @_@_@
    -----
    _@@__
    @@__@
    __@@_
    _@_@_
    _@@@@
    -----
    _@___
    _@___
    @____
    @@__@
    @_@@_
    -----
    @_@__
    @_@__
    _____
    _____
    _____
    -----
    @@___
    @@___
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    ひらがな特殊
    _____
    _@___
    @@@_@
    _@_@_
    @@@_@
    -----
    _____
    @__@_
    @___@
    @___@
    _@___
    -----
    _____
    _@@__
    @@@@_
    ____@
    _@@@_
    -----
    _____
    _@@__
    @@@@@
    __@__
    @@_@@
    -----
    _____
    _@__@
    @@@__
    _@@@@
    @@@_@
    -----
    __@_@
    _@_@_
    @@@__
    _@_@_
    @__@_
    -----
    @@@_@
    @@@@_
    __@__
    @____
    _@@@_
    -----
    __@_@
    _@___
    @____
    _@___
    __@@_
    -----
    ____@
    @__@_
    @_@@@
    @__@_
    @__@_
    -----
    @@@_@
    __@__
    _____
    @____
    _@@@_
    -----
    _@__@
    @@@@_
    __@__
    @____
    _@@@_
    -----
    @__@@
    @____
    @____
    @___@
    _@@@_
    -----
    __@_@
    @@@@_
    @_@__
    _@@__
    __@__
    -----
    @_@_@
    @@@@_
    @_@__
    @____
    _@@__
    -----
    @_@_@
    __@__
    @@@@_
    _@___
    __@@_
    -----
    _@__@
    @@@__
    _@_@@
    @____
    @_@@@
    -----
    _@__@
    @@@@_
    _@@__
    ___@_
    _@@__
    -----
    ____@
    @@@@_
    ____@
    ____@
    __@@_
    -----
    @@@@@
    ___@_
    __@_@
    __@__
    ___@_
    -----
    @___@
    @_@__
    _@___
    @____
    _@@@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    @@@__
    ___@_
    __@__
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    @___@
    @_@@_
    @__@_
    @_@@@
    @_@@_
    -----
    @@__@
    _@___
    @__@@
    @__@_
    _@@__
    -----
    _@@_@
    _____
    __@__
    @_@_@
    @_@_@
    -----
    ____@
    _@@__
    @__@_
    ____@
    _____
    -----
    @_@_@
    @__@_
    @_@@@
    @__@_
    @_@@@
    -----
    @__@@
    @_@@@
    @__@_
    @_@@@
    @_@@_
    -----
    @@_@@
    _@_@@
    @____
    @__@@
    _@@__
    -----
    _@_@@
    ___@@
    __@__
    @_@_@
    @_@_@
    -----
    ___@@
    ___@@
    _@@__
    @__@_
    ____@
    -----
    @_@@@
    @__@@
    @_@@_
    @__@_
    @_@@@
    -----
    _____
    _@__@
    @@@@_
    _@__@
    _@___
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    @_@__
    @@@@_
    @_@_@
    @_@_@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    __@__
    __@@@
    @@@__
    @@@@_
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _@@_@
    @@@__
    ___@_
    ___@_
    _@@__
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _@_@_
    @@@_@
    _@__@
    @@__@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _@___
    __@__
    ___@_
    __@__
    -----
    ___@@
    _@___
    __@__
    ___@_
    __@__
    -----
    カタカナ清音
    @@@@@
    __@_@
    __@@_
    __@__
    _@___
    -----
    ____@
    __@@_
    @@@__
    __@__
    __@__
    -----
    __@__
    @@@@@
    @___@
    ____@
    _@@@_
    -----
    _@@@_
    __@__
    __@__
    __@__
    @@@@@
    -----
    ___@_
    @@@@@
    __@@_
    _@_@_
    @__@_
    -----
    _@___
    @@@@@
    _@__@
    _@__@
    @__@@
    -----
    __@__
    @@@@@
    __@__
    @@@@@
    __@__
    -----
    _@@@@
    _@__@
    @___@
    ____@
    __@@_
    -----
    _@___
    _@@@@
    @__@_
    ___@_
    _@@__
    -----
    @@@@@
    ____@
    ____@
    ____@
    @@@@@
    -----
    _@_@_
    @@@@@
    _@_@_
    ___@_
    __@__
    -----
    @@___
    _____
    @@__@
    ___@_
    @@@__
    -----
    @@@@_
    ___@_
    __@__
    _@_@_
    @___@
    -----
    _@___
    @@@@@
    _@__@
    _@___
    __@@@
    -----
    @___@
    _@__@
    ____@
    ___@_
    _@@__
    -----
    _@@@@
    _@__@
    @_@@@
    ____@
    _@@@_
    -----
    _@@@_
    __@__
    @@@@@
    __@__
    _@___
    -----
    @_@_@
    @_@_@
    ____@
    ___@_
    _@@__
    -----
    _@@@_
    _____
    @@@@@
    __@__
    __@__
    -----
    @____
    @____
    @@@__
    @__@@
    @____
    -----
    __@__
    @@@@@
    __@__
    __@__
    _@___
    -----
    _@@@_
    _____
    _____
    _____
    @@@@@
    -----
    @@@@@
    ____@
    _@_@_
    __@__
    @@_@@
    -----
    __@__
    @@@@@
    ____@
    _@@@_
    @_@_@
    -----
    ___@_
    ___@_
    ___@_
    __@__
    _@___
    -----
    __@__
    ___@_
    @___@
    @___@
    @___@
    -----
    @____
    @@@@@
    @____
    @____
    _@@@@
    -----
    @@@@@
    ____@
    ____@
    ___@_
    _@@__
    -----
    _____
    _@___
    @_@__
    ___@_
    ____@
    -----
    __@__
    @@@@@
    __@__
    @_@_@
    @_@_@
    -----
    @@@@@
    ____@
    _@_@_
    __@__
    ___@_
    -----
    @@@@_
    _____
    _@@@_
    _____
    _@@@@
    -----
    __@__
    _@___
    @____
    @___@
    @@@@@
    -----
    ____@
    __@_@
    ___@_
    __@_@
    @@___
    -----
    @@@@_
    _@___
    @@@@_
    _@___
    __@@@
    -----
    _@___
    @@@@@
    _@__@
    _@___
    _@___
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    @@@@_
    ___@_
    ___@_
    ___@_
    @@@@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    @@@@@
    ____@
    _@@@@
    ____@
    @@@@@
    -----
    _@@@_
    _____
    @@@@@
    ____@
    _@@@_
    -----
    _@__@
    _@__@
    _@__@
    ____@
    __@@_
    -----
    __@__
    @_@__
    @_@_@
    @_@_@
    @_@@_
    -----
    @____
    @____
    @___@
    @__@_
    @@@__
    -----
    @@@@@
    @___@
    @___@
    @___@
    @@@@@
    -----
    @@@@@
    @___@
    ____@
    ____@
    _@@@_
    -----
    ___@_
    @@@@@
    _@_@_
    @@@@@
    ___@_
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    @@@@@
    __@_@
    __@@_
    __@__
    @@@@@
    -----
    @@@@@
    ____@
    @@@@@
    ____@
    __@@_
    -----
    @@___
    _____
    ____@
    ___@_
    @@@__
    -----
    _____
    @____
    _@@@@
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    カタカナ特殊
    _____
    @@@@@
    __@_@
    __@@_
    _@___
    -----
    _____
    ____@
    @@@@_
    __@__
    __@__
    -----
    _____
    __@__
    @@@@@
    @___@
    __@@_
    -----
    _____
    _@@@_
    __@__
    __@__
    @@@@@
    -----
    _____
    ___@_
    @@@@@
    _@_@_
    @__@_
    -----
    _@_@@
    @@@@_
    _@_@_
    _@_@_
    @__@_
    -----
    _@_@@
    @@@@_
    _@___
    @@@@_
    _@___
    -----
    ___@@
    _@@@_
    @__@_
    ___@_
    _@@__
    -----
    _@_@@
    _@@@_
    @_@__
    __@__
    _@___
    -----
    ___@@
    @@@@_
    ___@_
    ___@_
    @@@@_
    -----
    @_@_@
    @@@@_
    @_@__
    __@__
    _@___
    -----
    @@_@@
    _____
    @@__@
    ___@_
    @@@__
    -----
    ___@@
    @@@@_
    ___@_
    __@__
    @@_@_
    -----
    _@_@@
    @@@@_
    _@_@_
    _@___
    __@@_
    -----
    @__@@
    _@_@_
    ___@_
    __@__
    _@___
    -----
    ___@@
    _@@@_
    @__@_
    __@@_
    _@@__
    -----
    @@@_@
    _@___
    @@@@_
    _@___
    @____
    -----
    ___@@
    @_@__
    @_@_@
    ____@
    _@@@_
    -----
    _@@_@
    _____
    @@@@@
    __@__
    _@___
    -----
    @__@@
    @____
    @@@__
    @__@@
    @____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    @_@_@
    @_@_@
    ____@
    _@@@_
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    ___@@
    __@__
    @__@_
    @___@
    @___@
    -----
    @__@@
    @@@@_
    @____
    @____
    _@@@@
    -----
    ___@@
    @@@@_
    ___@_
    ___@_
    _@@__
    -----
    ___@@
    _@___
    @_@__
    ___@_
    ____@
    -----
    __@_@
    @@@@_
    __@__
    @_@_@
    @_@_@
    -----
    ___@@
    ___@@
    @_@__
    @__@_
    @___@
    -----
    @__@@
    @@@@@
    @____
    @____
    _@@@@
    -----
    ___@@
    @@@@@
    ___@_
    ___@_
    _@@__
    -----
    ___@@
    _@_@@
    @_@__
    ___@_
    ____@
    -----
    ___@@
    @@@@@
    __@__
    @_@_@
    @_@_@
    -----
    _____
    _@___
    @@@@@
    _@__@
    _@___
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    @@@@_
    ___@_
    ___@_
    @@@@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    @@@@@
    _@@@@
    ____@
    @@@@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    ____@
    @@@@@
    @___@
    ____@
    __@@_
    -----
    ___@@
    @@@@_
    _@_@_
    @@@@@
    ___@_
    -----
    __@_@
    @@@@@
    @___@
    ____@
    __@@_
    -----
    ___@@
    @@@@_
    _@_@_
    _@___
    @@@@@
    -----
    ___@@
    @@@@_
    ___@_
    @@@@_
    ___@_
    -----
    _____
    @@@@@
    @___@
    ____@
    __@@_
    -----
    _____
    _@___
    @@@@_
    _@_@_
    _@_@_
    -----
    _____
    _@___
    _@@@_
    @_@__
    __@__
    -----
    _____
    _@___
    __@__
    ___@_
    _____
    -----
    ___@@
    _@___
    __@__
    ___@_
    _____
    -----
    その他仮名
    _____
    _@__@
    @@@_@
    _@_@_
    @__@_
    -----
    _____
    @__@_
    @_@@@
    @__@_
    @__@_
    -----
    __@@@
    __@__
    _@_@_
    ____@
    __@@_
    -----
    _@@@_
    ___@_
    ___@_
    ___@_
    ___@_
    -----
    __@__
    @@@@@
    ____@
    ___@_
    _@@__
    -----
    @_@@_
    ____@
    @___@
    @__@_
    @_@@@
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    ___@@
    _@_@@
    @@@_@
    _@_@_
    @__@_
    -----
    _@_@@
    @@@@@
    _@@@_
    @____
    _@@@_
    -----
    __@@@
    _@_@@
    @____
    _@___
    __@@_
    -----
    ___@@
    @__@@
    @_@@_
    @__@_
    @__@_
    -----
    ___@@
    _@@@@
    ___@_
    @____
    _@@@_
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _@@@@
    _@__@
    @___@
    __@@_
    -----
    _____
    @@___
    ____@
    @@_@_
    @@@__
    -----
    _____
    @@@@@
    ___@_
    __@__
    @@_@@
    -----
    _____
    @____
    @____
    @@@@@
    @____
    -----
    _____
    @@@@@
    _@__@
    __@@_
    @@__@
    -----
    _____
    __@__
    ___@_
    @___@
    @___@
    -----
    _____
    @____
    @@@@@
    @____
    _@@@@
    -----
    _____
    @@@@@
    ____@
    ___@_
    _@@__
    -----
    _____
    _____
    _@@__
    @__@_
    ____@
    -----
    _____
    __@__
    @@@@@
    __@__
    @_@_@
    -----
    _____
    _@___
    @____
    @___@
    @@@@@
    -----
    _____
    _@@@_
    @@@@@
    ____@
    __@@_
    -----
    _____
    _@__@
    _@__@
    ____@
    ___@_
    -----
    _____
    __@__
    @_@__
    @_@_@
    @_@@_
    -----
    _____
    @____
    @___@
    @__@_
    @@@__
    -----
    _____
    @@@@@
    @___@
    @___@
    @@@@@
    -----
    _____
    ___@@
    @@@@@
    ___@_
    _@@__
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    ___@@
    _@_@@
    @@@@_
    _@_@_
    @__@_
    -----
    _@_@@
    @@@@@
    _@___
    @@@@_
    _@___
    -----
    ___@@
    _@@@@
    @__@_
    ___@_
    __@__
    -----
    ___@@
    _@_@@
    _@@@_
    @_@__
    __@__
    -----
    ___@@
    @@@@@
    ___@_
    ___@_
    @@@@_
    -----
    @__@@
    @@@@@
    @_@__
    @____
    _@@__
    -----
    ___@@
    @_@@@
    @_@_@
    ____@
    __@@_
    -----
    @__@@
    @__@@
    @@@__
    @__@@
    @____
    -----
    _____
    _____
    _____
    _____
    _____
    -----
    _____
    _____
    _____
    _____
    _____


    (2018/12/29追記)
    ライセンスはパブリックドメインとします。
    どんな用途にもご自由にお使いください。
    なお必須ではありませんが報告・クレジット表示あると私が喜びます。