sashimi4’s diary

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

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 をもとに 作業手順を書いたので色々抜けているかもしれない。

MacOS で zsh を使うことを想定して .zprofile / .zshrc を取り急ぎ書いてみた

スーパー雑だけど取り急ぎ。

# Ctrl+U でカーソル以降を削除しない
bindkey \^U backward-kill-line

# Home/End/Delキーを意図した動作に変更
bindkey "^[[3~" delete-char
bindkey "^[[1~" beginning-of-line
bindkey "^[[4~" end-of-line

GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM=auto

# PS1~n
# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
source ~/.git-prompt.sh
autoload -Uz colors

if [ $UID -eq 0 ];then
  # root(git-ps1無し + 色を変える)
  setopt PROMPT_SUBST ; PS1='%F{yellow}[%*%f %F{green}%n@%m%f%F{red}:%!%f %F{blue}%.%f%F{yellow}]%B%#%b%f '
else
  # other
  setopt PROMPT_SUBST ; PS1='%F{red}[%*%f %F{green}%n@%m%f%F{red}:%!%f %F{blue}%.%f%F{cyan}$(__git_ps1 "(%s)")%f%F{red}]%B%#%b%f '
fi

# 補完機能
autoload -Uz compinit && compinit
# Case-insensitiveな補完(zshで.inputrcは効かない)
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# コマンド履歴
HISTFILE=~/.zsh_history
HISTSIZE=6000000
SAVEHIST=6000000
setopt hist_ignore_dups     # ignore duplication command history list
setopt share_history        # share command history data

# コマンド履歴検索
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end

# Screen session
export SCREENDIR=$HOME/.screen

# Get the aliases and functions
if [ -f ~/.zshrc ]; then
  . ~/.zshrc
fi

# bash履歴即時反映
# export PROMPT_COMMAND="history -a"
export PROMPT_COMMAND='history -a; history -r'

# (以下省略)

.bashrc / .zshrc には alias くらいしか書かない派なので省略。

f:id:sashimi4:20190628141216p:plain

ちなみに昔からPS1にはこだわりがあって、その見た目はこんな感じ。

Macがスリープ復帰後にRealforceを認識しない件

とりあえずの解決策

USBケーブルの抜き差しはコネクタに傷がつくので避けたいので、取り急ぎこれを買いました(妥協😇)。

www.amazon.co.jp

f:id:sashimi4:20190627200615j:plain

今の所良好です。はい。😇

途中まで調べたんだけど…

キー入力ができない状態のMacSSHしてとりあえずioregを覗いてみた。

$ ioreg -p IOUSB
+-o Root  <class IORegistryEntry, id 0x100000100, retain 20>
  +-o AppleUSBVHCIBCE Root Hub Simulation@80000000  <class AppleUSBRootHubDevice, id 0x1000004d7, registered, matched, active, busy 0 (0 ms), retain 13>
  | +-o iBridge@80100000  <class AppleUSBDevice, id 0x1000004d9, registered, matched, active, busy 0 (130614 ms), retain 13>
  | +-o Headset@80200000  <class AppleUSBDevice, id 0x1000004dd, registered, matched, active, busy 0 (89043 ms), retain 14>
  +-o AppleUSBXHCI Root Hub Simulation@14000000  <class AppleUSBRootHubDevice, id 0x1000004f7, registered, matched, active, busy 0 (0 ms), retain 10>
    +-o USB3.0 Hub             @14700000  <class AppleUSBDevice, id 0x1000004f9, registered, matched, active, busy 0 (2 ms), retain 14>
    +-o USB2.0 Hub             @14600000  <class AppleUSBDevice, id 0x1001f7a21, registered, matched, active, busy 0 (2 ms), retain 15>
      +-o Realforce 87@14640000  <class AppleUSBDevice, id 0x1002a7914, registered, matched, active, busy 0 (2894 ms), retain 14>

一応Realforceは認識してるみたい…。

次にキーイベントをフックして見たかったんだけど...時間がなくて止めました 😇😇😇

暇な時に引き続き調べて、原因がわかり次第追記したいと思います。

私のMacOSの初期セットアップ項目リスト

Mac miniを購入したので、備忘の為にも自分がMacOSを新たにセットアップする際の項目を公開してみる。
「他にもこんな設定をすると便利だぞ」というのがある人はこの記事を無断でパクってもらって構いませんので、添削しつつ別所で公開してもらって大丈夫です。

取り急ぎインストール系

システム/OS設定

ターミナルのcase-insensitiveな補完

ドットファイルは流石にバックアップ&リストアしてるんだけど、コレくらいは紹介しておこうと。

$ echo 'set completion-ignore-case on' >> ~/.inputrc

これでファイルシステムに限らず補完できるようになるはずっ!

# e.g.
$ ls ~/des (Tabキー打鍵)
↓
$ ls ~/Desktop/

Finder系

  • ショートカットで随時トグルできるけど、 Cmd + Shift + . で隠しファイルは常時表示しておきたい気持ち。

拡張子を表示

f:id:sashimi4:20190414001657p:plain

ちなみにこのダイアログの別タブで他にもいろいろ弄れるので必見!

 キーボード系

  • (Windows向けのRealfoceを使っているので) Cmd と Opt を入れ替え
  • Caps は使わないので Ctrl に変更
    • Ctrlキーはコマンドラインを使うときは A の横にあってほしいし GUI 操作してるときは Opt の横にもあってほしいので非常に便利

f:id:sashimi4:20190413215832p:plain

  • Key Repeat と Delay Until Repeat を最短にする(ストレスフリー!!!) ※ Key Repeat は OFF ではなくて Fast にする f:id:sashimi4:20190417005010p:plain

  • Input source の切り替えショートカットを Cmd + Space に設定

    • Spootlight search 表示ショートカットを昔ながらの Ctrl + Space に設定(尚、私はエディタでの補完と被るので Ctrl + Shift + Space に設定しています)

f:id:sashimi4:20190413215441p:plain f:id:sashimi4:20190413215540p:plain

  • Tabキーでウィンドウやダイアログ内のボタンフォーカスを移動できるようにする

    • System Preferences => Shortcuts => All controls にチェック f:id:sashimi4:20190413233147p:plain
  • コマンドをコピペするとき等にクォートが化けないようにする

    • System Preferences => Text => Use smart quote and dashes からチェックを外す f:id:sashimi4:20190705130341p:plain

Trackpad

  • 主な設定は↓ f:id:sashimi4:20190415132328p:plain f:id:sashimi4:20190415132354p:plain f:id:sashimi4:20190415132414p:plain

  • 3本指ドラッグを有効化(超便利) f:id:sashimi4:20190415132522p:plain

省電力系

  • Turn display off after をお好みで設定
  • (ワークステーション的に使うマシンであれば) System Preferences => Energy Saver => Prevent computer from sleeping automatically when the display is off にチェック

スクリーンセーバー

  • System Preferences => Desktop & Screen Saver => Start after をお好みで設定
  • System Preferences => Security & Privacy => Require password **** after sleeping or screen saver begins の時間を適宜設定

リモートログイン設定

  • SSHでログインするために Remote Login にチェック f:id:sashimi4:20190415135020p:plain (個人的にApple Remote Desktop を使ったりするので Remote Management もON)

よく使う設定へのショートカット配置

  • System Preferences => Bluetooth => Show Bluetooth in menu bar にチェック
  • System Preferences => Sound => Show volume in menu bar にチェック
  • Finder で Cmd + Shift + G で /System/Library/PreferencePanes/ へ移動。Displays.prefPane をドラッグしてDockに追加。その他お好みで追加すると良し。
    f:id:sashimi4:20190413222852p:plain
    システム設定項目に簡単にアクセスできて良い!

時計

  • System Preferences => Date &Time => Show date にチェック

画面のズーム機能

  • 何かと便利。 Windows の Magnify より断然便利。 f:id:sashimi4:20190417005213p:plain

一旦こんな感じかしら。思い出したら随時追記します。