コマンドラインから雑に、自分のグローバルIPアドレスを取得する

開発しているときに、自分のマシンのグローバルIPアドレスを知りたくなるときがまれによくある。そんなときは↓を叩く。

curl -s ifconfig.io

ifconfig.io は自分のIPアドレスを返してくれるだけのシンプルなWebサービスで、フツーにブラウザからも見れる。

ベンリ。

「hadolint」にシバかれながら美しいDockerfileを書き上げる

hadolintとは

hadolintはDockerfile用のLintツールだ。

たとえば、下記のようなDockerfileを作って、チェックしてみる。

FROM alpine

RUN cd /tmp && echo 'hello'

すると、次のような警告をしてくれるようになる。

/dev/stdin:1 DL3006 Always tag the version of an image explicitly
/dev/stdin:3 DL3003 Use WORKDIR to switch to a directory
続きを読む

「ECS Fargate」をAWSマネジメントコンソールで構築すると何が起きるか

ECS Fargate

Dockerコンテナを管理してくれる君。Fargate起動タイプを選択すると、クラスタのEC2の管理が不要になる。ひゃっほーい。詳細は、公式ドキュメントを参照する。

AWSマネジメントコンソールによる構築

とりあえず、動かしてみるぐらいだったら、ポチポチしていくだけでOK。VPCなど、ECSに必要なコンポーネントはCloudFormationでついでに構築してくれる。

続きを読む

「ShellCheck」を使って、メンテナンス性の高いシェルスクリプトを実装する

ShellCheckとは

ShellCheckは、シェルスクリプトの静的解析ツールで、マズい書き方をしてると怒ってくれるLinterだ。

たとえば、example.sh という下記のシェルスクリプトがあるとしよう。

echo $0

これをShellCheckでチェックすると、こんな警告を出してくれる。

In example.sh line 1:
echo $0
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
     ^-- SC2086: Double quote to prevent globbing and word splitting.

この例では、「shebangを書け」「変数使うときはダブルクォート使え」的な指摘をしてくれる。

続きを読む

「cli-highlight」で無味乾燥なターミナル表示をカラフルに

cli-highlightとは

cli-highlightはターミナルでもエディタのように、シンタックスハイライトをしてくれるツールだ。

無味乾燥なターミナルがとっても見やすくなる。

Before

なんの面白みもない表示。

f:id:tmknom:20180930183031p:plain

After

とってもカラフルで見やすい!

f:id:tmknom:20180930183044p:plain

続きを読む

GitHubのWikiをマークダウン形式で取得する

背景

ときどき、GitHubリポジトリで、ツールの使い方などがバージョン管理されたファイルではなく、Wikiに書かれていることがある。

ブラウザから参照することも可能だが、このWikiで書かれたテキストをマークダウンで取得したくなるときがまれによくある。

GitHub API

とりあえず、GitHub APIでなにか提供されていないか調べるのが王道だろう。

で、調べてみたのだが、なんとWikiに関するAPIが一切存在しない。おぉ、マジか。

curl

じゃあ、curlで適当なURL叩いたら取れないかと思い試行錯誤したら取れた。

curl -s https://raw.githubusercontent.com/wiki/<user>/<repo_name>/<title>.md

たとえば、jqコマンドのWikiのページを取得するときはこんな感じ。

curl -s https://raw.githubusercontent.com/wiki/stedolan/jq/Home.md

タイトルに空白が含まれる場合は、ハイフンで置換すればいい。たとえば、Advanced Topicsのページはこうなる。

curl -s https://raw.githubusercontent.com/wiki/stedolan/jq/Advanced-Topics.md

git clone

余談だが、Wikiの内容はgit cloneすることができる。

git clone git@github.com:<user>/<repo_name>.wiki.git

さきほど同様、jqコマンドのWikiを例にするとこんな感じ。

git clone git@github.com:stedolan/jq.wiki.git

どういうときに必要になるのか分からないが、何かのときに使えるかもしれない。

雑にシェルスクリプトのみを一覧取得するコマンド

ファイル名に拡張子 .sh が付いていれば見つけるのは簡単だが、拡張子なしのファイルも見つけたかったので、試行錯誤をメモ。

最初に結論

$ grep '^#!' -rn . | grep ':1:#!' | cut -d: -f1 | grep -v .git

試行錯誤

shebangで検索

$ grep '^#!' -rl .

行頭が #! ではじまるファイルを探している。

あんまりこれで困らないと思うが、欠点も存在する。一行目ではなく、ファイルの途中に #! があっても拾ってしまうのだ。

一行目のみに絞り込む

$ grep '^#!' -rn . | grep ':1:#!' | cut -d: -f1

最初のgrepで行番号も出力している。たとえば、こんな感じで出力される。

$ grep '^#!' -rn .
./install:1:#!/bin/sh
./README.md:33:#!/bin/sh
./hooks/build:1:#!/bin/bash

そして、 :1:#!grepかけて、一行目に含まれているファイル一覧に絞り込む。

$ grep '^#!' -rn . | grep ':1:#!'
./install:1:#!/bin/sh
./hooks/build:1:#!/bin/bash

最後にファイル名だけ取り出す。

$ grep '^#!' -rn . | grep ':1:#!' | cut -d: -f1
./install
./hooks/build

.gitを除外

$ grep '^#!' -rn . | grep ':1:#!' | cut -d: -f1 | grep -v .git

git 管理してるディレクトリ配下で実行すると .git ディレクトリ内も検索してしまう。そこで、単純に -v オプションで .git ディレクトリ配下を除外する。

おまけ:Makefile内で使う

最初、Makefileで定義するにあたって、普通にshell関数内で実行して、その結果を変数に格納していたが、なぜかshell関数は、実行結果の改行を空白に置換してしまって困った。

仕方ないのでマクロ定義して、それを呼び出すことにした。

define list_shellscript
    grep '^#!' -rn . | grep ':1:#!' | cut -d: -f1 | grep -v .git
endef

で、使うときはこんな感じ。

$(call list_shellscript)

xargsと組み合わせるときも、こんな感じで書ける。

$(call list_shellscript) | xargs -I {} echo {}

Makefileはフツーのシェルスクリプトとは異なる挙動をするので、なかなかにムズイ。