Mackerel開発におけるScalaとGo、そしてPerl
TIME rest time current/total
TopicsPlaceHolder

Mackerel開発におけるScalaとGo、そしてPerl

YAPC::Asia 2015

Aug 22th, 2015

Profile

songmu

趣味はCPANizeです

35歳の誕生日に子供が生まれました

ベストスピーカー賞お願いします! :pray:

今日お話すること

Mackerel Logo

 

Mackerel

可視化

アラート

外形監視 [new!]

開発体制

アーキテクチャ

技術スタック

Mackerel開発における言語多様性

MackerelとScala

Why Scala?

Scalaを書いてみて-1

Scalaを書いてみて-2

ScalaとPerlの共通点

アンダースコア

パラメーターのプレースホルダー

numbers.filter(x => x > 0)
numbers.filter(_ > 0)

アンダースコア

numbers.foreach(x => println(x))
numbers.foreach(println _)
numbers.foreach(println)   // 関数が期待されている場所では `_` も省略可能

関数の代入では _ を省略不可能

def add(a:Int, b:Int) = a + b

val a  = add _
val b  = add:(Int, Int) => Int
val c  = add(_:Int, _:Int)
val d  = a       // コレはOK
val ng = add     // コレはエラー
val ng2 = add(_) // コレもエラー

Scalaの使いドコロ

ちょっと宣伝

MackerelとGo

事例1: mackerel-agent

Why Go?

事例2: mkr

事例3: URL外形監視ワーカー

外形監視ワーカーのアーキテクチャ

利用ライブラリ

Graceful Restart

Goの常駐プロセスの監視

事例4: blogsync

OSS副産物

Perlのモジュールの思想を受け継いだものが結構できた

Golangを書いてみて

クロスコンパイル大変問題

GolangとPerl

値に対してtypeを作れる

データありきでそれに対して振る舞いを定義する。 > bless っぽさ

type Centigrade float64
type Fahrenheit float64
func (ce Centigrade) ToFahrenheit() Fahrenheit {
    ...
}

継承よりコンポジション

Goの使いドコロ

MackerelにおけるJavaScript

こんなかんじの構成ですって以外にはあまり特筆すべきことはない。

おまけ: MackerelにおけるHaskell

シンプルでかつ最高のJavaScriptプロファイラ sjsp を作りました! ― Webアプリケーションが複雑化する中でプロファイラに求められるものとは何か

MackerelにおけるPerl

事例: mackerel-agentのリリースの自動化

  1. p-rを自動生成
  2. そのp-rをレビュー後マージボタンを押したらTravisがtagを自動で打つ
  3. tagを打たれたコミットに対してTravisがビルド成果をrelease

自動化周り

Perlでツール作成(標準モジュール縛り)

自動化機構は負債になりやすい

ツールをテストする

ちゃんとテストを書けるのは安心

if (!$ENV{HARNESS_ACTIVE}) {
    main();
} else {
    # When called via `prove`, tests will run.
    run_tests();
}

ツールの責務を分ける

tool/releng

tool/autotag

Travisにtagをgit pushさせる

解決方法

Deploy Keys

travis encrypt-file

まとめると

パッケージの自動ビルド

OSSにする上で気をつけていること

事例2: Mackerelに関するCPANモジュール

Perlの使いドコロ

プロジェクトの渋い脇役としても活きる

Perlの使いドコロ - 2

MackerelにおけるRuby

事例1: fluent-plugin-mackerel

その他Ruby事例

Rubyの使いドコロ

まとめ

We are Hiring

hatena