Go関連のことを調べてみた

Go関連のことを調べてみた
目次

golang 標準パッケージ archive の紹介

# 前提知識

# アーカイブと圧縮の違い
アーカイブと圧縮はどちらもファイルやディレクトリを一つにまとめる手法ですが、それぞれ目的が異なります。

## アーカイブ
アーカイブは複数のファイルやディレクトリをまとめるために使用されます。
ただし、圧縮は行いません。

### Q. 圧縮せず、まとめるだけなんて使い道あるの?

### A. CUIで作業を行う場合は意外とあります。

例えば、`find` で再帰的にファイルを探索する場合、利用しなくなったディレクトリをアーカイブしておくと、探索対象が少なくなり、効率的に探索ができるようになります。

他には、ディレクトリの移動や転送を行う際、配下の構造が複雑だと、扱いが複雑になります。
ここでディレクトリをアーカイブすると、一つのファイルのように扱うことができ、移動や転送が簡単にできるようになります。

## 圧縮
圧縮はファイルを圧縮しサイズを小さくすることが目的です。
よく使われる形式として、zip, gzip, rar などがあります。

圧縮形式にはアーカイブ機能を含むものと、

元記事を表示

フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20

# フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20

## おさらい

– [シェルってなに?コマンドラインインタプリタってなに? – シェルもどきをgoで自作する#1](https://hackmd.io/@jyami/HJzohRn2D)
– [コマンドと引数の分解、環境変数PATHから探索、外部コマンドと内部コマンド – シェルもどきをgoで自作する #2](https://hackmd.io/@jyami/HyeSkkThP)
– [字句解析その1 – シェルもどきをgoで自作する #3](https://hackmd.io/@jyami/Hk3bWSMQO)
– [字句解析その2 – シェルもどきをgoで自作する #4](https://hackmd.io/@jyami/S1BkltxQu)
– [リダイレクションってなに? – シェルもどきをgoで自作する #5](https://hackmd.io/@jyami/S113NQx8u)
– [リダイレクションの種類 – シェルもどきをgoで自作する #6](https://h

元記事を表示

【1年後の1年前は今日ではない!】Go でうるう年に落ちるテストがあった話

# 概要

本日は2024はうるう年で2月29日が追加され、1年が366日ある年です。
そんな2024/02/29に落ちるテストがあっておもしろかったので共有です

# テスト概要

ユーザーの会員期限の再アクティベートのテスト。一度会員になって失効して再度会員になったときに正常に有効化できるか、というような旨のてすとです。

1. 失効期限を今日から1年後にする
1. 失効期限を1年前に戻す
1. 期限が切れていることを期待する
1. 再度アクティベートする

という流れの3でうるう年の今日だけ有効期限が切れなくなっていました。

# 原因

Golang でうるう年2/29の1年後を取得すると、翌年の2025年は2/29 がないので3/1 に繰り上げされ、1年後の1年前が今日じゃなくて翌日になっていたため!

例:

**1/ 失効期限を今日から1年後にする**
→ 2025年に2/29 はないので3/1

**2/ 失効期限を1年前に戻す**
→ 2025年3/1 だったので2024 3/1 になる

**3/ 期限が切れていることを期待する**

Now() = 2029 2

元記事を表示

asdfでWSL+UbuntuにGoをインストール

# はじめに

以前インストールしたプログラミング言語管理ツールのasdfを使って、WSL UbuntuにGoをインストールします。

# 前提環境

https://qiita.com/perilla/items/69bc6f89001dbceb0cde

https://qiita.com/perilla/items/ef73cf57ade24bc94f19

# asdf更新

asdfを更新します。

“`sh:Ubuntu
asdf update
“`

# Goの存在確認

“`sh:Ubuntu
asdf plugin list all | grep -e golang
# golang https://github.com/asdf-community/asdf-golang.git
“`

https://github.com/asdf-community/asdf-golang.git

# asdfにGoを追加

“`sh:Ubuntu
asdf plugin add golang
“`

# 依存パッケー

元記事を表示

フロントNextjsで入力した文字をGinで受け取りRedisに登録

# やりたいこと
フロント側で入力した文字をバックエンドに送信して、データベースに登録する

## 環境構築

https://qiita.com/zukka/items/5a6831bef702d8c910e0

https://qiita.com/zukka/items/f019b7a384feaf03c65a

## フロントエンド
フォルダ・ファイル作成
個別用にlayoutファイルとCSSモジュールを作成

“`
react/src/
┣ app
┃ ┗ input-text
┃ ┣ page.tsx
┃      ┣ layout.tsx
┃      
┗ components
    ┗ ui-elements
┗ input-test.module.css

“`
### page.tsx
ページ表示部分

“`react
“use client”;

import axios from “axios”;
import { useState } from “react”;

// CSS Modulesの読み込み
import styles fr

元記事を表示

Datadog APMで測定するアプリケーションパフォーマンス

# 運用で困っていること

– インフラで発生するインシデント(メールが送られない、画面表示が遅いなど)が発生しても、即座の原因特定が難しい
– イベント(画面表示やデータ登録)ごとの発生頻度や利用時間帯がつかめない
– 時系列的に記録されたログでは、複数同時に来るリクエスト処理がごちゃごちゃに記録され、特定の関心のあるリクエストだけを追うのが難しい
– 処理が複数のサービスに分散されていると、関心のある処理を追いづらい

# Datadog APMとは

– Datadog社が提供する、アプリケーションのパフォーマンスをリアルタイムで監視し、分析するためのツール(SaaS)
– ユーザーのリクエストがシステムを通過するパスを追跡し、各モジュールでの処理時間を把握できる
– アプリケーションのパフォーマンスを監視し、異常が発生した場合に検知
– 詳細なレポーティング
– 分散システムのサポート

# 実際に組み込んでみた

ソースコードでライブラリを組み込む必要がある(Goの場合)

“`go
// アプリケーション開始時
tracer.Start(tracer.WithServic

元記事を表示

Gin Web Frameworkでのnpmライブラリを使った静的ファイルの取り扱いに関するメモ

[Golang フレームワークでStaticファイルをemmbeddingして](https://gin-gonic.com/docs/examples/serving-static-files/)をnpmライブラリを使いたい。例えば[http-status-code](https://www.npmjs.com/package/http-status-codes)など。

ハマったのでメモします。

## 解決策

具体的には、サーバーサイドで

“`go:main.go
r.StaticFS(“/node_modules”, http.Dir(“static/node_modules”))
“`

クライアントサイドで

“`typescript:main.ts
import { StatusCodes } from “../node_modules/http-status-codes/build/es/status-codes.js”
“`

ライブラリはあらかじめ`npm`使ってインストールしておく必要がある。

“`sh
$ npm install -D http-

元記事を表示

Goのentでスキーマに変更があったときにGithub Actionsで自動的にマイグレーションファイルを作成するWorkflow

諸処の事情で不要になった代物ですが、自分の備忘録代わりに残しておきます。

## モチベーション
チーム開発でGo言語のORMツールであるEntを使っていると、わりと他人のマイグレーションを取り込み忘れて開発しちゃったテヘ!という事態に遭遇することがあります。
それをなるべく自動で回避するために、自分のPRがマージされたときに、Github Actionsを使って勝手に開発のベースブランチ(今回はdevelop)にマイグレーションファイルを作成・commit・pushしてしまおうというワークフローです。

## 前提条件

* Entのマイグレーションにはdbmateを使用
確かRuby on RailsのActiveRecordのmigrationぽく使える(マイグレーションとロールバック用のSQLどっちも生成される)という理由で採用したような記憶があります。TypeScriptのPrismaのマイグレーションファイルに移植しやすいからという理由もあったような気がします。

* 2022年くらいの実装
ちょっと情報が古いかもなので、適宜アップデートするともっと良いソリューションがある

元記事を表示

[翻訳転載] Golang Tip #14: エラーメッセージを大文字で始めたり区切り記号で終えたりしない

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1755232851401076925?s=20

# エラーメッセージを大文字で始めたり区切り記号で終えたりしない

これは、最初は少し変に見えるかもしれないですが、実用的な理由があります。

**なぜ小文字で始めるのでしょうか?**

エラーメッセージは他のメッセージと組み合わされることがあります。

もしエラー文字列が大文字で始まっていると、それが文の途中に挟まれたときに不自然に見えたり、場違いに見えたりします。

![image](https://pbs.twimg.com/media/GFvVNPvbYAAX3-r?format=jpg&name=medium)

エラーメッセージを小文字で始めると、組み合わされたメッセージに、そのメッセージをより自然になじませることができます。

“` console
// application startup failed

元記事を表示

[翻訳転載] Golang Tip #13: 空スライスとnilスライス

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1754852685369524574?s=20

# 空スライスとnilスライス

値を持たないスライスを使用するには2つの方法があります。

– **`var`の使用: `var t []int`**

この方法は`int`型のスライス`t`を初期化せずに宣言します。
このスライスはnilとみなされます。

これは、実際には基底となる配列が存在しないことを意味します。
スライスの長さ (`len`) と容量 (`cap`) はどちらも`0`です。

**- リテラルの使用: `t := []int{}`**

`var`の使用とは異なり、このスライスは`nil`ではありません。
これは要素を持たない配列を基底するスライスです。

**さて、慣例とみなされるのはどちらでしょうか。**

1 . **nilスライスはメモリを割り当てません**

空スライスが基底となる配列に

元記事を表示

Github ActionsでもPrivate Repoをgo getしたい

# 目的
CIを回している時に、プライベートリポジトリの`go get`に失敗したので、それを解決します。
普段ローカルでプライベートリポジトリをインポートする際、`GOPRIVATE`環境変数を利用しているかと思いますが、同様のことをCI環境(Github Actions)で行うといった内容です。

# 準備
Githubの自動トークン認証を使います。
Personal Access Token(PAT)はセキュリティ的な観点から利用しません。
自動トークン認証は`${{ secrets.GITHUB_TOKEN }}`で一時的なトークンを発行できます。権限はPATより弱いですが、`go get`するには十分です。

https://docs.github.com/ja/actions/security-guides/automatic-token-authentication

# 解決方法
このように指定すると解決されます。
“`
run: |
git config –global url.”https://github-actions:${{ secrets.GIT

元記事を表示

[翻訳転載] Golang Tip #12: 鍵作成時はmath/randの使用を避ける

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1754477930531680532?s=20

# 鍵作成時は`math/rand`の使用を避ける

暗号化や一意な識別子の作成など、鍵の生成が必要なプロジェクトでは、鍵の品質とセキュリティは重要になります。

なぜ`math/rand`を避けるべきなのでしょうか。

`math/rand`パッケージは擬似的に乱数を生成します。

つまり、乱数の生成方法(と生成時に使用されるシード)を知っていれば、生成される乱数は予測されてしまいます。

![image](https://pbs.twimg.com/media/GFkoBkAakAAJ3wS?format=jpg&name=medium)

現在時刻をシードとして使用したとしても、実行ごとに現在時刻が大きく変動することはないため、予測不可能性(`unpredictability (entropy)`)は低いままです。

元記事を表示

[翻訳転載] Golang Tip #9: コンパイル時のインターフェイス検証

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1729871737343643902?s=20

# コンパイル時のインターフェイス検証

`Write()`関数を持つ`Buffer`インターフェースと、
それを実装した`StringBuffer`構造体を想像してほしい。

以下のように、誤って`Write()`ではなく`Writeee()`のようにタイプミスをした関数を実装してしまった場合、

![image](https://pbs.twimg.com/media/GAG85AFaIAAvqvt?format=jpg&name=medium)

The error isn’t caught until runtime. By using the trick below, the compiler will alert you with an IDE error message:
エラーは実行時まで発見されません。

元記事を表示

Go 言語スプレッドシートライブラリ:Excelize 2.8.1 がリリースされました

Go 言語スプレッドシートライブラリ:Excelize 2.8.1 がリリースされました

Excelize は、純粋な Go で記述されたライブラリで、XLAM / XLSM / XLSX / XLTM / XLTX ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。このライブラリには Go バージョン 1.18 以降が必要です。

場合によっては、既存の Excel ドキュメントコン

元記事を表示

独自拡張した型のスライスをGORM+PostgreSQLで使う

# 独自拡張した型のスライスをgorm+PostgreSQLで使う

## 独自拡張した型とは
筆者のユースケースの一例として、単一のUUID型、すなわちuuid.UUIDを単純に利用したモデルでは、本来ユーザーIDが入るべき場所にコンテンツIDが入ってしまうなどの問題が発生することがあります。

この問題を解決するため、uuid.UUIDを独自に拡張し、value.UserIDのような形で値オブジェクトを作ることができます。これにより、型の安全性を向上させることができます。以下はその実装例です。

“`go: value/uesr.go
package value

import (
“github.com/google/uuid”
)

type UserID uuid.UUID

var _ ID = (*UserID)(nil)

func (v UserID) IsNil() bool {
return uuid.UUID(v) == uuid.Nil
}

func (v UserID) String() string {
return uuid.UUID(v).S

元記事を表示

[翻訳転載] Golang Tip #7: 三項演算子

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1729588275940352156?s=20

# 三項演算子

Goは、a > b ? a : bのような組み込みの三項演算子をサポートしていません。

しかし、Go 1.18からはジェネリックスを使って同じような機能の関数を実装できます。

![image](https://pbs.twimg.com/media/GAC7VL8bwAAHuZA?format=jpg&name=medium)

# おわりに

Goを書いていて三項演算子が欲しい場面は多々あるが、

– 三項演算子を使いたいケースは全て`if`で代用可能
– 三項演算子がネストされる場合、可読性がかなり落ちる

ため、Goで採用されていないのも納得できる。

> The reason is a simple design choice. The operator although once under

元記事を表示

[翻訳転載] Golang Tip #6: アンダースコア Import

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1729113992902361111?s=20

# アンダースコア(`_`) Import

多くのライブラリで、時折、次のようにアンダースコア(`_`)と組み合わせたimport文を見かけるかもしれない。

![image](https://pbs.twimg.com/media/F_8K_X9bAAAr1sQ?format=jpg&name=medium)

これは、名前参照をせずに、そのパッケージの初期化コード(`init()`関数)を実行しています。

例としてunderscoreパッケージを作成しました。ここには`init()`関数を定義してあります。

![image](https://pbs.twimg.com/media/F_8LRetaQAEQu_K?format=jpg&name=medium)

And in main(), using under

元記事を表示

レスポンスボディに書き込んだ内容を置き換えるginのミドルウェアを作った

レスポンスボディに書き込んだ内容を置き換えるミドルウェアを作った。

https://github.com/ophum/gin-replacer

“`go
r := gin.Default()
r.Use(ginreplacer.New(&ginreplacer.Config{
Replacer: strings.Replacer(“old”, “new”),
}))

r.GET(“”, func(ctx *gin.Context) {
ctx.String(http.StatusOK, “old”)
})
“`

上記のようなコードを書いて `/`に`GET`すると `new`と返ってくる。

“`
$ curl localhost:8080
new
“`
## 具体的な利用例

注意: 作ったばかりなので本格的には使えてない

exampleでも実装しているけど、フロントエンドの静的ファイルを返す際に、APIのbaseURLなどを動的に変えたい場合。

https://github.com/ophum/gin-replacer/blob/f9b15510e45a

元記事を表示

SQLServerに繋がらないとき…

プログラムからSQLServerに繋がらないときに見る記事です :eyes:

## SQLServerがリッスンしてしているか?
SQLServer構成マネージャー `SQL Server Configuration Manager` を開いて状態が”実行中”であるかを確認します。変更を加えた場合、再起動が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/4ec73737-65bf-a801-9234-12a76e537491.png)

`TCP/IP`が有効になっているかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/6e329a1d-b8e0-5a41-21db-cb354023f487.png)

`TCP/IP`のプロパティにてTCPの静的ポート番号を指定します。
![image.png](https://qiita-image

元記事を表示

Go言語初学者がエラーに立ち向かう方法: fmt.Printfデバッグ、エラーハンドリング

# なぜエラーになったかを考える
### ①直近で自分は何をやっていたかを考える!
### ②エラー文の内容をみる!
### ③文法があっているかを考える!

# fmt.Printfデバッグ
fmt.Printfデバッグを使用することで、スコープ内で呼ばれているかや、変数の中身の型や値が自分の意図するものになっているかを確認することができます。

**fmt.Printfデバッグの例**
“`Go:main.go
fmt.Printf(“CustomerNameError: %v\n”, customerName)
//fmt.Printf(“任意の命名: %v\n”, 中身を見たい変数)
“`
複数のfmt.Printfデバッグを作成し、エラーの原因の箇所を探す。

**実践例**
“`Go:main.go
fmt.Printf(“CustomerNameError①!!!: %v\n”, customerName)
row := db.QueryRow(“SELECT id FROM members where name = ?”,customerName)
fmt.Pri

元記事を表示

OTHERカテゴリの最新記事