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

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

【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のツールでもっとも重要なものは **コードジェネレータ** だと自分は認識している。
コードジェネレータ

元記事を表示

Let’s encryptのバグはNimで実装していたら防げたの?

[Let’s encryptのバグはRustで実装していたら防げたの?](https://qiita.com/komasayuki/items/02785730d486ec4b397f)
という記事を見かけたので、ではNimではどうなのかと思い書いてみました。

# はじめに
Let’s encryptのバグの原因はポインタに起因する実装ミスでした。
「Nimはいいぞ」と言うためだけにNimで実装した場合を検証してみます。

以下引用

> # 原因はなんだった?
> 詳しくは
> https://jovi0608.hatenablog.com/entry/2020/03/09/094737
> のステキなまとめを見たほうがいいのですが、
>
> シンプルにすると、このような実装です。
>
> “`fail.go
> func main() {
> var out []*int
> for i := 0; i < 3; i++ { > out = append(out, &i)
> }
> fmt.Println(“Values:”

元記事を表示

Tecpitの教材「【Go】技術ブログサイトを自作してみよう!」を試してみました / TechCommit企画

[テックコミット](https://www.tech-commit.jp/)さんのお年玉企画で[Tecpit](https://www.techpit.jp/)さんの「【Go】技術ブログサイトを自作してみよう!」を試してみましたので、情報をまとめて見ました!

### 自分の知識
GoはTour of Goを一度なぞった程度

### 完成物

https://damp-journey-45035.herokuapp.com/

### 教材の概要

マークダウンに対応した、記事投稿システムです

### この教材で学べる知識
– echoでサーバーたてる
– Modulesでモジュール管理
– pongo2
– sqlx
– goose(マイグレーションツール)
– freshでホットリロード
– basic認証のかけ方
– 多対多のリレーション
– herokuデプロイ

### ※Goの文法自体の説明はありません!
教材の注意書きにもありますが、Goの文法自体の説明はありません!
そこらは抑えている前提で話が進みます

### 感想
Goの文法はわかったけど、実際どうやって組み立

元記事を表示

ありの~ままの~DBスキーマを、go言語ソースコードに自動変換【xorm/reverse】

はい:clap:
今回ご紹介するのは、こちらの`xorm/reverse`です。
https://gitea.com/xorm/reverse

なんと!
DBのテーブル構造を直接見に行って、go言語の構造体ソースコードに自動変換してくれます。
対象DB種類も、MySQL以外に色々対応しています。

ライセンスは、MITかな?
LICENSEファイルには明示的には書いてないですが、xorm公式ページではMITとなっているので。
https://xorm.io/

こちら、実は2年以上前から開発されているようです。
以前はリポジトリはgithubだったんですが、親プロジェクト`xorm`と共にgiteaに移籍したみたいですね。

また当時のバージョンではC言語や他の言語ソースへもリバースできたんですが、リニューアル以降はまだ`language/golang.go`以外の出力プラグインは作られてないみたいですね。

パブリックリポジトリなので、gitea のアカウントを持ってなくてもマイPCからgit cloneできました。
ただ、EC2インスタンスからのgit cloneは失敗しました。

元記事を表示

Let’s encryptのバグはRustで実装していたら防げたの?

# はじめに
Let’s encryptのバグの原因はポインタに起因する実装ミスでした。
「Rustはいいぞ」と言うためだけにRustで実装した場合を検証してみます。

## 原因はなんだった?

詳しくは
[https://jovi0608.hatenablog.com/entry/2020/03/09/094737](https://jovi0608.hatenablog.com/entry/2020/03/09/094737)
のステキなまとめを見たほうがいいのですが、

シンプルにすると、このような実装です。

“`go:fail.go
func main() {
var out []*int
for i := 0; i < 3; i++ { out = append(out, &i) } fmt.Println("Values:", *out[0], *out[1], *out[2]) fmt.Println("Addresses:", out[0], out[1], out[2]) } ``` ValuesもAddressesも[0]~[2]で同じ値が表示

元記事を表示

OTHERカテゴリの最新記事