- 1. Remote Developmentを使って爆速でGo&PostgreSQLの環境構築を行う
- 2. 【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする
- 3. Mac(m1)でProtoc (Protocol buffer)をインストールしたけど見つからなくて困った話
- 4. 【初心者向け】はじめてのWebアプリケーション開発 デモアプリ作成 フロントエンド編
- 5. Goのiotaは定数宣言のインデックス
- 6. [Go]変数についてまとめた。[初心者向け]
- 7. csv を1行ずつ struct に読み込むやつ
- 8. Generics 関数の中で制約付きのポインタ型と実体型を両方扱いたい
- 9. [Azure] OpenAPI Serviceの機能/実装
- 10. GoでWebアプリケーション#2
- 11. 【Go】select 文とは? – ゴルーチンの制御
- 12. 【Go】make 関数とは?
- 13. What’s New from CircleCI – 2023/10/03
- 14. 【Go】標準パッケージの trace とは?
- 15. Go 1.22でのForループの変数スコープの変更について
- 16. [AWS] Amazon Textractの実装と機能
- 17. Go Generics 入門 : 最大・最小・総和を求める
- 18. Golangのパッケージではまってしまった メモ
- 19. (WIP) A Tour of Go をやってみる
- 20. Goのfor文で詰まった話
Remote Developmentを使って爆速でGo&PostgreSQLの環境構築を行う
こんにちは!
Remote Developmentを使ったGoの開発に関してまとめましたので参考になれば幸いです## github リポジトリ
以下をcloneすることでこの記事に書かれてることが再現できます!https://github.com/mikaijun/go-postgre-onboarding/
## こんな方にオススメ!
– これからGoを学習したい方
– Goを使ってデータベースとのやりとりを行いたい方
– ローカルマシンを汚したくない方(brewなど)
– Dockerは使いたいけど詳しい設定はよくわからない方
– Githubを使ってGoのコードをリモートにpushしたい方### この記事で扱わないこと
– VSCodeのインストール方法
– Docker(Docker Desktop)のインストール方法
– Githubのアカウント登録
– SQLの解説や使用したGoのパッケージの解説
– SSHを使用したGitHubへの接続
– 最速で開発できることをを目的としてますのでビジネスで開発する場合はSSHの使用を検討してください## Re
【Golang】base64でエンコードされたデータをデコードして、AWS S3にアップロードする
## 概要
Goを使って、Base64でエンコードされた文字列をJSONで受け取り、S3にアップロードしてみます。APIアクセス周りはEchoを使いました。
ファイルをS3にアップロードする際に、クライアントサイド/サーバーサイドのどちらから行うのか、またデータをどのようにやりとりするのか、などの観点で色々方法はあると思いますが、今回はBase64文字列をJSONで受け取り、デコードしてS3にアップロードする方法を試してみました。参考:[ファイルをS3にアップロードするときはサーバー?クライアント?](https://kenny27.hatenablog.com/entry/2019/06/07/233541)
### バージョン
– Echo:4.5.0
– Go:1.17.1## ファイル構成
“`
main.go
aws/
├ config.go
└ s3.go
“`## aws-sdk-goのインストール
“`go
go get -u github.com/aws/aws-sdk-go
“`## config.go
以下のように、awsのアク
Mac(m1)でProtoc (Protocol buffer)をインストールしたけど見つからなくて困った話
gRPCを試してみたくて、protocl buffer (protoc)をインストールの仕方を調べてみたけどスムーズにいかなかったのでメモ
### 環境
M1 mac (pro)### やったこと
まずはprotocol bufferをインストール
“`
brew install protobuf
“`インストール成功(してるっぽい)
> ? /opt/homebrew/Cellar/protobuf/24.3: 395 files, 13.2MB
==> Running `brew cleanup protobuf`…
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> protobuf
Emacs Lisp files have been installed to:
/opt/homebrew/share/emacs/site-l
【初心者向け】はじめてのWebアプリケーション開発 デモアプリ作成 フロントエンド編
## はじめに
言語学習を終えた後、本格的なWebアプリを開発する前に、フロント、バックエンド、Dockerなど使用予定の技術をを組み合わせた簡単なデモアプリを作成しました。
作成した理由は、いきなりすべての技術を組み合わせたアプリを開発すると、設定がごちゃごちゃになると考えたからです。
この記事では言語 + フレームワーク + UIフレームワークの環境構築について記載します。
WindowsPCでUbuntuでLinux環境を構築して開発を行いました。Ubuntu等の環境設定方法は以下の記事に記載しました。
[windowsでUbuntu,homeblew,nodebrewをインストール、VSCodeでTypeScript環境を構築する](https://qiita.com/bear05/items/265401176698bccbfee4)## バージョン等
Windows10
Ubuntu 20.04.4 LTS
Homebrew 3.5.7
nodebrew v18.7.0
node v18.7.0
npm 8.15.0エディタ…VSCode
typescrip
Goのiotaは定数宣言のインデックス
Goの公式docに沿って「iotaとは何か」を読み取っていきます
## iotaの概要
>Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants. Its value is the index of the respective ConstSpec in that constant declaration, starting at zero.
(定数宣言内で、事前に宣言された識別子iotaは、型付けされていない連続した整数定数を表す。その値は、定数宣言内の各 ConstSpec のインデックスで、0 から始まります。)– つまりiotaは定数の宣言行に対応したインデックス
– 補足
– 「型付けされていない整数定数」
– →Intではあるものの、どのIntか(Int8、Int16など)は決まっていないということ
– 「ConstSpec」
– →定数の宣言行のこと
[Go]変数についてまとめた。[初心者向け]
## 初めに
Goの環境構築は、以下の記事を参考にして見てください。
https://qiita.com/yuto_swift_flutter/items/0a3d978c3cf557719d0a
## 変数について
明示的な変数の定義は以下です。
“`Go
func main() {
var i int = 100
fmt.Println(i)
}
“`こちらを、**go run main.go**をプロジェクトのルートで叩くと、
“`Go
100
“`このように100が出力される。
int型以外も同様に出力できます。
“`Go
func main() {
var i int = 100
fmt.Println(i)var s string = “Hello”
fmt.Println(s)var t,f bool = true,false
fmt.println(t.f)
}
“`ちなみにGoは宣言した変数や定数をどこかしらで使わないとビルドエラーが起きる。
これありがたい機能ですよね。#### 異なる型を同時に
csv を1行ずつ struct に読み込むやつ
# モチベーション
csv を1行ずつ読んで struct にパースして yield みたいなのがやりたかった。
csvutil の中では1行ずつ読み出してるので巨大な csv でもいけるはず。サンプルデータは titanic で。
https://github.com/datasciencedojo/datasets/blob/master/titanic.csv# コード
“`go
package mainimport (
“encoding/csv”
“flag”
“fmt”
“io”
“os”“github.com/jszwec/csvutil”
)type Titanic struct {
C1 int32 `csv:”PassengerId”`
C2 int32 `csv:”Survived”`
C3 int32 `csv:”Pclass”`
C4 string `csv:”Name”`
C5 string `csv:”Sex”`
C6 string `csv:”Age”`
C7 stri
Generics 関数の中で制約付きのポインタ型と実体型を両方扱いたい
Go1.20 の頃の話なんですけど。
# お困りごと
こんな感じでレシーバがポインタで宣言されてて、かつ関数の中でレシーバのフィールドを触ってるケース。
“`go
type Hogeable interface {
Hoge()
}type HogeUser1 struct{ s string }
type HogeUser2 struct{ s string }
type HogeUser3 struct{ s string }func (h *HogeUser1) Hoge() {
h.s = “HogeUser1”
fmt.Println(h.s)
}
func (h *HogeUser2) Hoge() {
h.s = “HogeUser2”
fmt.Println(h.s)
}
func (h *HogeUser3) Hoge() {
h.s = “HogeUser3”
fmt.Println(h.s)
}
“`これを実体宣言して呼び出す Generics 関数を用意したい、となったとき。
ナイーブに Generics にすると、`T` が
[Azure] OpenAPI Serviceの機能/実装
# AzureのOpenAI Serviceについて
AzureのOpenAI Serviceは、Microsoft Azureクラウドプラットフォームの一部として提供されるAI(人工知能)モデルとサービスの統合である。OpenAI Serviceを使用することで、開発者は自然言語処理(NLP)や会話AIなど、さまざまなタスクを処理するための強力なツールとリソースにアクセスできます。以下では、OpenAI Serviceの概要と主な機能について詳細に説明する。
## 概要
AzureのOpenAI Serviceは、AIモデルやNLP機能を提供するためのクラウドベースのサービス。このサービスは、開発者が高度な自然言語処理タスクを簡単に実現できるように設計されており、スケーラビリティと柔軟性を備えている。また、OpenAI Serviceは、学習済みモデルを使用して、テキスト生成、文章分類、翻訳、質問応答、文章要約などのタスクを実行することができる。
## 機能
OpenAI Serviceには、以下の主な機能がある。
1. テキスト生成(Text Generation):
GoでWebアプリケーション#2
### やったこと
HTMLテンプレートファイルを読み込ませてブラウザ上で表示
### ソース
“`
package mainimport (
“html/template”
“log”
“net/http”
“path/filepath”
“sync”
)type templateHandler struct {
once sync.Once
filename string
templ *template.Template
}// HTTPリクエストの処理
func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
t.once.Do(func() {
t.templ =
template.Must(template.ParseFiles(filepath.Join(“templates”,
t.filename)))
})
t.templ.Execute(w, nil)
}func main() {
http.
【Go】select 文とは? – ゴルーチンの制御
# `select`文 – ゴルーチンの制御
Go言語は並行処理を強力にサポートしており、そのための主要なツールとしてゴルーチン(軽量スレッド)とチャネル(ゴルーチン間での通信メカニズム)があります。`select`文は、複数のチャネル操作(送信や受信)の中から、実行可能なものを選択するための制御構造です。
## 基本的な使い方
`select`文は、以下のような形式で使用します:
“`go
select {
case msg1 := <-ch1: fmt.Println("Received", msg1) case ch2 <- 2: fmt.Println("Sent 2 to ch2") case msg3, ok := <-ch3: if ok { fmt.Println("Received", msg3) } else { fmt.Println("ch3 is closed") } default: fmt.Println("No communication") } ``` 上記の例
【Go】make 関数とは?
# `make`関数について
Go言語には、特定の型を初期化するための関数、`make`があります。この関数を理解することで、Goのデータ構造をより効果的に使用することができます。
### `make`って何?
`make`関数は、Goのいくつかの特定の型(スライス、マップ、チャネル)を初期化して、使用可能な状態での値を返すための関数です。
# 作成できる型
### 1. スライスの初期化
スライスは、配列の部分的なビューを提供するデータ構造です。`make`を使用することで、指定したサイズと容量のスライスを生成できます。
“`go
s := make([]int, 5) // 長さ5、容量5のintスライス
“`### 2. マップの初期化
マップは、キーと値のペアを保存するためのデータ構造です。`make`を使用して、新しい空のマップを作成できます。
“`go
m := make(map[string]int) // stringをキーとし、intを値とするマップ
“`### 3. チャネルの初期化
チャネルは、ゴルーチン間での通信や同期をサ
What’s New from CircleCI – 2023/10/03
CircleCIは日々進化していますが、その変化に追いつくのは大変ですよね。
What’s New from CircleCI を毎週チェックして、CircleCIの最前線をキャッチアップしてくださいね![< What’s New from CircleCI – 2023/09/26](https://qiita.com/CircleCIJapan/items/26c88c03513af66e25e9) | 今週
# ブログやスライド、ビデオ
## ユーザーからの声
– [pt-online-schema-change の実行が必要かどうか判断するタイミングをより早くした話](https://tech.repro.io/entry/2023/10/03/090000) by Repro
– MySQLのスキーマ変更を行う際に、pt-online-schema-change の実行が必要かどうかを判断するタイミングをより早くするために、テスト環境でのスキーマ変更を自動化した話です。
– [ココナラiOSアプリの最近の取り組みと今後の取り組み](https://zenn.de
【Go】標準パッケージの trace とは?
# `trace`パッケージ とは?
Go の標準パッケージの trace は、アプリケーションの実行中に発生したスタックトレースの情報を記録するためのパッケージです。このパッケージを利用することで、アプリケーションの実行中に発生したエラーの原因を特定したり、アプリケーションのパフォーマンスを分析したりすることができます。trace パッケージの基本的な使い方は、次のとおりです。
“`go
package mainimport (
“runtime/trace”
)func main() {
// トレース開始
trace.Start()// エラーを発生させる
_, err := doSomething()
if err != nil {
// エラーを処理する
fmt.Println(err)
}// トレース終了
trace.Stop()
}func doSomething() (int, error) {
// 何かしらの処理を行う
Go 1.22でのForループの変数スコープの変更について
## はじめに
最近、Goのブログで「[Fixing For Loops in Go 1.22](https://go.dev/blog/loopvar-preview)」という記事が公開されました。この記事では、Go 1.22でのforループの変数スコープに関する変更について詳しく説明されています。
以下、その内容を紹介します。## 記事の内容
Goのコード書いていて、forループの変数スコープに関する問題に直面したことはありますか?
Go 1.22では、この問題に対する重要な変更が導入されます。## 問題点
Goでの一般的なミスの一つは、**ループ変数への参照をその反復の終了後も保持してしまうこと**です。
これにより、予期しない動作が生じることがあります。例えば、以下のコードを考えてみましょう。
“`go
package mainimport “fmt”
func main() {
done := make(chan bool)
values := []string{“a”, “b”, “c”}
for _, v := range values {
[AWS] Amazon Textractの実装と機能
# AWSのAmazon Textractの概要と機能
## 概要
Amazon Textractは、AWSのクラウドベースの光学文字認識(OCR)サービス。このサービスは、印刷された文書や手書きのメモ、テーブルなどの情報を構造化されたデータに抽出し、機械的な処理や分析に利用することができる。Amazon Textractは、文字や単語の位置情報、テーブルのセルや行の情報などを抽出するため、精度の高い結果を提供する。## 機能
以下に、Amazon Textractの主な機能を示します。1. テキスト抽出: イメージファイルやPDFなどの文書から、文字の情報を抽出し、手書きの文字や印刷された文字に対しても高い精度で認識が可能。
2. テーブル抽出: テキストベースで構成された表やグリッドの情報を抽出し、テーブル内のセル、行、列の情報を構造化した形式で提供する。
3. フォーム抽出: フォームの情報(氏名、住所、電話番号など)を自動的に抽出し、複数のフォーム項目を一括で処理することができる。
4. 関連画像抽出: 文書に関連する画像を検出し、抽出することができる。画像内のオブジ
Go Generics 入門 : 最大・最小・総和を求める
# 本記事について
本記事では、Go言語1.18で追加されたのGenericsを使って、
最大(`Max`)・最小(`Min`)・総和(`Sum`)を求める関数を作ります。Genericsを使うメリットとして、
1. 引数の型と返り値の型が違うだけで、中身が全く同じ動きをしている関数が1つになる
– 1つの関数のバグが複数個のバグにならなくなる
2. 引数に与える値が特定の型に合致しているか、関数が実装されているかどうか判定できる
– 「この関数が実装されてないと動かないよ!」「この型じゃないとダメだよ!」とコードを書いている最中にツールが教えてくれる
3. interface{}を引数に取った型スイッチによる分岐が減る
– 関数実装時に持つ「なんか強引な実装だな」というモヤモヤ感がなくなるという3点があります。
本記事では、競技プログラミングサイトのAtCoderの問題を通して、GoのGenericsを使った簡単な関数を作成します。
# AtCoderの言語アップデート
8月にAtCoderの提出言語アップデートが来ました。これにより、At
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構造体の配列の要素`は実はメモリ内ではそれぞれ別の場所に保持されている、つまり全く別の変数として扱われているため# 対処法