Drawing into the selection

選択範囲がある時、描画がその中へ限定される処理を書いた。

さてこの選択範囲をどうこうするための、クリップボードに関するメニューというものが必要になるのだけど。どこへ追加したものだろうか。

桃の上部のパネルは、別に意識したわけではないのだけど、Microsoft 製アプリで言うところのリボンUIのように見えるので、クリップボード操作に関してもそれを模倣するという方法もあるが、リボンが優れたUIとはちょっと思えないのでそれは採らない。普通に「ファイル」「編集」云々の伝統的なメニューバーがほしい。

そういうものをちょちょいと出してくれる素敵なライブラリなんかないかな。

Switching to Chrome

Chromiumで、拡張に割り当てられた記憶領域(chrome.storage.local)に対して明らかに空き容量があるのに「残り容量がないエラー」になる謎の現象があって困る。もしかしたらpsdとの相性が悪いのか? 試しにpsdの対象から外したら発生しなくなった、気がする。

とかなんとかやってたらChromeが更新されたので試してみた所、謎のCPU浪費をしなくなっているようなので戻した。

というわけでChromeでこの記事を書いているのだが、basic認証をさせるページでユーザーにプロンプトを出して入力を求めるより前にリクエストが行われてしまって認証エラーになる現象が発生している。どうもまだ安定状態には一進一退という感じだ。

現代のブラウザは規模が大きくなりすぎてテストが行き届かなくなっているのかもしれない。

* * *

CPU浪費問題。おかし、直ってないじゃねえか!

Ants march over the peach

選択範囲の表示をやってみた。

このトピックについてめんどくさい点は、Photoshop等に倣うなら、範囲表示の境界線がキャンバスの倍率によらず常に1ピクセルであるということだ。このための下準備がめんどくさい。蟻が行進するのは意外とめんどくさくない。

もう一つめんどくさいのは、選択範囲を決定する前段階の仮線の表示だ。何がめんどくさいかと言うと、やはりPhotoshopに倣うならばこの仮線はキャンバスの画像を反転した色で表示する必要があるのだ。

この反転表示と蟻の行進を組み合わせて表示するのが多少めんどくさい。ちなみにPhotoshopではなくgimpに倣えば、この手の仮線はxorではなく縁取りされた実線になるのだけど、これはどのピクセルを選択しているのかわかりづらいのでよくないと思う。

ともあれ、選択範囲の表示についての基礎の部分はできた。まだ実装してないけど選択範囲の集合論的な演算(範囲の追加、削除、インターセクションなど)も無理なく組み入れられると思う。

ということで次に考えるべきめんどくさいことは、この選択範囲をどうするかという点と、選択範囲に対する描画という点だ。前者はクリップボードとのやり取りという話に繋がるのでなかなか大掛かりにめんどくさい。また後者はつまり描画のクリッピングなのだが、おそらくcanvasの機能で一発ということにはならないのでこれまためんどくさい。

この記事めんどくさい言い過ぎだ。

Installing log: Ubuntu Server 18.04

apacheとgitリポジトリを保持しているUbuntu Serverを動かしているVirtualBoxを動かしているWindows10マシンがこの夏を乗り越えられずに寿命を迎えた。享年13なので大往生なんだろうか。さて、どうしようかな。

ということで適当なノートにUbuntu Serverを入れ直したい。仮想じゃなくなる。

ところでUbuntu Server 18.04.3をインストールしてもOperating system not found的なエラーになって起動しない。unetbootinではなく、Ubuntu公式のブータブルUSB作成ツールで作ってそこからインストールしても起動しない。はて…? 試しにXubuntu desktop 18.04をインストールしてみるとそれは起動する。うーん入れたいのはserverの方なんだけどな…まあ…いいかな! やり直すのめんどくさいし(雑な仕事)。

たぶん16.04とかなら入って、そこからアップグレードさせるのが正解だったのだろうと思うけど色々入れちゃったので後の祭り。そういうわけでdesktop OSをサーバ代わりに使うアホな人が一人誕生したのだった。

Scan line

範囲選択機能を作る際、めんどくさいことは大まかに分けて2つあり:

  • 選択範囲の内部表現
  • 選択範囲の表示

まず内部表現から考えると選択範囲とは頂点の配列のことだ。それを結んで多角形とし、その内部に描画を限ることで範囲選択がなされる。

多角形によるクリッピングというのはキャンバスのネイティブの機能を用いて実現してもよいのだが、その場合アンチエイリアスが効いてしまう(アンチエイリアス自体はキャンバスの仕様に必要な要件ではなかったはずなのだが、どういうわけか全てのブラウザがそういうふうに動作する)ので自前でアンチエイリアスをかけない多角形塗りつぶし機能というのが必要だ。

というわけで書いた。

アンチエリアスをかけない描画メソッドというのはすでに線分と円についても作ってあるが、どれもなかなか面白く、グラフィックスの教科書をおさらいしてる気分になる。

* * *

ポリゴンの内部をキャンバスの機能で塗りつぶし、輪郭だけアンチエイリアスなしの線分描画関数で上書きすれば10倍くらい速くなることに気付いてしまった。ぐぬぬ…。

Have to press twice

Chrome 上で vi っぽいキーバインディングを再現するよ系の拡張としてcVIMを入れている。のだが、最近になって不思議な動作をするようになった。

:とかaとかtを押すと1行入力のプロンプトを求める状態になるはずが、なぜか2回左記のキーを押さないとプロンプトが出なくなってしまったのだ。不思議なことに従来通り1回押せば出るページもある。またそのページでも状態によって出たり出なかったりする。ランダム。

cVimのコミットもすっかり頻度が低くなってる今日この頃だけど、直るんだろうか。

Love is heavy

Xubuntu 上の Chrome がいつの間にやらすごく CPU を使うようになっている。top -H で見てみると Chrome_IOThread なるスレッドが常時 50% ほど回っている。なんだこれは。何を I/O しているんだ。

というわけで仕方がないので Chromium を引っ張り出してきた。こちらは特に CPU 浪費とかはしない。というか、別に Chromium で十分なのだった。そもそも Xubuntu インストールして標準で入ってるブラウザだ。

それをわざわざ Chrome にスイッチしたのはきっと何か理由があったんだと思うが、思い出せない。YouTube の動画で見られないものがあるとかそんな理由だったかもしれない。

ところで久しぶりに Chromium を起動して設定を開いてみると、Google アカウントでログイン云々の機能が入っている。そのあたりは Chromium はフリーで Chrome に固有という切り分けじゃなかったのか? よく分からない。

All layers are independent in size

従来はすべてのレイヤーの大きさはキャンバスの大きさであり、また背景レイヤーの完全に直上にある構造だったがこれをやめ、レイヤーごとに大きさとオフセットを独立して持てるようにした。それに合わせて、いわゆるレイヤー移動ツールを実装した。

と文章で書くとこれだけなのだが描画のあらゆるところでオフセットを意識するように書き直すのは死ぬほど大変だった…。その割に見た目は何も変わっていないと言う。

次は矩形選択ツールを作る。

2 ways to install an application

言うまでもなく Ubuntu は Debian 系のディストリビューションなので、プログラムのパッケージをインストールするには apt を使い、deb パッケージを扱うのが通例だ。が、ここへ来て snap パッケージというものも使えるようになっている。

大きな違いとしては snap の方は対象がある程度の規模かつ OS からは独立したアプリケーションであるように思える。snap でインストールされるプログラムから見えるファイルシステムはサンドボックス化されていることからそれが伺える。

それから、snap の方は毎日アップデートがチェックされ、特にロックしない限り勝手に最新版に追従するとのことだ。へー。

ところで困るのが、deb と snap に両方同じアプリケーションがある場合と、あるタイミングでどちらかに移行した場合である。前者の場合は例えば gimp とか、vlc とかだ。両方入れるとどうなるんだろう? 多分大丈夫なんだろうけど、一応念のためにあらかじめ deb 側はアンインストールするようにしている。後者の場合は例えば Ubuntu 16.x 時は画像ビューアとして comix が用意されていたが、18.x にアップグレードするとそれが問答無用で削除され、特にアナウンスもない…みたいなことが起きる。これは snap 側に後継である mcomix が存在している。このように2つのリポジトリそれぞれの相関や移行と言ったその運用があんまり考えられていないように思える。

ファイルシステムのサンドボックス化と言えば、スクリーンショットを編集したい場合、従来だととりあえず PrintScreen キーを押して、出てくるダイアログで gimp での編集を選んで実行…という流れだったが。gimp を snap で入れるとホームディレクトリ以外の場所を触れない(正確には、触れるが本来のファイルシステムから分離される)のでその流れで編集できなくなった。スクリーンショットはとりあえず /tmp/ の下に保存されるからだ。

どうするかというと、いわゆる昔ながらの Unix 的な流儀から全く離れている気がするが、gimp 自身がスクリーンショット機能を持っているのでそれを使う。うーん。まあそれでもいいけどねーいやーそれはどうなんだろうねー。

特にまとめもなく突然終わる。

Telling you who I am

ここのサーバは xrea である。xrea のサーバには、ssh でログインできる。それを利用して、ローカル上の成果物を rsync を通して xrea 上に配布することができる。楽。

ただし、どのホストからも ssh で入れるわけではない。事前にブラウザからコントロールパネルページを開き、ホストを登録する必要がある。

さてこのコントロールパネルページが最近リニューアルされてなんかおしゃれな感じになったのだが、ところが新しい方には前述のホスト登録機能がどこにも見つからないのである。以前あちこち探しまくって、こんなところにあったのか! となったことは数回あったのでどこかにはあるんだと思うが、現在は全然見つからない。

そんなわけで、古い方のコントロールパネルに切り替えた上でホスト登録をするという作業を強いられて、実に面倒くさい。

ところでリニューアルに伴って、コントロールパネルの機能をプログラマティックに呼び出す REST API が設けられたという。この中にホスト登録機能も含まれているので、ローカルの cron でよしなにすることにした。

それにしてもホスト登録機能、どこ行っちゃったんだろ…。