Category Archives: Computer

Linuxで音声の出力先をUSBスピーカーにする

Pocket

Nano Pi Neo2にスピーカーを繋いだのだが、ノイズが入ってたまらない。
そこでUSBスピーカーから音を出すようにしてみる。
USBスピーカーはこれ。USBケーブル一本でいいので重宝している。

まずalsamixerで音量を確かめておく。

次。
aplayコマンドを使って、音声出力のハードウェアデバイスのcardとdevice番号を調べる。
—helpオプションで使い方を。

$ aplay --help
Usage: aplay [OPTION]... [FILE]...

-h, --help help
--version print current version
-l, --list-devices list all soundcards and digital audio devices
-L, --list-pcms list device names
(略)

-lオプションで一覧を得る。

$ aplay -l
<span class="gs">****</span> List of PLAYBACK Hardware Devices <span class="gs">****</span>
card 0: Codec <span class="p">[</span><span class="nv">H3 Audio Codec</span><span class="p">]</span>, device 0: CDC PCM Codec-0 <span class="err">[</span>]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: allwinnerhdmi <span class="p">[</span><span class="nv">allwinner,hdmi</span><span class="p">]</span>, device 0: 1c22800.i2s-i2s-hifi i2s-hifi-0 <span class="err">[</span>]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: MicroII <span class="p">[</span><span class="nv">Audio Advantage MicroII</span><span class="p">]</span>, device 0: USB Audio <span class="p">[</span><span class="nv">USB Audio</span><span class="p">]</span>
  Subdevices: 1/1
  Subdevice #0: subdevice #0

USBスピーカーだから最後のものが該当。
MicroIIということがわかる。

speaker-testコマンドでテストする。
–helpで確認するのが定石

$ speaker-test --help

speaker-test 1.1.0

Usage: speaker-test [OPTION]... 
-h,--help       help
-D,--device     playback device
-r,--rate       stream rate in Hz
-c,--channels   count of channels in stream
-f,--frequency  sine wave frequency in Hz
-F,--format     sample format
-b,--buffer     ring buffer size in us
-p,--period     period size in us
-P,--nperiods   number of periods
-t,--test       pink=use pink noise, sine=use sine wave, wav=WAV file
-l,--nloops     specify number of loops to test, 0 = infinite
-s,--speaker    single speaker test. Values 1=Left, 2=right, etc
-w,--wavfile    Use the given WAV file as a test sound
-W,--wavdir     Specify the directory containing WAV files
-m,--chmap      Specify the channel map to override
-X,--force-frequency    force frequencies outside the 30-8000hz range
-S,--scale      Scale of generated test tones in percent (default=80)

Recognized sample formats are: S8 S16_LE S16_BE FLOAT_LE S32_LE S32_BE

-Dオプションで出力先を選ぶ。
出力先の指定はデバイスネームだからさっきのaplayコマンドで再チェック

$ aplay -L|grep MicroII
sysdefault:CARD=MicroII
    Audio Advantage MicroII, USB Audio
front:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround21:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround40:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround41:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround50:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround51:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
surround71:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
iec958:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
dmix:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
dsnoop:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
hw:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio
plughw:CARD=MicroII,DEV=0
    Audio Advantage MicroII, USB Audio

ということで、hw:MicroIIで試す。

$ speaker-test -Dhw:MicroII

speaker-test 1.1.0

Playback device is hw:MicroII
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
Channels count (1) not available for playbacks: Invalid argument
Setting of hwparams failed: Invalid argument

鳴らない。

この辺を読み、hwではなくplughwにしてみる。
http://www.volkerschatz.com/noise/alsa.html

$ speaker-test -Dplughw:MicroII

speaker-test 1.1.0

Playback device is plughw:MicroII
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 96 to 262144
Period size range from 48 to 131072
Using max buffer size 262144
Periods = 4
was set period_size = 65536
was set buffer_size = 262144
 0 - Front Left
Time per period = 2.769702
 0 - Front Left
^CTime per period = 2.426893

鳴った。
チャンネル2つにしてみると

$ speaker-test -c2 -Dplughw:MicroII

speaker-test 1.1.0

Playback device is plughw:MicroII
Stream parameters are 48000Hz, S16_LE, 2 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 96 to 262144
Period size range from 48 to 131072
Using max buffer size 262144
Periods = 4
was set period_size = 65536
was set buffer_size = 262144
 0 - Front Left
 1 - Front Right
^CTime per period = 3.587277

左右で鳴る。
さらにaplayで試す。

$ aplay /usr/share/sounds/alsa/Front_Center.wav -D plughw:MicroII
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono

よさそう。
これでmpg123などを使えば、mp3ファイルなども鳴らすことができる。
mpg123でデバイスを指定するには-aオプションで。

mpg123 -q -a plughw:MicroII XXXX.mp3

ためしにデバイスにdefaultを指定すると文字通り標準設定のデバイスから出力を試みる。
USBスピーカーはならないはず。

$ aplay /usr/share/sounds/alsa/Front_Center.wav -D default

デフォルトの出力先を変えるには、以下の手順に沿えばよい。
https://www.alsa-project.org/main/index.php/Setting_the_default_device

 

No tags for this post.

[メモ][FreeBSD] 複数Jailのpkg upgradeを一気に済ませたい

Pocket

メモ。

jailのpkg操作は、いちいちそのjailの中に入らなくてもpkg -j <jail名 or jail ID> …というように-jオプションを付与すればできる。

しかしjailの指定は、個々に行う必要がある。
たとえばpkg -j * upgradeというように、ワイルドカードを使うようなことは、もってのほかのようである。
jailなんてどんどん増えていくのに、いちいち-jで指定していくのもなあ。
仕方ないんで、やっつけでパイプを繋いで実現。

以上

[メモ] SlackとMattermostそれぞれのincomingWebhookへのポスト方法の違い

Pocket

MattermostはSlackのクローンであるが、incomingWebhookへのポストだけは、どうも違いがあるようだ。
以下にSlack/Mattermostそれぞれでの実例を示す。
まずmattermost

Slack

[メモ][Python] AnacondaをWindows xpにインストールしようとすると失敗する

Pocket

Anacondaは、Pythonのほかに、IPython、Spyder、pandas他便利ライブラリが一式でついてくるお手軽Python環境である。

しかしAnacondaをWindows xpにインストールしようとすると失敗する。
具体的には、インストール途中の「メニューを作る」ステップで失敗。
無視して進めると、C:\Anaconda3に実行ファイルは揃っているので、「なんだ気のせいか」と安心して起動しようとすると「有効なWin32アプリケーションではありません」という旨のエラーが発生する。

原因は、最新版がxpに対応していないせい。
以下から2.2.0をダウンロードし、インストールする。

https://repo.continuum.io/archive/

念のためファイル名とハッシュ値も残す。

Anaconda3-2.2.0-Windows-x86.exe
7c49a4e76e1c383038c4a1e8c4ac506f

Anaconda-2.2.0-Windows-x86.exe
32246b48658d4c3faeef425cec64a131

AnacondaのFAQにしっかり記載がある。

https://docs.continuum.io/anaconda/faq

How can I use Anaconda on Windows XP?
Windows XP is supported on Anaconda versions 2.2 and earlier. Download it from our archive.

Slack/MattermostのbotをPythonのFlaskで作ろう

Pocket

Slack/Mattermost(以降、まとめてSlack)のbotといえばHubotが有名だ。
Hubotはcoffeescriptで書かれているのだが、botのためだけに新しい言語を覚えるのも面倒。
加えてHubotを動作させるにはnpmが必要。
ちょっとそこまでは…。
Pythonなら普段使いで最初から環境は作ってあるし、楽だし。
そう思っていろいろと調べてみた。

Slackのbotに必要なことは?

Slackのbotに必要なのは、端的に以下の二つ。
1. Slackからのデータ送信を受ける。
2. Slackへ何かをする。

1.は、HTTP POSTでやってくるので、POSTを受けることさえできればよい。
2.は、例えばSlack上で何かの発言をすることだが、こちらはcurl(Pythonならrequests)でも使えば簡単にできる。

PythonでHTTP POSTを受けるには?

Flaskである。
Flaskとはごくごく軽量なwebフレームワークである。
驚くくらい簡単にwebサーバを作ることができる。
もちろんPOSTを受けるのもすぐにできる。
以下、説明。

Flaskのインストール

pipでもなんでも、好きなものを使ってインストールせい。

Flaskのテスト

以下のようなスクリプトを書く。
適当な名前で保存する。
flask.pyとかはやめようね。

上記のapp.route(‘/’)とは、ルーティング。
ルートディレクトリ(’/’)へのアクセスがあったら、次のdef welcome()が(デコレートによって)呼ばれる、ということである。

上記の場合、welcomeと表示するhtmlが返る。

app.debug = Trueについては後述。
app.run(host=’0.0.0.0)のhost=…の記述により、サーバを外部に公開することになる。

テストスクリプトの実行

localhostのポート5000でサーバが立ち上がったと分かる。
ブラウザでアクセスして「welcome」と表示されればよい。

ところで、app.debut = Trueだが、スクリプトを書き換えると、自動的に再読み込みをしてくれる。
実際のログは以下。

激烈に便利な機能なので、開発中は有効にしておくこと。

SlackからのPOSTを受ける。

先ほどのスクリプト冒頭のimportを以下のように変更。

さらに以下を追加。

上記のようにしておいて、Slack側のOutgoing Webhookで、呼び出すURLに「http://<あなたのサーバのアドレス>:5000/matter」を指定する。

Slack側からwebhookを呼び出してみると、POSTされた内容がログに表示されるはず。
なお、def post()が何も返さないのでエラーは出るが気にしない。

以下が例。

つまりPOSTの内容はディクショナリになっている。

Slackへ応答を返そう

Slackへ応答を返す場合には、POSTでもらった中にあるtokenが必要である。
応答文、tokenのディクショナリを作っておいて、それをjsonに変換し、返してやればよい。
Mattermostの場合、tokenのキーは’MATTERMOST_TOKEN’

先ほどのスクリプトを最終的に以下のようにする。
(わざわざjsonをimportしているが、Flaskにもそういう機能がある気がしてならない)
これでSlackから通知を受けると、「You said <トリガーワード>」という応答がSlackへ帰る。

【補遺】slackのoutgoing webhooks

slackでのwebhooks設定方法を示す。
webでいうと、左下のAppsからBrowse Appsを選び、outgoins WebHooksを探す
Add Configurationで設定へ。

webhooksを投げる条件を設定する。以下の3つ。

  1. 指定のチャンネルで発言したら
  2. 特定のトリガーワードを発言したら
  3. 特定のチャンネルで特定のトリガーワードを発言したら

1.はChannelで、2.はTrigger Word(s)で指定する。
3の場合には1.2.の両方を指定する。

上記条件に合致したらwebhooksを投げるURLを「URL(s)」で指定。
そのときのTokenは記載の通り。

webhooksで飛んでくるデータは以下の通り。json「ではない」ことに注意。

token=qFosSxxxxxxxxERh1Jfdy5
team_id=T0009
team_domain=example
channel_id=C0000000000
channel_name=test
timestamp=1355517523.000005
user_id=U0000000000
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:

 

[Windows] ファイルサーバへの接続ユーザを変えよう

Pocket

Sambaサーバのセットアップをしているとき、動作確認のために、Windowsから接続することがある。
このとき、権限も確認するために、ユーザを変えて接続しようとする。
しかしWindowsは、ファイルサーバの認証を一回してしまうと、再起動するまで記憶する(たぶん)。
それはそれで便利なのだが、検証するとなると障害になる。

netコマンドを使えば、再起動なく認証をやり直すことができる。
コマンドなので、バッチ化も可能。
以下、使用例。

net useで現在、記憶している接続を表示

net use /deleteで接続を削除

以下のようにすれば認証もできる。

[Python] listの差分を知るには

Pocket

Pythonで、二つのリストの差分を知るには。
リストのままでは引き算ができない。
set()でset型にしてから引き算をする。
ただしset()すると、与えられたリストから重複した要素が除かれること、順序も保持されないことに注意
また、set()して要素を操作した結果はset型のまま。
list()でリストに戻す必要がある。

以下、サンプル。

[Python][memo] タイムスタンプの差を求める

Pocket

すぐ忘れるのでメモ。

文字列としてのタイムスタンプは、datetime.datetime.strptimeで、フォーマットを指定してdatetime.datetime型に変換。
そうしたら加減算ができる。datetime.timeでは出来ないので注意。
以下、IPythonでの例。

[Python] requestsとlxmlで京急の運行情報を抽出しよう

Pocket

botに京急の運行情報を調べさせて、Slackで発言させたい。
使用言語はPython。
さあどうしようかと思ったら、さいきんは、どんなものでもライブラリが揃っていて、あっという間になんでも出来てしまうのな。

ページの取得はrequests、解析はlxmlを使う。

Webページの事前解析

ページのソースから、狙いの箇所を特定するようなキーワードを見つける。
あるいは、たとえばChromeなら、デベロッパーツールで探してもよい。
京急のページであれば、以下のように。

keikyuanalyze
手がかりは”div.unko-panel”。
これをもとにコードを書く。

抽出コード

stackoverflowを調べればサンプルコードなんかいくらでもあるよねー。

requestsでwebページ取得。
lxmlで読み込んで、class “unko-panel”のdivタグを見つければよい。

[参考]slackへの投稿

ここはサラッと。
詳細はslackのサイトを見る。
前章の関数の戻り値を引数に取る関数。

[slack][hubot][jail][メモ] FreeBSD Jailでhubotを飼う

Pocket

slackにhubotを住まわせる記事は山のようにあるが、それを「hubotを自前サーバ」「それもFreeBSDに」という条件にすると記事数が激減する。

そんななか、四苦八苦してなんとか達成したのでここに採録。
なお、そっけなく不親切に見えるのは、ここまでたどり着くのに疲労困憊したから。
ではどうぞ。

jailの作成

フッツーに。
以下ではqjailを使っているがezjailでもなんでも、好きなのを使いたまえ。

 

npmのインストール

まずjailをスタートさせて中に入ろうか。
そしてnpmのインストール。

node, npmのバージョンを確認しておく。
問題なくインストールされているかの確認でもある。

 

generatorのインストール

 

hubot用ユーザの作成

jailの中でadduserし、お好きなユーザを作る。
以下では「bot」というユーザ。

 

hubot用ユーザでhubotレポジトリ作成

botホストの作業はいったんはここまで。
以降、slack側で。

 

slackにhubotのインストール

slackのteamメニューからApp&Integrations > Hubotをインストール
表示されるAPI Tokenを記録する。
hubotがslackへアクセスするためのトークン。

 

botホストで起動スクリプトの作成

再びbotホスト
/usr/local/etc/rc.d/hubotとして以下を作成。
試行錯誤で作ったから雑なスクリプトであることに注意。
それから実行権限付けるのを忘れないこと。

 

起動確認

/etc/rc.confにhubot_enable=YESを記載。
service -l でhubotがリストされることを確認したら、service hubot startで起動。

以下のような表示が出ればOK。

 

ポートフォワーディングの設定。

前章の起動時メッセージ、「INFO hubot-redis-brain: Using default redis on localhost:6379」に注目。
6379でポート待ち受けている。
ご家庭のサーバで動かしている場合には、ルータでのポートフォワーディング設定を忘れずに。
なお2016/4/16現在、slackの側でサーバのIPアドレスを指定したりするような設定は不要。

 

slack側の確認

slackでbotを住まわせたいchannelにInvite。
botの名前の左側に在席マークが点いているのを確認し、「@<bot名> ping」とし、botからPONGと帰ってきたら成功。
もし起動時メッセージが不要であれば、以下のように/usr/sbin/daemonのオプションに-fを加えるとよい。