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

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

Google App Engine に Go言語 1.13 の複数サービスを deploy する

# はじめに
ちょうど3日前に Google App Engine (GAE) と Go言語を初めて触ってみました。
Go言語がバージョン 11 以降、少し勝手が違ったことで、構築時に若干迷ったので記事にしてみました。

いろんなドキュメントを見て判断はしていますが、なんせ経験が浅いので間違い等あれば指摘ください。

# はじめる前に…
Go言語と GAE について私が学んだサイト等まとめておきます。

– 下記サイトで Go言語の学習
– [はじめてのGo言語](http://cuto.unirita.co.jp/gostudy/)
– [Quickstart](https://cloud.google.com/appengine/docs/standard/go/quickstart?hl=ja)
– [Building a Go App on App Engine](https://cloud.google.com/appengine/docs/standard/go/building-app/?hl=ja)

# 環境
## OS
– Windows 10

## 言語

元記事を表示

【Golang】mockgen で生成した *_mock.go のせいで Build がコケる場合の対処法

# 対象読者
– Go の mockgen で生成した *_mock.go ファイルのせいで Build がコケている人
– 自分

# 忙しい人のための結論
Build failed 時に、怒られているコード内の該当箇所を消せばよい。

# 事例
REST API を golang で書いていた。
テストコードを書くべく、mockgen でモックを生成したところ、それらのファイルにいちゃもんをつけられて Build が通らなくなった。

“`
# hoge/fuga
fuga | hoge/fuga_mock.go:**:*: m.ctrl.T undefined (type *gomock.Contr
oller has no field or method T)
“`

m.ctrl.T で怒られるのは gomock の code generation が悪いからではないかと推測される。下記リンクによると gomock の version が関係していそう。
参考:https://github.com/openshift/openshift-azure/

元記事を表示

Goで超簡易版Twitterを作って見ました(初心者向け)

#はじめまして
最近Goの勉強を始めたばかりで何か開発してみようと思い、簡単なアプリを開発しました。

##見た目
![スクリーンショット 2020-01-16 11.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492455/f2d51833-f551-2afb-4a29-6659fab5d413.png)
##出来る事
・フォームから投稿する事が出来ます
・投稿をデータベースに保存する事が出来ます
・保存されている投稿を表示してくれます
・投稿を消す事も出来ます

はい、それだけです。
めちゃくちゃ低レベルですが、UIからサーバーにデータを送りDBへ保存、DBのデータをビューに表示するというのは全てのアプリの基本的な部分だと思いますので、これが出来るとようやくエンジニアレベル1達成です!
僕と同じようにこれからGoの勉強を始める方の少しでも役に立てればと思い記事を投稿しました。
僕も初心者ですので間違ってる部分や至らない点があるかと思いますがご了承ください。

##解説
Goの導入や基

元記事を表示

gRPCメモ

自身のメモとしてgRPCをまとめてみました。

# gRPCとは
protocol buffersをMessage interchange format(メッセージのI/Oに使うための形式)として使えるリモートプロシージャコールシステムです。

### protocol buffersとは
IDL:Interface Definition Language (インタフェース定義言語)を用いたファイルフォーマットです。

### gRPCで何ができるのか
クライアントが別のマシンにあるメソッドをまるでローカルにあるかのように使えるようになります。
下の図のように様々なプログラミング言語に対して実装できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270964/7b45a2d4-117f-b81c-5b49-3a85cf1f50fa.png)

#### 雑に言うと
今までjsonなどを介してAPIを叩いていたようなところを、もっと確固たる定義をもった上でより高パフォーマンスでやりと

元記事を表示

フロントエンジニア(仮)がGO言語で簡単なスクレイピング処理を実装するまで

はじめまして。kenalog210と申します。
ある事情によりGo言語でのスクレイピング処理方法を色々調べてたんですが、無事お流れとなりました。
もったいないのでQiitaに上げさせていただきます。
今回は下記のサイトをサンプルとして使用させて頂きました。
https://wiki.hackerspaces.org/

使用したフレームワーク

Colly
http://go-colly.org/
https://github.com/gocolly/colly

スターが1万近くついてるスゴイやつです。
リポジトリにサンプルがいっぱいあるので、基本的なケースなら自分の応用したいパターンに合わせて
サンプルをちょっといじくり回せば使えそうです。
この記事もサンプルをちょっと応用しただけのものです。

やりたかったこと

・マッピング情報を渡したらうまいことインスタンス化してくれるようなものを組みたい
・インスタンス化出来たら、JSON文字列化してコンソールで出力
・構造体とのマッピング用スクリプトはめんどいので組みたくない

構造体を定義

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事