Linux上でffmpegのバイナリ(静的ビルド)を手軽に使う

Linuxffmpeg 入れたいけど root権限ないんだよなぁ,と思っていたら,静的ビルド済のバイナリをそのまま使うお手軽な方法があったのでメモ.

バイナリは下記からダウンロードする.

AMD64, i386, ARM64用などが揃っている.

自分は試しに下記をダウンロードしてみた. https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz

解凍してパスを通す.以上.

tar xvf ffmpeg-release-amd64-static.tar.xz
cd ffmpeg-release-amd64-static
cp ffmpeg <どっかPATHの通ってる場所 (${HOME}/binとか)>

サイトが頻繁にメンテされているようでありがたい.

Dasher不要!Raspberry Piにamazon-dashをpip installで宅内IoTボタン化計画

はじめに

Amazon Dashボタンの改造に関する記事をよく見かけます。ただ、その多くはDasherというOSSの使用を想定しているのですが、2019年2月現在、Dasherはメンテナンスが止まっています。

f:id:swytel:20190219170512p:plain
Dasherの使用は非推奨になっていました。のーん...

そこで本家も勧めている、amazon-dashというpythonライブラリをRaspberry Piにpip installすることで、Amazon Dashの宅内IoTボタン化を試みます。さらに、Dashボタンの代表的な活用事例である(?)、ボタンを押すと家族Slackに通知(例:「牛乳買ってきて」)が飛ぶシステムの構築手順も解説します。

必要なもの

  • Raspberry Piが動く環境
  • Amazon Dash 1個〜
  • オプション:Slackのアカウント
  • オプション:IFTTTのアカウント

Raspberry Pi の設定

まず、OSを入れます。手順は次の記事に書きました。本体は、有線なり無線なり、何らかのネットワークモジュールが搭載されたものであれば大丈夫です。OSも、軽量なRaspberry Stretch Liteで十分です。 swytel.hatenablog.com

設定完了後、次に進みます。まずpython3の開発用ライブラリ等や、最新のpip3環境を入れます(Pythonは2.7系も試しましたが、3系の方がうまくいくようでした)

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python3-dev tcpdump
$ curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3
$ sudo pip3 install --update pip3

amazon-dashをpip installします。Amazon Dashからの通信を受信するものです。

$ sudo pip3 install amazon-dash
$ sudo python3 -m amazon_dash.install

以上で、Raspberry Pi側の下準備ができました。 ちなみに、2019年2月現在、amazon-dash-1.3.2.tar.gz がインストールされました。

Amazon Dashの設定

iPhoneAndroid等のAmazonショッピングアプリを開き、下記を参考に、設定を進めます。

Amazon.co.jp ヘルプ: スマートフォンでDash Buttonをセットアップする

  1. 「アカウントサービス」> 「バーチャルダッシュとDash Button端末」> 「新しい端末をセットアップ」
  2. 「同意して開始」をタップ
  3. 連携したい Dashボタンを長押し(画面が切り替わるまで)
  4. 自宅のWiFiを選択

ここでストップです。商品の選択画面になったら、下記画像のように「✗」マークを押して終了してください。ここで商品を選択すると、ボタンを押すたびに購入してしまうので...

f:id:swytel:20190219152924j:plainf:id:swytel:20190219153042j:plain
商品は選択せずに終了する
(画像は「参考リンク」にあるmitsuaki1229さんのQiitaから頂きました)

Amazon DashとRaspberry Piを連携する

いよいよ両者を連携する準備ができました。Amazon DashのMACアドレスを調べ、amazon-dashサーバに登録する作業を行います。Raspberry Piのコンソールに戻り

$ sudo amazon-dash discovery

とします。少し待って

Welcome to Amazon-dash v1.3.2 using Python 3.5.3
The discovery command lists the devices that are connected in your network. Each device will only be listed once. After executing this command wait approximately 10 seconds before pressing the Amazon Dash button. After pressing the button, the Mac address of the button will immediately appear on the screen. Remember the address to be able to create the configuration file.

とまで表示されたら、Dashボタンを押します。

xx:xx:xx:xx:xx:xx (Amazon Device)

のようなMACアドレスが表示されたら、控えておきます。なお(Amazon Device)と書いていないMACアドレスが出ても、無視してOKです。Ctrl-Cで終了します。

このMACアドレスamazon-dashサーバに登録します。試しに、ボタンを押したら "Hello World" というファイルを生成するようにしてみましょう(mitsuaki1229さんのQiitaを参考にさせていただきました)

$ sudo vi /etc/amazon-dash.yml
# amazon-dash.yml
# ---------------
settings:
  delay: 10
devices:
  xx:xx:xx:xx:xx:xx:
    name: Hello World
    user: pi
    cmd: echo "Hello World" >> HelloWorld.log
    cwd: /home/pi

amazon-dashサーバを起動します。

$ sudo systemctl start amazon-dash
$ sudo systemctl enable amazon-dash

ボタンを押して

$ cat /home/pi/HelloWorld.log
Hello World

と表示されれば成功です。

Amazonアプリの通知を切る

今のままでは、ボタンを押すたびに、スマホに通知が来てしまうと思います。

f:id:swytel:20190219155504j:plain
通知だらけになってしまう
「アカウントサービス」> 「バーチャルダッシュとDash Button端末」> 「Dash端末の管理」>「通知の設定」と進み、下の方にある「Dash Buttonの通知」をオフにすると、平和になります。

IFTTTやSlackとの連携

Amazon Dashボタンを押すと『牛乳買ってきて』メッセージをSlackに送信する」システムを作ります。名付けて Papa(Mama)zon Primeですかね? IFTTTのWebhookという仕組みを用いて実現します。

まず、次のサイトに行きます。

ifttt.com

画面右上の「Documentation」をクリックします。

f:id:swytel:20190219164657p:plain
Documentationをクリック

"Your key is..." の後に、でっかく表示された認証キーを控えておきます。

f:id:swytel:20190219164720p:plain
IFTTTの認証キー

amazon-dashサーバに登録します。Hello Worldの部分を消し、IFTTTの設定に置き換えます。

$ sudo vi /etc/amazon-dash.yml
# amazon-dash.yml
# ---------------
settings:
  delay: 10
devices:
  xx:xx:xx:xx:xx:xx:
    name: buy_milk
    ifttt: <<さっきの認証キー>>
    event: papazon_prime
    data: {"value1": "牛乳買ってきて"}

サーバを再起動します。

$ sudo systemctl restart amazon-dash

仕上げです。Dashボタン --> raspberry Pi (amazon-dashサーバ) --> IFTTT --> Slackという仕組みを完成させます。

  1. IFTTTの画面に戻り、画面右上から、New Appletを選択
  2. "+this" をクリックし、"Webhooks" > "Receive a web request" を選択
  3. "Event Name" に "papazon_prime" と入力し、"create trigger"
  4. "+that" をクリックし、"Slack" > "Post to channel" を選択
  5. SlackをIFTTTに連携したことがない方は、連携します.連携済の方は、メッセージを投稿したい Channelを選びます
  6. Message欄をいったんすべて消し、"Add Ingredients" > "Value 1" を選択
  7. Titleなどのオプションも削除し、"create action"
  8. "Finish" をクリック

以上でIFTTTとSlackの連携も完了しました。Dashボタンを押して、Slackチャンネルにメッセージが飛んだら完成です!お疲れ様でした。

ちなみに我が家では、この仕組みを応用して、育児記録システムを運用したいと思います。後日、これについても書きたいと思います。

参考リンク

Raspberry Pi 3 Model B+にamazon-dashをインストール - Qiita

Repurposing Amazon Dash buttons to add a line to Google Sheet when pressed | DEM Flyers

Raspberry PiへのOS(Raspbian Stretch Lite)必要最低限のインストール手順(MacOS利用)

人に譲ってもらったRaspberry Piを活用すべく、最低限の手順で、さくっとOS(Raspbian)を導入したいと思います。 コマンドラインに慣れている人向けの解説です。ネットワークの回線速度にもよりますが、30分〜1時間くらいあれば終わると思います。 なお、自分にとっては、ほぼ初のRaspberry Piです。

用意したもの

  • Raspberry Pi 1 Model B+
    • シングルコア、無線モジュールとかない2014年頃のもの
  • Micro SDカード(8GB〜) + カードリーダー
  • USB Micro-Bケーブル(一番よく見かけるやつ、給電用) 1本
  • LANケーブル 1本
  • Mac Mini(Mojave)
  • USBキーボード
  • HDMIケーブル+ディスプレイ

OSのダウンロード

Download Raspbian for Raspberry Pi からダウンロードします。ちなみに各イメージの容量は、以下の通りです。

  • Raspbian Stretch with desktop and recommended software: 1.8GB
  • Raspbian Stretch with desktop: 1.0GB
  • Raspbian Stretch Lite: 351MB

自分は、手元のSDカードの容量が小さい、また簡易的なサーバ機能のみを構築予定なので、最も軽量な Raspbian Stretch Lite にしました。 遅いと噂の本家サイトから入手しても、5〜10分程度でダウンロードが完了します。

f:id:swytel:20190218182804p:plain
Raspbian Stretch Liteを入手

zipを展開すると、2018-11-13-raspbian-stretch-lite.img といったイメージファイルが生成されます。

Micro SDカードへの転送

基本的には

Installing operating system images on Mac OS - Raspberry Pi Documentation

の、"Command Line"にある手順を参考に進めます。

まずはMicro SDカードをFATで初期化します。Macなら「ディスクユーティリティ」を使うのが手軽でしょう。

f:id:swytel:20190218184046p:plain
「消去」>フォーマット「MS-DOS(FAT)」を選択
次に

$ diskutils list

とし、ディスク名や容量を元に、初期化済SDカードのディスクIDを特定します。これからddでイメージを書きますので、ID番号はくれぐれも間違いのないように...。自分の場合は disk"4" でしたので、以下、(r)disk4と記載します。

イメージデータを書き込みます。

$ diskutil unmountDisk /dev/disk4  
$ sudo dd bs=1m if=2018-11-13-raspbian-stretch.img of=/dev/rdisk4 conv=sync

プロンプトが返ってきたら

$ sudo diskutil eject /dev/rdisk4

として、SDカードを抜きます。

Raspberry Piの起動確認とSSHサーバ設定など

Micro SDカードをRaspberry Piのスロットに挿し、LANケーブル、USBキーボード、HDMIケーブル、USB Micro-Bケーブルを挿して起動します。ログインコンソールが立ち上がったら

  • ログイン名: pi
  • 初期パスワード: raspberry

でログインします。

ただ、初期設定のままでは、SSHサーバが起動していません。今後はRaspberry Piにリモートログインしたいので、起動設定をします。

$ sudo raspi-config

とすると、次の画面になります。

f:id:swytel:20190218191612p:plain
raspi-configによる設定画面
「5. Interfacing Options」> 「P2 SSH」と進み、"Would you like the SSH server to be enabled?" と聞かれたら "Yes" を選択します。

自分は宅内LANで利用するため、SSHサーバはいったん設定完了とします。設定は他のLinuxと同様、/etc/ssh/sshd_config で行えるので、気になる方は、公開鍵認証、パスワードによるログイン、rootログインの禁止等の設定等を行ってください。

その他

ロケール(言語等)の設定

$ sudo raspi-config

「4. Localisation Options」> 「I1. Change Locale」で

を選択(Spaceキー)します。デフォルトを何にするか聞かれたら「ja_JP.UTF-8」を選択します。

タイムゾーンの設定

「4. Localisation Options」> 「I2. Change Timezone」で「Asia」>「Tokyo」を選びます。

以上の設定が終わり、"Finish"を選び、再起動します。再度立ち上がったら、リモートログインを試したり

$ sudo apt-get update
$ sudo apt-get upgrade

等を行ってください。

以上で、必要最低限の設定は完了です。この時点での消費ディスク容量は1.3GB程度(全体の20%以下)ですが、 gcc 6.3.0やglibc、Python2.7(たしか3.5も)等が既に入っており、ちょっとした作業なら始められそうです。

ちなみに私は、この後、Raspberry PiAmazon Dashボタンを宅内コントローラとして使用するためのサーバを構築します。その手順についても追々書きたいと思います。

自分のアドレスが、他人のFacebookアカウントに不正利用されたときの対応

誰かが自分のアドレスを使ってアカウントを作ったらしい

最近,自分のメールアドレスに,スペイン語とおぼしきFacebook通知が頻繁に来るようになりました.

当初,Facebookを装ったスパムメールかと思っていたのですが,送信元を見ると notification@facebookmail.com となっていて 正規のFacebookらしいことが分かりました. すると,誰かが,自分のメールアドレスを利用して,アカウントを作成したことになります.

Facebookへの報告手順

気持ち悪いので,Facebookに事態を報告し、不正利用を止めたいと思います.いくつかWebの記事を見て回ったのですが,2019年1月現在,この方法が有効でしたので,紹介します.

まず,下記へアクセスします.

このメールアドレスはすでに使用されています。 | Facebook

すると,問題の報告画面にアクセスできます.ここで,一番上の「自分のものではないアカウントに関するFacebookメールが送信されてくる。」を選択すると,下記の入力フォームが現れます.

f:id:swytel:20190113103211p:plain
Facebookへの報告画面

ここに

  • 自分のメールアドレス
  • 問題の概要(知らない人が自分のアドレスを使ってアカウントを作成した旨)
  • 生年月日

を入力し,規約に「同意する」のチェックを入れて送信します.

その後,すぐに自分の(不正利用された)メールアドレス宛に,本人確認のメールが届きます.

f:id:swytel:20190113104248p:plain
Facebookからの確認メール

一言,「はい,自分のものです」などと返信します.

そして確認されれば,

メールに関してお問い合わせいただき、ありがとうございます。ご報告の内容を調査し、このアカウントからあなたのメールアドレスを削除しました。

などといった返信が届きます.これで一件落着ですね.

Facebookの自分のアカウントに,不正利用されたアドレスも登録する

すでにFacebookアカウントを持っている人は,今回不正利用されてしまったアドレスも登録しておくことで,他人による使用を防ぐことができます. 下記のヘルプを参照してください.

www.facebook.com

単にFacebook通知を止めるだけなら,普段届くメール下部のリンクから,配信停止を依頼するのでも良いのですが,まずそもそもメールが外国語で読めないですし(笑),それにやはり,誰かに自分のアドレスを使われたと思うと気持ち悪いですよね.ひと手間ですが,これで謎の通知に悩まされることもなくなり,安心できました.

Ubuntu 16.04LTSにCUDA 9.2を入れた時のメモ

先月,CUDA9.1を入れた時の作業手順を書きましたが,CUDA9.2の評判が良さそうなので,アップグレードします. ちなみに,ローカル環境で,DeepLearningBOXにインストールします.

ありがたいことにCUDA9.2は,deb(network)経由でインストールすれば,NVIDIAドライバも一緒にインストールされました.ちなみに今回は最新のnvidia-396が入りました.

事前準備

$ sudo apt remove nvidia*
$ sudo apt remove cuda*
$ sudo apt autoremove

debの入手

デベロッパーサイトから,Linux>x86_64>Ubuntu>16.04と進み,Installer Typeは "deb(network)" を選んで,.debファイルをダウンロードしました.

その後,再起動.ログイン画面になったら Ctrl+Alt+F1 で,CUI画面に入ります.

X Serverを止める

$ sudo service lightdm stop
$ pkill Xorg

CUDAインストール

$ sudo dpkg -i cuda-repo-ubuntu1604_9.2.*_amd64.deb  (私の場合, *は88-1)
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda

完了したら,再起動します.

パス確認

場合によっては不要かもしれませんが,念の為,~/.bashrcなどに次の行があるかどうか,確認しておきます.

export PATH=/usr/local/cuda/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}

変更した場合は

$ source ~/.bashrc

動作確認

$ nvidia-smi
$ nvcc -V

nvcc -Vで,release 9.2 などと表示されればOKです.

cuDNNのインストール

相変わらず,次を参考にさせていただきました.

qiita.com

CUDA9.0以上では OpenCV2.4系が動かない?opencv-python(3.4.0)をインストール

CUDA 9.1にアップデートしたところ,CUDA8.0時代のライブラリとリンクして,ソースからコンパイルしたOpenCV 2.4.13 が動かなくなり,pythonimport cv2 ができなくなりました.ちなみにOSはUbuntu 16.04LTSです.

公式レポジトリから opencv-2.4.13.6.zip (2018年5月時点で最新)を取得して再度コンパイルする方法を試みましたが,うまくいかず.どうやら,OpenCVの2.4系は,CUDA 9.0以上だと動かないようです.

もし動いた方がいらっしゃいましたら,教えてください.

OpenCV3系になると,少し困るといえば困るのですが,一切動かないよりマシなので,私は一旦,pipで OpenCV3.4.0 を入れました.

pip install opencv-python
pip install opencv-contrib-python

これで,ひとまず import cv2できるようになるはずです.

ソースからコンパイルする必要がある場合は,下記が参考になりそうです. http://www.python36.com/how-to-install-opencv340-on-ubuntu1604/

参考:CUDA9.0以上でOpenCVコンパイルできないという悲痛な叫び達

Ubuntu 16.04LTSにNVIDIAドライバ(nvidia-390)とCUDA 9.1を入れた時のメモ

cuda-toolkitを入れる前に立ちはだかる壁,その名もNVIDIAドライバのインストール. 過去に,いろいろな方法で入れ直したりと,試行錯誤した記憶があったので,調べつつ進めました.

CUDA Toolkit 9.1 Download | NVIDIA Developer

によると

Before installing the CUDA Toolkit on Linux, please ensure that you have the latest NVIDIA driver R390 installed. The latest NVIDIA R390 driver is available at: www.nvidia.com/drivers

とあります.しかし www.nvidia.com/drivers にアクセスして入手した.runファイルは,うまくいかないと評判です (私も試して、ダメでした。特にNVIDIA-Linux-x86_64-390.48.runがダメらしい)

https://devtalk.nvidia.com/default/topic/1031213/linux/problem-installing-nvidia-390-42-driver-on-ubuntu-16-04/

そこで,今回はppaから入れる方法を取ります. まずあらかじめ,次の手順をやっておきます.

バイス等の確認

$ lspci  | grep -i nvidia

GPUの数だけ表示されればOK)

ドライバ等確認

$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda

入っていたら,アンインストールします

$ sudo apt-get remove nvidia*
$ sudo apt-get remove cuda*
$ sudo apt autoremove

ここで再起動.ログイン画面になったら Ctrl+Alt+F1 で,CUI画面に入ります

X Serverを止める

$ sudo service lightdm stop
$ pkill Xorg

ppaレポジトリを足し,nvidia-390を入れる

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt-get install nvidia-390

再起動します

確認

$ dmesg | grep nvidia
$ dpkg -l | grep nvidia

後者で、ii nvidia-390 390.48-0ubuntu0~gpu16.04.3という行が出てきてくれました。やれやれ。

$ nvidia-smi

f:id:swytel:20180508174914p:plain

やったね。

おまけ:cuda-toolkitのインストール

qiita.com

を,多いに参考にさせていただき,CUDA 9.1を入れました. デベロッパーサイトから,Linux>x86_64>Ubuntu>16.04と進み,Installer Typeは "deb(network)" を選びました. 他の方法だと,パッチが色々出ていて面倒そうだったので.

実際やったことは,上記と同じですが

sudo dpkg -i cuda-repo-ubuntu1604_9.1.*_amd64.deb  (私の場合, *は85-1)
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

です.速い.きっとrunfileをダウンロードする時間より速いです.

.bashrcのパス設定も上記ブログの通りに行い,nvcc が実行できることを確認.

参考URL