おは代々木ダイアリー

いろいろ試したメモを書きます。このブログはアフィリエイトを使用したプロモーションを含みます

ESP32_Core_board_V2 や Arduino UNO といったシリアル通信に使えるボード

機器の状態を見たりするときに重宝する「シリアル通信」を、マイコンの開発ボードを利用してパソコンから行う方法をご紹介します。

はじめに

動作している機器の状態を把握するのにシリアル通信を行ってログを確認するのはとても有用な手法です。従来であればRS232CといったCOMポートを積んだマザーボードなどもありましたが、最近ではめっきり見なくなったような気がします。

最近では、USB接続で使用できるシリアル通信用のモジュールがデファクトとなっていますが、プラグアンドプレイなので抜き差しでリセットできたり、確かに合理的だなという感じです。が、一方でわざわざ買わないと手に入らないものとなってしまったこともまた事実かなと思います。

今回はそんな、急にシリアル通信をしたくなったときにも使用できる、マイコンの開発ボードを代替として利用する方法をご紹介します。

代替①: Arduino UNO

おそらくもっとも初心者向けで、持っている人も多いのではないかと思われる「Arduino UNO」です。

メインであるチップ ATMEGA328P-PU と通信をするために使われるシリアル通信ポートをそのまま使ってしまおうというものです。

このように、RESETGND を短絡することでATMEGA328P-PUを動作させなくして使うことができます。(ATMEGA328P-PUを抜いてもいいということですが、それはおっかないので短絡するのがいいんじゃないかと思います)

ArduinoUNOをシリアル通信に使う(RESET-GND短絡)

代替②: ESP32_Core_board_V2

ちょっとこれは持っている人限られてしまいますが、ESP32 Core boardというものがあります(たまたま手元にあったのはV2と銘打たれているものでした)。ピンが2.54mmのピッチで配置されていて、ブレッドボードに刺して使うことができるマイコン ESP-WROOM-32 の開発ボードです。

こちらのボードもArduino UNOと同様、メインのチップ ESP-WROOM-32 とシリアル通信を行うための CP2102 というチップが積まれていて、それを利用することができるので代用してみます。Arduino UNO同様、ENGND を短絡することで、メインのチップを無効化しつつシリアル通信を行うことができます。

ESP32_Core_board_V2をシリアル通信に使う(EN-GND短絡)

メリット

今まではArduino UNOを使用していましたが、ESP32_Core_board_V2を使用してみて、便利だなと思った点はブレッドボードと組み合わせて使うと周辺の拡張もそこに入れることができてコンパクトにまとまるという点です。

ArduinoUNO(上)とブレッドボードに刺したESP32開発ボード(下)

今回は、Hが3.3Vであるチップとの通信(単方向)を行いたかったため、別途3.3V→5Vの変換を行うレベルシフト回路をブレッドボードに付け加えています(NPNトランジスタ2SC1815Lを使用したエミッタ接地を使っています)が、このコンパクトさ。そしてUSB TypeBからmicroUSBに変更となってケーブルの面でも比較的使いやすくなったかなと思っています。

おまけ: シリアル通信の動作確認

今回、正しくシリアル通信できるかを確認するために、以下の方法で確認を行っています。

  • RXとTXを短絡する
  • cuコマンドでターミナルからシリアル通信を開始する(例: cu -s 115200 -l /dev/ttyUSB0
  • 適当にタイプする(タイプしたものが画面に表示される)

終わりに

今回は、USB-to-TTL 変換を行うシリアル通信モジュールの代替品としてマイコンの開発ボードを使うというネタで書かせていただきました。ちゃんと解析するのであれば、ロジックアナライザを購入すべきかなとは思うのですが、Amazonでポチってからのタイムラグを考えると手元にあるもので何とか試したいと思ってしまい、ついつい代用品で賄ってしまいます・・・(そしていつまでも買わない)。

今調べてみると買っても大した値段ではないですね(1000円しない)。

まぁでも死蔵しているよりはマシかなと思うので、みなさんもぜひ死蔵している開発ボードがありましたらシリアル通信に使用してみるといいのかなと思います。

GMKtec nucbox3 を購入しました。ファンレス Celeron J4125 マシンはメモリ16GBの夢を見るか

性懲りもなくまたCeleron J4125のファンレスPCを購入しました。

はじめに

筆者はCeleron J4125のファンレスミニPCを何度か購入していますが、今回ネットで以下のように「Celeron J4125を積んだPCには16GBメモリに対応したものもある」といった内容の投稿を見かけました。

実際に16GBメモリを積んだCeleron J4125搭載PCは販売されており、ネットの噂とはいえワンチャン動くのでは?という期待が持てました。

そして最近知ったのが、メモリがオンボードでなく換装可能なファンレスミニPC 「GMKtec nucbox3」の存在。ちょうどいい感じに家にDDR4 16GB SODIMMなメモリが転がっていたので試してみない手はないと思い購入しました。引用したツイートの人は「1スロットじゃダメ」といったことを言っていますが、果たして・・・

公式的には最大メモリは8GB

とはいえ、16GBメモリ対応は公式にうたわれているわけではありません。実際に以下のintelのサイトを見てみてもCeleron J4125が対応しているのは最大8GBメモリとなっています。

www.intel.co.jp

「GMKtec nucbox3」の商品紹介ページを見てみても、16GB積めるといった内容は書かれていません。

www.gmktec.com

ですので、ここからの内容は 公式にサポートされている内容ではなく、壊れたとしてもメーカーからサポートが得られる保証はありませんので、お試しになる際は自己責任にてお願いいたします。

GMKtec nucbox3 購入所感・レビュー

とまぁ、能書きはこの程度にして、写真などをぺたぺた貼りつつ、所感を書きたいと思います。

GMKtec nucbox3 結構デカいぞ?!

GMKtec nucbox3。意外と大きい

まず最初に思ったのは、デカい ということです。「nucbox」という名前の通り、NUCに準拠したサイズなのかなとは漠然と思っていましたが、NUCを過去に購入したことのない自分にとっては大きく感じました。

左から CHUWI Larkbox, MeLE Quieter2Q, GMKtec nucbox3

同じCPUを詰んでいるミニPC「CHUWI Larkbox」「MeLE Quieter2Q」と並べて撮影してみましたが、やはり大きさが際立ちますね。ファンレスPCということで大きさ(ヒートシンクの)は正義なわけなんですが、小さいのが欲しいって人にNUCは大きいんじゃないの~?という感想を抱きました。

Core i7でNUCのサイズ!」だとインパクトありますが、J4125だしなあ・・・

nucbox3大きさ比較

iPhoneと並べると大きさのイメージ掴みやすいかな?と思い並べてみました。サイズ感的にはやっぱMeLE Quieter2Qが好きだなあ自分は。

GMKtec nucbox3 推しポイント「12V DC IN」

サイズ感で早速マイナスポイントを書いてしまいましたが、nucbox3にも推せるポイントがあります。それはACアダプタの仕様。

GMKtec3 nucbox3の電源仕様は推せる

個人的にほかの中華PCにありがちな「偽USB-C(12V)」な電源って大嫌いで、買うたびに辟易していたんですが、nucbox3のシンプルな電源ポートは推せます。径や極性を揃えればほかのACアダプタを使用できますし、12V出力のモバイルバッテリーでポータブル構成も取りやすい。ほかのミニPCも見習ってくれ・・・

GMKtec nucbox3 推しポイント「換装可能なメモリ」

ミニPCはそのサイズ感の達成のためにメモリを直接マザボに実装されているオンボードな構成が多いのですが、このGMKtec nucbox3はメモリが換装可能となっています

nucbox3 はメモリ換装可能!

つまり、自分でブランド・性能・容量を選んでカスタマイズすることができるということ。まぁ今回の検証ではメモリを16GBに載せ替えたいわけなので、マストな仕様ですが。

(公式ページの画像↓は大嘘ですけどね。)

公式より引用 https://www.gmktec.com/products/nucbox-3-mini-pc-windows-11-home-os

nucbox3のメモリを16GBに換装しよう

というわけで、さっそくメモリを16GBに換装してみます。

今回使用したのはコチラのCrucial DDR4-2666 SODIMMなメモリ。確かThinkpad e495買ったときに増設用に2枚買ったんですが、32GB構成だとKP41で突然死するので抜いたやつ。

nucbox3 に Crucial PC4-2666 16GB SODIMM 装着

BIOSで確認

イエーイ。2400 MHz で動作しているようです。

16GB RAM on GMKtec nucbox3

Windows上からも認識

Windowsからも16GBで認識されていますし、いけてそうですね

GMKtec nucbox3 はいいぞ

ファーストインプレッションでは「大きいなあ」というネガティブなイメージを抱いてしまいましたが、ほかのミニPCにはない以下のような特徴がありそうです

  • 最大メモリ容量は 16GB (公式でサポートされたものではない)
  • 電源は高い互換性のある12Vの2極端子

しかもめちゃくちゃ安い。購入を決心するまでに「16GBメモリで動かなかったらQuieter2Qと同じスペックのミニPCが増えるだけ」「そもそも16GBメモリ積んでも使い道あるの?」といった迷いがありましたが、最終的に背中を押してくれたのはAmazonでめちゃ安くなっているという事実でした。

今ではちょっと値上がりしてしまいましたが、最盛期では15000円を切る値段で売っており破格でした。

終わりに

というわけで、Celeron J4125なミニPCには16GB RAMが認識するものがある(すべてが認識される保証はない)」 という仮説が証明されたわけですが、これからも発熱などの面で実用に足るのか注意深く見ていく必要がありそうですね。

自分の用途ではデスクトップ用途ではたぶん使わないのでLinuxを入れてサーバーとしてこれから活躍してもらおうかと思います。(せっかくWindows 11 Pro積んでるのでHyper-Vで遊ぶのも楽しそう)

おまけ: パワーリミットでさらに実力を引き出そう

ファンレスミニPCにありがちな「CPUのパワーリミット」。GMKtec nucbox3も例に漏れずBIOS上で設定されていますので、もっとパワーが必要な人はコチラを見直してみるのもいいかもしれません。冷却を忘れずに!(自己責任で!)

VitaでJavaで画面を出す【vitasdk / miniJVM】(前編)

前回記事ではVita用にminiJVMというJVMをビルドして動作させてみるという内容で記事を書きました。

今回はそのJVMを利用して、画面を出すということをしてみたいと思います。

はじめに

前回記事ではVitaでminiJVMが動いたよ~~~という記事を書きました。

ohayoyogi.hatenablog.com

とはいってもまだまだHello Worldが出せただけで、Javaでprintfが叩けただけという話になります。

やっぱりVitaでプログラムを動かすうえでは、コントローラーを使ってGUIをグイグイ動かしていきたいと思うわけなので、グラフィックをやっちゃおうかなと思います。

まずはCで…

というわけで、Vitaで本当にグラフィック書けるのかいな??ってところですが・・・まずはC言語で書いてみて動くことを確認しました。

VitaSDKではすでにSDLをVita向けにビルドしたものが提供されていて(すごい!)、以下のサンプルコードを動かせば赤い矩形が表示されるプログラムを組むことができます。

samples/sdl2/redrectangle at master · vitasdk/samples · GitHub

自分はここにイベントを処理するコードを追加して、矩形が上下左右にコントローラーでぐりぐり動かせることも確認しました。もうこれで簡単なゲームなら作れますね(笑

SDLについてご存じない方向けに説明すると、マルチメディアを取り扱うにあたって各クロスプラットフォームにおける差異を吸収(抽象化)して取り扱えるようにしてくれるライブラリになります。ぼくも10年ぐらい前に触ったな・・・また出会うことになるとは(遠い目)

Javaでグラフィックを表示できるようにする

というわけで、C言語での練習を経て、Javaでのグラフィック表示を実装していきたいと思います。コチラについてはJavaSDL叩けるようにJNIでライブラリを書けばいいのかなと思っていますが、果たして。なお、2023年2月現在、Java Bindingsについては提供されていない模様。

Simple DirectMedia Layer - Language Bindings

まずはWindowsでビルドできるようにする

ターゲットはVita環境ですが、現在のままだとデバッグもしづらいので開発環境で動かせるようにすることでデバッグしやすくしたいと考えました。

Support for building on MSVC by ohayoyogi · Pull Request #19 · digitalgust/miniJVM · GitHub

というわけで、Visual Studioで開発できるように修正してみました。これ今見るとプルリク取り込んでもらえたみたいなので、Visual Studio使って開発することができるようになりました。(cmakeでVisual Studioのソリューションファイルを生成したりするのは他をググってください)

WindowsSDLを叩くライブラリを書く(JNI)

DLLのロードの仕方が違うなどの問題はあるので、そのままは適用できないと思いますが、最低限度デバッグはできると考え、SDLを使ってみるところまでコードを書いてみたいと思います。

まずは普通にJavaからJNIでSDLを使ってみるコード。コード書いてて気づいたんですが、どうもSDLを起動したスレッドじゃないとイベントハンドリングしちゃだめっぽいので、「スレッド1)初期化・開始・イベントループ・終了」「スレッド2)描画ループ」みたいな感じで関数分けようかなと。ライブラリの中でスレッド立ち上げるのは正直怖いので、Java側でスレッド分けて、C言語(JNI)でInit, Start, EventLoop, End, Paint みたいな関数を用意することにしました。

ちなみに、JNIとはJava Native Interfaceの略で、他の言語で書かれたネイティブなライブラリをJavaから呼べるようにする規格です。昔の自分が聞いてもちんぷんかんぷんでしょうけど、今なら書ける、書けるぞ!!!

インタフェースの仕様はわかりやすく、簡単なお作法を覚えれば動くところまではいくかなという感想です。ただ、まぁ注意して書かないと特定環境でしか動かない代物ができてしまいそうでチョット怖い。

miniJVM用のJNIに書き換えてみる

ノーマルのJVMで動くことが確認出来たらそれをminiJVMに移行していきます。

ここで注意が必要なのは、miniJVMはオレオレJNI仕様 となっていることです。ライブラリをロードしたときに JNI_OnLoad 関数が呼ばれる、ここまではいいんですが、読み込ませたい関数を native_reg_lib 関数で jvm に登録してあげる必要があります。

ここら辺の仕様についてはminiJVMのOpenGLのラッパ関数実装(以下リンク)を見てあげるのがよいかなと思います。引数に配列を取る場合やlongを返す場合など参考になるコードを読むことができます。

miniJVM/jni_gl.c at master · digitalgust/miniJVM · GitHub

というわけで動作するようになったものがこんな感じ↓

何もわからないと思うけど、miniJVMからSDLを使ってWindowを出してみた

終わりに

と、ここまでで相当長くなってしまった(というかここから先に進むのに時間がかかりそうな)ので、今回はここまでとしたいと思います。

今回思ったのはJNIのロードまわりを改善していくといいのかなと。ここら辺がOpenJDKの仕様と合わせられるとプリプロセッサで分けるなどの必要がなくなりますし、、、、ちなみに今回はこんな感じで書いてます(地獄

#ifndef _FOR_MINIJVM
JNIEXPORT void JNICALL Java_org_hoge_piyo_SDLAdapter_End
  (JNIEnv *jenv, jclass cls) {
#else
JNIEXPORT int JNICALL Java_org_hoge_piyo_SDLAdapter_End
  (Runtime *runtime, JClass *cls) {
  JniEnv *jenv = runtime->jnienv;
#endif
    printf("SDL_End");
#ifndef _FOR_MINIJVM
  }
#else
  return RUNTIME_STATUS_NORMAL;
  }
#endif

ここら辺がスッキリすると非常に良いのではないかなと!まー寄り道してると自分のやりたいことの実現が遠のくので、達成してから還元は考えたいと思います。

PSVitaでJavaでHello Worldができるようになりました【VitaSDK / miniJVM】

できました。しかもJVMで!

はじめに

前回記事では、PSVitaの開発環境を整える方法について記載しました。

ohayoyogi.hatenablog.com

VitaSDKのサンプルなども動かし、Vitaのホーム画面から立ち上がるアプリが作れることがわかりました。

さて、これからどうする??ということなんですが、やはり「誰もまだやっていない何かを移植する」というのが楽しいのかなと思い、しばらく移植できるネタを探していました。

miniJVM

そこで見つけたのがminiJVMというJVMJava Virtual Machine)です。JVMとはJavaの実行環境ですね。

github.com

Javaに詳しくない人向けに説明すると(ぼくも詳しくないけど)、Javaコンパイルされるとクラスファイルというものに一度変換されます。それらをJVMが解釈して動作するので、クラスファイルさえ作れればJVMがある環境でならどこでも動作させられるということになり、それがJavaの「クロスプラットフォーム」と言われる所以という感じですね。

「クラスファイルを解釈して動作させる」 ことができれば、過去作られた様々な資産を流用できることになるので、JVMを作るというのはとても偉大なことだなぁと思います。なんか調べてみるとPHP上でJVMを再現している人とかもいるそう。すごすぎ。

miniJVMはそこら辺をオープンソースでやっていて、すでにLinux, Mac, Windows, iOS, Androidで動作実績があるそう(すごい!)。ここにVitaも入れてやろうというのが今回の目論見です。

Vita向けに改造していく中で困ったこと

結論から言うと、動くようにはなってきたので、何ができて何が足りないのかは薄々とわかり始めてきてはいます。

壁その①: POSIX準拠

miniJVMの中でさらに利用されているSLJITというJITコンパイラがあるんですが、これのコンパイルエラーに苦しめられました。

GitHub - zherczeg/sljit: Platform independent low-level JIT compiler

VitaSDKで利用可能になるライブラリ類はPOSIXAPIをすべて満たしているわけではないので、そういうAPIをゴリゴリに利用しているライブラリには他のVitaで使える関数を使って同様の処理を実装してあげる必要があります。これはなかなか途方に暮れるというか、解決できそうにないものは飛ばすしかないという感じで、なかなか苦しかったです。

壁その②: プラットフォーム依存の吸収

次に、Vita特有の癖を吸収するのに実装が必要で、なかなか気づきづらく苦労しました。

例えば、ユーザーの保存領域にアクセスするために「ux0:data/hogehoge/file」みたいなパスを書くんですが、これのせいでことごとくクラスパスが読めなかったり、いろいろ動作しなくなっていました。

ソースコードよく読んでればハマらなかった部分でもあるので、プリプロセッサなどを見て、特にプラットフォーム依存を吸収している部分には注意する必要がありそうです。

壁その③: stdin, stdout 使えない問題

デバッガなども使えない環境で動かないものを動くようにするのは大変です。今回は標準入出力(stdin, stdout)を見る方法がわからなかったので(どなたかご存じでしたら教えてください)、System.out.printlnを叩いて動くところまで確認するみたいな方法が取れず苦労しました。

とりあえず、System.out.printlnした内容がファイルに出るように変更して内容を確認できるようにしました。これのおかげでだいぶ捗ったので、オススメです。

壁その④: クロスコンパイル環境キビシー!!!

x86 Linux の上で開発しているんですが、今回のターゲットはarmhfのVita(BSDベース?)という環境になります。で、今までVSCodeを使ってきたのでVSCodeで今回も余裕だろと思ってたんですが、謎に #define __linux__ されていたり、ろくにプリプロセッサ周りのIntellisenseが誤動作していました…

もう後半ではIDEの表示は信用しなくなってしまい、心の目で #ifdef や #ifndef を捌いていました。良いIDEあったら教えてください!!!

今後はどうする?

苦労したポイントはこの辺にして、今後やっていきたい内容を書こうと思います。

まずは、「ちゃんとコードを整理してどこかにアップする」です。今回のプログラムは自己満足で書いている部分も多いんですが、ちゃんと公開したいと思います。なぜならベースとなっているのはオープンな公開技術ですし、お世話になった分自身でも公開して貢献していきたいと考えるためです。Vita向けのJVMなんてニッチすぎて需要なさそうだけど・・・

そして、どこまで動かせるようになるか確認もしていきたいと思います。第一歩を踏み出すことができたので、ここから先さらにどんなJavaプログラムを動作させていけるか見ていきたいと思います。絵が出たりコントローラー使えるところまでできたらいいな・・・誰かゲーム作ってくれないかな、なんて。

参考にしたもの

Vita向けにプログラムを書くにあたって参考になったものを挙げていきます。

終わりに

以上、Hello World on JVM on Vita の報告記事でした。

こんなに早くVita開発の記事第二弾を書くことになるとは思いませんでしたが(そもそも第二弾を書いたことに驚き)、これからもぼちぼち触っていこうと思います。

コード整理するまで時間かかると思いますが、一緒に開発したいという方いらっしゃったらぜひ声かけてください!Twitterもフォローお願いします。

↑頑張って英語でツイートしました(笑

PSVita用にアプリケーション開発をしたいので開発環境を構築してみる【VitaSDK】

PlayStation Vita」って個人的になかなか好きなハードなんですが、流行らずに終わってしまった不遇なハードですよね。

今回はそんなニッチなハード向けにアプリケーションを書いていくべく、開発環境を整えた、というメモになります。

はじめに

PlayStation Vitaは2011年の年末に発売されたハードですが、タッチパネル・SIMスロットがあるなど、かなり「未来のゲーム」を見越して作られたゲーム機だったなぁと当時を振り返ってみると思わずにいられませんね。

ソフト面も特徴的で、「PlayStation Mobile SDK」というSDKをユーザーに提供しており、アプリのエコシステムに個人を巻き込もうという思惑も見て取れました。当時の社会の動きとしても、OAuth2のRFCが登場するなど、各サービスがAPIを提供しやすくなっており、個人開発者にとっても胸躍る環境でしたね。自分もPlaystation Mobile

最近ではTwitter APIの有償化が囁かれていたり、無償で行うサービスの限界が見えてきて、ちょっとそういった時代とは逆行しているようにも見えなくもないですが。

そんな中登場したPlayStation Vitaですが、競合するスマートフォンに完全に市場を食われ、2019年には生産終了・ソフトの販売も完全に終わってしまいました。PlayStation Mobile SDKも正直、流行らずに終わってしまった印象があります(当時のゲームでよくある「外(Vita)でも家(PS4)でも同じソフトで遊べる!」ってそこまで流行らなかった気がする)。

界隈で人気のHENkaku

そんな不遇なPSVitaの救世主、「HENkaku(変革)」をご存じでしょうか。PSPの時代も「HEN」というのがありましたが、Vita用にも制作されているのですね。

HENkaku | What is HENkaku?

本ツールは公式サイトいわく「the first ever homebrew enabler for PS Vita and PSTV」らしいです。homebrewという「自作アプリケーションパッケージを動かすことを可能にするツール」ということです。

何それ胸アツ!!!!!!ということで、これからちょっと触ってみて、作れたらアプリなんかも作ってみたいなと思った次第です(何周遅れか・・・)

導入方法

詳しい導入方法については腐るほど解説しているサイトがあるのでそちらを参照してください。

基本的には、Vita内のブラウザが持つ脆弱性を突いてHENkakuを導入してくれるサイトにアクセス するという感じです。「HENlo vita」とかでググれば出てくると思います。

ブラウザのexploitが実行されて、謎のソフトウェアが起動してしまうの、普通に怖いですしなんかいい勉強になるなって気がしました。独自のOS開発の難しさですね。

記憶媒体の準備

これは必ずしも必須ではありません。Vita 2000(新型VITA)であれば1GBの内蔵メモリがあるのでそれを使えばよいです。

旧型Vitaを使いたい、もしくは1GBに収まらない大作自作アプリを導入するといった場合には以下のようにmicroSDをVITAカードのスロットに刺せるよう変換してくれるアダプタを購入するといいと思います。「sd2vita」で検索すると出てきます。(というかVITAのメモリーカードを置き換えるんじゃなくて、VITAのゲームのカードを置き換えるのね、とビックリしました)

自分は上記のめちゃくちゃ安いsd2vitaカードを購入したんですが、ちょっと注意が必要です。新型VITAだと蓋が閉まらなくなりますw

届いたsd2vitaのサイズ感(左:microSD 中央:sd2vita 右:vitaカード)

新型VITAだと蓋が閉まらないw

旧型ならバッチリ

なので、蓋と干渉している部分をガリガリカッターで削りました。やすりでもいいかと思ったんですが、粉末が入り込んだりしそうで嫌だなーと思いカリカリっとやりました。ケガには注意してください。

カッターで削りましたw

SDカードを挿入!

SDカードを入れて使います

SDカードは適当に最近のそこそこ速いものを使うのがいいんじゃないかなと思います。別にそんな差はないと思うし、sd2vitaがどんだけの性能出るか知らないけどw

開発環境準備

さてさて、ここからが本題。HENkakuというhomebrew enablerから起動可能なアプリを作っていくために、VitaSDKというのがあります。これも有志の方(すごすぎる!!)が作ってるSDKで、割となんでもできそうです。

Vita SDK

今回はそんなVita SDKを使って何か作れないか?ということでまずは開発環境を構築していきます・・・・が!!!!

aarch64で開発したい

VitaSDKのホームページ見ると導入方法がちゃんと書いてあるんで、その通りにやれば簡単に導入できます。

で、その手順に従って普通に開発するのもなんかアレなので、ちょうど持て余していたOracle Cloud」のARMインスタンスを使って開発してみるのはどうか、と思い立ちました。

正直、aarch64でarmv7のバイナリ吐くのと、x64でarmv7のバイナリ吐くのでどっちが有利とかそういうのわからないんですけど、なんかやってみたくなったので挑戦です。

できました

というわけで、紆余曲折ありましたが、基本的には以下のリポジトリの内容をビルドしてあげればよさそうです。

https://github.com/vitasdk/buildscripts

https://github.com/vitasdk/packages

vitasdkのsampleがビルドできて動作することを確認できました。

Dockerfile

そしてできたDockerfileがこれ。VSCodeのDevContainersで使う前提で書いていて、個人的な好みで開発に必要かなと思ったのは適宜足していきます。

github.com

(packagesのビルドを忘れていたので今頑張ってビルドしています。終わったら足します)

終わりに

もう10年近く前のハードですが、コードを書けるよう準備してみました。これからまた何か進展あったら書いていきたいと思います。

Switch版マイクラ統合版で自分で立てたサーバーで遊ぶためにセルフ中間者攻撃をする(unbound)

Nintendo Switch版マインクラフトは野良サーバーに参加することができないので、「誰かの立てたサーバーに遊びに行く」ためにはSwitchを騙す行為が必要になります。それを今回はDNSである「Unbound」を使って実施してみます。

(タイトルに中間者攻撃と書きましたが、ここではDNSで解決されるサーバーを自前のIPアドレスに変え、「Switch版マインクラフト統合版」に意図しないサーバーに繋ぎにいかせる行為をさします。)

JPRS用語辞典|中間者攻撃(man-in-the-middle attack)

背景

Switch版マインクラフト統合版は自分のワールドで遊ぶ以外は以下のゲームに限定されます

  • 「特集サーバー」と呼ばれる特定のサーバー
  • 有償で借りられるマイクラサーバー「Realms」
  • LAN内の他のマインクラフト統合版のゲーム(「クロスプラットフォームでフレンドを探す」)

つまり、マイクラの醍醐味である、「誰かが立てた自分たちだけのサーバーに参加しに行く」という行為ができないものとなっています。

一緒に遊ぶ人に「頼むからRealmsで立ててくれ!!」ってお願いするか、PC版やスマホ版を買いなおさざるを得ません。酷い。

解決法

しかし、良くも悪くもマイクラはサーバーの検証がザルなので、「特集サーバーはこっちだよ~~~」と言いながら他のサーバーに誘導すればホイホイそのサーバーに繋ぎに行ってしまいます 。今回はその習性を利用して特集サーバー以外のBedrock Serverに参加させる方法を記載します。

ここでの内容は、実施することを推奨するものではありません。最悪ネットワークが機能しなくなる可能性もなくはないので、何を実施しているのか理解したうえで、ご自身の責任と判断で実施してください。

手順

色々とやり方はあると思いますが、筆者は家庭内にIX2207とLAN内にマイクラサーバー(Minecraft Bedrock Server)を動かしているサーバーがあるのでそれにDNSサーバーをやらせることにします。

環境概要

いらないとは思うけど一応念のため環境について書きます。

サーバーとして使用しているのはMeLE Quieter2QというCeleron J4125に8GBメモリを積んでいるミニPCです。これにUbuntu20.04を入れて使ってるんですが、多分Bedrock Server動かすのにもDNSサーバー動かすのにも余剰なスペックだと思います。

ohayoyogi.hatenablog.com

ルーターはUNIVERGE IX2207を使用しています。一般家庭にはオーバースペックですが、省スペースかつ安くなっていたので導入しました。

ohayoyogi.hatenablog.com

unboundを導入する

unboundはDNSのキャッシュサーバーですが、固定レコードを設定に記載することができるので、NSDなどは導入せずにunboundを利用していきます。

sudo apt update
sudo apt install unbound

unbound -V してみると

Version 1.9.4

Configure line: --build=x86_64-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir=${prefix}/lib/x86_64-linux-gnu --libexecdir=${prefix}/lib/x86_64-linux-gnu --disable-maintainer-mode --disable-dependency-tracking --disable-rpath --with-pidfile=/run/unbound.pid --with-rootkey-file=/var/lib/unbound/root.key --with-libevent --with-pythonmodule --enable-subnet --enable-dnstap --enable-systemd --with-chroot-dir= --with-dnstap-socket-path=/run/dnstap.sock --libdir=/usr/lib
Linked libs: libevent 2.1.11-stable (it uses epoll), OpenSSL 1.1.1f  31 Mar 2020
Linked modules: dns64 python subnetcache respip validator iterator

BSD licensed, see LICENSE in source package for details.
Report bugs to unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues

とのことで、 1.9.4が導入された模様。

次に、Ubuntuにはデフォルトで systemd-resolved というものが導入されていて、それが53番ポートを利用しているのでunboundと競合する、かつ、unboundが導入されていれば systemd-resolved は不要(多分)なので無効化します。

sudo systemctl disable systemd-resolved

これでOK。

unboundの設定

unboundの設定は /etc/unbound/unbound.conf に記載されているのですが、そこからさらに /etc/unbound/unbound.conf.d/ 内の conf ファイルを読んでいるようなので、そのフォルダ内に適当に設定ファイルを作ります。(/etc/unbound/unbound.conf.d/accept-from-home.conf としました)

内容は以下

server:
    interface: 0.0.0.0
    access-control: 192.168.1.0/24 allow
    do-ip4: yes
    do-ip6: no

    local-data: "geo.hivebedrock.network. IN A 192.168.1.100"

    forward-zone:
        name: "."
        forward-addr: <プロバイダ指定のDNS1>
        forward-addr: <プロバイダ指定のDNS2>

備考

  • access-control192.168.1.0/24 はスイッチのLANがいるサブネットで読み替えてください。
  • localdata192.168.1.100 はマイクラサーバーのIPアドレスで読み替えてください。
  • forward-addr の指定方法についてはこれであってるのかわかりません(配列で書くのか、forward-zone複数書くのか)。ご存じの方いらっしゃったら教えてください。

設定が終わったら、unboundを再起動します。

sudo systemctl restart unbound

(ここでsystemd-resolvedを殺しておかないとエラーが出ます。)

Switch側の設定

Switchのインターネットの設定からDNSを構築したDNSサーバーのIPアドレスにします。

今回は「The Hive」のドメインを自サーバーに誘導するようにしたので、以下のようにリストで見ると自サーバーの情報で置き換わっていることがわかります。PING値もローカルネットワークなのでべらぼうに低いですw

The Hiveが自分のサーバーになっていればOK

そして実際に選んでみて自サーバーに参加できればOKです。

(オプション)ルーターの設定

ルーターDNSプロキシ機能がある場合は、こちらに設定を記載することでSwitch側のDNS設定をいじらなくて済むようにすることができます。

ix2207# en
ix2207(config)# proxy-dns ip enable
ix2207(config)# proxy-dns server 192.168.1.100 priority 254

設定については上記コマンドで、proxy-dns ip enableDNSプロキシを有効化し、192.168.1.100 (今回のDNSサーバー)を優先度254(高い方が優先される)で追加する設定にしてみました。

これで、DNSサーバーがルーターを向いている状態にしておけば(というかDHCPで払い出す際のDNSルーターに向けておけばよい)、自動的に今回立てたDNSサーバーへ問い合わせるようになるので「たかがマインクラフトやるためだけにSwitchのDNSサーバーいじるの億劫だぜ」って人はこれするとよいかもしれないですね。

ほかのやりかた

不自由なマインクラフト統合版のために、自由にサーバーに繋ぎにいけるようにするツールはすでに色んな人が検討しています。

中でもOSSで開発されている「BedrockConnect」はすごくて、繋ぎに行くとマイクラ内でUIが立ち上がって好きなサーバーに移動することができます。

github.com

DNSでポチポチレコード書くのより数段楽なので、いろんなサーバーに行く人はこれを導入してみるのもいいかもしれません。

上記GitHubのREADME.mdには、上記サービスが使えるDNSサーバーの一覧も記載されていますが、他の人が運営するDNSサーバーに繋ぎに行くのはガチのマジで中間者攻撃を食らう可能性があるのでオススメしません。

ほかのやりかた②

ルーターの機能でやればいいじゃん?

はい、その通りですYAMAHAルーターとか、OpenWRTとかの機能で実現できると良いですね。UNIVERGEシリーズにはなかった・・・

【追記:20230201】

@n2naokun2 さんよりご指摘いただき、UNIVERGE IX2207でも dns host コマンドを使用すれば問い合わせに対して指定したIPアドレスを返せるようになるらしいので、今回はその設定のみで対応可能でした。ご指摘ありがとうございました。

具体的なコマンドは以下の通り。

ix2207# en
ix2207(config)# dns host geo.hivebedrock.network ip 192.168.1.100

コマンドリファレンスはちゃんと読みましょう。

製品マニュアル・詳細: 製品マニュアル・検索一覧 | NEC

というわけで、unboundももはや不要になったのでQuieter2からアンインストールして systemd-resolved を最有効化しました。

sudo apt purge unbound
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved

色々と遠回りしましたが、勉強になりました。IX2207便利!

【追記ここまで】

終わりに

というわけで、Switch版マインクラフト統合版を使って、自分で建てたサーバーに参加する方法でした。

この方法を応用すれば、ほかの人のサーバーにも遊びに行けますので、遊べる幅がぐんと広がると思います。

みなさんもよきマイクラライフを。

WSL --updateしてからSSH経由でWSLが起動しなくなって困った

久々に触ったパソコンでWSLでもしてみるかなーーーと思ったら wsl --list --online で表示されるディストリビューションが古く、あれ?!アップデートが必要??となって迂闊にも wsl --update したらSSH経由でログインしてwslコマンドを叩くことができなくなりました。

コンポーネント版とプリインストール版

WSLには、Windowsのオプション機能として導入できるWSLと、Microsoft Storeからダウンロードできるストア版のWSLが存在するらしいです。

参考: ASCII.jp:WSL(Windows Subsystem for Linux)がMicrosoftストア版に一本化される

今回触っているパソコンは、Windows 10 Homeで、低スペックにもかかわらず戯れで導入した「オプション機能として導入できるWSL」が入っていました。

それを上にも書きましたが、「久々に触るからアップデートするぞ~~~」wsl --update を叩いてしまったからあら大変。問題が起こってしまいました。

起こった問題: SSH経由でWSLコマンドが叩けなくなった

以前も書きましたが、ぼくはWSL2にSSHで乗り込んでWindows 10 Homeなパソコンを開発サーバーにするということをしています。

ohayoyogi.hatenablog.com

上記のような芸当をするためには、SSHで乗り込んで nc コマンドを叩くということが必要になるので、乗り込んだ先でWSLコマンドが叩けないといけません。

が、以下の画面。

wsl.exeで「ファイルにアクセスできません。」

「ファイルにアクセスできません」・・・ってなんじゃそりゃ~~~~

ちゃんとモニタ繋いでローカルにWSLコマンド叩くことはできるのにな~~~~~

解決策: ストア版をアンインストールする

どうやら、これって C:\ProgramData\Packages のアクセス権が特殊になっていて、SSHでログインしたユーザーからは触れなくなっていることが問題っぽい??

  • アクセス権限を修正すれば使えるようになる
  • Windows Update (KBいくつだったか忘れた)をアンインストールすれば解決

調べてみると、上記のような解決策がでてきましたが、アクセス権を修正したこと絶対後になって忘れるし、当該番号のWindows Updateは適用されていなかったしで最後の手段で update したものを元に戻してみることにしました。つまり、ストア版のアンインストールです。

Windows 10の設定の「アプリと機能」から、「LinuxWindows サブシステム」をアンインストールします。

ストア版をアンインストールしてみる

で、アンインストールが完了したら(ここで念のために再起動しました。)気を取り直して… ディストリビューション再インストール!!

wsl --install -d Ubuntu

Ubuntu再インストール

とまぁ、再インストールしてみましたが再インストールが必要かはわかりません。自分の場合、なぜかフォルダが圧縮されていたりしてちゃんと起動しなかったので気持ち悪くて再インストールしてみましたが、 wsl --update で単に起動しなくなったケースでは再インストールは不要かもしれません。

終わりに

というわけで、誤ってストア版に上げてしまったwsl.exeを戻して事なきを得ましたという記事でした。どなたかの参考になれば幸いです。

しかし、これからストア版に統一されるっていうのにこんな不具合抱えていて大丈夫なのか?と心配になりますね。このマシンも結構古くから使っているので最近のWindows10をクリーンインストールしたりすると良くなったりするんだろうか。

おまけ

なんでそもそも前回までで開発サーバー用意できたのにまたWSLいじってるの?と思われた方もいらっしゃると思いますが、ゲーミングPC付けっぱなしにしているのに罪悪感を覚え、低消費電力な録画サーバーに開発サーバーを兼務させられないか?と試してみているところでした。

もしよければ、Twitterもフォローお願いしいます~