ここでは、ブートキャンプ中に判明した、エラーやその対象方法を紹介していきます。随時追記していくので、プログラム作成の参考にしてください。
よくあるエラー
【Traceback から始まるもの】
・基本的に再起動で治る
→治らない場合は質問
【画像が表示されない】
・ファイル名の前に/flash/がついているか確認
・Set image0 network image を使っていないか確認
・拡張子がpngかどうか確認
【ボタン(ハード側)が反応しない】
・wasPressedからwasReleasedにしてみると治る
【M5stackの動作が重い】
・再起動で治る場合がある
【エラーの内容】
グラフィックブロックの「画面を○○色で塗りつぶす」を使った後、UI -> 画面ブロックの「Clean screen」を使用しても画面の背景色が初期化(color(0xFFFFFF))されない
【対処 [解決済]】
グラフィックブロックの「画面をクリア」を使用する
【エラーの内容】
UI -> 画面ブロックで画面に何かを描画後、グラフィックブロックの「画面をクリア」を使用しても画面の背景色が初期化(color(0xFFFFFF))されない
【対処 [解決済]】
UI -> 画面ブロックの「Clean screen」を使用する
【エラーの内容】
[in text ["abcdef"] get {letter #} [0]]を行うと、"a"ではなく"f"が取得される。
【対処 [解決済]】
これは仕様である。仕様としてはBlocklyの[in text [text] get {letter #} [index]]はPythonの`text[int(index - 1)] `に置き換えられる。
indexの値が自動で-1されるので、文字列を数え上げる場合は1から始める必要がある。
**これはlistでも同様である。**
【エラーの内容】
1秒毎に数値がカウントアップされて表示されるプログラムを参考にした結果、停止が先に行われてカウント結果がn秒後にポンと出る場合がある
【対処 [解決済]】
去年と同様にタイマー開始を使用する。
関数でタイマーをperiodicで呼び出し、「タイマーが呼び出された時」でカウント表示のための変数を増減し、条件を満たした場合「タイマーを停止」を呼び出す。
【エラーの内容】
ボタンイベントで関数を呼び出し、その関数の中でループを行なっている場合にループ内の動作を行わない。
【対処 [未解決]】
対処法としてループ処理はsetup下で常に行い、関数が呼び出された場合に値を初期化する。
【エラーの内容】
1秒毎に数値がカウントアップされて表示されるプログラムを参考にした結果、停止が先に行われてカウント結果がn秒後にポンと出る場合がある
【対処 [解決済]】
去年と同様にタイマー開始を使用する。
関数でタイマーをperiodicで呼び出し、「タイマーが呼び出された時」でカウント表示のための変数を増減し、条件を満たした場合「タイマーを停止」を呼び出す。
【エラーの内容】
ボタンイベントで関数を呼び出し、その関数の中でループを行なっている場合にループ内の動作を行わない
【対処 [未解決]】
対処療法としてループ処理はsetup下で常に行い、関数が呼び出された場合に値を初期化する
【エラーの内容】
画像の表示でメモリ不足
【対処 [解決済]】
画像サイズを4KB程度にまで抑える
【エラーの内容】
ボタンを含めたイベント系を発火した際、その中で行われる処理が同期処理にならず全く意図した挙動にならない
【対処 [解決済]】
ボタンAを押した際に幾つかの処理を行う想定で対処法を述べる。
①ボタンAの中で行う処理を全て一つの関数にする
②関数を発火させるか否かをフラグで管理する
③ボタンAの中でフラグを変更し「発火状態」にする
④Setupの直下に無限ループである「ずっと」イベントを配置する
※100ミリ秒くらいの停止を入れると安全
⑤「ずっと」イベントの中でif文を書き、その条件文でフラグを使いボタン押下状態か否か(イベント発火状態か否か)を判断する
⑥if文の実行内容で関数を呼び出す
「Setup直下は同期処理される」という仕様を使った対処法です
これで非同期の苦しみから解放されます
今のところ最適解です
【エラーの内容】
ブラウザで実行時「SyntaxError: invalid syntax」などのエラーが出てしまい実行できない。
実行しようとしている処理が重すぎて発生するエラー
【対処 [解決済]】
①使っていない関数や変数、処理をことごとく削除する
②コードの冗長性を取り除く
③Chromeを再起動する
④UIFlowを再度実行する