Go関連のことを調べてみた2020年03月13日

Go関連のことを調べてみた2020年03月13日

multiple-value in single-value context

“`go:main.go
package main

import “fmt”
import “strconv”

func main() {
str := “12”
num, _ := strconv.Atoi(str) + 1
fmt.Println(num)
}
“`

##本日のエラー
multiple-value strconv.Atoi() in single-value context
(一つの値が来るべきコンテキストに複数の値があるよ)

strconv.Atoi()は複数の戻り値を返すので、その実行結果に同文内で直接演算しようとしても当然できない。
戻り値を複数返せない言語を主に扱ってきた人は案外引っかかってしまうかも。(はい、私です。)

##対処
“`go
num, _ := strconv.Atoi(str)
num++
“`

##ちなみに

“`go
num := getNum() + 1

func getNum() int {
return 12
}
“`

元記事を表示

VSCode Remote DevelopmentでGolangの開発環境を爆速で構築する

この記事は[株式会社クロノス](https://www.kronos.jp/)の「~2020年春~勝手にやりますアドベントカレンダー」の10日目の記事です。

「~2020年春~勝手にやりますアドベントカレンダー」インデックスは[こちら](https://qiita.com/beeeyan/items/342d51fa301bcf81e9c0)(随時更新)

[前回の記事](https://qiita.com/maroKanatani/items/7ca85205430cead76817)で作成したカレンダーは[こちら](https://ad-calendar-992c5.firebaseapp.com/view-calendar/RJjcAaxRFnD5IPDw2bDq)

# はじめに
開発環境、どうやって構築していますか?
ローカルに色々インストールしちゃう人も多いと思いますが、言語のバージョン違いや環境変数などで、**「自分の環境では動くんやけど、他人の環境では動けへん。なんでや・・・」**みたいな光景を開発者であれば一度は目にしてきたのではないでしょうか。
解決方法はいくつか

元記事を表示

言語別AWS SDKのパフォーマンスの一検証

# 背景
## タグについて
AWSはリソースに[タグ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html)の付与が可能です。AWSにおけるタグはリソースの管理や[コスト配分](http://blog.serverworks.co.jp/tech/2019/07/29/cost-alloc-tags-basic/)の用途で用いられ、タグの付与設計はAWSの運用において非常に重要なポイントとなります。
特に大規模な環境や組織になるとリソースに付与するタグは非常に多くなる傾向があります。

## AWS SDK for Rubyのパフォーマンス
[こちらの記事](https://qiita.com/kure/items/19b1c17a56d81e2bb955)でも言及したようにAWS SDK for Ruby では、リソースにタグが大量に付与されている場合、一度に大量のリソースを取得する場合に大幅に時間がかかることがあります。
以下はEBSを例に、タグ付与のあり・なしとで、リソースの取得(d

元記事を表示

【Go】バイナリファイルからContent-Typeを取得する

# ファイルからContent-Typeを検出

バイナリの先頭ヘッダ`512byte`を読んで取得後、ポインタをもとに戻す

“`.go
func DetectFileContentType(file *os.File) string {
// 最初の512bytesを読む
buffer := make([]byte, 512)
file.Read(buffer)

// 有効なMIMEタイプでない場合は「application/octet-stream」が返る
contentType := http.DetectContentType(buffer)

// 読み取りポインターをリセットする
file.Seek(0, 0)

return contentType
}
“`

ファイルタイプを調べるライブラリ([h2non/filetype](https://github.com/h2non/filetype))によっては[先頭`261byte`だけ読んでる](https://github.com/h2non/filetype#file-header)のとかあった

元記事を表示

【Go環境構築】go getのプロキシ設定

# はじめに
社内でGo環境構築中に、go getのプロキシ突破で少し手こずったので備忘録。

# 環境
* windows10
* 社内ネットワーク(プロキシ環境下)

# プロキシ設定なしの場合のgo getエラーメッセージ
“`
C:\Users\xxxx>go get github.com/gin-gonic/gin
# cd .; git clone — https://github.com/gin-gonic/gin C:\Users\xxxx\go\src\github.com\gin-gonic\gin
Cloning into ‘C:\Users\xxxx\go\src\github.com\gin-gonic\gin’…
fatal: unable to access ‘https://github.com/gin-gonic/gin/’: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
package github.com/gin-gonic/gin: exit

元記事を表示

Golangで作成されたVimプラグインの配布方法について調べた

# まえがき
Golangのクロスコンパイルは非常に魅力的だと思うのですが、Vimのプラグインとして配布する場合に少し悩んだので、調査した内容を残しておきます。

## 配布方法1: ユーザーにビルドしてもらうパターン
ユーザーにGoのビルドをしてもらうケース。

基本的にREADME.mdのInstallationの項目に

“`shell
$ cd /ビルド可能なパス && go get -d && go build
“`

と書いておけばすむので、用意する側はかなり気楽です。

ユーザーに`go build`してもらえれば必ずその環境にあったバイナリが出来上がるのでこの点はメリットになりうるのですが、ユーザー側にGoの環境がなければいけないため、もしGoの環境がなければ使う側は少しハードルが高くなるかもしれません。

[参考: Go で Vim プラグインを書く – http://haya14busa.com/vim-go-client/](http://haya14busa.com/vim-go-client/)

## 配布方法2: バイナリを配布するパターン
バイナリ配

元記事を表示

bashのコードメトリクス測定ツールをgolangで実装してみた

# 何の話?
シェルスクリプトって、速度重視でついつい適当に書いちゃいますよね。
プロダクション環境に納品するものであっても、動けばいいや感もあったり。
で、こんな現状を打開すべく、なんかいいツールなり何なりないかな?って思って探してみました。

# codestyle
Googleの[styleguide](https://google.github.io/styleguide/shellguide.html)がしっくりきました。
日本語訳していただいている、すばらしい[記事](https://qiita.com/laqiiz/items/5f72ca668f1c58176644)もあります。(ちょっと古いかも)

# shellcheck
上述のstyleguideでも記載されていますが、規模の大小問わず、[shellcheck](https://github.com/koalaman/shellcheck)はしましょうと言っています。完全同意。
最初は指摘がうっとうしいな〜と思うのですが、慣れてくると問題ないかと。

# comment
Googleのstyleguideにおける

元記事を表示

Serverless Framework での AWS Lambda + Go ローカル開発事情

Serverless Framework での最近の AWS Lambda + Go ローカル開発事情について紹介します。

## はじめに

Lambda 開発という面では公式の [SAM CLI](https://github.com/awslabs/aws-sam-cli) の登場以降影が薄くなりつつある [Serverless Framework](https://serverless.com/) (以下 serverless)ですが、serverless 特有の便利機能や豊富なプラグインは魅力的ですし、過去に serverless でシステムを組んでしまったために今更 SAM に移行できない等の理由などからまだまだ使われるケースはあるのではないでしょうか。
とは言えやはり今から Lambda でサーバレスアプリケーションの新規開発をしようというケースでは中々 serverless は採用しにくいものがあります。
というのも Lambda 開発において最も重要視される要素の1つであるローカル実行機能という面において、serverless は SAM CLI に劣っているためです

元記事を表示

【Go】HTTPサーバがexitする直前に、後始末処理を仕込む!(コネクション開放とか)

はい:clap:

今回ご紹介するのは、こちらの`nasa9084/syg`です。
https://github.com/nasa9084/syg

* Golang: 手軽にシグナルをListenしてcallback関数を呼ぶ
https://blog.web-apps.tech/go-signal-more-simply/

これを使えば、HTTPサーバがexitする前に、任意のコードを仕込めてしまいます。
ありがてぇ…ありがてぇ…

# 経緯

GoでHTTPのRESTAPIサービスを作っていて、その中でRedisのコネクションをプールして使いまわす機能を作りました。
そうするとやっぱ、サービスが終了(HTTPサーバが停止)するときにコネクションをちゃんと開放しなきゃですよ。

「でも、`http.ListenAndServe`を実行してるところに`defer func`を仕掛けりゃいいだけッスよね? ちょろいちょろい♪」

とナメていたら…

`defer func`が実行されない!!

どうやら`os.Exit(code int)`が発動すると、`defer`がか

元記事を表示

golangでAWSのS3でPre-Signed URLを作成するコード

“`go
package main

import (
“fmt”
“time”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/credentials”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
)

func main() {
accessKey := “your accessKey”
privateKey := “your privateKey”
region := “ap-northeast-1”
bucketName := “your bucketName”
fileName := “gazou.png”

creds := credentials.NewStaticCredentials(accessKey, privateKey, “”)
sess := session.Must(session.NewSession(&

元記事を表示

GinのBindJSONでデータが取れない問題

# 結論
BindJSONしようとしているstructのfield(?)はpublicにしておかなければならないようです。
struct宣言とリクエストハンドラ宣言が同じpackage内だったとしても!

“`go
type User struct {
// name string -> ダメ
Name string
}

// Post POST method
func Post(ctx *gin.Context) {
var user User
ctx.BindJSON(&user)
fmt.Println(“name:”, user.Name)
}

“`

# 考察

もしかしたらstructがBindJSON()に渡されるとき、fieldがpublicじゃないとgin側から見えないのかな(??)
みたいな?

# あとがき

この問題について、参考に貼ったissueくらいで、日本語のものが見つからなかったので書きました。
くだらない記事ですが、初心者同志の手助けになれば幸いです。

# 参考
[解決のきっかけとなったissue](https://git

元記事を表示

【Go】気になる go get オプション

## go get
たまに `go get ~`の書き方で、`-v`とか `-u` をつけるのをよく見るので少し調べてみました。
下記記事を主に参考にしました。
[go – The Go Programming Language](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them)

## -v
> The -v flag enables verbose progress and debug output.
[go – The Go Programming Language](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them)より引用

**日本語訳**
-vフラグは、詳細な進行状況とデバッグ出力を有効にします。

これは デプロイするときのDockerfileにはつけるの必須ですかね。

## -t
>The -t flag instructs get

元記事を表示

[Windows] Dockerを使用してホスト環境を汚さずにgqlgenの開発環境を構築する

### TL;DR
– Go言語の開発環境をDockerをまとめたかった
– ローカル環境にはDocker Desktopとvisual studio codeのみインストール
– gqlgenでapiサーバを構築している想定
– vs codeのリモートコンテナ機能を使ってみた
– リモートコンテナ使うとgitの管理を考えないといけないことに気がついて頭が痛い

### 環境
– Windows10
– Docker Desktop 2.2.0.3
– docker-composeはDocker Desktopに同梱
– visual studio code 1.42.1[Remode Development使用]
– cosmtrek/air オートリロード

### 完成したリポジトリ
https://github.com/MegaBlackLabel/go-docker-sample

### ファイル
“`
\—go-docker-sample
│ .gitignore
│ docker-compose.yml
│ docker-entrypoint.sh

元記事を表示

go modules での メジャーバージョンのあげ方

## v2以上にアップデートするにはコツがいる
golang でライブラリを作ったとき、破壊的変更をしてメジャーバージョンをアップデートするには少しコツが必要です。
サンプルの構成は以下の通りです。

“`tree
/hello
├── go.mod
└── hello.go
“`

“`go.mod
module github.com/example/hello

go 1.14
“`

“`hello.go
package hello

func Hello() string {
return “hello”
}
“`

### vX.0.0 を作る
機能に破壊的変更を加え、コミット、プッシュします。
このコミットに対して `vX.0.0` タグ(X には任意のバージョンが入る) をつけてください。
**この時点では他リポジトリから利用できません**

“`hello.go
package hello

func HelloV2() string {
return “hello v2”
}
“`

### vX.0.1 を作る
`go.mod` のモジュー

元記事を表示

kindle本の発行情報をSlackに連携したい

### 動機

– 最新の技術本の発行情報を知りたい。
– でも自分は毎日kindleの発行情報をあんまり見ない。
– slackで自動通知、技術本が発行された時だけ来るのが一番ベスト。

### 対策
– 最初はProduct Advertising APIを使いたいと考えたけど、このAPIはアカウント作成が必要で、しかもアカウント作成には審査がいる。この審査はウェブサイト或いはモバイルアプリが必要になるので、slack通知だけのために使うのは無理かも。

– そこでProduct Advertising APIを使っているサービス [キンセリ](https://yapi.ta2o.net/kndlsl/) から発行情報を取得することにした。

### 実装方法

– golang + [agouti] (https://github.com/sclevine/agouti) でクローラを作る。
– [Incoming Webhook](https://slack.dev/node-slack-sdk/webhook) を利用してslackに通知。

### 結果

元記事を表示

gin,gormを使ってgolangでRailsっぽい構成のAPIを作った

#概要
– 仕事で`golang`を使ってみようという話になりAPIを作りました。
– 自分自身も他メンバーも`Rails`使いが多いのでRailsに寄せてMVC構成で作りました。
– `golang`に慣れたメンバーが少なかったのでできるだけ[メジャーで情報が多そうなフレームワーク](https://qiita.com/yumin/items/5de33b068ead564ebcbf)を使おうと考えて`gin`を採用しました。
– 同様にORMも`gorm`がメジャーなようだったので採用しました。
– `golang`自体が手探りの状態だったので主に以下を参考にさせて頂きました。
– 日本語のQiitaの記事[Gin と GORM で作るオレオレ構成 API](https://qiita.com/Asuforce/items/0bde8cabb30ac094fcb4)
– Starが多かった[深センの方が作ったAPI](https://github.com/eddycjy/go-gin-example)
– 自分でもサンプルAPIとして[gin-gorm-rails

元記事を表示

春休みの宿題

#春休みの宿題一覧

春から情報科学研究科に進学するのでこの春休みに準備しなければいけないことをまとめておく。

##プログラミング言語

– [C言語本格入門](https://www.amazon.co.jp/C言語本格入門-基礎知識からコンピュータの本質まで-種田-元樹/dp/4774196169)
– [C++プログラミング〈Vol.1〉 (Computer Science Textbook)](https://www.amazon.co.jp/C-プログラミング%E3%80%88Vol-1〉-Computer-Science-Textbook/dp/489471115X)
– [C++プログラミング〈Vol.2〉 (Computer science textbook)](https://www.amazon.co.jp/C-プログラミング%E3%80%88Vol-2〉-Computer-science-textbook/dp/4894711168)
– [エキスパートPythonプログラミング改訂2版](https://www.amazon.co.jp/エキスパートPytho

元記事を表示

StackDriver Monitoring APIを使ってGCPのメトリックの値を取得する

# 概要
GCPの監視を行うため、`StackDriver` から値を取得し
しきい値を超えていないかチェックする [Nagios](https://ja.wikipedia.org/wiki/Nagios) 用のプラグインを`Golnag` で作成しました。
https://github.com/yuukichi-nankou/check-stackdriver-go

その際、苦戦したので `Golang`で `StackDriver Monitoring API`から値を取得する方法をまとめます。

> つい先日、StackDriverが管理コンソールに統合されました。
> https://cloud.google.com/blog/products/management-tools/cloud-monitoring-dashboards-using-an-api
> それに伴い、管理画面では単に Monitoring という名称になっていますが、
> 本記事では StackDriver Monitoring と記載しています。

# StackDriverからSDKを使って

元記事を表示

Adafruit Trinket M0でTinyGo(外部LED編)

#はじめに
[第2回](https://qiita.com/quadnine/items/829a291c93a1c71a88e1)に続き、今回はTinyGoに外部LEDを接続して点滅させてみる
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0
* LED: [Grove Red LED](http://wiki.seeedstudio.com/Grove-Red_LED/)

LEDは[スイッチサイエンス](https://www.switch-science.com/catalog/1254/)か[マルツ](https://www.marutsu.co.jp/pc/i/829294/)あたりで通販可能

#配線
| Trinket M0 | Grove LED |
|:———-:|:———:|
| D0 | SIG |
| – | NC |
| 3V3 | VCC

元記事を表示

OpenAPI3 + OpenAPI generator でgolangサーバ・TypeScriptクライアントの実装を試す

昨今のマイクロサービス化の流れに伴い、サービス間の情報のやり取りのルールをスキーマとして定義してクライアント、サーバーの開発を行うスキーマ駆動開発が取りた出されている。

今回はOpenAPI3(旧Swagger)をスキーマ駆動開発のツールの一つとして取り上げたが、意外と踏み込んだHello Worldの記事が少なかったので書いた。

## 対象読者

* 最近swaggerやOpenAPIという言葉を聞いて試してみたいが導入に悩んでいる人
* 普段からAPIを使用した開発を行っているがOpenAPIを使ったことがない人
* Dockerや特定プログラミングをある程度まで習熟している人

## OpenAPIとは

REST APIのリクエスト方法やパラメータなどの仕様の記述する定義。
OpenAPIはswaggerで使われていたツールが利用可能で、それらを利用することでAPI仕様書の表示・作成、API仕様に則ったサーバ・クライアントのコード生成が行えるようになる。

OpenAPIのツールでもっとも重要なものは **コードジェネレータ** だと自分は認識している。
コードジェネレータ

元記事を表示

OTHERカテゴリの最新記事