Masteries

技術的なことや仕事に関することを書いていきます.

「Fukuoka.pm #27」でトークをしてきました

10月29日に開催されたFukuoka.pmに参加してきました.

fukuokapm.connpass.com

10分ほどお時間頂いて, 最近取り組んでいるhitoboの開発において, LINEのMessaging APIをどのようにして扱っているか, そしてその為に開発した「Primus」という社内ツールについて話してきました.

資料はこんな感じです:

最近のplenv/Cartonの運用

最近のplenvとCartonの運用というか, 「こういう感じでやっていっています」という話です.

あらすじ: cpanm --installdeps .

PerlでWebアプリなど開発する場合, cpanfileに必要なライブラリを指定し, Cartonを使ってcarton installで必要なライブラリをインストールして, 開発を進めていくのが一般的だと思います.

...が, 横着な自分は大抵cpanm --installdeps .を使って, cpanfileで指定されたライブラリをそのままPerlにインストールして開発していくことが多かったのですが, 先日それで痛い目に逢いまして, 「ちゃんとCartonを使ってやっていこう」と心に誓いました.

「きれいなPerl」でCartonを使う

というわけで, コアモジュールとApp::cpanminus, Cartonだけ入った「きれいなPerl」の環境をplenvを使って用意して, これを使って開発していくようにします. また, 間違って(いつもの癖で)cpanm --installdeps .してしまわないように, 「きれいなPerl」の環境は「書き込み不可」にしてしまいましょう.

この辺りは, @tsucchi さんの 僕の perlbrew の使い方の話 - tsucchi の日記 2nd season というエントリで, Perlbrewではありますが, 似たようなことをやっていたので参考にさせて頂きました.

「きれいなPerl」環境を作る

今回は, 今日時点の最新版である5.24.0を題材にやっていきます.

$ plenv install 5.24.0 -- as 5.24-pure
$ PLENV_VERSION=5.24-pure plenv install-cpanm
$ PLENV_VERSION=5.24-pure cpanm Carton

plenv install--asオプションを付けて, 5.24.0を5.24-pureという名前でインストールします. pureは, 「きれいなPerl」という意味を持たせている... つもりです.

あとは, その環境にplenv install-cpanmでApp::cpanminusを, cpanm CartonでCartonを, それぞれインストールすれば, 「きれいなPerl」が出来上がります.

「きれいなPerl」環境をロックする

次は, cpanmでライブラリを勝手にインストールできないように, この「きれいなPerl」環境をロックしてしまいます. Macであれば, 次のようにすればOKです.

$ sudo chflags -R uchg ~/path/to/plenv/5.24-pure

「きれいなPerl」の問題点

あとは, Webアプリのルートディレクトリでplenv localなどを使い, 5.24-pureを指定すれば, 「きれいなPerl」環境の上でWebアプリの開発を進めることができます.

...が, この場合, 言うまでもなく, Minillaとか, App::PRTとか, Pod::Cpandoc::Cacheとか, こういった便利ライブラリは「きれいなPerl」では使えません(「きれいなPerl」環境にはこれらのライブラリはインストールされていないし, ロックしていて新たにインストールできないので).

cpanfileに入れて, carton exec --で動かす, という手もありますが, そういった類のライブラリはcpanfileには入れたくありません.

力で解決: carton-wrapper

解決策はいろいろありますが, 自分は別途plenvで5.24をインストールして, これにMinillaとか, App::PRTとか, Pod::Cpandoc::Cacheとか, 諸々のライブラリをインストールするようにしました. そして通常は5.24のPerlを利用するようにして, cartonコマンドを実行した場合のみ, 「きれいなPerl」, すなわち5.24-pureで動かすようにしました.

このような場合における, plenvでインストールした5.245.24-pureという複数のPerl環境の使い分けについては, こんな感じのcarton-wrapperというスクリプトを書いて, パスを通してalias carton="carton-wrapper"みたいな設定をして, 実現しています.

#!/usr/bin/env perl
use strict;
use warnings;

my $CARTON = $ENV{SCRIPT_CARTON} // "$ENV{HOME}/path/to/plenv/shims/carton";

$ENV{PLENV_VERSION} = $ENV{PLENV_VERSION_FOR_CARTON} if $ENV{PLENV_VERSION_FOR_CARTON};
exec($CARTON, @ARGV);

plenv global5.24を使うように設定した上で, Webアプリのルートディレクトリでdirenvなどを使い, PLENV_VERSION_FOR_CARTON環境変数を5.24-pureにセットします.

cartonコマンドを実行するとcarton-wrapperが呼び出されて, PLENV_VERSION_FOR_CARTON環境変数の値(例えば, 5.24-pureなど)がPLENV_VERSIONにセットされ, これによってcartonコマンドのみ5.24-pureを使って実行されるようになる, という感じです.

まとめ

ここ最近の, plenvとCartonの運用というか, 「きれいなPerl」でCartonを使う為に頑張ったアレコレについて記しました. この辺り, もっと良い方法がある気がするので, ご存知の方は是非教えて頂けるとうれしいです.

「株式会社ガイアックス」の所属ではなくなります

まだ正式な日程は決まっていませんが, 近いうちに所属が「株式会社ガイアックス」から, 子会社の「アディッシュ株式会社」に変わります. ...まあ早い話が「転籍」っていうやつです!

経緯

ありがたいことに, 6月末辺りにアディッシュの社長から「一緒に仕事やろうよ!」と声をかけて頂いて, 7月末あたりからは100%の時間を割いてアディッシュの新規サービスの開発に従事していたのですが, やっているうちにいろいろ心境の変化とかがあって, 今回の決断に至った次第です.

...このあたりは本当に, 4月末からいろいろあった結果の出来事なので, もしこのへんの話に興味があれば🍻などしながら聞き出すと良いでしょう.

今後

本当に「所属が変わる」だけで, 現時点ではアディッシュもガイアックスも同じオフィスで仕事してますし, これまで業務の一環として続けてきたOSS活動(Perl入学式やJPAといったコミュニティ活動も含みます)についても, 続けていけることになっています.

本当に何も変わらないのですが, とは言えこのへんの所属に関する情報は, ちゃんとパブリックに(?)しておいた方が良さそう, ということでブログを書いた次第です.

今やっていること

hitobo.io

hitoboという, チャットボットに関する新規サービスの開発をしています.

...実は, 以前インターンに来てくれた@codehexくんもここのチームで仕事をしてくれていました.

codehex.hateblo.jp

アディッシュ社内はもちろん, ガイアックスグループ全体で見ても平均年齢が若い方な, 非常にフレッシュさが溢れる(?)開発チームの一員として, PerlでAPIサーバを書いたり, AWSを駆使してインフラを整えたり, たまにJavaScriptをいじったりしながら過ごしています.

当面は, この新規サービスの開発支援という形でアディッシュと関わってきましたが, これからはアディッシュ社内に残っているレガシーシステムの改善/置き換えや, 開発基盤の構築, 技術文化の促進や技術広報などにも力を入れていけたらな, という気持ちです.

目標

アディッシュは, 「つながりを常によろこびに」をミッションとして, 「営業」「運用」「開発」が三位一体, 一丸となってやっていっている会社だと思っています. そんなアディッシュの未来を見据えた時に, 「営業」「運用」「開発」の各領域が連携しつつ, それぞれ独自に強くなっていく必要があると感じています.

そのうちの1領域である「開発」の部分を, より強い, 良い組織に前進していけるよう, エンジニアとして先駆けて動いていきたいと思っています. まだまだ至らぬ所も多いですので, 引き続きご指導ご鞭撻の程, よろしくお願い致します.

「みんなのGo言語」を読みました

9月9日に発売された「みんなのGo言語」を, いろいろなご縁がありまして, 筆者の1人である@lestrratさまよりご恵贈頂きました.

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

...私事ではありますが, 8月から9月にかけて仕事が盛り上がっており, ちまちまと時間を作って読み続けていたのですが, ようやく読了しましたので感想などを綴りたいと思います.

結論から述べると, 「LL言語からGoへ入門する人は絶対に持っておくべき!」という感想を持ちました. 少なくとも自分のようにLL言語(自分の場合, Perl)からGo言語に入門するようなエンジニアであれば, 絶対に手元に持っておくべき良書だと思います.

最初の障壁「環境構築」にしっかり文面を割いている

@songmuさんが執筆された第1章の「Goによるチーム開発のはじめ方とコードを書く上での心得」は非常に価値がある内容だと思います. というのも, Perl入学式という初心者向けのプログラミング勉強会を主催している身としては, 「プログラミングの最初の障壁は, プログラミングをするための環境を作るところである」と常々感じていて, この章の内容はその辺りの「Go言語を書き始めるにあたって必要な初期の環境設定」について, 懇切丁寧に書かれていてとても良かったです.

正直, このへんの環境構築は, 正直適当にやっていてもなんとかなるっちゃなんとかなりますが, ちゃんとやっておけば非常に楽になりますし, 何よりGo言語はフォーマッターやLintツールがオフィシャルに提供されていて, これに「乗っかる」ことで効率よくコードを書けるので, こういう形で「1つの章」としてまとめて書かれているのは, Go言語をチームで導入していく際の知見共有などを考えても非常に有り難いことだと思います. 「みんなのGo言語」を手渡して, 「第1章を読んで, こんな感じで設定してみて!」って言えますし.

CLIから入っていける

「みんなのGo言語」では, @deeeetさんが担当された第4章を中心に, 「Go言語でCLIツールを作っていく」というテーマ(?)で, Go言語の様々なテクニック, ノウハウが紹介されています. この辺りは, 「Go言語でWebアプリケーションを作りたい!」と思っている人にとっては多少の不満ポイント(?)かもしれませんが, 本書では逆にCLIツールに特化することで, 「現場で使える実践テクニック」の紹介に集中出来ていると思いました(なので, 個人的な意見ではありますが, 次は「Go言語で"Webアプリケーションを作る時に"使える実践テクニック」とか出てくると非常に嬉しいですね!).

更に言えば, 「Go言語でWebアプリケーションを作りたい!」と思っている人こそ, 本書を手に取るべきだと思っていて, なぜなら「いきなりWebアプリケーションを書くのは難しい」と思っているからです. Webアプリケーションは, 作ったものをブラウザで実際に動かすことができるので, 達成感というか, 「勉強してやりきったぜ!」という気持ちになりやすいのですが, そこに至るまではプログラミング言語そのもの(ここではGo言語)だけでなく, データベースといったミドルウェアや, WAFやORM, テンプレートエンジンといったライブラリの知識も必要になってくるので, 最初の一歩としてはやはり障壁が高いように思っています.

なので, 始めてGo言語に挑戦する人はもちろんのこと, 他言語を足がかりにGo言語にチャレンジする人も, いきなりWebアプリケーションに向かっていかずに, CLIツールから入っていくのが良さそう, と思っています. この辺り, @yusukebeさんのブログに書かれているGolangを初めて本番投入したぜ!という記事で,

と言っても、いきなり画像処理や文字列の改行計算を含んだ「ひとつの」アプリケーションを書き始めるのはニュービーにとって漠然としすぎてて、ムリゲです。なので、スタンプサーバの実装要件をピックアップし、それごとに小さなGoコードの塊=コードスニペットをたくさん書いていきました。

と書かれていて, まずは「小さなGoコードの塊」... 恐らくは小さなCLIツールを書いていって, それをまとめてボケてというWebサービス(アプリケーション)にGo言語を導入していったのと, 同じ... なのかなあ, と思っています.

特に, PerlとかRubyとかを使って, 何かしらの「便利スクリプト」を書いて使っている人は, 本書で紹介されているテクニックを参考にしながら, それらをGo言語に移植していくところから入っていくと良さそうですね!

まとめ: 理論の「Tour of Go」, 実践の「みんなのGo言語」

Tour of Go」がGo言語の理論, つまり「こう書けば, こう動く」という所を教えてくれるとすると, 「みんなのGo言語」はGo言語を実際に使う場面で役立つ, 「こういう感じでやっていけばいいよ!」というテクニックやノウハウを教えてくれる本です.

「Go言語でプログラミング言語に初チャレンジします!」という人はともかく(個人的には, そういった方はまずはRubyとかLL言語から入っていった方がいいのでは? という気もしますが...), 自分のように何かしらのプログラミング言語を既に学んでいて, そこからGo言語へ入ってくという場面であれば, 「Tour of Go」の次に, 或いは「Tour of Go」と並行して, 本書を読んでいくのは非常に有意義だと思います.

...というわけで, 「みんなのGo言語」, 非常に良い本でした!

マイグレーションツール「Anego」をCPANにdeveloper releaseしました.

追記: Anegoの入門記事(使い方)をQiitaに書きました: Perl製のデータベースマイグレーションツール「Anego」入門

metacpan.org

以前からちまちまと作っていた, RDBMSのマイグレーションツール「Anego」を, developer releaseしました. ドキュメントもテストも全然書けていない状況ですが, とりあえずslaslaのマイグレーションは既にAnegoに置き換えていていまして, 現状いい感じに動いているっぽいです.

ちなみにGitHubはこちら:

github.com

何故作ったか

元々, PerlでWebアプリケーションを作っている時のマイグレーションは, GitDDLとかGitDDL::Migratorとかを使っていたのですが, 自分が使う範疇ではちょっとオーバースペックかな, という部分が多くて, 最近は@sugyanさんが昔書かれていたブログ記事, 「SQL::Translator::DiffでDBスキーマに追従させる方法」を参考に, プロジェクトごとに"オレオレマイグレーションスクリプト"を用意したりしていました.

memo.sugyan.com

...が, いい加減, 毎回毎回マイグレーションスクリプトをいちから用意するのが面倒になってきたので, モジュールとして切り出そう! という感じになって出来上がったのが, Anegoです.

昔, @songmuさんが報告されていた, SQL::Translator::Diffで変なdiffが出る問題も, 手元の環境ではこうやったら動く... という感じのアレではありますが, うまく動くように対応したりしています.

まだまだ荒削りですが, 興味があれば是非使ってみてください. また, 機能追加の提案やバグレポート, Pull Requestもお待ちしております!

余談

...ちなみに, 名前は@karupaneruraさんが開発されたORM「Aniki」にインスパイアされて付けました. 「姉御のように頼りになるマイグレーションツール」になったらいいな, という思いがこもっています(?).