- 1. golang switch fallthrough
- 2. ファイルの変更を監視してコマンドを実行するCLIツール「monitor」を作成した話
- 3. 関数に可変長引数を使いたい
- 4. go-sql-driver/mysql を用いる際に (*DB).SetConnMaxLifetime は不要なのか
- 5. Kubernetes APIのdeprecation/removalを事前に検出する
- 6. 【Go】メソッド=関数でしょ?と考えてきちんと躓く
- 7. 【Golang】構造体③埋め込み
- 8. 【Golang】構造体②メソッド
- 9. Go製のToolをHaskellで実装する
- 10. GoでGoogle Maps APIを使って場所の詳細情報を取得する(例:東京タワー)
- 11. 【Golang】構造体
- 12. Vuguに触れてみた(構文確認編)
- 13. Vuguに触れてみた(環境構築編)
- 14. pion/webrtc のexampleのタイムアウトを伸ばす
- 15. Go言語でAWS SNSにメッセージを送信する
- 16. goose設定ファイルに環境変数を読み込めない(Docker環境)
- 17. GitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
- 18. xerrorsの誤った使い方について
- 19. Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
- 20. 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
golang switch fallthrough
# golang の switchで使う fallthroughを試してみた
次のcase文に、条件に関わらずに進む。
この例だと、Aの条件が成立して実行されたあと、fallthroughで、
Case Bの節を実行する。
Case Cは実行されないので、その中のfallthroughは通過しない。
もしa=Cだったら、defaultも
実行される。“`fallthrough.go
package mainfunc main () {
a := “A”
switch a {
case “A”:
println(“A”)
fallthrough
case “B”:
println(“B”)
case “C”:
println(“C”)
fallthrough
default:
println(“end”)
}
}
ファイルの変更を監視してコマンドを実行するCLIツール「monitor」を作成した話
# 概要
AtCoderや機械学習の前処理を行うようなスクリプトを組む場合,変数の状態をprintデバッグすることが多く,変更を加えて再実行して結果を確認する一連の作業がめんどくさいと感じていました.
そこで,ファイルの変更があった場合に事前に引数で渡したコマンドを実行してくれるコマンドラインツール`monitor`を作りました.
この手のCLIツールは探せばより優秀なものがすでにあるとは思いますが,とりあえず作ってみたことで愛着が沸きますし勉強になりました.![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271810/026bf835-8a15-07b6-32cc-0c6e756e7ccd.gif)# 実装
https://github.com/maitaken/monitor
実装言語は使ってみたかったという理由でGo言語を選択しました.# インストール方法
GOの設定(GOPATHなど)がされているのであれば,以下のコマンドでインストールできます.GOのcontextを
関数に可変長引数を使いたい
##はじめに
可変長引数を使った関数について、備忘録を兼ねて記載しておく##概要
Goでは、「…」を使うことで
・関数の定義に可変長引数を使うこと
・その関数にスライスを渡すこと が可能##可変長引数を使って任意個数の引数をとる関数を定義する
型の前に「…」を記載した(`変数名 …型`)を引数の定義を使うことで、
任意の個数の引数をとる関数を定義することができる。“`sample.go
func sample(s string, i …int){
//処理(もちろん、iはスライスなので、rangeを使うことも可能)
}func main(){
sample(“Hello”, 1, 2, 3, 4)
}
“`つまり、関数定義で使う「…」には、渡ってきた可変長引数の値を 変数名x([]T型)のスライスにまとめる効果がある。
#####制約事項
可変長引数は、「引数の末尾に1つだけ」定義することができる。
→ 可変長引数は、**最後に1つだけしか書けない**##スライスを可変長引数として渡す
変数名の後に「…」を記載
go-sql-driver/mysql を用いる際に (*DB).SetConnMaxLifetime は不要なのか
# はじめに
先日、GitHub Blog にて Go の MySQL Driver に関する記事が掲載されました。
[The GitHub Blog: Three bugs in the Go MySQL Driver](https://github.blog/2020-05-20-three-bugs-in-the-go-mysql-driver/)ここでは Three bugs のうち、最初に挙げられている `The crash` について話します。
`The crash` は、切断されたコネクションをコネクションプールから引き当てて用いた際に `unexpected EOF` が発生する問題です。
この問題に対して、今までは `(*DB).SetConnMaxLifetime` を設定することで、切断されたコネクションを再利用しないよう対処してきました。go-sql-driver/mysql v1.5.0 では著者による修正がマージされており、記事中では `(*DB).SetConnMaxLifetime` が不要とされています。
> If your MyS
Kubernetes APIのdeprecation/removalを事前に検出する
`apps/v1beta1 Deployment`等のKubernete APIのdeprecation/removalを検出するための方法について紹介します。
**特にKubernetes v1.16以上に移行する方々**
Kubernetes v1.16ではDaemonSetやDeploymentの古いAPIバージョン(ex. `extensions/v1beta1`, `apps/v1beta2`)がremoval対象となっているため影響が大きいです。v1.16以上のクラスタに移行する予定がある方は注意しましょう。# 背景
Kubernetesは新しいバージョンで特定のKubernetes API(ex. apps/v1beta1 Deployment)がdeprecated/removedとなります。詳細なDeprecation Policyについては[公式ドキュメント](https://kubernetes.io/docs/reference/using-api/deprecation-policy/)を参照してください。
Kubernetesでは各リソースのAPI
【Go】メソッド=関数でしょ?と考えてきちんと躓く
# メソッド = 関数でしょ?
なんででしょう。なんとなくこういう感覚でした。
**もちろん違いますね。オブジェクト指向をきちんと勉強しましょうね(自戒)**とりあえず、一歩前進して以下の解釈になりました。
## 関数とは
[IT用語辞典 — 関数 【 function 】 ファンクション](http://e-words.jp/w/%E9%96%A2%E6%95%B0.html)
> 関数とは、コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。
うん。こちらの意味は想像と一致してました。
## メソッドとは
[IT用語辞典 — メソッド 【 method 】 メンバ関数](http://e-words.jp/w/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html)
> オブジェクト指向ではデータと手続きをオブジェクトとして一体化(カプセル化)して定義、利用する。この、オブジェクトに内包された手続き(データに対す
【Golang】構造体③埋め込み
#【Golang】構造体③埋め込み
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
“`
//Embedded
//クラスの継承のイメージ
//埋め込み//Pythonの場合
/*
class Vertex(object):def __init__(self, x, y):
self._x = x
self._y = ydef area(self):
return self._x * self._ydef scale(self, i):
self._x = self._x * i
self._y = self._y * iclass Vertex3D(Vertex):
def __init__(self, x, y, z):
super().__init__(x, y)
self._z = zdef area_3d(self):
【Golang】構造体②メソッド
#【Golang】構造体②メソッド
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//メソッドとポインタレシーバーと値レシーバー
//メソッド class内関数のselfを使えるようなイメージ(Goにはクラスが無い)
//コードがわかりやすいimport (
“fmt”
)//バーテックスを作成
type Vertex struct {
X, Y int
}//1
func Scale1(v *Vertex, i int) {
v.X = v.X * i
v.Y = v.Y * i
}//2
//メソッド
func (v Vertex) Area() int {
return v.X * v.Y
}//メソッド
//structのポインタを渡す 値を上書きする
//原則ポインタ型にする
//引数も渡す
func (v *Vertex) Scale2(i int) {
v.X = v.X * i
v.Y = v.Y * i
}fun
Go製のToolをHaskellで実装する
# 初めに
最近Haskellの学習としてGo製のToolをHaskellで実装するようにしています。
Haskellでなにかしら作りたいと考えていて、そういえばGo製のToolはよく作られているから面白そうなものありそうだなと思ったのがきっかけです。
mockサーバであるhttplabをHaskellで作ることにしました。
まだ100%の実装ができていないのですが、ある程度形ができたので記事を書くことにしました。
![screeencast.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217752/bd2e51db-1a92-a530-ec8c-75c9bf2718e6.gif)
ソースコードは[こちら](https://github.com/kwhrstr/httplabkell)にあります。
Haskellでbrickというライブラリを使っていますが、使い方等は[以前書いた記事](https://qiita.com/kwhrstr1206/items/25acf6eb3c43f
GoでGoogle Maps APIを使って場所の詳細情報を取得する(例:東京タワー)
# はじめに
GoでGoogleMapsAPIを使った記事があまりなかったので書いてみました。
GoogleMapsAPIには様々なAPIがあるのですが、今回は[Place](https://cloud.google.com/maps-platform/places?hl=ja)というAPIを使ってみたいと思います!Placeの詳細情報はこちら。
[Overview | Places API](https://developers.google.com/places/web-service/intro)# GCPで事前準備
GoogleMapsAPIを使うにはGCPのアカウント作成、プロジェクト作成、APIKEYの取得が必要です。以下からこれらを作成します。
[Google Cloud Platform](https://cloud.google.com/docs?hl=ja)詳しい手順はこちらが参考になります。
[Google Maps Platform APIキーの取得・発行について](https://www.zenrin-datacom.net/business/
【Golang】構造体
#【Golang】構造体
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//struct 構造体
//クラスのような感じimport (
“fmt”
)//struct
//型
//キャピタル=頭文字を大文字にする。小文字だと外部からアクセスできない
type Vertex struct {
X int
Y string
Z int
}//3 値を書き換える関数は、引数をポインタ型にする
//関数 Xを書き換える
//引数がポインタ型ではないので変わらない
func Changev(v Vertex) {
v.X = 100000
}//関数 Yを書き換える
//引数はポインタ型で渡す
func Changev2(v *Vertex) {
//本当は下記で書くといいが、
// (*v).X = 1000
//下記でも、自動で*vにしてくれる
v.X = 1000000
}func main() {
//1
//宣言
v := Ver
Vuguに触れてみた(構文確認編)
# はじめに
こちらは別記事([Vuguに触れてみた(環境構築編) ](https://qiita.com/inagacky/items/a1c8f13f0aa3c956ef5f
))の続きです。
今回は実際に構文確認しつつ、Vuguに触れていきたいと思います。Vuguに触れてみた(環境構築)のファイル構成前提で始めますので、ご了承ください。
また、今回作ったものに関しては下記リポジトリに置いています。(更新するかもです。)
https://github.com/inagacky/vugu_sample# 構文確認
まずは `root.vugu` を元に、色々と触れていこうと思います。
初期状態だと色々文言が入っていますので、削除してから始めています。## vg-if
`Show Button` というボタンをクリックすると、 `Show` というbool型の値が変わり、
`SAMPLE TEXT` という文言を表示するだけのコードです。“`go:root.vugu
Vuguに触れてみた(環境構築編) # はじめに
一時期小耳に挟んだ `Vugu` という技術について、今更ながら触れてみたので記事にしてみました。# Vuguとは
`Golang` で、 `Vue.js` っぽくフロントエンド を記述できるライブラリです。
`WebAssebmly` で実行されるのでコードの漏洩がなかったり、実行速度も比較的高速らしいです。
公式URLは下記
https://www.vugu.org/
`2020/04/26` に `v0.3.0` が出たようなので、まだまだ発展途上の技術ではあります。# 環境構築
環境構築だけなら、下記公式の手順を行なっていけばできます。
https://www.vugu.org/doc/start## 前提
`Golang` の `v1.14` 以上らしいので、予めインストールをお願いします。
Macで、homebrewを使っていれば、下記コマンドだけでGolangのインストール可能です。“`
% brew install go
“`
その他の方法に関しては、公式のインストールをご確認ください。
https://golang.org/doc/ipion/webrtc のexampleのタイムアウトを伸ばす
[pion](https://github.com/pion/webrtc) は Go で書かれた WebRTC 実装です。
これを試してみようとして、まずexampleを動かしてみようとしました。https://github.com/pion/webrtc/blob/master/examples/README.md
通信を行うときに両者でお互いの通信条件を取り交わす必要があります。これをシグナリングと呼んでいます。
WebRTCではシグナリングの方法は仕様で定めらていません。
ここのexamplesでは、それを「コピぺ」によって行うようになっています。(1) webページのフォームに表示された文字列をコピぺして実行ファイルの標準入力に食わせる。
(2) 実行ファイルの標準出力に出てきた文字列をコピぺしてwebページのもうひとつのフォームに入力する。
(3) webページ上の’Start Session’のボタンを押す。やってみると、これがなかなかうまくいきません。(3)のボタンを押す直前でタイムアウトしてしまいます。
コピペする文字列は百行近くある巨大なものなので、スGo言語でAWS SNSにメッセージを送信する
## 概要
Amazon Simple Notification Service(SNS)で、Go言語のSDKを使ってトピックに対してメッセージを送信します。## 環境
– Go : 1.14.3
– Mac OS X : 10.15.4
– AWS SDK for Go## シンプルな実装
“`go:シンプルなメッセージ送信
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sns”
)// TopicARNとRegionは環境に合わせます
const (
TopicARN = “arn:aws:sns:XXXXXXXXXXXXXXXXX”
AwsRegion = “XXXXXX”
)func main() {
// SNSクライアントの作成
mySession := session.Must(session.Negoose設定ファイルに環境変数を読み込めない(Docker環境)
# 概要
Docker環境でGo製マイグレーションツールのgooseを使用する際、設定ファイルである`dbconf.yml`が環境変数を読んでくれませんでした。### dbconf.yml
~~~yml
development:
driver: mymysql
open: $MYSQL_URI
~~~
環境変数は、**$変数**という形式で読み込んでくれるはずなのですが・・・([公式参照](https://bitbucket.org/liamstask/goose/src/master/))### Dockerfile
~~~dockerfile
FROM golang:1.14.2-alpineWORKDIR /go/src/server
COPY . .
ENV GO111MODULE=onRUN apk add –no-cache \
alpine-sdk=1.0-r0 \
&& go get github.com/pilu/fresh \
bitbucket.org/liamstask/goose/cGitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
GitHubのWikiを充実させたい => 目次手書きで書くのが面倒!
ということでGo + [Gin](https://github.com/gin-gonic/gin)を使ってToCジェネレータを作成しました。
![Screen Shot 2020-05-24 at 23.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/d9111f6c-d22f-2d71-00b4-b60fbe249c6c.png)
GitHub WikiのURLを入力するとToC(Table of Contents(目次))を作成してくれます。
デプロイは [Zeit Vercel(旧 Zeit Now)](https://vercel.com/)で行おうとしたのですがうまくいきませんでした。(このサービスめっちゃ好きなので残念)
https://github.com/yousan/toc-generator/
## Gin
Goのウェブ用フレームワークです。ルーティングやテンプレートなどの機能xerrorsの誤った使い方について
# お題
Go 1.13 で `%w` によるログのラップが可能になった。
が、その方式でログ出力すると(エラー時の)スタックトレースが吐けない。
ので、スタックトレース吐くために [xerrors](https://godoc.org/golang.org/x/xerrors)パッケージが用意されている。
これで、エラー時にスタックトレース付きでログが吐ける。
といった話は、既にたくさん記事があるので、この`xerrors`パッケージをこうやって間違って使ってしまったという事例を2つほど。# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”
“`## # バックエンド
### # 言語 – Golang
“`
$ go version
go version go1.13.9 linux/amd64
“`### IDE – Goland
“`
GoLand 2020.1.2
Build #GO-201.Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロードするサンプルスクリプトです。
並列実行数が10を超過しないように、semaphoreを使っています。便利です
[sync.semaphore](https://github.com/golang/sync/blob/master/semaphore/semaphore.go#L40) の実装を読んでみると面白いですよ[golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する](https://blog.lufia.org/entry/2018/01/26/141300) を参考にしつつ実装してみました
“`go:main.go
package mainimport (
“context”
“fmt”
“io”
“net/http”
“os”
“sync”“golang.org/x/sync/semaphore”
)var wg *sync.WaitGroup
var sm = semaphore.NewWeighted(10) //【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
## 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
ライブラリのコードを読んでいると`_ struct{}`というフィールドが定義してある構造体をみかけることがありますが、これはどういう意味なのか?というお話です。
結論としては、これは構造体を初期化する際に、フィールド名の指定を強制する意図で宣言されています。
### blank identifierを用いた構造体の定義とComposite literalsによる構造体の初期化
“`go
type SomeType struct {
Field1 string
Field2 bool
_ struct{}
}
“``_`はblank identifierと呼ばれるものです。
これは、`dev/null`に似ていて、blank identifierに割当てられた値や宣言は、無害な方法で、~~虚無のブラックホールへと~~捨て去られます。(`_`がブラックホールの穴に見えてくる…)ここでは詳しく説明しませんが、[Effective Go](htt
関連する記事
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた