ぺんた @plageoj
$ whoami
@plageoj Twitter / GitHub / Facebook / Qiita
広島大学工学部 3 年です。 専門は電子系。 趣味は情報系。
一部界隈では8bit マシンで Twitter をやる人として 知られています。
8bit マシンで Twitter の検索・投稿ができるようになるまでの 努力と涙と徹夜の記録です。
Twitter で就活垢を作って云々という話はしません。
かっこええやん、、、
出典 Tweet
(たぶん)世界最後の 8bit パソコン、PC-G850VS を使います。
高クロックとグラフィック性能が光ります。電池4本で70時間駆動!
さすがにポケコン単体で TCP/IP を実装するのはつらいので、 外部に通信用のコンピュータを接続して、そこで API との通信を おこない、結果をポケコンに転送&表示することにします。
ESP32 を使います。 AliEx で 700 円位で売ってる古いリビジョンで十分です。
Rapberry Pi なんかの Linux ボードが使えれば楽ですが、サイズと通信規格の問題で採用できませんでした。
ポケコン内蔵の Z80 SIO が使えます。
一般的な UART と論理が反対ですが、ESP で ソフトウェア的に対応ができます。
ソフトウェアで対処できないときは、NOT ゲート を 2 個使って、回路で対応しましょう。
最低 3 本線をつなげば、動作できます。 良い子の皆さんは保護回路を入れてください…
BASIC で書くのですが、エラーハンドリングの方法がないので、 完全にエラーが発生しないように書かなくてはいけません。
上記を常に意識していないと、プログラム全体の実行が止まります。
漢字は出ません。
8x8 ドットの漢字フォントを ESP32 のフラッシュメモリに載せて、ビットマップとして転送&描画することにしましょう。
高価なフォントデータは旧来 ROM として別売品で売られることが 多かったので、もはや ROM でなくなった現在も 漢字 ROM と よびます。大して役に立たない知識ではあります……
実はひらがなも出ません。
高校生のころ手打ちしたひらがなフォントデータ があるので、これを流用しましょう。
漢字同様、ビットマップとして描画することになりますが、フォントデータは 600B ほどなのでポケコンに内蔵できます。
漢字が出ないなら、当然入力もできません。
IME を自力開発する余裕はないので、巨人の肩に乗りましょう。
Google 日本語入力の APIがあるので、ここを叩いてあげれば よさそうです。
しかしポケコンで入力するのは SJIS の半角カタカナ。 API に投げるには UTF-8 の全角ひらがなでなくてはいけません。
ASCII 由来の半角英数字と一部記号(0x00 ~ 0x7F)については、 UTF-8 と SJIS はコンパチです。
が、それ以降はマルチバイトで文字を表します。
具体的には、日本語なら 1 文字あたり 3 バイト。 絵文字だと 4 バイトになります。
気になった人はコード表を見てみよう!
ASCII との互換、半角カタカナの JIS(旧規格)との互換を保ちつつ、
使われていなかった領域(0x80 ~ 0x9F、0xE0 ~ 0xFF)を 使って、半角文字は 1 バイト、全角文字は 2 バイトで表す方式です。
ポケコンの文字コードは、「漢字の出せない JIS」といったところ。 漢字領域を使うと文字化けしますが、その他については SJIS と 互換します。
iconv
結局、UTF-8 全角 →SJIS 全角は OSS のものを流用。 そのほかは変換テーブルを自作しました。
PHP だと 1 行で書けるのに(ブツブツ……)
例: 「漢字カナ混じりの文字列を転送」
END
この入力を受け取り、モードを切り替えながら、 画面の左上から順に、出力位置が破綻しないように描画します。
失敗すると漢字がぶつ切りになったり、漢字の表示途中で改行したり 半角文字を漢字で上書きしてしまったりします。
ESP32 のプログラムには Arduino C++を使いますが、さすがに 規模が大きすぎて、Arduino IDE で開発するとつらいです。
そこでおすすめなのがPlatformIO!
純粋な C++で開発ができ、VSCode で拡張機能を使うとゴリゴリに IntelliSense がききます。 組み込みマイコン開発の強い味方です。
参考:マイコン開発するなら PlatformIO がめちゃくちゃいいぞ
Twitter に書き込むようなリクエストを発行するときは、OAuth 認証が必要です。普段はSDKを使うと気にしなくてよいところも、 もちろん自力実装です。
面倒なのが、シグネチャの作成のために SHA1 が必要なこと。 組み込み用の mbedtls が動いてくれたので、これを使います。
mbedtls
参考:Twitter API から Arduino – ESP32 を使ってトレンドツイートを取得してみた
ESP32 は、実に 320KB もの広大な RAM を持っていますが、 通信系の処理がかなり大変らしく、結構ギリギリになります。
その結果、既製品の HTTP ライブラリや JSON ライブラリを使うと メモリが足りなくて動作しなくなってしまいました。
仕方ないので、最小限必要となる機能だけを実現する、省メモリな ライブラリを自作します。
ESP32 の WiFiClientSecure で、SSL 接続ができます。 その後の HTTP は自力で喋ります。
WiFiClientSecure
自力で HTTP を喋るの、そこそこ楽しいです。
Twitter API からのレスポンスは JSON で返ってきます。
が、JSON はファイルの末尾まで読まないと構造が確定できず、 パースする前に全部メモリ上に読み込まないといけません。
そんなことをするメモリはないので、送られてきた JSON を逐次 解析しながら、不要な部分は捨ててしまうようにします。
前半でお話しした漢字転送プロトコルでレスポンスを転送すると……
実際の描画速度が見たい方は 動画 をどうぞ。
Twitter ができるようになるまで 2 年かかった
Twitter ができるってすごい
漢字が出ることのありがたみ
一生 Unicode についていきます
コンピュータの歴史を切り開いた先人に感謝
Twitterをやると情報通信技術のアレコレに触れられる
姉妹品にご期待 ください (出るのか?)
今回、ESP32 から Twitter に直接アクセスしました。 ご想像のとおり、SDKを使わないのは茨の道でしかないです。
ただ ESP32 から Tweet したいだけなら、 SDK で踏み台を作って、HTTP か何かで叩くのがよいでしょう。
勉強のために作るとものすごくためになると思いますが、 間違っても本番環境・実プロダクトで真似しないでくださいね!
Qiita: ポケットコンピュータPC-G850VSからTweetする Note: ポケコン哀歌、きみと一緒に歩いた一年。 ……ポエム
GitHub: plageoj/twitter-for-pc-g850 …ESP32側 Gist: plageoj/N.F & plageoj/TW.BAS …ポケコン側