イラストレーターのEPSデータを考察

イラストレータといっても、手持ちのは古いままで7でのお話です。
EPSで保存すると、プレビューとサムネールを保存するかどうかの確認がありますが、これはいったいどのように格納されているかを調べてみました。

調べるといっても、サムネイルもプレビューも含まないで保存したEPSファイルと、サムネイルまたはプレビューを含んだEPSファイルを比較しただけです。

保存したファイル名と保存日時のデータは無視して、それ以外を比較します。

まず、サムネイルを含んだEPSファイルを比較しました。
違っていたのは、以下のとおりです。
46行目にある
%AI7_Thumbnail: 128 128 8
から
%%EndData
これが、サムネイルデータのようです。
バイナリが16進で格納されているようです。
どの画像形式かはわかりませんが、おそらくTIFFではないでしょうか。

次に、プレビューを含んだEPSファイルを比較しました。
違っていたのは、以下のとおりです。
1行目の先頭にバイナリデータが含まれています。
その後に通常のEPSデータが始まります。
%!PS-Adobe-3.0 EPSF-3.0
そして34行目に、
プレビューを含まないEPSファイルでは
%AI3_DocumentPreview: Header
となっているところが、
プレビューを含むEPSファイルでは
%AI3_DocumentPreview: PC_ColorTIFF
となっいます。
そして一番最後にまたバイナリデータが含まれています。
通常のEPSデータの末尾である
%%EOF
の後に、バイナリデータが追加されています。

他のイラストレータのバージョンでは、また違うかもしれません。
比較に使用したファイルをおいておきます。
サムネイルもプレビューも含まないEPSファイル
サムネイルを含むEPSファイル
プレビューを含むEPSファイル

mod_perlでライブラリが見つけられない

通常のCGIでは問題なく動くスクリプトを、いざmod_perl環境下に置いたとたんに動かなくなるのはよくある話。
変数や配列などの初期化がいい加減で、どんどん肥大化してしまうのは、日ごろから心がければ何とか回避できるものの、いまだに良くわからないエラーが次のもの。
「Undefined subroutine &ModPerl::ROOT::ModPerl::Registry::」
Registryの後には実行されるスクリプトのパスが入る。
つまり、mod_perl環境下で実行ファイルはモジュールとして扱われる。
このため、ライブラリやモジュールの読み込みまわりで順番がおかしくなり、ファイルが見つからないといわれることになるのだ。

この文字を検索すると以下のようなサンプルが表示される。

LoadModule perl_module modules/mod_perl.so

PerlRequire "/path/to/startup.pl"


SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
Options +ExecCGI


# in startup.pl, i have this:
use lib "/path/to/webObjects";
use Apache2 ( );
use ModPerl::Registry ( );

use Carp;
use CGI;

use lib_webObjects;
1; 


startup.plを読めばいいらしいのだが、そのとおりにやってもサーバーエラーになる。Apacheのエラーログを見ても同じメッセージか載ってないので、構文エラーという前に効果がないのかもしれない。
日本語のサイトがひとつも見つからないときは、英語が苦手でなければと常に思う。
しかし、このエラーも.htaccessと、httpd.confにディレクトリで指定したときでは挙動が違うような気がする。
Apache起動時に読み込ませた環境では、実行時に読む.htaccessと違うのはもちろん当たりまえなのだが、解決方法が見つからなければいくら原因がわかっていてもしょうがないのである・・・

さてはて、いったいどうしたものか。
最悪の場合、ライブラリをやめて1つのファイルに全部詰め込む荒業に出るか?

今日買った本

久しぶりにジュンク堂池袋店へ行きました。
レジの応対が不気味なほど丁寧で、しかも対応してくれた娘がちょっと好み入っていたのでドキドキ・・・ってオヤジですな。

さて、衝動買いした本はこれです。

奥付では「2009年1月25日 初版」となっている新刊です。
ポケリ(ポケットリファレンス)シリーズは、まれに外れがあるけども割とお買い得なシリーズです。
ずっと使い続けているMySQLへの理解を深めるために、この1冊を衝動買いしてしまったというわけです。
さて、活用できるかどうかは自分の腕次第・・・

FirefoxのアドオンツールFirebugが1.3.0にアップデート

Firefox2でお世話になったFirebugですが、いつの間にかバージョンもあがり、Firefox3に対応していたようです。
Firebugは開発者にとっては、とてもありがたいツールであり、使い方によってはサイトの脆弱性を付くこともできる魔法のツールです。
これでlolifox(Firefox2)ともおさらばですかね・・・
Firefox3をベースにしたブラウザが出ればそちらを使いたいところなのですが。

ImageMagickの書籍紹介

書店で見かけたImageMagickの本です。
これからImageMagickに触れてみようという人にとっては、とっつきやすいかもしれません。
しかし、値段も馬鹿高いし、表紙も胡散臭いし、google先生と仲良しな人には、正直読むところがありません。

ImageMagickでEPSを画像に変換したときの色化け

とりあえず何の変哲もないコマンド

convert sample.eps sample.png


シンプルなEPSならなんら問題なく画像になるのだけれど、グラデーションの場合に問題が発生する。
若干輝度が高くなってしまうのだ。
塗りとグラデーションが混在している場合、塗りは問題なく色が出るけれど、グラデーションは明るめに色が出てしまう。
これはどうやって回避すればいいのだろう・・・

VB.NETでMicrosoft Outlookのメールを読む

はじめに
VB.NETの環境は、Microsoft Visual Basic 2005 Express Editionを利用しています。
Microsoft OutlookではないOutlookには、対応していません。
準備
新しいプロジェクトを作成してください。
次に、APIの読み込みを行います。「メニューバーのプロジェクト > 参照の追加」より、COMタブを選択し、「Microsoft Outlook 9.0 Library」コンポーネントを選択します。数値の部分は、インストールしてあるMicrosoft Officeのバージョンで変化することがあります。ちなみに、Microsoft Office2000では9.0です。
受信トレイのメールを読む
まずは、受信トレイのメールを読んでみたいと思います。
受信したメールタイトルを表示するためのリストボックス(ListBox1)を用意します。
受信トレイのメールを読むタイミングは、起動時に行います。つまり、Form1_Loadに記述します。
  Private Sub Form1_Load( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs _
  ) Handles MyBase.Load

      Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
      Dim myNameSpace = myOlApp.GetNamespace("MAPI")
      Dim myFolder = myNameSpace.GetDefaultFolder(6)

      Dim i As Integer
      For i = 1 To myFolder.Items.Count
          Dim myitem = myFolder.Items(i)
          ListBox1.Items.Add(myitem.Subject)
      Next

      myFolder = Nothing
      myNameSpace = Nothing
      myOlApp = Nothing

  End Sub
myNameSpace.GetDefaultFolder(6)の6が受信トレイのフォルダを指します。
フォルダにある各メールは番号で管理されており、Itemsのインデックス番号で参照できます。
Microsoft Outlookの受信トレイにメールがあるのを確認してから、実行してください。
outlook1
問題なく表示できたでしょうか?
メールの本文を読む前に
次は、メールのタイトルを読むことができたので、リストを選択すると内容が表示されるようにします。
メールの内容を読むためには、そのメールのインデックス番号が必要です。
そこで、メールタイトルをキーに、メール番号を値としたハッシュを用意します。
    Public mail As Hashtable = New Hashtable

    Private Sub Form1_Load( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs _
    ) Handles MyBase.Load

        Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
        Dim myNameSpace = myOlApp.GetNamespace("MAPI")
        Dim myFolder = myNameSpace.GetDefaultFolder(6)

        Dim i As Integer
        For i = 1 To myFolder.Items.Count
            Dim myitem = myFolder.Items(i)
            ListBox1.Items.Add(myitem.Subject)
            mail(myitem.Subject) = i
        Next

        myFolder = Nothing
        myNameSpace = Nothing
        myOlApp = Nothing

    End Sub

変更した場所を赤く表示しています。これで、リストの値からメール番号を得られるようになりました。
メールの本文を読む
内容を表示するためのテキストボックス(TextBox1)を用意します。
TextBox1はプロパティの設定で、MultilineとScrollBarsをTrueに変更しておきます。
内容を表示するには、ListBox1のSelectedIndexChangedイベントを利用します。
  Private Sub ListBox1_SelectedIndexChanged( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs _
  ) Handles ListBox1.SelectedIndexChanged

      Dim myOlApp As Outlook.Application = CreateObject("Outlook.Application")
      Dim myNameSpace = myOlApp.GetNamespace("MAPI")
      Dim myFolder = myNameSpace.GetDefaultFolder(6)

      Dim myitem = myFolder.Items(mail(ListBox1.Text))
      TextBox1.Text = myitem.Body

  End Sub
メール番号は1から始まります。
outlook2
これで、選択したメールの内容を表示することができました。
メールの内容は、text形式かhtml形式かの判断は行っていません。
html形式では、ソースが表示されますが、一部は「?」という文字に化けます。
おまけ
myitem.Subject 件名
myitem.SenderName 送信者名
myitem.SentOnBehalfOfName 送信者名(SenderNameとどう違う?)
myitem.Body 内容
myitem.ReceivedTime 受信時間
myitem.To 送信先

更新履歴

2007-07-21
公開