録画してなくて見てなかったけど、プライムビデオで見れた。6話ぐらいまで見たけど地味におもしろい。
最近の日常系のやつはちょっと雰囲気が変わってきてて、悪役ではないが良いとはいえない癖があると同時に高徳というキャラが多い。
ちょっと調べたら『未確認で進行形』と作者が同じだ……
未確認で進行形 Blu-ray BOX cho45
録画してなくて見てなかったけど、プライムビデオで見れた。6話ぐらいまで見たけど地味におもしろい。
最近の日常系のやつはちょっと雰囲気が変わってきてて、悪役ではないが良いとはいえない癖があると同時に高徳というキャラが多い。
ちょっと調べたら『未確認で進行形』と作者が同じだ……
未確認で進行形 Blu-ray BOX cho45
全部感想を書いていくのも大変なので、放映からn日以内に見ている、みたいな感じで書いたらどうか
今期のアニメだと
なし
(ほぼ常に未試聴マークがないぐらい)
(未試聴マークが溜まらない程度)
(気が向いたときに見る)
文書校正ツールみたいなのを入れたいが、普段はてな記法で書いているので、対応させるのが面倒くさい。それと、コードとか、引用とかを無視したいとか思うわけだけど、かなり面倒くさい。そして、そういうのを対応しない限り、校正ツールのエラーが消えなくてかなり鬱陶しいので使う気が起きない。
以下のような挙動をする。
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.
value プロパティ代入動作 (Getter) は raw value の代入として働き、取得動作 (Setter) は API value の取得して働くという非対称的な挙動を示す。そして raw 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++);
},
});
}
gist に以下の命名規則でファイルを作ります
そして gist の URL をコピーして、このページで実行させます。
空関数呼び出しも含め、50msごとにそれぞれのコードをできるだけ実行します。これを1フェーズとして、100回実行します。なので、終わるまで対象テストケース×5秒かかります。
コードは対応するHTMLをロードした iframe 内で実行されます。これは文字列から iframe.contentWindow.Function のインスタンスを作ることで実現しています。
Gist から API 経由でデータをとってきていますが、Github の API は Rate limit がキツいです。
一応、localStorage にキャッシュを持っており、gist 側を更新しない限りは 304 を返してもらうようにしています。304 の場合はAPIアクセスしてもカウントされません。
これでも、gist を更新してベンチマークを繰替えすと意味がないので、Personal Access Token による上限拡大も雑に実装してあります。
jsperf.com が動いていなくて不便ですね。不便すぎるので5年前ぐらいに自分で書いたコードをひっぱりだしてきて、書きなおしたという感じです。
jsperf と比べ、結果を集約したりする機能はありませんが、クライアントサイドのみで動くので気楽なツールです。
通称のページロードにそれほど時間がかからなくても、XHRでは異常な時間がかかることが良くある。
考えられる原因があまり思いつかない。アップロード帯域を絞られすぎている? XHRではペイロードが大きくなるケースが多くてそう感じる?
Bose QuietComfort 35 wireless headphones ワイヤレスノイズキャンセリングヘッドホン ブラック cho45
QuietComfort 35 (Bluetooth 対応の QC) が発表されたりしていますが、自分のところの QuietComfort 15 はまだまだ現役で使えそうです。イヤーパッドを変えたりして4年半ほど使っています。
ただ、一度断線して修理した関係で、ケーブルが絶妙な長さになっており、ヘッドフォンとスマフォを接続した状態で、スマフォをズボンのポケットに入れられないという事態になっていました。この状態で1〜2年ぐらい使ってましたが、ちょっと考えて Bluetooth 化しました。
Blueooth 化といっても、レシーバを買って、ヘッドフォンのバンド部分にうまいことくくりつけるだけです。レシーバは上記のものを買いました。
バンドへの固定は結束バンドでやっています。ケーブルの余りを適当に処理して接続すれば完成です。
結果的にこれはとても良かったです。QCを使うのはほぼ通勤時だけですが、ケーブルがあったときは、電車などで他人にひっかからないように結構気を使っていました。この気苦労が消滅するだけで大変快適です。
ただし、電池が二重管理になるのが嫌なところです。QC15 は単4電池1本ですがエネループを使っています、Bluetooth レシーバは内蔵リチウムイオン電池を micro USB 端子経由で充電するタイプです。
最高すぎて見まくってるわけですが「やっぱ劇場と違って迫力がないな〜」という感じでした。しかし、ちょっと試したらヘッドフォンで 5.1ch を再現する DTS Headphone:X が思いのほか良かったです。
フツーの家庭だとスピーカーで迫力を求めるのは無理なのでヘッドフォンが最大クオリティになると思います。
このソフトだとデフォルトだと 5.1ch で再生されますが、これをヘッドフォンで聞くと、かなりあっさりしてしまいます。これはとりあえず音声設定で 2ch ステレオを選択してみると音量バランスはマシにはなります。
ただ、これでもものたりなさがかなりあります。
ガルパン Blu-ray は 5.1ch の DTS Headphone:X に対応していて、そっちにしたほうが圧倒的に良いことに気付きました。一瞬設定がどこにあるのか謎ですが ch 切替えではなく「音声特典」のメニューのほうにあります。
PS4 は 5.1ch の DTS Headphone:X には対応しているようで、特に何もせずとも HDMI 経由のテレビのヘッドフォン端子から出せました。
そんな効果ないだろと思って試してみましたが、期待よりかなり良くてびっくりしたのでオススメです。
こんな感じで、Google Photo 上で場所が推定されて表示されるようになっていることに気付きました。
メニューマークをクリックすると明示的に削除もできます。また「撮影場所(推定)」についてのヘルプにリンクがあって以下のように書かれています。
「撮影場所(推定)」とはどのようなものですか?
Google フォトでは、ご利用の Google アカウントに保存されている Google ロケーション履歴などの情報をもとに、撮影場所を推定することがあります。
「ロケーション履歴など」と書いてありますが、ロケーション履歴以外はなんでしょうね。被写体認識も入ってるんですかね。自分は常時ロケーション履歴を有効にしているので、ロケーション履歴がない場合の推定状況については調べられませんでした。
「これどこで撮ったかな〜」と思いつつロケーション履歴を辿るほどでもないなということは多々あったので結構嬉しい気がします。
ガルパン良かったので良い夢見れそうだなと思って寝たが、結局悪夢であった。同僚に罵倒されまくる夢だった。
体調不良とかで結構有給使っている気がしていたが、まだ一昨年の有給を消費していた。しかしジリジリと減ってる気がする……
見始めたのが最近だったので、もはやブルーレイも出てるというのに…という感じだけど、立川シネマシティで爆音上映というのを見てきた。
特に爆音のを見たかったわけじゃないけど、そもそも他の映画館の上演はのきなみ終わってたのでここしかなかった。が、結果的には爆音とても良かった。低音だけ爆音になってるみたいで、そんなに違和感なく見れた。
内容的には最高だった……
で結局ブルーレイ版を買ってしまった。
生活にとても支障があるとは言えないが、ここ2年ぐらいで急激に遠くが見えにくくなってきたので、どうしても気になっていた。
「いきなり見えなくなってきた」と思うパターン、大学1年生のときに一度あり、眼科いってみたら「全然問題ない」と塩対応されたり、去年も健康診断で0.2ぐらいの判定になって眼科にいったが「矯正するほどではない」となったりで結局矯正してなかったが、今年の健康診断だと両目0.5ぐらいで、やっぱ気になるので一度矯正してみることにした。
店舗で度数測った結果、両眼 -0.25 と、実際問題としてはほとんど度は入ってない。加えて左目だけ乱視矯正がさらに入ってる。これでもかけてみると全然違くて、1080p→4K ぐらいの感覚はある……
かなり弱い矯正なので疲れるなら今後かけないかもしれない。
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 はタブがバックグラウンドにいった場合などに呼ばれる頻度がとても落ちることがあるので、本来のイベントも受けて保険としています。そして「やっぱ高頻度じゃなくてもいいや」となっても該当部分をコメントアウトするだけですみます。
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 で予行練習をすることにしました。
各ディストリビューションごとにパッケージが提供されているので、これを使ってみます。トップページに最近のリリースファイルがいっぱい列挙されていますが、これは無視して 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 で手元に転送しておきます。
先にいくつかハマったポイントを列挙しておきます
「仮想マシン設定ウィンドウ」→「ストレージ」で、「コントローラ: 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 に変えました。
このあとパーティションのフォーマット・ディスクコピーなどがあります。
コピーが終わったあと
これでインストールが終わり、シェルが開くので、
ディスクまわりの変更は Virtual Box だから必要なので、さくらのVPS間の復元では必要ないはず…
/etc/init/failsafe.conf を編集しといたほうがいい
Waiting for network configuration… Waiting up to 60more seconds for network configuration…
で2分も待たされて大変うざい。
sudo すると Password 入力がはじまる前にハングする。が、実際はハングしてないので3分ぐらい待てば起動する。
hostname があってないとハングするらしい。どうしよもないのでリカバリモードにでやるか、/etc/hosts に 127.0.0.1 hostname を追加する。
リファレンスマニュアル閲覧用の 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 を使っている前提で
Apple Developer Center にいくと、Membership Details に Team ID という項目がある。
あるいはコードサイン用に Key Chain に自分用の証明書を入れていると思うが、その証明書名の括弧の中の文字列がチームIDとなっている。
<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 をつけて実行する。
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>
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 の処理を自動でやってくれるみたいだが、なんとなく自動的にやるのが信用ならないのでこれはつかってない。
使ったツールのバージョン
デバッグのため、とりあえず証明書なしでサンドボックスを有効にしたい場合、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 は一致さえしていればなんでもいい(と思うが試してはいない)
環境変数 DEBUG を設定すると詳細なログがでるようになる。DEBUG='electron-osx-sign' これは debug という npm パッケージを使っているため。
リファラを眺めていると Qiita:Team らしきものが稀にあるけど、https 強制にしてないのかな。もちろんアクセスしても404なので実害はほぼないと思うけど、URL にユーザIDが入っているので場合によっては誰が言及しているかはわかることがある。
と思ったけどリファラがそもそも https だった。Referrer Policy で意図的に送ってるのかな。なんの意図かは謎だけど
今年から数えで30ということで検便、腹部超音波、胃バリウムが増えた。まだ30じゃないつもりだったので心構えができてなかくてめんくらった。
これらのうち胃バリウムはやらなかった。胃腸炎で調子がよくないのがあるが、問診の話だと胃内視鏡の隔年実施になるかもよとのこと。バリウムよりも内視鏡のほうが良いので、さっさとそうなってほしい。
はぁ〜〜〜 不愉快だな〜ー〜〜〜〜ー〜 なんで不愉快なことばかり起こるのか
わかりやすい神道の歴史 cho45
そういえば、この本を昨年の11月〜12月ぐらいに読んだんだけど、日記に書いてなかった。書いた覚えがあるんだけどな…… これを読んでさらに調べた結果 500 Can't connect to lowreal.net:443 (certificate verify failed) というエントリを書いた気がする。もともと古代人の神道感はどうだったのか?が気になって買ったが、これに答えはなかった (というよりも、現代では分かりようがないということがわかった) 神道の歴史と仏教は切り離せないし、神道の歴史と政治的な(具体的には天皇統治の)歴史も切り離せない。
近代以降の話はあまり興味がなくて、結構飛ばして読んだ覚えがある。
神社には生前偉業を成した人を祭っているところがあるが、現代人として自然対人間のような構造を持って見るとこれは不思議に思えることがある。実際には人間も自然の一部であると考えると不思議ではない。古代でも現代でも「すごい!」と思えるものは「神」と呼ばれている。大神神社の本殿が山そのものであったりすることからも感じられるけど、神道では人間はあくまで自然の(自動的な)仕組みの一部であることが当然のこととしてあるように感じる。
とにかく無限に下痢。
日記(ブログ)内のカテゴリを自動抽出して設定したい。いわゆるクラスタリングだと思うが、うまくできる方法がよくわからない。
動機としては「カテゴリ」とか「タグ」を設定するのが面倒なので、自動的にトピックを解析して「タグ」として抽出したい。既に TF-IDF は出しているので、上位を使えばよさそうな感じではあるが、IDF の対象が自分のエントリだけなので、一般的な「特徴語」とは違った結果になっている。
機械的にやるよりも例えば「電子工作」なら「Raspberry Pi」「電子工作」「回路」とかを含む全てのエントリを適当に検索して出せばいいだけかもしれない。かなりヒューリスティックなので自分にとっては「新しい発見」はないが、検索流入の場合は狙った似たトピックに辿りつきやすいかもしれない。
宗教とは結局のところ人生の規範を作るためのフレームワークといえよう。各宗教のことは良くしらないので怒られそうだけど、主観的には以下のような印象を持つ
なんにせよ「人生の規範」というのがある。規範なしでただ生きているという状態にはなりえない。
人間もまた自然の一部であり、心のありかたもまた自然である。自分の心をあるがままにしておくというのは自然で、制御しようというのは自然との戦いとなるが、一方戦いを行おうというのも自然のありかたである。
これは単にバランスの問題であって、どちらか一方に偏ってはいけない。「あるがまま」に成長はない。「自然との戦い」は消耗戦で、最終的には負け戦になる。