- 1. Go Generics & AtCoder 入門 : 最大・最小・総和を求める
- 2. Golangのパッケージではまってしまった メモ
- 3. (WIP) A Tour of Go をやってみる
- 4. Goのfor文で詰まった話
- 5. golangでsnake game作ってみた
- 6. Golang + aws cli + aws sam cli のDevContainerを構築してみた
- 7. aws-sdk-go経由で AWS bedrock / Stable Diffusionで画像生成するメモ
- 8. 手を動かしながら学ぶクリーンアーキテクチャ
- 9. GoでWebアプリケーション
- 10. Web開発初学者と学ぶCleanArchitecture
- 11. Agora SDKでリアルタイムコミュニケーション
- 12. 【Go言語】Go言語基本型
- 13. golang+reactなアプリの開発環境をモノレポで作る
- 14. 【Oracle DB】DATE型のカラムに日付をINSERTすると、ORA-01861: literal does not match format stringとなる
- 15. Goのキャスト
- 16. DBを2回呼び出すのと処理をまとめて1回で済ませた時のパフォーマンス比較
- 17. 【Go】環境ごとの設定値管理
- 18. やっぱギャンブルはやべぇなってことを学ぶためにコイントスを作るなど
- 19. logパッケージの定数を出力する
- 20. Go言語向けNCMB SDKの使い方(配列の追加・削除操作)
Go Generics & AtCoder 入門 : 最大・最小・総和を求める
# AtCoderの言語アップデート
8月にAtCoderの提出言語アップデートが来ました。これにより、AtCoder上ではGo言語は1.20.6となり、C++はC++23となるなど、様々な新機能が使えるようになりました。
(詳しくは、AtCoderの[使用できる言語とライブラリの一覧](https://img.atcoder.jp/file/language-update/language-list.html)と[スプレッドシート](https://docs.google.com/spreadsheets/d/1HXyOXt5bKwhKWXruzUvfMFHQtBxfZQ0047W7VVObnXI/edit#gid=0)を確認していただければと思います)Go言語は1.18にGenericsが追加されました。
さらに、1.20でComparable等のinterfaceが追加されるなど、Go言語でAtCoderを取り組む上でコード管理が非常に簡単になりました。本記事では、AtCoderの問題を1つ取り上げ、GoのGenericsを使って解いていこうと思います。
# 今回取り
Golangのパッケージではまってしまった メモ
Go言語のパッケージの勉強していたところ、main.goからその下の配下のgoファイルをインポートできずにエラーが発生しました。
検索してググり、ググり・・
分からなくて、ChatGPT先生に相談したり・・・。
Goのバージョンによりライブラリ配下importのパスなどの設定が異なることが原因らしい。
GOPATHの配下にディレクトリを作りました。
C:\Users\ユーザー名\goの下にディレクトリを作成して
そこにmain.goファイルを作りその下にディレクトリを作り、その中に読み込みたいgoファイルを作成。そして初期化
““
PS C:\Users\ユーザー名\go\awesomeProject> go mod init awesomeProject
go: creating new go.mod: module awesomeProject
go: to add module requirements and sums:
go mod tidy
““
ディレクトリ構成はこんな感じです。
![スクリーンショット 2023-10-02 045219.pn
(WIP) A Tour of Go をやってみる
# Overview
Golang のキャッチアップの為、A Tour of Go に取り組む。A Tour of Go:
https://go-tour-jp.appspot.com/list
# Using the tour
https://go-tour-jp.appspot.com/welcome/1チュートリアルの説明が記載されている
# Packages, variables, and functions
## For loop
https://go-tour-jp.appspot.com/flowcontrol/2> 初期化と後処理ステートメントの記述は任意です。
初期化と後処理ステートメントを記述しない場合、条件式の前後にセミコロンをつける、つけないは選択可能
OK:
“`go
for ; 条件式; {
…
}
“`OK:
“`go
for 条件式 {
…
}
“`## If statement
https://go-tour-jp.appspot.com/flowcontrol/5
If stat
Goのfor文で詰まった話
# 詰まった点
user.NameでUser構造体のNameフィールドを書き換えているのに変更が正しく反映されない…
## ソースコード
“`go
package mainimport “fmt”
type User struct {
Name string
Age int
}func main() {
users := [3]User{
{“Alice”, 25},
{“Bob”, 30},
{“Charlie”, 22},
}for _, user := range users {
user.Name = “太郎”
}for _, user := range users {
fmt.Println(user.Name)
}
}
“`## 実行結果
“`
Alice
Bob
Charlie
“`# 原因
定義された`User構造体の配列の要素`とfor文で回されている`User構造体の配列の要素`は実はメモリ内ではそれぞれ別の場所に保持されている、つまり全く別の変数として扱われているため# 対処法
golangでsnake game作ってみた
普段から業務でGoを書いているのと、
最近ebitengineというGoでも簡単に2Dゲームを作成できるゲームエンジンを知ったので、
Goの勉強がてらsnake gameを作成してみることにしました。https://ebitengine.org/ja/
初めてのゲーム作成なので少し難しかったのですが、わかりやすいチュートリアルがあったので、以下の記事を参考にして理解しながら進めました。
自分はinterfaceやメソッドの使い方に慣れていなかったので少し勉強しながらでしたが、
Go言語を普段から書いている方であればすぐに理解できるかもです。https://kusingh.hashnode.dev/building-snake-game-in-golang-complete-guide
こんな感じで動きます
![画面収録 2023-10-01 14.39.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953754/1ff7a9aa-bd89-1004-ce71-705351dbff
Golang + aws cli + aws sam cli のDevContainerを構築してみた
# はじめに
やろうとおもったきっかけ
https://www.udemy.com/course/bitcoin-lambda-golang/
このUdemy講座を見ていて、Golang、aws cli、aws sam cli をインストールするセクションがあります。
講座ではシンプルにするためにローカル環境にhomebrewでインストールしてましたが、環境を汚したくなかったので、DevContainerとして構築できないかとやってみました。:::note warn
筆者はGolangもAWSもコンテナも初学者です。
記載する内容が正しい保証は一切なく、ベストプラクティスでもありません。
至らぬ点がありましたらコメントで教えていただけますと幸いです。
:::# 環境
– macOS 13.6
– Docker 24.0.2-rd
– VSCode 1.82.2# 各種ファイルの用意
作成したファイルは下記3つです。
分けずに作れそうだなあとも思いつつ、そこは放置。。。1. `Dockerfile`
2. `docker-compose.yml`
3. `dev
aws-sdk-go経由で AWS bedrock / Stable Diffusionで画像生成するメモ
個人用メモ
– 上位モデルは現在予約済のスループットでしかサポートされていない?
– goに関してはbedrock でなく bedrockruntime パッケージを使う。
– 画像はbase64データとしてSDKより直接返ってくる
– APIリクエストのオプションは[stability.ai](https://platform.stability.ai/docs/api-reference#tag/v1generation/operation/textToImage) と同様“`go
package mainimport (
“encoding/base64”
“encoding/json”
“fmt”
“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/bedrockruntime”
“github.com/wano/contextlog/clog”
“os”
“path/filepat
手を動かしながら学ぶクリーンアーキテクチャ
こんにちは。
私は今、実務でクリーンアーキテクチャを採用しているサービスのバックエンド開発に携わっています。クリーンアーキテクチャについてはどれだけ記事を読んでも、分かったような分からないようなといった状態が続いていたのですが、実装をしてみることで理解が深まったような気がしています。
なので今回は自分と同じようにクリーンアーキテクチャについて理解に苦しんでいる人に向けて、手を動かしながらクリーンアーキテクチャを学べるような記事を書きました。
言語はGoを使用していますが、Goは文法がシンプルであるため、Goに親しみがない人でも実装内容は理解できるのではないかと思います。
プログラムはGitHubにて公開しているので、必要であれば見てもらえればと思います。
https://github.com/JunNishimura/clean-architecture-with-go
# 対象読者
– クリーンアーキテクチャについて記事や書籍を読んでみたけど、いまいち理解できていない人
– クリーンアーキテクチャの概念は理解しているけど、それをどう実装するのかに悩んでいる人
– クリーン
GoでWebアプリケーション
### Webサーバーの準備
以下の目的でWebサーバーを用意する
・クライアントがブラウザ上で利用するHTMLとJavaScriptを提供する
・クライアントとの間でWebSocketを使った通信を行う### 処理の流れ
・net/httpパッケージを利用し、ルートのパスへのリクエストを待ち受ける
・リクエストを受け取ると、HTMLを返す
・ListenAndServeメソッドで、ポート番号上でWebサーバーを開始する### ソース
“`
package mainimport (
“log”
“net/http”
)func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`
GoのWebアプリケーション
GoでWeb
`))
Web開発初学者と学ぶCleanArchitecture
# 自己紹介
文系大学院生をしているものです。
今回初Qiitaとなります。何にも考えずに執筆したので多分駄文です。お手柔らかにお願いいたします。
ここ違うよってところありましたら、お手数ですがコメントで教えていただけると助かります。# はじめに
この記事は、Web開発を初めて行なった際に一番苦労したシステム設計について書き残したものです。
コードはGolang、MySQLで書いています。([サンプルコード](https://github.com/temmie524/room-management-app))私はこれまでRailsでハンズオン記事やRailsTutorial等を用いてWeb開発をチュートリアル的に行なってきました。Railsではrails g した際に雛形が自動生成されるため、システム設計を意識することなく開発を行なってきました(それがRailsの良さであると理解しています)
今回はGo言語での開発を行いましたが最初につまづいたのはそこでした。1から自分で考えなくてはいけません。そこで「アプリ作る時 ディレクトリ構成」などとググったところ、そこでさまざまな設計
Agora SDKでリアルタイムコミュニケーション
# Agora SDKの概要と機能
Agora SDKは、リアルタイムコミュニケーションを実現するためのプラットフォーム。SDKは、ビデオ通話、音声通話、メッセージングなどのさまざまな通信機能を提供します。以下にAgora SDKの主な機能を詳しく説明する。
1. ビデオ通話:
– ビデオキャプチャとディスプレイ: カメラや画面の共有を実現するための機能
– オーディオ/ビデオコーデック: 高品質なオーディオ/ビデオストリームのエンコードおよびデコードをサポート
– リアルタイム映像処理: ビデオフィルターや仮想的な背景などのリアルタイム映像処理を実現する機能
– レコーディングとプレイバック: ビデオ通話の録画および再生をサポート2. 音声通話:
– 音声コーデック: 高品質な音声ストリームのエンコードおよびデコードをサポート
– ノイズおよびエコーキャンセル: 音声品質を向上させるためのノイズおよびエコーキャンセル機能
– オーディオミキシングと変換: 複数の音声ストリームをミキシングしたり、サンプルレートを変換したりする機能3
【Go言語】Go言語基本型
Go言語でのメモです。
Goには整数型、浮動小数点型、論理型、文字列型など基本的なデータ型があります。
## 整数型
| 型 | サイズ(bit) | 符号 | 最小値 | 最大値 |
| ————– | ——————–: | —- | ———————:| ———————–: |
| int8 | 8 | あり | -128 | 127 |
| int16 | 16 | あり | -32768 | 32767 |
| int32 | 32 | あり | -2147483648 | 214
golang+reactなアプリの開発環境をモノレポで作る
こんにちは。
モノレポという、1つのリポジトリに複数のアプリを1つのリポジトリに保存するというパターンがあるということを知ったので、
実際にその構成での開発環境を作ってみます。今回考えるのは、APIサーバとしてgolangで作られたものがあり、reactではそのフロントエンドを実装するようなアーキテクチャにします。
# この記事で達成すること
– golangでAPIの開発環境を作る
– reactの開発環境を作る
– 1つのリポジトリで↑2つのアプリが保存されている再現できる(モノレポ構成にする)
– reactとgolangをモノレポで構成# 言語、ミドルウェアのバージョン
| 言語、ミドルウェア | バージョン |
|:———-:|:—————:|
| docker | 20.10.11 |
| docker-compose | 1.29.2 |
| golang | Dockerfile参照 |
| mysql | Dockerfile参照
【Oracle DB】DATE型のカラムに日付をINSERTすると、ORA-01861: literal does not match format stringとなる
## やったこと
Goのdatabase/sqlパッケージを使用し、DATE型のカラムtest_dayに日付をINSERTした。
“`go
query := INSERT INTO my_table(test_day) VALUES(‘1999-01-01’)db.ExecContext(ctx, query)
“`## エラー
ORA-01861: literal does not match format string
## 対応
OracleDBのTO_DATE関数を使用する
明示的にDATE型に変換して日時データにする必要がある。“`go
query := INSERT INTO my_table(test_day) VALUES(TO_DATE(‘1999-01-01′,’YYYY-MM-DD’))db.ExecContext(ctx, query)
“`こちらでも可能だが、時刻の指定はできず、時刻は常に00時00分00秒となる
(日付リテラルであり、日時リテラルではない)“`go
Goのキャスト
Go言語ではintは明示的なキャストが必要。
数字→文字列はstrconv.Itoa(数字)
文字列→数字はstrconv.Atoi(文字列)
DBを2回呼び出すのと処理をまとめて1回で済ませた時のパフォーマンス比較
# 初めに
APIでDBを操作する際、各機能が対象とするモデルを1つに限定したいと考えた。なぜなら、各モデル(例:本、出版社)に対するCRUD操作が独立していて、ユースケースに応じてこれらを組み合わせることで、設計をシンプルにできると感じたから。仮想テーブルを作成してバックエンドでJOIN操作を行う方がパフォーマンスが良いと思うが、実際にどれくらいのパフォーマンス差が現れるのか、小さいアプリケーションなら無視できる程度なのか。この疑問を解決するために、検証を行った。
# じゃあなにすんのサ
PostgreSQLのDBを建て、ダミーデータ(本と出版社)を100件、10,000件、1,000,000件登録。本のテーブルには出版社の主キーを保持するフィールドを設定した。
データの取得は以下の2つのパターンで行う。**パターン1:**
無作為に本のレコードをDBから取得し、その後出版社の主キーを使用して出版社のレコードを取得する。**パターン2:**
無作為に本のレコードをDBから取得し、その際に出版社のテーブルとJOINして、一度のクエリで必要な情報を全て取得する。本と出版
【Go】環境ごとの設定値管理
Go で web server を立てる際に、環境(staging とか production とか)ごとの設定値をどういうふうに管理し、アクセス可能にするかのメモ。
外からの値の受け取り方としては環境変数から取るか、コマンドラインフラグで渡すかの2択だけど、どちらを取ったとしてもアプリケーションコードのロジック中からその値をどのように参照するかという話がある。
毎回 `os.Getenv` とか書きたくないし、このアプリケーションにどのような設定を入れられるのかがわかりづらいので、どこかで一元管理したい。そこで、以下のように設定管理用の `myconfig` というパッケージを作っておいて、そこに集約させてみる。
設定値を持った構造体をパッケージグローバル変数に突っ込んでおいて、その構造体経由で設定値を参照できるようにする。“`myconfig.go
package myconfigimport (
“github.com/caarlos0/env/v6”
/*…以下省略*/
)var cfg config
type config struc
やっぱギャンブルはやべぇなってことを学ぶためにコイントスを作るなど
# こんな記事を見かけた
https://gigazine.net/news/20230812-ergodicity-breaking-peters-coin-toss/>「ピータースのコイントス」は「大勢の参加者の平均」を求めると必ずプラスになる賭け事に見えるのに、実際に何度も挑むと大敗を喫することになる魔のコインゲームです。
コイントスはコインを投げて裏が出るか表が出るかで賭ける運ゲーです。
ピーターのコイントスは、特定の条件の状態ではコイントスを繰り返せば損をする確率が上がるというアルゴリズムだそうです。この記事ではコイントスを何度も繰り返して行い統計を出すツールが紹介されていますが、実際に投げてみて体感できるページは貼られていないように見受けられました…
おあー…
## やってみたいな
ということで実際にピーターと同じ条件でコイントスを投げてみるコマンドツールをGoで作ってみました。
## 作戦
Goで作るところまで決まったのでざっくり目標を立てて、どういったコードにするかを考えていきます。
今回はこんな感じで考えてみました。目標:ピータ
logパッケージの定数を出力する
“`go:main.go
package mainimport (
“log”
)func main() { // 出力は10進数 //2進数に直すと
log.Print(log.Ldate) // 1 // 1
log.Print(log.Ltime) // 2 // 10
log.Print(log.LstdFlags) // 3 Ldate | Ltime // 11
log.Print(log.Lmicroseconds) // 4 // 100
log.Print(log.Llongfile) // 8 // 1000
log.Print(log.Lshortfile) // 16 /
Go言語向けNCMB SDKの使い方(配列の追加・削除操作)
NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。
そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。
新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はデータストアの配列フィールドに対する要素追加・削除の処理について解説します。
## ソースコード
ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。
[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)
## インストール
SDKのインストールは下記コマンドで行います。
“`bash
go get -u github.com/NCMBMania/ncmb_go
“`## インポート
続けてSDKをインポート