JINSテックブログ
🐍

Fletでテイスティングノート管理アプリ作った①

2025/02/05に公開

はじめに

JINSに入社してもう3ヶ月が経ったようです。今年もよろしくお願いいたします。
ITデジタル部のいしざき(@ishizak1111)です。

1月はアメリカ🇺🇸とフィリピン🇵🇭に出張が決まっていたので、
正月はそれまでの間ゆったり実家でエンジニアリング餅つき...もといキーボードをカタカタついていました。
実家ってなんであんなに趣味プロが捗るんでしょう。💻

今回は趣味用のアプリを開発した話をします。

動機

私はウイスキー🥃やコーヒー☕が好きでよく飲むのですが、数日後には「どんな味だったっけ?」
と忘れてしまいがち。体調や飲み方、飲んだ回数によっても拾える味が変わってくるので一期一会を感じます。

手軽に写真とテイスティングノートを一緒に管理したい!というのが今回の開発の主な動機です。

数年前にスマホアプリ開発を趣味で挑戦したものの、そもそも”作りたいもの”が無くてモチベが続かなかった経験があります。今回は目的マターで再挑戦します!

ちなみにJINSは ONCA COFFEEというコーヒー屋さんも運営しています。
メニュー『KURO』は7種類の日替わりなので、色々な味が毎日飲めて楽しいです。

自分のコーヒーの好みは寒い日は深煎り、暑い日は浅煎り派です。アナエロビックやナチュラルが好き。

使ったフレームワークなど

正月の実家にいる期間で、いかに簡単に目的のアプリが作れるかを重視しました。

  • Flet (Python->Flutterに変換してスマホアプリ作れるらしい神)
  • SQLite (テイスティングノート保存用DB)
  • Pixel6 (デバッグ用Android端末)

できなかったこと

まず最初にできなかったことから。(大事)

FletでAndroidアプリを作る際、現状では端末上のファイルをアプリから読み込むことができないようです。2025年早々すっごい躓きました。
画像パスがうまく渡せてないだけっぽいので頑張ってみたけど、諦めました。

https://github.com/flet-dev/flet/issues/3763

DBのテイスティングノートを表示/再編集する画面は時間無くてできませんでした。
登録ページに気合い入れすぎた。。。共有コンポーネント残して別ページ作成はチュートリアルにもありそうなので、”やればできる”はず。

できたこと

作成した登録画面です。最初の印象と最後の印象がメモできるようにしました。
ここからテイスティングノートがSQLiteに登録されます。(画像のアップロードはできないけど)

コード(一部分だけ)

import flet as ft

def main(page: ft.Page):
    page.title = "Tasting notes app"
    page.adaptive = True
    page.appbar = ft.AppBar(
        title=ft.Text("Coffee & Whisk(e)y Tastes"),
        actions=[
            ft.IconButton(ft.CupertinoIcons.PLUS, style=ft.ButtonStyle(padding=0))
        ],
        bgcolor=ft.Colors.with_opacity(0.04, ft.CupertinoColors.SYSTEM_BACKGROUND),
    )

    def changeTab(e):
        print(e.control.selected_index)

    page.navigation_bar = ft.NavigationBar(
        destinations=[
            ft.NavigationBarDestination(icon=ft.CupertinoIcons.RECTANGLE_STACK_BADGE_PLUS, label="Add"),
            ft.NavigationBarDestination(icon=ft.CupertinoIcons.BOOK_CIRCLE, label="Notes"),
            ft.NavigationBarDestination(icon=ft.CupertinoIcons.CHART_BAR_SQUARE, label="Analyze", disabled=True)
        ],
        border=ft.Border(
            top=ft.BorderSide(color=ft.CupertinoColors.SYSTEM_GREY2, width=0)
        ),
        selected_index = 0,
        on_change = changeTab
    )

FletのPageクラスにどんどん追加していくだけで、良い感じに画面が構成されていきます。
すごく手軽に、どんどんそれっぽくなっていくので開発楽しかったです!!

flet run --android

を実行するとQRコードが出力されるので、それを端末で読み取ればFletアプリ上で確認できます。

今後やりたいこと

テイスティングノートから自動タグ付けしたい!
ということで、テイスティングノートから名詞や形容詞(〇〇っぽい、〇〇な〜)を抽出して自動タグ生成に挑戦しました。

今回は日本語自然言語処理ライブラリGiNZAのモデルを、spaCyというライブラリからロードして使用しました。
文章を入れるだけで良い感じに形態素解析してくれるので、あとはタグっぽくなるようにくっつけたり消したりするだけです。

import spacy

ginza = spacy.load("ja_ginza")
tasting_note = "まったりオイリーな質感。ドライフルーツのイチゴ、麦っぽさ。ハチミツ。余韻長め。"
doc = ginza(tasting_note)

latest_token = None
latest_pos = None
result = []

for sent in doc.sents:
	for token in sent:
		if token.pos_ in ["ADJ", "NOUN"]:
			if latest_pos == "NOUN" and token.pos_ == "ADJ":
				result = result[:-1]
				result.append(str(latest_token)+str(token))
			else:
				result.append(token)
			latest_token = token
			latest_pos = token.pos_


print("Tasting note:")
print(tasting_note)
print("tag:")
print(result)
$ python autotag.py
Tasting note:
まったりオイリーな質感。ドライフルーツのイチゴ、麦っぽさ。ハチミツ。余韻長め。
tag:
[オイリー, 質感, ドライフルーツ, イチゴ, ハチミツ, '余韻長め']

'質感'が入ってるのちょっと惜しい...タグブラックリスト作るのが一番正確かも。

テイスティングノート同士の相関出したり、コーヒーとウイスキーから同じ『好み』が抽出できたら面白いなーと思ってます。

何はともあれ、Fletで画像アップロードができるようになったら続きやります!(アプデ祈願)

ありがとうございました!

参考

JINSテックブログ
JINSテックブログ

Discussion