Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

2016-09-05

ffmpeg でメディア・ファイルのコーデックを調べる

先日の mediainfo コマンドの記事に対して、ffmpeg でも同じことを調べられると教えてもらった。

試してみた:

$ ffmpeg -i ~/Movies/google_spreadsheet_1.mov
ffmpeg version 2.8.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 7.0.0 (clang-700.1.76)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/ataka/Movies/google_spreadsheet_1.mov':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2014-04-29 11:10:42
  Duration: 00:02:40.05, start: 0.000000, bitrate: 1419 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 682x516, 1402 kb/s, SAR 1:1 DAR 341:258, 60 fps, 60 tbr, 6k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2014-04-29 11:10:42
      handler_name    : Core Media Data Handler
      encoder         : H.264

なるほど。ビデオが H.264 (AVC1) だって分かった。mediainfo だと AVC とだけ出て来ていたけど、MPEG-4 AVC と H.264 は同じ規格だから特に気にする必要はないのかな。

あ、ffmpeg の出力は標準エラー出力に出るのか。less で眺める時は、気を付けないと。

$ ffmpeg -i ~/Movies/google_spreadsheet_1.mov 2>&1 | less

2016-09-02

mediainfo でメディア・ファイルのコーデックを調べる

メディア (特に動画) ファイルのコーデックを調べる方法をメモ。

コーデックを調べるには mediainfo というコマンドを使う。mediainfo は Mac なら brew コマンドでインストールできる。パッケージ名が media-info なので注意。

$ brew install media-info

使い方は簡単。ファイル名を引数で渡すだけ。

$ madiainfo ~/Movies/google_spreadsheet_1.mov
General
Complete name                            : /Users/ataka/Movies/google_spreadsheet_1.mov
Format                                   : MPEG-4
Format profile                           : QuickTime
Codec ID                                 : qt
File size                                : 27.1 MiB
Duration                                 : 2mn 40s
Overall bit rate mode                    : Variable
Overall bit rate                         : 1 420 Kbps
Encoded date                             : UTC 2014-04-29 11:10:42
Tagged date                              : UTC 2014-04-29 11:10:52
Writing library                          : Apple QuickTime
com.apple.quicktime.make                 : Apple
com.apple.quicktime.model                : MacBookAir5,1
com.apple.quicktime.software             : Mac OS X 10.9.2 (13C1021)
com.apple.quicktime.creationdate         : 2014-04-29T20:10:41+0900

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : [email protected]
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 2 frames
Format settings, GOP                     : M=2, N=60
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 2mn 40s
Bit rate mode                            : Variable
Bit rate                                 : 1 403 Kbps
Maximum bit rate                         : 768 Kbps
Width                                    : 682 pixels
Height                                   : 516 pixels
Display aspect ratio                     : 4:3
Frame rate mode                          : Constant
Frame rate                               : 60.000 fps
Original frame rate                      : 25.000 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.066
Stream size                              : 26.8 MiB (99%)
Title                                    : Core Media Video
Encoded date                             : UTC 2014-04-29 11:10:42
Tagged date                              : UTC 2014-04-29 11:10:52
Color range                              : Limited
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

今回の例だと、コンテナーが MPEG-4、ビデオが AVC、オーディオなし、ということが分かった。確かこのファイル。Google Spreadsheet の使い方を説明するために、QuickTime で画面録画したもののはず。

あとがき

先日、拡張子が mp4 なファイルを開こうとしたら、クイックルックで再生できなかった。一体、何のファイルなんだろう? と思って調べるために使ったのがこのコマンド。結果、音声ファイルが AMR ナローバンドなのが良くない、となった。コーデックが分からなかったら、混乱していたかもしれない。動画ファイルは難しい。

コマンド一つで調べられるのも便利。

2016-09-01

ffmpeg で音声・ビデオのみを取り出す

ffmpeg を使って動画ファイルから音声だけ、もしくは、ビデオだけ抜き出す方法を教えてもらったのでメモ。

音声だけ抜き出すコマンドは次の通り:

$ ffmpeg -i input.mov -vn -acodec copy output.wav

ビデオだけ抜き出すコマンドは次の通り:

$ ffmpeg -i input.mov -an -vcodec copy output.mov

入力ファイルは input.mov。音声の出力ファイルの拡張子は、その動画の音声ファイルに合わせて適切に選ぶ。

-an は No Audio、-vn は No Video という意味かな。-acodec copy, -vcodec copy で音声/ビデオのコーデックをコピーしている。

あとがき

最近、動画ファイルをいじるのにこのコマンドを教えてもらった。意外と何度も使っている。その度に調べるのも面倒になったので、メモとしてブログの記事にした。

2015-08-03

重複したキーを探すワンライナー

キーと値を = でつないだファイル keys.txt があって

"key_name_with_underscore" = "value";

重複したキーがないかチェックするのにワンライナーを書いたのでメモ。

$ awk '{print $1}' keys.txt | sort | uniq -d
  • awk コマンドで 1 列目だけ (ここではキー部分) を出力
  • sort コマンドでソート
  • uniq コマンドに -d オプションを付けて重複しているものだけ出力

久しぶりに awk コマンドを使ってみた。書き方忘れててネットで調べた。

2015-07-17

行数の多いファイル、トップ 10 を出力するワンライナー

この前、カレント・フォルダーにあるファイルで一番行数の多いファイルは何か? という話が出て、その場で書いたワンライナー。

$ wc -l * | sort -n -r | head -10

wc-l オプションを付けて、行数をカウント。

そのままじゃ、ファイル名順に並ぶので sort コマンド。-n オプションで行数を文字列じゃなく、数字として扱わせて、-r オプションで多い順にする。

最後に head コマンドで最初の 10 行を取り出した。

この方法だと、wc が出力した全てのファイルの「トータル行数」が一番上に出る。ああ、そうか。すると、トップ 9 になっちゃう。トップ 10 を出すなら、head の引数を 11 にしなくちゃいけない。

もしくは、tail コマンドを使って、一番上の行を削るかな。

$ wc -l * | sort -n -r | tail -n +2 | head -10

ワンライナー。サクッと書けるようになると楽しい。

2015-02-05

Mac の Emacs で aspell

Mac 環境にて Emacs からスペルチェックする。

スペルチェックには ispell コマンドが有名だけど、最近、ispell の後継とされる GNU Aspell が気になったので、こちらを試してみた。

上記サイトを参考にした。上記サイトでは Mac Ports を使っているらしく、Homebrew の内容と混在していたので、Homebrew の設定だけを抜きだしてメモしておく。

インストール

$ brew install aspell --lang=en

設定

.emacs に aspell を使う設定を追加。

(setq ispell-program-name "/usr/local/bin/aspell")

~/.aspell.conf というファイルを作って、次の一行を書く:

lang en

以上で設定はお終い。

使ってみる

適当な英単語の上で M-$ (M-x ispell-word) してみる。間違ってたら、正解の候補が現れる。あとは、M-x ispell-buffer を知ってればいいかな。これはバッファ全体に対して ispell (この場合 aspell コマンド) を実行する。

これでスペルチェックができるようになった。よかった、よかった。

2014-12-05

空白を含む path を bash 変数にして cd する

昨日の続き。

path に空白が含まれていることがある。純粋な Unix 系のディレクトリー構成では見られないけど、Windows や Mac だとタマに... 有名な所では Windows の Program Files とか、Mac の ~/Library/Application Support/ とか。

コマンドライン派の人間が好んで「空白を含む」ディレクトリーを作ることはないので、他人のソースを扱う時や、開発環境が元からそういう仕様だったりして悩まされるかな。

これも、.bashrc に変数として保存できれば楽なんだけど事は楽に進まない。

foodir="/path/to/dir with space"

上の様に「dir with space」という空白入りのディレクトリーに移動したいとする。

そこで変数を使って cd しようとするとエラーになる。

$ cd $foodir
bash: cd: dir: No such file or directory

dir というディレクトリーはないと怒られた。実は変数が渡される時、bash shell によってスペースが「引数の区切り」になってしまっている。この場合、$foodir/path/to/dir with space に展開された後、cd コマンドに /path/to/dirwithspace の 3 つの引数が渡されてしまっている。本当は一つの引数として渡したいのに...

解決策は泥臭いけど、変数を " で囲む。

$ cd "$foodir"

コマンドラインから空白入り path へ移動するのは面倒なので、少し面倒でも助かる。

shell script を作ってる時でも、同じトラブルは起きる。むしろ、shell script でハマる時の方が重症かもね。

2014-10-08

*.png から *@2x.png を convert コマンドを使って作成する shell script

iOS の開発をしていると、Retina ディスプレー用に 2 倍サイズの画像 (@2x.{png,jpg}) を求められる。画像の数が多いと面倒なので、convert コマンドでリサイズする shell script を書いてみた。コードは 2 行。ワンライナーにならなかったのは無様だけど、まあ、そこまで気負うこともないか... と手を抜いた。

以下、カレント・ディレクトリーの中にある画像ファイルをオリジナル・サイズ (@2x 画像) として、半分のサイズの画像を作るコード。

for i in `ls *.png`; do j=${i%.*}; mv $j.png [email protected]; done

まずはカレント・ディレクトリーの中にある *.png ファイルを *@2x.png にリネームする。

for i in `ls`; do j=${i%@*}; ext=${i#*.}; convert -resize 50% $i $j.$ext; done

次のコードは、*@2x.png ファイルから convert コマンドを使って半分のサイズの *.png ファイルを作成する。

bash の機能を使っている。

  • j=${i%@*} は @ より前のファイル名を取得する
  • ext=${i#*.} は . より後のファイル名 (この場合、拡張子に当たる) を取得する

変数 i が [email protected] だとすると、変数 j には foo、変数 ext には png の文字列が入る。このコードは、拡張子が png でなくとも (jpeg でも jpg でも gif でも) 問題なく動く。

convert コマンドのオプションには -resize のみを使っているけど、本職の人に言わせると、もっと別のオプションを追加して画質を上げたりしたいかと思う。そこら辺は別のサイトを見てお好みにどうぞ。

2014-08-09

bash 変数を使って cd を楽にする方法

深い階層へ軽動したい時、cd コマンドを打つのは面倒。たとえ bash のパス補完が効くとしても、手間はかかる。そこで、目的のパスを bash 変数に保存することでこの問題の対処をしている。例えば、このブログ記事の下書きが置いてあるディレクトリーへ移動するには、次のコマンドを使う:

$ cd $blog

.bashrc に書く設定は次の通り:

blog="$HOME/Documents/blog/"

ディレクトリー階層がどんなに深くても、この方法なら一発で辿り着けるので便利。

パスに空白が含まれる場合

時として、パスに空白が含まれる場合がある。自分でそういうパスを作ろうとは思わないけど、他人の git repository を clone したらパスに空白が空いていた、等々何ともしがたい状況はある。そういう時、同じ要領で変数を指定しても cd で失敗する。

$ grep somedir ~/.bashrc
somedir="$HOME/Documents/path with space"
$ cd $somedir
bash: cd: /Users/ataka/Documents/path: No such file or directory

path の中に含まれる空白が引数の区切りとして扱われている。「path with space」というディレクトリー名の最初の「path」しか cd に渡っていない。これを解決する方法は、多少武骨だけれども変数を "" で囲む。

$ cd "$somedir"

これで「path with space」へと移動できた。

あとがき

ディレクトリー移動はコマンドライン操作の基本。ここで楽できると、随分ストレスが減る。もし良ければ試してみて欲しい。

2014-07-14

find コマンドでファイル名正規表現検索

find コマンドの検索では専ら -name オプションを使う。これだと細かいファイル名指定が出来ない。先日、正規表現が使えると教えてもらったのでメモ。

画像検索を例に...

JEPG, PNG 画像を検索してみる。-name オプションを使う場合はこんな感じ。二回に検索を分ける。

$ find . -name '*.jpg'
$ find . -name '*.png'

正規表現を使う

正規表現を使う場合、検索開始パスの前に -E オプションを付ける。検索には -name の代わりに -regex を使う。拡張子 .jpg と .png なファイルを検索する場合はこんな感じ。

$ find -E . -regex '^.+\.(jpg|png)$'

大文字・小文字を無視したい

Windows 系のソフトを使うと、ファイル名が大文字だったりする。アルファベットの大文字・小文字を無視させて検索する場合は -regex ではなく -iregex を使う:

$ find -E . -iregex '^.+\.(jpg|png)$'

沢山の画像フォーマットに対応

JPEG の拡張子は .jpg の他に .jpeg も使われる。画像ファイルには GIF もまだ健在。ウェブをやっていると ico ファイルも扱うか? 最近は .svg も使われるようになってきた。全部に対応するよう、正規表現を書いてみる。

$ find -E . -iregex '^.+\.(jpe?g|png|gif|ico|svg)$'

ここまでくると、随分、実用的になったかな。

Man は Mac OS X に付いてくるものを参考にした。BSD 系の find みたいね。

2014-04-02

最近の rbenv (2014-04)

rbenv を使うと複数バージョンの Ruby を入れられる。過去にも一度記事にしたけれど、最近、少し使い方が変わったのでもう一度書く。

準備

Debian 系では下記パッケージを事前にインストール。

$ sudo apt-get install build-essential libreadline-dev libssl-dev zlib1g-dev

OS X では XCode Command Line が入っていれば大丈夫... かな?

rbenv インストール

rbenv は git リポジトリーからインストールする。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

Bash の場合、設定を .profile と .bashrc のどちらに書くか難しい。.profile はログイン時のみ読み込み、.bashrc は bash 起動時に読み込み。screen で複数のスクリーンを起動する場合、.bashrc に設定を書いておかないと、新しいスクリーンで rbenv の設定が読み込まれない。

ところが、Debian 系が用意している .bashrc には非対話で呼ばれた時に、後ろの設定を無視するコードが入っている。これは sudo で呼び出した時に rbenv の設定が読み込まれず困る。よって、設定を書くなら、.bashrc の最初に書くのが良い。というのが、今のぼくの結論。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

ruby-build のインストール

最近の ruby-build は ~/.rbenv/plugins ディレクトリー下に入れるのが主流らしい。

$ mkdir -p ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

ruby と bundle のインストール

ruby をインストールする。

$ rbenv install -l
$ rbenv install 2.1.1
$ rbenv global 2.1.1
$ rbenv rehash

bundle もインストール。

$ rbenv exec gem install bundle --no-ri --no-rdoc

あとがき

rbenv の設定ファイルの書き方にハマったので説明を加えたのと、ruby-build のインストール方法が変わったので記事を書き直した。bundle を gem install bundle するのと rbenv exec gem install bundle するので、どう違いがあるのか実は分かっていない ^^;

2014-02-10

Ubuntu ですぐに画面ロックする

Ubuntu 12.10 を使っている。諸事情で、離席時にはパスワード入力するよう求められるようになった。最初、サスペンドするコマンドとサスペンドから復帰する時にパスワードを求める設定を加えようと思ったけど、画面ロックする方が楽と分かったので方針を転換した。

画面ロックから戻る時に、パスワード入力を求めるようにする設定は簡単なので省略。

Gnome を使っているなら、次の実行ファイルを path のある場所に置く。ぼくは ~/bin/lock という名前にした。実行権限を与えるのを忘れずに。

#!/bin/sh
lock='gnome-screensaver-command -l'
$lock

これで lock コマンド一つで画面ロックがかかる。コマンド名を l だけにしようかと思ったけど、タイポした時悲惨そうなので止めた。

サスペンドと違って画面ロックは管理者権限が要らない。sudo なしで実行できるのは安全かつ楽。

ちなみに、

  • Ctrl + Alt + L

で画面ロックをかけることができる。ぼくは... このキーバインドを Emacs でいつか潰しそうな気がしたので、lock コマンドを作った。このエントリーを書きながら、何度か試したけど、Ctrl + Alt + L の方が便利かもしれない。

2014-02-06

Emacs の TRAMP を使って他のサーバーにアクセスする

最近、Emacs の TRAMP にお世話になっているのでまとめておく。

Tramp は Emacs からリモート環境 (リモート・サーバー) にアクセスする機能・パッケージ。Emacs 22 からデフォールトに含まれた。使い方はファイル・オープンの延長。

remote サーバーのファイルを開く

設定は必要ない。

  • アクセス方法: ssh
  • ユーザー: foo
  • サーバー: bar.com
  • ファイル: /home/foo/.bashrc

上記のファイルを編集する場合。C-x C-f (M-x find-file) から、次の様に入力する:

Fird file:  /ssh:[email protected]:/home/foo/.bashrc

これでパスフレーズが聞かれる。authorized_keys をちゃんと設定していれば、パスフレーズ入力なしでファイルを開ける。

ssh の前に / を置くのがポイント。あとは、ssh でログインしている人にはおなじみかな。

ぼくは直接ファイルを開かず、Dired を起動している。

Fird file:  /ssh:[email protected]:/home/foo/

こっちの方が、サーバーの中で動き易いから。

TRAMP を使うと、サーバーに Emacs が入っていなくっても問題ないし、サーバーに -X オプション付きで ssh ログインする必要もないし、ssh でログインしてターミナル版 Emacs で作業する必要もない。便利!

2013-06-13

find + grep でディレクトリー下の関数・変数を探す

あるプロジェクトの中で、関数・変数がどこに書かれているか調べたいと言われた。やり方は色々あるけれども、レガシーにどの Linux でも入っていそうな find と grep コマンドの組み合わせで関数・変数を探してみる。

1. find + grep

教科書的によく見かけるのが次の形。

$ find /path/to/dir -type f -exec grep function_foo {} \;

-type f でファイルのみ検索している (ディレクトリーの除外)。grep はディレクトリーを検索するとエラーを返すから。-exec COMMAND {}{} の中に find で見つかったファイル名が入る。-exec の終わりを知らせる為に ; を使う。ただし、普通に使うと shell に ; を解釈されてしまうので \; としてやる。最後に {}\; の間にはスペースを入れる (ここでハマッた)。

2. xargs

-exec を使うと見つかったファイル名 (のリスト) が一気に grep に渡される。プロジェクトが大きくなると、ファイル名が一万個以上になり、「shell の取れる引数の数の最大値」を越える。多少スピードは犠牲になるけれども、xargs コマンドを使うとこの問題を解決できる。

$ find /path/to/dir -type f -print | xargs grep function_foo

xargsfind で見つけたファイルを一つ一つ grep コマンドに渡している。

3. -print0

UNIX 由来のファイル名に徹しているなら幸せだけど、ファイル名に空白が入っていたりすると困ったことになる。-print の代わりに -print0 を使うと、そういう困ったちゃんのファイル名をちゃんとエスケープしてくれる。

$ find /path/to/dir -type f -print0 | xargs grep function_foo

4. fgrep

探すコードが正規表現を含まないのであれば... つまり、文字列を検索するのであれば grep コマンドより fgrep コマンドの方が少し高速。fgrep は正規表現に対応しない分だけ少し速い。

$ find /path/to/dir -type f -print0 | xargs fgrep function_foo

5. Emacs 連携

find と grep を組み合わせると、なかなかコマンドが長くなる。Emacs には、find + grep を楽にするコマンドが用意されている。

M-x find-grep
Run find (like this): find . -type f -exec grep -nH -e  {} +

ありゃ、xargs じゃなくて -exec を使ってるのね。まあ、難しいこと外えずに grep に与けるキーワードだけ考えればいいので便利。

あとがき

優れた IDE なら関数や変数の検索・置換コマンドが専用に用意されている。etags や ctags を使って TAGS ファイルを作っておけば高速に関数の検索が出来る (Emacs/vi との相性も良い)。grep の代替になるコマンドも現れている。

自分の環境に合わせて使い分けるのが良いと思う。

find と grep を使うやり方は一見古臭いけど、柔軟性の高さは比類がない。例えば、関数ではなく「TODO」や「FIXME」といった文字列、ファイルに含まれているメール・アドレス、ファイルを更新時間で限定する etc. 例を挙げればキリがない。

覚えておけとは言わないけれど、困った時にそういえば「find と grep で」と検索できる程度には頭の隅に置いておきたいところ。

2013-05-05

rbenv 版 ruby の高速化

rbenv 版の ruby が rvm 版の ruby よりも遅いという話がある。理由を調べてみると、最適化オプションに違いがある。rvm には -O3 オプションが使われていたのに対して、rbenv では -O2 オプションが使われていた。この最適化オプションの違いが ruby のスピード差になっている。

ruby-build log

ruby-build の git log を見るとこうある。

commit 9f8d53365aef52c940095f583cdc82f02caba90f
Author: Erik Michaels-Ober <[email protected]>
Date:   Wed May 1 07:38:43 2013 -0700

    ruby-build 20130501

commit 2f8dcafb0ec2c5f478e7f45d7eca3a0f0a5ae8c0
Merge: 28b9bcb b219192
Author: Sam Stephenson <[email protected]>
Date:   Fri Apr 26 16:00:19 2013 -0700

    Merge pull request #351 from jeremy/restore-o3-cflags
    
    Restore -O3 default when we build with clang

commit b219192020b4641e057c9f168089f8488624ec64
Author: Jeremy Kemper <[email protected]>
Date:   Fri Apr 26 15:06:43 2013 -0700

    Restore -O3 default when we build with clang

2013-04-26 に -O3 オプションが適用されるよう修正が入っている。

rbenv reinstall

rbenv に reinstall サブコマンドはない。ただ、install サブコマンドに --force オプションを付けると、強制的にもう一度インストールできる。これを使って、ruby を再インストールする:

$ cd ~/build/ruby-build
$ git pull
$ sudo ./install.sh
$ cd ~/.rbenv
$ git pull
$ cd
$ rbenv install --force 2.0.0-p0

あとがき

rbenv で -O3 オプションが適用される様になったことは書いた。ログを見るとコンパイラーが clang の場合に -O3 オプションが使われる様になっている。GNU gcc の場合はどうなのかな? そこまでは調べていない。

ref

Vagrant 1.1+ スタート

過去記事の内容が古くなっていた。新しい方法をメモ。

過去記事では vagrant は ruby の gem だったけれども、バージョン 1.1 以降 (?) vagrant はパッケージとして提供されている。2013-05-05 現在、最新版は 1.2.2。

Vagrant Downloads

パッケージをインストールして vagrant up

古い vagrant の削除
$ pwd
~/project/vagrant
$ ls
Gemfile Gemfile.lock vendor Vagrantfile

念のため旧 vagrant でインストールした vagrant の OS イメージは破棄。gem はもう使わないので、Gemfile を削除。vagrant コマンド一式は vendor ディレクトリー以下に入れているから、ディレクトリーごと削して旧 vagrant の削除は完了。

$ bundle exec vagrant destroy
$ rm -rf Gemfile Gemfile.lock Vagrantfile .bundle vendor
Vagrant のインストール

Vagrant のダウンロード・ページから最新版の Vagrant dmg を選択して、ダウンロード & インストール

Vagrant start!

$ which vagrant
/usr/bin/vagrant
$ vagrant -v
Vagrant version 1.2.2

うん、最新版の vagrant がインストールされた。インストールの方法はと変わらない。

vagrant up
$ vagrant box add ubuntu12_10 https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box
$ vagrant init ubuntu12_10
$ vi Vagrantfile

Vagrantfile の中身は次の通り:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu12_10"
  config.vm.network :private_network, ip: "192.168.50.12"
end

configure("2") は Vagrant 1.1+ or 2.0.X の config ファイルを指す。仮にこれが 1 ならば、Vagrant 1.0.x を指す。config.vm.network の書式が変わったので注意。

開始・終了
$ vagrant up
$ vagrant ssh
$ vagrant halt

以上。

2013-05-04

Vagrant 最初の一歩

Vagrant 1.1+ の情報を書きました。

最近、Vagrant (ヴェイグラント) という名前を良く聞く。

VirtualBox というツールがあって、これを使うと他の OS を動かすことができる。一般に仮想 OS 環境と呼ばれるもの。Mac OS や Windows の中で Linux を動かしたり、Linux の中で Windows (勿論、ライセンスは必要) を動かしたり... といったことができる。

vagrant は VirtualBox で簡単に OS をセットアップするツール。ruby の gem として提供されている。

vagrant の準備

VirtualBox サイトから最新の VirtualBox をダウンロードしてインストールする。

Vagrant スタート

vagrant を始めてみる。

今回はローカル環境にインストールしたいので、~/project/vagrant/ 以下に vagrant をインストールする。

$ mkdir -p ~/project/vagrant
$ cd ~/project/vagrant
$ cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'vagrant'
$ bundle install --path vendor/bundle
$ rbenv rehash (rbenv を使ってる人だけ)

以下、vagrant を使ってインストールする OS を選択する。流れは以下の通り:

$ bundle exec vagrant box add {name} http://.../...box
$ bundle exec vagrant init {name}
$ vi Vagrantfile (Vagrantfile の編集)
$ bundle exec vagrant up

{name} 部分のデフォールトは base。base を使う場合は vagrant init 時の {name} は省略できる。

OS の選択

vagrant 用に提供されている OS イメージは下記サイトで公開されている。

例えば、「Ubuntu 12.10 Quantal x86_64 (Guest Additions 4.2.2)」を vagrant でインストールするなら URL は「https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box」になる。

Vagrantfile の編集

Vagrantfile の中身はほとんどコメント・アウトされている。書くべき内容は次の二つ。

Vagrant::Config.run do |config|
  config.vm.box = "base"
  config.vm.network :hostonly, "192.168.50.12"
end

base の部分は、vagrant add の時に付けた名前が付ける。デフォールトなら "base"。

vagrant up したら...

ssh でログインできる。

$ bundle exec vagrant ssh

インストールが終わったら、四つのコマンドを覚えておけばいい。

  • vagrant up: vagrant 仮想 OS の起動
  • vagrant ssh: vagrant 仮想 OS へのログイン
  • vagrant halt: vagrant 仮想 OS の終了
  • vagrant destroy: vagrant 仮想 OS の破棄

あとがき

今回の vagrant の内容は「入門 Chef Solo」を参考にした。電子書籍は何時でも読めるし検索性に優れるけど、自分のメモにはなり得ない。やっぱり自分でブログの記事に落とし込まないと、頭の中に残らない。

入門Chef Solo - Infrastructure as Code
伊藤直也

B00BSPH158
伊藤直也 2013-03-11
Amazonで詳しく見る
by G-Tools

2013-04-25

fcopy.el (in github) を chef-solo で Mac にインストールした

MacBook Air に自作 EmacsLisp スクリプト fcopy.el を chef-solo を使ってインストールした。fcopy.el は git で管理してて、GitHub にホスティングしてる。つまり、今回は Mac に chef-solo で git 管理されてるツールをインストールする話。chef-solo のインストールについては過去記事を参照のこと。

recipe の作成

fcopy 用の cookbook を作る。

$ cd /etc/chef
$ bundle exec knife cookbook create fcopy

fcopy 用の recipe は /var/chef-solo/cookbooks/fcopy/recipes/default.rb を編集。install リソースを使わず、git リソースと bash リソースを使ってる。

git "/tmp/fcopy" do
  repository "git://github.com/ataka/fcopy.git"
  reference  "master"
  action :checkout
end

bash "install-fcopy" do
  install_dir='/usr/local/share/emacs/site-lisp'
  not_if {
    File.exists?("#{install_dir}/fcopy.el")
  }
  code <<-EOC
    install -m 664 /tmp/fcopy/fcopy.el #{install_dir}/
  EOC
end

chef-solo 実行

chef-solo を実行して fcopy.el をインストールする。レシピを指定してインストールする場合:

$ cd /etc/chef
$ sudo env PATH=$PATH bundle exec chef-solo -o fcopy

node.json を指定するなら、次の様に node.json を書く。

{
  "screen": {
    "users": [ "ataka", "ataka_work" ]
  },
  "run_list": [
                "recipe[screen]",
                "recipe[fcopy]"
              ]
}

chef-solo の実行では -j オプションを使う。

$ sudo env PATH=$PATH bundle exec chef-solo -j node.json

蛇足

今回の recipe では .emacs の編集までは行なわない。使う人は、~/.emacs.d/init.el に次の二行を追加。

(autoload 'fcopy-mode "fcopy" "copy lines or region without editing." t)
(define-key mode-specific-map "k" 'fcopy-mode) ; C-c k

あとがき

git リポジトリーからコードを clone して、bash を使ってインストールするレシピを書いた。今回の recipe には、更新 (update) が入っていない。どういう recipe を書くのが良いのかな? まだまだ勉強することが多い。分からないことも多い。

chef-solo を Monuntain Lion で試す

MacBook Air の環境構築を chef-solo を使ってやってみる。

ruby-2.0.0 のインストールまで

ターミナル・アプリを起動して ruby の存在を確認。ruby-1.8.7 がインストールされていることを確かめた。最初の状態では Xcode も X も git もインストールされていない。以下のパッケージをまずインストールした:

Google Chrome は愛用のブラウザーなので、いの一番にインストール。昔は Xcode をインストールすると X やらコマンド・ラインで使える gcc が入ったものだけど、Mountain Lion では X は別アプリ、コマンド・ライン用のコマンドも Command Line Tools に分離されている。

Command Line Tools をインストールすると git-1.7.12.4 もインストールされる。昔は MacPorts を使って git をインストールしていたので、この配慮はありがたい。

ruby のバージョンが古いので、rbenv 経由で 2.0.0p0 をインストールする (ruby-1.8.7 でも大丈夫という気もするけど念のため)。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

.profile を作成。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

ruby-build をインストール:

$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh

ruby-2.0.0-p0 をコンパイル & インストール:

$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ rbenv rehash

最後に bundler gem をインストールしておく:

$ gem install bundler
$ rbenv rehash

chef-solo の準備

ruby-2.0.0 のための準備

ruby-2.0.0 では、chef-solo コマンド実行時に gemfiles/format がないというエラーが出る。その対策を先にしておく。ruby 1.9 を使っている人はスキップされたし。

$ mkdir prog
$ cd prog
$ bundle gem rubygems-format-dummy
$ cd rubygems-format-dummy
$ touch lib/rubygems/format.rb
$ git add lib/rubygems/format.rb
$ git commit -m 'initial commit'
$ emacs -nw -q rubygems-format-dummy.gemspec
 (TODO とあるところを適当に書き換える)
$ rake build
chef-solo のインストール

まず /etc/chef を作り chef-solo を /etc/chef 以下にインストールする。

$ sudo mkdir /etc/chef
$ sudo chgrp staff /etc/chef
$ sudo chmod 775 /etc/chef
$ cd /etc/chef
$ rbenv local 2.0.0-p0
$ cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :path => '/Users/you/prog/rubygems-format-dummy'
EOF
$ bundle install --path vendor/bundle
$ rbenv rehash
$ bundle exec chef-solo -v
Chef: 11.4.0
設定ファイル

まず knife configure コマンドの実行。デフォールトから変えた点のみ記載。

$ bundle exec knife configure -i
Where should I put the config file? [Users/you/.chef/knife.rb] /etc/chef/.chef/knife.rb
Please enter the path to a chef repository (or leave blank): /var/chef-solo

続いて solo.rb と node.json の作成。ここでは、レシピを screen にしておく。

$ cd /etc/chef
$ cat <<'EOF' > solo.rb
file_cache_path "/var/chef-solo"
cookbook_path ["/var/chef-solo/cookbooks"]
$ cat <<'EOF' > node.json
{
  "run_list": [ "recipe[screen]" ]
}
EOF

cookbook を置く場所も用意しておく。sudo するのも面倒なので一般ユーザーも cookbook を書けるようにしちゃった。

$ cd /var
$ sudo mkdir chef-solo
$ sudo chgrp staff chef-solo
$ sudo chmod 775 chef-solo

せっかくなので git で管理してみる。

$ cd chef-solo
$ touch .gitignore
$ git init
$ git add .gitignore
$ git commit -m 'initial commit'

Recipe を書く

screen の設定ファイル .screenrc をインストールする recipe を書いてみる。というのも、Mac での install ってどうなってるのか分からなかったので (^^;)。

まずは screen のための cookbook を作る。

$ cd /etc/chef
$ bundle exec knife cookbook create screen

template を作成する。/var/chef-solo/cookbooks/screen/templates/default/.screenrc.erb に普段使っている .screenrc の内容をコピペ (see also. clmemo@aka: GNU Screen の設定 (.screenrc) をさらしてみる)

escape ^Tt
markkeys h=^B:l=^F:$=^E:^U=^Z:^D=^V

続いてテンプレートをインストールする recipe を作成する。レシピの置き場所は /var/chef-solo/cookbooks/screen/recipes/default.rb。中身は次の通り:

users = node['screen']['users']

users.each do |user|
  template "Users/#{user}/.screenrc" do
    owner user
    group "staff"
    mode 0664
  end
end

Mac のホーム・ディレクトリーに .screenrc をインストールしようと試みている。

ユーザー名は /var/chef-solo/cookbooks/screen/attributes/default.rb に書く。ここではダミーとして guest とした。

default['screen']['users'] = [ 'guest' ]

以上で recipe の作成は終了。

chef-solo の実行

recipe が出来たので、chef-solo を実行する。

$ cd /etc/chef
$ bundle exec chef-solo -j node.json

と、これでは guest ユーザーに .screenrc がインストールされる。recipe の中にユーザーを書かなかったのは、自分の Mac にいるユーザー・アカウントを知られたくなかったのと、環境ごとにユーザー名が徴妙に変わったりするため。ユーザー・アカウントの違いは node.json の中で吸収する。ユーザー foo と bar がいる場合の node.json。

{
  "screen": {
    "users": [ "foo", "bar" ]
  },
  "run_list": [
                "recipe[screen]"
              ]
}

改めて chef-solo を実行。

$ bundle exec chef-solo -j node.json

今回はユーザー権限でも実行できるけど、ほとんどの場合はルート権限が必要と思う。その場合は、次の様にコマンドを打つ。

$ sudo env PATH=$PATH bundle exec chef-solo -j node.json

node.json でユーザー名を指定しないのなら、recipe を直接指定するのもあり。

$ sudo env PATH=$PATH bundle exec chef-solo -o screen

Mac での chef-solo 事始めは、これでおしまい。

あとがき

Mac で install を実行する場合、MacPorts とか Homebrew を使うのかな? どうやって使うのかな? Linux と同じ様な書き方でいいのかな? それは Linux の recipe と共存できるのかな?

今回、ユーザー・アカウントを recipe の中に含めたくなかったから node.json を使った。このやり方は chef 本流の書き方なのかしらん。もっとスマートなやり方がある様な気がする。

/var/chef-solo を git で管理してみたものの... 他人の cookbook を github から clone する時に git 管理下に git 管理下のリポジトリーを置くことになる。それは、なんか奇麗じゃない。

chef-solo に触ったばかりでまだまだ分からないことだらけ。本エントリーを読んで、多少なりとも Mac 使いが chef-solo を身近に感じとってもらえるなら嬉しい。

2013-04-24

PDF を分割する pdftk コマンド

ひょんなことから、PDF の分割を頼まれたのでやってみた。昔は Ghostscript を力技で動かしてたけれども、最近はpdftk なんてコマンドがあるのね。PDF 分割が楽になってて、びっくりした。

インストール

$ sudo apt-get install pdftk

ファイル分割

ちょっとコマンドの書き方が独特。foo.pdf の 1 ページから 3 ページまでを取り出すコマンド。

$ pdftk foo.pdf cat 1-3 out foo_1-3.pdf

4 ページから 10 ページまで取り出すなら、こう。

$ pdftk foo.pdf cat 4-10 out foo_4-10.pdf

最終ページまで取り出すなら end というキーワードが使える。

$ pdftk foo.pdf cat 4-end out foo_4-end.pdf

単独ページを取り出すのも簡単。1 ページ目だけ取り出す。

$ pdftk foo.pdf cat 1 out foo_1.pdf

あとがき

今回の記事は、下記のサイトを参考にした。xpdf で開こうとすると segmentention fault で落ちる PDF ファイルでも無事ファイル分割できたので助かった。