BlankTar

about | blog | works | photo

今までmplayerでせこせこ音楽を聞いていたのですが、なんとなくMPD(MusicPlayerDaemon)というやつを使い始めました。
これが結構便利で幸せな感じです。
折角なのでモバイル環境でも同じようなことが出来るようにしようと思い、macbookにもMPDを入れてみました。

$ brew install mpd

これでとりあえず入る。入るけれど、設定しないと動かない。

まずは設定ファイルを書きます。

$ cat ~/.mpdconf
music_directory "~/Music"
db_file "~/.mpd/database"
pid_file "~/.mpd/pid"
bind_to_address "~/.mpd/socket"

なんとなくこんな感じ。
music_directoryを自分の音楽ファイルが置いてある場所にしたりpid_fileをtmpfsか何かに置いたりはお好みで。

で、データベースファイルってやつを作ります。空のファイルで良いみたい。

$ mkdir ~/.mpd
$ :> ~/.mpd/database

こんなもんで。

そしたら問題ないか確認するために起動。

$ mpd --no-daemon --stderr

初回起動時は検出した音楽ファイルのリストがばーっと出るのでなんか凄いことになりますが、適当なクライアントから操作してみて問題無さそうなら多分大丈夫です。

上記のコマンドだとデーモンになってくれなくて不便なので、デーモンとして起動しなおす。

$ mpd

これだけ。

このままだと自動起動してくれないので、自動起動するようにしたければ以下のように。

$ ln -sfv /usr/local/opt/mpd/*.plist ~/Library/LaunchAgents/

こんな感じで。

これであとは良い感じに動いてくれると思います。便利。

参考: Mpd on OS X Snow Leopard - Music Player Daemon Community Wiki - Wikia

pythonで文字列フォーマットをするときには今のところ二通り方法があって、pythonには珍しく(?)統一されていない感じになっています。
で、python3.6では更に新しい方法が追加されるらしいです。
軽く使ってみたのですが、微妙にformatメソッドと違ったりして不思議な感じなので、軽くメモ。
記事執筆時点での開発版の仕様を元にしているので、もしかしたら正式版とは違うかもしれません。注意です。

とりあえず既存の一つめの方法。%式。式? 演算子?

>>> w = 'world'
>>> 'hello %s' % w
'hello world'

こんなやつ。わりとよく見掛けるやつです。
フォーマット文字列の文法はなんとなくC言語とかのprintfに似てますね。

で、二つめの方法はformatメソッド。

>>> w = 'world'
>>> 'hello {0}'.format(w)
'hello world'

こんなん。ちょっとモダンです。かなり高機能で、色々出来る。
一応これが推奨の方法らしいですが、bytesにも%でフォーマットする方法が導入されたりして、なんだかよくわからない。

そして、新しく導入されるのがf文字列ってやつ。

>>> w = 'world'
>>> f'hello {w}'
'hello world'

シンプルっぽい。
ご覧の通り、というか何というか、変数名をそのまま使えるようになっています。

で、こいつ。formatメソッドと同じような構文で、同じことが出来るように見えます。

>>> n = 12
>>> f'{n:05d}'
'00012'

>>> s = 'hello'
>>> f'{s: <7s}'
'hello'

ゼロ詰めとか、右寄せとか左寄せとか。

なんだー簡単じゃんと思うわけですが、微妙に仕様が違うようです。
どうも、変数名のところに普通のリテラルも書けるようです。
つまりどういうことかというと、普通の計算式を書ける。

>>> f'{12 + 34}'
'46'

>>> n = 1
>>> f'{n * 2}'
'2'

>>> a = 'hello'
>>> b = 'world'
>>> f'{a + " " + b}'
'hello world'

>>> def func(x):
...     return x * 2
... 
>>> f'{func(2)}'
'4'

おお、よくわからなくなってきた。

formatメソッドのときはどうだったかというと、計算しようとするとKeyErrorが出たりします。

>>> '{12 + 34}'.format()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
KeyError: '12 + 34'

うん、分かりやすい反応

それでも概ね使い方に違いは無さそうですが、とりあえず違いが影響しそうなのはdict型にアクセスするときとか。

>>> d = {'a': 1, 'b': 2}

>>> '{0[a]}'.format(d)
'1'
>>> '{d[b]}'.format(d=d)
'2'
>>> '{0["a"]}'.format(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: '"a"'

>>> f'{d["a"]}'
'1'
>>> key = 'b'
>>> f'{d[key]}'
'2'
>>> f'{d[a]}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

こんなん。
普通の値か、それとも専用のミニ言語か、というような感じの違いなんでしょうね、きっと。
考えてみりゃ当然のことですが、ちょっとふしぎ。

文字列の定義と同時にしか使えない(多分)し、使えたとしてもセキュアじゃない感じがするし、既存の方法の置き換えというわけにはいかなそうです。
状況に応じて色々組み合せる必要性がありそう。うーむ。

参考: Pythonの新しい文字列フォーマット : %記号、str.format()から文字列補間へ | プログラミング | POSTD

HTML5でやった音の解析をpythonでもやりたくなって、挑戦してみることにしました。
とりあえず、マイク入力をやってみるべくPyAudioを入れてみる。

pipで入るっぽいので、普通に入れようとしてみる。

$ pip install pyaudio
-- 前略 --
  ----------------------------------------
  Failed building wheel for pyaudio
Failed to build pyaudio
Installing collected packages: pyaudio
  Running setup.py install for pyaudio
    Complete output from command /usr/local/opt/python/bin/python2.7 -c "import setuptools, tokenize;__file__='/private/var/folders/hr/7zxpydvd1y71t9pfmjc8vd9m0000gn/T/pip-build-qflUbY/pyaudio/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/hr/7zxpydvd1y71t9pfmjc8vd9m0000gn/T/pip-62rzwG-record/install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    running build_ext
    building '_portaudio' extension
    clang -fno-strict-aliasing -fno-common -dynamic -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DMACOSX=1 -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/_portaudiomodule.c -o build/temp.macosx-10.10-x86_64-2.7/src/_portaudiomodule.o
    src/_portaudiomodule.c:29:10: fatal error: 'portaudio.h' file not found
    #include "portaudio.h"
	     ^
    1 error generated.
    error: command 'clang' failed with exit status 1

    ----------------------------------------
Command "/usr/local/opt/python/bin/python2.7 -c "import setuptools, tokenize;__file__='/private/var/folders/hr/7zxpydvd1y71t9pfmjc8vd9m0000gn/T/pip-build-qflUbY/pyaudio/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/hr/7zxpydvd1y71t9pfmjc8vd9m0000gn/T/pip-62rzwG-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/hr/7zxpydvd1y71t9pfmjc8vd9m0000gn/T/pip-build-qflUbY/pyaudio

怒られた。portaudioとやらが無いらしい。

こっちはhomebrewで入るっぽいので、入れる。

$ brew install portaudio
==> Downloading https://homebrew.bintray.com/bottles/portaudio-19.20140130.yosemite.bottl
######################################################################## 100.0%
==> Pouring portaudio-19.20140130.yosemite.bottle.1.tar.gz
🍺  /usr/local/Cellar/portaudio/19.20140130: 30 files, 459.7K

入った。

リトライ。

$ pip install pyaudio
Collecting pyaudio
  Using cached PyAudio-0.2.9.tar.gz
Building wheels for collected packages: pyaudio
  Running setup.py bdist_wheel for pyaudio
  Stored in directory: /Users/ena/Library/Caches/pip/wheels/84/09/9e/49441223cb875ab560307172b4835caa143907305d607723c5
Successfully built pyaudio
Installing collected packages: pyaudio
Successfully installed pyaudio-0.2.9

できた。

この依存関係解決してくれるんだかくれないんだかよく分からない感じ、なんとかならんのでしょうかね…。

[ << ] [ 7 ] [ 9 ] [ 11 ] [ >> ]