Masteries

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

VimにおけるPerl関連のスニペットを晒してみる 〜2017年版〜

この記事は, 「Perl Advent Calendar 2017」の23日目の記事です.

qiita.com

昨日は, @magnolia_k_さんの「ビルドツールの裏側にいるMakefileを覗いてみる 」でした.

qiita.com

VimにおけるPerl関連のスニペットを晒してみる

あと30分で12月24日ですが, まだ23日の記事が開いてそうだったので, 折角なので小ネタで埋めようと思います. 大きめのネタにしなかったのは, 24日のPerl Advent Calendarも担当しているからです.

...さて, 去年このような記事を書きました:

papix.hatenablog.com

日頃, Perlを書く時は(というか何かしらコードを書く時は)Vimでコーディングをしていますが, その時に使っているスニペットを紹介した記事です. この記事では, あれから1年以上が経過した, 今現在のVimにおけるPerl関連のスニペットをご紹介します.

snippet u
    use strict;
    use warnings;
    use utf8;

    ${0}

snippet env
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use utf8;

    ${0}

snippet pkg
    package `expand('%:p:s?.*lib/??:r:gs?/?::?')`;
    use strict;
    use warnings;
    use utf8;

    ${0}

    1;

snippet dw
    use DDP { deparse => 1, use_prototypes => 0 };
    DDP::p ${0}

snippet slurp
    open my $fh, '<', ${0} or die "failed to open file: $!";
    my $content = do { local $/; <$fh> };

...だいぶシンプルになりました. 数ヶ月前にvimrcの大掃除をしたので, その時に余り使わないスニペットは消してしまった, というのもあります.

  • スクリプトを書く時はuないしはenvuse strictuse warningsなどを一括で挿入
  • ライブラリを書く時は, pkguse strict, use warningsなどに加えて, packageも一括で挿入
  • Printデバッグをする時は, dwでData::Printer(DDP)を挿入
  • Path::Tinyなどを使わずにファイルを読み込みたいときは, slurpでファイルを一気に読み込んで, 変数に代入するコードを挿入

...という感じに使っています.

SirVer/ultisnips

pkgのスニペットについては, SirVer/ultisnipsを使っています.

github.com

このプラグインを使って, 上記のようなスニペットにしておけば, 例えばlib/Foo/Barというディレクトリで, 新たにBaz.pmを作り, そこでpkgのスニペットを展開すると, このようになります.

package Foo::Bar::Baz;
use strict;
use warnings;
use utf8;



1;

現在のパスから, packageの部分をいい感じに補完してくれて, 非常に便利です(ちなみにこの設定は id:masawada さんのvimrcから拝借したものです, ありがとうございます).

まとめ

Vimを使っている時によく使っているPerl関連のスニペットと, そこで利用しているSirVer/ultisnipsを紹介しました. 他にも「これがあると捗るよ!」といった, 便利なスニペットがあれば, 是非ブログなどで紹介してもらえると嬉しいです!

「雑に文章を書く」活動と, そこから得たもの

この記事は, 「はてなエンジニア Advent Calendar」の18日目の記事となります.

qiita.com

昨日の記事は, id:masayoshi さんの「はてなサマーインターン2017の講義とメンターをした話」でした.

masayoshi.hatenablog.jp

今日は, 最近やっている「雑に文章を書く」活動と, それが業務の中に微妙に活きつつある, という話をしようと思います.

雑に文章を書く

はてなにおける業務として, 「はてなブログ」の開発に携わっているので, そのドッグフーディングは極めて重要です. 言うまでもなく, 仕事や技術について語ることを主目的としたこのブログもはてなブログを使っていますし, 日常や趣味について語るブログもはてなブログを使っています: 絶対笑顔でまだまだいっぱい夢見るブログ そして2ヶ月ほど前から, これら2つのブログに加えて, 「パピッター」という, とにかく雑に, 思ったことを, 勢いだけで綴るブログをやっています. ...もちろんはてなブログで.

papix.hatenadiary.jp

最初は, 割と勢いでスタートした「雑に文章を書く」活動ですが, 継続していると, 予想していた以上にメリットがあることがわかってきました.

「雑に文章を書く」活動から得られたこと

「思考の書き損じ」が減る

昔から, 「気付いた事, 学んだ事, 考えた事, そういった思考の成果は文章にまとめて残したい. そうしないと, 折角頭を使って思考を巡らせたのに, それを全部忘れてしまう」という気持ちを持っています. それを果たすべく, 2つのブログを書いていましたが, 何となく「このブログは, 思考したことを, しっかりまとめてからアウトプットする場所」といった気持ちになってしまって(この辺りの, 「ブログの使い方」的な部分は人それぞれあるとだと思います), 結果として書き損じる, というパターンが多かったです.

「このブログは, 雑に文章を書いても良い場所だ!」と定めることで, 思考したことを5〜6割くらいまとめた段階のものを, どんどんと書き残せるようになりました. もちろん, これまでよりもクオリティ(?)は低いかもしれませんが, 一度雑に書き残しておくことで, それを後で振り返ったり, まとめなおしたりすることが出来るようになりました.

「文章を書く」作業が苦ではなくなる

エンジニアとして, コードを書き, プロダクトを改善, 成長させていくのは重要な仕事です. しかしながら, それをチームで取り組んでいくのであれば, ある程度の「文章」を書く必要がある場面が多々あります.

例えば, IssueやPull RequestのDescriptionだったり, 日報/週報といった定期的なレポートだったり, 会議のアジェンダだったり... 丁寧に書きすぎると時間がかかりすぎますし, かといって雑に書きすぎると, IssueやPull Requestであれば, 「これはどうですか?」, 「これって何ですか?」といった, コメントによるコミュニケーションが何度も何度も繰り返されてしまったりしますし, 会議であれば, 議論の前提やテーマがズレてしまったりして, 気がついたら混沌となっていた... といった事があるかもしれません.

「雑に文章を書く」活動を初めてから, 定期的に「5〜6割くらいの完成度」の文章を書くようになって, 結果として, IssueやPull RequestのDescriptionや, 会議のアジェンダを用意するとき, 50%〜60%くらいの完成度のものを, すぐに書き出せるようになった気がします. これまでは, 書き始めるまでにいろいろ考えすぎたり, なんとなく書き始める事が出来ずに, 結果として延々と時間だけが経過していた... というパターンが多かったです.

「50%〜60%」という完成度も, 良い塩梅なのかもしれないと思っていて, 文章を書く時, 完成度を上げようとすれば上げようとする程, 時間が必要になってきます. 程よい準備時間を費やしつつ, ある程度前提や自分の意見などをまとめられる完成度がこの辺りなのではないか? ...と, 勝手に思っています.


思いつきで初めた, 「雑に文章を書く」活動と, そこから得られたものについて紹介しました. 「雑な文章」, よければはてなブログで是非綴ってみてください.

hatenablog.com

EdgeRouter Xでmackerel-agentを動かす

この記事は, 「Mackerel Advent Calendar 2017」の17日目の記事です.

qiita.com

EdgeRouter Xでmackrel-agentを動かす

EdgeRouter Xは, ネットワーク機器ベンチャーUbiquiti Networksというところが開発しているルータ製品の1つです. 安価な割にいろいろ遊ぶことができて, 秋あたりからいろいろと設定して遊んでいます. ちなみに最近はAmazonでも買えるようになったみたいです.

Ubiquiti Networks Edgerouter ER-X(日本国内)

Ubiquiti Networks Edgerouter ER-X(日本国内)

EdgeRouter Xの上にはMIPSが乗っており, すなわちMIPS向けにビルドすればEdgeRouter Xでもmackerel-agentが動く...! という情報を, 同僚の id:astj さんから伺ったので, 実際にやってみたというのがこの記事の内容です.

astj.hatenablog.com

この記事で紹介した方法を使えば, (Go言語が対応している)任意のアーキテクチャでmackerel-agentを動かすことができそうです.

mackerel-agentをビルドする

mackerel-agentをビルドするには, リポジトリをcloneした後,

$ make build

すればOKです. 今回の場合, EdgeRouter XのためにMIPS(正確にはリトルエンディアンのMIPS)でビルドしたいので,

$ GOOS=linux GOARCH=mipsle make build 

このようにしましょう. すると, buildディレクトリ下にmackerel-agentが生成されますので, scpなどを利用して, EdgeRouter Xに持っていきます.

後は, EdgeRouter X側で,

$ sudo su -
# mv /path/to/mackerel-agent /usr/bin/mackerel-agent

のようにして, /usr/bin/mackerel-agentに配置しましょう.

設定ファイルの設置

mackerel-agentの設定ファイル, mackerel-agent.confも設置しなければなりません.

# mkdir /etc/mackerel-agent/

のように, ディレクトリを用意して,

# vi /etc/mackerel-agent/mackerel-agent.conf

で, APIキーなどを書き込みましょう.

自動起動の設定

これで, /usr/bin/mackerel-agentで, mackerel-agentが起動するようになりました. 次は, EdgeRouter Xを再起動した際, 自動的にmackerel-agentが起動するようにしてみましょう.

いろいろと方法はありますが, 今回は起動時に/etc/rc.localが実行されることを利用して, ここでmackerel-agentを起動する方法を取ります.

# vi /etc/rc.local

でファイルを開き,

/usr/local/bin/mackerel-agent supervise  >> /var/log/mackerel-agent.log 2>&1 &

のように, mackerel-agentがバックグラウンドで実行されるように設定します.

これで, 何らかの事情でEdgeRouter Xがシャットダウンしても, mackrel-agentが自動的に起動するようになりました.

Mackerelから見たEdgeRouter X

f:id:papix:20171112230013p:plain

こういう感じで, 普通に各種パラメータが取得できます. 途中一部データが途切れているのは, EdgeRouter Xを再起動したときにmackerel-agentが再起動することを確認したときの様子です.

EdgeRouter Xでプラグインも動かす

Goで実装されたプラグインであれば, ここまで紹介してきた方法を使い, GOOS=linuxかつGOARCH=mipsleとしてビルドすれば, EdgeRouter Xで動かすことができます.

papix.hatenablog.com

実は, 先日こちらの記事で紹介したMackerelのnasne用プラグインも, Goで実装されていたので, ビルドしてEdgeRouter Xの上で動かしたりしています...!

EdgeRouter Xであれば, 意外とPerlも5.14.2が使えるようになっているので, コアモジュール縛りをすればPerlでプラグインを書いて... ということもできそうです.

まとめ

EdgeRouter Xでmackerel-agentを動かす方法を紹介しました. mackerel-agentはGo言語で実装されているので, こういった時に適切なアーキテクチャでビルドすれば, シュッと動かすことができて便利ですね!

Mackerelは, 無料プランでも5ホストまで監視することが出来るので, EdgeRouter Xを使っている方は是非Mackerelを使った監視にもチャレンジしてみて下さい.

「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が存在すると昔教えていただいたのですが, 名前を忘れてしまった...