about software development so on.
Golang Tokyo #41 参加メモ
golang.tokyo #41 Goコミュニティの技術談義 今回はGMOベパポ主催 イベントURL LT1 Go Embedでwasm埋め込み Go Embedでwasm埋め込み by @7328957 竹田さん 株式会社ラクス 今回のテーマは仕事関係ない話 go embed いろんなファイルを埋め込み可能にするパッケージ テキストファイル、バイナリファイルなど ファイルにコメント ファイルの埋め込みはコンパイル時に実行 参考 wasmはどう埋め込むか? 他の同様にファイルの中にコメント []byteの変数として読み込む goで作ったわけではないwasmでも呼び出せる goroutineで呼び出しもできる wasm埋め込みのメリット Goバイナリで完結 wasmランタイムも埋め込める ビルド時に埋め込めるので安全 ライブラリとして意識せずに使える goの機能も使える Q&A Q. ユースケースはどんなものがあるか? wasmにコンパイルできれば、goで任意のコードが呼び出せるか? A. cgoでなくwasmでインポートできるとか、任意のコードは呼び出せると思う LT2 Goクイズ jumpaku クイズ5問 選択肢式 Q1 実行時エラーマップのキーがないとこ? A コンパイルエラー。mapに対する添字アクセスはアドレッサブルでない Q2 実行時エラーnil pointer? A Xを出力。メソッド内tを参照しないためnil pointerは発生しない Q3 実行時エラーnil pointer A 実行時エラー。値のデリファレンス時にエラー Q4 X出力。 A Xを出力tはアドレッサブル Q5 X出力 A コンパイルエラー。コンポジットリテラルはアドレッサブルでない 振る舞いに注意 ポインタ、レシーバ アドレッサブルな値 コンポジットリテラルは例外 LT3 自作LLM Native GORM Pluginで実現するAI Agentバックテスト基盤構築 LayerX pon AI申請レビュー AI機能をめっちゃつくっている AIAgentのバックテスト バックテスト:金融取引戦略やシステムが過去のデータを元にどの程度パフォーマンスを出すか評価するテスト 評価捗る 提案に使える 機能の効果をチェックできる 過去データsnowflakeに保存している snowflake:クラウドデータウェアハウス。TreasureDataとかと一緒 プロシージャで取り出し 複数の手続きクエリをまとめたもの 課題:AI申請レビューはAPIに依存 APIは最新データに依存 snowflakeでの機能差し替えは難しい APIの参照先をsnowflakeに差し替え→クエリビルダーから影響してしまう APIの実装を変更しないでやる→gorm pluginを使う 任意の処理を差し込める プラグインを作った LLMでSQLを書き換え パフォーマンスが必要でないからLLMを利用可能なケース バッチ処理 APIでgorm v1/v2が混在 移行用のパッケージ ゴールデンテストを作成 →バックテストできた gorm pluginが手段の選択肢にあると便利 LT4 KessokuのDIにおけるgoroutineスケジューリング マズリーンさん SRE Dena DIツールkessokuの話 GoのDI DIとは依存を外部から注入する設計パターン ツール・ライブラリで自動化可能 google/wire 実行時オーバーヘッドがない コンパイルエラーでミスがわかる リポジトリアーカイブされてしまった 課題 開発体験が悪い 補完が効かない goroutineが使えない →ライブラリ作成 kessoku wireとほぼ同じ/Buildタグ不要 asyncの設定→goroutineで非同期に →コールドスタートが高速化 goroutineのスケジューリング(本題) 最小限のgoroutineで非同期にしたい←大変 DI→依存関係をグラフ化→トポロジカルソートで一列に並べる(wire) 要件 依存関係のないasyncは別goroutine 最小限のgoroutine 必須ではない asyncなしはwireと同じ やったこと goroutineの数を導出 最大非同期数 asyncは考慮しないゆるい制約 グラフ理論最小パス 最大マッチング問題 実行goroutineを決定 asyncとasyncそれぞれ優先度で設定 LT5 Goで時間を“操る”テスト, synctest 26新卒 LayerXでインターン go1.25で追加されたtesting/synctestについて使ってみた メリット goの並行処理は直感的にかける デメリット 非決定的、time.sleepでCIが遅くなる synctest バブルをつくって実行 Test() 隔離環境で実行 Wait() 現在のバブルのすべてのgoroutineがdurably blockedになるまで待機 ユースケース IOの疑似検証 Context timeout TTLキャッシュ 並行パイプライン Goにおける生成AIによるコード生成のベンチマーク評価入門 どすこい FY24卒 武田 バックエンド開発のWebエンジニア GMOペパボ AIコーディングの精度について Goはシンプルだから精度高い?→調べると低いらしい コードの生成の評価って何をしているのか? 精度評価は業務と同じといえるのか? (定性評価・試行錯誤も大事) 定量評価のデータセット HumanEval 人間が書いたコード Githubそのままではいけないケースを用意 Python HumanEval-XL 複数言語の比較 LLMで翻訳 評価方法 pass@k k=1 一発勝負 k=100 100回施行、理論的助言 k=5~10 施行した使い心地 データセットの入力 json プロンプトなど 簡単な問題から、高難易度まで テストケースの例 残高管理問題 入力を入れていくときにマイナスになるか 範囲偶数問題 範囲の偶数を返す 他の言語に比べGoが低い理由 正解の為のコードが長くなりやすい→失敗が多い? テストの性質 テストケースは小規模アルゴリズムパズルで、APIなどGoが得意な分野がテストされてない 感想 自前でpluginやライブラリを作る選択肢を持ちたい 期限が差し迫ったタスクだと、見込みが立ちやすい選択肢取りがち AIのコード生成でGoの精度が高くないの以外だった
Hugoの改善
Hugoの改善 Hugo単体のバージョンアップ aptでインストールできるバージョンが古いので手動でインストール 参考→ https://gkzz.dev/posts/hugo-installation-on-ubuntu/ wget https://github.com/gohugoio/hugo/releases/download/v0.140.2/hugo_0.140.2_linux-amd64.deb sudo dpkg -i hugo_0.140.2_linux-amd64.deb hugo version tagページとsearchページの追加 config.ymlに以下を追記 - identifier: search name: search url: /search - identifier: tags name: tags url: /tags/ iframeの表示 config.ymlに以下を追記 markup: goldmark: renderer: unsafe: true グラフ goat記法が使える https://github.com/bep/goat 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
t_wadaさんが後世に残したい実録レガシーコード改善
2024/01/15 youtube 録画 イベント情報 実録レガシーコード改善 twadaさん(和田卓人さん) チャット実況してほしい スクショOK 講演の背景 以前実施した講演の改訂版 前回の講演が映像に残っていないので残したい 2018年に実際に行った受託開発 プロダクトオーナー許可済み コードは本物を使用 技術が2018のものなので若干古い シナリオ スマートスピーカーの開発(都道府県クイズ) ...
Go_prog_forkwell_27
Go言語プログラミングエッセンス - Forkwell Library#27 イベント内容 動画アーカイブ モデレーター 渋川さん Go 言語で楽しくなるシステム開発 自己紹介 mattnさん Go言語プログラミングエッセンス著者 Google open source expert Go歴 13年 Software Design nostrの連載 概要 簡単な説明 特徴 Explicit is better than implicit 非同期プログラミング 最新のGo Goについて C言語の構文を意識しつつ、簡単な文法でコーディングできる すでにいろんな会社で利用 プログラミング環境を改善する目的 C言語を設計した世界的エンジニアで知られる人が関わっている Unixらしさ 使用例 CLI Webサーバー バックエンド 広告配信 ハードウェア制御 機械学習 特徴 静的型付けコンパイル言語 スタティックバイナリ C言語風でありながら、GC 非同期を簡単に扱えるランタイム Explicit is better than implicit 曖昧より明確のほうがいいよね RobPike氏が良く言うこと ex) error ハンドリング Goは例外を扱わない result typeを扱わない errorが返ってきたら処理する Goでバグを生み出さないコツ すべてのerrorを明示的に対処し暗黙をなくす deferをうまく使うことでエラーを減らす errorを受け取ったら、処理を中断し、呼び出し元へ返す →必然的にearly return Goが優先したもの 読みやすさ 声に出して読めるくらい 学びやすさ 開発者が明示的に処理を中断させる 予約語を増やさない 複雑さを減らす 開発者が意思決定するプログラミング 非同期プログラミングの良さ ハードウェアが高性能化 非同期は難しい Goの仕組み goroutine channel リレーのバトンのようなもの 気をつけること 並列と並行は違う スレッドを増やすプログラミング言語 CPUコアに固定されない。空いたコアが次を担当する CPUコアを有効に活用する C言語でやると難しい コンテキストスイッチのコストが発生してしまう Goのスレッドは軽量なので、多く使っても大丈夫 スケールに対応しやすいのでクラウド向き go 1.21でくるもの min/max 数値、文字列など 実装するとinterface{}をつかうとコンパイルで気づけない clear mapやスライスを空にできる スライスの長さが変わらない 配列はできない loopvar まだ仮 検証中 並列で動かすときに、ループ変数が回り終わった状態で参照していしまうのの対処 pgo コンパイラによるプロファイルベースの最適化 pprofの結果からホットパスをインライン化する pprofの結果を読み込んでbuildすると最適化 slog 構造化ログを出力できるように ログレベルも設定 スレッドセーフ 出力先変更可能 グルーピング maps 型パラメータを使ったmap操作関数 genericsができたので key一覧、value一覧をとることができる Slices slice処理をかける delete, insert, reverse, binarySearch, contains wasi wasmの実行環境がブラウザ依存だった wasmを読み込んでgoで直感的にできるように 標準ライブラリにほぼ対応 利用できない/システムコールが必要なおの net/http os エッジコンピューティングがしやすくなる (youtubeアンケート、職務内容) ...
エンジニアの処方箋 #1 〜エンジニアのメンタルヘルスを考える〜 視聴メモ
エンジニアの処方箋 #1 〜エンジニアのメンタルヘルスを考える〜 イベントURL 3/7に実施されたイベントの録画を視聴した 動画URL エンジニアのメンタル不調対策 榎本 純也氏 https://twitter.com/ej_appdate メンタルヘルスはエンジニアにも必要となる知識 ...
AWS Tech talk Night#5
AWS Tech talk Night#5 クラウドネイティブ時代のエンジニアが押さえておきたい ソフトウェアの構築・運用で考慮すべき5つのポイント AWSプリンシパルエンジニアの技術記事をソリューションアーキテクトが解説 1/25にZoomウェビナーで実施された、AWSのイベント イベントURL 概要 AWS Japan 千葉さん ...
実用Go言語 Forkwell Library #7
実用Go言語 Forkwell Library #7 基調講演 #Forkwell_Library 3人の著者による発表 渋川さん Honda DeNA FutureArchitect 趣味 インラインスケート 辻さん 渋谷区の公務員からフューチャー 趣味 競技プログラミング、筋トレ 真野さん 新卒でフューチャーで13年くらい フューチャーのかるい紹介 ...
Docker×Goのマルチステージビルドで必要になるcgoのオプションについて
Docker×Goのマルチステージビルドで必要になるcgoのオプションについて 背景 Dockerfileでマルチステージビルドの構築をしていたが、DockerImageのビルドに成功するも、docker runでエラーが出て動かなかった FROM golang:1.18 as builder WORKDIR /go/src/ COPY . ./ RUN go mod download RUN go build -v -o server ./cmd FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /go/src/server ./ EXPOSE 8080 CMD ["./server"] エラーメッセージ ...
Fabric_subprocess
Python2で使うfabricとsubprocessはエラーハンドリングに気をつける Fabricは、アプリケーションのデプロイやシステム管理のタスクのためにSSHの利用を簡素化するためのPython2系のライブラリとコマンドラインのツール fab {method}でコマンドラインスクリプトで呼び出しができる Pythonのsubprocessはサブプロセスを起動するためのモジュール。python内からコマンド実行するのに使う この2つの組み合わせでのエラーハンドリングには気をつける fab_test.py from fabric.api import local def hello(): local("exit 1") cmd.py ...
Grpc
grpcチュートリアルメモ https://github.com/ymmt2005/grpc-tutorial Remote Procedure Call リモートで呼び出しする手順 gRPC Googleで開発された多言語間のRPCを実現するプロトコル 多言語対応であることが特徴 IDL(interface definition language) ...