今年から数えで30ということで検便、腹部超音波、胃バリウムが増えた。まだ30じゃないつもりだったので心構えができてなかくてめんくらった。

これらのうち胃バリウムはやらなかった。胃腸炎で調子がよくないのがあるが、問診の話だと胃内視鏡の隔年実施になるかもよとのこと。バリウムよりも内視鏡のほうが良いので、さっさとそうなってほしい。

リファレンスマニュアル閲覧用の Chemr だけど、ベースの Electron を1.2.1にバージョンアップした。

しかし codesign するとあいかわらずフリーズするので改めて調べてみたら Console.app に以下のようなログがでていた。

 sandboxd[131]: ([19968]) Chemr Helper(19968) deny mach-lookup org.chromium.Chromium.rohitfork.19966
 sandboxd[131]: ([19973]) Chemr Helper(19973) deny mach-lookup org.chromium.Chromium.rohitfork.19966
 sandboxd[131]: ([19974]) Chemr Helper(19974) deny mach-lookup org.chromium.Chromium.rohitfork.19966

ググってみると Electron broken on OS X in Apple Sandboxed apps (App Store) · Issue #3871 · electron/electron · GitHub あたりの問題のようだ。

Sign Your App のentitlements あたりに変更が必要になった模様。

長いので結論だけ書くと以下のようにすればなおった。electron-packager を使っている前提で

Team ID を取得する

Apple Developer Center にいくと、Membership Details に Team ID という項目がある。

あるいはコードサイン用に Key Chain に自分用の証明書を入れていると思うが、その証明書名の括弧の中の文字列がチームIDとなっている。

追加の Info.plist を作る

<plist version="1.0">
<dict>
	<key>ElectronTeamID</key>
	<string>$TEAM_ID$</string>
</dict>
</plist>

こんな感じで Info.plist を作っておく、不完全なファイルに見えるが、残りは electron-packager が埋めるのでこれで良い。

こうした上で electron-packager に --extend-info=dev/Info.plist をつけて実行する。

entitlements ファイルの更新

parent.plist を以下のようにする。com.apple.security.network.client は今回の件とは関係なく、Chemr に必要なのでつけているだけで、必須ではない。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.application-groups</key>
    <string>$TEAM_ID$.net.lowreal.Chemr</string>
  </dict>
</plist>

child.plist は以下のようにする

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.inherit</key>
    <true/>
  </dict>
</plist>

codesign

electron-packager にも codesign のオプションはあるが、使ってない。electron-osx-sign を直接呼びだしている。

./node_modules/.bin/electron-osx-sign --no-pre-auto-entitlements --version=1.2.0 "$APP_PATH" --entitlements=dev/parent.plist --entitlements-inherit=dev/child.plist --identity="$APP_KEY"

こんな感じで、上記 entitlements ファイルを指定して codesign させる。

なお electron-osx-sign の 0.4.0-beta4 以上だとこの entitlements の処理を自動でやってくれるみたいだが、なんとなく自動的にやるのが信用ならないのでこれはつかってない。

備考

使ったツールのバージョン

  • "electron-osx-sign": "^0.4.0-beta4"
  • "electron-prebuilt": "1.2.1"
  • "electron-packager": "^7.0.3"
  • electron-packager に渡す --version の値: 1.2.1 (新しいものじゃないと ElectronTeamID に対応してないので注意)

証明書なしでサンドボックスアプリとして実行したい

デバッグのため、とりあえず証明書なしでサンドボックスを有効にしたい場合、ad-hoc signing でも動かすことができた。これは identity に - を指定することでできる。

すなわち

./node_modules/.bin/electron-osx-sign --no-pre-auto-entitlements --platform=mas --version=1.2.0 "$APP_PATH" --entitlements=dev/parent.plist --entitlements-inherit=dev/child.plist --identity="-"

のようにする。おそらく Team ID は一致さえしていればなんでもいい(と思うが試してはいない)

備考 electron-osx-sign を verbose にする

環境変数 DEBUG を設定すると詳細なログがでるようになる。DEBUG='electron-osx-sign' これは debug という npm パッケージを使っているため。

  1. トップ
  2. tech
  3. codesign した Electron アプリがフリーズするのを修正

リファラを眺めていると Qiita:Team らしきものが稀にあるけど、https 強制にしてないのかな。もちろんアクセスしても404なので実害はほぼないと思うけど、URL にユーザIDが入っているので場合によっては誰が言及しているかはわかることがある。

と思ったけどリファラがそもそも https だった。Referrer Policy で意図的に送ってるのかな。なんの意図かは謎だけど

video/audio 要素には再生時間が変わったときに timeupdate イベントが発生します。これは Chrome においては最頻でも 250ms ごとにしか呼ばれません (500ms のときもある)。

もっと頻度をあげてイベントをとりたいと思うことがあったので以下のようにしました。

video.addEventListener('loadedmetadata', function (e) {
	var time = video.currentTime;
	requestAnimationFrame(function me () {
		if (time !== video.currentTime) {
			time = video.currentTime;
			video.dispatchEvent(new CustomEvent("timeupdate"));
		}
		requestAnimationFrame(me);
	});
});

video.addEventListener('timeupdate', function (e) {
	console.log(video.currentTime);
});

requestAnimationFrame で定期的に currentTime を監視して timeupdate を自力で発火させるアプローチです。

元の timeupdate イベントも一応受けとっています。というのも requestAnimationFrame はタブがバックグラウンドにいった場合などに呼ばれる頻度がとても落ちることがあるので、本来のイベントも受けて保険としています。そして「やっぱ高頻度じゃなくてもいいや」となっても該当部分をコメントアウトするだけですみます。

  1. トップ
  2. tech
  3. video/audio 要素の timeupdate イベントを高頻度にする

Ubuntu 16.04 LTS にしようと思ったが、前バージョンのLTS (14.04) から上げるには 16.04.1 (本リリースから3ヶ月後にリリース) を待たないといけないらしい。

リリーススケジュールによると7月21日にリリース予定。まだちょっと早かった。

do-release-upgrade に引数を指定すれば入れれることは入れれるみたいですが、地雷を踏みたくないためにLTSを使ってるのでそういうことはしません。

現在は Ubuntu 12.04 を使っております。12.04 にするときは 10.04 のサポートが終わってからやるというひどさでしたが、さすがにダメだろうということで最近早めのアップデートを考えてます。

ただ、ディストリビューションアップデートが不安なので Virtual Box で予行練習をすることにしました。

VPS 環境を Mondo Rescue でバックアップ

Mondo Rescue のインストール

各ディストリビューションごとにパッケージが提供されているので、これを使ってみます。トップページに最近のリリースファイルがいっぱい列挙されていますが、これは無視して Downloads ページに行き、ftp サーバを直接見ます。

該当するディトリビューション・バージョンのftpディレクトリを開いて、必要ファイルをダウンロードします。Ubuntu の場合、sources.list が提供されているようなので、これを使います。

wget ftp://ftp.mondorescue.org/ubuntu/12.04/mondorescue.sources.list
sudo mv mondorescue.sources.list /etc/apt/sources.list.d/
sudo apt-get update
sudo apt-get install mindi mindi-busybox mondo

これでインストールできました。なお mindi とはブータブルディスク作成用の Linux mini-distribution とのこと。mondo はミュータントタートルズ由来みたいなことが書いてありますがよくわからず。

バックアップの実行

バックアップしたのち、ローカルに転送して捨てるので、/tmp/backup へバックアップファイルを保存することとします

mkdir /tmp/backup
sudo mondoarchive -O -i -N -d /tmp/backup -s 30g

-O バックアップを作成
-i ISOイメージとする
-N 全てのネットワークファイルシステムを無視する
-d バックアップの保存先を /tmp/backup に
-s 30g バックアップファイルの分割単位を30GBに(実質分割しない)

/tmp 以下はデフォルトで非バックアップ対象なので、-E オプションはつけていません。なお -d の指定ディレクトリは前もって作っておく必要があります。

手元の環境だと約1時間かかりました。(バックアップ対象約8GB メモリ1GB HDD 出力 mondorescue-1.iso 3.3G)

このファイルを scp で手元に転送しておきます。

Virtual Box に環境を復元してみる

先にいくつかハマったポイントを列挙しておきます

  • パーティション番号の最大が4までなので5を使っているとエラる
  • F12 を押すと終了するので注意
  • mkinitrd コマンドが存在しなくて再生成できなかった。が起動した。
    • Ubuntu は mkinitramfs らしい
    • mkinitramfs というか update-initramfs -u が一番簡単っぽい
  • インストール直後にネットワークインターフェイスの設定をやること
    • /etc/network/interfaces を編集
  • /etc/hosts に hostname に関するエントリを追加しておくこと (後述)

手順

Virtual Box 上で「新規仮想マシン」

  • 「Linux」「Ubuntu (64bit)」 で「仮想ハードディスクを作成する」で「作成」
  • 仮想ハードディスクはバックアップしたファイルが納まるなら任意
    • ファイルコピーなのでパーティションサイズをあわせる必要はない
仮想マシン設定

「仮想マシン設定ウィンドウ」→「ストレージ」で、「コントローラ: IDE」にある光学ドライブに mondorescue-1.iso を指定

「ネットワーク」で「ブリッジアダプター」にしておく。ホストコンピュータと同じLANに参加するようになる。

起動

nuke か interactive で起動します。違う環境への復元なので nuke でも結局 interactive になります。

さくらのVPSでは /dev/vda1 (ext4) と/dev/vda5 (swap) ですが、Virtual Box だと /dev/sda なので、mountlist を適当に編集します。/dev/sda1 と /dev/sda2 に変えました。

このあとパーティションのフォーマット・ディスクコピーなどがあります。

コピーが終わったあと

  • 「Initialize boot loader?」→ YES
  • 「You will now be able to re-generate your initrd.」→ YES
    • chroot / された状態でシェルが開くなので cd /boot にいって initramfs
    • 今回はやらなかった
  • 「Did you change the mountlist or cloned the system?」→ YES
  • 「Boot device」を /dev/sda に
  • 「You will now edit fstab, mtab, device.map and menu.lst/grub.cfg in order to fix grub install」と言われて nano が起動するので vda を検索 (C-w) して置換していく
    • fstab が UUID ベースで書かれていたのを /dev/sda1 と /dev/sda2 に

これでインストールが終わり、シェルが開くので、

  • /etc/network/interfaces を編集
  • /etc/hosts に hostname に関するエントリがあることを確認。ないなら増やしとく

ディスクまわりの変更は Virtual Box だから必要なので、さくらのVPS間の復元では必要ないはず…

Ubuntu のネットワークまわり

/etc/init/failsafe.conf を編集しといたほうがいい

Waiting for network configuration…
Waiting up to 60more seconds for network configuration…

で2分も待たされて大変うざい。

sudo するとハングする

sudo すると Password 入力がはじまる前にハングする。が、実際はハングしてないので3分ぐらい待てば起動する。

hostname があってないとハングするらしい。どうしよもないのでリカバリモードにでやるか、/etc/hosts に 127.0.0.1 hostname を追加する。

  1. トップ
  2. tech
  3. さくらのVPSを Mondo Rescue でバックアップして Virtual Box に再現

見始めたのが最近だったので、もはやブルーレイも出てるというのに…という感じだけど、立川シネマシティで爆音上映というのを見てきた。

特に爆音のを見たかったわけじゃないけど、そもそも他の映画館の上演はのきなみ終わってたのでここしかなかった。が、結果的には爆音とても良かった。低音だけ爆音になってるみたいで、そんなに違和感なく見れた。

内容的には最高だった……

ガールズ&パンツァー 劇場版 (特装限定版) [Blu-ray] - 渕上舞

渕上舞

5.0 / 5.0

で結局ブルーレイ版を買ってしまった。

生活にとても支障があるとは言えないが、ここ2年ぐらいで急激に遠くが見えにくくなってきたので、どうしても気になっていた。

「いきなり見えなくなってきた」と思うパターン、大学1年生のときに一度あり、眼科いってみたら「全然問題ない」と塩対応されたり、去年も健康診断で0.2ぐらいの判定になって眼科にいったが「矯正するほどではない」となったりで結局矯正してなかったが、今年の健康診断だと両目0.5ぐらいで、やっぱ気になるので一度矯正してみることにした。

店舗で度数測った結果、両眼 -0.25 と、実際問題としてはほとんど度は入ってない。加えて左目だけ乱視矯正がさらに入ってる。これでもかけてみると全然違くて、1080p→4K ぐらいの感覚はある……

かなり弱い矯正なので疲れるなら今後かけないかもしれない。

ガルパン良かったので良い夢見れそうだなと思って寝たが、結局悪夢であった。同僚に罵倒されまくる夢だった。

体調不良とかで結構有給使っている気がしていたが、まだ一昨年の有給を消費していた。しかしジリジリと減ってる気がする……

Bose QuietComfort 35 wireless headphones ワイヤレスノイズキャンセリングヘッドホン ブラック - BOSE(ボーズ)

BOSE(ボーズ)

5.0 / 5.0

QuietComfort 35 (Bluetooth 対応の QC) が発表されたりしていますが、自分のところの QuietComfort 15 はまだまだ現役で使えそうです。イヤーパッドを変えたりして4年半ほど使っています。

ただ、一度断線して修理した関係で、ケーブルが絶妙な長さになっており、ヘッドフォンとスマフォを接続した状態で、スマフォをズボンのポケットに入れられないという事態になっていました。この状態で1〜2年ぐらい使ってましたが、ちょっと考えて Bluetooth 化しました。

QC15 の Bluetooth 化

 -

5.0 / 5.0

Blueooth 化といっても、レシーバを買って、ヘッドフォンのバンド部分にうまいことくくりつけるだけです。レシーバは上記のものを買いました。

バンドへの固定は結束バンドでやっています。ケーブルの余りを適当に処理して接続すれば完成です。

感想

結果的にこれはとても良かったです。QCを使うのはほぼ通勤時だけですが、ケーブルがあったときは、電車などで他人にひっかからないように結構気を使っていました。この気苦労が消滅するだけで大変快適です。

ただし、電池が二重管理になるのが嫌なところです。QC15 は単4電池1本ですがエネループを使っています、Bluetooth レシーバは内蔵リチウムイオン電池を micro USB 端子経由で充電するタイプです。

ガールズ&パンツァー 劇場版 (特装限定版) [Blu-ray] - 渕上舞

渕上舞

5.0 / 5.0

最高すぎて見まくってるわけですが「やっぱ劇場と違って迫力がないな〜」という感じでした。しかし、ちょっと試したらヘッドフォンで 5.1ch を再現する DTS Headphone:X が思いのほか良かったです。

音響設定

フツーの家庭だとスピーカーで迫力を求めるのは無理なのでヘッドフォンが最大クオリティになると思います。

このソフトだとデフォルトだと 5.1ch で再生されますが、これをヘッドフォンで聞くと、かなりあっさりしてしまいます。これはとりあえず音声設定で 2ch ステレオを選択してみると音量バランスはマシにはなります。

ただ、これでもものたりなさがかなりあります。

5.1ch DTS Headphone:X

ガルパン Blu-ray は 5.1ch の DTS Headphone:X に対応していて、そっちにしたほうが圧倒的に良いことに気付きました。一瞬設定がどこにあるのか謎ですが ch 切替えではなく「音声特典」のメニューのほうにあります。

PS4 は 5.1ch の DTS Headphone:X には対応しているようで、特に何もせずとも HDMI 経由のテレビのヘッドフォン端子から出せました。

そんな効果ないだろと思って試してみましたが、期待よりかなり良くてびっくりしたのでオススメです。

こんな感じで、Google Photo 上で場所が推定されて表示されるようになっていることに気付きました。

メニューマークをクリックすると明示的に削除もできます。また「撮影場所(推定)」についてのヘルプにリンクがあって以下のように書かれています。

「撮影場所(推定)」とはどのようなものですか?

Google フォトでは、ご利用の Google アカウントに保存されている Google ロケーション履歴などの情報をもとに、撮影場所を推定することがあります。

「ロケーション履歴など」と書いてありますが、ロケーション履歴以外はなんでしょうね。被写体認識も入ってるんですかね。自分は常時ロケーション履歴を有効にしているので、ロケーション履歴がない場合の推定状況については調べられませんでした。

「これどこで撮ったかな〜」と思いつつロケーション履歴を辿るほどでもないなということは多々あったので結構嬉しい気がします。

  1. トップ
  2. tech
  3. Google Photo が自動的に場所を推定して表示するようになった

デモ

使いかた

gist に以下の命名規則でファイルを作ります

  • *.js にベンチマーク対象コード
  • *.js の拡張子をhtml に書いたものに実行するページのHTML
    • または common.html に共通の HTML

そして gist の URL をコピーして、このページで実行させます。

挙動

空関数呼び出しも含め、50msごとにそれぞれのコードをできるだけ実行します。これを1フェーズとして、100回実行します。なので、終わるまで対象テストケース×5秒かかります。

コードは対応するHTMLをロードした iframe 内で実行されます。これは文字列から iframe.contentWindow.Function のインスタンスを作ることで実現しています。

Rate limit 対策

Gist から API 経由でデータをとってきていますが、Github の API は Rate limit がキツいです。

一応、localStorage にキャッシュを持っており、gist 側を更新しない限りは 304 を返してもらうようにしています。304 の場合はAPIアクセスしてもカウントされません。

これでも、gist を更新してベンチマークを繰替えすと意味がないので、Personal Access Token による上限拡大も雑に実装してあります。

経緯

jsperf.com が動いていなくて不便ですね。不便すぎるので5年前ぐらいに自分で書いたコードをひっぱりだしてきて、書きなおしたという感じです。

jsperf と比べ、結果を集約したりする機能はありませんが、クライアントサイドのみで動くので気楽なツールです。

  1. トップ
  2. tech
  3. Gist に置いた JavaScript のベンチマークをとる

通称のページロードにそれほど時間がかからなくても、XHRでは異常な時間がかかることが良くある。

考えられる原因があまり思いつかない。アップロード帯域を絞られすぎている? XHRではペイロードが大きくなるケースが多くてそう感じる?

以下のような挙動をする。

var textarea = document.createElement('textarea');
textarea.value = "\r\n";
encodeURIComponent(textarea.value);
//=> "%0A"

この挙動、現在のブラウザではバグではなくて、仕様である。どういうことかというと、HTML Standard で明言されている

For historical reasons, the element's value is normalised in three different ways for three different purposes. The raw value is the value as it was originally set. It is not normalized. The API value is the value used in the value IDL attribute. It is normalised so that line breaks use U+000A LINE FEED (LF) characters. Finally, there is the value, as used in form submission and other processing models in this specification. It is normalised so that line breaks use U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pairs, and in addition, if necessary given the element's wrap attribute, additional line breaks are inserted to wrap the text at the given width.

https://html.spec.whatwg.org/multipage/forms.html#concept-textarea-api-value

value プロパティ代入動作 (Getter) は raw value の代入として働き、取得動作 (Setter) は API value の取得して働くという非対称的な挙動を示す。そして raw value を取得する方法はない。

  1. トップ
  2. tech
  3. textarea.value は代入すると値が変わる

他人が承認される様子を見せ付けられるのは大変つらいので、そういうもの一切を遠ざけたい。

たとえ見てしまっても「無視する」のがベストだが、今のところそれはかなり難しく感じる。何かを思っても、それに伴なう行動をしないということはなんとかできることが多いが、そもそも自動的に嫌な気分になることは止めることができない。


他人が承認されているのを見ると、つまりそれは他人が客観的に評価されているという場面になるわけだけど、自動的に「では自分は客観的にどう評価できるか」と考えてしまい、そして自分は自分自身の客観的評価は著しく低い (というか端的にいえばバカにされている〜バカだと思われている、と思っている) ので、自動的に嫌な気分が発生する。

良い気分というのは、自分から探さないと絶対に沸いてこない。悪い気分というのは常にあって、さらにこれは自動的に強化される。

SQLite で「PRIMARY KEY」を《真のプライマリキー》とするには | tech - 氾濫原 の続きです。

以下のような簡単なベンチマークスクリプトを使って差を測ってみました。

Linux の VPS と OS X とでやってみましたが、だいたいこの例では5%ぐらいの差がつくようでした。

#!/usr/bin/env perl


use v5.14;
use utf8;


use DBI;
use DBD::SQLite;
use Benchmark qw(:all) ;
use String::Random qw(random_regex random_string);


sub dbh {
	my ($db) = @_;
	my $dbh = DBI->connect('dbi:SQLite:dbname=', "", "", {
		sqlite_allow_multiple_statements => 1,
		RaiseError => 1,
		sqlite_see_if_its_a_number => 1,
		sqlite_unicode => 1,
	});
}


say "DBI::VERSION: $DBI::VERSION";
say "DBD::SQLite::VERSION: $DBD::SQLite::VERSION";
say "SQLite version: ". dbh()->{sqlite_version};


my $dbh_rowid = dbh();
$dbh_rowid->do(q{
	CREATE TABLE tfidf (
		`id` INTEGER PRIMARY KEY,
		`term` TEXT NOT NULL,
		`entry_id` INTEGER NOT NULL,
		`term_count` INTEGER NOT NULL DEFAULT 0,
		`tfidf` FLOAT NOT NULL DEFAULT 0,
		`tfidf_n` FLOAT NOT NULL DEFAULT 0
	);
	CREATE UNIQUE INDEX index_tf_term ON tfidf (`term`, `entry_id`);
	CREATE INDEX index_tf_entry_id_tfidf_n ON tfidf (`entry_id`, `tfidf_n`);
});


my $dbh_without_rowid = dbh();
$dbh_without_rowid->do(q{
	CREATE TABLE tfidf (
		`term` TEXT NOT NULL,
		`entry_id` INTEGER NOT NULL,
		`term_count` INTEGER NOT NULL DEFAULT 0,
		`tfidf` FLOAT NOT NULL DEFAULT 0,
		`tfidf_n` FLOAT NOT NULL DEFAULT 0,
		PRIMARY KEY (`term`, `entry_id`)
	) WITHOUT ROWID;
	CREATE INDEX index_tf_entry_id_tfidf_n ON tfidf (`entry_id`, `tfidf_n`);
});




say "insert";
{
	my $i = 0;
	cmpthese(-1, {
		'with rowid' => sub {
			$dbh_rowid->prepare_cached(q{
				INSERT INTO tfidf (`term`, `entry_id`, `term_count`) VALUES (?, ?, ?);
			})->execute(random_regex('[a-z]{2,10}'), $i++, 1);
		},
		'without rowid' => sub {
			$dbh_without_rowid->prepare_cached(q{
				INSERT INTO tfidf (`term`, `entry_id`, `term_count`) VALUES (?, ?, ?);
			})->execute(random_regex('[a-z]{2,10}'), $i++, 1);
		},
	});
};


say "select";
{
	my $i = 0;
	cmpthese(-1, {
		'with rowid' => sub {
			$dbh_rowid->selectall_arrayref(q{
				SELECT * FROM tfidf WHERE `term` = ? AND `entry_id` = ?
			}, { Slice => {} }, random_regex('[a-z]{2,10}'), $i++);
		},
		'without rowid' => sub {
			$dbh_without_rowid->selectall_arrayref(q{
				SELECT * FROM tfidf WHERE `term` = ? AND `entry_id` = ?
			}, { Slice => {} }, random_regex('[a-z]{2,10}'), $i++);
		},
	});
}
  1. トップ
  2. tech
  3. SQLite の WITHOUT ROWID の効果測定

録画してなくて見てなかったけど、プライムビデオで見れた。6話ぐらいまで見たけど地味におもしろい。

最近の日常系のやつはちょっと雰囲気が変わってきてて、悪役ではないが良いとはいえない癖があると同時に高徳というキャラが多い。

ちょっと調べたら『未確認で進行形』と作者が同じだ……

未確認で進行形 Blu-ray BOX - 照井春佳

照井春佳

5.0 / 5.0

全部感想を書いていくのも大変なので、放映からn日以内に見ている、みたいな感じで書いたらどうか

今期のアニメだと

リアルタイム

なし

放映当日〜翌日

(ほぼ常に未試聴マークがないぐらい)

  • Re:ゼロから始める異世界生活
  • ネトゲの嫁は女の子じゃないと思った?
  • 甲鉄城のカバネリ

一週間以内

(未試聴マークが溜まらない程度)

  • ふらいんぐうぃっち
  • 田中くんはいつもけだるげ
  • くまみこ
  • 坂本ですが?

それ以上

(気が向いたときに見る)

  • 学戦都市アスタリスク 2nd SEASON
  • あんハピ♪
  • クロムクロ
  • マクロスΔ
  • ジョジョの奇妙な冒険 ダイヤモンドは砕けない
  • ばくおん!!

文書校正ツールみたいなのを入れたいが、普段はてな記法で書いているので、対応させるのが面倒くさい。それと、コードとか、引用とかを無視したいとか思うわけだけど、かなり面倒くさい。そして、そういうのを対応しない限り、校正ツールのエラーが消えなくてかなり鬱陶しいので使う気が起きない。

電車通勤がつらい。何がつらいかといえば、とにかく臭い。他の人が平然としているのは鼻が腐っているからなのか。息ができなくて苦しい状態が多くて、寿命を縮めている実感がある。健康で文化的な生活とはなんなのか

さくらのVPSはリージョンが3地点から選べるようになっている。これはDR (ディザスタリカバリ=災害復旧) 的な観点からのもので、1台だけ借りるなら、基本的にはどれでもいい。

ただし、施設のナウさでいくと

  1. 石狩
  2. 東京
  3. 大阪

となるようなので、リージョンごとに新機能の導入時期が変わったりする。ホストサーバのCPUの世代が違ったりもするみたいだけど、ガチャ要素なのでここではその話はしない。

VPSを契約しようとするとデフォルトで石狩が選択される通り、さくらインターネット的には石狩オシのように見える。

ただ、国内の通信で考えると石狩はちょっと遠いので、気になるのは遅延になる。

物理的に超えられない壁

情報伝送は光速度を超えることができない。

典型的な光ファイバーである石英ガラスの場合、屈折率は1.5程度。物質中の光速度 は、真空中の光速度 と屈折率 )から、 で求められる。

例えば、新宿・石狩間の直線距離約840kmで考えると、片道(840 km) / (c / 1.5) = 4.2029076 ミリ秒は物理的に超えられない遅延となる。RTT で考えれば 8.4ms を超えることは決してできないことになる。実際はケーブルが直線でひかれているわけではないので、これにさらに増える。

光ケーブルではなく電線の場合、導体中の速度は周囲の空間をすすむ電磁波のスピードと同じ (導体内ではなく) なので一概に言えないが真空中の光速度の6〜9割程度の速度になる。なお同軸ケーブルの場合波形短縮率という形で速度が示される。

いずれにせよ、情報伝送速度は真空中の光速度よりも「結構遅い」し、割と ms 単位はかかるという認識がいる。

実際のRTT

ちなみに、東京・石狩間のRTTはさくらインターネットの公式では平均「18msec」と書いてあるので光速度とかから計算しなくてもよろしい。

で、結局どこがいい

個人のVPSだと石狩のメリットは一切ない (個人の見解) ので、僕は新しい契約から東京リージョンにすることにしました。(今は大阪)

  1. トップ
  2. tech
  3. さくらのVPS、大阪・東京・石狩でどれを選ぶべきか

出初めたぐらいに「これ、どうでもいい個人サイトとかもやりだしたらうざいだろうな」と思っていたけど、最近まさにそういう状態になっている。当然サービスワーカーもインストールされてる。ほとんどの場合サイトにアクセスしたときに勝手に出る。

たまたまうっかり見たサイトが「通知の表示」を求めてくるのは「お前おれのこと好きなんだろ」みたいな態度で心底気持ちが悪く、通知については明示的に許可がなければできないけど、サービスワーカーは自動的にインストールされるので、(別にそういう機能はないが) ストーカーっぽくてマジで気持ちが悪い。

特に前段階なしに通知の許可を求めるみたいなの、いったいどういうつもりなのか…… お前は「はじめまして〜」とか言った直後に「僕に興味があるんですよね? つまり好きってことですよね? 付き合いましょうよ〜」とか言う人間なのか。せめて「フィードを登録」みたいなノリで「通知をうけとる」ボタンにでもして、そこでようやく許可を得るのがマトモなコミュニケーション能力ではないのか。


ブラウザでデフォルトブロックに設定変えときゃいいだろ、みたいな話ではなくて、そういう気持ち悪いことしている自覚あるんですか、という話です。

  1. トップ
  2. tech
  3. 「通知の表示」の許可を求めてくるサイトが増えてうざい件

100均グッズを使ってデスクの天板裏でケーブルの整理 | tech - 氾濫原 について質問をいただきましたので、現状を以下の通り説明いたします。デスク裏に100均のワイヤーラティスをなんとかしてくくりつけてテーブルタップをくくりつける話です。

上記エントリでは両面テープで止めるタイプのフックを使って固定していましたが、重さに耐えきれず落ちてしまいました。したがって冒頭の写真は古いのですが、ちょっと写真をとる機会がないので現状がわかりにくいです。

現状はC型クランプ4つを使って固定しています。このことは前にも書いたことがあるのですが、写真がなくてわかりにくかったので以下のように図を書きました。

「ハリ」は元々デスクについている補強用の鉄骨で、そこにワイヤーラティスをクランプを使って固定しています。このようにしてからは一度も落下したことはありません。

余談:SVGの画像をオンラインで描く

http://editor.method.ac/ を使って書いてみました。Inkscape のウェブ版があれば最高なんですが、とりあえず簡単な図は十分書けるし、慣れた操作感で使いやすいです。Shift で比を固定したりスナップさせたりもできます。

インターネットってやつが便利で、グーグルってところに「花かんむり」っていれると作りかたがでてくる。

  1. トップ
  2. photo
  3. 花かんむり

スリープ復帰時にどうやってもモニタが付かず、モニタの電源を入れなおしたり、ケーブルを繋ぎなおしたりということをしてみた。しかし、どうしてもダメで、ハードリセットをかけた。

DELLのモニタは、バグっておかしくなることはちょいちょいあることだが、電源を入れなおしたりしてもダメだったのは初めてなので、出力側に以上がある?という検討をなんとなくつけた。が、まぁリセットすれば直るだろうという意図だった。

そうするとどうも、何度リセットしてもBIOSの起動画面すら出なくなった。モニタは一瞬起動して、即スタンバイになるような挙動をしていた。主電源を落としてしばらく待ったりしてもダメだった。別のモニタに繋いでもダメなので、モニタの異常ではないという切り分けをした。

そのため、マザーボードまわりの不具合を想定しはじめた。あんまりやりたくはなかったが CMOS クリアを行なった。が、これでもダメで、完全に手詰り感がでてきた。

マザーボード上に2ケタの7セグLEDで起動状況がわかるようになっているのだが、BIOS セットアップ用のキーを押しっぱにすると 99 (スーパーIOの初期化中)、そうではない場合 51 (メモリエラー) となっていた。ここらでマザーボードの故障を疑いはじめ、げんなりしてきた。

故障修理の手続きをやるまえに、まだできることはないかと考えた結果、さらにもう一台別のモニタで検証しようということになった。中華産の低解像度だがHDMI接続のモニタと、短いHDMIケーブルを接続してみたところ、起動シーケンスが表示された。つまりここでようやく、マザー側は問題ないことがわかった。

さすがにここまで検証していた2台のモニタがどちらも壊れているとは考えにくいので、ようやくケーブルを疑い、今まで使っていたケーブルを中華モニタに接続したところ、表示は出るが、コネクタを揺らすと接触不良っぽい挙動をすることがわかった。この中華液晶は自動スタンバイのような気のきいた機能がないため、挙動がわかりやすい。

その後、HDMIケーブルをちょっと動かしてみたりしてひとまずなおった。ただし別途HDMIケーブルを注文して、今のやつは捨てる予定。

トラブルシューティングに時間のかかった原因

最初モニタを疑った段階で、ケーブルの脱着があったため、このタイミングで微妙に接触が悪い状態になったようだ。コネクタは奥まで入っていたので、このとき接触不良まで考えられていなかった。

2台のモニタどちらでもダメだったのが、判断を難しくさせた。このときケーブルは同じものを使っており、コネクタもちゃんと挿せていることまでは確認していたが、そのうえでの接触不良まで疑えていなかった。抜き差しは何度もしてみているので、余計疑っていなかった。

マザーボードのステータスLEDは、正常時の挙動を把握しておらず、99 と 51 が出ることは正常であることを認識できていなかった。99 はBIOSセットアップ画面中にも出るようで、51 はなぜか正常起動でもそういう表示になる。

十分に長いHDMI ケーブルがなぜか手元にそれ1本しかなく、ケーブルを取り替えて検証するのがめんどうだったため、無意識に原因として考慮するのを後回ししてしまった。

対策

  • 接続ケーブルは常に複数本持つこと
  • 「ステータスLED」みたいなものは正常時の挙動を前もって把握すること

オフィスにいるとだんだん体調が悪くなる。15時ぐらいからだんだんひどくなってくる。熱があるかはわからないが(たぶんない)、全身倦怠感がひどい。

おれもマインドフルネスするぞ!

認証アプリなどと違って数字を覚えることなしに、ロック解除とダイアログの「はい」を押すだけでよくなるっぽい。

ロックがかかっている端末でも、前もってロックを解除した状態でログインしようとすると、改めてロックコードの確認を求められる。なので、一見「はい」を押すだけでかと思いきや、必ずロック解除を挟む。

確認コードの数字は時間制限があるので、微妙にストレスがかかって嫌な感じでしたが、これはよさそうです。

  1. トップ
  2. tech
  3. Google の新しい2段階認証「Google からのメッセージ」

man pmset して理解した内容を記録しておく。これが正確かは実際の挙動をちゃんと確認してないのでアレだけど、man 読んでないだろみたいなのよりはマシなはず…

Mac のスリープの種類

  • ディスプレイスリープ
  • スリープ
  • セーフスリープ
  • ディープスリープ

「ディスプレイスリープ」は画面の表示だけ消えている状態。ディスプレイのバックライトが消えて他のスリープと似た状態となるのでスリープの一種としたが、CPUはスリープしない。

「スリープ」はメモリへ電力供給したままCPUをスリープさせている状態。

「セーフスリープ」は「スリープ」と似ているが、来たるディープスリープに向けてメモリ内容を書き出した状態。この状態だと急に主電源消失してもディープスリープからの復帰と同じになるので、作業が失われないという意味でセーフ。復帰はメモリからなので早いが、書き出しがあるのでそこが遅い。

「ディープスリープ」はメモリ内容をファイルシステムに書き出して、コンピュータの全ての電源を切る。次回電源オン時は、ブートプロセスでこのファイルの所在を確認してロードする。コンピュータ全体として消費電力がゼロになる。

メモリ内容を書き出すかどうか、そのタイミングはいつかあたりがポイントになる。メモリ内容を書き出したり、読み戻したりするスリープは、メモリが増えるほど時間がかかることになる。(SSD の場合これによって寿命が縮まることを気にする人もいる)

pmset -g で見れる値との関係

pmset でパワーマネジメントまわりの変数を見ることができる。MacBook Pro で実行すると以下のようになった。

$ pmset -g
System-wide power settings:
 SleepDisabled          0
 DestroyFVKeyOnStandby          0
Active Profiles:
Battery Power           1
AC Power                -1*
Currently in use:
 standbydelay         10800
 standby              1
 womp                 1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             1
 gpuswitch            2
 networkoversleep     0
 disksleep            10
 sleep                0 (sleep prevented by iTunes, coreaudiod)
 autopoweroffdelay    14400
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1 

「ディスプレイスリープ」はdisplaysleepの値(単位は分)経過後に起こる。

各スリープは sleep の値(単位は分)経過後に起こる。このとき

  • hibernatemode = 0 なら「スリープ」
  • hibernatemode = 3 なら即座に「セーフスリープ」
  • hibernatemode = 25 なら即座に「ディープスリープ」

となる。

ただし「スリープ」や「セーフスリープ」に入っていても、standby = 1 の場合、standbydelay の値(単位は秒)経過後にメモリメージが書き出され「ディープスリープ」に移行する。また autopoweroff = 1 な場合も autopoweroffdelay の値(単位は秒)経過後にメモリイメージが書き出され「ディープスリープ」に移行する。standby との違いがわかりにくいが、standby はバッテリー駆動時の話で、autopoweroff は AC 接続時の話になっている。ErP Lot6 (待機電力基準) 準拠のため、autopoweroff があとから機能として追加されたという感じになっている。

ハイバネーションイメージを作りたくない場合

スリープ入りが遅くてうざい場合

ラップトップだと必ずセーフスリープする関係で、閉じたり開いたりを繰替えした場合になかなか起きてこなくてイラ立つことがある。この場合は常時セーフスリープに入るのがうざいケースなので、hibernatemode だけ 0 にすれば良さそう。

sudo pmset -a hibernatemode 0 

standbydelay / autopoweroffdelay 経過後のスリープはこの意図だと特段無効にする意味はないと思う。

とにかく絶対書き出したくない場合

ハイバネーションイメージからの復帰がそもそも遅いから嫌という場合とか、SSD が痛むのが気になる場合はとにかく無効にするしかない。消費電力が増えるのと、万が一バッテリー切れになった場合は作業内容が失われるのがデメリット。

To disable hibernation images completely, ensure hibernatemode standby and autopoweroff are all set to 0.

と書いてあるので、その通りにする。

以下のようにすると、全ての状況(バッテリだろうがAC駆動だろうがUPS起動だろうが) イメージ書きだしが無効になる。

sudo pmset -a hibernatemode 0 standby 0 autopoweroff 0

ref.

  1. トップ
  2. tech
  3. OS X のスリープの傾向と対策

こうなってて、バージョン 1151 をインストールするから再起動しろとなっているけど、再起動しても何も起きず普通に起動してインストールされてない。

Windows クソいなと思うこと多々あるけど、組込みの自動アップデートがうまく動かないとか、やっぱクソだと思う。

もしかすると、この表示でもまだダウンロードが終わっていないとか? なんにせよさっぱり情報がなくて「詳細」をクリックしても「再起動が必要」としか書かれていないので、どうしようもない。これは「失敗」しているわけではなくて、そもそもインストールが行われている形跡がない。なんで Windows はいちいちこんな目にあわせられるのか…… つらすぎる。ログがどこに出てるのかもわからんし (ログとかあるの?)

ヘルプもクソ

それでさ、ググると更新プログラムのインストールに関する問題のトラブルシューティング というのがでてくる。で「その情報は新しい場所に移動しました」って書いてあるからクリックするじゃん? そうすると Access denied とか言われんの。なんなのか

時間を置いたら見れた。けど結局解決できそうな内容ではなかった。意味がない…

Windows Update はいつマトモになるのか

前のPCのWindows Update もちょいちょいおかしくて、失敗してインストールされなかったりしていたけど、Windows7からのアップグレードだったからおかしいのかと思っていた。

今回、クリーンインストール直後でもこのありさまなので、Windows Update って基本的にダメなんだなということを認識した。

しばらく放置してから「今すぐ再起動」をしたらインストールが走った。やっぱダウンロード中だったんだろうか。そうならそうと表示がおかしいんだけど、よくわからない……

もうダメだ。

それはともかく、ここ数週間のやる気のなさがひどい、まるっきり趣味のコードも書いていないし、仕事の進捗もおそろしいぐらいにない。たびたびこういうことがあってどうしようもない。どうすればいいんだ。

  • ストップザワールド!
  • コンカレントマークアンドスイープ!
  • ジェネレーショナルガベージコレクト!
  • レイジースウィープ!
  • コンパクション!

2016 Q2 には (すなわち6月中には) アップグレードするという話だったのですが、どうやら遅延しているようです。以下はフィリピン版の ZenTalk のスレです。

There has been some changes in the upgrade timeline [ source], they have changed the initial timeline to "from 2nd quarter of 2016" (April onwards). We apologize for any delays that may occur on the update rollout for the following ASUS ZenFone models:

  • PadFone S (PF500KL)
  • ZenFone 2 Laser 6-inch (ZE601KL)
  • ZenFone Selfie (ZD551KL)
  • ZenFone 2 5.5-inch (ZE550ML, ZE551ML)
  • ZenFone 2 Deluxe (ZE551ML)
  • ZenFone 2 Deluxe Special Edition (ZE551ML)
  • ZenFone Zoom (ZX551ML)


The Android M (6.0) upgrade has arrived for these ZenFone models:

  • ZenFone 2 Laser 5-inch (ZE500KL)
  • ZenFone 2 Laser 5.5-inch/5.5 S (ZE550KL)
  • ZenFone Max (ZC550KL)
http://www.asus.com/zentalk/thread-55985-1-1.html

どこが最新の情報なのかよくわかりませんが、このトピックは6/27に更新されていて Sticky にも設定されているので、たぶんこれは最新の情報なのでしょう。一部モデルについてはリリース済みですが、他のモデルは遅延するみたいです。ここで "they have changed..." と言ってますが、これを投稿しているのはフィリピンの担当者のようなので、たぶん they というのはアップグレード担当部門のことを言っていると思われます (違う?)


Global 版 ZenTalk だと特別新規のアナウンスはなくて、27/06/2016 . no Android M. というスレで約束は守られるのかとちょっと燃えてます。というのも、元々アップグレードプランのスレの文言は以下のようなものでした。

The following ASUS ZenFone models will receive the Android M (6.0) upgrade in Q2 of 2016

http://www.asus.com/zentalk/thread-68552-1-1.html

これが

The following ASUS ZenFone models will receive the Android M (6.0) upgrade starting from Q2 of 2016:

http://www.asus.com/zentalk/thread-68552-1-1.html

と変わっており (フォーラムのタイムスタンプを見ると 2016/6/28 04:59)、Q2 以降という内容に変わっています。フィリピン版のスレの冒頭はこの文言変更についての言及のようです。

遅延自体はともかく、アナウンスするのに元スレッド書き変えというのはいただけないと思います。普通に考えると新規にスレ立ててアナウンスすべきでしょう。フィリピン版は担当者の裁量?で一応まともなアナウンスが出てるので、Global 版もそのようにしてほしい感じがします。


ここ半月ぐらい毎日アップグレードの確認をしてきましたが、どうも無駄だったみたいなので残念です。いつになるんでしょうね。

  1. トップ
  2. tech
  3. ASUS ZenFone 2 の Android M (6.0) アップグレードは遅延

PC関係だとよく VRM (Voltage Regulator Module) フェーズ数という用語にでくわす。マザーボードやグラフィックボードのレビューを見ると「電源は6+1フェーズ」とかと書いてある。特に説明もないので意味不明である。

結論

先に結論を書くと、フェーズ数は多ければ多いほど良いというものではない。それに電源回路の良し悪しはフェーズ数で決まるわけではない。そういうものなので、こういう表記を見ても無視して良い。

マルチフェーズ同期整流

フェーズ数を理解するためには、マルチフェーズ同期整流について理解しないといけない。そもそもここでいう「電源回路」は定電圧 DC/DCコンバータのことで、外部供給の12VをCPUにあうように低電圧(そして大電流)に変換することを言っている。

同期整流はローサイド(負荷に対してマイナス側)もハイサイド(同じくプラス側)もFETでスイッチすることによって高効率に整流を行うことをいう。このとき、スイッチングによって出力にリプルが発生する。そこで、ハイサイドFET・ローサイドFETのスイッチのセットを複数に増やして、それぞれのスイッチを少しずつ位相(フェーズ)をずらして整流させることで、よりリプルが少なく安定した定電圧電源とすることができる。

つまり「VRM フェーズ数」の「フェーズ」とは「位相」のことになる。1フェーズにつき少なくともFET 2つと、スイッチングコントローラ回路が1つと必要になる。(ただしフェーズが増えてなくてもFETのペアの数をフェーズとしてカウントする間違った宗派もあるっぽい)

基本的にはフェーズ数が多いほうが高級とされている。部品点数が増えるので価格が高くなる。フェーズ数が多いことの利点としては

  • 電源供給が安定する
  • FET 1つあたりの電流を減らせる
    • 発熱が分散するので放熱しやすい
    • 部品の高さを抑えられる

欠点は

  • 部品点数が多いので
    • 価格が高くなる
    • 故障率が上がる
  • スイッチング損が増え、効率が下がる (特に低電流時)

回路まわりは、これが図ありでわかりやすい

6+1 とか 8+2 って表記は何なの?

マルチフェーズ同期整流についてわかっても、この表記は意味不明。

結論からいうと前の数字がCPU(GPU)コア用の電源のフェーズ数 (大電力) で、後と数字はCPU(GPU)のコア以外用のフェーズ数のようだが、この表記を誰が決めて使ってるのかさっぱりわからない。(ソースを探したけどわからなかった)

フェーズ数以外のVRMの要素

  • FETの数や性能
    • 具体的にはオン抵抗、並列にすれば減らせるが部品は増える
  • 同期整流コントローラの性能
    • 負荷追従性など
  • PWM 周波数
    • 高いほどコイルが小さくでき負荷追従性が上がるが、FETでのスイッチング損失が増えて効率が下がる。ノイズにも関係ある。
  • コイルの性能 (Q値)
    • コイルの直流抵抗値が低いほど低損失だが部品が大きくなる
    • コアの材質でも損失が出る
  • コンデンサの性能
    • ESR (等価直流抵抗) が低いほど負荷追従性が高く、リプルが減る

ちょっと考えただけでもいろいろ要素がありすぎるので、フェーズ数だけで何かを判断することはできない。

所感

最近のマザーボードは重要な機能はチップセットに殆ど統合されたしまったので、表面にほとんど部品が載ってない。そうすると見た目的にインパクトがあるのが電源回路だけになる。

マルチフェーズにするとFETとコイルが並んでかっこいいので、マルチフェーズがもてはやされるみたいなところがありそう。インターフェイス (M2 とか PCI-E とか) が進化しても、マザーボードの見た目的にはインパクトがないんで、電源を盛るみたいなことだと思う。

  1. トップ
  2. tech
  3. 電源 VRM フェーズ数ってなんなのか

エンジニアの年収がナントカみたいな記事が胸糞悪いので、出てくるエンジニアが担当している全てのサーバが同時に落ちればいいのに。

結局、ああいう劣等感を煽るようなものに付随するなにもかもというのは気にするに値しないはずだけど、劣等感は自動的に反応するので、ここでは攻撃的になるという形で消費しておく