時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

2014年のKPT

昨年のKPT: 2013年のKPT - 時計を壊せ

技術と関係ないこと: 技術以外で2014年を振り返ってみる - あふれだす

KEEP

続けたい事、良かった事。

新しい分野に挑戦した

新しい言語に挑戦した

  • C++11
  • Go
  • Coffee Script
  • Ruby
  • XS(PerlのCバインディング用のマクロ言語/Perl C API)
  • Swift
  • Objective-C

といいつつ、まともにコード書いたのはCoffee ScriptとXSだけ…。(PROBLEM)

ISUCON4出た

  • 予選敗退

エンジニアのコミュニティにより深く関われた

  • YAPC::Asia 2014参加/ボランティアスタッフ/40min話した
  • YAPC::Asia Reject Con 2014参加/LTした
  • Ruby Kaigi 2014参加
  • PyCon JP 2014参加/パネルディスカッション出た
  • MySQL Casual Talks参加/LTした
  • Yokohama.pm参加/20min話した
  • Gotanda.pm発足/運営/20min話した
  • Hachioji.pm参加/たぶん
  • Perl入学式おてつだい
  • ドワンゴC++勉強会参加/LTした

ワークライフバランスよかった

  • 1年通してほぼ定時過ぎたら帰るか遊んでるかしてた
  • 昨年のPROBLEM(デスマった)を引きずらなかった!

PROBLEM

問題であること、よくないこと。

モチベーションの枯渇

英語の勉強が捗らなかったり、タイムゾーンを適切に処理するための良いインターフェースの研究が捗らなかったり、積ん読の消化が捗らなかったり。モチベーションを上げるの難しい…。

ISUCON4予選敗退

はい…。

IT芸人になりつつある

自分が作った代表的なプロダクト的なものが無いまま名前だけそこそこ知られてるって状況になりつつあってエンジニアとしての危機を感じている。(1年ぶり2度目) かといって、焦って変なもの生み出してしまうのも良くない。

TRY

挑戦したいこと。試したいこと。

遠方の地域PM/参加した事の無い地域PMに参加する

  • Hokkaido.pm
  • Niigata.pm
  • Fukuoka.pm
  • Kansai.pm
  • Yomitan.pm

英語を勉強する

  • YAPCで英語でトークしたい
    • 外国人と直接コミュニケーションしたい
  • 自分のモチベーション上げる施策考える

YAPC::Asia 2015を最高のYAPC::Asiaにする

最高のYAPC::Asiaにするぞ!!!!! というわけでなにかお手伝いする。

YAPC::Asia Tokyo 2015, Aug 20, 21, 22

WEB+DB Press Vol.84のPerl Hackers Hubに寄稿しました

WEB+DB PRESS Vol.84

WEB+DB PRESS Vol.84

  • 作者: 藤吾郎,桑野章弘,福永亘,谷井靖史,野村晋之介,蛭川皓平,岡田友輔,藤本真樹,伊藤直也,宮崎靖彦,佐藤健太,高橋俊幸,佐藤太一,海野弘成,佐藤歩,泉水翔吾,渡邊恵太,舘野祐一,中島聡,橋本翔,はまちや2,竹原,伊賀敏樹,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/12/23
  • メディア: 大型本
  • この商品を含むブログを見る

縁あって、WEB+DB Press Vol.84のPerl Hackers Hubのコーナーで記事を書かせていただくことになり、 データベースプログラミングの入門的なことについて書かせていただきました。商業誌デビューとなります。 昨日発売となっておりますのでお近くの書店などで今すぐにでも購入できるようになっております。

ざっくり以下のようなことがわかるような内容になっているはずです。

  • データベースの必要性
  • DBIの説明と使い方
  • ORMの説明とTengの使い方

データベースの必要性とトランザクションの説明も簡単に書いておりますので、PerlとSQLがちょっと分かれば大方の内容は理解頂けると思います。 なお、SQLをよく知らない方は別途SQLを勉強して頂ければ幸いです。 DBIの基本的な使い方をかなりしっかり目に解説したつもりですので、いままさにPerlを勉強しているという人には是非読んで頂きたい内容となっております。 Tengについては基本的な使い方からRowクラス拡張の勘所まで書いております。 SQLインジェクションにも少し触れているので、この内容に沿ってプログラムを書いて頂ければほぼほぼ実践的な内容は抑えられるかと。

ページ数の見積もりが甘く、本来書こうとしていた内容から相当な量を削ることになってしまいましたが、なんとか重要なトピックに絞りまとまっているかと思います。DBIのbind系メソッドの紹介とか、TengのPluginの紹介とか、DBICやDBIx::Sunnyの紹介もしたかったけど泣く泣く削りました。

また、サンプルコードとして、MySQLを使ったチャット機能を提供するWebアプリをDBIとTengで実装したものを用意しておりますので、そちらも参考になれば幸いです。

昨日発売となっておりますのでお近くの書店などで今すぐにでも購入できるようになっております。

WEB+DB PRESS Vol.84

WEB+DB PRESS Vol.84

  • 作者: 藤吾郎,桑野章弘,福永亘,谷井靖史,野村晋之介,蛭川皓平,岡田友輔,藤本真樹,伊藤直也,宮崎靖彦,佐藤健太,高橋俊幸,佐藤太一,海野弘成,佐藤歩,泉水翔吾,渡邊恵太,舘野祐一,中島聡,橋本翔,はまちや2,竹原,伊賀敏樹,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/12/23
  • メディア: 大型本
  • この商品を含むブログを見る
他のコーナーも面白いものばかりですので、是非、お買い求め下さい!

あわせて読みたい:

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

  • 作者: 松信嘉範
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/03/09
  • メディア: 単行本(ソフトカバー)
  • 購入: 20人 クリック: 486回
  • この商品を含むブログを見る

謝辞

初めての商業誌での執筆ということもあり、慣れないことも多く、関係者の方々にはとても助けて頂きました。 名前を出して良いものか迷うので名前は伏せさせて頂きますが、この場を借りて御礼を申し上げます。ありがとうございました。

Gotanda.go && 五反田もくもく会に参加しました && Gotanda.pm #2 は明日です

Gotanda.go

Gotanda.go #1 : ATND

Gotanda.goはみんなでA Tour of Goをやっていました。
Goは数年前にちらっと触ったきりだったので、だいぶ忘れていましたが、
スライスの仕組みをちゃんと理解できたのは大きな収穫でした。
わいわい話をしながらやっていたので、わからないことを気軽にきけてとても良い会でした。 GotandaのGoはGolangのGoだと思います!
主催者の @polidog さん、会場提供のヴォラーレ株式会社さん、ありがとうございました!

五反田もくもく会

五反田もくもく会 #2 - connpass

諸事情でちょっと遅刻してしまいましたが、いい感じにもくもくすることができて良かったです。
実は主催側だったのですが、片付けしか手伝えず、ひたすらもくもくしていました。
当日はカップラーメンが振る舞われ、カップラーメンの空腹をそそる匂いが充満し、
また1人、また1人とカップラーメンの誘惑に負けてカップラーメンを食べはじめるという、
カオスな感じの場に仕上がったのが面白かったです。*1
ほぼ無限ビールとほぼ無限お菓子も好評だったようで良かったでした。
またやると思います。主催の id:kfly8 さん。お疲れ様でした!次回は準備から手伝います!><

Gotanda.pm #2

Gotanda.pm Perl Technology Conference #2 - connpass

明日やるんでよかったら!

*1:ただ、

YAPC::Asia Tokyo 2014で個人スポンサーしつつボランティアスタッフしつつperl5 meta programmingについて喋りつつreject conでWorkmanについてLTしました

タイトルが長い。

YAPC::Asiaとは

ここを読むと良い。

概要 / ABOUT - YAPC::Asia Tokyo 2014

Perlのトーク殆ど無いじゃんという意見についての個人的な見解

いまどき色々な言語が開発に利用されるのは当たり前だし、特定の言語だけに絞るメリットはあまり無いのではって思う。
Perlを使ってい(る|た)人が興味が深い他言語/他分野の話をしてもPerlの人には面白いし役立つしべつに良いじゃないか。楽しみ方はいくらでもある。

YAPC::Asiaと私、あるいは何故ぼくは個人スポンサーになったか

YAPC::Asiaは2011年から毎年参加しているが、質が高く素晴らしいイベントであり、良いコミュニティになっていると思う。
僕は毎年ここで開発への情熱を貰っている。色々な技術に触れてわくわくする。エンジニアとしての将来のキャリアに希望が持てる。色々な人に来てもらいたい。
そういう素晴らしいイベントも、継続するためにはやはりお金が必要だと思う。個人で出来る事は少ないけれど、少しでも運営の助けになればと思い、小額ではあるが個人スポンサーをさせて頂いた。

ボランティアスタッフをやった

2012年から個人スポンサーはやらせて頂いていたが、今年からJPAYAPC運営委員会がYAPCの主催を行うということになり、 運営リーダーも牧さんから和田さんに変わるなど、新体制での運営となった。
いろいろ大変なこともあるかもしれないので少しでも力になれればと思い、コアスタッフとしてお手伝いすることも考えたが、 ボランティアスタッフすら経験していないのに勝手が分かるはずが無いと思い、まずはボランティアスタッフとしてお手伝いしていこうと思ったので参加を決めた。

作業としてはコアスタッフの人々が殆どの事を決めてくれていたので、殆ど手を動かすだけで済んだ。
具体的には、特典のTシャツを畳んだり、マイクを質問者のもとに届けたり、懇親会の参加者への案内をしたり、イベントホール外で飲食が無いよう*1grepしてblockしにかかる仕事とかをしていた。

今年はひたすらスタッフをやってみようと思っていたので、トークは殆ど聞かなかった。*2
ぼくは短大の頃に文化祭の主催をするなどしていたので、懐かしい気分になれた。一部でもYAPC::Asiaをつくることに貢献できることに喜びがあった。
終われば懇親会やHUBでいろんなひとと飲んで騒いでできたし、keynote sessionのときは仕事は全部終わっていたので生で見た。楽しかった。

トークについて

Perl5 meta programming - YAPC::Asia Tokyo 2014ということで、Perl5でメタプログラミングをするための基礎的な要素について初学者向けに実際のコードを交えつつ解説した。(スライドはリンク先に掲載している) UNIVERSALとAUTOLOADは隣り合わせにするつもりだったがスライドを整理しているうちにズレてしまっていたなど、いろいろ不手際はあったが、少しでもpure perlメタプログラミングをするための方法について伝われば幸いである。 本当はもう少し実践的な話もしたかったが、これは別の機会でも良いだろう。 なお、このトークのスケジュールはPerl入学式Githubの裏側の話Perlあるある、そして あやかNowという人気トークの裏にあったので、当日はそんなに人は来ないだろうと目論んでおり、非常に気を抜いてリラックスして発表していたが、最終的には立ち見で聴いて頂く方も出てくるなど思いのほか多くの人に来て頂き本当に有難い限りだった。ありがとうございました。 毎年YAPCに来るたびに英語力の無さを実感していたので、英語力を鍛える意味を込めつつ英語でスライドを書いたが、もう一つ海外ゲストの人との話のネタにしたいという思いもあった。しかし、案の定というかGithubの裏側の話に吸い込まれたようでそれは叶わなかった。来年までにはもうちょっと喋れるくらいの英語力とコミュ力を身に付けたい。

LTについて

reject conでLTをした。

karupanerura/Workman · GitHub

これのデモをひたすらやった感じ。酔っ払ってたのでだいぶテキトーだった。 デモをやる裏で動画をひたすら流していて最高にカオスだった。 自分でやっておいて自分で吹き出してしまってしょうもない感じだった。

WORKMAN_CM - YouTube

YAPC Ramen Challenge

きました。

やりました。

f:id:karupanerura:20140904202906j:plain

dump sql type name. · b57ce92 · karupanerura/p5-Teng · GitHub

総括

めっちゃ楽しかったし継続していきたいので来年も(ボランティア)?スタッフやりつつ参加したいです! 関係者の皆様おつかれさまでした!ありがとうございました!来年もやりましょう!(手伝います!

*1:諸事情でイベントホール以外では飲食の許可が得られていなかった

*2:良い同僚が代わりに聞いて、社内でフィードバック会を開いてくれる事になっていたので、それを聞きつつスライドやYoutubeで補完すればいいやとなった。

Job-Queue Workerの実装を管理するdaemon

Message Queueとか

だいたいみんな、Message QueueとしてGearmanとかQ4MとかResqueとかRabbitMQとかZeroMQとかまあたくさんあるけど、なにかを使っていると思う。 Perlの人だとQudoとかTheSchwartzとかをつかっている人も多いと思う。
でも、preforkなworkerを実装するとなるとSignal処理とかをちゃんとやるのが意外と難しい。 下の2つのスライドを読むと難しいんだなぁという事がなんとなくわかるとおもう。

graceful shutdownとかgraceful restartとかは欲しいし、max_reqs_per_child的なこともしたいし、時間が掛かり過ぎているjobはリトライして新しいworkerで処理させたいとかそういう要求がある。
そこで、そのへんが共通化されたプロダクトがあると良いのではないかと考えた。

Dainamoについて

なお、perlにおいては似ている既成のプロジェクトとしてDainamoというものがある。*1

これは以下のような事ができて、以下のようなメリットがある。

  • Message Queueの種類をあまり考慮せずにコードが書ける
  • サーバー毎にworker数を設定し、Profileという単位でweightをかけてworker数をバランスする
    • サーバー毎のプロセス数をスペックに合わせて管理しやすい
    • Profileを1つのプロジェクトで複数つくって即処理したいものはweightを多めにするといったこともできる
  • 設定ファイルからProfile::Group(Profileをまとめたもの)を複数読み込み、全てのworkerを起動できる
    • 複数プロジェクトが同居するケースとかのセットアップが楽

これは業務で運用しているが、とても便利な反面、困ったこともいくつかでてきた。

  • dainamo毎にworker数を設定し、Profileという単位でweightをかけてworker数をバランスする
    • 実際にProfileに割り当てられるプロセス数が分かりにくい。
    • 他のProfileの影響を受けてProfileのworker数が変化するので複数Projectの同居などを慎重に検討しなければならない。
  • graceful_shutdown_timeout(default:10秒)を超えるとSIGKILLをworkerプロセスに送る
    • 容赦が無さすぎて失敗時に走らせたい処理とかが出来ない
  • Proc::Daemonでdaemonizeする機能がある
  • 3段階のforkとなっていてデバッグし辛い
    • master process -> manager process (profile毎に1つ) -> worker process (実際のjobを捌く)
    • (依存モジュールが古いサーバーとかだと)manager processだけゾンビってるとかが稀にある

Workmanについて

というわけで、もっとシンプルなものが欲しいと思っていた。そこで最近、Workman というプロジェクトを開始した。 Job-Queue Worker frameworkと銘打っている。だいたい以下のような事が出来る事を目標にしている。

あらゆるMessage Queueを同一のインターフェースで扱う事が出来る

  • 時代の変化で古いMessage Queueから新しいMessage Queueに移行するときとかにあまりめんどくさい事考えたくない。
  • 代わりに、一部のMessage Queueに特有の機能は使いにくくなるがそれは許容する。
  • Queueバインディングの仕様を満たすためのテストを提供してQueueバインディングを開発しやすくする。

単一のProfileに対して単一のServerを立てる

  • (dainamoと比較して)manager process単位でサーバーを立てる。
  • 複数建てたければ建てればいい

上に挙げた2つのスライドのノウハウを取り入れる

  • シグナルハンドリングの不具合とかを心配したくない。

graceful shutdown / graceful shutdown をサポートする

  • 1つだけ時間がかかっているjobがあったとしても他のworkerはすぐrestartして欲しい
  • かといっていつまでも死なないのも困るのでgraceful_shutdown_timeoutを超えたら強制終了させる

graceful_shutdown_timeoutを過ぎて強制終了させるときにSIGABRTを送る

  • worker内ではWorkman::Server::Exception::ForceKilledがthrowされるのでそれを好きにゴニョる
  • on_abortというhookがあるので再enqueueなどの処理を書いてあげる

max_reqs_per_childしてくれる

  • あたりまえのようにサポートしてほしい

daemonizeをサポートしない

テストを充実させる

  • 特にシグナル処理の安全性やWorkerのライフサイクルとかは手動で動作確認とか結構厳しいし自動化するべきである

CodeRefを簡単にworkerにしたい

  • ちょっとしたプロジェクトとかだとあると便利なはず。Amon2::Lite的な発想。syntax sugar用意してもいいかも。
  • 当然classとしてもタスクを定義出来るようにする。

実装状況

実は、だいたいコア部分はできている。 たまにテストがコケる事はあるが、sleepとか絡むので仕方ないのかなともおもう。 以下のような感じで書くともうだいたい動く。

サーバー側

use strict;
use warnings;
use utf8;

use Data::Dumper;
use Workman::Server;
use Workman::Server::Profile;
use Workman::Queue::Gearman;
use Workman::Task;

my $queue   = Workman::Queue::Gearman->new(job_servers => ['127.0.0.1:7003']);
my $profile = Workman::Server::Profile->new(max_workers => 10, queue => $queue);
$profile->set_task_loader(sub {
    my $set = shift;

    warn "[$$] register tasks...";
    $set->add(
        Workman::Task->new(Echo => sub {
            my $args = shift;
            warn Dumper $args;
            return $args;
        })
    );
    $set->add(
        Workman::Task->new(Abort => sub {
            my $args = shift;
            die Dumper $args;
            return;
        })
    );
    $set->add(
        Workman::Task->new(Busy => sub {
            my $args = shift;
            sleep 1 for 1..1000;
            return;
        })
    );
});

Workman::Server->new(profile => $profile)->run();

set_task_loaderはWorkerプロセスで実行されるのがミソ。
この中でモジュールのロードを行えばgraceful restartしたときでもTaskが再読み込みできるし、 メモリを節約したいなら先に読んでおいてCoWを効かせてメモリを節約することもできる。 重いモジュールは先に読ませておくとかそういう小手先の諸々ができる。

クライアント側

use strict;
use warnings;
use utf8;

use Workman::Client;
use Workman::Queue::Gearman;
use Try::Tiny;
use Data::Dumper;

my $queue   = Workman::Queue::Gearman->new(job_servers => ['127.0.0.1:7003']);
my $client = Workman::Client->new(queue => $queue);

$client->enqueue_background(Echo => { msg => 'hello' }) for 1..10000;

こんなかんじで、共通化のインターフェースでenqueueできる。 ドキュメンテーションとか、configファイルから読む機能とか、簡単にworker serverを立ち上げるためのコマンドとかはこれからという段階だが、なんとなく雰囲気は伝わるかなと思う。 どうだろうか?

*1:gearman限定であればMasayuki Matsuki / Gearman-Starter - search.cpan.orgがある

yasnippet 8.0をupgradeしたらdefaliasしたmajor-modeを考慮しなくなったっぽい

EmacsWiki: C Perl Modeを参考に以下のようなコードを埋め込んでいた。

(defalias 'perl-mode 'cperl-mode)

perl-modeでいろいろなsnippetを作ってcperl-modeで使っていたけど、
どうもyasnippetをupgradeしたら動かなくなってしまった模様。(tagも8.0までしか付いてなくてどこで動かなくなったのかはcommit追わないとわからなくてめんどくさくなった)
本来はcperl-modeでsnippetを作るべきだし、曖昧さを解消しているので歓迎するべき変更だとは思うけど、原因なかなか分からなくてハマった。