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

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

【golang】net/httpのタイムアウト設定

# 概要
先日golangci-lintのバージョンアップを行ったところ、lintの際に下記のような警告が発生しました。
“`bash
cmd/main.go:134:11: G114: Use of net/http serve function that has no support for setting timeouts (gosec)
if err = http.ListenAndServe(“:8080”, mux); err != nil {
“`
調べてみてなるほどと思ったので備忘録として残します。

# 前提
– go version go1.19.3 linux/amd64
– golangci-lint version 1.50.1

# net/httpのタイムアウト

golangの標準ライブラリのnet/httpでは、デフォルトではタイムアウト設定が存在しません。
つまりデフォルトではタイムアウトが発生せず、リクエストの処理終わりを常に待機し続けることになります。

下記はnet/httpライブラリのServer構造体ですが、`Read

元記事を表示

GO言語で並列実行するサンプルコード。ワーカーのキャンセル機能付き

個人的な備忘録として。

“`golang
package main

import (
“context”
“fmt”
“time”

“github.com/pkg/errors”
)

type Result struct {
Task Task
Err error
}

type Task struct {
Bar int
}

func worker(workerID int, ctx context.Context, taskChannel <-chan Task, resultChannel chan<- Result) { // taskCannelがなくなるまで動作する for task := range taskChannel { select { case <-ctx.Done(): // 親からcancel()が実行された場合、動きを止める fmt.Printf("[%d] got Cancel\n", workerID) return default: fmt.Printf("[%d] do task

元記事を表示

Go言語 go versionが出力されない

お疲れ様です。
go言語を始めようとしたところ出落ちしたので、情報共有します。
“`:開発環境
Apple m1 macbook
macOS 13.0.1(22A400)
“`

# 対処法
1\.どこのファイルにPathを追記するか確認
下記コマンドをターミナルで実行
“`
echo $SHELL
“`
・bashなら、~/.bash_profile
・zshなら~/.zprofile
に追記していくことになります。

2\.該当の設定ファイルにパスを追記
“`
$ open ~/.zshrc
または
$ open ~/.bash_profile
“`
openで設定ファイルが開かれるので、pathを追記してください。
自分はzshrcだったので以下のように追記しました。
※ドキュメントにも該当のPATHを追記しろと明記してあります。https://go.dev/doc/install
“`:zshrcの場合
$ export GO_HOME=/usr/local/go
$ export PATH=$PATH:$GO_HOME/bin
“`
ファイルを追記し

元記事を表示

Google Open Source(Go)ではDeprecated(非推奨)なコードがわかりやすく表示される

netパッケージのソースコードを読んでいると、ファイル内で使われている[syscallパッケージの記述に打ち消し線が引かれていた](https://cs.opensource.google/go/go/+/refs/tags/go1.19.3:src/net/dial.go;l=609;bpv=0;bpt=1)。

![スクリーンショット 2022-11-19 15.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0ab12f7b-1ac2-b249-e11f-56e0bc4d080f.png)

他にも、この画像でいうと`Cancel`にも打ち消し線が引かれている。
まあ、なんとなくどういうときに打ち消し線が引かれるのか予想はできるが、軽く調べてみた。

どういうときに打ち消し線が引かれるかというと、そのパッケージやメソッド、型や変数が**deprecated**(非推奨)のとき。

Goでは、`Deprecated:`という修飾を含んだコメントを記述することで、対象

元記事を表示

Tree Maker_Convert Markdown to tree!_WebAssembly&ServiceWorker

https://ddddddo.github.io/gtree/

![web_example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271313/83d52823-8f74-d5f8-14c3-4110f54110d6.gif)

# これは何か?
Markdown形式の入力を与えると、treeコマンド結果のような表示がされるWeb appです。
以下の4種類の記号が使えます。
`*`, `-`, `+`, `#`

また、出力されるツリーの各階層は、入力となるMarkdownでは半角スペース2つずつインデントすることで表現します。

# このサイトの特徴は?
– Markdownからtreeを生成する処理はGoで書いており、その処理部分はTinyGoでWebAssembly(.wasm)としてコンパイルしています。
– コンパイルされたバイナリはJavaScriptから呼ばれます。
– ServiceWorkerを利用していて、このWeb appを構成する静的コンテンツ(.wasm含む)は

元記事を表示

Leetcode 263. Ugly Number

# 263. Ugly Number
https://leetcode.com/problems/ugly-number/description/

# 難易度
– EASY

# アプローチ
– Bruthforce

## Java
“`java
class Solution {
public boolean isUgly(int n) {
if (n == 0) {
return false;
}
if (2 <= n && n <= 6) { return true; } while (true) { if (n % 2 == 0) { n /= 2; continue; } if (n % 3 == 0) { n /= 3; co

元記事を表示

Go標準パッケージを利用したJsonデータの読み込み&出力

## 概要

JSONの読み込みは「json.Unmarshal」「json.NewDecoder」の2種類、JSONの生成は「json.Marshal」「json.Marshalindent」「json.NewDecoder」の3種類を使った方法を紹介する。

## encoding/jsonパッケージ

JSONデータのエンコードとデコードをするためのパッケージ。
今回はこのパッケージを使用してJSONデータの解析を行う。

## JSONデータの読み込み

### json.Unmarshal

`json.Unmarshal()`はJSONを構造体に変換する。
第一引数にJSON形式のデータを、第二引数にポインタを指定することでJSON形式で受け取った値を指定したポインタに保存することができる。
“`go
json.Unmarshal(JSON形式のデータ, ポインタ)
“`

### JSONデータを解析してみる

今回は以下のようなJSONデータを用意する。ファイルの名前はtest.jsonとする。

“`json
{
“id” : 1,
“content”

元記事を表示

go のわかりにくい型推論

# これは何?

go の型推論が思いがけない動作をしたのでその記録。

# 普通の例

“`go:go1.19
func main() {
f := func(i int) uint8 {
return uint8((1 << i) % 10) } fmt.Println("f(5) =", f(5)) //=> f(5) = 2
}
“`

$2^n$ を 10で割った余りを `uint8` で返すという普通の関数。

2の5乗 は 32 なので、 `f(5)` は 2 になる。順当。

# 思いがけなかった例

上記の関数 `f` に 10 を入れると

“`go:go1.19
fmt.Println(“f(10) =”, f(10)) //=> f(10) = 0
“`

$2^{10}$ は 1024 なので `f(10) = 4` となるかと思いきや、ゼロになる。

私は意外だった。

# いろいろ試した

## 一回変数で受ける

“`go:go1.19
f := func(i int) uint8 {
n := 1 << i return ui

元記事を表示

Goのdatabase/sqlを利用してPostgreSQL/MySQLへ接続&CRUD操作してみた

[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考に、database/sqlを利用したデータベースへの接続とCRUD操作についてまとめました。

# PostgreSQLへの接続

### ドライバーのインストール

ドライバーをインストールする必要がある。

“`bash
go get “github.com/lib/pq”
“`

### 接続方法

“`bash
sql.Open(“postgres”, “user=ユーザー名 dbname=DB名 password=パスワード sslmode=disable”)
“`

# MySQLへの接続方法

### ドライバーのインストール

こちらも同様にドライバーをインストールする必要がある。

“`bash
go get -u github.com/go-sql-driver/mysql
“`

### 接続方法

“`sql
sql.Open(“mysql”, “ユーザー名:パスワード@tcp(ホスト:ポート番号

元記事を表示

「Go×Firebase×React」でJWT認証できる簡単なTODOアプリ作ってみた

こんにちは。初投稿です。
来年から新卒でエンジニアになる予定の者です。

## 初めに
実務未経験、独学ですので、何か勘違いがあるかもしれないということを予めご了承ください。間違いがあれば指摘していただけますと幸いです。

またこの記事ではDockerやReactなどの詳しいことは触れていません。

## この記事でやること
Go,Reactを学習したので習作物としてバックエンドGo,フロントエンドReactを使ったFirebase×JWT認証つきの簡単なTODOアプリを開発しました。

簡単にJWT(Json Web Token)だけ説明しますと、
* 認証用のトークンとして用いられる
* JSON形式でやり取りするため任意の情報を含むことができる
* 改ざんを検知できる
などの特徴があります

https://jwt.io/

こちらの記事がハンズオン形式でわかりやすかったです。↓

https://qiita.com/po3rin/items/740445d21487dfcb5d9f

# 完成イメージ
![TODO操作デモ.gif](https://qiita-image-st

元記事を表示

[OCI]Autonomous Database:Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ

# はじめに
OSがOracle Linux 7.9のComputeインスタンスに、Go言語とOracle Instant Client、Go DRiver for ORacle(godror)をインストールしてAutonomous Databaseに接続してみた時のメモです。

# 1. GoとOracle Instant Clientのインストール

“`
sudo yum install -y oracle-instantclient-release-el7 oracle-golang-release-el7
sudo yum install -y git gcc golang
sudo yum install -y oracle-instantclient-sqlplus
“`
# 2. godrorのインストール

“`
go mod init github.com/godror
go get github.com/godror/godror@latest
“`

# 3. tnsnames.oraの作成

“`
mkdir /home/opc/tns
vi /ho

元記事を表示

Go Package 命名法

# Go Packageの命名方法

公式[GoのBlog Pacakge names](https://go.dev/blog/package-names?utm_source=dlvr.it&utm_medium=twitter)の(一部)和訳、まとめになります。

## 導入
いいパッケージの名前はパッケージの内容を示唆し、そのユーザーが内容や使い方を理解するのに役立つ。[Effective Go](https://go.dev/doc/effective_go#names)にパッケージ、タイプ、関数など名前の付け方のガイドラインがあり、それらをさらに拡張して議論します。悪い名前の付け方、その直し方も議論します。

## パッケージの命名

### いいパッケージの名前は短くて簡単なもの
Lower case (小文字) のみ
under_scores, mixedCaps がないもの

いい例
– time
– list
– http

悪い例
– computeServiceClient
mixedCapsは使うべきではない
– priority_queue
under_s

元記事を表示

GORMでUNIONを使用する際の注意点

# GORMでUNION?

GORMには、UNIONはサポートされていないので、Rawを使用する。
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}),
db.Select(“*”).Model(&Bar{}),
).Scan(&union)
“`
https://stackoverflow.com/questions/67190972/how-to-use-mysql-union-all-on-gorm

# 問題

GORMでUNIONしようとした際に、
“`
db.Raw(“? UNION ?”,
db.Select(“*”).Model(&Foo{}).Order(“aaa”),
db.Select(“*”).Model(&Bar{}).Order(“aaa”),
).Scan(&union)
“`

“`
Error Code: 1054. Unknown column ‘aaa’ in ‘order clause’
“`
が発生。
aaaカラムは、ちゃんとあるのに。。。

#

元記事を表示

[Go] 定番(?)のじゃんけんゲームを作ってみた

# Go言語を使ってじゃんけんゲームを作ってみた!

## 目的 : Go言語の基本文法を確認

::: note info
INFORMATION

### インポートするライブラリ
+ __fmt__ : ターミナルへの出力用フォーマットライブラリ
+ __math/rand__ : ランダム値の生成
+ __strconv.Atoi__ : ターミナルからのstring入力(Ascii)をint typeに変換
+ __time__ : ランダム値の生成時に利用

### 環境
+ __macOSX__ : Montrey 12.6.1
+ __Goland__ : go1.19.3 darwin/amd64
+ __Visual Studio Code__ : 1.73.1

### 利用した文法
+ if 〜 else if 〜 else 文
+ ランダム値の生成
+ ポインタによる、値の更新
+ mapを使った連想配列(Pythonの辞書相当)
+ スライス機能

### ゲームの内容
+ コンピュータの手は、ランダム値から生成&決定
+ 5回実行して、結果を「○勝 ○敗

元記事を表示

goでパッケージ更新

## 概要
goで更新可能なパッケージを調べて、個別に更新する方法。

## 依存パッケージの確認
### 依存パッケージを全て出力

“`bash
go list -f ‘{{join .Deps “\n”}}’
“`

### 標準パッケージ以外の依存パッケージを出力

“`bash
go list -f ‘{{join .Deps “\n”}}’ | xargs go list -f ‘{{if not .Standard}}{{.ImportPath}}{{end}}’
“`

## 更新可能なパッケージの確認
### 全パッケージ
indirect(間接利用)のものも出力される。

“`bash
go list -m -u -mod=readonly all
“`

### indirectでないパッケージのみ
直接利用しているパッケージのみ出力。
出力結果の先頭にgo getを付けて出力することで、出力結果を使いやすくする。

“`bash
go list -m -u -mod=readonly -f ‘{{if (and .Update (not .Indi

元記事を表示

Goでjsのmapやfindなどを使いたい

## はじめに
jsでよくやっているこんな感じのコードをGoでも書きたい。けど外部のパッケージは入れたくない場合の対処法を紹介します。

“`ts
type Skill = {
name: string
}

const skills: Skill[] = [
{ name: ‘Ruby’ },
{ name: ‘Javascript’ },
{ name: ‘Python’ },
]
const py = skills.find(s => s.name === ‘Python’)
// => {name: “Python”}
console.log(py)

const names = skills.map(s => s.name)
// => (3) [“Ruby”, “Javascript”, “Python”]
console.log(names)
“`
## find
まず適当にsliceを用意。

“`go
package main

type skill struct {
name string
}

func main() {

元記事を表示

go言語でWindowsをシャットダウンする

## 結論

exec.Command を利用する

“`go
exec.Command(`shutdown`, “-s”, “-t”, “0”).Start()
“`

## 注意点

exec.Command だけではなく、以下を呼び出す必要がある(でなければ、コマンドは実行されない)
1. Output() // stdout
1. CombinedOutput() // stdout, stderr
1. Start() // プロセスの終了を待たない
1. Run() // プロセスの終了を待つ

引数について

“`go
exec.Command(`shutdown`, “-s”, “-t 0”).Start()
“`

では動かない。
どうやら、スペースで区切られたものをすべて切り出して引数にする必要があるらしい。(“-t 0” -> “-t”, “0” にしないと動かない)

元記事を表示

【Golang】Go で OpenPGP のペア鍵を生成する【GopenPGP】

> Go 言語(以下 Golang)で、[OpenPGP](https://ja.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP) の公開鍵と秘密鍵を作りたいと思うも、[Go 公式のドキュメント](https://pkg.go.dev/golang.org/x/crypto@v0.2.0/openpgp)を見ると `Deprecated`(廃止)になっていて、ガチョーン。
>
> しかも、 `golang.org/x/crypto/openpgp` を使っていると [CVE-2022-27191](https://github.com/advisories/GHSA-8c26-wmh5-6g9v) の脆弱性を指摘される。

さらに、Go の公式は「[後継のパッケージは色々あるけど、私たちの方から『これがオススメ』というものはないよ](https://github.com/golang/go/issues/44226)」ときたもんだ。どうしよう。

## TL; DR (今北産業)

> 2022/

元記事を表示

AWS MediaLiveを使った擬似リニア配信方法 ~実践編~

# ? 擬似リニア配信(Virtual Linear OTT)とは?

擬似リニア配信とは、24時間/365日、番組表などのスケジュールに従って時間通りに配信する仕組みになります。事前に収録済み動画ファイル(mp4など)を使ってあたかも生配信しているかのようにライブ映像として流します。いわゆるケーブルTVみたいなものです。本資料ではMediaLiveのスケジュールアクション機能使った擬似リニア配信の実現とより実践で使える設定・設計について説明します。

注: MediaLiveをMLと省略して説明します。

## MLで実現するための流れ ~基礎編~

1. 動画ファイルをs3にアップロードする
1. MLチャンネルを作成する
1. スケジュールアクションを登録する

### 1.動画ファイルをS3にアップロードする

配信したい動画を事前にs3にアップロードします。
| ファイルパス | 用途 |
|:———–|:————|
| s3://demo-bucket/CM.mp4 | 本編動画を流す前の動画、今回は仮でCM(宣伝)動画 |
| s3://d

元記事を表示

Prometheus始めてみた #1 -概要から導入まで-

prometheusを触る機会があり,自分の環境で使ってみました.
本記事は「”Prometheus Up & Running”(Brian Brazil, O’Raily Media, 978-1-492-03414-8, 日本語版「入門 Prometheus」 オライリー・ジャパン」を参考にしております.

# Prometheusとは
正確には[公式ホームページ](https://prometheus.io/)の方が詳しいと思うので概要だけでも紹介します.
> Prometheusは,「オープンソースのメトリクスベースモニタリングシステム」.

と本には書いてありました.じゃあ,メトリクス,モニタリングって何?ってところから入りましょう.

### メトリクスとは
メトリクスはイベントから出された様々な情報を,扱える大きさに削減するための方法の一つだそうです.
といっても,分かりにくそうなので,メトリクスが具体的にどういった情報を指すのかというと,HTTPリクエストを受け付けた回数,リクエストの処理に使った時間,現在処理中のリクエストの数などが挙げられます.この辺りは実際にpro

元記事を表示

OTHERカテゴリの最新記事