2021年の振り返り テクい編

naari.hatenablog.com

やったるぞ

f:id:naari_3:20220102224744p:plain

つくったもの/やったこと (wip含む)

ppt-undo

GitHub - naari3/ppt-undo

個人的にやってるぷよテトで練習をしている時に「今パフェあったよね?」とか言われても時既に遅しでミノを置いてしまったりするんだけど、それを1手戻す(undoする)ためのツールを作ろうとしていた。

このために以下のことをやる必要があった。

  • 7bagの生成ロジックの特定
    • シードの特定
    • シードの使われ方を調べる
  • すべての生成ロジックの再実装
  • 以て「ひとつ戻る」を実装する

この再実装あたりについては、元々のゲームがあまり素晴らしい管理方法をしていない&自分が上書きしきる方法を思いつけなかったのでネクストミノの置き換えをはじめすべてをこちらの匙加減で書き換える方針で進めたためそうなった。全部の処理を追って実装するのが大変で、結局最後まで実装しきれなかった。一応戻るが、どこかのタイミングで壊れる、みたいな感じ。今だったら作り直せるかも。

これに使った要素はこんな感じ。

  • Windows API
    • きらい
  • Rust
    • すき
  • CheatEngine
    • ロジックを追うためデバッガーとして使った
    • かなりすき

skyish

GitHub - naari3/skyish

Minecraftのpluginで、生成されたチャンクのうち99%を削除してスカイブロックっぽく遊ぶために作ったもの。思いつきで作った。

最初はチャンク生成時のなにかに合わせて生成を阻害すれば良いかなと思ったんだけど、文献としてあまり妥当なものが見つからなかったのが大変だった気がする。特にpluginだとサーバー側のバニラの生成処理を上書きするのは大変そうだった。わざと同梱しないようにしているらしい。逆にそれも同梱しているものをnms(net.minecraft.serverの略)とか言うらしい。

阻害は出来ないが、その後の処理を加えることは出来る。Minecraftのチャンク生成後、追加で自前のpopulatorを挟み込むことが出来る。今回の方針としては、チャンク生成後、乱数をとって99%の確率でチャンク全体を空気ブロックで置き換えるようにした。このあたり

でもこれは作っただけになってしまって、結局これで遊ぶことはなかった。南無。

naanes

人生で一度は作りたいものランキング第一位のNESエミュレーターを今回ようやく作った。

GitHub - naari3/naanes: A NES emulator written in Rust.

状況としてはこんな感じ。SMB1だとタイトル、ステータスバーがおかしいのと、スクロールのなにかがおかしいのだけど、なにもわからん。

この前段階でCPUにあたる6502のエミュを作ったのだが、みなさんが御存知の通りNESのCPUのメモリマップのうちいくつかはCPUに繋がっている各種のIOポートに通じている。Rustは所有権に厳しい言語なのだが、このあたりでかなり苦しい思いをした覚えがある。可変参照が複数回作れないとか大変すぎた思い出。今だったらもうちょっとまともに作れるかも。

また、これに際してpistonという描画用ライブラリにPRを送った。

naari.hatenablog.com

エミュレータについて詳しいことは今後絶対に記事にする。

  • Rust
  • piston

tetofu-flip

GitHub - naari3/tetofu-flip: テト譜を左右反転させるchrome extension

以下に詳しい。

naari.hatenablog.com

  • TypeScript

spcy

身内のDiscord鯖用に、spcというSNESの曲で使われる音声ファイルをmp3に変換するbotを作った。

GitHub - naari3/spcy: Discord bot for converting spc to mp3

Rustで作る手前、インターネット上に転がっている数多ものCライブラリに火を吹いてもらう必要があった。pure Rustではなく、Rust用バインディングをたくさん作った。

これについても詳しく記事にしたいな~~

  • Rust
  • bindgen
    • いつでもRustバインドがつくれるぞ! *-sys !!みたいな気持ちになれた

video-distorter

GitHub - naari3/video-distorter

画像をDiscordの歪ませるやつが流行ってたので、それを動画でやるやつを作った。

magickのliquid_rescaleというのが該当するっぽかったので、Rustを使ってやってみた。並列実行がしたかったのかな、あまり覚えてない。

ppt2-sync

GitHub - naari3/ppt2-sync: ppt-sync that supported ppt2

元々ppt-syncというライブラリが存在する。これはMinusKelvinという方のもので、ColdClear(GitHub)という最強のテトリスbotが存在するのだがこれのぷよテト用実装のために使われているフレーム毎の同期用ライブラリとして位置づけられている。

これはデバッグ用プロセスを生成し、あらかじめ特定しておいた描画用バッファ切り替え処理のアドレスを 0xCC に置き換えることで処理に割り込みを入れるためフレームが進んだことを検知できる、というもの。

ぷよテト2が発売された時、同じくしてぷよテト2用のColdClearが制作されたが、こちらではフレーム毎の同期の機能が落とされていた。これはぷよテト2に「デバッグ用プロセスを生成するとゲームが落ちる」ような対策が入るようになり、単純にライブラリを作るのが難しくなったためだった。

そこで自分がCheatEngineでも使われているVEHを使うことでこの問題を回避、実装した、というもの。

VEHについてはかなり面白いことが書けそうなので別記事で詳しく。

bws_bgm

Baby Walking Simulatorというゲームのために作ったmodで、曲を任意のものに置き換えられるようにした。

GitHub - naari3/bws_bgm

某鯖で行われた合作中のコネクトパートが音源が差し替えられたBaby Walking Simulatorをプレイするというもので、そのために作った。つまり、BGMのピッチダウンや開始タイミング等は後から音声編集を使ったわけではなく、本物の実装を使って実現している。

チップチューン風アレンジBGMの制作とゲームプレイ担当はふーふーさん。ゲームプレイが下手くそなせいでパート分の尺を歩くのに2分半も掛かっててワロタ 7.5倍だぞ

ちなみにこのmodはさっきのGitHubへのリンクのReleasesからダウンロード出来ます。やりたい方は是非。

  • C#
  • dnSpy
    • 最高
  • NAudio-Unity
    • dnSpyのエディタでこのライブラリを使用するようにした。正攻法はどうやってやるのだろう。

bot-pool-manifest

個人用の非公開リポジトリ

k8sのためのSSOT用で、GitHub Actionsとかそれ用のbotとか色々用意してた。secretの管理方法がいまいちわからず、直接貼ってしまっているので非公開。

ingress-sg-validator

AWS LoadBalancer Controllerの機能として、ingressのリソースのannotationとしてSecurityGroupのidを列挙することが出来るが、これが存在する/しないの確認はReconcileまで待たないといけない。これが大変長く、いつ失敗したか分からなくなってしまうのでvalidationの段階でチェックしてしまおう!というもの。結局使わなかった。

GitHub - naari3/ingress-sg-validator

  • Golang
  • kubebuilder
    • いいね

gijiri

Discordの通話が文字起こしされると面白いんじゃね~~??というやつ。ぜんぶGCPのSpeech-to-Textを使っている。

GitHub - naari3/gijiri: This is a Discord bot for meeting minutes in voice channel

APIの使用料金が高くなったのでもうやめた。

villager-trading-list wip

Minecraftで村人にフォーカスを合わせただけで取引リストが表示されて欲しい、というやつ。村人の取引厳選に便利そうだったので。

GitHub - naari3/villager-trading-list

ただ、一点誤算があって、村人の取引リストはサーバー側にパケットを投げないといけなくて、そこで詰んでた。そしたらローカルから叩けるメソッドに getTradingList とか生やさないでくれ…

でも後述する体験をした今は結構なんとかなりそうな気持ち。今度やってみようかな。

kareki

自分の勉強用のMinecraftサーバー実装 in Rust

GitHub - naari3/kareki: My hobby Minecraft Server written in Rust

目的としてはRust、Minecraftと仲良くなることだけだが、各種ビジネスロジックを実装している途中から急にすべてがうまく動くようになったのがかなり快感だった。

でも実装した範囲としてはまだまだ。Minecraftとして遊ぶために最低限必要で実装する必要があるロジックが多すぎる。

これについても特に色々なことをする必要があったので別で記事を書く。

ReaScript

GitHub - naari3/ReaScripts: My ReaScripts

naari.hatenablog.com

まとめブログ

いろいろやってた。自分は割と趣味ドリブンの開発が多く、その上で手段としてプログラミングを身に着けてきた節があり、今年もそれを地で行ってた感がある。来年もこの調子で、あとできればもうちょっとSRE的な部分に興味を持てればな~