marp | paginate | _paginate | theme | header | _header | title | footer | _footer | _class |
---|---|---|---|---|---|---|---|---|---|
true |
true |
false |
gaia |
Twitter をしよう! |
Twitter をしよう! - サマーインターンの前にツヨツヨになっちゃおうの会 |
ぺんた ([@plageoj](https://twitter.com/plageoj))・広島大学工学部 |
lead |
ぺんた @plageoj
@plageoj Twitter / GitHub / Facebook / Qiita
広島大学工学部 3 年です。 専門は電子系。 趣味は情報系。
一部界隈では8bit マシンで Twitter をやる人として 知られています。
8bit マシンで Twitter の検索・投稿ができるようになるまでの 努力と涙と徹夜の記録です。
- OSI 参照モデル5~7層
- ちょっとした電子工作
- 基本的なコンピュータ構成の知識
Twitter で就活垢を作って云々という話はしません。
かっこええやん、、、
(たぶん)世界最後の 8bit パソコン、PC-G850VS を使います。
CPU | Z80 相当 CMOS 互換品 @ 8MHz |
メモリ | RAM 32KB (約 30KB が使用可能) |
ストレージ | RAM と共通。増設不可 |
画面 | 144x48 ドット / 24x6 文字 モノクロ液晶 |
対応言語 | BASIC、C、CASL、Z80 アセンブリ |
高クロックとグラフィック性能が光ります。電池4本で70時間駆動!
さすがにポケコン単体で TCP/IP を実装するのはつらいので、 外部に通信用のコンピュータを接続して、そこで API との通信を おこない、結果をポケコンに転送&表示することにします。
ESP32 を使います。 AliEx で 700 円位で売ってる古いリビジョンで十分です。
Rapberry Pi なんかの Linux ボードが使えれば楽ですが、サイズと通信規格の問題で採用できませんでした。
一般的な 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 と 互換します。
ポケコン | SJIS | UTF-8 | |
---|---|---|---|
半角英数 | ASCII 準拠 | ASCII 準拠 | ASCII 準拠 |
半角カナ | SJIS 互換 | 1 バイト | 3 バイト |
半角かな | 半角カナ使用 | - | - |
全角 | - | 2 バイト | 3 バイト |
結局、UTF-8 全角 →SJIS 全角は OSS のものを流用。 そのほかは変換テーブルを自作しました。
PHP だと 1 行で書けるのに(ブツブツ……)
例: 「漢字カナ混じりの文字列を転送」
モード | G | T | G | H | G | H | G | T |
---|---|---|---|---|---|---|---|---|
データ | 漢字 | カナ | 混 | ジリノ | 文字列 | ヲ | 転送 | END |
- G ……16 進数文字列を送信。ビットマップとして描画。
- T ……テキストを送信。そのまま出力。コマンドもこのモード。
- H ……テキストを送信。ひらがなで出力。
モード | G | T | G | H | G | H | G | T |
---|---|---|---|---|---|---|---|---|
データ | 漢字 | カナ | 混 | ジリノ | 文字列 | ヲ | 転送 | END |
この入力を受け取り、モードを切り替えながら、 画面の左上から順に、出力位置が破綻しないように描画します。
失敗すると漢字がぶつ切りになったり、漢字の表示途中で改行したり 半角文字を漢字で上書きしてしまったりします。
ESP32 のプログラムには Arduino C++を使いますが、さすがに 規模が大きすぎて、Arduino IDE で開発するとつらいです。
そこでおすすめなのがPlatformIO!
純粋な C++で開発ができ、VSCode で拡張機能を使うとゴリゴリに IntelliSense がききます。 組み込みマイコン開発の強い味方です。
参考:マイコン開発するなら PlatformIO がめちゃくちゃいいぞ
Twitter に書き込むようなリクエストを発行するときは、OAuth 認証が必要です。普段はSDKを使うと気にしなくてよいところも、 もちろん自力実装です。
面倒なのが、シグネチャの作成のために SHA1 が必要なこと。
組み込み用の mbedtls
が動いてくれたので、これを使います。
参考:Twitter API から Arduino – ESP32 を使ってトレンドツイートを取得してみた
ESP32 は、実に 320KB もの広大な RAM を持っていますが、 通信系の処理がかなり大変らしく、結構ギリギリになります。
その結果、既製品の HTTP ライブラリや JSON ライブラリを使うと メモリが足りなくて動作しなくなってしまいました。
仕方ないので、最小限必要となる機能だけを実現する、省メモリな ライブラリを自作します。
ESP32 の WiFiClientSecure
で、SSL 接続ができます。
その後の 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 …ポケコン側