ppBlog Warning: LINE 1117 of utils.php: preg_match(): The /e modifier is no longer supported, use preg_replace_callback instead

ppBlog official

[ カテゴリー » 開発日誌 ]

更新PINGサーバーの一覧を更新

category-icon

 こんにちは。皆さん、ブログを書いた際に、その更新情報を更新pingサーバーに送っていると思いますが、たくさん存在していたpingサーバーも盛衰があるようです。ppBlogの初期設定のままでは、少々古いping情報もあるので、2008年末時点で安定していると思われる最新の更新pingサーバーをまとめてみました。
PingサーバーPing送信先アドレス
BlogPeople http://www.blogpeople.net/ping/
Google ブログ検索 http://blogsearch.google.co.jp/ping/RPC2
Yahoo! ブログ検索 http://api.my.yahoo.co.jp/RPC2
Technorati http://rpc.technorati.jp/rpc/ping
はてなRSS http://r.hatena.ne.jp/rpc
ドリコムRSS http://ping.rss.drecom.jp/
PING.BLOGGERS.JP http://ping.bloggers.jp/rpc/
fc2ブログ http://ping.fc2.com/
Ask.jpブログ検索 http://ping.ask.jp/xmlrpc.m
Weblogs.com http://rpc.weblogs.com/RPC2
livedoor Reader http://rpc.reader.livedoor.com/ping
gooブロッグ http://blog.goo.ne.jp/XMLRPC

 また、これに合わせて、更新サーバー設定のスクリプトもアップデートしました。重複した更新サーバーをチェックするようにしたりとか。添付のping.inc.phpmodulesディレクトリに、xmlrpc.phpは、index.phpと同じディレクトリにアップすればOKです。

 尚、ppBlogでは、更新pingサーバーは、管理画面の「環境設定」→「更新サーバーの管理」からいくらでも追加できます。テキストエリアに特定の書式で貼り付ければ良いのですが、使いやすいように、以下にコピペ用を用意しました。これをテキストエリアに貼り付けて、更新ボタンを押せばOKです。なお、ping.inc.phpをアップデートしてから、追加するのを強くお勧めします。古いままだと、重複して登録してしまうので。その際は、直接、ownerディレクトリにあるping.ini.phpを編集しないといけません。

ppBlogコピペ用

BlogPeople|www.blogpeople.net/ping/|www.blogpeople.net/newblog.html
Google ブログ検索|blogsearch.google.co.jp/ping/RPC2|blogsearch.google.co.jp
Yahoo! ブログ検索|api.my.yahoo.co.jp/RPC2|
Technorati|rpc.technorati.jp/rpc/ping|technorati.jp/
はてなRSS|r.hatena.ne.jp/rpc|d.hatena.ne.jp/
ドリコムRSS|ping.rss.drecom.jp/|
PING.BLOGGERS.JP|ping.bloggers.jp/rpc/|ping.bloggers.jp/
fc2ブログ|ping.fc2.com/|
Ask.jp ブログ検索|ping.ask.jp/xmlrpc.m|
Weblogs.com|rpc.weblogs.com/RPC2|www.weblogs.com/
livedoor Reader|rpc.reader.livedoor.com/ping|reader.livedoor.com/
gooブロッグ|blog.goo.ne.jp/XMLRPC|blog.goo.ne.jp/index.php?fid=freshEntry
添付ファイル: xmlrpc.phpattachedIcon  ping.inc.phpattachedIcon 

— posted by martin at 10:17 pm   commentComment [1]  pingTrackBack [0]

マルチバイトを考慮したstr_replace関数

category-icon

 こんばんは。最近、めっきり寒くなってきました。ラボは基本的に中央暖房なんですが、古いせいか壊れていて温度計は14度ぐらい。冷え症の身には応えます。

 さて、ユーザーの方から、パスワードやIDを変更したタイミングでログが壊れるという報告がありました。こちらでは再現出来なかったんですが、調べたところ、ログの書き換えにマルチバイトに対応していないstr_replace関数を使っているのが原因かと思いますので、マルチバイトに対応したやつを考えてみました。PHPには、マルチバイトに対応した色んな関数が揃っているLink のですが、頻用するstr_replaceのマルチバイト版mb_str_replaceが(何故か)ありません。オンラインのPHPマニュアルには、ユーザー寄稿のメモが沢山載せてあって、色々と参考になります。この中に、mb_str_replace()があったので、それに若干修正を加えて以下のようなものを用意しました。

/* マルチバイトを考慮したstr_replace */
function my_str_replace($search, $replace, $target, $encoding = ENCODE){
 $notArray = !is_array($target) ? TRUE : FALSE;
 $target = $notArray ? array($target) : $target;
 $search_len = mb_strlen($search, $encoding);
 $replace_len = mb_strlen($replace, $encoding);
 foreach ($target as $i => $tar){
  $offset = mb_strpos($tar, $search);
  while ($offset !== FALSE){
   $tar = mb_substr($tar, 0, $offset).$replace.mb_substr($tar, $offset + $search_len);
   $offset = mb_strpos($tar, $search, $offset + $replace_len);
  }
  $target[$i] = $tar;
 }
 return $notArray ? $target[0] : $target;
}

 これで、str_replace関数と大体似たような挙動をしてくれますが、本家str_replaceと違う点は、引数(ひきすう)の$search$replaceに配列を指定出来ないことです。なので配列に対応した関数を用意しましょう。上記の関数を使います。

/*
 str_replace関数のマルチバイト版
 上記 my_str_replace()が必要
*/
function mb_str_replace($search, $replace, $target){
 if(is_array($search)){ // $searchが配列なら
  if(!is_array($replace)) $replace = array($replace);
  foreach ($search as $i => $needle){
   $rep = isset($replace[$i]) ? $replace[$i] : $replace[0];
   $target = my_str_replace($needle, $rep, $target);
  }
  return $target;
 } else return my_str_replace($search, $replace, $target); // $searchが配列でないとき
}

これを使ったサンプルをば。全角空白を□(四角)に、「空白」という文字を「四角」に置換します。

$target = " おか機 ←全角空白です。";
$search = array(' ', '空白');
$replace = array('□', '四角');
$result = mb_str_replace($search, $replace, $target);

var_dump($result); // これで結果を出力

これの結果は、以下の通り。パフォーマンスもそんなに悪くないと思います。

string(39) "□おか機□←全角四角です。"

これの修正を施したutils_admin.phpの最新版を添付しておきます。replace_log_by_target()関数界隈が変わっています。

添付ファイル: utilsadmin.phpattachedIcon 

— posted by martin at 05:19 am   commentComment [0]  pingTrackBack [0]

ppBlog向けテーマチェッカー

category-icon

 こんにちは、martinです。ずっと前から、作らんとね-と思っていて、なかなか作らずにいたテーマチェッカーを作成してみました。ただし、バージョン1.7.6向けなので、クラス名とか変更されている部分もあります。

 ちなみにv1.7.6はまだリリースすらされていません。来週あたりでしょうか。とりあえず、チェックする点を挙げておくと、

  • ppBlogで必須のスタイルシートのクラス名をチェック。指定がない場合はピックアップ。
  • 同様に、各テーマディレクトリにあるべき必須の画像もチェック。
  • ppBlogには必須でないが、各テーマで指定している独自のクラス名を抽出。使っていない冗長なクラス指定を見つけやすく。

 どういう感じの出力になるかは、以下のリンクで確認出来ます。このサイトのテーマ:3paneをチェックした結果です。

 →http://p2b.jp/demo/checker-result.html

 なかなか悲惨なことになっていますが、足りないところが分かりやすくて良いですね(--)

 これを実際に使用するには、添付のptc.phpをブログ本体のindex.phpと同じディレクトリにアップして、ブログの方でログインした状態でアクセスすると、使用できます。ppBlogに認識されてるテーマがセレクトボックスに列挙されるので、調べたいテーマを選べば、後は結果が表示されますよ(多分)。

添付ファイル: ptc.phpattachedIcon 

— posted by martin at 02:16 am   commentComment [5]  pingTrackBack [0]

Cooliris(PicLens)用のMedia RSSを出力するモジュール

category-icon

 こんばんは、martinです。フォーラムの方で、画像ギャラリーのデータベースをMedia RSSLink として出力できれば、Cooliris(formerly PicLens)Link (クールアイリス?)を活用できますというご指摘があり、面白そうだったので実装してみました。

 かつてPicLensとして知られていたCoolirisですが、これは良いですね。IE6/7やFirefox,Safariといった主要なブラウザにはプラグインとして対応Link しています。Coolirisは、スライドショーを実現する外部スクリプトを用意してくれているので、プラグインが入っていないブラウザでも簡単にスライドショーを提供できます。具体的なデモは、小生のブログで見ることができます。 

 →http://martin.p2b.jp/gallery/Link  

Slide show powered by Cooliris」というリンクがあるので、それをクリックすれば、簡易スライドショーが始まります。もし、Coolirisプラグインがインストール済であれば、そのプラグインが立ち上がります。リッチなスライドショーを体験するために、是非ともプラグインを入れましょう。

Cooliris
Coolirisでのスクリーンショット。マウスホイールなどでグリグリ出来る。

 さて、ppBlogでの実装ですが、各エントリーに使われているJPEGファイルを画像データベースより抽出し、それを100枚ごとに分割し、Media RSSファイルを作成するようにしています。画像が370枚あれば、4つのMedia RSSファイルがfeedsディレクトリに作られるわけです。Coolirisは、RSSファイルのページリンクを提供しているので、シームレスに、この4つのRSSファイルを読み込み、展開してくれます。

 具体的な出力は、以下のような感じです(gallery3.rssLink の場合)。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss xmlns:media="http://search.yahoo.com/mrss" version="2.0"
 xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:icon>http://martin.p2b.jp/theme/3pane/Images/ImageGallery.png</atom:icon>
<atom:link rel="previous" href="http://martin.p2b.jp/feeds/gallery2.rss" />
<atom:link rel="next" href="http://martin.p2b.jp/feeds/gallery4.rss" />
<generator>ppBlog1.7.5</generator>
<title>ppBlog-generated Image Gallery</title>
<link>http://martin.p2b.jp/</link>
<description>Media RSS for Image Gallery</description>

 ページリンクは、<atom:link rel="previous" や <atom:link rel="next" で出力、また、各テーマディレクトリに、もしImageGallery.pngという画像があれば、それをCooliris用のカスタムアイコンと認識して、それようの出力もします。画像の高さは、26pxがおススメとのこと。

 これに続いて、各画像の情報がITEM要素として列挙されます。

<item>
 <title>Yvetot7-2008/06/25</title>
 <link>http://martin.p2b.jp/PIX/1214400950_Yvetot7.jpg</link>
 <guid>1214400950_Yvetot7.jpg</guid>
 <media:thumbnail url="http://martin.p2b.jp/PIX/s1/1214400950_Yvetot7.jpg" />
 <media:content url="http://martin.p2b.jp/PIX/1214400950_Yvetot7.jpg" type="image/jpeg" />
</item>

 ここにあるTITLE要素ですが、ここに日本語が入っていると、Coolirisがその要素を認識してくれないっぽいので英数字に限定しています。簡易スライドショーでは認識してくれるようですが。。

 このモジュールは、次回のアップデートで採用予定ですが、v1.7系使いの方は、試すことが出来ます。添付のadmin.phpを既存のもとの入れ替え(念のためもとのadmin.phpは別名保存しておきましょう)、modulesディレクトリに、新規にmrss.inc.phpをアップロード、またgallery.inc.phpは上書きします(これもバックアップを)。この状態で、「管理画面」→「各種ツール」に「MRSSの作成」というメニューが現れるので、それをクリックすると、最新の画像データベースを元にMedia RSSファイルが作成されます。

 ご指摘・アドバイス等あればお願いします。

添付ファイル: admin.phpattachedIcon  gallery.inc.phpattachedIcon  mrss.inc.phpattachedIcon 

— posted by martin at 10:32 am   commentComment [5]  pingTrackBack [0]

しぃペインターとPHPによる画像投稿処理

category-icon

 こんばんは。お絵かきツールの話でも。

 小生のweblogのアクセス解析の「検索ワード」を見ると、いつも「お絵かきツール」とか「FLASH お絵かき」での訪問がトップにきてます。「Flash版お絵かきツールLink 」のページがリンクされているんですが、これ2005年6月のエントリーなので、昔日という印象ですが、このFLASH版お絵かきは、この時点から何も変わってません。当時、画像を保存したりするメソッドが分からなくて頓挫したままになってまして。ppBlogに組み込む予定だなんて言ってましたが。。今は、FLASHで作成した画像データを保存したり、呼び出したりする技は知っているので、この古いスクリプトを対応させても良いのですが、元々が中途半端なプログラムなので、凝り出すと時間がかかりそうです。

 で、Web上には、FLASHではありませんが、Java仕様の大変高機能なお絵かきツールがいくつかあるので、それを利用するのが最善であろうと思います。おそらく一番有名なのは、「しぃペインターG」でしょう。このソフトの存在は知っていたんですが、実際にダウンロード(DL)して、中身を読んだことはありませんでした。で、おとといDLして読んでみると、色々設置方法などについて詳しく書かれています。サーバーへのデータの受け渡しの記述もあるので、簡単にPHPと連携できそうです。で、やってみたらあっさりと画像データを取得できたので、簡単なプログラムを書いてみました。自由に投稿できて、最新の9個の画像をギャラリー閲覧出来ます。

しぃペインターを組み込んだデモLink

Javaのことは全く分かりませんが、しぃペインターのプログラムが、サーバーに画像データを渡してくれるので、それをPHPでキャッチ出来れば良いわけです。しぃペインターの説明が分かりやすく、簡単に実装できました。上のデモのキモの部分を抜き出してみると、

if(!$raw_data = file_get_contents('php://input')){
 $raw_data = $HTTP_RAW_POST_DATA; // 次の手段
}

 基本的には、これがすべてです。php://input は、POSTの生データの読み込みを許可するプロトコルで、これとfile_get_contents関数Link とを組み合わせるだけですね。まずこのやり方でトライして、で、駄目だったら $HTTP_RAW_POST_DATA を見るという流れです。これで、しぃペインターからのデータを無事にゲット出来たら、後は、ごにょごにょデータを弄るだけですね:)

しぃペインターのマニュアルによれば、

画像などを投稿した後の返り値にURL:と言う文字が初めにある場合、続く文字列をURLとして読み取ってその指定されたURLへジャンプする機能がつきました。これにより細かい動作をサーバー側が管理する事が容易になります。

とのことなので、データの取得に失敗したら、

if(empty($raw_data)){
 exit('URL:draw.php?mode=error&due=empty'); // 生データの取得に失敗した場合
}
みたいな記述で、自由にページを遷移させることができます。うまく生データを取得できた場合以下の処理が続きます。
$img_name = time(); // タイムスタンプをファイル名に
$img_size = substr($raw_data, 9, 8); // ファイルサイズ情報は必ず8バイト
$img_data = substr($raw_data, 19, $img_size); // 以下、画像データ
$img_ext = strstr(substr($img_data, 0, 4), 'PNG') ? '.png' : '.jpg'; // 最初の4文字で拡張子を識別

if($fp = @fopen(IMG_DIR.$img_name.$img_ext, 'wb')){
 flock($fp, LOCK_EX); // まぁ、とりあえず
 fwrite($fp, $img_data);
 fclose($fp);
 exit('URL:draw.php?mode=done&aim='.$img_name.$img_ext); // 書き込み成功した後のリンク処理
} else exit('URL:draw.php?mode=error&due=fopen'); // 書き込み失敗!

 こんなに簡単なら、もっとはやく向き合っていればよかった。。

— posted by martin at 03:56 am   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
Created in 0.0050 sec.
prev
2021.4
next
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30