zeromq 調査 その4: N:M 双方向通信をためす その3改善版

今回の調査内容

  • 前回試した双方向通信では問題があったので解決する
    • 今回の構成図は↑の通り
    • 前回の調査 => http://blog.tanarky.com/2010/11/zeromq-3-nm.html
    • 処理が空いているserver processにリクエストが振られる、という挙動を達成させる
      • 1つめのリクエストをworkerが受け取ったときに、sleep(3)している
      • 2つめ以降のリクエストは、workerが受け取ってもsleepしないですぐに処理を返す
      • clientに値が返ってくる順番が、1つめに送ったリクエストが最後になって入ればOK

結果

  • 実現できた
  • コードはこちら
  • 実行方法はREADME参照

次回TODO

  • さらに拡張して↑のような構成を実現してみる
  • PAIR, UPSTREAM, DOWNSTREAMについて調査

zeromq 調査 その3: N:M 双方向通信をためす

今回の調査内容

環境

  • とりあえず、1 Server内のTCP通信で動作確認

コード

  • https://github.com/tanarky/sample-codes/tree/master/php/zmq/broker/
  • s1.php(server process)を2つ起動して、c1.php(1つのclient process)から10回メッセージを送った
    • 2つのs1.phpにリクエストが分散された
    • 1つのs1.phpプロセスを落としたら、起動しているs1.phpプロセスにのみ振られた

問題

  • 2つのserver processのうち、1つは処理に3秒以上かかるようにsleepを入れた
  • 1回だけ遅いserver processに振られ残りは処理が早いserver processにリクエストが振られる、という挙動を期待
  • 結果としては、期待した挙動にならず
  • 2つのserver processに均等にリクエストが振られた
  • 対応策はあるか? => ありそう
    • http://zguide.zeromq.org/chapter:all#toc45
    • 「Least-Recently Used Routing」のサンプルは、期待した挙動をしそう
    • Cのサンプルを動かして動作確認できた
    • PHPに移植中
    • clientから、$sock->setSockOpt(ZMQ::SOCKOPT_IDENTITY, str_repeat("a", 300))、といった感じで使う

次回TODO

  • 性能評価

その他メモ

  • ruby bindingはpollがなく、古い

totoでお金持ちになる その3 直近10試合の勝点差による勝率

アグレッシブエンジニア: totoでお金持ちになる その2 ホーム&アウェイの勝率
前回からだいぶ時間があいたけど、もう一度データを整理して、
過去の10試合結果とその場合の勝率を計算してみた。

J1の結果において、
ホームチームの直近10試合の勝点をHとし、
アウェーチームの直近10試合の勝点をAとし、
(H-A) の値により、勝率がどの程度変わるか計算してみた。

結果としては以下の通り。
  1. H-Aの値が8を越えると、ホームチームの勝率60%以上(totoの結果的に1)
  2. H-Aの値が-17以下の場合、アウェーチームの勝率60%以上(totoの結果的に2)
 -17を下回ることはあまりないけど、8を越えることは結構ありそうなので、
今後はこれを参考に購入してみるか、と。

ちなみに、J2の場合は、直近10試合の勝点には関係なく、
ホームチームが有利、という結果に。

(H-A)の値が0の場合、つまり直近10試合の調子が同じでも、
ホームチームの勝ちが50%、引き分けが27%と、合わせて77%。
J2の場合は、マルチで買っておくのが無難、というお話。

三菱東京UFJポイントをYahoo!ポイントに交換

メインバンクに三菱東京UFJを使ってるんですが、
カード払い時などにたまっていたポイントを、Yahoo!ポイントに交換できる
みたいなんで、交換してみました。

三菱東京UFJポイント:三菱東京UFJ銀行

よく見ると、Tポイントも交換対象みたいなんで、
Yahoo!ショッピングでTポイントが貯まる! 使える! - Yahoo!ショッピング
Yahoo!ショッピングとの相性がいいです。

自分はある名義口座に500ポイント、別の名義口座に100ポイントもっていたので、
あわせて1つのYahooIDにまとめるように
インターネット(三菱東京UFJ ダイレクト)から申し込みました。

難点は、交換にかかる期間で、

11/1: Twitter / @tanarky: メインバンクが東京三菱なんですが、Yahooポイントと交換できると判明。しかも東京三菱ポイントが500ポイントもあったので、Yahooポイントが5倍の2500ポイントに。

11/22: Twitter / @tanarky: 東京三菱ポイントのYahooポイントへの交換が完了した! 3500ポイントなり。

と、20日くらいかかりました。
今からやって、年内に交換完了するかしないか、くらいなんで
年末商戦でほしいものがある方はお早めに。。。


自宅 Mac mini のファストユーザスイッチを有効にしてみた

[Mac] ファストユーザスイッチ を 有効 にする方法 | Apple Voice

家族で共有して使ってるMac miniの設定を変えてみた。
いちいち使用する度にログアウトしたりしてたのが面倒になったので。

これからは、シャットダウンせずにスリープ、
ユーザを切り替えるときはファストユーザスイッチでやることにした。

ついでに、VirtualBoxにUbuntu Server 10.04 LTSをインストールして
Macでの開発環境にした。
Macで開発する時は、Ubuntu ServerにSSHログインして開発、
終了する時は、スリープで終了して、再開する時はスリープ解除で、という方法。

急にMacでの開発が快適になってワロタ。

Macbook Air 並みのSSD搭載Mac miniがでたら、
開発用にもう1台買おうかと思っている。

zeromq 調査 その2: PHPサンプルコード(SUBSCRIBE)

TODO

  • zeromq @ CentOS 5.4 -> 環境構築が面倒すぎて断念
  • Ubuntuに仮想環境構築してドキュメントを読みつつPHPでコードを書いて遊ぶ

仮想環境セットアップ

  • 192.168.11.4(srv1)
  • 192.168.11.15(srv2)

mysample1

+------+    send    +------+    +------------------+
| srv1 |<---------->| srv2 +<-->+ unix domain sock +--- client1
+------+    recv    +------+    +--------+---------+
                                         +--- client2
  • 接続を1本(図を参照)
    • local通信はIPCで行う
    • ついでに以下も確認
      1. 1つのclientから接続を受けたらmultiserver側で5秒sleep。2つめのclientも接続してみる
      2. multiserverを起動してからremote serverを起動して、通信できるか確認
  • 結果
    • すべて想定どおりの通信が確認できた
  • 詳細
    • 接続は1本で複数clientの通信ができた
    • 1.の場合、2つめのclientは1つめのclientの通信が完全に終わるまでwaitし、その後5秒待たされた(予想通りの挙動)
      • この構成だと1つの通信が遅くなったときに通信が詰まる恐れがある
      • 回避策は別途考察
    • 2.の場合、multiserver起動時はremote serverは起動していないのでエラーになるかと思いきや、問題なく通信できた
      • うまくfailover/接続リトライしてくれている雰囲気
      • 別の方法で詳しく確認する

Getting the Message OutサンプルをPHPで動かしてみる

 

 

<?php

$ctx = new ZMQContext();
$s   = $ctx->getSocket(ZMQ::SOCKET_PUB);
$s->bind("tcp://127.0.0.1:5556");

// client(subscriber)の有無にかかわらず、メッセージを送りつづける
while (1){
    $message = rand(0,10000);
    var_dump($message);
    $s->send($message);
}
  • client(subscriber)
<?php
$ctx = new ZMQContext();
$c   = $ctx->getSocket(ZMQ::SOCKET_SUB);
$c->connect("tcp://127.0.0.1:5556");

// 送られてきたメッセージが20から始まるものだけを受け取る
$c->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, "20");

for ($update_nbr = 0; $update_nbr < 100; $update_nbr++) {
    $ret = $c->recv();
    var_dump($ret);
}
  • 大きなデータの分散処理をそれぞれ子プロセスに分割して処理する場合などに有用
  • ドキュメントにあるように、「one-way data distribution」

次のTODO

  • Divide and Conquer サンプルお試し

launchpad使い方まとめ その1:アカウント作成とか

Launchpadとは - はてなキーワード
Launchpad - Wikipedia
Ubuntu向けのAPT レポジトリ作成 (ビルドシステムを含む)
を使ってみたくなったので、launchpadにアカウントを作ってみた。
普通のサイトだと、E-mailアドレスからアカウントを作って終了、という
ところだが、色々めんどくさかったので、メモっておく。

Ubuntu Weekly Recipe:第46回 PPAの活用|gihyo.jp … 技術評論社
手順の最大の山場は、CoCへの署名。
すでに登録しておいたgpgの公開鍵をもとに、暗号化されてきたメールを複合化して
本文に書かれているURL(だったかな?)にアクセスして同意完了、という流れ。

メールは、いつもブラウザからGmailやらYahooメールやらを使っているので、
複合化に若干手間取りました。
結果的には、メールの本文をコピーして、コマンドラインから、
gpg --decrypt [保存したメール本文ファイル]
として複合化させました。
あとは、SSH keysを登録して準備完了。

Satoshi Tanaka in Launchpad

zeromq 調査

関連リンク

セットアップ

% ./configure
% tar xvzf zeromq-2.0.10.tar.gz
% cd zeromq-2.0.10/
% ./configure && make && sudo make install

PHP binding setup

FAIL Test that high-watermark works [tests/022-highwatermark.phpt]
-----
Fatal error: Undefined class constant 'SOCKOPT_LINGER' \
 in /home/satoshi/github/php-zmq/tests/022-highwatermark.php on line 14

サンプルを動かしてみる

  • PHPサンプル
  • 確認できたこと
    • simple server / simple client メッセージ動作確認(TCP)
    • simple server / non blocking client メッセージ動作確認(TCP)
    • simple server / simple client メッセージ動作確認(IPC)
    • simple server / non blocking client メッセージ動作確認(IPC)
  • 次、確認すること
    • failover(ドキュメントを読みながらコード書いている途中)
    • もう少し深いレベルのコード確認
    • 性能測定
  • 感想
    • msgpackと組み合わせやすそう

HandlerSocket plugin for MySQL


HandlerSocketに関する非常にわかりやすいスライド。
ようやくHandlerSocketがなんであるかイメージできた(気がする)


NoSQLとしてのMySQLの動作確認(HandlerSocket) Makefile.PL patch

なんか、せっかくperl clientがついてるのに、
make perl
が通らなかったので、ちょっとMakefileを修正してみた。

/home/satoshi/github/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket
% git diff Makefile.PL 
diff --git a/perl-Net-HandlerSocket/Makefile.PL b/perl-Net-HandlerSocket/Makefile.PL
index 1b76494..50ad0dc 100644
--- a/perl-Net-HandlerSocket/Makefile.PL
+++ b/perl-Net-HandlerSocket/Makefile.PL
@@ -13,7 +13,7 @@ WriteMakefile(
     LD                => 'g++ -fPIC',
     LIBS              => ['-lhsclient'], # e.g., '-lm'
     DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
-    INC               => '-I. -I/usr/include/handlersocket',
+    INC               => '-I. -I../libhsclient',
     OPTIMIZE          => '-g -O3 -Wall -Wno-unused',
        # Un-comment this if you add C files to link with later:
     # OBJECT            => '$(O_FILES)', # link all the C files too

rpmを作成してinstallする方は動いたけど、
今日はUbuntuで動作確認してみたかったので、修正した。

別に修正しなくても、headerファイルもしかるべきところにおけば通るっぽいし、
間違いとは言えないので、どうしたもんか。

さて、どうやって作者に連絡するか・・・。
(このBlogを作者に連絡してくれる有志募集中)


MLで、というアドバイスをもらったので突撃してみた。

→ (2010/11/09追記)
無事に取り込んでもらえました。
https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/commit/bbd256250ed04c72915d09cd1de4c3cb12d24961

NoSQLとしてのMySQLの動作確認(HandlerSocket)

やったこと

結論

  • データをセットしたらmysqlがぶっ壊れた(環境構築に問題があった?)
  • getだけで"perlからsingle getで"簡単に性能を測ったらそこそこでた(11300 req/sec)
  • pure C/C++で多重度をあげて測れば75万いくかも?

環境

  • CentOS 5.2
  • memory 4G
  • on VM
  • dual core cpu
model name      : QEMU Virtual CPU version 0.12.3
cpu MHz         : 2792.856
cache size      : 4096 KB

MySQL Server セットアップ

% ./configure \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-\innodb \
--\enable-local-infile \
--\with-unix-socket-path=/tmp/mysql.sock
% make
% sudo make install
% sudo /usr/local/mysql/bin/mysql_install_db
% sudo /usr/local/bin/mysqld_safe &
  • あとは文字コードをUTFにしたり、my.cnfのinnodbのパラメータを調節したり
  • 若干はまったけど、割愛

Handler Socket build

% mkdir ~/git ; cd ~/git
% git clone http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
% cd git/HandlerSocket-Plugin-for-MySQL/
% ./configure --with-mysql-source=/home/satoshi/src/mysql-5.1.51/ \
--with-mysql-bindir=/usr/local/bin

テーブル作成

CREATE TABLE user (
  id INT NOT NULL PRIMARY KEY,
  name char(32)
) ENGINE=INNODB;

参照の動作確認

  • 以下手順
(mysqlのデータ確認)
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

(telnetで接続してデータを取得する)
% telnet localhost 9998
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

# タブ区切り
# "satoshi" database, "user" table, index=3
REQ% P       3       satoshi user    PRIMARY id,name
RES% 0       1

# 上で指定したINDEX(=3)を使って検索する
# INDEX(3), 等しい, 1(?), PRIMARY=1, 1件, offset=0
REQ% 3       =       1       1       1       0
RES% 0       2       1       tanarky

# 上で指定したINDEX(=3)を使って検索する
# INDEX(3), 等しい, 1(?), PRIMARY=2, 1件, offset=0
REQ% 3       =       1       2       1       0
RES% 0       2       2       satoshi
  • 無事にデータが取得できた
  • 便宜上、telnet接続後のリクエストにはREQ%, レスポンスにRES%,を頭につけている
  • # 行はコメントってことで、リクエストの補足を書いている

更新の確認

  • まずはデータの確認
(mysqlのデータ確認)
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
  • データをinsertしてみる by telnet
% telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

# 接続
REQ% P       3       satoshi user    PRIMARY id
RES% 0       1

# id=1を取得(成功)
REQ% 3       =       1       1       1       0
RES% 0       1       1

# id=2を取得(成功)
REQ% 3       =       1       2       1       0
RES% 0       1       2

# id=3を取得(成功、データがないので空)
REQ% 3       =       1       3       1       0
RES% 0       1

# id=3をinsert(失敗?responseにinsertnumがない)
REQ% 3       +       1       3
RES% 0       1
  • mysqlを見てみる
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.01 sec)

mysql> select * from user where id = 3;
ERROR 1030 (HY000): Got error 134 from storage engine
  • データがぶっ壊れた
  • telnet経由でも値が取れず
  • perl client経由でも、値のセットとゲットができず(同じように壊れる)

性能測定

  • getのみ
  • perl clientから
  • single get
  • 以下がテストコード(test_client.pl)
use strict;
use warnings;
use Data::Dumper;
use Net::HandlerSocket;
my $args = { host => 'localhost', port => 9999 };
my $hs = new Net::HandlerSocket($args);
my $res = $hs->open_index(3, 'satoshi', 'user', 'PRIMARY', 'id,name');
warn Dumper($res);
for(my $i=0;$i<100000;$i++){
    $res = $hs->execute_single(3, '=', [ '1' ], 1, 0);
}
  • 実行結果(8秒後半-12秒弱)
  • portを9998(readonly)にすると、18秒くらいかかったり? 謎
% time perl test_client.pl
$VAR1 = 0;
perl test_client.pl  1.47s user 2.23s system 41% cpu 8.854 total

node.jsを試してみた その1: インストール

node.jsという存在を知ったので、調査+インストールしてみた。

名前だけは聞いたことがあったけど、
勝手にjQueryのようなクライアントサイドJavascriptを想像してました。
完全に間違い。

Evented I/O for V8 JavaScript.
An example of a web server written in Node which responds with "Hello World" for every request.
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
To run the server, put the code into a file example.js and execute it with the node program:
% node example.js
Server running at http://127.0.0.1:8124/
なんと、たった6行のJavascriptでHTTPサーバを作れるっつー話だからビックリ。

早速公式サイトからダウンロード。
今回試したバージョンは、
http://nodejs.org/dist/node-v0.2.3.tar.gz

$ http://nodejs.org/dist/node-v0.2.3.tar.gz
$ tar xvzf node*tar.gz
$ cd node-v0.2.3
$ configure
$ make
'build' finished successfully (5m41.814s)

コードが多いからか、コンパイルに時間がかかる。
コンパイルに使ったのは、Thinpad x100e memory 2G。
ちなみに、HP 2133だと14分、Mac miniだと3分25秒かかった。

あとは、公式サイトにあるhttpdコードを起動して動作確認。

/Users/satoshi% cat httpd.js 
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
/Users/satoshi% node httpd.js 
Server running at http://127.0.0.1:8124/

これで起動OK。あとはブラウザからhttp://localhost:8124/にアクセスすれば
ちゃんと動作していることがわかる。

で、性能測定してみると、こんな感じ。
 This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)


Server Software:      
Server Hostname:        localhost
Server Port:            8124

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      20
Time taken for tests:   0.886 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      76000 bytes
HTML transferred:       12000 bytes
Requests per second:    1128.29 [#/sec] (mean)
Time per request:       17.726 [ms] (mean)
Time per request:       0.886 [ms] (mean, across all concurrent requests)
Transfer rate:          83.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       9
Processing:     3   17   9.6     16      59
Waiting:        3   17   9.6     16      57
Total:          3   17   9.7     16      59

Percentage of the requests served within a certain time (ms)
  50%     16
  66%     20
  75%     22
  80%     24
  90%     28
  95%     36
  98%     48
  99%     51
 100%     59 (longest request)
比較のために、同様の出力をするapache2+php5.3.2 on Ubuntuだと
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)


Server Software:        Apache/2.2.14
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        177 bytes

Concurrency Level:      20
Time taken for tests:   1.104 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      389000 bytes
HTML transferred:       177000 bytes
Requests per second:    906.07 [#/sec] (mean)
Time per request:       22.073 [ms] (mean)
Time per request:       1.104 [ms] (mean, across all concurrent requests)
Transfer rate:          344.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3   2.5      2      18
Processing:    11   18   9.7     17      96
Waiting:        9   16   9.3     14      89
Total:         14   21  11.5     18     113

Percentage of the requests served within a certain time (ms)
  50%     18
  66%     20
  75%     20
  80%     20
  90%     21
  95%     35
  98%     81
  99%     98
 100%    113 (longest request)
となる。

比較としては公平とはいえないかもしれないけど、PHPよりも早いことがわかる。
これからもう少し詳しく調べてみる。

PHPいらない疑惑?


旭山動物園おみやげ 白クマ塩ラーメンを喰らう

今年も旭山動物園にいったので、去年とは違うお土産を買ってみた。

買ったのは、白クマ塩ラーメン。
人気のお土産らしい。

シロクマラーメン
シロクマラーメン2

白クマっていうくらいだから、勝手に白濁スープを想像してたけど、
透き通ったスープ。

味は、インスタントだと思ってバカにしてたけど、
意外と本格的(?)でおいしかった。

Yahoo!ショッピングでも買えるみたいなので、興味がある人はぜひ。

下の写真は、はじっこで固まってうごかないカピバラと、
めっちゃ近くまでよってきたペンギンの写真。
カピバラ
ペンギン

CentOS 5.5 に PHP 5.3 をinstall

CentOS に PHP 5.3 系をinstallしたときの備忘録。

とりあえず、
sudo yum install httpd php
としてみたが、バージョンが5.1.3という古さだったので、
せっかくなので、5.2じゃなくて、5.3系にバージョンアップしてみた

参考:
CentOS 5.3 に PHP 5.3 をインストールする - 総天然色頁
CentOS5.3にphp5.3をインストール - プログラマー某の外部記憶

実際に実行した手順は以下のとおり。
$ wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
$ sudo rpm -Uvh remi-release-5.rpm
$ sudo yum --enablerepo=remi info php
## 5.3 系であることを確認
$ sudo yum --enablerepo=remi install php
## エラーがでてこの時点では有効にならない
$ sudo yum --enablerepo=remi,epel update mysql\*
$ sudo /etc/init.d/httpd restart
## phpinfo() で 5.3系が起動していることを確認

やっぱり、めんどうだと思ってしまうCentOS。
自分が無知なだけだと理解することにする。

CentOS 5 に emacs23 を install したときのメモ

CentOS 5 に emacs23 を install したときのメモ

$ sudo yum install -y gcc texinfo
$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.2.tar.gz
$ tar xvzf emacs-23.2.tar.gz
$ cd emacs-23.2
$ configure --without-x
$ make
$ src/emacs -q
$ sudo make install
$ emacs --version 
GNU Emacs 23.2.1
Copyright (C) 2010 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

以前installしたときは、大分はまった記憶だが、今回はすんなりできた。
Ubuntuだと、sudo aptitude install emacs23-nox で終了なんだけどなぁ。

参考: Emacs 23.1 on CentOS - speg03の日記

Thinkpad x100e セットアップメモ

新しいノートパソコンとして、Thinkpad x100eを購入したので、
あっさりとWindows7を消して、Ubuntu 10.04をクリーンセットアップしたときのメモ。
  1. driver update(自動でタスクトレイ的なところに表示されるはず)
  2. フォルダ名を日本語に(先にディレクトリを作っておく)
/home/satoshi% cat .config/user-dirs.dirs
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Musics"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
  1. パッケージを最新に(sudo apt-get update)
  2. 無線LAN設定
  3. dropbox install
  4. システム>自動で起動するアプリ でマウススクロールを有効に
  1. 必要なrcなどを移動
mv ~/Dropbox/devel/screenrc ~/Dropbox/devel/emacs.el ~/
  1. flash player install + firefox restart
sudo aptitude install flashplugin-installer
  1. ibus setting(ctrl+space -> shift+space)
  2. 必須apt package install
sudo aptitude install -y \
git-core python-docutils mysql-server-5.1 \
apache2 apache2-dev php5 php5-cli php5-mysql

形態素解析エンジンmecabのjavaポーディングライブラリSenを使う

Senについて
>Sen は、Java で実装された形態素解析器で、工藤拓さんによりオープンソース(LGPL)で開発されている形態素解析器MecabをJavaへポーティングしたライブラリです。ChaSen?? やMecab等のC/C++で実装された形態素解析器をJavaから利用する場合、JNIを利用する必要がありますが、JNIを利用すると動作が不安定に なることがあり、また、JNIのオーバヘッドによりパフォーマスが低下します。Senは100% Javaで記述されているため、高信頼かつ高パフォーマンスを得ることができます(注:ChaSen??やMecabが安定していない、パフォーマスが低いという訳ではありません。JNIの特性上、そうなるということです)。
ということらしい。
Mecabの最終更新よりも若干古い(2006-03-28)のが気になるが、
とりあえず公式サイトのリンクからダウンロードして使ってみた。
  $ unzip sen-1.2.2.1.zip
  $ cd unzip sen-1.2.2.1
  $ ant
  $ chmod +x bin/sen.sh
  $ ./bin/sen.sh
  done.
  Please input Japanese sentence:
  [INFO] Dictionary - token file = ./dic/token.sen
  [INFO] Dictionary - time to load posInfo file = 49[ms]
  [INFO] Dictionary - double array trie dictionary = ./dic/da.sen
  [INFO] DoubleArrayTrie - loading double array trie dict = ./dic/da.sen
  [INFO] DoubleArrayTrie - loaded time = 1.952[ms]
  [INFO] Dictionary - pos info file = ./dic/posInfo.sen
  [INFO] Dictionary - time to load pos info file = 0[ms]
  [INFO] Tokenizer - connection file = ./dic/matrix.sen
  [INFO] Tokenizer - time to load connect cost file = 1431[ms]
  すもももももももものうち
  すもも  (すもも)        名詞-一般(0,3,3)        スモモ  スモモ
  も      (も)    助詞-係助詞(3,4,1)      モ      モ
  もも    (もも)  名詞-一般(4,6,2)        モモ    モモ
  も      (も)    助詞-係助詞(6,7,1)      モ      モ
  もも    (もも)  名詞-一般(7,9,2)        モモ    モモ
  の      (の)    助詞-連体化(9,10,1)     ノ      ノ
  うち    (うち)  名詞-非自立-副詞可能(10,12,2)   ウチ    ウチ
  ^C
  $ 


luceneとの連携に期待したが、lucene-jaのコードはどこだろう?
luceneはバージョン3までいってるので対応してるか不明。
とりあえず、これからもう少し詳しい使い方を調べてみる。

形態素解析エンジンmecabをjavaから使う @ Ubuntu 10.0.4

形態素解析エンジンMeCabをjavaから使ってみた。

libmecab-javaは、swigによるmecabのjava binding。
辞書はIPA。
詳しくは、 以下を参照。
http://mecab.sourceforge.net/bindings.html

動作確認のコードとコマンドは以下の通り
  $ sudo aptitude install
  $ cat TestMecab.java 
  import org.chasen.mecab.MeCab;
  import org.chasen.mecab.Tagger;
  import org.chasen.mecab.Node;
  
  public class TestMecab {
      static {
          try {
              System.loadLibrary("MeCab");
          } catch (UnsatisfiedLinkError e) {
              System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e);
              System.exit(1);
          }
      }
     
      public static void main(String[] argv) {
          System.out.println(MeCab.VERSION);
          Tagger tagger = new Tagger();
          String str = "太郎は二郎にこの本を渡した。";
          System.out.println(tagger.parse(str));
          Node node = tagger.parseToNode(str);
          for (;node != null; node = node.getNext()) {
              System.out.println(node.getSurface() + "\t" + node.getFeature());
          }
          //System.out.println ("EOS\n");
      }
  }
  $ javac -cp /usr/share/java/MeCab.jar   TestMecab.java
  $ java  -cp /usr/share/java/MeCab.jar:. TestMecab
  0.98
  太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
  は      助詞,係助詞,*,*,*,*,は,ハ,ワ
  二郎    名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
  に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
  この    連体詞,*,*,*,*,*,この,コノ,コノ
  本      名詞,一般,*,*,*,*,本,ホン,ホン
  を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
  渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
  た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
  。      記号,句点,*,*,*,*,。,。,。
  EOS
  
          BOS/EOS,*,*,*,*,*,*,*,*


これで動作確認OK。

centosでgmailを使ったメール送信

設定で若干手間取ったので、自分用にメモ。

基本的に以下のサイトの通りの手順
» Postfix から Gmail 経由でメールを送る linux.matchy.net: 〜Linuxで遊ぼう!〜
  1. sendmailはインストールしていたら削除しておく
  2. /etc/posfix/main.cfを編集
  3. 2.で指定した場所(smtp_sasl_password_maps)にパスワードファイルを作成
  4. フォーマットは「[smtp.gmail.com]:587 ユーザ@gmail.com:パスワード」
  5. 3.のテキストファイルからpostmapコマンドでHASHファイル作成
  6. postfix再起動
/etc/postfix/main.cfの中身は以下。
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
実行したコマンドは以下の通り。
% sudo yum remove sendmail
% sudo yum install postfix cyrus-sasl-plain
% sudo vi /etc/postfix/main.cf
% sudo vi /etc/postfix/sasl_passwd
% sudo chmod 400 /etc/postfix/sasl_passwd
% sudo postmap /etc/postfix/sasl_passwd
% sudo /etc/init.d/postfix restart

というわけで、無事にメールが届きました。
携帯にも届いた。文字化けも無し。

経堂のラーメン英(ひで)で正統派豚骨ラーメンを喰らう

ラーメン 経堂

大きな地図で見る

暑い日が続いてるけど、熱いラーメンが食べたくて、
わざわざ 隣駅(経堂)までいって豚骨ラーメンを食べた。

焼豚が独特の香りでとてもうまい。
スープも正統派豚骨って感じで非常においしくいただきました。

食べ終わる頃には汗だくになってしまったけど、
帰るときに無料でソフトクリームのサービスもありました。

もうちょっと涼しくなったらまた食べにいこう。

Apache luceneで日本語ファイル(UTF-8)の検索 on MacOSX

まずは普通にIndexの作成と検索の実行をしてみたら
文字化けしてうまくHITしなかった。
/Users/satoshi/src/lucene-3.0.2% rm -rf index/
/Users/satoshi/src/lucene-3.0.2% java -cp lucene-core-3.0.2.jar:lucene-demos-3.0.2.jar org.apache.lucene.demo.IndexFiles src
Indexing to directory 'index'...
adding src/demo/org/apache/lucene/demo/DeleteFiles.java
adding src/demo/org/apache/lucene/demo/FileDocument.java
adding src/demo/org/apache/lucene/demo/html/Entities.java
adding src/demo/org/apache/lucene/demo/html/HTMLParser.java
adding src/demo/org/apache/lucene/demo/html/HTMLParser.jj
adding src/demo/org/apache/lucene/demo/html/HTMLParserConstants.java
adding src/demo/org/apache/lucene/demo/html/HTMLParserTokenManager.java
adding src/demo/org/apache/lucene/demo/html/ParseException.java
adding src/demo/org/apache/lucene/demo/html/ParserThread.java
adding src/demo/org/apache/lucene/demo/html/SimpleCharStream.java
adding src/demo/org/apache/lucene/demo/html/Tags.java
adding src/demo/org/apache/lucene/demo/html/Test.java
adding src/demo/org/apache/lucene/demo/html/Token.java
adding src/demo/org/apache/lucene/demo/html/TokenMgrError.java
adding src/demo/org/apache/lucene/demo/HTMLDocument.java
adding src/demo/org/apache/lucene/demo/IndexFiles.java
adding src/demo/org/apache/lucene/demo/IndexHTML.java
adding src/demo/org/apache/lucene/demo/README
adding src/demo/org/apache/lucene/demo/SearchFiles.java
adding src/jsp/configuration.jsp
adding src/jsp/footer.jsp
adding src/jsp/header.jsp
adding src/jsp/index.jsp
adding src/jsp/README.txt
adding src/jsp/results.jsp
adding src/jsp/WEB-INF/web.xml
Optimizing...
621 total milliseconds
/Users/satoshi/src/lucene-3.0.2% java -cp /usr/libexec/lucene/3.0.2/lucene-core-3.0.2.jar:/usr/libexec/lucene/3.0.2/lucene-demos-3.0.2.jar org.apache.lucene.demo.SearchFiles
Enter query: 
あああ
Searching for: "�� �� ��"
0 total matching documents
Press (q)uit or enter number to jump to a page.
^C%
/Users/satoshi/src/lucene-3.0.2% cat src/demo/org/apache/lucene/demo/README
dragon ash
independent
日本語
あああ
東京%

javaの文字コードがshift-jisになってるのが原因らしい。
以下のサイトを参考に_JAVA_OPTIONS=-Dfile.encoding=UTF-8を設定してみた。
Mac OS X で Java SE 6 を使う : エンコーディングを UTF-8 で使いたい - Masaki Katakai's Weblog
export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"
というわけで、INDEXの作り直しして、再度検索してみると、、、
/Users/satoshi/src/lucene-3.0.2% rm -rf index/
/Users/satoshi/src/lucene-3.0.2% java -cp lucene-core-3.0.2.jar:lucene-demos-3.0.2.jar org.apache.lucene.demo.IndexFiles src
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Indexing to directory 'index'...
adding src/demo/org/apache/lucene/demo/DeleteFiles.java
adding src/demo/org/apache/lucene/demo/FileDocument.java
adding src/demo/org/apache/lucene/demo/html/Entities.java
adding src/demo/org/apache/lucene/demo/html/HTMLParser.java
adding src/demo/org/apache/lucene/demo/html/HTMLParser.jj
adding src/demo/org/apache/lucene/demo/html/HTMLParserConstants.java
adding src/demo/org/apache/lucene/demo/html/HTMLParserTokenManager.java
adding src/demo/org/apache/lucene/demo/html/ParseException.java
adding src/demo/org/apache/lucene/demo/html/ParserThread.java
adding src/demo/org/apache/lucene/demo/html/SimpleCharStream.java
adding src/demo/org/apache/lucene/demo/html/Tags.java
adding src/demo/org/apache/lucene/demo/html/Test.java
adding src/demo/org/apache/lucene/demo/html/Token.java
adding src/demo/org/apache/lucene/demo/html/TokenMgrError.java
adding src/demo/org/apache/lucene/demo/HTMLDocument.java
adding src/demo/org/apache/lucene/demo/IndexFiles.java
adding src/demo/org/apache/lucene/demo/IndexHTML.java
adding src/demo/org/apache/lucene/demo/README
adding src/demo/org/apache/lucene/demo/SearchFiles.java
adding src/jsp/configuration.jsp
adding src/jsp/footer.jsp
adding src/jsp/header.jsp
adding src/jsp/index.jsp
adding src/jsp/README.txt
adding src/jsp/results.jsp
adding src/jsp/WEB-INF/web.xml
Optimizing...
682 total milliseconds/Users/satoshi/src/lucene-3.0.2% java -cp /usr/libexec/lucene/3.0.2/lucene-core-3.0.2.jar:/usr/libexec/lucene/3.0.2/lucene-demos-3.0.2.jar org.apache.lucene.demo.SearchFiles
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Enter query: 
東京
Searching for: "東 京"
1 total matching documents1. src/demo/org/apache/lucene/demo/README
Press (q)uit or enter number to jump to a page.
^C%

と、文字化けせずに無事に検索できました。
ちなみに、手持ちのUbuntu環境だと、特に_JAVA_OPTIONSで文字コードを設定しなくても
日本語ファイル(UTF-8)のIndexingと検索に成功しました。
なんでMacはShitf-JISなんだろうな。。。


検索エンジンApache lucene 3.0.2をインストール+サンプルをお試し

アグレッシブエンジニア: 検索エンジンApache Luceneをインストールしてサンプルを動かしてみるを参考にして、最新版の3.0.2を動かしてみた。

参考:
Apache Lucene - Building and Installing the Basic Demo

結局のところ、いつもはまるのは、CLASSPATHのところなんだけど。
$ wget http://ftp.riken.jp/net/apache//lucene/java/lucene-3.0.2.tar.gz
$ tar xvzf lucene-3.0.2.tar.gz
$ cd lucene-3.0.2/
$ ant && ant war-demo
$ java -cp lucene-core-3.0.2.jar:lucene-demos-3.0.2.jar org.apache.lucene.demo.IndexFiles src
$ java -cp lucene-core-3.0.2.jar:lucene-demos-3.0.2.jar org.apache.lucene.demo.SearchFiles
無事に検索できました。
/home/satoshi/src/lucene-3.0.2% java -cp lucene-core-3.0.2.jar:lucene-demos-3.0.2.jar org.apache.lucene.demo.SearchFiles   
Enter query:
title
Searching for: title
7 total matching documents
1. src/jsp/header.jsp
2. src/demo/org/apache/lucene/demo/HTMLDocument.java
3. src/demo/org/apache/lucene/demo/SearchFiles.java
4. src/jsp/results.jsp
5. src/demo/org/apache/lucene/demo/html/HTMLParser.jj
6. src/demo/org/apache/lucene/demo/html/Test.java
7. src/demo/org/apache/lucene/demo/html/HTMLParser.java
Press (q)uit or enter number to jump to a page.
q
前は、日本語を含む文章の動作確認とか、カテゴリ絞り込みとかやろうとして
断念してたので、次こそはもうちょっと先に進めてみたいと思う。

今度こそ完全に満足できる zshrc に挑戦

今まで何度も挑戦して、中途半端な状態にあったbash -> zsh 移行を
今度こそ本腰を据えてやってみたので、そのログ。

結局不満なのは2点
  • 色設定
    • MacやUbuntuともに満足できる色設定
  • Tabを押しすぎて補完候補を通り過ぎてしまったイライラ解消
 まずは、以下のサイトの内容をベースに変更
【コラム】漢のzsh (22) もってけ泥棒! コピペで始めるzsh - リターンズ | エンタープライズ | マイコミジャーナル
欲しかったのは色設定部分だけだけど、遠慮なくもってけ泥棒してみた。

でも、lsしたときの青が見難いので、以下のサイトをもとに変更
Mac zshのカラー設定を変更した | goryugo, addicted to Evernote
【コラム】漢のzsh (9) 世界はモノクロからカラーへ | エンタープライズ | マイコミジャーナル
ディレクトリの青色表示はやめて、結局緑にしました
ついでに、lsに-Fオプションを追加

tab連打で候補がすぎてしまったときのイライラ解消法
Did you reboot?:zshキーバインド Shift-tabで補完候補を逆戻りするように設定 - livedoor Blog(ブログ)

だいたいこれで自分の中では満足行ける.zshrcが書けた。
今まで色々我慢してたけど、これでHappy zshライフを満喫予定。

screen で256色表示させる(Ubuntu) : Serendip - Webデザイン・プログラミング
最後に.screenrcに256色設定して終了。


結局現時点で満足のいく.zshrcはgithubに登録しておいたので
興味がある人はご自由にどうぞ。

Access-Control-Allow-Origin ヘッダーをためしてみる その1

404 Blog Not Found:Ajax - Goodbye, JSONP. Hello, Access-Control-Allow-Origin
そこで登場したのが、こちらです。
要はAccess-Control-Allow-Originヘッダーにアクセス元のドメインが入っているか、*でワイルドカード指定されているかすれば、Same Origin Policy は適用されないよ、というわけです。
これは知らなかったので、まずは自分が管理しているGoogle App EngineのAPIで
HTTP Response header に Access-Control-Allow-Origin: * をつけるようにしてみた

Pythonのコードとしては、
self.response.headers['Access-Control-Allow-Origin'] = '*'
を加えるだけだった。
Firefox addon の Live http headerでちゃんと
Response headerについていることが確認できた。

次は、他のドメインからXHRでこのAPIのデータを取得してみようと思う。

表参道ヒルズでやってた梅佳代 写真展「ウメップ」にいってきた

2010/08/22までなので、すべりこみで
梅佳代 写真展「ウメップ」
にいってきた。
umped

梅佳代という写真家については、
たしか情熱大陸か何かで知ったけど
普段の生活に存在する(主にすげー笑える)写真っていう感じの写真が
とても癒されるので結構ファン。
梅 佳代(うめ かよ、1981年3月23日 - )は日本写真家石川県鳳至郡柳田村(現在の鳳珠郡能登町)出身。
高校卒業後、日本写真映像専門学校に入学し大阪に住む。同校卒業後は、東京を中心に各地で活動を展開している。「写真新世紀」にて、「男子」と「女子中学生」で佳作を2回受賞。2002年に『美術手帖』の写真表現特集で、注目の写真家として取り上げられる。2007年、写真集『うめめ』で第32回木村伊兵衛写真賞を受賞。
東京をはじめ、パリ、ロンドン、タイで展覧会を開催。
愛用のカメラはキヤノン EOS 5。基本的に標準レンズ、プログラムモードのみで撮影する。
結構ファン、といいつつ、本はもってないので、
販売スペースで売ってたポストカードとバッジを購入して貢献しました。

生まれてはじめて猫カフェに行ってみた(原宿:cat room chamamo)

話のネタに猫カフェってものにいってきた。
場所は原宿。料金はおためしで15分だけ。ワンドリンクをつけて、550円でした。

大きな地図で見る

ネコカフェ1
眠そうで不機嫌な猫

cat cafe2
勤務中猫(ほぼ)大集合

cat cafe3
じゃれあい開始(白猫がふっかけてた)

cat cafe3
ひたすら毛繕い?してる猫。むちゃむちゃいってた。

cat cafe4
眠そうな猫2。この写真を撮った後、体勢を反対にして寝た。

cat cafe5
目の色がオレンジの猫。かっこよかった。

人間にかまわれすぎて、若干うざがってる猫もいたけど、
仕事だからがんばろうね、と猫にいいたくなった社会人なおれ。

また気が向いたらいくかもしれない。

参考リンク:
[cat room chamamo]東京/原宿の猫カフェ(ネコカフェ)
新・間違いだらけの猫カフェ選び : 原宿「cat room chamamo」

jQuery UI のアイコンセットについてのメモ(改行される罠)


jQuery UIは、激しく便利なんですが、最近アイコン周りの仕様で
若干はまったので、備忘録メモ。

アイコンを表示するときには、
<span class="ui-icon ui-icon-cart"></span>これがアイコンです
と書いて表示するんですが、実際に表示すると、

これがアイコンです

となり、spanでくくってるのに改行が入ってしまいます。
なんのことはなく、jQuery UIのCSSが、display: block;
と指定しているので、改行が入ってしまう。

というわけで、
<div style="float:left"><span class="ui-icon ui-icon-cart"></span></div>これがアイコンです
とfloat: left; と指定することにより、

これがアイコンです

と改行なしで表示できるようになるけど、
1行の中にアイコンをいれたいときとかは、かなり面倒になる。

日本人がメールの文章の間に絵文字を入れる感覚で
アイコンを文中に自由に入れることを想定してない作りになってる。

なおこの話は、1.8.4で動作確認しました。

WebサイトのスクリーンショットをとれるCapture full pageが便利すぎる


webサイトのキャプチャーをとれるCapture full pageがめちゃ便利。
キャプチャーしたいURLを入力するだけで画像にしてくれる。

スクロールしないと見れない長いページも1発で画像にしてくれるので、
かなり便利。

参考:
後でつなぎ合わせる必要なし! Webページのスクリーンショットが一発で撮れる「Capture Full Page」 : ライフハッカー[日本版]

jQuery Mobileについて調べてみた その1:仕様とか


jQuery Mobileというライブラリの存在を知ったので、色々調べてみた。
  • まだリリースされていない。2010年末にリリース予定らしい
  • クロスプラットフォーム&クロスデバイス
    • といっても、スマートフォンやiPadのようなタブレットPCがスコープ内
    • (当然ながら)日本のガラケーはスコープ外
  • iPhoneのように、スクリーンをタッチして操作するUIが前提
    • 大きいボタンなどの操作しやすいUI
今まで本気でモバイル用サイト開発に向き合ってなかったけど、
これがリリースされたら、本気で作ってもいいかなと思った。

普通の携帯はなくなればいいと思っている原理主義者、tanarky

西麻布 五行で焦がし醤油ラーメンを喰らう


大きな地図で見る
会社が移転して、やや遠くなったのでしばらくいってなかったですが、
久々に喰らって来ました、五行の焦がし醤油ラーメン。

ラードと一緒に醤油を焦がした香ばしさがくせになるおいしさ。
かなり熱いスープと麺なので、やけどに注意。

五行

奥は、一緒に頼んだポテトサラダ。

ごちそうさまでした。

公式ホームページによると、代々木上原にも新しくできてたのね。
今度いってみよう。

これも自分と認めざるをえない展 (佐藤雅彦ディレクション)に行ってきました

21
佐藤雅彦ディレクションの"これも自分と認めざるをえない"展 を見てきました。
場所は、六本木MIDタウン内 21_21 DESIGN SIGHT



大きな地図で見る

公式ホームページはこちら

概要

とりあげた
「属性」
指紋 虹彩 声紋
指紋 虹彩 声紋
展示中の
新作
「指紋の池」
ユークリッド
「2048」
緒方壽人
「新しい過去」
佐藤雅彦 +
藤本直明
近年私たちの日常生活では、防犯や、より快適な暮らしを楽しむために、個人を特定する技術や方法が急速に開発され、様々な場面で応用されています。それは 言い換えると、例えば指紋や静脈といった人の「属性」が、自分自身から切り離されて一人歩きする社会が、身近に迫っていると言えるのではないでしょうか。

展覧会ディレクターの佐藤雅彦は、NHK 教育番組「ピタゴラスイッチ」やアート作品「計算の庭」に代表されるように、複雑な概念も新しい表現方法によって本質をシンプルに浮かび上がらせ、親しみやすい形に昇華させてきました。

本展では、自分を形づくる要素を探る、インタラクティブな映像や最先端のテクノロジーを駆使した新作と、「属性」という概念の理解を深める招待作品により 構成されます。国内外の作家による芸術表現と科学技術が交差する体験型の作品の数々を通して、自分自身の認めざるをえない「属性」を発見する機会をつくり ます。

デザインやものづくりの前提として当然存在するように思われている「自分らしさ」や「個性」について、来場者とともに新たな視点を思索していきます。
鑑賞時間について
本展では、体験型の作品が多く、鑑賞にお時間をいただいております。 館内の混雑状況にもよりますが、特に土日祝日は作品によって1時間以上お待ちいただく場合もございますので、予めご了承ください。 現在、比較的スムーズにご覧いただけるのは平日の早めのお時間となっております。 ご不便をおかけいたしますが、少しでも多くのお客様にお楽しみいただくために、ご考慮いただけますよう、お願い申し上げます。
体験するものが多いので、並ぶのを覚悟で行ってください。
並ぶ分、新しい発見ができるので、時間に余裕を持っていくべし!


佐藤雅彦の展示は、毎回あるたびに足を運んでいますが、
毎回楽しませてくれます。行ったことがない人もある人も、
今回の展示はおすすめです。


読み終わったーブログ 開設しました

yomiowatter Blog ( 読み終わったーブログ )を開設しました。

主に、Yomiowatter 読み終わったー : 誰かが読み終わった本をいますぐお知らせ!
のログを集計して、いろいろな角度からランキング形式で記事にしていこうと思います。

今から秋の夜長用の本をチェックしてみては?
(気が早いか?)

大阪旅行でなんば花月前のがんこラーメンを喰らう

大阪旅行にいってきたときに、なんば花月前にあるがんこラーメンで食べてきました。

がんこ3 がんこ2 がんこ1

目印は、でっかい骨がぶらさがってるお店。
店内はカウンターのみの10席くらいしかない。
ここの売りは塩ラーメン。写真真ん中が、塩ラーメン(ネギ油 )で、
写真左が、塩ラーメン(エビ油)。どっちもかなりおいしい。

この店、店長が嫁さんの大学時代の知り合いとのこと。
大学時代に食べた高田馬場のがんこラーメンの味に惚れて、
弟子入りし、見事のれん分けしてもらった、とのこと。

なんば花月前の店、ということもあって、
吉本の芸人さんもよく訪れるらしく、写真がいっぱい貼ってありました。
また、隣のたこ焼き屋も有名らしく、ラーメンを食べた後に
たこ焼きも食べちゃいました。

元祖一条流がんこ十六代目(がんそいちじょうりゅうがんこじゅうろくだいめ) | 学習院下、面影橋、高田馬場/ラーメン一般 | livedoor グルメ

高田馬場にある店はいったことがないので、今度いってみようと思います。

サントリー オールフリーを買って飲んでみた

ノンアルコールビールテイスト飲料 オールフリー サントリー
all free

「3つのゼロで世界初、 これがいいのだ」というキャッチコピーと
中吊り写真の謎の渦巻きは、あの漫画とかかってるってことを
公式ホームページではじめて知った。

まだわからない人は、
製品特長|ノンアルコールビールテイスト飲料 オールフリー サントリーの動画を
最後まで見ればわかります。
っつーかこのCMの榮倉奈々はきゃわいーん。

肝心の味、っつーと、ビール、、、なのか?って感じ。
変な味がしたり、まずい、っていう印象はない。
飲んだ後に、ほのかにかおるホップのような匂いがビールっぽさなのかも。

今度会社で仕事中に飲んでみようかな(笑)

読了:ザ コピーライティング 心の琴線にふれる言葉の法則 (ジョン ケープルズ)



ザ コピーライティング 心の琴線にふれる言葉の法則 (ジョン ケープルズ)を読了した。
翻訳監修は神田昌典。広告の本をよく出している人。

ふらりと寄った自宅近くの図書館にあったので借りて読んでみた。

最近よく考えるのが、効果的な広告ってどんなものだろう?ということ。

広告は、必要がない人にとってはうざい情報にしかすぎないけど、
必要な人にはものすごい価値がある。インターネット広告システム側で、
世代や性別、その人の趣味趣向に応じた広告を配信することは可能だが、
そもそもの広告クリエイティブでどうやって人の心に訴えるか、ということも
気になっていたところ、この本に出会った。

中を読んでみると、広告を作る際の具体的な手法や方法論について、
細かく書かれてある。例えば、効果的な広告見出しを作る方法。
  • 「新情報」見出し
    • 見出しを「発表」で始める
    • 見出しを「いま、さあ、ついに」で始める
    • 見出しを「とうとう、いよいよ」で始める
    • (略)
  • 価格に関する見出し

    • 割引価格をメインにする
    • 支払いの簡単さをメインにする
    • 無料提供をメインにする
    • (略)
  • 情報やエピソードを提供する見出し

    • 役に立つ情報を提供する
    • エピソードを伝える
  • キーワードを使う見出し

    • 見出しに「理由、なぜ」をいれる
    • 見出しに「求む」をいれる
    • 見出しに「アドバイス」という言葉を入れる
    • (略)
  • その他

    • 見出しを証言スタイルにする
    • 読み手を試す質問をする
    • 今はまだ買わないように伝える
    • 見出しを質問形式にする
    • (略)
広告を考えるときの具体的な方法がそれぞれ詳しく書いてある。

手元においておいてもいいな。
ブックオフか中古でもいいので、探してみるかな。

GIGAZINEのシステム構成について考えてみる その1 現状把握

【求人募集】GIGAZINEのために働いてくれる記者・編集を募集します - GIGAZINE
【求人募集】GIGAZINEで働きたいネットワークエンジニア・Webプログラマー・Webデザイナーを募集します - GIGAZINE

を読んで、色々思うところがあったので、Gigazineというサイトについて考えてみた。

まずは今のサイトの現状について調べてみた。
  • PV

    • 180-250万PV/day
    • システム全体で、60req/sec くらいの処理ができればピークも食えるか

  • 記事数

    • 1記事15k程度なので、全記事で(圧縮して)260Mぐらいか

  • 画像数

    • 広告用画像はどれくらいあるのかは不明
    • 1つの画像は、オリジナル画像100k, サムネイル30k程度(と仮定)
    • 全部で6-7Gの画像
    • 帯域的には、100k*PVピーク=6MByte/sec=48Mbps? なんか多い気がする

      • Not Modifiedで返してる部分もあるし、こんなにはない気がする

  • マネタイズ

    • 「GIGAZINE.BIZ - 広告枠」に詳細あり
    • 期間毎の枠売りってことか?
    • 枠が売れてないときはAdsenseやAmazonを表示している?
    • 実際に売れてるか、価格がいくらかは、謎
    • 1ページに対して11個も枠があるので、PVの11倍の広告配信部分への負荷がある

      • ピークで、660req/secの計算
    • h1タグがないけど、SEO対策はあまり本気でやってない?
    • 男性比率高すぎワロタ

  • デバイス別サービス

    • iPhoneなどのスマートフォン向けページは用意していない

  • システム環境

    • php 4.4.8
    • MySQLのバージョンは不明
    • だいぶ古い構成
    • 広告配信もふくめて、PHPでやってる
とりあえず、こんなところか。

新たなレンタルサーバ探しの旅( vpslink -> dti vps -> saases vps )

アグレッシブエンジニア: 仮想専用レンタルサーバをバッチ処理用に借りてみた(VPSlink)
というわけで、VPS環境を借りてみたんだけど、思ったように動かなくて
いまいちだったので、解約しました。

いまいちと感じた一番の理由は、
cpanにあるperlモジュールのセットアップでフリーズする、という
致命的なもの。

OSを自分で選べるので、色々ためしてみたけど、
あと、Planがしょぼすぎるのかと思って、上位プランにあげてみたけど、
結果は改善されなかったので、止めました。
さようなら。

とはいっても、VPS環境は絶対欲しいので、色々調べてみました。
お金だけをみると、SaaSesだけど、ここを知る前にDTIを契約してしまったので、
今はDTIを使ってます。OSについては、本当はDebianかUbuntuがいいんだけど、
CentOSで妥協しました。

無事にPerlモジュールもセットアップできて、うまくバッチ処理が動いてるのを確認。

お金も安くすんで、日本語サービスなので、よかったよかった。
しばらくはここで落ち着けそうです。

読み終わったー(yomiowatter)の更新が復活しました

レンタルサーバのセットアップも無事に終わったので、
今まで更新が止まっていたサービス、
Yomiowatter 読み終わったー : 誰かが読み終わった本をいますぐお知らせ!
の更新を再スタートさせました。

いろんな人に、サービス停止してるなんてもったいない、
というお言葉をもらいながらも、今まで対応できてませんでした。

とはいえ、ようやく再スタートさせたけど、
すでにappengineの無料容量制限を22%消費している状態。
久しぶりにクロール再開させたら、前よりも早いスピードで
データがたまってる気がする。
こりゃあと3ヶ月もつかな、って感じ。

ま、データがいっぱいになってから考えよう。。。

Netbook の Ubuntu を再インストール

どうもメイン開発マシンのnetbookが遅くなってきたので、
lubuntuとかインストールして軽量化を図ろうとしたら、
いまいちの使いごこちだったので、戻そうとしたけど、
もどらずに挙動がおかしくなったので、再インストールしたでござる、の巻

忘れないうちにメモ。
  • 以前インストールに使ったUSBメモリ(2G)を使って再インストール
  • 有線ケーブルをつないでインストールした 
    • インストール後に有線でネットにつないで無線LANのドライバをダウンロード
    • 無線LAN(airmac)のパスワードを忘れたのでgit上に保管した
  • 言語は英語にした
    • OSのメニューとかは英語でも全然わかる
    • 英語でインストールするのと、日本語でインストールするのは、若干画面が異なる
      • ツールバーが黒(英語)としろ(日本語)
      • 無線LANの認識がよさげ(英語)
      • 日本語バインディングは、英語でインストールした後でいい
      • フォルダ名は変更しない(Downloads -> ダウンロード などにしない)
    • 日本語入力が問題なので、sudo aptitude install scim-anthy して再起動
  • emacs23をいれた sudo apritude install emacs23-nox
  • 大事なファイルはDropboxにいれてたので、手動ではバックアップせず再インストール
    • 一部手動でダウンロードしたムフフファイルは消えた
    • 家にファイルサーバでもたてようかと思った
  • 再インストールしたら動きが軽くなった
    • 今までは何が悪さしてたのか? firefox ?
    • 定期的に再インストールするのもありかも
  • 忘れがちな設定
    • firefox + firemacs
    • anthyで全角入力時でも半角スペース+半角数字に
 以上。
日曜日がまるまるつぶれました。

2009年8月から365記事目の投稿(ほぼ毎日更新達成)

2009年8月から、今まで何度か挫折したBlogを今度こそ続けようとして、
毎日更新というハードルをもうけてやってきたわけですが、
この記事をもって、晴れて365記事目の投稿となりました。

毎日更新というハードルを設定したのは、
おれみたいなちっぽけなやつが書くBlogを
見てもらうようになるためには、
せめて、つまらなくても毎日更新でもしてないとだめだな、
って考えたのが理由です。

で、1年間、色々考えながら+試しながら記事を書いたわけですが、
順調にPVを伸ばすことができました。
見てくれた皆さん、ありがとう。


画像の縦軸の単位を隠してるのがやらしいですが、ご容赦ください。

グラフを見てみると、年明けからアクセスが伸びていることが分かりました。
基本的に、このブログは休日にはPVがさがり、年末年始みたいな
大型連休には閑散とした状態になります。
年末年始の閑散状態がなくなったなー、と思ったころに、
PVが伸び初め、GWまでぐいぐいっと上がってるのがわかります。

1月からは、最新の技術動向にいち早く反応して記事を書いたり
したような気がします。特にCassandra関連の記事がものすごく
好調で、長くPVを稼いでくれました。

さて、これからは、できるだけ、毎日更新をつづけたいとは思いますが、
クオリティも重視していきたいので、このハードルは止めようと思います。
毎日更新を意識しすぎて、適当な記事が増えた感が自分の中で出てきちゃったので。

とはいえ、引き続き、
ブログを続けていこうともいます。
これからも見ていただけたらうれしいです。


Yahoo!JapanとGoogleとの提携についての記事まとめ

まとめてみた。

Togetter - 「Y!JがGoogle検索を採用したことに関して、アスキー総研遠藤諭さんの発言」
ヤフーが見ているのはユーザーもさることながら広告主ですからね。総合的に考えるとベストチョイスではないですかね。
肯定的な意見。たしかに、ビジネス上は問題なさそうな気はするが、、、。

「国内最速の検索技術を提供」 Google、Yahoo!JAPANへの技術提供にコメント
Googleの検索連動広告の技術もヤフーに提供し、ターゲティングやリポートをバックエンドで支える一方、広告の獲得などは別々に行い、「両社の広告主と広告データは完全に分離して保持される」という。
広告主としてはどっちに出稿したいと考えるのか気になる。
単純に検索クエリーシェアで選ぶ?

Google Japan Blog: Yahoo! JAPAN のより良い検索と広告サービスのために
ヤフー株式会社はオークション、ショッピング、知恵袋といったコンテンツを Google の日本語の検索結果に加えられるように提供します。
ヤフオクのデータは巨大かつ情報の鮮度が命なので
直接連携できるとGoogleにとってもおいしい、ということか。

痛いニュース(ノ∀`) : ヤフー井上社長「グーグルがすごいとは思わない。グーグルの『すごい』ものは、いずれもグレーゾーン」 - ライブドアブログ
グーグルですごいと言われているのは、いずれもグレーゾーンのものではないか。検索連動広告は米ヤフーの真似だし、
今となっては完全にネタですね。

ヤフー井上社長に聞く:「『健全な場』が最後に勝つ」「ケータイはPC超える」「Androidはうさん臭い」 (1/4) - ITmedia News
Androidは「無料でやります」と言っているのがうさんくさい。ちゃんとお金を取ってやるべきじゃないかとぼくは思う。「何か後ろで悪いこと考えているんじゃないのか」と思うじゃないですか。
これも今となってはネタ。今のところiPhoneほどキャズムは超えてないけど、
無料だとうさんくさい、という感覚は個人的にはわからない。
ジェネレーションギャップ、というところか?

以下、Yahoo!Japanからの発表(リンク先は、すべてPDF)

よくあるご質問: Yahoo! JAPANの検索サービスにおけるグーグルの検索エンジンと検索連動型広告配信システムの採用、ならびにYahoo! JAPANからグーグルへのデータ提供について (2010/7/27)
 検索連動型広告においても、広告主が希望するキーワードに値段を付け、オークション形式により広告の掲載可否や順序を決定する場である「マーケットプレイス」を、これまでどおり Yahoo! JAPAN 独自のものとして維持してまいります。
GoogleとYahooは別市場として、広告主はそれぞれbitする、ってことか?
わかりにくい、というクレームにはならないのか、
むしろbit価格が下がってHappyなのか、わからない。

Yahoo! JAPAN の検索サービスにおけるグーグルの検索エンジンと検索連動型広告配信システムの採用、ならびにYahoo! JAPAN からグーグルへのデータ提供について (2010/7/27)
検索エンジンと検索連動型広告配信システムの提供をYahoo!JAPANが受ける契約の期間は 当初2年ですが、その後 Yahoo! JAPAN が断らなければ自動的に2年延長されます。
Yahoo側が提携を断るようになるきっかけとなるのは何だろうか?
と考えると、可能性が高いのは、
  • 検索会社を買収
  • Bingにのりかえ
  • 自社で開発
今までYahoo.incに頼ってきたりしたYahoo!Japanが自社で開発する
というのは考えにくい。
独自のエンジンを持つ検索会社はがんばりどきですよ、と。

「Bingも無視していたわけではないが」——井上社長が語る、ヤフーがGoogleを選んだ理由 - ITmedia News
井上社長は、「すべての比較項目で全部満点という検索エンジンはない。評価項目は何十個もあるが、Googleでやるのが一番いいだろう」と判断。「決め手」として挙げられるポイントは「ない」と話す。
これは同意。今の日本では、Google、というブランドが持つ知名度はでかい。
実際Bingとの差って何があるんだろう、と思って軽く調べてみた。
検索HIT数に差がある、と思った。
多ければいいってものでもないけど。

Yahoo!JAPANのGoogle採用、「AMDからIntelに変わったようなもの」と孫社長 - ITmedia News
「Yahoo! JAPANとGoogleの提携は競争を排除」とMicrosoft - ITmedia News
Yahoo!JAPANとGoogleの検索提携に異論 公取委は「監視続ける」 - ITmedia News

こんなもんかな。

今の時点でいくら騒いでも、Yahoo!Japanが決断したことなので、
実際に切り替えされるのを待って、自分の目で見て考えるしかないですな。

また提携解消とかなるかもしれないし笑


便利ブックマークレット その17:はてなブックマークホットエントリーの更新状況を表示

便利ブックマークレット その13: Yahoo!トピックスの内容を表示するを参考にして、
Yahoo!トピックスよりもネタ的に面白い
はてなブックマークホットエントリーの更新内容を表示させる
ブックマークレットを作った。
javascript:function ld(u){var s=document.createElement('script');s.setAttribute('src',u);document.body.appendChild(s);}ld('http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_hotentry.js?'+Date.now());void(0);

これで、はてぶにいかなくても、更新状況が調べられます。

このブックマークレットを実行する
↑これを押せばブックマークレットを実行できます。
気に入ったら、右クリックで「このリンクをブックマーク」でブックマーク登録ができます。

これも、デザインの調整は後でやります。(たぶん)

便利ブックマークレット その16:Yahoo!天気で東京の天気を調べる

便利ブックマークレット その13: Yahoo!トピックスの内容を表示するを参考にして、
Yahoo!天気のRSSから東京の週間天気予報を表示させる
ブックマークレットを作った。
javascript:function ld(u){var s=document.createElement('script');s.setAttribute('src',u);document.body.appendChild(s);}ld('http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_yahoo_weather.js?'+Date.now());void(0);

これで、いちいちYahoo!天気にいかなくても、
東京の天気が調べられます。

このブックマークレットを実行する
↑これを押せばブックマークレットを実行できます。
気に入ったら、右クリックで「このリンクをブックマーク」でブックマーク登録ができます。

これも、デザインの調整は後でやります。(たぶん)

便利ブックマークレット その15:flickrの猫画像検索で癒される

便利ブックマークレット その13: Yahoo!トピックスの内容を表示するを参考にして、
仕事で疲れたときに猫画像で癒されるためのブックマークレットを作った
javascript:function ld(u){var s=document.createElement('script');s.setAttribute('src',u);document.body.appendChild(s);}ld('http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_flickr_cat.js?'+Date.now());void(0);

これで、仕事中でも簡単に猫画像で癒されることができます。

このブックマークレットを実行する
↑これを押せばブックマークレットを実行できます。
気に入ったら、右クリックで「このリンクをブックマーク」でブックマーク登録ができます。

これも、デザインの調整は後でやります。(たぶん)

PREタグにスクロールをつけてコードを読みやすくする

このブログでサンプルコードなどを載せる場合は、
preタグとcodeタグを使って、コードを貼り付けている。

ただ、コードが横に長くなってしまった時に、
今までは表示崩れしてしまっていたので、困っていました。

というわけで、ちょっと検索してみたらすぐに対策を発見。

参考:
PREタグにスクロールバーを付けたい
pre {
  overflow: auto;
}
これで、横に長くなるコードを張り付けたときに、
スクロールバーがついたので表示崩れは回避できました。
ついでに、font-size:smallerをつけて、
フォントサイズを小さくしてできるだけスクロールバーが
表示されないようにしてみた。

怠けないで、ちょっと調べれば、でてくるもんですな。

便利ブックマークレット その14:痛いニュースの更新を確認する

便利ブックマークレット その13: Yahoo!トピックスの内容を表示するを参考にして、
Yahoo!トピックスよりも更新が早く情報が新鮮な
痛いニュースのRSSからブログの更新内容を表示させる
ブックマークレットを作った。
javascript:function ld(u){var s=document.createElement('script');s.setAttribute('src',u);document.body.appendChild(s);}ld('http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_itai_news.js?'+Date.now());void(0);

これで、いちいち痛いニュースにいかなくても、
ブログの更新状況が調べられます。

このブックマークレットを実行する
↑これを押せばブックマークレットを実行できます。
気に入ったら、右クリックで「このリンクをブックマーク」でブックマーク登録ができます。

これも、デザインの調整は後でやります。(たぶん)

flickrの画像サイズについて( s, t, m, なし, z, b, o)

以前、flickrが提供するサムネイル画像サイズについて
記事をまとめていたけど、若干仕様追加(仕様変更?)が
あったみたいなので、まとめておく。
現在の仕様は以下の通り(っぽい)
  • サイズを表現する文字は7種類
    • s
      • squareのs
      • 中心部分をトリミングした75x75
    • t
      • thumbnailのt?
      • 縦横のうち、長い方の辺を100pxにリサイズ
    • m
      • smallのm
      • 縦横のうち、長い方の辺を240pxにリサイズ
    • なし
      • 縦横のうち、長い方の辺を500pxにリサイズ
    • z
      • medium(smallでmを使っているから?)
      • 縦横のうち、長い方の辺を640pxにリサイズ
    • b
      • bigのb
      • 縦横のうち、長い方の辺を1024pxにリサイズ
    • o
      • originalのo
      • 元画像サイズそのまま
 サイズ指定なし、とか前からあったのか今となっては謎だけど、
 とりあえず、上記の仕様で今のところ間違いはなさそう。

便利ブックマークレット その13: Yahoo!トピックスの内容を表示する

jQueryを使った web widgetの作り方 を参考にして、
Yahoo!のトップページにあるトピックスの内容を表示させる
ブックマークレットを作った。
javascript:function ld(u){var s=document.createElement('script');s.setAttribute('src',u);document.body.appendChild(s);}ld('http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_yahoo_news.js?'+Date.now());void(0);
処理順番は以下の通り。
  1. ブックマークレットを起動することにより、http://www.geocities.jp/tanarky/blogger/tanarky/js/bookmarklet_yahoo_news.jsが呼び出される。
  2. 今見ているページにiframeで外部ページが呼び出される(http://www.geocities.jp/tanarky/blogger/tanarky/html/yahoo_news.html)
  3. 外部ページの中で、YQL経由でYahoo!トピックスのRSSをJSONPに変換してデータを取得し、ページを表示する
これで、いちいちYahoo!トップページにいかなくても、
トピックスの内容が確認できます。

このブックマークレットを実行する
↑これを押せばブックマークレットを実行できます。
気に入ったら、右クリックで「このリンクをブックマーク」でブックマーク登録ができます。

デザインの調整は後でやります。(たぶん)

参考:
スクロールバーの座標を取得する

モテキがドラマ化されたので見てみた(森山未来・野波麻帆・満島ひかり・松本莉緒)

最近、漫画でモテキを読了したばっかりだったので、
ドラマ化されたモテキも見てみることにした。
(毎週金曜 0:12スタート。さすがテレビ東京的な時刻)

関連記事:
読了:モテキ (1-4巻) - 久保ミツロウ

キャストがそこそこ豪華。

主人公:  森山未来

  「森山未来」で画像検索

土井亜紀: 野波麻帆

  「野波麻帆」で画像検索


中柴いつか: 満島ひかり

  「満島ひかり」で画像検索


小宮山夏樹: 松本莉緒

   「松本莉緒」で画像検索


ドラマを見てると、どうみても土井亜紀が年上に見えたけど、
漫画では、主人公の方が年上なんだよね。

まだ第1回しかみれてないけど、いつかちゃん役の人がかわいい。
というかかわいすぎる。もっと素朴な感じな人をイメージしてた。

これは漫画でもそうだったかもしれないけど、
ターゲットがもろ30台(おそらく32-35がコアターゲット)な気がする。
大江千里とか、オザケンとかいってもピンとこないだろ、今の世代は。
個人的にはもろターゲットなので楽しめたけどw

新参者が終わって、W杯も終わったテレビにちょっとした楽しみができた。

参考:
テレビ東京 モテキホームページ

あと、ほぼ日で、ドラマ化にあたって関係者で対談してた。
http://www.1101.com/moteki/index.html
こちらも面白かったので、興味がある人はどうぞ。


便利ブックマークレット その12: Iframeで外部ページを表示させる

外部にあるページを、現在見ているページにiframeで挿入するブックマークレット
javascript:var s=document.createElement('div');s.innerHTML='<div style="position:absolute;top:10px;left:10px;z-index:10000;border:2px solid #ddd;width:320px;background-color:#fff;"><iframe src="http://www.geocities.jp/tanarky/blogger/tanarky/html/widget.html" width="320px" height="250px" frameborder="0"></iframe></div>';document.body.appendChild(s);location.href='#';void(0);
外部に、
http://www.geocities.jp/tanarky/blogger/tanarky/html/widget.html
のようなページを用意しておいて、
ブックマークレットでiframeを挿入して呼び出すロジック。

これによって、
  • javascriptでデザインをがんばらなくてもいい
  • 外部サイトのiframeを呼び出すので、外部サイトのcookieを読み込める
    • ログイン判定など可能
    • 元サイトのCSSに引きずられない
といった利点がある。

便利ブックマークレット その11: はてなブックマークレットの解析

はてなブックマークの、ブックマークに追加するブックマークレットの
挙動について解析してみた。(2010/07現在のコード)

↑ブックマークレットを起動したときのWindowがかっこよさげ
なのでこれの挙動を調べたいのが動機。

まずはヘルプページにあるリンクから解析
ブックマークレットのJavascriptは以下のようになっている。
(一部読みやすくするため、改ざん)
(function(){
    var s = document.createElement('script');
    s.charset = 'UTF-8';
    s.src     = 'http://b.hatena.ne.jp/js/Hatena/Bookmark/let.js'+Date.now();
    (document.getElementsByTagName('head')[0] || document.body).appendChild(s);
})();

というわけで、ブックマークレットの処理シーケンスは
http://b.hatena.ne.jp/js/Hatena/Bookmark/let.js
にあることがわかる。
さらにその中で、
http://www.hatena.ne.jp/js/Ten.js

http://b.hatena.ne.jp/js/Hatena/Bookmark/LetLoader.js
を読み込んでいる。
ファイル置き場のドメインを見ると、Ten.jsは、はてなにおける
JSONPやXHRなどの共通処理を書いてあるファイルっぽいので、
今回は流し見にとどめておく。

で、コードを読んでだいたい以下のようになっている(と思う)
  1. divタグなどでブックマークレットウィンドウの枠を表示する
  2. ウィンドウをDraggableにしたり、浮いたような見た目にみせる
  3. ウィンドウの中身は、外部ページをiframeで読み込む
ふむ。なんとなく流れはつかめたので、同じような機能を
自分で実装してみようと思う。


読了:モテキ(1-4巻) - 久保ミツロウ

後輩から借りて、モテキを読了した。

モテキ - Wikipedia
モテない三十路間近の青年・藤本幸世は、ある日突然知り合いの女の子から次々と連絡が入り、いわゆる「モテ期」に入る。これまでモテ期の来なかった 藤本は焦りながらも女の子とコンサートに行ったり水族館に行ったりしていく……。
 作者は、久保ミツロウ
少女向け雑誌への投稿を続け、久保美津子(くぼ みつこ)名義で『mimi』にてデビュー後、『週刊少年マガジン』に移籍。移籍後は現在の名前で作品を発表している。
ちなみに、同誌連載『もう、しませんから。』(西本英雄)に何度か登場しているが、顔出しNGで、自画像は本人の希望で常にヒゲもじゃに描かれている。
作中のテーマになってるのが、
  • 草食系男子
  • 非モテ
  • リア充
  • 30歳前後のあせり
といっても、単に表紙のおねーちゃんのきれいさにひかれて
読んでみたくなっただけですが。



読み終わった後は、煮え切らない主人公にイライラし、
そんな主人公なのにモテている事実に、モンモンとしてしまいました。

2時間くらいで読めるので、漫画喫茶にいったときとかは是非。


jQueryを使ったweb widgetの作り方

How to build a web widget (using jQuery)
http://alexmarandon.com/articles/web_widget_jquery/

非常にわかりやすいTutorial。
これの通りに実装すれば、きれいに、安全に、Web widgetを
実装できる。以下、かなりオレオレ意訳。

まず、ウィジェットって何か、っていうと、
「ウェブページの固まり」
とか
「ウェブページのきれっぱし」
といってます。

あるページの中に、別のウェブページの情報を(細切れにして?)
表示させる、っていうこと。よくあるインターネットの広告とかも
あるページに紛れ込ませて表示させているので、
Web widgetと言える(と思う)

で、Web widgetを作るときの3つの原則。
  • ページにまぎれさせて表示するので、元ページを汚さないように、不測の事態で表示が崩れないように気をつける(具体的なTipsは後述)
  • CSSとJavascriptは動的に読み込む
  • widgetの内容であるデータは、JSONPにより外部から読み込む。(データのみをJSONPで返すAPIを用意するべし)
これをふまえた上で、具体的には、以下のような手順で作る。

1. 以下のHTMLをページ側に導入する。divのidはページ内でかぶらないようにする

<script src="http://example.com/widget/script.js" type="text/javascript"></script>
<div id="example-widget-container"></div>

2. script.jsを以下のように記述(一部オリジナルから変更してます)

(function() {
    // jQuery ローカル変数
    var jQuery;
    var jQuery_version='1.4.2';
    var widget_html_id='#example-widget-container';

    // jQuery がloadされていなかったらgoogle CDNからloadする
    if (window.jQuery === undefined || window.jQuery.fn.jquery !== jQuery_version) {
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type","text/javascript");
        script_tag.setAttribute("src","http://ajax.googleapis.com/ajax/libs/jquery/"+jQuery_version+"/jquery.min.js");
        script_tag.onload = scriptLoadHandler;
        script_tag.onreadystatechange = function () {
            // IE対策 
            if (this.readyState == 'complete' || this.readyState == 'loaded') {
                scriptLoadHandler();
            }
        };
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
    } else {
        // すでにloadされているjQueryのバージョンが使いたいバージョンと一致している           
        jQuery = window.jQuery;
        main();
    }

    // jQueryがloadされたら1回だけ呼び出される
    function scriptLoadHandler() {
        // 安全に$変数を呼び出せるようにするためにローカル変数のjQueryに
        // noConflictをtrueにセットする
        jQuery = window.jQuery.noConflict(true);
        // 自分で実装したいメインロジックを呼び出す 
        main();
    }

    // ここからがようやくメインロジック
    function main() {
        jQuery(document).ready(function($) {
            // 外部CSSファイルを読み込む
            var css_link = $("<link>", {
                rel:  "stylesheet",
                type: "text/css",
                href: "style.css"
            });
            css_link.appendTo('head');

            // 外部JSONP APIからデータを読み込む
            var jsonp_url = "http://alpage.org/cgi-bin/webwidget_tutorial.py?callback=?";

            $.getJSON(jsonp_url, function(data) {
                // データの読み込みが完了したらここが実行される
                $(widget_html_id).html("This data comes from another server: " + data.html);
            });
        });
    }
})(); // 無名関数を実行しているので変数名汚染などは無し

これとブックマークレットを組み合わせると面白そうなものができそう。
今度もっと調べてみよう。

実家から夕張メロンが届きました

札幌の実家からお中元に夕張メロンをもらいました。

夕張メロン - Wikipedia
夕張メロン夕張キングメロン(ゆうばり- )は、北海道夕張市を生産地とするメロン。品種名は「夕張キング」。「スパイシー・カンタロープ」を父、「アールス・フェボリット」を母として作出された 赤肉のメロンである。
(中略)

高級メロンとしても有名。夕張市農業協同組合に集荷され、厳格な検査に合格したものだけを「夕張メロン」のブランドで出荷するため、夕張メロンは夕張市農業協同組合の登録商標となっている。隣接する市町村産では、夕張の名を冠することはできない。そのため、90年代前半まで北海道内で栽培されていた夕張キングを箱詰めした場合、その地域ブランド名を記したケースや箱で販売されていた。但し、箱に記載の品種名は「夕張キング」と表示がなされていた。

日持ちに難点があり、大手宅配業者、フットワークと提携。当時としては、画期的な産地直送システムを導入。それまで北海道内でしか食べられなかった夕張メロンを、産地直送化することにより、道外への出荷が可能になる。

夕張メロン3 夕張メロン

なんと3玉も。 黄色いやつほど、熟れていて食べごろです。
写真で言うと、右下の方が黄色っぽいんです。

香りでも食べごろがわかります。
熟れてくると、メロンのいい香りを出してきやがるので、
部屋の中がメロンの香りでいっぱいになったら食べごろ。

1玉いい感じに黄色くて香りを放つのがあったので、
冷蔵庫で冷やして食べてみました。

夕張メロン1

はい、どーーーん。
うまーい、あまーい。

夕張メロン2

まだまだ、どーーーーん。 一人で半玉近く食べるという贅沢。

ちなみに、我が家ではメロンはスプーンでほじくって食べません。
写真のように切れ込みをいれて食べると、
一口で食べることができるし、緑っぽいところと熟れてるところを
同時に食べられて美味。

関連:
夕張メロンで商品検索

今日7/11は 2010年 参議院選挙ですよー(Yahooマニフェストマッチ)

まずは、選挙に行く前に、
Yahoo!みんなの選挙マニフェストマッチをしてみた。

さて、参議院とは、
参議院議員の任期は6年で、衆議院議員の任期(4年)より長い。衆議院はたいてい任期途中で解散となるため、実質的な任期の差はさらに広がる。また、解散 がされる衆議院と異なり任期途中での解散がなく、3年ごとに半数改選が行われる。内閣不信任決議は衆議院のみの権限であるが、参議院の権限は決して無視できないものであるため、内閣は 常に両院を意識する必要がある。確かに、内閣総理大臣の指名、予算の 議決、条 約の承認については衆議院に絶対的な優越がある。しかし、法律案 の議決については相対的な優越しかなく、憲法改正案の議決に関しては完全な対等である。しかも、憲法ではなく法律にもとづく国会の議決に関して対等の例が数 多くある。このため、参議院を無視してしまうと法律案その他の議決に重大な障害となるため、内閣は常に両院の総意にもとづき行動しなければならない。
と、ご存知の通り、任期固定です。
年収を調べてみたところ、
参議院、衆議院は同じ給料です。
役職のない国会議員の場合、一人あたりの歳費は月額130万1000円。
これに年3回に分けて支給される期末手当があり、年収にすると約2300万円。
これ以外に文書通信交通滞在費として毎月100万円などの経費が支給されます。
というなかなかの額。今度、どういうスケジュールで働いているのか、
調べてみようと思う。

さて、マニフェストマッチの結果、
7項目中、みんなの党2項目、民主党1項目、自民党1項目、国民新党1項目、新党改革1項目、社民党1項目
という結果に。みんなの党のマニフェストは、一度ちゃんと目を通しておこうかな。

マニフェストマッチというサービスは面白い。
今までにできなかったことなので、政治への関心が高まったのは確か。
改善点としては以下が思いつく。
  • 選択肢の順番によって、最後の方はちゃんと読まれてないんじゃないか疑惑(A-Cの選択率が高いんじゃないかと予想)
  • 政策がちゃんと実施されたかも問題。政党ごとに今までの参議院での活動実績も見たい(マニフェストマッチ、というサービスではなくなるけど)
では、もうちょっと考えて、候補者を調べてから選挙にいってきます。