Masteries

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

「Real World HTTP」読んだ

id:Songmu さんもイチオシの, 「Real World HTTP」を読みました. だいぶ前に買っていたのだけれど, 積んでいて, 最近ちまちま読み進めていたという感じです.

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

ちょうど同僚の id:hakobe932 さんも最近読まれていたようでした:

hakobe932.hatenablog.com

感想

もはやHTTPは「あって当然」の技術になっていて, 日常の中でまさに「息をするように」使っている技術と言えると思います. ただ, ライブラリやブラウザ等が「よしなに」やってくれる部分が非常に多いので, 基本的な知識がなくてもやっていける部分は非常に大きいですし, 自分自身振り返ってみて, あまりしっかりと把握出来ていない部分が多いなー, と思っていました.

「Real World HTTP」は, HTTPとその周辺技術について, Go言語を題材にしながら, 歴史に沿いつつ, 丁寧に紹介されていて, そういう悩みを持っている人の入り口にはとても良い本だと思いました. 最近だとHTTP2が熱くなってきているけれど, そういった新しいテーマもちゃんと盛り込まれていて, 新しい技術によるワクワク感とか, HTTPという技術が進歩していく中で生まれた課題を, どのように解決していったのかとか, そういうのが垣間見えて面白かったです.

HTTPとその周辺技術の歴史や概要を, サッと一通り抑えることができるので, 「Webサービスを作れるようになったけれど, その裏側でどういうことが起きているのか気になってきた」という学生さんはとても興味深く読み進めることが出来ると思いますし, 職業エンジニアも1冊買って置いておけば, HTTPについて疑問が浮かんだ時にまずはさっくり調べてみる, という感じで辞書的な用途にもなりそうです.

Primus 機能追加のご紹介

この記事は, 「OSS紹介 Advent Calendar 2017」の9日目の記事です.

qiita.com

空いていたので, 「よし書くか!」と思って勢い良く登録したものの, 良いネタが思い浮かばなかったので, 今回は拙作OSSの機能追加情報を紹介をしたいと思います.

Primus

ちょうど1年くらい前, Primus*1というツールを公開しました.

papix.hatenablog.com

github.com

Primusは,

  • Primus Serverが受けたリクエストを...
  • WebSocketを通してPrimus Clientに送り...
  • Primsu Clientが, 開発者の手元で動くサービスへ同じリクエストを送る

...というツールです*2. Primusを使えば, 例えばLINEやSlackのBotを開発するとき, これらのサービスから送られてくるWebhookをPrimus Serverで受け, そこからPrimus Clientを経由して開発者の手元のマシンに転送することができます.

久々にコードを眺めていた所, Primus Clientがリクエストを送る先が決め打ちになっていて, 不便すぎるのでは? と思ったので, Primus Clientからリクエストを転送する先を設定ファイルで指定できるようにしました. ついでにREADME.mdも整備したり(id:ichigotake さんありがとうございます).

[server]
host = "localhost"
port = 14300
ssl = false

[[Route]]
channel = "sample1"

host = "localhost"
port = 8080
path = "/sample/endpoint"

こういう感じに書くと, Primus Serverの http://localhost:14300/receive/sample1 にリクエストを送った時, そのリクエストと同じリクエストが, http://localhost:8080/sample/endpointに送られます. 便利ですね.

今後の展望

  • 今は, 「Webhookを受け取って転送する」ことしか出来なくて, 「Webhookを受け取って転送し, その結果であるレスポンスを返す」ことができないので, 出来るようにしたい
  • Goの勉強をしながら, まずは動かそうという気持ちで書いているのでGoの流儀に則った良いコードにしていきたい
    • 以前, id:codehex さんに手直ししてもらったけれど, 今回の機能追加でいろいろガッとやってしまっている...

といった展望があります. 現状, 「ぜんぜんわからない, 俺は雰囲気でGolangをやっている」という感じなので, ちょっとGoを勉強して慣れてきたという方は実践がてら遠慮なくPull Requestを送りつけて頂けると, 完全に他力本願で申し訳ないのですが, 喜びます(自分もGoの理解深めるところ頑張っていきます...).

感想

機能追加というか, 雑に作りすぎた部分をようやく真っ当にしただけという気もする...?

*1:名前は言うまでもなく, Triad Primusから取っています. Primus Serverのデフォルトのポート14300も, Trancing PulseのBPM(143)から取ったのでした...

*2:同じことが出来るSaaSが存在すると昔教えていただいたのですが, 名前を忘れてしまった...

Mackerelでnasneを監視する 〜mackerel-plugin-nasne〜

この記事は, 「OSS紹介 Advent Calendar 2017」です.

qiita.com

昨日の記事は, id:mackee_w さんの「Rin - Redshift data Importer by SQS messaging - のご紹介」でした.

qiita.com

ここまでのあらすじ

id:mackee_w さんに, 「何か書いてよ!」と言われたので, 最近見つけて「最高!」と思った, 小粒だけどぴりりと辛いMackerelのプラグインをご紹介します.

Mackerelのプラグイン

Mackerelですが, 最近サードパーティプラグインのインストール機能が公式から提供されたりと, プラグイン周りがめちゃくちゃ熱いですね.

mackerel.io

ただ単にmackerel-agentをインストールするだけだと, 基本的なメトリックスしか取得できませんが, そこにプラグインを利用することで, 様々なメトリクスを取得し, Mackerelで管理/可視化することができるようになります.

「どんなプラグインがあるんだろう?」と興味を持った方は, Mackerelチームが誇るCRE, id:Soudai が「Mackerel プラグインアドベントカレンダー(全部CRE) Advent Calendar 2017」というのをやっているので, そちらを見てみると良さそうです.

qiita.com

mackerel-plugin-nasne

というわけで本題で, この記事では「mackerel-plugin-nasne」の紹介をします.

github.com

その名の通り, ソニーのネットワークレコーダー/メディアストレージの「nasne」を監視するプラグインです. 設定も簡単で, プラグインをインストールしてパスを通した上で, mackerel-agent.confに,

[plugin.metrics.nasne]
command = "/path/to/mackerel-plugin-nasne 192.168.11.3"

このように, nasneのIPアドレスを引数として渡して実行してあげるとOKです.

f:id:papix:20171202131622p:plain

このように,

  • HDDの最大容量/残り容量/使用容量 (USBで接続した外付けHDDも含む)
  • 録画された番組の数/録画失敗した番組の数

...を可視化することができます. 上の画像は, カスタムダッシュボードでnasneに関するメトリックを集めている様子になります.

ここから更に, 録画を失敗したらMackerelでアラートを出すとか, HDDの残り容量が減ったらアラートを出すとか出来ると, nasneの運用が捗りそうです.

次は...

yoku0825さんの「ytkit - Yoku-san no ToolKITについて」です. お楽しみに!

EdgeRouter XでVPN接続した時にコマンドを実行する

EdgeRouter Xを使って自宅のネットワークにVPNで接続出来るようにすると, どうしても「自分以外がVPNを利用して, 不正に自宅ネットワークに入り込んでいないか?」という所が気になってきます.

いろいろと解決策はありますが, ここでは「VPN接続が行われた時に通知をする」ということで, 不正利用に気付きやすくする(自分がVPNに接続していない時にVPN接続の通知が行われる = 不正利用が行われた, と判断できる)仕組みを作ってみましょう.

そのためには, EdgeRouter XにVPN接続した際, 任意のコマンドを実行できるようにすればよさそうです. そのコマンドの中で, いい感じにメールを送信するなり, SlackやLINEなどのAPIを利用してメッセージを送信するなどすれば良いでしょう.

なお, 今回は以下のページなどを参考にして, L2TP/IPsecで構築したVPNを対象とします.

yabe.jp

方法

結論から言えば, /etc/ppp/ip-up.d/l2tpdというファイルを作って, そこにパーミッション755を与えれば, VPN接続する度にそのファイルを実行してくれます.

例えば, このファイルに,

#!/bin/sh

echo "connected!" >> /tmp/vpn.log

というコードを書いておけば, VPNに接続する度にこのファイルが実行され, /tmp/vpn.logconnected!という文字列が書き込まれる訳です.

逆に, /etc/ppp/ip-down.d/l2tpdを設置してあげれば, VPN接続を切断したタイミングでそのファイルが実行されるので, 切断の通知なども出来ます.

なお, これらのファイルは, rootユーザーでなければ書き込むことはできないので,

$ sudo su -

などでrootユーザーになってから設置/変更などする必要があります. 気をつけましょう.