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

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

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

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

あんまり仕様書読みこめてないけど書くだけ書いてみた。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 スクリプト

漠然と、いろいろ上手くいってないみたいな感じがしている。よくある。

自分は自分の判断を正しいと思っているが (あたりまえだ)、一方メタな視点で自分を信じていない自分もいるのだ。

他人に対する信用というものが実感としてほとんどない割には、微妙なところで「このぐらいなら信じても良いだろう」と思い、その度にことごとく裏切られるので、余計他人が信用できなくなるという悪循環がある。これは単に自分が「信用する」という判断のしかたが間違っていることに他ならないんだけど、どうしたらいいのか全く分からない。

全く信用しないで生きていこう、というのは社会的には無理だ。どこかで線をひいて「ここまでは信用しても良いだろう」というのを自分の中で他人一人一人について見つけなければならない。例えば「技術的には信用できるが、人間的には信用できない」というのはありえるし「センスは信用できるが、技術的には信用ができない」とか「成果物は信用できるけど、言動は良く変わって信用できない」とか、いろいろある。

人を見る目というのは、誰かに頼ることのできないもの (だってその誰かを信用できるかなんてわからないからだ) で、自分でどうにかするしかないのだけれども、それを鍛える方法を発見することができない。

[tech] カテゴリは長くなりがちなので、最初の一段落を残して残りは「続きを読む」みたいにしたいかもしれない。微妙に面倒くさい。

  1. トップ
  2. tech

理に適ってないことをすると自分だけじゃなくていろんな人が損をするので絶対にやらないようにしよう。

他人に対してイライラすることが多々あるけど、いい大人に何か言っても意味がないので、単に必要な手段を講じるのが良いと思う。一番よくないのは、納得がいってないのになあなあにすることだ。人の意見を聞かない人でも、不利益をちゃんと感じてもらえば、それこそいい大人なんだから頭使って何が悪いのかに気付くはずだ。そういう頭の使いかたをできない人だとしたら、コミュニケーションする意味がないので、単に遠ざかればいいだけだ。

技術的なことももっとこっちに書いていこう。サブテクは最終的なまとめエントリーだけ置く感じにしよう。悩んでいる過程を省くのは良くない。

来年のテーマは「原点回帰」かなあ。

上の世代の人のこととか、心底どうでもいい……

頑張ったぶんだけ損したとか、頑張らなければ良かったと思わないようにしたい。これらはモチベーションコントロールの観点からいって、絶対にあってはならない。

僕はある種の理不尽さを一切許容できない。ある種の、というのは特に人の手によって起きるもののことを言っている。例えば、責任は裁量を持った人が確実にとらなければならない。

500 Can't connect to hail2u.net:443 を見て、そんなことできたのかと思いやってみたら見事にハマった。

やりたかったことは以下の通り

で、まず http://lowreal.net/ 以下のページで

<link rel="author" href="http://www.lowreal.net/"/>

をつけた。これで Structured Data Testing Tool  |  Google Developers を確認すると、linked author profile = http://www.lowreal.net/ になる。この時点ではまだ Google プロフィールとは関連づいていないので、Error: Author profile page does not have a rel=me link to a Google Profile とでた。

ついで、http://www.lowreal.net/

<a rel="me" href="https://plus.google.com/114431815111528304586">Google+</a>

を追加してみたが、これがうまく行かず。profiles.google.com じゃないといけないのか? とかいろいろやってみたけれど、変化がなく、Error: Author profile page does not have a rel=me link to a Google Profile が出続けた。

諦めようかなーと思いはじめたが、なんとなく vcard あたりの解釈と衝突している気がしたので、フッタにリンクを移したら、めでたく Verified: Authorship markup is correct for this page になった。よかったよかった。

http://www.google.com/webmasters/tools/richsnippets?url=lowreal.net 見るとメタデータたくさんあって気持ちいいですね。

  1. トップ
  2. tech
  3. Googleプロフィールにウェブサイトを関連付ける

写真を貼るときにはてなフォトライフの記法を使って貼っているが、せっかくなので microdata で Photograph として認識されるように展開フォーマットを変えた。Google が解釈するようになるといいなー

<span itemscope itemtype="http://schema.org/Photograph">
  <a href="/2011/12/03/1" class="hatena-fotolife" itemprop="url">
    <img src="http://cdn-ak.f.st-hatena.com/images/fotolife/c/cho45/20111127/20111127131949.jpg" alt="photo" class="hatena-fotolife" itemprop="image">
  </a>
</span>

こんな感じにしてある。author については url の先に rel="author" があるので勝手に認識してほしい。

  1. トップ
  2. tech
  3. フォトライフ記法

[tech] カテゴリと [photo] カテゴリと、asin が含まれるエントリだけフィードに出すようにした。

  1. トップ
  2. tech

神聖なウェブサービスに投稿したら怒られたので、こわくなって退会してしまった…… 空気読めないせいでサポートコストがかかって訴訟起こされたら死ぬしかない……

各エントリの右上に Share on Tumblr をつけてみた。各エントリのパーマリンクには Facebook Like やら Google +1 やらが置いてあるのだれど、これら結構重いのでリスト表示時には置く気がしないのと、デザインが邪魔くさいのであまり繰替えし出したく思わない。

スマフォとかで面倒なので一旦さげた…

海外の写真コミュニティサイトって何があるんだろう」とツイートをしてみたら「500px?」と教えてもらったので登録してちょっと使ってみた。

アップロードした写真がユーザーページとポートフォリオに反映されるので、厳選しようという気になるのと、Fresh とかを結構いろんな人が見ているっぽくて、すぐ評価やコメントが付いて面白い。デザインがうまくいってる感じがする。

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

任天堂

5.0 / 5.0

マリオカート7を買った。3DS を購入したのがそもそもマリオカートをやりたかったからだったけど、発売日とかを全く把握していなかった。

発売日翌日で、ヨドバシカメラに行ったら完売しており「ないだろうなー」と思いつつ近くのビックカメラにも行ってみたら、そこには普通にあって買えた。良かった。

やっていてあらためて、Wii 版のマリオカートがよくできていたなあと思い出した。コースも良かったし、操作もしやすかった。3DS はちょっとボタンを押しにくいのでしんどい。ただ、3D のおかげかコースが把握しやすい気がする。

責任をとる価値があることは積極的にとっていったほうが結果的に得をするということになんとなく気付いた。

最近「ランゲルハンス島」が流行っているので

ランゲルハンス島の午後 (新潮文庫) - 村上 春樹

村上 春樹

3.0 / 5.0

を買ってみた。まだ届いていないので楽しみ。

こんな時代なので日記サイトのリンク集をつくりたい。

明治 ストロベリーチョコレートBOX 28枚×6個 - 明治

明治

3.0 / 5.0

がおいしいくて無限に食べてしまってランゲルハンス島が沈みそう。

写真は Google 検索にもっとヒットして欲しい感じだけど、写真のSEOはどうしたらいいんだろう……

過去のエントリのパスがおかしかったのを全力でなおした…… あとエラーログを見て 404 でているやつを適切にリダイレクトさせる設定を書いた。

フィードを吐かないということを書いたけど、photo カテゴリのものだけ吐くようにした。良いバランスを探ってる。

Yahoo! JAPAN の校正APIを使おうとしているけど実装の時間をとれていない。と書いてしまうけれど、時間をとれていないというのは全然正しくなくて (時間はその気になれば作れるものだから)、良い UI を思いつかないとか、良い実装を思いつかないとか、そういう部分のモチベーション低下が大きい。

「あったら便利な機能」というのは実装すれば確かに「便利」ではあるのだけれど、なくても重要ではない。必要に迫られないことをするためには、複数の動機を組み合せる必要がある。

「やる気」の表明というのは、実際に「やる」ことでしか達せられない。

コンテンツないしはそれに伴うページビューはお金になるということを、ちゃんと実感として持たないといけないと思っていて、できるだけちゃんと Adsense を貼るようにしている。何かしらサービス開発するにしても、収益の感覚を多少でも持っていないと、計画が全く立てられない。