PHP:PHPListをCORESERVERで動かす

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

メルマガをWordPressでできないか?ということについて、以前に調査していたのだが、やりたいことに該当する方法ではなかったので、オープンソースのメルマガ発行ソフトのPHPListを使うことにしようかと思って調査したのでメモ。ちなみにWordPressとPHPListを繋ぐPHPList Form Integrationというプラグインがあるのでこれを使う予定。

参考にさせていただいたサイト

ではいきまーす。

  1. まずはここからPHPListの日本語化されたものをダウンロード。
    http://www.d-ip.jp/download/pivot/entry.php?id=14
  2. ダウンロードしたファイルを解凍し、public_html直下にあるlistsディレクトリをWordPressと同じディレクトリに入れる。
  3. lists/config/config.phpを修正する。インストールするデータベース名、データベースユーザ名、パスワードなどを修正。ここはWordPressと同じものでOK!!あとPLUGIN_ROOT_DIRが原因でエラーが出てたので、コメントアウトしておいた(この辺りはよくわかってない)。TESTの値も0にしておく(そうしないとメール送れないので。後で0にしてもよい。)
  4. PHPがsafe modeで動いてると問題があるかもね!というメッセージが出続けるので、CGIモードで動かすために、lists/admin/.htaccessに以下を追加する。
    AddHandler application/x-httpd-phpcgi .php
  5. CGIモードで動くとphp.iniの情報が変わってしまうので、独自に設定するためにlists/admin/以下にphp.iniを作成する。
    magic_quotes_gpc              = On
    register_globals              = Off
    session.auto_start            = Off
    mbstring.http_input           = pass
    mbstring.http_output          = pass
    mbstring.encoding_translation = Off
    # /tmp以下にセッションファイルが作れないというエラーが出たので、
    # 自分のディレクトリ直下にtmpを生成しておくこと
    session.save_path = "/virtual/********/tmp"
    
  6. http://自分のWordPressのドメイン/lists/admin/にアクセスし、PHPListをインストールする。
  7. 管理者のパスワードを変えておく。
  8. インストールが問題なく終わったら、サンプルでインストールされているリスト(メルマガのこと)をアクティブにしておく(WordPressのプラグイン経由でPHPListを使うため)。
  9. CORESERVERのcronを使ってメルマガ配信するために、シェルスクリプトを作成する。名前はphplist.shとした。
    #!/bin/sh
    wget -q -O - 'http://自分のWordPressのドメイン/lists/admin/index.php?page=processqueue&login=管理者名&password=パスワード' >/dev/null
    

    このファイルは/virtual/********/phplist.shに置いた。実行権限を与えておくこと(705)。

  10. CORESERVERのcronに/virtual/********/phplist.shを登録する。
    普通のサーバのcronならば、

    */15 * * * * /virtual/********/phplist.sh
    

    でよいと思うのだが、CORESERVERでは分に入力できる文字列が2文字までみたいなので、*/15と入力できなかった!やっていいのかどうかはわからないが、4行分使って、

    0 * * * *  /virtual/********/phplist.sh
    15 * * * *  /virtual/********/phplist.sh
    30 * * * *  /virtual/********/phplist.sh
    45 * * * *  /virtual/********/phplist.sh
    

    と設定しておいた。
    これで15分毎にチェックされ、キューに入っているメルマガが15分毎に配信されるはず。

さっきまで試していたことなので、だいたい合っているはず。

WordPressのプラグインであるPHPList Form Integration
の設定については後でまた書きたいと思う。


PHP:MBFpdfでバグ!!["]が出力できない

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

MBFpdfでバグを発見した!!バージョンは1.0b。
["](ダブルクォーテーション)が出力できないというものだ。

$l+=$ascii ? $cw[$c] : $hwkana ? 500 : 1000;

上のソースの$cw[$c]の$cにダブルクォーテーションが入ってるのだが、
undefined index ” と言われてしまう…。
そこで、$cwをprint_rで表示してみたら、
array(…,[\"] => 500, …);
という記述を発見。ダブルクォーテーションあるけれど、バックスラッシュでエスケープされてるじゃないか!?まあこれが正しいと仮定した場合、$cw["]は定義されていないわけだから、$cが["]の場合、$c = ‘\”‘;にしてしまえばいいんじゃないかと思ったので、mbfpdf.phpに手を入れることを決意!!

MBMultiCellメソッドを修正。

//Get next character
$c=$s[$i];
// 以下3行を追加
if($c === '"'){
	$c = '\"';
}

その後、MBWriteメソッドを修正。
行番号は、上記の作業後なので、この付近と思ってください。

//Get next character
$c=$s[$i];
// 以下3行を追加
if($c === '"'){
	$c = '\"';
}

こうしたところ、ダブルクォーテーションがPDFファイルに出力できた。


やりたいことのリストラを行おう

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

最近、なんだか意味なく気持ちが焦ってしまい、逆に何事にも手を付けられずにいるなぁと思う。焦っても仕方がない。まぁ、それは十分わかっているのだけれど、なんだろう、周りがどんどん結婚していったり、同世代の人の転職話を聞いたりするからだろうか。自分は今のままでいいのか?と自問自答する。やっぱり『やりがい』を求めているからこそ、こういうことを感じるんだと思う。

技術を追い求めなければならないという強迫観念にかられてしまっている気がする。IT業界は流れが速いので、余計にそう思うのかもしれない。反面、自分が使うような技術でないことまで追いかけてしまったり、流行に惑わされてしまうというのは、学習の分散が起こってしまい、これがストレスになっているのかなぁと最近は思う。どれも面白そうであり、やってみたいが、時間と体力とリソース(マシンと金)には限界があるので、工夫をしながらやってみないといかん。

特に、時間。考える時間は大事なのに、考え過ぎて行動できていないということでは、単なる時間の浪費だ。考えた結果、やらないということだったらそれでもいいが、何度も蒸し返してしまわないようにしたい。蒸し返していいのは時間があまってるときだけ。24時間という限られたリソースをリストラしていきたい。

最近は物事に優先順位をつけられてないなぁと思った。
優先順位をつけて行動していこうと思う。


JavaScript:parseInt(”08″)の罠

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

JavaScriptの関数parseIntには、罠が仕掛けられていた。
具体的には、”08″, “09″のような値に対して処理を行うと8進数として捉えてしまうというものだ。
その結果、文字列08, 09はparseIntすると0が返ってきた。

なので、10進数で処理させるためには第二引数で10を指定する必要がある。

// 例 1桁の場合
var a1 = parseInt("8"); // a1 = 8
var b1 = parseInt("8", 10); // b1 = 8

// 例 2桁の場合
var a2 = parseInt("08"); // a2 = 0
var b2 = parseInt("08", 10); // b2 = 8

先頭に0が付くときにしか顕在化しないので、なかなか気付かないものだ。


XenServer: Mondo Rescueでp2vにはintel-VT必須?

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

会社のサーバで仮想環境の構築をXenServerを使ってやっているのだけれど、物理サーバを仮想サーバに変換するためにMondo Rescueを使って移行しようとしたら、エラーが出た。

XenServer – HVM is required for this operation

Citrix XenServer/エラー「XenServer – HVM is required for this operation」によると、intel-VTがないから無理っぽいようなエラーらしい。

今回使おうとしていたサーバはDELL PowerEdge SC440で、CPUがPentium E2180という、デュアルコアだけどVTをサポートしていないタイプのCPUだったので、どうも無理っぽい。1年以上前の格安サーバだから仕方ないか。メモリだけは潤沢に8GBも積んだのだが。VTないのでできないと報告したら、ひょっとしたらCeleron E3200を買ってもらえるかもしれないことに。というか、やろうとしていることがVTいるんだから、買ってもらえないと前に進めないよ!


PHP:PECL::ssh2のインストール

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

PHPでssh2を使う必要が出てきた。
方法としては、PECL::ssh2をインストールしておけばよいらしい。
依存ライブラリとして、libssh2が必要なので、yumにてlibssh2をインストールしておく。
libssh2-develはいらないかもしれない。

yum -y install libssh2 libssh2-devel

その後、peclコマンドでssh2拡張をインストールする。

pecl install ssh2
downloading ssh2-0.11.0.tgz ...
Starting to download ssh2-0.11.0.tgz (22,884 bytes)
........done: 22,884 bytes
5 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
 1. libssh2 prefix? : /usr

1-1, 'all', 'abort', or Enter to continue: all # libssh2.soへのprefixが/usrではない場合、修正
libssh2 prefix? [/usr] : /usr/lib
 1. libssh2 prefix? : /usr/lib
1-1, 'all', 'abort', or Enter to continue: # 何も入力せずにenterを押す
# インストールが始まる
...
# インストール完了通知
Build process completed successfully
Installing '/usr/lib/php/modules/ssh2.so'
install ok: channel://pear.php.net/ssh2-0.11.0

ssh2.soがインストールされたので、権限を変更する

chmod 755 /usr/lib/php/modules/ssh2.so

php.iniを修正してextensionを組み込む。自分の環境では、extensionの組み込みが外部ファイル化してあったので、そちらを修正する。gd.iniとかをコピーしてssh2.iniを作り、それを修正した。その後は、apacheの再起動を行う。

cd /etc/php.d
cp gd.ini ssh2.ini
vi ssh2.ini
# gdをssh2に変更
extension=gd.so
↓
extension=ssh2.so
# 編集終了

# apacheの再起動
service httpd restart

これで、phpinfo()を確認したところ、ssh2が組み込まれていたのでOK!!


firebug: consoleがundefinedの場合

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

昨日書いたfirebugでのconsoleオブジェクトを使ったデバッグ方法ですが、firefoxにfirebugが入ってなかったり、IEだとconsoleオブジェクトが存在しないため、JavaScriptエラーになって処理が止まってしまいました…。なんちゅうことだ…。

このままだと、firebugがある場合だけ正常な動作をするアプリになってしまう!リリースするタイミングでconsole系のメソッド使ってるところを全部コメントアウトすればよいのかもしれないけれど、それはそれで面倒だし、なによりまたデバッグが必要になったときに困る!

解決策はないかな~とネットで探してみたら、まあ自分が考えていたような解決策とほぼ一致したので、じゃあそれでやってみるかと。

// consoleオブジェクトが未定義ならば
if(typeof console == 'undefined'){
  // 何も処理しないメソッドを持ったconsoleオブジェクトを定義する
  console = {
    log: function(){},
    debug: function(){},
    info: function(){},
    warn: function(){},
    error: function(){},
    assert: function(){}
  };
}

consoleオブジェクトが持つメソッドはこれらだけではないのだけれど、自分が使ってるメソッドだけとりあえず定義しておけば大丈夫なんじゃなかろうか?
とりあえずはこれでJavaScriptエラーで止まるということはなくなった。


WordPress: メルマガ用プラグイン調査メモ

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

仕事の関係で、メルマガを発行する方法を調査する必要が出てきた。
それをWordPressのプラグインで行う方法を調査中。
調査結果などをチョコチョコとメモしていく。

subscribe2というプラグインを使うのがよさそう。
というか、会社の他の人からこれはどうだろう?と言われたので、調査することになったんだけど。動作の検証環境として、自社の開発サーバのWordPressにsubscribe2を突っ込んでみたが、動かず。
原因は、WordPressをインストールしているサーバにメールサーバを立ててないから。普通はメールサーバも入ってるレンタルサーバとかにWordPressをインストールするだろうから、あまり問題にならないケースではあるが、うちらの開発環境としては問題有りだと。
cform2の場合は、環境設定でSMTPサーバを使うように設定できたのでよかったのだが、どうもsubscribe2はできなさそう。それを補完するプラグインが、WP Mail SMTP。このプラグインを使うと、WordPressから送るメールを全てSMTPサーバ経由に設定できるみたいですな。

subscribe2は、基本的には投稿があったときにメルマガユーザに投稿が合った旨を通知するのがメイン機能のプラグイン。一応メルマガの真似事はできるのだが、メルマガの過去ログが残らない。運用で、カテゴリにメルマガというのを作ってメルマガはそのカテゴリの投稿のみ送られるようにするという方法もあり得るとは思うが、多少面倒に感じる。テンプレートいじらないとダメだし。まあ楽なもんかもしれんけど…。

それをメルマガの真似事の機能を使って、WP Mail SMTPプラグインを使ってGmail経由で送ると、送信済みメールとしてメルマガの過去ログを残せるという副次的な効果があるようだ。Gmailのアカウントを取らないといけないが、これはこれで使えるノウハウだなと思った。

ひとまず、調査報告終了です。


javascript: firebugの使い方 tips

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

JavaScriptの開発で必須であるFirebugですが、自分は使いこなせてなかったことを痛感しました…。AJAXの通信を見張るのと、DOM要素のCSSチェックとかに使ってたので、これで使いこなせてると思ってたけど、console.logとかあったんやなぁ~。consoleオブジェクトの素晴らしさを知ったら、alertとか使わんで済むから助かる~!!

// ログを出すのみ
console.log("test");

// sprintfのように置換して出力もできる!
console.log("Hello, %s", "patorash"); // Hello, patorash

// 以降は、ログを出し、ソースへのリンクも貼る
console.debug("test");
// infoマーク付き
console.info("test");
// warnマーク付き
console.warn("test");
// error扱い
console.error("test");

// 条件に合致しない場合だけコンソールログ出力(unittestに使える?)
var test = "test";
console.assert(test == "hoge", "test != 'test'ではない", test);

まだまだ色々できるみたいだけれど、自分が使いそうなのはこれくらいかな。

自分が最も使いそうな使い方。(prototype.jsで)

var ary = $w('php javascript css ruby java');
console.debug(Object.inspect(ary));

mixiアプリ:永続化したJSONデータの取得

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

趣味でmixiアプリの開発を始めてる。mixiアプリで値の永続的に使用するには、外部サーバに値を保存する方法と、mixiのkey-valueストアを利用する方法がある。今回は処理が軽くて通信も少なくて済みそうなkey-valueストアに値を保存する方法を選んだのだが、key-valueストアはいわゆるデータベースではないのでどういう形式で値を持たせるかで悩んだ。今回はJSONで保存してみた。

ところが、いざ値を取得してみると、JSONからオブジェクトに戻すことができなかった!

これはどういうことだ!?と、思って先日楽天ブックスから届いたOpenSocial入門を読んで調べていると、永続化されたJSONデータをそのまま取得するとHTMLエスケープされているらしい。これでは使いにくいので、HTMLエスケープしないように明示してデータを取得させに行く必要がある。

// 現在の設定を取得する
var req = opensocial.newDataRequest();
var mySetting = {};
var escapeParams = {};
// ここで、JSONデータをHTMLエスケープしないように指示
escapeParams[opensocial.DataRequest.DataRequestFields.ESCAPE_TYPE] = opensocial.EscapeType.NONE;
req.add(req.newFetchPersonAppDataRequest("VIEWER", ["setting"], escapeParams), 'selfData');
req.send(function(data){
	if(data.hadError()){
		// エラー処理
		var msg = data.getErrorMessage();
		return;
	}else{
		var selfData = data.get('selfData');
		if(selfData.hadError()){
			return;
		}
		var dataAry = selfData.getData()[viewer_id];
		if(dataAry != null){
			// 値が設定済み
			mySetting = gadgets.json.parse(dataAry['setting']);
		}
	}
}

上記のようにしたところ、JSONデータをオブジェクトとして取得することができた。JSONは便利だけれど危険もあるので、HTMLエスケープが自動的に行われるのはいいと思うけれど、OpenSocialアプリ開発を始めたばかりだとはまってしまいそうだったのでメモメモ。

OpenSocial入門 ~ソーシャルアプリケーションの実践開発
OpenSocial入門 ~ソーシャルアプリケーションの実践開発
技術評論社 2009-01-24
売り上げランキング : 8425

おすすめ平均 star
star内容の濃い良書

Amazonで詳しく見る by G-Tools