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

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

CloudFrontは同じURL+QueryStringでもキャッシュ応答しないケースがある

## はじめに

あるAPIサービスが、CloudFront + API Gateway + Lambda という構成で稼働しており
CloudFrontは、`URL+QueryString`ごとにキャッシュし、応答速度をあげるために使用しています。

## 事象

このAPIサービスには、Go/PHPそれぞれで実装されたプログラムがHTTPリクエストを送ります。
CloudFrontの設定は以下の通り。(関連設定のみ)

| 設定項目 | 設定値 |
|——–|——-|
| Cache Based on Selected Request Headers | None |
| Object Caching | Customize
MinTTL:0
MaxTTL: 86400
DefTTL: 86400 |
| Forward Cookies | None |
| Query String Forwarding and Caching | Forward all, cache based on all |
| Compress Objects Auto

元記事を表示

兵庫県のCOVID19感染者状況のGraphQL APIを公開してみた。

# どんなAPIにしたか
3分ごとに
↓↓↓よりエクセルファイルをダウンロードし
https://web.pref.hyogo.lg.jp/kk03/corona_kanjyajyokyo.html
読み込んだデータをDBに書き込みます。
別のコンテナにgraphQLサーバーを用意して配信します。

# コンテナ構成
– DB自動書き込み用コンテナ(pythonで実装)
– GraphQLサーバー(Goで実装)

# ところが、残念ながら…
リリース後
定期実行される
pythonが読み込んでいる
エクセルファイルに想定外の変更が
`before`
スクリーンショット 2020-03-18 17.12.10.png

`after`
画像の通りなんと空のセルで表現した二重線が追加されてしまいました。
ここ

元記事を表示

Mステで好きなアーティストを見逃さないためのプッシュ通知サービス

# はじめに

たまの音楽番組で好きなアーティストのライブだけ見たいという要望があったので(僕)、見逃し防止Pushツールをつくりました。

# キーワード
・firebase
・ServiceWorker
・golang(beego)
・サブドメイン

# 成果物
[livepush(ライブプッシュ)](https://livepush.shijimi.work/)

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

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

元記事を表示

OTHERカテゴリの最新記事