大風呂は敷(迷信解毒)。

迷信解毒というか政治経済ネットのニュースなどに三人称多視点ぽくツッコミ入れていくスタイル。

漢直IMEkantrayから漢直エディタkaneditに開発移行のお知らせなど。ついでに「kan5x5comic」フォントの解説。もひとつついでにリバーシの解説。

ミユ「漢直IMEを目指してた「kantray」だったけど問題点が2つ。

  1. 「fcntl.ioctl()」「os.write()」等キーフック割込とかすると「押上」処理が機能しない場合があり、キーボードが操作不能に陥る場合があり危険。
    1. ついでに言うと「TahrPup6.0.5」でSCIMの挙動も若干怪しくまれに落ちる。
  2. Tkinter」で「BMP(UTF-16)」つまり「U+FFFF」以上の文字を扱うとエラーが発生する。「kantray」では伏せ字で誤魔化した漢字も扱いたい。
    1. 付け加え言うと「Tkinter」の「キャンバス」で漢直キーボードを高速化するには図形のタグ管理が複雑になるので「kantray」のソース流用が不可能だった。

それら仕様を回避するにはプランBだった「漢直エディタ」「kanedit」を作る方向に。
というわけで「kanedit(https://github.com/ooblog/LTsv10kanedit)」に開発を移行…とは言ったものの、
「kanedit」が「電卓」部分しか動かないので今回は「kanfont」の話メイン。
「kanfont」は「活」「漫」「筆」の三種類のグリフを扱うスタイルに。
「活」グリフ。漢直キーボード用途の5x5ドット絵。

「漫」グリフ。ドット絵をそのまま拡大しても見辛いので多少アレンジ。

「筆」グリフは絵文字用途の予備。」
アケミ「「kan5x5comic」は「活」「漫」「筆」のどれになるん?」
シルキ「漢字は「活」、ひらがなカタカナアルファベットなどが「漫」、
フォントの「kan5x5comic」は「活」「漫」両方使うから混植的な意味で「アンチゴチ」。

商業ベースの漫画においては、ふきだし内のセリフは二種類の書体が混植(混ぜて使用)されている。漢字はゴシック体、かなはアンチック体となっているのである(これをアンチゴチという)。
混植を敢えて行わずともゴシックとアンチックを組み合わせた「コミックフォント」という形でのフォント製品も販売されている

ふきだし - Wikipedia

5x5のドットで表現不可能な絵文字に「筆」も使う予定。

別名「FULL MOON WITH FACE」「顔付満月」「顔記号」など。本来は天文学占星術で満月を示す記号。
月刊ログインで「ぽげむた」と覚えました。←ちなみに正式な「ぽげムたビゲなみょーん」は頭に毛が一本ですよ
アンダーバーさんの事じゃなかったんだw
でんじゃらすじーさん世代です
「とんでも勇者」のタイトルに使われていたのを知っている人はいるかな…

作家さんが「コレ使えますか?」と聞いてきたナゾの記号の正体に驚きの声「そんな名前だったのか」「使い方は?」 - Togetterまとめ

FULL MOON WITH FACE - 顔付き満月【🌝】
写研の約物記号BA-90 (笑い顔になった顔付き満月の形状で、脱力や爆笑の意味に使用される) に対応

ユニコード6.0以降で使用できる絵文字(自然編) - 世界の特殊文字ウィキ


フレア「正直3パターン必要になるとは思って無かったんだけど、
「漫」グリフを漢直キーボードで表示すると、文字が潰れてりインクが滲んだみたいになるし「筆」グリフだと掠れた様になり見えない場合が。
なので文字の大きさに応じて「活」「漫」「筆」を使い分けられれば本当はベスト。
けど「kantray」にしても「kanedit」にしてもフォントグリフ作成は漢直キーボードを作る手段であって目的ではない。
なので漢字は極力5x5だけで作って、アルファベットとかはだいたい10x10(たまに20x混在)になるイメージ。
絵文字は字引入力だから漢直キーボードを気にせず20x20ぐらいで作る。
リソースコスパの都合で漢字はドット絵のままだし曲線無いし混植だけど、デザインと言い張る!それが「kan5x5comic」の仕様。」
ミユ「結局ひらカタアルファキリギリは2パターン必要になるわけですが…
仕様が固まった「活」フォントパスは圧縮できるので圧縮。文字列圧縮しないと「LTsv/kanchar.tsv」を「Geany」で開いた時とかラグる。
で頻度の高い座標に名前を付ける。

「活」5xの座標には「0123456789abcdefghijklmnopqrstuvwxyz」、
「漫」10xのx座標には「ABCDEFGHIJK」y座標には「OPQRSTUVWXY」。
「筆」が20xに該当すると思うけど、都道府県アイコンとかは100x100(10px)分割で描画されてるのでとりあえず保留無圧縮。

解凍(伸張)も圧縮も文字列の置換処理だけなのでそんなコストかからないはず。

LTsv_glyphSVG5xdic={"M ":"[","z ":"]",
 "0,1000 ":"0","200,1000 ":"1","400,1000 ":"2","600,1000 ":"3","800,1000 ":"4","1000,1000 ":"5",
 "0,800 ":"6","200,800 ":"7","400,800 ":"8","600,800 ":"9","800,800 ":"a","1000,800 ":"b",
 "0,600 ":"c","200,600 ":"d","400,600 ":"e","600,600 ":"f","800,600 ":"g","1000,600 ":"h",
 "0,400 ":"i","200,400 ":"j","400,400 ":"k","600,400 ":"l","800,400 ":"m","1000,400 ":"n",
 "0,200 ":"o","200,200 ":"p","400,200 ":"q","600,200 ":"r","800,200 ":"s","1000,200 ":"t",
 "0,0 ":"u","200,0 ":"v","400,0 ":"w","600,0 ":"x","800,0 ":"y","1000,0 ":"z"
}
LTsv_glyphSVG10xdic={"M ":"[","z ":"]",
 "0,":"A","100,":"B","200,":"C","300,":"D","400,":"E","500,":"F","600,":"G","700,":"H","800,":"I","900,":"J","1000,":"K",
 "0 ":"Y","100 ":"X","200 ":"W","300 ":"V","400 ":"U","500 ":"T","600 ":"S","700 ":"R","800 ":"Q","900 ":"P","1000 ":"O"
}
LTsv_glyphSVG5xdicMz=dict([(dic_value,dic_key) for dic_key,dic_value in LTsv_glyphSVG5xdic.items()])
LTsv_glyphSVG10xdicMz=dict([(dic_value,dic_key) for dic_key,dic_value in LTsv_glyphSVG10xdic.items()])
def LTsv_glyphSVG5x10x(LTsv_glyph_path):
    if not "[" in LTsv_glyph_path: return LTsv_glyph_path;
    LTsv_glyph_path5x=""
    for path5x in LTsv_glyph_path:
        if path5x in LTsv_glyphSVG5xdicMz:
            LTsv_glyph_path5x+=path5x.replace(path5x,LTsv_glyphSVG5xdicMz[path5x])
        elif path5x in LTsv_glyphSVG10xdicMz:
            LTsv_glyph_path5x+=path5x.replace(path5x,LTsv_glyphSVG10xdicMz[path5x])
        else:
            LTsv_glyph_path5x=""; break;
    return LTsv_glyph_path5x.rstrip(' ')


アケミ「5x5専用フォントは少なくとも作らなきゃならないの分かるけど、エディタ部分は普通に普通のフォントでいいんでないの?」
ミユ「そのフォント自体が「Tkinter」では「BMP(UTF-16)」の壁で表示できない場合があるからポリゴンフォントを作ってる流れ。
なので「kanedit」で「漫」使ってても漢直キーボードでどうしても「活」使うのでプログラミング上は2種類のフォントを使い分けてる(絵文字系は「筆」フォントしかないので実際には3種類)。

def LTsv_glyphfont_5x5(glyphcode):
    if not glyphcode in LTsv_glyph5x5_coord:
        LTsv_glyphpath(glyphcode)
    return LTsv_glyph5x5_coord[glyphcode],LTsv_glyph5x5_clock[glyphcode]

def LTsv_glyphfont_comic(glyphcode):
    if not glyphcode in LTsv_glyphcomic_coord:
        LTsv_glyphpath(glyphcode)
    return LTsv_glyphcomic_coord[glyphcode],LTsv_glyphcomic_clock[glyphcode]

def LTsv_glyphfont_brush(glyphcode):
    if not glyphcode in LTsv_glyphbrush_coord:
        LTsv_glyphpath(glyphcode)
    return LTsv_glyphbrush_coord[glyphcode],LTsv_glyphbrush_clock[glyphcode]

def LTsv_glyphfont_shell(draw_g="活"):
    if draw_g == "活": return LTsv_glyphfont_5x5
    if draw_g == "漫": return LTsv_glyphfont_comic
    if draw_g == "筆": return LTsv_glyphfont_brush


フレア「これグリフの種類が増えていくと厄介なパターンだ。」
ミユ「辞書を多次元にするとハッシュ再計算やガベコレ発生時に重くなる不安が拭えないので警戒。卵を一つの籠に盛らない作戦。」

ミユ「フォントグリフの話は終わったので次にSandS廃止の件。」
シルキ「「kanfont」で「活」グリフを「漫」グリフに[Ctrl]+[V]しようとするとスピンボックスの文字コードが間違ってコピーしたりする。」
フレア「十字キーと言うかカーソルキーの[Left][Up][Right][Down]を押してもGUIのフォーカスが移動してしまう。」
ミユ「そして漢直のつもりでスペースキー[Space]押したはずがGUIのボタンを押した事になったりします。
回避するにはVimのHJKL移動を参考にする。
「kanedit」ではGUI自体を排除してるのでカーソルキーとかコピペ時の不具合は解消されるはず(「kanedit」は開発中です)。」
フレア「って事はスペースキーによるシフト操作の字引(SandS)が別のキーに移動?」
ミユ「「LTsv10kanedit」の漢直(キーボード操作)の鍵盤差し替えは[NFER(無変換)][XFER(変換)][KANA(カタカナひらがなローマ字)]の3つに変更。
字引入力は[KANA]キー。辞書変更(もしくはα鍵盤選択)は[NFER]+[XFER]。説明がシンプルになってすごく楽。
さっきの「顔付き満月【🌝】」で例えると、

  1. 字引入力の辞書を「代」に変更するので[NFER]+[XFER]両押しからのどっちか片方押したまま[;(れ)]。
  2. 全角アンダーバー「_」を表示するため「`」鍵盤に差し替え。[XFER]押しながら[@]。
  3. 字引入力するので[KANA]押しながら[_(ろ)]

字引入力は3ストローク。[NFER][XFER][KANA]の押下は親指シフト理論でノーカウント。」
レクィド「スペースキー無くなったら空白スペースどうやって入力するんすかね?」
ミユ「アルファベット鍵盤「¥」または「@」の「0(わ)」に該当する部分の裏というか、[XFER]の「|」「`」鍵盤に空白が存在。」

フレア「やっと夢日記に出てきたリバーシの話題に突入。

フォント製作など文面ではなくグリフといった図形方面だと効果が有ったような気がしないでも。
とりあえずオセロのアイディアとは対局したいかも。

夢日記2016年06月号 - フレアの夢日記(寝ながら仕事片付けたい)(ooblog) - カクヨム


かくして棋譜ネタ再現。点字入力は難易度高いしグリフも準備中だしbase64っぽい方で。」
ミユ「本題の漢直から離れるのですが。」
フレア「「LTsv/LTsv_glyph.py」付属のリバーシも実はあくまで漢直の延長。
base64風オセロ棋譜」と「活グリフ5x圧縮」の考え方同じようなものだし。
他にもリバーシ部分をタイピング練習に差し替える事で漢直タイピングソフト「kanfast(仮)」になるみたいな説明も兼ねてる。」
シルキ「AIが露骨に隅残すのはワンパターンかな。」
フレア「漢直キーボードの可能性をデモストする手段であって、目的ではない定期。」
ミユ「ついでなのでリバーシアルゴリズムの解説も。
ゲーム開始前に事前に「同じ値が無い乱数(シャッフル)」と「角の周囲(隅)を避ける重み付け(角自体は取りにいく)」を組み合わせた評価関数を用意するだけの手抜きアルゴリズム

def debug_milkAI_reset():
    global debug_milkAI,debug_milkMAP,debug_milklidBW,debug_milklidBWwait
    debug_milkAI=list(range(debug_milklidLen)); random.shuffle(debug_milkAI)
    for xy in [11,18,81,88]: debug_milkAI[xy]+=900;
    for xy in [13,16,31,38,61,68,83,86]: debug_milkAI[xy]+=800;
    for xy in [33,36,63,66]: debug_milkAI[xy]+=700;
    for xy in [34,35,43,46,53,56,64,65]: debug_milkAI[xy]+=600;
    for xy in [14,15,41,48,51,58,84,85]: debug_milkAI[xy]+=500;
    for xy in [23,26,32,37,62,67,73,76]: debug_milkAI[xy]+=400;
    for xy in [24,25,42,47,52,57,74,75]: debug_milkAI[xy]+=300;
    for xy in [12,17,21,28,71,78,82,87]: debug_milkAI[xy]+=200;
    for xy in [22,27,72,77]: debug_milkAI[xy]+=100;

ゲーム開始後は石を置ける場所を毎回辞書にして評価関数の最大値を求めるだけ。

def debug_milkAI_Auto(window_objvoid=None,window_objptr=None):
    milklist=[0]
    for xy in debug_milklid_range:
        if debug_milklid_check(xy,debug_milklidBW) > 0:
            milklist.append(xy)
    milkAIdic={}
    for key in milklist:
        milkAIdic[str(key)]=debug_milkAI[key]
    milkAImax=max(milkAIdic.items(),key=lambda d:d[1])[0]
    debug_milkAI_add(debug_reversi_key[int(milkAImax)])

ちゃんとしたリバーシ作るなら数手先の探索が必要。
序盤の全滅チェックや、中盤で角をとったら逆に残りの角取られるパターンや、終盤で隅の4升を3升2升に調整して先行後攻入れ替えるアルゴリズムも必要。

偶数理論とは「奇数空きは自分から打ち、偶数空きは相手から打たせる」という手筋のことを言います。
「自分が打って相手が打つ」と言うのと「相手が打って自分が打つ」と言うのとでは、後者の方が得なのです。
プログラムとして製作するのであれば、終盤は読み切り出来ますので役に立つかは分かりません。

オセロ(リバーシ)の必勝法(勝ち方) 〜偶数理論〜


レクィド「つーか寝言の方では「オセロ」ってはっきり言ってるのに「リバーシ」てw」
フレア「商標問題。「リバーシ」を作る分には問題ないはず。

ゲームの「ルール」は著作権の保護対象とはならず、まったく同じルールのゲームを作っても著作権法上は問題ない――という見方が現在では一般的です。
セガ側もそれを理解しているからこそ「法のもとに許されている範囲でどうぞご自由にやられてみてください」と発言していた可能性が高く、これで果たして「容認の言質をとった」と言えるのかどうかは疑問が残ります。
セガホールディングス側に問い合わたところ、「公式に許諾した事実はございません」とのことでした。

「ぷよぷよのeスポーツ化」をうたったクローンゲーム「マジカルストーン」めぐり物議 セガは「許諾の事実ない」 - ねとらぼ

オセロと似た白黒の駒を使うボードゲームとして「リバーシ (Reversi、レヴァルシー)」や「源平碁」があった。当時のこれらのゲームについては、1981年に長谷川が著した文献『オセロの打ち方』には「(オセロの)原型」として紹介されている。
長谷川は今まで実験中であったゲームを8×8のチェス盤を用い、このチェス盤にぴったり合う牛乳瓶の紙蓋を石に選び、複雑な間接挟みをやめて簡明な直接挟みのみのルールに整理し、「オセロ」と命名した
現在のオセロのルールが世界標準であることから、オセロの販売メーカー以外の他社からオセロとほぼ同ルールのゲームが「リバーシ」や「白黒ゲーム」等の名称で販売されることがあり、この場合は盤や駒もオセロとほぼ同じタイプのものが使われている。

オセロ (遊戯) - Wikipedia

フレア「話脱線させちゃったけど、「kanedit」の今後の予定など。」
ミユ「「電卓」部分もスクロール機能付いてないから「kanfont」でもグリフ入力欄からはみ出る編集できないし、
なによりエディタ作ってる話なのに「メモ帳」部分が手を付けてない。」
フレア「「kantray」の方を一旦畳む事が最優先だったから仕方ない。」
シルキ「IME止めちゃったからブラウザに文字入力の時に漢直できないね。」
フレア「「約四文字」の入力欄にも漢直を!」
ミユ「JavaScriptに移植しろと?「sirogane」や「yonmoji_ge」の方が先かと」
シルキ「先にグリフたくさん用意してからだねー。」