【Android】着信の検知

GitHubを導入してみる。テストも兼ねて投稿。

ネットで公開されているプログラムを元にしてみました。Androidで着信を検知する場合の実現方法は以下のようにすればできるっぽい。

で、これをトリガに別の端末にSMSかメールを飛ばすようにする予定。というか、大体出来たけど、まだまだ公開するレベルにはなっていないので、そのうちには。

【Raspberry Pi】外付けHDDの追加

ラズパイで外付けHDDを管理させます。

HDDは3.5インチの1.5TB(ST31500341AS)。玄人志向の外付けケースを使ってUSBケーブルで接続します。

 

1.外付けHDDのパーテーションの作成とフォーマット 

余程のことがない限り、USBで接続すればラズパイで自動認識してくれます。

 $ sudo fdisk -l

(略)

Disk /dev/sda: 1500.3 GB, 1500301910016 bytes

 

パーテーション作成はコマンドでもできますが、今回はGUIでやります(特に意味はなし)。というわけで、GPartedをインストールします。インストールは事前に導入していたSynapticにて。

 

なお、今回はWindowsで接続しても大丈夫なようにNTFSで作ります。NTFSで作る場合は予めntfs-3gをインストールしないとダメです。

$ sudo apt-get install ntfs-3g 

 インストールが完了したら、

ラズパイのスタートメニュー?->「設定」->「GParted」を実行。

GPartedが起動したら、メニュー->「GParted()」->「デバイス(D)」->「/dev/sda1」を選択します。

f:id:engetu21:20150201201819j:plain

 

/dev/sda1(外付けHDD)が見つかるため、パーテーションメニューからパーテーションを作ります。また、 フォーマット時はNTFSを選択します。ntfs-3gをインストールしていないと、NTFSを選択できないため、注意。

まぁ、GUIは直感的にわかると思うので、特に操作説明は書きません。

 

 2.マウントの設定 

マウントできるようにします。

$ sudo mkdir /mnt/hdd1

$ sudo mount /dev/sda1 /mnt/hdd1

しかし、これだと毎回マウントしないと行けないため、自動マウントをさせます。他の外付けHDDを接続することも想定し、UUID指定でマウントできるようにします。

UUIDは以下のコマンドで抽出。

$ sudo blkid /dev/sda1

/dev/sda1: UUID="XXXXXXXXXXXXX" TYPE="ntfs"

(追記)なお、以下のコマンドでも確認することが可能です。

$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda 
├─sda1 ntfs XXXXXXXXXXXXX /mnt/hdd1

 

このUUIDを自動マウントセッティングします。一番最後の行に以下のように追加

 $ sudo vi /etc/fstab

UUID="XXXXXXXXXXXXX" /mnt/hdd1 ntfs defaults 0 2

自動マウントされるかは再起動で確認しましょう。

→(追記)sudo mount -a を打つことで再起動せずに確認することも可能。 

 

【2019/8/15追記】

上記の設定をした際、配下のグループやユーザを変えられない場合がある。その時には、fstabの設定を以下のように変更する。

※参考:【LinuxUbuntuNTFS形式のファイルで所有者や権限が変更する方法 https://sekisuiseien.com/computer/11054/

$ sudo vi /etc/fstab

UUID="XXXXXXXXXXXXX" /mnt/hdd1 ntfs-3g defaults,permission 0 2

 

$ sudo mount -a

 

また、一括で グループ/ユーザを変える場合は以下の通り。

参考:ファイルやディレクトリのパーミッションを一括で置換したい https://qiita.com/takeshi81/items/48ea62eae2fc7f1cb2f0

$ sudo find /home/xxxx -type d -exec chmod 755 {} +
$ sudo find /home/xxxx -type f -exec chmod 644 {} +

【追記終わり】

 3.HDD回転を自動で止める 

 参考サイト:

Raspberry PiでUSB外付けHDDの回転を自動で止める | Frog Code Works

sdparmをインストールします。 

$ sudo apt-get install sdparm

動作確認は以下のコマンドで。

$ sudo sdparm --command=stop /dev/sda1
    /dev/sda1: Initio    ST31500341AS      3.01 

動作用シェルスクリプトを作成(コピペ)。作成後に実行権限を付与。

$ sudo vi  /usr/local/bin/usbhdd_spindown.sh

gist.github.com

$ sudo chmod 755 /usr/local/bin/usbhdd_spindown.sh

起動時の シェル実行設定をします。

$ sudo vi /etc/rc.local

/usr/local/bin/usbhdd_spindown sda1 900 2>&1 | logger -t usbhdd_spindown &

 

【Raspberry Pi】リモートデスクトップ接続をxrdpで実現

WindowsPCからラズパイにアクセスさせるため、xrdpを導入します。

 

1.xrdpのインストール

以下のコマンドを実行。

$ sudo apt-get update

$ sudo apt-get install xrdp 

 

2.日本語キーボードの入力対応

  インストールさせたら日本語キーボード対応をさせるため、以下の対応を行う。

$ cd /etc/xrdp/

$ sudo wget http://w.vmeta.jp/temp/km-0411.ini

$ sudo ln -s km-0411.ini km-e0010411.ini

$ sudo ln -s km-0411.ini km-e0200411.ini

$ sudo ln -s km-0411.ini km-e0210411.ini

$ sudo service xrdp restart

 

3.iptablesの設定変更

 ログイン用のポートと画面転送用のポートを開ける必要があります。

ログイン用ポートは/etc/xrdp/配下のxrdp.iniに記載されている。特に変更はしない。

画面転送用ポートはsesman.iniに記載されている。これも変更なしですが、UDPポートになるので注意。

$IPTABLES -A INPUT -p tcp -s $LOCALNET --dport 3389 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -d $LOCALNET --sport 3389 -j ACCEPT
$IPTABLES -A INPUT -p udp -s $LOCALNET --dport 3350 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $LOCALNET --sport 3350 -j ACCEPT

$LOCALNETは変数ですが、自宅内で使用しているネットワークアドレス帯域を指定。

 

4.リモートデスクトップ接続からの接続

スタートメニュー等からリモートデスクトップ接続を実施します。

コンピュータのところにはアクセスするラズパイのIPアドレスかホスト名を。

f:id:engetu21:20150201184511j:plain

 

ラズパイでxrdpが正常に動作していれば、以下の画面が出る。

この時点で、例えば「@」がキーボード通りに入力できない場合は、日本語キーボード対応がちゃんとできていないので注意。

f:id:engetu21:20150201184618j:plain

 

usernameとpasswordはLinuxユーザのそれを使う。

ログインが正常であれば、以下のようにコネクションログが出力され、無事にラズパイのデスクトップ画面が出る。

f:id:engetu21:20150201184842j:plain

 

【Windows】VirtualBoxのvdiのコピー

VirtualBoxで仮想HDDを作った際に、それをコピーして同一環境を別々に動かしたいときですが、普通のコピペでは、コピー先のファイルがVirtualBoxでは読み込めません。UUIDなるものがコピー元と同一になるので、それが原因のようです。

なので、以下のコマンドをコマンドプロンプトで実行します。

 

実行環境はwin8.1です。

今回はlinuxBeanをコピーします。

 

cd C:\Program Files\Oracle\VirtualBox

C:\Program Files\Oracle\VirtualBox>VBoxManage clonevdi E:\linuxbean01.vdi E:\linuxbean02.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

これでEドライブ配下にlinuxbean02.vdiができているため、VirtualBoxで読み込めば完了。

【LIVA】【Ubuntu server14.04】Julius-plusで家電を操作

概要

すでに我が家で稼働済みですが、ちゃんとまとめていなかったため、書いておきます。

Juliusについてはこちら

engetu21.hatenablog.com

 

赤外線モジュールについてはこちら

engetu21.hatenablog.com

 

1.Julius-plusの導入

Julius-plusはrti7743さんがJuliusを元に認識向上を向上させたものです。

(詳しくはルールベースjuliusの誤認識対策にSVMを利用してみよう - お前の血は何色だ!! 4

ありがたいことにソースを展開して頂いてます。

https://github.com/rti7743/rtilabs/tree/master/files/asobiba/juliustest/julius-4.2.1/julius-plus

 

上記リンク先から一つ上に移動すると、Julius-plusが入っているJulius-4.2.1のセットが置いてあり、ReadMeとしてインストール方法が記載されています。

$ sudo apt-get install flex

$ sudo apt-get install g++

$ sudo apt-get install 'libboost*-dev'

$ sudo apt-get install libboost-thread-dev

$ sudo apt-get install binutils-dev

$ sudo apt-get install libboost-system-dev

$ sudo apt-get install libasound2-dev

$ ./configure --with-mictype=alsa

$ make

$ cd julius-plus
$ make

$ ./julius-plus

(略)

マイクで喋ってください。エンターキーを押すと、プログラムを終了します。
----コマンド----

(略)

<<< please speak >>>

音声入力状態になります。

 

 2.Julius-plusを自分の環境に合わせる

音声入力で家電を操るには、以前のエントリーでも書いたとおり赤外線学習リモコンを利用します。

そのため、Julius-plusのソースを弄ります。

といってもいじるソースファイルは3つだけです。

 

①JuliusPlus.cpp

 JuliusPlusメソッドに、Julius-plus起動時のメニューが記載されています。ここの記載自体はユーザ入力補助の表示なので、実際いじらなくても問題なかったりしますが、一応やりましょう。

 

②testmic.jconf

このファイルはJulius-plus起動時のオプションが記載されています。

私の環境では「-nostrip」を設定しておくと都合がいいので、追記しておきます。

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

 

③main.cpp

肝になるファイルです。すでにテンプレがあると思いますが、認識させたい文言とそれに対応する動作(処理)を記載します。

サンプルとして私の場合は以下のようになります。

julius.AddCommandRegexp("しょうめい(きどう|オン|つけて)",CallbackDataStruct([=](){
             std::cout << "###RUN>照明をつけます" << std::endl;

             //irMagicianのコマンドを実行

             system("sudo python ~/irmcli/irmcli.py -p -f ~/irmcli/right_light_on.json");
}));

 julius.AddCommandRegexp("しょうめい(ていし|オフ|けして)",CallbackDataStruct([=](){
              std::cout << "###RUN>照明を消します" << std::endl;

               //irMagicianのコマンドを実行
               system("sudo python ~/irmcli/irmcli.py -p -f ~/irmcli/right_light_off.json");
})); 

 これだけです。irMagicianのコマンド実行は

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

 にて記載していますが、これを音声入力時に自動実行させるだけです。

その後の処理で音声ファイルを再生し、「照明をつけます」といったものをゆっくりに喋らせると面白いかもしれませんね。

 

ソースの変更が終わったら、必ずmakeを再実行しましょう。

3.screenコマンドによる仮想画面で常時実行

Julius-plus起動中は他の操作ができません。本体のターミナルならまだしも、Teraterm等で遠隔ログインした場合はTeraterm終了と同時にセッションが切れてしまうため、実行させ続ける事ができません。

バックグラウンドでうまく動かせればよかったのですが、&による実行はうまく動かなかったため、screenで作成した仮想画面上で実行させます。

仮想画面上で動作させていれば、Teratermの接続を切っても裏で動かし続けることができます。

やり方は簡単。

$ screen

説明文が出てきますが、Enter。仮想画面ができます。

この状態でJulius-plusを起動します。起動方法は1の記載のとおりです。

起動が確認できたら仮想画面をデタッチします。

画面上で

[Ctrl+a]を入力後に[d]を入力

[detached from 4777.pts-3.サーバ名

これでJulius-plusを動かしたまま別の操作ができるようになります。

Julius-plusの画面をアタッチ(呼び出す)には

$ screen -ls

There are screens on:
        4777.pts-3.サーバ名 (2014年12月06日 22時40分58秒)   (Detached)
1 Sockets in /var/run/screen/S-ユーザ名.

 

$ screen -r 4777

とすればよいです。仮想画面を削除する場合は

[Ctrl+d]を入力

[screen is terminating]

と出て削除しつつ、元の画面に戻ります。

【LIVA】【Ubuntu server14.04】apt-getでエラー発生(post-installationスクリプトエラー)

概要

 apt-get でソフトウェアの更新をしようとしたらエラーになりました。(泣) 

最近エラーばっかり・・・ 

$ sudo apt-get upgrade
パッケージリストを読み込んでいます...

(略)

... 完了
アップグレードパッケージを検出しています ... 完了
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
1 個のパッケージが完全にインストールまたは削除されていません。
この操作後に追加で 0 B のディスク容量が消費されます。
続行しますか? [Y/n] y
squid3 (3.3.8-1ubuntu6.2) を設定しています ...
/var/lib/dpkg/info/squid3.postinst: 1: /var/lib/dpkg/info/squid3.postinst: cannot open /etc/squid3/squid.conf: No such file
dpkg: error processing package squid3 (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 2 を返しました
処理中にエラーが発生しました:
 squid3
E: Sub-process /usr/bin/dpkg returned an error code (1)

 赤文字のところを見ての通り、すでにおかしい状態。squid3が中途半端な状態でインストールされている?模様。

 

さてどうする?

参考サイト:フロントが苦手なWEBエンジニアの技術メモ: apt-getのpost-installationスクリプトエラー

 

上記サイトの通りにやったら解決しました!

 

①エラーの確認

 $ sudo dpkg --audit
以下のパッケージは最初の設定中に問題が発生したため、設定が終了していません。
dpkg --configure <パッケージ> か dselect で設定 (configure) メニューオプションを使って設定作業を再試行しなければなりません:
squid3               Full featured Web Proxy cache (HTTP proxy)

 

②--configureで実行しろと言われたのでやってみる。

$ sudo dpkg --configure squid3
squid3 (3.3.8-1ubuntu6.2) を設定しています ...
/var/lib/dpkg/info/squid3.postinst: 1: /var/lib/dpkg/info/squid3.postinst: cannot open /etc/squid3/squid.conf: No such file
dpkg: error processing package squid3 (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 2 を返しました
処理中にエラーが発生しました:
 squid3

③/var/lib/dpkg/info配下の特定のファイルを削除

どうも関連する以下のファイルを削除すればいいようです。今回はsquid3関連を削除。

 

$ ls | grep squid3
squid3-common.postinst
squid3-common.md5sums
squid3.postinst
squid3.prerm
squid3.preinst
squid3.postrm
squid3.conffiles
squid3.md5sums
squid3-common.list
squid3.list

 

$ sudo rm -fr squid3.postinst squid3.postrm squid3.prerm

 

 

④--configureを再起動

 

$ sudo dpkg --configure squid3
squid3 (3.3.8-1ubuntu6.2) を設定しています ...
(略)
squid3 は既に最新バージョンです。

 

 

で、この後apt-get upgradeも正常にできましたとさ。

 

【LIVA】【Ubuntu server14.04】visudoで設定をミスってsudo化できなくなった件

 概要

crontabでシェルスクリプトを動かす際、シェルスクリプト内のsudoでパスワードを聞かれないようにvisudoを弄る必要があったのでやっていたわけだけど、凡ミスしているのに強制上書きしてしまったがためにsudoができなくなったよ /(^o^)\

 $sudo vi aaa.txt

sudo: /etc/sudoers 内 10 行付近で構文解析エラーが発生しました
sudo: no valid sudoers sources found, quitting
sudo: ポリシープラグインを初期化できません 

ちなみにやりたかったことはこちらに書いてあります。

特定ユーザー・プログラムにのみcronでのsudoをパスワード無しで許可する設定 | TeraDas-テラダス

 

さてどうする?

※2022/8/13追記

どうやら以下のコマンドを実行し、パスワードを入力することで変更することが可能なようです。(少なくともUbuntu18.04以降)

pkexec visudo

 

 

 いろいろ調べた結果、こちらが参考になりました。

ubuntuでsudoの設定変更に失敗したときの対応 - 作業ノート

 

人によってはこちらも参照になるかも(私の環境では無理でした)

/etc/sudoersがsyntax errorでsudo使えなくなった時の対処法 - tech.log

 

やることは以下の通りです。

①サーバを再起動

②再起動時のブートメニューでリカバリーモードを選択

③「network」とか「root」とかいろいろ選択できるダイアログになるが、迷わず「root」を選択

④rootユーザでプロンプトが操作できることを確認し、以下を実行

# mount -o remount,rw /

 参考サイト曰く、/配下を「書き込み可能な状態で再マウント」とのこと。

ちなみに、上記をやらないといくら編集しても上書きできません。ファイルコピーすらできません。15分ぐらいハマりました。

⑤sudoersを編集

# nano /etc/sudoers

  私はvi派ですが、viがデフォルトで何故か無かったので、nanoを使います。

ズラズラとエラーが出ましたが、気にせずEnterキーを押すことでnanoが起動します。

⑥誤っている記述を修正

⑦Ctrl+oで上書き、Ctrl+xでnanoを終了

⑧サーバ再起動

 

以上です。これでsudoが無事使えるようになりました。