GitPrepをcartonベースでインストールする
いろいろあって、GitPrepを試してみることに。
共有サーバでのセットアップ手順の他に普通に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は考えることが少なくて良い。
とはいえ何より、独自の仕組みとかではなく汎用フレームワーク上に作ってあるので、好みに合わせて手出しやすいのが良いかなぁ。本当に欲しいなら自分で付ければ良いのだ。
箱男
THE FUTURE IS JAPANESE
海外で出版された「日本テーマのアンソロジー」を日本語に翻訳した、という、経路が何か複雑な逆輸入?作品集。
玉石混交というか、これで終わっていいの?と思うような終わり方をされたりもするのだが、最近の短編のトレンドなんだろうか。良いんだけど。いや、良くない。つまり、「謎が残る」ではなくて「続きそう」な終わり方なんだよね。リドルストーリーと言えば聞こえは良いのかもしれないのだが、そういう問題じゃないよ。うん。結構魅力的なストーリーだったりもして、続き書く気あるなら書けよ、と思うものがそこそこある。
ま、それは良くはないが良いとして。
日本人作家も参加していて、ものによって書き下ろしだったりもするので、本当の逆輸入状態だ。ちゃんと海外にも行っているのかと思うと、うれしくもある。「不思議な日本感」を感じなくもないが、その不思議さを含めて、何か「愛」のようなものを感じざるを得ず、不思議と心地よさがある。いろんな意味で日本の作品を思う、そういう作品集だった。
ペンギン・ハイウェイ
唐突にこれを読んだのは、本作が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 で格納しておくときなどにハマる、かもしれない。というかハマった、という記録。