Masteries

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

「Hatena Engineer Seminar #10」ではてなブログのHTTPS化についてトークをしました

hatena.connpass.com

ご参加頂いた皆様, ありがとうございました!

当日の発表資料です. サービスのHTTPS化に際してはMixed Contentsの解決が最大の壁になりますが, それに対してただひたすらに, 丁寧に立ち向かって行った... という, 割と地味な話をしました.

id:aereal さんが当日発表された, AWSを活用した証明書の自動取得システムも順調に開発が進んでいます. 独自ドメインのHTTPS対応を提供できるまで, もう少しお待ち下さい.

宣伝

はてなでは, 一緒にはてなブログを開発する仲間を募集しています!!! 「思いは言葉に」するプラットフォームの"次"を, 一緒にやっていきましょう!!!!!!

hatenacorp.jp

「カイゼン・ジャーニー」読んだ

最近話題の「カイゼン・ジャーニー」を読みました. ...だいぶ前に. 感想エントリ書いたつもりだったのだけれど下書き状態のままで, 公開されていなかったのでした... そしてこの本ですが, Twitterとかで id:daiksy さん等たくさんの方々が絶賛していたので, サクッと買っていました.

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで

この本は3部構成の物語仕立てになっていて, 1人の主人公を中心に, 1部では「一人で」, 2部では「チームで」, そして3部では「チームを越えて」, アジャイルのプラクティスを活用することで, チームを"カイゼン"していく様子が描かれています. 1つの部には, それぞれ複数の話があり, そこでは最初に主人公が直面した課題の紹介と, それに対してアジャイルのプラクティスで立ち向かっていく様子が小説で綴られていて, その後に, そこで取り入れられたプラクティスについて詳解するというスタイルになっています

それぞれのプラクティスの説明も丁寧ですし, 何より小説パート(?)の出来がものすごく良くて, 特に終盤の, (自主検閲)が(自主検閲)の(自主検閲)だったシーンはちょっと胸が熱くなってしまいました(?). そういう意味では, 以前読んだ「アジャイルサムライ」よりも, (オタクにとっては)とっつきやすさがある(?)ように思います.

papix.hatenablog.com

...次はこれまた各所で評判だった, 「エンジニアリング組織論への招待」を読み進めていく予定です.

エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング

エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング

ところで...

最近こういった本を読んでいたのは, 今期から「テックリード」という役割を任されることになったのが大きいです. はてなにおけるテックリードの役割は, "チームの技術的な窓口"と定義されていますが, とはいえそれに留まらず, これまでよりも一つ上の視点で, チームを客観的に捉えようと思って, チームを見つめ直した結果, 今の自分たちのチームにはたくさん改善出来る所があり, それができれば自分たちはもっとやっていけるのでは? と思ったのでした. 「アジャイルサムライ」とか, 「カイゼンジャーニー」とかは, その改善のヒントを見つけられれば... という気持ちで読んでいたのです.

...で, こういった本で得た知識をそのまま今のチームに導入すると当然うまくいかないパターンが多いので, チームの状況に応じてアレンジをして, 「こういう取り組みをやってみませんか?」という提案を続けた結果, 最終的に「一通り任せてみよう」という話になり, 来週から実験的にチームのスクラムマスターをやることになりました. 前職でスクラムマスターと一緒にスクラムを回した経験はあるものの, 言うまでもなくスクラムマスターという役割を担うのは初めてです. そういう意味で, 現時点では正直不安しかないのですが, とはいえ社内には id:daiksy さんといった有識者がいますし, チームとしても現状維持で良いという意見は全くなくて, スクラムの導入に対してプラスの印象を持ってもらっているので, そういった後押しを力に変えて, うまくスクラムを回していきたいという気持ちです.

というわけで, 今後はそういった領域の気付きや知見なども, ブログに書いていけたらと思っています. 頑張るぞ!!!

AWS::CLIWrapperにPull Requestを投げた

AWSの機能を任意の言語から利用するためのSDKですが, 悲しいことにPerl向けのものはありません. 従って, Perl Monger達はAWSのCLIであるawsコマンドをラップしてPerlから実行する, AWS::CLIWrapperというモジュールを駆使しています.

metacpan.org

さまざまな事情があって, AWSに最近追加された機能をPerlから使いたかったので, さっくりとPull Requestを投げました.

github.com

即座にマージ頂いて, 1.13としてリリースされました. 対応ありがとうございました!

おもしろポイント

AWS::CLIWrapper, たくさんあるAWSの機能に対してどのようにして対応しているのだろう...? と前々から思ったのですが, 今回Pull Requestを出すにあたって眺めてみたところ, aws helpコマンドを使ってAWSの各機能を利用するためのコードを, 自動的に生成していました: https://github.com/hirose31/AWS-CLIWrapper/blob/master/lib/AWS/CLIWrapper.pm#L259-L261

# aws help | col -b | perl -ne 'if (/^AVAILABLE/.../^[A-Z]/) {  s/^\s+o\s+// or next; chomp; next if $_ eq 'help'; my $sn = $_; $sn =~ s/-/_/g; printf "sub %-18s { shift->_execute('"'"'%s'"'"', \@_) }\n", $sn, $_ }'
# aws help | col -b | perl -ne 'if (/^AVAILABLE/.../^[A-Z]/) {  s/^\s+o\s+// or next; chomp; next if $_ eq 'help'; my $sn = $_; $sn =~ s/-/_/g; printf "=item B<%s>(\$operation:Str, \$param:HashRef, %%opt:Hash)\n\n", $sn}'
# =item B<s3>($operation:Str, $path:ArrayRef, $param:HashRef, %opt:Hash)

ドキュメント(ヘルプ)から自動生成すれば漏れがないので, 「なるほど賢い!」と思いました.

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のバージョンに既にインストールされているモジュールの一覧を表示できます.