人生リアルタイムアタック

当面はPython学習帳

sedとxargsを併用して纏めてyum removeする

事の始まり

OS X環境で使っていたVim設定を使いまわそうとして、cpsm.vimの為にBoost関連のパッケージをインストールしたけど、滅多にCentOS環境では使わないからやっぱりremoveしたい。

今回の削除対象のみなさん。

今日纏めて入れちゃったパッケージの方々。| とxargsを上手く使いこなして一発で消したい。

$ yum list installed | grep boost
boost-date-time.x86_64             1.41.0-28.el6                     @base
boost-filesystem.x86_64            1.41.0-28.el6                     @base
boost-graph.x86_64                 1.41.0-28.el6                     @base
boost-iostreams.x86_64             1.41.0-28.el6                     @base
boost-program-options.x86_64       1.41.0-28.el6                     @base
boost-python.x86_64                1.41.0-28.el6                     @base
boost-regex.x86_64                 1.41.0-28.el6                     @base
boost-serialization.x86_64         1.41.0-28.el6                     @base
boost-signals.x86_64               1.41.0-28.el6                     @base
boost-system.x86_64                1.41.0-28.el6                     @base

sedで余計な部分を消す

sed自体は以前利用経験があるし、Vimでも利用しているので特に困らずこんな感じに削除する

$ sudo yum list installed | grep boost | sed -e 's/\ .*//'
boost-date-time.x86_64
boost-filesystem.x86_64
boost-graph.x86_64
boost-iostreams.x86_64
boost-program-options.x86_64
boost-python.x86_64
boost-regex.x86_64
boost-serialization.x86_64
boost-signals.x86_64
boost-system.x86_64
boost-test.x86_64
boost-thread.x86_64
boost-wave.x86_64

問題なさそう。

xargsに渡す

$ sudo yum list installed | grep boost | sed -e 's/\ .*//' | xargs -t sudo yum -y remove
sudo yum -y remove boost-date-time.x86_64 boost-filesystem.x86_64 boost-graph.x86_64 boost-iostreams.x86_64 boost-program-options.x86_64 boost-python.x86_64 boost-regex.x86_64 boost-serialization.x86_64 boost-signals.x86_64 boost-system.x86_64 boost-test.x86_64 boost-thread.x86_64 boost-wave.x86_64
読み込んだプラグイン:fastestmirror, security
削除処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package boost-date-time.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-filesystem.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-graph.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-iostreams.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-program-options.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-python.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-regex.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-serialization.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-signals.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-system.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-test.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-thread.x86_64 0:1.41.0-28.el6 will be 削除
---> Package boost-wave.x86_64 0:1.41.0-28.el6 will be 削除
--> 依存性解決を終了しました。

依存性を解決しました

=============================================================================================================
 パッケージ                         アーキテクチャ      バージョン                  リポジトリー        容量
=============================================================================================================
削除:
 boost-date-time                    x86_64              1.41.0-28.el6               @base              149 k
 boost-filesystem                   x86_64              1.41.0-28.el6               @base              172 k
 boost-graph                        x86_64              1.41.0-28.el6               @base              338 k
 boost-iostreams                    x86_64              1.41.0-28.el6               @base              114 k
 boost-program-options              x86_64              1.41.0-28.el6               @base              615 k
 boost-python                       x86_64              1.41.0-28.el6               @base              649 k
 boost-regex                        x86_64              1.41.0-28.el6               @base              1.9 M
 boost-serialization                x86_64              1.41.0-28.el6               @base              1.5 M
 boost-signals                      x86_64              1.41.0-28.el6               @base              154 k
 boost-system                       x86_64              1.41.0-28.el6               @base               24 k
 boost-test                         x86_64              1.41.0-28.el6               @base              1.6 M
 boost-thread                       x86_64              1.41.0-28.el6               @base               84 k
 boost-wave                         x86_64              1.41.0-28.el6               @base              1.2 M

トランザクションの要約
=============================================================================================================
削除                13 パッケージ

インストール済み容量: 8.5 M
パッケージをダウンロードしています:
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  削除中                  : boost-wave-1.41.0-28.el6.x86_64                                             1/13
  削除中                  : boost-filesystem-1.41.0-28.el6.x86_64                                       2/13
  削除中                  : boost-graph-1.41.0-28.el6.x86_64                                            3/13
  削除中                  : boost-regex-1.41.0-28.el6.x86_64                                            4/13
  削除中                  : boost-system-1.41.0-28.el6.x86_64                                           5/13
  削除中                  : boost-date-time-1.41.0-28.el6.x86_64                                        6/13
  削除中                  : boost-thread-1.41.0-28.el6.x86_64                                           7/13
  削除中                  : boost-program-options-1.41.0-28.el6.x86_64                                  8/13
  削除中                  : boost-serialization-1.41.0-28.el6.x86_64                                    9/13
  削除中                  : boost-signals-1.41.0-28.el6.x86_64                                         10/13
  削除中                  : boost-iostreams-1.41.0-28.el6.x86_64                                       11/13
  削除中                  : boost-test-1.41.0-28.el6.x86_64                                            12/13
  削除中                  : boost-python-1.41.0-28.el6.x86_64                                          13/13
  Verifying               : boost-python-1.41.0-28.el6.x86_64                                           1/13
  Verifying               : boost-date-time-1.41.0-28.el6.x86_64                                        2/13
  Verifying               : boost-test-1.41.0-28.el6.x86_64                                             3/13
  Verifying               : boost-iostreams-1.41.0-28.el6.x86_64                                        4/13
  Verifying               : boost-filesystem-1.41.0-28.el6.x86_64                                       5/13
  Verifying               : boost-regex-1.41.0-28.el6.x86_64                                            6/13
  Verifying               : boost-system-1.41.0-28.el6.x86_64                                           7/13
  Verifying               : boost-signals-1.41.0-28.el6.x86_64                                          8/13
  Verifying               : boost-serialization-1.41.0-28.el6.x86_64                                    9/13
  Verifying               : boost-wave-1.41.0-28.el6.x86_64                                            10/13
  Verifying               : boost-thread-1.41.0-28.el6.x86_64                                          11/13
  Verifying               : boost-graph-1.41.0-28.el6.x86_64                                           12/13
  Verifying               : boost-program-options-1.41.0-28.el6.x86_64                                 13/13

削除しました:
  boost-date-time.x86_64 0:1.41.0-28.el6                 boost-filesystem.x86_64 0:1.41.0-28.el6
  boost-graph.x86_64 0:1.41.0-28.el6                     boost-iostreams.x86_64 0:1.41.0-28.el6
  boost-program-options.x86_64 0:1.41.0-28.el6           boost-python.x86_64 0:1.41.0-28.el6
  boost-regex.x86_64 0:1.41.0-28.el6                     boost-serialization.x86_64 0:1.41.0-28.el6
  boost-signals.x86_64 0:1.41.0-28.el6                   boost-system.x86_64 0:1.41.0-28.el6
  boost-test.x86_64 0:1.41.0-28.el6                      boost-thread.x86_64 0:1.41.0-28.el6
  boost-wave.x86_64 0:1.41.0-28.el6

完了しました!

メモ

xargs -tでxargs実行時のコマンドを標準出力に出力できる。
xargs -n 1 でxargsに渡される引数の数を指定できる。cpする時は-n 2 などを使うことになるだろう。

英語上達の鉄板、音読パッケージ・瞬間英作文トレーニングは遠慮なくKindle版を買ってよい。

Amazon.co.jpKindle版を購入しようとすると、CD無しバージョンといわれてウッ...っとなる。

どんどん話すための瞬間英作文トレーニング (CD BOOK)

どんどん話すための瞬間英作文トレーニング (CD BOOK)

音声付き前提の書籍なのにCD無しでどないしようと思うのだけど、実はベレ出版で公式mp3(各216円)販売を行っているので気にせずKindle版を購入して問題ない。

ベレ出版音声ダウンロードストア / どんどん話すための瞬間英作文トレーニング 付属音声1

この記事執筆時点で、 Kindle版1,080円, 単行本1,944円。なので、2種類あるmp3データを買ってもKindle版の方が1,512円で済むので安い。
CDから取り込む手間もない分こちらの方がありがたい。

同様に、同じく著名な音読パッケージもKindle版の方がiPhoneKindle端末からも閲覧可能なことからKindle版の方が便利です。
私は書籍で購入してましたが、自炊したPDFよりKindleの方が便利な為、結局Kindle版も買い直しました。

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

みるみる英語力がアップする音読パッケージトレーニング(CD BOOK)

というわけで遠慮なくKindle版を買いましょう。

El CapitanのPreviewでKindle用にイイカンジにPDF圧縮する

手持ちの自炊したPDFや、PDF購入した電子書籍Kindle Paperwhiteでも読みたいのでイイカンジ圧縮したい。

しかし、Previewのファイルサイズ圧縮は低解像度過ぎる。
ということで、従来はColorSync Utilityで新しいフィルターを追加するというやり方があったが、El Capitanだと新規に追加したフィルターがPreviewで選択できず、選択可能にするにはCLIでsudoしたりしないといけない。

で、GUI操作の為にTerminal使うのはちょっと違うなと思ったので、標準アプリケーションのみでGUI操作で完結する方法を模索。

環境

  • Kindle Paperwhite 第7世代(2015年以降のモデル, 300ppi, 1,072×1,448)
  • OS X El Capitan
  • Kindleパーソナルドキュメントは50MBまでだけど、Gmailは25MBまでだから実質25MBに圧縮しないといけない人。

解決策

Automatorを使う。

手順

1. ColorSync UtilityでKindle用のフィルタを追加する

元々あるフィルタ'Reduce File Size'を複製し、Kindle用のフィルタを作成する。
今回は'for Kindle'という名前にした。

Web上の情報から、 Image Sampling > Max の値を元の512pxより大きくするとより解像度が上がることが分かっていたので、今回はKindle Paperwhiteの横解像度と同じ1072pxに指定したフィルタを作成した。 f:id:ShineSpark:20160527165453p:plain

2. Automatorアプリケーションを作成する

Kindle用のフィルタをPreview上で利用可能にするにはuser以下のlibralyディレクトリのフィルタを/System/Library/Filters/に移動させる必要があるのでめんどい。カンタンにAutomatorアプリケーションを作成する。

まず、Automatorを立ち上げる。Spotlight便利。

f:id:ShineSpark:20160527171207p:plain

新規にアプリケーションを選択する。

f:id:ShineSpark:20160527171241p:plain

アクションを登録していく。今回登録するアクションは以下の4つ。

  • Ask for Finder Items でどのファイルかを尋ねるようにする
  • Filter Finder Items で念の為PDFファイルのみに限定する
  • Copy Finder Items で元々のPDFファイルをデスクトップに複製する
  • Apply Quartz Filter to PDF Documents でコピーしたPDFファイルにフィルタを適用する

を行う。日本語でのアクション名はそれっぽいものを探してください。

f:id:ShineSpark:20160527171416p:plain

右上の 'Run' ボタンからテスト実行できるので、それで実際にどのように動作するのか確認しながら作るとよい。

上手く動作したらイイカンジの名前を付けて保存。

3. 使う。

アプリケーションとして保存したので、以後は作成したAutomatorアプリケーションを実行してPDF圧縮を行う。
イイカンジの名前を付けておくと、Spotlightから呼び出しやすい。

f:id:ShineSpark:20160527172407p:plain

上記すらだるい人

USBでKindleを繋いで同期しましょう。50MB越えてても大丈夫です。

Amazon.co.jp ヘルプ: USB経由でFireタブレットまたはKindle端末にパーソナル・ドキュメントを転送する

手持ちのPDF書籍の閲覧には多少工夫が入りますが、'本を読む' には軽さやバッテリー持ちの良さからiPadよりKindleの方が便利です。まだ買ってない人は買いましょう。

手頃な値段なので、ケースも保証も要らないです。壊れる頃には新世代のものが出てるので新しいのを買いましょう。 アダプタも他のUSBアダプタで代用できるので改めて買う必要はないです。

広告有無は1タップ減るので広告無し版を買いましょう。

Kindle Paperwhite Wi-Fi、ブラック

Kindle Paperwhite Wi-Fi、ブラック

参考

CentOSにDockerをインストールする

この記事内容は公式の

docs.docker.com

ままなので、英語が読める人は公式のドキュメントに従いましょう。

Dockerのインストール

元々のyum repoは古いので、Dockerのyum repoを追加する

# 一度yumの更新
$ sudo yum update 

# docker.repoの追加
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

# docker-engineのインストール
$ sudo yum install docker-engine

# dockerの起動
$sudo service docker start

# テスト起動
$ sudo docker run hello-world
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from hello-world
d59cd4c39e50: Pull complete
f1d956dc5945: Pull complete
Digest: sha256:4f32210e234b4ad5cac92efacc0a3d602b02476c754f13d517e1ada048e5a8ba
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

OK.

docker グループを作る

DockerデーモンはTCPポート代替として機能するUnixソケットに紐付いており、そのUnixソケットはデフォルトでrootがオーナーになっている為、Dockerはrootかsudoでしか動作しない。
ということで、docker グループを作ってそこにユーザを追加する。

この docker グループはDockerに於いてrootユーザ同等の権限を持つ。
Docker Daemon Attack Surface と呼ばれるセキュリティ上の影響を考慮する必要がある。

Docker security

# dockerグループの作成
$ sudo groupadd docker

# dockerグループにuserを追加する
$ sudo usermod -aG docker your_username

一度ログアウトし、先述のyour_usernameでログインする。
念の為、sudoなしで起動できることを確認する。

$docker run hello-world

起動時にdocker daemon自動起動する

いつもの

$ sudo chkconfig docker on

Dockerのアンインストール

# インストールしているyumパッケージの確認
$ yum list installed | grep docker
docker-engine.x86_64  1.7.1-1.el6       @dockerrepo

# 該当パッケージを削除
$ sudo yum remove docker-engine.x86_64

# イメージとコンテナとボリュームの削除
$ rm -rf /var/lib/docker

参考

https://docs.docker.com/engine/installation/linux/centos/

CentOSからNode.js / npm をアンインストールする

CentOSのrootからやたらとnpmが古いぞとメールが来るのだけれども、そもそもnvm上のNode.js / npmしか利用していないのでグローバルのNode.js / npmはアンインストールすることにした。

しかし、Node.js / npmのアンインストール方法が公式にないぞ...ということでその記録。

Node.jsのアンインストール

ソースコードがある場合(未確認)

# cd <ソースコードのディレクトリ>
# make uninstall

上記で安全にアンインストール可能らしいのだが、生憎未確認。

ソースコードがない場合

ソースコードが手元に無かった為、こちらのやり方で実施した。
まずnodeのパスを確認し、それに基づいてbin, lib, manを削除するだけである。
念の為verboseオプションを付与している。

# where node
/usr/bin/node

# rm -rfv /usr/{bin/node,lib/node,share/man/*/node.*}

npm のアンインストール

アンインストールコマンドが用意されているのでそちらを利用する。

# npm uninstall npm -g
- abbrev@1.0.7 node_modules/npm/node_modules/abbrev
- ansi-regex@2.0.0 node_modules/npm/node_modules/ansi-regex
- ansicolors@0.3.2 node_modules/npm/node_modules/ansicolors
- ansistyles@0.1.3 node_modules/npm/node_modules/ansistyles
- aproba@1.0.1 node_modules/npm/node_modules/aproba
- archy@1.0.0 node_modules/npm/node_modules/archy
- chownr@1.0.1 node_modules/npm/node_modules/chownr
- clone@1.0.2 node_modules/npm/node_modules/columnify/node_modules/wcwidth/node_modules/defaults/node_modules/clone

...

- npm@3.9.2 node_modules/npm

ホームディレクトリに .npm/ が残っていたのでこれも削除

# rm -rf .npm

これでアンインストール完了。

参考

Dein.vimにしたので折角だしこのタイミングでvimrc構成を整える

NeoBundle.vimからDein.vim移行に伴い、Vimの設定ファイル群の整理も行ったのでその記録。

設定ファイル群の構成

ざっくり以下の構成に整えました。

dotfiles/
└── .vim/
     ├── colors/     // カラースキーム置き場(今回は説明しません)
     ├── ftplugin/   // filetypeごとの固有設定ファイル置き場
     ├── gvimrc
     ├── rc/
     │   └── *.vim   // 各種設定ファイル
     ├── template/   // template置き場
     └── vimrc       // メインのvimrc

vimrc, gvimrc の設置箇所について

:help vimrc によると、

個人の初期化ファイルの配置場所:
Unix $HOME/.vimrc、$HOME/.vim/vimrc

初期化ファイルは上記の順に検索され、最初に見つかったものだけが読み込まれる。

推奨: Vimの設定ファイルは全て $HOME/.vim/ ディレクトリ(MS-Windowsでは$HOME/vimfiles/)に置くこと。そうすれば設定ファイルを別のシステムにコピーするのが容易になる。

とあります。

今まで$HOME直下にVim設定ファイルとして、 .vimrc, .vim/, .gvimrc の3つをシンボリックリンクでつなげてましたが、$HOME直下は.vim/だけで済むようにしました。

ftplugin ディレクトリについて

ファイルタイプごとに固有の設定は

.vim/ftplugin/<filetype>.vim
.vim/ftplugin/<filetype>_<name>.vim
.vim/ftplugin/<filetype>/<name>.vim

の箇所に配置すると、各ファイルタイプに応じて読み込まれます。
pythonを例にすると、python.vim でも python_hoge.vim でも python/hoge.vim でも読み込まれます。

.vimrc にすべてのファイルタイプの設定を書くのでなく、
各ファイルタイプごとに設定ファイルを用意することでリーダブルにします。

rc ディレクトリについて

私のVim環境下では、 .vim/rc/以下の *.vim ファイルをすべて読み込むように設定しています。
こうすることで、例えば Dein用の設定ファイルは.vim/rc/dein.vimのように、pluginごとの設定は.vim/rc/<plugin_name>.vim に分割することが可能です。

設定方法は、大本のvimrcに以下のように記述するだけです。

set rtp+=$HOME/.vim/
runtime! rc/*.vim

Dein.vim 用の call dein#add(...) を記述しまくった設定ファイルもここに設置しています。

template ディレクトリについて

テンプレートファイル置き場です。
Vimでのテンプレートは以下の設定で実現可能です。

例: Pythonのテンプレートファイルを設置する場合

.vim/template/skeleton.py として、以下を記述したファイルを設置します。

# coding: utf-8

次に、 .vim/rc/skeleton.vim に以下を記述したファイルを設置します。
(.vim/ftplugin/python.vim 内に記述しても可能です。)

augroup template
  autocmd!
  autocmd BufNewFile *.py 0r $HOME/.vim/template/skeleton.py
augroup END

$ vim new.py とすると、自動で "# coding: utf-8" が挿入されます。

:help skeleton もご参照ください。

まとめ

上記のような構成にすることで、Vimの設定ファイルをすべて .vim/ 配下で完結しつつ、ファイルタイプや用途ごとに適切に分割することができました。

以前より見通しがよくなった為、管理もしやすいです。
もし今まで.vimrcひとつで管理してた人は、分割も試してみてはいかがでしょうか?

それでは良いVimライフを!!

Activité Pop のバッテリーは3ヶ月程度しか持たなかったよ

Withings Activité Pop を買って7ヶ月ほど経ちました。

f:id:ShineSpark:20160116234926p:plain

Withings Activité Pop

歩数、運動量、睡眠のトラッキングが可能な腕時計。
公式だと20,800円だが、Amazonでは現在15,000円ほど。

値段に対する満足度としては非常に満足している。

Apple Watch が出る直前に並行輸入で購入したのだけれども、アナログな文字盤と歩数達成率のシンプルなデザインで非常に使いやすい。

同メーカーのハイエンドモデルである Activité の方がデザインは洗練しているが、 運動、睡眠計測の為に付けっぱなしになりがちであることから、安価な Activité Pop の方が気楽に使用できるのでこちらを購入した。

f:id:ShineSpark:20160117000325j:plain
アプリの画面。元々Withingsアプリで健康管理を行っている人には違和感なく移行できると思う。

バッテリー持ち

f:id:ShineSpark:20160116234945p:plain

公称ではバッテリーが8ヶ月と謳っている。Apple Watch のバッテリーが1日しか持たないと話題になっていた時期だったのもあり、Activité Pop は非常にバッテリー持ちするように見受けられる。

ところが...

f:id:ShineSpark:20160116234943p:plain

バッテリー残量が足りなくなると届くメール通知。

6月購入から、どう見ても3ヶ月程度しか持ってません。本当にありがとうございました。

しかも、上記のメール通知が届く前後から時計がズレ始める。時計なのに正しい時刻を示さなくなるなんて...

早く電池を交換しろってことか...と思い、電池を交換したらまた再び正しい時刻を示すようになった。

ついでなので電池交換の仕方

Activité Pop は自分で電池交換可能です。

f:id:ShineSpark:20160116235044j:plain

コンビニでも売っているボタン電池 CR2025 と、付属の時計蓋外しを用意して、

f:id:ShineSpark:20160116235012j:plain
パカーっと裏を外して、

f:id:ShineSpark:20160116235035j:plain

電池を外すと、「この向きで電池嵌めるんやでー」っと書いてあるのでその通りに嵌めるだけ。

蓋を閉める際は、防水仕様もあってかかなり力を要する。 テーブルの上に時計を置いた状態で、手のひらを時計の上に載せて、ちょっとジャンプして全体重を掛ける位でやっと嵌まる。

f:id:ShineSpark:20160116235004j:plain

これでまた3ヶ月は使えます。 最大8ヶ月というのは、きっとアラームを使わず、運動量の計測もあまりしない時なんだろうな...

とはいえ

スマートウォッチとしては非常に満足しています。 電池交換自体には2回目というのもあって全然時間がかからないし、8ヶ月も3ヶ月も電池交換に要する感覚としては苦になっていない。 むしろ、毎日の睡眠の記録や、歩いた距離に応じたachievementの通知が楽しいのでもっともっと使いたい。

値段もお手頃なので買って後悔はしないですよ。