やったるぞ
つくったもの/やったこと (wip含む)
ppt-undo
個人的にやってるぷよテトで練習をしている時に「今パフェあったよね?」とか言われても時既に遅しでミノを置いてしまったりするんだけど、それを1手戻す(undoする)ためのツールを作ろうとしていた。
このために以下のことをやる必要があった。
- 7bagの生成ロジックの特定
- シードの特定
- シードの使われ方を調べる
- すべての生成ロジックの再実装
- 以て「ひとつ戻る」を実装する
この再実装あたりについては、元々のゲームがあまり素晴らしい管理方法をしていない&自分が上書きしきる方法を思いつけなかったのでネクストミノの置き換えをはじめすべてをこちらの匙加減で書き換える方針で進めたためそうなった。全部の処理を追って実装するのが大変で、結局最後まで実装しきれなかった。一応戻るが、どこかのタイミングで壊れる、みたいな感じ。今だったら作り直せるかも。
これに使った要素はこんな感じ。
skyish
Minecraftのpluginで、生成されたチャンクのうち99%を削除してスカイブロックっぽく遊ぶために作ったもの。思いつきで作った。
最初はチャンク生成時のなにかに合わせて生成を阻害すれば良いかなと思ったんだけど、文献としてあまり妥当なものが見つからなかったのが大変だった気がする。特にpluginだとサーバー側のバニラの生成処理を上書きするのは大変そうだった。わざと同梱しないようにしているらしい。逆にそれも同梱しているものをnms(net.minecraft.serverの略)とか言うらしい。
阻害は出来ないが、その後の処理を加えることは出来る。Minecraftのチャンク生成後、追加で自前のpopulatorを挟み込むことが出来る。今回の方針としては、チャンク生成後、乱数をとって99%の確率でチャンク全体を空気ブロックで置き換えるようにした。このあたり。
でもこれは作っただけになってしまって、結局これで遊ぶことはなかった。南無。
- Java
- spigot
naanes
人生で一度は作りたいものランキング第一位のNESのエミュレーターを今回ようやく作った。
GitHub - naari3/naanes: A NES emulator written in Rust.
状況としてはこんな感じ。SMB1だとタイトル、ステータスバーがおかしいのと、スクロールのなにかがおかしいのだけど、なにもわからん。
本当にくだらん記述で1週間くらい潰してしまった、それなりに横スクロール出来るようになった pic.twitter.com/iqXh4mcE3U
— 名有り (@naari_) 2021年4月5日
この前段階でCPUにあたる6502のエミュを作ったのだが、みなさんが御存知の通りNESのCPUのメモリマップのうちいくつかはCPUに繋がっている各種のIOポートに通じている。Rustは所有権に厳しい言語なのだが、このあたりでかなり苦しい思いをした覚えがある。可変参照が複数回作れないとか大変すぎた思い出。今だったらもうちょっとまともに作れるかも。
また、これに際してpistonという描画用ライブラリにPRを送った。
エミュレータについて詳しいことは今後絶対に記事にする。
- Rust
- piston
tetofu-flip
GitHub - naari3/tetofu-flip: テト譜を左右反転させるchrome extension
以下に詳しい。
- TypeScript
spcy
身内のDiscord鯖用に、spcというSNESの曲で使われる音声ファイルをmp3に変換するbotを作った。
GitHub - naari3/spcy: Discord bot for converting spc to mp3
Rustで作る手前、インターネット上に転がっている数多ものCライブラリに火を吹いてもらう必要があった。pure Rustではなく、Rust用バインディングをたくさん作った。
- GitHub - naari3/id666-rs-bind: id666 rust bind
- spcのメタデータを取得するためのライブラリのバインド
- GitHub - naari3/snes_spc-rs-bind
- spcを常用できるようなPCMに書き起こすライブラリのバインド
- GitHub - naari3/lame-rs: Rust bindings for libmp3lame
- PCMをmp3に書き起こしたいが、lame-mp3を動的ライブラリに持ちたくなかったので静的ビルドできるようにしたやつ
これについても詳しく記事にしたいな~~
- Rust
- bindgen
- いつでもRustバインドがつくれるぞ!
*-sys
!!みたいな気持ちになれた
- いつでもRustバインドがつくれるぞ!
video-distorter
GitHub - naari3/video-distorter
画像をDiscordの歪ませるやつが流行ってたので、それを動画でやるやつを作った。
DISTORTED 新ドナ pic.twitter.com/7ErDyRVU6i
— なあり (@_naari_) 2021年5月12日
— なあり (@_naari_) 2021年5月12日
magickのliquid_rescaleというのが該当するっぽかったので、Rustを使ってやってみた。並列実行がしたかったのかな、あまり覚えてない。
- Rust
- imagemagick
- きらい
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で、曲を任意のものに置き換えられるようにした。
某鯖で行われた合作中のコネクトパートが音源が差し替えられた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
Discordの通話をGoogleCloudのSpeech-to-Text APIでログ取るやつ作ってた pic.twitter.com/BtHYRmMMXW
— なあり (@_naari_) 2021年9月30日
APIの使用料金が高くなったのでもうやめた。
- TypeScript
- GCP Speech-to-Text
- くそたかい
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サーバー実装、インメモリだけどチャンクの保持まで出来るようになったよ pic.twitter.com/7lC5NMNVGi
— なあり (@_naari_) 2021年11月26日
これはドナルドです pic.twitter.com/LQgHDo6t7a
— なあり (@_naari_) 2021年11月26日
目的としてはRust、Minecraftと仲良くなることだけだが、各種ビジネスロジックを実装している途中から急にすべてがうまく動くようになったのがかなり快感だった。
でも実装した範囲としてはまだまだ。Minecraftとして遊ぶために最低限必要で実装する必要があるロジックが多すぎる。
これについても特に色々なことをする必要があったので別で記事を書く。
- Rust
- minecraft-data
ReaScript
GitHub - naari3/ReaScripts: My ReaScripts
まとめブログ
いろいろやってた。自分は割と趣味ドリブンの開発が多く、その上で手段としてプログラミングを身に着けてきた節があり、今年もそれを地で行ってた感がある。来年もこの調子で、あとできればもうちょっとSRE的な部分に興味を持てればな~