アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

YAPC::Kansai 行ってきた感想

全体的に良かった。トークもしました。

特に

  • Webアプリケーションのキャッシュ戦略とそのパターン
  • Perl ウェブ開発の中世 〜CGIPlack の間〜
  • はてなシステムの考古学

の3つが良かった。 moznion さんの「Webアプリケーションのキャッシュ戦略とそのパターン」のスライドで一番印象的だったのが引用。

この辺時間があった時読んでいきたい。 パターンに名前をつける話の時に、設計段階でその部分部分に何かしら名前をつけておくことで、コミュニケーションがしやすいというのがあったのですが、これは真似していきたいと思いました。(キャッシュの話ももちろん良かった!!)

残りの二つの話が特に温故知新のテーマにぴったりな良い話でした。凄く面白かった!!!

xtetsuji さんの「Perl ウェブ開発の中世 〜CGIPlack の間〜」、CGI については聞いたことがあるという程度だったので、リクエストが来た時にスクリプトが実行されてその結果を返していたという点は驚きました。まじかよ CGI となった瞬間です。あと、Common Gateway Interface という名前の割に全然 Common じゃねえ!という点、Plack の方が共通化できてたんですね!流石 PSGI

motemen さんの「はてなシステムの考古学」。はてなの歴史(時代毎の開発体制、サービス)についての話でした。独自のWAFを持っていて、時代毎に求められているものをちゃんと見極めた上で、何回か作り直していたらしいです。メンテナンス性ってやっぱり大事なんだなとつくづく思いました。

今回のYAPCも前夜祭、懇親会を含めとても楽しい思い出になりました。Perlに対するモチベーションも上がってきたので何かやろうと思います。 運営スタッフの皆様本当にお疲れさまでした。そしてありがとうございました。

YAPC::Kansai で Perl と Go のトークをしてきました!!

20分喋ってきました。いやー緊張しますねやっぱり。

20分ということもあって内容を少し省いて喋ったので、伝えたい部分が伝えられなかったような気もします。 まとめられてる記事も発見したのでよろしければどうぞ

qiita.com

言い足りなかった部分として

  • Go では Perl でいう push は append に値する
  • capacity を指定してスライスや map を作成すると realloc が走らないため高速
  • 生成したプロセスを管理する時はスライスに type Process を追加する
  • Process.Wait でプロセスが死んだか確認する
  • 死んでいた場合, スライス内のそのプロセスの位置に nil を代入してあげる
  • 新たに生成した type Processnil の位置に置く
  • 全ての要素が nil ではない場合 append する
  • 参考

この辺。
初めてのトークYAPC だったということが凄い光栄だと思ってます。
見に来てくださった皆さんありがとうございました。

そしてこれはルートビアです。
全体の感想は後ほど👍

YAPC::Kansai で Perl と Go のトークをしてきます!!

14:00 ~ 14:20 の時間に C 会場で 「Perl to Go」というタイトルでお話しします。内容としては、ある Perl モジュールを Go で書き直すときに、Perl の書き方をそのまま Go に移植したところ、信じられないくらい不便なコードになってしまったので、その辺の戒めを含めアウトプットしていきたいと思いました。
ちなみに大きなイベントでトークするのは今回が初めてなので、皆さん心温かく見守っていただけると嬉しいです🙏
是非来てください!!

画像は本内容とは全く関係ない、ただの昼ごはんです。

Perl の warn は何をしているの?

最近 Go ばっかだったので、久しぶりに Perl を書いてると色々疑問が出てきました。その中の一つが「$SIG{__WARN__} に代入されたサブルーチンが実行されるタイミング」でした。

__WARN__ とあるので、 warn を実行した時がトリガーになって実行されるものだろうというのは予想できていましたが、僕が warn の処理内容を内部で caller のようなものを実行し、package 名、warn を実行した行番号を取得して stderr へ出力しているものだと思っていました。そのため「stderr を通じて出力された時がトリガーとなって $SIG{__WARN__} が呼び出される」と考えたのですが、Okinawa.pm の Slack で
f:id:codehex:20170226224215p:plain
というようなアドバイスをもらったので以下のようなコードを書いて試してみました。

use strict;
use warnings;
use Carp;
BEGIN {
    $SIG{__WARN__} = sub { print "CALLED!!\n" };
}

warn "First\n";
carp "Second\n";
print STDERR "Third\n";

結果は

CALLED!!
CALLED!!
Third

というような結果を得ることができました。carp も内部では warn を呼び出しているようなので、結果から warn を実行したタイミングがトリガーになるということが分かりました!

…が今度は warn って実際に何やってるのだろうという疑問が出てきたので、コードを大まかに追ってみることにしました。
これが多分 warn のソースコード。この関数の中で vwarn という関数を呼んでいますが、実際は Perl_vwarn のマクロ みたいですね!
ということは warn の本体である Perl_vwarn を読んでみると stderr へ書き出す前に invoke_exception_hook という S_invoke_exception_hook のマクロが呼び出されていることが分かりますね!
S_invoke_exception_hook のコードです。

STATIC bool
S_invoke_exception_hook(pTHX_ SV *ex, bool warn)
{
    HV *stash;
    GV *gv;
    CV *cv;
    SV **const hook = warn ? &PL_warnhook : &PL_diehook;
    /* sv_2cv might call Perl_croak() or Perl_warner() */
    SV * const oldhook = *hook;

    if (!oldhook)
    return FALSE;

    ENTER;
    SAVESPTR(*hook);
    *hook = NULL;
    cv = sv_2cv(oldhook, &stash, &gv, 0);
    LEAVE;
    if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) {
    dSP;
    SV *exarg;

    ENTER;
    save_re_context();
    if (warn) {
        SAVESPTR(*hook);
        *hook = NULL;
    }
    exarg = newSVsv(ex);
    SvREADONLY_on(exarg);
    SAVEFREESV(exarg);

    PUSHSTACKi(warn ? PERLSI_WARNHOOK : PERLSI_DIEHOOK);
    PUSHMARK(SP);
    XPUSHs(exarg);
    PUTBACK;
    call_sv(MUTABLE_SV(cv), G_DISCARD);
    POPSTACK;
    LEAVE;
    return TRUE;
    }
    return FALSE;
}

分からない部分多すぎて泣けてくる…

きっと SV **const hook = warn ? &PL_warnhook : &PL_diehook; の部分で hook 変数に $SIG{__WARN__} へ代入されたサブルーチンを渡していて、SV * const oldhook = *hook; して cv = sv_2cv(oldhook, &stash, &gv, 0); を行って最終的に cv 変数の中にサブルーチンが代入されるのだろうと。 call_sv(MUTABLE_SV(cv), G_DISCARD); でそのサブルーチンが実行されているんだろうなと考えました。間違っていたら教えてください。

ちなみに $SIG{__WARN__} 部分のコードは Perl_magic_setsig だと思います。

結論

  • warn は stderr へ出力するだけの関数ではない。
  • warn$SIG{__WARN__} に代入されたサブルーチンを実行して stderr へ出力する。

…多分!!!!

Go で複数プロジェクトを同時に起動する Golet を作った

Code-Hex/Golet - GitHub  GitHub stars

Golet can manage many services with goroutine from one golang program.

Go で複数コマンドを同時に実行したり、 Cron のようにあるタイミングで何か実行させたりなどを行うことができるものを作りました。

これは元々 PerlProclet という kazeburo さんが作成したものを基にして作ってたのがきっかけです。Proclet 本当に素晴らしいモジュールなので Perl 使ってる方は是非使ってみてください!!

そもそも何ができるのか

例えば、マイクロサービス的な言語別の複数プロジェクトを一つのサービスとして扱いたい、つまり複数プロジェクトを起動したい時に Golet を使うことができます。

どんなコードを書けばいいのかは Synopsis を見ると分かるはずです。

特徴

自動でサービスごとのポートの割り当てや cron で動かすタスクを指定することもできます。 github.com/robfig/cron のフォーマットを使って動かします。

動きはこんな感じ。

興味があれば使ってみてください。

約10年共に生活したカメが亡くなりました

昨日1月8日に小6の頃から生活を共にしてきたクサガメのカメ丸がお亡くなりになりました。

僕の家では2匹のカメを水槽別々で飼っていて、カメ丸はそのうちの一匹でした。(もう一匹は甲太郎です。)水槽を洗う時はよくベランダに野放しにしていると、室外機の下や、園芸用道具箱の隙間などによく入っていく子でした。つい最近、カメ丸の水槽につけているフィルターも新しい物へ変えたばっかりだったし、ついこの間まで水槽内を暴れまわるくらい元気だったので、突然の別れが本当に信じられませんでした。

亡くなったカメ丸は近くの公園にある森林のエリアで埋葬しました。

そして今日の午後に飼っていた水槽を片付けすることができました。

今の僕の気持ちとしては、なんで早く異変に気付いてやれなかったのか、一昨日からもう少し観察していれば変化に気づいていたのではないかなどの後悔があります。そして今までキツイことがある度に何度もカメ達に癒されてきたことか、一匹でも存在を失ったことが正直とても辛いです。

このブログを書いた目的としては、今までの思い出(めっちゃ沢山ある)を思い出しながら自分の気持ちを新たに切り替えていこうという気持ちで書きました。

そして残りのもう一匹である甲太郎をカメ丸の分、精一杯可愛がろうと思います。

 

カメ丸よ本当に今までありがとう。そしてお疲れ様でした。また会う日まで。

YAPC::Hokkaido へ参加してきた

この記事は 12/10 の Perl入学式 Advent Calendar 2016 も兼ねています。本当は沖縄のPerl入学式の様子を書こうと思ってましたが、今日が YAPC::Hokkaido だったので、どういう雰囲気だったのかを踏まえて書くことができると良いかなと思います。

僕が聞くことができたセッション、LT一覧です。

前夜祭

  • JSON, JSON::PP, and more
  • 楽器アプリ制作の裏側
  • From Perl to Haskell
  • Perl MongersのためのサーバーサイドSwift入門
  • なるほどErlangプロセス

前夜祭はどんな感じだったかというと、乾杯した後LT大会が始まってからが盛り上がってきました。しかも本セッションで聴けてもいいのでは?といった内容だったので、来年のYAPCに参加したい方は是非前夜祭から行くことをお勧めします。

本セッション

  • 奥 一穂さんの「HTTP/2の最適化について」
  • papixさんの「APIPerlで作る時に僕達が考えたこと 」
  • charsbarさんの「2016年のPerl (Long Version)」
  • Vickenty Fesunovさんの「Writing Perl extensions in Rust (English) 」
  • Dan Kogaiさんの「Number Unlimited」
  • kazeburoさんの「Site Reliability Engineeringの話」
  • 高山裕司さんの「CMSAPI の素敵な関係」
  • 千葉 誠さんの「Vue.jsによるWebアプリケーション開発 」
  • karupaneruraさんの「頼りがいのあるORM「Aniki」徹底解説!」
  • masayoshiさんの「はてなのインフラ環境を自宅で再現する」
  • Yappoさんの「LINE Bot on the Perl
  • Miyagawaさんの「Delivering a CDN」

一番感じたことは、YAPCはそれぞれのトークが部屋ごとに分かれており、「もう一人自分がいれば...!!!!」というくらい全てのセッションを聴きたかったです。 僕はあまりにも学べることがあったので、メモのためにツイートの数が増えてしまいました。

感想

僕は前夜祭からの参加することにしました。今回の YAPC に参加して感じたことは、トークの内容が少しついていけない部分があるなーと感じましたが、何が分からなかったという部分を覚えていれば、後で発表者に直接聞いてみるということができたので、そういうことをできるのが YAPC の凄さかなと思いました。
セッション後は懇親会が開催されました。懇親会では Perl 界の重鎮達と会話する機会があったので積極的に話を聞きに行きました。皆さん優しいのでちゃんと話を聞いてくれるし、話をしてくれますので、初心者でも積極的に話を聞きに行くことができればとても勉強になるだろうなーと感じました。 次はYAPC::Kansaiがあるのでこの記事を読んでくれている皆さん是非参加してみましょう!