- 1. GoでAPIを作る際の技術選定
- 2. Golang-文字数を数える方法,4バイト以上の絵文字もある
- 3. Golang同じ文字列を繰り返して連結する方法
- 4. Slack でタコピー風に会話する
- 5. レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話
- 6. go、パス
- 7. GoでHTML (+ CSS, JavaScript) を表示する
- 8. 【対処法】unable to open tcp connection with host ‘localhost:1433’: dial tcp [::1]:1433: connectex: No connection could be made because the target machine actively refused it.
- 9. GoのCLIでテキスト入力をVimとかでやりたかった件
- 10. 【Golang】”net” モジュールを使った静的リンクバイナリを Docker + scratch で使う際のビルドの注意【”net/http” “net/url” など】
- 11. [Go][AtCoder] bufio.NewScannerの標準入力でハマったこと 最大サイズ
- 12. AWS App RunnerでGolangのサーバーをサクッと立ててみる
- 13. 【Golang】gqlgen、gin、GORMを使ったプロジェクトテンプレート
- 14. GolangのValidationチェック(go-playground編)
- 15. [Golang] ユニットテストにおける正しい後処理の書き方:t.Cleanup()
- 16. Go言語 + Windows Terminalで、任意の文字にハイパーリンクを埋め込むエスケープシーケンス
- 17. Google Compute Engine の startup script で $ go install と インストールされたバイナリを実行する方法
- 18. Goの静的解析ツールblahbrah
- 19. 0-1ナップサック アルゴリズム
- 20. Go の API をフロントサイドから呼び出す
GoでAPIを作る際の技術選定
## 概要
GoでAPIを作ることになったので、ライブラリやアーキテクチャの検討をした際のメモ## Web framework
:star: Ginhttps://gin-gonic.com/
標準ライブラリの[net/http](https://pkg.go.dev/net/http)でもよかったけど、フレームワークを使って楽できるところはしたかった
その他にも[echo](https://github.com/labstack/echo)や[chi](https://github.com/go-chi/chi)など選択肢は豊富だが、2022/03時点でGinが最も人気が高そうで、触ってみて問題なさそうだったのでhttps://github.com/mingrammer/go-web-framework-stars
## API specification
:star: swaghttps://github.com/swaggo/swag
コード内のコメントからSwaggerドキュメントが生成でき、Swagger UIも使えて便利
複数のフレームワークをサポート
Golang-文字数を数える方法,4バイト以上の絵文字もある
## 背景
こちらの記事 [UTF-8 のテーブル(MySQL5.6)に竈門禰?豆子が格納できない問題を調べてみた](https://qiita.com/ykami/items/d45ec72f8a5ea8b3288d)がきっかけで、
`Golang`における絵文字の文字数を確認する方法を調査して見ました。ちなみに、`Golang` のソースコードや文字列リテラルは `UTF-8` が採用されています。
`UTF-8` は、英数字は 8bit で表現して、それ以外は 16,24,32bit で可変的に表現しています。
例えば、ひらがなカタカナ漢字の様な日本語は 2 byte のものが多いのですが、上記の記事にでもあった一部の異体字([wikipedia](https://ja.wikipedia.org/wiki/異体字セレクタ))は 4 byte だったりします。あと、? とかの絵文字も 4byte のものが多いのですが、
??? や ???? といった絵文字は複数の絵文字を組み合わせた絵文字で、 4byte 以上になったりします。## 確認用コード
Go
Golang同じ文字列を繰り返して連結する方法
## Golang での同じ文字列を繰り返して連結する方法
– 環境
“`bash
$ go version
go version go1.17.2 darwin/amd64
“`– 方法
“`golang
package mainimport (
“bytes”
“strings”
)func main() {
// repeat byte
bufBytes := []byte(“?”)
println(“repeat byte:” + string(bytes.Repeat(bufBytes, 3))) //???// repeat strings
str := “?”
println(“repeat strings:” + strings.Repeat(str, 3)) //???// repeat rune
// rune 型のスライスにはrepeat関数が用意されていないため、for 文を使う必要がある。
bufRunes := []rune(“?”)
for i := 0; i < 3; i++ { bufRune
Slack でタコピー風に会話する
「Slackでの文章が怖い」と言われたので何か改善できないかと思い、まずはメッセージを全てタコピー風にする CLI を Go で作成しました。(GitHub でスターをくれると喜びます。)
https://github.com/Code-Hex/takopi
## タコピー?
タコピーは「タコピーの原罪」という少年ジャンプ+で連載中の漫画のキャラクターです。「っピ」を語尾につけるのが特徴なので文章を柔らかく見せてくれるだろうと考え採用しました。
## CLI の作成
Go 有名な形態素解析ライブラリ [github.com/ikawaha/kagome](https://github.com/ikawaha/kagome) を利用しています。
文章を加工するためにいくつか工夫しました。
1. メッセージを正規化する
2. 正規化済みの文字列に対して形態素解析を行う
3. 置き換えたい内容が見つかれば置換する置き換えたいものは map として[定義](http
レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話
こんにちは、家庭では休日の料理担当をしている二児の父です。
山本ゆりさんやリュウジさんなど有名レシピ作家さんのレシピをよく参考にするのですが、ブログ記事、Instagram、Youtubeなど皆さん複数のチャネルにレシピを公開してて探しにくいなぁと常々思っていたため、チャネル横断でレシピを検索できる、制作期間わずか3日の[トイアプリ](https://couch-potato.vercel.app/yuri-yamamoto)を公開してTwitterでお知らせしました。
すると山本ゆりさんご本人がリアクションしてくださり(!)、フォロワー数100人ちょっとだった自分のツイートにいいね!が止まらない状況に。これに気を良くして、さらに**近所のスーパーで安くなってる食材を調べて、関連レシピを検索できる機能**を追加してLINE Botにしてみたよ、という話です。
 を表示する
# 問題
Go言語でサーバーを立ち上げてHTMLを表示させる際、cssとjsファイルをHTMLに適用させるのに少し時間がかかりました。
備忘録としてHTML + CSS + JavaScriptのページを表示する方法を記載していきます。# 解決方法
結論から言うと、go:embedを使用しました。
下記のテックブログを参考にして、静的ファイルを変数に格納 -> ファイルシステムを取得して読み込むという方法で課題を解決しました。https://future-architect.github.io/articles/20210208/
下記にコードを記載しますが、全てを記載すると記述が多くなるため省略してあります。
全コードが気になる方はgitを確認してください。
https://github.com/Makoto87/test_go_embedgoのバージョン
“`
go version go1.17.3 darwin/amd64
“`ディレクトリ構成
“`
.
├── go.mod
├── main.go
└── views
├── main.html
【対処法】unable to open tcp connection with host ‘localhost:1433’: dial tcp [::1]:1433: connectex: No connection could be made because the target machine actively refused it.
社内ツールの開発を試みてGoでSQLserverを扱っている公式チュートリアルを進めていたところ、タイトルのエラーに遭遇して少し苦戦しました。その対処法を記事にします。
[https://www.microsoft.com/en-us/sql-server/developer-get-started/go/windows/step/2.html](https://www.microsoft.com/en-us/sql-server/developer-get-started/go/windows/step/2.html)## TCPIPを無効から有効に切り替える

以下に対処法が書いてありましたが英語なので見逃してしまう方がいるかもと思い記事にしました。
[https://community.grafana.com/t/not-ab
GoのCLIでテキスト入力をVimとかでやりたかった件
# はじめに
CLIのTwitterクライアントとか作りたいなー って思った
なので、複数行のTweetをコマンドラインで入力するんだったら、Vimとか使いたいなーって思った## ググった
[GoでVimを開いて編集内容をパースする方法](https://qiita.com/lighttiger2505/items/d3b9ee9884c75a7819d8)
最高やん!## 結果
[kotaoue/go-eeditor](https://github.com/kotaoue/go-eeditor)を用意した“`Go
import (
“fmt”“github.com/kotaoue/go-eeditor”
)func main() {
editor := eeditor.NewEditor()
b, _ := editor.Open()
fmt.Println(string(b))
}
“`
みたいなコードで、Vimでテキスト編集した結果をbyteで受け取れる起動時のパラメータ変更すれば、Emacsも使える
“`
editor := eedito
【Golang】”net” モジュールを使った静的リンクバイナリを Docker + scratch で使う際のビルドの注意【”net/http” “net/url” など】
> Go 言語(以下 Golang)v1.16 以降で、”`net`” モジュールを使ったバイナリを Docker のマルチステージ・ビルドでコンパイルし、`scratch` イメージで使いたい。
例えば “`net/http`” や “`net/url`” パッケージなどを使って `HTTP GET` リクエストするものなど。しかし、静的リンクしないと `standard_init_linux.go:228: exec user process caused: no such file or directory` エラーが発生するし、静的リンクさせてもデータが取得できない。
**Go v1.16 + Docker v20.10 以降で動く情報**が欲しかったのですが、色々ググっても Go v1.**4** 時代の古い情報や、古い Golang と Docker のバージョンの組み合わせ情報しかありませんでした。あっても新旧混在の組み合わせだったりと、なかなか動かなかったので未来の自分のググラビリティとして。
## TL; DR (今北産業
[Go][AtCoder] bufio.NewScannerの標準入力でハマったこと 最大サイズ
## 概要
最近Golangを書くことが多くなりました。普段はWeb開発ばかりやってますがそれ以外にも前から競プロに興味がありました。
なのでせっかくなのでGolangで始めてみようかなと思い立った矢先、いきなり問題にハマったのです。ただ学びにもなったので備忘録としてこの記事を書いています。
## ハマってしまった問題
僕がハマってしまった問題は下記です。
問題としては入力文字列を昇順にソートして出力するだけのものでシンプルなものです。
https://atcoder.jp/contests/abc242/tasks/abc242_b
僕の提出回答は下記でした。
一見ACになりそうなのですが、結果としてはWAでした。
やっていることとしては間違っておらずでして、
受け取った文字列からstring型のsliceを作成して1語ずつ格納します。
その後, `sort.Strings([]string)`を使ってsliceを昇順にソートします。
最後は`strings.Join`を用いて文字列を作成して出力で完了です。
でも何が原因でWAになってしまうか分からず、
AWS App RunnerでGolangのサーバーをサクッと立ててみる
# AWS App Runnerとは?
コンテナ化されたWebアプリを簡単にデプロイすることができるサービスです。(裏側ではFargateが使われているらしい)
2021年の5月に登場したサービスなので比較的新しいサービスっぽいです。コンテナを動作させる手段としてはAmazon ECSがありますが、それよりもサクッとサーバーを立てたい時に重宝しそうです。
# 料金体系(@東京リージョン)
以下の3つの要素から構成されます。
1. プロビジョニングされるメモリ ・・・ 0.009USD/GB
2. アクティブなコンテナインスタンスのCPUとメモリ・・・0.081 USD/vCPU + 0.009USD/GB
3. ビルド料金・・・0.005 USD/ビルド時間 (分)1vCPU・メモリ2GB・ビルドなしで1ヶ月アクティブに運用すると、**約70ドル**のコストがかかります。
# 2022年2月のアップデートでVPCのトラフィックがサポートに
リリースノートによるとApp RunnerがVPCのリソースにアクセス可能となったそうです。
https://docs.aws.amaz
【Golang】gqlgen、gin、GORMを使ったプロジェクトテンプレート
# はじめに
Goの学習のためgin、gqlgen、GORMを使ってGraphQLのAPIを作成しました。
備忘のためにプロジェクトのテンプレートとその説明を残します。作成したテンプレートは以下に公開しています。
https://github.com/Ruketa/go-gqlgen-gin-template
# 環境
– Golang バージョン 1.17
– 使用ライブラリ、FW
– Gin : Web Framework : https://github.com/gin-gonic/gin
– Gorm : ORM library : https://github.com/go-gorm/gorm
– Gorm PostgreSQL Driver : https://github.com/go-gorm/postgres
– INI : INI file package : https://pkg.go.dev/gopkg.in/ini.v1
– gqlgen : GraphQL library : https://github
GolangのValidationチェック(go-playground編)
#初めに
GolangでのValidationチェックを実施する記事です。#サンプルコード
“`go:main.go
package mainimport (
“fmt”“github.com/go-playground/validator/v10”
)// User contains user information
type User struct {
FirstName string `validate:”required”`
LastName string `validate:”required”`
Age uint8 `validate:”gte=0,lte=130″`
Email string `validate:”required,email”`
FavouriteColor string `validate:”iscolor”` // alias for ‘hexcolor|rgb|rgba|hsl|hsl
[Golang] ユニットテストにおける正しい後処理の書き方:t.Cleanup()
ユニットテストの**後処理**を行う場合、
`defer`は**並列**で動いている**サブテストの終了を待たずに実行**されてしまう問題がある。
全てのサブテストが終了してから後処理を行たいなら `t.Cleanup()` を使おう。
## **`Defer`による後処理の例**
“`go
package mainimport (
“log”
“testing”
)func TestDefer(t *testing.T) {
tcs := map[string]string{
“A”: “1”,
“B”: “2”,
“C”: “3”,
}defer log.Printf(“End”)
for tn, tc := range tcs {
tc := tc
t.Run(tn, func(t *testing.T) {
t.Parallel()
log.Println(tc)
})
}
}
“`そのログの抜粋:
“`bash
2009/11/10 23:00:00 End
2009/11/10 23:00:
Go言語 + Windows Terminalで、任意の文字にハイパーリンクを埋め込むエスケープシーケンス
# 結論
“`golang
package main
import (
“fmt”
)
func main() {
fmt.Println(“\033]8;;https://www.google.com/\aGoogle\033]8;;\aへリンク”)\\->Googleへリンク
}
“`# 参考
[ターミナルエミュレータ内でクリッカブルなリンクを作る方法](https://qiita.com/aosho235/items/335fc2f4b002a8251a2f)
[How to add hyperlinks to a terminal [ Node.js ]](https://stackoverflow.com/questions/69314689/how-to-add-hyperlinks-to-a-terminal-node-js)
[Explicit hyperlinks and context information for your terminal](https://www.uninformativ.de/blog/postings/2018-04-14
Google Compute Engine の startup script で $ go install と インストールされたバイナリを実行する方法
## TL;DR
“`bash
metadata_startup_script = <<-EOF #!/bin/bash TARGET_REPOSITORY_URL=github.com/... # ここは適宜差し替えてください TARGET_BIN_NAME=... # ここも mkdir /home/user export HOME=/home/user cd /usr/local/src wget https://go.dev/dl/go1.17.7.linux-amd64.tar.gz > /dev/null 2>&1
tar -C /usr/local/ -xzf go*.tar.gz > /dev/null 2>&1
GOCACHE=/usr/local/go/cache GOBIN=/usr/local/go/bin GOPATH=/usr/local/go /usr/local/go/bin/go install -v ${TARGET_REPOSITORY_URL}@latest
/us
Goの静的解析ツールblahbrah
Goの静的解析ツールを作ったので紹介したいと思います。
## 作ったもの
– [blahbrah](https://github.com/granddaifuku/blahbrah)### 何ができるのか
– タイトルにもある通り、Goの静的解析をしてくれます
– Brace( “{” や “}” )の前後にある空白行を検知することができます次のコードを例に取ります。
突っ込み所はとてもありますが、一番気になる(?)のは、**レビューで指摘されそうな**、12行目や20行目に存在する空白行ではないでしょうか。
“`main.go
1 package main
2
3 import “fmt”
4
5 type cat struct {
6 name string
7 age int
8 }
9
10 func newCat(name string, age int) cat {
11 return cat{
12
13 name: name,
14 age: age,
15 }
16 }
17
18 func foo(a, b int) int
0-1ナップサック アルゴリズム
# 何が書いてあるか。
0-1ナップサック問題[^1]のアルゴリズムのGo言語実装サンプル
[^1]: 重量を越えないような物の組み合わせのうち、価値が最大になるようにな組み合わせを求める問題。“`go
package main
import (
“fmt”
“math”
)
type Kingyo struct {
weight int
kati int
}
func main(){
var N,x int
fmt.Scanf(“%d %d”, &N,&x)kingyo:=make([]Kingyo,N)
for i:=0;i
Go の API をフロントサイドから呼び出す
API 側に
“`go
http.Handle(“/”, http.FileServer(http.Dir(“static”)))
“`
“static” フォルダに html などを入れる。## 詳しく
main.go に
“`go
http.Handle(“/”, http.FileServer(http.Dir(“static”)))
log.Fatal(http.ListenAndServe(“:8080”, nil))
“`
と書いた場合。(main.go があるフォルダ)/static に index.html を入れる。
“`
go run main.go
“`
などで実行すると、localhost:8080/ で index.html が表示される。
localhost:8080/test.html とかで static/test.html が表示される。“static” フォルダは別フォルダにしても動く。”../test” とかでも問題ない。
“/” を “/top” にして localhost:8080/top にアクセスすると not foun