sashimi4’s diary

日々の雑多なメモを書きます

Python で標準入力を取ると IPython の embed() とか pdb が動かない件

とりあえず解決方法だけ書く。

また一つ新しいジャンクフードを吐き出してインターネットを汚してごめんなさい。

if __name__ == '__main__':
    stdin = sys.stdin.read()

    # /dev/tty でも環境によっては動くがDocker上などは /dev/tty がないため /dev/stdin とするのが無難だと思う.
    # sys.stdin = open('/dev/tty')
    sys.stdin = open('/dev/stdin')

    dispatch_something(stdin)

Minecraft Java サーバーのMOTDに文字化けさせずに日本語を入れる

MOTD は Message Of The Day の略ですが, ゲームサーバではサーバ名の表示欄として利用されることが多いですね. Minecraft Java サーバーの MOTD は, マルチバイト文字を入力してサーバーを起動すると設定ファイルが勝手にUnicodeエスケープされるようですが, どうも日本語だとうまくエンコードできず文字化けしてしまいます. バグでしょうかね.

なので自分でUnicodeエスケープする方法を示しておきます. PHPで書かれたエンコードツールも存在していますが, OSにバンドルされている python を使うのがスマートだと思います.

以下のコマンドをシェルにコピペすれば設定できると思います.

MOTD='ここにあなたの好きな文字列を入れます。シングルクォートは残してください。'

# これは例です
MOTD='俺のサーバー'

# ディストリビューションによってはpythonのバージョンが異なるので有効な方を利用します
PYTHON=$(command -v python3 || command -v python)

# デフォルトの MOTD を削除します
# 設定ファイルのパスは環境により異なります!
sed -i "/^motd.*$/d" /opt/minecraft/server.properties

# MOTD をエスケープします
MOTD_ESCAPED=$($PYTHON -c "print('$MOTD'.encode('unicode-escape').decode())")

# 設定ファイルで MOTD を設定します
# sed を使うと記号が解釈されてしまう場合があるので echo で挿入します
# 設定ファイルのパスは環境により異なります!
echo motd=$MOTD_ESCAPED >> /opt/minecraft/server.properties

# あとはサーバーを再起動します(環境によりコマンドは異なります)

以上.

Ruby で今年の進捗率を計算する

% irb
irb(main):001:0> require 'active_support/time'
=> true
irb(main):002:0> current = Time.now
irb(main):003:0> beginning_of_year = current.beginning_of_year.to_f
irb(main):004:0> end_of_year = current.end_of_year.to_f
irb(main):005:0>
irb(main):006:0> progress = current.to_f - beginning_of_year
irb(main):007:0> whole = end_of_year - beginning_of_year
irb(main):008:0> progress_percentage = progress / whole * 100
irb(main):009:0> puts progress_percentage
49.65312263257749
=> nil

まだ50%行ってないですね。

irb(main):010:0> current = Time.now.tomorrow
irb(main):011:0> beginning_of_year = current.beginning_of_year.to_f
irb(main):012:0> end_of_year = current.end_of_year.to_f
irb(main):013:0>
irb(main):014:0> progress = current.to_f - beginning_of_year
irb(main):015:0> whole = end_of_year - beginning_of_year
irb(main):016:0> progress_percentage = progress / whole * 100
irb(main):017:0> progress_percentage
=> 49.926780593177945

24時間後も50%未満じゃん、、。

irb(main):034:0> Time.at(beginning_of_year + whole/2)
=> 2020-07-02 00:00:00 +0900

50%を迎えるのは 7/2 0時ジャストっぽいですね。

残りも頑張ろー。

さくらのVPSのMinecraftサーバーの設定方法・データ転送方法(Linux初心者向け)

公式手順ではSCPコマンドなどCUIを利用する方法しか記載されていません。

「さくらのGaming script:Minecraft」について – さくらのVPSニュース さくらのGaming script:Minecraft Server(統合版) – さくらのVPSニュース

そこで、今回は初心者向けにSFTPでファイル転送する方法を紹介しようと思います。

前提条件

さくらのVPSが契約中で、Minecraft(Java版 または 統合版)のスクリプトでサーバーを構築していること。

手順

WinSCPのインストール

SFTPというプロトコルで接続するために、WinSCP というソフトウェアをインストールします。 下記ダウンロードページからセットアップファイルをダンロードし、インストールを行います。

winscp.net

WinSCP で さくらのVPSへ接続

WinSCP を起動すると下図のようなウィンドウが表示されます。

f:id:sashimi4:20200624170914p:plain

セッション 欄に下記の項目を下図のように入力し、ログイン ボタンを押します。

転送プロトコル: SFTP
ホスト名: ... (VPSIPアドレスを入力します)
ポート番号: 22
ユーザ名: ubuntu (ローマ字読みで ウブンツ になります。間違えないように。)
パスワード: ******** (OSインストール時に 新しい管理ユーザのパスワード として設定したパスワードです。)

f:id:sashimi4:20200624170931p:plain

下図のような警告が出たら、 "はい" を押して閉じます。

f:id:sashimi4:20200624170958p:plain

ログインに成功すると下図のようなウィンドウが表示されます。 左側がパソコン側、右側がサーバー側のファイルを表示しています。

f:id:sashimi4:20200624171007p:plain

Minecraftのファイルがあるディレクトリに移動するために、右側の

f:id:sashimi4:20200624171125p:plain

のアイコンを2回、ダブルクリッして、 "/" ディレクトリまで移動します。

"/" ディレクトリに移動すると下図のような表示になります。

f:id:sashimi4:20200624171143p:plain

続いて、 "opt" 、 "minecraft" の順にダブルクリックして、 "/opt/minecraft" ディレクトリに移動します。 移動すると下図のように設定ファイル一覧が表示されます。(※ 画像はJava版の場合の例です)

f:id:sashimi4:20200624171156p:plain

設定ファイルの書き換え

サーバー設定ファイルを変更するには、対象のファイルをダブルクリックします。

f:id:sashimi4:20200624171253p:plain

下図のようなエディターが表示されるので、設定を書き換え、 Ctrl+Sで 上書き保存してください。設定の変更を反映するには、 さくらのVPS のコントロールパネルからサーバーを再起動してください。

f:id:sashimi4:20200624171312p:plain

※ 設定に誤りがある場合等はゲームサーバーの起動に失敗する場合があります。間違いがないよう、よく確認してください。

ワールドの転送

既にPC上にあるワールドデータをVPS上に上げたい場合は、 WinSCP の右側の枠に PC側のフォルダーからドラッグアンドドロップでコピーします。
PC側のMinecraftセーブデータが保存されているディレクトリは下記ページを確認してください。

help.minecraft.net

Java版の場合は、VPS側の world ディレクトリを予め削除しておき、PC側から world ディレクトリごとコピーしてください。

統合版の場合は、VPS側の worlds ディレクトリ内にコピーを行ってください。
なお、アップロードするワールド名が Bedrock level の場合は、事前にVPS側のワールドを削除しておいてください。
アップロードしたワールド名が Bedrock level と異なる場合は、 server.properties で起動するワールド名を修正する必要があります。先ほどと同様に、設定ファイルをダブルクリックしてエディタを開き、 level-name=Bedrock level の部分を任意のワールド名に変更してください。

設定の変更を反映するには同様に、 さくらのVPS のコントロールパネルからサーバーを再起動してください。

以上が初心者の方でもわかる簡易的な設定変更・ワールドデータ転送手順 の紹介でした。

Nginx の Fancy Index を最も手っ取り早く使う方法

Fancy Index について: Fancy Index | NGINX

自分で Nginx のソースと当該モジュールを持ってくる必要があると思いがちだが、実は既にバンドルされているパッケージが存在する。

パッケージ名は nginx-extras 、apt (apt-get) でそのままインストール可能だ。 Debian -- sid の nginx-extras パッケージに関する詳細
Ubuntu – xenial の nginx-extras パッケージに関する詳細

確認していないが、RHEL系でも同様のパッケージが提供されていると思われる。

Fancy Index の設定

既に nginx が導入済みの場合でも、 apt -y install nginx-extras でそのまま導入することができる。

location コンテキスト内に下記のように記載するだけ。なお autoindex系の設定は削除して置く必要がある。

# cat /etc/nginx/conf.d/foo.conf
location /foo {
        # ...

        fancyindex on;                     # Enable fancy indexes.
        fancyindex_exact_size off;  # Output human-readable file sizes.
        fancyindex_localtime on;

        # ...
}

# ...

systemctl reload nginx.service で設定を再読み込みすれば、下図のようにFancyな表示が行われる。 f:id:sashimi4:20200424130353p:plain

おまけ

リンクが見ずらいので雑にスタイルを当ててみる。

# cat /usr/share/nginx/html/fancy_href.css
a:-webkit-any-link {
    color: -webkit-link;
    cursor: pointer;
    text-decoration: underline;
}
a:-webkit-any-link:focus {text-decoration: underline; color: #f4ee41;}
a:-webkit-any-link:hover {color: #e33;}
td:hover {
  background-color: #FFEEFF;
}
# cat /etc/nginx/conf.d/foo.conf
server {

    # ...

    location /foo {
        # ...

        fancyindex_css_href /fancy_href.css;

        # ...
    }
}

以上。

アパートの治安が悪いのでドアスコープに防犯カメラを構築した

いろいろあって隣人の愚行を録画するためにドアスコープに防犯カメラを自前構築しました。 いつか追い出したくなった時に管理会社に証拠として提出するために使おうと思います。

要件

  • 動体検知で自動録画
  • オンラインにバックアップ(マジの泥棒が来ちゃった時用)
  • 音も欲しいけど一旦要らない

前提条件など

  • Raspberry Piには固定IPが降るようにルータ側に設定が入っている
  • Raspberry PiにはRaspbianがインストール済みである
  • Raspberry Piにカメラモジュールが接続済みで、raspi-configからカメラが有効化されていること

準備したもの

広角ドアスコープは是非おすすめしたい。カメラをつけなかったとしても是非オススメしたい。マジで真横まで見える。 ただし、自分で取り付ける場合は締めが甘いと外から外されて鍵開け工具突っ込まれたりするので注意してください。

やったこと

物理設置

ドアスコープ内にレンズが入るように Raspberry Pi3 と カメラモジュールを設置した。

f:id:sashimi4:20200226210246j:plain

色々見苦しいがご勘弁を。 水道屋さんのマグネットシートがちょうど溜まっていたので、それを貼付した上から養生することによってカメラの脱着可能を実現した()。

motion周りの設定

最終的な構成は、
motion で動体検知録画 => inotifywait で録画ファイルの差分を検知し rsync でさくらのVPSに同期する
といった感じにした。

まずは必要なツールをインストール。

# apt -y install motion vim

motion の基本的な設定する。 /etc/motion/motion.conf を編集。以下、自分でいじった記憶があるところを抜粋。

# Start in daemon (background) mode and release terminal (default: off)
daemon on

# Image width (pixels). Valid range: Camera dependent, default: 320
# ドアスコープなので適当に幅を絞る
width 1080

# Image height (pixels). Valid range: Camera dependent, default: 240
height 1080

# Threshold for number of changed pixels in an image that
# triggers motion detection (default: 1500)
threshold 3000

# Container/Codec output videos
# Valid values: mpeg4, msmpeg4, swf,flv, ffv1, mov, mp4, mkv, hevc
ffmpeg_video_codec mp4

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
target_dir /tmp/motion

# Restrict stream connections to localhost only (default: on)
stream_localhost off

# Parameters to include on webcontrol.  0=none, 1=limited, 2=advanced, 3=restricted
# Default: 0 (none)
webcontrol_parms 2

/etc/default/motion を編集

# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

motion を起動

# systemctl start motion && systemctl enable motion

ここまで来ると、 ブラウザでRaspberry PiIPアドレス:8080 / :8081 に行くと映像を見たり設定を確認できるようになっているはず。

眩しい問題

ドアスコープに突っ込んでいるが故、映像の殆どが黒くなっている。そのため、夜が明け日が昇ると明るさ調整がうまくいかず、映像がホワイトアウト(眩しくて何も見えない)してしまう事象が度々あった。(明るさ自動調整は設定で切っているはずなのに…) 再起動すると即座に改善されることがわかったので、しばらくはCRONジョブにより定期的に再起動することで様子を見ることにした。

# crontab -l
0 */2 * * * systemctl reload motion

バックアップ設定

必要なツールをインストール。

# apt -y install inotify-tools screen

録画データ保管用に、さくらのVPS を1インスタンス用意した。 OSは Ubuntu 18.04 とした。 Raspbian の root のSSH公開鍵を Ubuntu の root の authorized_keys に挿入した。

つづいて、以下のようにRaspbian の rc.local に、自動で rsync するタスクを追記した。

# cat /etc/rc.local
...(省略)...

 sudo -u motion mkdir /tmp/motion/ ; /usr/bin/screen -dmS screen /bin/bash -c "inotifywait -m /tmp/motion/ | xargs -I{} rsync -r /tmp/motion/ ${VPSのアドレス}:/tmp/motion/"

exit 0

まとめたほうが分かりやすいと思ったのでCRONに追記した。 結果下記の設定になった。 NOTE: 再起動後は /tmp がまっ更になっているので mkdir しておかないとディレクトリ監視が不正終了してしまう。

# crontab -l 
0 */2 * * * systemctl reload motion
@reboot  sudo -u motion mkdir /tmp/motion/ ; /usr/bin/screen -dmS screen /bin/bash -c "inotifywait -m /tmp/motion/ | xargs -I{} rsync -r /tmp/motion/ mcsv.tokyo:/tmp/motion/" &> /tmp/rc.local.log

続いてVPS側の設定。

#  apt -y install apache2-utils nginx-extras # fancyindex を使いたいので nginx-extras を入れる
# htpasswd -c /etc/nginx/.htpasswd username

htpasswd 周りの参考文献 : qiita.com

カメラ録画映像を一覧表示できる様に、以下のように設定ファイルを作成した。

# cat /etc/nginx/conf.d/motion.conf
server {
    listen       80;
    server_name  ${ドメイン名};

    location /motion {
        # autoindex on;
        # autoindex_exact_size on;
        # autoindex_localtime on;
        fancyindex on;                     # Enable fancy indexes.
        fancyindex_exact_size off;  # Output human-readable file sizes.
        alias /tmp/motion;
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

設定読み込み。

# systemctl reload nginx.service

完成!

VPSのアドレス/motion/ にアクセスしてみると先ほど設定した認証情報を求められる。 f:id:sashimi4:20200226214140p:plain

認証情報を入力して進むと、録画一覧が表示される。 f:id:sashimi4:20200424125345p:plain

任意のファイルを選択すると、ブラウザ上で再生できる。 f:id:sashimi4:20200424125402p:plain

.bash_history をもとに 作業手順を書いたので色々抜けているかもしれない。