00:05
6月9日、木曜日ですね。 地獄の朝9時を回りました。
今日は、あいにくの曇り、 または雨、雷雨が降るらしいですね。
はい、おはようございます。 神戸市会市ゆめみのキースの桑原です。
では、本日も朝活を始めていきたいと思います。
今回もですね、前回に引き続き、 Solid.jsっていうJavaScriptライブラリーがあって、
それの公式ドキュメントをダラダラと読んで、 このライブラリーに入門していこうかなと思います。
もちろん、読むより書く方がいいというか、 一番学びになるのは自分で書いてみることだと思いますけどもね。
まずばーっと眺めてみて、何か違いとかを頭でも知っておくのもいいのかなと思って、
引き続き読んでいこうかなと思います。
では、前回でクリエイトシグナル、 クリエイトエフェクト、クリエイトメモっていう、
大きく3つのものを読んでいきましたね。
Reactで言うところの、 UseState、UseEffect、UseMemoみたいな、
もしくは普通のメモっていう関数ですかね。 React.Memoっていう関数の、
Solid.js版みたいなのを読んでました。
では続いて、昨日若干クリエイトリソースっていうのにも入ったんですけど、 昨日じゃなくてすみません、一昨日ですね。
ちょっともう一日置いて忘れてしまったので、 もう一回クリエイトリソースから読んでいこうと思いますが、
クリエイトリソースっていうのは、 こっちもHooksみたいな関数なんですけども、
非同期のリクエストの結果をシグナルを作成するようなものだったそうですね。
シグナルって言ったのは、UseStateの、 Solid.js版のCreateSignalってやつのシグナルを意味してますね。
要は状態管理だと思ってもらえたらいいと思います。
クリエイトリソースは非同期のフェッチャー関数を受け取って、
そのフェッチャーが完了したときに結果のデータで更新されるシグナルっていうのを返してくれると。
そのクリエイトリソースを使用するには2つの方法があって、
フェッチャー関数を唯一の引数として渡すか、
もしくは最終の引数としてはシグナルを渡してあげることもできますよと。
第2引数にフェッチャーを渡してあげることができますよって感じですね。
変更されるためにそのフェッチャーを再トリガーして、
そのあたりがまたフェッチャーに渡されていくという感じですね。
おっと、だいちさんですね。
おはようございます。ご参加いただきありがとうございます。
タイトルにあるとResolute.jsの機能をダラダラと呼んでるって感じですね。
クリエイトリソースの使い方なんですけど、
これ昨日、いや一昨日見てちょっとびっくりしたんですけど、
第1引数にフェッチャーの関数だけ渡す場合と、
シグナルとフェッチャーを2つ渡すというところで、
何が驚いたかというと、
2つ渡す場合って第1引数がフェッチャーでなく、
第2引数にフェッチャーを渡すというところなので、
03:03
どっちが渡ってくるかっていうのをクリエイトリソースの中で判別してるんだなっていうのが
僕はちょっと驚きましたね。
なんか普通に第1引数はそのまんまフェッチャーで、
第2引数にシグナルもオプショナルで渡すことができる
というような設定ではないんだっていうのが意外だったですね。
はい、じゃあちょっと続き読んでいきますね。
これは別途ではフェッチャーは関数ですね。
そういう関数です。
ソースコード的にはフェッチデータっていう関数がデモとして渡されてますね。
どちらの場合もフェッチデータが解決を終えるまでデータっていうのはアンディファインドです。
データっていうのはクリエイトリソースからのレスポンスの値ですね。
レスポンスの値も配列で受け取れるんですけど、
第1のレスポンスがそのデータですね。
これは多分ゲッターになると思うので、厳密に言うと値ではなくて関数ですね。
データを取りたかったらデータ括弧みたいなので実行してもらえればデータが受け取れると。
第2の戻り値ですね。
オブジェクトになっていて、ミューティエットとリフェッチっていうものの、
これも多分関数だと思いますけど、戻されます。
で、フェッチデータがすぐに呼び出されて、
2つ目のケースっていうのが、いわゆる引数にシグナルとフェッチャー2つが渡される場合は、
ソースシグナルっていうのがその第1引数ですね。
が、フォルス、もたはネル、またはアンディファインド、いわゆるフォルス以外の値を持つとすぐにフェッチャーが呼び出されます。
で、このソースシグナルの値が変更されるためにまた再度呼び出されて、
常にフェッチデータの第1引数として渡されますよという感じですね。
で、変更されるけどフォルス以外の値の場合は多分呼び出されないんだろうなという感じですね。
で、後にしろクリエイトリソースっていう関数のレスポンスにあるミューティートっていう関数があって、
それを呼び出すとデータシグナルで直接更新することもできます。
で、他のシグナルセッターと同じように動作すると。
で、またリフェッチっていうメソッドを使いますと、
フェッチャーを再度実行できて、リフェッチ括弧インフォーのように追加の引数を渡すことで、
そのフェッチャーに別のパラメーターを渡すこともできますねってことでした。
僕てらのぞうさんですね。はいご参加いただきありがとうございます。
タイトルアルトリソリッドJSの公式ドキュメントをだらだらと今読んでます。
で、データっていうところですね。
やはりレスポンスのデータは通常のシグナルのゲッターのようにもちろん動作することができて、
実行すれば値をもらえると。
で、フェッチデータですね。フェッチャーの最後の戻り値を読み取るにはそのデータ括弧を使用してください。
で、しかしこれには2つの追加プロパティがありますって言ってて、
データ.ローディングっていうのが1つ目ですね。
06:00
こいつはフェッチャーが呼び出されたかどうか、返されていないかどうかっていうのを示してくれますと。
なるほどですね。
で、もう1つ。データ.エラーっていうのがもう1つのプロパティで、
こちらはリクエストがエラーになったかどうかを示してくれますと。
で、注意として、もしエラーが予想される場合は、
クリエイトリソースをエラーバウンダリーとかでラップしてあげるといいでしょうと。
で、エラーバウンダリーっていうのが別の機能でソリッドJSを持ってるらしくて、
これ多分後ほど出てくると思われますね。
続いて、ローディングとエラーっていうのはReactiveGetterで追跡も可能になりますよと言ってますね。
で、フェッチャーっていうのはクリエイトリソースに提供する非同期関数になっていて、
実際にデータを取得するために使用します。
本当に単なるフェッチャー。いつも通りのフェッチャーのことだと思いますね。
2つの引数が渡されてきますと。
1つ目がソースシグナルの値ですね。
クリエイトシグナルで作られたリソースだと思いますね。
そのシグナルの値とバリューとリフェッチングの2つのプロパティを持つインフォオブジェクトっていう感じですね。
渡し方は2つですけど、2つ目の方にさらにバリューとリフェッチングっていう具体的なものを渡してあげる感じですね。
リフェッチングっていうのはフェッチャーがリフェッチ関数を使用してトリガーされた場合はトゥルーで、
トリガーがトゥルーで、そうでない場合はフォルスだと。
リフェッチングはBooleanで渡せと言ってますね。
リフェッチ関数が引数次で呼ばれた場合は、月で呼ばれた場合はリフェッチングにはその引数がセットされる。
なるほどね。単純にBooleanってわけでもないのか。
タイプスクリプトの型定義が一応あるんですけど、
BooleanまたはUnknownっていうことなので、読み捨てるとBooleanも渡されるってことか。
なるほどですね。
バリューはTなので、別になんでも。
かつ、Undefinedだからバリューが渡されないこともちゃんと加味してあるってことですね。
はい、了解です。
ちょっと口頭になってしまってソースコード見てない方は皆さん的には、
ん?ん?ってなると思うので申し訳ないです。
これはドキュメントを後で見てください。
こういうふうな使い方するんだなっていうので。
わかるかなと思います。
今のが基本的なソリッドJSが強みとしているReactivityの根幹となる4つですね。
CreateSignalとCreateEffectとCreateMemoと最後CreateResourceですね。
いわゆるReactで言うとこのUseState、UseEffect、
多分React.Memoのほうが近いかな?というやつですね。
CreateResourceはソリッドJS固有のものって感じですね。
もしかしたらReactにもあるかもしれないんですけど、僕は知らないですね。
では続いてですね、ライフサイクルの3つの機能に入りますね。
ライフサイクルはオンマウントとオンクリーンアップとオンエラーという3つですね。
09:04
1つ目のオンマウントですね。
これは初期レンダリングと要素がマウントされた後に実行されるメソッドを登録します。
Refの使用であったりとかその他の一度きりの副作用を管理するのに最適ですね。
これは依存関係のないCreateEffectと実は同等になりますよということでした。
OK、じゃあその場合は別にCreateEffectもいいとは思いますけど、
明示的にオンマウントを使ってもいいのかなという感じはありますね。
いわゆるビフォーマウントみたいなやつはなさそうかなという感じですね。
基本的にマウント後に実行されるメソッドという感じですね。
続いてオンクリーンアップですね。
オンクリーンアップは現在のReactiveScopeの廃棄または再計算時に実行されるクリーンアップメソッドというのを登録します。
どんなコンポーネントやエフェクトでも一応使用できますよということでしたね。
OK、それ以上でもいいかでもない感じですね。
続いてオンエラーですね。
これは子供のスコープのエラー時に実行されるエラーハンドラメソッドというのを登録できます。
最も近いスコープのエラーハンドラーのみ実行されるよということでした。
LINEをトリガーするために再スローもしてくれますよということですね。
また結構親子間でうまいことを使って親の方でエラーを検知してみたいな使い方をするのかなと思いますね。
今のがSolidJSのライフサイクル3つの機能でした。
これ以上でもいいかでもなく、結構ドキュメントとしてはシンプルだったですね。
では続いてREACTIVEのユーティリティというセクションに入りますね。
こっちは結構いっぱいあるので一個一個見ていこうかなと思います。
これらのヘルパーというのは更新のスケジュールより適切に設定して
REACTIVITYの追跡方法を制御する機能を提供しますよということでした。
本当にとにかくSolidJSはREACTIVEというところを強みにしているなというのも
ドキュメントからも再三出てくるのでそうなんだろうなと思いますね。
では一つ目、UNTRACKEDというものになりますね。
こちらは使い方としては普通に関数として使う感じですね。
引数の型Tになっているので何でもいいんだろうなという感じです。
実行中のコードブロック内の依存関係追跡を無視して値を返すというのが
UNTRACKEDだそうですね。
基本的にはSolidというのはデフォルトで依存関係の追跡をやってくれるんですけど
しないようにあえてする場合はそのUNTRACKEDという関数を使って
値を返すこともできるよということですね。
二つ目はバッチですね。
こっちもTypeScriptの型定義を見てみますと
ジェネリック性Tになっているので何でもいいんだろうなという。
レスポンスをそのままTを使っている感じですね。
という関数です。
12:01
コメントは不必要な再計算を防ぐためにブロック内の更新を最後まで待ちます。
これは次の行の値を読んでもまだ更新されていないことを意味します。
ソリッドストアというのがあるんですね。
ストア次のセクションですね。
にセットメソッドとエフェクトというのがあって
こいつらはコードを自動的にバッチで実はラップしていますよということでした。
ちょっと使い方がわかんないので
サンプルコードを欲しかったけど書いていないので
もしかしたらその次のストアのところに出てくるかもしれないですね。
今のがバッチです。
続いてONですね。
こっちも関数です。
型定義はちなみに見ていくと
ジェネリックスでT extends arrayのさらに大括弧で
括弧はiphone代内の関数のanyが返ってくる。
またはパイプで関数のanyである。
もしくはUです。
というような型定義になってますね。
なるほどですね。
配列か。
配列をextendしたTが渡されるかもしくはUだというところで
2位なものということですね。
OK。
ONというのは依存関係を明示的にするため
計算に渡されるよう設計されています。
依存関係の配列が渡される場合は
インプットとプリビアスインプットというのは
配列になりますよと。
これは何を言っているかというと
例えば使い方としては
先ほど見せたクリエイトエフェクトですね。
クリエイトエフェクトの引数の関数を
ONという関数でラップをしてますね。
第1引数には適当に与えて
第2引数にコールバック関数が渡されてきて
そこでガチャガチャってやるというような感じですね。
というふうに一旦ラップして渡すことができると。
これの場合は使い方として何と同等かというと
同じようにクリエイトエフェクトの第1引数
1つしかないか。
クリエイトエフェクトのコールバック関数を定義して
その中にconst V イコール A という関数を定義してあって
それの下にアントラックのコールバックと
同じことをしてるって感じですね。
なるほど。
ということは最初に渡される A っていうのは
配列、依存関係の配列って言ってるので
厳密に言うとこれシグナルが渡されるそうな気がしますね。
うんうん。
っていう感じですね。
もしくはディファーオプションっていうのを
トゥルーにすることですぐに計算を実行せず
変更があった場合に計算を実行するように
設定することも一応できますよって言ってますね。
なるほど。
そのONっていう今回の機能があって
それ関数なんですけど
これの第2引数のオプショナルとして
15:03
ディファートルーっていうのを
設定してあげることもできるよってことですね。
計算はすぐにやるんじゃなくて
渡された第1引数の値の変更があった場合のみに
計算を実行してくださいっていうこともできたりはします。
そうですね。
はい、ということでした。
で、そのONで渡される第1引数がシグナルなので
セッターとゲッター両方あるんで
そのセッターがコールされたときに
中身実行みたいなことができるってことですね、これは。
はい、結構細かく設定できるってことですね。
なるほどです。
では続いて、クリエイトルートですね。
クリエイトルート。
こちらも片手やぎ的にはGenetics-Tで
ResponseもT使ってますね。
こちらは自動廃棄されない新しい非追跡の
所有者スコープっていうのを作成しますと。
これは親の再評価時に開放したくない
もしくはネストされたリアクティブスコープなのに便利ですと。
母子関係でのネストしたリアクティブスコープで
使うことが良さそうってことですね。
すべてのソリッドのコードっていうのは
すべてのメモリーもしくは計算が
開放されることを保証するので
これらのいずれかのトップレベルで
ラップされる必要がありますと。
通常はすべてのレンダーエントリー関数に
クリエイトルートが組み込まれているので
これを気にすることはないよってことですね。
書いてある通りですね。
実は内部的にクリエイトルートを
使っているって感じですね。
明示的に使いたい時もあると思うので
それを使ってくださいということですね。
続いてGetOwnerですね。
こっちは片手切りすぎで雑だな。
Ownerっていう型がソリッドの中にあって
それしか使わないみたいな感じですね。
こっちも関数なんですけど
実行中のリアクティブスコープの
現在の所有している計算を取得しますと。
このスコープは必ずしも追跡しているわけではなくて
現在の実行ブロックの廃棄を担当するものだそうですね。
GetOwnerっていう名前なんだけど
現在実行ブロックの廃棄をするんですね。
なんか面白いな。
もちろん名前の通り
現在所有している計算そのものの値も
ちゃんと取得はしますけどってことですね。
ただ必ずしも追跡しているわけではないというところなので
ちょっと使いどころ難しそうな気がしますね。
本当にこのタイムスタンプ的に
今の値が欲しいときに使うのかなと思いました。
続いて、あと何個だ?
まだいっぱいあるな。
次はRunWithOwnerですね。
こちらは提供された所有者の下で行動を実行してから
外側のスコープの所有者に復元をしますっていうことですね。
どっちかというとさっきのGetOwnerよりも
RunWithOwnerの方が使いそうな気がしますね。
ちゃんと外側スコープと連携をするってところがあるので。
18:01
続いてのユーティリティはMergePropsですね。
名前の通りです。
型定義的にも引数はany型が受け取られて
レスポンスもanyですね。
コメントはリアクティブなオブジェクトのMergeメソッドになります。
呼び出し元から提供されなかった場合のために
コンポーネントにデフォルトのプロップスを設定するのに便利ですよ。
あるいはリアクティブなプロパティを含むプロップスオブジェクトを複製します。
このメソッドというのはプロキシを使用して
プロパティを逆順に解決することで動作をします。
逆順にあるんですね。
これによってプロップオブジェクトが最初にMergeされたときには
存在しなかったプロパティを動的に追跡ができますよと。
なるほどですね。
例えば使い方としてはMergeプロップスの第1引数に
例えばName、コロン、スミスみたいなオブジェクトを渡してあげて
その第2引数にプロップスというのを渡してあげると。
それをMergeするという感じですね。
第1引数にMergeしたい別のオブジェクトが何もない場合
Mergeプロップス括弧プロップスという関数で実行する場合は
単純に現在のプロップスの複製をしますよというところですね。
とにかく第1引数、第2引数にプロップス渡してあげればMergeをします。
1個だけだったら複製をしますという感じの使い方ですね。
続いてのUTTはスプリットプロップスですね。
こちらも関数ですけど
こちらはReactiveObjectをキーで分割をします。
ReactiveObjectと任意の数のキーの配列を引数として受け取っています。
そのキーの配列ごとに元のオブジェクトのプロパティだけを持つ
ReactiveObjectが返されます。
返された配列の最後のReactiveObjectというのは
元のオブジェクトの残りのプロパティもありますよと。
これはプロップスのサブセットを利用して
残りを子供に渡したい場合に便利ですねと言ってますね。
本当に名前の通り分割したい場合ということか。
例えばの使い方として
スプリットプロップスに第1引数プロップスを渡して
第2引数に配列で例えばチェルドレンという文字列で渡したとしましょう。
その場合関数なのでレスポンスがあるんですけど
戻り値はローカルとアザーズみたいなので
配列として受け取ったとしますね。
その場合はアザーズという値をチャイルドに渡して
ローカルとなんちゃらかんちゃらみたいなことをローカルでやると。
チェルドレンというキーを渡した場合は
チェルドレンというものに紐づく値と
プロップスとそうじゃないものを分割することができると。
チェルドレンに紐づくものはそのまま子供の要素に渡したいので
チャイルドというコンポーネントに渡してあげると。
そのままこのコンポーネント上で実行したいものを
21:02
ローカルとかで適当な名前で受け取って
それはローカルで使ってくださいという感じですね。
これはちょっとコードを見たほうが早いと思うので申し訳ないです。
ちょっと口頭になってしまいますので。
見たらなるほどねってなると思います。
では続いてですね、次がユーズトランジッションです。
こちらは全ての非同期処理が完了するまでコミットを延期するため
非同期更新をトランザクションで一括して行うのに使用します。
この機能はサスペンスと連動しており
サスペンスの境界下で読み込まれたリソースのみを追跡しますと言ってますね。
一応ちなみにユーズトランジッションは
引数とか特に受け取らないでそのまま実行してくださいと。
実行したらレスポンスはまた同じように配列で受け取って
isBendingとstartというものを受け取れるらしいですね。
はい、isBendingはそのまんまです。
Booleanが返ってきますね。
で、startというのはプロミスが返ってきますね。
値アボイドですけども。
で、isBendingこれも戻ってくるけど
こちらはゲッターになるのでやっぱり関数になりますね。
なので今Pendingかどうかを取得したい場合は
isBendingで実行して値を取ってくださいと。
本当に基本的にソリッドJSというのは
ゲッターとセッター両方返すというのが
基本的な使い方だそうですね。
あとやり方としてはさっき返ってきた
レスポンスのstartというやつの方ですね。
startの方はいわゆるトランジッションなので
これを関数として使う場合は
startの中にwrap次第関数というのを指定してあげる感じですね。
そうするとトランジッションが効くので
あとは制御ができますよということですね。
あと追跡もしてくれますよということでした。
サンプルコードで言うと
この中の指定されているコードですね。
スタートの中でセットシグナルの関数とかを
呼んだりするので
そういうふうに使うんだねという感じですね。
というところでした。
今のがuseTransitionです。
次のユーティリティはstartTransitionですね。
さっきのuseTransitionのレスポンスのstartと
結構かぶる気がしますけども
レスポンスの型定義を見ても同じですね。
全く同じですね。
コメントはuseTransitionと似ていますけど
関連する保留状態というのは別にないと。
これは単にトランジッションを開始するためだけに
直接使用しますと。
なるほどですね。本当に実行だけって感じですね。
であれば普通にuseTransitionを使ったほうが
よさそうな感じはしましたね。
続いてobservableです。
こっちはシグナルを引数に受け取って
シンプルなobservableを生成します。
お好みのobservableライブラリから通常は
from演算子を使って取り込みますよと言ってますね。
あーなるほどって感じですね。
ちょっと使いどころ難しいなこれ。
サンプルコードを見てみると
24:02
例えばRxJSを使っている場合ですね。
RxJSからfromという
メソッドを
インポートで読み込んだとしましょうと。
で、createSignalで初期値0で
ゲッターとセッターが返ってきますと。
この場合にさっきのRxJSのfromという関数の中の
引数にobservableで
wrapしたさっきの
ゲッターというのを
渡してあげる。
最後はそのobservableの
サブスクライブという関数で
ひたすらサブスクライブし続けるという感じですね。
ちょっとテクニカルというか
使い方が特殊なので難しいですね。
いわゆるsolid.js固有のものではなく
別のものを使ったりとか
個別にobservableしたい、サブスクリプションしたい場合の
何かを作るときに使うんだろうなというのは分かりました。
先ほど見せたRxJSの関数みたいなものとか
いろんなものとかと一応連携はできますよということですね。
observableそのものの型定義が
このsolid.jsの公式サイトに載ってないので
どういう使い方をするのかそこまで見てみないと分からないなという感じがしました。
続いてfromですね。
先ほど出てきたfromですけども
こっちはRxを使う前提で書いてるっぽいですね。
説明を読んでいきます。
RxJS ObservableやSvelte Storesのような
外部プロデューサーとの相互運用を
容易にするためのシンプルなヘルパーになります。
これは基本的に任意の公読可能なもの
サブスクライブメソッドを持つオブジェクトというのを
シグナルに変えて公読と廃棄を管理しますよと。
使い方としてはfrom関数の
引数には
オブザーバブルのインスタンスを渡してあげてくださいと
レスポンサーシグナルになりますよと言ってますね。
またカスタムプロデューサー関数を使うこともできて
セッター関数に渡された関数は
アンサブスクライブな関数を返しますと。
そろそろ多分聞いてる方々は
頭がパンクするような感じになると思うんですけど
申し訳ないです。そういう感じらしいですね。
とにかくfromの使い方としては
オブザーバブルのインスタンスを渡すか
カスタムなプロデューサー関数を渡してあげて
その中でオブザーバブルのインスタンスをセットすることもできます。
注意としてfromによって
生成されたシグナルは基本的に外部ストリームや
ソースのインターフェースを良くするために
透過性チェックがオフになってしまってますよと。
そこをちょっと確かに注意しないといけないですね。
使い方特殊ですね。
あと2つですね。
27:01
1つ目はマップアレイというものがあります。
マップアレイは引数を2つ受け取るのかな。
更新時に不要なマッピングを減らしたいので
各アイテムを参照によってキャッシュする
リアクティブなマップヘルパーというものがこのマップアレイというものだそうですね。
値ごとに1度だけマッピング関数を実行して
必要に応じて移動だったり削除だったりも行えます。
インデックス引数というのがあって
こいつはシグナルになりますよと。
マップ関数自体は追跡はしてくれないと。
追跡したい場合は追跡する用の中身を
セットしてあげることが必要なんだろうな。
そんな感じですね。
ソースコードをガッと見て
サンプルコードがあるんですけど
長いのでこれは割愛します。
ざっくりマップアレイという関数があって
第1引数に何かしらのオブジェクトを渡されて
第2引数がコールバック関数ですね。
その中でガチャっと計算をしているという感じです。
レスポンスが
いわゆる
リアクティブな値になっているという感じですね。
今のがマップアレイで
最後インデックスアレイというやつですね。
このユーティリティはマップアレイとちょっと似てるものが
あるんですけど
インデックスでマッピングする点が異なります。
アイテムはシグナルで
インデックスは定数となります。
定数になるんですね。
なるほどです。
ちょっと特徴がありますね。
インデックスアレイは使い方としてはさっきのマップアレイと一緒なんですけど
リターンオブジェクトの中に
getIndという関数と
getFirstInitialという関数と
getFullNameという関数
FullNameは独自で作ったっぽいやつですね。
そういうgetterというのを
レスポンスのリターンオブジェクトの中に含んであげるという感じですね。
というところでした。
時間がもういい感じになってしまったので
今日はこちらで終了したいかなと思います。
今回のソリッドJSのユーティリティのところは
実際のソースコードはアプリを作ってみたときに
初めて使うものだと思うので
あまりイメージしづらかったというのがあって
ちょっと今日のお話が大変難しいというか
理解しづらかったなという感じがします。
ここはさらっと眺めて
流していく感じでいいかなと思いました。
必要に応じてリファレンスを参照してくださいという感じですね。
次回は明日は
ストアの話に入ろうと思います。
ストアもちゃんとソリッドJSにライブラリがあって
ソリッドJSスラッシュストアというところで既に公開されているそうなので
この辺の話を明日読んでいこうかなと思います。
またソースコードが多いので
30:01
わかりづらい話になってしまう可能性はあって
大変に申し訳ないですけども、もしご興味ある方は
ついていっていただければと思います。
一緒にこのソリッドJSのドキュメントを開きつつ
聞いていただくのも全然いいなと思ったりしました。
画面共有できたら一番いいんですけどね。
なかなかTwitterスペースにはその機能がないので
ちょっと口頭になって申し訳ないですけども
明日もダラダラ読んでいこうかなと思いますので
ご興味ある方は参加していただければなと思います。
では今日の朝活はこちらで以上にしたいと思います。
ご参加いただいた皆さん大変にありがとうございました。
今日も一日頑張っていきましょう。お疲れ様です。