20210612のGoに関する記事は4件です。

新卒エンジニア研修【2ヶ月間でやったこと】

ベストベンチャー100に選ばれている企業に勤めております。 新卒研修の振り返りで2ヶ月間(4~5月)でやったことを残します。 4月第1週 総合職研修 - PDCA - タスク管理 - ビジネスマナー 4月第2週 開発手法 スクラム開発 1スプリントを繰り返す開発手法 1スプリントは、スプリントプランニング、デイリースクラム、スプリントレトロスペクティブ、スプリントレビュー クラウドネイティヴ クラウド技術を最大限活かそうという考え方 開発スピードの向上、属人化を防ぐ、品質向上などの利点がある 開発ステージについて ローカル開発環境 テスト環境(プログラムが動くかどうかの確認) ステージング環境(本番環境の検証のための環境) 本番環境 Laravel環境構築 Docker for M1 Mac、Workbenchのインストール PHP基本構文、DB、 4月第3週 [チーム・個人]におけるKPI(key performance indicator)について 目標を達成するために必要なアクティビティ べロシティ →ストーリーポイント(タスクの難易度)をどれくらいこなしたか デプロイ回数 →お客さんにどれだけデリバリーできたか サーバー応答速度 → ブラウザの速度 工数・工期予実達成率 開発フローについて テスト設計 テストケース作成 単体テスト 結合テスト 総合テスト UAT (User Acceptance Testの略) 目標設定 基本的には上長がこの1年間で期待していることを目標に定めた。 サービス全体像の理解やサービスアーキテクチャの理解、他部門からの依頼処理など ソフトウェアのテスト技法 の輪行開始 テストファーストな考え方を知る。 バグが出て修正する時間の方が勿体無い。 良いコードとは。 可読性 保守・運用のしやすさ 昔は少ないコード、処理速度に重点を置いていた(CPUやメモリの関係) - ブラックボックステスト(要件定義署や仕様書に合っているか確認するテスト手法) 同値クラステスト 境界値テスト -ディシジョンテーブルテスト ペア構成テスト 状態遷移テスト ドメイン分析テスト ホワイトボックステスト(パスや処理の流れなどプログラム内部に沿ったテスト手法) 制御フローテスト データフローテスト テストの終了条件 テストログ、テスト不具合レポート エビデンス、ログを示す、再現手順がしっかりと書かれているかが大事。 xdebugを入れてPHPUnitを実行 正直、テストに関しては実際に作成&実践してみないと実感がわかない。 Dockerコマンド docker-compose build docker-compose up docker-compose down docker-compose exec アプリ名 シェル Laravel ディレクトリ構造 MVCモデル artisan コマンド 4月第4週 CI/CDについて CI(各開発者の作業結果を自動的に統合、単体テストや結合テストの自動化) CD(開発物を素早くユーザに供給する) AWSについて ELB ECS Lambda Cloudwatch S3 DynamoDB ECR Fargate Athena QuickSight GAS(Google Apps Script)環境構築 Golang デバッグ環境構築 5月第1週 Google チャットbot開発。新規入会者数を決まった時間に通知する。 使用した技術 Golang, CloudWatch、Lambda、APIGateway、DynamoDB  所感 静的言語型付け言語を初めて触った。構造体やポインタの概念など改めて勉強になった。Golangの醍醐味である並列処理などは行っていないので、暇があったらやってみたい。 5月第2週 記念日Slack通知bot開発 スプレッドシートから記念日を取得し、Slackに通知する。 要件定義から、運用計画、デモまで行った。 使用した技術 - GAS、SlackAPI 所感 開発したBotが初めて動いた時(エンジニアの誕生日を祝った)はとても嬉しかった。今後も社内で運用していくので、より良いサービスに改築していきたい。 5月第3週~4週 Github活動見える化 リポジトリ情報(プルリクやレビュー情報など)を大量に取得し、Amazon QuickSightでデータの可視化を行う。 使用した技術 - Golang、ECS、ECR、Fargate、athena、QuickSight、Github API 所感 チームや個人の貢献度を測るための指標づくりの一環として開発を行った。ビッグデータ の取得やBIツールを使った分析方法を学べたのはよかった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go!】Golang環境構築~Mac(M1チップ)で~【Go!】

はじめに Mac(M1チップ)環境でGolangの環境構築していきます。 goenvでの構築のやり方で進めていきます。 色々試行錯誤しましたが、goenvで導入した場合、最新版の1つ下のバージョンまでしかインストールできませんでした。 VScodeをいじってるときに最新版じゃないよってアップデート急かされるので、結局公式HPで最新版インストールすることにしました。 まぁもしgoenvに変えたいときでもやり方はわかったので。goenvの導入方法も記しておきます。 goenv?????? goのバージョン管理を行うためのツールです。 プロジェクト毎に、goのバージョン指定できます。 (ぼくはバージョン違う場合はDockerで仮想環境作っちゃうかも。。。) Pythonでいうpyenv、Rubyでいうrbenv。。。 環境構築 公式からGolangインストール ここのリンクからインストール 下の方にarm版があるのでこれをインストールする。 arm版でないとVScodeでデバッグできないので必ずarm版で! PATHを指定する必要なし。 下のVScodeで実践!の項目まで飛ばしてください! goenv導入 goenvで導入してみたがgoenvでインストールできる インストール homebrewでもできるけどバージョンが低いのでこっちでインストール。 $ git clone https://github.com/syndbg/goenv.git ~/.goenv PATHを通す まだbash使ってる方は~/.zshenvの部分を~/.bash_profileにしてもらえば^^; $ echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc $ echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc $ echo 'eval "$(goenv init -)"' >> ~/.zshrc $ source ~/.zshrc バージョン確認 表示されればOKです! $ goenv -v goの設定 インストール インストールできるバージョンの一覧を表示 $ goenv install -l $ goenv install バージョン 使用するバージョンの設定 $ goenv global バージョン 特定のディレクトリ内だけのバージョン設定 $ goenv local 1.16.0 バージョン確認 これで指定したバージョンが表示されればOK! $ go version PATHを通す bashの方は~/.bash_profileに。 $ echo 'export PATH="$GOROOT/bin/$PATH"' >> ~/.zshrc $ echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshrc $ source ~/.zshrc VScodeで実践! 環境構築 今回はテストフォルダを作ってその中で作業を進めていきます。 # 任意のディレクトリで $ mkdir test $ cd test $ touch main.go $ code . で、VScodeが開かれます。 goの拡張機能インストール shift + command + pでgo: install/update tools入力 左上のチェックで全チェックでOKボタン。 全部SUCCESSEDしたらで完了。 goファイル修正 main.go package main import "fmt" func main() { msg := "hello world" fmt.Println(msg) } 起動確認 $ go run main.go mod作成 作業ディレクトリ内でgo.modを作成します。 go mod init フォルダ名(プロジェクト名) 今回はtestなのでコレ $ go mod init test go.modというファイルが生成されました。 ブレークポイント main.goにブレークポイントを置きます。 デバッグ これでmsgの中身が見れたりして今どういう状態か把握することができます。 使い方は色々いじってみてください! まとめ とりあえずGo入れてみたわけですが、色々基礎的なサイトとか覗いてみました。 これ!Cだ!!! Printf、Println懐かしい!!!でも末尾にセミコロンはいらないみたいだ。 元々SE時代にC#やってたぼくにはもしかするとrubyよりGoの方が合っているのでは!? rubyやってて動的型付けで解せぬ部分もあったしな〜。 静的型付け言語万歳!!! 変数のところ指すと型わかるっぽい。 C言語が元になってるならシステム系でも使えんのかな? てかこれMac必要なくなるのでは?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go!】Golang環境構築~Macで~【Go!】

はじめに Mac(M1チップ)環境でGolangの環境構築していきます。 goenvでの構築のやり方で進めていきます。 goenv?????? goのバージョン管理を行うためのツールです。 プロジェクト毎に、goのバージョン指定できます。 (ぼくはバージョン違う場合はDockerで仮想環境作っちゃうかも。。。) Pythonでいうpyenv、Rubyでいうrbenv。。。 環境構築 goenv導入 goenvで導入してみたがgoenvでインストールできる インストール homebrewでもできるけどバージョンが低いのでこっちでインストール。 $ git clone https://github.com/syndbg/goenv.git ~/.goenv PATHを通す まだbash使ってる方は~/.zshenvの部分を~/.bash_profileにしてもらえば^^; $ echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc $ echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc $ echo 'eval "$(goenv init -)"' >> ~/.zshrc $ source ~/.zshrc バージョン確認 表示されればOKです! $ goenv -v goの設定 インストール インストールできるバージョンの一覧を表示 $ goenv install -l $ goenv install バージョン 使用するバージョンの設定 $ goenv global バージョン バージョン確認 これで指定したバージョンが表示されればOK! $ go version PATHを通す bashの方は~/.bash_profileに。 $ echo 'export PATH="$GOROOT/bin/$PATH"' >> ~/.zshrc $ echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshrc $ source ~/.zshrc Hello World! main.go package main import "fmt" func main() { fmt.Printf("Hello world\n") fmt.Println("Hello World"); } $ go run main.go デバッグ Delve Debuggerインストール $ git clone https://github.com/go-delve/delve $ cd delve $ go install github.com/go-delve/delve/cmd/dlv バージョンが1.16以降だとlatestでインストールできる。 $ go install github.com/go-delve/delve/cmd/dlv@latest バージョン確認 $ dlv version まとめ とりあえずGo入れてみたわけですが、色々基礎的なサイトとか覗いてみました。 これ!Cだ!!! Printf、Println懐かしい!!!でも末尾にセミコロンはいらないみたいだ。 元々SE時代にC#やってたぼくにはもしかするとrubyよりGoの方が合っているのでは!? rubyやってて動的型付けで解せぬ部分もあったしな〜。 静的型付け言語万歳!!! てかこれMac必要なくなるのでは?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Golang で標準出力テストの方法の調査

Golang で標準出力テストの方法の調査 最近Golangで標準出力をテストする際にどのような方法を取れば良いのか情報も少なく、しばらく迷走していたので、ここで一旦メモとしてまとめておく。 標準出力をテストする方法を模索した結果 今回調査した方法は主に以下の2つ os.Pipe() を駆使して出力先を切り替えて値をキャプチャする Testable Examples を利用する os.Pipe() を駆使して出力先を切り替えて値をキャプチャする まず初めに、標準出力を受け取る関数を定義して、出力先を切り替えて値をキャプチャする方法が妥当であろうと考え、以下のような共通関数を定義して呼び出すことにしました。 func PickStdout(t *testing.T, fnc func()) string { t.Helper() backup := os.Stdout defer func() { os.Stdout = backup }() r, w, err := os.Pipe() if err != nil { t.Fatalf("fail pipe: %v", err) } os.Stdout = w fnc() w.Close() var buffer bytes.Buffer if n, err := buffer.ReadFrom(r); err != nil { t.Fatalf("fail read buf: %v - number: %v", err, n) } s := buffer.String() return s[:len(s)-1] } この PickStdout 関数の冒頭で t.Helper() を呼ぶと $ go test の結果に関して失敗の箇所を具体的に示してくれるので、本来のテストに原因があるのか、この関数自身に問題があるのか、原因の切り分けを行うことができます。 os パッケージの os.Stdout には標準出力が格納されているので、まず本来の値をバックアップとして、 変数 backup に格納します。 os.Pipe() で reader と writer を生成します。 そして 標準出力の出力先を os.Stdout から writer に切り替えます。 r, w, err := os.Pipe() if err != nil { t.Fatalf("fail pipe: %v", err) } os.Stdout = w バグに繋がるので、きちんとエラーを受けることを忘れないようにしましょう。 引数から受け取った関数を呼び出します。 fnc() その後 writer を close します。 w.Close() 次に書き込んだ出力を読み取ります、読み取りのためのバッファを定義します。 var buffer bytes.Buffer stdin と stdout はどちらも bytes.Buffer 構造体を生成しています。 この構造体を変数bufferとして宣言します。 buffer に reader で読み取った値を格納します。 bytes.Buffer 構造体から標準出力の値を引っ張ってきます。 if n, err := buffer.ReadFrom(r); err != nil { t.Fatalf("fail read buf: %v - number: %v", err, n) } バグに繋がるので、きちんとエラーを受けることを忘れないようにしましょう。 取得した値はbyteデータなので String() で文字列に変換し、変数 s に格納します。 ここで、末尾に余計な改行が追記されていることが確認できると思います。 fmt.Print(s) Pipe を使用した際に buffer 末尾に改行が追加される問題の対処のため返り値のスライスの末尾を除去します。 s[:len(s)-1] 最後にこれは遅延評価関数として定義しているが、バックアップしていた標準出力を元に戻すということをここで行なっています。 defer func() { os.Stdout = orgStdout }() この方法をとるメリットとしては、大量のテストデータを使ってテストする際に効果を発揮するのではないでしょうか。 ある程度自由度が高いことが挙げられると思います。 ちなみに playground でもなんと test を記述、検証できます。 この例を検証してみたのでここで動作を確認できます。 PickStdout↓ Testable Examples を利用する とにかく手軽にテストができます。 これは testing パッケージに含まれている機能です。 実行例をそのままテストコード内に記述できるので大変便利です。 ただいくつか記述に制約があります。 関数名の先頭に必ず Example という文字列を含めなければならない 期待する出力データを表現するには // Output: からコメントとして記述する必要がある 以下記述の簡単な例です。 func printTest() { for i := 0; i < 3; i++ { fmt.Println(test + string(i)) } } func ExamplePrint() { printTest() // Output: // test0 // test1 // test2 } 実際に playground で実行してみるとその手軽さが実感できると思います。 この例も playground で検証しています。 Testable Examples↓ また同じ要領で準不同な結果に対してもマッチさせることができる Unordered output という機能もあります。 Unordered output↓ このように一見万能に見える Testable Examples ですが、検証したいデータが大量にある&&頻繁にデータを更新するような環境 では使い勝手あまり良くないというデメリットがあると思います。 また、1関数内に1 // Output: しか記述できないので、あまり複雑なことはできません。 シンプルゆえに使い所を意識する必要があると思います。 今回の場合は同じprintTest関数に対してのテストでしたがこの場合は明らかに Testable Examples を使うべき状況であるということが分かると思います。 PickStdout↓ Testable Examples↓ 最後に Golangは強力なテストライブラリが標準パッケージで提供されているのでついつい簡単なコードに対しても test を書きたくなるような不思議な魅力がありますよね。 今回は簡単な調査でしたが、今後も継続してより Go らしい test の書き方を模索していきたいと思います。 参考文献 「Golang で標準出力をテストする」https://oden77.hatenablog.com/entry/2020/01/31/233532 「I/O を伴うテストには bytes.Buffer が便利」 https://qiita.com/yuya_takeyama/items/c4211fa77488cb6915ec みんなのGo言語【現場で使える実践テクニック】 松木 雅幸 他 技術評論社
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む