2017-10-20

Ubuntu 17.10にアップグレードした

Ubuntu 17.10がリリースされた。

ArtfulAardvark/ReleaseNotes - Ubuntu Wiki

今回のリリースでは、デスクトップ環境がUnityからGnomeに変わった。同時に、X.orgではなくWaylandに変わっている。

このため、Ubuntuのデスクトップ環境の使用感がだいぶ変わっている。まず、GnomeはUnity風の操作感を再現するために、やや手が入っている。具体的にはSuper+数字でランチャーに登録されているソフトウエアのウインドウを選択できたりする。

残念なことに、Global MenuやHUDは再現されていなかった。

Waylandに移行したので、日本語入力環境が大変不便になった。fcitxはWaylandに対応していないので使えない。使えないが、そのことは警告されないので、fcitxを使っているUbuntu 17.04からアップグレードすると、日本語が入力できなくなる。iBusに切り替える必要がある。iBusはキーボードレイアウトとかな漢字変換機能を持つIMEをごちゃまぜにしているので本当に使いづらい。しかも、変換候補のウインドウが、カーソル位置ではなく画面左上に出る。極めてつらい。

私は事前に調べているからいいものの、これは何も知らない人がアップグレードしたら日本語入力ができずに詰みそうだ。

特に興味深いパッケージのバージョンという点では、Linuxカーネルが4.13に、GCCが7.2.0に、Clangが4.0.1.6に、Neovimが0.2.0になった。

GCCとClangのバージョンが上がったので、これでfilesystemなどの一部のライブラリを除いて、どちらもC++17をある程度実装したコンパイラーになった。

ただし、現在libc++にはxlocale.hをincludeするという不具合がある。xlocale.hは標準のヘッダーではなくglibcの内部ヘッダーであり、しかもそのコメントには、"This file is not standardized, don't rely on it, it can go away without warning"と書いてある。

sourceware.org Git - glibc.git/commit

libc++がなぜxlocale.hをincludeしているのか全くわからない。実装を読んだが、単にincludeしているだけだ。なので、とりあえず空のxlocale.hファイルを作り、そのファイルへのディレクトリーを-Iで追加して対処した。

また、メインでは使っていないDellのLatitude E7470でUbuntuがうまく動かない問題は、Ubuntu 17.10でも解決しなかった。まずアップグレードが途中で失敗する。

DellのLatitude E7470でUbuntuがうまく動かない問題は、未だに原因がわからない。以下のような問題がある。

Live環境のブートが遅い。ログを見ると、pwconvが/etc/shadow-のパーミッションを0600に変更しようとしてエラーを出し、パッケージリストを読み込むのに時間を要し、regenerating SSL certificatesでまた時間を要する。放置しても絶対に進まず、キーボードを適当にワシャワシャ叩くと進む。まるで/dev/randomへのエントロピーが十分にたまるまで待っているかのような挙動をする。

初回ログイン時に数回画面が暗転する。

突然フリーズする。マウスカーソルは動くがそれ以外の操作を何も受け付けない。ttyの変更すらできない。文字入力をしているときにフリーズしやすい気がする。

cat /dev/urandomが何故か目視できるほど遅い。urandomなのに遅い。

grub-updateが遅い。

apt upgradeしたときの"procescing triggers for man-db"が遅い。

なので実用にならないのだが、一応維持している。Ubuntuの欠陥なのかDell Latitudeの欠陥なのか、個体の欠陥なのかわからないが、私は個体の欠陥だと思っている。しかし、memtest86+は何の問題もなく何パスも通るので、メモリではなさそうだ。また、ストレージへの読み書きも遅いわけではない。単純なベンチマークやストレステストで問題が見つからないのでよくわからない。

2017-10-19

江添ボドゲ会 10月22日

10月22日に以下の通り、自宅でボドゲ会を行います。

江添ボドゲ会 10月22日 - connpass

2017-10-16

GitHubで他人のプルリクエストに対しコンフリクト解消や追加の修正を行いつつマージする方法

読者がGitHubで何かを公開しているとしよう。そのレポジトリに対して他人がプルリクエストを送ってきた。なかなか良さそうな変更だ。早速マージしたい。

しかし、残念なことにそのプルリクをそのままマージすることができない。なぜならば、

  • コンフリクトを起こしている
  • 追加の修正が必要だ

こういう場合、大規模なプロジェクトや、PR主が職場の同僚や開発仲間であった場合、PR主に修正を依頼するものだ。しかし、個人的な小規模なプロジェクトなのでPR主はPRを出したまま返事がない。

こういう場合に、PRをマージするにはどうすればいいのか。答えは簡単で、プルリクエストが裏でやっているgit操作を自分のローカルでやればいいのだ。

まず、該当のPRのGitHub上のページの、「プルリクエストをマージ」ボタンの横に、コマンドライン操作を表示(view command line instructions)というリンクがあるはずだ。これをクリックすると、プルリクエストに相当する作業を、ローカルのコマンドでやる方法が表示される。その指示に従うだけでよい。

ローカルのコマンドでやる方法は、以下のような意味になっている。

# ローカルで新しくブランチを作る
git checkout -b example master
# 新ブランチにPR先の変更を入れる
git pull git://example.com example

# 必要に応じてローカルでコンフリクト解消と編集をしてコミット

# masterブランチに切り替え
git checkout master
# masterブランチにマージ
git merge --no-ff example
# 結果をGitHubレポジトリにpush
git push origin master

マージ操作の後はexampleブランチはいらないのでgit branch -d exampleで消してよい。

これによって、PRをマージしたという歴史は正しくgitレポジトリに反映される。GitHubのプルリクエストの方は何もする必要はない。自動的にマージされた扱いになっている。

GitHubのWebページ上でプルリクエストをマージするボタンを押すというのは、このgit操作をGitHubがリモートレポジトリ上でやってくれているだけの話だ。

プルリク、プルリクエスト、PR, Pull Request、GitHubに特有の複数人のgit操作を楽にするための概念だ。PRは面倒で複雑なgit操作をユーザーから隠している。しかし、こういう問題が発生した時、裏で行われているgit操作を知らない場合、途方に暮れてしまう。その結果、masterにマージしてから追加の編集を行うとか、手作業で同様の編集をするなどといった日付zipと何ら変わらない運用が行われてしまうこともある。

この記事はできるだけ簡潔に解説する目的で書いた。git強者な読者であれば、gitには同じ操作をもっと強力にやる方法が用意されているなど、俺のお気に入りのgitフロントエンドや拡張ツールを使えばもっと強力な操作が行えるなどと、言いたいことは様々あるかもしれないが、これは初心者用の解説だ。

2017-10-13

C++17の参考書を書き上げた

C++17の新機能のほぼすべてを解説した参考書を書き上げた。

GitHub: EzoeRyou/cpp17book: textbook for C++17

GitHub Pages: C++の新機能

この参考書は、後ほどアスキードワンゴから出版される予定になっている。

内容としては2017年に制定された新しい標準規格、C++17に追加された新しいコア言語と標準ライブラリのほぼすべてを解説した内容になっている。

C++17には数学関数も追加されていて、これの執筆には読者から多大な貢献を得た。

C++17の新機能: 数学の特殊関数群

この本はGPLv3でライセンスされ、紙書籍での出版も、GPLv3で行うことを予定している。

さて、C++17はすでに規格制定され、C++20まではまだ少し時間がある。この暇に、今まで得たC++の知識を使って本を書くべきだと思ったので、次も本を書くことに注力したい。今考えているのはC++の入門書だ。

入門書という分野について、私にはあまり好ましい印象がない。世の中のいわゆる入門書をめくると、なにやらSI屋がよろこぶようなエクセル方眼紙エビデンスよろしくスクリーンショットをベタベタと貼り付けて、無駄に紙面を50ページも100ページも使い、結局何を説明しているかというと、Microsoftの不自由なVisual Studioのインストール方法だけを説明していたりする。完全に訳がわからない。私の書く入門書はそのような本にはしない。

そもそも、今C++の入門書を必要とする人間は、一体どういう環境にあるのだろう。

この2017年にC++入門者の筆頭に上がるのは競技プログラマーだ。彼らは大抵のオンラインジャッジシステムでサポートしていてパフォーマンスが出て必要なアルゴリズムを書き起こせる言語であるC++を使う。興味深いことに、彼らはC++にある素晴らしい機能の筆頭に、next_permutationという標準ライブラリの存在を挙げる。next_permutationを実務で使う状況というのはまれにしか起こらないと思うのだが、不思議なことだ。

既存の自由ソフトウェアに貢献したいが、そのソフトウェアがC++で書かれている場合、これはC++を学ぶ必要がある。そういう人もいるだろう。

仕事でC++を書く必要が出てきて学ぶという人もいるだろう。C++が使われる仕事として一番わかり易いのは、不自由なゲーム専用機などの組み込み機器だと思われる。

すでにC言語は知っているが、C++を学びたいという人。15年前ならばそういう人はいくらでもいたが、果たしてこの2017年にいるのだろうか。ただ、例えばLinuxカーネルの開発に参加したい場合、これはC言語を学ぶしかない。カーネル開発者は未だにC言語が必要なので学び、C++を知らないが学びたいという人は多いのかもしれない。

これを考えると、次に書くべきC++入門書は、プログラミング入門書である必要はない。対象読者はすでに別の言語でプログラミングの基礎にある程度触れていることを想定して書いてもよいはずだ。つまり、環境構築や、変数とは箱のようなものであるといった比喩表現はいらない。

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2017-10-08

オーストラリア警察が世界最大の児童ポルノサイトを11ヶ月運営していたことが判明

VG exposed the largest child sexual abuse forum. It was run by the police.

ノルウェイのタブロイド紙のヴェルデンス・ガング(VG)は、Tor経由でアクセスできるいわゆるダークウェブの中で世界最大の児童ポルノサイトであるChilds Playは、オーストラリア警察によって運営されていたことをつきとめた。この顛末は倫理的にも技術的にも興味深い。

この児童ポルノサイトは、当時ダークウェブの児童ポルノサイトの中でも世界最大級の規模を持っていた。各国の警察は様々な捜査の上、このサイトを運営していた二人の逮捕に至った。そして、Webサイトは、各国警察相談の上、おとり捜査が合法な国、オーストラリア警察、アルゴスの手に委ねられた。アルゴスはWebサイトのホスティングをオーストラリアのレンタルホスティングサービス、Digital Pacificに移し、そこでWebサイトの運営を続けた。

児童ポルノサイトの運営者を逮捕した後、警察がWebサイトを運営し続けておとり捜査に使うというのはよくあることだ。VGのまとめによれば、すでに以下のWebサイトが警察によって運営されていたことが知られているという。

  • Elysium: ドイツ、BKAにより数日アクセスされた
  • Playpen: USA, FBIにより2週間運営
  • The Giftbox Exchange: EUにより約1ヶ月運営
  • The Love Zone: オーストラリア、アルゴスにより6ヶ月運営

今回、オーストラリアの警察組織アルゴスによって、当時世界最大だった児童ポルノサイトのChilds Playは11ヶ月運営された。

児童ポルノサイトをおとり捜査のために運営することは様々な倫理上の問題を引き起こすが、今回の例はさらに倫理上の疑問点がある。Childs Playの運営者は頻繁にフォーラムにあらわれていた他に、一ヶ月ごとに必ず新作の児童ポルノを提供していたのだった。運営者が逮捕されたことを利用者にさとられないよう、オーストラリア警察の捜査官は運営者の語彙を使い、書き言葉をまねてフォーラムへの書き込みを続けていたが、ついに次の新作児童ポルノを投稿しなければならない時期にきた。そこで、オーストラリア警察はすでに押収していたそのWebサイトにはない児童ポルノを投稿して運営を継続した。

これはおとり捜査が違法で、法律の記述は、単に潜入捜査員の身を守るために本来ならば犯罪になる行為(麻薬の購入や違法な武器の受け渡し、競馬競輪競艇オートレースのノミ屋の脚)をすることができると定めているもので、おとり捜査を許可したものではない日本に住む筆者の倫理観では理解ができない。

結局、一定の割合で児童ポルノを求める人間がいるのであれば、児童ポルノサイトを運営し続ければ犯罪を摘発をし続けることができるわけだ。犯罪の摘発はオーストラリア警察にとって評価対象だ。すると、児童ポルノは評価を生み出す装置となり、継続して運営するインセンティブが生じる。今回、11ヶ月の長きに渡り押収した児童ポルノサイトの運営を警察が続けたのは、このようなインセンティブのせいだろう。ましてや押収した児童ポルノサイトにはなかった児童ポルノをよそから持ってきてオーストラリア警察が公開しているというのは、もはやオーストラリア警察が犯罪を行っているのと同じではないか。オーストラリアの法ではおとり捜査が認められているのでオーストラリア警察の行為はオーストラリア国内では違法ではないということになるのだが。

さて、倫理面についてはこのぐらいにして、技術面に移る。

ノルウェイのタブロイド紙であるVGはChils Playがオーストラリア警察の手によって運営されていることを突き止めたのだが、これは至って合法的な方法で行われた。

オーストラリア警察アルゴスは、WebサイトのホスティングをオーストラリアのレンタルホスティングサービスのDigital Pacificに移した。しかし、WebサイトへのアクセスはTor経由でなければ行えないため、物理サーバーのIPアドレスはわからない。VGは当初、フォーラムの投稿から運営元を突き止めようとしたが、Webサイトの利用者の一部は簡単に特定できたものの、元運営者は注意深かく、運営を引き継いだオーストラリア警察も注意深かったので、身元はわからなかった。

そこでVGは、もっと古典的な方法で物理サーバーのIPアドレスを調べることにした。

Webサイトの実装のほとんどは注意深くTor経由で行われていたが、うっかり物理サーバーから直接アクセスしている箇所があったのだ。

Webサイトはユーザーがアカウントのプロフィール画像を設定できるようにしていたが、この設定では、URLを指定することができた。URLから画像をダウンロードするのはTorを経由せず、物理サーバーが直接行ってしまっていた。

これによってVGはDigital PacificのIPアドレスであることを突き止めたが、まだここで終わりではない。Digital Pacificがホストしているサーバーは単なるプロクシー、VPN、あるいはTor exit nodeかもしれないからだ。

そこでVGはDigital PacificのサーバーがVPNではなくWebサイトを直接ホストしているかどうかを判定するために、いわゆるサイドチャネル攻撃を行った。Digital Pacificのサーバーをレンタルし、プロファイル画像のURLをそのサーバーに向けるようにしたのだ。そして、サーバー間のラウンドトリップ時間を計測した。Digital Pacificが単なる中継サーバーならば、ラウンドトリップ時間は同一データセンター内よりはるかに長いはずだ。こうして同一データセンター内で処理が行われていると思しき短いラウンドトリップ時間を確認した。

そしてもう一つ、サーバー間のMTUとパケット分割を計測することで、同一のローカルエリア・ネットワークに存在する可能性が高いことを確認した。

追記:Digital Pacificの該当のIPアドレスをレンタルしているのがオーストラリア警察であるとどうやって判明したかも、VGの元記事に書いてある。VGの記者はシドニーにあるDigital Pacificに直接取材をした。Digital Pacificの創業者であるAndrew KoloadinはVGの説明を聞き、誰にリースしているのかを調査したところ、オーストラリア警察に行き着いた。

「このようなものを我々のサーバーに保持することは契約に反する。警察は我々に事前に相談するべきであった。しかし、そうはしない理由はわかる。秘密捜査とやらだろう」 「貴社のサーバーに警察が性的犯罪物を置くことについてどう思われますか?」
「犯罪者は頭がよく、警察をかわすシステムの設置方法に精通していた。なので、警察も同じぐらい頭が良くなければならないし、実際そのようだ。しかし、警察が我々の及び知らないところでこういうことをやっているのは気に入らない。」

そして、VG記者は次の日にオーストラリア警察に取材を申し込み、二人の捜査官と喫茶店で話をすることになる。

この件は倫理と技術の両方の点で面白い事件だった。筆者はおとり捜査には反対の立場だ。理由は、児童ポルノサイトが存在すれば、そこにアクセスする人間が一定の割合で存在する。するとおとり捜査を続ければ続けるほど、検挙ができるということになる。検挙は成果でありインセンティブとなる。おとり捜査を続ければ続けるほど成果が出るのであれば、インセンティブに従って、おとり捜査は発覚するまで永久に続けるべきであるということになる。結果として今回のオーストラリア警察による児童ポルノサイトの運営は11ヶ月も続けられた。これではミイラ取りがミイラになったようなものだ。しかし、警察のおとり捜査によって児童ポルノサイトが存在しなければ、そのような犯罪は本来発生しなかったはずだ。

このようなインセンティブの問題のため、おとり捜査は違法となるべきだ。

2017-10-05

VS CodeがDOMによるターミナル実装のパフォーマンスを改善できなかったためCanvasに変更

Integrated Terminal Performance Improvements

Electronという史上まれに見るそびえ立つクソのようなGUIプラットフォーム上で実装されているVS Codeが、ターミナルの実装をDOMによるものからCanvasによるものに変更したそうだ。これは、DOMによる実装ではパフォーマンスの改善が十分にできなかったからだという。

DOMでターミナルを実装する際の問題ごととして、テキスト選択、テキストアライメント、GC、パフォーマンスを上げている。

テキスト選択:ターミナルのテキスト選択を実現するためにDOMのテキスト選択の挙動をだいぶ上書きしなければならない。

テキストアライメント:一部の文字はモノスペースになってくれず、workaroundとして一文字ごとに固定長のspanで包む必要があるが、これはパフォーマンス上よろしくない。

GC:DOMでターミナルを実装するためにメチャクチャなことをするのでGCによってパフォーマンスが劣化する。オブジェクトをプールすることでなるべくDOMを使いまわしGCを低減する泥臭いハックをしたが、限界がある

パフォーマンス:色々と頑張ったが、結局パフォーマンスは悪かった。

そして結局、要素を組み合わせてレイアウトを決定するという処理だけで16.6ms以上かかる場合もあり、60fpsを達成できないので、ターミナルをDOMで実装するのは不向きだという結論に達したそうだ。

フルHDのデスクトップ画面をキャプチャしてH.264などにエンコード、デコードすることをリアルタイムで行えるほどコンピューターが高速化したこの2017年にターミナルを60FPSで実装するのに苦労しているのはすさまじい。

やはりElectronは悪い文明 粉砕する!