Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

時間やネットワークトラフィックの単位が追加された Mackerel でネットのスピード監視

この記事は Mackerel Advent Calendar 2022 1日目の記事です。


こんにちは、id:arthur-1 です。2022年にはてなに新卒入社して、Mackerel 開発チームのアプリケーションエンジニアをやっています。また、今年の Mackerel Advent Calendar の運営を担当しております。よろしくお願いします。

今日は、そんな私が Mackerel チームに join して一番最初に実装し提供できた機能に関する話をします。

グラフ定義で選択できる単位を追加しました

mackerel.io

今年7月頭のリリースノートで紹介されていますが、グラフ定義で使える単位に、以下の3つを追加しました:

  • seconds [s]
  • milliseconds [ms]
  • bits/sec [bps]

単位を追加するのはパッと見簡単そうなのですが、実際には既存実装の仕組みの修正やリファクタなどが必要で、それなりにコードの差分がありました。このあたりの苦労話は社内で発表させていただきました。

さておき、時間の単位は分かりやすく便利ですね。各種クラウドインテグレーションで収集したメトリックで、単位が秒なのかミリ秒なのか分かりにくいものもありました。しかし、追加された単位をグラフ定義に設定することで、以下のように単位が分かりやすく表示されます。

(例)AWS Lambda の Duration メトリック

before
after

bps 単位は帯域幅などで用いられ、ネットワーク監視には欠かせないものですね。

ネットのスピード監視を Mackerel で!

ということで、今回は自宅のネットのスピードをメトリックとして Mackerel に投稿し、監視していこうと思います。

え?n番煎じでは?と思った方は、もしかすると過去の Mackerel Advent Calendar をちゃんと読んでいる方かもしれませんね。

c4se.hatenablog.com

大丈夫です。令和最新版なので単位が違います。

今回は Raspberry Pi 4 の cron でプログラムを定期実行し、以下の数量をサービスメトリックとして Mackerel に投稿することにしました:

できたもの

その結果できたグラフはこちらです:

グラフを見たときに値のラベルににきちんと単位がついているのは気持ちが良いですね。

普段は気になったときに Home Network カスタムダッシュボードを眺めています。移動平均を見ると、最近は下りがちょっと速くなっているな~とかトレンドが分かっておもしろいです。

実装

github.com

実装は Go 言語を利用しました。これを作った当時は Go はじめて、という状態だったので、あんまり洗練されたコードではないです。x86_64 の Windows でコーディングしていたものを Arm64 の Linux で動かすのでクロスコンパイル面倒だなあと思っていたのですが、そのあたり Go はとても簡単で、当時感動していたのを覚えています。

ロジックとしては、外部コマンドである Ookla のスピードテスト CLI を実行して、その結果を parse して Mackerel に投稿する、という流れになっています。

www.speedtest.net

go で書かれた speedtest-go というライブラリもあり、こちらを利用することも考えました。しかし、Raspberry Pi で動かすにはメモリの使い方が厳しく、upload の速度が安定しなかったので上記の方法を取りました。

github.com

そして、新たな単位が追加されたので、今回作ったアプリケーションでもそれに対応した書き方になっています!という紹介をしたかったのですが、残念ながら特記事項はありません。

このエントリ執筆当時の Mackerel にはサービスメトリックのグラフ定義生成を行う API が用意されていません。(ホストメトリックならある*1のに……) よって、bps や秒の単位に設定するのは Web コンソールからポチポチして行いました。API があればこのプログラムからグラフ定義を生成して単位を設定してあげられたのにな、と思います。

まとめ

Mackerel に新しい単位ができたのでぜひ使ってください!という宣伝でした。プラグインを自作している方や便利なライブラリを開発している方、bps, s, ms 単位に置き換えられるところがあればぜひご活用ください。


Mackerel の Advent Calendar まだまだ空きがあります。参加・閲覧どうぞよろしくお願いします!

qiita.com

prev: undefined

next: 2日目は id:stefafafan さんの Mackerelを振り返りやキャパシティプランニングのために毎月眺めている です

Advent Calendar を Mackerel で監視する 〜新卒の暮らし方を添えて〜

この記事ははてなエンジニア Advent Calendar 2022 1日目の記事です。


こんにちは、id:arthur-1 です。2022年に新卒入社して、Mackerel 開発チームのアプリケーションエンジニアをやっています。 arthur-1 という id に掛けて、トップバッターをいただきました。よろしくお願いします。

今日は Advent Calendar を Mackerel で監視している話をします。

Advent Calendar で何を監視したいのか

id:arthur-1 は、Mackerel Advent Calendar 2022 の運営をしています。こちらは、Mackerel ユーザーが TIPS やノウハウ、利用事例などを載せていく自由参加のカレンダーになっています。

Advent Calendar 企画の主催になると、どれだけの方が参加しているか、枠がパンパンになっていないか(あるいは、スカスカでないか)気になるものです。

Qiita の Advent Calendar であれば、以下のような指標をモニタリングしたいな、と思いました:

  • 寄稿数: カレンダーの埋まっている枠の数
  • 参加者数: 寄稿した人の数
  • 購読者数: 購読した Qiita ユーザの数

例えば、購読者数をグラフにすることで、「Twitter のある投稿により購読者数が激増した」などの事実が分かればマーケティングの参考になります。また、寄稿数が一定以下であるかの監視を設定することで、カレンダーの空き枠が残りわずかになったときにカレンダーを増やす、などのアクションを取ることができます。

Mackerel にメトリックを投稿する

Advent Calendar のページを定期的にスクレイピングして、Mackerel にサービスメトリックとして投稿する mackerel-adcal-counter を開発しました。

以下のように、グラフで Advent Calendar に関するメトリックを閲覧できます。

グラフアノテーションを使うと出来事を記録できて便利

infrastructure

AWS 上に構築しました。EventBridge Rules を用いて、定期的に Lambda を実行するようにしました。

構成図

application

Lambda のハンドラは Go 言語で作りました。Go は入社前は触ったことがなかったので、練習のために使ってみました。

github.com

スクレイピング周りで地獄のようなクエリが生まれているのが味わい深いのでぜひ読んでみてください。

工夫したポイントとしては、interface を用いて、Qiita 以外の Advent Calendar にも対応する余地を残したことです。Adventar のメトリックも収集できるようにしたかったら、具体的な実装を counter/adventar/counter.go に書く、というイメージです。

counter/counter.go

package counter

type CountResult struct {
    Entries      uint64
    Participants uint64
    Subscribers  uint64
}

type Counter interface {
    Count() (*CountResult, error)
}

counter/qiita/counter.go

package qiita

import "mackerel-adcal-counter/counter"

type Counter struct {
    url string
}

var _ counter.Counter = &Counter{}

func NewCounter(url string) *Counter {
    return &Counter{
        url: url,
    }
}

func (c *Counter) Count() (*counter.CountResult, error) {
    entriesCnt := uint64(0)
    participantsCnt := uint64(0)
    subscribersCnt := uint64(0)

    /* ここに Qiita へのスクレイピングの実装 */

    result := &counter.CountResult{
        Entries:      entriesCnt,
        Participants: participantsCnt,
        Subscribers:  subscribersCnt,
    }
    return result, nil
}

Mackerel でアラートを設定する

メトリック化できてしまえばあとは簡単です。思い思いに監視ルールを設定しましょう。

自分は、枠がいっぱいになったのに気づいてカレンダーのページを増やせるように、以下のような監視ルールを設定しました。

これで、Advent Calendar のモニタリングができました!

プロダクトに愛着を持って仕事をする

唐突ですが、せっかくなので、新卒っぽい話を少しだけします。

新卒入社して Mackerel チームに配属されるまで、 Mackerel というサービス自体に触れたことはありませんでした。チームに入ってからは、この記事のネタのようなちょっとしたことでも積極的に Mackerel を使ってみることにしています。

実際に使ってみて気づいた改善ポイントは、issue やアイデア帳という形で残したり、すぐ実装できるものであればその場で改修したりしています。

dogfooding を通じて、プロダクトに愛着を持ち、プロダクトの未来を描くことができていると実感しています。この取り組みは、仕事のモチベーション向上にも大きく寄与しています。

最後に

Advent Calendar のモニタリングを Mackerel でしたい人は、本エントリをぜひ参考にしてください。

また Mackerel の Advent Calendar も参加・閲覧どうぞよろしくお願いします!

qiita.com


prev: undefined

next: 2日目は id:pokutuna さんの Slack チャンネルのロボット帝国化を防ぐ feed-pruning-proxy です

最近聴いてる曲: Nov. 2022

prev:

blog.arthur1.dev

ÅMARA(大未来電脳) feat.HatsuneMiku+KAITO / sasakure.‌UK

www.youtube.com

主題のフレーズの使い方がとにかく良い。重ね合わせ方とか、4拍子から3拍子に変わって緊迫感が増しているところとか。

グランギニョル feat.初音ミク / Rulu

www.youtube.com

ボカコレ2022秋いろいろ聞いたけどこの曲が好き。サビの頭がオシャレすぎる。山を引き立たせるメロディーライン。

ドロシー (feat. 超学生) / 缶缶

www.youtube.com

超学生の声エロすぎるな。あとすりぃさんの短調の曲が全般好き。

Overdose / なとり

www.youtube.com

みんな聞いてるでしょ、説明不要。

あれは確か... / MC Taniguchi

www.youtube.com

違和感に気づけるか。分かるまで聞いていただきたいミステリーです。

赤秋 / HelloNewWorld

www.youtube.com

そもそも純粋な邦ロック的なものが流行らなくあるな、と。実家のような安心感があって聞いている。

品行崩壊 / FantasticYouth

www.youtube.com

ダンスの BGM に使ったら超イケイケな作品になりそう。

オトナブルー / 新しい学校のリーダーズ

www.youtube.com

SUZUKA の声が良すぎる。ネオ昭和歌謡

プレミアムワールド / 広瀬香美

www.youtube.com

本当に挑戦という感じでただただ尊敬している。人生毎日勉強なのだなあ。

(番外編) MAMAMOO/HIP feat.島田珠代 PANTY TEX REMIX / SMZM

感想

好きなものと、世間で流行っているものと、自分が生み出せるものに大きな乖離がある。

Agricola Anniversary Box 入手前レビュー

アグリコラデラックス版が10周年の節目に発売されるという話が出て久しい今日この頃、15周年になってついに「Agricola Anniversary Box」が発売されました。

lookout-spiele.de

アグリコラコレクターとして、また翻訳情報提供者として絶対に買わなくてはと思い、購入しました。ドイツから空輸で届くので、昨今の情勢を鑑みると到着に時間が掛かるかもしれません。

取り急ぎ、Agricola Anniversary Box について現在わかっている情報をもとに入手前レビューをします。

内容物

アグリコラ:リバイズドエディションの内容物を基本に、いくつかの付属品が増えている、というイメージです。

コンポーネント

リバイズドエディション付属品との大きな差異をまとめました:

  • スタートプレイヤーマーカーが鶏の形になった
  • プレイヤーコマの色が違う
  • 農場ボードのデザインが特別仕様
  • 物乞いは品物トークンの裏ではなくなり、専用トークンになった
  • 大きい進歩がカードではなくなり、ゲームボードと同じ素材の分厚いものになった
  • スペシャトークンが付属する
    • Xデッキの「モジャモジャの友人」や🌲デッキの「フェアリー」などが専用トークンとして用意される。地味に嬉しい
  • 四季拡張のボードが付属する

このうち、大きい進歩タイル化の影響はかなり大きいです。id:arthur-1 の周囲には、木製のカードスタンドに大きい進歩カードを立てているプレイヤーが多いのですが、分厚いためそういう遊び方はできなくなると予想されます。さらに、和訳のためにスリーブとカードの間に日本語の紙を挟んでいたのですが、これも分厚いためにできなくなってしまいますね。本当に誰得なんだ。

その一方で四季拡張のボードがついてくるのはとても嬉しいです。遠い昔にプロモーションのためのポストカードとして配布されたものが、こうして製品に取り入れられるのは感慨深いですね。

カード

残念ながら、思ったより増えません。新版として初出のものは赤字の部分だけです:

  • アグリコラ: リバイズドエディション 収録分(96枚)
  • アルティフェクスデッキ 収録分(60枚)
  • ブーブルクスデッキ 収録分(60枚)
  • Xデッキ(24枚)
  • 🌲デッキ(26枚)
  • Lデッキ(20枚)

Xデッキや🌲デッキは旧版のものとほぼ変わらないのではないかと思います。どちらもイベントカード的な立ち位置で、効果はジョーク地味てぶっ飛んだものが多いです。旧版のものの内容が知りたい方は以下のリンクを参照ください:

Lデッキに関しては、[L060] Covert Advertiser と [L070] Barterer 以外は、新版としては初収録のようです*1。また、公式サイトの画像では「LEデッキ」というイベントカードのようなものが確認されるのですが、ルールブックおよび付録には記載がありませんでした。こちらはLデッキ20枚の一部のようです。

サプライ

スリーブなしだと900枚のカードが入るストレージボックスや、コマを入れておくためのトレイが付属します。個人的には興味がないのでさらっと流します。そういえばアグリコラ公式スリーブが発売される話はどこへ行ったんでしょうか。

購入希望者への助言

このエントリが書かれた2022年11月現在、英語版(そしてもちろん日本語版)は発売されていません。Lookout の公式ショップで English にしたときに出てくる「Agricola Collectors Box」は、カードボックスやインレイといったサプライしか含まれないバージョンです。購入ミスにお気をつけください。

また、製品単価が101ユーロ(執筆当時のレートでおよそ14,600円)で、ここにさらに国際送料が加算されるため、1つの購入でも関税課税対象になってしまいそうです。

Lookout の公式ショップで購入したい方は以下のリンクからどうぞ:

lookout-shop.de

余談ですが、Lookout Online Shop もついに免税処理に対応しましたね。昔は日本から頼んでもドイツの付加価値税を支払わなければならないシステムだったのですが、今回はVAT分がしっかり引かれていました。

感想

正直、高い送料と関税をかけてまで買わなくても良い、という感触です。いわゆる全拡張プレイヤーも、ゲームバランスを損ねるXデッキや🌲デッキを入れて遊ぶ機会はあまりありません。カードゲームと揶揄されるアグリコラなのに、この拡張のために日本円で2万円ほど支払って追加されるカードがあまりにも少ないです。せめて、再販されず高騰している5-6人拡張だけでも入れてくれれば違ったのに、と思います。

四季拡張再録や、拡張用のスペシャトークンなど、魅力ある要素もいくつかありますので、欲しい方は上の「購入希望者への助言」を読んでゲットしてみてください。

日本語訳情報は当ブログおよび Agricola DB などで公開していけたらと思っています。ぜひご確認ください。

db.buratsuki.page

【誤訳ほぼなし!】アグリコラ:ドゥルチナリアデッキ の誤訳指摘

取り急ぎ第一報です。原文との比較をせずに記憶との照合をしただけなので他にもミスがあるかもしれないです。

エラッタが凄まじい量の泥沼日本語版からあまり日を置いていなかった発売なので心配でしたが、今回は致命的なミスがほぼなくて良いですね。

更新履歴

  • 2022/10/25 1:30 [D048] 都市の正面 が誤訳であると明記

全般

  • 【用語統一】「植えられた畑」という表現が散見されるが、他の日本語訳と雰囲気を合わせると「栽培中の畑」とした方が良いだろう

カード

[D035] 飼料部屋

  • 【補足】家畜それぞれ7/5/4/3番目ごとに、と書かれていると、羊や猪など家畜の種類ごと数えるように感じるが、全部足してしまってOK

[D048] 都市の正面

  • 【誤訳】手札の進歩と手札の職業の枚数を比較する。日本語版は手札の進歩とプレイした職業との比較になってしまっている*1

[D083] 残飯

  • 【用語統一】ブーブルクスデッキで、アクションスペース「柵」の名前が「柵設置」に変更されたはずだが、反映されていない

[D110] 魚の養殖業者

  • 【誤植】「粘土抗」→「粘土坑」

補足だが、このカードは英語版が間違っていて、「森林」のところが「小さな森」になっている*2。日本語版はドイツ語版と同じテキストになっている。

【令和最新版】俺的ゲーム配信環境 2022

コロナ禍の過ごし方として、毎晩、大学の頃のサークルの同級生と Discord に集まって通話をしています。思い思いに好きなゲームをしたり、仲間を募って同じゲームを遊んだりする時間です。バーチャル部室と言ったところでしょうか。

このとき、Discord の画面共有機能を使って各自のゲーム画面を配信しています。今回は、自分がゲームを配信している環境を紹介します。

要件

  • Nintendo Switch の ゲーム画面を、Discord の画面共有にてゲーム音声付きで配信できる
  • 自分がプレイするためのゲーム画面と音声は、余計な遅延や品質低下なく視聴できる
  • PC の音とゲームの音を同じヘッドホンで視聴できる

結論

ハードウェアの構成としては以下のようになりました。

また、使用機材は以下の通りです:

OBS Studio という配信用ソフトウェアで、ソースに映像キャプチャデバイスとして上記キャプチャーボードを指定し、「ウィンドウプロジェクター(プレビュー)」のウィンドウを Discord の画面共有の対象にしています。

右のウィンドウを Discord で共有しています

解説と補足

基本構成

説明のために、まずはシンプルな構成からはじめましょう。ゲームの映像と音声をOBS上で視聴するなら、以下のような構成で実現できるでしょう。

この構成に関する説明はこちらではしないので、他の記事を参照してください。

遅延なくゲームの映像を視聴するために

OBS の画面を見ながらゲームをプレイしても良いのですが、やはり遅延とフレームレートの低下が気になります。そこで、キャプチャーボードのパススルーアウトをモニタに繋ぐことにしました。

これによって映像は問題なくなったのですが、問題は音声です。OBS の音声モニター経由でゲーム音で聞くと、目に入る映像と耳に入る音声が、キャプチャーボードにより発生する遅延分だけずれてしまいます。

しかし、パススルーの音声を聞くにはパススルー用モニタの音声出力を利用するほかありません。PCからの音声はヘッドセットで聴き、ゲーム音はモニタから出る音を直接聴くということになってしまい、都合が悪いです。

遅延なくゲームの音声を視聴するために

PCの音声とパススルーのゲーム音声をなんとか同じヘッドセットで聴く方法を考えました。

もちろん、PCの音声出力とゲームの音声出力をアナログミキサーで mix すれば良いのですが、新たに機器を買い足すのはスペース的に厳しいです。せっかくミキサータイプのオーディオインターフェイスを使っているので、パススルーモニタの音声出力をオーディオインターフェイスアサインすることにしました。

このときに注意するのが STREAM OUT の設定です。一般的には「INPUT MIX」に設定していると思うのですが、これを「DRY CH1-2G」モードに変更します。 こうしないと、ゲーム音がミックスされてマイク入力として載ってしまいます。このモードでは、ch.1 と ch.2G の入力は PC に送られますが、 ch.2-3 の入力は PC に送られません。AG03 のモニターアウトに繋いでいるヘッドセットからは依然として ch.2-3 に入力した音声、すなわちパススルー経由のゲーム音を聴くことができます。

副作用として、以下の問題が発生します:

  • マイク入力音声の信号が L だけになる
    • 「DRY CH1-2G」モードでは、L に、ch.1、R に ch.2G がアサインされるため *2
    • Discord などの通話アプリではステレオ入力がモノラルにダウンミックスされるので、本要件では問題にならないはず
    • NVIDIA Broadcast(AIで環境音を消してくれるソフトウェア)を挟むと L だけの信号が LR の信号になるので活用すると良い
  • ch.1 の音量調整のフェーダーや MUTE スイッチが、PC に送られる信号には効かなくなる
    • AG03 の仕様なのでどうしようもない、妥協して受け入れる

業務で利用するようなミキサーであれば AUX チャンネルを使えば一発なのですが、民生用機器で頑張るのは思いのほか大変ですね。

Discord の画面共有でゲーム音を載せる

※ この話は Discord の画面共有の話なので、YouTube などで 配信したい方は SKIP してください

ここまで来たら要件の達成までもう少しです。OBS のウィンドウプロジェクターを Discord の画面共有します。

このときに問題になるのがやはり音声です。OBS の音声モニターでキャプチャーボードの入力音声を聴いていると、パススルー経由の音声とダブルで聴くことになってしまいます。そのため、愚直にはオーディオの詳細設定から「モニターオフ」にすることになるでしょう。こうすると、ゲーム音はパススルー経由のものだけを聴くことができます。

しかし、これでは Discord の画面共有にゲーム音が載りません。なぜなら、Discord の画面共有は、そのアプリケーションが鳴らしている音を配信するからです。モニターオフにすると OBS が音を出していないことになるので、結果として配信が無音になってしまいます。

これを解決する方法は、OBS のモニター出力を別のデバイスにすることです。設定(オーディオの詳細設定ではなく、グローバルな方)の「音声」を開き、モニタリングデバイスを使用していないデバイスに変更します。その上で、先程のモニター出力をありにします。

このようにすることで、Discord の画面共有にキャプチャーボード由来の音声を載せることと、自分がキャプチャーボード由来の音声を聴かないことを両立することができます。

まとめ

いかがでしたか?

音響の仕事の経験があるのでこの程度はなんとかなるのですが、一般には難しいだろうなと思っています。(このエントリもかなり読みづらいと思います。すみません。)

世の配信者は、満足する配信環境のために裏で頑張って知識を習得しているのでしょうね。それとも、こういった環境の準備をコンサルしてくれる企業があるのでしょうか。

配信環境の準備に関して、知り合いであれば相談を受け付けますので、気軽にご相談ください。

*1:旧式でも問題ないはずです

*2:FAQ: https://faq.yamaha.com/jp/s/article/J0007132