自分にはホントに仲間というものがいないなと、しばしば思う。その「ああ仲間いないな」と心底から思うときの絶望感には、寒けがして凍りついてしまう。黙りこくって、ひたすら孤独感に耐えなければならない。そしてどんな内容も外にはでず、何かあったということだけが残る。誰も、どこにも味方はいない。

適切に状況を説明して理解してくれる人間なんてのはそうそういない。利害関係にない人間であればなおさらいない。利害関係にある人は味方でも敵でも彼らの言葉に意味がないので、説明する意味がない。何の意味もない。

ウェブエンジニアなので、設計のときは安全方向にする。フェイルセーフを重視する。性悪説的な考えかたを強要されている。

手を動かすのを止めた人はダメになる一方だな、と深く思った。

僕が日記を書くのに必要な機能は全部実装してしまった感じがする。

キーボード (HHKB Pro2) がだいぶ汚れてしまっていたので、頑張ってマイナスドライバーで全部キーをはずして掃除をした。綺麗になるとすごく気持ちよくて、今とてもキーボードを打ちまくりたい気分になり、このエントリを書いている。

実際のところ、外付けキーボードは最近あまり使っておらず、MacBook のキーボードで直接タイピングしていることが多いんだけど、たまに HHKB とかさわると非常に気持ちいい。

しばらく手をつけていなかった箱の中身を整理したり、長らく使っていた不良品のスピーカーを捨てたりした。

無印良品ネットストア

無印の耐熱ガラスポットを買って最近使っているけど、軽いし、ガラスなので汚れ見えやすくて良いです。

【パーツ】耐熱ガラスポット・マグ用 プラスチックストレーナー 約直径8.5×高さ8cm | 無印良品ネットストア

耐熱ガラスポット・小とマグ・中にセットして使えるプラスチック製のストレーナーです。メッシュ仕様なので細かい茶葉も濾せます。

あと一緒にストレーナーも買って、家で余っていたお茶葉を消費してる。

買ったものとか欲しいものとかもできるだけ記録しておきたい。

ステンレス箸立て・小 約7.5×6×10cm | 無印良品ネットストア

錆びにくいステンレス製です。ステンレスバスケットと組み合わせてお使いになれます。

ステンレスの箸立ても買ったのだった。今まで普通のコップを箸立てとして使っていたけど、水がきれないせいで不潔感があった。

皿とか水きりするバスケットも、今はプラスチックのだけど、ステンレスのものにしていきたい。

【指定医薬部外品】ユースキンA 120g (手荒れ かかと荒れ 保湿クリーム) - ユースキン

ユースキン

5.0 / 5.0

花粉症で安いティッシュで鼻をかみまくっていると、鼻の下がヒリヒリして泣きそうになるわけですが、一日の終わりにユースキン塗って寝ると翌日は全快するので、本当にありがたく使っている。効きすぎてびっくりするレベル。

ロングセラーな商品で、自分も子供のころから使っていたので、安心感があるし、あらためてネットで評判を見てみても評価が高い。

書けることが特にない日が続く。

いろいろイライラすることが多くて、めんどうくさい。特に僕は遅れて思い出しながらイライラすることが多いのだけれども、イライラすることを想起させる行動を繰り返しされるとだいぶしんどくなる。

自分にコミュニケーション能力がないことによって、かえってコミュニケーションの重要性について実感できるのは良い。伝えるべきこともあるし、伝えるべきでないこともある。

伝えるべきことを伝えるようとすることは、決しておろそかにしてはいけない。人間と人間の間の問題のほとんどはコミュニケーション不足によって発生している。一方の理解力のなさであったり、一方の伝達力のなさであったりする。コミュニケーションする場合、おたがいに相手の理解力や伝達力に甘えてはいけない。最大限理解しようとし、最大限伝達しようとしなければならない。

どちらの立場であっても、想像力が働く必要がある。結局何もかもが想像力に帰着する。全ての問題は想像力の欠如にある。

自分の責務を全うしている人に憧れる。自分がそのようになるためには、自分の責務を全うしている人に囲まれて生活をする必要があるだろう。周囲の影響というのははかりしれなくて、みんながやっていることなら自分もできる、という心持ちになれることはすごく重要だ。

microdata の itemref の解釈がよくわからない。

itemref で指定した ID を持つ要素の下もまた、そのアイテムのプロパティとして加える的なことが書いてあるが、じゃあ itemref で指定した ID を持つ要素が、別の itemscope の中にあったらどうなるのか?というのがよくわからない。

たぶんどちらにも属するプロパティになる?ような気がするけど、うまく仕様を読めていない。

All itemref attributes in a Document must be such that there are no cycles in the graph formed from representing each item in the Document as a node in the graph and each property of an item whose value is another item as an edge in the graph connecting those two items.

500 Can't connect to whatwg.org:443 (certificate verify failed)

たぶんこの辺なんだけど、英語が難しくて正確に理解できないので書きながら理解することを試みる……

All itemref attributes in a Document must be such はいいとして、そのあとの区切りがどこに入ってるのか…

  • All itemref attributes in a Document must be such
    • that there are no cycles in the graph formed from representing
      • each item in the Document as a node in the graph
      • and
      • each property of an item whose value is another item as an edge in the graph
    • connecting those two items.

こう読むのかなあ。文意としては「どんな場合でも循環参照がおきてはならない」で、事例が書いてあると思う、のでそれぞれ訳したい感じだけど、うまく訳せない……

しかし、ここは単に循環参照に言及しているだけで、1つの itemprop が複数のアイテムに属するかどうかとは関係ないか…

  1. トップ
  2. tech
  3. microdata の itemref の解釈

明月院庭園

日曜日に鎌倉に行ったけど、明月院が良かった。うさぎがいた。奥の庭がかなり広かったのと、結構紅葉が残っていたのがよかった。

マリオカート7 - 3DS - 任天堂

任天堂

4.5 / 5.0

やっと全クラスで★★★になった。なんかもう運なので、とにかく試行回数を増やして頑張ってみた。

  • MacBook Air 11インチ
  • 1.6GHz Intel Core i5
  • 4GB メモリ
  • SSD 128MB

をポチった。

Picasa web の画像って直接貼れるんだなあ。あと URL 中の s700 とかを s1920 とか s280 に変えると自由な画像サイズになる。でも恒久的なURLである根拠がないので、安心してはる感じにはならない…… と思って根拠をさがした。


<img src="/images/entry/IMG_7521-1920.jpg"/>

https://picasaweb.google.com/114431815111528304586/2011128#5683411105636128482

一通りさがして、ないなーと思ったけど、アルバムのページには「HTML を貼り付けてウェブサイトに埋め込む」というのがあって、この中の img は上記のような形式のURLになっているので、不変と思ってよさそうな気がする。

FAQ には

You can only embed images into a webpage that are 800 pixels or smaller along the largest dimension.

404 Not Found

と書いてあって、800px までなら自由に貼れるように読める。たぶん 800px ってのは Google+ が出る前の基準な気がするので (根拠なし)、今は 2048px まで貼れるのかな…… 一応、安全にウェブサイトに貼れるのは 800px までっぽい。

  1. トップ
  2. tech
  3. Picasa web の画像

自分のサーバーに画像を置くのは厳しい。

  • 容量的
  • 借りているサーバーのネットワークスピード

とかがあるので、できればウェブサービスに置いておきたいという要求があり、今のところはてなフォトライフを使っている。はてなフォトライフは無料でも30MB/月で十分だろうというのと、CDN (アカマイ) を経由していて、画像サイズに制限がないのもよい。

Picasa も昔検討したことがあって、そのときは 800px までしか無料でアップロードできず諦めたのだけれど、Google+ のリリースにより 2048px までは容量にカウントされない、すなわち実質的容量無制限になったので、候補にあがってきた。ネットワーク的にも Google の配信なので信頼がおける。

Picasa を使うとして

しかし Picasa はインターフェイス的に僕にはちょっと使いにくい感じなのと、画像を簡単に貼りつけられる方法がないのがネックになっている。前者はたぶん慣れれば大丈夫なので、後者は実装で解決してみたい。

アップロードとかは Picasa 側でやるので、最新のアップロード画像から貼りつけるインターフェイスだけ実装することを考えたが、Picasa がユーザーの最新画像のフィードを吐いていないようなので、それをなんとかして作るところからになった。

写真一覧のフィードは調べていたら普通にあった…

撮った時刻でソートするようにした

そもそも PIcasa 側で JSONP に対応していることがわかった

404 Not Found に普通に書いてあった。リファレンスの読みかたがよくわかっていなかった…

  1. トップ
  2. tech
  3. 画像ストレージ再考

写真にもっとメタデータを書いておかないといけないんだろうけど、面倒くさくて無理なんだよなあ…… なんか簡単にできればいいのかな

「餡の雲」で検索するといつのまにやら知らない人が出てくるようになっていて、なんか嫌な感じだし、それなりに愛着はあるけど、それほどこだわりもないしサイト名を変えたい…… 。でもいい名前が思いつかない。

いろいろやって、ページのロード速度を改善してみた。

サイト名を「氾濫原」に変えた。他人にとってあまり意味がない言葉で、かつ自分にとってある程度意味がある言葉、というのにしたくていろいろ悩んだ。

あんまり仕様書読みこめてないけど書くだけ書いてみた。CPAN にあるのは依存がひどいし、別に HTML::Parser 的なもの一個の依存で JSON 返すようなのでいいじゃんと思った。やる気があればテスト書いて CPAN にあげたりしたいけど、あんまりやる気わかない。

結局 HTML::Parser ではなく HTML::TreeBuilder::LibXML にしたけど、普通に入るモジュールなのでよさそう。

レポジトリをつくってテストを書いた。
https://github.com/cho45/HTML-Microdata/blob/master/lib/HTML/Microdata.pm

use v5.12;
use LWP::Simple qw($ua);
use URI;
use JSON::XS;

my $uri = URI->new('http://www.lowreal.net/');

my $res = $ua->get($uri);
my $microdata = HTML::Microdata->parse($res->content);

say encode_json $microdata->items->{cho45}->{properties};

package HTML::Microdata;

use HTML::TreeBuilder::LibXML;
use Scalar::Util qw(refaddr);
use Hash::MultiValue;

sub new {
	my ($class, $args) = @_;
	bless {
		items => {},
	}, $class;
}

sub parse {
	my ($class, $content, $opts) = @_;
	my $self = $class->new($opts);
	$self->_parse($content);
	$self
}

sub items {
	my ($self) = @_;
	$self->{items};
}

sub _parse {
	my ($self, $content) = @_;

	my $tree = HTML::TreeBuilder::LibXML->new_from_content($content);
	my $scopes = $tree->findnodes('//*[@itemscope]');
	my $number = 0;
	for my $scope (@$scopes) {
		my $type = $scope->attr('itemtype');
		my $id   = $scope->attr('itemid');

		unless ($scope->id) {
			$scope->id($number++);
		}

		if (my $refs = $scope->attr('itemref')) {
			my $ids = [ split /\s+/, $refs ];
			for my $id (@$ids) {
				my $props = $tree->findnodes('//*[\@id="' . $id . '"]//*[\@itemprop]');
				for my $prop (@$props) {
					my $name = $prop->attr('itemprop');
					my $value = $self->extract_value($prop);
					$self->{items}->{ $scope->id }->add($name => $value);
				}
			}
		}

		$self->{items}->{ $scope->id } = {
			($id ? (id => $id) : ()),
			type       => $type,
			properties => Hash::MultiValue->new,
		};
	}

	my $props = $tree->findnodes('//*[@itemprop]');
	for my $prop (@$props) {
		my $name = $prop->attr('itemprop');
		my $value = $self->extract_value($prop);

		my $scope = $prop->findnodes('./ancestor::*[@itemscope]')->[-1];

		$self->{items}->{ $scope->id }->{properties}->add($name => $value);
	}

	for my $key (keys %{ $self->{items} }) {
		my $item = $self->{items}->{$key};
		$item->{properties} = $item->{properties}->multi;
	}
}

sub extract_value {
	my ($self, $prop) = @_;

	my $value;
	if (defined $prop->attr('itemscope')) {
		$value = $self->{items}->{ $prop->id };
	} elsif ($prop->tag eq 'meta') {
		$value = $prop->attr('content');
	} elsif ($prop->tag =~ m{^audio|embed|iframe|img|source|video$}) {
		$value = $prop->attr('src');
	} elsif ($prop->tag =~ m{^a|area|link$}) {
		$value = $prop->attr('href');
	} elsif ($prop->tag eq 'object') {
		$value = $prop->attr('data');
	} elsif ($prop->tag eq 'time' && $prop->attr('datetime')) {
		$value = $prop->attr('datetime');
	} else {
		$value = $prop->findvalue('normalize-space(.)');
	}

	$value;
}
  1. トップ
  2. tech
  3. microdata を適当に抜き出す Perl スクリプト