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

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

golang でpostgresにinsert

### とりあえず一行をInsertしてみた。

“`
Last login: Wed Apr 29 13:22:17 on ttys000

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
(base) ~ $ cd develop
(base) develop $ ls
rest_test
(base) develop $ cd ..
(base) ~ $ ls
Applications Music develop
Desktop Pictures development
Documents Public workspace
Downloads Untitled.ipynb workspace_20190912
Library VirtualBox V

元記事を表示

【Golang】マップ(辞書)

#【Golang】マップ(辞書)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//map 連組配列 Pythonでいう辞書
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。

import “fmt”

func main() {
//宣言
//mapを作成 pythonの辞書型のような感じ
//map[キーの型]値の型{中身}
m := map[string]int{“a”: 100, “b”: 200}
fmt.Println(m)
//>>map[a:100 b:200]
//値取り出し
fmt.Println(m[“a”])
//>>100

//宣言
//make(map[キーの型]値の型, キャパシティの初期値)
//make(map[キーの型]値の型)// キャパシティの初期値は、省略も可能
//初期化。空を作成
m2 := make(map[string]int)
fmt.Println(m2)
//>>

元記事を表示

[習作] シングルバイナリでWebサイト作りたかったのでGolangで画像抽出Webアプリ作ってみる

こんにちはみなさん

お仕事でWebサイト作るのであれば普通にPHP使うのですが、私のメイン機であるWindowsでかんたんに動かせるWebサイトとなると、環境が心もとないというか、動く環境と作る環境が違うとどうしてもちゃんと動くか不安になるというもの。
そういうときに、環境とか関係なくバイナリで動くWebサイトが作れれば強いなぁって思うわけです。

そんなわけで、Goの練習がてら、Webサイト作ってみます。

# 課題
まずは、どんなアプリを作るかを考えます。
今回はかんたんだけどいろんな技術を触れそうということで、以下のようなツールを作ってみます。

– ローカルで動くWebアプリである
– URLを入力する
– そのサイトに有る画像を抽出して画面に表示する
– 気に入った画像を選択してローカルに保存できる
– シングルバイナリで動く

え、何に使うかって?
そりゃ、あれですよ、あれ。

なんにせよ、作るものを決めたので、実際に作ってみるとしましょう。

# 成果物

https://github.com/niisan-tokyo/image-crawler

# 開発環境
まずは

元記事を表示

【Golang】スライス

#【Golang】スライス
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//スライス 可変長配列
//関数では参照渡しされるので、本体の値も変わる。配列とは違う。

import “fmt”

func main() {
//宣言
//スライス = 可変長配列
//[]にするとサイズ変更できる。
var a []int = []int{100, 200}

//宣言
b := [] string{“A”, “B”}
fmt.Println(b)
//>>[A, B]

//宣言
//[]を作る nil メモリーに確保しない。bとは違う。
//メモリーは深い領域なので、最初は、あまり気にしなくてもいい
var c []int
fmt.Printf(“len=%d cap=%d value=%v\n”, len(b), cap(b), b)
fmt.Printf(“len=%d cap=%d value=%v\n”, len(c), cap(c), c

元記事を表示

Go + Google Cloud SDK の環境を Docker で準備する

# なぜ Docker

詳しい理由は
[Cloud Functionsで消耗したくない人のために、開発環境のベストプラクティスをまとめていったらDockerに行き着いた話](https://qiita.com/pannpers/items/244a7e3c18d8c8422e4f)
こちらの記事が参考になりそうです。

軽くまとめると

– ローカル環境を汚さなくて良い
– コマンド一発で同じ環境ができるので楽
– Google Cloud SDK の認証情報をコンテナに閉じ込められる => 複数アカウント、プロジェクトの管理がしやすい

あたりの理由になるかなと思います。

ここで Node.js で説明されている部分を Go に置き換えたのがこの記事、くらいに思っていただければささっと読めるかもしれません。

# docker-compose で書く
docker-compose で書くのが好きなので、中身を置いておきます。

“`
version: “3.8”
services:
gcloud:
image: tktcorporation/google-clou

元記事を表示

Golang ゴールーチンで並列数を指定して実行

“`golang
package main

import (
“sync”
“time”
“fmt”
)

func sub(message string) {
fmt.Printf(“%s start\n”, message)
time.Sleep(5 * time.Second)
fmt.Printf(” -> %s end\n”, message)
time.Sleep(1 * time.Second)
}

func getMessages() (messages []string) {
messages = []string{
“a”,
“b”,
“c”,
“d”,
“e”,
“f”,
“g”,
“h”,
}
return
}

func main() {
// 並列数
concurrency := 4
// 並列キューを作成
limit := make(chan int, concurrency)
// Wa

元記事を表示

Mac で go run すると「ネットワーク受信接続を許可しますか?」と警告されるのを回避する

スクリーンショット 2020-05-12 23.02.03.png

# はじめに結論
`goのサーバ起動のコードを修正すれば出さないようにできます。`
`他の言語でも同様のやり方で回避できるはずです。`
下のMacのファイアウォール設定を修正して出ないよう設定するのはおそらく無理です。
ファイアウォールのオフはやめておいたほうが良いです。
スクリーンショット 2020-05-13 0.31.50.png

# 環境
MacOS Mojave 10.

元記事を表示

唐突に筋トレ動画を再生するアプリを作成する

## 背景
各所、リモートワーク化が進んでいるかと思います。リモートワークを始めて感じるのが、**圧倒的な運動不足感**です。外に出る機会が減ったために、自律的に運動をしないといけなくなりました。ですが、行動習慣を変えるのは難しいことです。だったら、ランダムに、唐突に運動をせざるを得ない状況を作れば良いんじゃないか?と思い、**唐突に「みんなで筋肉体操」の動画を開いてくれるアプリ**を作ることにしました。仕事中は特に何もしなくても自動で起動していてほしいので、service化のライブラリが公開されていたGolangでやることにしました[^1]。本当はクロスコンパイルして配布したかったのですが、Mac上でクロスコンパイルしたプログラムがWindowで想定通りの挙動にならず、見送っています。

[^1]: というのは口実で、純粋にGolangの勉強がしたかっただけだったりする

### 「みんなで筋肉体操」について
NHKでたまに放映されている、短時間で割とキツめな筋トレができる番組です。NHK WORLD-JAPANのアカウントが[英語版の動画](https://www.youtube.

元記事を表示

golang test coverage 100%を目指してみる

# golangでtestを書いてみたら、coverageが75%だったので、100%を目指してみる

## そもそもどこが通ってないのか調べてみる

coverageをhtmlで可視化してくれるツールがあるので、それを流してみる。

“`
go test -coverprofile=cover.out
go tool cover -html=cover.out -o cover.html
open cover.html
“`

これで、coverしているところは緑色に、してないところは赤になる。

関数ベースでみることもできる
“`
$ go tool cover -func=cover.out
http2/http2.go:21: ServeHoge 100.0%
http2/http2.go:40: main 0.0%
total: (statements) 75.0%
“`

## mainが通ってなかったけど、どうするのこれ?

go でmainを並列処理にしてサーバを立てたあとに、Getを使って、サーバにアクセスすることでテストする。
deferでBodyを

元記事を表示

【Golang】配列

#【Golang】配列
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

“`
package main
//配列
//サイズを変更できない。拡張性がない
//後から追加する場合は、スライスを使う

//関数では値渡しされるので、コピーが作成されて引数に取られる

import “fmt”

func main() {
//2つの配列を作る宣言
//[2]int が型になるため、サイズを変更できない
var a [2]int
fmt.Println(a)
//>>[0, 0]

//宣言
b := [3]int{1,2,3}
fmt.Println(b)
//>>[1 2 3]

//宣言
var arr[2] string = [2]string {“A”, “B”}
fmt.Println(arr[0], arr[1])
//>>A, B
fmt.Println(arr)
//>>[A B]

//宣言 要素数省略ver
//要素の数を自動でカウントしてくれる
arr

元記事を表示

Go の環境構築をしてそのまま Cloud Functions を使う with VSCode

初 Go & CloudFunctions にあたって、せっかくなので作業記録

# 前提
## 環境
– macOS Catalina

## インストール済み
– Homebrew

# Docker で環境構築
Docker で環境を用意する場合はこの手順([Go + Google Cloud SDK の環境を Docker で準備する](https://qiita.com/tktcorporation/items/956f4afd68d491fb6894))で。

VSCode に関連する Go のインストール部分は飛ばせないかもしれないが、 Google Cloud SDK まわりの環境は コンテナ内に閉じ込められる。

# Go の使用準備

## VSCode の設定を追加

ここでは workspace の設定に追加
([Go のインストールと vscode の環境構築](#go-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8-vscode-%E3%81%AE%E7%92%

元記事を表示

【Go言語】Go製データベースBadgerの基本的な使い方まとめ【BadgerDB】

日本語のドキュメントを探しても見つからなかったのでメモ。

# Badgerとは

* BadgerDBは、純粋なGoで記述された埋め込み可能な永続的で高速なKey-Value(KV)データベースです。
* Github: [https://github.com/dgraph-io/badger](https://github.com/dgraph-io/badger)

# 環境(執筆時点)

* Go: 1.14.2
* Badger: 2.0.3

# インストール

“`bash
$ go get github.com/dgraph-io/badger/v2
“`

# サンプルコード

db.View() は読み取り専用トランザクションです。このメソッド内で更新処理は行なえません。

“`golang
package main

import (
“fmt”
“log”

badger “github.com/dgraph-io/badger/v2”
)

func handle(err error) {
if err != nil {
log.Fatal

元記事を表示

Goでtar.gzをダウンロードしてそのまま展開する。

# 概要
net/httpの`func (c *Client) Get(url string) (resp *Response, err error)`を実行してresponseを取得します。
それをcompress/gzipの`func NewReader(r io.Reader) (*Reader, error)`に流します。
続けてarchive/tarの`func NewReader(r io.Reader) *Reader`に流します。
そしてforで`io.EOF`が出るまで読み込みます。
その中でHeaderにあるTypeflagからディレクトリかファイルかを判別します。
`TypeDir`なら`os.Mkdir`でディレクトリを作成します。
`TypeReg`なら`os.Create`と`io.Copy`でファイルを作成します。

# サンプル
“`go
package main

import (
“archive/tar”
“compress/gzip”
“errors”
“io”
“log”
“net/http”
“os”
)

func main

元記事を表示

Go言語でMySQLに接続する方法

# はじめに

~~この記事ではGo言語でMySQLに接続する方法を紹介します。~~
自分用のメモ

# 使うライブラリ

* database/sql
* github.com/go-sql-driver/mysql

# DBの設定例

* DB名:test
* テーブル名:users

“`
mysql> desc users;
+——-+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+——-+————-+——+—–+———+——-+
| name | varchar(10) | YES | | NULL | |
| age | int | YES | | NULL | |
+——-+————-+——+—–+———+——-+

元記事を表示

Goで外部コマンドの標準出力を触る

# 概要
os/execの`func Command(name string, arg …string) *Cmd`で外部コマンドを指定します。
その後にos/execの`func (c *Cmd) StdoutPipe() (io.ReadCloser, error)`で外部コマンドの標準出力のpipeを取得します。
コマンドが終了するとpipeは閉じられるため明示的に閉じる必要はないです。
同じ理由でos/execの`func (c *Cmd) Run() error`で実行すると標準出力を触れる隙がないため、os/execの`func (c *Cmd) Start() error`と`func (c *Cmd) Wait() error`を使用します。

# サンプル
環境変数は外部コマンドを使用せずとも見れますがサンプルとしてenvコマンドを使用しています。
コマンドによるとは思いますが、日本語じゃなくて英語で表示したい場合は環境変数LANGをCにすると英語で表示されます。

“`go
package main

import (
“bufio”
“fmt”
“lo

元記事を表示

httptestを試してみた

goの勉強続き。
testをやってみる

なんとか動いてCoverage 75%になったけど、100%にならないのはなんでなんだろ。
httptestでやるのはなかなか手応えがあったので、
単純な数値計算関数などに戻って、試してみようとおもう。

“`http2.go
package main

import (
“io”
“net/http”
“strconv”
“strings”
)

// ResponseWriter is interface as
// Header() Header
// Write([]byte)(int,error)
// iWriteHeder(statuscoe int)

// WriteString is function as
// func WriteString(w Writer, s string) (n int, err error)

// Writer is interface as
// Write(p []byte) (n int, err error)

func ServeHoge(w http.Respon

元記事を表示

Goのloopclosureについて

ある日、vim-go が loopclosure というワーニングを吐いた。
for文の中で関数を定義して、そのループ内で作った関数を呼ばない場合は、その時のanswerを渡してくれるわけではないみたい。
下のコードは a, bと表示して欲しいのだが、b, bと表示されてしまう。

“`
package main

import (
“fmt”
)

func main() {
answers := []string{“a”, “b”}
var funcs []func()
for _, answer := range answers {
funcs = append(funcs, func() {
fmt.Println(answer)
})
}

for _, f := range funcs {
f()
}
}
# =>
b
b
“`

正しくはこう

“`
package main

import (
“fmt”
)

func main() {
answers := []string{“a”, “b”}
var funcs []fu

元記事を表示

【React&Golang&MySql】Dockerで開発環境構築

dockerでReact&Golang&MySqlを使ったアプリケーション開発環境構築してみました。

リポジトリ

githubリポジトリは[こちら](https://github.com/atsugitakuya/react-go)です。

環境

とりあえず、以下の環境で動かしてます。
docker:19.03.8
docker-compose:1.25.4

Reactサーバー構築

まずはReact用意から。
とりあえず、Dockerfileとdocker-compose.yml作成する。
今回は、[こちらの記事](https://qiita.com/kerochelo/items/1063da8893026de5ebbf)を参考にしました。

“`ruby:/docker/react/Dockerfile
FROM node:8.16.0-alpine
WORKDIR /app/react
RUN npm install –save prop-types
RUN npm install -g create-react-

元記事を表示

Golang Sliceに構造体をブチ込む

“`
package main

import (
“fmt”
)

type Person struct {
Name string
Age int
}

func Persons() []Person {
persons := []Person{
Person{“Aaron”, 30},
Person{“Harold “, 20},
Person{“Ted”, 5},
}
return persons
}

func main() {
persons := Persons()
for _, person := range persons {
fmt.Printf(“%s: %d\n”,person.Name, person.Age)
}
}
“`

元記事を表示

Protocol Buffers用 Go言語APIの APIv1 と APIv2 の差異

# この記事について

Protocol Buffers用 Go言語API に新しく V2 (APIv2) が出たことにより、import のパス、リポジトリ、protoc-gen-go などに違いがあり混乱したので整理してみた。

なお、投稿時(2020/05/11)での情報なので今後変わる可能性あり。

# Protocol Buffers用 Go言語API について

Protocol Buffers(以下、protobuf)は言語ニュートラルなデータのシリアライズの仕組みで、Go言語でも protobuf を使うための API が提供されている。

最初の API が提供されたのが 2010年ごろで、これを `APIv1` と呼ぶ。
そして、2020年3月に新しい `APIv2` がリリースされた。

APIv2 についてのごく簡単な特徴:

– *.proto ファイルで定義された protobuf のアノテーションを Go から読めるようにした
– APIv2 は後方互換性はない
– APIv1 は今後もずっとサポートを継続する(原文: We intend to mai

元記事を表示

OTHERカテゴリの最新記事