BlankTar

about | blog | works | photo

TensorFlow使って何かしてみようかと思ったのですが、環境の準備が面倒臭かったのでdockerを使うことにしました。
使うことにしたのは良いのですが、これはこれで変なエラーが出る。

$ sudo docker pull tensorflow/tensorflow
latest: Pulling from tensorflow/tensorflow
f15ce52fc004: Download complete 
f15ce52fc004: Error downloading dependent layers 
a4c5be5b6e59: Download complete 
8693db7e8a00: Download complete 
d8756350b401: Download complete 
a45e71c8e07a: Downloading  62.7 MB/117.5 MB
a45e71c8e07a: Download complete 
f279406ce390: Downloading 62.71 MB/64.28 MB
f279406ce390: Download complete 
33aaefaf1ef4: Download complete 
61ceb07455d3: Download complete 
522cd5886eb9: Download complete 
b470c94167f1: Download complete 
db3ccc0fd241: Download complete 
8034d5ab3f06: Download complete 
8f7bb1e922ab: Download complete 
8f7bb1e922ab: Error pulling image (latest) from tensorflow/tensorflow, endpoint: https://registry-1.docker.io/v1/, Driver devicemapper failed to create image rootfs f8f7bb1e922ab: Error pulling image (latest) from tensorflow/tensorflow, Driver devicemapper failed to create image rootfs f15ce52fc004a5c3eab9128a78f7c0c2135d4f726bc54f1373120ab3ff291bcc: Error running DeviceCreate (createSnapDevice) dm_task_run failFATA[0043] Error pulling image (latest) from tensorflow/tensorflow, Driver devicemapper failed to create image rootfs f15ce52fc004a5c3eab9128a78f7c0c2135d4f726bc54f1373120ab3ff291bcc: Error running DeviceCreate (createSnapDevice) dm_task_run failed

読めない。むずかしい。

archのコミュニティの人曰く、/var/lib/dockerを消せばなんとかなるらしい。

$ sudo service docker stop
$ sudo rm -r /var/lib/docker
$ sudo service docker start

こんな感じで。

で、リトライ。

$ sudo docker pull tensorflow/tensorflow
latest: Pulling from tensorflow/tensorflow
f15ce52fc004: Pull complete 
c4fae638e7ce: Pull complete 
a4c5be5b6e59: Pull complete 
8693db7e8a00: Pull complete 
d8756350b401: Pull complete 
a45e71c8e07a: Pull complete 
16133a811f85: Pull complete 
f279406ce390: Pull complete 
f8dc0e184935: Pull complete 
33aaefaf1ef4: Pull complete 
61ceb07455d3: Pull complete 
522cd5886eb9: Pull complete 
b470c94167f1: Pull complete 
db3ccc0fd241: Pull complete 
8034d5ab3f06: Pull complete 
8f7bb1e922ab: Pull complete 
Digest: sha256:ce933ea6cb3e3e9b115fd7da7e5d1f4149dee2daed4126ccb606a9d546ae96ff
Status: Downloaded newer image for tensorflow/tensorflow:latest

なんか行けたっぽい。

コンテナを置いてあるディレクトリを消すっぽいので、取り扱いには要注意です。
今回は何にも使ってない環境だから良かったけれど、バックアップとかも考えると結構面倒臭い解決策かも。

参考: [SOLVED] docker will not pull images / Applications & Desktop Environments / Arch Linux Forums

今まで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

[ << ] [ 10 ] [ 12 ] [ 14 ] [ >> ]