ZendFrameworkでメールを送ってみた

こんにちは、山本です。

ZendFramework 1.0.1 を実験してみました。

なかなか柔軟性が高く、既存のプロジェクトに追加して使う場合でも、導入のハードルは低そうです。

さて、今回メールを送るプログラムを書いてみたのですが、日本語を送る場合には、文字コード指定がやはり必要でした。
備忘録として書いておきます。

$mail = new Zend_Mail(‘ISO-2022-JP’);
$mail->setBodyText(mb_convert_encoding(‘本文だ’, ‘ISO-2022-jp’, ‘UTF-8′));
$mail->setFrom(‘from@example.com’);
$mail->addTo(‘to@example.com’);
$mail->setSubject(mb_convert_encoding(‘見出しだ’, ‘ISO-2022-jp’, ‘UTF-8′));
$mail->send();

ポイントは、Zend_Mail のインスタンスを生成する際に、文字コードを文字列として渡してあげること、本文やサブジェクトをエンコードして渡してあげること、の2点のようです。

このサンプルは UTF-8 で保存したものです。

山本 悟

Delphi for PHPで MySQL を使う際の言語設定について

こんにちは、山本です。

CodeGear の製品である Delphi for PHP Update 1 を利用して、MySQL と連携したアプリケーションを作成する場合、問題となるのが文字コードです。

通常は次の様に接続すると思います。

Database1 の諸設定
Table1->Database = Database1
Datasource1->Dataset = Table1
DBGrid1->Datasource = Datasource1

しかし、この状態では、例え MySQL の言語設定が UTF-8 であったとしても、画面上の文字は化けてしまいます。デフォルトの文字コードが利用されてしまうからのようです。

これを解決するには、MySQL に対して利用する文字コードを指定すれば良いでしょう。
具体的には、Database1 の AfterConnect イベントで SQLを発行します。例を示します。

function Database1AfterConnect($sender, $params)
{
    $this->Database1->execute(‘SET NAMES utf8;’);
}

期待の大きい開発環境が故に、情報の少なさが残念です。
もっとメジャーになってもらいたいと本当に思います。

○確認した環境
Delphi for PHP Update 1
mysql  Ver 14.12 Distrib 5.0.41, for Win32 (ia32)

山本 悟

CGIでInternal Server Error、error.logにはPremature end of script headersが

こんにちは、山本です。 

つい先日、Perl を利用したシステムで、上記エラーが出ました。
さして古いサーバではなく、別サーバで動いているシステムを持ってきただけだったので、ある意味不思議でした。

とにかく原因を探るため、コンソール上で動くか(OK)、Perlへのパスは間違ってないか、改行コード・文字コードは問題ないか、アクセス権は問題ないか、同じディレクトリの他のCGIはどうか、などなど、一般的な問題探しを行ってみたのですが、全部問題ない動作です。

そもそも、別サーバでは動いているのですから、環境問題にある程度絞ってはみたものの、原因がわかりません。

その後Webで調べてみると、「#!/usr/bin/perl」の引数に「- -」を付ければ直ると書いてありました。
しかし、どうにも理由がハッキリしません。
ですが、動きます。

「- -」は Perl のスイッチをそれ以降オフにするオプションです。
ですので、後は想像になるのですが、Apache が CGI として Perl を呼び出す際、改行の認識の問題などで #! 以降までを引数として渡してしまい、Internal Server Error を起こしているのでは無いかと考えました。

ですので、「- -」を与えることで、最初の1行を本来の実行ファイルのパス指定のみになり、問題が解決されたと言えます。

しかし、実際のところはどうなんでしょうか。
知っている方がいらっしゃれば、是非お教えください。

 山本 悟

Apacheで .html ファイルを処理するプログラムを変更する

Web サイトのデザインをする上で、SEO などの話がよく出てきます。

もちろんやるに越したことはないのですが、一般的な検索ロボットは、プログラムの拡張子を軽視する様ですので、単純にプログラムで検索に適した情報を流すだけでは、効果が期待できないと言えます。

これは、Web サイトのトップページにプログラムで書き出したコンテンツを配置する場合などに、問題となります。

一つの解決策としては、プログラムで HTML ファイルを生成する方法です。
そうすれば、作成された HTML ファイルに対して検索ロボットは確認を行いますので、期待通り情報を収集してくれます。

しかし、反映がリアルタイムに行われないことや、システム的に考慮すべき点が増えるなど、万能の解決策ではありません。

 * 

そこで、今回のネタになります。
もちろんこちらも万能ではありませんが、上記の方法に比べてシステムを扱う方(主にお客さん)にも楽ですし、開発する側にとっても作りやすい方法です。

タイトルの内容の通りですが、以下に方法を簡単に示します。
前提条件としてApache の設定で、AllowOverride が All に設定されている必要があります。

○.htaccess を作成
.html を PHP で扱う場合であれば、.htaccess に次の1行を記述します。
AddType application/x-httpd-php .html

○サイトに .htaccess を配置
対象のディレクトリに配置しましょう。
下位ディレクトリは自動的に対象範囲となりますね。

以上で、Apache にリクエストが来たとき .html の拡張子であっても、PHP を呼び出す設定はおしまいです。
ただし、通常の HTML ファイルもすべて PHP が一度処理するため、アクセス負荷の高いサイトでは注意する必要があります

Excelのファイルがダブルクリックで開かない

そんな問い合わせを受けました。

電話で話をすると、「ファイル|開く」などは大丈夫なようですが、エクスプローラなどでダブルクリックしても、Excel は立ち上がるだけで画面は灰色のままとのことです。

OS 側の関連づけの問題かと思って確認したのですが、それも問題なし。
Word なども問題なく動作します。

なので、OS の Excel 呼び出しの問題ではなく、Excel 自身の問題と考えたところ、設定にありました。

設定方法をまとめておきます。

 ○Office 2007 の場合

  1. 「Officeメニュー|Excel のオプション」で「Excel のオプション」ダイアログを開く
  2. 「詳細設定」の「全般」項目にある、「Dynamic Data Exchange (DDE) を使用する他のアプリケーションを無視する」のチェックを外す

○Office 2003 の場合

  1. 「ツール|オプション」で「オプション」ダイアログを開く
  2. 「全般」タブにある、「他のアプリケーションを無視する」のチェックを外す

でも、なんでこの設定が変更されてしまったのかは、謎のままです。

Windowsの環境情報を取得する

仕事の絡みで Windows を取得する方法を検討していました。
プログラムで取得するなど様々な方法がありますが、結局次の方法に落ち着きました。

●GUI の場合
msinfo32.exe で情報を作成し、nfo 形式で保存する。

●CUIの場合
systeminfo で情報を作成し、ファイルへリダイレクトする。

例) >systeminfo /FO CSV > test.csv

Virtual PC 2007に Fedora Core 6 をインストールする 2

yum-updatesd が動いていると、手動で更新できないことがあります。
同じ DB 見ているのでしょうがないですね。 とりあえず、

service yum-updatesd stop

でサービスを止め、手動でアップデートをしていきました。

そして yum でアップデートしまくっていたら、いきなりマウスが動かなくなりました。
カーネルのバージョンがあがったのが原因のようです。

とりあえず、キーボードは効くので ALT+F1 でメニューを出し、再起動をする。
GRUB の boot オプションで、i8042.noloop clock=pit を指定して動作することを確認。
起動後に、/etc/grub.conf にオプションを指定し、事なきを得ました。

Vistaで telnet を使う

XP まではコマンドプロンプトから telnet と打てば、すぐに利用できた telnet ですが、Vista では規定では利用できません。

コントロールパネルにある「Windows の機能の有効化または無効化」で、telnet を有効化する必要があります。

Delphiでマルチディスプレイ環境のチェック

Screen.MonitorCount で接続されているディスプレイの個数がチェックできる。

.MonitorNum で、どのディスプレイにウィンドウがあるかをチェックできる。

PtInRect(Screen.Monitors[0].WorkareaRect, Point(Self.Left, Self.Top)) みたいな感じで、指定したディスプレイの範囲にウィンドウがかぶっているかをチェックできる。

 実行時にフォームを移動するには、.Top と .Left を設定すればOK。
Primary ディスプレイの左上を基準(0, 0)に、位置が指定されているため。

あなたの IT の疑問・不安をすべて解決するコンシェルジュ サービス