Raspberry Pi Zero 2 WによるGPSビーコンの消費リソース最小化

前記事でRaspberry Pi Zero 2 Wを使ったGPSビーコン(現在位置を定期的にサーバーに送信する追跡デバイス)を自作した際、ChatGPTさんのアドバイスを元にメモリや消費電力周りを最適化したので覚え書き。OSレベルというか、自作スクリプトと関係ない情報なので別記事にしておきます。

■ROM化

microSDカードのようなフラッシュメモリは書き込み回数により劣化が進むので、通常運用時は書き込みをしないようにします。現在のRaspberry OS 12系はBookwormという世代のDebianベースで、Overlay File Sytemというのを有効化するだけで、メモリ上に仮想ストレージを生成してログなどは全てそちらに書き込み、電源オフですべて消える、という形になります。電源投入毎に真っ新な状態から始まるので、ログが溢れるとかもないし、SDカードの劣化も抑えられるので長期放置運用にはもってこいです。

設定は標準設定コマンドraspi-configで簡単に行えます。

「Performance Options」→「Overlay File Systemなんちゃら」でYesで有効化、Noで無効化。続けてbootパーティションも無効化にするか聞かれ、raspi-config終了時に再起動を促されます。

色々設定を変更する時は無効化し、終わったら有効化するのを忘れずに!(有効化したまま設定変更しても再起動で戻ってしまいます)。

現在の状態確認は、

として、「overlay on / type overlay (rw,relatime,lowerdir=…,upperdir=…,workdir=…)」みたいなのが出れば有効、なにも出なければ無効です。

■リソースチェック法

諸々最適化を図る前に数値を取って効果検証します。

メモリ使用量

で現在のメモリ総量、残量、スワップ使用状況などが確認できます。

今回の場合、スタート状態はこんな感じでした。Pi Zero2はメインメモリ512MBですが、GPUメモリに初期状態で64MB割り当てられて目減りしていました。実質の残量が267Mi、スワップがわずか(2.8Mi)に使用されています。最終的にスワップ無効化までもっていきたい。

CPU温度

とするとSoC(CPU)温度が出力されます。初期状態で60℃ほどでした。公式の推奨動作温度範囲は0~ 85℃で80℃程度からサーマルスロットリング発動するぽい。まだまだ安全圏ですが、これは室内での数値なので、車内に隠蔽設置した際は夏の気温や暖房の影響で更に上がる可能性もあります。できるだけ下げておきたいところ。

■やったこと

[予習] config.txtの編集方法

以下の設定のいくつかは/boot/firmware/config.txtを編集することで行います。通常は/bootパーティションはro(read only)でマウントされているので、シェルから直接編集はできません。mountコマンドでrwで再マウントするなども可能ではあるんですが、今回はmicroSDをPCにマウントしてルートディレクトリにあるconfig.txtをエディタで編集しました。

GPUメモリ割当を減らす(64GB → 16GB)

現在の割り当ての確認は、

です。64GBでしたが、GPSロガーではXのようなGUIは使わないので余剰に割り当てされていると言えます。最低の16GBに変更しました。なお実際の使用量をリアルタイムで確認するのはGUIツールが必要っぽいので本末転倒なので断念。どのみち使わなければ発熱にはさほど影響しませんが、メモリをがっつり取り返せるので効果は大きいと思います。

config.txtの[all]セクション辺りに、

と書きます。

動作クロックを制限する(1.2GHz → 1.0GHz)

発熱を抑える施策です。config.txtの「arm_boost=1」の箇所を「arm_boost=0」に書き換えます。

不要なデバイスを無効化する

該当箇所を探してコメントアウト(行頭に#をつける)していきます。

Bluetoothの無効化

いっさい使わないので無効化します。これはコメントアウトではなく、行を追加します。

LEDを無効化

ボード上のLEDを無効化します。どうせ見えないところに隠すし、光ってない方が見付かりにくいでしょう。ただし今回装着したGPSモジュールHAT上のLEDは消えないので気休め程度です。消費電力が1~2mA(全体の1~2%程度)減らせるようです。

これもconfig.txtの[all]ブロックに追加します。

Wi-Fiのパワーセーブを無効化

これは逆に消費電力を増やす措置ですが、通信を安定かさせるためにやってみました。GPSロガーでは一定時間毎にサーバーに現在位置情報を送信しますが、システムが一定時間通信がないとWi-Fiを節電モードにしてしまい、復帰に数秒かかってしまうことがあるということで、それを無効化(=省電力しない)。

現状確認

で、「Power save: off」とか「Power save: on」とか出ます。

オフにするのは、

ですが、システム起動時に自動実行するためには少し操作が必要です。色々方法はありそうですが、とりあえずChatGPTさんに聞いたやり方。

/etc/rc.localに記述。今回は存在していなかったので新規作成しました。

最初と最後の行も必須です。ファイルを作ったら実行可能フラグつけます。

次に、/etc/systemd/system/rc-local.serviceを以下の内容で作成します。

そしてサービスとして登録。

これで起動の度に無効化されるはずなので、念のため「iw dev wlan0 get power_save」してみましょう。

■ログインメッセージを省略

システムリソースへの影響はほぼないですが、デフォルトのログインメッセージ の「The programs included with the Debian GNU/Linux system are free software;~」みたいな10行くらいの英文がうっとうしいので削除しました。/etc/motdの内容が差し込まれるので、これを空にします(削除ではなく中身を消す)。

■スワップを無効化

あれこれいじったおかげで、メモリ総量が50Miほど増えて、スワップ使用量が0にできました。

残量も300Mi以上あるのでスワップを無効化してよさそうです。

sudo nano /etc/dphys-swapfileをエディタで編集し、「CONF_SWAPSIZE=0」とします(最初は512とかだった)。その後、

とします。free -hを実行して、Swapの行がすべて0になっていれば完了です。

■成果確認

諸々の設定を施して、

  • メモリ総量: 416Mi→ 464Miに増加
  • メモリ残量: 267Mi → 308Miに増加
  • スワップ使用量: 2.8Mi → 0Miでスワップを無効化
  • 温度: 60℃超え → 48℃程度に低下

という最適化ができました。消費電力としては測れてないですが、温度が10℃以上下がったのは達成感あります。

iPhoneのショートカットで素早くヤマトの追跡URLを作って共有する

久々にiOSの「ショートカット」アプリ触りました。

私は誰かに宅急便で荷物を送る際、伝票番号を知らせるクチです。曜日や時間帯はいつがいい?とか聞いてくれるよりも、クロネコメンバーズで伝票番号くれたら自分で適当に変更するからいいよ、って思います。

そしてクロネコメンバーズでなかったり伝票番号から到着予想日時を調べるリテラシーがない人でもリンクを開けば一発で配送状況がわかるURLを作って送ります。本記事はそれを最小の手間で行うための覚え書きです。iOS/macOSの「ショートカット」アプリを使います。特に最近は配送ロッカーのPUDOステーションから発送した時に表示された伝票番号をiPhoneのカメラでメモすることが多いのですが、iPhoneの「写真」アプリのOCR機能と組み合わせると、写真から直接伝票番号を読み取ってURLを生成できるのでとても効率が良いと自負しています。

■利用イメージ

全ての設定が完了すると、こんな感じで使うことができます。

例えばPUDOステーションから発送手続きをした場合、タッチパネルに伝票番号が表示されるので、iPhoneのカメラで撮っておいたとします。あとで「写真」アプリでそれを開き、伝票番号の辺りを長押しすると文字として読み取ってポップアップメニューが表示されます。場合によってはタッチした4桁しか選択されないことがあるので、必要に応じて青丸で範囲を引き延ばして12桁全てを選択します。

PUDOの発送画面の写真から読み取る例

ポップアップの右端に「共有…」が出て、その中から「ヤマト追跡リンク」を選択。

元が写真でなく、Webページやクロネコアプリ上に表示されたテキストとして伝票番号がある場合は、それをクリップボードにコピーした状態で「ヤマト追跡リンク」を開けばその番号が使われます。

これでSafariでヤマトの追跡ページが開くので、正しくステータスが表示されているのを確認したら、あとはこのページのURLをコピペするか、共有メニューからメールやLINE、メッセンジャーなどお好きな手段で相手に教えてあげればOKです。

Safariでヤマトの追跡ページが開かれる

どうでしょう?「ショートカット」はiPhone/iPad/Macで同期されるので、どれかで設定しておけば、他のデバイスからも使えます。

便利だと思ったら、以下の手順で設定してみてください。

■設定方法

こちらのリンクを開き、「ショートカットを入手」をタップ。さらに「ショートカットを追加」をタップ。すると一覧に「ヤマト追跡リンク」というアイテムが追加されるので、右肩の「…」をタップします。

レシピ内容はこんな感じになってると思います。リンクが不正に書き換えられている恐れもあるので、念のため内容がこの通りか確認してください。

大丈夫なら一番下の「i」ボタンを押します。

「共有シートに表示」がオンになっていることを確認します。またクリップボードからの処理を手早く行いたい人はここで「ホーム画面に追加」もしておくと良いでしょう。

終わったら「完了」を2回おして一覧画面に戻ったら完了です。

ちなみに共有シートの中で下の方に沈んでて選びにくいよって場合は、一番下の「アクションを編集…」をタップして一覧を出し、左の「+」を押してやれば上のお気に入りの方に移動することができます。

■詳細解説

他人が作った「ショートカット」を入れるのは不安、自分で理解しながらイチから作りたいって人のために、1ブロックずつ解説していきます。ちょっとしたプログラミングなので興味があるかたは是非。

基本的には画面下(Macなら右上)の検索欄でブロック名を検索し、青字のところを写真の通りに書き換えていってください。

「ショートカット」アプリのトップ画面から右上の「+」をおして編集を開始します。まず一番上の「新規ショートカット」などとなっているところをタッチして「名称変更」しておきましょう。今回は「ヤマト追跡リンク」とします。この名前が共有シートやホーム画面に出る時の名前となります。

いきなりですがレシピの完成形がこちら。これと見比べながら以下の解説に沿って作っていってください。

ブロック1

最初の入力を受け付けるブロックです。「入力からテキストを取得」ブロックを検索して追加します。次に「入力」と青字になっているところをタップして「共有シート」スイッチをオンにすると「共有シート」に置き換わります。「画像、その他18個」も選んで「テキスト」以外はオフにしておくと、余計な場面で表示されなくてオススメです。「もし入力がない場合:」の下の「続ける」を「クリップボードを取得」にしておくと、文字通り、共有シートからの呼び出してない時に、クリップボードに入っている文字を使ってくれます。

ブロック2

「変数を追加」ブロックを検索して追加します。自動的に上のブロックの出力である「ショートカットの入力」がセットされていると思うので、「変数名」だけ「伝票番号」にしておきます。簡単にいうと「伝票番号」という箱を用意して上ブロックから送られて来たテキストを放り込むという意味です。こうして名前付きの箱に入れることで、後で加工や取り出しがしやすくなるのです。「伝票番号」は呼び名なので、次のブロックで同じ名前を指定していれば、「あああ」なんでも構いません。自分がわかりやすいことが重要です。

ブロック3

伝票番号は「1234-5678-9999」のように4桁の数字が3つ、「-」で連結されていることが多いですが、問い合わせページに送る時は「123456789999」のようにハイフン無しの状態である必要があるようです。そこで、「テキストを置き換え」ブロックを追加します。

ここでも親切に上のブロックでつけた変数名「伝票番号」が自動でセットされると思います。あとは”何”を”何”に置き換えるか、という2つの要素を指定します。ひとつめ(「こんにちは」と薄く出ているところ)に半角ハイフンを入れます。今回はハイフンを無くしたいので、ふたつめは空にしておくのがポイントです。ちょっとトリッキーですが最初の例文の「世界」が薄く表示された状態が空を意味するようです。

ブロック4

いよいよSafariで開くためのURLを作ります。ヤマトの荷物を追跡するURLはこんな形式になります。

末尾の数字が伝票番号(からハイフンを除いたもの)です。つまり、「https://member.kms.kuronekoyamato.co.jp/parcel/detail?pno=」と上のブロックで作ったテキストをつなげやれば完成です。

新しいテキストを作るので「テキスト」ブロックを追加します。「https://member.kms.kuronekoyamato.co.jp/parcel/detail?pno=」までを一字一句正確に入力し「=」の右にカーソル(チカチカ)がある状態で「アップデートされたテキスト」をタップします。これは文字通り上の「テキストを置き換える」ブロックで処理した結果を意味するので、結果として手入力したアドレスとアップデートされたテキストがつながったURLが出来上がるというわけです。

ブロック5

上から振ってきたテキストをURLだと信じてSafariで開く処理を行います。「URLを開く」ブロックを追加します。水色文字は「テキスト」となっていると思います。ブロックとブロックの隙間をみると線でつながってますので、上の処理結果がそのまま入ることを意味しています。

以上で完成です。右上の「完了」を押して保存しておきます。

ショートカットの削除方法

試行錯誤してるうちにいくつも無駄なショートカットができちゃった、とか、思ったほど便利じゃないからイラナイ、ってなった時に消す方法にも触れておきます。ちょっとわかりにくいので。

答えは「すべてのショートカット」と出ている一覧の画面で消したいショートカットの枠を長押しします。するとメニューが出て一番下に赤字で「削除」があります。消したら復活できないので、間違って使うものを消してしまわないよう注意してください。

ヤマトの追跡ページについて

URLのパラメーターに伝票番号を入れて一発追跡するリンクで調べると、どのページも

を紹介しています。これを開くと問い合わせたい伝票番号を入れる欄が10個出て、その1つ目に指定した伝票番号がセットされた状態のページが開きます。その追跡結果は画面をスクロールしないと見られずひと手間です。

今回しようしたクロネコメンバーズサイトのURLならばより目立つ位置、大きさで追跡結果が表示されているので、受け取った相手も情報を見つけやすいんじゃないかと思います。クロネコメンバーズに登録していなくても見られますし、登録済みならそのままMy荷物に追加もできて便利なんじゃないかと。

dgKeyframe2Chapterをリニューアル/オープンソース化しました

かなり以前、TMPGEncシリーズのチャプターインデックス情報ファイルである.keyframeファイルを、mp4chap.exeなどに読み込ませる「hh:mm:ss:fff」形式のタイムコードファイル.chapters.txtに変換するdgKeyframe2Chapterというユーティリティを作成しました。

dgKeyframe2Chapterをリリースしました

dgKeyframe2Chapeter 1.3をリリースしました

もう10年近く前ですね、、

自分でもだいぶ使用頻度が落ちてきていますが、たまに機能要望などをいただくので世界で10人くらいは使っておられるのかも知れません(笑)。そして先日久しぶりにまたリクエストをいただいたので、COVID-19でヒマなGW中にやってみましょうかと久しぶりにソースを開いたら、あ、これVB.NET/WinFormsで作ってたんだった…リクエストのあった機能を足すだけなら頑張って思い出して作るのもアリでしたが、今後もメンテするとなると慣れているC#/WPFで作り直そうと決意。といいつつC#も数ヶ月ブランクがあって色々忘れておりGW中かかってしまいましたが一応完成。

ついでにGithubでソースも公開しておきました。通常利用の場合、「Release」タブから最新版のzipをダウンロードしてください。そんなに自分で使い込んでないので、細かいバグや使い勝手の悪さがあるかも知れません。なにかあればGithubのIssuesかこの記事のコメント欄にでもお知らせ下さいませ。

どうせなら最新版でと.NET Frameworkも4.8ベースに移行したので環境によってはそちらの導入も必要になるかも知れません。Windows 10 May 2019 Update (1903)以降なら導入済みのはずです。

VB.NETをC#に変換してみた時の作業メモ

プログラミングの話題です。

Xamarinとか考えるとVisual StudioではVB.NETはオワコンでC#に移行すべきなんだろうなぁという雰囲気は以前からありましたが、Visual Studio for Mac(C#のみ)なんてのまで出てきちゃってさらに加速してきた感があります。Swiftもオープンソース化されて今後様々なプラットフォームの開発ができるようになるかもですが、現状C#ならWin/Mac/iOS/Androidいけちゃうわけですし。もちろんそれぞれGUI周りの実装が違うので、1つのソース(プロジェクト)で各プラットフォームのビルドが一発でできちゃう、とかいう世界にはまだならないですが、関数とかオブジェクトとか(内部処理的な)ライブラリを共有、転用できるだけでも大きなメリットでしょう(想像)。

ということでVisual Studio 2017を入れて見たついでに、実験的にフォーム1つだけの小さな自分用WindowsアプリをC#で作り直してみようかと思い立ちました。C#の勉強の為にはゼロから作り直す方が良いんでしょうが、とりあえず世の中にはVB->C#のコード変換をしてくれるツールがたくさんあるということだったのでまずはそちらで雰囲気をつかんでみることに。ポインタアレルギーを脱してないヘタレプログラマなので、Cと名のつくものは不安が先行しがち(^^;)。

で、最初に試したローカルアプリ型のツールはいまいちよくわからなかったので、ブラウザ上でコードをサクっと変換してくれるこちらを使ってみました。プロジェクトレベルで変換してくれるわけでなく、あくまでテキストレベルでVBコードをC#コード文法に書き直してくれるだけなので、VS2007上でC#の新規Windowsフォームアプリケーションのプロジェクトを作りました。そしてフォームデザイナーで土台となるフォーム(Form1)のプロパティだけ揃えておいて、載ってる部品を全選択して一括コピペします。ペーストされる座標が揃いませんが、カーソルキーで適当に揃えて確定。これでボタンやリストなどは名前やプロパティをそのまんま移植できました。次にForm1のコードをエディタで開き、上記サイトでまるっと変換したC#コードをペースト、、、しただけでは上手くいきませんでした。以下思い出せる範囲でメモ。

■using周り

冒頭にインポートするライブラリが、デフォルトのテンプレートと、変換したもので食い違います。特に変換した方のコードには、

なんてのが含まれています。どうもVB特有の関数やオブジェクトを使用するDLLらしいです。個々にうまく変換できなかったものを手直ししてても意外とVBにしかないものがあるみたいです。C#で全面的に書き直すのも手なんですが、.NET Frameworkに含まれるDLLなので使ったからといってユーザに別途追加インストールが必要になるとかではないので、特にこだわりがなければ使ってもいいんじゃないでしょうか。ゼロから書き直すプロジェクトなら避けた方がスリムなんでしょうけど。

特にファイルコピー周りの処理でVBの方が便利なところがあって、最終的には

というのも追加していくつかVB固有機能を使用しました。

逆に変換コードにはあってデフォルトテンプレートにあるものは名前からして使わなそうなものはコメントアウトしました。

■各メソッドの貼り付け場所

C#のバージョンの違いなのか、Form1クラス定義の開き方も少し違ってたりなので、念のためテンプレのままとし、クラス内のメソッド定義単位でペーストしました。

なんかはテンプレの方にもあるので重複に注意です。

■コードの手直し

ぶりっとコードをペーストすると盛大にエラーが出ます。さすがにそのまま完璧に変換とはいきません。

例えば、配列の添字がVBでは()、C#では[]ですが、これは自動では置換してくれません。()が他の意味にも使われている箇所があるので、自動では判別が難しいようです。

例えば、

なんてコードに対して、「メソッド名が必要です」が出て意味不明ですが、tmp[0]に直してやると消えます。文法的にはtmpという変数にいきなり引数がついてるので、「temp.hoge(0)みたいにメソッドがあるはずじゃねぇの?」という推論なんでしょうかね。まぁVSの推論エンジンですら、そこは配列の添字じゃないの?と提案できないくらいなので、サードパーティの無料自動変換プログラムができなくても責められないでしょう。わかってしまえば単純作業なのでせこせこと直していきます。

次に多かったのは、

のように文字列を文字列で分割して配列に格納したりするコードに対して、「‘string’ から ‘char’ へ変換することはできません。」と出ます。(古い.NETの)C#のSplitは分割文字として文字列ではなく単一の文字(char型)しか使えなかったらしい名残のようです。もともと分割の区切り文字が1文字の場合は、char型であることを明示するよう、ダブルクオートをシングルクオートに直してやるだけでOKです。

とか。では2文字以上の文字列を使いたい時は?ちょっと文法が変わりますが、同じ.Splitで

のようにすればいいみたい。めんどくさ!

■My.settingsへのアクセス

VB.NETではアプリの設定など短い情報を保存するMy.settingsという仕組みがあります。もちろんC#にもあるんですが、アクセス方法がちょっと違います。

となってる箇所に「現在のコンテキストに ‘My’ という名前は存在しません。」と出ます。MyのかわりにProperties(複数形なので注意)とし、Settingsの後にDefault.を挿入します。

これは変換サイトの方で頑張ってほしかった案件です。

もちろんセッテイング項目は自分で作り直しています。どこかのXMLファイルをコピーすれば一発かも知れませんが、まぁ数個だったので手で移しました。

■中身が移ってないイベントハンドラがある

変換後のコードで、変換処理にこけたのかわかりませんが、イベントハンドラの{}の中身が空のままのコードがいくつかありました。エラーもないのでちょっと恐いですね。全体見渡したり、数をチェックしたりして抜けがないか確認が必要です。

■GUIパーツと各イベントハンドラコードの紐付け

ある程度コードを手直し、よやくエラーが0になってビルドしてフォームが表示された時は感激です。しかし、一瞬後に絶望へとかわります。どのUIパーツをクリックしても反応しないのです。試しにデザイナーから適当なボタンをダブルクリックして、コードエディターに挿入されたイベントハンドラにMessageBox.Showとか書くと機能します。つまり、コピペでもってきた各ハンドラとデザイナー上のUIパーツが紐付いていないようなのです。一瞬、全てのパーツに同じ事をして{}内を書き写さないとダメなのかと青ざめましたが、幸い少しだけマシな方法がありました。

デザイナーでどれかのパーツを選択し、プロパティウインドウでイナズマのアイコンをクリックします。そうするとここにそのUIパーツが受け取れるイベント一覧が出てくるので、Clickなどコードを割り付けたいイベントを探し、その右列をクリックします。するとプルダウンメニューで当該Formのコード内にあるハンドラ一覧が出るので、選択してやれば紐付け完了です。

UIパーツはたくさんありますし、ひとつのUIパーツにClickとDouble ClickとEnterとなどなど複数のイベントを設定することも少なくないので、結構大変な作業になります。VBとC#のプロジェクトを同時に開いて1つずつ見比べながら書き写してくしかありません。またコード側からどこにも紐付いてないイベントハンドラが残ってるかどうかを知る術もありません。

まぁきっとこれもデザイナーのソースとなるテキストファイルを丸コピーできれば一緒に反映されるような気もするんですが、わかりませんでした。

■まとめ

上に書いた以外ではファイル周りで変換しきれていないコードがあったりしましたが、まぁVB.NETとC#の違いを調べながら書き直すのは良い勉強になりました。

むしろ大変なのは先のイベントハンドラの紐付けや設定項目の再作成など、Visual StudioのGUIでする作業の移植ですね。バージョン情報などを含むアセンブリ情報などもごっそりやり直しです。これは今回使ったようなコード変換系のサービスの難点でしょう。

先に使ったプロジェクトを読み込んで変換するタイプだとここらも一括で面倒みてくれるかも知れません。Webツールに移行する前にもう少しいじり倒してみればよかったかな。今回はForm1しかない小さなツールだったのでまだよかったですが、より大規模なソフトウェアの場合などは抜け漏れのチェックも大変になってきます。

いずれにせよC#自体は想像してたほどVBとかけ離れてたり、いきなりポインタの理解を迫られたりするようなものではなかった気がします。少なくともVBでできていたことを移植するだけなら、いくつかのVB固有関数を除けばほぼ単純な文法置換(()を[]とか文末セミコロンとか)で済みそうです。残りのVBプロジェクトを全部C#に移行させる理由はいまんとこないですが、今後新規に作る時はC#にしてみようかなというくらいの気持ちにはなりました。あとは買っておいた解説本を眺めておこうと思います。

確かな力が身につくC#「超」入門 (Informatics&IDEA)

確かな力が身につくC#「超」入門 (Informatics&IDEA)

北村 愛実
6,730円(04/15 13:48時点)
Amazonの情報を掲載しています

 

Swift Playgrounds 入門コンテンツの解説サイト作りました

少し前からサイドバーで紹介してますが、Apple がリリースしているiPad向けプログラミング学習アプリ「Swift Playgrounds」の攻略サイトというか、コード例と解説を掲載したサイトを作りました

Swift Playgroundsはアプリ内で教材コンテンツを追加ダウンロードする仕組みになっていますが、その入門コンテンツである「コードを学ぼう」の1と2の全ステージを本日ようやく網羅しましたので改めてご紹介。

プログラムに唯一絶対の正解はないので、単なる攻略サイトみたいなものを作るのは野暮かと思いましたが、それでも「プログラミングを勉強したいけど、身近に聞ける人がいなくて先へ進めず諦めてしまった」なんて不幸が回避できるならと思い、コードはあくまで正解“例”であることを強調しつつ、アプリ内の出題でカバーしきれてない部分の解説を丁寧にするよう心がけました。さっそく親子で参考にしていただいたというコメントもいただきやってよかったなと。

しかしやっと1,2が終わったとほぼ同時にPlaygrounds自体がアップデートされ「コードを学ぼう」も3がリリースされてしまいました。個々の解説を丁寧に書きすぎて結構時間がかかってしまったので、ちょっと今すぐ続きに着手できるかはビミョウな気持ちです(^^;)。まぁ、ざっとみた感じ3は基本を離れてよりクリエイティブな内容に寄っている印象なので、このサイトの役割としては少し範囲外かなという気もしています。Swiftの基本文法やループ、条件分岐、変数、配列といったプログラミング言語に共通の概念については「コードを学ぼう」1と2で一通り触れており、そのフォローという意味で一区切りかなぁと。まぁ1,2の反響や要望をみてまた考えます。

英語版が公開された時にいくつかのITサイトの連載やブログで紹介されたものはありますが、3月に日本語化されてから本格的に全ステージを網羅したものはたぶんまだなかったと思うので、まだ不完全ながらも、これからPlaygroundsにチャレンジしてみようと思う人の助けになればなと思います。