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

Go関連のことを調べてみた2021年05月31日
目次

Laravel eloquentのtoArrayのソースを読む(goのdatabase/sqlと比較してみる)

# Laravelのeloquentに悩まされる

業務でLaravelを触っています。
個人では最近はGoやNextjs(Typescript)、少し前まではDjangoをよく触っていました。
LaravelはDjangoと比べてもコードの自動生成が圧倒的に充実しており便利である反面、型がゆるゆる過ぎて変なところでつまづき時折腹が立ちます。あと、フレームワークとして大きすぎるかななんて思ったりもしてます。

Laravel歴3ヶ月弱の自分がeloquentを使ってDBからデータを引っ張ってきてtoArrayした際に予期せぬ型で返すことがありました。
**なんだコイツ**と思いつつ謎を放置したままいるのも嫌だったのでソースコードを見てみようと思いました。

ということでEloquentのtoArrayのソースコードを読み解いていこうと思います。

### toArrayの定義はこちらです
https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L1345

“`php
/**
* C

元記事を表示

[GCP]CloudBuild + CloudKMS + GitHubでタグプッシュデプロイを実現する(ほぼハンズオン)

## やりたいこと
– `GoogleCloudBuild`を利用
– ソースコードは`GitHub`で管理
– `GitHub`のリポジトリにタグ`Push`→`GoogleAppEngine`にデプロイ
– `CloudBuild⇆GitHub`のSSH鍵は`GoogleKeyManagementService`を利用
![GAE+CB+KMS+GitHub.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309580/31fef7b7-4a39-b416-66f4-7746c8be2cdb.jpeg “ToBe-Architecture”)

## 前提
– GCP(Google Cloud Platform)のアカウントを所持している
– GCPにプロジェクトを作成できる
– GitHubのアカウントを所持している
– サンプルで利用する言語はGo言語
– 投稿者の環境はMacOS(intel, Catalina)

## サンプルのディレクトリ構成
“`terminal:cloudbuild-

元記事を表示

DynamoDB+Goでmapのデータを取得する

# はじめに

GoでDynamoDBのmapのデータを取りたいときのメモ。
単純な構成は結構ググったら出てくるが、複雑な構成はググっても出てこず、試行錯誤した。

## TL;DR

* DBの要素にmapが入っている場合 -> [パターン1](#パターン1)
* mapがネストしている場合 -> [パターン2](#パターン2)
* リストの中にmapがある場合 -> [パターン3](#パターン3)
* mapを表現する構造体を定義する。
* mapを表現した構造体は、struct tagにキー名をつける。
* 各構造体のフィールドはエクスポートする。

## DBの構成

こんな構成。mapがネストしていたり、リストの中にmapが入っていたり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423952/d910f3c9-5d8b-e7a8-b6cb-820c0ba1cd72.png)

aws cliでget-itemするとこんな感じ。

“`shell
22:14:30 d

元記事を表示

【Go言語初心者】EC2インスタンス作成〜Vscodeで「hello go」するまで

Go言語の勉強をするなら、
いっそのこと、インスタンス上で勉強をしたいと思いhello goを出すまでできたので、
備忘録として記録しております。

## 環境
・MacOS
・Visual Studio Code
・Amazon linux2
・Go

[1.インスタンスの作成](#1-はじめに)
[2.EC2にSSH接続する](#2-EC2にSSH接続する)
[3.golangインストール](#3-golangインストール)
[4.vscodeでリモート接続する](#4-vscodeでリモート接続する)
[5.参考](#5-参考)

##1. EC2インスタンスの作成
AWSの画面は日々変わっていきますが、操作自体はそんなに変わらないと思います。
![スクリーンショット 2021-05-29 20.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700627/1ca4c898-8e53-4e74-c301-8a584b7c27c6.png)

まず、オレンジボタンの**「インスタンス

元記事を表示

リアルタイムOSコントローラ e-RT3 (Goから制御編)

#1.はじめに

横河電機の「[リアルタイムOSコントローラ(e-RT3)](https://www.yokogawa.co.jp/solutions/products-platforms/control-system/real-time-os-controller/)」における入出力モジュールの制御を、Go言語から制御する方法をまとめてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145581/2f2932c0-83b7-f87f-73c9-e1a9696e09c9.png)

目標としては、[前回記事](https://qiita.com/myasu/items/97ac50e968430487d5b5)のように、Rustから出力リレーの操作、入力の検知ができることとしています。

**リアルタイムOSコントローラ e-RT3 関連記事**

|||
|:–|:–|
|[第1回](https://qiita.com/myasu/items/057ce9ec2fa391

元記事を表示

GO 小数第N切り捨て

## 小数第3切り捨て

“`go
hoge := 87.689
fmt.Println(math.Floor(hoge*100)/100)
“`

## 小数第2切り捨て
“`go
hoge := 87.689
fmt.Println(math.Floor(hoge*10)/10)
“`

https://play.golang.org/p/HrGrlzDpUMa

参照
https://yourbasic.org/golang/round-float-2-decimal-places/

元記事を表示

Goの演習「Exercise: Loops and Functions」をやってみた

## 課題との出会い
GOのチュートリアルを進めていたら突如として課題が出てきました。
それがこちら
![スクリーンショット 2021-05-27 23.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0699c634-d173-a293-2f79-1ea8cb81cf7e.png)

URL:https://go-tour-jp.appspot.com/flowcontrol/8

どうやら引数にある数値の平方根に近づけてみよ!とのこと
ニュートン法に関してはよくわからないのでスルーします。

## 実際にやってみた
“`
package main

import (
“fmt”
“math”
)

// 引数の平方根に近づける
func Sqrt(x float64) float64 {
z := 1.0

// 10回繰り返すことが要件となっている
for i:=1; i<=10; i++ { // 記載通りの計算式 z -= (z*z - x) /

元記事を表示

Golang + Docker + RDB ユニットテスト実行時のローカルのホスト名の問題

# Golang + Docker + RDB ユニットテスト実行時のローカルのホスト名の問題

最近 Golang が楽しくなってきた、今回は、Golang + Docker + RDB で Golangのユニットテストで RDB 等にレコードを挿入したいときに、実行時のローカルのホスト名を読みかえなければならない問題に関して、自動化を図る方法があったので、そのメモ。

# 何がしたいのか
Golang の test コードから config.ReadConfig() を呼び出すことで設定の読みかえが可能になります。
Docker 等を活用している際にローカルと仮想環境内で接続先を切り替えたいときに使用します。

# 各種ステップ

書き換えたいファイル

“`yaml:config.yml
db:
host: host.docker.internal #ここをlocalhostに書き換えたい
name: title
password: password
user: user
“`

今までは手動でいちいち切り替えていたが、あまりにも効率が悪すぎるので、test

元記事を表示

Cloud Run Admin APIでサービスを取得する時の注意点

特定のCloud Runサービスの情報を取得しようとした時に思いっきり嵌ったので備忘録を残しておきます。

まず始めにCloud Runを操作するAPIは以下に用意されています。

https://github.com/googleapis/google-api-go-client

上記ライブラリを読むと以下メソッドでCloud Runのサービス情報を取得できることが分かります。

“`go
// Get: Get information about a service.
//
// – name: The name of the service to retrieve. For Cloud Run (fully
// managed), replace {namespace_id} with the project ID or number.
func (r *NamespacesServicesService) Get(name string) *NamespacesServicesGetCall {
c := &NamespacesServicesGetCall{s:

元記事を表示

Go Gin爆速入門 (REST API)

## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/098fbaef-c096-599e-c163-aced79706c75.png)

Goで圧倒的人気を誇るWebフレームワークのGinを使ってREST APIを爆速で構築するための入門です。
コードはginのREADMEドキュメントを元にしています。

https://github.com/gin-gonic/gin

### Ginの導入方法

“`bash
mkdir test-app && cd test-app
go mod init test-app
go get -u github.com/gin-gonic/gin
“`

## Quick Start
`/pin`というエンドポイントにアクセスすると`pon`と表示する簡単な例

“`main.go
package main

import “github.com/gin-gonic/gin”

func main() {
r :=

元記事を表示

カフェでプログラミングしてる風(でも何もやってない)Goコード版

[カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b) からインスパイアされたGo版です。

詳細は [ソースコード](https://github.com/e10ulen/sandbox/blob/master/fakeStatusChange/main.go) です。

## なんで作った?
習作(Goを書くのが久々)のため、なんか面白そうなのないかなって思って書きました。

## カフェでッターンはかっこいい
かっこいい

## ソースコードはこうなってる
(もっといい書き方があるはず)

“`go:fakeStatusChange.go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
fakeStatusChange()
}

func fakeStatusChange() {
sentence := 50
countup := 0
var dela

元記事を表示

DockerのTTYって何?

## 概要
docker-composeでよくコンテナ永続させるためにttyをtrueに設定してコンテナが正常終了しないようにしている記事があるが、ttyってそもそもなんなの、なんでコンテナが正常終了しないの?というところを忘備録として残しておきます。

## コンテナが正常終了する例としてGoコンテナをみてみる
“`yml
version: “3.8”
services:
go-app:
build:
context: .
dockerfile: ./docker/go/Dockerfile
volumes:
– ./src/sample-go-fluentd:/go/src
ports:
– 10881:8080
working_dir: /go/src

# ここをfalseに
tty: false
“`
“`bash
$ docker-compose up
# …省略
go-app_1 exited with code 0
“`
こんな感じログが吐かれてコンテナが停

元記事を表示

kongのカスタムプラグイン(Go)の作り方

## はじめに

kongのカスタムプラグインについて、色々ハマったので、メモ。
情報自体はそれなりにあるのだが、kongバージョンが古いときの情報が多く、最新(2.4.1)ではちゃんと動作しなかったので、まとめておく。

## TL;DR
* コンパイルするコンテナイメージ(kong/go-plugin-tool)のバージョンは新しいものにしておく。そうしないとコンパイルが通らなかった。
* kong自体はdockerで構築したので、Dockerfile内で`/usr/local/bin`に生成したバイナリをコピーしておく。
* 起動時の環境変数は以下を設定する。今回はプラグインを`key-checker`とした。

|変数名|値|
|—|—|
|KONG_PLUGINSERVER_NAMES|key-checker|
|KONG_PLUGINSERVER_KEY_CHECKER_QUERY_CMD|/usr/local/bin/key-checker -dump
|KONG_PLUGINS|bundled, key-checker|

## 作業の流れ

最初はバージョンと

元記事を表示

[エラー] Golang-migrationを使っていて 「Dirty database version 2. Fix and force version.」が出た時の対処法

# この記事で説明すること
`golang-migrate`ライブラリを使っていてデータベースのマイグレーションをしたときに

“`
error: Dirty database version 1. Fix and force version.
“`
というエラーが出た時の対処法

# 環境
– golang 1.15
– MySQL

# 解決法
`migrate force` コマンドを使う

“`
$ migrate -database ‘mysql://root:golang@tcp(mysql:3306)/golang_db?charset=utf8&parseTime=true&loc=Asia%2FTokyo’ -path migrations/ ${VERSION}
“`

-database以降はDBのURLを指定
-pathでマイグレーションファイルの場所指定
${VERSION}の部分はエラーで出ているVERSIONを数字で指定。

# エラーが起きた原因
テーブルを構成を編集したくて、`migrate down`コマンドを使った後に、マイグレーションフ

元記事を表示

DynamoDBのテーブル設計&Goでの実装プラクティス〜GSI Overloading編

業務ではRDBを使うことが多く、DynamoDBにマッチしたテーブル設計・実装をこれまであまり考えてこなかったため、記事としてアウトプットしながら勉強していきたいと思います。
GSI Overloading、隣接関係のリスト設計、転置インデックス、Composite Key、Sparse Indexesあたりに触れていければと思います。今回は、GSI Overloading編。なお、DynamoDBの基本的な用語については理解されている前提とします。

## GSI Overloadingとは?
直訳すると「GSIの多重定義で」、**一つのGSIに複数の検索条件を持たせる**ための手法です。
これだけ聞いても、**どのような場面で使うのか**、**どのようなメリットがあるのか**がわかりにくいと思うので、それぞれ説明します。

### どのような場面で使うのか
**テーブルが持つ複数のカラムに対して検索をかけたい時**に使用します。全く特殊なケースではなく、むしろかなり多くのケースで当てはまります。
例えば以下のようなイベントテーブルがあったときに、IDだけでなく、他のカラム(イベント

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑧

# はじめに
こちらのブラウザ側の解説です。

# 概要
### 以下の機能を提供
– ウェブサーバとwebSocketで接続してリアルタイム通信
– vueLoaderでコンパイルなしでvueコンポーネントを提供

# ファイル構成
***vue.jsなどの外部js,cssについてオフラインでも使えるようにcdnではなくlocalから取得するようにしています***

| No | ファイル名 | 概要 |
| — | —————— | —- |
| 1 | index.html | トップページ |
| 2 | js/index.js | メインjs |
| 3 | home.vue | ルートコンポーネント。4のXXX.vueを切り替え |
| 4 | vue/room/XXX.vue | 部屋コンポーネント。5のYYY.vueを切り替え|
| 5 | vue/device/YYY.vue | 家電コンポ

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑦

# はじめに
こちらのデバイスサーバの解説です。

# 概要
### デバイスサーバで以下の機能を提供
– 受信した家電操作情報(エアコンの気温など)をIR送信サーバに転送
– 共有設定されている家電情報をウェブサーバに送信

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– device
– 家電操作情報と赤外線データの関連付け
– 赤外線データを追加・修正する場合はここのマップ変数に対して行う

### adapter
共通設計参照

### useCase
共通設計参照

### do

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑥

# はじめに
こちらのメディアサーバの解説です。

# 概要
### メディアサーバで以下の機能を提供
– ウェブサーバからのメディア操作をvlcに反映
– vlcからの再生位置をウェブサーバに転送
– ファイルサーバからのファイル管理情報をvlcに反映

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– media
– vlcとgoのvlcラッパーで構成
– grpcから受信したメディア操作の送信はチャンネルを使う

### adapter
共通設計参照

### useCase
共通設計

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた⑤

# はじめに
こちらのファイルサーバの解説です。

# 概要
### ファイルサーバで以下の機能を提供
– ウェブサーバからのバイナリ(ビデオファイル)を受信しファイル保存
– ビデオファイル一覧をウェブサーバ・メディアサーバに送信

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– バイナリ(wsでpostされたファイル)をstreamで受信
– file
– 起動時にjsonファイルからファイル一覧を読み込みインメモリ化
– インメモリで管理しているファイル一覧をjsonに保存
– バイナリをmp4形式保存
– mp4からanimeGIFを作成

### adapter
共通設計参照

### useCase
<

元記事を表示

raspiにスマートリモコン&メディアプレイヤーをのせてみた④

# はじめに
こちらのウェブサーバの解説です。

# 概要
### ウェブサーバで以下の機能を提供
– スマホからのビデオファイルをファイルサーバに転送
– ファイルサーバからのビデオファイル一覧をスマホに転送
– スマホからのメディア操作をメディアサーバに転送
– メディアサーバからの再生位置をスマホに転送
– 家電操作情報(エアコンの気温など)をデバイスサーバに転送
– デバイスサーバからの家電操作情報(エアコンの気温など)をスマホに転送

# サーバ内の各層の機能概要
### infrastructure
– grpc
– 他の機能との共通コンテンツの受信や送信
– バイナリ(wsでpostされたファイル)をstreamでファイルサーバに送信
– ws
– echoとwebSocketで構成
– webSocketでブラウザへの送信はチャンネルを使う
– GET:indexとPOST:fileはrestで受信、それ以外はweb

元記事を表示

OTHERカテゴリの最新記事