2024.10.21
お互い疑心暗鬼になりがちな、経営企画と事業部の壁 組織に「分断」が生まれる要因と打開策
リンクをコピー
記事をブックマーク
Taro L. Saito氏:じゃあ今度はクライアントサイドについて見ていきます。Scala.jsというのは基本的にScalaのコードをJavaScriptに変換するものなので、基本的にScalaのコードしか使えない。例えばJavaのコードが紛れ込んでいるとコンパイルがエラーになってしまいます。なので、依存関係にあるライブラリもすべてScalaになるように注意する必要があります。
Airframeでは、Scala以外のコードが紛れ込まないように、dependencyを最小にして、すごく非常に気を遣ってデザインされています。あとアノテーションが使えなかったりとかランタイムリフレクションが使えないなどの制約があります。
一方、コンパイルタイムに行われるもの、例えばScala Macrosによるコード展開などは、実はScala.jsではなにも問題なく使えます。
またRPCの実装では、常に非同期実行になります。Scala Futureベースの非同期実行になっていて。ただ問題なのが、Futureを待つ方法というのがないんですね。というのも、JavaScriptはブラウザ上でシングルスレッドで動いているものなので、バックグラウンドで処理を待つということはありません。だから結局レスポンスを受け取ってFutureのチェインでmap、flatMap、resqueなどを駆使して操作を連結することが必要になってきます。
Scala.jsのコードはブラウザ上で動くのでデバッグがなかなか大変になってくるんですけれども、Chromeなど最近のブラウザにはDeveloper Consoleというのがあって、そこに対してログを表示してあげると、非常にデバッグしやすくなります。
Scalaのコードは1回JSにコンパイルされているんですけれども、airframe-logというモジュールを使うと、デバッグが非常にしやすくなります。例えばdebugというメッセージをここで表示すると、ここのデバッグログのメッセージだけじゃなくて、ソースコードのファイル名や行数までも表示されます。
また、Scala.jsでWeb UIを作るための手法も実はすごくいろいろあるんですね。ただ、基本的にはDOMを生成すればいい。DOMというのは例えば
例えばXMLリテラルのScalaの機能を使ってDOMを表示するなど。monadic-html、Binding.scala、そういうライブラリがありましたけれども、どうしてもこのXMLをScalaの中に書くのは、ちょっと書きにくいところもあります。Dotty(Scala 3.0)ではXMLリテラルが廃止されるので、このアプローチというのはどうも筋がよくない。
現在のベストプラクティスは、Scalaの関数を使ってDOMをどんどん構成していく。例えばScalaTagsでは、このHTMLというのが関数で定義されています。「html」「head」「body」「h1」「div」、これらのタグが全部関数で定義されている。今から紹介するAirframe RxもすべてHTMLのタグに対応するものを関数で定義しています。
この2つの大きな違いは、DOMのelementとattributeを区別するかどうか。例えばScalaTagsでは、ここがattributeで、ここはtext部分なんですけど、この両者を区別するのに括弧を入れています。一方、もっと最近のアプローチだと、この2つを区別しないで、両方とも1つの括弧の中に入れてしまおうという。
実は後者のほうがScalaの関数型のシンタックスに非常にマッチしていて、実際に書いてみると、ScalaTagsはすごく括弧をたくさん書かなくてはいけなくてすごく大変な書いていてつらいライブラリですが、最近のscalajs-reactとかAirframe Rxでは、よりScalaで書きやすい形になっています。
関数をネストさせることでより複雑なDOMの要素も生成できます。Airframe RXではrenderというインターフェイスを提供することで、DOMのエレメントをネストしたりとか、あとからスタイルを設定したりとか、そういうことが可能になるようにデザインされています。
また例えばこういう凝ったテーブルのレイアウトを表示したいときに、Scalaのコレクションを間に埋め込んだり、テーブルの1行1行を表示したり、イベントに応じてDOMを書き換えたり、そういうことができるようになっています。
また、リアクティブにユーザーのクリックなどの動作に反応してUIを書き換えなくてはいけないので、例えばRx.variableというものがありまして……。これは何をするかというと、変数に変更があるとイベントをどんどん後ろのオペレーターに伝播、すなわち影響を伝播させていくという実装になっています。
例えばRx.variableを定義して、実際にマップをして、文字列を作って、subscriberでprintする。そうすると、最初は「World」という値が入っているので「Hello World!」が表示されるんですけれども、このRxの変数の中身を書き換えてあげると、今度は同じコードが実行されて、今度「Hello Rx!」が表示される。そういう仕組みになっています。
こういう仕組みはMonixとかScala.rxなどいろいろなライブラリでも実装されていて、monadic-htmlでも同様な実装になっています。
重要なのは、最終的にsubscriptionをキャンセルしてDOMのリフレッシュができることです。Airframe Rxは、Monixだったりとかmonadic-htmlのいいところを取って、このダイナミックにDOMを書き換えるインターフェイスが定義されています。
また、このRxの実装の背景にあるのがReactiveXというストリームを処理する実装です。これは基本的にはmap、flatMap、filterなどのオペレーションが使えて、ScalaのコレクションのAPIとほぼまったく一緒なんですね。なので、Scalaのコレクションの使い方さえ知っていれば、こういうストリームの情報、すなわちイベントの情報を受け取って、その都度DOMの要素を書き換えていくというのは、実はすごく簡単にできる。
また、このリアクティブのRxの抽象化を使うことで、例えばgRPCではクライアントストリーミング、サーバーストリーミング、あとは双方向での通信を適宜行うようなアドバンスドな通信もサポートされているんですけれども、そういうのもどんどん実装することができます。
では、まとめです。Airframeを使うことでScala中心の開発をすることが可能になっています。このアプローチのメリットは、もうScalaさえ学べばクライアント・サーバーの実装というのを全部済ませてしまう。非常にラーニングコストが下がるんですね。 Protocol Bufferについて学ばなくてもいいし、FinagleとかgRPCのWebサーバー側の技術についても最初は学ばなくてもよくなるというところがすごく大きなところ。 結論です。Scalaは非常に強力なプログラミング言語です。いいところは、最初はすべての技術を蹴散らすような書き方をしたんですけれども、実際にはいろいろな技術のいいところをScalaにどんどん集約することができます。ラーニングコストを最小化してScalaファーストなアプローチを可能にしているのがAirframeのライブラリです。 以上で終わりです。ありがとうございました。 Scalaはラーニングコストが下がる
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.21
40代〜50代の管理職が「部下を承認する」のに苦戦するわけ 職場での「傷つき」をこじらせた世代に必要なこと
2024.11.20
成果が目立つ「攻めのタイプ」ばかり採用しがちな職場 「優秀な人材」を求める人がスルーしているもの
2024.11.20
「元エースの管理職」が若手営業を育てる時に陥りがちな罠 順調なチーム・苦戦するチームの違いから見る、育成のポイント
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.19
がんばっているのに伸び悩む営業・成果を出す営業の違い 『無敗営業』著者が教える、つい陥りがちな「思い込み」の罠
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.15
好きなことで起業、赤字を膨らませても引くに引けない理由 倒産リスクが一気に高まる、起業でありがちな失敗
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.21
40代〜50代の管理職が「部下を承認する」のに苦戦するわけ 職場での「傷つき」をこじらせた世代に必要なこと
2024.11.20
成果が目立つ「攻めのタイプ」ばかり採用しがちな職場 「優秀な人材」を求める人がスルーしているもの
2024.11.20
「元エースの管理職」が若手営業を育てる時に陥りがちな罠 順調なチーム・苦戦するチームの違いから見る、育成のポイント
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.19
がんばっているのに伸び悩む営業・成果を出す営業の違い 『無敗営業』著者が教える、つい陥りがちな「思い込み」の罠
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.15
好きなことで起業、赤字を膨らませても引くに引けない理由 倒産リスクが一気に高まる、起業でありがちな失敗