phpで任意の日付、時間を取得する方法。

よく使う処理なのに、なんど使っても混乱してしまうのが、日付の処理。

備忘。

$timestamp = strtotime("-3 day"); // 三日前を指定
$myDate = date( "Y-m-d H:m:s", $timestamp );

↑↑↑

これで大抵いける。

zendでメールを受信して処理実行

Zendでメール受信をして、もろもろの処理をキックしようとしたときの調査メモ

基本、zend のmailさんがほとんどやってくれるんだけども、データの取り出し方とかで若干はまったので、要注意。

特に、エンコード関係はやっぱり鬼門だなぁ。

ヘッダのcontent-typeの中に、エンコードタイプがあるので、そこを正規表現できりとって、mb_convert_encodingで加工する。

これで、テキストメールは大丈夫なはず。

require_once ‘Mail/Storage/Pop3.php’;
$param = array(‘host’ => ‘server_name’,
‘user’ => ‘user’,
‘password’ => ‘pw’,
‘ssl’      => ‘ssl’);
//接続します
$mail = new Zend_Mail_Storage_Pop3($param);
foreach($mail->getUniqueId() as $uniqueId){
echo “<br />.<br />”.$uniqueId.”<br />”;
$message = $mail->getMessage($mail->getNumberByUniqueId($uniqueId));
//件名出してます
echo mb_convert_encoding(mb_decode_mimeheader($message->subject),”UTF-8″).”<br />”;
// echo ‘<pre>’;
$header=$message->getHeaders();
preg_match(“/charset=(.*)$/”,$header[“content-type”],$match);
print($match[“1″].”!!!!<br />”);
if($match[“1”]){
$encode=$match[“1”];
}else{
$encode=”ISO-2022-JP”;
}
echo “content is here>>>”.mb_convert_encoding($message->getContent(),”UTF-8″,$match[“1”]);
// echo ‘</pre>’;
foreach ($message->getHeaders() as $name => $value) {
if (is_string($value)) {
// echo “$name: $value<br />”;
continue;
}
foreach ($value as $entry) {
// echo “$name: $entry<br />”;
}

よし、うまくいった!

とおもいきや、HTMLメールのときにはうまく受信できていない。。

せいかくには、受信はできているんだけど、余計なものがいっぱいついていて加工がめんどくさい。

あきらめて、フォームつくってそこからやるようにしようかなぁ。

wordPress MUにて、投稿時に何かアクションをする場合

※たぶん、WordPress本家もほとんど同じと思われます。

WordPressMUを使っているときに、管理しているブログで投稿した記事の新着を表示する必要があったのですが、
複数のブログの新着をまとめて見る機能はついていないようなので、調べてみました。

方針としては、どのブログであろうと、投稿を行うときに、新着テーブルにインサートしてしまおうという方向です。

1.投稿しているプログラムを探す。

単純に、投稿している画面のHTMLを読んで、探しました。

結果、 wp-admin/includes/post.php で行っていることが判明。

この中の、function edit_post()で投稿(更新のときも)を行っています。

ためしに、関数の最後に、

foreach($_POST as $key=>$val){
$text.=$key.”:”.$val.”<br />”;
}
wp_die( $text.”<br / >id:”.$post_ID);

として確認。

投稿はしっかり反映されているものの、POSTの内容がしっかり表示されました。

2.投稿成功時のロジック追加

WPは投稿がうまくいかなかったら、上手にエラーでろじっくを止めてくれるので、関数の最後に、テーブルインサートの文を入れるだけで良さそうです。

wp_postsのような名前のテーブルから、IDをもとに検索した結果を、そのまま新規投稿保存テーブルに挿入します。

3.表示

あとは、新規投稿保存テーブルから、適宜ぬきだせばOK

意外と簡単でした。

Jsonの読み込み PEARやらZENDやら

ZENDで組んでいるシステムで、Jqueryを使ったUIを追加する仕事で、はまった。

PHP側からもJquery側からも読み込める形式でデータをテキストに落とし込むのに、JSONを使うことにしたんだけども、

これがPHP側からどうやっても読み込めない。

PEAR/JSONをつかっても、ZEND:JSONを使ってもだめ。

PHP5.2以降だと、json_decode()なる関数が使えるそうなんだけども、あいにく今使っているSixCoreじゃ、5.16しか使えない。

うーんとだいぶん唸っていました。

なかばやけで、文字コードをいじっていたら、あっさり解決。

結論から言うと、UTF-8N形式でJSONデータ保存しておかないといけないようです。

UTF8じゃないといけないとは書いてあったけども、、、UTF-8N(BOMなし)じゃないといけないだなんて。。

ちなみに、Jquery側からはUTF-8でも問題なし。

サンプルソースはこんな感じ。

require_once ‘Json.php’;  //ZENDにパスが通っているとして。
<$jsonText = file_get_contents("js/data.json"); $array=Zend_Json::decode($jsonText); print_r($array);

ついでに、JSONのサンプル

{

“item” : [

{

“name” : “エリア未選択”,

“amount” : “0”

},

{

“name” : “全国”,

“amount” : “35000”

}

]

}

以上

100万件規模のテーブル移行

データ量が多いと、PhpMyAdminでぽんっというわけにはいかなくなりますよね。テーブル移行。

インポートの時にエラーになってしまいます。

今回は、対象件数100万件程度のテーブルをmysql→mysqlに移行したので、記録。

基本的な流れは、phpMyAdminでエクスポート、それをbigdump.phpでアップロード。

1.エクスポート

まずは通常通り、phpMyAdminからエクスポート。このとき、gzip形式のDLにチェックボックスを入れておくと、容量を節約できる。

bigdump.phpは50MBまで(というか、サーバー側の制約)しかあげられないので、件数を調整して、50MB程度に収まるようにする。

全件いっきにやらない場合は、開始行と件数を調整。

2.bigdump.php取得

http://www.ozerov.de/bigdump.php

↑↑↑

ここから取得

3.ファイルの編集とアップロード

bigdump.phpに、アクセスするための情報、ホストやらDB名やらを記述。((37行目から)

$db_server   = ‘localhost’;
$db_name     = ”;
$db_username = ”;
$db_password = ”;
// Other settings (optional)

bigdump.phpと、さきほどエクスポートしたファイルを同フォルダにアップロード

4.実行

bigdump.phpにアクセスして、画面上からエクスポートファイル(SQLファイル)を選択すればOK

以上です。

意外に簡単に実行できました。

便利なモンです。

OPENPNEで、全員フレンド機能の実装

OPENPNEで、登録した会員は全員、お友達でいいよ!という場合に、ユーザ新規登録時に、フレンドリストを更新しちゃおうという機能。

企業SNSや、特定の目的のみのユーザでSNSを構築する場合、お友達機能は不要なことがあります。

全員、仲間でしょう!というとき。

そんな状況のために、全員をマイフレンドにする機能を実装したので、記録。

環境はOPENPNE3

1.お友達情報は、member_relationshipというテーブルに格納されている。

基本的に、このテーブルを更新するだけでOK。

id 登録順に連番
member_id_to 対象メンバーのID
member_id_from 主体メンバーのID
is_friend 友達かどうか
is_friend_pre 友達承認待ちかどうか
is_access_block アクセスブロックしているかどうか
created_at 作成日時
updated_at 更新日時

ソースは下記

$sql = “select id from `member` where is_active=’1′ and id!=’$myNumber'”;
$result = $db->queryAll($sql);
if (MDB2::isError( $result )) {
die($result->getMessage());
}
print_r($result);
$types = array(‘integer’,’integer’,’integer’, ‘text’, ‘text’);
$table=”member_relationship”;
$prepare=”INSERT INTO $table VALUES (:id, :name, :lang)”;
$sth = $db->prepare(
‘INSERT INTO ‘.$table.’ (
`member_id_to` ,
`member_id_from` ,
`is_friend` ,
`created_at` ,
`updated_at`
) VALUES (:to, :from, :is_friend,:create , :update)’, $types);
if (PEAR::isError($sth)){
echo $sth->getDebugInfo();
exit();
}
foreach($result as $member){
$id=$member[0];
if($myNumber==$id){
continue;
}
print $id.”hello<br>”;
$data[to]=$id;
$data[from]=$myNumber;
$data[is_friend]=1;
$data[create]=date(“Y-m-d H:m:s”);
$data[update]=date(“Y-m-d H:m:s”);
$affectedRows = $sth->execute($data);
}

上記のようなソースでOK.

ただ、これだと、何度も実行した場合に、重複してレコードができてしまう。

その場合、toとfromのセットがUNIQUEじゃないとダメっていうチェックがDBのほうに入ってるから、エラーになるんだけども、気になる人は、しっかりチェックしてからinsertしてください。

2.ユーザ登録時に、自動的に実行する。

これにちょっとハマった。

ユーザ登録時、どこで処理をおこなっているのか、わかりにくかったので。

PNE2系だとぽろぽろ情報がでてくるんだけど、PNE3だとどうも情報が少ないですね。

結論からいうと、lib/action/opMemberAction.class.phpのexecuteRegisterInputに記述してやればOK.

さきほどのソースに、$this->idを渡してあげればOK.

上記ソースをfunction化してあげて、$this->idを渡すのがよさそう。

以上です!

WordPressMuインストールについての覚書

ポータルサイト構築中、ブログを自動的にインストールする必要にかられて、WordPressをシステム的にインストールする方法を調査したので、記録。

最初は、

  1. wordPress.zipをサーバ某所においておく
  2. usrMake()がよばれたら、wordPress.zipをusrディレクトリに展開
  3. wp-config.phpを自動生成
  4. パーミッション調整

ていう手順でいけるかなーと作っていたんだけども、ふとしたところで、WordPressMUの存在に気づいたので、入れてみた。

すこぶる便利。

手順は以下。


1.WordPressMuのダウンロード

http://mu.wordpress.org/download/

2.設定は、ウィザードに従っていけば簡単

特に難しいところは無し。

3.テンプレートを編集可能にする

デフォルトだと、管理画面からテンプレートの編集は不可能。

そこで、PHPファイルを書き換えて、可能にする。

/wp-admin/includesフォルダ内の、mu.phpを編集。

①現行v2.8.6なら、556行目にある、
“unset( $submenu[‘themes.php’][10] ); // always remove the themes editor”
という項目の頭に、//を付けて、
“//unset( $submenu[‘themes.php’][10] ); // always remove the themes editor”
②現行v2.8.6なら、1128行目にある、
“if ( strpos( $_SERVER[‘PHP_SELF’], $page ) ) {”
とい項目を以下の様に変更。
“if ( strpos( $_SERVER[‘PHP_SELF’], $page ) && !is_site_admin() ) {”

http://active-oita.com/subekoro/blog/archives/485 参照

4.自動ユーザ登録のための手順

ここから先は、普通は必要無し。

今回の開発では、クライアントの要望で、システム的にユーザ追加の必要があった。

まずは、単純に、下記URLのソースから、フォーム部分を持ってきてfile_get_content()でキックしようとしたけども、失敗。

http://an.koutaigu.com/blog/wp-admin/wpmu-blogs.php

管理者権限でログインした状態でないとダメらしい。

そりゃそうだ。

仕方が無いので、ソースを見てみて、直接、内部でユーザ登録をしている部分の関数を引っこ抜くことにする。

該当部分は、wpmu-edit.phpの、Addblogの部分。

ここをまるっとコピーして、少しだけ編集して、usrMake.phpを作成。

変更部分は、下記のとおり。

require_once(‘../wp-load.php’);

require_once(ABSPATH . WPINC . ‘/registration.php’);

print $current_site->domain;

//check_admin_referer(‘add-blog’);

コピペした段階だと、必要なrequire_onceが呼ばれていないので、最初にwp-loadとregistrationを呼んでおく。

そして、check_admin_refererを呼んでいる部分をコメントアウト。

あとは適当なHTMLファイルから、POSTでデータをusrMake.phpに渡してあげればOK。

ケータイ紛失と台湾のこと。

cottonのブログ-soutouhu

タイトルどおり、ケータイなくしちゃったんです。
今、ウィルコムのレンタル品使ってるので、一応連絡はとれるんですが、、、
当然のことながら連絡先が全部なくなっちゃった!

このブログ見られた方、僕の連絡先知ってる人はメール送っていただけるととってもありがたいです。

バックアップとらなきゃなー、、と、こういうことの直後は思うんだけど、のど元すぎると、、、ねぇ。

ときに。
台湾いってきました。初たいわーん。いきたいわーん。
cottonのブログ-yoru

もうこの時期でも蒸し暑さ日本の1.5倍。
そりゃ犬もぐったりしますわ。
cottonのブログ-inu

アジアの犬って、こういうぐでぇーーーっとした感じ多い気がする。
と、いうか、もしや世界共通?なのかなあ。

むぁっとくる湿気の中、
鴨くって、ショーロンポーくって、珍珠紅茶のんで。
cottonのブログ-kamo
↑カモ
cottonのブログ-koutya
↑珍珠紅茶(タピオカ入り甘い紅茶)

この鴨がまたうまいんだー。
ショーロンポーはもっとうまいんだー。
珍珠紅茶は気候にあってておいしーんだ。
台湾移住したくなりました。

向こうでビラ配りなんかもしてきたんだけども、
ちょっと驚いたのが、
ビラを渡すと、みんな「謝謝」っていってくれるんです。
ビラ受け取っても、受け取らなくても。
目あうと微笑み返してくれたりするし。
日本で配るよりよっぽどなんだかあったかいんじゃないかと。(日本でやったことないからわからないけど)

ちょっと意外。でも、うれしい。やさしい。

中国本土とはまたちょっと違う印象のこしてくれました。
台湾。

また行きたいなー。

便利な世の中

最近見つけたツールの話。
(パソコン関連のはなしなんで、興味ない方もいるかも><)

cottonのブログ
ネットにつなげるだけで、テレビが見れちゃうすぐれもの。チューナーとかそういうパーツ関連一切必要なし。
(画面はワンセグ程度の大きさですが)

世界中のをみたいならTV-FOXというfirefoxアドイン、
国内ならkeyholeTVというアプリケーション。

どちらもちょこっと見るっていうなら十分なレベル。
ただ、TV-Foxのほうはお試しっていう位置づけなのかどうなのか、5分ほどの映像しかみれないのが残念ですが。画像は定期的に更新されるようなので、それはそれでOKかな。
これで繰り返しABCニュースとかみたら英語の勉強になるんでなかろか。

KeyHoleTVのほうは国内で放送されてる番組がたいていみられる。
地方局(くまもとTVとか、千葉テレビとか)までみられちゃうので、興味ある人はぜひ。
とはいえ、WBCのときとか、混雑するときにはみられなくなっちゃうんだけども。。
(かの有名な2チャンネルもWBCのときにサーバ落ちたっていうからしょうがないかあ)

インターネットで世界が狭くなったっていうけどもちょっとしか実感できてなかったけど、こういうのが普通になってきたらもっともっと面白くなっていくんだろーなーー。

WBCと画像技術と広告と。

先日のWBCの日韓戦をみていたときのこと。

ピッチャーの後ろがわからバッター方向を映すシーン、よくありますよね。
こういうの。
cottonのブログ-ひとつめ

打席わきに、こうこうと光る、
セブン&アイグループの看板。

あれ、WBCってば、世界中に放映してるのに、日本語の看板?
日本の企業、どんだけ金かけてんだろう。

って思ってたら別の回にはマックの広告やら三井不動産の広告やら、日本語の看板にどんどん切り替わるでありませんか。

電光掲示板?
すげーーーって思うけども、さすがに日本企業の広告ばっかりうつるのって不思議すぎ。

と、、

cottonのブログ-むこうこく

ふと画面きりかわるとき、こんなまったく広告ない画面がでてきます。
それに、ヒットうったときのリプレイなんかの、上の画面じゃないアングルの画像では、看板部分は常にま緑色。

どーやら画像技術使ってるんですな。
それもリアルタイム放送だから、全自動化されたやつ。
国ごとに、違う広告だせるよーに。

cottonのブログ-こうこく

こんな風に、看板の前にピッチャーが入っても、なんのその。
上手に画像処理して、不自然ないようにしてました。

そいや、霧がかかってた会場でもはっきりうつってたもんなーと。

すごい。
これなら、各国ごとに広告主あつめられるし、効果的に広告うてる。
その上、回ごとに違った広告主に広告権売れるから、きっと売上総合計もふえるに違いない。

技術もここまできたかーーー!

と、野球以外の部分で妙に感心しちゃったWBC観戦でした。

P.S.
アメリカ戦、楽しみ。
こないだ飲み屋のとなりのおっちゃんが、「イチローははずしてまえ!」って大声でのたまってたけども、やっぱりイチローにうってもらいたいなあ。さくーーっとな。