おは代々木ダイアリー

いろいろ試したメモを書きます

MIXI Mのリアルカードを作りました

ポイント貯めるのが大好きなポイントジャンキーに人気なMIXI M(ミクシィエム)ですが、2023年5月16日にリアルカードの申し込みをスタートしました。

ずっと「新規発行停止中」の状態が続いており、MIXI Mにリブランドされる前の6gram時代にリアルカードを発行しそびれた人たちにとってはやっと始まったか、と言ったところでしょうか。

かくいう自分もリアルカードを発行できておらず、常々リアルカード欲しいと思っていたところですので、今回発表されてからすぐに申し込みました。

着弾!

というわけでMIXI Mのリアルカードが到着しました。カード自体は普通郵便で届き、スマホNFCを活用してアクティベートすると使えるようになる仕掛けでした。

届いたのは普通郵便の封筒

MIXI M リアルカード黒の透け具合はこんな感じ。見る人が見ればわかる

今回申し込んだのは黒で、見る人が見れば「あー透けてるね」となるかなと言った具合の透け具合です。6gram時代のカードはスケスケでしたから、デザインは一新された形です。

ツイートにも書きましたが、「MIXIM」って左右対称で裏から見てもMIXIMに読めるんですね。山本山市川市みたいですね(笑

何がうれしいのか

さて、ここまで書いておいてなんですが、MIXIMのリアルカードを持っていることで嬉しいことは何でしょうか。

それを説明する前に、MIXIMをなぜ使うのか、というところの説明が必要になってくるのですが、簡単に解説すると「エポスゴールド」と組み合わせることで様々な利用先でポイント還元率が実質2.5%になるというワザを使うことができるからです。

そのワザというのが、エポスゴールドにある「3つの利用先での還元率を2.5%にできる」という特典を使用するもので、その利用先としてMIXIMの運用元である「mixi」を選択しておくと、MIXIMへのチャージで2.5%付き、さらにMIXIMはプリペイドカードとして様々なサービスで使うことができるのでエポスゴールドの2.5%還元の対象を3以上に実質増やすことができるというものです。

MIXI Mの「M」は「間」を表すエムと言われており、確かに決済の間に入ることで還元率を底上げしてくれるというのは名の通り「間」として機能しているんだなぁと感心します。)

しかし、実際にはその「MIXIMを使用することができるサービス」というのがなかなか見つからないという問題があります。なんといっても素の状態では実態のないバーチャルカードなわけですので、以下に限定されるわけです。

  • QUICPayが使用できるところ
  • 通販サイトのようにクレジットカード番号を手打ちで使用することができるところ
  • ApplePay経由で使用できるところ
  • (PayPayが使用できるところ。これからは不可能)

QUICPayが使用できるところについては、私は常時5%還元のエムアイゴールドを持っているわけで、わざわざ2.5%還元のMIXIMを使用する理由がありません。

ohayoyogi.hatenablog.com

となると、MIXIMの利用先は2番目のようなオンラインサービス系か、3番目のApplePay経由で使用できるところに限定されてしまうわけで。そういう背景から弱点である「バーチャルカードのみ」という状況を打開するために、リアルカードが求められているんですね。

採算は取れるのか?

MIXIMのリアルカードが発表されたときに話題となったのがその価格設定です。1枚発行につき1000円という価格設定は、MIXIMの弱点を補完してくれるとはいえ結構悩ましい価格になっていると思います。

というのも、ポイント還元率を底上げするために使用しているMIXIMで追加費用1000円が発生してしまうと実質還元率が下がってしまうとも考えられますので、1000円をペイするぐらいリアルカードを活用できるか?という観点が重要になってくると考えられます。

私個人としてはそこを踏まえた上で今回はリアルカード発行に至ったんですが、以下に理由を述べます

アルカードを発行した理由その1: 3選の枠を空けられる

MIXIM(旧6gram)のリアルカードを持っていなかった自分は、とある利用先で物理カードを要求され、泣く泣く3選に入れてエポスゴールドの物理カードを利用していました。この状況は、MIXIMのリアルカードによって解決可能であるため、リアルカード発行には3選を空けて他の利用先を入れられるようになるメリットがあると考えました。

アルカードを発行した理由その2: 単純にほしかった

これは完全に好みの問題と言えますが、リアルカードに単純に興味があったというのがあります。6gramのリアルカードからしてかなり攻めたデザインにしてくるのはわかっていたので、かなり興味がありました。

あとは、リアルカード発行することでしか開けない新しい使い方が見つかるのではないかという興味です。これはまだ見つかってませんが、なにか良い使い方が見つかるといいなぁと考えています。

アルカードを発行した理由その3: VISAのタッチ決済にも対応

これは正直微妙かもしれませんが、リアルカード発行によって実はQUICPayだけではなく、「VISAのタッチ決済」に対応することになります。まーーーーーーあんまQUICPay対応してなくてVISAのタッチ決済に対応しているお店って見たことない(しかも普通は物理カードにも対応している)ですが、一応は利用先として増えるかも?という期待はありますね。

終わりに

以上、リアルカードを発行した報告でした。MIXIM、今年度入ってから状況が変わってきていますので、これからどうなるのか非常に楽しみです。そのためのお布施1000円なんて安い安い!!!

今年始めるサブスクとやめようと思うサブスク

新年明けてから3週間ほど経とうとしていますが、2023年使うサブスク・やめるサブスクを整理していきたいと思います。

とかいってたら下書きの肥やしになって、早くも6月になってしまいました。後述しますが、私も利用しているMicrosoft 365が値上がりしますので、急遽書き上げて公開しようと思った次第です。

なお、冒頭にもあるとおり、これは1月中旬に書きかけた内容であり、ここにある内容はすでに検討を終え、始めるものは始め、終わらせるものは終わらせてあります。

使うサブスク

Microsoft 365

今までOffice系のアプリって使う必要性に迫られたことがなく、Drawioだったり、Googleドライブのスプレッドシートで何とかしてたんですが、ついに必要になったので加入しました。(サブスク、、、だよね?)

適当な買い切り版のOfficeがプリインストールされたノートパソコンを買ってもよかったんですが、以下のような理由から総合的に考えるとMicrosoft 365も安くね・・・?」と思えたので、導入に踏み切りました。

  • OneDrive 1TBが使える(→Amazon Photosが要らなくなる)
  • Officeが更新できるかつ、複数台導入できる(プリインだとそうもいかない)

という感じです。つまりMicrosoft365を単にサブスク版Officeと考えると高く感じますが、「複数台に導入できるOffice + クラウドストレージ」と考えると価格に見合った価値はあるんじゃないのかなと思えました。

あと、Office 365 Familyだと家族で使えるのが便利ですね。家族5人まで1TBずつのOneDrive容量をもらえるので、データのやり取りに重宝すること間違いなしです。

Microsoft 365って加入することで得られる内容が多く、まだ全容を把握できていませんがOutlookなんかも気になっています。Outlook独自ドメインメールアドレスを使うプレミアムの機能があるらしいですが、それは今年2023年の11月までらしいです。

Microsoft 365 の電子メール機能とストレージの変更 - Microsoft サポート

2023年6月から値上げ

インフレの影響を受けてか、Microsoft 365の値上げが発表されました。値段に文句があるわけではないですが、安く手に入れられるなら手に入れたいというのが正直なところですので、加入するなら値上がりする前の今がチャンスってことで1月に加入(1年分購入)した私ですが、追加で更に2年分購入しました!!

というのも、楽天スーパーDEALでポイントモリモリで購入することができたためです。最近は楽天Payでの税金支払いにポイントが使えたり、楽天ポイントの価値もだいぶ高まってきたので積極的にために行くようにしています。

Spotify

いままでAmazon Prime Musicを使用しておりずっと無料プランを貫いてきていたんですが、軽い気持ちでUnlimitedの4か月オタメシに入ったらもう音楽サブスクがないと生きていけない体になってしまいました。

そして追い打ちのようにきた Amazon Prime Musicのクソ仕様化

Unlimitedやめて無料のPrime Musicを使ってみようとしたらビビりましたね。アルバムを勝手にシャッフルして再生するとかアルバム作ったアーティストへの冒涜もいいところ・・・

というわけでSpotifyに加入しました。

ドコモのSamsung端末ユーザーはSpotify 6か月無料の特典を得ることができます!

【ドコモ限定】対象のGalaxyスマートフォンなら、Spotify Premiumが初回6ヶ月無料! | Samsung Japan 公式

普通にお金払って入ろうとしたらこんなの↑出てきてハッピーでした。

やめるサブスク

Amazon Prime

写真容量無制限のAmazon Photosをヘビーユースしていたり、Prime Videoでいろんな映画を無料で見たりしていたんですが、この際Primeをやめることにしました。

というのも、最近動画のバックアップをしたいなと思ってきて、そうなると写真はPrime Photoでは役不足で、OneDriveに一本化したくなったためです。Prime Videoにしても最近大抵見尽くしてしまって、見たいものを探すというよりサブスクを使うために見るものを探すようになってしまい、動画の見放題サービスへの関心が薄れてしまいました。

Amazon Primeの本来の通販におけるお急ぎ便無料サービスなども、今となってはヨドバシやビックカメラのサービスがかなり向上してきているのもあり、無料で翌日配送してほしかったら普通にヨドバシで買うわ…となって要らんなとなりました。非プライム会員となった今ではむしろ金払わないと翌日配送しないぞというスタンスは利用者の離脱に繋がらないか?と冷静に思ってしまいました。

終わりに

んーーーーなんかもっとやめたサブスクがあった気がするんですが、6ヶ月(!!!)も放置していたら完全に忘れてしまいました。書こうと思ったら書ききらないとダメですね〜〜〜

やめたといえば「dカードゴールド」をやめたんですが、なんでやめたかも忘れてしまいました。そもそもなんでゴールドにしたんだったか…

【Pentel ENERGEL】エナージェルのリフィルに使えるホルダを探す【ZEBRA SARASA・無印良品】

今回はボールペンの話です。ぺんてるのENERGELというボールペンが好きで愛用しているという話を書きたいと思います。

はじめに

ぼくはよくプログラム書くにあたって考えたことをノートとか裏紙に書き出すという行為をするんですが、その行為にストレスがあると捗らなくなるので、書きやすいボールペンを日々探しています。

気分によって「油性ボールペン」がいい日もあったり、「水性ボールペン」がよい日があったり。まぁ基本的に殴り書きしたいときは油性ペン、ペタペタカリカリじっくり書きたいときは水性ペンって感じの使い分けをしていますかね。ちなみによく使う油性ボールペンは「ジェットストリーム」もしくは「タプリ」。

今回は水性ボールペンの話です。

ENERGEL はいいぞ

ENERGEL (ぺんてるホームページ https://www.pentel.co.jp/products/ballpointpens/gelink/nockenergel/ より)

みなさん、ENERGEL(エナージェル)ってご存じでしょうか?

私は普段JetStreamなどの油性ボールペンを使っているのですが、ある時に宛名書きで水性ボールペンで綺麗に書きたいなと思い、このエナージェルというボールペンに出会いました。

エナージェルは価格設定も200円という(SARASAなどに慣れていると)高く感じるボールペンで、ちょっと高級なイメージがあって避けていた(そもそも水性ボールペンを普段から使っていなかったというのもある)のですが、買って以来は普段のメモ書きでも使用するぐらいにお気に入りになりました。

ENERGEL 20周年!

去年の10月ごろにエナージェルが20周年ということで、6種類もの黒インクを販売したりもしていました

20周年キャンペーン(20周年記念特集ページ https://www.pentel.co.jp/special/12495/ より)

6種類もの黒インク!(20周年記念特集ページ https://www.pentel.co.jp/special/12495/ より)

もちろん私は「チャコールブラック」「ボルドーブラック」「オリーブブラック」の3色を買いました。

ENERGELのホルダが好きじゃない問題

インクでペタペタ書くような感覚ですごくエナージェル好きなんですが、唯一気に入らないのが無駄に太いホルダです。

そして20周年モデルの黒いホルダはシックでかっこいいですが、通常のモデルはメタリックでちょっとダサいなというのが正直です。

さらには替え芯は80円ぐらいで売っているのにホルダとセットになると200円近くするという。このホルダのために120円かーというのが正直ガックリきますね。

というわけで、あんまイケてないホルダをしぶしぶ使っていたわけなんですが、ある時エナージェルのリフィルがSARASAと互換性があるということがわかりました。

SARASA互換なボールペンたち

これは(もちろん)公式に言われている内容ではないんですが、前述の通りエナージェルのリフィル(替え芯)はSARASAなど他社ボールペンのリフィルと入れ替えて使うことができます。(これをぼくは「SARASA互換」と一人で呼んでいます)

SARASA互換であることはつまり、SARASA互換なリフィルとホルダを好きなように組み合わせて自分だけの最強のボールペンを編み出すことができるということ!これでエナージェルのホルダがイケてない問題は解決だ!!!!

というわけで、ちょっと探してみました。

ZEBRA SARASA R

SARASA Rカッコイイですね。本家ZEBRAが出している水性ボールペンで、もちろんSARASA互換。

サラサR|ゼブラ株式会社

全身ブラックでめっちゃかっこよかったので買いました。SARASAは安定ですね。自分も小学生ぐらいのころから使っています。

SARASA R

ホルダがかっこよかったので買いましたが、かっこいいだけなのであんまり使っていません。

無印良品 さらさら描けるゲルインキボールペン

無印良品の水性ボールペンが「SARASA互換」なのはずっと昔から知っていましたが、まさかこんなところで役に立つとは!!というわけで売り場を探してみましたが、昔とはだいぶ変わって「ザ・無印良品といった見た目をしています。

www.muji.com

無印良品のゲルインキボールペン ノック式

昔はもっと「SARASAインスパイアード!」というような見た目をしていた記憶があります(当時もSARASAとは一味違う見た目で面白いのでリフィル入れ替えて使っていました。)

スタイリッシュな形が気に入ったので、エナージェルのリフィルをこれに入れて使っています。これでおとなしい見た目しておきながらエナージェル由来のドバドバインク出ますみたいな書き味のボールペンのできあがり。グリップがないのでリングノートの輪っかに差し込んでも引っかかったりしない のがサイコーにGOOD。

終わりに

これ去年の5月ぐらいに書こうと思って用意していたんですが、途中で書くの飽きてやめてしまっていました。それを最近、なんと無印良品の「ゲルインキボールペン キャップ式 0.5mm」が店頭で投げ売りをされているのを見つけてしまって衝動買いし、書ききることを決意しました。

最近は投げ売りのコスパに圧倒されてしまい、「キャップ式」のゲルインキボールペンからリフィルを取り出して「ノック式」の本体に詰め替えて使っているので、無印良品のボールペンをただ使っている人 に成り下がってしまいましたが、この記事で何が言いたかったかというとボールペンの使いやすさってインクとかペン先だけで決まるわけではなく、ホルダ(外側)も大事なんだよということですね。その点、この「SARASA互換」(と言っていいのか?)なボールペンはいろんなメーカーが商品を出していて組み替えられるので楽しいぞということでした。皆様もよきボールペンライフを。

SARASA互換(?)なボールペンたち

(久々にエナージェルのホルダを引っ張り出してみましたが、加水分解してベタベタ…つらひ…)

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版マインクラフト統合版を使って、自分で建てたサーバーに参加する方法でした。

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

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