12月 07, 2013

findAndModifyでお手軽キュー

MongoDB Advent Calendar 2013の7日目です。

MongoDBをメッセージキューとしての利用方法を紹介したいと思います。

拙作「ふぁぼるっく」では、TwitterのREST API呼び出しによるクロールのほか、UserStreamに接続し大量(現在約7000アカウント)の利用者からのふぁぼやRT情報を収集しているため、人気のツイートが現れると突発的に処理量が増えます。
メインのデータベースとしてPostgreSQLを採用していますが、処理量増大時にデータベースでは接続本数が足りなくなり、また接続~レコードの存在確認~レコード挿入までに時間が掛かるため、他の挿入処理まで待っているとUserStreamは情報がどんどん流れてくるために処理しきれないという事態が発生してしまいます。

そこで、とりあえず情報を貯めておくキューを用意することになり、ふぁぼるっくでは、ここでMongoDBを採用しています。
MongoDBに至った理由としては、以下の点があります。

・大量接続が可能
→PostgreSQLだとサーバーリソース的に1000接続ぐらいが限界なので、同時に20000接続まで可能なMongoDBは魅力的。実際にメモリ2GBのVPS上で運用していますが、20000接続までできました。

・接続から挿入までが速い
→書き込み完了前に処理が返ってきます。失敗する可能性もありますが、正常に動いている限りは失敗する可能性が少ないです。要件的には、失敗しても再取得可能なため無視できます。

・重複していても上書きできる
→MySQLで言うREPLACE INTOができます。正確に言うと、重複したキーを持つデータを保存したら常に上書きです。これは複数のUserStreamから同じデータが投入される場合があるのですが、一般的なメッセージキューとは少し違った要件があり、プライマリキーとなる部分が同じものの場合は1件として扱いたいためです。

・複数のワーカーから取得しても重複して取得しない
→キューとして扱うので、ワーカーで取得した情報は、他のワーカーから見えて欲しくない。そこでfindAndModifyコマンド。

 _人人人人人人人_
> findAndModify <
 ̄Y^Y^Y^Y^Y^Y^Y ̄

通常、MongoDBには、insert、update、find、removeなどのコマンドでコレクションにアクセスします。
findAndModifyコマンドは、
{
  query: ドキュメント,
  sort: ドキュメント,
  remove: 真偽値,
  update: ドキュメント,
  new: 真偽値,
  fields: ドキュメント,
  upsert: 真偽値
}
というコマンド書式をしており、findコマンドと同じようにqueryパラメータで指定したオブジェクトが取得できる一方、updateパラメータで指定した値で更新したり、removeパラメータの指定でオブジェクトの削除が行えます。
これら一連の処理はアトミックな処理となっており、オブジェクトの取得と更新がまとめて行われます。
例えば、testコレクションにこのようなデータが入っていたとします。
> db.test.find();
{ "_id" : 1, "name" : "takashi" }
{ "_id" : 2, "name" : "hanako" }
ここで
> db.test.findAndModify({query:{"_id":1},update:{"name":"ten_p"}});
{ "_id" : 1, "name" : "takashi" }
を実行すると、_id:1のデータが取得できました。
内容を見てみると
> db.test.find();
{ "_id" : 1, "name" : "ten_p" }
{ "_id" : 2, "name" : "hanako" }
updateで指定した内容に置き換わっています。
> db.test.findAndModify({query:{"_id":1},remove:true});
{ "_id" : 1, "name" : "ten_p" }
removeを指定すると、データを取得しつつ
> db.test.find();
{ "_id" : 2, "name" : "hanako" }
そのデータが削除されます。

ふぁぼるっくでは、この仕組みを利用して、複数のワーカーが並列してMongoDB上のキューからデータベースへの更新処理を行っています。

以上、MongoDBを使うとこんなこともできるよ!という紹介でした。

ふぁぼるっくではTwitterをお使いの方のふぁぼ情報やふぁぼられ情報を集計しています。
ぜひ登録してみてください!

11月 02, 2013

Treasure Dataを使ってみました。(Upload編)

拙作ふぁぼるっくはPostgreSQLを使用しているのですが、データの蓄積量が増えてきたことから集計処理に時間が掛かるようになってきました。
しかし持っているサーバーはどれも高負荷状態。
なんとか手持ちのCPUリソースを割かずに集計する方法はないものかと考えていたところ、Treasure Dataを思い出したので使ってみました。

アカウントを作って、コマンドラインのツールをインストールします。
gem install td
で完了。
tdコマンドでアカウントを設定します。ちなみに、tdコマンドのバージョンは0.10.91です。

Treasure Dataのバルクインポート説明 http://docs.treasure-data.com/articles/bulk-import を見ると、データはまず加工(Prepare)し、行単位のデータベースへアップロード、そこから列単位のデータベースに変換(Perform)して、PlazmaというTreasure Dataのカラム型データベースへ投入(Commit)するという流れになります。

16個に分割された合計82GBのcsvファイルをアップロードします。
td import:upload --auto-create favlook.fav_old \
--auto-perform --auto-commit \
--parallel 8 \
--columns status_id,id,tp,user_id \
--time-value 0 \
-o prepared_parts /mnt/sdd/tmp/fav_*.csv

「--time-value 0」というオプションについてですが、Treasure Dataでは時間の追加カラムが必要なようで、これがないと時間書式のカラムがないというエラーになってしまいました。
もしデータに時間のカラムが存在するなら「--time-column ~」でカラムを指定すると良いようです。
今回使うデータには、時間カラムがなかったため、--time-value 0で全てゼロとして指定しました。

アップロードは回線速度次第です。気長に待ちましょう。
--auto-perform --auto-commitを付けているとアップロード完了時にそのままperformに進むと思うのですが、今回はいくつかのファイルが失敗してしまいました。
Next Steps:
  => check td-bulk-import.log and re-upload prepared_parts/fav_2012c_csv_66.msgpack.gz: Retry failed.
  => check td-bulk-import.log and re-upload prepared_parts/fav_2013d_csv_17.msgpack.gz: Retry failed.

端末に出てくるリトライ回数は0となっています。tdコマンドのオプション指定を見てみたのですが、リトライの指定方法が分かりませんでした。
td-bulk-import.logというログファイルも出力されるのですが、ローテーションするみたいで、直近のものしか残っておらず、該当ファイルの失敗理由などは分かりませんでした。

とりあえず失敗したファイルを再度アップロードします。
しかし1つ15GBも有るファイルをもう一度上げ直すのは大変。でも、失敗したファイルだけ再送信できます。
td import:upload favlook_fav_old_2013_10_25_1382661066 prepared_parts/fav_2012c_csv_66.msgpack.gz
td import:upload favlook_fav_old_2013_10_25_1382661066 prepared_parts/fav_2013d_csv_17.msgpack.gz

と、アップロードセッション名、対象ファイルを指定します。
prepared_partsというディレクトリは、最初のimport:upload時に指定した「-o prepared_parts」が効いています。
このディレクトリにPrepareしたデータが格納されています。
そして前に指定したセッション名、こちらはアップロード時の画面に出てくるので、それを見ていると分かるのですが、出力が多いと見逃してしまうかもしれません。
これはtdコマンドのimport:listで表示できます。
+---------------------------------------+-----------------+-----------+--------+-------+-------------+-------------+---------------+---------------+
| Name                                  | Table           | Status    | Frozen | JobID | Valid Parts | Error Parts | Valid Records | Error Records |
+---------------------------------------+-----------------+-----------+--------+-------+-------------+-------------+---------------+---------------+
| favlook_fav_old_2013_10_25_1382661066 | favlook.fav_old | Uploading |        |       |             |             |               |               |
+---------------------------------------+-----------------+-----------+--------+-------+-------------+-------------+---------------+---------------+
1 rows in set

アップロードが終わると

Next Steps:
  => execute 'td import:perform favlook_fav_old_2013_10_25_1382661066'.

と、次にやるべきことが表示されます。

td import:perform favlook_fav_old_2013_10_25_1382661066
Job 5451708 is queued.
Use 'td job:show [-w] 5451708' to show the status.

ジョブが開始されました。td job:showで状況が見られるようです。

td job:show -w 5451708
Organization :
JobID        : 5451708
Status       : running
Type         : bulk_import_perform
Priority     : NORMAL
Retry limit  : 0
Result       :
Database     : favlook
Query        :
queued...
  started at 2013-10-25T23:19:16Z
  13/10/25 23:19:23 WARN conf.Configuration: fs.default.name is deprecated. Instead, use fs.defaultFS
  13/10/25 23:19:25 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
  13/10/25 23:19:26 INFO storage.S3StorageBackend: listing s3 files with prefix e71b21f4-3b82-4d7b-9ce8-4fc1ca74bf94/ps/
  13/10/25 23:19:28 WARN conf.Configuration: fs.default.name is deprecated. Instead, use fs.defaultFS
  13/10/25 23:19:28 INFO mapred.JobClient: Running job: job_201306191947_257352
  13/10/25 23:19:29 INFO mapred.JobClient:  map 0% reduce 0%
  13/10/25 23:19:53 INFO mapred.JobClient:  map 1% reduce 0%
  13/10/25 23:19:54 INFO mapred.JobClient:  map 4% reduce 0%

とmap & reduceの処理が流れていきます。気長に待ちましょう。
処理が終わったら、td import:listで状況を見てみましょう。

td import:list
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
| Name                                  | Table           | Status    | Frozen | JobID   | Valid Parts | Error Parts | Valid Records | Error Records |
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
| favlook_fav_old_2013_10_25_1382661066 | favlook.fav_old | Ready     |        | 5451708 | 1438        | 0           | 2062874026    | 0             |
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
1 rows in set

StatusがReadyになっています。では、確定してcommitしましょう。

td import:commit favlook_fav_old_2013_10_25_1382661066

すぐに処理が帰ってきましたが、状況を見てみると

td import:list
+---------------------------------------+-----------------+------------+--------+---------+-------------+-------------+---------------+---------------+
| Name                                  | Table           | Status     | Frozen | JobID   | Valid Parts | Error Parts | Valid Records | Error Records |
+---------------------------------------+-----------------+------------+--------+---------+-------------+-------------+---------------+---------------+
| favlook_fav_old_2013_10_25_1382661066 | favlook.fav_old | Committing | Frozen | 5451708 | 1438        | 0           | 2062874026    | 0             |
+---------------------------------------+-----------------+------------+--------+---------+-------------+-------------+---------------+---------------+
1 row in set

という状態で、commitにもしばらく時間が掛かるようです。
Frozenというのがよく分からないのですが、処理が一時停止しているのかと思い、「td import:unfreeze」コマンドを実行してみたのですがエラーとなってしまいました。
ひとまず状況が分からないのですが、Committingなのでしばらく放っておこうかと放置。

td import:list
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
| Name                                  | Table           | Status    | Frozen | JobID   | Valid Parts | Error Parts | Valid Records | Error Records |
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
| favlook_fav_old_2013_10_25_1382661066 | favlook.fav_old | Committed | Frozen | 5451708 | 1438        | 0           | 2062874026    | 0             |
+---------------------------------------+-----------------+-----------+--------+---------+-------------+-------------+---------------+---------------+
1 row in set

見てみると完了していました。Frozen、謎です。

ブラウザでアクセスできる管理画面からも、データが確認できるようになりました。
レコード数が20億6287万4026件、サイズが17.3 GB。
CSVでは82GB有りましたが、項目名が「Compressed Size」となっているように、内部では圧縮して持っているようです。
無料で使える150GBというのは、この圧縮状態を指すのでしょうか?


こうしてデータの準備ができました。
次に集計をやってみます。
(Jobを走らせることはできたのですが、結果の取得方法などがよく分かっていないので、まだ実験中)

8月 12, 2013

ブラウザのホームページが conduit になってしまった。

ある日を境に、 Firefox のホームページが conduit とかいう検索エンジンになってしまった。
普段は iGoogle (もうすぐサービスが終わってしまう)で、新しいタブを開いたときは、 Firefox のよく使うサイトへのリンクが表示されているのだけど、これでは使いにくい。

ときどきアプリをインストールしたときに、インストーラーが「ブラウザのホームページを書き換えるか」と聞いてくるときがあるが、気がつかないうちに許可したか、無断で書き換えるやつがいたのかと思った。

まずはブラウザのホームページ設定を修正しよう。
Firefox だと、URL欄に about:config と入力することで設定画面が表示される。
ここの browser.newtab.url に先ほどの condoit アドレスが設定されてしまっているので、書き換える。
と、書き換えてみたのだが、修正が反映されない。
Firefox 自体が書き換えられてしまったのだろうか。しかしウイルス警告などは出ていない。





プロセス一覧を見てみると、 CtlMngSvc.exe と ctlmng.exe という二つの普段見かけないプロセスが動いている。これが原因らしい。
サービスとして動いてしまっていて、そのままでは消せないようだったが、幸いにもアンインストーラーが用意されていたので、そこから削除出来た。

アンインストールすると、ホームページの設定も保存されるようになった。

このソフトが入った原因がはっきりしないが、海外産ソフトをダウンロードしたときに、それらしいリンクからダウンロードしてしまった気がする。

5月 20, 2013

PostgreSQLのWALでのエラー・トラブル対応

注釈:この記事はQiitaにわたしが投稿していた記事を、自分のブログへ移動させたものです。
PostgreSQLでトラブルになったときに、つい忘れるのでメモ。

何らかのトラブルでNFSなどにWALが送られず、pg_xlogが膨れあがり、容量不足で停止したとき。
問題の無い範囲で、pg_xlogの内容を削除したのに、以下のようなログが出て、WALの送信が失敗するときがある。

cp: cannot stat `pg_xlog/00000001000010D000000000': No such file or directory
LOG: archive command failed with exit code 1
DETAIL: The failed archive command was: test ! -f /mnt/nfs_dir/archivedir/00000001000010D000000000 && cp pg_xlog/00000001000010D000000000 /mnt/nfs_dir/archivedir/00000001000010D000000000
WARNING: transaction log file "00000001000010D000000000" could not be archived: too many failures

原因は /pg_xlog/archive_status ディレクトリに、アーカイブの送信状況が保存されているが、これと実際のファイルの対応が不一致になった場合に発生する。
archive_status ディレクトリに「*.ready」というファイルがあれば、送信前。
送信が完了すると「*.done」になる。
これらを実際の pg_xlog に合わせよう。

PHPのxpathでends-withを使う

注釈:この記事はQiitaにわたしが投稿していた記事を、自分のブログへ移動させたものです。
PHPのDOMXPathでends-withを使い、属性の末尾が指定の文字列で終わるオブジェクトを取得しようとしたら、エラーになった。どうやら対応していないらしい。
しかし、DOMXPathには、自前の関数を定義できるという素敵機能というか、気持ち悪い機能というか。

DOMXPath( )でxpathオブジェクトを作った後、

function ends_with($node, $value){
    return substr($node[0]->nodeValue,-strlen($value))==$value;
}
$xpath->registerNamespace("php", "http://php.net/xpath");
$xpath->registerPHPFunctions("ends_with");

$nodes = $xpath->evaluate( "//li/a[php:function('ends_with',@href,'/')]" );

こんな感じで登録して、使用できます。
いやー、便利。
しかしstarts-withに対応してるんだから、ends-withも対応しておいてよ。

PHPでスクレイピング

注釈:この記事はQiitaにわたしが投稿していた記事を、自分のブログへ移動させたものです。
PHPでスクレイピングの記事が投稿されていたので、自分のやり方をメモ。

$body = file_get_contents( $url );
//$body = mb_convert_encoding($body, 'UTF-8', 'sjis-win'); // 文字コードが違えば

// HTMLが間違っている場合があるので、tidyを通して綺麗にする。
$tidy_obj = new tidy;
$tidy_obj->parseString( $body, array(), 'utf8');
$tidy_obj->cleanRepair();
$body = $tidy_obj->html();
unset( $tidy_obj );

// 分解
$dom = new DOMDocument;
$dom->encoding = 'UTF-8';
$dom->preserveWhiteSpace = false;
$dom->loadHTML( $body );
$xpath = new DOMXPath( $dom );
unset( $dom );

$nodes = $xpath->evaluate( "//div[@class='category']/div/p/a" );

という感じ。
HTMLが間違っていると、DOMDocumentが正しく認識できないときがあるので、tidyを通して綺麗にするのがポイント。
あとはxpathで、取りたいオブジェクトを引っ張ってこられる。

5月 18, 2013

関西アンカンファレンスに参加しました #kansaiun

第3回関西アンカンファレンスに行ってきました。
当日は他の勉強会なども重なり、いろいろと大変でしたが、我も我もと発表枠がふさがり、かなり密度の濃いイベントになったかと思います。

わたしは、「ふぁぼ収集サービスのつらみ」と題して、公開しているサービス「ふぁぼるっく」の苦労話などをしてきました。


懇親会では、別の分野の方からも話を伺い、大変勉強になりました。
ちょっと作ってみたいものができました。
手の空いたときにでも、取りかかってみようかと思います。

次回も一年以内に開催されるようなので、是非参加したいです。
発表できるネタが生まれるような生活を送らないといけないなぁ。

4月 25, 2013

ふぁぼるっくのユーザー分布

ちょっと書かないと、すぐに月日が過ぎてしまう。
ということで、久々に新しいことをしたので記録。

ふぁぼるっくでは、ふぁぼを集めまくっているわけですが、たくさんふぁぼっている人はどのくらいふぁぼっているのか、調べてみた。
統計とか計算するのに、「R」というツールがいいらしい。
R言語でいろいろデータを操作したり、グラフを描いたりできるんだって。

Linux版のCUIでイマイチ使い方が分からなかったので、Windows版で。
よく分からないグラフが出来てしまった。
一部の人がふぁぼりまくっているからだ。
直近一週間のふぁぼりが100未満の人に絞ってみた。
対数グラフにしないと、曲線が極端すぎて、綺麗なグラフにならない。
結局は、受給曲線のように、ふぁぼりが少ないアカウントが大勢で、一部のアカウントだけがふぁぼりまくっているという状態だった。
ふぁぼ機能を知っている人は、ある程度ふぁぼっていて、山形なグラフになるかと思っていたが、そうでもなかったようだ。
「あなたのふぁぼりはこのへん」というグラフを表示したら面白いかなと思ったが、これでは面白くなさそうなのでやめた。

使用したデータは、以下の通り。

一週間のふぁぼ数アカウント数
03553073
199266
244782
327567
419471
514588
611361
79542
87720
96696
105764
114978
124395
133814
143505
153134
162876
172558
182402
192193
202008
211957
221794
231651
241550
251503
261411
271290
281108
291171
301091
311034
32971
33919
34874
35851
36795
37778
38748
39702
40673
41674
42586
43617
44563
45543
46536
47538
48476
49516
50488
51425
52448
53435
54438
55393
56391
57392
58374
59343
60350
61343
62348
63304
64357
65324
66286
67304
68267
69290
70282
71295
72245
73257
74248
75244
76234
77211
78209
79242
80213
81219
82226
83213
84210
85202
86213
87184
88186
89208
90173
91159
92177
93164
94163
95166
96152
97158
98145
99148
100157
101151
102154
103154
104135
105140
106137
107132
108143
109137
110113
111141
112127
113123
114123
115110
116108
117103
118124
119105
120122
121110
12296
123109
12497
125108
12692
12795
12899
129102
13088
13188
13295
13382
13495
13593
13681
13791
13878
13977
14085
14172
14281
14380
14485
14563
14671
14776
14877
14986
15073
15179
15275
15375
15474
15585
15669
15762
15873
15965
16077
16174
16262
16364
16475
16564
16671
16770
16843
16951
17064
17159
17261
17352
17464
17553
17648
17750
17874
17952
18051
18156
18253
18358
18435
18549
18664
18738
18847
18952
19047
19159
19249
19350
19444
19554
19647
19744
19838
19950
20038
20149
20249
20348
20430
20546
20639
20740
20833
20954
21051
21149
21244
21349
21433
21533
21639
21730
21841
21942
22053
22143
22240
22346
22434
22542
22640
22740
22841
22935
23032
23136
23244
23326
23436
23536
23630
23727
23835
23938
24032
24139
24232
24343
24437
24526
24635
24733
24828
24934
25037
25133
25237
25328
25422
25538
25631
25728
25827
25922
26024
26124
26218
26329
26422
26531
26628
26719
26834
26923
27025
27125
27225
27330
27422
27527
27628
27722
27822
27935
28022
28127
28228
28320
28424
28524
28614
28726
28825
28922
29020
29123
29219
29318
29427
29523
29617
29724
29812
29921
30017
30121
30221
30327
30424
30523
30613
30722
30826
30923
31024
31125
31226
31320
31412
31514
31614
31720
31815
31929
32019
32117
32219
32315
32422
32514
32616
32721
32812
32918
33014
33116
33215
33315
33420
33512
33618
33712
33815
33921
34020
34119
34221
34312
34415
34514
34623
34718
34821
34919
35016
35118
35224
35324
35412
35521
3569
35720
35816
35912
36019
3617
36213
36319
36422
36520
36614
36720
36814
36917
37010
37115
37217
37312
37411
37518
37614
37714
37811
37910
38012
38118
38217
38312
38414
38516
3869
3878
38810
38914
39017
39118
39210
3938
39415
39515
39618
39714
39813
39914
40010
40111
40216
4038
40410
40519
40611
4079
40822
40910
41011
41112
41215
41311
4148
4156
41615
4179
41814
4199
42012
42118
4229
4238
42418
42511
42614
42712
42812
42910
43015
4314
43211
43311
43411
4357
43611
43711
4389
4397
4406
44113
44211
44314
4449
44510
4467
44710
4488
4494
4507
45110
4523
45313
4547
45513
45616
4577
45814
4598
46014
46115
46214
46312
46414
4654
4669
4679
46813
4698
4706
47110
4726
4738
4749
4758
4768
47713
4787
4797
48012
4818
48210
4837
4849
48511
48611
4876
4887
4899
49014
4917
4926
4936
4944
49510
4968
49718
4985
4997
50010
50111
50211
50316
5049
5055
50613
50710
5087
5097
5106
5118
5128
51313
5148
5153
51614
5179
5188
5198
5218
5226
52311
5248
5256
52610
5274
52811
52913
5304
53110
5329
5338
53412
5357
53611
5378
53810
5397
5407
5415
54212
5433
5448
5456
5468
5476
54810
5495
5507
55111
5524
5537
55410
5554
5567
5574
5588
55910
56012
5617
5628
5635
5646
5658
5668
5676
56810
56910
5703
5715
57210
57311
5744
5758
5766
5777
5783
57910
5803
5812
5825
5837
5846
5856
5869
5877
5884
5895
5907
5914
5926
5933
5949
5954
5965
5979
5986
5997
6008
6016
6027
6033
6045
6055
6064
6077
6085
6091
6105
6115
61210
6137
6144
6158
6165
6178
6185
6197
6206
6215
6226
6236
62412
6255
6267
6277
6283
62913
6303
6315
6328
6339
6349
6357
6363
6376
6386
6397
6408
64110
6426
6435
6443
6455
6465
6474
6483
6497
65010
6518
6523
6534
6542
6554
6561
6571
6582
6597
6605
6618
6626
6637
6644
6659
6665
6674
6687
6699
6702
6715
6724
6735
6743
6754
6763
6776
6783
6793
6801
6816
6829
6833
6843
6855
6866
6875
6886
6896
6906
6917
6922
6935
6945
6956
6965
6975
6984
6993
7002
7016
7023
7033
7043
7054
7065
7074
7085
7095
7102
7114
7127
7133
7146
7155
7165
7174
7182
7195
7202
7211
7223
7232
7245
7252
7267
7271
7289
7294
7303
7318
7324
7336
7344
7355
7363
7371
7385
7393
7404
7411
7423
7434
7446
7456
7464
7476
7486
7496
7504
7513
7521
7533
7544
7554
7563
7578
7586
7595
7606
7612
7626
7631
7643
7656
7663
7676
7685
7699
7701
7714
7727
7737
7749
7753
7767
7775
7785
7796
7805
7815
7825
7838
7847
7851
7862
7874
7895
7908
7916
7929
7934
7944
7953
7965
7976
7983
7996
8002
8013
8026
8033
8041
8054
8064
8074
8082
8091
8101
8116
8122
8133
8141
8155
8162
8173
8192
8206
8214
8223
8234
8244
8251
8264
8276
8284
8292
8302
8313
8323
8333
8343
8352
8367
8377
8387
8391
8406
8411
8425
8434
8443
8452
8464
8471
8488
8495
8504
8513
8524
8533
8543
8553
8564
8574
8584
8591
8602
8615
8624
8637
8646
8651
8662
8674
8685
8691
8702
8716
8721
8732
8754
8766
8771
8782
8792
8803
8814
8822
8835
8843
8852
8862
8884
8894
8903
8912
8932
8943
8953
8962
8975
8981
8991
9004
9013
9025
9031
9042
9054
9062
9075
9087
9093
9101
9113
9123
9134
9142
9151
9163
9171
9185
9192
9201
9222
9233
9241
9252
9261
9272
9284
9291
9304
9313
9322
9333
9342
9352
9364
9372
9384
9393
9402
9414
9421
9432
9442
9452
9462
9471
9483
9493
9504
9511
9522
9533
9545
9552
9561
9573
9586
9596
9601
9611
9621
9644
9655
9663
9671
9683
9695
9704
9714
9721
9734
9743
9751
9761
9773
9782
9792
9815
9824
9831
9842
9852
9863
9872
9883
9894
9902
9913
9931
9945
9952
9965
9972
9982
9995
10002
10014
10024
10032
10044
10052
10063
10074
10082
10093
10101
10113
10121
10132
10153
10163
10173
10182
10192
10206
10211
10222
10236
10243
10252
10263
10271
10282
10295
10302
10312
10324
10343
10351
10372
10383
10392
10412
10421
10431
10442
10451
10463
10473
10481
10491
10502
10512
10524
10532
10544
10552
10566
10573
10582
10592
10602
10611
10623
10632
10645
10662
10672
10721
10732
10742
10752
10762
10773
10782
10794
10802
10811
10833
10843
10853
10864
10871
10881
10891
10902
10912
10922
10931
10942
10952
10962
10971
10982
10992
11021
11032
11052
11063
11093
11101
11112
11132
11141
11151
11161
11171
11181
11192
11214
11223
11232
11243
11253
11261
11275
11283
11304
11313
11323
11333
11341
11353
11361
11382
11393
11401
11422
11451
11462
11471
11481
11491
11501
11531
11541
11552
11561
11574
11585
11593
11612
11622
11635
11644
11654
11671
11682
11691
11702
11712
11725
11731
11771
11781
11793
11801
11811
11824
11831
11842
11854
11872
11881
11901
11912
11924
11933
11942
11952
11964
11972
11981
11993
12001
12012
12022
12031
12064
12071
12082
12093
12103
12122
12132
12145
12153
12162
12192
12214
12222
12232
12241
12251
12263
12271
12293
12301
12333
12342
12362
12374
12383
12393
12401
12421
12434
12443
12466
12472
12493
12502
12521
12562
12571
12581
12591
12602
12613
12623
12631
12642
12663
12675
12681
12693
12712
12732
12751
12772
12782
12791
12801
12812
12823
12831
12852
12861
12871
12901
12953
12961
12972
12982
12992
13002
13011
13023
13041
13062
13073
13081
13091
13112
13121
13131
13141
13163
13182
13202
13212
13222
13231
13242
13272
13281
13301
13311
13324
13331
13342
13352
13361
13371
13391
13402
13411
13434
13451
13461
13491
13515
13523
13531
13543
13551
13571
13581
13591
13602
13611
13621
13631
13641
13652
13671
13682
13691
13712
13732
13746
13764
13771
13792
13803
13822
13832
13841
13851
13871
13881
13903
13913
13922
13932
13952
13972
13982
13992
14001
14021
14042
14051
14061
14081
14092
14101
14112
14132
14141
14151
14175
14181
14192
14202
14212
14231
14241
14251
14271
14294
14301
14322
14331
14352
14361
14411
14441
14462
14472
14481
14512
14532
14542
14554
14571
14581
14592
14601
14621
14654
14671
14681
14691
14701
14722
14741
14752
14761
14772
14781
14832
14881
14901
14922
14931
14941
14951
14961
14971
14981
15001
15011
15021
15041
15052
15061
15092
15101
15121
15133
15151
15181
15201
15211
15221
15231
15242
15252
15271
15291
15302
15323
15351
15381
15391
15402
15411
15422
15431
15441
15451
15491
15511
15521
15531
15551
15561
15581
15591
15651
15661
15671
15681
15691
15701
15711
15721
15741
15751
15822
15834
15842
15852
15863
15871
15882
15891
15901
15924
15931
15941
15952
15972
15982
15992
16003
16011
16021
16034
16042
16062
16081
16092
16103
16161
16182
16202
16221
16231
16282
16331
16341
16353
16361
16371
16403
16411
16421
16463
16481
16491
16503
16512
16521
16531
16541
16572
16582
16591
16601
16622
16632
16641
16652
16681
16691
16711
16721
16731
16761
16771
16781
16791
16811
16822
16831
16842
16851
16862
16871
16912
16931
16951
16973
16981
17011
17022
17041
17072
17083
17091
17101
17111
17131
17141
17162
17181
17193
17211
17231
17252
17271
17282
17292
17302
17312
17321
17341
17362
17372
17381
17411
17421
17431
17441
17463
17471
17491
17501
17521
17531
17542
17601
17611
17622
17631
17641
17651
17671
17682
17702
17712
17741
17752
17761
17801
17811
17821
17841
17852
17871
17892
17901
17941
17951
17971
17981
17991
18011
18031
18051
18063
18071
18081
18101
18121
18131
18171
18181
18251
18261
18271
18302
18311
18382
18411
18421
18481
18491
18511
18531
18552
18582
18591
18602
18611
18621
18632
18651
18662
18671
18691
18701
18771
18782
18791
18813
18831
18841
18861
18891
18902
18911
18931
18941
18972
18981
18991
19011
19021
19041
19051
19071
19081
19112
19123
19161
19181
19191
19212
19221
19232
19251
19261
19282
19291
19311
19321
19341
19361
19382
19401
19441
19451
19482
19491
19581
19591
19631
19641
19681
19691
19702
19721
19741
19773
19802
19841
19862
19881
19901
19911
19921
19931
20021
20032
20041
20071
20091
20131
20151
20171
20241
20251
20261
20271
20291
20314
20332
20341
20362
20441
20511
20531
20552
20562
20571
20582
20593
20612
20621
20641
20653
20661
20671
20711
20723
20811
20842
20861
20892
20941
20951
20971
20992
21041
21051
21092
21101
21111
21121
21161
21181
21202
21212
21262
21281
21311
21321
21333
21392
21401
21431
21451
21471
21481
21501
21511
21522
21563
21571
21591
21641
21661
21672
21691
21702
21711
21731
21741
21751
21761
21771
21781
21792
21821
21861
21872
21892
21902
21923
21931
21963
22042
22061
22082
22111
22121
22141
22162
22182
22191
22212
22241
22301
22371
22412
22442
22451
22461
22551
22581
22591
22601
22614
22671
22691
22702
22751
22812
22821
22841
22891
22902
22911
22961
22991
23011
23081
23101
23132
23151
23221
23281
23301
23331
23371
23381
23391
23421
23431
23441
23481
23501
23551
23561
23581
23601
23631
23671
23691
23711
23741
23761
23841
23891
23921
23961
23971
24011
24041
24071
24121
24131
24152
24201
24261
24291
24341
24352
24391
24401
24491
24511
24522
24531
24562
24582
24591
24641
24761
24821
24842
24861
24871
24932
24971
24991
25011
25041
25061
25111
25121
25141
25171
25231
25292
25341
25371
25451
25471
25481
25511
25531
25551
25562
25621
25631
25661
25691
25751
25761
25801
25841
25861
25881
25901
25911
25931
25951
25971
26011
26101
26121
26171
26261
26271
26281
26301
26312
26323
26331
26342
26371
26382
26471
26481
26581
26671
26681
26751
26791
26811
26832
26862
26941
26951
27001
27061
27081
27101
27191
27201
27221
27251
27351
27371
27491
27601
27632
27641
27661
27671
27731
27861
27891
27921
27991
28031
28051
28081
28201
28511
28631
28651
28661
28711
28742
28781
28971
29041
29081
29281
29321
29341
29361
29381
29411
29461
29621
29711
29741
29881
29891
29901
29931
29991
30152
30191
30291
30301
30331
30381
30461
30541
30591
30601
30641
30661
30891
30911
30921
31011
31091
31121
31131
31141
31251
31441
31591
31691
31841
31851
32031
32101
32151
32371
32422
32521
32531
32561
32651
32701
32741
32772
32781
32841
32861
32891
32941
33121
33301
33321
33381
33481
33781
33912
33941
34021
34291
34741
34891
34941
34961
34991
35181
35191
35311
35321
35401
35641
35681
35842
35951
36001
36061
36131
36181
36211
36661
36672
36681
36821
36851
37031
37201
37241
37481
37711
37761
37771
38371
38381
38401
38641
38791
38941
39142
39161
39171
39461
39531
39552
39581
39691
39711
40242
40341
40461
40681
41061
41121
41161
41201
41211
41471
41581
41661
41801
41841
42001
42281
42631
42701
42791
42831
42841
42861
43071
43081
43651
43661
43701
43711
44001
44062
44111
44232
44311
44401
44591
44671
44711
45152
45191
45341
45421
46251
46281
46371
46381
46641
46851
47111
47741
48021
48051
48261
48461
48611
48661
48681
48771
48791
49051
49101
49591
50011
50581
50861
51281
52781
53291
53461
53481
53491
54871
56091
56981
57191
57361
59061
61601
61891
61961
62311
64001
65341
65871
66091
67261
67891
69501
72261
72551
72951
74911
75641
75971
80941
87381
88801
120591

4月 19, 2013

URL表示を簡略化させつつ、コピー&ペーストに対応

注釈:この記事はQiitaにわたしが投稿していた記事を、自分のブログへ移動させたものです。
Twitterのソースを見ると分かるのですが、ふぁぼるっくにも同様の実装をしてあるので、そのときのやり方をメモしておきます。

Twitterなどで
「ふぁぼるっく bit.ly/favl... よろしく」
という表示があるのに、コピペすると
「ふぁぼるっく http://bit.ly/favlook ... よろしく」
となる。

隠れていた文字はいったいどこから!

これは



bit.ly/favl


というタグを書いて、非表示にしたいところinvisibleクラスに

.invisible {
    font-size: 0;
    line-height: 0;
}

というCSSを適用します。
サイズと高さをゼロにするのがポイント、display:noneとか、それ系だと、そこに存在しないことになっちゃうので、コピペしたときにクリップボードへ格納されないのです。

PostgreSQLで実行中のクエリー一覧を取得

注釈:この記事はQiitaにわたしが投稿していた記事を、自分のブログへ移動させたものです。
pgAdminIIIで同様の機能があるのですが、ロック一覧を取得するのに凄い時間が掛かってしまい、まともにウィンドウが開かなくなったので、実行中のクエリーを取得するSQLを書いてみました。

このSQLを呼び出すシェルスクリプトを用意し、コマンドラインから実行できるようにしています。
アプリケーション名をトリムしているので、お好みに合わせて調整してください。

\pset columns 0;
\pset border 0;
\pset format 'wrapped'
SELECT
  procpid AS "PID"
, to_char(start,'MM/DD HH24:MI') AS "開始時間"
, to_char(now() - start,'DD HH24:MI') AS "実行時間"
, usename "user"
, substr(application_name, 1, 10) as "name"
, client_addr "IP"
, regexp_replace(current_query,'\(\r\n|\r|\n|\t\)',' ','g') AS "クエリー"
FROM (
    SELECT
      S.pid AS procpid
    , S.query_start AS start
    , S.usename
    , S.application_name
    , S.client_addr
    , S.query AS current_query
    FROM (
      SELECT *
      FROM pg_stat_activity
      WHERE state <> 'idle'
    ) AS S
) AS S
WHERE current_query <> ''
AND current_query NOT LIKE '%DISCARD ALL%'
ORDER BY
  "実行時間" DESC
, "PID";

1月 17, 2013

「PLUTO」読了

かなり昔に「MONSTER」を読んだ影響から、この作品もAmazonからおすすめされていた。先に書いた20世紀少年から浦沢直樹つながりという事で。

このPLUTOの元となった鉄腕アトムの名前は聞いたことがあったけど、作品は読んだことがなかった。原作を知っている人からすると、かなり評価の高いリメイクとなっているようだ。
そのような予備知識がなくても、登場人物たちは個性的で、随分と楽しむことが出来た。ロボットが人間と一緒に暮らす世界。
事件が起きていく中で、ほんの少し先が予想でき、それが良い感じに続きが気になる仕組みになっていた。

浦沢氏はあまり長い話は描かないで、小さくコンパクトにまとめるか、別に作家さんと組んだほうがいいんじゃないのかな、なんて思ったり。

20世紀少年/21世紀少年

10巻ぐらいまで読んでいたんだけど、途中で止まったままだったので、改めて読みなおした。

後半になってくると話が長くなりすぎて、伏線があったのかどうか忘れたまま、都合のいいところで都合のいい人が出てくる感じがしてしまった。
ひと通りの話が落ち着く20世紀少年と、その回答編となる21世紀少年。
21世紀少年のラストでも、そんな人いたか?という感じで。
サスペンスではなく、ミステリーというか、謎の解きようがないので、ミステリーでも無いような。
せっかく描かれたのに、なんとももったいない作品のような気がしました。

「ほしのこえ」読了

コミック版のほう。
光でも時間がかかる距離に離れてしまった二人の間を飛び交うメール。相手に届くまで何年もかかってしまうという話。
映画の予告編だけ見たのだけど、全体を読んでみると予告編でほとんど説明されちゃってたんじゃないかと思った。

切ない話なんだけど、最後で少し救われた気がして、ハッピーエンドマニアとしては合格点。映画と小説では描かれていなかった部分らしいので、これが読めて良かった。

本編以外にコメントするのはどうかと思ったのだけど、作者があとがきで下げるのはやめてほしいなと思った。少なくともその時の最大馬力で描かれたんだろうし、これが渾身じゃないんだったら、もっと渾身の作品を読みたいなと。

あと作品の前提を崩しちゃうけど、相手の返事が届く前にどんどん送っちゃえば、毎日楽しめるんじゃないかと思ったり。そこは、ほんとの恋人じゃないからってところで説明がつくのかな。

「とらドラ!」読了

萌えの流れで、以前から気になっていたとらドラ!を読んだ。
ニコニコ動画で、アニメ版の実乃梨が「盛るぜ〜盛るぜ〜超盛るぜ〜」 と言っているシーンだけ見たことがあった。(ピンポイントすぎる)

ドタバタコメディで、アニメにしやすそうな雰囲気だった。
一巻から飛ばしまくりで、一気に読むには後半のほうになると、読むのに疲れを感じた。そのぐらいのハイテンション。
実際の発刊間隔だと、十分に楽しめると思う。

基本は竜児視点で進行していくのだが、大河が竜児を意識した過程も、大河視点でもう少し読んでみたかった。

スピンオフは脇役が主人公となる話。
それぞれのキャラが花を持たせてもらえる流れで良かったと思う。
何気なく過ごしていそうな登場人物達も、それぞれ同じ高校生なんだなと思わせてくれる話だった。
新しい学生時代を過ごしてみたくなりますね。

「ブラックジャックによろしく」/「〜2」読了

「ブラックジャックによろしく」が漫画 on Webで無料公開されたのを機に、ブラックジャックによろしく2もあわせて読んだ。

研修医という立場から、病院内でのしきたり、制度、法律などのやるせない部分に切り込んでいくという内容。
幸い、医者の世話になる機会は少なく過ごしてきたので、素人という立場からしては主人公の悩みなどがよく理解できた。主人公からの視点であるため、仕方がないとは思うのだが、その決まりを作った人たちも、それなりのプロで有っただろうし、どうしてその決まりが出来たのか、もう少し言い訳を聞きたい気もした。第三者として判断するには、意見が一方的すぎる感じがした。

そして話はブラックジャックによろしく2へと繋がっていくのだが、主人公の強さについていけなくなっていき、最後の臓器移植の話では、とうとう主人公の気持ちがさっぱり分からなくなってしまった。
結局、八方美人で、みんなからいい人だと思われたいんじゃないかなぁというも主人公への印象に変わってしまった。

そうして主人公も大きな波に飲まれてしまうのだけど、今までが強烈すぎただけに、そんな簡単に飲まれるんだろうか?という疑問と、絶対ゴタゴタを起こしているだろうという気持ちが合わさって、飛ばされた数年の部分も読んでみたいと思った。

1月 06, 2013

「中の人などいない@NHK広報のツイートはなぜユルい?」読了

@NHK_PRの中の人が宣伝していたので読んでみた。
細かいことだけど、NHK出版じゃないんだね。意外。

TwitterでのNHK_PRアカウント開設から、その運用に渡る流れを回想形式で綴ってあった。
ソーシャルネットサービス未経験の担当者が、よちよち歩きながら、ネットの文化に足を踏み出していく様が、読んでいてとても微笑ましかった。
今でこそNHK_PRのアカウントをフォローしているが、確か最初にアカウントを知ったのは、さかなクンさんの時だったと思う。
みんなに突っ込まれながら、このノリについていけるのだろうかとヒヤヒヤしていた。
ネタにネタで返す速度が速くなっている気がして、今では十分「こちら側」の人だと思う。

普段どういう想いで運用しているのか、というところは、アカウントでのやり取りを見ていてよくわかるのだが、本の内容はそれを改めて説明した感じだった。
今となっては説明されない、前半部のおろおろ具合がとても新鮮でした。

「エクセル・サーガ」読了

ハーイル、イル・パラッツォ!

この作品も長かった。
元々は専門学校の友人から面白いと聞き、読み始めた作品だった。

世界征服を企む秘密結社アクロス。しかし道は遠すぎるのでまず目指すは市街征服、といういかにもなギャグ漫画、登場人物みんなクセがあり過ぎ。
ハイテンション、ドタバタなので、一気に読むのは大変疲れる。
20巻ぐらいまでは、なんとか追いかけていたんだけど、だんだん離れてしまっていた。

細かい書き込みにボケが散りばめられており、じっくり読み込まないと、見落としてしまうところがありそうなのも、疲れる原因だったかもしれない。
話が進むにつれて、なんとなく登場人物たちの謎が想像できた。 壮大になりすぎて最終的なオチが、ちょっと弱いかなぁと思ってしまったりしたが、みんな幸せそうなので、それはそれでありかなと。
女性キャラたちのスタイルが良くて、眼福でした。行き過ぎるとしんどいなという感じで、ほどほどが良いようです。

「ヨコハマ買い出し紀行」読了

この作品も、アフタヌーンで通学時間に読んでいた作品。
途中の部分だけ読んでいて、作品の世界が気に入り、ずっと気になっていた。
この度、まとめて読みなおした。

海面上昇により人口が減った世界。
岬の先端で喫茶店を営むロボット、アルファさんとその周りの人々を描いたお話。
終始スローペースで、のんびりとした流れがとても気持ち良い。
登場するロボットは、ロボット離れした感情を持っていた。自分たちなりに考え・感じ、人が忘れてしまいそうな気持ちを思い出させてくれる気がした。

作品の中に登場する謎が、謎なままなのが少し気がかり。
しかし、それも人間には思いもつかない、または海面上昇など、人の手に負えなくなってしまった大きな流れの一部かと思うと、それほど気にならなくなってしまうのが不思議だ。
自然の流れに逆らわず、そういうもんだと思って身を任せて読むのがとても心地よい作品だった。