カテゴリー別アーカイブ: プログラムとか

Subversionでコミット時にメール送信する

Subversionでコミットの際にメールを送信するようにした時の備忘録。

前提として、メール送信には「commit-email-jp-CentOS5.pl」を使う。

上記に関してはググると出てくるので、ダウンロードして

/usr/share/doc/subversion-1.6.11/tools/hook-scripts/

に設置。

Commitした際の処理をhookしてメール送信するので、対象リポジトリのhooksディレクトリの中の以下ファイルをリネーム。

post-commit.tmpl → post-commit

んで、中を見てみると mailer.py を使う用になっているので、以下のように修正

#mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

export PATH=/usr/share/doc/subversion-1.6.11/tools/hook-scripts/:$PATH
commit-email-jp-CentOS5.pl "$REPOS" "$REV" --from [メールのFROMアドレス] -s '[メールのSUBJECT]' [メールのTOアドレス]

このままでもいいんだけど、どうもメールのDateヘッダがおかしくなるので「commit-email-jp-CentOS5.pl」を修正。

以下をヘッダ部に追加。

use POSIX qw(setlocale LC_ALL);

560行目あたりでDateヘッダの処理をしているので、取りあえずそのあたりをコメント。

#$formatted_date = strftime('%a %b %e %X %Y', localtime()); #これでは日本語文字列が出てきて妙なことになる
#chomp($formatted_date = `date`);
#$formatted_date = strftime('%a, %d %b %Y %X %z' , localtime());
#push(@head, "From $mail_from $formatted_date\n");
#chomp($formatted_date = `date`);
## Dateヘッダはsendmail(sendmane)に任せるので一時コメントアウト。
##
##push(@head, "Date: $formatted_date\n");
#my $ltime = "";
#my $wday = "";
#my $mon = "";
#my $day = "";
#my $time = "";
#my $year = "";
#$ltime = localtime;
#($wday, $mon, $day, $time, $year) = split(/ /, $ltime);
#
#formatted_date = sprintf("%s, %2d %s %s %s +0900", $wday, $day, $mon, $year, $time);

んで、

push(@head, "Date: $formatted_date\n");

の直前で以下を追加。

setlocale( LC_ALL, "C" );
$formatted_date = strftime('%a, %d %b %Y %X %z' , localtime());

これでメールヘッダがちゃんと出力されるようになった。

ソース内の作者さんのコメントに
「これでは日本語文字列が出てきて妙なことになる」
って書いてあるけど、setlocale()やってあげれば大丈夫。

あとは$formatted_dateをRFC822に合うようにフォーマットを直してあげればOK。

DateTimeを使ってメールヘッダ用の日付を出力出来るけど、それまでに色々ライブラリ入れる必要があって、それがかなり面倒。
最初からDateTimeの環境があるなら、それが一番スマートだけど。

では。

PHPでのバイト数の取得方法について

久々の更新でございます。

画面から入力された文字列のバイト数をPHPで取得する際にハマったので。

調べてみると、まず最初に目に付くのは「strlen()を使え」と。

しかしながら、環境によっては「strlen()がmb_strlen()にオーバーライドされる」との事。

で、下記のようにすれば取得出来ます、とのエントリを見つけたのでやってみたのですが・・・

$str_length = strlen(bin2hex($data)) / 2;

結果、ダメでした。
検証環境のサーバ設定にもよるのかもだけど、下記のようにバイト数が返却されるので、全角半角が混ざった文字列の場合、正確にバイト数が取得出来なかったのです。

1バイト(半角文字):2バイトの16進数で返却される
2バイト(全角文字):6バイトの16進数で返却される

結局、下記のように1文字ずつ調べて、というベタベタな感じに。

$str_length = 0;
for($i=0;$i<mb_strlen($data);$i++) {
  if(strlen(bin2hex(mb_substr($data, $i, 1))) == 6) {
    $str_length = $str_length + 2;
  } else {
    $str_length = $str_length + 1;
  }
}

もっとうまいやり方はあるんだろうけど、時間も無かったし。。

いずれ修正しよう。

CodeIgniter 2.0.2 + Oracle 10.2.0.3 の接続について

あまり日本語のエントリが無かったので、ちょっと書いてみる。
PHP+Oracleの環境については、手前味噌ですがこちらの記事を参照。
CodeIgniterの環境設定については、ユーザガイドを参照。

動作検証を実施したサーバ環境は、以下。
・CentOS 4.8
・Oracle 10.2.0.3
・Oracle Instant Client 11.0.2
・PHP 5.3.2
・CodeIgniter 2.0.2

設定したコンフィグの内容は以下。
application/config/database.php


$db[‘default’][‘hostname’] = ‘//DB_SERVER_IP:PORT/SID‘;
$db[‘default’][‘username’] = ‘USER_ID‘;
$db[‘default’][‘password’] = ‘PASSWORD‘;
$db[‘default’][‘database’] = ‘DATABASE_NAME‘;
$db[‘default’][‘dbdriver’] = ‘oci8’; ← コレ。「OCI8」のドライバを指定する
$db[‘default’][‘dbprefix’] = ”;
$db[‘default’][‘pconnect’] = TRUE;
$db[‘default’][‘db_debug’] = TRUE;
$db[‘default’][‘cache_on’] = FALSE;
$db[‘default’][‘cachedir’] = ”;
$db[‘default’][‘char_set’] = ‘utf8’;
$db[‘default’][‘dbcollat’] = ‘utf8_general_ci’;
$db[‘default’][‘swap_pre’] = ”;
$db[‘default’][‘autoinit’] = TRUE;
$db[‘default’][‘stricton’] = FALSE;


こんな感じで。

これであとはModel作ってSQL発行すればOK。
ActiveRecordでも問題無し。
簡単でした。

ちなみに、Oracleでシーケンスを取得するのにはこんな感じで。

function get_seq() {
  $this->db->SELECT(‘SEQUENCE_NAME.nextval as nextval’,FALSE)->FROM(‘dual’);
  $query = $this->db->get();
  return $query->result();
}

SELECT に 「FALSE」付けてあげないと、うまく取得出来ないです。
※勝手に「”」「’」とか付けちゃうので

では。

OpenPNE3系で画像アップロード出来ない現象の回避方法

先日、OpenPNEで構築されているサイトのサーバ移行があり、作業を実施したところ、画像のアップロードが出来ない状態となりました。

諸々の情報は以下。

・OpenPNE 3.0.2

・Apache 2.2.3

・PHP 5.3.1

・MySQL 5.1.41

プロフィール編集画面で画像をアップロードしようとしたところ、

ファイル形式が間違っています (image/jpeg; charset=binary)

の表示が。

画面の注記には、

300KB以内のGIF・JPEG・PNGにしてください

と書いてありますが、JPEGファイルだし、10K程度だし。

・画像サイズとファイルタイプの再確認

・GDライブラリがインストールされている事を確認

・MySQLの設定確認

 → max_allowed_packetやら・・・

・php.iniの設定確認

 → upload_max_filesizeやら、file_uploadsやら、upload_tmp_dirやら、memory_limitやら・・・

・mysql のログ

・apache のログ

・PHP のログ

などなどなどなど・・・

全て問題なし。

でもって、まだまだ調査継続。

結果、PHPのバージョンとsymfonyのバージョンの絡みがダメだったようで。

参考:http://trac.symfony-project.org/changeset/20296

symfony 1.2.7 で動かしていたのですが、PHP 5.3系では、うまく動かない部分があるようで。

上記URLに記載されている通りに修正して、対応。

障害解消。

ちなみに、現在の段階で最新の symfony 1.2.9 では起こらない問題のようです。

でわ。

PHPで「It is not safe to rely on the system’s timezone settings.」

運用しているサイトのログを確認したところ、大量にWarningのログが・・・

確認したところ、以下ログでした。

PHP Warning:  date() It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in ********.php on line 112

調査したところ、デフォルトのタイムゾーンを設定していない事が原因のようです。

PHP 5.1.x系から、このログが出力されるようになったようで。

回避方法は、

1) date_default_timezone_set(‘Asia/Tokyo’);

2) php.ini に設定する → 「date.timezone = “Asia/Tokyo”」

のどちらかのようで。

とりあえず、php.ini に設定書いて終了。

でわ。

document.form.submit is not a function の原因は・・・

Javascriptにて、formをsubmitしようとしたところ、

document.form.submit is not a function

のエラーが出て、submit出来ませんでした。

調査したところ、submitしようとしているform内に、

<input type="submit" name="submit" value="送信">

のように、「name=”submit”」があると、ダメみたいですわ。

なので、

<input type="submit" name="submit_btn" value="送信">

に変更して解決。

30分くらいはまってた。。。

でわ。

PHPでのファイルアップロードについて

久々に。

phpMyAdminやPHPを利用したサイトなどでファイルアップロードをする際、

php.ini

の設定を確認する必要があります。

設定を確認する部分は以下3つ。

・upload_max_filesize

・memory_limit

・post_max_size

■ upload_max_filesize

実際にアップロードするファイルの容量制限の設定です。

この値より大きなファイルサイズのファイルはアップロード出来ません。

■ memory_limit

PHPで使用するメモリの設定です。

upload_max_filesize より、大きな値を設定する必要があります。

■ post_max_size

POST出来る最大サイズの設定です。

upload_max_filesize より、大きな値を設定する必要があります。

もし、PHPでのファイルアップロードでエラーが発生したら、上記設定の確認をしてみてください。

上記設定を変更してもダメな場合、

/etc/httpd/conf.d/php.conf

の設定変更が必要な場合があります。

※Red Hat Enterprise Linux の場合

<Files *.php>

SetOutputFilter PHP

SetInputFilter PHP

LimitRequestBody 524288

</Files>

LimitRequestBody の値を変更すればOKです。

でわ。

twitterはじめました

id:smegheadさんの勧めで、twitter はじめました。

http://twitter.com/momiage3dau/

まだなんとなく使ってる感じだけど、bot 作れるんだね。

数年前から延ばし延ばしにしてきたPythonの勉強ですが、そろそろ本当にやらないと、と。

って事で、twitter の bot を Python で作ってみようかな、と。

今月は仕事が忙しいから、Python の基本的な部分の勉強やって、年末の休みに bot を作る感じで。

でわ。

java.sql.SQLException: Communication link failure: java.io.IOException

このエラーが取れない。

Oct 28, 2009 9:32:42 AM org.apache.jk.server.JkCoyoteHandler action
INFO: RESET
java.sql.SQLException: Communication link failure: java.io.IOException
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1604)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:886)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:945)
at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:917)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1841)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1775)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1220)
(snip)

発生するトリガーも不明。

Tomcat動かして、2,3日すると発生する模様。

う~ん・・・

頑張って調べよう。

でわ。

OpenLaszloをいぢりたい

掲題の通りです。

OpenLaszloとか何か?

laszlo.jpによれば、

オープンソースソフトウェア(OSS)です。誰でも無料で使うことができます。

OpenLaszloはRIAをブラウザ上で実現します。

OpenLaszloで作成したRIAアプリケーションはFlashかDHTMLとして動作します。(マルチランタイム機能)

開発者はXMLとJavaScriptからなる独自のオブジェクト指向言語LZXでコードを記述します。

簡単なFlashムービーはもちろん、DBと連携した業務アプリを作ることができます。

百聞は一見に如かず。OpenLaszloでどんなのが作れるか、英語サイトですがデモをご覧ください。

OpenLaszloはJavaサーブレットなので、開発時にはJDK、TOMCAT等が必要です。

との事。

要は、XML+JavaScriptからなる、LZXでコードを書けば、swf/DHTMLにしてくれるので、RIAできますよって事ですね。

OpenLaszlo自体はServletらしいので、Tomcatが入っていれば動く模様。

Javaで構築された既存の業務システムに、Flashの上物を被せるのにいいかもしれません。

FlashとDBとのやりとりは、Flash → Servlet → DB → Servlet → Flash の流れが一般的。

Servlet → Flash は、XMLで返すもしくは、SOAP通信かな?

結構面倒だったりします。

システム自体を入れ替えるのではなく、RIA化する事が重要かと思うので、OpenLaszloをやってみたい感じです。

年末にでも検証しようかな。

でわ。