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

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

Go + gin-gonic + Vue で作るWebアプリの始め方

この記事では Goと[gin-gonic](https://github.com/gin-gonic/gin) (Go の Web Application Framework) および webpack と Vue を使ってWebアプリを作る際の初期環境の構築方法について説明します。自分自信、webpackやVueのプロではないので、もっといい方法などあればコメント歓迎です。なおこの工程でできる完成品は https://github.com/m-mizutani/web-app-go に置いてあります。

## 構築手順

### webpack周りの設定

最初にyarnのパッケージを諸々追加します。 `yarn init` するとパッケージの内容についていろいろ聞かれるのでよしなに入力します。

“`bash
$ yarn init
$ yarn add -D @babel/cli @babel/core @babel/preset-env babel-loader webpack webpack-cli webpack-dev-server html-webpack-plugin

元記事を表示

MarkdownでのAA入力を対応してみた 【ぼくのがんがえたさいきょうの掲示板】

個人で作っている掲示板サイトがある。最近日本語対応を実装しているが、途中であることに気づいてしまった。

>「せっかく和訳したところでAA貼れないなら意味ない!」

AAは日本語の掲示板の不可欠な文化である。しかし現代のパソコンやスマホではAAが正しく表示されない場合が多い。これはどうにか解決したい。

# やりたいこと

私の掲示板はMarkdown記法で書き込む形だ。AAをそのまま入力すると、太字として認識されたり自動的に改行が入ったりする。2chの専ブラみたいにいい感じにAAを表示したい。

“`markdown
(´・ω・`)
“`

自動的にAAを認識するのは大変そうなので、AAタグを用意する。AAタグの中身をAA用のフォントに変えて、Markdown記法の`*bold*`などを無視する。

# 無理矢理AAタグを対応する

利用しているMarkdownライブラリは[russross/blackfriday](https://github.com/russross/blackfriday)だ。諸々があって今だにv1を使ってる。
このライブラリはHTMLの

元記事を表示

sqlxでのselect例

sqlxでのselect例

##Select
“`go
import (
“fmt”

“github.com/jmoiron/sqlx”
_ “github.com/go-sql-driver/mysql”
)

type Hoge {
ID int `db:”id”`
Name string `db:”string”`
}

tx, err := db.Beginx()
if err != nil {
fmt.Println(err)
}

query := `
SELECT
*
FROM
hoge
WHERE
name in (?)
`

names := []string{“foo”, “bar”}
query args, err := sqlx.In(query, names)
if err != nil {
fmt.Println(err)

元記事を表示

眺めて覚えるGo言語 その12 Map & Json

#json文字列([]byte)を定義してvar adrs []map[string]interface{}形式にマーシャルします。
“`json.go
package main
import (

“encoding/json”
“fmt”
“log”
)
func main() {
b:=[]byte(`[{
“ID”:1,
“Name”:”関波子”,
“Furigana”:”セキナミコ”,
“Sex”:”女”,
“Blood”:”AB”,
“Date”:”1980/07/31″,
“Tel”:”03-3060-4716″,
“MTel”:”090-7787-3784″,
“Mail”:”sk@eaccess.net”
},
{
“ID”:2,
“Name”:”小倉準司”,
“Furigana”:”コクラジュンジ”,
“Sex”:”男”,
“Blood”:”A”,
“Date”:”1973/10/08″,
“Tel”:”0166-36-3522″,
“MTel”:””,
“Mail”:”junzi-kokura@eaccess.net”
},
{
“ID”:3,
“Name

元記事を表示

Golangでの0-1ナップサック問題の実装

# Goで0-1ナップサック問題を解く
ナップサック?ナップザック?どちらも見かけるような気がします.
英語ではKnapsack(nˈæpsæk)なのでサックなような気がします.

## 目的・理由

最近仕事でナップサック問題で解決出来る問題と遭遇した.
仕事全体の中では非常に小さい問題ではあったがアルゴリズムが直接役に立ったことを大変嬉しく思っており,記念に初めて記事を書く.

Goで書くのはGoを書きたいというささやかで非常に素朴なアピールである.

## 想定読者

未来のわたし

## ナップサック問題とは

ナップサック問題には制約によって様々な解法パターンがあるが今回の対象となるのは,もっともオーソドックスな`0-1ナップサック問題`と呼ばれるケース.
以下に簡単な問題設定を記載する.

容量$W$のナップサック1つと,$N$個の荷物$a_i (1\le i\le N)$がある.
各荷物には重さ$w_i$と価値$v_i$が設定されており,$N$個の荷物からいくつかを選びナップサックに詰め込んでいく.
ただし,ナップサックに入れる荷物の重さの総和は容量$W$以下とならなけれ

元記事を表示

1byteをstringに変換

# Go Tourで分からなかったため
Go Tourやってて調べても分からなかったため。実務で使うかは不明。
https://go-tour-jp.appspot.com/methods/18
もっといい方法があったら教えていただけると嬉しいです!

# fmt.Sprintで変換

“`golang
str := fmt.Sprint(byte(255))
fmt.Println(str) // -> 255
“`

元記事を表示

dockerのscratchイメージでgolangのWebアプリを動かす

[Best practices for writing Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) [(参考訳v18.09ベース)](https://qiita.com/zembutsu/items/a96b68277d699f79418d)を参考に、golangで書いたWebアプリを動かそうとしたらハマったので、その記録を残します。

## ざっくりいうと

1. golangで書いたwebアプリ(サンプル)を、[dockerのscratchイメージ](https://hub.docker.com/_/scratch)上で動かそうとしたら起動で失敗
2. 調べたらダイナミックリンクでビルドされており、scratchイメージではファイルが足りなかったのが原因
3. スタティックリンクでビルドし直したら解決した

## 環境

* go 1.13.5
* docker 19.03.5

## ハマるまでの流れ

[“Use multi-stage build

元記事を表示

Golang + gRPCで開発を始められるDockerfileを作る

# 概要
Go + gRPCで開発を行う為の環境構築方法を解説します。

環境構築はDockerを利用します。

gRPCの詳しい説明はこの記事では行いません。

# 想定読者

– Dockerの基礎知識をお持ちの方
– GoLangの基礎知識をお持ちの方
– Go + gRPCでの開発に興味がある方

# サンプルコードをGitHubに登録してあります

以下にサンプルコードを用意してあります。

https://github.com/keitakn/golang-grpc-server

[こちら](https://github.com/keitakn/golang-grpc-server/blob/master/Dockerfile) がDockerfileの中身になります。

以後はこのDockerfileを作り上げるまでに実行した手順を解説しますので、 [こちら](https://github.com/keitakn/golang-grpc-server/blob/master/Dockerfile) を見て理解出来る方はこの記事をこれ以上読む必要はありません。

# Do

元記事を表示

golang で aws s3v4 の署名キーを作成する方法

# aws s3v4 署名バージョン
aws s3 は version4 より署名プロセスが変わっています
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html

## 署名作成の流れ

1. 署名に必要なキーを作成する(本記事はここ)
2. 1.で作成したキーを使って署名を作成する

## 各言語での署名キー作成方法

各言語の署名キー作成フローは以下の文書にまとまっています。しかしながら、`Java`, `.NET (C#)`, `Python`, `Ruby`, `Javascript` のサンプルコードはあっても、Golangのサンプルコードは存在しません
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-v4-examples.html

そのため、本記事ではGolangで version4 用の署名取得処理のサンプルコードを載せることとします
ちなみにですが、本記事では署名キーを作成する部分の説明であり

元記事を表示

ときにはencoding.TextUnmarshalerの話を

飛ばねえホリネズミはただのホリネズミだ…

## うんざり

最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいってもMarshalXXXだのString()だの実装するのDARUすぎませんか。
ここはJSONだからMarshalJSON実装して、こっちはYAMLだからMarshalYAML実装して…
アッ、素敵なHogeフォーマットなんてものを考えたんですね。じゃあMarshalHoge実装しなきゃですね(にっこり)

だいたいGoだとPrimitiveな型を`type Hoge int`とかやりがちなんで、
書くモンが多い多い。

“`go
type Hoge int

func (h Hoge) MarshalJSON() ([]byte, error) {

}

func (h Hoge) UnmarshalJSON(raw []byte) error {

}

func (h Hoge) MarshalYAML() ([]byte, error) {

}

func (h Hoge) UnmarshalY

元記事を表示

golangで文字列からキー付きでsha256ハッシュ化する方法

# キー付きでハッシュ化

キー無しでハッシュ化する方法は以前記事([golangで文字列からsha256でハッシュ化する方法](https://qiita.com/mergit/items/ffdb405173dee651856d))を執筆したのですが、今回はキー付きでhash化する方法です。

“`golang
// キー無しでSHA256
func getBinaryBySHA256(s string) []byte {
r := sha256.Sum256([]byte(s))
return r[:]
}

// キー有りでSHA256
func getBinaryBySHA256WithKey(msg, key string) ([]byte, error) {
mac := hmac.New(sha256.New, getBinaryBySHA256(key))
_, err := mac.Write([]byte(msg))
return mac.Sum(nil), err
}
“`

## サンプルプログラム

hash化は不可逆変換ですが、同じ文字

元記事を表示

golangの並行処理のための言語要素に対応するCSPの記述を理解して形式検証の実践を開始しよう(記述編)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/20730446-dabe-52d5-da91-59b75f636534.png)

# はじめに

go言語には、「スレッドの生成・起動」、「スレッド間の通信」といった、いわゆる「並列処理」を意識した言語要素があります。
このような言語要素を使って書く並行処理は、多くの場合振る舞いが複雑で正しいことを保証するのが難しくなります。

本記事では、そのような複雑な振る舞いになりがちなgoで書かれた「並行処理」の振る舞い設計を[CSP(Communicating Sequential Process)](https://ja.wikipedia.org/wiki/Communicating_Sequential_Processes)という形式言語を使った記述と対応させます。そうする事で、並行処理を含むgo言語のコードの振る舞い検証をするための第一歩、「記述」についての説明を試みます。

尚、本記事で「遷移図」として利用した図は、[P

元記事を表示

DockerfileのRUN命令

# お題
DockerfileのRUN命令はコンテナ内で実行されるコマンドを書くんだよというだけの話。
※便宜上、Golangアプリのコンテナ化を事例とする。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.2 LTS (Bionic Beaver)”
“`

## # Dockerコンテナ
### Docker
“`
$ sudo docker -v
Docker version 19.03.5, build 633a0ea838
“`

# [RUN](http://docs.docker.jp/engine/reference/builder.html#run)

### どこに対して実行されるのか?

Dockerfileは自分の作業PC上で書いている。
Dockerfileは「こういうコンテナを作ってね」という指示書のようなもの。
RUNコマンドは、[FROM](http://docs.docker.jp/engine/reference/bui

元記事を表示

GoとLambdaでAWS使用料金を毎日LINE通知させる

## AWSの使用料金こわい
おっしゃ AWSのコンソールいじるで〜 :nerd:
お、そういや〜AWS今いくらかかっとんねんやろ :nerd:
マイ請求ダッシュボード ポチ〜っと :nerd:
awsbilling.png

んん!?? :innocent::innocent::innocent:

ECSを放置して$100超えの請求がきたり、
キルしたはずのRDSインスタンスが知らぬ間に復活していて地味に$40くらい請求がきたり、
~~この通過儀礼を~~いい加減なんとかしようと簡単な料金通知システムを作りました。 :nerd:

## やったこと
Go言語でLINE notifyの通知APIをキックする関数を実装して
AWS Lambdaにデプロイ:nerd:Cronで定期実行して、毎日AWSの使用

元記事を表示

【Go】GOPATH変更できないときにやったこと

#### 1. はじめに
[anyenv](https://github.com/anyenv/anyenv)経由でインストールした[goenv](https://github.com/syndbg/goenv/goenv)ですが
どうにもGOPATHやGOROOTの設定が動いてくれませんでした。
(結果としてGOPATH設定変更しなくて良かったようですが)
GoのWebフレームワーク [echo](https://echo.labstack.com/)を導入するときに、インストール先がGOPATHが設定されているディレクトリだったので「なんかそこじゃ嫌だな〜」と思って、GOPATH設定変更を試みました。
そのときに行ったことを備忘録として書きます。

*Homebrew、anyenv、goenvのインストール手順は書いていません。
お気付きのことがあれば、コメントいただけると幸いです。*

#### 2. 環境

“`
macOS Mojave ver. 10.14.6
Homebrew インストール済
go version go1.13.5 darwin/amd64
shell

元記事を表示

Golang入門記事の没ネタサンプルコード

Golang入門中です。

以前、以下の記事を書きました。
[Golang入門:AtCoderなどの競技プログラミング問題を解き始めるための基本構文+その他おまけTips](https://qiita.com/shiro01/items/4e12a48816ecd47c0c0e)

記事に載せようかと思い書いてみたけれど、
趣旨から外れるため除外したサンプルコードをせっかくなのでまとめて公開したいと思います。

入門者によるざっくり試してみたコードの羅列ですが、参考になれば幸いです。

#型宣言

基本の型から独自の型を宣言できます。

“`golang:newType01.go
package main

import (
“fmt”
)

// intから新しい型を宣言
type aInt int
type bInt int

func main() {
var a aInt = 5
var b bInt = 55
hoge(a, b)

// 数値はaInt型,bInt型に代入できるので実行可能
hoge(5, 55)

// intだとエラーになる
// エラ

元記事を表示

AWS CodePipelineでgoアプリのDockerイメージをECRに格納する

## 実現したいこと
1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
1. hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う

## 環境
– Golang 1.13.5
– Docker 18
– AWS 東京リージョン

## やったこと
### CodeBuild構築
– プロジェクト名は任意の名前

– 送信元
送信元はCodeCommitの対象リポジトリを選択

スクリーンショット 2020-01-10 15.53.22.png

今回はmasterマージをトリガーにするのでリファレンスタイプは

元記事を表示

GoでデバッグのためにgRPCのリクエストをトレースする

Go で gRPC が使われているライブラリを使っている時に、ライブラリが投げている実際の gRPC のリクエストをトレースしたい場合には Go の gRPC ライブラリが `golang.org/x/net/trace` に対応している為、お手軽に確認する事ができる。

“`golang
grpc.EnableTracing = true

go func() {
http.ListenAndServe(“:8080”, nil)
}()
“`

そのあと、 `localhost:8080/debug/requests` を開けば以下のような出力が得られる。

![スクリーンショット 0002-01-10 17.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974/9453223b-d16b-1b79-48e3-34bae47c05ab.png)

詳細は [golang.org/x/net/trace](https://godoc.org/golang.org/x/net/t

元記事を表示

眺めて覚えるGo言語 その11 無名関数(Anonymous function)

#では、眺め用サンプルコード

“`f11.go
package main
import (
“fmt”
)
func main() {
h1:=func(a string)(string){ return “

“+a+”

“}
fmt.Println(h1(“Topics”))
}
実行結果
>go run f11.go

Anonymous

“`

##名無しの関数
“`f12.go
package main

import (
“fmt”
)

func main() {
func(){
for i:=0;i<10;i++{ fmt.Println("i=",i) } }() } 実行結果 >go run f12.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
“`

元記事を表示

workaround for panic when defining the same flag in multiple packages and go test -coverpkg.

# Issue

– go version: 1.13.5

複数のパッケージが同じ名前のフラグを定義している時、 `go test -coverpkg=all ./…` のように `-coverpkg` をつけて `go test`すると、 `flag redefined` でpanicする問題。

– [cmd/go: test coverpkg panics when defining the same flag in multiple packages · Issue \#27336 · golang/go](https://github.com/golang/go/issues/27336)
– [Go 1\.13 にアップデートするとテスト時に “flag provided but not defined” エラーが発生するケース \- blog\.syfm](https://syfm.hatenablog.com/entry/2019/10/01/063436)

“`
$ go test -v -cover -coverpkg=all ./…
?

元記事を表示

OTHERカテゴリの最新記事