add a ad

赤福プラスを公開したわけだが、いくつか積み残している、つまり未実装のものがある。

まず、「自動追尾」なる機能について、ページ上にリンクはあるものの、その機能本体をまだまったく実装していない。それどころか、どういう仕様にするかもまだ決めていない。ぼんやりと思い描く分には、これはつまり自動追尾属性をスレッドに与えることにより、適当な間隔で自動的に「続きを読む」機能を実行し、加えてスレッドが落ちたらやはり自動的にそのログを MHT 形式で dropbox などに保存する……というものだ。なお、あらゆるスレッドにこの属性を付与されるとなかなかトラフィック的な問題もあるので、同時に登録できるのは n スレッドまで、みたいな制限は加えることになると思う。

次に、虹裏 may などに存在するお絵かき機能への対応をまだしていない。以前も書いたが、赤福プラス version 3.0 以降では、ページの内容が完全に赤福プラスの制御下にあるという構造になっている。これにより様々なメリットを享受できるのだが、一方でふたばのサーバが返す生の html に含まれる javascript コードでやっていることの再利用ができず、赤福プラス側で同じ処理を書かなければいけないというデメリットもある。で、お絵かき機能の処理をまだ書いていないということなのである。具体的にその処理とは、単にお絵かき要素の可視・不可視を切り替えるだけのことだ。

じゃあ、書けばいいじゃん! ということなのだが、いくつか気になる点がある。このお絵かき機能はあんまり高機能なものではないのである。これは、ふたばの管理人さんが「あえて」低機能なままにしているのだと思うが、別に高機能なオプションがあってもいいのではないか。また、お絵かき機能は flash で実装されているので、ハンドリングがややめんどいというのもある。

そこで、html5 の canvas を活用した、もう少しだけイケてるお絵かき機能を実装すればよいのではないかと考えている。加えて、ふたばに貼られた画像を引用する機能も欲しい。これにより、スレッド上でお絵かきのコラボレーションみたいなものが簡単に実現できることになる。

実は Opera に canvas が実装されてすぐ、レイヤーや自由領域選択やフィルタやその他もろもろといった、だいたい Photoshop Elements に相当する機能を備えたそういうアプリを書いてみたことがあるので、おそらくそれを持ってくることになると思う。

最後に気になっているのは、ふたば上の広告の扱いである。というわけでやっとタイトルに絡めることができたのだが、力尽きたのでまた明日。

the 15th single

前の記事の続き。

  • Unifont には ambiguous 属性を持つ文字について、1 カラム分(いわゆる半角)と 2 カラム分(全角)の両方のグリフが混在している
  • Unifont には neutral 属性の字の内、2 カラム分のグリフのものが大量にあるが、端末エミュレータはそれを 1 カラム分の文字として表示する

という問題。

まず、ambiguous な方は、UFO 側のグリフを 1 カラム分で統一するようにほとんどすべて書き直した。これはつまり、●とか◎とかの日本古来の(?)全角文字が UFO においては半角分の幅のちっこい丸で表示されるということを意味する。これはなかなか反感を食らいそうな決定ではあるのだけど、でもねえギリシャアルファベットやキリルアルファベットを始めとして、本質的に 1 カラム分のグリフで扱ったほうが収まりがいい字が 2 カラム分のそれの、ざっくり 4 倍くらいあるんですよ。

ちなみにそういうわけなので、UFO を使用する際は vim の ambiwidth は single にしないといけない。

neutral な方は、フォント側ではいかんともしがたいので知らないふりをする。こちらもそれぞれのグリフを 1 カラム分に書きなおすことができれば、それはそれでひとつの解決策ではあるので、ためしに Devanagari でやってみたのだが、えー、まあ、無理です。ちっこすぎて目が悪くなる。

くわえて Devanagari 特有の合成処理が、(xfce-terminal では)なんか動いているような動いてないような、vim 側の問題のようなそうでないような、微妙な感じなのでそのへんも含めてやはりフォント側で頑張ってどうこうなる問題ではないと思う。

うーん、これはどうなんだろうか。もしかしたら、端末エミュレータと、込み入った Unicode 文字の処理というのは、想像以上に食い合わせが悪い関係なのかもしれない。実用に即していないおかしな仕様を、これまた中途半端に摩訶不思議な実装をしたまま、誰もそれをどううまく直せばいいのかわからないという。

いやーまさかそんなことはないんだよね……?

What is really ambiguous?

UAX#11: East Asian Width という、なんとも適当なドキュメントがある。

いわゆる全角・半角という概念を Unicode 上に持ってきて、どの文字が Wide でどの文字が Narrow か云々、というのを定義してたりしてなかったりする実に適当なドキュメントである。

まず幅についてのクラス分けをしている。

  • Wide: 常に全角の字。「あ」とか「漢」とか
  • Full width: 半角と全角両方ある字のうち、全角の方。全角の「A」とか
  • Narrow: 常に半角の字
  • Half width: 半角と全角両方ある字のうち、半角の方(この分け方だと U+0020-U+007F は Half width になる気がするが、実際にはそれらは Narrow となっている。Basic Latin は特別扱いなのかもしれない)
  • Ambiguous: よくよく考えてみれば全角にする理由は特にないけれど、東アジアの野郎どもが彼らの文字セットに入れてたので、慣例的に全角になるような雰囲気の字。つまりこれは、東アジアの野郎の慣例を抜きにすれば別に半角でも構わない──よって、曖昧
  • Neutral: 東アジアの野郎どもが知らない字

Unicode のすべてのコードポイントにこのクラスのいずれかを割り当てる。それにより、端末のような縦横のグリッドの中に文字を収めていくような表示デバイスについて、グリッドいくつ分を消費するのかの判断のもとになる、はずだった。Wide/Full width/Narrow/Half width については悩む必要はないのだが、問題は Ambiguous と Neutral なのだ。

Ambiguous な文字の幅の問題は、たとえば vim で「●」とかの表示が変なんですけど! → set ambiwidth=double しなさい的なお約束がググれば出てくるアレである。これについては、Unifont においては更に厄介な問題となっている。

いずれの端末エミュレータにしても、あるいは vim のようにアプリケーション側で Ambiguous な字をハンドリングするにしても、だいたいは A 属性の文字全体を半角として扱うか、それとも全角として扱うかの二者択一になると思う。ところがこれに対して Unifont では、半角のつもりの A 属性の字と全角のつもりのそれが混在しているのだった。たとえば U+2460、丸数字の1は Ambiguous 属性だが、Unifont はこれを全角幅としてデザインしている。一方、U+0391 からの Greek アルファベットもまた Ambiguous であり、そのグリフは半角幅である。

すなわち、端末で Unifont を使っている限り、Ambiguous な字の取り扱いを全角にしようが半角にしようが、その半分は常に正しく表示できない。

なんだこれ。どうしろってんだ。

次に Neutral な文字で、こちらはさらに輪をかけて混沌としている。

ぶっちゃけた話全角・半角の違いって、プロポーショナルフォントを描画できるデバイスとか、描画を自分で完全に制御できるプログラムではそれほど重要ではない。むしろ端末のような表示デバイスで「どう表示するか?」に直結してくる問題だと思うのだけど、冒頭の UAX #11 はどういうわけか端末に対する記述は全くない。「文字を幅によってクラス分けしてみたよ! やったね!」以上のことを何も教えてくれない。

なんとか判断してみるにしても、Neutral はつまるところ Neutral である。幅の情報は一切含んでいない。それを半角・全角のいずれかと判断するためのいずれの理由も見出すことはできない。とりあえず実際のところ、おそらく既存の端末エミュレータはそれを Narrow 文字として取り扱うと思う。それが楽そうなので。

一方、Unifont はどうなっているかというと、たとえば Devanagari の文字はすべて Neutral だが、なんとすべて Wide としてデザインしてあるのである。16 ピクセルでよく描いたなーと思わせる良いグリフなのだけど、しかし以上のような状況を勘案すると、今のところ既存の端末エミュレータの中のテキストエディタ上でそれを正しく表示したり編集したりはできないんじゃないかと思う。

えーと…なんだこれ。どうしろってんだ。

crisped edge #2

Linux 向けの、実用に足る unicode ベースのビットマップフォントが、もしかして未だにないんじゃないのか? という問題を解決したい。

実のところを言えば、unicode ベースのビットマップフォントというのはすでにある。

これは Basic Multilingal Plane の全域をサポートした 8×16/16×16 ドットのビットマップフォントである。

しかしながら、いくつか問題があるのである:

  • Latin な文字について、x height が高すぎる。そのため大文字と小文字の判別がつきづらい
  • 0 に斜め線が入ってない
  • CJK な文字について、それらは Wen Quan Yi Project が作成しているフォントから提供されているのだが、漢字部分はともかくひらがなやカタカナがけっこう見づらい

こういうわけで、日常的に端末で使えるかどうかというと微妙なのであった。

一方で、GNU のプロダクトである。グリフの元データとなる hex ファイルや、さまざまなユーティリティプログラムも込ですべてが公開されている。フォークして、これらを元にさせていただきつつ新しいのを作ればよいのではないか。そうだそうだ、そうしよう。

* * *

ということで、新しくグリフをデザインしたり、懐かしの jiskan16 を持ってきたり、東雲フォントをもってきたりいろいろした結果、できた。名前は特に意味はないが、UFO とした。地球のフォントに飽きたところよ。

Latin 文字

Latin 文字

ソースコード

ソースコード

日本語の文

日本語の文

もちろんこれで完成というわけではまったくない。既知の問題として CJK のグリフがバウンディングボックスを目一杯使っているのでスクリーンにぎっしり日本語の文章を表示するとかなり見にくい。もしかしたら CJK グリフは一回り小さい wqy なビットマップフォントから改めて持ってくる必要があるかもしれない。

とりあえず個人的に使ってみつつ微調整したい。

crisped edge

日常の作業は端末エミュレータ上でのそれがほとんどなのである。

したがって、一日の大半は黒い画面上の白い文字を睨んでいるわけなのだが、ここに問題がある。ナウい OS というものはなんでもかんでもアンチエイリアスがガンガン効いたフォントをレンダリングする。一方で、端末は 10pt とか 12pt とか、けっこうこまい文字で使っている。するとこのサイズでのアンチエイリアスの効いた文字はむしろ見にくいのだ。これははっきり言ってストレスがたまる。

つまり、端末ではいわゆるビットマップフォントを使いたいということだ。しかしこれは意外なことに Linux のほうが面倒くさい。Windows(というか cygwin の mintty)では単に Terminal のような、fon 形式のフォントを選択するだけなのに、Linux の場合はそもそもビットマップフォントを選択できなかったりする。

しかしながら、さすがにフラストレーションが溜まってきたので、なんとかしたい。ここで言うなんとかしたいというのは、端末に bdf フォントを認識させるにはどうしたらいいの? 的なレベルではなく、Linux 向けの、実用に足る unicode ベースのビットマップフォントが、もしかして未だにないんじゃないの? というソレに対するアレである。

RDP 8.0 #3

以前、Windows 7 上で RDP 8.x を有効にする更新を入れたら満足に動かなかったという記事を書いたのだが、今月になって Windows Update の中にそれの更新版が来ていたようだ。以前リンクしたMSDN のドキュメントも更新されているが、 KB2574819 KB2857650 KB2830477 KB2913751 KB2913751(optional) が入ってれば良いという。うちのマシンには全て入っていた。

ということで、ホスト側 PC で改めて RDP 8.x を有効にした上で適当な別のマシンから接続し、こうやって記事を書いている。以前書いたような不具合は今のところ見られないようだ。

ありがとう MS さん!

exodus from presto opera

Blink Opera が version 20 に達した今もなお、うちの PC のメインブラウザは Opera 12.16 である。

2014 年 3 月の今現在においても、とりあえず、Presto Opera でもそれほど困る場面は多くはない。もちろん CSS3 をふんだんに使って Opera じゃ全然満足に表示できないとか、javascript の JIT がらみで Opera ごとすぽーんとプロセスが落ちたりするサイトはじわじわと増えてきている感はある。しかしメインブラウザの地位を脅かすほどのストレスをもたらすほどでは、まだない。

とは言ってもこれは時間の問題なのも確か。やがては、Presto Opera から移行しなければいけない時期が来るのは言うまでもないのである。その時のために、先立ってなぜ Presto Opera でなければいけなかったのか、の個人的な理由をまとめておこう。つまりこの要件を満たしてくれるブラウザがなければ将来であっても移行できないし、満たしてくれさえすれば今すぐにでも移行できる。

  • メーラがブラウザと一体化している: 正確にはブラウザと一体化しているのがメリットなのではなく、さまざまなアカウントのメールや、メーリングリストや、RSS フィードや、IRC や、その他もろもろをひとまとめにしてくれる。これはまあ必ずしもブラウザと一体化している必然性は実はあまりない。つまりまとめて面倒見てくれさえすればブラウザと一体化してなくても別によい
  • キーバインディングの自由度が高い: vi/vim に魂を捧げた人たちにはついていけないけど、hjkl にページスクロールを割り当てたり程度はする。また ctrl+H に [cci]Back | Close page[/cci] といった条件判断を伴うバインディングをする。あるいは、コンテンツ領域外、例えばアドレスフィールドに対して [cci]ctrl+N/P/F/B[/cci] を割り当てたりする。この全てを柔軟に聞き届けてくれるブラウザは今もなおそれほど多くはない
  • 充実したデバッガ: Dragonfly は様々な改善を経て、今では十分に使えるデバッガになっている。特にけっこう自由にキーバインディングできるのが非常によい。他のブラウザが持つデバッガはいずれもここまでの自由度は持っていない。持っていたら教えて下さい

願わくば、数年後にこれらの要件を Blink Opera が満たしていてくれればとても素晴らしいのだけど。

moon-crystal-power

赤福プラスをエクステンションのパッケージにビルドするための準備をした。

wasavi のビルドは ant を使っている。これは junit と selenium を使った機能テストと統合しているためである。一方で赤福プラスの場合はその手のテストが難しい。つまりやることの大半がふたばのサーバに対する応答なわけで、継続的な自動テストを行わせるにはふたばのサーバとして振る舞うダミーが必要になるのだが、それを真面目にやるのはなかなかな大仕事だということだ。もしかしたら junit & selenium とか、そういう話じゃなくなって、まったく別の仕組みを使う必要が出てくる可能性すらある。

となるとビルドに ant を使う必要もないわけで、赤福プラスのビルドは make で行うようにしてみた。ant でダメというわけでもないのだけれど、ビルドの手順を xml で書くのは、やっぱりとっても冗長なのである。まあきっと一般的には build.xml は直接触らず GUI でぽいぽい手順を指示するタイプのツールがメジャーなのであって、xml が冗長だ的な批判は的はずれなのだろう。xml を直接書くほうが頭おかしいのである。

しかし、それにしても、(シンプルなプロジェクトの)Makefile はやはりシンプルで、素朴で、いいなあと思いました。