ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

Product Leaders Week 2024 に Bronze Sponsor として協賛します!

こんにちは。ユニファで開発組織副本部長を務めているやまぐち(@hiro93n)です。主にプロダクトマネージャーとデザイナーの部門を管轄しています。

10月22-24日に開催されるプロダクトマネジメント系カンファレンス Product Leaders Week 2024 にBronze Sponsor として協賛させていただけることになりました!

続きを読む

オンボーディングスケジュールを整備した話

こんにちは、ユニファQA課のえりです。

今年の3月に入社して、あっという間に7か月が過ぎ去っていきました。

今回は私がユニファのQAチームに参画して取り組んだものの1つ、オンボーディングスケジュールの整備ついて書きたいと思います。

続きを読む

QRコード打刻(β) のフィジビリ検証の話

こんにちは。ユニファPdMの武岡です。 ルクミーでは登園降園時の打刻を扱うプロダクトとして、ルクミー登降園を提供しています。 先日、ルクミー登降園の新機能として、QRコードで登園降園時の打刻ができる「QRコード打刻(β)」をリリースしました。

「QRコード打刻(β)」では本開発前にフィジビリ検証を行いました。 このフィジビリ検証で確認できたことは多く、本開発前に実施して非常に効果があったなと思ったので改めて振り返ってみます。

※QRコードは(株)デンソーウェーブの登録商標です。

  • 待望の「QRコード打刻(β)」は期待値も高かった
  • 「ストレスのない打刻」をめざす強い気持ちで検証へ
    • でも、検証項目、多いな
    • いざ打刻テスト
  • フィジビリ検証の効果
    • 効果1:「これは良いものができそうだ!」とフィジビリ開始序盤に社内で確信が持てた
    • 効果2:対応基準が明確になり、本開発時の判断に迷いが少なくなった
    • 効果3:画面外の論点が早めに整理・検討できた。
  • 手探りしながらなんだかんだで楽しんで進められた
  • ユニファでは一緒に働く仲間を募集しております

待望の「QRコード打刻(β)」は期待値も高かった

ルクミー登降園のQRコード打刻(β)は、園・施設様が管理するタブレット端末などのインターネットブラウザ上でWebカメラを起動し、園児毎に発行されたQRコードを保護者様がかざして打刻する仕組みです。

QRコードをかざす打刻画面

タッチ打刻の場合はクラスを選択して、園児を選択して、打刻ボタンを押す、という手順を踏む必要がありますが、QRコード打刻(β)の場合はかざすだけで打刻完了できます。 朝の忙しい時間帯やお迎えの延長利用が気になるタイミングで素早く、簡単に打刻ができるため、 園・施設様から長い間ご要望をいただいておりました。

開発においての一番の焦点は「QRコードでストレスなく打刻できるか?」という点でした。 出勤前で時間に追われる朝の登園時、延長料金発生する前に打刻したい夕方の降園時、 「とにかく素早く打刻したい⌛」「子供から目が離せないので、簡単な方法でお願いしたい👨‍👧」という保護者様の高い要求に応えなければなりません。 なんか遅い、、、かざしにくい、、、反応しなくなった、、、という状態は出来る限り避けたいところです。

通常のユニファのサービス開発は、要件整理→概算見積→スコープ決定→着手決済→外部仕様設計→画面デザイン(ワイヤー・デザイン)→開発→QA検証……と進むのですが、今回はスコープ決定の前に先に打刻機能のプロトタイプを作ってフィジビリ検証を行うことにしました。

続きを読む

How to Use Coroutine with Jetpack Compose

kotlin coroutine
Greetings! I'm Farhan, an Android Engineer.

In software development, keeping applications responsive is a key challenge. Asynchronous programming is an important technique that addresses this issue by allowing long-running operations such as network requests, data processing, or heavy computations to occur in the background. This concept is especially vital in mobile development, where a smooth user experience is crucial.

Jetpack Compose, is Google's modern toolkit for building native UIs on Android and simplifies UI development. Today we will learn How to use Asynchronous programming with Jetpack Compose.

What Are Coroutines?

Coroutines are a feature of Kotlin that simplifies asynchronous programming by providing an easier way to handle long-running tasks. They manage their own execution with the help of CoroutineScope and execute on specific threads facilitated by Dispatchers. A suspend function is a type of function in Kotlin that can be paused and resumed at a later time, making it perfect for tasks such as fetching data from the internet or accessing a database.

Why Are Coroutines Needed in Jetpack Compose? In any UI application, maintaining responsiveness is crucial. Blocking the main thread can lead to an unresponsive app and a poor user experience. Coroutines address this issue by allowing expensive operations to be offloaded to background threads, while the main thread remains free to handle user interactions.

How to Use Coroutines in Jetpack Compose

There are several ways to integratete coroutines in Compose, today we'll focus on two key concepts: LaunchedEffect and rememberCoroutineScope. These tools are most used to call coroutines efficiently from Compose screens.

LaunchedEffect

LaunchedEffect is a powerful Composable function that you can use to launch side effects (such as network calls) in your Compose UI. It takes a key and a lambda as parameters. The key is important because it determines when to stop the current task and start a new one if something changes during recomposition.

Here's how you can use LaunchedEffect in a practical scenario:

gist.github.com

LaunchedEffect is particularly useful for making API calls directly from a Compose screen setup or in response to changes in the UI's state that should trigger a new coroutine.

rememberCoroutineScope

While LaunchedEffect is suitable for scenarios where coroutines are directly tied to the composition lifecycle and specific recomposition keys, rememberCoroutineScope offers more flexibility. This function creates a CoroutineScope that is remembered across recompositions and is bound to the lifecycle of the Compose screen where it is used.

This is especially useful for triggering actions like showing a snackbar or updating UI elements in response to user interactions, which may happen multiple times and are not directly tied to the composition of the UI:

gist.github.com

Using rememberCoroutineScope allows for more dynamic interactions within your Compose UI, managing multiple coroutine launches based on user input or other events that don't correspond to the lifecycle of the entire composable.

Choosing the Right Tool

Both LaunchedEffect and rememberCoroutineScope are essential in their own contexts. Use LaunchedEffect for operations that should be tied directly to the composition lifecycle and specific recomposition conditions. On the other hand, use rememberCoroutineScope for more interactive or repeated actions within a Composable that can occur at any time during its lifecycle.

Conclusion

In this article, we've explored how LaunchedEffect and rememberCoroutineScope can be used in Jetpack Compose to manage asynchronous operations effectively. These tools help ensure that your apps remain responsive and handle tasks smoothly. LaunchedEffect is great for tasks linked to the lifecycle of your UI components, such as fetching data when a screen is displayed. rememberCoroutineScope, on the other hand, is ideal for handling user interactions and other dynamic events.For more in-depth knowledge, you can always dive into the official Jetpack Compose documentation. Happy coding!

unifa-e.com

テスト自動化ツールの検討をしている話


こんにちは、ユニファQA課の中村です。

みなさんはテスト自動化ツールというものをご存じでしょうか。
開発の現場でテストをされている方、開発エンジニアの方、それに関わる方々はご存じかとは思いますが、手動で行ってきたテスト工程(テスト設計、分析、実装、実施など)を自動で行ってくれるツールとなります。

テスト自動化ツールには、オープンソースのものから企業がサービスとして提供しているもの、ノーコード、ローコードと言われるほとんどコーディングを要さないものなどいろいろな種類があります。

  • オープンソースで代表的なツール:Selenium
  • 企業が提供しているツール:mabl、Autiy、MagicPod

ユニファでは、現在このテスト自動化ツールの導入を検討しております。
そもそもですが、私たちがテスト自動化ツールを検討し始めた背景・目的としては以下がありました

  • 限られた期間でリグレッションテストを実施したい
  • 不足したリソースの中でリグレッションテストを実施したい
  • リグレッションテストのカバレッジを上げたい

現時点でもリグレッションテストの工数自体は確保して実施していますが、やはりスケジュールやリソースが厳しい場面というのは発生するためそれを解消するために検討を開始しました。

今回は、私たちQA課のテスト自動化ツールの検討の過程を共有できればと思っています

続きを読む

SupabaseとResendを使ったメール送信の設定方法を紹介

こんにちは、サーバーサイドエンジニアの小川です。

この記事ではSupabaseとResendを使ったメール送信の設定方法について解説します。

趣味で開発しているアプリケーションで、DBやAuthenticationなどはSupabaseを利用しています。
元々はFirebaseを使っていたのですが、Supabaseの場合はDBにPostgresが使えるという点が魅力で乗り換えました。
ただ、Supabase Authenticationを使ったメール認証やパスワードリセットなどでメール送信するにあたり、カスタムSMTPの設定が必要でした。
設定しない場合1時間に6通までしか送信できないので、実運用は難しいです。
(どうやら、Supabaseのメールシステムをスパムとして利用するユーザーへの対策として上限を設けているようです)

では、早速本題に入ります。

続きを読む