角待ちは対空

おもむろガウェイン

Furl::S3のTIPS100連発

Furl::S3 にはドキュメントに記載されている create_object メソッドの他に create_object_from_file が存在する。前者はファイルハンドルを引数に取るのに対して後者はファイル名を引数に取る。

また create_object_from_file は content type の判定を自動でしてヘッダーに追加してくれる。この機能は create_object メソッドにはない。

ただし判定に使われるモジュールは File::Type で少々古く、 png が image/x-png と判定されたりしてあまり信頼できない傾向にある。

blog.yux3.net

dockerコマンドの補完

最近サボってるけど、仕事が忙しい。そのうちつじつまを合わせる。

docker はサブコマンドもオプションも多く人類が覚えられるものではないのでシェルの補完機能を使うと良い。

実は公式に提供されていてMacでインストーラを使ってインストールした場合

% ls /Applications/Docker.app/Contents/Resources/etc
docker-compose.bash-completion docker-machine.bash-completion docker.bash-completion         docker.zsh-completion
docker-compose.zsh-completion  docker-machine.zsh-completion  docker.fish-completion

という感じで置かれている。 docker-composedocker-machine の補完もある。

zshならば fpath 内に置 くなど各シェルの作法インストールすれば補完が効くようになる。

zshに場合(bashやfishはしらない)は、サブコマンドやオプションだけでなくハッシュ値も保管してくれる。

% docker run <tabを押す>
Completing images
1007ab9c4581  92724e305c38  40fa36d8e79b  ad2648c45977  5df315b047a3  25c39caa1599
30e6dc1b9dcf  6e9f5ece58d0  354447abe1c5  d59f608eb9c9  4c3bd6be5c7a  b3f973d4e73b
64c2d103360e  01f95bd17056  54437a6ec1da  84ad0e94bd24  4d1f0af3a856  25723f5fbfb7
9a98002e9550  c7cf82e40153  b4130a0cb60a  cfa45172fcf6  0b31442c6ffe  857a11b97531
af0bae28e276  a530821a401d  90149e0c6c6f  a3c3a54b0eed  a5593d6de89c  ea7cd87f1988
d0fe9dafe363                                                                        -- <none>          in <none>
138bd936fa29                                                                        -- 1.9             in golang
138bd936fa29                                                                        -- 1.9.2           in golang
5709795eeffa                                                                        -- 5.7             in mysql
8ba3235ead08                                                                        -- latest          in ****************
af7255f30d48                                                                        -- latest          in ****************
ba52c9ef0f5c                                                                        -- 1.8             in golang
ec2b525211f3                                                                        -- latest          in ****************
Completing repositories
****************                   golang                            ****************                ****************                mysql

今年一番ライフチェンジングだった。

ファイル自体はgithubで普通に公開されているものなのでそこから取ってくるのでも良い。 GitHub - felixr/docker-zsh-completion: zsh completion for docker

blog.yux3.net

PerlでAWS S3の事前署名付きURLを生成する

忙しくて昨日一昨日サボったけどどっかでつじつま合わせるよ。

docs.aws.amazon.com

基本的にこの通り実装すれば良い。SDKがない言語だと苦労する。

use strict;
use warnings;
use utf8;

use Digest::SHA qw(hmac_sha256_hex hmac_sha256 sha256_hex);
use URI;
use URI::QueryParam;
use DateTime;
use feature qw(say);

my $ACCESS_KEY = '';
my $SECRET_KEY = '';
my $HOST = 'img.yux3.net.s3-ap-northeast-1.amazonaws.com';
my $REGION = 'ap-northeast-1';

my $path = '/うたわれるもの.gif';

my $dt = DateTime->new({
    year   => 2017,
    month  => 12,
    day    => 13,
    hour   => 21,
    minute => 17,
    second => 0,
    time_zone => 'Asia/Tokyo',
});
$dt->set_time_zone('UTC');
my $yyyymmdd = $dt->strftime('%Y%m%d');
my $iso8601 = $dt->strftime('%Y%m%dT%H%M%SZ');
my $expire = 1000;


my $u = URI->new();
$u->path($path);

my $scope = "$yyyymmdd/$REGION/s3/aws4_request";

$u->query_param_append("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
$u->query_param_append("X-Amz-Credential", "$ACCESS_KEY/$scope");
$u->query_param_append("X-Amz-Date", $iso8601);
$u->query_param_append("X-Amz-Expires", $expire);
$u->query_param_append("X-Amz-SignedHeaders", "host");

my $canonical_request = << "DATA";
GET
@{[$u->path]}
@{[$u->query]}
host:$HOST

host
UNSIGNED-PAYLOAD
DATA
chomp $canonical_request;

my $string_to_sign = << "DATA";
AWS4-HMAC-SHA256
$iso8601
$scope
@{[sha256_hex($canonical_request)]}
DATA
chomp $string_to_sign;


my $signature = hmac_sha256_hex($string_to_sign, hmac_sha256("aws4_request", hmac_sha256("s3", hmac_sha256($REGION, hmac_sha256($yyyymmdd, "AWS4" . $SECRET_KEY)))));

$u->scheme("http");
$u->host($HOST);
$u->query_param_append("X-Amz-Signature", $signature);

say $u->as_string;

生成されるURLはこんな感じ。 http://img.yux3.net.s3-ap-northeast-1.amazonaws.com/%E3%81%86%E3%81%9F%E3%82%8F%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE.gif?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAI7WRPIABGYYL47EA%2F20171213%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-Date=20171213T121700Z&X-Amz-Expires=1000&X-Amz-SignedHeaders=host&X-Amz-Signature=4fd13192750125a94dd0cb4dd87b4897e4e7ba24936c2ec344423a0d781fc9ae (1000秒でexpireされるのでそのうち見えなくなる)

もちろん署名がないと見えない。 http://img.yux3.net.s3-ap-northeast-1.amazonaws.com/%E3%81%86%E3%81%9F%E3%82%8F%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE.gif

blog.yux3.net