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

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

Golangで、デザインパターン「Singleton」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Singleton」を学ぶ”](https://qiita.com/ttsubo/items/c4af71ceba15b5b213f8)

今回は、Pythonで実装した”Singleton”のサンプルアプリをGolangで実装し直してみました。

# ■ Singleton(シングルトン)
Singletonパターン(シングルトン・パターン)とは、オブジェクト指向のコンピュータプログラムにおける、デザインパターンの1つである。GoF (Gang of Four; 4人のギャングたち) によって定義された。Singleton パターンとは、そのクラスのインスタンスが1つしか生成されないことを保証するデザインパターンのことである。ロケールやル

元記事を表示

Golangで、デザインパターン「Prototype」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Prototype」を学ぶ”](https://qiita.com/ttsubo/items/07b91a14fcf4c26d7515)

今回は、Pythonで実装した”Prototype”のサンプルアプリをGolangで実装し直してみました。

# ■ Prototype(プロトタイプ・パターン)
Prototypeパターン(プロトタイプ・パターン)とは、ソフトウェア開発で用いられる、生成に関するデザインパターンの1つである。生成されるオブジェクトの種別がプロトタイプ(典型)的なインスタンスであるときに使用され、このプロトタイプを複製して新しいオブジェクトを生成する。

このパターンは、以下の目的で用いられる。

– Abstract

元記事を表示

Golangで、デザインパターン「Factory Method」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Factory Method」を学ぶ”](https://qiita.com/ttsubo/items/623f32f9e96cb16d04a4)

今回は、Pythonで実装した” Factory Method”のサンプルアプリをGolangで実装し直してみました。

# ■ Factory Method(ファクトリメソッド)
Factory Method パターン(ファクトリメソッド・パターン)とは、GoF (Gang of Four; 四人組)によって定義されたデザインパターンの1つである。 Factory Method パターンは、他のクラスのコンストラクタをサブクラスで上書き可能な自分のメソッドに置き換えることで、 アプリケーショ

元記事を表示

勉強会情報をpush通知するslackアプリを作った

# はじめに
勉強会の情報を定期的にpush通知してくれるslackアプリを作った。

こんな感じでpush通知したい勉強会の条件を設定して、

![study.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/a292bae9-c3dc-6519-f411-f9489bd40b36.gif)

条件に合致した勉強会が、設定した時刻に定期的に通知される。

スクリーンショット 2020-03-22 21.39.24.png
# モチベーション
大きめの勉強会や人気の勉強会の開催を、qiitaのトレンド記事やはてブの記事に挙げられてるのを見て、後から知ることが結構ある。そういう人気の勉強会をpush通知してくれるような仕組

元記事を表示

ループ中にある無名関数のgoroutineではキャプチャに気をつける

# ループ中のgoroutineでは束縛に気をつける

ほかのプログラミング言語の非同期処理でもよく起こしてしまう問題が、レキシカルスコープとダイナミックスコープの理解不足によるキャプチャのミスだ。

今回は、 **goroutine でやりがちなコードでキャプチャのミスを `go vet` で機械的に見つける方法を紹介する**

## 例題
goroutine を使って1,2,3とプリントする関数を3並列で処理したいとする[^1]。以下のコードを書いてみた。どういう動作をするだろうか?

[^1] 今回はプリントする関数としたが、実用であれば重い処理を実行する関数になるはず。

“`go

package main

import (
“fmt”
“sync”
)

func main() {
integers := make([]int, 3)
for i := range integers {
integers[i] = i
}

wg := &sync.WaitGroup{}
for _, v := range integers {
wg.Add(1)

元記事を表示

実用HeadlessCMSになりそうな『Jolojo』の紹介と、『SveltElm』な開発スタイル。

# 三行で

– Svelteを使えるHeadlessCMSのJolojoがもうすぐオープンソースになるってよ。
– JolojoのAPIはGoで記述する模様。Svelteでなくても呼び出せるよ。
– JolojoのクライアントサイドをElm+Svelteとすることで硬め・大規模なCMS開発にも使えそう(=>個人の感想)。

…後半、話が広がっていっちゃうのだけれど、Fringe81さんのAdvent Calendar 2018の記事『[組織の新言語導入(JS→TypeScript→Elm)で成したかった組織づくりの話](https://qiita.com/hosomichi/items/6c107f32d70bdb47fa35)』を読んでおいてもらえると話がつながるかな、と。

# 背景
[JavaScript ベスト・オブ・ザ・イヤー 2019『フロントエンド フレームワーク』](https://qiita.com/rana_kualu/items/4727a0d64657aa837ce3#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A

元記事を表示

PHP で Go の defer っぽいものを実装する

# はじめに
Go には defer という return などの前に共通で呼び出してくれる機能があります。

“`go
package main

import (
“fmt”
)

func main() {
defer func() {
fmt.Printf(“Hello World 1\n”)
}()
fmt.Printf(“Hello World 2\n”)
}
“`

上記の結果は

“`
Hello World 2
Hello World 1
“`

です。この記事は、これを PHP でやる手段はあるかどうかについて書きます。

# Q. PHP で defer はできるのか?
A. できます。

“`php
try {
echo “Hello World2\n”;
} finally {
echo “Hello World1\n”;
}
“`

または

“`php
class A
{
public function __destruct()
{
echo “Hello World!\n”;

元記事を表示

Go言語でソートのベンチマークを計測してみた

# はじめに
今回使用するソートアルゴリズムは「バブルソート」「選択ソート」「挿入ソート」「シェルソート」です。ソートアルゴリズムによってどれくらいの差がでるのかベンチマークを計測したら、面白かったので各ソートアルゴリズムの特徴と合わせて紹介したいと思います。
※ 今回使用していない「クイックソート」「マージソート」についてもいつか追記できたらと思います。

## ベンチマークの計測について
ベンチマークの計測は go の標準パッケージの testing を使用します。
100,000 個のランダムな数値を持つスライスを生成し、各ソートアルゴリズムで生成されたスライスのソートが完了するまでの時間を計測します。

– 計測に使うPCのスペック

“`
機種: MacBook Pro
プロセッサ名: Dual-Core Intel Core i5
プロセッサ速度: 2.3 GHz
メモリ: 16 GB
“`

– ベンチマーク計測に使用するコード

“`golang

// 1,000,000 以下の n 個のランダムなスライスを生成する
func GenerateS

元記事を表示

趣味グラマーが5日で5個GitHubリポジトリを作ってみた

 趣味グラマーですが、GitHub リポジトリを5個作ってみました。せっかく作ったので誰かしらに見てもらえたら嬉しいなということと、初心者が GitHub を始める敷居を下げられたらいいなという思いで Qiita 投稿してみます。

※ ちなみに普段は運用系のお仕事をしているので、一応 IT 系ではあります。

## GitHub のリポジトリってどうやって作ればいいんですか?
 わかります、、、その疑問。でも大丈夫!そこは親切な GitHub さんなので、新しくブラウザからリポジトリを作ると以下みたいな画面を出してくれます。画面のとおりにコマンドを実行すると、作ったリポジトリに push(アップロード)してくれます。

![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606756/904ba1f9-70ba-da7e-0b99-1954d163c856.png)

そもそも Git がよくわからない!という人は、ひとまず git init 等のコマンドを、プロダクトを作ったディレクトリ

元記事を表示

Next.js(React)でのCORSエラー解決(Next.js + Golang)

# Next.jsでのCORSエラー解決(Next.js + Golang)
React + GoでSPAを作りたく、ReactフレームワークのNext.jsを使ってみた。
SPAの最初で躓きがちなCORSエラーについて、案の定ハマったのでメモ。(Angularでの開発の際もだいぶハマった思い出)

## CORSエラーが出る
今回のようにフロントエンド、バックエンドでサーバを分けて開発する際に、そのままだとCORS(Cross-Origin Resource Sharing)についてのエラーが発生する。

これはブラウザの機能として、クロスドメイン(ドメインの違うサーバへの)アクセスが制限されているため起きます。
例えば、フロント `http://localhost:3000` , バック `http://localhost:5000` とした時、フロントからバックのapiを叩こうとするとcorsエラーとなります。(ドメイン違うので)

正常にapi叩くにはこれを解決する必要があります。

## Next.jsではカスタムサーバを利用し、プロキシする
Next.jsでカスタムサーバ

元記事を表示

Go言語でnull値を含むParquetファイルを生成する

## 環境

* macOS Catalina
* Go 1.14
* parquet-go 1.5.1
* pyarrow 0.16.0(確認用)
* pandas 1.0.3(確認用)

## Parquetファイルの生成

このソースコードを`main.go`として保存する。

“`go
package main

import (
“log”

“github.com/xitongsys/parquet-go-source/local”
“github.com/xitongsys/parquet-go/writer”
)

type Example struct {
Col *string `parquet:”name=col, type=UTF8″`
}

func main() {
fw, err := local.NewLocalFileWriter(“example.parquet”)
if err != nil {
log.Fatal(err)
}

pw, err := writer.NewParquetWriter(fw, new(Examp

元記事を表示

Golang入門.1 -http.HandleでHello World!-

## はじめに
他の言語でweb開発の経験がある人 (筆者) がgolangに入門する際に勉強したことを一連の記事でまとめていきます。

## やること
記事においてはweb開発において必要な機能をはじめとした、ある程度実践的な範囲を対象とします。基本的には対象とする機能を実装したコードを記載します。またコードだけではなく、ドキュメントを踏まえた概念的な説明を挟んでいきます。

## やらないこと
開発環境の構築方法や基本文法の説明は省略します。

## 今回のテーマ
http.Handleを用いてHello World!を表示させるまでの流れを説明します。

## 概念編
以下は[net/httpのdocument] (https://godoc.org/net/http)から抜粋しています。
golangでは他の言語と同様にHTTP requestに応じてresponseを生成します。ざっくりとした流れは以下の通りです (簡単のため、今回はURLにのみ注目します) 。
1. HTTP requestの中身を確認する
2. URLをparseし、事前に登録しておいたpatternと

元記事を表示

Golangで、デザインパターン「Builder」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Builder」を学ぶ”](https://qiita.com/ttsubo/items/0860e31c392aa3b91ed5)

今回は、Pythonで実装した” Builder”のサンプルアプリをGolangで実装し直してみました。

# ■ Builder(ビルダー)
Builderパターン(ビルダー・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。
## UML class and sequence diagram
![W3sDesign_Builder_Design_P

元記事を表示

パケットフィルタの仕組みを理解しつつGoで特定のプロトコルパケットを取得(フィルタ)する

## 理解しておくと良い前提知識
– カーネル空間/ユーザー空間の違い
– ネットワークの基礎
– ソケットプログラミングの基礎

## 環境
“`bash
$ go version
go version go1.13.5 linux/amd64
“`

## パケットフィルタの仕組み
特定のプロトコルパケットをフィルタする前にパケットフィルタの仕組みについて記す。
※cBPFとeBPFの違い、現在のBPFの機能がパケットフィルタだけではないとか、BPFの歴史/変遷などについてはこの記事では触れていませんのでご了承ください:bow:

例としてtcpdumpでのパケットフィルタを用いる。
tcpdumpなどのパケットキャプチャツールはソフトウェアとしてユーザ空間で動作します。
また、tcpdumpでキャプチャされているデータはカーネル空間からコピーされたデータとなっており、直接アプリケーションなどがやり取りするパケットを覗いているわけではありません。(そんなことしてたらオーバーヘッドがやばい)
ユーザランドでフィルタをしていてはカーネル空間から実際にフィルタしたいプロトコルのパケッ

元記事を表示

goenvのコマンドチートシート

pyenvと似たような感じですね。

### コマンドチートシート
| command | 内容 |
| —- | —- |
| goenv commands | 使用可能なgoenvコマンドを全て表示 |
| goenv completions | –completeを指定して呼び出すことにより、自身および他のコマンドの自動補完を提供します。 |
| goenv exec | 指定した仮想環境のGoバージョンでファイルを実行する。
例)goenv exec go run main.go |
| goenv global |すべてのシェルで使用されるGoのグローバルバージョンを設定する。 |
| goenv help | コマンドのヘルプを表示
例)goenv help execとか、goenc help installなど、helpのあとにコマンドを入力すると、当該コマンドのヘルプを表示してくれる。 |
| goenv hooks | 特定のgoenvコマンドのフックスクリプトを一覧表示する。 |
| goenv init | g

元記事を表示

docker-compose upでMySQLが起動するまで待つ方法(2種類紹介)

##docker-compose upで立ち上がらないGoのコンテナがありまして

docker-compose up -dでコンテナを立ち上げる際、
なぜかWeb側のコンテナが立ち上がらないという現象が発生していました。

docker-compose up -d!

“`
docker-compose up -d
Creating network “api_network” with the default driver
Creating redis … done
Creating mysql … done
Creating api … done
“`

しかし調べてみると、、、

“`
docker-compose ps
Name Command State Ports
————————————————————————————————–
mysql .sh

元記事を表示

Progate無料版をやってみる【Go】

[前回](https://prog-8.com/go/study/1/1#/1)に引き続きProgate無料レッスンをやっていこうと思います。

今回はGoです。

Googleが開発したプログラミング言語です。

#Go
[公式レッスン](https://prog-8.com/go/study/1/1#/0)

###環境構築
[公式](https://golang.org/)からダウンロード

IDEは最近使用しているVSCodeでいこうかなと・・・。

インストール後、[Getting Started](https://golang.org/doc/)を行います。
どうやら環境変数に「c:\Go\bin」(c:\Goにインストールした場合)を追加する必要があるようです。

→ 確認したところ、すでに入ってました・・・。

VSCodeのGoプラグイン
https://code.visualstudio.com/docs/languages/go

###Goに触れてみよう
・Progateを真似て、`main.go`を適当なディレクトリに作成し、VSCodeでディレクトリを開

元記事を表示

忙しい人のためのGo入門

とりあえうz、Go始めてみようかなと思った人向け

# 忙しい人のためのGo入門

## そもそもGoとは
Goは,2009年にGoogleにより発表されたオープンソースのプログラミング言語です。

## Goの特徴は
シンプルな言語仕様,型システム,並行処理

## おすすめの講座
### progate Go講座
https://prog-8.com/languages/go

### dotinstall Go入門

### サンプルアプリ
Goでアプリケーションを作る講座
https://rightcode.co.jp/blog/information-technology/golang-introduction-environment-1

## 基本的な文法(公式ドキュメント)
http://golang.jp/category/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88

↓もわかりやすい
http://gihyo.jp/dev/feature/01/go_4beginners

## ユニットテスト

元記事を表示

兵庫県のCOVID19感染者状況のGraphQL APIを公開してみた。(その2)

# 宣伝
兵庫県のコロナウイルス特設サイトが公開中
https://stop-covid19-hyogo.org/
僕の公開しているGraphQL APIとは今のところ別働で動いていますが
かなり参考にさせて頂いておりますのでご紹介しておきます。

# hyogo.covid19-api
[GraphQLプレイグラウンド](https://hyogo.covid19-api.ga/playground)

**api内訳**

– [readInfectedPeoples](https://qiita.com/Inadati/items/24437af1435245eafa4f#readinfectedpeoples)
– [readExamOverviews](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamoverviews)
– [readExamDetails](https://qiita.com/Inadati/items/24437af1435245eafa4f#readexamdetails)

元記事を表示

Goのreturn記録

Goのreturnについて学んだので、備忘録としてまとめます。

“`main.go
package main

import “fmt”

func add(x, y int) (int, int) {
return x + y, x – y
}

func main() {
r1, r2 := add(10, 20)
fmt.Println(r1, r2)

}

“`

元記事を表示

OTHERカテゴリの最新記事