カテゴリー: tech

  • go言語で設定ファイルを簡単に読み込む

    go言語で設定ファイルを簡単に読み込む

    はじめに

    go言語で設定ファイルを読み込む際、https://gopkg.in/ini.v1 というのがとても便利だったため紹介。

    これを使う事で、Configファイルに記載したパラメータを簡単にgoで使う事ができる。

    インストール

    https://gopkg.in/ini.v1

    を参考に、

    go get gopkg.in/ini.v1
    でインストールが可能。

    goでconfigファイルを読み込む

    サンプルのファイルを見ながらだと理解しやすいと思うので、コードをベースに紹介。

    読み込むconfigファイル

    [web]
    port = 443
    
    [db]
    name = oreoredb
    user = userA

     よくある形式。

    読み出すgoはこのような感じに記載

    package main
    
    import (
    	"fmt"
    	"gopkg.in/ini.v1"
    )
    
    type Config struct{
    	Port int
    	Db string
    	User string
    }
    
    var Cnf Config
    
    func init(){
    	c, _ := ini.Load("config.ini")
    	Cnf = Config{
    		Port: c.Section("web").Key("port").MustInt(),
    		Db: c.Section("db").Key("name").MustString("hogehoge.sql"),
    		User: c.Section("db").Key("user").String(),
    	}
    }
    
    func main(){
    	fmt.Printf("%v \n", Cnf.Port)
    	fmt.Printf("%v \n", Cnf.Db)
    	fmt.Printf("%v \n", Cnf.User)
    }

    結果

    $ go run read.go
    443 
    oreoredb 
    userA

    簡単に取り出す事ができた。

    詳細の使い方はこちら

    https://godoc.org/gopkg.in/ini.v1

     

    golang の新書

  • go言語でランダムな数値を出力させる

    go言語でランダムな数値を出力させる

    はじめに

    go言語でランダムな数値を出力させる

    コード

    package main
    
    import "math/rand"
    import "time"
    import "fmt"
    
    func main() {
        rand.Seed(time.Now().Unix())
        
        for i := 1; i <= 10; i++ {
            fmt.Println(rand.Intn(10))
        }
    }

    結果

    darkenergy:tmp sumito$ go run random.go
    4
    6
    3
    1
    7
    9
    3
    3
    1
    8
    darkenergy:tmp sumito$

     内訳

    rand.Intnは、randパッケージに新しい乱数を生成するとき、同じ初期化 rand.NewSource(1) を使っている。 これをUnixtimeをシードとしてあたえる事で、異なる乱数を出す事ができる。

    参考情報

    https://qiita.com/makiuchi-d/items/9c4af327bc8502cdcdce http://www9.plala.or.jp/sgwr-t/lib/srand.html

    golang の新書

  • go言語でgracefulを使ってwebサーバを立てる

    go言語でgracefulを使ってwebサーバを立てる

    はじめに

    gracefulというパッケージがあるので、これを利用することで簡易的にwebサーバを立ち上げることができる。

    これを使えばApacheやNginxを使わずとも、go言語だけでwebサーバを立ち上げることができるのでその方法を紹介。

    gracefulを利用する

     

    まずはgo get

    go get gopkg.in/tylerb/graceful.v1

    その後、.goを作成する。

    手順は README.md より抜粋

    package main
    
    import (
      "gopkg.in/tylerb/graceful.v1"
      "net/http"
      "fmt"
      "time"
    )
    
    func main() {
      mux := http.NewServeMux()
      mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        fmt.Fprintf(w, "Welcome to the home page!")
      })
    
      graceful.Run(":3001",10*time.Second,mux)
    }

    とりあえずコピペでよい。

    起動

    go run greaceful.go

    ブラウザで

    http://localhost:3001/

    へ接続

    これは非常にシンプルな例だが、API作成などに非常に役立ちそう。

     

     

  • 「かんばん」について

    「かんばん」について

    はじめに

    かんばんプロジェクトについてレクチャーを受けた。学んだことをまとめる。

    かんばんを導入することのメリット

    • タスクの可視化
    • WIPの制限
    • 流れをコントロール

    かんばん作成時のルール

    • 「かんばん」に参加しない人を作らない。
       全員に参加してもらう。
    • DoingにはWIP(Work in progress)制限を設ける。
    • WIPは人数 x 2倍からはじめて、少しづつ減らして行くとよい
       可能な限り、終わらせることを優先させる。
       次のものが空いている人は、次のものを取りに行く仕組み。
    • Doingが外的要因により進行できなくなった場合、上から別の付箋を付けてブロック状態を表示する。
      • ブロックされていることを明示させる
      • ブロックされてて手が止まっていても、WIP制限に例外を作ったり、制限を緩めたりしない。
    • 優先順は、上が高、下が低。
      • Todoだけじゃなく、Doingも基本的にこの順に並べる
    • Todoには直近のタスクだけを作る。
      • いきなり全部作ると大変なので、Todoは全部で20個に制限するなどルールを作り、なくなったら足して行くなどするのもよい。
    • 振り返りで必ず見直す

    レーンについて

    • 業務に合わせてレーンを作る。
       緊急レーンを作るケースもあり、その場合はかならず1個までというルールも併せて導入する。

    かんばんで取得すべきメトリックについて

    • 以下の日付を記入することで、それぞれのリードタイムを計測出来る。
      • Doingに入った際に「開始日」
      • Doneに入った際に「完了日」
      • デプロイ後に「デプロイ日」
    • 上記計測することで、デプロイの数がスループットになる
    • スループットを計測することで、リードタイムの平均が取得出来る。

    ふせんについて

    • 色に意味を持たせる。
      • 同じ内容で違う色を使わない。
      • 例えば、一般的なタスクを黄色
      • CSから上がってくるものはピンク
      • ブロックはオレンジ
      • 改善・リファクタリングタスクは緑など
    • 誰もがわかる見出しをつける。
      • 詳細はRedmineやJIRAとかで良い
    • フォーマットを決めて書き方の見本を書いて置くと良い。
    • 粒度は半日〜1日で終わるくらいが望ましい。
      • タスク単位ではなく、ユーザーストーリーに紐づく形が望ましい。
      • APIだけ作っても、使うフロントがあって初めてユーザに価値を提供出来る。
    • 明確に担当者が決まっているのであれば、担当者を書く

    運用上のルール

    • DoingからTodoへ基本戻さない。
      • 完了させることを優先する。
    • 次のものが空いている人は次のものを取りに行く。
    • 誰でも取りにいけるように、人依存にさせない。

    よくある質問

    どのくらいの規模に向いているのか?

    • 規模は100人超えても使っている所もあるが、人数・規模の制限はない。

    チームが2つにわかれている場合どうするか?

    • プロダクトで区切るのか。チームで区切るのかは対象・内容次第。
    • 今回は複数のプロダクトをまたいでやるケースがある為、チーム毎の方が良い。

    急ぎのバグ対応やCS問い合わせのタスクがある場合は?

    • 緊急レーンで対応するチームもある。
    • ただし1個だけといった絶対的なルールを作る。

    アナログとデジタルの共存について

    • リアルでは「ふせん」、デジタルではJIRAやredmineを使うとなると、2重管理になってしまう。
       しかし、それは仕方がないと割り切る。
       それぞれの特性を生かして使う
       アナログの方は状況の把握・見える化と優先順の調整のみ。
       細かい管理はデジタル(redmineやJIRA)で行う。

     

  • go言語でファイルを書き出す

    go言語でファイルを書き出す

    はじめに

    ファイルを開き、書き出す方法

    自分用メモ

    コード

    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    )
    
    func main() {
    
    	// file open
    	content, err := ioutil.ReadFile("main.go")
    	if err != nil {
    		log.Fatalln(err)
    	}
    	fmt.Println(string(content))
    
    	// file 書き出し
    	if err := ioutil.WriteFile("tmp", content, 0755); err != nil {
    		log.Fatalln(err)
    	}
    }

    結果

    $ ls -l /Users/sumito/go/src/github.com/GitSumito/go-sample/tmp
    -rwxr-xr-x  1 sumito  staff  306  5 14 00:00 /Users/sumito/go/src/github.com/GitSumito/go-sample/tmp
    $

     

    golang の新書

  • go言語でのstringやint、structのsort

    go言語でのstringやint、structのsort

    はじめに

    どの言語でも一発でsortするメソッドは用意されているものだが、あまり馴染みのない言語だと時間がかかるものだ。
    go言語でのsortについてまとめる。

    以下、自分用メモ。

    コード

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    func main() {
    
    	i := []int{5, 3, 2, 8, 7}
    	s := []string{"c", "a", "z"}
    
    	p := []struct {
    		Name  string
    		Point int
    	}{
    		{"AAA", 50},
    		{"BBB", 40},
    		{"CCC", 10},
    		{"DDD", 20},
    	}
    
    	// Intをsort(昇順)
    	sort.Ints(i)
    	fmt.Println(i)
    
    	// stringをアルファベット順にsort
    	sort.Strings(s)
    	fmt.Println(s)
    
    	// structをStringでsort (名前順)
    	sort.Slice(p, func(i, j int) bool { return p[i].Name < p[j].Name })
    	fmt.Println(p)
    
    	// structをIntでsort (昇順)
    	sort.Slice(p, func(i, j int) bool { return p[i].Point < p[j].Point })
    	fmt.Println(p)
    
    }

    出力結果

    [2 3 5 7 8]
    [a c z]
    [{AAA 50} {BBB 40} {CCC 10} {DDD 20}]
    [{CCC 10} {DDD 20} {BBB 40} {AAA 50}]

     

    golang の書籍

    golang の書き方ではなく、お作法を学ぶことができる良書。

  • Go言語での正規表現

    Go言語での正規表現

    はじめに

    Go言語内の文字列の判定で正規表現を使う際の“regexp”ライブラリについてまとめる

    使い方

    MatchString

    正規表現のフォーマットに沿った文字列か確認し、True/Falseを返す

    	match, _ := regexp.MatchString("b([a-z]+)a", "banana")
    	fmt.Println(match)

    結果

    true

    しかし、この書き方では複数の文字に対してチェックしたい場合、都度正規表現を書かなくてはならない。

    MustCompile

    以下の書き方をすることで正規表現の定義は一度のみでよくなる

    	r := regexp.MustCompile("b([a-z]+)a")
    	ms1 := r.MatchString("banana")
    	fmt.Println(ms1)
    	ms2 := r.MatchString("apple")
    	fmt.Println(ms2)
    	ms3 := r.MatchString("orange")
    	fmt.Println(ms3)

    結果

    true
    false
    false

    FindString

    MustCompileの中でURIを正規表現で定義し、
    FindStringで、そのルールに収まっているか確認をするという使い方もできる。
    	r2 := regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$")
    	fs := r2.FindString("/view/test")
    	fmt.Println(fs)

    結果

    /view/test

    もしヒットしない場合は、結果を返さない。

    FindStringSubmatch

    格納されるデータはスライスで入っているので、一つ一つ取り出すことも可能。

    	fss := r2.FindStringSubmatch("/view/test")
    	fmt.Println(fss[0])
    	fmt.Println(fss[1])
    	fmt.Println(fss[2])

    結果は以下の通り

    /view/test
    view
    test

     

  • AWS Solutions Architect受験記録

    AWS Solutions Architect受験記録

    はじめに

    AWS ソリューションアーキテクト(アソシエイト)を合格する事ができた。

    振り返りも兼ねて、まとめたいと思う。

    きっかけ

    4月AWS Certified Solutions Architectを取得しようと心に決めた。

    理由は以下の通り。

     

    • 入社以来ずっとインフラチームにいたが、4月からマイクロサービスを推進する別チームを担当することになった。今まで仕事を通じて学んだ事を形にしたかった。
    • インフラチームを離れると言っても、AWSを使わなくなる訳ではない。むしろ、積極的に活用する立場になる。どのような構成で設計していけば良いのか、今回の勉強で新たな視点を得たかった。
    • さらなる運用費削減の構成を学ぶ事で、ランニングコストを削減に貢献したいと思った。
    • 今から作ろうとしているシステムの構成で、ベストプラクティスを学べる事ができるかも。
    • 本試験を通じて得られる知識をチームに還元し、チーム全体のレベルをあげるキッカケが作れるかも。

    勉強前の状態

    仕事を通じ、会社のシステムをAWSへ移行するプロジェクトを担当させていただいた。

    ただし、チームで取り組んだので、自分が全てを担当した訳ではない。

    正直言うと、他のメンバーが担当したところは「そーゆーものなのかー」程度だった。

     

    チーム全員がほぼAWS未経験。2つの国を横断するサーバーをAWSに移行した話。

    このプロジェクトではクラスメソッドさんに数々の有益なアドバイスを戴いた。やっぱクラメソさんすごいよ。

    何の教材を使ってどのくらい勉強したか

    定番の黒本

    勉強時間は10時間程度だったと思う。

    この本が特に役立ったのは、S3のバケットタイプ。

    とりあえずスタンダードやGlacierを使っていたけど、それ以外のタイプはあまり詳しくなかった。

    仕事ではバックアップしたファイルをS3に格納したりしているが、今回得た知識を使って去らなくコストダウンをする事ができそうだ。

    その他、EBS最適化、DynamoDB アクセラレーター、他アカウントとの統合など参考になった。

    問題集

    とにかく隙間時間に勉強したかったので、スマホでも勉強できる教材が欲しかった。ヤフオクに売ってる380問くらい入っているのを買った。

    正直結構難しい、「このレベルが実際の試験の問題なのかも」と思い面喰らった。

    なので、とにかく正解率が9割を超えるくらいやり込んだ。おそらく20時間は費やした。

    しかし、実際の試験ではここまで難しい問題は出なかった。

    Udemy

    UdemyでAWS取得コースがあったので、セール中に買って隙間時間にやったが、小テストがスマホ(私がiPhone 7だからか?)に対応していないようで、小テストの度にPCで行なっていたが、次第に億劫になってしまい、最初の5時間程度やっただけでやらなくなってしまった。しかし、コンテンツ自体はとても良質なので、いい教材だとは思う。

    だけど、自分としてはセミナーをじっくり聞いてテストを解くというよりは、テストを先に解いて分からないところを講義を聞くというスタイルじゃないと、眠くなってしまう体質なので自分にはあわなかった。

    https://www.udemy.com/aws-associate/

    AWS Blackbeltの資料

    おそらく3時間程度。

    EC2,VPC,RDSなど、移行の時に使ったり、日々使っているものについてはザーッと流して読んだ程度。

    逆にKinesisやRedshiftは業務で使っていないので、概要を掴んだ。

    Kinesisのチューニングポイントなど、Blackbeltを目を通すだけでも有益だ。

    勉強のアウトプット

    手前味噌ながらメモをサービス毎に本ブログで書いた。

    自分があらかじめ知っていたところは記載しておらず、知らなかったところ、もしくは理解が乏しいところを読み返すためにまとめた。

    そのため、たった1行の記事もある。。

    https://tsukada.sumito.jp/category/tech/aws/aws-certified-solutions-architect-associate/

    (メモです。間違ってるところあったらごめんなさい、直します)

    実際の試験

    自分があまりに構えすぎていたのもあるかもしれないし、たまたま自分の運が良かっただけかもしれないが、難しい問題はそこまでない。

    問題は日本語でも選べるが、ちゃんと読まないと引っかかってしまうものもある。

    幸い、問題毎に日本語・英語を選べる事ができたので、自分の理解に間違っていないか、日本語・英語の両方で確認した。

    試験時間は130分もある。この確認をしても時間は十分に余った。

    試験後の感想

     

    昔Ciscoの試験やOracleの試験を受けた際は「合格・不合格」の紙はもらえたが、それがなかったので全く実感がわいてない。5営業日にメールで連絡来るらしい。

    また、試験の翌日、AWS認定サイトにログインしたら無事合格証のPDFをダウンロードする事ができた。

     

    参考情報

    AWS Solutions Architectを取得するだけでなく、AWSについて体系的に学ぶことができるのでおすすめ。

  • Trusted Advisor

    Trusted Advisor

    カテゴリーの提供情報

    • Performance
    • Cost optimization
    • Security
    • Fault torelance

     

  • ElasticCache

    ElasticCache

    Web sessionデータをリレーショナルデータベースに格納する代わりに、Amazon ElasticCacheを使用する利点

    • セッションデータの読み取り・書き込みパフォーマンスの向上
    • データベースインスタンスの負荷軽減