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

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

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

未確認で進行形 Blu-ray BOX -

5.0 / 5.0

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

今期のアニメだと

リアルタイム

なし

放映当日〜翌日

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

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

一週間以内

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

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

それ以上

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

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

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

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

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 の効果測定

デモ

使いかた

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ではペイロードが大きくなるケースが多くてそう感じる?