- 1. 【Golang】Ginを使ってフラッシュメッセージを表示させる
- 2. マイコン操りたいのでtinygo環境構築とgoroutineしてみた
- 3. Golang + gorilla/mux + LambdaProxyIntegration + ServerlessFrameworkを動かすまで
- 4. Dockerでスクレイピング環境構築
- 5. GoでAPIを作る際の技術選定
- 6. Golang-文字数を数える方法,4バイト以上の絵文字もある
- 7. Golang同じ文字列を繰り返して連結する方法
- 8. Slack でタコピー風に会話する
- 9. レシピ作家のレシピを検索できるトイアプリがちょいバズったので爆速でLINE Botを作った話
- 10. go、パス
- 11. GoでHTML (+ CSS, JavaScript) を表示する
- 12. 【対処法】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.
- 13. GoのCLIでテキスト入力をVimとかでやりたかった件
- 14. 【Golang】”net” モジュールを使った静的リンクバイナリを Docker + scratch で使う際のビルドの注意【”net/http” “net/url” など】
- 15. [Go][AtCoder] bufio.NewScannerの標準入力でハマったこと 最大サイズ
- 16. AWS App RunnerでGolangのサーバーをサクッと立ててみる
- 17. 【Golang】gqlgen、gin、GORMを使ったプロジェクトテンプレート
- 18. GolangのValidationチェック(go-playground編)
- 19. [Golang] ユニットテストにおける正しい後処理の書き方:t.Cleanup()
- 20. Go言語 + Windows Terminalで、任意の文字にハイパーリンクを埋め込むエスケープシーケンス
【Golang】Ginを使ってフラッシュメッセージを表示させる
# はじめに
Ginでフラッシュメッセージを実装する情報があまり見つからなかったため、備忘録として残します。
コードが冗長的だったり、良い書き方ではなかったりするかもしれませんが、ご了承いただければと思います。# フラッシュメッセージ機能の実装
フラッシュメッセージを表示させるために、Cookieに一時的に保存しすぐに削除することでリダイレクトされた時のみ表示するようにしています。“`golang:flash/flash.go
package flashimport (
“github.com/gin-gonic/gin”
)func SetFlash(c *gin.Context, status string, msg string) {
c.SetCookie(“Status”, status, 1, “/”, “localhost”, true, true)
c.SetCookie(“Msg”, msg, 1, “/”, “localhost”, true, true)
}“`
“Status“にはメッセージの種類(success,danger等
マイコン操りたいのでtinygo環境構築とgoroutineしてみた
# あらすじ
会社で使用している機器のGPIO機能をテストしようと思ったので環境構築して使ってみたの巻。# tinygoを入れる
https://tinygo.org/getting-started/install/windows/
これに従えばOK。
scoopを使わずにManual Installに従ったほうがシンプル。
好きなところに解凍してexeにpathを通す。# avrのツールを入れる
お手軽なのはArduino IDE内のavrdudeにPathを通す方法。
`C:\Program Files (x86)\Arduino\hardware\tools\avr\bin`
とかにあるはず。# その他
LLVMと本家goが必要といわれたらこれらもPathを通す。# コーディングする
今回使用するのはESP32くん。
tミリ秒で無限にLチカする関数を用意し、500msと300msでトグルするようにして呼び出す。
goキーワードを書き足すだけで以降の処理と並行して実行されるらしい。なんかすごい!“`golang:main.go
package mainim
Golang + gorilla/mux + LambdaProxyIntegration + ServerlessFrameworkを動かすまで
# 概要
タイトル通り、GolangアプリケーションをLambdaプロキシ統合で動かします## Lambdaプロキシ統合ってなに
ここに書いてあるhttps://docs.aws.amazon.com/ja_jp/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
これを使うとLambda関数を小分けにしなくても、アプリケーション側でルーティングを振り分ける従来の開発方法でサーバーレスなアプリケーションが作れる
## 必要なもの
・AWSアカウント
・ServerlessCLI
インストール、認証情報の設定が必要です公式ドキュメント
https://www.serverless.com/framework/docs/getting-started
## 実装
`sls create –template aws-go-mod –path go-test`
テンプレートから雛形を作ってもらいます
`go-test`の部分はお好きなプロジェクト名を入れてくださいこ
Dockerでスクレイピング環境構築
自分1人では、環境をサクッと構築しスクレイピングしていましたが、メンバー間で共有したいときに面倒だったのでDockerで再現しました。
GoではHTMLの操作に、Agoutiを使用。
HTML解析には、goqueryを使っています。# サンプルコード
“`:main.go
package mainimport (
“log”
“strings”“github.com/PuerkitoBio/goquery”
“github.com/sclevine/agouti”
)func main() {
log.Println(“処理開始…”)// ChromeDriver
driver := agouti.ChromeDriver(
agouti.ChromeOptions(“args”, []string{
“–headless”,
“–window-size=1280,800”,
}),
agouti.Debug,
)if err := driver.Start(); err != nil {
log.Fata
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