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

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

Goのgo-sql-driver/mysqlでMySQLとタイムゾーンがずれる

#
go-sql-driver/mysqlを使ってMySQLにSQLを投げて、その結果をあれこれするAPIを作成していたときにちょっとはまったことのメモ。

## 問題の発覚

MySQLのタイムゾーンの確認。

“`
show variables like ‘%time_zone%’
=>
|Variable_name|Value|
|system_time_zone|UTC|
|time_zone|SYSTEM|
“`

MySQLのタイムゾーンがUTCなのにgo-sql-driver/mysqlを使ったSQLの実行結果を見るとJSTで返ってきてしまっていた。

“`
MySQL: 2020-01-01 00:00:00 UTC
SQL実行結果のパース: 2020-01-01 00:00:00 JST
“`

そこでmain.goに下記を書いて、Goアプリケーションでのタイムゾーンを確認。

“`main.go
fmt.Println(time.Now())
=> 2020-01-15 13:46:07.4988314 +0000 UTC m=+1.180576601

元記事を表示

Google Cloud Functions上でログレベル付きのStackdriver Loggingを利用する

Google Cloud Functions(以下Cloud Functions)でログレベルを分けたいことあります。

よく Go (go111) で Cloud Functions を利用するのですが、標準のlogパッケージを利用しても、ログレベルを出し分けできません。

– https://cloud.google.com/functions/docs/monitoring/logging#functions-log-helloworld-go
– https://cloud.google.com/logging/docs/setup/go

上記ドキュメントを参考にすると、 Cloud Functions では以下のような書き方になります:

“`go
func ExampleLogging(w http.ResponseWriter, r *http.Request) {
ctx := context.Background()

projectID := os.Getenv(“GCP_PROJECT”)

client, er

元記事を表示

Go AWS Lambda の init, main, handler のライフサイクルについて

# はじめに
Go AWS lambdaでRDSに接続する処理を書く必要が出てきた際
connectionを作るのは `init()` で良いのですが果たして `close` をいつどこで行えば良いのか悩み、[公式のリファレンス](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html
)を参照しましたが肝心のライフサイクルについて具体的な記載が見当たらないため、実際に各func内の実行回数のcountを取って調査しました。

# 検証

`init()` `main()` `Handler()` それぞれの実行countをグローバルに保持しその値を出力する検証コードを作成して実行してみます。

“`Go
package main

import (
“fmt”
“github.com/aws/aws-lambda-go/lambda”
“log”
)

var invokeCount = 0
var initCount = 0
var mainCoun

元記事を表示

poiとfzf(peco)でプロジェクトに爆速で移動できるっぽい〜

## ことのはじまり

普段のお仕事でも趣味でも、僕は頻繁にプロジェクトを `cd` コマンドで移動します。Androidのプロジェクトは `~/AndroidProjects` に置いてますし、Goのプロジェクトは `~/go/src` に置いてあります。
業務はWindowsで、パスの長さ回避のためにCドライブ直下に顧客ごとにディレクトリを切ったりしてその中にプロジェクトがたくさんあったりします。OSSコードを読んだりプルリクエストを送るために別の人のプロジェクトをcloneすることもたくさんあります。

そんなこんなでいろいろなディレクトリでソースコードを管理していると移動が大変面倒なわけです。

そこで[ghq](https://github.com/motemen/ghq)と言うツールがあります。
ghqはGo製のコマンドツールで、リモートリポジトリを一元管理するためのツールです(ネーミングセンスやばくない?
ghqを使うことによって所定のディレクトリでプロジェクトを管理するようになり、またfzfやpecoなどのツールと連携することで爆速で移動もできるようになると言うものです

元記事を表示

Goでワーカープールを15分で実装する方法

> こちらの記事は、Joseph Livni氏により2018年10月に公開された『 [Write a Go Worker Pool in 15 minutes](https://medium.com/@j.d.livni/write-a-go-worker-pool-in-15-minutes-c9b42f640923) 』の和訳です。
> 本記事は原著者から許可を得た上で記事を公開しています。

![1_ugshDOhXfC287WWhG4IfSA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/daa5a211-6311-b88d-cbef-ad63bf0c6b24.jpeg)

私は多くのユーザーリクエストを高速に処理するGoのサービスを構築していました。Goroutineのプールを使ってカプセル化することにより、パフォーマンスは20倍になりました。本記事では独自のワーカープールを作る方法を説明します。[^1]

[^1]: 訳注: ライブラリとして提供されているワーカープー

元記事を表示

自作SORACOM InventoryのエージェントinventorydでIoTデバイスを簡単に遠隔操作する

# はじめに

IoTデバイスの遠隔操作したくないですか?
したいに決まってますよね!
ということで今回お勧めするのは[SORACOM Inventory](https://soracom.jp/services/inventory/)です。

# 1分でラズパイを遠隔再起動するよ

**注意**
すでにSORACOM Inventoryを使用中の場合、以下を実行すると費用が発生します。(初期費用100円、利用料金50円)
未使用の場合は150円の無料枠に入ります。

SORACOM Airで接続中のラズパイに入ってrootで以下のコマンドを実行しましょう。

“`bash
curl -L -O https://github.com/1stship/inventoryd/releases/download/v0.0.1/inventoryd_0.0.1_linux_arm.tar.gz
tar zxf inventoryd_0.0.1_linux_arm.tar.gz
./inventoryd –init # 質問にはEnterのみでよい(yで回答したことになる)
ech

元記事を表示

インクリメント・デクリメントの書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby、JavaScript)

いろんな言語を触っていると、言語の細かい仕様がだんだんごっちゃになってきてしまいますので、メモです。

インクリメント・デクリメントの有無

あり: Java、C言語、C++、Go言語△、PHP、Perl、JavaScript
なし: Scala、Rust、Python、Ruby

Go言語は式を構成する演算子ではなく文(statement)という扱いにすることで、インクリメントの演算子としての問題を回避していて、個人的にはちょうどいい仕様に感じます。

ついでに代入演算子も確認しましたが、こちらはだいたいの言語にあるようです。

# Scala

– インクリメント・デクリメント演算子はない
– 代入演算子はある

“`scala
i += 1
i -= 1
“`

`i += 1` などは `i = i + 1` などのシンタックスシュガー。

参考

[Assignment Operators – Expressions | Scala 2.13](https://scala-lang.org/files/archive/spec/2.13/06-expressions.ht

元記事を表示

【docker-compose】Nuxt.jsとGOでREST APIを構築した手順

現在のプロジェクトでは、[Nuxt.jsとGOをGKEを使ってREST APIを構築](https://qiita.com/arthur_foreign/items/9007695c5ff02dd493cf)しています。

Kubernetesを利用する場合、Dockerを必然的に利用することになる上に、ローカルの環境構築も色々面倒だったため、`docker-compose`を利用することにしました。

今回は、`Nuxt.js`と`GO`で`docker-compose`を利用して、REST APIを構築したため、その手順をまとめています。

## docker-composeで構築したNuxt.jsとGOのREST APIの雑な全体像

表題の通り、めっちゃ雑なポンチ絵を作りました。

![docker-composeのポンチ絵.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307395/94cb3540-7ebb-ce9e-ab90-b697c496be52.jpeg)

以上のような

元記事を表示

眺めて覚えるGo言語 その13 MongoDB

#MongoDBにDatabaseを作りましょう。眺めていきます。
### あらかじめMongoDB Copmpassをインストールしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/8295d0be-ebde-3098-67dc-d293f039b187.png)

“`main.go
package main

import (
“context”
“fmt”
“log”
“go.mongodb.org/mongo-driver/mongo”
“go.mongodb.org/mongo-driver/mongo/options”
)

// アドレス帳の構造体
type Adr struct {
ID int `bson:ID`
Name string `bson:”名前”`
Kana string `bson:”名前フリガナ”`
Post

元記事を表示

Go言語でロックファイルを利用した多重起動防止サンプル

Go言語のバッチ等で、ロックファイルを利用した多重起動防止のサンプル実装です。

アプリケーションルートのディレクトリ配下の`/util`ディレクトリに置かれる想定で、`~/go/src/`と`/util/`を除いたディレクトリ名のハイフン区切りをロックファイル名にしています。

ex.) `~/go/src/example/lockfile/util/lockfile.go`の場合
ロックファイルは `~/go/src/example/lockfile/example-lockfile.lock`

## 利用例

“`golang:main.go
package main

import (
“lockfile/util”
“os”
)

func main() {
os.Exit(execute())
}

func execute() int {
util.Setlock()
defer util.Unlock()

// do process

return 0
}
“`

## ソースコード

“`golang:util/lockfile.go
pack

元記事を表示

Golang on DockerでEchoを動かす

# TL;DR

Docker上でGolangのWebフレームワークであるEchoを動かしてみました。

# DockerでGolang環境の構築

“`dockerfile
FROM golang:1.13.6-alpine

WORKDIR /go/src

COPY ./src /go/src

RUN apk update && apk add git
#RUN go get -u github.com/labstack/echo/…
“`

`dockerfile`内の`go get -u github.com/labstack/echo/…`が実行出来なかったのは何故だろう。。。

“`docker-compose.yml
version: ‘3’
services:
app:
build: .
ports:
– 8080:8080
volumes:
– ./src:/go/src
tty: true
“`

“`sh
$ mkdir src
“`

“`src/server.go
packa

元記事を表示

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:”name”`
}

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 用の署名取得処理のサンプルコードを載せることとします
ちなみにですが、本記事では署名キーを作成する部分の説明であり

元記事を表示

OTHERカテゴリの最新記事