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

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

Goのreturn記録

Goのreturnについて学んだので、備忘録としてまとめます。

“`main.go
package main

import “fmt”

func add(x, y int) (int, int) {
return x + y, x – y
}

func main() {
r1, r2 := add(10, 20)
fmt.Println(r1, r2)

}

“`

元記事を表示

alpineのタイムゾーンを設定する

# goでtime.Now()するとUTCで困った
なにも考えず(知らずに)にdockerfileを以下のように書いていた

“`docker
FROM golang:1.13 as builder
WORKDIR /go/src/hoge
ENV GO111MODULE on
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .

FROM alpine:3.9
COPY –from=builder /go/src/hoge/main /usr/local/bin/main
EXPOSE 8080
ENTRYPOINT [“/usr/local/bin/main”]
“`
するとgoでtime.Now()したときにUTCが帰ってくる
サーバも当然こうなる

“`sh

/ # date
Fri Mar 20 16:05:22 UTC 2020
“`

WEBアプリはJSTで色々計算したいので無理やりこう書いてやれば変換できる

“`golang
//jst > utc
jst, _ := time.Lo

元記事を表示

A Tour of Go の Exercise: Web Crawler を書いてみた

# A Tour of Go
面白法人カヤックでGo書いてるギリ新卒の[koyo](https://twitter.com/koyomiyamura)です!
次の新卒が入ってくる時期になってきましたね。新卒でGo書く人は `A Tour of Go` やる時期なのかなーと思います。
Goを覚えるにはとてもいい題材なのですが、Exerciseが難しい笑(なので新卒の皆さんは全部解けなくてもいいと思います。私も去年は解けなかった)
特に最後の `Exercise: Web Crawler` が難しいですよね。1年仕事で書いてると、理解も深まるもので、苦戦しましたが良さそうなコードを書くことができたので、記事を書いてみました!

https://go-tour-jp.appspot.com/concurrency/10

## コード
“`go
package main

import (
“fmt”
“sync”
)

type Fetcher interface {
Fetch(url string) (body string, urls []string, err error)

元記事を表示

Goでデスクトップアプリを作る (QlovaSeed HelloWorld編)

# 概要
[QlovaSeed](https://github.com/qlova/seed)というクロスプラットフォームフレームワークを使ってデスクトップアプリを作ってみます。

# 環境
– `OS: Windows [Version 10.0.18362.720] `
– `Go: go1.13.8 windows/amd64 `

# 準備
## 1. プロジェクト作成
まず、プロジェクトを以下の手順で作成します。[^1]

“`bash
mkdir hello-world
go mod init hello-world
“`

## 2. go.modを編集

QlovaSeedをそのまま`go get`すると`blackfriday/v2`が取得できないので、以下のように`go.mod`を編集して解決します。[^2]

“`go.mod
module hello-world

go 1.13

require (
// …
//追加!!
gopkg.in/russross/blackfriday.v2 v2.0.1
)
//追加!!
re

元記事を表示

「Azure SDK for Go」とは別の独自サービスパッケージ

「[Azure SDK for Go のドキュメント](https://docs.microsoft.com/ja-jp/azure/go/)」サイトの「[Azure SDK for Go のインストール](https://docs.microsoft.com/ja-jp/azure/go/azure-sdk-go-install)」ページを読み進みています。

「[Azure SDK for Go を入手する](https://docs.microsoft.com/ja-jp/azure/go/azure-sdk-go-install#get-the-azure-sdk-for-go)」セクションにて、いくつかのAzure サービス用のパッケージは [Azure/azure-sdk-for-go](https://github.com/Azure/azure-sdk-for-go) とは別に用意されているとの記述があり、それらは主にストレージ サービスとメッセージング サービスのパッケージです。

**ストレージ サービス**

[File Storage](https://docs

元記事を表示

触り始めたので個人的な書き方のメモ

編集中。

# メモ
これはメモです。

# ソース

まずはダーッとソースを貼る。公式の使い方を見つつ適当に切ったり貼ったり。
gitとかで差分管理しながらやればいいんだろうけど、そういうの苦手。メモを大枠でどかっと載せて、あとから分解していこう作戦。気が向いたら更新。

“`golang
package gcp

import (
“context”
“crypto/tls”
“crypto/x509”
“encoding/base64”
“fmt”
“net/http”

“k8s.io/client-go/rest”
“k8s.io/client-go/kubernetes”
// istioはやりたいことに合わせてどれをimportするか変える
// 一覧:https://godoc.org/istio.io/client-go/pkg/clientset
// kubernatesと同じでclientsetから一通りのクライアント(とバージョンの組み合わせ)が取れる
istio “istio.io/client-go/pkg/clientset/v

元記事を表示

Golangで「アルゴリズム図鑑」で紹介されているソートを実装する

アルゴリズムの勉強とGoの勉強を兼ねて、[アルゴリズム図鑑 絵で見てわかる26のアルゴリズム](https://www.amazon.co.jp/dp/B07179Q3MJ/) で紹介されているソートを実装してみました。

各ソートの仕組みは、検索するとわかりやすい解説が出てくるかと思います。

初めてGoを触ったので、書き方がGoっぽくない可能性大です。
自分向けの備忘用途がメインですが、参考程度に使ってもらえれば嬉しいです。

## バルブソート

サンプルコード

“` main.go
package main

import (
“fmt”
)

func sort(nums []int) []int {
for i := 0; i < len(nums); i++ { isSwapped := false for j, value := range nums[:len(nums)-i-1] { if value > nums[j+1] {
nums[j] = nums[j+1]

元記事を表示

Goのwrap結局何がうれしいんや

#goのwrap結局何が嬉しいのか

先日go1.13から実装された[wrapについての記事](https://qiita.com/mochosan/items/eceacef3a8453cfdb3bf)を書いたのですが,自分で例とかも書きながら、これって本当にうれしいんか?というか何が嬉しいんやろという疑問がありました。そこで、自分の社内の先輩に嬉しいところを聞いてみたところ、なぁぁぁぁるほどぉぉぉというお答えを頂けたので、自分なりにまとめて書いてみようと思います。

#嬉しいところ

僕が前の記事でエラーをラップすると嬉しいこととして、下位の関数で発生したえらーを上位の関数にシンプルな形でエラーを返せるというような説明をしました。これは本当に嬉しいことでは無かったです。書きながら自分でも疑問だったのですが、結局unwrapするんだしwrapする必要あるのか?ということです。
本当に嬉しかった事としては、もし、下位の関数で定義したエラーを上位の関数に返してしまうと、上位の関数が下位の関数に依存してしまう事になります。ここで、エラーを上位の関数が定義したエラーでwrapする事で依存を防

元記事を表示

GAEでGo1.9からGo1.11へ移行したらストレージでマルチリージョンのバケットが使用されていた

*メモ的な感じで記載しています。

2020年3月2日に2020年2月請求として¥3円が発生。
何事かと思い請求内容を確認したところ、ストレージのマルチリージョンに対して請求があった。
今年の1月までは無料トライアル期間であったため気がついていなかった。

どうやら移行作業を行なった時からストレージのマルチジーリョンのバケットが使用されていることがわかった。

当時(昨年末)、Go1.9からGo1.11へ移行するため試行錯誤し、やっとデプロイできる様になったので、
問題なくデプロイできるか確認するために何度もデプロイを行なった。
(Mac のターミナルで gcloud app deploy を実行)
結果、ビルド?されたファイルが多く作成され、数百MBも使用していた。

調べた結果、次のことがわかった。
・デプロイするとローカルにあるソースがストレージ(標準?のリージョン)へアップロードされる。
・次に、Cloud Build サービスを使用してコンテナイメージを作成される。
・コンテナイメージが App Engine へ適用される。

ん?Cloud Build サービス?

Go

元記事を表示

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で実装)

# ところが、残念ながら…(2020/3/18)
リリース後
定期実行される
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)

元記事を表示

OTHERカテゴリの最新記事