2011年2月16日水曜日

macでphp用のiconvをいれる

こんなエラーが出た
Fatal error: Call to undefined function iconv_get_encoding()

macのiconv関連php拡張が入ってないみたい。

インストール
$ sudo port install php5-iconv

これでOK。

macでyoutubeの動画をコマンドラインからダウンロード

youtubeの動画を落とすときにコマンドラインから楽に落としたい。

探してみると、Pythonで書かれたYouTubeビデオダウンロードプログラムを見つけました。
-youtube-dl
Python 2.4以降が必要みたいです。

「Download it」っていうボタンから、Pythonのプログラムをダウンロード。
ファイルがそのままテキストになってるので、自分は落としてきて、名前を「youtube-dl.py」とかにしました。
で、一応、chmodでパーミションを755にして実行権限を与えます。

あとはコマンドラインから、
$ ./youtube-dl.py http://www.youtube.com/watch?v=********* -l
とyoutubeのビデオURLを渡すだけ。-lオプションを付けてるのは、つけないとデフォルトのflvファイル名が英数字の羅列になっちゃうので。-lを付ければ名前もちゃんとつけてくれます(日本語OK)。

一応オプション。
$ ./youtube-dl.py -h
Usage: youtube-dl.py [options] url...

Options:
  -h, --help            print this help text and exit
  -v, --version         print program version and exit
  -U, --update          update this program to latest stable version
  -i, --ignore-errors   continue on download errors
  -r LIMIT, --rate-limit=LIMIT
                        download rate limit (e.g. 50k or 44.6m)
  -R RETRIES, --retries=RETRIES
                        number of retries (default is 10)
  --playlist-start=NUMBER
                        playlist video to start at (default is 1)
  --playlist-end=NUMBER
                        playlist video to end at (default is last)
  --dump-user-agent     display the current browser identification

  Authentication Options:
    -u USERNAME, --username=USERNAME
                        account username
    -p PASSWORD, --password=PASSWORD
                        account password
    -n, --netrc         use .netrc authentication data

  Video Format Options:
    -f FORMAT, --format=FORMAT
                        video format code
    --all-formats       download all available video formats
    --max-quality=FORMAT
                        highest quality format to download

  Verbosity / Simulation Options:
    -q, --quiet         activates quiet mode
    -s, --simulate      do not download video
    -g, --get-url       simulate, quiet but print URL
    -e, --get-title     simulate, quiet but print title
    --get-thumbnail     simulate, quiet but print thumbnail URL
    --get-description   simulate, quiet but print video description
    --get-filename      simulate, quiet but print output filename
    --no-progress       do not print progress bar
    --console-title     display progress in console titlebar

  Filesystem Options:
    -t, --title         use title in file name
    -l, --literal       use literal title in file name
    -A, --auto-number   number downloaded files starting from 00000
    -o TEMPLATE, --output=TEMPLATE
                        output filename template
    -a FILE, --batch-file=FILE
                        file containing URLs to download ('-' for stdin)
    -w, --no-overwrites
                        do not overwrite files
    -c, --continue      resume partially downloaded files
    --cookies=FILE      file to dump cookie jar to
    --no-part           do not use .part files
    --no-mtime          do not use the Last-modified header to set the file
                        modification time

macでyoutubeの動画をmp3にする

やり方やツールは色々あるけど。

なるべく無劣化が希望なので、方法としては、flvを落とす→flvからmp3を抽出、がよさそう。
一度mp4とかにすると(よく分からないけど)一度変換が挟まってそうなので。
あと、なるべくブラウザの拡張ではなくアプリでやりたい。

flvを落とす場合は、
-Easy Youtube Video Downloader « Google Chrome Extensions
のChrome Extensionか、
-Download Flash Video Downloader for Mac - Batch download and save streaming Flash videos. MacUpdate.com
のアプリを使うとよさげ。

Chrome Extensionだとブラウザでダウンロードすることになるので、キューとかに入れられなくてちょっと嫌だなと思って始めはFlash Video Downloaderを使ったのだけど、なんけ結構ダウウンロードに失敗する。
なので、ブラウザ経由のダウンロードでもOKな人は、Chrome Extensionのほうが安定してるかも(個人の見解)。

で、落としたflvをmp3に変換。iExtractを使う。
無劣化で音声を抽出できるらしい。

-Download iExtractMP3 for Mac - Extracts MP3 from Flash video files. MacUpdate.com

iExtractでの抽出はめちゃくちゃ早い。数秒で終わる。
すばらしいです。ありがとうございます。

Imagickで画像を正方形にリサイズ

ImageMagickのphp版Imagickを使って画像を正方形にリサイズしたい。

画像を正方形にリサイズする場合、
正方形に切り抜く場合と、余分な背景をうめて正方形にする2パターンがある

<?php
// 正方形に切り取る
$im = new Imagick();
$im->readImage('/home/kasahi/tmp/org.jpg');
$im->cropThumbnailImage(80, 80);
$im->writeImage('/home/kasahi/tmp/resize.jpg');
$im->destroy();
?>

<?php
// 余りの背景を白でうめて正方形にする場合
$im = new Imagick();
$im->readImage('/home/kasahi/tmp/org.jpg');
$sideNum = 300; // 一辺を300ピクセルにする
$im->setImageBackgroundColor(new ImagickPixel('white'));
if ($im->getImageWidth() > $im->getImageHeight()) {
    $im->scaleImage($sideNum, 0); 
    $height = ($sideNum - $im->getImageHeight()) / 2;
    $im->spliceImage(0, $height, 0, 0); 
    $im->spliceImage(0, $sideNum - $im->getImageHeight(), 0, $im->getImageHeight());
} else {
    $im->scaleImage(0, $sideNum);
    $width = ($sideNum - $im->getImageWidth()) / 2;
    $im->spliceImage($width, 0, 0, 0); 
    $im->spliceImage($sideNum - $im->getImageWidth(), 0, $im->getImageWidth(), 0); 
}
$im->writeImage('/home/kasahi/tmp/resize.jpg');
$im->destroy();
?>

ImageMagick(imagik)がsegmentation faultするようになってしまった。

kasahi memo: CentOS 5.5のImageMagickのバージョンを上げるのあとに、
cropThumbnailImage()とかspliceImage()とか使おうとすると、

$ php imagik_test.php
zsh: segmentation fault  php imagik_test.php
とかsegmentation faultを起こすようになってしまった。

むーと思って軽く調べると、

-Re: 1 2 OT ImageMagick, OpenMP and QThread Mac OS X WORKAROUND ?
-ImageMagick • View topic - ImageMagick 6.4.8 running too slower

なんだかOpenMP周りがあやしい?
--disable-openmp
を付けてImageMagickを再コンパイルしたほうがよさげ。

でもうちょっと見てみると、 
-rubyでrmagickを使うために - rderaログ

$ ./configure --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp
$ make
$ sudo make install
このオプションでコンパイルしてたので先人に習ってそのままやって見る。

結果、segmentation faultが起こらなくなりました。よかった。

2011年2月15日火曜日

CentOS 5.5のImageMagickのバージョンを上げる

peclのimagickでgetImagePropertyを使おうと思ったら、なぜか
PHP Fatal error: Call to undefined method Imagick::getImageProperties()

マニュアルみたら、
PHP: Imagick::getImageProperty - Manual

ImageMagick version 6.3.2 or newer.

になってる。

で、CentOS5.5のImageMagickのバージョンを見てみると、
$ convert -v
Version: ImageMagick 6.2.8 08/28/09 Q16 file:/usr/share/ImageMagick-6.2.8/doc/index.html
Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC
で6.2.8だった。

バージョンを上げないとimagickのgetImagePropertyが使えないみたい。

ということで上げる。

uninstall old ImageMagick
$ sudo yum remove ImageMagick


get new ImageMagick sources
$ wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz

untar and configure, make, install
$ tar zxvf ImageMagick.tar.gz
$ cd ImageMagick-6.6.7-7
$ ./configure --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp
$ make
$ sudo make install
※configureのオプションに関しては↑を付けておいたほうがよさげ。
-->kasahi memo: ImageMagick(imagik)がsegmentation faultするようになってしまった。

チェック。
$ convert -v
Version: ImageMagick 6.6.7-7 2011-02-15 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
OK。


あとは、peclのimagickを元々使ってたので、一度削除して、再インストール

$ sudo pecl uninstall imagick

で、再インストール。
$ sudo pecl install imagick

これでOK。

そしてhttpdを再起動
$ sudo /etc/init.d/httpd restart

これで無事バージョンが上がって、関数も使えるようになりました。

CentOS 5.5にImageMagick for PHPを入れる

手始めにpecl経由でインストールしようとすると、、
$ sudo pecl install imagick

------------
.....................done: 93,920 bytes
13 source files, building
running: phpize
sh: phpize: command not foundERROR: `phpize' failed
------------
と言われる。phpizeがないみたい。

phpizeを使うために、
$ yum -y install php-devel
を入れる。

再挑戦

$ sudo pecl install imagick

------------
.....................done: 93,920 bytes
checking whether to enable the imagick GraphicsMagick backend... no
checking ImageMagick MagickWand API configuration program... configure: error: not found. Please provide a path to MagickWand-config or Wand-config pr
ogram.
ERROR: `/var/tmp/imagick/configure --with-imagick' failed
------------

ありゃ、もっかいエラー。調べる。

-参考
--[php]PECLコマンドが成功するまでのエラー解決備忘録(imagick編) : うえちょこ@ぼろぐ

ImageMagick-develを入れればよさげ。
というわけでyum経由でインストール。
$ sudo yum -y install ImageMagick-devel

------------
..........
Installed:
ImageMagick-devel.x86_64 0:6.2.8.0-4.1

Dependency Installed:
ghostscript-devel.x86_64 0:8.15.2-9.12.el5_5
lcms-devel.x86_64 0:1.18-0.1.beta1.el5_3.2 
libICE-devel.x86_64 0:1.0.1-2.1
libSM-devel.x86_64 0:1.0.1-3.1
libXext-devel.x86_64 0:1.0.1-2.1
libXt-devel.x86_64 0:1.0.2-3.2.el5

Dependency Updated:
ghostscript.x86_64 0:8.15.2-9.12.el5_5

Complete!
------------

入ったっぽい。 


再々挑戦

$ sudo pecl install imagick

------------
........
Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_defs.h'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
Installing '/usr/include/php/ext/imagick/php_imagick.h'
install ok: channel://pecl.php.net/imagick-3.0.1configuration option 
"php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini
------------

うまく行ったっぽい。

iniファイルに追記(ファイル名はなんでもOK)

$ sudo vim /etc/php.d/imagick.ini
imagick.ini
extension=imagick.so