yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

Go言語

「Go言語 100Tips」が参考になった

「Go言語 100Tips」を読んでみました。 book.impress.co.jp 入門書ではなくある程度Go言語を触った人向けの本です。現時点で私は業務で半年ほどGoを触っていますがモヤモヤしていたことを解消してくれたり気づきを与えてくれたりとすごく参考になる内容でし…

GoでgRPCのクライアントコードを書いてみた

前回gRPCでサーバ側のコードを書いてみたので続いてそのサーバを呼び出すクライアント側のコードを書いてみた。 ikeyu0806.hatenablog.com 実行環境 クライアントのコードもサーバと同じdockerコンテナで実行する コンテナは1つだけどdocker runのコマンドオ…

Ruby→Goの移行PJでginkgoとgomegaを使ってるとテストコード移行作業がやりやすい

今でRubyのAPIやjobをGoに移行する仕事をしていますがginkgo使うとrubyのrspecで書かれたテスト移植しやすいなー。と感じます。 ginkgoについて Goのテストフレームワークです。 Goの本やブログ読んでてもあんまり情報なく自分も職場のチームリーダに紹介し…

GoとgRPCでサーバサイドのCRUD実装してみた

gRPCを試してみたく、個人開発でGoとgRPCを使って簡単なメモサービスのCRUDを実装したので振り返ってみます。 作ったもの sqliteでid、title、descriptionレコードを持つmemosテーブルを作成してgRPCのリクエストからメモの一覧取得、詳細取得、作成、更新、…

Go + Webassemblyでアップロードされた画像をセピア調に変換して表示してみる

Webassemblyを試してみたく、Goでアップロードされた画像を白黒、セピア調に変換するプログラムを書いてみました。 前回の記事 https://yuki-ikegaya.net/2023/08/20/docker%e3%81%a8gin%e3%81%a7go%ef%bc%8bwebassembly%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a…

Go + WebAssemblyでアップロードされた画像のファイルを取得する

前回作った雛形をベースにWebAssemblyで画像処理サービスを作りたいと思い、とりあえずinputタグでアップロードしたファイルのサイズを取得してconsoleに出してみました。 書いたコード index.html <html> <head> <title>WebAssembly File Size</title> </head> <body> <h1>WebAssembly File Size</h1> <input type="file" id="fileInput" accept="image/*"> </body></html>

Ginのエラーでハマったので対応メモ。[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 200 with 401

GoのHTTPフレームワークGinで実装したAPIのテストコードを書いていたら401を返すはずのテストケースで200が返ってしまい対応で軽くハマりました。 以下のメッセージが原因っぽかったけどなぜ出てくるのかしばらく分からず。 [GIN-debug] [WARNING] Headers w…

GoのORマッパーBunでRelation先のモデルが取得できないエラーの対応

GoのORマッパー bunでmodelに定義したRelationモデルが取得できなかった時の地味に気づきにくかった対応メモ。 1つのAccountに複数Userを登録できるサービスのテーブルを例に書きます。 モデル定義 type User struct { bun.BaseModel `bun:"table:users"` ID…

DockerとGinでGo+WebAssemblyプロジェクトの雛形を作った

GoでWebassemblyを試してくてdockerとHTTPフレームワークGinで開発環境を作りました。 フォルダ構成 . ├── Dockerfile ├── docker-compose.yaml ├── go.mod ├── go.sum ├── index.html ├── server/ │ └── main.go └── webassembly/ ├── js/ └── main.go Dock…

ゴルーチンの練習でWebスクレイピングCLI書いてみた

書いたもの package main import ( "goroutine-scraping-cli/sites" "fmt" "sync" ) func main() { var wg sync.WaitGroup resultChannel := make(chan sites.Article) wg.Add(2) go func() { articles := sites.ScrapingHatenaItHotentry() for _, article …

Goのプロジェクト環境をdocker-composeで構築した時のメモ

久々に個人開発でGoのプロジェクト作ったので手順メモ。 簡単なCLIで1コンテナしか使わない予定なのでローカルに直接構築 or docker-compose使わずDockerfileのみでもいいかな、と思ったけど以下の理由で結局docker-compose使った。 ローカルで動かすとGOPAT…

仕事でGoを使ってみて感じたRubyとの違い

バックエンド開発ではキャリアのほとんどがRubyで補助的にJava使うくらいだったが5月からGoをメインで使うようになりました。 ここまで使ってみてのRubyと比較したメリットを書いてみます。 感じたGoのメリット 型やインターフェイスがあることでコードの行…

「Go言語で作るインタプリタ」を読んだので内容整理

「Go言語で作るインタプリタ」を読んだ。親切な内容の本ではあるけどやっぱりインタプリタを作る。ってテーマ自体が難しく、読むのに苦戦したので内容書きながら整理してみる。 O'Reilly Japan - Go言語でつくるインタプリタ ざっくり全体の流れ プログラム…

Vue +GoでPocketの記事にまとめてタグ付ができるサービスを作った

Pocketに記事をどんどん放り込んでいて整理できてない。。というモヤモヤがありPocketのAPIを使ってうまいこと整理できないかと考えてた。 https://ikeyu0806.hatenablog.com/entry/2021/05/09/113856 で、整理するならとりあえず記事にタグ付けできる機能が…

GoでDBの接続情報をyamlに切り出した時のメモ

Goで作ったサービスで環境ごとにDBの接続先を切り替えたいと思ってこんな感じ↓でyamlに書いた接続情報を読み込んだ時のメモ。 driver: mysql development: user: root password: "pass" protocol: "tcp(movie_mysql:3306)" db_name: "movie_info" これがベス…

自作カレンダーの開発の進捗振り返り

ポートフォリオとしてVueとGo言語で作ったカレンダーサービスの開発が進んだので振り返ってみる。 GitHub - ikeyu0806/vue-calendar: Vue.js/GraphQLで開発した自作カレンダー 最近実装したもの GraphQLで予定の登録、更新、削除をできるようにした。 ユーザ…

「Goならわかるシステムプログラミング」の17章を読んだ(Go言語とコンテナ)

コンテナ 仮想化は、使いたいサービスだけでなくOSも含めてまるごと動かすことが前提の仕組みです。そのため、たとえばゲストOSとホストOSが同じLinuxであればカーネルやシステムのデーモンを重複してロードすることになり、無駄にメモリを消費してしまいま…

「Goならわかるシステムプログラミング」の16章を読んだ(時間と時刻)

OSが使う時間の仕組みは歴史的経緯などもあって少し複雑な構成をしており、たくさんの種類のタイマーやカウンターがあります。 リアルタイムクロック(RTC) システムクロック タイムスタンプカウンター(TSC) 各種タイマーデバイス 時間に関するシステムコ…

「Goならわかるシステムプログラミング」の15章を読んだ(Go言語のメモリ管理)

「Goならわかるシステムプログラミング」を前章に続いて気になったところ抜粋+コード写経しつつ、15章を読んだ 物理メモリと仮想メモリ 今、メモリが8GBのマシンがあり、そのうちの1GBをOSが消費しているとします。 残り7GBを使って、1GBずつのメモリを消費…

「Goならわかるシステムプログラミング」の14章を読んだ(並行・並列処理の 手法と設計のパターン)

並行・並列処理の手法のパターン まず、複数のコアを使って重い処理・ブロックする処理を効率よくさばく方法につ いて、Go言語に限らない一般的な基礎知識を解説しておきます。 並行・並列処理の実現手法には、おおまかに区分すると、マルチプロセス、イベン…

「Goならわかるシステムプログラミング」の13章を読んだ(並列処理)

複数の仕事を行うことを表す言葉には並行(Concurrent)と並列(Parallel)の2つがあります。 並行:CPU数、コア数の限界を超えて複数の仕事を同時に行う ほんの少し前まで、コンピューターに搭載されているCPUはコア数が1つしかないものが普通でした。その…

「Goならわかるシステムプログラミング」の12章を読んだ(シグナルによるプロセス間の通信)

シグナルには、大きく2つの用途があります。 プロセス間通信:カーネルが仲介して、あるプロセスから、別のプロセスに対してシグナルを送ることができる。自分自身に対してシグナルを送ることも可能 ソフトウェア割り込み:システムで発生したイベントは、シ…

「Goならわかるシステムプログラミング」の11章を読んだ(プロセスの役割と Go言語による操作)

前章に続いて写経しつつ「Goならわかるシステムプログラミング」の11章を読む。 現在起動中のプログラムの絶対パスを表示 package main import ( "fmt" "os" ) func main() { path, _ := os.Executable() fmt.Printf(" 実行ファイル名 : %s\n", os.Args[0]) …

「Goならわかるシステムプログラミング」の10章を読んだ(ファイルシステムの最深部 を扱うGo言語の関数)

前章に続いて「Goならわかるシステムプログラミング」の10章を写経しつつ読んだ。 ファイルの変更監視 開発言語や環境によらず、プログラムでファイルを監視する方法には、次の2種類があります。 監視したいファイルを OS 側に通知しておいて、変更があった…

「Goならわかるシステムプログラミング」の9章を読んだ(ファイルシステムの基礎と Go言語の標準パッケージ)

「Goならわかるシステムプログラミング」の9章(ファイルシステムの基礎と Go言語の標準パッケージ)を写経しつつ読んだのでメモ。 ファイルシステムとは コンピューターにはさまざまなストレージが接続されています。ハードディスクやSSD、取り外し可能なSDカ…

「Goならわかるシステムプログラミング」の8章を読んだ(Unixドメインソケット)

「Goならわかるシステムプログラミング」の8章を読んだ。8章はUnixドメインソケットについて。 TCPとUDPによるソケット通信は、外部のネットワークにつながるインタフェースに接続します。 これに対し、Unixドメインソケットでは外部インタフェースへの接続…

「Goならわかるシステムプログラミング」の7章を読んだ(UDP)

引き続き「Goならわかるシステムプログラミング」の7章を写経しつつ読んでみる。 前章はTCPだったけどこの章はUDP。TCPより機能が少なくシンプルなプロトコル UDPはTCPと同じトランスポート層プロトコルですが、TCPと違ってコネクションレスであり、誰とつな…

「Goならわかるシステムプログラミング」の6章を読んだ(TCPソケット通信)

6章 ソケット通信について 6章からソケット通信についての内容で6章はTCP。前章までに比べてサンプルコード多め。 写経して動作確認しながら読んでみた。 ソケットとは プロセス間通信の一種です。ソケットが他のプロセス間通信と少し違うのは、アドレスとポ…

「Goならわかるシステムプログラミング」の4章、5章を読んだ

「Goならわかるシステムプログラミング」の4章を読んだのでメモ。4章はチャネル、5章はシステムコールについて 4章 チャネルとは何か 本文から引用 ソフトウェアの世界には、キュー(queue)と呼ばれるデータ構造があります。 キューは、最初に投入したデー…

「Goならわかるシステムプログラミング」を読み始めた

「Goならわかるシステムプログラミング」読み始めた。とりあえず1-3章まで読んだのでメモ。 Goならわかるシステムプログラミング(PDF版のみ) – 技術書出版と販売のラムダノート Kindleで欲しかったんだけどなかったんで公式サイトからPDF形式を購入してみ…