- 1. 【Golang】Alpine Docker で実行すると error: stdlib.h: No such file or directory. “stdlib.h” が足りないと言われる
- 2. Goで使えるファイルタイプ
- 3. [Go] 画像の拡張子の変更をするCLIコマンドを作る
- 4. solidity で書かれたスマートコントラクト用の golang バインディングコードを生成する
- 5. golang から Azure KeyVault を使ってデータを暗号/復号する
- 6. Dataloadersを使ったN+1問題への対応
- 7. Goでローカルサーバーを立てた~ファイルダウンロード~
- 8. Goの基本型について
- 9. 【Go言語】Elm ArchitectureでTUIアプリが作れるbubbleteaでちょっとリッチなToDoアプリを作る
- 10. [Go]Sentryに対応したcustom errorの作り方
- 11. DBコネクションプールをgolangで実現
- 12. 環境構築, Buildまで -Go編-
- 13. Goで再帰クロージャを実装
- 14. Go Modules(vgo)について
- 15. Go言語で簡単な画像処理のツールの類をつくってみた。
- 16. Golangのinterface型
- 17. 【Go】WSL2にGoをインストールする手順
- 18. RDSにORM使ったけどモヤモヤが止まらないのでぜんぶ吐き出す!!!
- 19. Goでbit全探索
- 20. GORMでマイグレーションする際の覚書
【Golang】Alpine Docker で実行すると error: stdlib.h: No such file or directory. “stdlib.h” が足りないと言われる
> `golang:alpine` の Docker イメージで `go run` や `go test` を実行すると `stdlib.h: No such file or directory` の `fatal` エラーで叱られる。
[「”golang” “alpine” fatal error: stdlib.h: No such file or directory」とググって](https://www.google.com/search?q=%22golang%22+%22alpine%22+fatal+error%3A+stdlib.h%3A+No+such+file+or+directory)も日本語で情報が出てこなかったので。
“`bash
$ go test ./…
Testing main package
go: downloading …
…
# runtime/cgo
exec: “gcc”: executable file not found in $PATH
FAIL github.com/KEINOS/Sample [build fai
Goで使えるファイルタイプ
Goでは、**拡張子.goはGoのソースファイル**。というふうにGoが認識するファイルタイプが決まっています。
また、テストを記述するファイルを作成するときに末尾につける**_test.go**もGoが認識するファイルの種類の一つとして、特別に扱われます。
##拡張子.go
Goのソースファイルのこと##拡張子.c, .h
Cのソースファイルのこと##拡張子.cc, .cpp, .cxx, .hh, .hpp, .hxx
C++のソースファイルのこと##拡張子.m
Objective-Cのソースファイルのこと##拡張子.s, .S
アセンブラソースファイルのこと##拡張子.swig, .swigcxx
SWIGを定義するファイルのこと##拡張子.syso
システムオブジェクトのファイルのこと##最後に
これらは他のプログラミング言語との連携の際に使われるものです。それぞれGoで特別な役割があるということですね。いつどこで使うのかもこれから経験していきたいところです!
[Go] 画像の拡張子の変更をするCLIコマンドを作る
# はじめに
このまえ、**[Gopher道場](https://gopherdojo.org/)** の自習室とやらに参加させてもらい、前々から気になっていたGopher道場の課題をgithubにて探して、(やっていいのかな…?)演習しました。その課題1ってのが**画像の拡張子変更** でした。とりあえずアウトプットをしたいので、ここに色々書いていきます。また、使用したパッケージから、`flag`,`os`,`path/filepath`,`image`について、ちょっとだけ解説していきます。
## 環境
“`
# go version
go version go1.15.2 linux/amd64# tree
.
|- conversion
| |- conversion.go
|- go.mod
|- main.go
“`## 実際のコード
とりあえず、リポジトリは[ここです](https://github.com/marnysan111/gopherdojo-studyroom/tree/kadai1-marny/kadai1/marny)“
solidity で書かれたスマートコントラクト用の golang バインディングコードを生成する
## はじめに
golangを使用してEthreumに接続する場合、Ethereumのスマートコントラクトをgolangから直接実行するバインディングコードを生成すると簡単です。
一昨年から昨年にかけて、Ethereumのスマートコントラクトを利用したエスクローサービスを制作した際にもこの方式で実装しました。## やってみよう
#### 必用ソフト
| ソフト | 説明 | インストール方法 |
|:———–|:————|:————-|
| solcjs |Solidity用のJavaScriptバインディング|npm install solc|
| abigen |ABIベースのgolangバインディング
※ gethに付属|go get github.com/ethereum/go-ethereum
cd $GOPATH/src/github.com/ethereum/go-ethereum
go install ./cmd/abigen|#### バインディングコードを生成するスマートコン
golang から Azure KeyVault を使ってデータを暗号/復号する
## はじめに
以前 golang から Azure KeyValut を使用してデータを暗号化するのに、資料がなくて困ったので簡単にまとめました。## やってみよう
#### 必用なもの
* Azureアカウント
* Azure KeyValut用プリンシパル#### KeyVault暗号/復号用コード
まずは Azure 認証用のコードです。
NewAuthorizerFromEnvironment() での認証には以下の環境変数が必用です。|環境変数|説明|
|—–|—–|
|AZURE_TENANT_ID|AzureのテナントID|
|AZURE_CLIENT_ID|AzureのクライアントID|
|AZURE_CERTIFICATE_PATH|認証用証明書のパス|
|AZURE_CERTIFICATE_PASSWORD|認証用証明書の復号パスワード|“`go:azure.go (azure認証用コード)
package authimport (
“log”ka “github.com/Azure/azure-sdk-f
Dataloadersを使ったN+1問題への対応
# お題
Golang製GraphQLライブラリである[gqlgen](https://github.com/99designs/gqlgen)の「[Dataloaders](https://gqlgen.com/reference/dataloaders/)」を使って、N+1問題(ググるとわんさか記事が出てくる)を解決する。# 想定する読者
– Golangについてある程度書ける。
– 「GraphQL is 何?」ではない。
– gqlgenの [getting-started](https://gqlgen.com/getting-started/) で初期セットアップくらいはやったことがある。# 関連記事索引
– 第11回「[Dataloadersを使ったN+1問題への対応](https://qiita.com/sky0621/items/621f075e4257270a9e02)」
– 第10回「[GraphQL(gqlgen)エラーハンドリング](https://qiita.com/sky0621/items/affc833e770fee8b576e)」
– 第9回
Goでローカルサーバーを立てた~ファイルダウンロード~
初めに
===
Androidアプリからリクエストを投げて、GoでWebServerを立てたローカルサーバー上のファイルをダウンロードする環境
===
PC Windows10
Android Studio 4.0
Kotlin 1.3.72
Android端末 Emulator(API Level 29)
Go 1.11.1構成図
===
![go_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487320/e8771fc0-f61a-3472-8ab4-5f998bb3e704.png)
Androidアプリからファイル名を指定して、サーバー側にリクエスト、サーバー側に保存されているファイルとステータスコードを返却実装
===
ローカルサーバー
—“`Server.go
package controllersimport (
“fmt”
“io/ioutil”
“net/http”
“os”
“strconv”
“strings”
)fu
Goの基本型について
##基本型
###論理値型
論理値はbool型で表します。下記のように、真の場合は**true**、偽の場合は**false**の値をとる動作をします。また、型推論での定義もできます。“`
var a bool //変数aをbool型で定義
a = true //変数aにtrueを代入
“`“`
a := true
“`###数値型
数値型には整数型が用意されており、**符合付き整数型**と**符合なし整数型**の2つの型が用意されています。符合付き整数型は“`int8“`、“`int16“`、“`int32“`、“`int64“`の型があり、数値がサイズを表しています。
符合なし整数型は“`uint8(byte)“`、“`uint16“`、“`uint32“`、“`uint64“`の型があり、同様に数値がサイズを表しています。符合付きと違う点として、“`uint8“`は“`byte“`型という別名でも定義することができ、uint8と同じ動作をします。また、64bit実装のGoでは“`int“`型は“`i
【Go言語】Elm ArchitectureでTUIアプリが作れるbubbleteaでちょっとリッチなToDoアプリを作る
# はしがき
本記事ではElm Architecture likeにTUIアプリを作成できる[bubbletea](https://github.com/charmbracelet/bubbletea)というフレームワークを使ってToDoアプリを作っていきます。
タスク/完了したタスク一覧表示、追加、編集、完了、削除を行うことができます。
イメージ画像↓
![イメージ画像](https://i.gyazo.com/ffc1cc0b2ac62492cf33d945fe5775be.gif)## Elm Architectureについて
Elm Architectureを知らない方は[公式ガイド(日本語訳)](https://guide.elm-lang.jp/architecture/)や[この記事](https://qiita.com/kazurego7/items/27a2b6f8b4a1bfac4bd3)をざっと読んでからにしたほうが理解がしやすいかと思います。(本記事ではElm Architectureの解説は殆どしません。)
筆者はElmを少し触ったことある程度なの
[Go]Sentryに対応したcustom errorの作り方
# はじめに
go v1.x の 標準erorrはシンプルなゆえに欲しい機能が足りていない事が多く
標準errorをより使いやすくした[`pkg/errors`](https://github.com/pkg/errors)等が存在しますが、それでもerror自体に特定のステータス(status codeやerror levelなど)を保持したい場合等はそれ専用のcustom errorを作る事になると思います。それ自体は良いのですが、errorが発生した際にそのerrorをSentryに通知したい場合
`sentry-go`の[`CaptureException()`](https://godoc.org/github.com/getsentry/sentry-go#Client.CaptureException)ではStacktraceの取得に以下のpackageを使用する事が前提になっています。
– [pingcap/errors](https://github.com/pingcap/errors)
– [pkg/errors](https://github.com/pk
DBコネクションプールをgolangで実現
#初めに
GCPをつかっていてコネクションプールの話に行き着きました。
「最大コネクション数が100を超えました」というエラーが発生。
なぜコネクション数が多くなってしまうのかを調べ、見つけた対処方法となります。#環境
クラウド:GCP
WEBサーバーをVue/CloudRun
APIサーバーをGolang/CloudRun
DBサーバーをMySQL/CloudSQL#原因
“`
APIを叩くたびにAPIサーバーとDBサーバー間で新しいコネクションができているから
“`と判明した。
つまり、コネクションの使い回しができていなかった。
#対策
database.sqlの以下のメソッドを使用し、コネクションプールの設定を行う。
また、ORMでもコネクションプールできるらしい。| メソッド名| 説明 |
|:-:|:-:|
|func (db *DB) SetMaxOpenConns(n int) |接続の最大数を設定。 nに0以下の値を設定で、接続数無制限。 |
|func (db *DB) SetMaxIdleConns(n int) |コネク
環境構築, Buildまで -Go編-
# Goについて
静的型付けプログラミング言語として急速に人気が向上しているGo言語(Golang)。
## 1. インストール
https://golang.org/dlgo コマンドを使用する。
正常にインストールされていたら、以下のような結果が表示がされます。“`
Go is a tool for managing Go source code.Usage:
go <command> [arguments]
The commands are:
bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages
Goで再帰クロージャを実装
# はじめに
Go言語の勉強version2ということで、アルゴリズムの勉強をGoでやってみたというものです。## 再帰クロージャ
まず、クロージャとはなのですが、下記に参考にした文を記載致します。>Goの無名関数は「クロージャ」です。クロージャは日本語では「関数閉包」と呼ばれ、関数と関数の処理に関係する「関数外」の環境をセットにして「閉じ込めた(閉包)」ものです。
ということで、無名関数を表しています。今回はこれを使用し再帰関数を作成してみることから始めました。
1. 下記に階乗を計算する関数[func fact (n int) int]を作成してみました。
“`fact.go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()var a int
fmt.Fscan(r, &a)
result := solveFact(
Go Modules(vgo)について
##Go Modulesとは
Goの依存関係管理ツールです。一昔前まではdepが多く使われていましたが、Go1.11から導入され、多く使われているそうです。ちなみに、Go1.13から本格的に導入で、Go1.11~1.12は移行期ということなので該当している場合は、バージョンアップします。また、下記のコマンドで環境変数の確認をし、**GO111MODULE**を**on**にすることでも使えるようになるようです。
“`
$ go env
GO111MODULE=”on”
GOARCH=”amd64″
GOBIN=””
.
.
. //下に続く
“`##Go Modulesの使い方
実際にプロジェクトを作るところから一連の流れに沿っていきます。まず、任意のディレクトリで任意のディレクトリで新規にプロジェクトを作成します。また、Go Modulesを使う場合、GOPATH外でも置くことは出来ますが、保存先はGOPATH下になるそうです。→[参考記事](https://qiita.com/propella/items/e49bccc88f3cc2407745#go-modu
Go言語で簡単な画像処理のツールの類をつくってみた。
Go言語初学者です。普段の生息界隈はJS/TS+Javaですが、サーバーサイド言語の処理をもっと得意になりたいという理由から、今年からGo言語に挑戦しています。挑戦理由は「モダン, マルチスレッド, コンテナ関連での活躍」が挙げられます。
やはり、実際に何かを作って習得していくスタイルが自分には合っているので、今回は「画像処理」をテーマに、CLIとしてもAPIとしても使えるツール[yellow-high5/pictar](https://github.com/yellow-high5/pictar)を作ってみました。画像処理といってもCNNを使って画像認識させるような高度なものではないです。
## Go標準のimageパッケージ
まずは[Go標準のimageパッケージ](https://golang.org/pkg/image/)がどんな仕組みになっているか簡単に確認してみました。
### [Point](https://golang.org/pkg/image/#Point), [Rectangle](https://golang.org/pkg/image
Golangのinterface型
## interface型
– あらゆる型と互換性のある型
– Objectクラスのようなもの
– あくまで、全ての型の値を汎用的に表すものなので、演算などはできない“`main.go
package mainimport (
“fmt”
)func main() {
var x interface{}
fmt.Printf(“%#v”, x)
}
“`出力すると、
となる。
int型では0が初期値としてセットされるが、interface型ではnilとなる“`
$ go run main.go
“`
【Go】WSL2にGoをインストールする手順
# WSL2にGoをインストールする
いままでWindowsにインストールしたGoを使用してたけどどうせならWSL2で開発したいのでWSL2にGoをインストールしてみる
# 実行環境
OSは**Windows 10 Pro 64bit** (バージョン2004 OSビルド19041.572)
**WSL2**でOSは**Ubuntu-20.04**## 1.インストーラーをダウンロードする
まずは[Download and install – The Go Programming Language](https://golang.org/doc/install) を開き「Linux」を選択し、Linux用のインストーラーをダウンロードしてくる。
![FireShot Capture 139 – Download and install – The Go Programming Language – golang.org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85815/20409
RDSにORM使ったけどモヤモヤが止まらないのでぜんぶ吐き出す!!!
転職活動で**バックエンドも出来るぜ!アピール**としてポートフェリオぽいの作った方が良いかもね・・?という事で、こんなリポジトリ作ってたわけなんですけど、コード書いてて気づいた事つらつらと書きます。
何時もの奔放な個人開発じゃなく、気づき、ハマりのQiitaらしいアウトプットってことで。ちゃんと調べて書けーって怒られそうな気もするけどw
## ORMの仕様とか親切で大惨事になるかも・・?
今回Goの代表的なORMである**gorm**を使いましたが、**Delete**投げる時に消す情報を先に取得しないまま、動かすと**テーブル内のレコードすべてが消える**のが仕様らしいんです!
“`
jsonData.Id = Ids
DBMS.F
Goでbit全探索
Donutsプロコンチャレンジ
B – Tokyo 7th シスターズ
https://atcoder.jp/contests/donuts-2015/tasks/donuts_2015_2“`
package main
import(
“fmt”
“bufio”
“os”
“strconv”
“strings”
“go/types”
“go/token”
)
var rdr=bufio.NewReaderSize(os.Stdin,10000000)
func readLine()string{
l,_,_:=rdr.ReadLine()
return string(l)
}
func readInts()[]int{
s:=strings.Split(readLine(),” “)
res:=[]int{}
for i:=0;i
GORMでマイグレーションする際の覚書
# はじめに
`struct`でモデル定義、`AutoMigrate`でマイグレーションを実行、といった辺りで少し調べた部分をメモしておきます。## IDにUUIDを使用するには
UUIDの自動生成をライブラリに任せつつ、テストやシードデータの投入時には固定のUUIDも指定できるようにしたかったため、以下のように対応しました。まずはstructでのモデルの定義
“`golang
package modeltype User struct {
ID string `gorm:”primaryKey;size:255;default:uuid_generate_v4()” json:”id”`
…
}
“`上記`uuid_generate_v4()`を利用するために、`AutoMigrate(&User{})` する前にpostgresに拡張機能 `uuid-ossp` をインストール
“`go
db, err = gorm.Open(“postgres”, fmt.Sprintf(
“host=%s port=%s user=%s passwor