2011年 02月 19日

やる気のリハビリというの頑張ってやろうとしてもすぐ無駄にされるので、やる気なくなる悪いループにハマってる。

やる気のリハビリというの、どういうことかというと、大きなものを作ろうとすると大きなやる気が必要になるけど、それだけのやる気がないとき、小さなものを小さなやる気で作ってフィードバックを得て、小さいやる気をちょっとずつ増幅させていくということです。

これ、継続的に減衰させるような要素があると (例えば不安・不信とか) 全然次の段階に進まないし、永遠に小さいものを小さなやる気でつくるしかなくなる。あるいはやる気ってのは外敵に著しく弱いので、何かしらの刺激でゼロに戻ると、また最初から、つまり小さなものを作ることからやりなおしになる。

一旦育ててそれなりに大きいものを作れて、フィードバックを適切にうけられれば、さらに大きいものを作っていける一方、ゼロになると長い時間が必要になってしまう。

こういうこと、体内にやる気の永久機関を持っていて自己完結している人には理解されないのだろうなあと最近思った。

強烈なやる気を持って何か作ってるときは非常に幸せなのだから、やる気は徹底的に保護したいと思っているけど、うまくいかないもんですね。

モチベーションを保つのってめちゃくちゃ難しいことだと思うし、特に人から「やれよ」といわれてやることに対してのモチベーションなんて、二日持てばいいほうなんじゃないのかなぁと個人的に思う。

http://lowreal.net/blog/2006/09/27/2

なんかすんごい何度も書いてる気がするけど、モチベーションの維持が一番難しいのだ。だから自分はモチベーションがあるときは失わないように必死だし、モチベーションがないときはどうすればモチベーションがでるか考えている。

http://lowreal.net/blog/2007/01/02/1

成長してなくて笑えないです。体内にやる気を生成する機関がうまく作られなかったのでもうどうしようもない感あります。

悔しいって気持ちあんまり感じないんだよなあ…… ないし、感じるけど、人に対してはあんまり感じなくて普通にすごいなぁとしか思わない。あるいは悔しいと思っても、別にそれが行動に繋ったりしない。「残念だったねぇ」としか思わないし、「悔しさ」自体はモチベーションには繋がらない。

一番悔しいって感じるときは、アイデアがあって、実装もしてあったのに、先に誰かに同じアイデアの何かを出されたときですよ。例え同時多発的なアイデアであっても、後発は永遠にパクりの嫌疑をかけられるんですから。

この場合、そのとき「悔しい思いをする想像」っていうのは、早く実装して早く出したいという気持ちになるけど、もちろんそれは「これはおもしろいし先をこされたくない」っていう強い感情に基いてる。

2011年 02月 18日


Firefox、Mac OS X で2つ以上インスタンス化すると、-no-remote の有無に限らず最初に起動したほうが open http://.../ で使われるのはどうにかならないのか

バイナリもう1つ作って Contents/Info.plist のそれっぽいエントリを消したり、s/Firefox/XXXXX/g したりするとうまくいくようだ……

2011年 02月 17日



メッセージキュー、何を使えばいいのかわからないお……

Q4M って DBI 使うとブロックしちゃうけど、非同期にするにはどうしたらいいんだろう。AnyEvent::Worker|AnyEvent::DBI (=fork) 使うのがいいのかな。スタンダードな方法がわからない

LDR Streaming API では自力で MQ 作ったというのを見たけど、これ使っとけ的なのはないのかなあ……

Memo

HTTP ベースで pub/sub なメッセージキュー

かなりざっくり書くと以下のような感じになる気がするけど、こういう HTTP ベースの内部用途の pub/sub サーバって既に良いのはあるのかな……

package Buspub;

use strict;
use warnings;
sub route ($$);
use Router::Simple;
use Tie::IxHash;
use AnyEvent::HTTP;
use HTTP::Request::Common;
use JSON::XS;
use POSIX ();

use MongoDB;
my $connection = MongoDB::Connection->new(host => 'localhost', port => 27017);
my $subscriptions = $connection->get_database('pubsub')->subscriptions;
$subscriptions->ensure_index(Tie::IxHash->new( key => 1, created => -1 ), { background => 1 });

route '/sub' => {
	action => sub {
		my ($r) = @_;
		my $key = $r->req->param('key') or return $r->json({ error => "key required"});;
		my $callback = $r->req->param('callback') or return $r->json({ error => "callback required"});;
		my $id = $subscriptions->insert({
			key      => $key,
			messages => [],
			callback => $callback,
			max      => 25,
			created  => scalar time(),
		});
		LOG("SUB:: %s with callback: %s", $key, $callback);
		$r->json({ id => "$id" });
	}
};

route '/pub' => {
	action => sub {
		my ($r) = @_;
		my $key = $r->req->param('key') or return $r->json({ error => "key required"});;
		my $message = decode_json $r->req->param('message');

		my $cursor = $subscriptions->query({ key => $key });
		my %count;
		while (my $obj = $cursor->next) {
			$count{all}++;
			my $id  = $obj->{_id} . "";
			my $uri = $obj->{callback};
			my $messages = [ @{$obj->{messages}}, $message ];
			my $req = POST $uri, [ id => $id, messages => encode_json($messages) ];

			LOG("PUB:: => %s => %s with %d messages", $key, $req->uri, scalar @$messages);
			http_request $req->method => $req->uri,
				body => $req->content,
				headers => {
					map { $_ => $req->header($_), } $req->headers->header_field_names
				},
				timeout => 20,
				sub {
					my ($body, $headers) = @_;
					LOG("PUB:: <= %s <= %s with status:%d", $key, $req->uri, $headers->{Status});
					if ($headers->{Status} =~ /^2/) {
						$subscriptions->update({ _id => $obj->{_id} }, { '$pullAll' => { messages => $obj->{messages} } });
					} elsif ($headers->{Status} =~ /^4/) {
						$subscriptions->remove({ _id => $obj->{_id} });
					} elsif ($headers->{Status} =~ /^5/) {
						if (@$messages > $obj->{max}) {
							$subscriptions->remove({ _id => $obj->{_id} });
						} else {
							$subscriptions->update({ _id => $obj->{_id} }, { '$push' => { messages => $message } });
						}
					}
				}
			;
		}
		$r->json({ key => $key, delivered => \%count });
	}
};

route '/test/callback' =>  {
	action => sub {
		my ($r) = @_;
		use Data::Dumper;
		warn Dumper $r->req->param('id') ;
		warn Dumper decode_json $r->req->param('messages') ;
		$r->res->status($r->req->param('code') || 404);
		$r->res->content_type('application/json; charset=utf8');
		$r->res->content('{}');
		$r->res->finalize;
	}
};


BEGIN {
	my $router = Router::Simple->new;
	sub route ($$) { $router->connect(@_) };

	sub run {
		my ($env) = @_;
		if ( my $handler = $router->match($env) ) {
			my $c = Buspub::Context->new($env);
			$handler->{action}->($c);
		} else {
			[ 404, [ 'Content-Type' => 'text/html' ], ['Not Found'] ];
		}
	}

	sub LOG {
		my ($message, @args) = @_;
		print sprintf("[%s] $message", POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime), @args), "\n";
	}
};

package Buspub::Request;
use parent qw(Plack::Request);

package Buspub::Response;
use parent qw(Plack::Response);

package Buspub::Context;
use JSON::XS;

sub new {
	my ($class, $env) = @_;
	bless {
		req => Buspub::Request->new($env),
		res => Buspub::Response->new(200),
	}, $class;
}

sub req { $_[0]->{req} }
sub res { $_[0]->{res} }

sub json {
	my ($self, $vars) = @_;
	my $body = JSON::XS->new->ascii(1)->encode($vars);
	$self->res->content_type('application/json; charset=utf8');
	$self->res->content($body);
	$self->res->finalize;
}

\&Buspub::run;