2008 10 月 | 英太郎の鯖缶

アーカイブ: 2008年10月

Zend_Mailで文字化けするので、ラッパーを作ってみた。

2008年10月28日

最近Zend Frameworkを使用してプログラム中なんですが、メール送信で文字化けしちゃうので、ラッパーを軽く作ってみました。
文字コードをISO-2022-JP指定時に勝手にエンコード変更する形です。
※多言語管理するなら、呼び出し側での切り替えの仕組みちょっと考えないといけません:-(

<?php
/**
* Chaos-Portal-Project
*
* @category   Chaos
* @package    Chaos_Mail
* @copyright  2008 CPMSTAFF
* @author     eitaro
* @version    1.0.0
* @since      File available since Release 1.0.0
*/

// ロードクラス指定
Zend_Loader::loadClass('Zend_Mail');

class Chaos_Mail extends Zend_Mail
{
/**
* Constructor
*
* @return void
*/
public function __construct($charset)
{
parent::__construct($charset);
}

/**
* Sets the text body for the message.
*
* @param  string $txt
* @param  string $charset
* @param  string $encoding
* @return Zend_Mail Provides fluent interface
*/
public function setBodyText($txt, $charset = null, $encoding = Zend_Mime::ENCODING_QUOTEDPRINTABLE)
{
if ('ISO-2022-JP' == $this->_charset) {
$txt = mb_convert_encoding($txt, 'ISO-2022-JP', mb_detect_encoding($txt));
}
return parent::setBodyText($txt , $charset , $encoding);
}

/**
* Sets the subject of the message
*
* @param   string    $subject
* @return  Zend_Mail Provides fluent interface
*/
public function setSubject($txt)
{
if ('ISO-2022-JP' == $this->_charset) {
$txt = mb_convert_encoding($txt, 'ISO-2022-JP', mb_detect_encoding($txt));
}
return parent::setSubject($txt);
}

/**
* Sets From-header and sender of the message
*
* @param  string    $email
* @param  string    $name
* @return Zend_Mail Provides fluent interface
*/
public function setFrom($email, $name = '')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::setFrom($email, $name);
}

/**
* Adds To-header and recipient
*
* @param  string $email
* @param  string $name
* @return Zend_Mail Provides fluent interface
*/
public function addTo($email, $name = '')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::addTo($email, $name);
}

/**
* Adds Cc-header and recipient
*
* @param  string    $email
* @param  string    $name
* @return Zend_Mail Provides fluent interface
*/
public function addCc($email, $name='')
{
if ('ISO-2022-JP' == $this->_charset) {
$name = mb_convert_encoding($name, 'ISO-2022-JP', mb_detect_encoding($name));
}
return parent::addCc($email, $name);
}
}

呼び出すとき、

$mail = new Chaos_Mail(’ISO-2022-JP’);

とするだけ、後はオリジナルと同じ形で扱えるはずです。

XenのDomUのドライブ復旧

2008年10月21日

Xenで運用しているDomUのドライブがエラーを吐いていたので、復旧作業のメモ

※DomUのドライブをマウントするにあたり、LVMのVGがかぶって無いことを前提に話を進めます。もしVGネームがかぶっているところで作業すると大変なことになりますので、ご注意ください。(責任はとれません)

  • まず対象のDomUを終了させます。
  • 作業用DomU(Dom0でもVGネームがかぶっていなければOK)上で、対象のドライブを読める状態にします。
  • ループバックデバイスの設定をします。
  • # losetup -f
    /dev/loop0

  • 上記ループバックデバイスにドライブを割り当てます。
  • # losetup /dev/loop0 /driveimage/imagename.img

  • kpartx で認識させます。
  • # kpartx -a /dev/loop0

  • VG、LVを確認します。
  • # vgscan
    Reading all physical volumes. This may take a while…
    Found volume group “VolGroup00″ using metadata type lvm2

    # lvscan
    inactive ‘/dev/VolGroup00/LogVol00′ [2.34 GB] inherit
    inactive ‘/dev/VolGroup00/LogVol01′ [544.00 MB] inherit

  • LVイメージを有効にします。
  • # lvchange -ay /dev/VolGroup00/LogVol00

  • LVイメージのジャーナリングを無効にします。(注意:通常のfsckが通らない場合だけにしましょう。)
  • # tune2fs -O^has_journal /dev/VolGroup00/LogVol00
    tune2fs 1.39 (29-May-2006)

  • fsckします。
  • # fsck -y /dev/VolGroup00/LogVol00
    fsck 1.39 (29-May-2006)
    e2fsck 1.39 (29-May-2006)
    /dev/VolGroup00/LogVol00 contains a file system with errors, check forced.
    Pass 1: Checking inodes, blocks, and sizes

  • ジャーナリングを有効に戻します。
  • # tune2fs -j /dev/VolGroup00/LogVol00
    tune2fs 1.39 (29-May-2006)
    Creating journal inode: done
    This filesystem will be automatically checked every -1 mounts or
    0 days, whichever comes first. Use tune2fs -c or -i to override.

  • ここまでうまくいけば、ドライブのデータがちゃんと読み書きできるはずです。mountなどで確認できます。
  • LVイメージを無効にします。
  • # lvchange -an /dev/VolGroup00/LogVol00

  • 有効にしたループバックイメージを開放します。
  • # kpartx -d /dev/loop0
    # losetup -d /dev/loop0

以上で作業は終了です。改めてDomUを起動させてみて、確認してみてください。

※DomUのドライブイメージはLVM上にEXT3ファイルシステムがある前提です。それ以外の場合は作業内容が変わりますので、注意してください。