Siv3D で自動操縦AIを作成してみた
はじめに
本記事は、Siv3D Advent Calendar 2019 の 15 日目です。
Siv3D を触ってみたので、感想とか、こう実装してみた、という話を書きます。
本当は機械学習導入したかったんですけどね…
もの
— shonen (@shonen9th) 2019年12月15日
ソースはここ
面倒くさくなって実装も全部ヘッダに書いてます
TL;DR
ゲームよりもゲームの仕組みを作って遊びたいC++17使いにとって Siv3D は超強力
続きを読むRaspberryPi zero のMACアドレスがランダムになっていたので戻した
現象
リブートする度に、MACアドレスが変わってしまう。
これでは、ラズパイ先生に固定IPを供給出来ない。
原因
network-manager
をインストールした。(元からインストールされていたかもしれないけれど。)
NetworkManager には MAC アドレスのランダム化の設定項目があり、デフォルトで有効になっている。
解決策
アンインストールすれば解決できるかもしれないけれど、まあまあ便利なツールなので、妥当な解決策では無い。
以下を /etc/NetworkManager/NetworkManager.conf
に追記することで、MAC アドレスのランダム化を無効化できる。
[device] wifi.scan-rand-mac-address=no
参考
archlinuxのサイトだけれど、NetworkManagerの設定はこちらを参照した。
ここに至るまでに参照したサイトとか。
ランダム化とは関係無かった。固有のMACアドレスの割り振られ方。
g_ether も g_cdc も関係無かった。ドライバかな。
MAC アドレス偽装。色々な方法があるんですね。
Linux版OpenSiv3dプロジェクト作成メモ
環境
Ubuntu 19.04
でもArchLinuxの方が導入楽そうな気がしました。
前提
リポジトリはclone済み。
公式のreadme.mdを読んで、一通りビルドして、OpenSiv3D/Linux/Release/libSiv3D.a がある。
やりかた(事前準備なしで)
カレントディレクトリは、今から作業しようと思っているプロジェクトディレクトリとします。
環境変数を定義しておきます。/path/to/opensiv3drepositoryroot
は、
opensiv3d の repository のルートディレクトリで、直下にLICENSEや、README.mdがある場所です。
export SIV3D_PATH=/path/to/opensiv3drepositoryroot
以下のファイル・ディレクトリをコピーします。
$SIV3D_PATH/Linux/App/CMakeLists.txt
$SIV3D_PATH/Linux/App/resources
$SIV3D_PATH/Linux/App/Main.cpp
CMakeLists.txt
に以下のパッチを当てます。
@@ -26,8 +26,8 @@ include_directories( "/usr/include" - "../../Siv3D/include" - "../../Siv3D/include/ThirdParty" + "$ENV{SIV3D_PATH}/Siv3D/include" + "$ENV{SIV3D_PATH}/Siv3D/include/ThirdParty" ) set(SOURCE_FILES @@ -61,6 +61,6 @@ -lvorbisfile -lboost_filesystem - ${PROJECT_SOURCE_DIR}/../Build/libSiv3D.a + $ENV{SIV3D_PATH}/Linux/Release/libSiv3D.a )
ビルドします。
cmake . make
./Siv3D_App
やりかた(事前準備ありでもっとお手軽に)
事前準備
bashrcに環境変数を書き込んでおきます。
echo 'export SIV3D_PATH=/path/to/opensiv3drepositoryroot' >> ~/.bashrc source ~/.bashrc
スクリプトを作っておきます。~/make_siv3dproj.sh
とします。
#!/bin/sh cp $SIV3D_PATH/Linux/App/CMakeLists.txt ./ cp $SIV3D_PATH/Linux/App/resources ./ -r cp $SIV3D_PATH/Linux/App/Main.cpp ./ patch CMakeLists.txt <<EOL @@ -26,8 +26,8 @@ include_directories( "/usr/include" - "../../Siv3D/include" - "../../Siv3D/include/ThirdParty" + "\$ENV{SIV3D_PATH}/Siv3D/include" + "\$ENV{SIV3D_PATH}/Siv3D/include/ThirdParty" ) set(SOURCE_FILES @@ -61,6 +61,6 @@ -lvorbisfile -lboost_filesystem - \${PROJECT_SOURCE_DIR}/../Build/libSiv3D.a + \$ENV{SIV3D_PATH}/Linux/Release/libSiv3D.a ) EOL cmake .
お手軽な方法
わずか3ステップ
cd your/nice/project sh ~/make_siv3dproj.sh make ./Siv3D_App
Github Actions を nodejs(npm) の repository で試してみた。
Github Actions とは?
ソフトウェアの品質を担保するために、定期的にビルドを行ったり、git push する前に自動的に単体テストを実行したりする 環境を整えている開発チームは少なくないと思います。
こういう環境はローカルに構築することは出来なくは無いのですが、複数人で開発しているとか、 repositoryが外部(Github)にあるとかだと、常時起動するサーバを準備して、jenkins等のCIツールを構築するのが一般的ではないでしょうか。
Github の Pull Request と連動したい場合は、Github の Webhook が便利ですが、Github から jenkins に POST できるよう、 サーバを公開しなければなりません。 趣味でさくらVPSを持っている人ならともかく、CI環境を構築するためだけにサーバを買ったり、 jenkinsをインストールしたりするのはオーバーキル感があります。
Github Actions は、上記に挙げた例をすべてGithub側で行うことが出来ます。 しかも公開repositoryなら無料で出来ます。つよい
現状
記事を書いている時点でBeta版であり、申請のようなものが必要で(といっても個人情報を入力するようなことは無いです)、 今すぐに利用開始は出来ません。
続きを読む文字列・シンボルからクラスインスタンスを取得する
こういうコードがあるとする。
class Hoge def initialize puts 'init Hoge' end end c = Hoge c.new
c = Hoge
しているんだけれども、Hogeというのをコードに直接書くのではなく、
Hogeという文字列やシンボルからHogeクラスのインスタンスを取りたい。
eval 使えば済むんだけど、ちょっと抵抗あるよね。
sym = :Hoge c = eval(sym.to_s) c.new
Hoge がクラス名ではなく、ただの定数であることに気づくと、Module#const_get
を使えば良いことが分かる。
自身のクラスインスタンスを取得するメソッドは Object#class
だから、
sym = :Hoge c = class.const_get(sym) c.new
としたい所だけれども、classはキーワードなので、syntax errorとなる。 selfを噛ませると回避できた。
sym = :Hoge c = self.class.const_get(sym) c.new