Software Design 2018年11月号

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

ダウンロード

P.110 連載「scikit-learnで学ぶ機械学習アルゴリズム」

記事で紹介したSVCによる分類の機械学習を試すためのサンプルコードを以下からダウンロードできます。ダウンロードファイル「svc.zip」は圧縮ファイルです。解凍したうえでご利用ください。

圧縮ファイル内の「svc.ipynb」をGoogle Colaboratoryにアップロードすることで機械学習を試せます。Google Colaboratoryへのアップロード方法は,圧縮ファイル内の「Readme.txt」を参照してください。

ダウンロード
サンプルコード(svc.zip)

P.158 連載「Unixコマンドライン探検隊」

記事で使用しているサンプルコードを以下からダウンロードできます。ダウンロードファイル「sd11-unix31-sample.zip」「sd11-unix31-sample2.zip」は圧縮ファイルです。解凍したうえでご利用ください。詳細については,記事および本Webサイトの補足情報をご覧ください。

なお,このサンプルは学習・実験用を目的としております。オリジナルの著作は著者に帰属しますが,読者が断りなく任意に利用・改変することができることとします。

ダウンロード
サンプルコード(sd11-unix31-sample.zip)
機能拡張したサンプルコード(sd11-unix31-sample2.zip)

免責:本サンプルを使用することによって,使用者が受けたあらゆる不利益に対して,原著者および技術評論社はその責任を負いません。

補足情報

P.158 連載「Unixコマンドライン探検隊」補足情報

[補足1]ラズパイでespeakがうまくいかない問題

筆者のラズパイ(2018-06-27-raspbian-stretch.zipなど)は,導入したままの環境ではespeakが動作せず,たくさんのエラーを吐き出します。原因は(1)/usr/share/alsa/alsa.confの記述が不適切なこと,(2)espeakに先立ってjackd(JACK Audio Connection Kit sound server:オーディオ処理でリアルタイム処理が必要な場合に活躍するサービス)を起動する必要があること,のようです。以下に,これらの問題を(とりあえず)解決する方法を紹介します。

/usr/share/alsa/alsa.confの132~148行目,すべての“*.pcm.なにがし”という部分を,“*.pcm.default”と,管理者権限で書き換えてください。

  • /usr/share/alsa/alsa.conf(修正該当箇所)
    
    pcm.front cards.pcm.front
    (...略...)
    pcm.spdif iec958
    (...略...)
    pcm.phoneline cards.pcm.phoneline
    
    
  • alsa.confの書き換え後
    
    pcm.front cards.pcm.default
    (...略...)
    pcm.spdif iec958
    (...略...)
    pcm.phoneline cards.pcm.default
    
    

あとは,ラズパイで実行しているときは,jackdを起動するようにサンプルスクリプトに仕込んでおいたので,jackdをaptでインストールしておけば音がでるはずです。

ここでの対応は,あくまで臭いものに蓋で,まだエラーメッセージがでます。スクリプト中,デバッグオプションでログ出力させなければ,エラーログも/dev/nullに捨てるようにしてあります。

[補足2]チューンアップ

性能向上を目指して,システムの構成を変更します。ここに挙げた設定はしなくても,本誌で作成したスクリプトは動作します。

ラズパイは,通常OSの主ドライブにmicroSDを用います。microSDなどのフラッシュメモリは,書き込み回数に制限(寿命)があります。今回制作したダッシュボードも,convertでの画像変換時にファイルへ書き込みします(デバッグオプション指定時のログ出力もあります)。1分に1回でも,数日,数ヵ月動作させておくと,microSDの寿命への影響も無視できなくなります。また,長時間動作させ続ける場合,OSのスワップ領域,OSが記録するログ(/var/log以下に保存される),一時ファイル(/tmp,/var/tmpなど)のI/Oも考慮しなければなりません。

この課題の解決と,convertによる書き込みと,fbiでの読み込みの短縮も狙って,スワップ領域を使わないよう(本誌2018年9月号 第29回に解説あり)に設定し,一時ファイルのための領域とシステムログを,RAMをファイルシステムとして使うtmpfsに配置します。

  • スワップをoffにする
    
    $ sudo swapoff --all             ← スワップを停止
    $ sudo apt remove dphys-swapfile ← swapを管理するパッケージを削除しておく
    $ sudo rm -rf /var/swap          ← 不要になったスワップファイルを削除
    
    

いずれも管理者権限で,/etc/fstabに次のテキストを追加します。

  • ラズパイでtmpfsを使う場合/etc/fstabの最後に以下を追加
    
    tmpfs           /tmp            tmpfs   defaults,size=32m 0       0
    tmpfs           /var/tmp        tmpfs   defaults,size=16m 0       0
    tmpfs           /var/log        tmpfs   defaults,size=16m 0       0
    
    

さらに起動時にログ出力などに必要なファイルとディレクトリを作成するように,/etc/init.d/setuplogを作成(setuplogはダウンロード提供しているサンプルソースコードに含まれているので,そのまま利用して配置)し,既存のmicroSD内のファイルを掃除して,起動時に読み込ませる設定をします。

  • /etc/fstab,/etc/init.d/setuplogを用意して再起動までの手順(rootで実行)
    
    # chmod 755 /etc/init.d/setuplog       ← setuplogを起動できるように権限を設定
    # update-rc.d setuplog defaults       ← 起動時の読み込み指定
    # rm -rf /var/log/* /tmp/* /tmp/.[^.]* /var/tmp/* /var/tmp/.[^.]* ← 既存のファイルをクリアしておく
    # reboot                               ← 再起動
    
    

スクリプト中,installコマンドを使うことで,ファイルの作成とオーナ情報,権限をまとめて実施しています。

再起動後,dfやmountコマンドで,tmpfsがマウントされているのが確認できれば設定成功です。この施策によって,convertが生成する画像データの出力先(/tmp)がRAM上になることで,書き込み・読み込み両方が高速に動作するようになります。

この設定は,型落ちしたマシンにLinuxを導入している環境でも有効です。/var/log以下に作成するディレクトリなどは,各環境で異なりますので,tmpfsに移行する前の環境を確認して,スクリプトを修正してください。起動時に読み込むスクリプトも,OSのディストリビューションで異なりますので,各環境にあわせてください。また,/var/tmpが少ないとapt upgradeなどの実行時に,一時領域が不足することがあります。その場合は,fstab内で割り当てているtmpfsのサイズを一時的に増やして再起動します。

[補足3]ラズパイの起動時自動ログイン設定

今回作成したスクリプトを,ラズパイの起動時に自動で立ち上げる設定についての手順を紹介しておきます。まずラズパイは,起動時に(GUIではなく)ttyのログイン状態になるように設定します。raspbian-stretch-liteなど,そもそもCUIで起動する設定がされているならそのままでかまいません。GUIがデフォルトで起動する設定になっているなら,raspi-configを使って,CUIで起動するように設定を変更してください。

次に,次のファイル
(/etc/systemd/system/getty@tty1.service.d/autologin.conf)を管理者権限で作成してください。

  • /etc/systemd/system/getty@tty1.service.d/autologin.conf
    
    [Service]
    ExecStart=
    ExecStart=-/sbin/agetty --autologin pi --noclear %I 38400 linux
    
    

次のように,systemctlコマンドで有効にしておけば,piユーザで自動ログインが有効になります。


$ sudo systemctl enable getty@tty1.service

さらにpiユーザの~/.profileの終わりに次のコードを加えれば,ラズパイ起動時に自動で時計が起動するようになります。

  • 自動起動設定。.profileの最後に追加
    
    if [ $(tty) = "/dev/tty1" ]; then
        Scripts/mclock.bash -f -s -n4   # パスやオプションは各自の環境に合わせて記述
    fi
    
    

キーボード,マウスも接続しないで運用するなら,sshdは有効にしておくのがよいですね。このような環境も考慮して,IPアドレスを表示する機能も加えてあります。IPアドレスは,ifconfigコマンドで(ラズパイでデフォルトのWifi)wlan0を取得していますが,異なるNIC(Network Interface Controller)を参照する場合は,mclock.bash起動時に-i <NIC名>オプションを使って明示的にNICを指定してください。

[補足4]時報機能での,さらにもう1つの工夫

ラズパイでUSBスピーカを接続している場合など,補足1の工夫を施しても,音の出力がなかなかうまくいかないことがあります。またespeakの発声は,macOSのsayと比べると流暢でなかったりと,不満があるかもしれません。

そこで,Google Translate Text to Speech(Google Translate TTS)の機能を使う解決策を試してみました(参考:https://elinux.org/RPi_Text_to_Speech_(Speech_Synthesis))。mplayer(the Movie PLAYER)コマンド(aptでインストール可能)を使えば,オンラインのAPIに直接アクセスして,再生させることができます。

  • timesignal.bash
    
    googlespeech() {
        local IFS=+
        local s=$(xargs -0)
        mplayer -ao alsa -really-quiet -noconsolecontrols "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=${s}&tl=en" > /dev/null 2>&1
    }
    
    

ただし,ここで活用しているGoogle Translate TTSは,Googleが安定的にサポートしている機能ではありません。アクセス方法が変更になったり,廃止になることもあるでしょう。時報音は,たかだか24個ですので,アクセスできるうちに音声データをmp3ファイルにしてローカルに保存(ここでの実装は,スクリプトを配置したディレクトリ下のvoice/ディレクトリに0.mp3,1.mp3,……23.mp3として配置する)して,そのデータを読み出す機能(speech関数)も作成しました。Google Translate TTSでデータを生成するスクリプト(getvoice.bash)を実行すれば,自動で音声データができあがります。

  • timesignal.bash
    
    speech() {
        local voicedir=$(dirname $0)/voice
        local mp3="${voicedir}/$1.mp3"
        echo "mp3 file = ${mp3}"
        mplayer -ao alsa -really-quiet -noconsolecontrols ${mp3}
    }
    
    

    もちろんspeech関数は,Google Translate TTSから生成したmp3ファイルでなくても再生できますので,macOS上のsayコマンドなどで生成したり,サンプリングした音などなんでも活用できます。

    これらの修正を加えたmclock.bashとtimesignal.bashは,「sd11-unix31-sample2.zip」に入れてあります。本誌掲載記事で参照している「sd11-unix31-sample.zip」内のmclock.bashとtimesignal.bashの完全上位互換ですので,ファイルを入れ替えるだけで機能を追加できます。

    mclock.bashでGoogle Translate TTSを使うには,(espeakやsayによる時報の-sオプションに変えて)-gオプションを指定,事前に用意した時報データを読み込むには-Sオプションを指定してください。動作確認などのために,timesignal.bashを単独で起動する場合にも,-g,-Sオプションは有効です。mplayerコマンドは,忘れずに導入しておいてください。

    お詫びと訂正(正誤表)

    本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

    (2018年10月11日最終更新)

    P.16 本文右段16行目,「MySQL ノベルティぬいぐるみ」の提供元(「読者プレゼントのお知らせ」)

    MySQLノベルティぬいぐるみ(日本オラクル)[5名様]
    URL:https://www.oracle.com/jp/index.html
    MySQLノベルティぬいぐるみ(Oracle Corporation(MySQL Community Team))[5名様]
    URL:https://www.mysql.com/jp/