Go関連のことを調べてみた2022年07月10日

Go関連のことを調べてみた2022年07月10日

ApacheBeam-Tutorial(GoLangVersion)

Apacheのアプリを調べてたところ、AzureDataFactoryのようなものを発見しました。
こちらになります。

https://beam.apache.org/

SaaSではなく、コードベースになっているデータインテグレーションフレームワークになります。
まだ詳しくない状況ですが、GUI等がないので、直感的にわかりにくいです。
これを使う利点として、他のApacheのアプリと結合しやすい点ぐらいしか思い浮かばないのです。

早速ですが、上記のページの公式ドキュメントについて説明になります。

## 使うテストデータ
Apache Beamのところから適当に取得しました。
ここはセットしたいデータで問題ないです。
“`text
The SDK-provided Count transform is a generic transform that takes a PCollection of any type, and returns a PCollection of key/value pairs. Each key represents a unique element

元記事を表示

Golangで学ぶGithubActions入門

## Github actionsでできること
より良い開発者体験や開発効率を求めてCI/CDの構築は今や欠かせないものになりつつあります。
そこで、Github actionsでどのようにCI/CDを構築すればよいか、開発にGolangを使っている場合をサンプルに説明します。Github actionsをこれから始めていく人が概要を掴みやすい内容の記事になっています。

初めにGithub actionsの説明について見ていきます。
以下は公式サイトからの引用です。
>ソフトウェア開発ワークフローをリポジトリの中で自動化し、カスタマイズし、実行しましょう。
CI/CDを含む好きなジョブを実行してくれるアクションを、見つけたり、作成したり、共有したり、完全にカスタマイズされたワークフロー中でアクションを組み合わせたりできます。

要するにソフトウェア開発の中でやらないといけない作業を自動化することができ、それを自分の好きなようにカスタマイズできるということができるみたいです。

## 自動化できること
では、Github actionsで何が自動化できるのでしょうか。
主によく使われる

元記事を表示

【Golang】json.Marshal のエラーをテストする【json.MarshalIndent 含む失敗ケースの作成】

> Go 言語(以下 Golang)で、俺様関数内の `json.Marshal`/`json.MarshalIndent` が JSON 変換に失敗するケースをテストしたい。

“`go:テストしたい関数
type Foo int

func (f Foo) Dump(w io.Writer) (n int, err error) {
if w == nil {
return 0, errors.New(“dump failed: the io.Writer w is nil”)
}

byteJSON, err := json.Marshal(f)
if err != nil {
// ここのエラーに、たどり着けない
return 0, errors.Wrap(err, “dump failed: can not marshal NodeLog to JSON”)
}

return w.Write(byteJSON)
}
“`
– [オンラインでユニット・テストをみる](https://go.dev/play/p/eJgx-pYQnvQ)

元記事を表示

DDDをざっくり理解してみる② ~ドメインサービスとリポジトリ編~

# はじめに
この記事は以下の続きです。まだご覧になっていない方はまずこちらお目通しください。

https://qiita.com/2san/items/eb9d7df6961542069233

今回も以下書籍を参考にさせていただいております。

# 前回の復習
– ドメイン

元記事を表示

Let’s EncryptでHTTPSを終端させたいだけならNginxよりCaddyを使うと楽だった件

みなさん!Webサーバ立ててますか?HTTPSしてますか?

弊社でも、よく自社向けの開発サーバをDockerで立てており、開発サービスは生HTTPで運用、そのフロントにHTTPS終端用のNginxをたてて、その証明書はメンテ&費用フリーの[Let’s Encrypt](https://letsencrypt.org/ja/)で取得するようにしています。

“`
インターネット → (HTTPS) → [ Nginx → (HTTP) → 開発サービス ]
“`

こういうDockerでLet’s EncryptでHTTPSしたいだけなら、同一のDockerネットワークに特定条件のDockerコンテナが生えるたびにNginxファイルを動的生成してLet’s Encryptの[ACME](https://ja.wikipedia.org/wiki/Automated_Certificate_Management_Environment)も通してなど全部やってくれる、下記を組み合わせるのが定番なのですが、

– [nginx-proxy](https://github.com/ngin

元記事を表示

Cloud Run + API Gateway で自作 API を作って検証してみた

本記事は note にて有料記事で公開しています m(_ _)m

https://note.com/wezardnet/n/nf2d413ba49b0

元記事を表示

Qiita Night〜これだけは伝えたい!Goのすごさとその将来性〜のイベントレポート

# 概要
– 2022年7月1日に開催された[Qiita Night〜これだけは伝えたい!Goのすごさとその将来性〜](https://increments.connpass.com/event/250648/)のイベントレポート
– Qiita社の中の人ですが、当日は主に視聴者として参加したので、LT及びトークセッションの視聴レポートをまとめてみました

# コンテンツ
– LT
– 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」/ @bikun_bikun
– スケールするGo / @tenntenn
– Googleソフトウェアエンジニアリングに沿った開発をするためのGoの利便性 / @po3rin
– トークセッション / @tenntenn , @po3rin
– Goはどんな風に使える?ここが便利!
– Goを使う仲間をもっと増やしたい!Goの魅力と将来性

## LT
### 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」
– スピーカー:@bikun_bikun
– 所属:ディップ株式会社(2018/05〜

元記事を表示

go言語  time.Format() time.Round() の挙動に注意

# まとめ
– `time.Round(time.Second)`を使うと、時刻は四捨五入的に処理される(真ん中で切り分ける)
– `time.Format(“2006-01-02 15:04:05”)`を使うと、秒未満は切り捨てられる

# 場面
SQLiteを使っていて、秒単位の時刻を記録していた。その際に想定外の値のズレが発生したため、調査していた。上記の仕様を確認した。

# コード
“`golang
a := time.Date(2000, 1, 1, 1, 1, 1, 300_000_000, time.UTC)
b := time.Date(2000, 1, 1, 1, 1, 1, 700_000_000, time.UTC)

fmt.Printf(“round a %v\n”, a.Round(time.Second))//round a 2000-01-01 01:01:01 +0000 UTC
fmt.Printf(“round b %v\n”, b.Round(time.Second))//round b 2000-01-01 01:01:02 +00

元記事を表示

動かして覚える!Goでデータベースの基本的な接続方法とCRUD操作

# なぜ「動かして覚える!」なのか

自分はどんな技術でも初めて勉強する時、文字を読んだり説明だけされても正直理解できず、実際に自分で書いてみて動きを見てから出ないとなかなか理解しにくいと感じました。

なのでこの記事は、自分のような「文字や説明だけじゃ分からん!」って人向けに実際にコードを書いて動かすことをメインに説明してみました。

データベースはよく使われているMySQLに接続してデータを操作していきます。

Dockerなどのコンテナを利用するか、GoとMySQLが同じPCにインストールされていれば同じように出来るので、良かったらこの記事を見ながらご自身の環境で試してみてください!

この記事の一番最後に丁寧に書かれているMySQLのインストール方法の記事があったので載せておきます。

# この記事の対象者
– **Goの勉強を始めた人**
– **文字や説明だけでは理解しにくいと感じる人**
– **GoでDBをいじってみたい人**
– **基本的なSQLを理解している人**

# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4

元記事を表示

GoでLinebotとLIFFを使ってGoogleDriveとMoneyForwardに領収書をアップロードしてみる

# 概要
これまで自分は、経費管理のために様々なレシートを保存してきた。
しかし、レシートの保管やアップロードのために使う工数がばかにならないので、**無料**で簡単にGoogleDriveとMoneyForwardに画像アップロードする方法がないか探したところ表題のシステムを実装するに至った。

**LINEで画像とタイトルを入力して送信すると、GoogleDriveとMoneyForwardにアップロードされる**というシンプルなもの。
公式docsでも書いていないことがあったり、結合して動かした時とかログが途中で禿げてたりしてよくわからないことも多かったので個人的な詰まりポイントをメモした。

(拙い内容です)

# できたこと
**1.LIFFでフォームを表示して、ファイル名・経費申請者・画像ファイル を入力し送信・アップロードすること**

iPhoneで撮ったレシートの写真を1枚選び、現在時刻をファイル名としてGoogleDriveの該当月フォルダにアップロードし、その後入力フォームにあるファイル名と経費申請者、画像ファイルを元として、マネーフォワードに経費明細をアップロー

元記事を表示

koanfの罠:空文字をスライスにUnmarshalしても空スライスにならない

# はじめに

[koanf](https://github.com/knadh/koanf) で環境変数を読み込む際、`ProviderWithValue` を使うことでスライスに設定を流し込むことができます。

“`go:readmeより一部改変
// 設定オブジェクト。環境変数を読み込んでここにセット
type config struct {
Vals []string
}

func main() {
k := koanf.New(“.”)

k.Load(env.ProviderWithValue(“MYVAR_”, “.”, func(s string, v string) (string, interface{}) {
key := strings.Replace(strings.ToLower(strings.TrimPrefix(s, “MYVAR_”)), “_”, “.”, -1)

// 値にスペースがあれば、値をスペース区切りでスライス化
if strings.Contains(v, ” “) {
return key, string

元記事を表示

Laravelのようなmake controllerコマンドをGoで作成

# 引数を取得
まずはコマンドの引数を取得。
“`go:main.go
package main
import (
“flag”
cmd “backend/commands”
)

func main() {
flag.Parse()
cmd.CMD()
}
“`
“`go:command.go
package commands

import (
“bufio”
“flag”
“fmt”
“os”
)

var verb string
var object string
var name string

func CMD() {
nArgs := flag.NArg()
if nArgs > 3 { //引数が3以上あったらコマンドエラー
errMessage := fmt.Sprintf(`no command “go run main.go %v”`, CreateArgsText())
fmt.Println(errMessage)
return
}
// 引数の値を取得
verb = flag.Arg(0)
objec

元記事を表示

Golangでrubyライクな配列処理をしたい!

# TL;DR
golangでrubyライクに配列操作ができるライブラリを書いたので、興味があったら使ってみてね!
https://github.com/ppmasa8/rbarr

## なぜ作ったか
rubyを普段使っている僕が、golangを使ったときに配列操作のやりにくさにキレそうになったので、作ってしまいました。
結果的に作っていく段階でgolangの配列操作に慣れてしまったので、なんとも言えませんが。

## 実装したメソッド
https://github.com/ppmasa8/rbarr#index
“`
[]intの場合
pop
shift
push
unshift
delete
sum
max
min
size
uniq
include
first
last
combination
reverse
empty
sort

[]stringの場合
pop
shift
push
unshift
delete
size
uniq
include
first
last
combination
reverse
empty
sort

“`

## 使い方
https://

元記事を表示

Goでコマンド作成

# コマンドを配列で取得
“`go:main.go

package main

import (
“flag”
cmd “backend/commands”
)

func main() {
flag.Parse()
args := flag.Args()
fmt.Println(args)
}

“`
これでだけでコマンドの引数を取得できる。

“`bash:terminal
$ go run main.go hello world
# [hello world]
“`

# コマンドの一部分を取得
“`go:main.go

package main

import (
“flag”
cmd “backend/commands”
)

func main() {
flag.Parse()
secondArg := flag.Arg(1)
fmt.Println(secondArg)
}

“`
“`bash:terminal
$ go run main.go hello world
# world
“`
指定した場所の

元記事を表示

GoでCORSの設定

# オリジン間リソース共有
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組み。
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

意外とはまったのでメモ。
今回はSPAの認証にCookieを使用。
# Access-Control-Allow
“`go:middleware.go
// セッションの確認
func CORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// クロスオリジン用にセット
w.Header().Set(“Access-Control-Allow-Origin”, “https://hoge.c

元記事を表示

GoのWebサービスでJSONを構造体に変換し、構造体をJsonに戻す

SPAのためにJSON APIを作成。

# JSONを変換
“`go:controller/home_controller.go
type User struct {
ID int `gorm:”AUTO_INCREMENT”json:”id”`
Name string `json:”name”`
Age int `json:”age”`
Sex string `json:”sex”`
Email string `json:”email”`
Address string `json:”address”`
Password string `json:”-“`
}

type Home struct{}

func (_ *Home) Show(w http.ResponseWriter, r *http.Request) {
var user User
// リクエストボディのJSONをデコード
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
fmt.Pr

元記事を表示

GoのWebサービスでhtmlを返す

今回はhttpリクエストの処理をcontrollerに記述しhtmlを返す方法をメモ。

# フォルダ構成
“`
root/
 ├ routes/
 ├  └ web.go/
 ├ controller/
 │  └ home_controller.go/
 └ templates/index.html
“`
laravelのような構成で作成。

# コントローラー
“`go:controller/home_controller.go
package controller

import (
“helloworld/models”
“log”
“net/http”
)

// Home画面の構造体を作成
type Home struct {}

func (h *Home)Index(w http.ResponseWriter, r *http.Request) {
   // ここに処理を書いていく
}
“`

今回はページ毎にコントローラーを分割しRESTapiを作成したかったので、構造体Homeのメソッドを作成。別のコントローラーにはまた違う構造体のメソッドを作成し

元記事を表示

Goでリクエストのたびに認証を行う

特定のリクエストURLで毎回認証を行う。

# wrapを作成する
“`go:middleware.go
package routes

import (
“backend/modules/session”
“encoding/json”
“net/http”
)

// セッションの確認
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // ここに処理を書く
next.ServeHTTP(w, r)
})
}

“`
こんな感じのラップを作成し、HandlerFuncを引数にとる。

# クッキーを取得し、セッションを確認
“`go:middleware.go
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Req

元記事を表示

Goで毎回のリクエスト毎にログを出力

処理の内容としては、毎回リクエストのたびに何かの処理をするというイメージ。

# muxのwrap作成
“`go:middleware.go
package routes

import (
“net/http”
“time”
)

//Logger is a middleware handler that does request logging
type Logger struct {
handler http.Handler
}
//NewLogger constructs a new Logger middleware handler
func NewLogger(handlerToWrap http.Handler) *Logger {
return &Logger{handlerToWrap}
}

“`

“`go:web.go
package routes

import (
“backend/config”
“backend/controller”
“net/http”
)

var home controller.Home

func Routes

元記事を表示

Goで静的ファイルを設置

今回Nuxt.jsを使ったSPAの作成だけではなく、初心に帰りSSGのアプリも作成。staticファイルの使い方をメモ。
# muxにハンドラーを登録
“`go:web.go
package routes

import (
“backend/config”
“backend/controller”
“net/http”
)

var home controller.Home

func Routes() http.Handler{
mux := http.NewServeMux()

// static
staticFiles := http.FileServer(http.Dir(“public”)) // publicフォルダ
uploadFiles := http.FileServer(http.Dir(“upload”)) // uploadフォルダ
mux.Handle(“/static/”, http.StripPrefix(“/static/”, staticFiles))
mux.Handle(“/media/”, http.StripPrefix

元記事を表示

OTHERカテゴリの最新記事