【Ubuntu Linux】 自宅サーバで健康維持

テレワーク時代の健康維持

私のようなITエンジニアの強みとして「どこでも仕事ができる」というものがあります。これは他の業種の人からすると、非常に大きなメリットなのですが、一方で気をつけなくてはいけなくなるのが「健康」です。ITエンジニアは長時間の座り仕事になりますし、しかもパソコンの画面を注視するものですから、どう考えても健康に良いわけがありません。

私のように中年も半ばに差し掛かると、どうしても皮下脂肪も付きやすくなりますし、筋肉量もどんどん目減りしていきます。さらに身体がしなやかさを失いますから、腰痛や偏頭痛、慢性的な疲労感に苛まれていくことになります。

そこで、ITエンジニアらしい方法を使い、毎日決まった時間に「アレ」をすることにしました。

国民の健康維持の為に開発された「アレ」を自宅サーバで

さて、「アレ」についてそろそろ説明しておきます。「アレ」とは国民の体力向上と健康の保持や増進を目的とした体操、つまり「ラジオ体操」です。

このラジオ体操を、自宅サーバとして稼働しているASUS EeePC 1015PEMカスタム(SSD化&RAM増設→4GB / OS: lubuntu-18.04 LTS [bionic])で毎日11:00に再生することで、強制的にラジオ体操の時間を作ってしまおうという目論見です。

Ubuntu Linuxをコマンドラインで操作できる程度の知識と、余ったノートPCがあればできる内容となっていますので、ぜひ健康維持の参考にしてみてください。

必要なパッケージのインストール

強制ラジオ体操タイムに必要なパッケージは以下のものとなります。すべてapt installで導入可能です。

  • mplayer
  • ffmpeg
  • youtube-dl
  • alsa-base
  • alsa-utils

導入のためのコマンドは以下の通りです。

$ sudo apt update &&
sudo apt install \
mplayer \
ffmpeg \
youtube-dl \
alsa-base \
alsa-utils

YouTubeからラジオ体操の動画をDLする

導入したyoutube-dlコマンドを使い、ラジオ体操の動画を自宅サーバにダウンロードします。

$ youtube-dl "$MOVIE_URL"

上記のコマンドを実行すると、動画タイトルと同じ名前のwebm形式のファイルが出来上がっていると思います。($MOVIE_URLは任意のYouTube動画のURLに置き換えてください。)

ただ、このままのファイル名ではかなり取り扱いが面倒ですから、以下のような感じで半角英数のファイル名に変更しましょう。

$ mv 'ラジオ体操 第1 ・第2、首の体操-jXXXXXXXXXX.webm' Radio-Taisou.webm

これで動画ファイルRadio-Taisou.webmが出来上がりました。

動画をmp3に変換する

実際に動画のまま取り扱っても問題はないのですが、動画のままではどうしても若干面倒ごとが増えてしまいます。しかも今回は映像部分は不要で、音声だけが欲しいので、動画をmp3に変換します。

動画からmp3音声を抜き出すのにffmpegを使います。以下のような感じで変換可能です。

$ ffmpeg \
-i Radio-Taisou.webm \
-vn \
-acodec mp3 \
-af "volume=1.3" \
Radio-Taisou-audio.mp3

上記コマンドの各オプションはそれぞれ以下のような意味となります。

  • -i Radio-Taisou.webm 変換元となるファイルを指定
  • -vn 映像(ビデオ)オフ
  • -acodec mp3 出力音声の形式をmp3にする
  • -af "volume=1.3" 出力音声のボリュームを1.3倍にする
  • Radio-Taisou-audio.mp3 出力先となるファイルを指定

このようにすると、Radio-Taisou-audio.mp3が作成されます。

再生デバイス(スピーカーなど)を確認する

次に、どの再生デバイスから音を出すのかを確認します。コマンドは以下の通りとなります(sudo権限が必要)。

$ sudo aplay --list-devices

私の環境では、出力先に利用できるデバイスが一つ(EeePCに標準付属のスピーカー)しかありませんでした。

[email protected]:~$ sudo aplay --list-devices
[sudo] ytnobody のパスワード:
**** ハードウェアデバイス PLAYBACK のリスト ****
Home directory not accessible: 許可がありません
カード 0: Intel [HDA Intel], デバイス 0: ALC269VB Analog [ALC269VB Analog]
サブデバイス: 1/1
サブデバイス #0: subdevice #0

ここで重要となるのが、カード 0デバイス 0のところです。このあと音声を再生するときにこの番号を使いますから、しっかりと覚えておきましょう。

再生してみる

それでは実際に再生してみましょう。コマンドラインからmp3を再生するにはmplayerを使います。コマンドは以下の通りです。

$ sudo mplayer \
-ao alsa:device=plughw=0.0 \
Radio-Taisou-audio.mp3

このコマンドでは、-ao alsa:device=plughw=0.0 の箇所で再生デバイスを指定しています。例えば再生デバイスがカード 0デバイス 1の場合はplughw=0.0の代わりにplughw=0.1とする必要があります。ご自身の環境に合わせて変更してください。

うまく再生できた場合、スピーカーなどからラジオ体操のピアノ伴奏が聞き取れるはずです。音声の再生を終了する場合はCrtl-CかEscでmplayerを終了させます。

定期実行させる

再生までできたら、あとは任意の時間に自動再生されるよう、cronで定期実行させるだけです。

私の場合、昔からの手癖で直接/etc/crontabに定期実行の設定を書いちゃったのですが、その内容は以下の通りです。

00 11 * * * root mplayer -ao alsa:device=plughw=0.0 /home/ytnobody/Radio-Taisou-audio.mp3 > /dev/null 2>&1

最後に> /dev/null 2>&1を追加してありますが、これはcronジョブが実行される際に、mplayerのSTDOUTとSTDERRが邪魔だったので、両方とも/dev/nullに捨てるようにしたのです。

まとめ

テレワーク時代の健康維持の為に、自宅サーバでラジオ体操を毎朝11時に流すようにしました。

座り仕事が続き、腰痛などに悩まされることが多くなった人はぜひラジオ体操タイムを作って、健康維持に努めましょう。

Generating Kotlin code from Protocol Buffers (without JVN on your host)

Gradle? JVM? Looks as chainsaw in this case.

Protocol Buffers is famous IDL(Interface Description Language) in these days. And the uber/prototool is needful tool for generating interface codes in any languages.

However information about generating kotlin code is quiet few in today.

Basically I was knowledgeless about kotlin before generating kotlin codes. And the our project is written in golang.

Okay, then I found an entry that telling as “JVM and gradle are needed when generating kotlin code through protoc”.

Hmm, “place build.gradle will be in our project”? Sounds not so good. Because our project is written in golang. Don’t forget, I just want “generating kotlin codes from protocol buffers“. This method looks as cutting sashimi with chainsaw.

Conclusion: Docker solves as like sashimi knife

In this case, requirement to environment for solving the issue is so huge. “Huge requirement to environment… I’ve got it!” yes, it is the Docker Hub. So I found the container image that fits this case.

It is the moia/prototool-docker (codes on GitHub).

Usage is followings.

### prototool.dockerfile
FROM moia/prototool-docker

RUN mkdir /proj
WORKDIR /proj

CMD protoc --kotlin_out=./proto/kotlin ./proto/definition/*.proto

### In your terminal
$ docker build -f ./prototool.dockerfile -t prototool .
$ docker run --rm -v /path/to/myproj:/proj -t prototool

Finally I got succeed to generate kotlin code from protocol buffers, with moia/prototool-docker that is instead of JVM on my host.