GitPrepをcartonベースでインストールする

いろいろあって、GitPrepを試してみることに。

http://gitprep.org/

共有サーバでのセットアップ手順の他に普通にLinuxでセットアップする方法(setup.shを実行するやつ)もREADMEに書いてあるが、都合上モジュール類をcartonで処理したい。

セットアップスクリプトや起動用のラッパーを読むと、要するにモジュールのサーチパスをどうこうしているだけなので、基本的には「ただのMojoliciousプロジェクト」である。ということは、適切な環境さえ用意すれば、あとはscript/gitprepを叩くだけで動く。

cartonに環境構築を任せるなら、難しいことを何一つ考えなくてもcarton execで動作させることができる。はずだ。

前提

  • cartonがインストール済みで正しく動く

git cloneする

git clone https://github.com/yuki-kimoto/gitprep

cpanfileを書き換える

setup.shやその他のセットアップコード、実行スクリプト、同梱モジュールなどを見ると、プロジェクトのコンセプトは「プロジェクト内で完結すること」である。

例えば、基本になるcpanmもMojoliciousフレームワークも同梱されている。その他の同梱されていない依存モジュールはcpanfileに書いてある。同梱してあるcpanmを使ってインストールするという前提だ。

また、各種セットアップスクリプトや実行用ラッパーなども、それを前提としてパスや環境変数の調整を行うようになっている。

これはこれで完結していて良いとは思うのだが、モジュールのインストールパスが何だかよく分からないことになる危険がある。

今回は、環境の調整等も含めて全てcartonで処理したいので、同梱されているいろいろを無視してcpanfileだけ活用する。が、肝心のMojoliciousとかが書いていない(前述の通り含まれている)ので、書かれていない依存モジュールをcpanfileに書き加えておく。

いろいろ調べたり動かしたりした結果、書かれていなくて加えなくてはならなかったのは以下。

requires 'Mojolicious', '== 4.07';
requires 'Mojolicious::Plugin::INIConfig', '== 0.02';
requires 'Mojolicious::Plugin::BasicAuth', '== 0.07';
requires 'Mojolicious::Plugin::AutoRoute', '== 0.12';

バージョン指定は、mojoディレクトリに含まれる「同梱されてきたMojolicious」の各モジュールバージョンにした。

たぶんバージョンにそれほどこだわりはなかろうが、Mojoliciousの最新を持ってくるとvalidationの仕組みが微妙に変わっていたりして動かなくなったりする。まぁ、最新にして「動くようにする」というのでも良い。さほど大変でもないだろう。

carton install

依存モジュールをがばっと入れる。

carton install

して待つだけ。

実行

cartonで必要なモジュールを全部入れたので、同梱の起動スクリプトを使用せず、cartonで直接実行すれば良い。とりあえず試すなら開発サーバにて。

carton exec — morbo script/gitprep

無事立ち上がればOK。

デプロイ等、実運用でのノウハウはそれぞれにお任せします(丸投げ)。どうせただのMojoliciousプロジェクトなので、情報ならどうにでもなるだろう。

上記の依存モジュール調査では、実行してみて足らないものを足す、というのもやった。たぶん上記のレシピだけで問題はないはず。

留意点

当然だが、Mojoliciousがリポジトリに含まれているとかを無視してcartonで入れてしまっているので、今後のアップデートの際に、git pullしたらだいたいアップデート完了!とはならないだろうと思う。アップデート時には主にcpanfileを保守してcarton installというのが基本フローになるだろう。

感想

多少心得があるなら、いろいろ考えるより「普通にMojoliciousプロジェクトをデプロイする」方式のほうが、むしろ馴染みがあって楽なのでは、と思った。

GitPrepについては、本当に気軽に使えるのが良いなと思う。gitoliteみたく、 公開鍵 + sshでのアクセスもユーザー情報と絡めてうまい感じにハンドリングしてくれると嬉しいな。HTTPでも悪くはないけど、使いどころによってはSSLとか考えないといけなくて、その点gitoliteは考えることが少なくて良い。

とはいえ何より、独自の仕組みとかではなく汎用フレームワーク上に作ってあるので、好みに合わせて手出しやすいのが良いかなぁ。本当に欲しいなら自分で付ければ良いのだ。

箱男

自分はSF読みであるが、嫁(文系)のオススメでなぜか安部公房を読むことになった。SF読みと文学読みの共有可能なジャンルは、先鋭的純文学(?)であったらしい。

あらすじや解説などを読むと、匿名性の追求やらということになっている。自分もそういう小難しいことが言ってみたいが、SF読みからすれば、物語世界の枠組みを踏み越えてしまうメタな設計などがぐっとくるように思う。「匿名性とは」「箱男とは」ではなくて、「この物語が合理的に書かれうる状況とは」を考えると大変面白い。

文章中に新聞記事風の文章や写真資料、注釈が入っていたりと、ユーモアの多い文章で、それ自体楽しめる。しかしそもそも注釈をいれたのは誰なのか。本人には書き得ない注釈もある。実は、一節ずつ別の人物・人格が書いて、場合によっては前の物語にはみ出し、上書きしてしまっているのではないか。

誰か書いたかわからない文章の連鎖。「はてな匿名ダイアリー」みたいなものだと考えると簡単だが、ウェブの全体についても大差はない。ウェブだなんだと言っても結局現実世界の延長である。匿名性の追求により至った世界は、既に現出しはじめているのかもしれない。

文学作品なんて、多様な解釈があって良いと思うのだけれど、これだけいろんな楽しみ方ができるのは、やはり良い作品だよなぁと思った。

箱男 (新潮文庫)

風の邦、星の渚

中世でファーストコンタクト、と来るとどうしても「異星人の郷」と比較したくなるが、方向性が大きく違う。別にファーストコンタクト自体はテーマではないようだし、そもそも問題にもなっていない。それよりも町作りものというか、「復活の地」のような感じかなぁ。いや違うか。

時期やターゲットの問題もあるだろうが、小川一水の作品は読みやすすぎてコストパフォーマンスが悪い。野尻抱介程ではないにせよ。

風の邦、星の渚―レーズスフェント興亡記風の邦、星の渚 上―レーズスフェント興亡記 (角川春樹事務所 ハルキ文庫)

機龍警察 自爆条項

普通に警察ものとして読むと良いのではないかと思った。至近未来ということなので現実ともリンクしかねない設定になり、なかなか出来のいい「現代もの」と考えてもさほど遜色ない気がする。自分はそういうのはあまり読んだことはないので、そっち方面が好きな人の感想が聞きたい。

一応、前作の絡みはあるにはあるが、ほんの一部だけ。伏線を残したままというか、おそらくメインだろうという線はほとんどノータッチに近いので、今後もしばらく続くんだろうなぁ(すでに発売予定の単行本あるし…文庫まで待つけれど)。このパターンで一人ずつ掘っていくことにしてしまうと先がすごく長いなぁ。まあ楽しみにしよう。

機龍警察 自爆条項 (上) (ハヤカワ文庫JA)機龍警察 自爆条項 (下) (ハヤカワ文庫JA)

THE FUTURE IS JAPANESE

海外で出版された「日本テーマのアンソロジー」を日本語に翻訳した、という、経路が何か複雑な逆輸入?作品集。

玉石混交というか、これで終わっていいの?と思うような終わり方をされたりもするのだが、最近の短編のトレンドなんだろうか。良いんだけど。いや、良くない。つまり、「謎が残る」ではなくて「続きそう」な終わり方なんだよね。リドルストーリーと言えば聞こえは良いのかもしれないのだが、そういう問題じゃないよ。うん。結構魅力的なストーリーだったりもして、続き書く気あるなら書けよ、と思うものがそこそこある。

ま、それは良くはないが良いとして。

日本人作家も参加していて、ものによって書き下ろしだったりもするので、本当の逆輸入状態だ。ちゃんと海外にも行っているのかと思うと、うれしくもある。「不思議な日本感」を感じなくもないが、その不思議さを含めて、何か「愛」のようなものを感じざるを得ず、不思議と心地よさがある。いろんな意味で日本の作品を思う、そういう作品集だった。

THE FUTURE IS JAPANESE (Jコレクション)

ペンギン・ハイウェイ

唐突にこれを読んだのは、本作がSFだとかそうでないとかを見たからなので、一応SF読みとしてSFなのか考察したい。

SFの定義は割と曖昧なので、ハッキリしたことは何とも言い難い。参照しやすいWikipediaあたりを見ても、何かの定義になっているようには到底思えない。「そういうもの」がSFである。

言いようによっては、SFというものには不確定性があるのだろう。確かに「SFという何か」がありそうなのだが、一つのものさしで観測するとその他が曖昧になってしまうのだ。これは難しい相手である。

細かいことを考えずにモチーフとアプローチで区切るなら、舞台装置としてSF的モチーフを使用しているとは言えよう。同様のことは同作者の「四畳半」のほうについても指摘できる。

本書で主役になる「海」は、ある意味では四畳半世界と同様の性質を持ったものであるとも考えられる。どうやらそう言った世界観がお好みらしい。少なくとも「SFマインドのある作家である」とは結論できそうだ。

ただし、その秘密、そのメカニズムに直接アプローチすることはない。この辺りがSFなのかそうでないのかの論争を産んでいるのかもしれない。

SF読み的なSF考察をともかくとすると、全体的にたんたんと静かに進むが、何とも言えない懐かしさや、身に覚えのある感覚などが面白い。おそらくこれはそういう小説であって、上記のようにSFがどうたら言っているのは、たぶん無粋なのである。

ペンギン・ハイウェイ (角川文庫)

Net::Twitter->updateのresをMojo::JSONに通すとidがズレる

TweetのIDはMojo::JSONを通る過程で丸められてしまう事がある、という話。

use feature 'say';
use Net::Twitter;
use Mojo::JSON 'j';

my $nt = Net::Twitter->new( ... );

my $res = $nt->update( scalar localtime );

say $res->{id}; => 362827222706438144
say j( j( $res ) )->{id}; => 3.62827222706438e+17

JSON になったデータを見てみると特に間違ってはいないので、 JSON -> hashref の変換時に丸まるのだと考えられる。従ってこのデータを元にTweetを探すと、思ったように動かない。

解決としては、 id_str を使えば良い。 id_str はその名の通り文字列なので、数値として丸められることはない。

say $res->{id}; => 362827222706438144
say j( j( $res ) )->{id_str}; => 362827222706438144

特に、得た結果を JSON で格納しておくときなどにハマる、かもしれない。というかハマった、という記録。