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

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

M1 Mac環境でOracleClientを利用する(Go言語)

M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。[Rosetta2](https://support.apple.com/ja-jp/HT211861)を利用して動作確認した際の設定をまとめます

以下のようにIntel x86版しかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635433/e654c902-57d7-1ef5-3064-04188360091b.png)
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html

## 前提
・OracleClient x86_64版がインストールされている
・Goがインストールされている

# まずは動かしてみる

環境確認
“`
~ % uname -m
arm64
“`

Oracleに接続するコードを用意
[

元記事を表示

変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)

## はじめに

1日324回DevOpsのことを考えてしまう変態子持ちflutterエンジニアです。
妻からは育児中にいつも~~DevOpsのことばかり考えるな~~スマホばかりいじるなと言われ、悪戦苦闘の毎日です。。
…そんなことはどうでも良いんです、ハイ。本題に行きましょう。

私はモバイルアプリのチーム開発をしておりますが、バージョン管理はGitHubが使われてます。
チーム開発において、レビュワーからコメントがあったものは、レビュワーが[resolve](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#%E4%BC%9A%E8%A9%B1%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B)を判断すべきだと思ってますが、私を含めてチーム内で、resolveのし忘れがたまにあります。
そこで勝手に、Discordで

元記事を表示

変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー②(コメントはGemini APIで関西弁で要約)

# はじめに
この記事は[変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)](https://qiita.com/u_ki0630/private/bf824659a8de290c2acd)の続きです。
一言にまとめると、GitHubのresolveし忘れリマインダーの構築をした話です。

## GitHub GraphQL APIとGoを活用した、resolveし忘れリマインダーの構築(続き)

### 最初のコメントをGemini APIで要約(関西弁で)
前回の記事で実装したロジックに基づいて、指定したアカウントに対して、スレッドの最初のコメントを要約し、マークダウン形式で(毎朝定時に)通知します。

通知メッセージは以下のような形式です。
“`
未マージの各PRでResolveされてないコメント:
– レポジトリ名_1
– PRのタイトル_1_1
– [スレッドの最初のコメントの要約_1_1_1](スレッドの最後のコメントのURL_1_1_1)
– [スレッドの最初のコメン

元記事を表示

go で巨大 slice を作ると遅い

# これは何?

先日、go で巨大な slice を作ると遅いことに気がついたので、どれぐらい遅いのかを調べようと思い、今日も楽しいマイクロベンチマーク。

# 登場人物

コンピュータは
* MacBook Pro M1 (非Max)。
* Raspberry Pi 3B+ with 32bit Raspberry Pi OS
* Raspberry Pi 3B+ with 64bit Raspberry Pi OS

の三者。

go は、どこでも go 1.21。
C++ も使うんだけど、こちらは macOS では Apple Clang 15。ラズパイでは gcc-10。

# 調べたこと

`make([]uint8, n)`、`malloc(n)`、`std::vector(n);` などの方法でメモリ確保っぽい処理をおこない、その時間を測り、グラフにした。代表値は 5回やって中央値を採用。

## メモリの確保っぽい処理

メモリの確保っぽい処理は、以下の通り。

* `make([]uint8, n)` on go
* `make([]uint8, 0,

元記事を表示

GolangのCIをGitHub Actionsで構築してみる!

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。

前回:[TypeScript(Next.js)のCIをGitHub Actionsで構築してみる!](https://qiita.com/Senritsu420/items/f51a7eff81a8c1372302)

今回は、Go言語のCIをGitHub Actionsで構築してみた!という内容です。
初めて作成したのでおかしな所もあると思いますが、あまり責めないでください。。。(泣きます)
# GitHub Actionsとは?
こちらの記事が非常に分かりやすいので、詳しく知りたい方は参考にしてみて下さい!(他力本願寺)
[【初心者向け】【入門】GitHub Actionsの書き方についてデバッグ設定、runs-onやcheckoutなどの仕組みや構造も含めて徹底解説](https://qiita.com/shun198/items/14cdba2d8e58ab96cf95)

簡単に言うと、GitHub上でCI/CDが構築できるよ!と言うものです。
(今までは、CircleCIなどの外部サービスと連携させる必要が

元記事を表示

個人的な勉強メモ4

## ノート
1. Goの並行処理について学習
1. goroutineとchannel
1. channelという概念を初めて知った。
1. 途中でgoleakという外部パッケージでテストをした。
1. するとパッケージがgo1.20以上のバージョンでないと動かなかった。
1. go1.19->go1.21.6にバージョンアップ
1. go mod tidy -go=1.21でgo.modも更新。
1. テストが動くようになった。

## キュー
並行処理を通して、今まで学習していた言語ではよしなにやってくれていたことを少しずつ理解していっている。

## サマリー
外部パッケージの依存関係を解消する場合、公式のページからinstallしたほうが楽。
並行処理のデッドロックなど、気になるところが多い。

元記事を表示

入門者のためのinterface

interfaceが何か分からなかったので勉強してみた。入門者にわかるように説明してみる。

まずは、chatGPTに解説してもらう。

## Q:interfaceってなに?

インターフェース(Interface)は、プログラミング言語において、メソッドの集合を定義する抽象的な型です。具体的な実装を持たず、メソッドのシグネチャ(メソッド名、引数、戻り値の型)のみを指定します。

インターフェースは以下のような特徴を持ちます:

メソッドの集合: インターフェースは1つ以上のメソッドの集合を定義します。これらのメソッドはシグネチャのみを持ち、具体的な実装は持ちません。

ポリモーフィズムの実現: インターフェースは、異なる型のオブジェクトを同じインターフェース型として扱うことができるポリモーフィズムの実現に役立ちます。つまり、同じインターフェースを実装する複数の型は、互換性があり、同じメソッドを呼び出すことができます。

データの抽象化: インターフェースはデータの抽象化に役立ちます。インターフェースを使用することで、特定のメソッドを持つオブジェクトを必要とする部分に対し

元記事を表示

GCP Looker機能/実装

# GCPのLookerの概要
Lookerは、Google Cloud Platform(GCP)のビジネスインテリジェンス(BI)ツールの一つです。データの可視化や分析に特化した機能を提供し、企業における意思決定のサポートを行います。

## 機能/詳細
Lookerには以下のような主な機能が備わっています。

### 1. データの接続と統合
– 様々なデータソースに接続可能:Lookerは、データベースやクラウドストレージ、ウェブアプリケーションなど、さまざまなデータソースと連携することができます。
– データ統合とトランスフォーメーション:データの変換やデータパイプラインの構築が簡単に行えます。

### 2. 可視化とダッシュボード
– インタラクティブなダッシュボードの作成:データを可視化し、グラフやチャートを使ってわかりやすく表示することができます。
– ユーザーフレンドリーなインターフェース:直感的なドラッグアンドドロップでダッシュボードを作成することができます。

### 3. 分析と探索
– 豊富な分析機能:データの集計、フィルタリング、ソートなどのデータ分析操作

元記事を表示

DockerでReact+Mysql+Go環境構築

# はじめに
Dockerで、go+react+mysqlで環境構築した際の作り方です!
以下がフォルダの全体図になります。

![全体図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525798/dc854d81-a341-f05e-bd5a-e899de7c170a.png)

# 作成手順

### 手順1. フォルダ作成

– projectフォルダの作成
– `mkdir project`
– `project/backend`フォルダ、`project/frontend`フォルダを作成
– `cd project`
– `mkdir backend`
– `mkdir frontend`

### 手順2. reactプロジェクトの作成

– reactプロジェクトの作成
– `cd frontend`
“`
#typescriptの場合
npx create-react-app react-app –template typescript

元記事を表示

Go言語のコードの見通しの良さについて(happy path)

### はじめに
ハッピーパスとは、プログラムがエラーや例外なしに順調に動作する、最も一般的な処理フローのこと。開発では、このハッピーパスを明確にし、エラーハンドリングを効率的に行うことが重要だと思います。

## 改善前のコード
下記のようなコードがあるとして、これは一般的に見ると結構見にくいコードだと思います。このコードでは、ネストが深くなっており、ハッピーパスが明確ではないと思います。エラー処理とメインの処理が混在しているため、読みにくい構造になっています。
“`go
func ProcessData(data *Data) (*Result, error) {
if data != nil {
processedData, err := processData(data)
if err != nil {
return nil, err
} else {
result, err := createResult(processedData)
if err

元記事を表示

Golangで簡易的なBTreeを実装してみる

# はじめに
Golang初心者ですが、RDBを書くために始めに言語仕様の確認も踏まえ
簡易的なBTree(2分木)のコードを書いてみたので備忘録として投稿します。
linux環境下で、goをダウンロード・環境構築している条件下で、
『go run (ファイル名).go』とファイルが置いてあるDirで打つことで実行できます。
なお、表示に使う関数群はGPT4に補間してもらいました。
最近精度が大幅に向上していてすごいです。一番下に参考先の記事のリンクを張らせて頂きます。
詳しく説明を付することもできますが、個人的な予定の時間の関係でコードのみの公開です。
##### 【以下コード】
“`golang
package main

import (
“fmt”
“math”
“strings”
)

type Item interface {
Eq(Item) bool
Less(Item) bool
}

type Int int

func (n Int) Eq(m Item) bool {
return m != nil && n == m.(Int)
}

func

元記事を表示

GoでgRPCサーバーを立ててみる1(はじめに)

本日からGraphQLサーバーに繋ぐためのgRPCサーバーを立てていきます。
GoでgRPCサーバーを構築してみたいと考えている人に見てもらえたらいいなと思います!

# はじめに

## 今回やること

– Goで簡単なgRPCサーバーを立てる(

## 今回やらないこと

– Dockerの利用
– gRPC、GraphQLの概念説明

## 構成

gRPCを用いるarticleサービスの部分を実装していきます。

## アーキテクチャ

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3507088/701f20c7-db73-9b2b-db18-af6fa87d75a2.png)

## ディレクトリ

– article ・・・ gRPCを用いたCRUDな記事投稿サービス
– graph ・・・ gqlgenを用いたGraphQLサービス

“`
.
├── article (今回実装する部分)
│ ├── client
| ├── pb
| ├── repository

元記事を表示

Go/ginで外部APIリクエスト、結果を表示する簡易アプリを作成

# はじめに
ここ最近Go言語の入門を開始し、チュートリアル等で基本的な文法を学んだので、何か簡単なアプリを作成してみようと思い、ブラウザからアクセスするシンプルなアプリを作成してみました。

# 作成したアプリ
指定の都市の現在の天気情報を取得して結果(都市名・気温・天候)を画面に表示する簡易アプリを作成しました。(といっても都市は事前に指定したSelectリスト内の中から選択する形式)
天気情報は OpenWeatherMap から取得してます。
要アカウント作成ですが、フリーアカウントで1日1000リクエストまで使え、自分には十分なリクエスト数でした。

(画面キャプチャ)
画面で都市を選択

![スクリーンショット 2024-01-09 234212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519408/018d11f7-0

元記事を表示

Goで様々なフォーマットの時刻JSONをtime.Timeとして扱う

# はじめに
始めまして。最近業務でGoを書いているハセガワカンタです。
先日、みなさんも日常的に使っているであろうtime.Timeの仕様で困ったことがありました。使用しているAPIの関係で以下のようなJSONをtime.Timeとして扱わなければいけなくなったのです。

“`json
{
“date”: “2024-01-01”
}
“`
“`go
type Example struct {
Date time.Time `json:”date”`
}
“`
実はこれ普通にUnmarshalしても上手くいきません

“`go
type Example struct {
Date time.Time `json:”date”`
}

func main() {
j := `{“date”: “2024-01-01”}`
var e Example
json.Unmarshal([]byte(j), &e)
fmt.Println(“date is”, e.Date)
}

“`
“`
date is 0001-01-01 00:00:00 +0000

元記事を表示

Go言語: フレームワークなしからGinとGORMへの移行ガイド

# はじめに

ソフトウェア開発における効率と品質の向上は、技術選択によって大きく左右されます。特に、Go 言語を用いた開発においては、フレームワークや ORM(オブジェクトリレーショナルマッピング)の導入が、その鍵を握ることが多いです。本記事では、Go 言語での開発プロセスを、フレームワーク「Gin」と ORM「GORM」を導入することでどのように変化させることができるかを詳細に解説します。加えて、機能改善に関する変更点も取り上げます。

https://github.com/tonbiattack/go-task-management-api

従来、フレームワークや ORM を使用しない「素の Go」での開発は、柔軟性と軽量さを持ち合わせていますが、大規模なプロジェクトや複雑なデータハンドリングを伴う場合、コードの管理や拡張性の面で課題を抱えることがあります。Gin と GORM の導入は、これらの課題に対して効果的な解決策を提供し、開発の生産性を向上させる可能性があります。

本記事では、Gin と GORM を用いることのメリットと、それを実現するための具体的なステップ、さら

元記事を表示

Goのnet/httpではパスパラメータは取得できない!なので実装してみた

## net/httpでパスパラメータが取得できない件
GoでWebアプリやAPIを開発する時には、Goの標準パッケージであるnet/httpを使うことができる。

JavaやPythonなどの他の言語だと、WebフレームワークやAPI開発のフレームワークを使う必要がある一方で、Goではサードパーティーのライブラリを使う必要がないというのだから、それはそれは便利である。

しかし、net/httpを実際に使ってみて感じた最大のデメリットは、**パスパラメータが取得できない**ということだ。

パスパラメータはアプリを開発するのであれば、99%取得する必要が出てくるだろう。これは困ったというのが事実だが、話は簡単。無いのであれば作ればいい。

そこで今回は、Goのnet/httpでパスパラメータを取得するための実装をしてみた。

※なお、クエリパラメータやボディパラメータ、さらにはHTTPメソッド(GETなのかPOSTなのかの情報)については、取得する機能が存在する。やり方は割愛するのでググっていただきたい。

## パスパラメータを取得するコード

/item/{itemId} のよう

元記事を表示

Go言語を初めたい人におすすめの本

## はじめに
Go言語を初めたい人におすすめの本をまとめました。初心者未満、初心者、初心者超えとまとめました。
上から順番に読むことを推奨しますが、能力や好みに合わせて好きに選んでもらって大丈夫です。また、全ページを読み込む必要はないと思います。使えそうなところだけ読むのがいいと思います。

## Goを初める前に薦めたい本
[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%9

元記事を表示

2023年の振り返り(KPT)と今年の目標

@Esperna です。明けましておめでとうございます。
遅くなりましたが昨年の振り返りと今年の目標を。
昨年は様々なライフイベントや天候等に翻弄され続けた一年でした。
自分でコントロール不能なものが多過ぎた割には総じてよくやったと言える一年でした。
昨年の振り返り(KPT)と今年の目標を書きます。

# Keep

* ブログは[個人](https://qiita.com/Esperna)で13件、社内で3件
* 英語の記事は見送ったがそれなりに量のアウトプットを出せたので良し
* 読んだ書籍の数7冊
* [OAuth徹底入門 セキュアな認可システムを適用するための原則と実践](https://www.amazon.co.jp/gp/product/B07L5M7DXS/ref=ppx_yo_dt_b_d_asin_title_351_o02?ie=UTF8&psc=1)
* 実際に動かしたコードを[GitHub](https://github.com/Esperna/oauth-in-action-code)に上げながら読んでます
*

元記事を表示

GCP Cloud Load Balancing機能

# GCPのCloud Load Balancingの概要と機能

## 目次
1. [概要](#概要)
2. [機能/詳細](#機能/詳細)
3. [まとめ](#まとめ)

## 概要
GCPのCloud Load Balancingは、Google Cloud Platform(GCP)上で提供される負荷分散サービスです。このサービスは、アプリケーションやウェブサイトへのアクセスを複数の仮想マシンやサーバーに均等に分散することができます。これにより、トラフィックの増減に柔軟に対応し、高可用性とパフォーマンスの向上を実現することが可能です。

Cloud Load Balancingは、GCP内にデプロイされた複数のリソース間でトラフィックを分散するために使用されます。特定のリクエストに対して最適なリソースへのルーティングを行い、セッションの保持やヘルスチェックなどの高度な機能を備えています。

## 機能/詳細
次に、Cloud Load Balancingの主な機能とその詳細について説明します。

### 1. HTTP(S) ロード バランシング
– HTTP(S)プロトコルを

元記事を表示

マルチステージビルドとDistrolessでDockerイメージを最適化する

Node.js(Express)ベースのアプリケーションをGoに移行した際、Dockerイメージのサイズを2.8 GBから400 MBまで大幅に削減できて一旦満足したのですが、リソースの効率的な利用やデプロイの速度向上を目指す中で、さらなるイメージサイズの削減ができることがわかったので、新たな試みをしてみることにしました。

DevOps経験のあるエンジニアには既知の内容だと思いますが、初心者の方々への参考として、改善内容を共有します。

# 元のDockerfile
元のDockerfileでは、`golang:1.21.0`ベースのイメージを使用し、Goのモジュールのダウンロード、アプリケーションのビルド、実行のためのステップを含んでいます。しかし、この方法では開発環境に必要な全てのファイルがイメージに含まれるため、最終的なイメージサイズが大きくなってしまいます。

“`dockerfile
# Goの公式イメージをベースにする
FROM golang:1.21.0

# アプリケーションディレクトリを作成する
WORKDIR /app

# Goのモジュールを有効にする
ENV

元記事を表示

OTHERカテゴリの最新記事