2011年5月アーカイブ

zipの仕様をあたったわけではないけど、どうもアーカイブ内のファイル名の文字コードは環境依存らしい。
なので、日本語版のWindowsで作成したzip内のファイル名はCP932だし、Macで作成したものはutf8-macらしい。
この、Windowsで作成したCP932ファイル名のzipファイルを、MacのFinderで右クリックして開く(デフォルトで、アーカイブユーティリティ.appに関連付けられている)と、勝手にCP932をutf8-macに変換してくれるので、意識せずにそのままFinderでアクセスできる。
しかし、この展開してできたディレクトリにちょっと手を加えて、Finderの「"ディレクトリ名"を圧縮」を使うと、utf8-macでファイル名がエンコードされてしまい、さらには __MACOSX とか言う謎のディレクトリまで入ってしまう。(これについてはぐぐれば情報がいっぱいある)
これではWindowsでは使えないので、日本語を含まないファイル名にしてコマンドラインのzipで固めてやると、__MACOSXも入らない。
ここで、「ちょっと手を加えたい」zipファイルがたくさんある場合、当然シェルスクリプトとかで処理したいわけだけど、コマンドラインのunzipはアーカイブユーティリティみたいに文字コードを変換してくれないのでCP932のアーカイブを文字化けせずに展開できない。
ちょっと調べてみると、日本語ファイル名が文字化けしないunzipのビルド手順 - ymknの日記と言うページを見つけたので、真似してみる。
ただし、私はHomebrewではなくMacPortsなので、その路線で。(と言っても、自家Portを作ったりするわけではない)

前提条件
  • MacPortsがインストールされている。
  • MacPortsでlibiconvがインストールされている
手順
  1. sudo port fetch unzip でunzipのソースを取得。
  2. 好きなところにソース(/opt/local/var/macports/distfiles/unzip/unzip60.tar.gz)を展開。
  3. FS#15256 – [unzip] New unzip 6.0 lacks -O -I optionsからpatchを持ってきて、patch -p1であてる。
  4. unix/Makefileをコピーして、以下を修正
    *** unix/Makefile       2009-01-19 07:41:18.000000000 +0900
    --- Makefile    2011-05-03 00:14:43.000000000 +0900
    ***************
    *** 50,56 ****
      CFLAGS = -O
      CF_NOOPT = -I. -I$(IZ_BZIP2) -DUNIX $(LOC)
      CF = $(CFLAGS) $(CF_NOOPT)
    ! LFLAGS1 =
      LF = -o unzip$E $(LFLAGS1)
      LF2 = -s
      
    --- 50,56 ----
      CFLAGS = -O
      CF_NOOPT = -I. -I$(IZ_BZIP2) -DUNIX $(LOC)
      CF = $(CFLAGS) $(CF_NOOPT)
    ! LFLAGS1 = -L/opt/local/lib -liconv
      LF = -o unzip$E $(LFLAGS1)
      LF2 = -s
      
    ***************
    *** 121,127 ****
      INSTALL_D = mkdir -p
      # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
      manext = 1
    ! prefix = /usr/local
      BINDIR = $(prefix)/bin#                       where to install executables
      MANDIR = $(prefix)/man/man$(manext)#  where to install man pages
      INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \
    --- 121,127 ----
      INSTALL_D = mkdir -p
      # on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
      manext = 1
    ! prefix = /opt/local
      BINDIR = $(prefix)/bin#                       where to install executables
      MANDIR = $(prefix)/man/man$(manext)#  where to install man pages
      INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \
    ***************
    *** 872,878 ****
      
      # Macintosh MacOS X (Unix-compatible enviroment), using standard compiler
      macosx:       unix_make
    !       $(MAKE) unzips CFLAGS="-O3 -Wall -DBSD" LF2=""
            $(STRIP) $(UNZIPS)
      
      # Macintosh MacOS X (Unix-compatible enviroment), using gcc
    --- 872,878 ----
      
      # Macintosh MacOS X (Unix-compatible enviroment), using standard compiler
      macosx:       unix_make
    !       $(MAKE) unzips CFLAGS="-O3 -Wall -DBSD -I/opt/local/include -DNATIVE" LF2=""
            $(STRIP) $(UNZIPS)
      
      # Macintosh MacOS X (Unix-compatible enviroment), using gcc
    
  5. 後は、make macosxして、make installすれば/opt/local/bin に入る。
これで、unzip -O cp932 -l hoge.zip のように-O cp932をつけると、cp932のzipファイルが扱える。
unzipのビルドはできたけれど、毎回手動でやるのもなんなので、自前のPortfileを作って使いやすくする。
macportsの説明を見ると、どこかにディレクトリを作ってPortfileを置いて、/opt/local/etc/macports/sources.conf に書けば良いらしいので、その路線で行く。
また、何か書くたびにいちいちblogを書いてファイルを添付すると言うのもなんなので、githubに置くことにする。
githubのアカウントは既にあるとして、新しいリポジトリmacportsを作成する。
と、その前に、macのsshの公開鍵をgithubのアカウントの設定→SSH公開鍵で追加しておく。
すると、画面に手順が出るので、そのまま実行。
$ git config --global user.name ""
$ git config --global user.email false@wizard-limit.net
$ mkdir macports
$ cd macports
$ git init
$ touch README
$ git add README
$ git commit -m 'first commit'
$ git remote add origin git@github.com:false-git/macports.git
$ git push -u origin master
そしたら、まずはオリジナルのunzipのPortfileをベースにしたいので、続けて以下のようにする。
$ mkdir archivers
$ cd archivers
$ mkdir unzip-iconv
$ cd unzip-iconv
$ cp /opt/local/var/macports/sources/rsync.macports.org/release/ports/archivers/unzip/Portfile .
$ cd ../..
$ git add archivers
$ git commit -m 'import original unzip portfile'
これで準備ができたので、archivers/unzip-iconv/Portfileをエディタで修正する。
このPortfileでは、オリジナルのunzipにFS#15256 – [unzip] New unzip 6.0 lacks -O -I optionsのパッチをあてたいんだけど、patchをダウンロードするのに「URL/ファイル名」の形式ではなく URL?hoge の形式になっている。
Portfileにpatch関連ので書けるのは patch_sites, patchfiles, patch.argsくらいなので、このようなサイトに対応する方法がわからない。
そこで、苦肉の策として、以下のようにしてみた。
  • patchfilesは最初は空。
  • pre-fetch で curl fetch でパッチファイルを files/ にダウンロードする。
  • ダウンロードしたら、patchfilesにパッチファイルを追加する。こうしないと、pre-fetchで持ってきても別途取りに行こうとして失敗する
こう言うpatchサイトはたくさんあると思うので、正しいやり方は別にあると思うんだけど、今のところ試行錯誤で辿りつけたのはここまで。
と、言うわけでできたPortfileはgithubにあります。
オリジナルとの変更点は、ここで見られる。
Portfileが書けたら、以下の手順で有効にする。
  1. /opt/local/etc/macports/sources.confにportsを置いたディレクトリを追加。
    file:///Users/false/macports
    
  2. portsを置いたディレクトリで、portindexを実行する。
これで、sudo port install unzip-iconv とかやれば、インストールできる。

【追記】
portの実行でportのディレクトリにファイルを置くのは気持ち悪いので、patchのダウンロード先をdistfilesにしてみた。
そしたら、patchfilesに書いても再度取りに行こうとしなくなったので、patchfilesに書いて、sumチェックもできるようになった。
変更点はこんな感じ。
macにTeXとかdoxygenの環境を構築することにする。
ちょっと調べた感じ、MacPortsには pTeX と texliive と言う二つのportがあるらしい。
馴染みがあるのと、メンテナが日本人っぽかったので、pTeXの方を入れてみる。
そして、doxygenもMacPortsからインストール。
doxygenで適当にドキュメントを出力してみて、latexディレクトリでmakeしてみると、日本語のところでエラーになる。
最近のdoxygenが出力する latex 用のファイルは、昔のpLaTeXでは処理できなかったりするので、pTeXをアンインストールしてtexliveをインストールしてみる。
そしたら、pTeXよりも悪く、sectsty.sty とか tocloft.styが見つからないとかエラーになる。さらにpTeXのときと同じように日本語のところでエラーになるので、とりあえずpTeXに戻した。
そして、DoxyfileのUSE_PDFLATEXをNOにして、LATEX_CMD_NAMEをplatexに変えたら、無事にdviファイルができた。
そのまま、make pdf するとエラーになったけど、dvipdfmxを使えばpdfファイルも作成できた。

ちなみに、以前FreeBSDでdoxygenのlatexを処理したときにどうしたのかのメモを見てみたら、ptexliveと言うのを入れていた。
しかし、このときもUSE_PDFLATEXはNOで試していたっぽいのと、ptexliveのREADMEを読む限りpdflatexコマンドは変わらなそうなので、今のところ日本語でのpdflatexは諦めるしかなさそう。

ついでに、sphinxもインストールしてみた。
portsは使わずに、easy_installでsphinx, blockdiag等をインストール。
blockdiag の概要によると、標準のeasy_installを使っては駄目とあるが、特に問題はないように見える。
んで、sphinx-quickstart して、make latex して、_build/latex の Makefileを見ると、all-pdf-ja と言うターゲットがあったので、こいつを実行してみたら、以下のようなエラーになってしまった。
ebb sptest.pdf
platex -kanji=utf8  'sptest.tex'
This is pTeX, Version 3.141592-p3.1.10 (utf8.euc) (Web2C 7.5.4)
(./sptest.tex
pLaTeX2e <2006/11/10>+0 (based on LaTeX2e <2003/12/01> patch level 0)
(./sphinxmanual.cls
Document Class: sphinxmanual 2009/06/02 Document class (Sphinx manual)
(/opt/local/share/texmf-dist/tex/latex/base/report.cls
Document Class: report 2004/02/16 v1.4f Standard LaTeX document class
(/opt/local/share/texmf-dist/tex/latex/base/size10.clo)))
(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
(/opt/local/share/texmf-dist/tex/latex/base/utf8.def
(/opt/local/share/texmf-dist/tex/latex/base/t1enc.dfu)
(/opt/local/share/texmf-dist/tex/latex/base/ot1enc.dfu)
(/opt/local/share/texmf-dist/tex/latex/base/omsenc.dfu)))
(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def))
(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
(/opt/local/share/texmf-dist/tex/generic/babel/babel.def)))
(/opt/local/share/texmf-dist/tex/latex/psnfss/times.sty) (./fncychap.sty)
(/opt/local/share/texmf-dist/tex/latex/tools/longtable.sty) (./sphinx.sty
(/opt/local/share/texmf-dist/tex/latex/base/textcomp.sty
(/opt/local/share/texmf-dist/tex/latex/base/ts1enc.def
(/opt/local/share/texmf-dist/tex/latex/base/ts1enc.dfu)))
(/opt/local/share/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty)
(/opt/local/share/texmf-dist/tex/latex/fancybox/fancybox.sty
Style option: `fancybox' v1.3 <2000/09/19> (tvz)
) (/opt/local/share/texmf-dist/tex/latex/titlesec/titlesec.sty) (./tabulary.sty
(/opt/local/share/texmf-dist/tex/latex/tools/array.sty))
(/opt/local/share/texmf-dist/tex/latex/amsmath/amsmath.sty
For additional information on amsmath, use the `?' option.
(/opt/local/share/texmf-dist/tex/latex/amsmath/amstext.sty
(/opt/local/share/texmf-dist/tex/latex/amsmath/amsgen.sty))
(/opt/local/share/texmf-dist/tex/latex/amsmath/amsbsy.sty)
(/opt/local/share/texmf-dist/tex/latex/amsmath/amsopn.sty))
(/opt/local/share/texmf-dist/tex/latex/base/makeidx.sty)
(/opt/local/share/texmf-dist/tex/latex/framed/framed.sty)
(/opt/local/share/texmf-dist/tex/latex/base/ifthen.sty)
(/opt/local/share/texmf/tex/latex/graphics/dvipdfmx-contrib-latex/color.sty
(/opt/local/share/texmf-dist/tex/latex/graphics/color.cfg)
(/opt/local/share/texmf-dist/tex/latex/graphics/dvips.def)
(/opt/local/share/texmf-dist/tex/latex/graphics/dvipsnam.def))
(/opt/local/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
Style option: `fancyvrb' v2.6, with DG/SPQR fixes <1998/07/17> (tvz)
(/opt/local/share/texmf-dist/tex/latex/graphics/keyval.sty)
No file fancyvrb.cfg.
) (/opt/local/share/texmf-dist/tex/latex/threeparttable/threeparttable.sty)
(/opt/local/share/texmf-dist/tex/latex/mdwtools/footnote.sty)
(/opt/local/share/texmf-dist/tex/latex/wrapfig/wrapfig.sty)
(/opt/local/share/texmf-dist/tex/latex/parskip/parskip.sty)
(/opt/local/share/texmf-dist/tex/latex/graphics/graphicx.sty
(/opt/local/share/texmf/tex/latex/graphics/dvipdfmx-contrib-latex/graphics.sty
(/opt/local/share/texmf-dist/tex/latex/graphics/trig.sty)
(/opt/local/share/texmf-dist/tex/latex/graphics/graphics.cfg)))
! Undefined control sequence.
l.204 ...n}{0.5em}{\py@TitleColor}{\py@NormalColor
                                                  }
力尽きたので今日はここまで。

【追記】
SphinxとTeXとPDFと日本語 - ぷわぷわのあかしろ・りろーでっどに同じ問題が載っていました。ここに書いてある通り、sphinx.styに以下を追加したら、make all-pdf-ja でpdfファイルが得られました。
\newcount\pdfoutput
\pdfoutput=0

doxygen

最初、doxygenはportsから入れた。すると、1.7.3と言うバージョンが入って、doxywizardがついてこない。(使わないけど)
Doxygenには1.7.4のdmgがあるので、こちらをインストールすればDoxygen.appを起動すればdoxywizardが立ち上がる。(英語版だけど)
この場合、PATHが通らないので、以下のようにリンクを貼っておくと良い。
$ sudo ln -s /Applications/Doxygen.app/Contents/Resources/doxy* /opt/local/bin/

snmpd

Macにはsnmpdが標準で入っているけれど、通常では起動していない。
Mac OS X Tips: Configuring SNMP | HoffmanLabsによると、以下の手順で有効化できるらしい。
$ sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist
snmpd.confの場所は /etc/snmp/snmpd.conf。
最初なかなか設定がうまくいかなくて、サービスを止めたくて
$ sudo launchctl stop org.net-snmp.snmpd
とかやっても止まらなくて(実際にはpidが変わっていたので、止まって起動した?)困ったりした。(これは、launchctlに対する理解が足りないせいか)
最終的には他のマシンからsnmpでアクセスできるようになって、cactiのグラフの仲間入りをした。

zsh

ずっとtcshを愛用してきたのだけれど、この機会にzshに乗り換えることにする。
参考にしたのは後藤大地さんの漢のzsh | コラム | エンタープライズ | マイコミジャーナル。第24回(実際には10回か22回)の.zshrcをコピペして、promptを直したくらい。
そして、悩んだのがPATHの設定。
export PATH=$HOME/bin:/opt/local/bin:/opt/local/sbin:$PATH
環境変数なんだからログイン時に一回設定すれば良いだろうと思って、~/.zprofileに書いたら、screen等のサブシェルでPATHの順番が変わってしまう。
かと言って、.zshrcに書くと、サブシェルでPATHの中身が無駄に増えてしまう。
なんでだ〜?と思って調べてみたところ、/etc/zshenv が呼び出している path_helper が原因だった。
こいつは、/etc/pathsおよび/etc/paths.dからPATHを作り出し、元からあったPATHから重複を除いたものを後ろにつける、と言う働きをするらしい。
と、言うわけで、環境変数は ~/.zshenv に書き、かつ path_helperに潰されない方法として以下のようにした。
OPATH=$PATH
PATH=
if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
else
    PATH=$OPATH
fi
export PATH=$HOME/bin:/opt/local/bin:/opt/local/sbin:$PATH
まあ、path_helperが重複を除いてくれるおかげで無限に長くはならないし、パフォーマンスを考えたらこんなことをやるよりもPATH=...:$PATH の行だけの方が良いかもしれない。
これらの設定ファイル系は、githubに置いてある。

emacsのフォント

emacsでgitのcommit logを書こうと思ったら、「・」とか「〜」とかが文字化け(トーフ)する。
フォントの設定が必要らしいので、CocoaEmacs - MacEmacsの細かい設定の所の設定をそのままもらってきて、英字フォントをCourier Newに、日本語フォントをヒラギノ角ゴproに変えて使っている。
perlのドキュメントをpod形式(?)で日本語で書いて、perldoc hoge.pl とかやると日本語の部分が文字化けして読めない。
いろいろ調べた結果、nroffが日本語対応していないのが問題らしい。
そこで、FreeBSDのports/japanese/groffを参考にして、Macにもマルチバイト対応のnroffのportsを入れようといろいろやったが、最終的に groff-1.18のMakefileが make install DESTDIR=hoge に対応していないと言う理由で断念した。
MacPortsにするのは断念したのだが、一応ビルドはできてインストールもできるので、やり方を書いておく。
  1. groff-1.18.1.1 のソースを持ってくる。GNUのサイトからでも良いし、次のpatchのサイトからgroff-1.18.1.1.orig.tar.gz を持ってきても良い。
  2. groff_1.18.1.1-21.diff.gz を持ってくる。持ってくるのは、日本だったら ftp://ftp.jp.debian.org/debian/pool/main/g/groff/とかから
  3. ソースを展開する。
  4. ソースディレクトリで、上記パッチをあてる
  5. configure --enable-multibyte
  6. make
  7. make install
以下のような感じになる。
$ wget ftp://ftp.jp.debian.org/debian/pool/main/g/groff/groff_1.18.1.1.orig.tar.gz
$ wget ftp://ftp.jp.debian.org/debian/pool/main/g/groff/groff_1.18.1.1-21.diff.gz
$ tar xzf groff_1.18.1.1.orig.tar.gz
$ cd groff-1.18.1.1
$ gzcat ../groff_1.18.1.1-21.diff.gz | patch -p1
$ ./configure --prefix=/opt/local --infodir=/opt/local/share/info --mandir=/opt/local/share/man --without-x --enable-multibyte LIBS="-L/opt/local/lib -liconv"
$ make CPPFLAGS=-I/opt/local/include
$ sudo make install
このようにしてインストールしたnroffがあると、
$ pod2man -u hoge.pl | nroff -man | less
のようにすると、utf-8で書かれたpod形式(?)の日本語ドキュメントが読めるようになる。

ecto 3 と言うMac用のblogエディタを試してみる。

今までblogはMovableTypeの管理画面で、htmlをごりごり手書きしていたので、blogエディタと言うのは初めて。

MovableTypeの場合は、xmlrpc経由で扱うらしく、アカウントを設定すると編集権があるblogの一覧が出てきて、記事の一覧が出てくる。

ただし、blogの表示や編集にはデフォルトではblogに設定したCSSが適用されないようなので、どうやって見た目の確認をするのだろう?

と思ったら、$19.95のシェアウェアで、ダウンロードすると20日のお試し版になるのね。う〜ん。

うちではTeraStationと言うNASを使っていて、標準のsamba2ではMacから見ると日本語のファイル名が化けるのでsamba3を入れたりしている。
で、MacからNASはどのように使うかと言うと、FinderにTeraStationが認識されるので、中を見ていくと勝手に /Volumes にマウントされる。
/Volumesの下のなんと言うディレクトリにマウントされるかはいまいちルールがわからない。
たとえば、diskと言う名前の共有をマウントすると /Volumes/diskになるが、Xと言う名前の共有をマウントすると /Volumes/ts-tglxxx になったりする(ts-tglxxxはTeraStationのホスト名)
そして、こいつはログイン時には自動でなされないので、Finderでマウントせずにシェルから /Volumes/disk を見に行ったりすると見つからなかったりする。
私の場合、iTunesのMusicフォルダや、Picasaの監視フォルダをNASにしているため、Finderで見るまでiTunesやPicasaを起動できないと言うのは非常に面倒だ。
そこで、「mac 自動マウント」とかでぐぐると最初に見つかったのがMacにおける、launchdを用いたafp自動マウントの方法|BAMBOoのAppleでMacなiPhone徒然草
ここのやり方は、NASをマウントするシェルスクリプトを書いて、launchdでログイン時に実行してやろうと言うもの。
launchdの設定ファイルを作るのにLingonというソフトを使っているようだが、リンク先は既になく、Lingonで検索したらMacAppStoreで600円か、SourceForgeから古いものをダウンロードかと言う状態らしい。
試しに、Finder でマウントしていない状態で、以下を実行してみた。
% sudo mkdir /Volumes/disk
% sudo mount_smbfs //GUEST:@ts-tglxxx/disk /Volumes/disk
とやってみたところ、/Volumes/diskがマウントできた。
この状態でFinderを見ると、ts-tglxxx のところにはEjectアイコンが出るが、diskのところにはEjectアイコンが出ていない。
試しに、Finderでdiskを見てみたら、なんと/Volumes/disk-1と言う名前で2重にマウントされた。
これだとちょっと気持ち悪いし、だいたいログイン時にマウントだとMacを外に持ち出したときとか困りそうなので、別の方法を考えることにする。
いろいろ調べてみると、そもそもMacではautofsdと言うデーモンが動いていて、こいつが自動マウントをやってくれるらしい。
そうすると、sambaのディレクトリだって自動でマウントしてくれるんじゃないかと思って検索したら、Automounting Samba shares in Leopard | StressFree | David Harrisonを発見した。
結論から言うと、ここに書いてある手順でやりたいことはそのまま実現できてしまった。
  1. /etc/auto.smb ファイルを作る(sudo vi /etc/auto.smbとかで)
    disk -fstype=smbfs ://GUEST:@ts-tglxxx/disk
    X -fstype=smbfs ://GUEST:@ts-tglxxx/X
    
    1行に一つのマウントポイントで、最初がmac側のマウントポイント、次がオプション(-fstype=smbfsでsamba)、最後が共有のURL。このファイルにsambaのユーザ名とパスワードを書くので、参考サイトではchmod 600 しろとか書いてある。
  2. /etc/auto_masterファイルに追記する(sudo vi /etc/auto_master)
    /Share                  auto.smb
    
    このように書くと、/Share/diskとかでアクセスできるようになる。
  3. automountに設定を読み込ませる。
    % sudo automount -vc
    
これで、/Share/disk とかにアクセスすると初回にマウントされるようになった。
この状態でFinderを見ると、一見変化がないが、Machintosh HD の中を見ると Share と言うフォルダがあるので、その中を見ると disk とか X とかある。
こいつを右クリックして、「サイドバーに追加」とかやると、快適に使えるのではないだろうか。
後は、FinderからNASを選択すると今まで通り /Volumes に2重マウントされるが、こちらが気になるなら /etc/fstab を書いてFinderの自動マウントから外す方法などもあるようだ。
それから、Finderに/Shareが見えるのがいやだったら、/etc/auto_masterに-nobrowse,hidefromfinderとか書いても良いのかも知れない。詳しくは man auto_masterで。
これで、家庭内LANにつながっている状態ならば、固定のパスでNASにアクセスできるようになったので、iTunesのライブラリとかを再度移行しなくては・・・。
デジカメとか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年4月です。

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

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

Powered by Movable Type 6.1.1