Go関連のことを調べてみた2019年12月08日

Go関連のことを調べてみた2019年12月08日

GoでQiitaAPIを呼んでSlackに通知してみた話

## はじめに
本記事は[コネヒト Advent Calendar 2019](https://qiita.com/advent-calendar/2019/connehito)の8日目の記事です。

こんにちわ!バリ寒かなりましたね!
布団にくるまって出社したいフロントエンジニアの黒田です。

今回は最近業務の都合上、Goを触ることになったのでその学習の一環としてツールを作成してみた話です。
というのも、まだGo言語を触り出して1,2ヶ月ほどで、A Tour of Goをや入門書を読んだ上でそろそろ実際に動くもので価値を提供できそうなものを作りたいなといったことが主な動機です。
というわけで、ちょうど社内slackにQiitaの人気記事が毎日流れてくるチャンネルがあり、レベル感もちょうど良さそうなので同じような機能をGoで作ってみました。

## 要件
要件としては、

– SlackAPIからその日の人気記事を取得する
– ここでいう人気記事は前日作成されたストック10以上の記事とします
– 上記で取得された記事の情報を最大5件SlackにPOSTする

の大きく2つです。

#

元記事を表示

Golang strconvについて調べてみる

[Link-1]:http://golang.jp/pkg/strconv
[Link-2]:https://golang.org/pkg/strconv/
[Code-1]:https://www.codewars.com/
[play-1]:https://play.golang.org/p/42686cgMHZu

#きっかけ
[codewars][Code-1]で出題される問題に`文字列->数値`の変換を求められる問題があるので調べてみると、`strconv`が見つかるが途中で文字列が入った場合などのエラー集が見つからなかったので自分で調べてみた。

##`文字列<->数値`するライブラリ`strconv`
調べると、日本語で翻訳された以下のサイトが出てくる
[golang.jp][Link-1]
こちらはサイトにも書いてある通り、古い翻訳になっている為`strconv`から削除されているものも載っている
例えば、`文字列->float`を行う`Atof`関数などは[現在の公式のドキュメント][Link-2]では記載されていない為、コンパイルしても通らないので、注意が必要です。

元記事を表示

golangでlsコマンドを作ってみる

この記事は [Go5 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go5) の 8日目の記事です!

当初、「golang×webassemblyで遊んでみる」みたいなタイトルで記事を書いていたのですが
前日にPCがぶっ壊れて記事やコードやら全部吹っ飛んだので予定を変更して「golangでlsコマンドを作ってみる」でお送りします。
バックアップ大事。

ネタ元は週末に行われたgolang社会勉強会です。ネタをパクることをお許しくださいS先輩。

それではいきましょう!Go5!

## lsコマンド実装
始めにオプションなどの実装を一切考えない単純なlsコマンドを実装してみましたが、以外に少ないコード量で実装できたのでビックリしました。

“`golang
package main

import (
“fmt”
“io/ioutil”
“log”
“os”
)

func main() {
dir, err := os.Getwd() // カレントディレクトリ情報取得
if err != n

元記事を表示

[Go] constant x.x truncated to integerはなぜおきるのか

# TL;DR
– `const n = int(0.5)` はconstant x.x truncated to integerというコンパイルエラーになってしまう
– 型付き定数の値は、常に定数型の値で正確に表現可能でなければならない
– https://golang.org/ref/spec#Constant_expressions
– int(0.5)は切り捨てが発生する値なので正確に表現できる値ではない
– 普段の型変換の言語仕様にも「For the conversion of non-constant numeric values」と定数には適用されてないと明記してある
– https://golang.org/ref/spec#Conversions

# 背景
[golang.tokyo #28](https://golangtokyo.connpass.com/event/156678/)のDevquizにて、

“`go
package main

import “fmt”

const n = int(0.5)

func main() {

元記事を表示

SORACOM NapterでリモートデバイスにFTP接続してみた

この記事はSORACOM Advent Calendar 2019 ふたつめ の12月7日分です。

2019/7/31 SORACOM Drinkup #2にて発表したLTをもとに記事にしました。

# 今時FTPかよ

って思いますよね。僕もそう思います。もう2019年ですよ?

一昔前まではFTPはインターネットでも普通に使われていたと思います。ホームページを公開しようと思ったら、レンタルサーバーを借りて、FTPでファイルをアップロードして、みたいな動きをしてた気がする。PerlのCGIとか上げてた気がする。

ところがまあご存じの通りFTPはセキュリティ的に余りにもあれなことが分かってきてしまいました。

ざっくりこんな感じです。
スクリーンショット 2019-12-07 18.38.17.png

特に認

元記事を表示

【golang】大きめなJSONのパース(pprof使って使用メモリもチェック)

# お題
たまたま、WebアクセスでレスポンスとしてもらうJSONのサイズとしては大きめと思われるものを解析する要件があったため、Goでよく使うJSONパースの仕方と、一度に大きなメモリを消費しないJSONパースの仕方とを比較してみた。

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

## # 言語 – Go
“`
$ go version
go version go1.13.3 linux/amd64
“`

## # パッケージマネージャ – Go Modules

## # IDE – Goland
“`
GoLand 2019.2.5
Build #GO-192.7142.48, built on November 8, 2019
“`

## 解析対象の大きめJSON

125MBのJSONを用意。

“`
$ ll data.json
-rw-rw-r– 1 sky0621 sky0

元記事を表示

[The Go Programming Language Specification] Rune

# Go
Golangのspecificationの日本語訳と、ちょっとした遊びぐらいのコードを載せていく感じで進めようと思うので、
すでにGolangでコードを書いている人にはつまらないかもしれないです

また、間違っている部分があればぜひご指摘いただけると嬉しいです?‍♂️

### 想定する読者層
– Golang初めてそこまで期間が経っていない
– 英語の公式読むの辛い
– https://golang.org/ref/spec

## Rune literals
本記事は公式のドキュメントを参考にしています

– https://golang.org/ref/spec#Rune_literals

### rune とは?
Rune literal は int32 の alias で Unicodeを表す整数です
Rune はシングルクウォートで囲まれた1文字以上の文字で表されます
`x` とか `\n`です

例えば `’a’` の時、は1byteで `a` ,`U+0061`, `0x61` を表す
`ä` は2byteで、`0xc3` と `0xa4` (もし

元記事を表示

GCに思いを馳せてunsafeなコードを書く

これは[Go Advent Calendar](https://qiita.com/advent-calendar/2019/go) 8日目の記事です.

こんにちは[taxio](https://twitter.com/taxio_tech)です.今はヒーヒー言いながら修論書いてます.
今回は`unsafe.Pointer`を使ってunsafeなことをしてみます.

## `unsafe.Pointer`とは
[GoDoc](https://golang.org/pkg/unsafe/#Pointer)より,
> Pointer represents a pointer to an arbitrary type. There are four special operations available for type Pointer that are not available for other types:
– A pointer value of any type can be converted to a Pointer.
– A Pointer can be convert

元記事を表示

Goで作ったWebアプリをDockerで動かす

## 概要
golangで作ったAPIをDocker上で動かします。
作ったAPIについて: [GolangでシンプルなRESTful APIを作ってみた](https://qiita.com/yuuulf/items/b464735dfb3486d248bf)

サンプルは[ここ](https://github.com/yuuulf/go-hello)

## Dockerfileを用意する

“`Dockerfile
FROM golang:latest

WORKDIR /app
ADD . /app/

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags=”-s -w” -installsuffix cgo -o hello main.go

CMD [“./hello”]

“`

## Docker Compose ファイルを用意する

“`docker-compose.yml
version: “3.1”

services:
api:
build: .
ports:

元記事を表示

GolangでシンプルなRESTful APIを作ってみた

## 概要
GoでシンプルなRESTful APIを作りました。
簡単にしたかったので読み出しの機能のみです。

サンプルは[ここ](https://github.com/yuuulf/go-hello)

#### 環境
– go 1.13.4
– mysql 8.0.17

#### Framework
– [echo](https://echo.labstack.com/)

## Hello World!
– hogeリポジトリを作る
– プロジェクトを作成

“`bash
$ mkdir hoge
$ cd hoge
$ go mod init github.com//hoge
“`

`go mod`については以下参照
[Package Management With Go Modules](https://medium.com/@adiach3nko/package-management-with-go-modules-the-pragmatic-guide-c831b4eaaf31)

echoを依存関係に追加

“`bash
$ go g

元記事を表示

Goで画像を扱う話

気圧が変動が大きいとへばってしまう体をなんとかしたいと思ってます [@sys_cat](https://twitter.com/sys_cat) です。
普段はGameWithで設計書を書いてみたりサーバサイドのコーディングを行ったりしています。最近の推しゲームはアッシュアームズです。細かい動きが可愛いのですよね。
昨日は @fukiworks さんの [「Adobe MAX Japan 2019」で発表された激アツ最新トピック5選 【デザイナー独断】](https://tech.gamewith.co.jp/entry/2019/12/06/130533) でした。
デザイナさんとお仕事してると面白いですよね。考え方の方向性が違うのに似た結論に行くこともあるので楽しんで仕事出来ますね。

さて、今回はGoで画像を扱う方法についてです。
弊社はPHPの会社ですがツール周りはGoが多くなってきたんですね。画像を扱う時はよくImageMagicを使うと思うんですがよくある画像の表示、操作は割とGoでも出来ます。

## JPEGとPNGを読み込んでみよう

Webサイトで表示する

元記事を表示

SQLBoilerでBulk Insertを実現する方法

## 概要
この記事を書いている(2019/12/07)時点では、SQLBoilerに、Bulk Insert は実装されていません。
[issue](https://github.com/volatiletech/sqlboiler/issues/101)や[Pull Request](https://github.com/volatiletech/sqlboiler/pull/386)はいくつか上がっているようですが、内部に取り込まれる様子がありません。
おそらくその理由は、MySQL、Postgresなどの各種DBにうまく対応しつつ、Insertした複数のstructにIDを埋める、という用件を満たせないからだと推測されます。
(SQLBoilerでは、通常のInsertではInsert後に`last_insert_id` を用いて、structのIDにマッピングするように実装されています)
Bulk Insert が実装されていないORMは他にもあり、それらもほぼ同様の理由で導入が見送られていそうな気がします。

しかし、実務では、Bulk Insert を使いたい場面は多々発

元記事を表示

Golang 始めました

[Link-1]:https://github.com/ziutek/ftdi
[Link-2]:https://play.golang.org/
[Link-3]:https://www.codewars.com/
[slice-1]:https://qiita.com/mizukmb/items/b543f88bc37c9a75673f
[slice-2]:https://christina04.hatenablog.com/entry/2017/09/26/190000
[for-1]:https://qiita.com/high5/items/3fe34d2feeff2c11f5ca
[String-1]:http://knightso.hateblo.jp/entry/2014/06/24/090719
[String-2]:https://text.baldanders.info/golang/string-and-rune/
[play-1]:https://play.golang.org/p/X8E4i6V4ulG
[play-2]:https://play.golan

元記事を表示

golang で手軽にコマンド作成

## はじめに

golang初心者です。
golangでコマンドラインアプリを簡単に作ることができる[urfave/cli](https://github.com/urfave/cli)というパッケージを使い、
簡単な`Hello!!` と挨拶するコマンドを作成したいと思います。

## urfave/cli とは

– 簡単にcliツールを作ることができる
– オプションやそのデフォルト値を定義できる
– `-h, help`のコマンドラインのヘルプを自動で作ってくれる

## 事前準備
`urfave/cli`をインストールをする

“`bash
$ go get github.com/urfave/cli
“`

## greet コマンド(挨拶コマンド)を作成する

main.go ファイルに以下のソースコードを追加

“`go:main.go
package main

import (
“fmt”
“log”
“os”

“github.com/urfave/cli”
)

func main() {
app := cli.NewApp()

元記事を表示

VSCode + golangでの快適な補完について自分なりにまとめてみた

# この記事について
* この記事は Go7 Advent Calendar 2019 の 8 日目の記事です。
* [Umeda.go 2019 Autumn](https://umedago.connpass.com/event/145782/) で発表した内容をQiitaにまとめた記事です
* [umeda.go](https://umedago.connpass.com/)は大阪の梅田近辺を中心に活動しているGo Communityです
* 春夏秋冬の年4回開催を心がけております
* もし機会が合えばぜひお気軽にご参加いただければと思います
* [スライドはすでに公開しています](https://docs.google.com/presentation/d/11wLgBTXo5ZRO9UY5rV85HXHiqNvd7qnwzWhYp8h4ovs/edit?usp=sharing)
* **限りなくGolang成分が薄いです(すみません)**
* 間違っていたらご指摘お願い致しますm(_ _)m

# この記事の目的

* golangでコーディングを快適

元記事を表示

Goで競技プログラミング

# [IPFactory Advent Calender 2019](https://qiita.com/advent-calendar/2019/ipfactory) 七日目
IPFactory 1年 [よーでん](https://twitter.com/y0d3n) です。
最近はGolangで競技プログラミングをやってます。
「Goでやるならテンプレ作りなよ!」といわれたので、テンプレ作成ついでにメモとして書きます
**理解して使うことが大事**です。コピペは極力避けてください。

## 準備
“`go:main.go

package main

import (
“bufio”
“fmt”
“math”
“os”
“strconv”
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
}
“`
事前準備。他にもパッケージを使いたい場合は適宜`import`してもらえば良いです。
## 標準入力から読み込む
### stringで一つ読み込む
> hogehoge

“`go
func scanText()

元記事を表示

Goでブロックチェーンを実装してみる Part1

この記事は[2019新卒 エンジニア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/2019-graduates)の7日目の記事です。

こんにちは。この記事ではGoで超シンプルなブロックチェーンを作っていきます。
普段から業務でブロックチェーンに携わってはいるのですが、自分で実装したことはなかったので、理解を深めるためにやってみようという次第です。

なお本記事はシリーズ化してお届けする予定です。
#はじめに
今回用いるコードはこちらに載っています。
https://github.com/gunnsoo/blockchain_go/tree/qiita_part1

#Block
まずはブロックを作りましょう。ブロックにはトランザクションの情報や技術的に必要な情報が含まれています。
ビットコインなどで実装されているブロックはもっと複雑ですが、ここでは簡略版をつくります。

“`go:block.go
type Block struct {
Timestamp int64
Data

元記事を表示

goのhot-reload

[テックタッチアドベントカレンダー](https://qiita.com/advent-calendar/2019/techtouch) 7日目担当の@analogrecordです。
前回は@ihiroky氏による「JSXとvirtual-domで遊ぶ」でした。
記事の分量・濃い内容ともに圧倒されています。流石です…

フロントエンドの記事が続いていますが、今回はバックエンドのTIPを紹介していこうと思います。

# 動機
テックタッチではサーバーサイドにgoを使用しています。
私自身テックタッチに入社するまではずっとphpとjsを書いていたため、エディタで編集してブラウザ等で即実行して挙動を確認する開発に慣れてしまっていました。
goおよびコンパイル言語を扱うのが初めてなので、少し書き直してビルドするとすぐにビルドエラーに阻まれ…どの変更によってエラーになっているのかわからなくなってしまったり、ビルドして実行できても出力結果が想定と違っている等、var_dump()してリロードすればデバッグできたphpに比べてストレスを感じていました。

[調べてみると](https://qiita

元記事を表示

【GKE】ConfigMapで環境変数を設定してGOで呼び出すtomlファイルを切り替える

## 前提

前提として、GKE上にコンテナをデプロイしているものとして話を進めます。

GKE上にコンテナをデプロイする方法はすっ飛ばしますので、以下の記事を参考にしてもらえると嬉しいです。

参考:https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app?hl=ja

また、そもそものDockerfileを作成する方法を知りたい人は、以下にまとめたので参考にしてもらえると嬉しいです。(GOのDockfileの作成方法というよりは、`Nuxt.js`で`multi-stage build`のやり方を解説してる内容ですが…。)

参考:https://qiita.com/arthur_foreign/items/fca369c1d9bde1701e38

## 環境変数ごとにGOで呼び出すtomlファイルを切り替える

GKEで環境変数ごとに呼び出すtomlファイルを切り替えていきたいと思います。

接続するDB(Aurora)を環境変数ごとに切り替える想定ですが、`ConfigMap`とはズレるお話なので色

元記事を表示

運用を意識したGo言語でのエラーハンドリング/ロギング

この記事は [Go4 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go4) 7日目の記事です。

2016年にGoのAdvent Calendarを書いた時はGo3までだったのに、今年はGo7まであり、Go言語の盛り上がりを感じます。

以前書いた[Go言語のエラーハンドリングの記事](https://qiita.com/nayuneko/items/3c0b3c0de9e8b27c9548)がじわじわと反響をいただいており、とても嬉しく思います。

上の記事を書いた当時は趣味でGo言語を嗜んでいた程度ですが、ここ1年は仕事でGoの開発に関わり、エラーハンドリングとロギングの重要性を思い知らされた次第です。自分では適切なエラーハンドリングやロギングをしたつもりでも、いざリリースしてみるとログが不足していて調査に手間取ったり、逆に過剰で精査に時間がかかったり…

本記事はここ1年Goで書いたプログラムを運用してみて得た知見を記事に起こしたものです。

# TL;DR

– エラーはWrapしつつ適切なメッセージ

元記事を表示

OTHERカテゴリの最新記事