RaspberryPiにBonjourをインストールしてみる

RaspberryPiにBonjourをインストールしてみる

前々から気にはなっていたんですが、別途ソフトのインストールが必要だったので尻込みしていたのですが、Windows10の最近のビルドではデフォルトでBonjourに対応している様です。そこで固定IP以外で、名前でもホスト指定できるようにしようと思います。

以下のブログを参考にさせていただきました。(実質、Windows10側は何も設定しなくても大丈夫でした)

moguno.hatenablog.jp

virtnote.blogspot.jp

Windows10側の設定の確認

Windows10はBonjourは対応しているのですが、ファイアウォールの設定でアクセスできないこともあるので内容の確認をしておきます。

【コントロールパネル】を開き、

f:id:ueponx:20170820142033p:plain

その中の【システムとセキュリティ】をクリックし、

f:id:ueponx:20170820142646p:plain

更に【WindowsDefenderファイアウォール】をクリックします。

f:id:ueponx:20170820143341p:plain

ウインドウの左側のペインから【詳細設定】をクリックします。

f:id:ueponx:20170820143515p:plain

クリック後に表示されるファイアウォール設定のウインドウの左側のペインから【受信の規則】を選択すると、

f:id:ueponx:20170820144154p:plain

中にBonjourの設定があるのがわかると思います。 Bounjourの設定が複数ありますが、TCPUDPなどの細かい設定の違いがあるようです。 複数あるなかに以下のような設定のあるものがあれば問題はなさそうです。

f:id:ueponx:20170820152314p:plain

  • プロトコルの種類:UDP
  • ローカルポート:全てのポート
  • リモートポート:全てのポート

ポートは5353に制限してもいいかなとは思いますが今回はそのままにしています。

RaspberryPi側の設定

Windows側の設定が確認できたので次はRaspberryPiの設定になります。設定するのはBonjourではありますが、パッケージ名はavahi-deamonとなります。 Avahi はBonjourのZeroconf仕様の実装とのことです。

参考:Avahi - Wikipedia

インストールは以下でOKです。

$ sudo apt-get install avahi-daemon
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
avahi-daemon はすでに最新バージョン (0.6.32-2) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 2 個。

既に最新版がインストールされていました。調べてみるとRasbian jessie以降にはデフォルトでインストールされているようです。

動作確認

これでhostnameをつかってpingSSHなどを行うことができます。

RaspberryPi上からの自ホストへのping

$ ping raspberrypi.local
PING raspberrypi.local (192.168.0.8) 56(84) bytes of data.
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=1 ttl=64 time=0.109 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=2 ttl=64 time=0.102 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=4 ttl=64 time=0.096 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=5 ttl=64 time=0.098 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=6 ttl=64 time=0.092 ms
64 bytes from 192.168.0.8 (192.168.0.8): icmp_seq=7 ttl=64 time=0.095 ms
^C
--- raspberrypi.local ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6231ms
rtt min/avg/max/mdev = 0.092/0.098/0.109/0.012 ms

RaspberryPi上からのWindows10へのping

Windows10側のホストネームはUindows10にしています。

$ ping UINDOWS10.local
PING UINDOWS10.local (192.168.0.5) 56(84) bytes of data.
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=1 ttl=128 time=1.67 ms
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=2 ttl=128 time=1.61 ms
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=3 ttl=128 time=4.54 ms
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=4 ttl=128 time=8.80 ms
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=5 ttl=128 time=5.97 ms
64 bytes from 192.168.0.5 (192.168.0.5): icmp_seq=6 ttl=128 time=4.56 ms
^C
--- UINDOWS10.local ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5008ms
rtt min/avg/max/mdev = 1.612/4.529/8.801/2.482 ms

RaspberryPi上からの自ホストへのssh

$ ssh pi@raspberrypi.local
Linux raspberrypi 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 20 14:48:22 2017 from 192.168.0.8

$ exit
ログアウト
Connection to raspberrypi.local closed.
$

Windows10上からの自ホストへのSSH

PS C:\> ping UINDOWS10.local

Pinging UINDOWS10.local [XXXX::XXXX:XXXX:42ea:XXXX%11] with 32 bytes of data:
Reply from XXXX::XXXX:XXXX:42ea:XXXX%11: time<1ms
Reply from XXXX::XXXX:XXXX:42ea:XXXX%11: time<1ms
Reply from XXXX::XXXX:XXXX:42ea:XXXX%11: time<1ms
Reply from XXXX::XXXX:XXXX:42ea:XXXX%11: time<1ms

Ping statistics for XXXX::XXXX:XXXX:42ea:XXXX%11:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
PS C:\>

Windows10上からのRaspberryPiへのping

PS C:> hostname
UINDOWS10
PS C:\Users\uepon> ping raspberrypi.local

Pinging raspberrypi.local [XXXX::XXXX:XXXX:aa9:XXXX%37] with 32 bytes of data:
Reply from XXXX::XXXX:XXXX:aa9:XXXX%37: time=4ms
Reply from XXXX::XXXX:XXXX:aa9:XXXX%37: time=4ms
Reply from XXXX::XXXX:XXXX:aa9:XXXX%37: time=6ms
Reply from XXXX::XXXX:XXXX:aa9:XXXX%37: time=4ms

Ping statistics for XXXX::XXXX:XXXX:aa9:XXXX%37:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 4ms, Maximum = 6ms, Average = 4ms

Windows10上からのRaspberryPiへのSSHTeratermから)

HOST設定にraspberrypi.localを設定する点だけが変更点になります。

f:id:ueponx:20170820160529p:plain

無事接続できています。

f:id:ueponx:20170820160652p:plain

Windows10上からRaspberryPiへのSSHBash On Ubuntu On Windowsから)

Bash On Ubuntu On WindowsではSSHがあるので同様にできそうなのですが…

$ sudo apt-get install avahi-daemon
$ sudo service avahi-daemon start
initctl: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: 接続を拒否されました
 * Starting Avahi mDNS/DNS-SD Daemon avahi-daemon
$ ssh pi@raspberrypi.local
ssh: Could not resolve hostname raspberrypi.local: Name or service not known

名前解決ができないため、アクセス出来ないようです。 もちろん、IPアドレス直接であれば問題なくアクセスはできています。

ググってみると同様の現象がでているようです。

github.com

github.com

Dbusというdeamonも影響しているようです。ちょっと残念ですが、今後修正されていくことでしょう。

おわりに

今回はほとんど何も設定していませんでしたが…。 Windows10でもデフォルトでBonjourのサービスが含まれたので特別にアプリケーションをインストールすることなく、Bonjourを使うことができました。それも容易です。IPが変わる可能性のある環境だとこちらのほうが圧倒的にいいのかもしれません。

食わず嫌いだったということですかね、やっぱり。

RaspberryPi3へのRaspbianインストール(2017/08/20版)

RaspberryPi3へのRaspbianインストール(2017/08/20版)

いままでRaspberryPiも2ばかり使っていたのでそろそろRaspberryPi3を使おうと思いました。(そろそろ機械学習なんかにも手をだしたいなあとということもあってマシンパワーが欲しくなった)

タイミングとしてはつい先日Raspbianの新しいバージョンがリリースされたこともあるのでクリーンな状態でインストールすることにしました。(Release date:2017-08-16)

ダウンロードとイメージの書き込み

まずは新しいイメージをダウンロードします。

www.raspberrypi.org

f:id:ueponx:20170820095344j:plain

自分はこの中からRASPBIAN STRETCH WITH DESKTOPのZip版をダウンロードしています。

f:id:ueponx:20170820095402j:plain

ダウンロードできたらおなじみのWin32DiskImagerで書き込みを行います。

ja.osdn.net

f:id:ueponx:20170820095407j:plain

起動すると確認ダイアログが表示されますが管理者権限で行う作業なので問題はありません。書き込むファイルを2017-08-16-raspbian-stretch.imgを指定、書き込み先のSDカードのドライブを指定、そして、【Write】ボタンをクリックします。

f:id:ueponx:20170820095420j:plain

少し時間はかかりますが、イメージファイルの書き込みが行われます。

f:id:ueponx:20170820100305p:plain

完了すると以下のようなダイアログが表示されます。

f:id:ueponx:20170820100733p:plain

ここまでは変化はありません。

起動と初期設定

起動してもあんまり変化はありません。 ロケールタイムゾーン、日本語フォントなどのインストールに関してはそのままかなと思いました。このあたりは過去のエントリなどをそのままで対応しました。

uepon.hatenadiary.com

変化はないかと思います。

少し変わったなあとおもたのはraspi-configかなと思いました。

f:id:ueponx:20170820115514p:plain

7.Advance Optionの画面を開くと

f:id:ueponx:20170820115429p:plain

VNCの項目が増えています。これをONにするとrealVNCサーバが起動します。 VNCクライアントで接続すれば、デスクトップがネットワーク経由で操作できます。 別途VNCサーバをインストールする必要はもうないようですが…。

クライアントソフトのインストールがしたくない場合にはxrdpをインストールします。

$ sudo apt-get install xrdp

これでWindows標準のリモートデスクトップ接続で接続できます。

f:id:ueponx:20170820120123j:plain

接続後はSessionはXorgで接続できます。

f:id:ueponx:20170820121200p:plain

f:id:ueponx:20170820121418p:plain

問題ないようです。

不具合?

作業中にapt-getがうまくいかないことがありました。

f:id:ueponx:20170820115336p:plain

エラーメッセージにもあるとおり以下のコマンドを打つと復帰できるので、大きくは問題ないかなと思います。

$ sudo dpkg --configure -a

あと、リモートデスクトップ接続の場合には、RaspberryPiの設定アプリは起動しても表示できないようです。

f:id:ueponx:20170820123103p:plain

コンソールでは表示できるのでこちらも問題はないかもしれないです。

気になっていたことの確認

これまで使っていた環境ではOpneCVなどのカメラ画像がうまく表示できないため X11VNCをインストールしていましたが、RealVNCではどうか確認してみます。

過去のエントリーを参考にしてみると…

uepon.hatenadiary.com

f:id:ueponx:20170820131457p:plain

RealVNCでは問題なく表示できるようです!気になっていたことは大丈夫でした!

おわりに

なんとかインストールできたみたいです。また、気になっていたこともバージョンアップによりデフォルトの設定で解決していたようです。 とくに内容が薄くなってしましましたがそういう日もあるということで。

Raspberry PiでAquesTalk Piを使ってみる

Raspberry PiでAquesTalk Piを使ってみる

これまでTTSではOpenJTalkを使っていましたが、ちょっと目線を変えてAquesTalk Piを使ってみます。といっても、ライセンスがあるのでお気をつけください。(個人非商用であれば問題いようです)

インストール

以下のURLにからダウンロードしてます。

AquesTalk Pi

http://www.a-quest.com/products/aquestalkpi.html

自分はページからのダウンロードがうまく行かなかったので下記のようにダウンロードしました。

$ wget http://www.a-quest.com/download/package/aquestalkpi-20130827.tar.gz

あとは取得したtar.gzファイルを任意の場所に展開します。

$ zcat aquestalkpi-20130827.tar.gz |tar xv
aquestalkpi/
aquestalkpi/test.txt
aquestalkpi/AquesTalkPi
aquestalkpi/aq_dic/
aquestalkpi/aq_dic/readme.txt
aquestalkpi/aq_dic/aq_user.dic
aquestalkpi/aq_dic/aqdic.bin

実行

実行に関しては難しくありません。コマンドライン上で引数に読み上げたいテキストで与え、パイプでaplayに結果を渡すだけです。AquesTalkPiは標準出力にwavファイルのデータを出力しますので、それをaplayが入力として再生します。

$ ./AquesTalkPi "漢字も読めます。" | aplay
再生中 WAVE 'stdin' : Signed 16 bit Little Endian, レート 8000 Hz, モノラル

終わりに

一応、これで話すことはできました。というかインストールしかしていませんが…。

基本的にshでその他言語から呼び出すという部分に関してはOpenJTalkとほぼ変わりません。しかし、ほとんど設定を行わなくてもよいこと、非常に軽量であることを考えると割と良い選択肢なのかもしれません。(あくまでも個人利用ですが)

それぞれの言語で呼び出す際は

pythonであれば

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
…
os.system('./AquesTalkPi ' + 'ほげほげ' + '| aplay')

Node.jsであれば

const execSync = require('child_process').execSync;
…
var result =  execSync('./AquesTalkPi ' + 'ほげほげ' + '| aplay').toString();

こんな感じになると思います。

このあと、GPIOに接続しているボタンを押したらIPアドレスを読み上げるなどができるものなんかはやってみたいかなと思います。ヘッドレス環境ではこのようなことができる方がとても便利かなと思います。(固定IPやBonjourを使っていると不要ではあるのですが。)

あと、TwitterやSlackの書き込みを話すことも考えてみたいと思います。

DragonBoard 410c(Debian)でOpenCVを使ってみる

DragonBoard 410c(Debian)でOpenCVを使ってみる

DragonBoardを使用してWebCamを使用できるようになったので今度はOpenCVを使ってみます。概ねRaspberryPiと同じような設定で問題ありません。

(注意!)2017/08/12にapt-get dist-upgradeを行ったところ/dev/video0で認識されていたUSBカメラが/dev/video2として認識されるよになったようです。そのため、そのまま実行するとV4Lのエラーが発生するかもしれません。各ソースのカメラデバイスを0→2と変更する必要があるかと思います。その場合は変更をお願いします。

Python

uepon.hatenadiary.com

過去のエントリーを参考にモジュールをインストールします。

$ sudo apt-get install libopencv-dev python-opencv 

バージョンに関しては

$ less /usr/include/opencv2/core/version.hpp

で調べてみると…

#define CV_VERSION_EPOCH    2
#define CV_VERSION_MAJOR    4
#define CV_VERSION_MINOR    9
#define CV_VERSION_REVISION 1

2017年07月時点でのインストールではversionは2.4.9になっていたようです。

ではカメラ画像をX上に表示するプログラムを実行してみます。 以下のようなサンプルとなります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2.cv as cv
import time

cv.NamedWindow("camera", 1)

capture = cv.CaptureFromCAM(0)
# V4Lエラーが発生した場合には上記を/dev/video2と認識された場合には以下に置き換えます。
# capture = cv.CaptureFromCAM(2)


# 画像サイズの指定
cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH,320)
cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT,240)

while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("camera", img)
    if cv.WaitKey(10) > 0:
        break
cv.DestroyAllWindows()

実行してみると

$ python camera.py

f:id:ueponx:20170812095932j:plain

無事に動作できました! まあ、OSは同じなのでRaspberryPiと同様ですね。

Node.js編

次はNode.jsでも確認してみます。

uepon.hatenadiary.com

こちらも過去記事を参照して行います。 インストールにはnpmを使用します。

念のため環境はこんな感じです。過去使用していてnpmのバージョンが低いと警告があったため、npmだけバージョンアップしています。

$ nodejs -v
v4.8.2
$ npm -v
5.3.0

では、インストールしてみます。

$ npm install opencv

> opencv@6.0.0 install /home/linaro/opencv/node_modules/opencv
> node-pre-gyp install --fallback-to-build

node-pre-gyp ERR! Tried to download(403): https://node-opencv.s3.amazonaws.com/opencv/v6.0.0/Release/node-v46-linux-arm64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for opencv@6.0.0 and node@4.8.2 (node-v46 ABI) (falling back to source compile with node-gyp)
make: Entering directory '/home/linaro/opencv/node_modules/opencv/build'
  CXX(target) Release/obj.target/opencv/src/init.o
  CXX(target) Release/obj.target/opencv/src/Matrix.o
  CXX(target) Release/obj.target/opencv/src/OpenCV.o
  CXX(target) Release/obj.target/opencv/src/CascadeClassifierWrap.o
  CXX(target) Release/obj.target/opencv/src/Contours.o
  CXX(target) Release/obj.target/opencv/src/Point.o
  CXX(target) Release/obj.target/opencv/src/VideoCaptureWrap.o
  CXX(target) Release/obj.target/opencv/src/CamShift.o
  CXX(target) Release/obj.target/opencv/src/HighGUI.o
  CXX(target) Release/obj.target/opencv/src/FaceRecognizer.o
  CXX(target) Release/obj.target/opencv/src/Features2d.o
  CXX(target) Release/obj.target/opencv/src/BackgroundSubtractor.o
  CXX(target) Release/obj.target/opencv/src/Constants.o
  CXX(target) Release/obj.target/opencv/src/Calib3D.o
  CXX(target) Release/obj.target/opencv/src/ImgProc.o
  CXX(target) Release/obj.target/opencv/src/Stereo.o
  CXX(target) Release/obj.target/opencv/src/LDAWrap.o
  SOLINK_MODULE(target) Release/obj.target/opencv.node
  COPY Release/opencv.node
  COPY /home/linaro/opencv/node_modules/opencv/build/opencv/v6.0.0/Release/node-v46-linux-arm64/opencv.node
  TOUCH Release/obj.target/action_after_build.stamp
  CXX(target) Release/obj.target/test_nativemat/test/nativemat.o
  SOLINK_MODULE(target) Release/obj.target/test_nativemat.node
  COPY Release/test_nativemat.node
make: Leaving directory '/home/linaro/opencv/node_modules/opencv/build'
npm WARN saveError ENOENT: no such file or directory, open '/home/linaro/opencv/package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '/home/linaro/opencv/package.json'
npm WARN opencv No description
npm WARN opencv No repository field.
npm WARN opencv No README data
npm WARN opencv No license field.

+ opencv@6.0.0
added 163 packages in 280.854s

実行するとエラーやWarningが発生します。うへぇ。ただ、なんとなくbuildは行われているので動作するのではないかと淡い望みをかけてテストします。

サンプルはこんな感じです。

var cv = require('opencv');

try {
        var camera = new cv.VideoCapture(0);
    // V4Lエラーが発生した場合には上記を/dev/video2と認識された場合には以下に置き換えます。
        // var camera = new cv.VideoCapture(2);


        var window = new cv.NamedWindow('Video', 0)

        setInterval(function() {
                camera.read(function(err, im) {
                        if (err) throw err;
                        console.log(im.size())
                        if (im.size()[0] > 0 && im.size()[1] > 0){
                                window.show(im);
                        }
                        window.blockingWaitKey(0, 50);
                });
        }, 20);
} catch (e){
          console.log("Couldn't start camera:", e)
}
$ nodejs camera.js

一応動いてくれました。

f:id:ueponx:20170812102853p:plain

エラーがでてしまったので無事に動くかかなり不安でしたが動作できたようです。でも、他の機能などもチェックしないと少し不安な印象でした。

まとめ

RaspberryPi同様にOpenCVpythonとNode.jsの両方で動作が確認できました。

あと個人的に気になるのはDragonBoardではBluetoothシリアルになるかなと思います。

DragonBoard 410c(Debian)でUSB接続のWebCamを使用してみる

DragonBoard 410c(Debian)でUSB接続のWebCamを使用してみる

なんとなく気になったので調べてみました。 結論からいうとUVC対応のものであれば問題なく使用できるようです。

接続

カメラをUSB接続します。

【接続前】

$ lsusb 
Bus 001 Device 003: ID 0b95:7720 ASIX Electronics Corp. AX88772
Bus 001 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

【接続後】

linaro@linaro-alip:~$ linaro@linaro-alip:~$ lsusb 
Bus 001 Device 004: ID 0b95:7720 ASIX Electronics Corp. AX88772
Bus 001 Device 003: ID 045e:075d Microsoft Corp. LifeCam Cinema
Bus 001 Device 002: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

以下のエントリが一覧に追加しているので認識は問題ないようです。

Bus 001 Device 003: ID 045e:075d Microsoft Corp. LifeCam Cinema

念のため/dev/videoデバイスも追加されているか確認します。

$ /dev/video*
/dev/video0  /dev/video1  /dev/video2

問題なく生成されています。

$ sudo apt-get install guvcview

キャプチャしてみる

RaspberryPiとはことなり静止画のキャプチャのアプリケーションがないのでインストールを入れる必要がありそう?だったので、guvcviewインストールしてみます。

GTK+ UVC Viewer

インストールは以下でOK

$ sudo apt-get install guvcview

インストールするとX側の【サウンドとビデオ】のメニューにも反映されるので、マウスでクリックして起動します。

Xをリモートデスクトップ接続で開いて

f:id:ueponx:20170722065449j:plain

起動すると(オーディオ関連でWarningがたくさんでますが)

f:id:ueponx:20170722065453j:plain

メニューが出ましたというか、あれ?キャプチャ映像のウインドウは?

もしかしたらリモートデスクトップ接続だとだめなのかなと思って、HDMIモニタに接続したところ無事に表示されました。HDMI接続をしているとリモートデスクトップ接続していても、起動はできるようです。(どうも起動時にHDMIを接続している・いないかが関係している様です。) RaspberryPiではこういうことはなかったので多分設定があるんだろうなーと。

f:id:ueponx:20170722065457j:plain

HDMI接続していれば、リモート側にも画面出力は行われる。(ちょっとわかりにくい)

また、デフォルトでも【グラフィックス】のメニューにWebカメラアプリがあったので【ウェブカムビューア】(実体はcamorama)を使って見ると

f:id:ueponx:20170722065445j:plain

f:id:ueponx:20170722065440j:plain

こちらは問題なさそう。

謎すぎる…guvcview起動オプションで対応可能のかもしれない。

あと、RaspberryPiのようにコマンドライン上からraspistillで静止画をキャプチャするようなコマンドが見当たらなかったのでfswebcamをインストールしてみました。

$ sudo apt-get install fswebcam

実行は以下でOK

$ fswebcam sample.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'sample.jpg'.

こんな感じで使用はできました。

終わりに

RaspberryPi同様(?)にWebカメラが使用できました。

あとは、pythonとかnode.jsからの使用ができるかが気になるところです。 となるとOpenCVも入れなきゃなあ。

/* -----codeの行番号----- */