yyp٩( 'ω' )و

色々触って遊んでます

AWS CLIのコマンド補完を有効にする

まえがき

AWS CLIはコマンド補完ができないのか〜不便だな〜と思って使っていたのですが、組み込みで補完機能が入っていることを先日知りました。
便利なので補完を有効にします。

環境

補完を有効にする

公式ドキュメントに沿って進めます。

aws_completerを探してパスに追加する

aws_completerがコマンドの補完をしてくれる本体みたいです。
私の場合は下記にありました。

% which aws_completer
$HOME/Library/Python/3.7/bin//aws_completer

aws_completerが含まれているフォルダのパスを.zshrcに書いてパスに追加します。

export PATH=$HOME/Library/Python/3.7/bin:$PATH

コマンド補完を有効にする

パスに追加しただけでは有効にならないので、スクリプトを実行します。

% source $HOME/Library/Python/3.7/bin/aws_zsh_completer.sh  

これもシェルにログインするたびに実行する必要があるので.zshrcに書いておきます。
これで有効になっているのでAWS CLIで補完ができるかどうか試してみます。
aws sまで入力してタブを押すと下記のようにsで始まるコマンドが出てきたらOKです。

% aws s3
s3                 sagemaker          secretsmanager     service-quotas     ses                sms                sqs                storagegateway     swf
s3api              sagemaker-runtime  securityhub        servicecatalog     shield             snowball           ssm                sts
s3control          sdb                serverlessrepo     servicediscovery   signer             sns                stepfunctions      support

まとめ

AWS CLIはコマンドが多くて覚えられないので、補完してくれるのはとても便利だなと思います。
ただ、デフォルトで有効だともっと便利だなあと…
私はインフラなのでインスタンスに入って作業することが多いので、インスタンスごとに有効にするのはちょっと大変だったり…
もしインスタンスで実行する必要がある場合、構築時にユーザデータとかでスクリプトを実行するようにしたら良さそうな感じです。
Dockerの場合はDockerfileに書いておけば良さそうですね。

pecoでらくらくgit checkout

まえがき

gitでブランチ切り替えをするとき、いちいちブランチ名を入力しないといけないのが手間だな〜と日頃から思っていたのですが、pecoでブランチ名を選択するようにできるらしいので、やってみます。

環境

  • OS: macOS Mojave
  • OS version: 10.14.6
  • docker version: 19.03.1

pecoとは

pecoは、コマンドの実行結果を変数に入れて別のコマンドを実行するときに選択肢として表示できるようにするツールです(正確な説明ではないかもしれないです)。
ssh先を手元で管理するときとかによく使われている印象です。

github.com

pecoインストール

今回はmacなのでbrewでインストールします。

% brew install peco  
% peco --version  
peco version v0.5.3 (built with go1.10.3)

最新版がインストールされたみたいです。

pecoを使っていく

pecoの基本的な使い方は、「選択肢として表示させたいコマンドをパイプで渡す」です。
今回はgitのブランチのリストを選択肢として表示させたいので、

% git branch -a | peco  

となります。
実行すると、こんな感じでブランチが表示され、カーソルキー上下で選ぶことができます。
(*がついているブランチがカレントブランチです)

QUERY>                                                                                                                                                        IgnoreCase [4 (1/1)]
  develop
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

git checkoutするには下記のように実行します。

% git checkout $(git branch -a | peco)  

より便利に使うために、pecoまで含んだワンライナーをalias化してbashrcやzshrcに追記します。
今回はgcでブランチを選択肢として表示させてcheckoutできるようにします。

alias gc='git checkout $(git branch -a | peco)'  

sourceで読み込んで、gcでブランチ切り替えができれば成功です。

まとめ

いつもブランチ名を都度確認して、チェックアウトして…とやっていたので、これでだいぶ手間が減りそうです。
ただ、ブランチがあまりにも多いと探すのも時間がかかりそうですね…
表示させてさらに検索とか絞り込みができればもっと便利に使えそうです。

docker上で動くJenkins上でAWS CLIを使いたい(後編)

まえがき

前回の記事はこちら。

mizukichi3.hatenablog.jp

実はpipを使う方法も最初に試していたのですが、パーミッションでこけたのではなから諦めていました。
ですがふとUSERをrootにしたらどうなるだろうと試してみたらpipが入ったのでこちらの方法でやってみます。pipの方が簡単ですし…

pipを入れる

下記のようにDockerfileを作ってpipを入れます。

FROM jenkins:latest
USER root
RUN whoami
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python
RUN pip -V

ビルドします。
イメージ名はjenkins-pipとします。

% docker build -t jenkins-pip:latest . --no-cache
~~~~~~~~~~
Step 5/5 : RUN pip -V
 ---> Running in 82fb72a1add8
pip 19.2.3 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)
Removing intermediate container 82fb72a1add8
 ---> f5ab3e83145a
Successfully built f5ab3e83145a
Successfully tagged jenkins-pip:latest

pip入りました。

AWS CLIを入れる

先ほどのDockerfileを元にAWS CLIをインストールするDockerfileを作ります。

FROM jenkins:latest
USER root
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python
RUN pip install awscli
RUN aws --version

ビルドします。

% docker build -t jenkins-pip:latest . --no-cache
~~~~~~~~~~
Step 5/5 : RUN aws --version
 ---> Running in 37e73c5894a7
aws-cli/1.16.227 Python/2.7.13 Linux/4.9.184-linuxkit botocore/1.12.217
Removing intermediate container 37e73c5894a7
 ---> 89825d2eae74
Successfully built 89825d2eae74
Successfully tagged jenkins-pip:latest

awsコマンドが実行できています!やったね!

Jenkinsを起動して適当にジョブを作って実行してみましたが、awsコマンドは使えていそうです。

まとめ

USERをrootにしないといけないのが若干気になりますが、使えるようになったので一旦これでよしとします。
今夜はぐっすり眠れそうです。

docker上で動くJenkinsでAWS CLIを使いたい(前編)

まえがき

dockerで動くJenkinsを構築し、そのジョブでAWS CLIを使う用事があったのですがなかなかできないので記事にしながら整理します…!
長くなってしまったので前編後編で分けます。

環境

  • OS: macOS Mojave
  • OS version: 10.14.6
  • docker version: 19.03.1

Jenkins構築

dockerhubから公式のJenkinsイメージをpullします。

% docker pull jenkins  

イメージがpullできたことを確認します。

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins             latest              cd14cecfdb3a        13 months ago       696MB

一度このイメージからコンテナを起動します。

% docker run -d -p 8080:8080 -it --name jenkins jenkins
% docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0a3ccda1f28c        jenkins             "/bin/tini -- /usr/l…"   25 seconds ago      Up 23 seconds       0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins

ブラウザでlocalhost:8080にアクセスすると、Jenkinsの初期設定画面が表示されます。
ここまでで一旦置いておきます。

AWS CLIを実行できるようにする

AWS CLIをインストールするためにDockerfileを作ります。
FROMで先ほどpullしてきたイメージを指定して、RUNAWS CLIのインストールをします。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
RUN unzip awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

docker buildでイメージを作ります。イメージ名はjenkins-awscliとします。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
 ---> Running in 19158b3354aa
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Warning: Failed to create the file awscli-bundle.zip: Permission denied
  0 11.9M    0 16360    0     0  12166      0  0:17:09  0:00:01  0:17:08 12172
curl: (23) Failed writing body (0 != 16360)
The command '/bin/sh -c curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"' returned a non-zero code: 23

ファイルを作る権限がないようです…
先ほど立てたjenkinsコンテナに入ってみると、最初のカレントディレクトリが/なので、これが原因かな…?
jenkinsユーザのホームディレクトリを指定してやってみます。
Dockerfileを下記のように修正します。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN unzip /var/jenkins_home/awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

もう一度イメージを作ります。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 18351a0165be
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0   870k      0  0:00:14  0:00:14 --:--:--  978k
Removing intermediate container 18351a0165be
 ---> 0f58bb1e22df
Step 3/4 : RUN unzip /var/jenkins_home/awscli-bundle.zip
 ---> Running in 859faaa07f33
unzip:  cannot find or open /var/jenkins_home/awscli-bundle.zip, /var/jenkins_home/awscli-bundle.zip.zip or /var/jenkins_home/awscli-bundle.zip.ZIP.
The command '/bin/sh -c unzip /var/jenkins_home/awscli-bundle.zip' returned a non-zero code: 9

どうもcurlしてきたファイルが指定のディレクトリに置けていないみたいです。
試しにpwdlsをRUNで実行してみます。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN pwd
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aw

ビルドします。

docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 036df9da7fcb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0  1416k      0  0:00:08  0:00:08 --:--:-- 1822k
Removing intermediate container 036df9da7fcb
 ---> fe9b3bb14ff9
Step 3/4 : RUN pwd
 ---> Running in 5d77ba51659a
/
Removing intermediate container 5d77ba51659a
 ---> 1ac650f90bf7
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in f4fb7e4bcc50
total 20
drwxr-xr-x 2 jenkins jenkins 4096 Aug 28 13:21 .
drwxr-xr-x 1 root    root    4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins  220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins 3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins  675 May 15  2017 .profile
Removing intermediate container f4fb7e4bcc50
 ---> 46ad3e98188b
Successfully built 46ad3e98188b
Successfully tagged jenkins-awscli:latest

カレントディレクトリは/で、/var/jenkins_home/にはやはりファイルが置かれていないようです…
curlの-o以降が認識されていないのでは?」と指摘をもらったので、ローカルでzipファイルをcurlして、COPYで置くことにしてみます。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルドしてみると、zipファイルが置けています。

% docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  12.52MB
Step 1/3 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/3 : COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
 ---> 9b0dccab7709
Step 3/3 : RUN ls -al /var/jenkins_home/
 ---> Running in 8233fb5290c3
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:30 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
Removing intermediate container 8233fb5290c3
 ---> 82c3c1da2556
Successfully built 82c3c1da2556
Successfully tagged jenkins-awscli:latest

unzipのコメントアウトを外してイメージを作り直してみます。
解凍先も指定しました。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN unzip /var/jenkins_home/awscli-bundle.zip -d /var/jenkins_home/
# lsでファイルがあることを確認
RUN ls -al /var/jenkins_home/
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルド〜

~~~  
Archive:  /var/jenkins_home/awscli-bundle.zip
  inflating: /var/jenkins_home/awscli-bundle/install
  inflating: /var/jenkins_home/awscli-bundle/packages/virtualenv-15.1.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/argparse-1.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.25.3.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/colorama-0.3.9.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-5.1.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/rsa-3.4.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/docutils-0.15.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/s3transfer-0.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.8.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/awscli-1.16.227.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/ordereddict-1.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.6.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/jmespath-0.9.4.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/botocore-1.12.217.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/pyasn1-0.4.6.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.22.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/six-1.12.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/futures-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/simplejson-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-3.13.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/setup/setuptools_scm-1.15.7.tar.gz
Removing intermediate container 6b1fea1c92b8
 ---> 82230c66e941
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in 552c780855a0
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:36 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
~~~

…?
解凍できてるっぽいのに解凍したものがディレクトリにありません。
コンテナを立ち上げてsshして手動でunzipしてみたのですがこれは普通にできました。

まとめ

直面した問題をまとめておきます。

  • Dockerfile内でのcurlはオプションが使えない?
    => ローカルに落としてきたzipをCOPYで置くことで暫定対応。どうしてcurlでファイルを配置できないのかは謎のまま。

  • Dockerfile内でのunzipができてる風なのにできていない?
    => コンテナに入って手動でのunzipはできるので謎。解凍済みのディレクトリを丸ごとコピーしてみようかと思う。

次は解凍済みのディレクトリをCOPYで置いてやってみるところからやってみようと思います。

夏休みなのでAndroidアプリ開発に入門した

まえがき

夏休み、昨日から2日間何も用事がないので何かやってみたかったことをやろうかなと思い、Androidアプリ開発に入門しました。

1日目

1日目はこちらの本を使ってサンプルアプリを作ってみました。

たった1日で基本が身に付く!  Androidアプリ開発超入門

たった1日で基本が身に付く! Androidアプリ開発超入門

Javaは本当に少しだけかじったことがある程度、AndroidStudioは初めて触るというレベルですが、わかりやすく解説されていてちゃんと1日で終わりました。
最後の章で作成したビンゴアプリがこちらです。

章で作成する機能に履歴を削除する機能をプラスアルファでつけました。

意外とアプリって作れるんだな〜と自分の中のハードルが下がりました。

2日目

2日目は昨日のビンゴアプリの応用で、ルーレットアプリを作ろうと思い、作っています。
機能としては、名前を入力するとその中から1人選んで表示するという簡単なものです。
リセットボタンで入力した値、抽選結果のクリアもできるようにしました。

コードはこちら。

github.com

あと実装しできたらしたいな〜と思っているのが

  • 名前を表示する前にトゥルルル(ドラムロールがなりそうな感じ)なエフェクトをかけたい
  • 「今回は」「さんお願いします!」の文を雰囲気を選ぶと変えられるようにしたい
  • デザインをもう少しかっこよくしたい

なんですが、なかなか難しそうです…
今日中にどこまでいけるかな…

あとがき

アプリ開発というとなんとなくハードル高く感じていましたが、したいことをロジックに落とし込めれば案外作れるのかなと思いました。
気が向いたら他にも作ってみたいな〜と思っています。

職場のMacで寿司を流せないので家のMacにvimのpluginを入れて寿司を流す

まえがき

職場のMacがTouchbar付きのものになったので寿司を流したかったのですが、怒られそうなので家のMacvimで寿司を流して楽しみます🍣

プラグインマネージャーインストール

vimプラグインを入れるにはプラグインマネージャーが必要らしい。
入れたいプラグインリポジトリに行くと、NeoBundleと書いてあるのでNeoBundleを入れます。
インストールはREADMEに従って行いました。

github.com

curlでインストールスクリプトを取ってきて実行します。

$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
$ sh ./install.sh
Please add the following settings for NeoBundle to the top of your .vimrc file:

と表示されるので、"NeoBundle Scripts-----------------------------で始まるブロックを.vimrcに追記します。

一度.vimrcを保存して閉じて、もう一度vimを起動すると、下記のように聞かれるので、yを入力します。

Not installed bundles:  ['vimshell', 'ctrlp.vim', 'vim-colorschemes', 'vim-fugitive', 'neosnippet.vim', 'neosnippet-snippets']
Install bundles now?
(y)es, [N]o:

下の方にNeoBundle Updateのように表示されるので、しばらく待ちます。
vim操作ができるようになったら、保存して終了します。

プラグインマネージャーのインストールは終わりです。

プラグインインストール

今回入れるプラグインはこちらです。
職場のMacのTouchbarで寿司を流せないのでvimで流して楽しみます。

github.com

READMEに従って.vimrcに下記を追記します。

NeoBundle 'pocke/sushibar.vim'

set statusline=%!sushibar#sushibar()
set laststatus=2

NeoBundleで始まる行をどこに書くかで詰まりました…
call neobundle#begincall neobundle#endの間に書く必要があるんですね…

保存して閉じて、もう一度vimを起動します。

寿司が流れました!
gifとかの撮り方がわからないので貼れないのが残念ですが、操作するたびに寿司が流れて楽しげな感じになりました。

まとめ

今回作ったvimrcはこちらです。

github.com

遊び心のあるものが結構好きなので、他にも色々試してみたいと思います🍣

treeコマンドが便利な話

まえがき

ディレクトリ構成を書くことがたびたびあるのですが、いちいち記号を探すのが面倒だったのでtreeコマンドを導入しました。

treeインストール

任意のパッケージ管理ツールでインストールします。
今回はMacに入れます。

環境は下記です。

  • OS: macOS Mojave
  • OS version: 10.14.5

brewでインストールします。

brew install tree

インストール終了後、treeを実行すると…

tree                                                                                                                                                                                               [master]
.
├── README.md
├── ansible
│   ├── check-connect-host.md
│   ├── execute-playbook-specific-host.md
│   ├── execute-playbook-specific-task.md
│   ├── show-hosts-list.md
│   ├── step-execute-playbook.md
│   └── use-variable-by-lookup.md
(略)

こんな感じで出てきます。
-Lで表示するディレクトリの深さも指定できます。

tree -L 1                                                                                                                                                                                          [master]
.
├── README.md
├── ansible
├── aws
├── bash
├── git
├── linux
├── mac
├── markdown
├── network
├── nodejs
├── pip
├── terraform
├── vim
├── windows
└── yum

14 directories, 1 file

表示するディレクトリも指定できます。

tree -L 1 ./aws                                                                                                                                                                                    [master]
./aws
└── search-resources-all-region.md

0 directories, 1 file

まとめ

いちいち記号を探す面倒から解放されました…!
環境によってはむやみにパッケージをインストールできないこともあるので、その時に別の環境で実行して記号を探すという使い方もできそうです(あんまりしたくない)