カミナシ エンジニアブログ

株式会社カミナシのエンジニアが色々書くブログです

Go の検索結果:

カミナシはGo Conference 2023にスポンサー参加します!

Gopherの皆さん、こんにちは! カミナシのHRでエンジニア担当している木村です。 来る2023年6月2日金曜日にGo Conference 2023が開催されますね。 カミナシはシルバースポンサーとして参加させていただきます! Go Conference 2023 今回もオンライン開催となりますが、オフィスアワーでカミナシのブースを出させていただいています! ブース内ではテーブルを2つ設けており、カミナシのソフトウェアエンジニアが常時2名以上おりますので、ぜひお気軽にお声…

技術的負債になりかけていた機能をリアーキテクティングしたら、めちゃくちゃ改善した話

…アプリケーションは Golangで実装されておりgoroutineで変換処理を並列化していました。 正直な話をすると、当時の技術選定について知る方がおらず、このアーキテクチャの意図や背景はよくわかっていませんでした。 設計当初のアーキテクチャ 問題1 タイムアウト問題 このアーキテクチャで最初に起きた問題は、CodeBuildがタイムアウトするという問題でした。 1回のバッチで処理する件数は利用者側の設定に依存するため、利用者のニーズにあわせて変動します。 そのため月末月初の…

開発の作業状況を見える化。Jira + GAS + Slack Botで作業の透明性を高める仕組み作り

…ださい。 docs.google.com このシートのうち、「JIRA Master」のシートにはプロジェクト内にあるJiraチケット群を一括で取得する必要があります。 2. Jiraプロジェクト内にあるチケットを一括で取得 今回Google Workspace内にある以下の拡張機能を用いて、Jiraチケット群を一括で取得していきます。 workspace.google.com こちらの拡張機能を入れることにより、Jira上のチケットを定期的に処理を走らせデータを最新の状態に…

Goでスタイリッシュにエラーをラップする方法を学んだ

Go

… です。 つい先日、Goで有名な@tenntennさんがConnpassで募集していたGopher塾#2に参加させていただきました。 tenntenn.connpass.com 大変勉強になりおすすめです!筆者が参加したのは第一回目ですが、二回目三回目と予定されているようなので、有料講義ではありますが気になる方はぜひ参加してみてください!学生さんであれば無料の抽選枠もあります。 その際に紹介されていたコードで、エラーのラップ関数があったのですが、これが「メッチャアタマイイ!!…

初参加して学んだ AWS re:Invent の過ごし方 〜やって良かったこと・やれば良かったこと振り返り〜

…5f0g— Shingo 吉田真吾 (@yoshidashingo) 2022年12月1日 かなりの距離を移動することになるのでスニーカーなど歩きやすい靴にするのはもちろん、荷物も最小限にしておくのが良いです。 荷物が多いと移動及び待機時の足肩の負担になったり、大きな会場では手荷物検査もあるので荷物が大きいとそれだけチェックが大変になるためなるべく最小限のコンパクトなリュックなどで挑んだ方が良いです。 (筆者は初日バタバタしてとりあえず適当に荷物をリュックに詰めて行ったら手荷…

Goでダブルポインタを知った話

Go

…リズムやデータ構造、Goのキャッチアップしています。 そんな中、go.devのブログ Go blog のとある記事でダブルポインタを使用するコードに出会いました。筆者は今まで、RubyやJavaScript/TypeScriptなどの言語を多く触っていたためか、お恥ずかしながらダブルポインタを使うコードを初めて見たので「なんなのだこれは…」と戸惑いました。本記事ではそんなダブルポインタが使われていたコードについて、簡単にご紹介したいと思います。 そもそもダブルポインタとは? …

サーバサイド ( をメインでやっていた ) エンジニアが React Native と Expo でモバイル開発に入門した話

…スマホに Expo Go をインストールしてPCと同じWi-Fiに接続します。Androidの場合、Expo Goアプリを使用して、iOSの場合は、iOSのデフォルトのカメラアプリに内蔵されているQRコードスキャナーを使用してプロジェクトを開きます。 自分のスマホで動かしてみるのに必要なのはたったこれだけです。 めっちゃ簡単ですね。 また、Hot Reload に対応しているので、コードを変更すると即座にスマホ側に反映されます。 やってみた感想 僕の勝手なイメージで、モバイル…

【登壇資料】「BtoB SaaSにおける技術課題との向き合い方」 で「デスクレスSaaSが向き合う、現場DXのための技術課題」というテーマで登壇してきました。

…りましたので、現在はGoルーチンを利用して関連データを並行して取得するようにしております。 こちらも、アプリケーションの修正でなんとかなるレベルですので、DB構造の抜本的な見直しはまだ行っておりません。 今後、さらにアプリケーションやデータ量が大きくなるタイミングで全体的な改修を行いたいと考えております。 詳しい対応については過去のブログ記事で書いておりますので、よければそちらも参考にしていただけると幸いです。 kaminashi-developer.hatenablog.j…

Google Workspace カレンダーの大事っぽい予定に自動で色付けしてくれる GAS スクリプトを書きました

GAS

…です。みんな大好き Google Apps Script (GAS) の小ネタです。 TL;DR 業務で使っている Google カレンダーの 外部の方がいそうな予定 オフィスとかに出社が必要そうな(≒大好きな家から出なきゃいけなさそうな)予定 あたりに、自動で「色ラベル」を付けてくれるスクリプトを GAS で書きました。 以下のような感じで、いかにも他のと違って目立つよね!という感じに色を自動で付けてくれます。例えば僕のカレンダーだと、緑色のラベルを外部の方がいそうな予定(…

顧客企業のネットワーク構成によりReact Native + ExpoのOTAアップデートが動作しなかったのを突破した話

…App StoreやGooglePlayといったストアを経由せずにアプリのバージョンアップデートを配信する仕組みを指します。 通常、ストアでの審査を通すと審査を経る分待ち時間が発生しますが、OTAアップデートなら素早く最新バージョンのアプリを配信できるわけです。 事の経緯 一部のお客様で、ExpoのOTAアップデートしても最新バージョンのアプリが配信されていないという現象が発生しました。 「カミナシ」はtoB向けサービスであり、これまでの経験から、まずはMDM製品を導入してア…

Goのreflectパッケージを使って構造体の指定フィールドをゼロ値にしてみた

Go

…ーバーサイドの開発をGo言語で行っています。 社内用管理画面のAPIを実装をしていたところ、とある処理の中で「構造体の指定したフィールドをゼロ値にして処理をしたいな🤔」という場面に遭遇しました。利用している OR マッパーが SQL クエリを構築する際、構造体のフィールドがゼロ値ではないと自動的にそれらがクエリに組み込まれるという仕様であり、その仕様を回避したかったためです。もちろん、オプションでこの仕様を回避する方法は提供されていますが、既存のモデル構造体を変更することは出…

【登壇資料】弁護士ドットコム様 × カミナシ共催イベント「憧れのマイクロサービスと愛すべきモノリスの話」にてLTしてきました

カミナシ・エンジニアリングマネージャーの @dmi8a です。 先日行われた 弁護士ドットコム様 × カミナシ共催イベント「憧れのマイクロサービスと愛すべきモノリスの話」 にて「カミナシの開発組織の現在地 〜個人集団からチーム化へ〜」というタイトルで発表してきました。 概要 「カミナシ」というサービスは、その名の通り、様々な紙の帳票を無くす効果がある(デジタル化する)サービスですが、 それだけではなく、紙の帳票を使って行われる様々な業務フローまでをもデジタル化するサービスです…

GORM で出力されるログの SQL と実行される SQL が違った話

… コード読んでみた go-sql-driver/mysql のコード GORM のコード まとめ きっかけ 現在、カミナシの開発では、サーバサイドの言語は Go 、ORマッパーとして 「GORM」 を使い、DB には Amazon Aurora MySQL を使っています。 ある日、開発中に GORM が吐いてくれるログで query を調べていると、アプリケーションの実行中は結果が取れていないのに、その query をコピーして、手動で MySQL に投げると結果が取得でき…

0=>1フェーズの技術的負債を解消する第一歩@バックエンド編

Go

…います! 開発環境 Golang: 1.16 Amazon Aurora MySQL 5.x系 Gorm: v1.9.16 Datadog APM 要約 パフォーマンス劣化しているエンドポイントの全体を見直しました 処理フロー for文で毎回Insert処理していないかの再確認 処理順番が適切かどうかの再確認(機能追加でサッと追加してしまっていないか、まとめて処理できないかなど) Gorm(ORM)の見直し Preload 便利だがすべて一つずつSQLを発行するため、一つが早…

ECSタスクで1時間おきにRDS Auroraのスナップショットを取得する

…はバックエンド開発にGolangを利用しており、私を含めPython or Node.jsに長けたエンジニアがあまりおりません。 過去にAWS SAMを利用した記事を書かせていただいたとおり、それらを利用してGoでも書けなくはないのですがやはり手間がかかります。 現時点でAWS SAMを本番運用している実績もないことからこの案も見送りとしました。 案3) AWS ECSタスク 最終的に検討した案がECSタスクの利用です。 ECSタスク(Fargate)はプロダクトのAPIサー…

multipart/form-data形式のファイルが突然アップロードに失敗する問題を仮説を立てながら解決する話

…こちらへ 開発環境 go - v1.16 echo - v3.3.10+incompatible aws-sdk-go - v1.42.46 Mobile ( React Native + Expo ) 問題の確認 @dmi8a さんが予め調査をしており、以下の共有を受けました。 AWS S3にファイルアップロードする際に UploadWithContext メソッドを使っていて、ここでエラーを出力している。 S3 UploadWithContextに関する調査は行い、Par…

【登壇資料】Go Conference 2021 Autumn に登壇してきました

…です。 先日行われたGo conference にてgoldスポンサー枠にて登壇してきました。 gocon.jp kaminashi-developer.hatenablog.jp 本日は、その際のカミナシ側の登壇資料を紹介します。 発表趣旨 カミナシではバックエンドのAPIサーバーの開発にGolangを利用しております。 カミナシからは「ノンデスクワーカー向けノーコードサービスのつらみ・うまみ」というタイトルにて、 デスクレスSaaSというあまり前例の無いサービスにおいてG…

Go Conference 2021 Autumn に "Go"ld Partners として協賛・登壇します!

…PIサーバーの開発にGolangを利用しております。 (Goの採用に関しては過去のこちらの記事もご覧いただけると幸いです) Go Conference に "Go"ld Partners として協賛させていただけることとなりました! OSSの恩恵を受けプロダクト開発をさせていただいている弊社ですが、この度Go Conference 2021 Autumn に "Go"ld Partners として協賛させていただくこととなりました! gocon.jp gocon.jp カミナ…

インフラ未経験エンジニアがGCPで爆速構築する奮闘記

…を作成 cloud.google.com ※Githubの連携は共通アカウントを利用しましょう!個人アカウントだと予期せぬ問題になりますからね 導線が出来た後はBuildやCloud RunへのDeployを cloudbuild.yaml に追加してDeployできました。 (APIを有効にしたり権限周りで出来ないことはありましたが…) FirebaseにDeploy WebアプリケーションのDeployはFirebaseを利用して、公式ドキュメントを見ました。 cloud…

【GORM】V1からV2へアップグレードにチャレンジした話

…ョンのバックエンドはGoでDBアクセスライブラリはGORMを使っています。 サービスリリース時からGORMを使っており、V1からV2にすることでパフォーマンス改善につながると思い、アップグレードにチャレンジしました。 色々詰まるところがあったので、共有を含めて何をやったのか書いてみます! 結論 早速結論ですが… GORM V2へのアップグレードは現時点で保留となりました... 保留にした理由は以下の通りです。 V2で仕様変更になった関数が多く影響範囲が広い V2で廃止された関…

PMの自分が如何にユーザーの声をエンジニアの共通言語へ変えたか

…「身銭」なのだ! 『Google×スタンフォード NO FLOP! 失敗できない人の失敗しない技術』 アルベルト・サヴォイア 著 石井 ひろみ 訳 サンマーク出版 身銭というものは、お互いの本気で取り組むための制約です。 作り手と受け取り手のどちらもが目の色を変えていく必要があり、それは身銭によってより良い緊張感が生まれます。 なのでプロダクトを作りきる前に、アイデアや仮説から作ったプロトタイプを提げて売りに出します。 ここはデザイナーの力を借りて、アイデアを形にしていきます…

GolangでのAPI GatewayとLambdaを利用した認可設定をやってみる

…すが、サンプルを元にGolangでLambdaオーソライザーの関数を作成した場合、 IAM policyを作成する箇所でユーザー毎にアクセスできるリソース(パス)を制御することができます。 具体的には events.APIGatewayCustomAuthorizerResponseを作成している箇所で、 events.APIGatewayCustomAuthorizerPolicyの Resource で、ポリシーを付与されたユーザーはここに記載されているパスにのみアクセス…

【Expo Go】アプリケーションがクラッシュして解決するまでの話

…ナシでは『Expo Go』を使ったアプリケーションの開発を行っており、急にアプリケーションがクラッシュしてしまい解決に至るまでの話をしてみようと思います。 突然クラッシュするアプリケーション まずはこちらをご覧ください。 gyazo.com ローカル環境でExpoを起動した後、iPadでQRコード読み込んでアプリケーションが起動する間もなくクラッシュしています。始めは古いキャッシュでも残っているのかな?と思って、再起動やアプリケーションの削除を行いましたが、この事象は直りませ…

AWS SAMを利用してAPI GatewayとLambda Authorizer(Golang)の構築をやってみた

…ku です。 前回、GolangでLambda Authorizer用関数をやってみましたが、 Golangはコードエディタが使えず、テストするには毎回zipで固めてアップするという一手間がありました。 kaminashi-developer.hatenablog.jp そんな中、先日「AWS SAMを使うとAPI Gateway等とまとめて作成できるので便利だよ!」という話を伺ったので今回使ってみることとしました。 AWS SAMとは aws.amazon.com YAML…

BtoB SaaSスタートアップのインフラの失敗と選択の歴史を登壇の中で暴露してきました

…ろです。 docs.google.com 自前でコードを書くのもいいのですが、こういう選択肢もあると知っておくといざという時にさっと使えていいですよね。 実際インフラ移行までの期間が1ヶ月半と限られた中ではあったので、1週間くらいで環境を整えられたのもツールを駆使出来たからこそだと感じます。 クリスマスLock Waitボムの投下 クリスマスに投下されたLock Waitボムでしたが、垂直スケールとDead Lockの解消で血を止めました。 実は今回に限らず、これまでにもgo…

RDBMSの先を行く?NewSQLを支えるアルゴリズムRaftをGoで紐解く

… { // ... go r.run() return r, nil } func (r *Raft) run() { for { select { switch r.getState() { case Follower: r.runFollower() case Candidate: r.runCandidate() case Leader: r.runLeader() } } } func (r *Raft) runFollower() { for { select { …

開発環境で送信したメールを確認するためにMailHogを導入しました(勝手に)

Go

…開発が捗りました。 Golangでもメールが送信されたかを確認する方法を探してたらMailHogというツールを見つけたので、とりあえず導入してみました。(勝手にプルリクを出した) 導入方法 導入はとても簡単で、 公開されているDockerイメージでコンテナを作成する アプリ側のメール送信先のSMTPサーバーを変更する この2点だけです。 Dockerコンテナの作成 Docker Hubに公開されているイメージを使います https://hub.docker.com/r/mai…

【Golang】で【Amazon API Gateway Lambda オーソライザー】と【FirebaseAuth】を利用しての認証をやってみた

…ーソライザー関数 をGolangで作成 としてますので、ご興味ある方はご覧いただけますと幸いです。 Amazon API Gateway Lambda オーソライザーとは 詳細な説明は公式へ役割をお譲りしますが、概要としては以下の通りです(公式より引用) Lambda オーソライザー (以前のカスタムオーソライザー) は、Lambda 関数を使用して API へのアクセスを制御する API Gateway の機能です。 以下も公式より引用させていただいた図が分かり易いのですが…

NoSQLで悩ましいインデックスとアクセス権限管理を、Firestoreのサブコレクションで実装する

…storeについて Googleが提供しているNoSQLのマネージドサービスです。 他のNoSQLと比較してWeb, Mobileからローカルデータベースのように利用できることやデフォルトで単一フィールドのインデックスが作成されていることが特徴です。 データ構造 今回はチャット機能のデータを考えてみます。 登場人物は以下になります。 ユーザー チャットルーム 投稿(コメント、画像を含む) チャットルームには2人以上のユーザーが参加することができます。 チャット機能のデータ構造…

【Golang + Excelize】Excelファイルを操作してみよう

…penOffice、Google スプレッドシート、Numbers は、いずれもExcelとの互換性を保っています。 互換性を保っているということは、脱Excelが非常に難しくユーザーから互換機能を求められていると思います。 サービスを提供する側としても、Excelをサポートをしないと利用ユーザーの体験が悪くなり、最悪の場合はチャーンする可能性もあります。 『カミナシ』はアプリで作成したデータをExcelに出力する機能を提供しています。その際に利用したパッケージの紹介と、簡単…