Streamlitの後継者を求めて②

# はじめに
お世話になっております。
猫ミームを見すぎて、X(旧Twitter)もYoutubeも猫ミームだらけになってしまい危機感を感じています。
さて、前回書いた記事をもとに`Reflex`、`Solara`、`Taipy`を使用して、Webアプリケーションを弄っていましたが、まったく理解できずに

僕「Streamlitしか勝たん。」

と心の中に住んでいるギャルがつぶやいていたところ、コメントで`Streamsync`というフレームワークがあることを教えていただきました。
Streamlitのパチモンか？と気になりながら、調べてみるとJuliaのGenieBuilderのようにGUIなどのコンポーネントをビジュアライゼーションで組み立てることができるとのこと。

気になったらやってみる精神のため、とりあえず触ってみたので、簡単にまとめたいと思います。

前回記事↓

https://qiita.com/inoshun/items/4f9075bbba47f7bb0570

# Streamsyncとは
フロントエンドはノーコード、バックエンドはPythonで。とうたってるようですね。
実際に、`streamsync toolkit`というGUIを組み立てるツールを用いて、自由にカスタマイズし、それらのコンポーネントに対して、Pythonで書いた内容を反映させる感じのようです。

https://www.streamsync.cloud/

まあ、実際に前回と同様にアヤメのデータセットを用いて、データフレームとPlotlyのグラフを表示させてみましょう。

# 書いてみた。
ドキュメントを見てみると、導入は以下のコマンドを実行するようです。

https://www.streamsync.cloud/getting-started.html

```
pip install "streamsync[ds]"
```
Python3.9.2以上に対応していると書いていますが、Python3.12.1ではインストールできませんでした。なんで？
Python3.11.3で試したところ、問題なく入りました。

以下のコマンドでは、デモアプリを起動できるようですね。
```
streamsync hello
```
今回はデモアプリの紹介は割愛します。
それではアプリケーションを作成していきましょう。
まずは、任意のディレクトリに移動して、以下のコマンドでアプリを作成して下さい。
```
streamsync create testapp
```
testappというフォルダが作成され、
- main.py
- ui.json
- static/　

が作成されるかと思います。
作成されたディレクトリに移動して、アプリを編集するためのツールキットを起動してみましょう。
```
cd testapp
streamsync edit testapp
```

---

起動すると、ターミナル上に

```
Builder is available at: http://127.0.0.1:3006
```
と表示されるので、開いてみましょう。

![toolkit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/38729ae4-f713-008a-d6aa-407e64f58f07.png)

このようなツールが起動します。
本来であれば、アプリを作成した段階でサンプルコードが書かれているので、何かしら表示されてますがいろいろ弄ってたら戻せなくなったので、全部消しておりますm(__)m
ちなみに画面はまっさらですが、左下の`+ Add Page`でページを追加しないとコンポーネントは追加できません。

ではこのツールキットを用いて編集していきましょう。
左のタブにコンポーネントがあります。
適当に`Plotly Graph`というコンポーネントをドラッグアンドドロップで画面の真ん中に持っていってみましょう。

![plotly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/a0b06bfb-7bf2-30f0-d8aa-9cb40a5eb601.png)

はい、このようにPlotlyのグラフを表示することができました。
このコンポーネントをクリックしてみると、画面右にコンポーネントの設定が表示されます。

![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/34c0a3d4-fe12-d706-960c-f40d927ae575.png)

ここで、バックエンドで処理した内容を渡すんですね。
ちなみにデフォルトでは、以下のようにJSON形式でデータが入力されているようです。

![json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/56e52ed5-a325-c080-e372-d6be682c9fcc.png)

---
それでは、コードを編集していきます。
エディタに戻って…と、思ったところ、上部タブに`Code`の文字が。
クリックしてみると、

![code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/6ce84c53-c266-3d31-4757-39aef4bfdb86.png)

神～( ；∀；)！！！
ツールキット上で編集することができます。
さらに、編集して更新するとUI側も自動でリロードされているようです！
素晴らしいですね！

それではコードを編集していきましょう！
<details><summary>実装コード</summary>

```python
import streamsync as ss 
import pandas as pd 
from sklearn.datasets import load_iris
import plotly.express as px

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
fig = px.scatter(df,x='sepal length (cm)', y='sepal width (cm)',color='target')

ss.init_state({
    "my_app":{
        "title":"StreamSync SampleApp"
    },
    "my_plotly_fig":fig,
    "dataframe":df
})
```

</details>

まじでコードの量が少なくて感動します。
**フロントエンドはノーコード**、嘘ではなかったようです。
```python
ss.init_state({
    "my_app":{
        "title":"StreamSync SampleApp"
    },
    "my_plotly_fig":fig,
    "dataframe":df
})
```
ここでフロントエンドに渡すデータを記載してるっぽいです。
実際に、先ほどのコンポーネントの設定画面で、JSON形式ではなく、
```
@{my_plotly_fig}
```
と入力することで

![plotly2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/986be746-a263-587d-fab4-1388c2b2355a.png)

このようにplotlyのグラフを表示することができます。
簡単ですね！

同じ要領でタイトルとデータフレームのコンポーネントを追加して、データを渡してあげると、

![kansei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524375/4c914ac6-77ae-2a60-d781-0d74a593e650.png)

このようにアプリケーションを作成することができました。
まじで簡単すぎて感動しました。

ちなみに、タイトルとデータフレームはそれぞれ以下の記述してデータを渡しています。

```
タイトル　→　@{my_app.title}
データフレーム　→　@{dataframe}
```
データフレームはplotlyのグラフと同じ感じですが、タイトルは`my_app`の中の`title`を取ってくる感じですね。

作成したアプリを実際に使用したい場合は、ターミナル上で以下のコマンドを実行すればOKです。
```
streamsync run testapp
```

# まとめ
お疲れ様でした！
streamsyncいかがだったでしょうか。
個人的にはStreamlitよりも使いやすく、かなり簡単に導入することができました。
今回は紹介できませんでしたが、コンポーネントの見た目をCSSなどで変更することも可能なようです（コンポーネントの設定画面上でCSSを書くことができる）。
非常にカスタマイズ性もあり、使い勝手が良い気がします！
Streamlitの後継者見つかったかもしれないですね（笑）！
今後も情報収集していきたいと思います！
それでは！！！