TECH PLAY

株式会社ユーザベース

株式会社ユーザベース の技術ブログ

479

こんにちは、SaaS Productチームの比嘉です。 私たちSaaS Product チームは常日頃からペアプログラミングを行っています。 チームペアプロの細かい流れは過去に鈴木さんが紹介しています。 tech.uzabase.com そんな中、あるときエンジニアの友人から質問されました。 「ペアプログラミングではいつコードレビューするの?」 話を聞いてみると、その会社ではペアプロを導入し始めたのですが、従来から行なっているコードレビューと役割が重複していることに気づいたそうです。 そこで今回はペアプログラミングとコードレビュー*1について書いてみようと思います。 時世を鑑みてリモートペアプ…
アバター
こんにちは、ユーザベースのProductチームでSREをやっています阿南です。弊社ではKubebrnetes + Istioを利用してサービスメッシュの構築、マイクロサービスの運用を行っています。Istioでは sidecar proxyとしてEnvoyが利用されていますが、このEnvoyをFront Proxyとしても利用できないかと思い、よく使われる設定について調べてみました。下記目次です。 EnvoyをFront Proxyとして利用するメリット Envoyのバージョン Front ProxyのためのEnvoy Configuration 80(HTTP),443(HTTPS)でアクセス…
アバター
こんにちは。SPEEDA 開発チームの old_horizon です。 JVM アプリケーションの運用について回るのが、OutOfMemoryError (以下 OOM) への対処です。 しかし実際に発生した際に、適切なオペレーションを行うのは意外と難しいのではないでしょうか。 特に本番環境では、まず再起動して復旧を急ぐことも多いかと思います。しかし、ただそれを繰り返すばかりでは原因がいつまでも特定できません。 今回は Kubernetes で運用する JVM アプリケーションに対して、ダウンタイムを抑えつつ調査に役立つ情報を自動的に収集する仕組みを構築してみたいと思います。 環境構築 OOM…
アバター
こんにちは。SPEEDA開発チームの佐藤です。 今回はAndroid Studioに入門しようということで、 初心者向けに簡単な使い方から、今回は主にUI部品・レイアウトについて紹介したいと思います! Android Studioとは? 初期プロジェクト作成 動作確認の方法 レイアウト LinearLayout RelativeLayout UI部品 おわりに Android Studioとは? JetBrains社のIntellJ IDEAをベースとしたAndroidアプリ開発のための統合開発環境で、 Windows、Mac、Linuxなど複数の環境向けに用意されています。 まずはAndro…
アバター
今日は。 SPEEDA を開発している濱口です。 前回の続きです。趣旨も同じ。 『オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方』のサンプルコードを Ruby から Smalltalk に翻訳しながら読み進めることで、ただの写経をアクティブな学びにし、 いろいろな道草、発見をしながら楽しもう、というものです。 前回も触れましたが、やはり自分のコードとクラスライブラリの境界が無く、よいお手本がすぐに手に入るのがよいです。 わざわざドキュメントを紐解いたり、ググる必要がほぼないのですね。 Smalltalk 環境で完結します。 シンプルです。 Le…
アバター
はじめまして、昨年の12月に入社しました根岸です。 UZABASEに入社する前はフロントエンドエンジニアとして働いており、ここ1年間くらいはReactとTypeScriptの開発ばかりやっていました。 今回はフロントエンドのコンポーネントを設計するときに気をつけていることについてまとめます。 対象読者 Propsの名前に一貫性をもたせる 標準DOM要素と同様の役割を持つコンポーネントのpropsは標準DOM要素に合わせる レイアウトをコンポーネントに切り出す インタラクティブな部分もコンポーネント切り出す 単一責任を意識してコンポーネントを作る propsを増やすことでコンポーネントのバリエー…
アバター
初めて会社のブログに書きます。SPEEDA事業でCTOをしている林です。 TDDをこよなく愛する身として今日はDartでTDD、そしてテストの独立性を担保していく上で欠かせないMockライブラリーのMockitoについて書こうと思います。 Mockitoとは 今回Mock化するクラス 事前準備 Mock用クラスを定義する 振る舞いを定義する 振る舞いを定義する(Future、Streamの場合) 検証する 検証する(回数チェック) 検証する(引数チェック) 検証する(呼び出し順序) Fakeクラス 出来ない事 まとめ Mockitoとは Dart開発チームが作成している公式Mockライブラリー…
アバター
今日は。 SPEEDA を開発している濱口です。 理屈編では、まずリレーショナルデータベース(以下、RDB)の論理設計やその後において、 正規化ルールを運用する難しさについて述べました。 主な要因として、 例えば正規化を一度完了したテーブルに対し SELECT した結果もまたテーブル*1、 つまりは正規形であることが求められるため、 SELECT するたびにいちいちその結果について、 「第 n 正規化についてクリアだな…次に第 n + 1 正規化についてはどうかな…」などと、 ルールに当てはめてチェックしなければならないことを挙げました。 リレーショナルモデルの世界で、常に正しい処理結果を得る…
アバター
こんにちは。SPEEDA 開発チームの緒方です。 システムをマイクロサービスで構成するメリットのひとつに、採用する技術にバリエーションを持たせることができるという点が挙げられると思います。 実際、SPEEDA でも様々な言語・フレームワークを利用してマイクロサービスを開発しています。 その中でも Kotlin はかなり多くのプロジェクトで採用されている言語です。 Kotlin で利用できるフレームワークと言えば Spring Boot など Spring 系のものが真っ先に思い付くと思うのですが、本当に小さな API を作りたい場合には少し大袈裟すぎる気もします。 今回はそういう場合に手軽に使…
アバター
はじめに はじめまして、UZABASE SPEEDA SREの鈴木(@sshota0809)です。 今回は、Sealed Secretsを利用したKubernetesのSecretリソースをセキュアに管理する方法を紹介します。 はじめに TL;DR Sealed Secretsとは 概要 アーキテクチャ インストール〜リソースデプロイ インストール Secretリソースのパース Kubernetesクラスタへのデプロイ おわりに TL;DR KubernetesのSecretリソースはBase64の形式にエンコードされるため、エンコードされた内容が確認できれば簡単にデコードできてしまいます。 …
アバター
今日は。 SPEEDA を開発している濱口です。 アプリケーションデータの永続化を担うデータストアには様々な選択肢があります。 その1つとして、リレーショナルデータベース(以下、RDB)がありますが、 RDBを選択した場合、データの容れものとしてリレーショナルモデルを選択した、という表明になります。 ひいては、このモデルを正しく使用することが生産性の観点から必要となります。 (明白な設計によるコミュニケーションや制約によるデータ不整合の回避など) その方法の1つとして正規化ルールがあります。 正規化ルール遵守は有効か 「あたりまえ」と軽視されがち 「設計時のみに発生するタスク」という誤解 正規…
アバター
はじめに はじめまして、2019年11月に入社しましたヒロオカ(@yuya_hirooka)です!! 先日、同僚との雑談の中でQuarkusのNative Image化が話題に挙がりました。その際に「そういえば、GraalVMとかNative Imageってよく聞くけどあまり知らないなぁ...」と思い色々と調べてみたのでまとめます。 この記事ではGraalVMの中核技術の概要を把握し、簡単にその機能を使ってみることをゴールとします。 はじめに 前提知識 GraalVMとは Polyglot Native GraalVMの中核技術 Graal Truffle GraalVM Native Ima…
アバター
今日は。 SPEEDA を開発している濱口です。 前回はテスト駆動開発(TDD)を習得するためのハンズオンを行いましたが、今回はオブジェクト指向設計(OOD)です。 SPEEDA は複雑なビジネスロジックから成っており、開発では複雑で多くのコミュニケーションが発生します。 開発チームでは gauge などのツールを使い e2e テストが仕様を語るようにしたり、ペアプロを徹底したり、すべてが流れるようにしたり...等々の様々な工夫を行っています。 コードや設計もコミュニケーションのひとつだと捉えると、実際に開発で発生するコニュニケーションの比重の中では大きな割合を占めるものだということを感じてい…
アバター
こんにちは。SPEEDA開発チームの上村です。 先日同僚が書いたElixirのコードを眺めていた際に、とあるバッチ処理内でback-pressureを用いてAPIサーバを優しく呼び出している処理を見かけました。 そのコード内で用いられていたライブラリを調べてみるとなかなかに面白かったので折角なので今回まとめてみました。 本エントリでは、APIサーバを優しく呼び出すことを「APIサーバが過負荷にならないくらいの負荷で呼び出す」と定義し、それを実現する方法の1つとしてElixir製のライブラリであるFlowを用いたback-pressureの手法について述べていきます。 Flowとは GenSta…
アバター
今日は。 SPEEDAの開発をやっている濱口です。 SPEEDA開発チームではテスト駆動開発(TDD)、ペアプログラミングを徹底しています。 だからなのか、『テスト駆動開発』はすごく楽しく読めました。 今回ハンズオンを行った「第I部 多国通貨」でも、ペアプロをしながら著者が語りかけてくるような感じで、 読者側も、著者の意図をひとつずつ理解しながら読み進めていけるようになっています。 有意義なハンズオンを、より有意義にしたい 古くてあたらしい言語(環境)、Smalltalkにふれたい Smalltalkでは、わりと忠実な写経が可能だった Javaのコンストラクタのような特別なメソッドが無い イン…
アバター
こんにちは、SPEEDA開発チームの @tkitsunai です。 最近リリースされたプロダクションコードにようやくGo言語が採用されました。嬉しい。 今回はGo言語でオブジェクト指向プログラミングで型表現についてのテクニックや考え方の基礎を紹介します。もっとGopherが増えて欲しい! 対象読者 型を定義する 型で厳格さを作り、その型を洗練させる 改良1: プリミティブ型をなくす 改良2: Unitの特性を型で表現する 型に厳格さを求める完全コンストラクタを活用する ファーストクラスコレクションと型定義によってメンバーに対する操作を制限する 列挙型で表現力を高める 構造体埋め込みで表現をする…
アバター
はじめに SPEEDA PDT歴3ヶ月の相川です 今回はJavaを2年くらい書いていた私が、3ヶ月間で感じたKotlinの特徴を列挙していこうと思います はじめに Kotlinの特徴 型推論について データクラスについて nullable 検査例外の話 returnを明示的に書かなくても良い 拡張関数と拡張プロパティ 拡張関数 拡張プロパティ リスト操作の評価について coroutineの話 まとめ Kotlinの特徴 型推論 データクラス nullable 検査例外の話 returnを明示的に書かなくても良い 拡張関数 リスト操作の評価について kotlin corutine 型推論について…
アバター
こんにちは!SPEEDA開発チームの工藤です。 大分時間が開いてしまいましたが、Gaugeシリーズの第四回目です。 今回はe2eテスト書く際には必須であろうSet Up/Tear Down Stepsを、Gaugeではどのように実現できるのかをSPEEDA開発チームでの実例も交えてお伝えできればと思います。 過去3回分の記事はこちらから↓ Gauge Test Automation Toolとアジャイル開発 GaugeのConceptを用いてテストシナリオをより仕様書のように記述する GaugeのParameterを使いこなす GaugeにおけるSet Up/Tear Down Stepsの実…
アバター
KotlinのCoroutineを用いた,外部API呼び出しの並列数を指定できるライブラリを作成した話 背景 本記事の内容 Coroutine Coroutineの作成方法 中断が可能な計算インスタンス [1] 特定のスレッドに束縛されない Channelとは ParallelExecutorについて まとめ KotlinのCoroutineを用いた,外部API呼び出しの並列数を指定できるライブラリを作成した話 ユーザベースインターンの原田です.大学院で研究しながら京都でユーザベースのインターンをさせて頂いており,今回初めてブログを書かせて頂きます! 題名にある通り,今回KotlinのCoro…
アバター
こんにちは。SPEEDA開発チームの冨田です。 昨今のフロントエンドでは、Fluxというアーキテクチャが利用されることが多くなってきています。SPEEDAでもVueを使っている画面がありますが、そこではVuexというVue向けのFluxライブラリで状態管理をしています。 Fluxではデータの流れを一方向にすることで見通しのよい設計が行えるようになります。 今回は、素のReactを使ってデータの流れを単一方向にする設計を紹介します。 今回作ってみるもの セットアップ 1. GettersとActionsをつくる 2. GettersとActionsをどこのコンポーネントからでもアクセスできるよう…
アバター