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

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

Go言語のtemplateは何がツラいのか?

# はじめに
Go言語でWebアプリを作れるのか調べていたところ、公式のテンプレートエンジンではツラいとあったが、何がツラいのかいまいちわからなかったので、調べてみました。

# ツラいこと
1. templateでレイアウトを継承できない
2. templateごとにstructを定義しなくてはならない
3. Viewの関数が用意されていない

## 解決作
> templateでレイアウトを継承できない

これには以下のようにテンプレートを分けて定義して、挿入することで解決できます

“`go
package main

import (
“os”
“text/template”
)

func main() {
t := template.Must(template.New(“”).Parse(templ))
template.Must(t.Parse(content))
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
}

// 実際は別ファイル
const templ = `ベース

元記事を表示

Go で GUI を表示する(RegisterClassEx/CreateWindowEx/GetMessage)

Go で Win32 を呼び出すコードを書き始めている。
とりあえずウィンドウを表示できたので、後の人のために残しておく。

“`go:main.go
package main

import (
“syscall”
“unsafe”

“github.com/blono/win” // fork of lxn/win
)

func NewUTF16(s string) *uint16 {
result, _ := syscall.UTF16PtrFromString(s)

return result
}

func onMessage(window win.HWND, msg uint32, wParam uintptr, lParam uintptr) uintptr {
switch msg {
case win.WM_CLOSE:
win.DestroyWindow(window)
case win.WM_DESTROY:
win.PostQuitMessage(0)
default:
return win.DefWindowProc(win

元記事を表示

lxn / win の PR をマージしたやつ

Go で Win32 を使えるようにしてくれているまごうことなき神ライブラリである https://github.com/lxn/win
PR でマージされていないものがいくつかあった(RegisterHotKey とかいろいろ)ので、fork して全部 merge してみた。
https://github.com/blono/win

さらに CreateFile/ReadFile/WriteFile/SetWindowSubclass とか未実装の API もいくつか追加しておいた。

元記事を表示

yukicoder contest 245 参戦記

# yukicoder contest 245 参戦記

## [A 1033 乱数サイ](https://yukicoder.me/problems/no/1033)

問題を見た瞬間に、K ってなんのためにあるんだろうと思ったが、やっぱり要らなかった(笑). 0~Nの平均値は0~Nの合計値をN+1で割ったものなので (0 + N) * (N + 1) ÷ 2 ÷ (N + 1) なので、N ÷ 2 となる.

“`python
N, K = map(int, input().split())

print(N / 2)
“`

## [D 1036 Make One With GCD 2](https://yukicoder.me/problems/no/1036)

SegmentTree の GCD 版を持っていたので瞬殺だった(笑). 基本は尺取法. GCD が1になったらそこから先はどれだけ進めても1なので、GCD(Ai, Ai+1, …, Aj) で初めて1になったのであれば、Ai

元記事を表示

Go から Windows の MessageBox を呼び出す

Go + Qt は[前回の記事](https://qiita.com/manymanyuni/items/a28acb545200f1f45c79)から実用は難しそうなので、結局 GUI は Win32 API をたたく方向にした。
Windows でしか動かなくなるが、自分はサービスを作ったり Hotkey 登録したり API フックしたりいろいろやりたいけど C++ 使うほど大仰にはしたくないって用途なのと Go に対して C++ と同じレベルのポテンシャルを感じているので Go を使いたいってだけなのでこれでよしとする。

一から作るよりはある程度あったほうがいいので、以下を利用する。
https://github.com/lxn/win

“`go:main.go
package main

import (
“syscall”

“github.com/lxn/win”
)

func UTF16PtrFromString(s string) *uint16 {
result, _ := syscall.UTF16PtrFromString(s)

return r

元記事を表示

therecipe/qt を用いて Go から GUI を利用する方法(Windows/Mac)

[https://github.com/therecipe/qt](https://github.com/therecipe/qt) を用いて Go から Qt を使うための環境構築のメモ。

まずはじめに書いておかなくてはいけないのは、このライブラリは Qt の大部分をカバーしているらしく、それを Go から利用でき Mac/Windows/Linux でも動作するとてつもなく有益なライブラリであると言うこと・・ただ一つの弱点をのぞいて・・。

それは、ビルドに時間がかかりすぎると言うこと。
参考までに、2014 モデルの MacBook Air で超簡単なサンプルを実行(go run/go build)するのに 30 秒、Windows だと 2 分強(Core i7 4770k/MEM16GB)
いろいろ調べてみたけどこれはもうこう言う物らしい。
C++ だとインクリメントビルドがあるからクリーンビルドとかするとこのくらいかかるのかもしれないけど、通常だと 5 秒くらいだと思われ、Go の長所であるコンパイル速度がここまで跡形もなく消えて無くなっているのはほとんどの人には受け入れ

元記事を表示

ワイ的Goのプロジェクトのパッケージ割りはこれだ

## はじめに
goのパッケージ割りって悩みますよね。。
githubにもデフォルトのパッケージ割りが公開されていますが、webにそのまま使える訳でも無く、いろんな記事を見て実際に落とし込んだ**ワイ的ベスト(現段階)パッケージ割り**を紹介します!
(増田さんも「goはDDDに向かない」と仰っていましたね。。w)

## TIDL(長くは無いけど)

“`
.
├── Dockerfile
├── Makefile
├── README.md
├── bin //プロジェクトで使うバイナリ(wireとか)
├── cmd //エントリポイント
│ ├── app
│ │ ├── main.go
│ │ ├── wire.go
│ │ └── wire_gen.go
│ └── batch
│ ├── main.go
│ ├── wire.go
│ └── wire_gen.go
├── config.yaml
├── docker-compose.yaml
├── docs // ドキュメント(swaggerとか)

元記事を表示

Docker上のgolangから Oracle接続やってみました。

#はじめに
コロナ禍で自宅勤務になったので、今更ながらDockerやgolangでも使ってみようと思い少しお勉強してみました。
Qiitaで記事書くのも初めてなので優しくしてね(汗)
仕事ではOracleが多いのでgolangからOracleに接続を試みます。

#評価環境
 ホストOS:CentOS Linux release 7.7.1908 (Core)
 Docker:Docker version 19.03.8, build afacb8b
 DB Server:Oracle Database 11g Express Edition Release 11.2.0.2.0

#Oracleクライアント
 インスタントクライアントをOTN(Oracle Technology Network)からダウンロードします。
 今回は入手できた最新の19.6を使いました。
  instantclient-basic-linux.x64-19.6.0.0.0dbru.zip
  instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip
  instantc

元記事を表示

gonumをインストールした時にエラーが出た話

### 何をしようとしたか
Goの数値計算パッケージgonumをローカル環境にインストールした後、テストを実行したらエラー発生

### 何をしたか
Goのバージョン変更

## 環境
Ubuntu: 18.04.4 LTS
Go: 1.10.4

## 起因
gonumをインストール後、公式gonumのイントロ*1)に従ってテストを実行します。

“`
go test gonum.org/v1/…
// 以下, 出力結果

FAIL gonum.org/v1/gonum/floats [build failed]
FAIL gonum.org/v1/gonum/graph [build failed]
FAIL gonum.org/v1/gonum/graph/community [build failed]
? gonum.org/v1/gonum/graph/encoding [no test files]
FAIL gonum.org/v1/gonum/graph/encoding/digraph6 [build failed]
FAIL gonum.org/v1/

元記事を表示

golang multi-stage build でscratchを使う際にタイムゾーンを設定する方法

## Dockerfile example :whale:

“`dockerfile
FROM golang:1.14.2-alpine3.11 AS builder
RUN apk –update-cache add tzdata
WORKDIR $GOPATH/src/mypackage/myapp/
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=”-w -s” -o /go/bin/myapp

FROM scratch
COPY –from=builder /usr/share/zoneinfo /usr/share/zoneinfo
COPY –from=builder /usr/local/go/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
COPY –from=builder /go/bin/myapp /go/bin/myapp
ENV TZ=Asia/Tokyo
ENTRYPOINT [“/go/

元記事を表示

【Golang】スライスと基底配列

# はじめに
まだGo言語初心者で学習中の身ですので、間違いや不適切な表現などがありましたら、ご指摘頂けると助かりますm(_ _)m

# スライスとは
– すべての要素が同じ型の可変長列
– 配列の要素の部分列(もしくは全部)を参照している。この配列のことを**基底配列**という

## スライスの構成要素
スライスは次の3つの要素を持つ。

– ポインタ
– スライスを通して到達できる配列の最初の要素を指している
– 長さ
– スライスの要素数
– 容量
– 長さはこの容量を超えることは出来ない。容量を拡張しなければ、スライスの開始から基底配列の最後までの要素数が容量となる。

# スライスの更新と基底配列
**スライスは、基底配列を参照しているため、スライスの要素を変更すると基底配列も変更される。**

例)配列aからスライスsを作成し、スライスsの要素を変更してみると、基底配列aも変更されている。

“`go
a := [3]string{“ruby”, “php”, “python”}
s := a[:]
s[0] = “b”
fmt.Println

元記事を表示

Float計算回路の(ry-その1.1(float値の16進数表記)

# 浮動小数点数の16進数表記を得る(SW)

前回
[Float計算回路のVerilog-HDL実装について -その1](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

# 今回の内容
32bit float (single) が正しい値なのか
float値と16進表記値を相互変換するツールを作成する

cgo 使います
## 偉大な先駆者様(参考文献)
[浮動小数点数の内部表現を取得してみよう](https://qiita.com/nia_tn1012/items/d26f0fc993895a09b30b)

## コード全体
今回作成したコード

“`check.go
package main

/*
union {float f; int i;} uv;

int f2b(float inp) {
uv.f = inp;
return uv.i;
}

float b2f(int inp) {
uv.i = inp;
return uv.f;
}
*/
import “C”
import (
“fmt”

元記事を表示

クロージャと変数

##当記事の目的
最近Goの勉強を始めて、いまいち掴めないクロージャについて、
備忘録もかねて自分なりに整理した考えを記載しておこうと思います。

##クロージャとは
Go 言語 公式の「A Tour of Go」には以下の説明があります。
>Goの関数は クロージャ( closure ) です。
クロージャは、それ自身の外部から変数を参照する関数値です。
この関数は、参照された変数へアクセスして変えることができ、その意味では、その関数は変数へ”バインド”( bind )されています。

Goでは、**関数は第一級オブジェクト**として捉えています。
そのため、数値や文字列のように **関数そのものを変数に束縛や代入することも、引数または戻り値とすることができたりします。**
クロージャとは、この関数を戻り値とするもしくは引数とする際に、これらの関数を参照する値、情報を指している。
(以下でいうと、adder()の返す値がクロージャにあたる)

“`Function-closures.go
func adder() func(int) int {
sum := 0
re

元記事を表示

Go 標準パッケージでLoggingを実装する

# ログの基礎知識

– `log`パッケージをインポートする
– `log.Fatal`は実行されたところで処理が終了する
– `log.Print`は実行されても処理は継続される

# Loggingの実装例

こちらはロギング実装の一例です。他の実装方法が気になれば調べてみてください^^

“`go:
package main

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

// loggingの設定
func Logging(logFile string) {
// ログを書き込むファイルを以下の権限で開く
logfile, _ := os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

// 2つの出力先に対して書き込みをする
multiLogFile := io.MultiWriter(os.Stdout, logfile)

// フラグをセットする
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

元記事を表示

はじめてのGo

# はじめに

はじめての記事。その3

元記事を表示

Goでガチャっぽいの作ってみた

Goでガチャっぽい実装書いてみました。
社内勉強会でやったネタです。
リポジトリの README.md に内容をまとめました!
どんな実装にしたか、なぜそうしたかとかが書かれてます。
https://github.com/issuy/go-gacha

元記事を表示

兵庫県のコロナローソク足チャートアプリを公開しました。

#公開したサービス
https://covid19-candle-hyogo.ml
GitHubのソースコードは[こちら](https://github.com/inadati-services/covid19-candle-hyogo.services)

#動機
公表されている日毎の感染者グラフや累計のグラフって
回復した人や亡くなった人は差し引かれないので
常に拡大に向かっている感覚しか与えないと思います。

僕自身もそうですが
知りたいのはどちらかというと「傾向」
拡大傾向なのか、終息傾向なのか、あるいは均衡を保ったような状態なのか

兵庫県のオープンデータである[こちら](https://web.pref.hyogo.lg.jp/kk03/documents/yousei.xlsx)のexcelデータの
入院中の箇所が実質の県内陽性者数なのですが
前日比で-20人となる日なんかもあって、
実は、実質の陽性者数は増えたり減ったりしてる訳です。

僕はmqlという為替自動売買ツールの開発言語の経験があったのもあり
為替のローソク足チャートを応用すれば、感染拡大の傾向を視覚化出来る

元記事を表示

Go言語 パッケージhmacを使って暗号化する方法

#hmacの使用した暗号化

– sha256というアルゴリズムを使って初期化する

“`go:
package main

import (
“crypto/hmac”
“crypto/sha256”
“encoding/hex”
“fmt”
)

func main() {
const SecretKey = “Secret”

// ハッシュを作る
mac := hmac.New(sha256.New, []byte(SecretKey))

// データ情報を追加
data := “data”
mac.Write([]byte(data))

// 暗号化
expectedMac := mac.Sum(nil)

// string型にエンコードして表示できるようにする
sign := hex.EncodeToString(expectedMac)

fmt.Println(sign)
}
“`

# 暗号化の具体的な使われ方

– Apiに用いられる
– パスワード認証に用いられる

※以下では、超簡単にパスワード認証のデモを行っている

`

元記事を表示

[golang]可変サイズのSliceやmapを作る時 make([]T, 0)で初期化してはいけない

golangのsliceパフォーマンスに関する小ネタ。
「いけない」というのは言い過ぎですがしない方が良いよレベルのお話。

# NG例

例として引数で渡されてきたsliceから偶数の値だけ別のsliceに格納するような処理を書くとします。
偶数である数値の数は引数で渡された時点では不明であるためresultのlengthの初期値は0です。

“`Go
func SliceFullExtension(samples []int32) []int32 {
var result = make([]int32, 0)
for _, s := range samples {
if s % 2 == 0 {
result = append(result, s)
}
}
return result
}
“`

動作として問題ないですが上記のような書き方でsliceやmapを初期化してしまうと
appendの度に都度allocateが発生してしまい非常に効率が悪いです。

# 高速化その1: 最大値を定義した上で0にカットする

appendの度にsliceを拡張させない

元記事を表示

GO言語でリダイレクトのテスト

# リダイレクトのテスト
書くほどのことでもないですが、リダイレクトのテストの記事がなかったので、書いてみました

“`go
func TestAuthLogin_Success(t *testing.T) {
router := newAuthTestHandler()

req, _ := http.NewRequest(“POST”, “/auth/login”, nil)
rr := httptest.NewRecorder()

router.ServeHTTP(rr, req)
assert.Equal(t, http.StatusFound, rr.Code) // ステータスコードの検証
assert.Equal(t, “/”, rr.HeaderMap.Get(“Location”)) //リダイレクト先の検証
}
“`
下の2行でステータスとリダイレクト先の検証を行なっています。
以上です!

元記事を表示

OTHERカテゴリの最新記事