ppBlog Notice: LINE 953 of utils.php: A non well formed numeric value encountered:

ppBlog Notice: LINE 1008 of utils.php: A non well formed numeric value encountered:

ppBlog Notice: LINE 1016 of utils.php: A non well formed numeric value encountered:

ppBlog Notice: LINE 1034 of utils.php: A non well formed numeric value encountered:

ppBlog official

ppBlog1.4系〜1.5RC1系からの移行について

category-icon

 おはようございます。ppBlog1.5.1は7/16版が最新です。7/14との差分ファイルを添付しておきます。

 さて、1.4系〜1.5RC1系からの移行手順を書いておきます。記事ログ自体の記録フォーマットは変わりません。ログ系のフォーマットでは、コメントログの保存形式が変わっていますので、これはコメント変換プログラムLink [cm15up.php]を利用する必要があります。配布中の最新版のppBlogをダウンロードして解凍後、FFFTPGなどのFTPソフトを使って、アップロードするわけですが、この際に新たにディレクトリを作成して新規インストールするか、それとも現行の1.4バージョンを上書きインストールするかの2通りあります。PHPのプログラムにある程度精通していて、かつppBlogにも慣れている(:))方なら、上書きインストールでも良いと思いますが、バックアップや不測の事態のことも考えると、新規インストールが無難かもしれません。以下では、新規インストールでの手順を書いておきますが、上書きインストールでも基本的にやることは同じです。

 無事、新規にインストールが終了したとして…、

  • 現行のブログのログ系ファイル(log, tb, cmt)・設定ファイル(ownerディレクトリの中身)・画像ファイル系(PIX, PIX/s1, PIX/s2, mov)・その他(attached, page)は、ひとまずすべて、お使いのPCにダウンロードしておきましょう。バックアップにもなります。
  • 設定ファイルの移行。まずは、旧版で使っていたownerフォルダの中のini.inc.php以外のファイルを、新規インストールしたownerディレクトリに上書きアップロードします。この際に、アップロードしたファイル群のパーミッションを666か606に変更して下さい。FFFTPでは、複数選択して一気にパーミッションの変更が出来ます。
  • 次にログファイル系の移行をします。お手元のlogフォルダの中身はサーバー上のlogへ、cmtフォルダの中身はcommentsディレクトリへ、tbフォルダはtrackbacksディレクトリへ。これらもログファイルのパーミッションを666か606に変更するのを忘れずに
  • 画像系のアップロード。PIX内のは、そのままアップロードして下さい。s1やs2の中身はそれぞれのディレクトリへ。movフォルダはmediaディレクトリへです。パーミッションはとくにいじらなくて良いと思います。
  • その他のアップロード。attachedフォルダの中身はaffixedディレクトリへ、pageフォルダはpagesディレクトリへ。pagesディレクトリの中のファイルはパーミッションを666か606に変更します
  • 以上が終わったら、コメントログを変換します。上で述べたコメント変換スクリプト(1148270263_cm15up.php)をダウンロードしたらcm15up.phpにリネームして、index.phpと同じ階層にアップロードします。そして、このファイルに、ブラウザ上からアドレス直打ち(http://〜/cm15up.php)でアクセスすると、自動的に変換作業が開始され、1秒以内で終了するはずです。上手くいけば、「コメントログの書き換えに成功しました。」というメッセージが表示されます。このメッセージを見たら、もうcm15up.phpは不要なので削除して下さい。
  • 以上の作業が済めば、この時点でトップページ(index.php)にアクセスすると、とりあえず既存の記事は表示されていると思います。でも、サイドバーの「最近のエントリー」や「コメント」「トラックバック」といった類のボックスには何も表示されていないと思います。これは、それらはキャッシュファイルから読み出しているからです。以下にキャッシュファイルの生成方法を述べます。
  • 各種キャッシュファイルの生成。基本的にキャッシュファイルは、記事を書いたり、コメントやトラックバックがついたりしたら、そのタイミングで自動的に生成されます。なので、記事は新規に何か書いてみても良いですし、記事の編集をするだけでも良いです。コメントは、既存のコメントを修正したり、新たに書いたりすれば、最新のコメント情報のキャッシュが生成されます。トラックバックは、とりあえず自分自身の記事にトラックバックしてみてもよいでしょう(セルフトラックバック)。
  • 最後に、アップロードした画像ファイルのキャッシュを生成します。これは、「管理画面」→「画像管理」とすすんで、ImageManager画面を開きます。ここの冒頭説明リスト文の最後に「このアイコンをクリックすると…」というのがあるので、そこのアイコンをクリックして下さい。画像データベースが新規に作成されます。
  • 以上で、とりあえずは移行作業は終了です。多分。

 大体、こんな感じでよいと思います。アクセスログの移行に関しては、アクセスログの文字コードも違いますし(UTF-8に統一)、考えてないです。悪しからず。なにぶん、1.4系から離れて久しいので、移行手順について何か見落としがあるかもしれません。気付かれた方はフォローお願いします。

 最後になりますが、7/14版からの差分ファイルを添付しておきますね。ご指摘があった分の修正です。mob.phpの調整、moby.phpからの記事削除が出来ない件、cssファイルの修正、atom1.0/rss2.0の出力調整をしています。

添付ファイル: 1152997575_DIFF060716.zipattachedIcon 

 


— posted by martin at 07:38 am   commentComment [19]  pingTrackBack [2]

ppBlog1.5.1 リリース

category-icon

こんばんは。バージョン1.5.1の公式アナウンスです。

 何とか、ちゃんとアナウンス出来ようなものになりましたので、ここにppBlogの最新版をリリースします。バグが完全になくなることはないでしょうが、ふつうにブログを実践する分には問題となるようなことはないかなと思っています。

 1.5のβ版を出してから、随分と時間が経ち、最初にいつリリースしたかも忘れてしまいました。。1.5系正式版で、β版との主要な違いを述べておきます。

  • 日付ソートを可能にした。記事の古い順からのナビゲートがクリックひとつで可能です。また、管理者は、utils.phpの冒頭にある設定部分で、この機能をオフにすることも出来ます。古い記事に簡単にアクセス出来ることで、新たな発見があるのではと思います。
  • リスト表示では、Ajaxを駆使して、記事部分のみを呼び込んで表示させるモードを搭載した。これを活用すると、ページ全体を読み込むことなく、軽快に前後の記事を次々に読んでいくことが出来ます。イメージしたのは、RSSリーダーのような使い勝手。なお、この機能は、デフォルトではオフになっています。これも、管理者はutils.phpの冒頭部分で設定が可能です。
  • ローカルプレビュー機能の充実。前回のエントリーでも触れていますが、オンライン上での記事ボックスの見た目をほぼ忠実に、ローカルで再現できます。カテゴリーアイコンが表示されないぐらいです。デフォルトのテーマが適応されます。ちなみに、Firefoxでは、アップロードして挿入した画像も、ローカルプレビューで表示されました。
  • 自動投稿機能。ローカルプレビューは、あくまでローカルでの記事確認で、バックアップではありません。新規作成記事のバックアップ機能として、60秒おきにドラフトモードとして、自動的に書きかけの記事をサーバーに送信するようなギミックを備えました。これもAjaxを利用していて、書き手の気に留まることもなく、バックグラウンドで送信されます。タブブラウザなどで、別にトップページを開けば、ドラフトモードとして、書きかけの記事が投稿されているのを確認できます。この「オートポスト」機能は、途中で止めることも何度も再開することもできます。
  • タグリストのバックアップ機能。バージョンアップなどによるファイル上書きなどで、タグリストが壊れてしまう可能性は否定出来ないので、キャッシュ作成時に、タグリストのバックアップも取るようにしました。これは、cacheディレクトリに作られますので、タグリストに関して、不測の事態が起こった際には、このディレクトリを覗いてみましょう。
  • あ、あと、ppBlogでは、リスト表示とボックス表示とを簡単に切り替えられるというのが、まぁ特徴といえばそうですが、これの切り替えでクッキーを利用して、閲覧者が選んだモードを優先的にするようにしました。読み手あってのブログですから、これぐらいはリーダーに選択権があっても良いと思いますので。

 てなところでしょうか。あと、ppBlogのJavaScriptの心臓部分であるlib.jsは、かなり細かいところまでいじくっています。基本的に、Safariを含めたモダンなブラウザで、JavaScriptエラーが出ることはないかなと思っています。Safariへの対応には苦労していたんですが、MacBooKのクロを購入してからは、動作確認が簡単に取れるようになりました:) というか、このために買ったようなものですから。一応、時代遅れのバギーなIE6でも確認は取っていますが。。

 明日は、1.4系からの移行についての記事を書いて、あと、マニュアルも更新して…とすることが山積みですが、まぁ、ボチボチと。

 今日は金曜で、0:30分からNHKでSamurai7Gが始まります。まぁアニメなんですが、映像のきれいなこと。あの「七人の侍」をモチーフに作られた時代劇ロボット活劇(?)です。サッカーのワールドカップで中断していたようですが、今夜はありそうなので、それに間に合うように、今から帰宅します。ではでは。 

 


— posted by martin at 11:22 pm   commentComment [48]  pingTrackBack [5]

 

今日あたり・・・

category-icon

 こんばんは。プレッシャーもあって、ひっそりとppBlog1.5.0正式版をアップしていたんですが、いくつか修正点があって、それらのフィックスを合間合間にやってましたが、大体片が付いたので、今日あたりに1.5.1として、正式版をきちんとしたアナウンスのもとにリリースしようと思います。何だか読みにくい日本語になってしま(略)。

 これまで、記事作成画面では、「ワープロモード」と「ローカルプレビュー」が付いていたんですが、ワープロモードはAjaxを利用した「自動ポスト機能」にとって替わりまして、また「ローカルプレビュー」は、従来のものは、ほんとおまけ程度の貧弱なものだったんですが、今回のバージョンからは、デフォルトのテーマをほぼ忠実に再現します。まだ、完璧に再現する訳ではないのですが、ウェブ上での見た目と殆ど変わらないレベルだと思うので、皆さん、活用されて下さい。

 余談ですが、IEに関して、自分はIE7b3を試用中でして、IE6の数あるスタイルシート(CSS)関連のバグはほとんど修正されています。で、IEの動作確認は、ついついこのIE7で済ませてて、まぁOKかなって思っていたら、ご指摘があって、Ajax関連の新しいギミックが、CSSと相まって、IE6ではありえない動作をしたりするんですよね。何じゃ、このIEイィィィィィィ、と思わずDIOになりそうなのをこらえて、何とかIE6にも対応させました。それにしてもIE6のシェアって、このブログの来訪者で見ても6割超なんですよね。。無視できません(--) 
BrowsersShare
sleipnirやlunascapeもIE6エンジンですからねぇ。

— posted by martin at 03:02 am   commentComment [1]  pingTrackBack [1]

window.onloadの代替スクリプト

category-icon

Updated Entry: http://p2b.jp/200805-events-orderLink

 今日は七夕Wですね。小学生の頃は、学校総出で「♪笹の葉さーらさら〜」ってやって、七夕伝説に思いを馳せたものですが。いつになってもガキの頃の心を忘れない大人でいたいものです。

 さて、Ajaxの隆盛によって、その根幹であるJavaScriptはブログに欠かせないものとなっています。ppBlogも例外ではなく、至るところで活躍してます。一般にブログの(トップ)ページは、色々な情報を詰め込んでいるために、ファイルサイズは大きくなる傾向にあり、また、画像も至るところで使われるために、読み込むべきコンテンツサイズは更に大きくなります。ブロードバンドが当たり前の今日でもページの表示にちょっと待たされるのは珍しいことではありません。で、JavaScriptは(画像も含めた)ページの内容物が全部読み込まれた後に作動させるのが一般的です。なので、もし、画像の読み込みに時間がかかったりすると、JavaScriptがうまく動かずに、狙い通りの効果が得られなかったり、スクリプトエラーが出たりします。こういうのはたいてい、window.onloadやBODYタグでのonloadイベントで制御しているんですが、JavaScript使いなら、画像の読み込みを待たずに、ページの構成要素(DOMエレメント)がパース(読み込まれて解釈)された時点でプログラムを走らせたいと思うものです。

 その解決法として、JavaScriptマスターのDean EdwardsLink 氏が、window.onload問題を解決した!Link と言ったのが昨年の9月頃で、このブログでも言及したLink ことがあります。彼のやり方は、Mozilla系ブラウザの隠し要素DOMContentLoadedを利用したもので、IEはこれに対応していないので、IEだけは、外部jsスクリプトを用意しないといけませんでした。その不完全さが好きになれなかったので、ppBlogではこれとは違うアプローチ(setTimeoutを利用するやり方)を取ってたんですが、このsetTimeoutがらみの手法は、PCの性能などにも大きく左右されるし、どうも不安定さがあるんですよね。角丸コーナースクリプトが上手く作動しなかったり。

 そんな折、先月にこれでほぼ100%解決と思われるやり方がEdwardsを含めたJavaScriptマスターたちによって「発見」されました。→http://dean.edwards.name/weblog/2006/06/again/Link

 この新しい方法では、IEでも外部スクリプトを別に用意する必要がなく、またSafariなどでも問題なく動くものです。いやぁ、みんな頭良いよなぁ。自分でも個人的に、IE向けにはdocument.readyStateを利用した方法を試したりしたんですが、IEの返すdocument.readyStateが、またいい加減なシロモノでしてあえなく挫折。しかも、DOMContentLoadedに関しては、Operaの最新バージョンであるOpera9でサポートされたりしたんで、自分もこの潮流に乗っかることにしました。そのうちSafariでもDOMContentLoadedはサポートされそうな予感。そういえば、Opera9では、とうとうdocument.designModeがサポートLink されましたね。以前、document.designModeGを利用して、ppBlog組み込みの本格的なエディターを作ろうとしたことがあったのですが、IEの吐き出すHTMLソースがあまりに後進的だったので放置したままになっていますねぇ。IE7βでどうかはまだ試していないです(期待してないけど)。

 少し逸れましたが、とにかくppBlogでもwindow.onloadに替わる新しいやり方を実装してみました。詳しい話はエドワーズのブロッグを読んでいただくとして、ppBlogでは現時点で、次のような感じにまとめています。

DOM = { /* window.onload alternative */
 complete : function(){
  if(arguments.callee.done) return;
  arguments.callee.done = true;
  if(typeof _timer != 'undefined'){
   clearInterval(_timer);
   _timer = null;
  }
  DOM.onload();
 },
 check : function(){
  if(d.addEventListener){ // Mozilla/Opera9向け
   d.addEventListener("DOMContentLoaded", DOM.complete, false);
  }
  if(navigator.userAgent.match(/webkit|safari|khtml/i)){// Safari向け
   var _timer = setInterval(function(){
    if(d.readyState.match(/loaded|complete/)){
     DOM.complete();
    }
   }, 50);
  }
   /*@cc_on @*/
   /*@if (@_win32)// IE向け
    d.write('<script id="_decoy_" defer src="javascript:void 0"><¥/script>');
    d.getElementById("_decoy_").onreadystatechange = function(){
     if(this.readyState=='complete'){
      DOM.complete();
     }
    };
   /*@end @*/
  addEvent(window, "load", DOM.complete);//その他
 },
 onload : function(){}
}

 ポイントは、DOMContentLoadedをサポートしているならそれを使い、Safari系ではdocument.readyStateを利用し(IEと違って信用できる値を返すようである)、IEではスクリプト属性のdeferを利用することです。このdeferは文字通り、(外部読み込み)スクリプトの実行を遅延させる属性でIEのみがサポートしています。このdeferは、document.readyStateよりずっと堅実です。ついでに言うと、ここで使われているdefer指定の外部スクリプト指定は、もはや単なる「飾り」になっています(それがIE7正式版でどういう扱いになるか一抹の不安が残りますが)。詳しくは、このトリッキーな手法を発見したMatthias MillerLink 氏のブログ(エントリーLink )をどうぞ。

 ちょっと話題がずれますが、IE7βは先日ベータの最新版かつベータ最終版が出ましたね。それに少し関連したErik氏の面白いエントリーがあったので紹介しておきます(まぁ、期待外れ感が漂う、ちょっとしたジョークなんでしょう)。

 →IE 7 DOM and JS ChangelogLink

 Erik氏は、昨日のエントリーにも出てきたWebFXの主宰者の一人で、彼もまたJavaScriptマスターです。このエントリーは時期的にIE7ベータ1-2についてのものかな。思わず笑ってしまいました

 


— posted by martin at 04:40 am   commentComment [0]  pingTrackBack [3]

Firefoxでのwindow.event

category-icon

 ワールドカップの準決勝ポルトガル-フランスのせいで寝むれないmartinです。

以前のエントリで「Firefoxでの擬似window.eventLink 」として、

function windowEvent(){
 if(window.event) return window.event;
 var caller = arguments.callee.caller;
 while(caller){
  var ob = caller.arguments[0];
  if(ob && ob.constructor == MouseEvent) return ob;
  caller = caller.caller;
 }
 return null;
}

というのを載せていましたが、どうせなら、Firefox(および、その他のモダンなブラウザ)にも、window.eventを認識させたいです。window.eventは使い勝手が良いので。で、このwindow.eventを簡単に認識させる方法があったので、今はこれを使っています。もともとのソースは、JavaScript使いなら誰でも知っている、昔からの有名サイトWebFXLink 内にある「Classic Event Handlers - IE EmuLink 」で紹介してあった方法です。リンク先を見れば分かりますが、これ以上ないくらいシンプルでスマートなやり方ですねぇ。最初は、__defineGetter__あたりを使ってエミュレートしようとしていたのですが。いやはや。

 js/lib.jsでは、次のようにしています。

if(w3c){ // IE以外のモダンなブラウザなら.
 (function(){
  for (var property in Event.prototype){
   if(property.match(/MOUSE|CLICK/)){
    window.addEventListener(property.toLowerCase(), function(e){
     window.event = e;
    }, true);
   }
  }
 }());
};

 イベントリスナーに逐一マウスイベントを列挙して登録しても良いのですが、Eventオブジェクトにある組み込み定数を利用してみました。マウスイベントを列挙するなら、次のような感じになると思います。

if(w3c){ // IE以外のモダンなブラウザなら.
 (function(){
  var events = ["mousedown", "mouseover", "mouseout", "mousemove",
                "mousedrag", "click", "dblclick"];  
  for (var i = 0; i < events.length; i++){
   window.addEventListener(events[i], function(e){
    window.event = e;
   }, true);
  }
 }());
};

 まぁ、こちらの方が記述も短めでオーソドックスなやり方ですが、イベントを列挙するのがメンドかったので、別のアプローチを取ってみました。お好きな方でよいと思います。

 こうすると何が嬉しいかって、例えば、次のようなスクリプトにおいて、

document.onclick = function(e){
 alert("Event X:"+e.clientX + ", Event Y:"+e.clientY);
}

この引数のeは、Mozilla系のブラウザでは必須のもので省略は出来ません。こういうシンプルな例ならいいのですが、引数がいくつかあるような関数で、いちいちこのeを付けて回るのはメンドいものです。こういうときに、上記のエミュレーションを用いれば、

document.onclick = function(){ //eが不要
 alert("Event X:"+event.clientX+", Event Y:"+event.clientY);
}

みたいに書けるわけです

   


— posted by martin at 05:34 am   commentComment [1]  pingTrackBack [1]

T: Y: ALL: Online:
Created in 0.0075 sec.
prev
2006.7
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 31