Masteries

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

Nature RemoのGolang用APIクライアント「go-nature-remo」を書き始めた

最近業務でちまちまとGolangを書く機会がありました. そこで学んだことの復習を兼ねてNature RemoのAPIクライアントを書いてみています. 名前はgo-nature-remoです.

github.com

...実のところ, 現時点ではNature RemoのAPIのうち, Cloud APIのごく一部しか実装出来ていません. 残りは適宜実装していくつもりです(Pull Requestも歓迎です!).

活用例

以前作ったmackerel-plugin-nature-remoは, Nature RemoのCloud APIからdeviceをGETするAPIさえ叩ければ良いので, 早速go-nature-remoで置き換えてみました:

github.com

Golangの感想

ここ数年, Golangに挑戦しようとしては何度か挫折というか足踏みをしていましたが, やはり業務で取り組む機会が出来るとだいぶ習熟度が上がっていきますね. 特に, はてなはGolangが得意なエンジニアが多いので, そういった方々から丁寧なレビューやアドバイスを受けることが出来るので, 徐々にですが理解が深まってきています.

今後はGolangネタもちまちまとブログに書いていけると良いかなと思っています. 目下の課題はGoroutineを理解するところなので, そこでの学びとか, 書いていけたら良いかなーと思っています.

plenvを使ったPerl環境構築 〜2018年度版〜

2013年頃に登場した plenvですが, 2018年となった今でもPerlの環境構築におけるデファクトスタンダードの立ち位置を維持しています.

github.com

この記事では, plenvを使ったモダンなPerlの環境構築の手法について紹介します. またplenvのような形で, 様々な言語のために開発された**envを束ねて管理できるanyenvを利用して, plenvを導入する方法についても紹介します.

plenvのインストール

Git

$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(plenv init -)"' >> ~/.your_profile
$ exec $SHELL -l

GitHubからplenvと, 実際にPerlのインストールを実施するときに必要なperl-buildをcloneしてパスを通し, シェルを起動する際にplenv init -を実行するように設定します. なお, ~/.your_profileの部分は, 利用しているシェルに応じて適切な設定ファイル(bashなら~/.bash_profile, zshなら~/.zshrcなど)に書き込むように読み替えましょう.

Homebrew

macOSを使っている場合, Homebrewでのインストールも可能です.

$ brew update
$ brew install plenv
$ brew install perl-build

この後, Gitを利用したインストールと同じく,

eval "$(plenv init -)"

を, 適切な設定ファイルに書き込めばインストール完了です.

anyenvを利用したplenvのインストール

plenvはPerlの開発環境をするにあたって必須と言えるツールですが, 同様のツールがRubyの場合はrbenv, Pythonの場合はpyenv, Node.jsの場合はndenv... といった具合にそれぞれ開発されています. それぞれ丁寧にインストールしてもいいのですが, **envを統一して管理できるように開発されたanyenvというツールが存在するので, Perl以外にもRubyやPython, Node.jsの環境も構築したいのであれば, anyenvを利用してplenvをインストールするのがおすすめです.

github.com

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l

続いて, anyenvを利用して, plenvをインストールします.

$ anyenv install plenv

これでplenvが利用できるようになりました. 実際の使い方については, GitやHomebrewで(anyenvを利用せず)plenvをインストールしたときと同様です.

使い方

ヘルプの確認: help

$ plenv help
Usage: plenv <command> [<args>]

Some useful plenv commands are:
   commands            List all available plenv commands
   local               Set or show the local application-specific Perl version
   global              Set or show the global Perl version
   shell               Set or show the shell-specific Perl version
   install             Install a Perl version using the perl-build plugin
   uninstall           Uninstall a specific Perl version
   rehash              Rehash plenv shims (run this after installing executables)
   version             Show the current Perl version and its origin
   versions            List all Perl versions available to plenv
   which               Display the full path to an executable
   whence              List all Perl versions that contain the given executable
   list-modules        List cpan modules in current perl
   migrate-modules     Migrate cpan modules from other version
   install-cpanm       Install cpanm

See `plenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/tokuhirom/plenv#readme

plenv helpでヘルプを閲覧できます. また, plenv help <command>で, 任意のコマンドのヘルプを閲覧することができます.

plenvのバージョン確認: --version

$ plenv --version
plenv 2.2.0-14-gb2ea2fd

plenv --versionで, 現在利用しているplenvのバージョンを確認できます.

Perlのインストール: install

利用可能なバージョンの確認

$ plenv install -l
Available versions:
 5.6.0
 5.6.1-TRIAL1
 5.6.1-TRIAL2
 5.6.1-TRIAL3
     (中略)
 5.26.0
 5.26.1-RC1
 5.26.1
 5.27.1
 5.27.2
 5.27.3
 5.27.4
 5.27.5
 5.27.6
 5.27.7
 5.27.8
 5.27.9

plenv install -lで, 現在インストール可能なperlのバージョンを表示することができます.

インストールの実行

plenv install <version>で, 指定したバージョンのperlをインストールすることができます.

$ plenv install 5.26.1

このとき, --asオプションで別名を付けることが可能です.

$ plenv install 5.26.1 --as 5.26

このコマンドでは, Perlのバージョン5.26.1を, 5.26という名前でインストールします.

現在有効なPerlのバージョン

$ plenv version
5.26.1 (set by /home/username/.anyenv/envsplenv/version)

plenv versionで, plenvによってインストールされ, 現在有効になっているPerlのバージョン(perlコマンドを実行したときに呼び出されるPerlのバージョン)を表示します. また, (set by ...)の部分は, 現在有効になっているPerlのバージョンが, どこで設定されたかを示しています(後述).

plenvが使用するPerlのバージョンの設定

plenvは, 以下の順番で使用するperlのバージョンを決定します.

  • 環境変数PLENV_VERSION
  • 今のディレクトリか, 上位ディレクトリのローカル設定(.perl-version)
  • グローバル設定(~/.plenv/version, anyenvを利用してplenvをインストールした場合は~/.anyenv/envs/plenv/version)
  • システムのPerl

環境変数: PLENV_VERSION

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

$ export PLENV_VERSION=5.26.0

$ plenv version
5.26.0 (set by PLENV_VERSION environment variable)

環境変数PLENV_VERSIONに使用したいバージョンをセットすると, 常にそのバージョンのperlが使用されるようになります. また, 環境変数PLENV_VERSIONは, plenv shell <version>コマンドでセットすることができます.

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

$ plenv shell 5.26.0

$ plenv version
5.26.0 (set by PLENV_VERSION environment variable)

plenv shell --unsetで, 環境変数PLENV_VERSIONを無効にすることもできます.

$ plenv shell --unset

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

ローカル設定

$ cd ~/hoge/fuga
$ pwd
/home/username/hoge/fuga

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

$ plenv local 5.26.0

$ plenv version
5.26.0 (set by /home/username/hoge/fuga/.perl-version)

$ plenv local
5.26.0

$ cd ../
$ pwd
/home/username/hoge

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

plenv local <version>で, ローカル設定を有効にします. また, plenv localで, 今いるディレクトリで有効となるローカル設定を確認することができます.

このコマンドが実行されると, カレントディレクトリに.perl-versionというファイルが作成されます. ローカル設定が有効となるのは, .perl-versionがあるディレクトリよりも下位のディレクトリなので, .perl-versionがあるディレクトリから1つ上のディレクトリに移動すると, そのローカル設定は適用されなくなります.

$ plenv version
5.26.0 (set by /home/username/hoge/fuga/.perl-version)

$ plenv local --unset

$ plenv version
5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

plenv local --unsetで, ローカル設定を解除できます(つまり.perl-versionを削除します).

グローバル設定

$ plenv global 5.26.1

$ plenv global
5.26.1

plenv global <version>で, グローバル設定を変更できます. また, plenv globalで, 現在設定されているグローバル設定を確認することができます. 環境変数PLENV_VERSIONやローカル設定が有効でない場合, このグローバル設定で設定されたバージョンのPerlが常に利用されます.

インストール済みのPerl一覧: versions

$ plenv versions
  system
* 5.26.1 (set by /home/username/.anyenv/envs/plenv/version)

plenv versionsで, plenvによってインストールされたPerlのバージョンと, 現在どのバージョンが有効になっているか(prefixに*が付いているもの)を確認することができます.

設定ファイルの表示: version-file

$ plenv version-file
/home/username/.anyenv/envs/plenv/version

plenv version-fileで, 現在のディレクトリで有効になるPerlが, どのファイルで指定されるかを表示することができます(.perl-versnionファイルがあればそのパスを, なければ(= グローバル設定が有効なら)/path/to/plenv/versionなどが表示されます). これはあくまで, ローカル設定/グローバル設定がどのファイルで指定されているかを示すものなので, 環境変数PLENV_VERSIONplenv shellなどでPerlのバージョンを指定している場合であっても.perl-versionないしversionへのパスが表示されます.

Perlのアンインストール: uninstall

$ plenv uninstall 5.26.0

plenv uninstall <version>で, plenvによって導入済みのPerlを削除することができます.

cpanmのインストール: install-cpanm

$ plenv install-cpanm

plenv install-cpanmで, 現在有効になっているバージョンのPerlに, cpanm(App::cpanminus)をインストールすることができます.

コマンドのフルパス確認: which

$ which cpanm
/home/username/.anyenv/envs/plenv/shims/cpanm

$ plenv which cpanm
/home/username/.anyenv/envs/plenv/versions/5.26.1/bin/cpanm

plenv which <command>を使うことで, 現在有効になっているバージョンのPerlにインストールされた任意のコマンドへのフルパスを表示できます.

コマンドがインストール済みのPerlのバージョン: whence

$ plenv whence cpanm
5.26.1

plenv whence <command>で, 任意のコマンドが実行できる(インストール済み)のPerlのバージョンの一覧を表示できます. 上記のコマンドでは, cpanmが実行できる, つまりcpanmがインストール済みのPerlのバーションの一覧を表示しています.

バージョン間のモジュールの移動: migrate-modules

$ plenv migrate-modules 5.26.0 5.26.1

plenv migrate-modules <from> <to>で, <from>のバージョンのPerlにインストール済みのモジュールを, <to>のバージョンのPerlにインストールすることができます.

インストール済みのモジュール一覧: list-modules

$ plenv list-modules
Algorithm::Diff
Algorithm::Evolutionary
Algorithm::Permute
Amon2
     (中略)
multidimensional
namespace::autoclean
namespace::clean
strictures
syntax

plenv list-modulesで, 現在有効なperlのバージョンに既にインストールされているモジュールの一覧を表示できます.

環境変数"GIT_EDITOR"にご用心

Gitを使っていて git commit などをしたときに, コミットログを編集するために開かれるエディタは, デフォルトではviですが, 任意のエディタを指定することができます. 例えばvimにしたいのであれば, git config --global core.editor vim を実行すると, ~/.gitconfig が書き換わり, 以後はvimが使われるようになります.

[core]
    editor = vim

このとき, git config --global core.editorを実行すると, 現在設定されているエディタを確認することができます:

$ git config --global core.editor
vim

Gitで使うエディタを変更するとき, 気をつける必要があるのが環境変数GIT_EDITORです. 実はこの環境変数はcore.editorの設定よりも優先されます. そのため,

$ GIT_EDITOR=nano git commit

などとすると, たとえ git config --global core.editorvim であっても, コミットログの編集のために開かれるエディタはnanoになります. 更に不幸なことに,

$ GIT_EDITOR=nano git config --global core.editor
vim

といった挙動になるので, 妙な場所で環境変数GIT_EDITORを設定していると, 一見Gitのcore.editorが効かないように感じてしまいます.

...最近vimからnvimに移行したのですが, これにはまって(GIT_EDITORvimにしていた), 数日間素のvimでコミットログを編集することを強いられてしまったので, 同じような罠にかかる人が現れないようにメモしておきます.

YAPC::Okinawaで, 「Webサービスを監視するときに僕達が考えたこと」というトークをしました

トークを聞きに来て下さった皆様, ありがとうございました! 以下スライドです:

少なくともYAPCでは初めての40分トークで, しかも思っていた以上に人が来ていて, 終始あたふたしまくりでしたね. 発表していた自分のLAも危険な領域に突入していました...

そういう感じで, 後半ちょっと走り気味ではありましたが, とはいえ話したいと思っていたことは全部話せたので良かったです. 結構学生の方が聞きに来てくれていて, そういった方がこれからエンジニアとして活躍していくときに役立つような発表ができたら良いし, その中で, 既にエンジニアとして働いている方々に知見を提供できたり, そこから新しい意見を聞けたりできたらいいなー, と思っておりましたが, そういう感じで楽しんでいただけたのなら幸いです.

この後もB会場を中心にうろうろしている予定で, 懇親会にも参加しますので, 質問や感想などあれば是非直接話しかけてもらえると嬉しいです! (ツイートやブログエントリでも嬉しいです!). 沖縄はあいにくの大雨ですが, 引き続きYAPC::Okinawa楽しんでいきましょう〜!

YAPC::Okinawaで, 「Webサービスを監視するときに僕達が考えたこと」というトークをします

yapcjapan.org

YAPC::Okinawaで応募していたトークが採択されました! タイトルは, 「Webサービスを監視するときに僕達が考えたこと」です.

Webサービスを開発し, 運用していると, 様々な出来事が生じます. 何らかの要因によるリクエスト数の上昇があったり, サーバーやネットワークの疎通が急に止まったり, 或いは利用している外部サービスで障害が発生したり... そういった時に, サービスの異常事態にいち早く気付き, 迅速に対応するためには, Webサービスをしっかりと「監視」していくことが重要です.

本トークでは, Webサービスの「監視」と「通知」そして「対応」という3つの視点から, 「Webサービスを運用していく」ことについて考察します. その中で, 「監視」と「通知」を実現する道具として, 株式会社はてなが提供するサーバー監視SaaS「Mackerel」を題材とする予定です. また, 「はてなブログ」を題材とした, Mackerelを利用したWebサービス監視の実情などもお話出来ればと思っています.

具体的には, 以下のような話題が含まれる予定です:

- なぜ「監視」が必要なのか?
- サービスに這い寄る障害達
- 「監視」と「通知」と「対応」の車輪を回そう
- どこまで通知する? 〜狼少年にならないために〜
- Mackerelを活用したWebサービスの監視
- Webサービスの監視の現場 〜はてなブログの場合〜

このトークをきっかけに, 「Webサービスの監視」について, 皆さんと一緒に理解を深められると嬉しいです.

初心者向けの内容にしようと考えていて, "Webサービスの監視"について思いを馳せたことのない学生さんや, Webサービスの監視についての知見が欲しい/意見交換がしたいエンジニアを想定した内容になる... 予定です. はてなブログにおけるWebサービス監視の実例や, (機材を買えば)自宅で今すぐ初められる監視ライフといったお話も, できればと思っています.

それはそれとして沖縄情報もまとめておきました, YAPC::Okinawaに参加される方は参考にして下さい:

papix.hatenablog.jp

それでは, 3月3日にYAPC::Okinawaでお会いしましょう!