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

Go関連のことを調べてみた2023年11月02日
目次

Goパッケージのセキュリティリスク可視化ツール「Capslock」を触ってみた

ご無沙汰です。@Esperna です。

# 背景
10/31に[Go 1.21 リリースパーティ & GopherCon 2023 報告会](https://gocon.connpass.com/event/299108/)に参加して来ました。
そこで、[Capslock](https://github.com/google/capslock/tree/main/docs
)というセキュリティリスクの可視化ツールが紹介されていて、興味深かったのでブログに書きます。

# Capslock
まず[Capslock](https://github.com/google/capslock/tree/main/docs
)が何かというと、Capslockはmoduleであるpackageとそれが依存するpackageを解析するものです。脆弱性ではなく[Capability](https://github.com/google/capslock/blob/main/docs/capabilities.md)というものを分析し、脆弱性につながる依存関係を検出するものと私は理解しています。

#

元記事を表示

【Golang】スライスの要素を別のスライスに追加する場合のappend()の使い方

Go言語において、スライスに要素を追加するメソッドに「append()」がある。
この「append()」について、あるスライスを展開して、その要素を別のスライスに追加することが簡単にできたため備忘録として残す。

### スライスの要素を別のスライスに追加する方法
“`go
package main

import “fmt”

type User struct {
Name string
Age int
}

func main() {

users := []User{
{Name: “bob”, Age: 10},
{Name: “alice”, Age: 20},
}

otherUsers := []User{
{Name: “jorn”, Age: 15},
}

otherUsers = append(otherUsers, users…)

fmt.Println(otherUsers)
// 結果:[{jorn 15} {bob 10} {alice 20}]
}
“`

**append()の第2引数に追加したいスラ

元記事を表示

【Golang】カラムにGormのDeleted_atが含まれる場合のレコード取得について

論理削除を実装するために、gorm.DeletedAtを使用した場合、レコードの取得のクエリが論理削除されたデータを取得しないように自動的に切り替わる。
場合によって、論理削除したレコードも取得したことがあるため、論理削除したレコードを取得する方法についても備忘録として残す。

### gorm.DeletedAtカラムがある場合のオブジェクト取得のクエリ
以下は公式ドキュメントのサンプルを流用
https://gorm.io/ja_JP/docs/query.html
“`go
type User struct {
ID string `gorm:”primarykey;size:16″`
Name string `gorm:”size:24″`
DeletedAt gorm.DeletedAt `gorm:”index”` // Gormの特定のフィールドタイプの使用
}

var user = User{ID: 15}
db.First(&user) // 論理削除を実装している構造体でFirst()メソッドを実行
//

元記事を表示

[備忘録] IntelliJ(Go)のテスト実行での『No tests were run』問題

# 1. はじめに

しばらくの間、ハマってしまったので、ここにメモとして残します。

最近、Go言語での開発にIntelliJ IDEAを使い始めたのですが、テスト実行で不可解な現象が発生しました。
実行途中でテストが中断され、
**No tests were run** (テストは実施されなかった)
という結果になる現象です。
また、日本語(マルチバイト文字)をログ出力すると、その内容の所々に空白が差し込まれるという問題も起きていました [^1]。

不思議なことにテスト関数名を短くしたり、逆に長くしたりして、良い塩梅の関数名を定義するとテストは動作しました。
しかし、テストのご機嫌をうかがうようなこの対処法では流石に続けられないと、原因を調べることにしました。

![ng-log-mod2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512108/4c6d5529-7583-7330-26aa-6948a2bfe299.png)

# 2. 環境

Windows 10 Home
Intel

元記事を表示

【MongoDB】ソート対象列でnull値があった場合に末尾にしたい

## 概要
例えばPostgreSQLではORDER BY句において、[7.5. 行の並べ替え(ORDER BY)](https://www.postgresql.jp/document/14/html/queries-order.html)のドキュメントにある通り、`NULLS FIRST`や`NULLS LAST`で、ソートにおけるnull値の位置を設定できます。
MongoDBでは2023年11月時点においては、そのような設定は無いようです。では、null値の位置を明示的に設定するにはどうしたらよいか、というのを今回メモ書きします。

## 対応方針
やり方は色々考えられると思いますが、[How to sort null value at the end while in Ascending MongoDB](https://stackoverflow.com/a/69722800)のstackoverflowの回答に書かれている内容が、良いかなと感じました。
対応方針としては、aggregateにおいてソート用のフィールドを設けて、nullの場合は`$ifNull`句で後ろ

元記事を表示

個人開発(バックエンド)

# はじめに
今回、以下の様な技術stackで個人開発を行ったので、備忘録として残そうと思います

– Go(API)
– Next.js・TypeScript(フロント)
– AWS・Terraform(インフラ)
– github actions(CI/CD)

本記事では、バックエンド(API)側の取り組み内容について触れたいと思います
フロント側、インフラ・CI/CD側の記事については以下に置いておきます。

### フロント側
https://qiita.com/__hawk__/items/9ae21e4f51d6f6aa2fd6

### インフラ・CI/CD側
https://qiita.com/__hawk__/items/4ec582d65a8d6edb0a1b

# github repository
### アプリケーション側
https://github.com/hawk0616/recruit-service-board

### インフラ側
https://github.com/hawk0616/recruit-service-board-infla

元記事を表示

GitHub GraphQL APIをGoから実行する。(GitHub App認証)

:::note
本記事では、GitHub GraphQL APIをGoから実行する場合における、認証処理の実装を記載しています。
認証はGitHub Appの仕組みを使用しています。
:::

# はじめに
こんにちは、株式会社Kakukakuのエンジニアのmamoです。
今回、社内でGitHub GraphQL APIをGoからで呼び出す必要があり、GitHub公式ページなどを参考に、実装してみたので実装例のご紹介です。
筆者はGitHub APIの呼び出しやgolang初体験で、至らないところもあるかと思います。

# 前提条件
:::note
go version go1.21.3 darwin/arm64
事前にGitHub Appの作成およびインストール済で、AppIDを取得し、秘密鍵をダウンロード済であること。
:::

# 対象読者
GitHub APIを便利なライブラリなしで認証実装したい人向け。
githubで公開されているような既存ライブラリを使えば認証処理の実装は省けると思うのですが、GitHub公式ページに記載の内容を参考に、実装を試みてみたので、その足跡です。

元記事を表示

Goで学ぶGraphQLサーバーサイド(4)ーリゾルバの実装 – 基本編

こんにちは。

Part 4は「リゾルバの実装 – 基本編」についてです。

# この章について

この章では、前章にて用意した簡略版GitHub APIのリゾルバ部分を実装していきます。

現在リゾルバ用のコードは以下のように自動生成された状態になっていると思います。

“`graph/schema.resolvers.go
// AddProjectV2ItemByID is the resolver for the addProjectV2ItemById field.
func (r *mutationResolver) AddProjectV2ItemByID(ctx context.Context, input model.AddProjectV2ItemByIDInput) (*model.AddProjectV2ItemByIDPayload, error) {
panic(fmt.Errorf(“not implemented: AddProjectV2ItemByID – addProjectV2ItemById”))
}

// Repository is

元記事を表示

【Golang】gormでレコードを1件取得する際の関数及びエラーハンドリングについて

gormの公式に記載があるが、レコードを1件取得する関数及びエラーハンドリングについて備忘録として残す。

## 用意されている関数
* First()
* Last()
* Take()

### First()関数について
“`go
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
“`
条件に合致するレコードを「id」で昇順ソートし、ソートされた最初の1件を取得する。

### Last()関数について
“`go
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
“`
条件に合致するレコードを「id」で降順ソートし、ソートされた最初の1件を取得する

### Take()関数について
“`go
db.Take(&user)
// SELECT * FROM users LIMIT 1;
“`
順序指定なしで1件のレコードを取得する

## レコードが見つからなかった場合
First()、Take()、Last()関数で

元記事を表示

【Golang】参照型の初期値について

Golangでは、
スライス(slice)、マップ(map)、チャネル(channel)などの参照型の変数は、デフォルトでnilとして初期化されます。
これは、 **参照型が内部的にはポインタを持っており、nilはポインタが無効であることを示す** ためです。そのため、関数がスライスを返す場合、そのスライスがnilであることは有効な状態であり、コンパイラはエラーを生成しません。

## スライスの初期化
以下は、スライスを初期化し、それを返す関数の例です:
“`go
package main

import “fmt”

func main() {
// 初期化
var slice []int

if slice == nil {
fmt.Println(“スライスはnilです”)
} else {
fmt.Println(“スライスはnilではありません”)
}
// 結果: スライスはnilです

fmt.Println(slice)
// 結果:
}

“`

## マップの初期化
以下は、マップを初期化し、

元記事を表示

【初学者】malformed module path “command-line-arguments”: missing dot in first path elementの解決手順

# はじめに
お疲れさまです!
おおくまです!

https://www.udemy.com/share/103TVa3@4kwnCMQ2PbkgS2i2YK2IF6VPItXbl8tA-PI4XVWjk6Snxsv71ohaHmMYakH42khRcA==/

こちらのコースのセクション13で、“malformed module path “command-line-arguments”: missing dot in first path element“というエラーが出ました!
その解決手順の備忘録です!

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# エラー内容

“`:ディレクトリ構成
.
└ workspace
└ golang_kisonyumon
└ section13
├ foo
│ └ foo.go
└ main.go
“`

“`go:main.go
package main

imp

元記事を表示

hcl v2 パッケージを使って HCL の var.* をリテラルに置き換えてみた

# はじめに
terraform でリソース管理している中で、「特定の HCL ファイル内の一部の variable だけ具体的なリテラルで置き換えたい…」と思うことがありました。
そこで HCL ファイル中の変数をリテラルで置き換えるツールを作ってみました。

https://github.com/heptaliane/tffreeze

ツールを作成するに当たっては、 hashicorp 公式のライブラリである、 `github.com/hashicorp/hcl/v2` を使ったのですが、

* HCL の構成要素の具体的な例や関係性がぱっとわからなかった
* HCL の変数の書き換えに関する記事が見つけられなかった

というつらみがあったため、備忘録も兼ねて記事にすることにしました。

本記事では、HCL の構成要素について、自分なりの解釈を具体例を交えた解説を行い、それを踏まえて HCL の変数をリテラルに書き換えた方法について説明します。

# 使用したライブラリ
ツールの作成に当たり、使用したライブラリは以下のとおりです。
* `github.com/hashicorp/

元記事を表示

[GCP] Operations 機能x実装

# GCPのOperationsの概要と機能

GCP(Google Cloud Platform)のOperationsは、クラウドサービスの監視、管理、トラブルシューティングに用いられるツールです。Operationsを使用することで、アプリケーションやインフラストラクチャの健全性とパフォーマンスを維持し、サービスの可用性を向上させることができます。

Operationsには以下のような機能があります。

## 1. ログの監視と分析
Operationsは、サービスやアプリケーションのログをリアルタイムに監視し、集約して表示します。さまざまなログソース(例:VMインスタンス、データベース、ネットワーキング)からのログを収集し、分析することで、重要な情報やエラーを素早く発見することができます。

## 2. ダッシュボードの作成
Operationsでは、カスタムダッシュボードを作成することができます。ダッシュボードには、重要なメトリクスやログデータを配置し、サービスのパフォーマンスをリアルタイムで可視化することができます。これにより、アプリケーションの動作状況を把握し、適切な対

元記事を表示

GoでKeyとValueを逆にしたMapを作成する

goでMapを定義したときに
そのkeyとvalueを逆にする方法を紹介します。

例えば、以下のようにprotoで定義された型からアプリケーション上で定義したmodelに
マッピングするために、Mapを用いることがあるかと思うのですが、
proto->modelのMapからmodel->protoのMapを生成する方法を紹介します。

具体的には次のようなケースを想定しています。
“` go
// 以下のようなMapから
var protpToModelMap = map[v1.PaymentMethod]paymentmethod.PaymentMethod{
v1.Credit: paymentmethod.Credit,
v1.PayPay: paymentmethod.PayPay,
v1.AuPay: paymentmethod.AuPay,
v1.RakutenPay: paymentmethod.RakutenPay,

}

// 次のようなMapを作成したい時
var modelToProtoMap = map[p

元記事を表示

【Golang】実体とポインターで見る構造体の初期化の違い

Golangにおいて、実体かポインターとして構造体を初期化する際の挙動の違いを把握したため、備忘録として残すもの。

## 実体で構造体を初期化する場合
“`go
package main

import “fmt”

type User struct {
name string
sex int
}

func main() {
var instanceUser User // User構造体を実体として定義

fmt.Println(instanceUser) // 結果:{ 0}
fmt.Println(instanceUser.name) // 結果:
fmt.Println(instanceUser.sex) // 結果: 0
}
“`

:::note info
実体で構造体を初期化すると、 **初期値** が格納される
:::

https://go.dev/play/p/b5WWHjo16l5

## ポインターで構造体を初期化する場合
“`go
package main

import “fmt”

type User struct {

元記事を表示

[Docker]マルチステージビルドをサクッと試してみる

## はじめに
本記事では、Dockerの「マルチステージビルド」について、サクッと試して、そのメリットを確認してみようと思います。

なお、筆者は、Dockerは初心者です。一般的な技術書に書いてあることをざっくり理解しているレベルです。

## きっかけ
表紙のサブタイトルに惹かれて以下を読みました。

> 理想のコンテナイメージを作る Dockerfileのベストプラクティス

:::note info
[ソフトウェアデザイン 2023年11月号](https://amzn.asia/d/iUDMacE “ソフトウェアデザイン 2023年11月号”)
Amazonのリンクです。興味があればぜひ。
:::

その中で、色々と試したいことがあったのですが、まずは「マルチステージビルド」をやってみます。

## 前提
– golangを用いて、簡単なAPIをコンテナ化します。
– Dockerの基本的なお話は省略します。
– ベースイメージはalpine linuxを使用します。

## まずはやってみる
### dockerfile
– 筆者がこれまで書きがちだったdockerf

元記事を表示

【Golang】ポインターレシーバ、値レシーバがnilである場合の挙動の違いについて

## ポインタレシーバの場合
* nilポインタをレシーバとしてメソッドを呼び出すことは可能
* メソッド内で **「nilを判定」** することが可能
* ただし、メソッド内で **「ポインタのフィールドにアクセス」** しようとすると、パニック(ランタイムエラー)が発生する。
“`go
package main

import “fmt”

type MyStruct struct{}

func (ms *MyStruct) MyMethod() {
// nil判定
if ms == nil {
fmt.Println(“レシーバはnilです”)
} else {
fmt.Println(“レシーバはnilではありません”)
}
}

func main() {
var myVar *MyStruct // ポインターの初期化 nil
myVar.MyMethod() // 結果:レシーバはnilです
}

“`
https://go.dev/play/p/f-A8fgqRPrh

#### フィールドにアクセスしようとする場合、panicが発生

元記事を表示

【Golang】メモリ、アドレス、ポインターについて

# メモリ

データやプログラムの一時的な保存場所。

メモリには「アドレス」と「メモリ領域(記憶領域)」がある

![スクリーンショット 2023-10-28 23.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501264/0f044e97-bb99-1e13-91d7-10491d54982b.png)

## アドレス

コンピュータ内のメモリにデータを保存する時に、そのデータを格納するメモリに元から付けられている番号(住所)のこと

16進数で表現される

### メモリ領域

データやプログラムが保存される領域。

メモリ領域には「データ」と「命令」が入っている。

格納場所は、紐づいているアドレスによって特定される

# Golangのメモリアドレスとは

変数の前に「&」をつけることで、アドレスを取得することができる。

「&」を付けなければ、メモリ領域のデータを取得してくる。

![スクリーンショット 2023-10-2

元記事を表示

知識0からgRPCに入門してみた

# 初めに
一番下の参考記事を参照しながら、自分なりにまとめたような記事になっています。
書籍などでガッツリ学べている訳ではないため、間違いや過不足があるかもです。
その場合はご指摘ください。

# gRPCの概要
– Google で開発された多言語間の**Remote Procedure Call (RPC)** を実現するプロトコル
– **IDL** としては **Protocol Buffers** が使われている
– 通信には **HTTP/2** の枠組みが利用されている
– 3タイプの**ストリーミング通信**が用意されている

## RPCとは?
ネットワーク上の別のアドレス空間に存在するプロシージャを、ローカルのプロシージャと同じように呼び出す仕組み。RPC の利用者視点ではネットワークや他の言語の知識を必要とすることなく、ただの関数として利用できる。

ちなみに、異なる言語間で RPC として呼び出せる関数を定義する場合、当然特定の言語に依らない独立の定義方法が必要になるが、それをInterface Description Language (IDL)という(下で

元記事を表示

[GCP] Natural Language AI 機能x実装

# GCPのNatural Language AIの概要

GCP(Google Cloud Platform)のNatural Language AIは、テキストデータを処理するための機能を提供するサービスです。このサービスを使用することで、テキストデータの理解、感情分析、意図解釈などが可能になります。また、言語の検出やエンティティの抽出などの自然言語処理タスクを自動化することもできます。

# 機能

GCPのNatural Language AIは、以下のような主な機能を提供しています。

1. **テキスト分類**: テキストデータをさまざまなカテゴリに分類することができます。例えば、文書がニュース記事なのか、レビューなのか、それともスパムメッセージなのかを判定することが可能です。

2. **エンティティ抽出**: テキストデータから人、組織、場所などの重要なエンティティを抽出することができます。これにより、テキスト内で言及されている重要な要素を特定することができます。

3. **感情分析**: テキストデータの感情を分析することができます。テキストがポジティブ、ネガティブ

元記事を表示

OTHERカテゴリの最新記事