2011年5月21日アーカイブ

デジカメとかiPhoneで撮影したjpegには、Exifって言うおまけの情報があって、そこにOrientationって言う「画像の向き」を表すデータがある。
手元にあるのはiPhone4とCanon EOS Kiss Digitalだけど、どちらも横長の写真を撮るとOrientationは0となって、縦長の写真を撮るとOrientationは6とか8で90度回転になる。
そして、jpegの画像としてはどちらも横長の画像になるのだ。
んで、ExifのOrientationに対応した画像ビューアで見ると、何も気にせずに正しく見られるのだが、対応していないもので見ると90度回転して見える。
対応していないものの代表がWebブラウザで、縦長の写真をそのままblogにアップロードすると、90度回転した画像になってしまう。(ちなみに、iPhoneのSafariはOrientationを理解するようで、これはこれで変になる)
そこで、カメラから画像をPCに取り込むときに、picmvと言うソフトを使ってOrientationに従って回転させていた。
しかし、このソフトにも問題があって、回転させた元サイズ画像のOrientationが6とか8のままなのだ。さらに、同時に縮小画像を作成する機能も使っているのだが、こちらはExifが削除されてしまうため、回転させても問題ないと言えば問題ない。
iPhoneから写真を取り込むときは、最近Macに乗り換えたので、picmvの代わりにiPhotoを使って取り込んで、それを自前のスクリプトでpicmvの保存先と同じディレクトリに縮小したりしながらコピーするようにしている。(こいつは、iPhotoが回転してくれた上に正しいExifにしてくれるので問題ない)

そして、写真をblogに上げるのにもう一つ手段を使っていて、それがmail2entryを使ったメール添付からのものだ。
以前mail2entryでサムネイル対応 - PC日記の記事のときに回転と縮小に対応したのだが、これの場合はExifデータが消えていた。

さらに、blogに写真を上げる上ではプライバシーの問題もある。記録と言う意味では、Exifが撮影日時や撮影場所の情報を持っているのは非常にありがたいのだけれど、それを何も考えずにblogにアップしてしまうといろいろと差し障りがある場合があるかもしれない。

と、言うわけでこの辺の問題を解決すべく、少し手を入れてみることにする。
まずは、mail2entryの改善から。

とりあえず、気に入らないところとどう対応するかを明確にしておこう。
  • 画像を回転したのに、Exifに回転前のOrientationが残っている
    →Orientationを0にする
  • 画像を回転したのに、Exifに回転前のThumbnailが残っている
    →不要なので削除する
  • 画像をリサイズしたのに、Exifにリサイズ前のサイズが残っている
    →正しいサイズにする(優先度低)
  • 画像に位置情報が残っている
    →消したいときだけ消せるようにする
ここまで、mail2entryに加えた修正ではExifが消えるのを、元のExifが残ると勘違いしていたための記述。
以下は、修正には至らなかったけど、pexifの紹介として残しておく。

すべての要望はExif情報の書き換えで対応となるので、Exifの書き換えができる必要がある。以前Orientationを取り出すのに使ったPILの_getexif()はExif情報の取得しかできないので、別の手段で更新してやる必要がある。
調べてみたところ、Emerge Technology: PythonでExifの編集と言う記事を見つけ、pexif - pexif is a Python library for parsing and more importantly editing EXIF data in JPEG files. - Google Project Hostingの存在を知った。
FreeBSDのportsにはpyexifはあったけどpexifはなかったので、ソースからインストール。と言っても、アーカイブを展開して
# python setup.py install
するだけだ。

と、言うわけで実際には修正しないことにしたので、今回は不要になってしまった(やろうと思えば、消えてしまうExifをpexifを使って復活させると言うことができるのだけれど、面倒なので今回はパス)のだけれど、mail2entryをgithubに上げたのでURLだけ書いておく。false-git/mail2entry - GitHub
一個前のほぼボツエントリで、mail2entryのソースをいじろうと思ったんだけど、FreeBSDのemacs23をscreen上で使うとカーソル位置の表示がおかしくなって、とても開発ができる状態ではない。
せっかくMacのemacsはauto-completeとかも入れて使いやすくなっているので、どうせならmacでソースをいじりたい。
そのためには、macからFreeBSDのディスクが読み書きできる必要がある。
macの/etc/auto_masterを見ると、/netとかあるので、とりあえずFreeBSDの方をNFSサーバにしてみる。(参考にしたのはFreeBSD-NFS - ぷきうぃき)
  1. /etc/exportsを以下の内容で作成
    /var/home       -network 192.168.0
    
  2. /etc/rc.confに以下を追加(rpcbindは元々有効にしていた)
    mountd_enable="YES"             # Run mountd (or NO).                           
    nfs_server_enable="YES"         # This host is an NFS server (or NO).           
    nfs_reserved_port_only="YES"    # Provide NFS only on secure port (or NO).      
    rpc_lockd_enable="YES"          # Run NFS rpc.lockd needed for client/server.   
    rpc_statd_enable="YES"          # Run NFS rpc.statd needed for client/server.   
    rpcbind_enable="NO"             # Run the portmapper service (YES/NO).          
    
  3. NFSのサービスを起動(rpcbindは起動済みだった)
    # /etc/rc.d/nfsserver start
    # /etc/rc.d/rpcbind start
    # /etc/rc.d/mountd start
    # /etc/rc.d/nfsd start
    # /etc/rc.d/lockd start
    
    ※ 最後のlockdだけ、参考サイトの FreeBSD5.0ではnfslockingだったみたいだけど、FreeBSD8.2ではlockdみたい
これで、macから /net/sv/var/home (svはFreeBSDのホスト名)にアクセスしてみると、Permission deniedでアクセスできない。
FreeBSDのmessagesを見ると、
May 21 10:09:20 sv kernel: NFS request from unprivileged port (192.168.0.59:62636)
のようなエラーが出ている。rc.confに nfs_reserved_port_only="YES" としているので、mac側もそれなりの設定をしないといけないらしい。
mac側で man mount_nfs すると、resvportと言うオプションを発見。早速 /etc/auto_masterの/netの行に追加
/net                    -hosts          -nobrowse,hidefromfinder,nosuid,resvport
しかし、一度mountのリクエストを出しているせいか、automount -cvでは成功しなかったので、macを再起動したら繋がるようになった。
FreeBSD側は日本語のファイル名をEUC_JPにしているので、当たり前の様に日本語のファイル名は文字化けするが、今回の用途では問題ないので無視する。
さて、ここで問題発覚。FreeBSD側の書き込みたいディレクトリのオーナーはuid1000で、mac側のuidは501。書き込めない...(汗)。
まあ、どうせmacはクライアントOSだし、目的のユーザのホームディレクトリに書ければ良いや〜と、FreeBSD側の /etc/exportsを以下のように変更。
/var/home       -network 192.168.0 -mapall=1000
これで、mountさえできればuid1000の権限で書けるようになった。
しかし、NFSって今から見るとあまりにセキュリティ的に弱い仕様だよなあ。もうちょっとディレクトリを絞るか、mapallするuidを工夫した方が良いかもしれない。

これで、macのemacsからFreeBSDのファイルがアクセスできるようになったけれど、git管理下のファイルを開いてもvcモードにならない。
試しに、M-x vc-dirとかやってみると、
apply: Searching for program: No such file or directory, git
とかエラーが出ている。どうも、Emacs.appはユーザの環境変数PATHとか見てくれないようなので、~/.emacsに以下を追加した。
(add-to-list 'exec-path "/opt/local/bin")
これで、無事にgit管理下のファイルがemacsで扱えるようになった。

2011年5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

このアーカイブについて

このページには、2011年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2011年5月18日です。

次のアーカイブは2011年6月 1日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1