- 1. 【Go入門】Ubuntuでの環境構築から基礎まで【備忘録】
- 2. defer文の中でエラーハンドリングするときにエラーを握りつぶさないようにする
- 3. 【Go】ログイン機能でウェブアプリを作ってみる(4)
- 4. 【Go】config.iniファイルの読み込み
- 5. Goで始めるGraphQL Federation
- 6. [GCP] BigQueryの機能調査x実装
- 7. GolangでNCMBにリクエストを送る
- 8. Golang 空インターフェイスと型アサーション
- 9. 自動作曲アプリを書く
- 10. 【AWS Lambda】複数のLambda関数を1つのコンテナイメージにまとめる
- 11. Go言語によるログファイル出力
- 12. Go言語のエラーハンドリングについて
- 13. [Go] os.Exit()について
- 14. GolangでWebAPIを作成する①
- 15. DockerでGoの開発環境を作りVisual Studio Codeでコーディングを行う
- 16. 【Go】ログイン機能でウェブアプリを作ってみる(3)
- 17. APG4g(Go言語入門 APG4b)【1.05】
- 18. Go言語でREST APIを作成する
- 19. APIサーバをデーモンで動かすためのsupervisorの設定
- 20. GoでBOMを考慮したio.Readerを扱う
【Go入門】Ubuntuでの環境構築から基礎まで【備忘録】
# はじめに
この記事はGoについて何も知らなかった時の自分へ向けた備忘録です。
まずはGoの環境構築を行い、最小限のGoプログラムの実行からエラー制御、構造体などについてをまとめています。
## 環境
– Ubuntu 22.04.2 LTS
– go version go1.20.5 linux/amd64# Go環境構築
## Goのインストール
以下はUbuntu環境の場合の手順です。その他のプラットフォームをお使いの場合は、[Download and install – The Go Programming Language](https://go.dev/doc/install)でインストール手順を確認し、[All releases – The Go Programming Language](https://go.dev/dl/)から必要なファイルをダウンロードしてください。
“`bash
$ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
“`
defer文の中でエラーハンドリングするときにエラーを握りつぶさないようにする
このミスを2回やらかしたので備忘録として書いておきます。
# やらかしたコード
– defer文の中で何らかの処理を行いたい。そこでエラーが発生したら、それをもちろんハンドリングしたい。その際に、以下のように書くと元々存在していたエラーを上書きしてしまう。“`go
func hoge() error {
// 何らかの処理defer func() {
err = cleanUp()
}// 何らかの処理
return err
}
“`# 修正例
例えば以下のようにすれば、元の関数で発生したエラーと、defer文内で発生したエラーを両方とも検知できる。“`go
import (
“go.uber.org/multierr”
)func hoge() error {
// 何らかの処理defer func() {
err = multierr.Append(err, cleanUp())
}// 何らかの処理
re
【Go】ログイン機能でウェブアプリを作ってみる(4)
こんにちは。
Part 4はdocker-compose.ymlの解説についてです。
# 今回の目標
– docker-compose.ymlをなんとなく理解しよう!
– docker compose コマンドの使い方を覚えよう!## なんでdockerを使うの?
前回 docker-compose.yml を作成し、MySQLコンテナを起動しました。しかし
なんでわざわざこんなことをするのでしょうか?
理由の一つとして 「ローカル(自分のPC)からの影響を排除したい」 と言うのがあります。
例えばコンテナを起動せずにもともとPCに入っているMySQLアプリを使ったとします。
自分のPCのMySQLは日本語対応が済んでいる、とします。
開発中は日本語でも問題ありません。すでに日本語対応したMySQLを使っているからです。
しかし、実際のサーバーにMySQLを入れる時に日本語対応ができておらず、アプリを実行するとエラー。
だったら「初めから」の状態のもの、実際のサーバーとできるだけ近いものを準備し、そこから始めた方が後々の問題を回避できます。だから「自分のPCからの影響
【Go】config.iniファイルの読み込み
# はじめに
Go言語の勉強メモです。
config.iniで指定してあるAPIキーを読み込ませる部分の実装になります。# フォルダ階層
config/
├ main.go
├ config.ini
├ go.mod
├ config/
| └ config.go# パッケージのインストール
config.goファイル内の、”gopkg.in/ini.v1″パッケージを以下の手順でインストールする。・go mod init sample(任意の名前)
→ go.modの作成(go関連のパッケージをインストールするのに必要)
・go get gopkg.in/ini.v1# 実装
“`ini:config.ini
; セクションヘッダー
[api_info]
api_key = XXXXXXXXXX
api_secret = YYYYYYYYY
“`“`go:config.go
package config//必要なパッケージのインポート
import (
“log”
“os”
“gopkg.in/ini.v1”
)type Co
Goで始めるGraphQL Federation
この抜粋の内容は次のとおりです。
– Subgraph Server の実装
– Gateway Server の実装
– Subgraph を通す
– Gateway を通す“`mermaid
flowchart LR
Gateway[“Gateway
Bramble”]
Subgraph[“Subgraph
gqlgen”]
Client –> Gateway –> Subgraph
“`さらに詳しく知りたい方は読み続けてください。
—
2023年7月4回目です。
GraphQL Fedetaion についてです。
弊社のモバイルアプリの1つは、ユーザーのネットワーク帯域幅による影響を避けるため、GraphQL を BFF として使っています。
単一ドメイン業務においては、1つの GraghQL で問題ないと思います。
しかし、複数のドメイン業務を扱う場合、各チームは独立して自分たちの GraphQL サービスを開発するため、Supergraph(GraghQL Federation)[^1] にしていく必要が
[GCP] BigQueryの機能調査x実装
# GCPのBigQueryの概要と機能
## 概要
Google Cloud Platform(GCP)のBigQueryは、大規模なデータセットを効率的に保存し、クエリを実行するためのデータウェアハウスサービス。BigQueryは、高速でスケーラブルなデータ分析を実現し、ビジネスインテリジェンス(BI)や機械学習などの応用に利用される。また、クエリの実行結果のリアルタイムダッシュボードの作成や、ストリーミングデータの分析もサポートしている。## 主な機能
### 1. ペタバイト規模のデータセットの格納
BigQueryは非常に大容量のデータセットを処理できる。データは、自動的に分散され、複数のサーバーで並列に処理されるため、スループットとパフォーマンスが最適化される。データの格納や管理についても、ユーザーが意識する必要はない。### 2. スキーマレスなデータベース
BigQueryは、スキーマレスなデータベースとして機能する。データを格納する際、スキーマを事前に定義する必要はない。そのため、異様な形式のデータでも簡単に格納でき、また、JSONやAvro、Parquet
GolangでNCMBにリクエストを送る
NCMBでは各種言語向けにSDKを提供しています。公式ではない、コミュニティSDKを入れると10以上あるかと思います。
今回はGo言語でNCMBへのリクエストを送信してみました。問題になるのは署名生成プロセスなので、そこを関数化したことで、今後のSDK化も考えられそうです。
## 必要なライブラリ
今回利用したライブラリは以下の通りです。
“`go
import (
“fmt”
“crypto/hmac”
“crypto/sha256”
“encoding/base64”
“net/url”
“sort”
“time”
“encoding/json”
“github.com/go-resty/resty/v2”
“github.com/tidwall/gjson”
)
“`## 定数の定義
利用した、基本となる定数です。
“`go
// 定数の定義
const (
ApplicationKey = “YOUR_APPLICATION_KEY”
SignatureMethod = “HmacSHA256”
SignatureV
Golang 空インターフェイスと型アサーション
# 空のインターフェイス
go言語は全ての型と互換性のある空インターフェイス型を宣言できる。“`golang
var kara interface{}kara = 100
fmt.Println(kara)
fmt.println(&kara)kara = “Empty”
fmt.Println(kara)kara = [4]string{“K”, “A”, “R” “A”}
fmt.Println(kara)
“`##### 実行結果
“`
100
0xc000080ec0
Empty
[K A R A]
“`## 型アサーション
どんな型でも受け取れる空インターフェイスですが、逆に引数で受け渡された値は元の型の情報が欠落しています。
そのためGo言語では型アサーションを提供しており、型アサーションによりその受け取った型が何であるかを以下のように動的にチェックすることができます。##### 構文
“`
t, ok := i.(T)“`
i が T(型名) を保持していれば、 t は基になる値になり、 ok は真(true)になります。
自動作曲アプリを書く
# はじめに
卒業研究で自動作曲システムを作ったので、応用してブラウザで動くアプリを作ろうと思いました。# 目次
1. [アプリの概要](#Chapter1)
1. [フロントエンド](#Chapter2)
1. [バックエンド](#Chapter3)
1. [ソースコード](#Chapter4)
1. [今後の課題](#Chapter5)
# アプリの概要
キーを選択し、ダウンロードボタンをクリックすると、MIDIファイルが入ったZIPファイルがダウンロードされます。
![スクリーンショット 2023-07-24 181911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733784/72a82c9b-ae9d-3497-d0a2-8d622515df59.png)
![image.png](https://qiita-image-s
【AWS Lambda】複数のLambda関数を1つのコンテナイメージにまとめる
## やりたいこと・背景
Lambdaをコンテナから作成する場合、Lambda関数が複数ある場合は関数ごとにイメージをビルドしなければならないのか?という単純な疑問が出てきた。その場合、イメージの管理が複雑になりそうなので、1つのイメージで複数のLabda関数を管理できないかと考えた。## 結論
ランタイムイメージをビルドする際、各Lambda関数ごとに`ディレクトリを分け`、関数作成時に`ENTRYPOINT` を指定することで実現可能。同一ディレクトリに main関数 を持つバイナリが複数存在すると、実行時にどの main関数 を呼び出すべきかが不明瞭になり、うまく動作しない。そのため、各Lambda関数は独自のディレクトリに配置される必要がある。
ランタイムイメージで関数ごとにディレクトリを分けることで、各Lambda関数が独立して実行されるようになる。
## ローカル環境の準備
– フォルダ構成
root/
├ Dockerfile
├ main1.go
├ main2.go
└ main3.go– Dockerfile作成
“`docker:D
Go言語によるログファイル出力
Go言語でログファイルを出力する基本的な方法について記載します。
# 基本
まず、基本的なログ出力を見てみましょう。以下は、標準ライブラリの`log`パッケージを使用してログをファイルに出力するシンプルな例です。
“`go
// 必要なパッケージをインポート
package mainimport (
“log”
“os”
)func main() {
// ログを書き込むファイルを開く(なければ作成)
file, err := os.OpenFile(“testlogfile.log”, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
// エラーハンドリング
log.Fatal(err)
}// 関数が終了する際にファイルを閉じる
defer file.Close()// ログの出力先をファイルに設定
log.SetOutput(file)// ログを出力
log.Println(“This is a test log entry”)
}
“`# ロ
Go言語のエラーハンドリングについて
## 1. エラーハンドリングの基本
まず、基本的なエラーハンドリングの例を見てみましょう。ここでは、ファイルを開いて読み込むというシンプルなタスクを考えます。
“`go
file, err := os.Open(“example.txt”)
if err != nil {
log.Fatalf(“failed opening file: %s”, err)
}
defer file.Close()byteSlice := make([]byte, file.Stat().Size())
_, err = file.Read(byteSlice)
if err != nil {
log.Fatalf(“failed reading file: %s”, err)
}fmt.Printf(“file content: %s”, byteSlice)
“`ここでは、 `os.Open` から返されたエラーを確認し、エラーが存在する場合にはログメッセージを出力してプログラムを終了しています。また、 `file.Read` から返されたエラーも同様に確認して
[Go] os.Exit()について
# os.Exit()とは?
https://pkg.go.dev/os#Exit
os.Exit()とは、与えられたステータスコードを出力すると共に、プロセスを即時終了する関数です。
ステータスコードの慣習的には、– 0 = 成功
– 0以外 = 失敗のようで、ステータスコードの範囲は [0 ~ 125]が推奨されています。
実際に実行してみると、ステータスコード0以外の場合は、”exit status 1″とともにプログラムが終了します。
“`go:
package mainimport (
“fmt”
“os”
)func main() {
fmt.Println(“hello world”)
os.Exit(1)
fmt.Println(“ops”)
}“`
“`log:出力
$ go run ./main.go
hello world
exit status 1
“`# deferファンクションは実行しない
os.Exit()はプロセスを即時終了させ、deferファンクションは実行しないようです。“`go:
p
GolangでWebAPIを作成する①
## Golangを利用し、WebAPIを作成していきます。
## 今回のお題
今回は、golangでWebAPIを作成するための環境を作成していきます。
① golangのプロジェクトの作成
② ginのインストール### 今回の内容は、環境構築を行いたいと思います。
利用するツールとバージョンは以下の通りです。### 開発環境
|バージョン
—|—
Golang|1.20.4
gin|1.9.1## 実装
### Goのプロジェクト作成
最初は、main.goのファイルを作成し、Hello Worldを表示させます。
“`main.go
package mainimport “fmt”
func main() {
fmt.Println(“Hello World”)
}“`
この状態で、以下のコマンドを実行します。
“`
$ go run main.go
“`
正常に、Hello Worldが表示されました。
“`
Hello World
“`### Ginのインストール
正常にGoのプログラムが動作したところで、W
DockerでGoの開発環境を作りVisual Studio Codeでコーディングを行う
# 目的
ソースコードの編集はホストPCで行っているようにし、Dockerで立てたコンテナでビルドやバイナリの実行を行う。## 経緯
何かの言語の開発環境をローカルに作ってみたいけど直接PCにインストールするのは気が引けるという場面がよくある(環境グチャグチャになりがち)。
以下の方針で進める
– Go langで開発をする
– Dockerでコンテナを立てることでローカル環境を汚さない
– コンテナをバインドマウントをすることで、ローカルで開発をしているような環境を作る### 手順
1. docker-compose.yamlを作成し実行
1. Visual Studio CodeにDev Containersをインストールする
1. Go langプログラム作成する
1. 作成したプログラムをビルドして実行する#### Step.1 docker-compose.yamlを作成し実行
“`yaml:docker-compose.yml
version: ‘3’
services:
golang:
image: golang:1.19.11-alpine
【Go】ログイン機能でウェブアプリを作ってみる(3)
こんにちは。
Part 3は準備(MySQL & docker-compose.yml)についてです。
# 目標
– MySQLを起動する
– GoからMySQLに接続する## MySQLを起動する
### MySQLの設定ファイルを準備します。
早速、MySQLを起動の前に、後々必要になるかもしれない設定などをしています。
そのために必要なディレクトリを作成します。“`
$ mkdir -p _tools/mysql/{init.d,conf.d}
“`今回で言うとMySQLに関するファイルを_toolsディレクトリ以下にまとめます。
_tools/mysql/conf.dにはMySQLの設定ファイルを置きます。
_tools/mysql/conf.d/my.cnf
“`
[mysqld]
character-set-server=utf8mb4[client]
default-character-set=utf8mb4
“`_tools/mysql/init.dには今回使うユーザーのテーブル作成用のファイルを作成します。
_tools/m
APG4g(Go言語入門 APG4b)【1.05】
# 本記事について
本記事は、[APG4g(Go言語入門 APG4b)【1.03 ~ 1.04】](https://qiita.com/Nub/items/2b9756ef433348eceb94)の続きです。
もし、前の記事を読んでいない、もう一度見たい等ありましたら見ていただけると幸いです。今回扱う内容は以下の通りです。
– [1.05. プログラムの実行順序と入力](#105-プログラムの実行順序と入力)
本記事の目標は、以下の3点です。
1. Go言語のプログラムが実行される流れを知る
2. Go言語が標準入力をどうやって受け取るかを知り、書けるようになる
3. Go言語を使って、文字列を整数などの色々なデータ型に変換できるようになるでは、始めていきましょう!
## [1.05. プログラムの実行順序と入力](https://atcoder.jp/contests/apg4b/tasks/APG4b_f)
### キーポイント
– プログラムは上から下へ順番に実行される
– `bufio.Scanner`で入力を受け取ることが出来る### プログラムの
Go言語でREST APIを作成する
Go言語を使用してREST APIを作成する方法を記載します。
この記事では、基本的なHTTPメソッド(GET, POST, PUT, DELETE)を使用して、RESTfulなエンドポイントを作成します。## 必要なパッケージ
以下のパッケージを使用します。
– `net/http`:HTTPクライアントとサーバーの作成に使用します。
– `encoding/json`:JSONのエンコーディングとデコーディングに使用します。
– `github.com/gorilla/mux`:リクエストルーティングとディスパッチに使用します。## データモデル
まず、APIが扱うデータのモデルを定義します。この例では、`Book`という構造体を作成します。
“`go
type Book struct {
ID int `json:”id”` // BookのID
Title string `json:”title”` // Bookのタイトル
Author string `json:”author”` // Bookの著者
}
“`## エ
APIサーバをデーモンで動かすためのsupervisorの設定
SupervisorとはPython製のプロセス管理ツール
プログラムなどを簡単にデーモン化することができる。今回はEC2にデプロイしたGolangのAPIサーバをsupervisorで動かすことを想定する。
### 導入手順
“`shell:bash
sudo yum install python3
sudo pip3 install supervisor
echo_supervisord_conf > ~/supervisord.conf# 移動させる
sudo mkdir /etc/supervisord/
sudo mkdir /etc/supervisord/conf.d
sudo mv ~/supervisord.conf /etc/supervisord/supervisord.conf# オリジナルとっとく
sudo cp /etc/supervisord/supervisord.conf /etc/supervisord/supervisord.conf.org
“`### 設定ファイルの作成
/etc/supervisord/super
GoでBOMを考慮したio.Readerを扱う
GoでBOM付きのUTF-8ファイルを扱う必要があったので、その時に知ったテクニックを共有したいと思います。
具体的に言えば、Excelでファイル形式を`「CSV UTF-8 (コンマ区切り) (.csv)」`として保存した際のCSVファイルを扱った時の話です。
(Excelや少し前のメモ帳などでUTF-8としてファイルを保存すると、BOM付きのUTF-8ファイルになります。[^1])[^1]: 最近のメモ帳はBOMなしUTF-8が標準になったようです。
## BOM(Byte Order Mark)とは
BOM(Byte Order Mark)というのは、Unicode系の符号化方式(UTF-8やUTF-16など)の場合に、どの符号化方式であるかが分かるように先頭に付ける数バイトのデータのことです。
より詳しい説明についてはWikipediaの[バイト順マークのページ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF)などに譲ります。