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

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

お前らのGo開発環境は間違っている!GOPATHからの解放。

#Welcome Gopher

Gopherの皆さんこんにちは。

Goの環境構築をより使いやすく、そしてシンプルにするためにこの記事を書きました。

Goの環境構築時に、GOPATHを設定した方が対象です。

## GOPATHからの開放

Goの開発環境を構築する際に、`GOPATH`を設定する記事が散見されます。

しかし、時代は変わるもの、Goのエコシステムも大きく変わろうとしています。

長い間Goの環境を支えてきた`GOPATH`も、`Go 1.13`からは廃止されたようです(たぶん)

Goの[ブログ](https://blog.golang.org/modules2019)にも記載されています

>Our aim is for Go 1.13, scheduled for August 2019, to enable module mode by default (that is, to change the default from auto to on) and deprecate GOPATH mode. In order to do that, we’ve b

元記事を表示

エンジニア向けオープンプロジェクトトレース

https://www.reiwarss.com/OpenProject

Top tags
python
swift
javascript
go
C
C++
C#
Ruby
TypeScript
PHP

元記事を表示

fasttextでwebサイト分類したかった

[Wano株式会社](https://wano.co.jp/)のfushimiです。
先日、弊社の2020年の開発合宿(一泊二日)でやったネタを投稿します。

合宿日記も兼ねてるので完全にとりとめのない時系列順の出来事の羅列になりますが、ご容赦ください。

# 未知のwebサイトの自動カテゴリ分けをしよう
自然言語処理や機械学習は全然わからん勢なのですが、せっかくの合宿なのでwebサイトのコンテンツ解析をして遊んでみました。

作るものとしては表題通り、**webサイトのカテゴリ分類器** です。

あらかじめ決めたカテゴリ分類に応じて、入力された未知のWebサイトが適切にカテゴライズされることを目的とします。

## アプローチ

### 学習
* カテゴリごとのメディア記事をクロールして大量に集める
* 記事をきれいにする
* 記事を形態素解析する
* fasttextで学習済みモデルを作る

### テスト
* 入力されたwebサイトのコンテンツをいくつか集める
* コンテンツをきれいにする
* コンテンツを形態素解析する
* 学習済みモデルに食わせて思った通りにカテゴリ

元記事を表示

[Firebase Authentication]IDトークンをRevokeさせないユーザー情報更新

# はじめに

Firebase Authenticationはドキュメントはかなり充実しているが、
実務で足りない箇所があったため、備忘録的に残しておきます。

実装はGoとAngularで書かれています。

# IDトークンのRevokedをチェックする仕組み

フロント側でAuthorizationヘッダーにIDトークンを追加して、
APIのmiddlewareにてAuthoraizationヘッダーを検証します。

“`ts:auth.ts
@Injectable({
providedIn: ‘root’
})
export class Auth {

constructor(public afAuth: AngularFireAuth) { }

// getIdToken IDトークン
getIdToken(): Observable {
return this.afAuth.idToken;
}
}
“`

“`ts:http.token.interceptor.ts
@Injectable()
export class

元記事を表示

Docker + Go の Hello Worldビルド

Dockerの中で go をビルドして、Hello World することがゴールです。
手順をシンプルに書いていきます。

まず Docker と Docker-compose を入れておきます。これは省略します。

# Dockerディレクトリを作成

以下のようにファイルを作ります。

“`
./docker
./docker/.env
./docker/docker-compose.yml
./docker/go
./docker/go/Dockerfile

./src/
./src/go
“`

# Dockerの設定

## Docker全体用の設定

今回はコンテナは1つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。

“`shell:.env
COMPOSE_PROJECT_NAME=go-docker-starter
“`

## goビルド用コンテナ

“`docker:docker-compose.yml
version: ‘3’
services:

go:
build:

元記事を表示

【Go】ポインタと変数宣言(new, make)

Goには複数の変数宣言(メモリ割り当てと値の初期化方法)がある

&T{…}、 &someLocalVar、 new、 make など

## ポインタ型

基本こちらで理解

[ポインタ メモリアドレスの秘密](http://wisdom.sakura.ne.jp/programming/c/c20.html)

[徹底図解!C言語ポインタを初心者向けに分かりやすく解説](https://daeudaeu.com/programming/c-language/pointer/)

[Go言語のメモリ管理](https://ascii.jp/elem/000/001/496/1496211/)

## 自分なりの整理

・ポインタ型とはメモリアドレスを格納することができる変数

→ ポインタ型(=大元アドレス保持型)
→ 指定された変数のアドレスを保持、その大元アドレスを参照し新たにデータ領域を作成する

## 【ポインタ型の宣言】 「new」 または 「&変数 によるアドレス指定」

基本こちらで理解

[Why would I make() or new()?
](ht

元記事を表示

GAE/Go 2nd generationでDatastoreのmutationを使う上でトランザクションに気をつけろ!

僕は普段GAE/Goで開発をしているのですが、自社でdatastoreの機能をまとめたライブラリを作ることになって、[GoDoc](https://pkg.go.dev/cloud.google.com/go/datastore?tab=doc)を読んでいるときに初めて知ったのですが、datastoreにMutationがあるのをしりました!
それでMutationの使い方や使い所の記事を探したのですが、SpannerのMutationの記事と[公式ドキュメント](https://cloud.google.com/datastore/docs/reference/data/rest/v1/projects/commit?hl=ja)しか出て来なかったので、自分で記事を書くことにしました!

# Mutationとは?

自分が探した限り、datastoreのmutationに関する説明は書いていなかったので、何とも言えないんですけど、
Insert, Update, Upsert, Deleteを一括で行うもので、副作用を起こすものですね

で、何がよくなったかというと

– Inse

元記事を表示

【Go】変数宣言の違い( := 、 var )

## 変数宣言の違い( := 、 var )

基本的にはこちらで理解

[他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7#%E6%A6%82%E8%A6%81)

## 自分なりの整理

#### :=

・varとタイプ型を省略(自動判断してくれるのか、初期化の時間・容量に無駄がでるのか)
・関数内のみで宣言可能

#### var

・指定したタイプ型によって初期化される(ポインタ型はnilで初期化)
・関数外でも宣言可能

“`Go:
func main() {
var a int
var b string
var c []int

var d *int
var e *string
var f *[]int
g := 1

fmt.Println(a)
fmt.Println(b)
fmt.Println(c)

fmt.Println(d)
fmt.Println(e)
fmt.Println(f)

fmt.Println(g)

元記事を表示

GoとVue.jsでTrello風Webアプリケーションを作成してみた

## 作ったもの

最近、プログラミングから少し離れていたので、思い出すこともかねてTrello風のWebアプリケーションを作ってみた。

![vue-trello – Google Chrome 2020_03_17 3_05_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279498/b545e34f-a1da-e8aa-97e0-ce7653247eb2.png)

▼デモ( https://x-color.github.io/vue-trello )
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279498/7f07b984-ce2b-8db6-c8d4-c11ff41d7c34.gif)

▼完成品のリポジトリ
Go で GitHub App (Bot) を作る

シンプルな GitHub App (Bot) を Go 言語で作ってみます。
順を追って作り方を解説していくので「サンプルコードだけ見たいよ」という方は[「まとめ」](#まとめ)に記載されているものをご参照ください。

## 作るもの

下図のように Issue を作成すると `hello, ${username}` と反応してくれる Bot を作ります。

![githubapps1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586035/a648cead-5d5c-d8ac-d02c-854abd86e05e.png)

## 準備

GitHub に動作確認用のリポジトリを作っておきしょう。

また、GitHub から Webhook イベントを受け取る必要があるので、パブリックアクセス可能な URL が必要です。
今回は開発しながら適宜動作確認が行えるように [ngrok](https://ngrok.com/) というプロキシサービスを利用してローカル開発マシンのポートをインターネットに

元記事を表示

Go の json.Marshal の思いがけない仕様

# 結論

`json.Marshal` は、`uint8` 型のスライスを base64 文字列にする。
`int8` 型だったり スライスじゃなくて配列だったりすると配列になるけど。

# ソースコードと実行結果

“`golang:golang
package main

import (
“encoding/json”
“fmt”
)

type S struct {
U8Array [3]uint8
U8Slice []uint8
S8Array [3]int8
S8Slice []int8
U8SliceP *[]uint8
PU8Slice []*uint8
IFSlice []interface{}
}

func main() {
a:=uint8(1)
b:=uint8(2)
c:=uint8(3)
o := S{
U8Array: [3]uint8{1, 2, 3},
U8Slice: []uint8{1, 2, 3},
S8Array: [3]int8{1, 2, 3},
S8Slice: []int8

元記事を表示

パワーワードが作れる?ランダム単語合成アプリを作ってみた

# はじめに
クリックするだけ!ランダムに2つの単語を「反応」させて、パワーワードを作りましょう!

![rand.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/df038918-b418-b274-9be1-20f82fcad614.gif)

モードは

– 形容詞+名詞
– 副詞+動詞
– 名詞+助詞+動詞

の3種類です!

![phrases.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/90a32f70-1533-99a7-3fec-3f38f772eb53.gif)

# ソースコード

[GitHub – Syuparn/LiteralReaction: ランダムに単語を「反応」させて、パワーワードを作ろう](https://github.com/Syuparn/LiteralReaction)

(DockerやVue.jsをはじめて使ったので、汚いところもあると思います…ツ

元記事を表示

Docker + VSCodeでGoの環境構築(ホットリロード対応)

## はじめに

個人開発で最近Go言語を使う機会が増えてきました。
Go言語で開発するにあたり私が感じたことは、

– Dockerで動かしたい
– ホットリロード機能が欲しい
– 開発用・本番用でコンテナを分けたい
– 開発時は、VSCode上でコンテナ内とリモート接続して作業したい

色々な方々のDocker環境を参考にDockerでGo環境を作りました。
よろしければ参考にしてください。

## ホスト環境
– Docker: ver.19.03.8
– docker-compose: ver.1.25.4
– VSCode: ver.1.43.0

## ホットリロード
Go言語でホットリロードをする際、調べていたら、

– fresh
– realize

があるのを知りました。
しかし、筆者は**realize** の方はエラー(`error: returned a non-zero code: 1`)が発生して`go get` ができませんでした。

一度コンテナを立ち上げて、コンテナ内で`go get` したらうまく行くのですが解決出来ませんでした…

ですので

元記事を表示

【Go】MySQLのTimestamp型カラム(日本時間が入ってる)をtime.TimeにするとUTCになってしまうのを対応する

こんにちは:smiley:

MySQLのTimestamp型カラムに`2020-03-12 15:00:00`(日本のおやつの時間!)が入っていて、それをGo言語のコードで`time.Time`型として取ってくると`”2020-03-12 15:00:00 +0000 UTC”`になってしまう。

あるとおもいます。

それを期待通りの値に直す小ネタです。

“`例.go

tempTime := dbResults[0].CreatedAt
location := time.FixedZone(“JST”, 9*60*60)
tempTime = tempTime.In(location).Add(-9*time.Hour)
log.Print(tempTime)
“`

* 強引に`JST`に変換します。
* そのとき勝手に9時間足されてしまうので、自前で引き直します。

“`bash
2020/03/16 19:44:57 2020-03-12 15:00:00 +0900 JST
“`

やったぜ。

元記事を表示

Go言語でSliceに要素が存在するか調べるには、要素個数を見るだけで良い ( #go : Error: slice index out of range )

“`golang
if len(mySlice) > 3 {
// …
}
“`

[How to check if a slice has a given index in Go? – Stack Overflow](https://stackoverflow.com/questions/27252152/how-to-check-if-a-slice-has-a-given-index-in-go)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3036

元記事を表示

Go言語でSliceを要素に持つStructを定義する例 ( #Go )

“`golang
package main

import “fmt”

type Card struct {
Names []string
}

func main() {
card := Card{[]string{“Ace”, “Jack”, “King”}}

fmt.Println(card.Names[0]) // Ace
fmt.Println(card.Names[1]) // Jack
fmt.Println(card.Names[2]) // King
}

“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3034

元記事を表示

Go 言語で declared but not used のエラーを回避したい。未使用変数だが名前はつけておきたい時は? ( #go )

未使用変数を無理やりアンダースコアに代入してエラーを防ぐ。

“`go
package main

func main() {
foo := “bar”

_ = foo
}
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3033

元記事を表示

Go言語のdelve でブレークポイントを設定してデバッグ実行する ( #go / dlv cli / dlv debug / set break point and debug with single go lang file )

# ファイル

こんなファイルがある場合

“`go
package main

import (
“fmt”
)

func main() {
fmt.Println(“A”)
fmt.Println(“B”)
fmt.Println(“C”)
fmt.Println(“D”)
fmt.Println(“E”)

foo()
}

func foo() {
value := “FOO”
fmt.Println(value)
}
“`

# delveの実行

go run みたいにファイル名を指定して実行する

“`
dlv debug go/dlv/main.go
“`

# ブレークポイントの指定

ファイル名+行数指定で3つのブレークポイントを指定してみる

例: `break main.go:9`

“`
(dlv) break main.go:8
Breakpoint 1 set at 0x10c23af for main.main() ./go/dlv/main.go:8
(dlv) break main.go:10
Breakpoint 2

元記事を表示

フロント・バックエンドサービスをコンテナ化してもGitコミット時にLefthookでテストやLint実行

### TL;DR
– フロント・バックエンドサービスをそれぞれコンテナ化、docker-composeで全てのコンテナを管理する
– monorepoで管理した際に1リポジトリとなるので気軽にGit Hookの処理ができない
– Lefthookを導入してpre-commit時にすべてのコンテナに対してLintツールを動作させるようにした

### サンプルコード
https://github.com/MegaBlackLabel/lefthook-docker-node-go-dev-sample

### 1リポジトリで開発環境を管理したい
渋川さんの記事

マイクロサービスほどじゃないけどウェブサービスを分割開発したい人向けDocker設定を集めるスレ
https://qiita.com/shibukawa/items/fd49f98736045789ffc3

を読んでフロントエンドとAPIがごっちゃになっている開発環境ヨクナイ!ってことでサービス単位でコンテナ化してvs codeのリモートコンテナ機能を使って開発環境を再構築をしていたらGitとGItHooksの扱いで躓

元記事を表示

Dockerコンテナ上で動くGinサーバーにアクセスできないエラーの解決法

## 概要
GolangのWebフレームワークである[Gin](https://github.com/gin-gonic/gin)を使ったAPIサーバーを、Dockerコンテナ上にデプロイして動かそうとしたところ、APIにアクセスできずかなり長い時間悩まされました。

結果的には、Ginサーバーのコードの書き方の問題だったことが分かったのですが、解決方法を念のためここにメモしておきます。

ちなみに、このエラーはWindows10及びAWS上のUbuntuサーバー(t2.small)で起こりました(尤も、実行環境はこのエラーの発生にあまり関係ないようでしたが)。
### 状況
Ginを用いたAPIサーバーを立てようとしていました。まだ環境構築の段階なので、コードは以下のようなモックのものになっています。

“`go
package main

import (
“log”
“os”
“github.com/gin-gonic/gin”
)

func main() {
logConfig()

r := gin.Default()
r.GET(“/accounting-a

元記事を表示

OTHERカテゴリの最新記事