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

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

Golang入門.1 -http.HandleでHello World!-

## はじめに
他の言語でweb開発の経験がある人 (筆者) がgolangに入門する際に勉強したことを一連の記事でまとめていきます。

## やること
記事においてはweb開発において必要な機能をはじめとした、ある程度実践的な範囲を対象とします。基本的には対象とする機能を実装したコードを記載します。またコードだけではなく、ドキュメントを踏まえた概念的な説明を挟んでいきます。

## やらないこと
開発環境の構築方法や基本文法の説明は省略します。

## 今回のテーマ
http.Handleを用いてHello World!を表示させるまでの流れを説明します。

## 概念編
以下は[net/httpのdocument] (https://godoc.org/net/http)から抜粋しています。
golangでは他の言語と同様にHTTP requestに応じてresponseを生成します。ざっくりとした流れは以下の通りです (簡単のため、今回はURLにのみ注目します) 。
1. HTTP requestの中身を確認する
2. URLをparseし、事前に登録しておいたpatternと

元記事を表示

Golangで、デザインパターン「Builder」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Builder」を学ぶ”](https://qiita.com/ttsubo/items/0860e31c392aa3b91ed5)

今回は、Pythonで実装した” Builder”のサンプルアプリをGolangで実装し直してみました。

# ■ Builder(ビルダー)
Builderパターン(ビルダー・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。
## UML class and sequence diagram
![W3sDesign_Builder_Design_P

元記事を表示

パケットフィルタの仕組みを理解しつつGoで特定のプロトコルパケットを取得(フィルタ)する

## 理解しておくと良い前提知識
– カーネル空間/ユーザー空間の違い
– ネットワークの基礎
– ソケットプログラミングの基礎

## 環境
“`bash
$ go version
go version go1.13.5 linux/amd64
“`

## パケットフィルタの仕組み
特定のプロトコルパケットをフィルタする前にパケットフィルタの仕組みについて記す。
※cBPFとeBPFの違い、現在のBPFの機能がパケットフィルタだけではないとか、BPFの歴史/変遷などについてはこの記事では触れていませんのでご了承ください:bow:

例としてtcpdumpでのパケットフィルタを用いる。
tcpdumpなどのパケットキャプチャツールはソフトウェアとしてユーザ空間で動作します。
また、tcpdumpでキャプチャされているデータはカーネル空間からコピーされたデータとなっており、直接アプリケーションなどがやり取りするパケットを覗いているわけではありません。(そんなことしてたらオーバーヘッドがやばい)
ユーザランドでフィルタをしていてはカーネル空間から実際にフィルタしたいプロトコルのパケッ

元記事を表示

goenvのコマンドチートシート

pyenvと似たような感じですね。

### コマンドチートシート
| command | 内容 |
| —- | —- |
| goenv commands | 使用可能なgoenvコマンドを全て表示 |
| goenv completions | –completeを指定して呼び出すことにより、自身および他のコマンドの自動補完を提供します。 |
| goenv exec | 指定した仮想環境のGoバージョンでファイルを実行する。
例)goenv exec go run main.go |
| goenv global |すべてのシェルで使用されるGoのグローバルバージョンを設定する。 |
| goenv help | コマンドのヘルプを表示
例)goenv help execとか、goenc help installなど、helpのあとにコマンドを入力すると、当該コマンドのヘルプを表示してくれる。 |
| goenv hooks | 特定のgoenvコマンドのフックスクリプトを一覧表示する。 |
| goenv init | g

元記事を表示

docker-compose upでMySQLが起動するまで待つ方法(2種類紹介)

##docker-compose upで立ち上がらないGoのコンテナがありまして

docker-compose up -dでコンテナを立ち上げる際、
なぜかWeb側のコンテナが立ち上がらないという現象が発生していました。

docker-compose up -d!

“`
docker-compose up -d
Creating network “api_network” with the default driver
Creating redis … done
Creating mysql … done
Creating api … done
“`

しかし調べてみると、、、

“`
docker-compose ps
Name Command State Ports
————————————————————————————————–
mysql .sh

元記事を表示

Progate無料版をやってみる【Go】

[前回](https://prog-8.com/go/study/1/1#/1)に引き続きProgate無料レッスンをやっていこうと思います。

今回はGoです。

Googleが開発したプログラミング言語です。

#Go
[公式レッスン](https://prog-8.com/go/study/1/1#/0)

###環境構築
[公式](https://golang.org/)からダウンロード

IDEは最近使用しているVSCodeでいこうかなと・・・。

インストール後、[Getting Started](https://golang.org/doc/)を行います。
どうやら環境変数に「c:\Go\bin」(c:\Goにインストールした場合)を追加する必要があるようです。

→ 確認したところ、すでに入ってました・・・。

VSCodeのGoプラグイン
https://code.visualstudio.com/docs/languages/go

###Goに触れてみよう
・Progateを真似て、`main.go`を適当なディレクトリに作成し、VSCodeでディレクトリを開

元記事を表示

忙しい人のためのGo入門

とりあえうz、Go始めてみようかなと思った人向け

# 忙しい人のためのGo入門

## そもそもGoとは
Goは,2009年にGoogleにより発表されたオープンソースのプログラミング言語です。

## Goの特徴は
シンプルな言語仕様,型システム,並行処理

## おすすめの講座
### progate Go講座
https://prog-8.com/languages/go

### dotinstall Go入門

### サンプルアプリ
Goでアプリケーションを作る講座
https://rightcode.co.jp/blog/information-technology/golang-introduction-environment-1

## 基本的な文法(公式ドキュメント)
http://golang.jp/category/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88

↓もわかりやすい
http://gihyo.jp/dev/feature/01/go_4beginners

## ユニットテスト

元記事を表示

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

# 宣伝
兵庫県のコロナウイルス特設サイトが公開中
https://stop-covid19-hyogo.org/
僕の公開しているGraphQL APIとは今のところ別働で動いていますが
かなり参考にさせて頂いておりますのでご紹介しておきます。

# hyogo.covid19-api
[GraphQLプレイグラウンド](https://hyogo.covid19-api.ga/playground)

**api内訳**

– [readInfectedPeoples](https://qiita.com/Inadati/items/24437af1435245eafa4f#readinfectedpeoples)
– [readExamOverviews](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamoverviews)
– [readExamDetails](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamdetails)

#

元記事を表示

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/)

OTHERカテゴリの最新記事