hogashi.*

日記から何から

 森永のガチャガチャがあったので喜び勇んでやったところ、シールが結構ずれてて悲しかったので、自分でいったん剥がして張り直した。バリバリになってしまうと困るのでゆっくり剥がす必要があって、久々に気の長い作業でよかった。どれも好きなので嬉しかったけど、あの中だと小枝が一番ほしい。

ゴルゴ13が好き

はてなブログ10周年特別お題「私が◯◯にハマる10の理由

ゴルゴ13
連載中
アクション劇画 / 1968年11月~連載中

作品紹介
国籍・年齢・本名すべてが不明の超A級スナイパー!
1968年11月(1969年1月号)から雑誌に連載開始。以来一度も休載せず、現在も「ビッグコミック小学館)」にて好評連載中。

作品一覧 | さいとう・プロダクション

 ゴルゴ13が好きで、単行本を順番に買いつつ読み、この間202巻を読み終えて追いついた。買い始めたのは(Twitterを見る限り)多分2020/6あたりなので、1年半くらいかかっている。

 多分初めて見かけたのは床屋とかそういう待ち時間のあるところの本棚で、コンビニに売っていることに気付き、大学に入ったあたりからたまに買っては読み、ということをしていた。全部読みたい気持ちはありつつ、ものすごい量があることは神保町の三省堂で全巻入った本棚を見て知っていたので、思い切るには時間がかかった。

 ゴルゴ13が好きです、読んでいます、と話すと、どこが良いのか?とよく聞かれるけど、あんまりちゃんと答えられたことがない。多分こうかな〜〜と思いながら10の理由を挙げてみるけど、ゴルゴ13について何か書くの自体が無粋、という気持ちもあるので、独り言です。

  • 理由
    • 勧善懲悪(?)
    • 基準がぶれない
    • 人間である
    • 強い
    • 手法
    • ありえる
    • 職人/達人
    • 歴史の一解釈
    • よくわからない
  • むすび
続きを読む

正規表現のパターンを書くとき

 正規表現のパターンを書くとき *1、具体例と境界条件を考えているなと急に思った。こういう例がマッチするな〜ここを変えるとマッチしないのでここが境界だな〜という調子で書いていく気がする。モンテカルロ積分というのがあって、ここは内側、ここは外側、とランダムに座標の具体例をどんどん挙げていくことで、なんとなく図形の境界がどこなのか、どういう形なのかを掴んでいくのだけど、これがちょっと似てると思う。正規表現のパターンを書くときの感じを図にするとそんな感じで、正規表現のパターンがモンテカルロ積分したい図形の関数にあたるイメージ。

*1:広義(?)にはコードを書くときも条件分岐とかはそう

言葉の進化予言選手権

 言語の専門家ではないので、これは趣味です。

 言葉はだんだん変化するもので、たぶんどの言語でも意味が変わったり使い方が変わったりしている言葉がある。日本語だと、「微妙」は昔は単に「バランスが難しい」くらいの意味だったと思うけど、最近は「あんまりよくない」という使われ方をしている気がする。

 というわけでこれを勝手に予測してみる。

てこ

 例えば、「てこ」は「銃」を意味する言葉になる、とか。
 今日の時点で「てこでも動かない」という言葉は残っているけど、日常で「てこ」自体を意識することはまずない。将来は銃社会になってしまうという仮定を置くと、「てこでも動かない」というのは「銃を突きつけられても言うとおりにしない」ということを主に指し示すようになり、「てこ」が銃のニックネームになるのではないか。あと「抵抗」と音が近いので、「銃で抵抗すること」が音によって「てこ」と結びついてもおかしくない。

パケロス

 近年「ギガ」が「データ通信量」や「契約している通信量のうちの残り具合」を指し示すようになっている。元は単に接頭辞で、しかしギガとつくような単位は身近にデータ通信量くらいしかないのでそうなっていそう。

 似た話題で、「パケロス」もそうなるチャンスがありそう。 Web もスマートフォンもまだまだ進化している中、通信にまつわる色んな知識が世間に出るはずで、「通信がうまくいかないこと」の理由として「パケロス」が説明されることが多くなったりすると、「通信がうまくいかないこと」自体や「契約している通信量を使い切って高速な通信ができない/ままならない」ことを「パケロス」と表現し始めるのではないか。それぞれの単語である「パケット」と「ロス」はすでに身近でなんとなく意味が想像しやすいことも、普段使いへの近道っぽい。


 近未来SFを考えているような気持ちになって楽しい。みなさまもお試しください。

文字列をコピーするブックマークレットで使うクリップボードのAPI改めて見てた

 ブックマークレットで文字列をコピーする (クリップボードに入れる) というのをよく書く。

 昔ググってへ〜と思ったまま Document.execCommand() - Web API | MDN をずっと使っていた。(あと HTMLInputElement.select() - Web APIs | MDN も知らなくて、 Selection を使って頑張って文字列選択していた。)

const value = 'これをコピーしたい';
// input をつくって body に入れる
const input = document.createElement('input');
document.querySelector('body').appendChild(input);
// フォーカスしたときスクロールされてしまわないように画面内に出す
input.style = 'position: fixed; top: 0; left: 0';
input.focus();
input.setSelectionRange(0, value.length);
document.execCommand('copy');
// input 消す
document.querySelector('body').removeChild(input);

 MDN を見ると廃止されている。

廃止: この機能は廃止されました。まだいくつかのブラウザーで動作するかもしれませんが、いつ削除されてもおかしくないので、使わないようにしましょう。

https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand

 代わりに何を使ったらいいかここには書いていないけど、 クリップボード API - Web API | MDN というページがあって、 execCommand の代替であると書かれている。

クリップボード API は、クリップボードのコマンド (切り取り、コピー、貼り付け) に応答する機能や、システムクリップボードの非同期の読み取りや書き込みを行う機能を提供します。クリップボードの内容へのアクセスは、 Permissions API によって制限されています。ユーザーの許可がなければ、クリップボードの内容の読み取りや変更は許可されません。

この API は、 document.execCommand() を使用したクリップボードへのアクセスに取って代わるように設計されています。

https://developer.mozilla.org/ja/docs/Web/API/Clipboard_API

 Navigator.clipboard - Web API | MDNIE 以外のブラウザで存在する。しかし Clipboard - Web API | MDN を見ると、それぞれのメソッドのサポートは今のところまちまちになっている。クリップボードへの読み書きそれぞれについて、対象が Blob か文字列かでメソッドが分けられているのが面白い。そのおかげもあって、よく見ると、 Clipboard.writeText() - Web APIs | MDN だけはどのブラウザでもすでに (ユーザに許可を求めたりせずに) すっと使えそう。

const value = 'これをコピーしたい';
navigator.clipboard.writeText(value);

 コードの量がめっちゃ短くなって、使い方も (文字列選択してから execCommand するより) 直感的で便利。めでたし、と思いきや、実はむずい点がひとつあって、 document にフォーカスがある必要がある。
 Clipboard API and events を見ると、破滅しないためにそうしているっぽい。確かにそのページを開いたまま別の作業をしてる間にクリップボードの中身がバリバリ変わったら困る。

The Asynchronous Clipboard API is a powerful feature because it can allow access to the clipboard data from any script (access is not restricted to Clipboard Event handlers) and data can be accessed in the absence of a user provided gesture.

To help prevent abuse, this API must not be available unless the script is executing in the context of a document that has focus.

https://www.w3.org/TR/clipboard-apis/#privacy-async

 ということは、ブックマークレットでは困る場合がある。開発者ツールとかアドレスバーとかみたいな document 以外の場所にフォーカスがあるとコピーできない。開発者ツールの console にはこういうエラーが出る。

Uncaught (in promise) DOMException: Document is not focused.

 JavaScript で document にフォーカスすることはできなさそう (それはそうで、それができてしまうとこの制限の意味がない)。画面内をクリックしてからブックマークレットを実行しないといけないのか、不便で困った、と思いきや、ブックマークレットを連続で 2回実行すると成功することに気付く。これは Chrome でも Firefox でもそういう感じだった。
 面白いことに、ブックマークをクリックすると document にフォーカスされるっぽい……。なので、 2回ブックマークレットをクリックすることを念頭に使えば、どういう場合でもコピーに成功する。 document.hasFocus() - Web API | MDN で document にフォーカスがあるか調べられる。

f:id:hogashi:20210930014938p:plain
最初はアドレスバーにフォーカスを置いていた / ブックマークレットを実行するとエラーが出て、 document にフォーカスされた

 さらによく考えると、ユーザがブックマークをクリックして document がフォーカスされた後にコピーしたらいいので、 WindowOrWorkerGlobalScope.setTimeout() - Web API | MDN でちょっとだけ待ってあげると、 document にフォーカスがある状態でコピーできて成功する。素朴。

const value = 'これをコピーしたい';
setTimeout(() => navigator.clipboard.writeText(value), 100);

 文書内のボタンとかでコピーするようなときは何も気にせず使えて便利だけど、ブックマークレットだとちょっと難しい、しかしブラウザの挙動の感じで偶然セーフ、という感じで面白かった。