趣味グラマーが5日で5個GitHubリポジトリを作ってみた

　趣味グラマーですが、GitHub リポジトリを5個作ってみました。せっかく作ったので誰かしらに見てもらえたら嬉しいなということと、初心者が GitHub を始める敷居を下げられたらいいなという思いで Qiita 投稿してみます。

※ ちなみに普段は運用系のお仕事をしているので、一応 IT 系ではあります。

## GitHub のリポジトリってどうやって作ればいいんですか？
　わかります、、、その疑問。でも大丈夫！そこは親切な GitHub さんなので、新しくブラウザからリポジトリを作ると以下みたいな画面を出してくれます。画面のとおりにコマンドを実行すると、作ったリポジトリに push（アップロード）してくれます。

![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606756/904ba1f9-70ba-da7e-0b99-1954d163c856.png)

そもそも Git がよくわからない！という人は、ひとまず git init 等のコマンドを、プロダクトを作ったディレクトリ上で実行してみると、イメージがつかめると思います。そのうえで、Git は別途勉強されたほうがいいかもしれません（私もadd / commit / pushしかわかりませんが、、、）。

- Git の参考 URL: https://backlog.com/ja/git-tutorial/

## なんで GitHub を始めたんですか？
　プログラマーかっけえ、GitHub かっけぇ、スター貰えたらすげぇ、というだけの精神です。

また、運用のお仕事をしていると技術的な知識は多少つくので、その知識を使ってなにか作ってみたいなぁと思いました。

Git については add / commit / push の知識がおぼろげにある程度だったので、GitHub は少し遠い存在だったのですが、公開するだけならそんなに難しくないことがわかってよかったです。

## 作ったもの（宣伝）
　タイトルどおり、5個のリポジトリを作ってみました。それぞれ順々に宣伝していきます！
  
### [dtmu/ut](https://github.com/dtmu/ut)
Unix time と通常の日時（UTC）を変換するツールです。以下のように使用します。Unix timeはミリ秒単位で扱います。

```
$ ut 2020-03-18 1:25:00.123
1584494700123

$ ut 1584494700123
2020-03-18 1:25:00.123
```

### [dtmu/gip](https://github.com/dtmu/gip)
現在使用しているグローバル IP アドレスを取得します。以下のように使用します。外部サイトをスクレイピングしたりして取得しています。

```bash
$ gip
12.34.56.78
```

### [dtmu/ppp](https://github.com/dtmu/ppp)
インスタント的に使える Web サーバーです。以下のように使用します。

```bash
# ポート 80 で "/" にて待受けする Web サーバー起動
$ ppp

# 何も指定しないと、定形のJSONが返ります。
$ curl localhost
{"Message":"Hello ppp!"} 

# HTTP リクエストヘッダーが出力されます。
$ ppp
Request Header
* 2020-03-20 22:04:03.915
< User-Agent: curl/7.58.0
< Accept: */*
```
待受ポートや定型文を変えることができるほか、リクエストの応答までに遅延（sleep）を発生させることもできます。色々機能を追加する予定です。

### [dtmu/eniha](https://github.com/dtmu/eniha)
AWS のルートテーブルを使った HA クラスター作成用の Go ライブラリ（フェイルオーバー機能のみ）です。

ルートテーブルでは CIDR の向け先を特定の ENI に向けることができますよね。プロキシや VPN を使用している場合などでありそうです。以下はその例です。

```
192.168.24.0/24 => eni-XXXXXXXXXXXXXXX
```

こういう場合、eni-XXXXXXXXXXXXXXX が死んだときに eni-YYYYYYYYYYYYYYY へフェイルオーバーしたいことがあると思います。

```
192.168.0.0/24 => eni-XXXXXXXXXXXXXXX
|
| failover!!
V
192.168.0.0/24 => eni-YYYYYYYYYYYYYYY
```
- 参考 URL: http://aws.clouddesignpattern.org/index.php/CDP:Routing-Based_HA%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

そのときに使うライブラリが dtmu/eniha です。長くなりました。実装例は以下のような感じです。なお、このライブラリはフェイルオーバーの実行のみなので、トリガ等は別途用意する必要があります(ping 監視、CloudWatch 監視などがあるかなと思います。)

```go
import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/dtmu/eniha"
)

func main() {
	c := eniha.Cluster{
		RouteTableId: "rtb-AAAAAAAAAAAAAAA",
		CidrBlock:    "192.168.0.0/24",
        // クラスターに使用する ENI の ID を優先順に指定します。
        // フェイルオーバー前に ENI が正常か評価する判定を func として追加します（正常な場合は nil で返す）。
        // この例では、ENI が正常かの評価を実施しないので、現在の ENI でないもののうち、一番優先度の高いものに無条件でフェイルオーバーする設定です。
		Enis: []eniha.Eni{
			{
				"eni-XXXXXXXXXXXXXXX",
				func() error {return nil} ,
			},
			{
				"eni-YYYYYYYYYYYYYYY",
				func() error {return nil},
			},
		},
	}
    // AWS SDK で使うセッション情報は利用者が設定する必要があります。
	s := session.New(&aws.Config{
		Region: aws.String("ap-northeast-1"),
	})
    // FailOver でフェイルオーバーが試行されます。
	result := c.FailOver(s) 
	if len(eniha.GlobalErrors) != 0 {
		// eniha.GlobalErrors というグローバル変数に []errors の形でエラーが格納されます。
		fmt.Println(eniha.GlobalErrors)
		return
	}
    // ENI の ID の before / after が Map[string]stringで返ります。
	fmt.Println("failover: " + result["before"] + " => " + result["after"])
}
```
バグ等あったら教えてください。まんま使わなくても、中身見ていただいて、コピって使っていただいてもOKです。

### [dtmu/xgo](https://github.com/dtmu/xgo)
これは駄作です。。。クロス環境のバイナリを生成するツールですが、色々欠陥があるので、[mitchellh/gox](https://github.com/mitchellh/gox) を使ったほうがいいでしょう。

## どうして Go 言語なんですか？
　CLI ツールを作りやすかったり、何かとシンプルで開発に集中できる点がいいと思いました。趣味グラマーにおすすめだと思います。

以上、ここまで読んでいただき、ありがとうございました。作り出すと意外とハマりましたので、また色々量産していきたいと思います。