あきらぼ

テック系ブログ

【Steam】【Ubuntu】【ARK】ARKのゲームサーバーをSystemdでデーモン(service)化する

今回はARKのゲームサーバーをCrontabでモニターして起動する方法で使ってきましたが、Systemdのデーモン(Service)化すると異常停止時に再起動したり、ログを残せたり簡単に再起動できたりと良いことずくめなのでデーモン化することとしました。

 

 

 

起動スクリプト

まず、起動用のスクリプトを用意します。

基本的にはゲームサーバーのメインのバイナリをオプションと一緒に起動するだけのシェルスクリプトになります。

今回はフィヨルドのマップにしました。

 

 

 

保存する場所はどこでもいいですが、私はoptに置きました。

/opt/ark/bin/Fjordur.sh

 

Serviceの登録

次に、サービスとして登録していきます。

登録の仕方は以下のディレクトリに(サービス名).serviceというUnit定義ファイルを作成するだけです。

/etc/systemd/system/

 

今回はフィヨルドマップなので「ark_fjordur.service」という名前にしました。

内容は以下の通りです。

 

Restartのところをon-failureとすることで異常終了した際に再起動するようにしています。

ExecStartで先ほど作成したスクリプトを指定してあげます。

 

これで基本的にはServiceの登録は終了です。

 

Serviceの起動

次に登録したサービスを起動していきます。

基本的には管理者権限が必要となります。(sudo必要)

まずはサービスの有効化をします。

sudo systemctl enable ark_fjordur

これで有効化されます。

 

次に起動します。

sudo systemctl start ark_fjordur

これで起動されます。

あとは基本的にはずっと起動してくれます。

 

状態を確認するには以下のコマンドを使用します。

sudo systemctl status ark_fjordur

以下のように状態を確認できます。

● ark_fjordur.service - ARK Fjordur Game Server
     Loaded: loaded (/etc/systemd/system/ark_fjordur.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-07-16 11:44:51 JST; 12h ago
   Main PID: 3628739 (Fjordur.sh)
      Tasks: 17 (limit: 4584)
     Memory: 3.0G
     CGroup: /system.slice/ark_fjordur.service
             ├─3628739 /bin/bash /opt/ark/bin/Fjordur.sh
             └─3628740 /home/akira/Steam/servers/ark/ShooterGame/Binaries/Linux/ShooterGameServer Fjordur?listen?SessionName=YokohamaKaitaku?ServerPassword=Kaitakumin?ServerAdminPassword=KatakuminAdmin -server -log

 7月 16 11:44:51 v133-18-232-25 systemd[1]: Started ARK Fjordur Game Server.
 7月 16 11:44:52 v133-18-232-25 ark_fjordur[3628740]: [S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed.
 7月 16 11:44:53 v133-18-232-25 ark_fjordur[3628740]: Setting breakpad minidump AppID = 346110

 

Serviceの停止・再起動

サーバーのアップデート等で停止・再起動が必要になりますが以下のコマンドで行うことができます。

 

停止

sudo systemctl stop ark_fjordur

 

再起動

sudo systemctl restart ark_fjordur

 

以上、ARKサーバーのデーモン化でした。

 

【Linux】【ARK】SteamCMDの自動化・ARKサーバーアップデート

今回はSteamCMDでのARKサーバーアップテートの自動化をしてみました。

 

環境はLinux(Ubuntu)のVPSサーバーです。

 

SteamCMDで手動でいつもアップデートしていたのですが、数コマンドですが面倒くさいのでシェルスクリプト化しました。

 

基本的には以下の記事の手順をシェルスクリプトに記載するだけです。

 

ここではsteamcmd.shの引数でstemacmdで実行したいコマンドを指定しています。

具体的には停止するにしてもプロセスIDが分からないので以下のコマンドで確認します。

./steamcmd.sh +force_install_dir ./servers/ark +login anonymous +app_update 376030 validate +exit

引数として+(コマンド)の形で実行することで全て実行してくれます。

 

詳細は以下の記事を参考にしました。

https://developer.valvesoftware.com/wiki/SteamCMD#Linux.2FmacOS

 

スクリプト自体はこちらに置いてあります。

GitHub - Aki-R/ark_server_update_script: Shell script for ark server update on SteamCmd of linux

賃貸のリモコン無しシーリングライトでもIoTしたい!

こんにちは。

 

今回は最近引っ越した際にリモコンタイプではないシーリングライトをなんとかしてIoT化したのでそのことを書こうと思います。

 

背景

引っ越しをしたい際に、リビングのシーリングライト紐を引くか、壁のスイッチを押すという二つでしか操作できないタイプでした。

 

赤外線リモコン式であれば私が持っているラトックの家電リモコンでIoT化できたのですが、、、

 

 

賃貸なので、シーリングライトを交換するのもハードルが高いし、、、

 

解決策

そんな中、シーリングライトのカバーをとりあえず外してみると、天井のシーリングライト専用のコンセントからカバーの間に意外とスペースがあることに気が付きました。

 

そこで購入したのがこちらです。

 

 

完成した写真を撮り忘れてしまいましたが、

  1. 天井のシーリングコンセント
  2. シーリングコンセントから一般のコンセントへの変換アダプター
  3. スマートプラグ
  4. 一般のコンセントからシーリングコンセントへの変換アダプター
  5. シーリングライト

の順番で繋ぎ、すべてをシーリングライトカバー内に収めることでシーリングライトを工事や取り返せずにIoT化できました。

 

おかげでアレクサで操作できるようになりました。

 

ただ、スマートプラグはスイッチボット製の方が良かったかもしれません。

 

 

APIが公開されているので、自分で操作プログラムを簡単に書けるんですよね。

(今のでもIFTTTとかうまく使えばプログラムから操作できそうですが。)

 

blog.switchbot.jp

 

以上、賃貸シーリングライトのIoT化でした。

 

【Tensorflow】【Python】PythonとSpleeterでYoutubeから動画をダウンロードして音楽とボーカル音声を分離して保存する。

こんにちは。

 

今回は音声と演奏を分けるSpleeterを使用してYoutubeから動画をダウンロードして音声と演奏を分けてみようと思います。

 

こんなことができるようになります。

www.youtube.com

 

 

 

 

Spleeter

Spleeterとは音楽ストリーミングサービス「dezzer」が公開しているオープンソースのTensorflowをつかったAIの演奏分離ライブラリになります。

 

Deezer Research - Spleeter

 

GitHub - deezer/spleeter: Deezer source separation library including pretrained models.

 

最大でボーカル / ドラム / ベース / ピアノ / その他 の5つの音に分解することができます(5 stems)

 

今回はボーカルと演奏の二つに分けていきます。

 

インストール

今回はYouTubeからPythonで動画をダウンロードするのにpytubeのパッケージを使います。

ダウンロードした動画から音声mp3の抽出はffmpeg、最後に音声分離のspleeterを使用します。

それぞれpipでインストールできるのでインストールします。

 

コード

コードはとりあえず以下のようにしました。

 

 

流れとしては

  1. pytubeでmp4として動画をYoutubeからダウンロード
  2. ffmpegでmp4から音声だけのmp3を抽出
  3. 抽出したmp3からspleeterでボーカル・演奏分離

みたいな感じです。

 

ちなみにSpleeterによる分離する音声の時間をdurationで決められるのですが、デフォルトで10分、伸ばしても1000秒程度までで、それ以上だとエラーを吐いてしまいます。

 

暇なときに10分毎に処理できるようにアップデートしようと思います。

 

あとは、出力されたmp3をうまく使えば冒頭の動画のようにできます。

 

コードのレポジトリはこちら。

GitHub - Aki-R/YouTube_Downloader

 

これでVtuber歌枠を編集しやすくなりました。

 

 

【Keras】【Tensorflow】VGG16ベースのモデルをSequentialモデルとFunctionalモデルで作る

こんにちは。

 

今回は以前作ったVGG16ベースで作った画像分類器をSequentialからFunctionalでモデルを作り直そうと思います。

 

以前作った画像分類器の記事はこちら。

aki-lab.hatenadiary.com

 

 

 

 

Sequential

前回はSequentialモデルでVGG16をベースとして前段にデータ拡張、後段に全結合層を追加していました。

 

具体的なコードはこんな感じ。

実際にモデルを確認してみます。

上記コードで作ったモデルに対して以下のように詳細を確認します。

model.summary()

以下のように表示されます。

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 rescaling (Rescaling)       (None, 256, 256, 3)       0         
                                                                 
 random_rotation (RandomRota  (None, 256, 256, 3)      0         
 tion)                                                           
                                                                 
 random_zoom (RandomZoom)    (None, 256, 256, 3)       0         
                                                                 
 random_flip (RandomFlip)    (None, 256, 256, 3)       0         
                                                                 
 random_translation (RandomT  (None, 256, 256, 3)      0         
 ranslation)                                                     
                                                                 
 vgg16 (Functional)          (None, None, None, 512)   14714688  
                                                                 
 flatten (Flatten)           (None, 32768)             0         
                                                                 
 dense (Dense)               (None, 512)               16777728  
                                                                 
 dropout (Dropout)           (None, 512)               0         
                                                                 
 dense_1 (Dense)             (None, 58)                29754     
                                                                 
=================================================================
Total params: 31,522,170
Trainable params: 23,886,906
Non-trainable params: 7,635,264
_________________________________________________________________

 

Functional

次は同じモデルをFunctionalモデルで作成します。

作成コードはこちらです。

 

先ほどと同じようにモデルを確認します。

Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 input_1 (InputLayer)        [(None, 256, 256, 3)]     0

 rescaling (Rescaling)       (None, 256, 256, 3)       0

 random_rotation (RandomRota  (None, 256, 256, 3)      0
 tion)

 random_zoom (RandomZoom)    (None, 256, 256, 3)       0

 random_flip (RandomFlip)    (None, 256, 256, 3)       0

 random_translation (RandomT  (None, 256, 256, 3)      0
 ranslation)

 block1_conv1 (Conv2D)       (None, 256, 256, 64)      1792

 block1_conv2 (Conv2D)       (None, 256, 256, 64)      36928

 block1_pool (MaxPooling2D)  (None, 128, 128, 64)      0

 block2_conv1 (Conv2D)       (None, 128, 128, 128)     73856

 block2_conv2 (Conv2D)       (None, 128, 128, 128)     147584

 block2_pool (MaxPooling2D)  (None, 64, 64, 128)       0

 block3_conv1 (Conv2D)       (None, 64, 64, 256)       295168

 block3_conv2 (Conv2D)       (None, 64, 64, 256)       590080

 block3_conv3 (Conv2D)       (None, 64, 64, 256)       590080

 block3_pool (MaxPooling2D)  (None, 32, 32, 256)       0

 block4_conv1 (Conv2D)       (None, 32, 32, 512)       1180160

 block4_conv2 (Conv2D)       (None, 32, 32, 512)       2359808

 block4_conv3 (Conv2D)       (None, 32, 32, 512)       2359808

 block4_pool (MaxPooling2D)  (None, 16, 16, 512)       0

 block5_conv1 (Conv2D)       (None, 16, 16, 512)       2359808

 block5_conv2 (Conv2D)       (None, 16, 16, 512)       2359808

 block5_conv3 (Conv2D)       (None, 16, 16, 512)       2359808

 block5_pool (MaxPooling2D)  (None, 8, 8, 512)         0

 flatten (Flatten)           (None, 32768)             0

 dense (Dense)               (None, 512)               16777728

 dropout (Dropout)           (None, 512)               0

 dense_1 (Dense)             (None, 58)                29754

=================================================================
Total params: 31,522,170
Trainable params: 23,886,906
Non-trainable params: 7,635,264
_________________________________________________________________

VGG16モデルが展開されてしまっていますが、意図通り、Functionalモデルで作成することができました。

 

次回はこちらで学習させて量子化した計量モデルを作っていこうと思います。

 

 

3Dプリンタで照明スイッチカバー製作

こんにちは。

今回は3Dプリンタで照明のスイッチカバーを作成しました。

 

 

ピンとこないと思いますが、このようなものです。

 

 

 

製作背景

何がしたかったかというと、部屋の照明のIoT化、センサー化が進んでくると不意に元電源であるスイッチを操作してしまうと反応しなくなってしまいます。

 

慣れてしまえばなんということもないかもしれませんが、人間はミスする生き物です。

少しでも誤った操作を防止するようなカバーが必要でした。

 

しかし、いざというときにON/OFF操作ができないと初期化等ができなくなってしまいます。

 

そこで、不意には押せないけれど必要な時は押せるカバーを3Dプリンタで作りこととなりました。

 

モデリング

今回もFusion360モデリングしていきます。

 

かなり簡単な形状です。

 

印刷

20分ほどで印刷ができました。

 

次はサポート材を取り除いて取付です。

 

取付

賃貸なので両面テープでカバーを取り付けます。

 

あとはスイッチが綺麗に入るように位置を合わせて貼り付けます。

 

 

使用感

実際に取り付けて一月以上経過しましたが、誤って操作することは無くなりました。

スイッチをON/OFFするにはかなり指を立てて操作しなければできないようになっているので、部屋に入った流れでスイッチに触ってしまった際もカバーに阻まれてスイッチは操作されませんでした。

 

意図通りの役目を果たしてくれて満足です。

唯一気になるのは、色が黒色なことです。

ちょっとダサいですね。(フィラメント黒しか持ってなかったです、、、)

 

また、何か思いついたら印刷して作ってみようと思います。

 

 

 

3Dプリンタで机のカバン掛け製作

こんにちは。

 

今回も3Dプリンタで日用品を作ってみました。

 

 

 

今回製作したのは机のカバン掛けです。

会社のデスクでカバンの置き場に困っていたので作ってみます。

 

会社でデスクのキャビネットの扉の厚みを計って、そこに引っ掛けられるようなものを設計します。

 

 

今回もFusion360モデリングしました。

大分使い方にも慣れてきました。

 

作ったモデルをいつも通りCuraに読み込ませます。

 

あとはSDカードにデータを入れて印刷するだけです。

 

注意事項ですが、ファイル名に日本語を入れるとANYCUBICの3Dプリンタでは読み込めずにフリーズしてしまいます。

英語のファイル名にしましょう。

 

 

1時間ほどで印刷が完了しました。

あとはサポート材を除去して会社のデスクに取り付けてみます。

 

 

良い感じです。強度的にも十分ですね。

 

ピッタリのものを作れるのは3Dプリンタの醍醐味です。

また、何か思いついたら作ってみようと思います。