Kick Out the World

技術的なメモとかポエムを書きます。

Moddable July 12, 2021がリリースされました

github.com

XSの改善

ECMAScript® Embedded Systems API 仕様対応

SubPlatformのProvider定義追加

esp32/m5stack などSubPlatformに対してもProvider定義が追加されました。ESP32配下のSubPlatformはほとんど対応されているようです。I2CやSPIをはじめとしてSubPlatform固有のピンアサインが定義されています。 

IOクラスを用いたセンサー類のドライバー実装の追加

NTC ThermistorセンサーやAHT10が追加

対応ボード追加

SparkFun Thing Plusが追加となりました。

www.switch-science.com

音声再生

AudioOutでSBCエンコードの再生に対応

SBCとはBluetoothに使用される音声圧縮方法のことだそうです。

AudioOutで矩形波のトーン再生に対応

M5stack本家ライブラリのM5.speaker.tone相当が実現できます。

QRcodeモジュールの改善

TextDecoder, TextEncoderモジュールの追加

UTF-8バイト列と文字列の変換ができる

mcbundleのドキュメント追加

Moddable Store(?!)向けにアプリケーションをパッケージングするためのツールのようです。 パッケージングするための定義はmanifest.jsonに記載する模様。

Windowsには対応してないようなので動作確認は未実施

Moddable June 3, 2021がリリースされました

github.com

ESP32関連

ESP-IDFが4.2から4.2.1にアップデート

ESP32を使っている場合は必要となります。アップデート方法は参照

カスタムブートローダーの使用が可能に

XSの改善

今回改善されたString.fromArrayBuffer はXS独自機能のようで、BTなどの通信時にバイト列から文字列をデコードする用途に使われます。

GIPHYアプリ

contributed にGIPHYというGIF動画共有サービスから検索し表示するアプリが追加されました。動作にはGIPHYのAPIキーが必要となります。また、検索文字入力のためにタッチスクリーンも必要。

画面が少し小さくタッチスクリーンが使いずらい部分やGIF表示時固まるといった不安点な動作が見られましたがM5stackCore2でも確認ができます。元アプリはModdableTwoをベースに画面作成されています。

ECMA TC53のAPI仕様対応

HostProviderインスタンスの名称変更

ボード固有のピンアサイン等を定義したHostProviderインスタンスの名称がHostからdeviceに変わります。このHostProviderインスタンスの具体的な使い方については、後述するIOクラスを用いたドライバ実装中で確認できます。

IOクラスを用いたセンサー類のドライバー実装の追加

I2CやSMBusを使ったドライバ実装modules/drivers/sensors に追加され、examplesにも対応するプログラムがあるので、M5stackのENVⅡUnitとかでサッと動作確認が可能です。

SMBusのメソッド名がTC53の仕様に合ってないとdicussionに書いた一方で、既存のままで実装されてるけど、どうするのだろ。

新しくドライバー類を作成ないし、コントリビュートするに当たっては、IOクラスを用いたほうがよさそうだけど、まだまだ過渡期の入り口な印象です。以下感想

CRCモジュールの追加

上記のドライバー追加に合わせてチェックサムのためのモジュールが追加されています。使い方はドライバーの実装内で確認できます。

REPL機能の改善

よりNode.jsに近づいたことですが、まだ触ったことがないので試してみたい。

暗号化やTLSの改善

特になし

Moddable May 4, 2021がリリースされました

ほんの思い付きですが、月1,2回ほどあるリリースノートについて簡単にトピックスの紹介や補足でもしていこうかと思います。 あまり詳しくないor関心の薄い部分については適当な紹介となることはご了承ください

続きを読む

「リモートワークの達人」と「思考の整理学」を読んだ

「小さなチーム、大きな仕事」は読んだことがあったけど、こちらは読んだことがなかったので、読んでみた。

 

パフォーマンスを発揮して働くという点において「小さなチーム…」と共通する部分が多く、読み始めから既視感があっだけど、最後まで読み進めていくと、読んだことがないことが分かって安心?した。

 

確かに必要なことは全部書いてあった。現実に実践できるかどうかは別にして…な気持ちもあるけど、やれることからやってみたらよい、というマインド。

 

今回物理文庫本を買うに当たって、たまたま近くに陳列されていた「思考の整理学」も買って読んでみた。

 

文章を書く上で都合のよいとされる場面に「三上」という言葉があり、朝一が最も頭が整理された状態であるし、気分を変えていつもと違う場所で考えてみる、といった部分はリモートワークにもリンクする部分があり面白かった。

 

もちろん、これ以外にも創造的な思考をするために必要なことが書いてあるので、リモートワーク関係なく読んでよかった。

【Moddable】manifest.jsonで定義した値が適用されているか確認する

manifest.jsonconfigdefine といった設定値が定義されていますが、Exampleのアプリケーションを動かしてたり、新しいボード対応とかをしていると、ここで定義した値通りに動いてないのでは、みたいな場面に遭遇することが稀によくあります。

ということで、いくつか確認できたものを例に紹介する

確認する場所

mcconfig コマンドでビルドされた生成物は以下フォルダに格納されている。 ${MODDABLE}/build/tmp/$(platform)/$(subplatform)/debug/$(Application)

esp32/m5stackhelloworldアプリを動かしたなら moddable/build/tmp/esp32/m5stack/debug/helloworld

結論としてはここにあるヘッダファイルが自動生成され、ビルド時に参照される。

define

例えば以下のようにI2Cのデフォルトsda,sclピンとかが定義されていると、

"defines": {
    "i2c": {
        "sda_pin": 21,
        "scl_pin": 22
    }

mc.defines.hのヘッダファイル内で以下のような定義に自動生成される。

#define MODDEF_I2C_SDA_PIN (21)
#define MODDEF_I2C_SCL_PIN (22)

この定義はmodules/pins/i2c/esp/modI2C.cで参照されており、I2Cコンストラクタでsda,sclが指定されていない場合のデフォルト値として利用されていることがわかる。

#if defined(MODDEF_I2C_SDA_PIN) && defined(MODDEF_I2C_SCL_PIN)
    conf.sda_io_num = (-1 == config->sda) ? MODDEF_I2C_SDA_PIN : config->sda;
    conf.scl_io_num = (-1 == config->scl) ? MODDEF_I2C_SCL_PIN : config->scl;
#else

config

アプリケーションで利用する際にはimport config from "mc/config";でインポートして参照する設定値。

"config": {
    "screen": "m5stack/screen",
    "rotation": 90,
    "touch": "",
}

mc.config.jsを見たらだいだい見たまんま

mc.rotation.h

画面出力する場合は本ファイルで定義されるkPocoRotationが画面の向きを決定する。実際この値が変わると参照しているcommodettoやpiuは再ビルドが走る。

ここに適用される値は、config.rotaionが適用されるが、mcconfig-rオプションを指定していた場合はその値が優先される。

複数のmanifest.jsonで同じ定義が衝突したとき

ApplicationやPlatformやModuleごとに定義されるmanifest.jsonファイルで同じ定義がされていた場合は、(恐らく)定義が読み込まれてた順で後勝ちになっていそう。

例えばM5stackのアプリケーションでexamples/manifest_base.jsonを読み込んだ場合は、 includeで以下のように辿って読み込まれていく。

(アプリケーションのmanifest.json)
┗ $(MODDABLE)/examples/manifest_base.json
  ┗$(BUILD)/devices/esp32/manifest.json
  ┗$(BUILD)/devices/esp32/targets/m5stack/manifest.json
   ┗(以下略)

ただし、includeで先読みしてくため、下から上に向かってdeinfeやconfigは読み込まれていく(アプリケーションのmanifest.jsonでで定義したものが最終的に後勝ちになる)ので、意図しない定義値が適用されているときは、manifestの読み込み順にも注意したほうがよい。

まとめ

Platformで定義した値をSubPlatformで上書きできない点がモヤモヤする(嵌った)ところですが、意図する値となってないと思ったら値を確認してみましょう。

M5Stack×Moddable入門その3~人感センサーユニットを動かす

今回はPIRセンサーユニットで人感を試してみました。 買ったのは以下のM5stack用のやつ。

www.switch-science.com

ユニットを接続する

当然Modabbleにドライバがなかったので、製品ページを見ているとI2Cインターフェースではなく、GroveをポートBに刺してGPIOから値が取得できる、と書いてあるが、手元のM5stackGrayにはGroveポートがI2C用の1つしかない。

どうもFIREやGOには3つのGroveポート(Aポート:I2C、Bポート:I/O、Cポート:UART)がついているようだ。こういう配線したくなくてM5stackを選んだにミスったなと感じつつ、自分でジャンパワイヤーを刺して接続します。

Modabbleで実装

GPIOから人感のオン・オフのデジタル入力を読み取るだけなので、確かにドライバはいらなさそう。

デジタル入出力に関してはbuiltin/digitalがあるので、使えそーじゃんと思って使ったら、まだ標準仕様を策定中でESPでしか使えないExperimentalの状態でした。

今回はデジタル入力なので、これってボタン入力と同じじゃね?ってことに気づきM5stackのsetupスクリプトにあるButtonクラスと同じ感じつくればよさそう。

moddable/setup-target.js at public · Moddable-OpenSource/moddable · GitHub

ってことで動きました。

あと、人感を試すためにM5stackを設置する上でスマホ用の撮影スタンドが便利でした。

ソフトウェア見積り 人月の暗黙知を解き明かす を読んだ

ちょうどこの前のkindleセールだったので買って読んだ。

  • 見積もり、ターゲット、コミットメントの違いを理解すること
  • シングルポイントの見積もりではなく、幅のある数値の見積もりを。ビジネスにとっては予測可能性が重要
  • できの悪い見積もりは将来の見積もりを縛る傾向がある
  • 最良と最悪の両ケースの見積もりをすることで起こりえるすべての範囲の結果を考えるきっかけとなる
  • 過少見積りの不利益は限界がないので、意図的な過少見積もりをすべきではない
  • スケジュールが切迫して開発者にストレスが及ぶと品質は落ちる
  • 不確実性のコーン(ソフトウェア定義が詳細化するにつれて見積もりのばらつきは小さくなる)
  • 見積もりも重要だけどプロジェクトコントロールも重要
  • 開発者は楽観的な見積もりをしてしまう
  • 規模の不経済(ソフトウェアは規模が大きくなるほどコストが大きくなる)
  • 開発対象の特性によって生産性は変わるし、規模によっても変わる
  • 大きなプロジェクトでは個人の力量よりもプロジェクトマネジメント(特にリスクマネジメント)が重要
  • 政治的圧力のかかった見積もりをさけるために過去データを利用する
  • 分解して見積もりした際の「大数の法則(1つ1つの見積もり誤差が打ち消しあって結果全体誤差が小さくなる)」
  • 複数の見積もり技法や指標を使い結果を比較する

単に定量的指標を使ってPDCAしろみたいな一辺倒なアプローチではなく、見積もりとは何なのか、数値をどう見るのか、みたいな視点が広がるかと思います。