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

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

HLSクライアントをgolangで書いた

# はじめに
この記事は[セーフィー株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/safie) の12月12日の記事です.

弊社では監視カメラのクラウドサービスを提供しており、映像の配信も自分達で実装しています.
その種類は現在のところ3種類(HLS,WebRTC,YouTube Live)です.
今回はその中の1つである HLSのクライアントをgolangにて実装する機会があったため簡単に紹介します.

[実装したHLSクライアント](https://github.com/kawaway/hls_downloader) です.

# HLSとは
HLSは HTTP Live Streaming の略で、動画(映像・音声)をHTTP上でストリーミングするためのプロトコルです.
その基本的な仕組みは難しくなく、サーバーにて動画をある単位で分割し、クライアントはそれをダウンロードして再生するというものです.
その際、動画のファイル数や、再生時間等の情報が無いと、いつまでダウンロードすればいいかがわからな

元記事を表示

【Go】net/httpパッケージで非推奨のTemporaryの扱いについて

## はじめに

こちらは[Kyash Advent Calendar 2022](https://adventar.org/calendars/7407) の 13 日目の記事です。

今年の 11 月に Kyash に入社しました!サーバサイドチームの[uehara](https://twitter.com/_uhzz_)です:wave:

今回は`net/http`パッケージの非推奨メソッドである`Temporary()`について、社のメンバーから知見を共有してもらったのでその話をします。

## net/http パッケージの 非推奨メソッド Temporary() について

`Temporary()`については、フューチャー社の記事にわかりやすくまとめられています。

https://future-architect.github.io/articles/20220203a/

上記の記事を踏まえて、ここでは非推奨になった経緯と対応について言及します。

サッと概要を書くと、`Temporary()`は`net.Error`インターフェースに定義されているメソッドで、一時的

元記事を表示

1年半の新サービスBackend開発の振り返り (失敗とその先)

引越し侍の新サービスのバックエンドの1年半の開発を振り返ってみました。:santa_tone2:

使っている技術と全体的なアーキテクチャについては以下の記事をご参考ください。
(2021年アドベントカレンダー:christmas_tree:の記事です)

https://qiita.com/sho-hata/items/054c77392cc61bc2f3ac

## 主に話す内容は?
バックエンドというと「データ設計」「ソフトウェアアーキテクチャ」「インフラ構成」など範囲が広いですが、この記事では**Goで開発しているAPIサーバーのソフトウェアのアーキテクチャ**だけフォーカスします。

## どんな構成になっているか

[Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)に寄せたレイヤードアーキテクチャになっています。

主な役割としてはDBから単純なデータ取得、保存だけでは表現できないビジネスロジックをREST APIとして提供して

元記事を表示

Goでハッカソン

# はじめに
僕が今日までにハッカソンに参加して、どういうことがあったのか書こうと思います。

# 自己紹介
* 生命医科学系の学部
* 高専卒
* Atcoder茶

# はじめてのハッカソン
元々僕は競プロをやっていて、毎週土日をatcoderに捧げる日々を過ごしていました。atcoderは茶色に行ってicpcも本選に出場することができましたが、サマーインターンでいくつかの企業に応募した時にほとんど書類選考が通らなくて、競プロはなんか違うんだろうなと思って、Goの勉強を始めました。Goの勉強は「Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」という本でやっていました。それで初めて技育展に出て、先輩に教えてもらいながら初めてバックエンドとしてプロダクトを作りました。
競プロとは違った面白さがあったし、色々と初めて触ったものが多かったのでとても面白かったです。賞は取れませんでしたが、チームメンバーと一つのプロダクトを作ったのはとても貴重な経験でした。
リファクタリングでテストも書けたし、全部標準ライブラリできました。標準ライブラリで作ったことは面接でいいねと言わ

元記事を表示

Goのユーザー定義型のベースを何にするか

この記事は[トレタ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/toreta)の9日目の記事です。

こんにちは。トレタでサーバーサイドエンジニアをしている川村です。

私が担当しているプロジェクトでは、MVCに少し要素を足したような構造からクリーンアーキテクチャを意識した構造へと変更するリファクタリングを実施しています。
その一環として値オブジェクトを導入しており、このオブジェクトを作っていくなかで「どっちがいいんだ?」とちょっともやもやしていたことがあったので、アドカレを機会に検討しました。

# 2通りのオブジェクト定義
なにかの名前(文字列)用の型を作ろうと思った時、以下2通りの作り方があるかと思います。
*判別のために型名の後半にベースの型名をつけてます
– stringをベースにした型
stringとして取得する関数とコンストラクタも定義してます。
“`go
type NameString string

func (ns *NameString) String() string {
retur

元記事を表示

Goで保存時にimport文が消える…

最近Goを書き始めて見たのだが,Goは言語単位でフォーマッタが搭載されているらしくこれが大変不便で困っていた.

例えばこのような文を書いていたとき…

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello world”)
}
“`

保存すると何故かimportの部分が消えてこんな感じになってしまいました

“`go
package main

func main() {
fmt.Println(“Hello world”)
}
“`

いろいろ解決方法はあるみたいですが,まず設定からgoのformaterをgofmtに変更してみましたが効果はなし

以下の質問によると,importは自動で書かれるから自分で書くのはだめらしい.
[https://teratail.com/questions/278344](https://teratail.com/questions/278344)

なるほど

実際にimportを書かずにそのままfmt.Printlnを書くと自動でimportされ,保存し

元記事を表示

Goのポインタ渡しは値渡しよりパフォーマンスが良いという誤解

この記事は MicroAd Advent Calendar 2022 の12日目の記事です。

https://qiita.com/advent-calendar/2022/microad

「Goのポインタは8バイトだから、ちょっとした構造体を値渡しでコピーするよりポインタで渡した方が早くなる」

長らくそう思い込んでいたのですが、以下の記事でポインタ渡しには意外なデメリットが多いことを知り、誤解だと気づきました。

https://segment.com/blog/allocation-efficiency-in-high-performance-go-services/

この記事では自分なりにポインタのデメリットをまとめつつ、ポインタ渡しで本当に良いのかを確認すべきパターンを紹介しようと思います。

## ポインタが実は高価な理由
– ポインタが指す値にアクセスする際にnilかどうかのチェックが必ず入る
– ポインタがnilの場合、Goはpanic()をおこす必要があるため
– ポインタは動的メモリアロケーションの原因になりがち
– ポインタが指す値はヒープ領域に置か

元記事を表示

Go 1.15 → 1.19

この記事は[Howtelevision Advent Calendar 2022](https://qiita.com/advent-calendar/2022/howtelevision)の12日目の記事です。

弊社が運営する外資就活ドットコムではバックエンドに`Go`を採用しています。
`Go`のバージョンが`1.15`のままとなっていたので`1.19`にバージョンを上げたのですが、本記事ではバージョンアップの際に行った変更を備忘録的なものとしてまとめておこうと思います。

# Goのバージョンアップ(1.15->1.19)
手始めに`Dockerfile`を
“`Dockerfile
FROM golang:1.15.3
“`
から
“`Dockerfile
FROM golang:1.19.3
“`
にバージョンの指定を変更しました。

これだけでうまく動いてくれればよかったのですが、そううまく事は運ばずmodule関連の変更も必要でした。
具体的には
– `go get`がDeprecatedされたことへの対応
– `go get`から`go install

元記事を表示

Cloud RunからBudgetいじくる実装例

# まえがき
私自身、管理職とエンジニアの両立が20年近く続いています。

「手を動かし続けないとエンジニアとして劣化する」と、以前の同僚が話していました。
自分自身、普段の業務では管理業務の割合が増え続けてはいますが、管理作業や事務作業の中で発生する作業も、DRY精神を忘れずに、手でやる方がいいのか、コード書くのがいいのかを考えながら、必要に応じて手を動かすようにしています。

Google Cloudの利用において、不正利用や意図しないリソースの消し忘れなどによって、経済的損失を最小化する課題について考えていました。
結果、予算設定を、お客様やエンジニアがよりカジュアルに設定できるような仕組みを作ればいいと考えました。
弊社の運用業務で標準利用しているBacklogに課題を起票することで、予算設定をできるシステムを作ってみました。

正式実装は開発部隊に依頼するかもですが、そのたたき台としてモノを作ったので、この場で共有しておこうと思います。
BillingをGo言語で操作するサンプルは、インターネット上に見つからなかったので、同じようなことをされる方にお役に立てればと、実際のコー

元記事を表示

TiDBのSQLパーサーを使ってみました

Go言語で開発をしていると少なからずデータの出し入れ作業があるので自動化したいなと思うことが時々あります。

OASやORMあたりのライブラリを利用すると入出力まわりはたいていあるのですが、自分で作ってみたいなと思いMySqlのCreate文から構造を取得した際にTiDBのパーサーをつかってみたので簡単に紹介させていただきます。

TiDBはGo言語で実装され、mysqlとの高い互換性がありパーサーの利用方法もシンプルでした。
TiDBのパーサーの利用方法はquickstartを実施してもらうとすぐに利用できるようになりますが、TableのCreate文から必要な要素を抽出した処理を簡単にですが紹介させていただきます。

### TiDB紹介

– TiDB
https://github.com/pingcap/tidb/blob/master/README.md

TiDB (“Ti” stands for Titanium) is an open-source NewSQL database that supports Hybrid Transactional and Analyt

元記事を表示

GoでTensorFlow!Pythonに支配されるな! 【環境構築編】

# はじめに
この記事はC3 Advent Calendar 2022 11日目の記事です.
## 対象読者
– 機械学習をやってみたいけど何から始めていいかわからない人
– Goを使って何かしてみたい人
– `機械学習=Python`という固定概念に囚われたくない人
– Goが好きな人
## なぜ,GoでTensorFlowを使うの?
現在,機械学習を行う際の使用言語としてメジャーなのはPythonです.確かにPythonはライブラリが充実しており,参考記事も多く手軽に機械学習を用いたプロダクトを作成することも可能です.**ただ,それって普通で面白くなくね?** せっかく世の中にはいくつもの言語があるわけです.〇〇には△△を使うのが一般的だからっていう理由で選んじゃっていいんですか. **どうせなら自分の好きな言語でやりたい!** ということで今回は僕の好きな言語の一つである**Go**を使って機械学習を行なっていきたいと思います!今回は環境構築編です!

# 環境構築
GoでTensorFlowを動かすための環境を作る方法はいろいろありますが,今回はDockerを用いて,GoでTe

元記事を表示

Goのnet/http Requestでヘッダーの大文字小文字を厳密にしたい

本記事は[ディップ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev)の5日目の記事です。
言い訳をすると12月頭から体調を崩してしまい、寝込んでいました。
—言い訳終了—

とあるAPIを叩くためのクライアントライブラリを作成していたところ、APIを受ける側がヘッダーに特定のデータを要求している仕様となっていました。
Goの`net/http`パッケージを利用した実装ではたいてい下記のような書き方になると思います。

“` go
func ApiCall() {

req, err := http.NewRequest(“GET”, “https://example.com”, strings.NewReader(“”))
if err != nil {
//なんらかのエラー処理
}
req.Header.Set(“New-RequestHeader”, “header-data”)

//ここでdebug printします。

元記事を表示

[Golang] OSコマンドを実行する

## OSコマンドを実行する

### 環境
– macOS Monterey : 12.6.1
– iproute2macをbrewでインストール済み

### コード実行

“` package.go
package main

import (
“fmt”
“os/exec”
)

const defaultGw = “172.22.0.1”

func main() {
pingCmd(defaultGw)
fmt.Println(“—–“)
catCmd(“golang.txt”)
fmt.Println(“—–“)
lsCmd()
fmt.Println(“—–“)
ipAddr()
}

func pingCmd(addr string) {
result, err := exec.Command(“ping”, addr, “-c3”, “-i0.5”).CombinedOutput()
if err != nil {
fmt.Println(err)
}
fmt.Println(string(result))
}

f

元記事を表示

[Golang] スライス、キャパシティ、初期値

## 変数の設定による違いを理解する

### コード
“` main.go
package main

import (
“fmt”
)

func main() {
calc()
}

func calc() {
var b []int // 初期値はnilの[]スライス
c := make([]int, 5) // 初期値は[0 0 0 0 0]のスライス
d := make([]int, 0, 5) // 初期値は空の[]スライス

fmt.Println(“/– 初期値 –/”)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)

for i := 0; i < 5; i++ { b = append(b, i) c = append(c, i) d = append(d, i) fmt.Printf("/-- %d times --/ \n", i) fmt.Println(b) fmt.Println(c) fmt.Println(d)

元記事を表示

Go言語におけるinterfaceって何がええねんって話

# 対象者
– Goのinterfaceでつまづいた人
– interfaceを理解したけれど何が嬉しいのか全くわからない人

# 初めに
 個人的にGoの3大挫折ポイントはゴルーチン,interface,クロージャーであると考えています(自分が苦戦しました)

 そこで今回は主にinterfaceに焦点を絞って自分なりに勉強したことを共有できたらなって思っています

# じゃあなぜ躓くんだ?って話

 これは結論から言うとJavaなどのオブジェクト指向型のプログラミング言語と使い方が少し異なるからです

例えば以下はjavaでのinterfaceの書き方になります

“`java

interface Sports {
public abstract void Dribble();
public abstract boolean Pass(Str x);
public abstract int Shoot(int y);
// …

}
“`

 ここで重要なのはメソッド名はあるけど何するかわからない抽象的なものであると言うことです。

 こ

元記事を表示

【AWS x ECS x Go】New Relic の導入② APMの取得

# はじめに
こんにちは、[rendaman0215](https://twitter.com/rendaman0215)です。

弊社では、ログ保管やAPM・メトリクスの収集先としてNewRelicを採用しています。
私は認証チームとして、Go言語のサービスにNewRelicを導入したため、その方法を紹介できればと思います。

本記事は、その取り組みの中で行なった、APMの取得に関する記事になります。

# 実施環境
言語:Go言語
フレームワーク:[go-chi](https://github.com/go-chi/chi)
実行環境:ECS on Fargate

# 導入
## 初期化
NewRelicのAPM計測用Goエージェントを初期化する。

まずは、アプリケーションに `github.com/newrelic/go-agent/v3/newrelic`パッケージをインポート
“`golang
import github.com/newrelic/go-agent/v3/newrelic
“`

次にmain関数、またはinitブロックに以下を追加することで、Goエー

元記事を表示

Apache Beam Go SDK で Cloud Pub/Sub のデータを取得する

[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 11日目担当の8kkaです。
本記事では、最近ログフロー構築で使えないかなぁ…と模索している Apache Beam Go SDK について書こうと思います。

# Apache Beam Go SDK
Apache Beam は、バッチやストリーミングでデータ処理を行うための統合プログラミングモデルです。

https://beam.apache.org/

Apache Beam モデルでは、分散処理の細かい設定が抽象化されているため、ユーザーはジョブの実行ロジックに焦点を絞る事ができます。
実行環境もいくつかあり、 直接コンソールから実行する Direct Runner や Apache Spark、Google Cloud Dataflow など、様々な環境で実行できます。

Apahce Beam を利用する際の言語は Java と Python が有名ですが、近年 Go の SDK も充実してきています。

元記事を表示

GoogleからGoのスタイルガイドが公開されたので一部まとめた

# はじめに

この記事はand factory.inc Advent Calendar 2022 10日目の記事です。
数時間の遅刻です。。寝るまでが10日目なのでセーフ!(ではない)

昨日は@yasukotelin さんの「[【Jetpack Compose】Pagerを使った画面でもCollapsing Toolbarを実装したい](https://qiita.com/yasukotelin/items/b8d084ed783f5c698de3)」でした。

こんにちは。
and factory サーバサイドエンジニアのnsym__mです。

先月、Googleから[Goのスタイルガイド](https://google.github.io/styleguide/go/)が公開されました。
これまでGoでのスタイルガイドやコーディング規約としてはまず[Effective Go](https://go.dev/doc/effective_go)が前提にあり、その補足として[Go Code Review Comments](https://github.com/golang/go/w

元記事を表示

Let’s Go “domain primitive” !

# はじめに

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 11日目の記事です。
Go歴1年半くらいの @takokun778 が執筆します。

# what’s domain primitive ?

タイトルにある`domain primitive`(ドメインプリミティブ)とは以下の特徴を持つものです。

– ドメイン・モデルを構築する最小の要素
– ドメイン・モデルの基礎を形成するもの
– 不変(`immutable`)であり有効となる場合にだけ存在

[セキュア・バイ・デザイン 安全なソフトウェア設計](https://book.mynavi.jp/ec/products/detail/id=124056)という本の第5章ドメインプリミティブで紹介されています。
こちらの本は`Java`を用いて実装例が示されています。

そんな実装をあえて`Go`で書いてみようと思ったのがこの記事の内容となります。
また、本の内容を`Go`で書き換えてみようというよりいろんなところで見聞き

元記事を表示

goでgRPCのAPIを実装する go and Connect

# goでgRPCのAPIを実装する go and Connect

Connectというシンプルでスリムなライブラリを使って、gRPCのAPIサーバを開発してみます。

Connect は、ブラウザーおよび gRPC と互換性のある HTTP API を構築するためのスリムなライブラリです。Protocol Buffer スキーマを使用してサービスを定義すると、Connect がタイプ セーフなサーバー コードとクライアント コードを生成します。サーバーのビジネス ロジックを入力すれば完了です。手書きのマーシャリング、ルーティング、またはクライアント コードは必要ありません。

前提:
go 1.18
buf

プロジェクト作成
“`
$ mkdir connect-go-example
$ cd connect-go-example
“`
initとインストール
“`
go mod init example
go install github.com/bufbuild/buf/cmd/buf@latest
go install github.com/fullstoryd

元記事を表示

OTHERカテゴリの最新記事