さて、昨日Goを使ってクイックソートを書いてみましたが、実際に計算量がO(nlogn)になっているかを確認する為に時間を計測してみることにします。
要素数を10,000から50,000まで変更させて、それぞれ5回計測した値の平均を取ります。
比較用にバブルソートも書いて同様に測定をしました。結果は以下のとおりです(単位はmsec)。
要素数 | 10000 | 20000 | 30000 | 40000 | 50000 |
バブルソート | 253.61 | 1017.46 | 2279.73 | 4065.23 | 6406.17 |
クイックソート | 9.00 | 20.40 | 30.20 | 47.60 | 60.60 |
バブルソートは要素数10,000→20,000→40,000となるにつれて時間は約4倍になっているのでO(n^2)になっていると言って良いでしょう。
一方クイックソートは要素数10,000→20,000→40,000となるに従い、時間は2倍ちょっとになっているので、O(nlogn)になっているものと思われます。
と言うかクイックソート早いな。あんな適当に書いたコードでも結構早い。
続いて、Goを使ってAWSを操作してみます。
今回Goを勉強する理由の一つとして、AWSをスクリプトで扱えるようにしたいというものがありました。
もちろんCLIやPython、Javaのような他の言語でもAWSは操作できますが、Goは動作が軽いと聞いたので是非ともGoでやってみたいと思っていました。
まずAWSのパッケージを使うにはGITの導入が必要らしいので、以下のURLから入手してインストール。
https://git-scm.com/download/win
で、実際に使用する際には、
>set GOPATH=<適当なフォルダ、Goの実行フォルダで良い?> >go get -u github.com/aws/aws-sdk-go >go run aws.go
で実行できるっぽい。
個人的に一番ハマったのは認証部分で、Linuxだと~/.aws/credentialsにアクセスキー情報を書けば良いのですがWindowsだとどこに書けば良いのか分かりませんでした。
その後色々と調べた結果、環境変数にアクセスキー情報を書けば良いことが判明。
>set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx >set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxx
こんな感じでOK。
やり方が分かったら後はコードを書く。
使えるAPIの仕様(特に引数や戻り値)は以下のリファレンスを参照しました。
http://docs.aws.amazon.com/sdk-for-go/api/
今回作成したコードは以下の通りです。
ファイル名:aws.go
package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/iam" ) const ( ) func main() { svc := iam.New(session.New(), &aws.Config{}) resp, error := svc.ListUsers(nil) if error != nil { panic(error) } fmt.Println("> Number of reservation sets: ", len(resp.Users)) for i := 0; i < len(resp.Users); i++ { fmt.Println("UserNo: ", i) fmt.Println("UserName : ", *(resp.Users[i].UserName)) fmt.Println("Arn : ", *(resp.Users[i].Arn)) fmt.Println("CreateDate : ", *(resp.Users[i].CreateDate)) fmt.Println("UserId : ", *(resp.Users[i].UserId)) fmt.Println("Path : ", *(resp.Users[i].Path)) } }
IAMでユーザ一覧を取ってくるだけの内容です。最初APIの使い方が分からず苦労しましたが、書いてしまえばとっても簡単。
実行結果は以下のとおり。
>go run aws.go > Number of reservation sets: 1 UserNo: 0 UserName : TECRA Arn : arn:aws:iam::<アカウントID>:user/TECRA CreateDate : 2016-05-04 13:19:28 +0000 UTC UserId : <ユーザID> Path : /
ちゃんとユーザ情報を取ってくる事ができました。
そんなわけで、今日はこれまで。
それでは、ごきげんよう。