- 0.0.1. go で「*」をたくさんつけるとコンパイルに30時間以上かかることがある
- 0.0.2. AWS ChatbotでSlackからLambda関数(Go)を呼び出す
- 0.0.3. ECHOのCORS設定
- 0.0.4. beego AjaxでCSRF対策を独自実装する と思ったらしなくても良かった件
- 0.0.5. Gopherエンジニア面接質問 fmt.Println(uint(1) – uint(2))の結果は?
- 0.0.6. Golangはじめて物語(第9話: Go SQL Drivers+AWS SDK for the GoでAuroraに高速アクセスする)
- 0.0.7. Golang で YAML をシリアライズ、デシリアライズする
- 0.0.8. Ginの実行環境作成
- 0.0.9. AWS ESC Fargate & ECR で Golang の Webアプリをデプロイする
- 0.0.10. Go言語クロージャーについての豆知識
- 0.0.11. Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました
- 0.0.12. 【Golang】【wasm】テストの仕方と注意点 @ Go 1.16+
- 0.0.13. 【Golang】image パッケージの Bounds とは(四角が描画された画像を作成したい)
- 0.0.14. Goのインストールとチュートリアルメモ
- 0.0.15. 【Golang】TinyGo で WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
- 1. Docker の TinyGo で疲労コンパイる
go で「*」をたくさんつけるとコンパイルに30時間以上かかることがある
# これは何?
先日https://qiita.com/Nabetani/items/3ddd37cf987102640c57
という記事を書いたんだけど、そういえば go もたくさん `*` をつけられそうだなと思って試した。
# `*` の付け方
こんな感じ。
“`go:go
package mainimport (
“log”
“unsafe”
)func main() {
var p ********************************uintptr
x := (uintptr)((unsafe.Pointer)(&p))
*(*uintptr)((unsafe.Pointer)(&p)) = x
log.Println(********************************p)
}
“`x の初期化と `*****(略)*****p` の間に GC が入ると死ぬような気がするけど気にしない。
実行するとこんな出力が得られる。
“`text
2021/08/10 18:33:55 824634449
AWS ChatbotでSlackからLambda関数(Go)を呼び出す
## はじめに
CICDの一環でGoのLambdaをSlackから呼び出す仕組みを構築したのでその備忘録を残す。
(Goは初見だったので少しGoを触った所も書き残した。)## Goを使ってみる
### install
https://golang.org/doc/install からDowloadしてくる。
`go version`でGoのバージョンが表示されればOK。“`
C:\Users\user>go version
go version go1.16.7 windows/amd64
“`### hello world
[はじめてのGo](https://github.com/yuta-katayama-23/Go/commit/a24dbd81df6ebc32e0bb739b9b50a54f7c91e136)“`golang:hello
package mainimport “fmt”
func main() {
fmt.Println(“Hello, World!”)
}
“`実行結果は以下のようになる。
CIでGoを動かすのに使った
ECHOのCORS設定
## エラー
– ReactNativeとExpoで作ったフロント側から呼び出すと以下のエラーが表示される
“`
Access to fetch at ‘http://localhost:1323/user/search’ from origin ‘http://localhost:19006’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.
“`– Access-Control-Allow-Originがヘッダーにありませんみたいな
#
beego AjaxでCSRF対策を独自実装する と思ったらしなくても良かった件
# はじめに
go言語のwebframework beegoにはCSRF対策が実装されています。https://beego.me/docs/mvc/controller/xsrf.md
CSRFとは
https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html
説明は不要かと思いますが、CSRFとは他サイトを経由した
不正なリクエストによってサイトを攻撃する手法です。CSRF対策の一つとしてbeegoでも採用されているのがトークンを使った対策です。
サーバに保存されたトークンとリクエストにあるトークンが一致しているかを
判定することによって不正なリクエストでないことを証明します。公式サイトを読むと・・・
POSTの場合、configにパラメータを記載すればcookieに_xsrfをセットするよ
PUTとDELETEの場合、cookieに
Gopherエンジニア面接質問 fmt.Println(uint(1) – uint(2))の結果は?
###背景
一つGo言語の面接質問を紹介します
以下の出力結果はなんですか?“`go
package mainimport (
“fmt”
)func main() {
a := uint(0)
b := uint(1)
fmt.Println(a – b)
}
“`面接質問だから、明らかに-1ではないですね
この質問の正確な答えは“`
uintの最大値が出力されます
PCは32bitの場合は、uint32の最大値になり、2**32-1 になります,
PCは64bitの場合は、uinit64の最大値になり、2**64-1になります
“`
※ なお、以下の公式サイトによるとuint64の最大値は18446744073709551615になり、2**64-1まではいかないです。
> uint64 is the set of all unsigned 64-bit integers. Range: 0 through 18446744073709551615.https://pkg.go.dev/builtin#uint64
###解説
まずaと
Golangはじめて物語(第9話: Go SQL Drivers+AWS SDK for the GoでAuroraに高速アクセスする)
# はじめに
GolangのDB接続は内部でGoroutineを使って勝手に簡単にコネクションプールを実現してくれるらしい。
なんと素晴らしい。早速試してみようではないか。
せっかくだから、Auroraと組み合わせてみよう。なお、Auroraへのアクセス方法については、[公式のユーザーガイド](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.IAMDBAuth.Connecting.Go.html)が参考になる。
また、接続にはIAM認証を用いる。AuroraへのIAM認証の設定方法は、[この記事](https://qiita.com/neruneruo/items/359faa76c2c8990439f2)を参考にしていただきたい。
# ファイル構成
今回は、WebサーバのフレームワークからAuroraに接続するサンプルとして、Ginを用いる。
以下のようなファイル構成とする。“`
.
├── Dockerfile
├── docker-compose.yml
Golang で YAML をシリアライズ、デシリアライズする
# Golang で YAML をシリアライズ、デシリアライズする
こんにちは、最近 YAML をなんとなく触っていたのですが、いまいち理解していない部分もあり、また IaC の勉強を始めてみたり、 Golang でデシリアライズする必要が出てきたりと、今後のことを考えてここで解説メモを残しておこうと思いました。
# YAMLについて
YAML Ain’t Markup Language (YAML) はシリアライズ言語、
YAML はこの数年で着実に進化しており、わりと人気が出てきているイメージです。YAML のメリットはコメントを記述できたり、インデントで区切っている点など、何より人間にとって読みやすいというのが大きなメリットだと思います。
YAML は主に何に使われるかというと、設定ファイルのフォーマットに使われることが多いです。
このシリアライズする言語の能力に関して JSON のような言語に置き換えられることがよく見られてます。今回はYAMLの文法を Golang でデシリアライズしながら見ていきたいと思います。
# サンプルファイルで YAML を見ていきま
Ginの実行環境作成
最近、Googleで調べものしているときやSNSでよく目にするGoですが、どうやらWebフレームワークも存在しており、標準ライブラリとはどう違うのかをみるべく、まずはフレームワークの一つであるGinのパッケージをインストールしてみようと思います。
#Ginとは
Ginは、Go言語で記述されたWebフレームワークです。httprouterのおかげで最大40倍高速なパフォーマンスを備えたMartiniのようなAPIを備えています。パフォーマンスと優れた生産性が必要な場合は、Ginを気に入るはずです。
引用:[Gin公式GitHub](https://github.com/gin-gonic/gin#gin-web-framework)#作業環境
OS:Windows10 Home
プロセッサ:Intel(R) Core(TM) i5-3210M CPU2.50 GHz
RAM:8.00 GB (7.88 GB 使用可能)Go:1.16.7 windows/amd64
#Ginのインストール
Gin公式GitHubの[README](https://github.com/gin-
AWS ESC Fargate & ECR で Golang の Webアプリをデプロイする
# はじめに
現職の現場ではプライベートクラウドを使用していて、本番環境の運用をAWSのようなパブリッククラウドを使用して、さらにECSのようなコンテナ基盤での運用ができていない。
docker imageを使用してコンテナ基盤で運用をすると本番環境の運用及び、本番環境へのデプロイ作業がものすごく楽になりそうなので、学習してみた。
この記事では、ローカル環境でdocker imageをビルドして、AWSのECRにプッシュ、その後ECSでデプロイを完了させるところまでを解説してみる。# ローカルにて
ビルドしたいDockerfileがおいてあるディレクトリと同じ階層でビルドする“`
docker build -t image_name .
“`ビルドしたimageにタグ付けをする。
この辺りのコマンドは、ECRにてリポジトリを作成したのち、AWSのコンソール上でもわかりやすくpushコマンドが説明されているので迷うことがあんまりなさそう。“`
docker tag image_name aws_account_id.dkr.ecr.region.amazonaws
Go言語クロージャーについての豆知識
###背景###
for分の中に関数を書くときに、特にfor分のスコープと関数の組み合わせによって、クロージャーが生成され、関数の実行タイミングはfor分と一致ではない場合は、バグは発生しやすいです。
例えば、javascriptでは以下のようなクロージャー典型例があります。
[Javascriptの豆知識(let,var,クロージャーに関する面接問題)](https://qiita.com/xu1718191411/items/88dee669da14bc8ba749 “Javascriptの豆知識(let,var,クロージャーに関する面接問題”)Javascriptではletという変数宣言方法を活かすことによって、うまくfor分共にあるクロージャー問題点を解消できますが、Go言語だと、どうやって解消できますでしょうか
####問題####
#####コード#####“`golang
func main() {
n := 5funcs := []func(){}
for i:=0;i
Go 言語スプレッドシートライブラリ:Excelize 2.4.1 がリリースされました
[Excelize](https://github.com/xuri/excelize) は、純粋な Go で記述されたライブラリで、XLSX / XLSM / XLTM ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。 高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新
【Golang】【wasm】テストの仕方と注意点 @ Go 1.16+
## WebAssembly 用のアプリでもテストがしたい
> `go test` でテストを実行すると `exec format error` や `imports syscall/js` エラーが出る。
>
> “`text
> fork/exec /tmp/go-buildxxxxxxxxx/xxxx/my_pkg_hoge.test: exec format error
> “`
> “`text
> imports syscall/js: build constraints exclude all Go files in /usr/local/go/src/syscall/js
> “`– 検証環境: Go 1.15.6(`golang:1.15-alpine`), 1.16.5(`tinygo/tinygo:latest`), 1.16.6(`golang:alpine`)(いずれも Docker 環境)
## TL; DR (今北産業)
1. `node.js` をイ
【Golang】image パッケージの Bounds とは(四角が描画された画像を作成したい)
> Go 言語(Golang)のテストで使う画像を作りたい。作り方を調べると出てくる `Bounds` ってどう言う意味?
[「”golang” 画像 描画 四角」でググって](https://www.google.com/search?q=%22golang%22+%E7%94%BB%E5%83%8F+%E6%8F%8F%E7%94%BB+%E5%9B%9B%E8%A7%92)も[「”golang” image boundsとは」でググって](https://www.google.com/search?q=%22golang%22+image+bounds%E3%81%A8%E3%81%AF)も何かよくわからなかったり、Go v1.16 系では動かなかったので、自分のググラビリティとして。
## TL; DR (今北産業)
1. `Bounds()` の `Bound` は「境界」や「隣接する範囲」などの意味。
日本語で言う**「バウンド」の「跳ね返る」ではありませ
Goのインストールとチュートリアルメモ
Go使ったことない人間がGoのインストールしてから[公式](https://golang.org/doc/install)のチュートリアル進めて行くにあたって躓いた点などをメモ。
なおMac前提。(随時追記)# インストール
* [公式](https://golang.org/doc/install)から最新版をダウンロードしてインストールする
* よくわからんけどgoコマンドが `command not found` になってしまうっ……!ってなったので、~/.bash_profileをいじいじしてパスを通す。“`~/.bash_profile
# goのインストール先は/usr/local/goになる
export PATH=”/usr/local/go/bin:$PATH”
“`そんでもってターミナル再起動かsourceで再読み込み
“`
$ source ~/.bash_profile
“`これでようやくgoコマンドが動いた
“`
$ go version
go version go1.16.6 darwin/amd64
“``$GOPAT
【Golang】TinyGo で WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
Docker の TinyGo で疲労コンパイる
> TinyGo の Docker イメージ `tinygo/tinygo:latest` で `wasm`(WebAssembly のバイナリ)をビルドして実行したら、”`wasi_snapshot_preview1`” エラーがブラウザのデベロッパーツールのコンソールに表示される。
>
> “`text:consoleログ
> WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function
> “``wasi_snapshot_preview1` モジュールがないのはわかるのですが、よくわりません。でも Go で `wasm` をコンパイルすると動くんです。
[「`WebAssembly.instantiate(): Import #0 module= “wasi_snapshot_preview1” error: module is not a
Goの静的解析ツールを作成した
はじめまして、[しぶちゃり](https://twitter.com/sivchari)です。
今回はGoの静的解析ツール `nilassign` の紹介をさせていただきます。## nilに代入することで発生するpanic
Cをはじめとしたポインタの概念が存在する言語ではnullにデータを渡すことで言語ごとにエラーが発生します。これはデータを代入するアドレスが存在しない(null)にも関わらず利用するためです。
その例に漏れず、Goのnull型に相当するnilも、データを渡したり、参照することでエラーが発生します。以下がその例です。“`go
package mainimport (
“fmt”
)func main() {
var i *int
*i = 1
fmt.Println(i)
}
“`
[The Go Playground](https://play.golang.org/p/mNpu9IZgAOn)“`console
panic: runtime error: invalid memory address or nil pointer
excelizeをgo installするとエラー
### excelizeをインストールする際に下記のエラー
**ラスト2行を訳すと`github.com/xuri/excelize/v2`のパスが必要だけど、`github.com/360EntSecGroup-Skylar/excelize/v2`が宣言されているよ**とのこと
ついこの間まで使えていたので、なんか変更が入ったみたいですね“`console
$ go install github.com/360EntSecGroup-Skylar/excelize/v2
go: finding module for package github.com/360EntSecGroup-Skylar/excelize/v2
go: downloading github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go: found github.com/360EntSecGroup-Skylar/excelize/v2 in github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.1
go:
Go言語とGASで翻訳デスクトップAppを10分で作る。
#はじめに
Go言語を少しだけ触って簡単な翻訳appを作成したので備忘録
コードは[こちら](https://github.com/Gyabi/go-translateApp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532027/67c2aecb-11fc-c026-316c-ffe4c5a3a024.png)#システム構成
OS:Windows10
GUIの記述:Go言語(Walk)
翻訳APIの記述:GASGo言語のwindowsデスクトップapp作成用ライブラリの[Walk](https://github.com/lxn/walk)を用い簡単なGUIを作成。
また、GASを用いてgoogleのサーバ上に翻訳APIを作成。
あとはGUIの操作に合わせてPOSTを投げてレスポンスを表示させるだけ。超手抜き。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153202
JSON-TO-GO を使えば、GO 構造体定義がすこぶる簡単!
## Teratail の質問 API
プログラミングに関する質問ができる Teratail では、API を提供しています。
https://teratailv1.docs.apiary.io/#reference/(question)/0/0
質問一覧では、下記のようなレスポンスが返ってくるとのことです。
これを一つ一つ Go の構造体を作成するのは結構時間がかかる。。
“`json
{
“meta”: {
“message”: “success”,
“total_page”: 1,
“page”: 1,
“limit”: 10,
“hit_num”: 2
},
“questions”: [
{
“id”: 10364,
“title”: “インデントにタブを使うことのデメリット”,
“created”: “2015-05-27 04:49:55”,
“modified”: “2015-06-22 15:17:06”,
“count_reply”:
[Go Snippet] “RANDOM USER GENERATOR” からの JSON を Unmarshal する
## 概要
[Random User Generator](https://randomuser.me/) というサイトで、ランダムなユーザー情報を取得できる JSON の API を提供している。早速使ってみる。
[API はこの URL (https://randomuser.me/api)](https://randomuser.me/api) からアクセスできる。
## Unmarshal したい JSON の構造を調べる
“`json
{
“location”: {
“street”: “9278 new road”,
“city”: “kilcoole”,
“state”: “waterford”,
“postcode”: “93027”,
“coordinates”: {
“latitude”: “20.9267”,
“longitude”: “-7.9310”
}
}
}
“`この構造は、こう