今日買った本

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

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

奥付では「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
公開

ImageMagickで文字を描画する

このページは、Text Handingを基準に作成されていますが、
翻訳ページではありませんので、ご注意ください。
captionでも作成できますが、とりあえず保留します。
また、コード内において改行が含まれていますが、実際には改行を含まずに入力することが必要です。
サンプルで使用したフォントはあくあフォントです。

オプションの説明

文字については、フォントが持っている幅が利用されるため、余白が生まれます。
-trim“オプションを利用すれば、出来るだけ小さな画像にすることは出来ますが、
座標で決め打ちするような画像の合成時に、誤差の原因となる可能性があるため、利用は控えたほうがいいかもしれません。

オプション 内容 細く
-background 背景の色 指定しない場合は白色になり、透明情報を持てる形式で出力する場合には「none」を指定すれば透明になる。
-fill 文字の色 文字の色を指定しなければ、背景で塗られた画像が作成される。
ただし、画像サイズは文字の色を指定したときと同じものになる。
-pointsize 文字の大きさ
(pt)
文字の大きさを指定しなくても、画像サイズが指定されていれば自動で調整されるが、
画像サイズが指定されていなければ、おそらく12ptで作成されているらしい。

文字サイズを基準に描画する

画像サイズは自動的に調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo.net text1.png
文字サイズ基準画像

png画像、176×34ピクセル

画像サイズを基準に描画する

縦と横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
この余白を調整するには”-gravity“オプションを設定します。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x64 label:penlabo.net text2.png

画像サイズ基準画像

png画像、256×64ピクセル

横のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
横のサイズのみを指定することにより、縦は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size 256x label:penlabo.net text3.png

画像サイズ横基準画像

png画像、256×47ピクセル

縦のサイズを指定する

文字サイズは自動的に調整されますが、余白が出来ます。
縦のサイズのみを指定することにより、横は自動で調整されます。

convert -background white -fill blue 
	-font aquafont.ttf -size x64 label:penlabo.net text4.png

画像サイズ縦基準画像

png画像、336×64ピクセル

改行を含む文字描画する

文字列に「\n」を含めれば、改行コードも利用できます。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:penlabo\n.net text5.png

画像サイズ改行有り画像

png画像、113×67ピクセル

日本語を描画する

テキストファイルを指定すれば、日本語も画像に出来ます。
ただし、文字コードは「UTF-8」で保存する必要がありますが、BOMの有り無しは関係ないようです。
改行も有効なので、スクリプトから画像を作成する際には便利です。

convert -background white -fill blue 
	-font aquafont.ttf -pointsize 32 label:@text6.txt text6.png

画像サイズ縦基準画像

png画像、126×34ピクセル

画像の中の指定した場所に文字描画する

-annotate“オプションを利用することで、文字を自由に配置できますが、
画像のx座標と座標だけでは、思い通りになりません。
フォントの持つ特性を理解しなければならならず、ちょっとした工夫が必要となります。

とりあえず、何も考えずに座標(0,0)を指定してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+0 penlabo.net annotate1.png

座標0,0画像

png画像、256×64ピクセル

とても悲惨な画像が作成されました。
上部になにやら見えていますが、これでは何一つ判りません。
次は試しにy座標の値を、画像の高さと同じに変更してみましょう。

convert -size 256x64 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+64 penlabo.net annotate2.png
座標0,64画像

png画像、256×64ピクセル

今度は、どういう文字が書いてあるのかが判るようになりましたが、今度は下部が切れてしまいました。
2つの画像を見比べると、上下につなぎ合わせれば1つの画像になることが判ります。

座標0,0画像←画像2つ目
座標0,64画像←画像1つ目

-annotate“でy座標を指定するときには、フォントのベースラインを基準にしなければならないのです。
-font“、”-poinsize“を基準に求めたベースラインの座標を指定しなければ、思うように配置が出来ないのです。

いろいろ調べましたが、ベースラインの座標を求める方法が見つかりませんでした。
もし、ご存知の方がいらっしゃいましたら、ご教授をお願いいたします。
次の方法を取れば、画像を作ってはそのサイズを求め・・・といった肯定を省くことが出来ます。
ベースラインの座標を求めるには、文字を基準に画像を作成し、余白を除去する”-trim”オプションを追加します。

convert -font aquafont.ttf -pointsize 32 
	label:penlabo.net -trim info:

背景や文字の色は、指定しなくても問題ありません。
ファイル名を”info:”と指定することで、画像ファイルではなく画像情報が出力されます。

label:penlabo.net LABEL 173x27 176x34+1+5 DirectClass 8-bit

この場合は27ピクセルとわかりました。

convert -size 256x34 xc:white -fill blue 
	-font aquafont.ttf -pointsize 32 
	-annotate +0+27 penlabo.net annotate3.png

これで、座標を指定して思い通りの場所に文字描画することができるようになりました。

更新履歴

2007-06-02
公開