【LIVA】【Ubuntu server14.04】赤外線学習リモコンを使う

家電を音声を操る、という目標に向けて着々と準備しています。

赤外線学習リモコンが必要になるわけですが、iRemoconは高いため、別の手段を取ります。

で、買ったのが、

■大宮技研社のirMagician(http://www.omiya-giken.com/?page_id=837

■ビット・トレード・ワン社のUSB接続 赤外線リモコンKIT(http://bit-trade-one.co.jp/BTOpicture/Products/005-RS/

f:id:engetu21:20141123165809j:plain

 

1.irMagicianを試す

本機は日経Linux2014年12月号でも紹介されていますが、LinuxにUSB接続すれば簡単に認識され、赤外線の学習と送出は記事の著者がインターネットで提供しているpythonプログラムで簡単に実現できます。

https://github.com/netbuffalo/irmcli

 

以下、python実行環境とプログラムの取得

$sudo apt-get install python-pip

$sudo pip install  pyserial

$sudo apt-get install git-core

$git clone https://github.com/netbuffalo/irmcli.git

※2018/12/3追記
ラズパイ3で手順通りにやった結果。

$ sudo pip install pyserial
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pyserial in /usr/local/lib/python3.5/dist-packages (3.4)

pipでインストールできているようだけど、python3に紐付いているようなので、実際に動かしてみるとエラーが発生します。

$ sudo python irmcli.py -h
Traceback (most recent call last):
File "irmcli.py", line 4, in <module>
import serial
ImportError: No module named serial

 

python2への紐付けがよくわからないので、以下のコマンドでインストールすることでとりあえずは動きます。

$ sudo apt install python-serial

※なお、python3-serialとすることでpython3向けにインストールできる

  ※追記終わり

 

実行してみます。

$ cd irmcli/

$ sudo python irmcli.py -h
usage: irmcli.py [-h] [-c] [-p] [-s] [-f FILE]

irMagician CLI utility.

optional arguments:
  -h, --help            show this help message and exit
  -c, --capture         capture IR data
  -p, --play            play IR data
  -s, --save            save IR data
  -f FILE, --file FILE  IR data file (json)

 

$ sudo python irmcli.py -c
Capturing IR...
... 192

 

 照明リモコンの赤外線(照明オン)を取得してみました。

以下のコマンドで実行可能です。

$ sudo python irmcli.py -p
Playing IR...
... Done !

 

取得した情報をファイルに保存するには以下のようにします。

$ sudo python irmcli.py -s -f right_light_start.json
Saving IR data to right_light_start.json ...
Done !

我が家は約10畳の縦長の部屋内に2つ照明がぶら下がっているため(真ん中に配線してくれよと思ったことは幾度となくあったが)、ファイル名も右を意味するrightとlightをかけてみた(かつ韻も踏んでみた)次第。

 

まぁ、そんなことはどうでもよく、以下のようにすればファイル指定で実行可能です。

$ sudo python irmcli.py -p -f  right_light_start.json 

Playing IR...
... Done !

 

2.赤外線リモコンKITで実行

実はLinuxでまだ実現できていません。

ツールとしては、こちら(http://a-desk.jp/modules/forum_hobby/index.php?topic_id=44githubはこちらGitHub - kjmkznr/bto_ir_cmd: Bit Trade One IR Remocon tool for Linux)で展開されているlibusbを使ったツールか、こちら(http://a-desk.jp/modules/forum_hobby/index.php?post_id=382)で展開されているツールが使えるっぽいです。

Windowsように展開されているツールで試して見ると、物によって認識されたりされなかったりするようです。

 

【2016/1/30追記】

bto_ir_cmdで動くことは確認しています。ただし、makeした時にコンパイルエラーにあるので、以下のコマンドでlibusbを事前にインストールしましょう。

sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev libusb-dev

あとは、githubに書かれているにコマンドを実行すればOK

 

3.双方の比較(というわけでもないけど)

赤外線リモコンKITでは、我が家では照明はダメでしたが、エアコンはうまく動作しそうです。irMagicianでは照明はOKでしたが、エアコンがダメそう。なので、一長一短といった感じ。(たぶんエアコンは送り出す信号が長いので、irMagicianでは全データを送りきれないって感じなんじゃないかと推測)

両方使っていくのもありかな、というのが現状の考えている作戦です。

【Raspberry Pi】自動実行の登録方法

Raspberry Pi(というか、raspbian-OS)で自動実行はchkconfigで実施可能です。

デフォルトで入ってた気もするけど、入ってなければ入れます。

$sudo apt-get update

$sudo apt-get install chkconfig

 

chkconfigを実行。事前に/etc/init.dに作ったシェルなりを入れておきます。無論、権限は変更しておきます。

$sudo chmod 755 xxx.sh
$sudo chown root xxx.sh
$sudo chgrp root xxx.sh
$sudo mv xxx.sh /etc/init.d
$cd /etc/init.d/ ←移動する必要ないかも


$sudo chkconfig xxx.sh on

登録されているかは、以下のコマンドで確認可能。

 $sudo chkconfig xxx.sh --list

xxx.sh               0:off  1:off  2:on 3:on 4:on 5:on 6:off

すべて表示するなら、

$sudo chkconfig --list

を実施。

【Raspberry Pi 】TeraTermアクセスをSSH公開鍵方式で行う

セキュリティ向上のため、SSHアクセスを公開鍵方式に変更します。

 

1.公開鍵、秘密鍵の作成

公開鍵はTeraTermで作ります。sshdで作れるらしいけど、CUIで面倒なので。

メニューから「設定」→「SSH鍵生成」

f:id:engetu21:20141122231826j:plain

 

パスフレーズを入れます。無論長くて複雑であればあるほどいい。

f:id:engetu21:20141122231835j:plain

 

パスフレーズを入れたら、公開鍵をまず作ります。

→id_rsa.pubというファイルが作られるので、ローカルの適当なところに置きます。

f:id:engetu21:20141122232130j:plain

 

秘密鍵も作ります。

→id_rsaというファイルが作られるので、これもローカルの適当なところに置きます。

f:id:engetu21:20141122232250j:plain

 

2.サーバへの公開鍵の設置

作成した公開鍵(id_rsa.pub)をサーバに転送します。転送方法はWinSCPを使うなり、Teratermの設定から「ファイル」→「SSH SCP」から実施するなり。

 

公開鍵をホームディレクトリの.ssh配下に置きます(名前もauthorized_keysに変更)。

ホームディレクトリ配下に.sshがあるかはls -laコマンドでわかります。なければ作成した上で.ssh配下に置きます。

$ls -la

$mkdir .ssh

$mv id_rsa.pub .ssh/authorized_keys

※2017/2/19追記

なお、公開鍵の権限は600にしないといけないらしい

$chmod 600 .ssh
$mkdir .ssh/authorized_keys

 

3.sshdの設定ファイルを変更

以下のように変更します。

$ sudo vi /etc/ssh/sshd_config

RSAAuthentication yes コメントアウトされていたら解除

→上記項目は削除されたため、対応は不要(2022/7/3追記)
PubkeyAuthentication yes コメントアウトされていたら解除して「yes」
AuthorizedKeysFile     %h/.ssh/authorized_keys コメントアウト解除して、keyの場所を指定

 

#PasswordAuthentication yes ←パスワード認証ログインの有効/無効のパラメータ

↓ コメントアウトを解除し、かつnoに変更

PasswordAuthentication no

 

この後、一度再起動します。

$sudo shutdown -r now 

 

4.TeraTermからの秘密鍵によるログイン

ログインメニューの変更を実施し、保存しておきます。

メニューから「設定」→「SSH認証」

f:id:engetu21:20141123003408j:plain

秘密鍵は1の手順で作ったものを指定します。

入力が完了し、OKを押したあとは、設定変更を忘れずに。

メニュー「設定」→「設定の保存」

 

あとは、ログイン時にパスフレーズを入れれば公開鍵方式でログインできるようになります。

【Raspberry Pi】Vimで開くときに色を付ける

ラズパイはデフォルトではVi(Vim)でファイルを開いても色がついていません。シェルスクリプト編集がしやすくなるように変更します。

そもそもvimがインストールされていない可能性があるため、まずはインストールします。

$ sudo apt-get install vim

 

Vimの設定ファイルは以下にありますが、syntax onのコメントアウトを解除します。

$ sudo vi /etc/vim/vimrc

"syntax on

syntax on

 

ユーザ毎で独自にしたい場合は、ユーザローカルにコピーしてから弄ります。

$ sudo cp /etc/vim/vimrc ~/.vimrc

$ sudo vi ~/.vimrc

 

【Raspberry Pi】ユーザの追加とそのユーザにsudo実施できるようにする

デフォルトのpiユーザ以外を使いたいので、ユーザ追加をします。

 

1.ユーザの作成とsudo権限の付与

$sudo adduser hogehoge

ユーザー `hogehoge' を追加しています...
新しいグループ `hogehoge' (1001) を追加しています...
新しいユーザー `hogehoge' (1001) をグループ `hogehoge' に追加しています...
ホームディレクトリ `/home/hogehoge' を作成しています...
`/etc/skel' からファイルをコピーしています...

新しい UNIX パスワードを入力してください:(パスワードを入力)
新しい UNIX パスワードを再入力してください:(もう一回入力)
passwd: password updated successfully
Changing the user information for hogehoge
Enter the new value, or press ENTER for the default
        Full Name :(特に入力する必要がなければそのままEnter)
        Room Number
:(同上)
        Work Phone :(同上)
        Home Phone
:(同上)
        Other []:(同上)
以上で正しいですか? [Y/n] y

 

ついでにsudoできるようにグループに追加します。

$ sudo gpasswd -a hogehoge sudo
ユーザhogehogeをグループ sudo に追加

 

また、プロンプトを日本語にする場合は以下のように設定

$ cd ~/

$ vi .profile

export LANG=ja_JP.UTF-8 ←これを追加

2.sudo権限の削除とユーザ削除

sudo権限を削除する場合は以下のとおり

$ sudo gpasswd -d hogehoge sudo

ユーザ hogehoge をグループ sudo から削除

 

また、既存のユーザでパスワードなしのsudoを実施させない場合は、以下のようにします(例として、piの設定を変更します)。

 $ sudo vi /etc/sudoers

pi ALL=(ALL) NOPASSWD: ALL

↓コメントアウト

#pi ALL=(ALL) NOPASSWD: ALL

 

ユーザの削除は以下のとおり。

ホームディレクトリも削除する場合は、オプション-rを付与する。

 $ id -a hogehoge
uid=1001(hogehoge) gid=1001(hogehoge) groups=1001(hogehoge)

 

$ sudo userdel -r hogehoge

 

$ id -a hogehoge
id: hogehoge: no such user

 

【Raspberry Pi】SoftEtherでVPN

Raspberry Pi Model B+」を買いました。

Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

 

 

SoftEtherについては、以前LIVAでインストールしたまま放置してましたが、このラズパイに再度インストールした上でVPNを実現します。

 

Raspberry Pi でSoftEther VPN 1.0 RC2を試す | よもやま雑記帳

を参考にさせていただきました。

なお、今回はwgetによるダウンロードではなく、直接HPからダウンロードしています。ラズパイの場合はSofEtherはOS: Linux、CPU: ARM EABI (32bit)を選択します。

 

※セッティング方法を書こうと思いましたが、上記参考サイトとまるっきり同じなので割愛(手抜き)

 

注意点①

VPNサーバにするラズパイはLinuxルータを通したローカルネットワークの中で動作しています。

なので、Linuxルータのiptablesの設定でVPNアクセスを転送してあげなければなりません。というわけで、iptablesを設定するシェルスクリプトの記載を抜粋すると

IPTABLES='/sbin/iptables'

WAN='ppp0' # 外部インタフェース

 

#-------------------------#
# VPN接続からの接続を許可 #
#-------------------------#

$IPTABLES -t nat -A PREROUTING -i $WAN -p tcp --dport 443 -j DNAT --to 192.168.0.81:443
$IPTABLES -t nat -A PREROUTING -i $WAN -p udp --dport 500 -j DNAT --to 192.168.0.81:500
$IPTABLES -t nat -A PREROUTING -i $WAN -p udp --dport 1701 -j DNAT --to 192.168.0.81:1701
$IPTABLES -t nat -A PREROUTING -i $WAN -p udp --dport 4500 -j DNAT --to 192.168.0.81:4500

 

$IPTABLES -A FORWARD -i $WAN -p tcp --dport 443 -d 192.168.0.81 -s xxx.xxx.0.0/16 -j ACCEPT
$IPTABLES -A FORWARD -i $WAN -p udp --dport 500 -d 192.168.0.81 -s xxx.xxx.0.0/16 -j ACCEPT
$IPTABLES -A FORWARD -i $WAN -p udp --dport 1701 -d 192.168.0.81 -s xxx.xxx.0.0/16 -j ACCEPT
$IPTABLES -A FORWARD -i $WAN -p udp --dport 4500 -d 192.168.0.81 -s xxxx.xxx.0.0/16 -j ACCEPT

 PREROUTINGでルータで受け取った443ポート等の通信を192.168.0.81(ラズパイのIPアドレス)に透過させるようにします。

ただし、PREROUTINGの後に動作するFORWARDの記載では、-sオプションで特定のIPアドレス帯域からの通信のみを許容するようにしてアクセス制限をします。

私の場合は格安SIMを入れたAndroidからVPNを貼りたいため、SIMを提供している会社が払い出すIPアドレス帯域を事前に調べ、その帯域のみからアクセスを許容する形にしています。フルオープンは危険なのでやめましょう。

ちなみにiptablesは送信元をドメイン指定することも可能なので、いずれはAndroidでDynamicDNSクライアントでドメイン自動更新→そのドメインのみのアクセスを許容、という形を取る予定です。

 

注意点②

iptablesの設定が完了してもアクセス出来ない場合。

SoftEtherのログ(security_log/VPN/sec_2014xxxx.log)で「VPNクライアントの IP アドレスがまだ決定されていないにもかかわらず、VPNクライアントが通信を行おうとしました」とでていたら、仮想DHCPを設定しないとダメらしいです。

f:id:engetu21:20141122195926j:plain

 

 

f:id:engetu21:20141122195942j:plain

 

警告が出るけど気にしない

f:id:engetu21:20141122195948j:plain

 

SecureNATの設定に入り、仮想DHCPサーバの設定にチェック

f:id:engetu21:20141122195936j:plain

【追記】

ちなみに、この状態だと、ラズパイ自身が自分をネットワーク上で認識する事ができないので、以下のサイトを参考に設定を変更する必要がある。

SoftEther VPN 1.0 RC2でtapデバイスを試す | よもやま雑記帳

 

※2017/7/8追記

上記サイトのtapデバイス設定ですが、Raspbianのバージョンが上がったことでIPアドレスの設定先そのものが変わりました。

/etc/network/interfacesから/etc/dhcpcd.confです。

従来通りに/etc/network/interfacesで設定する必要がある場合は、/etc/dhcpcd.confの設定内容を変更します(コメントアウトするだけ)

$sudo vi /etc/dhcpcd.conf

#interface eth0
#static ip_address=192.168.11.xx/24
#static routers=192.168.11.xx
#static domain_name_servers=xxx.xxx.xxx.xxx

その後、/etc/network/interfacesの設定を変えます。

$sudo vi /etc/network/interfaces

auto eth0

auto br0
iface br0 inet static
address 192.168.11.xx
netmask 255.255.255.0
network 192.168.11.0
broadcast 192.168.11.255
gateway 192.168.11.xx
bridge_ports eth0
bridge_maxwait 10

 

自動実行の設定方法もこちらで

$sudo vi /etc/systemd/system/vpnserver.service

[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target

 

サービスの読み込みと自動実行化

$sudo systemctl daemon-reload

$sudo systemctl enable vpnserver.service

 

 

【LIVA】【Ubuntu server14.04】Juliusを使いたい(Juliusセッティング完了編)

~前回のあらすじ~

JuliusをセットアップしたらOSSとしてセットアップされたためにいろいろ頑張ったけどダメだったよ。

 

1.configureでALSAを指定してみる

そもそもOSSとしてではなくALSAで実行できればいいのではないかと、原点に立ち戻ります。Juliusのオンラインマニュアルを見ると「 --with-mictype=」で変更が可能の模様。

 $ ./configure --with-mictype=alsa

(略)

configure: error: no ALSA header!
configure: error: ./configure failed for libsent

 ダメでした・・・。

色々探ってみると、海外の掲示板にて同様の状態になっている書き込みを発見し、

「HAHAHA,俺もHPから落としたソースコードからconfigureしたらダメだったけど、CVSで落とした奴だったらうまくいったぜ!」

という書き込みを見かけたため、今度はCVSで落としてみました。

$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4

 

$ ./configure  --with-mictype=alsa

(略)

****************************************************************
Julius/Julian libsent library rev.4.3.1:

- Audio I/O

    primary mic device API   : alsa (Advanced Linux Sound Architecture)
    available mic device API : alsa
    supported audio format   : various formats by libsndfile ver.1
    NetAudio support         : no
- Language Modeling
    class N-gram support     : yes
- Libraries
    file decompression by    : zlib library
- Process management
    fork on adinnet input    : no
 
  Note: compilation time flags are now stored in "libsent-config".
        If you link this library, please add output of
        "libsent-config --cflags" to CFLAGS and
        "libsent-config --libs" to LIBS.
****************************************************************

うまくいきました!

というわけで、make後、juliusを実行してみます。

$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic

(略)

 

ALSA lib pcm_direct.c:998:(snd1_pcm_direct_initialize_slave) unable to install hw params
ALSA lib pcm_dsnoop.c:629:(snd_pcm_dsnoop_open) unable to initialize slave
Error: adin_alsa: cannot open PCM device "default" (Input/output error)
failed to begin input stream

エラー内容が変わりました。が、起動はせず・・・。

 

2.ALSADEVの設定

環境変数ALSADEVにハードウェアを設定しなければいけないらしく、もしかしたらそれが原因かと思い、設定します。

$ sudo arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: PCH [HDA Intel PCH], デバイス 0: ALC282 Analog [ALC282 Analog]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

arecord -lでALSAで認識しているデバイスが取得できます。

今回使用しているUSBマイクはカード0。LIVAでもともとあるオーディオ端子はカード1です。

USBマイクを環境変数ALSADEV設定するには

export ALSADEV="plughw:0,0"

と設定します。0,0はそれぞれ「カード番号,サブデバイス番号」を意味します。

 で、実行した結果

Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Error: adin_alsa: cannot set PCM hardware parameters (Input/output error)

途中まではうまくいきましたが、やはりダメ・・・。

 

3.そしてJulius起動へ

エラー原因は結局わからず。しかし解決方法はわかりました。

USBマイクを外してもう一度接続します。

そうするとなぜかエラーが出ません。

しかし、一度Juliusを終了し、もう一度Julius起動すると同じエラーが出ます・・・謎。

 

$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic

(略)

Stat: capture audio at 16000Hz
Stat: adin_alsa: current latency time: 21 msec
Stat: adin_alsa: current latency (21ms) is shorter than 32ms, leave it
Stat: "default": Device [USB Audio Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>
Warning: strip: sample 0-340 is invalid, stripped
Warning: strip: sample 0-340 is invalid, stripped
Warning: strip: sample 0-340 is invalid, stripped

(以下延々とWarningが発生)

念願の<<< please speak >>>がでました。

ただし、Warningが発生しているため、これを出ないように-nostripオプションを設定します。(Warningの原因は謎・・・)

【追記】

「MM-MCUSB22」というUSBマイクはマイク自体にミュートボタンが付いているのですが(会議用マイクだからね)、ミュート状態だとエラーが出るようです。ミュートを解除したらWarningが出なくなりました

$ ./julius/julius -C ../dictation-kit-v4.3.1-linux/main.jconf -C ../dictation-kit-v4.3.1-linux/am-gmm.jconf -demo -input mic -nostrip

(略)

Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:0,0": Device [USB Audio Device] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
<<< please speak >>>

 起動出来ました!

音声入力してみます。

※ 「こんにちは。今日はいい天気でした。」を言った場合。「今日はいい天気でした」は何回か発言しなおしてみたら以下のとおり。

pass1_best: 今日 は 、
sentence1: こんにちは 。
pass1_best: 今日 も あり 天気 でし た 。
sentence1: 今日 も いい 天気 でし た 。
pass1_best: 距離 的 でし た 。
sentence1: 今日 は いい 天気 でし た 。

「 距離 的 でし た 。」→「今日 は いい 天気 でし た 。」への文章解釈は驚愕ですが、結構認識してくれますね。