OS X で ImageMagick を使えるようにする2009/07/14 11:13

しばらく前に OS X Server で Movable Type 4.25 を使えるようにすることになった。その際の備忘録。

MT自体のインストールは zip ファイルを展開して所定のディレクトリ( /Library/WebServer/CGI-Executables/ )の下に置いてパーミッションを設定してやればよい。これだけでとりあえず動作させることはできるが、アップロードした画像のサムネイルを作成させたい場合、不足しているライブラリなどを追加でインストールしてやる必要がある。

汎用性と一般性からたいていは ImageMagick という画像処理用のパッケージを利用することになると思う。

Linux や BSD なら yum や ports で一発インストール可能なバイナリパッケージが用意されているのだが、Apple の場合、「画像処理だったらウチには Core Image がありまっせ」という立場のせいか OS X には同梱されていないし、。MacPorts や Fink で提供されているものを使うことも考えたが、用意されているバージョンがちょっと古かったり、インストールパスが標準だとそれぞれ独自のものになっている。

MacPorts や Fink と一蓮托生で行くのであればそれもいいだろうが、別にごりごりの UNIX 環境を作りたい訳ではないし、後々の管理が面倒くさくなるため、結局はオフィシャルサイトからリンクをたどってソースを入手しソースコンパイルでインストールすることにした。

インストール自体は入手したソースを適当なディレクトリに展開してそこに移り、

./configure
make
make test
sudo make install
するだけである

ただし、事前に必要なライブラリをインストールしておかないとmake test で「あれがない、これがない」と文句を言われる。上でも書いたように、OS X では画像処理は Core Image にお任せなので、なんと libjpeg も libpng も libtiff も入っていない。でそれぞれのソースもオフィシャルサイトからダウンロードしてせっせとインストールする。

ただし libjpeg のソースは OS X がリリースされる以前のもの(1998年)なのでそのままではコンパイルが通ったように見えても実は駄目である。風ブログさんの記述を参考にしてconfig.sub と config.guess を /usr/share/libtool/ 下にあるApple 製の同名のファイルに差し替えてから行った。

その後、ImageMagick本体をインストールする。結構時間がかかるが無事に完了。続いて ImageMagick のソースに同梱されている PerlMagick をインストールしなければならない。MT 自身は perl からこちらの PerlMagick に処理を投げるようになっているので、こっちが入っていないとどうにもならない。

perl Makefile.PL
make
sudo make install
これでめでたくMTから ImageMagick が利用できるようになった。

  • 勘違いしてQuickTimeって書いたところを Core Image に修正しました(2009/07/15)

  • OS Xで /etc/hosts を有効にする2009/07/01 14:37

    先日書いたスクリプトの件で、追記。
    特定のホスト名に関する名前解決をローカルで行わせるために、/etc/hosts にレコードを追加するようにスクリプトに書いたのだが、名前を解決してくれない。
    /etc/hosts は存在しても
    # Host Database
    #
    # localhost is used to configure the loopback interface
    # when the system is booting. Do not change this entry.
    ##
    と書いてあって、標準では起動時にループバックを認識させるためにしか使わないとあった。
    ググってみたら追加で登録したレコードは Netinfo に登録しないといけないという記述が何点か見つかった。ところがこいつは 10.5 Leopard で Netinfo は廃止され Open Directory で管理されるようになったため、この手は使えない。

    Apple のサポートに電話して聞いてみたが、これがまたいけない。出てきた担当者は即答できず折り返し電話をするという。ところが何回説明しても、尋ねられている質問の内容が理解できないらしい。いいかげん堪忍袋の緒が切れて、「あなた TCP/IP ネットワークのこと全然知らないんでしょ?わからないんだったらわかる人に繋いでくださいよっ!」と怒鳴りつけてしまった。

    しばらくして替わりの担当者から電話があり、どうやらディレクトリユーティリティにその機能が備わっているということがわかった。ところがこれまた、サポートの範囲外なので手順は教えられないと言う。???そーいうものなんでしょうか....

    ともあれどうやら設定は可能らしいのでディレクトリユーティリティを起動してみたところ、サービスをクリックすると利用可能なサービスの一覧(Local、LDAPv3、BSDフラットファイル、Active Directory)が表示されている。このうちチェックが入ってデフォルトで利用可能なのは、Local と LDAPv3。

    BSDフラットファイルにチェックを入れて鉛筆マークをクリックすると「BSDローカルノードのユーザおよびグループレコードを使う」にチェックボックスがあった。ヘルプで調べてみると、/etc 以下の各種設定ファイルを読み込ませるにはここをチェックすればいいとわかった。

    「さて、これで大丈夫」とひと安心して試してみるがまだ駄目。あらためてヘルプを読み直したり、ググり直したりしたがめぼしい発見はない。/etc の下を眺めること15分。「???」/etc/host.conf がないでやんの Orz こいつがないから hosts を参照してくれないのだった。別にデフォルトで無視するんだったら残しておいてくれてもいいような気がするんですがねぇアップルさん。

    sudo の挙動2009/06/25 13:38

    先日のスクリプトの続きでまたおもしろい経験をした。

    OS Xでは通常 root アカウントが無効にされているため、ターミナル内の CUI で管理権限が必要な操作を行う場合、コマンドの頭に sudo をつけて実行する必要がある。

    /etc/hosts ファイルにレコードを追加する必要がでてきたので、この間 Automator で sudo route add のスクリプトをアプリケーション化したのと同じように、

    sudo echo 192.168.111.xxx foo.bar.com >> /etc/hosts

    といった内容を作ってみたところ、動作確認でエラーが出てしまう。

    同じ一文を実際にコマンドラインで実行してみたら、/etc/hosts に対するパーミッションエラーでアクセス拒否されてしまうことがわかった。

    これは sudo で管理権限が与えられているのが echo コマンドだけで、次のリダイレクションによる /etc/hosts に対する文字列書き込み動作にはその影響が及ばないからだろうと思い、Automator を離れて、単純にsudo 抜きのコマンドだけを記述したシェルスクリプト script.sh を書いて

    sudo ./script.sh

    とコマンドラインから実行してみたら、みごとに通った。

    「そんなことは常識」と言われてしまう程度のことかもしれないが、まぁひとつお利口になりました。

    OS Xでシェルスクリプトの起動項目化成功!2009/06/19 17:34

    ついさっきのエントリ(OS Xでシェルスクリプトをアプリケーション化する)では経路情報の追加を起動時に自動で実行させる試みに頓挫して、アプリケーション化でお茶を濁したと書いたが、どうにも煮え切らない思いだったのであらためてヒントになる情報がないかググって探してみたところ、Mac OS Xの起動の仕組みという名古屋大学の内藤さんという方がOS XBetaの頃に書かれたページが引っかかった。

    ここに書かれていた内容を参考にしてあらためてStartupParameters.plistの中身をXMLではない古いスタイルで書き直してみたところ、書式エラーは出なくなった。

    しかしそれでもスクリプトの実行自体は fail してしまう。

    もう一度あらためてスクリプトを眺めること5分。なんのことはない、1行目の冒頭 #!/bin/sh で始めなければならないのに、#が抜けてる orz .... しかし、きちんと#を補って SystemStarter start してみたところ無事経路の追加に成功。

    さっきのエントリでは10.4の頃から変更になったと書いたけれど、2001年のBeta時代からしっかりと移行は始まっていたんですね。まぁこれでひと安心です。ありがとうございました内藤先生 m0m

    OS Xでシェルスクリプトをアプリケーション化する2009/06/19 15:54

    特定のIPアドレスに対してだけデフォルトゲイトウェイではないルータをゲイトウェイに指定するためにスタティックルートを追加することは、日常ありふれたことではないが、特定の関係先や協力会社などとの接続のために利用することがないわけではない。

    こういった場合では、通常デフォルトゲイトウェイのルータにその設定を施すことが普通だが、今回の案件では特定の利用者が使用する端末以外からは、そもそもこの裏口に到達させたくないので、特定の端末にだけスタティックルートを切ることになった。

    Linux なら追加した経路情報は再起動してもそのまま有効だし、Windows でも route add コマンドに print オプションを追加してあげれば覚えさせることができる。ところが、ターゲットの端末はすべて OS X 10.5 の Macintosh である。困ったことに OS X の route コマンドの場合、再起動をかけると追加した経路情報をきれいさっぱり忘れてくれる。覚え込ませる機能が備わっていない。

    このこと自体はかれこれ4〜5年前、10.3あたりの頃から知っていたが、その頃の Apple のサポート情報には「今のところはrc.common だったかの中に経路情報を追加するスクリプトを追加してしのいでください」といった、昔ながらのBSD風な対応策が紹介されていた。そのことが頭にあったので今回あらためてそのドキュメントを探したが見つけることができなかったし、10.4以降、システム起動時にプロセスを自動起動させる方法が rc スクリプトではなく /Library/StartupItems/ というディレクトリの下に個々の起動スクリプトを配置する方法に変更されているため、かなりやり方が変わってしまった。(Linux の /etc/init.d/ のやり方とよく似ている)

    経路情報追加のスクリプトなんてそれこそ1行だけですむ話なのだが、一緒に記述しなければならない StartupParameters.plist という奴の記述方法がよくわからない。BSDでずっとやってきていて、このスタイルの変化にも対応してきた人々にとっては何でもないことなのかもしれないが、普段馴染みのない内容なので、あせって色々検索して試行錯誤してみたがどうも上手くいかない。何度書き直しても「記述内容に間違いがある」ために起動させることができない。
    (このあたりについてはMAC OS XでのOS起動時の自動起動その他を参考にした)
    しかたないので、シェルスクリプト自体をアプリケーション化して、個々のユーザに配布することにした。

    これも以前だったらApple Script で Do shellscript ... とでも書くのだろうが、最近ではAutomatorというロボット君が提供されていて、「スクリプトを実行」というアクションが用意されていた。このアクションのパラメータとして sudo route add xxx.xxx.xxx.0/24 yyy.yyy.yyy.yyy と書いて「アプリケーションとして保存」を選べばいいことがわかった。

    この点についても sudo がミソで、sudo なしだとパーミッションエラーでエラーになる。しかしこれも変な話なのだが、Automator で作った sudo つきのスクリプトではパスワード入力が不要なのである。ターミナルを開いてこのスクリプトを実行すれば、システムの設定をいじる命令なので当然パスワードを訊いてくる。それなのに Automator で作った場合には四の五の言わずに黙って実行してくれる。これはセキュリティ的にどうなんだろうかといささか疑問が残った次第である。

    それはそれとして、アプリケーションで対応といった当座の妥協策で放置しておくのもおもしろくないので、継続して追いかけてなんとかするつもりではある。