RDS(MySQL)からBigQueryへのデータ同期

RDS(MySQL) から BigQuery へ1日1回データを同期して、データ分析やレポート系の処理で利用することになりました。 構成 以下の構成でデータを同期することにしました。 要件1: データの断面は合わせたい 元々はEmblukを使って直接同期しようと考えていたが、Embulkだとテーブル毎にデータを同期することになり、テーブルによってデータの断面が微妙にずれるため断念 CSV 形式でダンプして、Embulk で同期することもできそうだが、元々自動でスナップショットが取られているのでそれを利用することにした => スナップショットを parquet 形式で S3 にエクスポートすれば、BigQuery Data Transfer Service を使って BigQuery に取り込むことができるので、採用 要件2: コストを抑えたい 定額利用料がかかるサービスは使うことはで Continue Reading

Posted On :
Category:

go クリーンアーキテクチャでトランザクション管理

意外に情報が少なくて、何がベストかはよく分からないですが、メモがてら残しておきます。 ソースコードは以下で公開してるので、詳細を見たい場合は参照ください。 https://github.com/rinoguchi/microblog 利用している技術 言語: golang web framework: chi ORM: bun トランザクションの開始/終了 通常の Web APIでは1リクエスト1トランザクションが一番シンプルで分かりやすいので、リクエストとトランザクションのライフサイクルは同じにしたいです。 一つのAPIコールの途中で何かエラーが発生したら、全部ロールバックする形です。 この場合、controllers 層でトランザクションを開始/終了するのが良さそうです。 controllers 層の各ハンドラーにて、以下のような感じで実装するのが一番シンプルですが、同じ実装が何度も出 Continue Reading

Posted On :
Category:

go generateの使い方

go generate の使い方をメモ程度に残しておきます。 既存のRepositoryモデルを元に、RepositoryモデルをDomainモデルに変換するマッパーを生成するようなケースを紹介します。 フォルダ構成 ├── domains │ └── model.go # Domainモデル └── repositories ├── gen │ ├── gen.go # generator本体 │ └── mapper.tmpl # 参照するテンプレート ├── model.go # 参照するRepositoryモデル └── mapper.gen.go # 自動生成されたマッパー genフォルダ配下にgenerator本体を置くのは、go generate のベストプラクティス を参考にさせていただきました。 参照元のコード Repositoryモデル 今回はbunを使ってます。 im Continue Reading

Posted On :
Category:

Go+chi+GAEでクリーンアーキテクチャを試してみた

ちょうど、このブログとは別に自分用のマイクロブログを作りたいと思っていたので、Go+chi+GAEでクリーンアーキテクチャを試してみました。 この記事では、バックエンド(APIサーバ)部分について記載していきます。ソースコードも公開してますので、細かいところは直接参照ください。 https://github.com/rinoguchi/microblog 使う技術 バックエンドAPIサーバ 言語: Go 経験少なめなので慣れておきたい Webフレームワーク: chi DIツール: wire 実行環境: GAE(Google App Engine) Goが使える 1日あたり 28 インスタンス時間の無料枠がある Dockerイメージすら作らずに、アプリをデプロイ+公開できる データベース: supabase 500MBまで無料!個人利用なら十分 ※料金体系 中身は慣れ親しんだPostgreS Continue Reading

Posted On :

ローカル端末で実行中のフロントエンド/バックエンドアプリの現在日時を変更する

時系列が関係あるような機能の動作確認をする際に、現在日時を変更したくなるケースがありますが、OSの時間を変更するとちょっと怖いです。 ローカル端末上で実行中のアプリだけに日時を変更する方法を記載します。 フロントエンド React.jsやVue.jsなどで作っているWebアプリケーションの日時を変更したいです。 new Date() した際の日時を変更する mockdate というライブラリを使います。 まずは、ライプラリをインストールします。 npm install -D mockdate # or yarn add -D mockdate あとは、main.tsなど、アプリを起動する処理の直前に以下を指定します。 import MockDate from "mockdate"; MockDate.set("2022-06-29 19:30:00" Continue Reading

Posted On :
Category:

Goでwireを使って依存性注入(DI)する

Go では依存性注入(DI)のためのコードを自動生成するツールである wire が良く利用されるようでので、早速導入したいと思います。 チュートリアルを自分が今作っているマイクロブログに当てはめただけです。 DI導入前 導入前は以下のように、自前でインスタンスを生成して引数として渡していました。 func InitializeServer() *controllers.Server { commentRepository := repositories.NewCommentRepositoryImpl() commentUsecase := usecases.NewCommentUsecase(commentRepository) server := controllers.NewServer(commentUsecase) return server } これはこれでシンプルなのですが、 Continue Reading

Posted On :
Category:

oapi-codegenでchi用APIインターフェースを自動生成

Goでマイクロブログを作成中なのですが、OpenAPIで定義したAPIスキーマからoapi-codegenを使ってchi用APIインターフェースを自動出力することにしました。 使うモジュールは以下の二つです。 oapi-codegen v1.11.0 chi v5.0.7 APIスキーマ定義 まずはAPIスキーマをyaml定義します。 VS CodeでOpen API(Swagger) Editorという拡張を入れて編集すると便利です。 以下の二つのAPIの定義を書いてます。 post /comments コメントを新規作成する get /comments コメントを全件取得する api-schema.yamlというyamlファイルを作成しました。 難しい内容ではないので、説明は割愛します。 openapi: "3.0.0" info: version: 1.0.0 t Continue Reading

Posted On :
Category:

MySQLで外部キーが貼れない原因とCharsetについて

MySQLでテーブルの作成はできるけど、外部キーを貼ろうとすると謎のエラーが発生しました。 その原因を調べる上でMySQLのCharsetの設定について多少詳しくなったのでメモっておきます。 外部キーが貼れなかったエラー 今回、新しくテーブルを作って、既存テーブルに対して外部キーを貼ろうとしたところ、エラーが発生してダメでした。 エラーログ エラーログは以下の通りでした。情報が全く足りません。。。 ERROR 1215 (HY000): Cannot add foreign key constraint そのような場合は、以下のSQLを実行することでエラーの詳細を見ることができます。 show engine innodb status; 今回は、以下のログが出力されていました。 2022-05-18 10:27:06 xxx Error in foreign key constraint Continue Reading

Posted On :

AsanaでコードブロックをハイライトするChrome Extensionを作って公開した

残念ながらAsanaでは、コードブロックをハイライトする機能が提供されていませんので作って公開しました。 https://chrome.google.com/webstore/detail/asana-highlighter/lgofbppgpileldekmjbomfdodkhholna こんな感じで動作します。 ソースコードはこちらで公開しています。 https://github.com/rinoguchi/asana_highlighter 動機 現在所属している会社ではチケット管理にAsanaを利用しているのですが、Asanaにはコードブロックをハイライトする機能がありません。 機能開発やテックサポートなどをしていると、ソースコードをAsana上に保存しておきたいケースはそれなりにあり、ソースコードが良い感じにハイライトされてないと頭に入ってきません。とても嫌な感じです。 Asan Continue Reading

Posted On :
Category:

DjangoおよびDRFのチュートリアル

久しぶりに仕事で、pythonを触ることになったのですが、DjangoとDRF(Django Rest Framework)が使われていました。 ソースコードを一見して正直どこで何が行われているのか全くわからなかったので、チュートリアルを見ながら簡単なAPIを作成し、その後、DRFを使ってAPIを作り直してみて、勉強しようと思います。 Python: 3.10.2 Django: 4.0.3 DRF: 3.13.1 作成したソースコードは以下で公開しています。 https://github.com/rinoguchi/django_rest_framework Djangoで投票アプリ構築 まずは、DRFは利用せず素のDjangoのみで、チュートリアルに従って投票(polls)アプリを作ってみたいと思います。 環境構築 poetryを使って環境構築しました。 pythonの仮想環境を作って Continue Reading

Posted On :