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

表示記事数を読み手が設定

category-icon

 おはようございます、martinです。現状、管理画面で設定出来る、記事ボックス表示モード時の記事数ですが、ユーザーの方からのご提案で、これを読み手が自由に設定できたら良いなぁ、とありました。

 なのでやってみました。

shot
読み手が自由に表示数を指定できる。

 仕様上、表示数はいくらでも指定出来ますが、100件づつ表示とかしたら表示にえらく時間がかかってしまったので(当然ですが)、とりあえず30件を上限としています。ボックス表示で30件もあれば十分かなとは思いますので。

 v1.7/1.8系の方は、以下の添付ファイルで試すことができます。いつでも戻せるように、元のutils.phpのバックアップは取っておいて下さい。

添付ファイル: utils.phpattachedIcon 

— posted by martin at 01:14 pm   commentComment [0]  pingTrackBack [0]

 

gethostbyaddrのキャッシュ化

category-icon

 こんばんは、martinです。前回に引き続いて、高速化のお話。

 ppBlogは、それなりに高機能だと思っているアクセス解析機能が初めから付いていますが、ログ取得のためにアクセス時のIPアドレスから、PHPのgethostbyaddr()Link 関数を使ってホスト名を取得できれば取得するようにしています。gethostbyaddr()関数はDNSサーバに問い合わせてIPアドレスに対応するホスト名を調べる、いわゆる逆引きを行ってくれます。なので、ともすると、この段階がページ表示スピードのボトルネックになる可能性があります。

 なので、IPアドレスに対応するホスト名のキャッシュ化を考えてみました。情報をどこに保持するかですが、ひとつのIPアドレスに対して、ひとつの対応するホスト名さえ分かればOKなので、ここはクッキーに情報を保持するのが良さそうです。その際に、「生」の値を保持するのは、何となく気持ち悪いので暗号化してクッキーに保持するようにします。

 アクセス解析のための情報取得は、stat/log.phpが担当してるのですが、ここ1-2日間、log.phpを結構書き換えています。IPアドレス/ホスト名のクッキー化に関する記述は、今のところ以下のような感じです。

/*
 * gethostbyaddrのキャッシュ化による高速化。クッキーによる実装。
 * 暗号化されたホスト情報がクッキーに入ってるなら、それを取得。そうでなければ逆引きをする。
*/
if(isset($_COOKIE['PPBLOG_DNS']) && strpos(($DNS = ' '.my_decrypt($_COOKIE['PPBLOG_DNS'])), $ip)){
  list($host,) = explode("¥t", ltrim($DNS), 2); // ホスト名の取得。gethostbyaddr()関数よりずっと高速。
}

if(!isset($host)){ // クッキーに記録されていなければ、そこで初めてgethostbyaddr()関数を使う
 $host = ($host = gethostbyaddr($ip)) ? $host : $ip;
 if($host != '') setcookie('PPBLOG_DNS', my_encrypt("$host¥t$ip"), time() + 30*24*3600);
}

 gethostbyaddr()関数と比べて、どれくらい速いか計測したところ、少なくとも40倍以上高速になりました。この実装で問題がないようであれば、次期バージョンアップ時に採用したいと思っていますが、試してみたいという方のために添付しておきます。単なる上書きで良いです。その際、元のlog.phpのバックアップは取っておいて下さい。

添付ファイル: log.phpattachedIcon 

— posted by martin at 04:18 am   commentComment [8]  pingTrackBack [0]

array_shiftとreset

category-icon

 こんばんは、martinです。ppBlogでは、「軽快な動作」を常に念頭において開発しています。PHPには、実に様々な関数が最初から提供されていて、似たような振る舞いをする関数も結構あります。なので、こういう場合は、それぞれの関数で処理時間を計測して、より処理速度が速いほうを採用するようにしていますが、最近、そんなやつをひとつ見つけました。

 ppBlogでは、内部でいろんな配列が定義されていて、それを切ったり貼ったりして使用してます。その際に、配列の先頭の要素を取り出すという処理を至る所でしているのですが、これまではarray_shiftを用いていました(というかそれしか知らなかった)。

 

array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります

引用元: PHP: array_shift - ManualLink
 上の赤字にあるように、元の配列を変えてしまうという点に留意していれば、便利な関数です。で、最近別の似た振る舞いをする関数を見つけました。reset()関数です。

reset() は、array の内部ポインタの先頭の要素に戻し、配列の最初の要素の値を返します

引用元: PHP: reset - ManualLink

 何となく、内部ポインタを先頭に移すんだなという印象でファイルオープンfopen()などを使う場面ぐらいでしか使わないと思っていたのですが、その要素も返すんですね。

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack); // 結果はorange
 // $stackはarray("banana", "apple", "raspberry")になる
?>
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = reset($stack); // 結果はorange、$stackは元のまま
?>

 さてどちらが処理速度が速いかというと、ローカルな環境(PHP5.2.9)では、実はそんなに変わりません。100万回の試行で、前者が3.4秒のところが後者のreset()関数だと3.2秒と、ちょっとだけ速いかなという感じです。でもタイピングも少なくて済むし、こういうのの積み重ねが大事なので、今後はreset()を使うようにしようと思います。余談ですが、ラズベリー(raspberry)の綴りはちょっと意外でした。

 ここでひとつ押さえておくべきことは、上の$stackの例のように、もし配列のキーが定義されていない、つまりキーインデックスがゼロから始まるような配列ならば、わざわざ関数を持ち出さなくても、
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = $stack[0]; // 結果はorange、$stackは元のまま
?>
でこと足りるということです(これだと100万回の試行では2.4秒と最速)。これで済む場合はそうしますが、ppBlogの内部では、
Array
(
     [3] => orange
    [11] => banana
    [23] => apple
    [29] => raspberry
)
みたいに、キーの添え字にも意味がある処理が多いです。

 

— posted by martin at 06:36 pm   commentComment [0]  pingTrackBack [0]

新しいテーマ: カラム切り替え型

category-icon

 こんばんは。ppBlogのテーマ(スキン)は、数少ないのですが、以前作りかけだったのを少しいじって、とりあえずアップしておきます。見栄えはFirefoxで確認しています。一応、IE6向けの記述も入れていますが、細かいところまでは追っていないです。

 主な特徴を挙げると、

  1. 3ペイン(3カラム)と1カラムの切り替え型。
  2. ソース上は、メインコンテンツ(つまりブログ記事)が、サイドバー内容よりも先行する。
  3. テキストエディタで、幾つかの色を置換するだけで、ぐっと見栄えが変わるので、何パターンか配色を用意しやすい。
  4. カラムの切り替え情報をクッキーに保存するので、ページを更新しても、1カラムなら1カラムを再現する(タイムラグがあってスムーズではないですが・・・)。

ってとこです。テーマに含まれるCSSファイルを見ると分かりますが、先頭に

/*
 基本カラー: beige
 基本リンクカラー: darkslateblue
 基本 a:hoverカラー: palevioletred
 基本 li:hoverカラー: #feffe9
*/

のようにコメントを入れています。お使いのテキストエディタで、この部分にある色を一括置換(例えば、beigeをyellowに連続置換)するだけで、ガラッと見栄えが変わります。今どきのテキストエディタでは、連続置換・一括置換はついていることが多いと思いますが、個人的に愛用しているのは、フリーとは思えないぐらい使い勝手の良いタブ型エディタであるYokkaLink さんのDeuxEditorG(ドゥエディタ)です。差分チェック機能なども付いていて、とにかく高機能です。

 とりあえず4種類ほど、配色を変えたパターンを用意したので、それぞれのスクリーンショットを付けておきます。

beige
ベージュ系のシックなやつ。
mossgreen
柔らかなグリーン系。
lavender
ラヴェンダー~うす青色系。
rosepink
ローズ系ピンク。

 現状、ppBlogでは、テーマ1つにつき、テーマディレクトリ1つが対応しているのですが、テーマの情報を保存しているowner/theme.ini.phpを直接いじることで、同じテーマディレクトリを使い回すということが可能です。例えば、この新しいテーマのディレクトリ(フォルダ)名は、3colv2なのですが、その中に4種類の配色パターンを指定したCSSを入れておけば、テンプレートのtemplate.phpや画像を入れているImagesディレクトリなどは使い回しができます。具体的には、以下のようにowner/theme.ini.phpをいじると良いです(このサイトでの指定例)。

<?php $THEME_LIST = array(
'ベーシック'=>'theme/basic/basic.css',
'3pane'=>'theme/3pane/3pane.css',
'ベージュ'=>'theme/3colv2/beige.css',
'モスグリーン'=>'theme/3colv2/mossgreen.css',
'ラヴェンダー'=>'theme/3colv2/lavender.css',
'ロースピンク'=>'theme/3colv2/rosepink.css',
);?>

 共通して、3colv2というディレクトリを指定している部分がポイントです。

 とりあえず、3colv2のフォルダの中に、4種類のCSSファイルを付けた状態で添付しておきますので、お好みで好きなのを選んだり、色んな色を試して下さい。後、参考までにこのサイトのowner/theme.ini.phpも添付しておきます。

添付ファイル: theme.ini.phpattachedIcon  3colv2.zipattachedIcon 

— posted by martin at 08:01 pm   commentComment [0]  pingTrackBack [0]

しぃペインターのアニメーションを入れてみる

category-icon

 こんばんは。しぃペインターのアニメーションを入れてみます。比較的簡単に実装できた様です。しぃペインターのアニメーションファイルであるPCHファイルを再生するには、専用のビューワーであるPCHViewer.jarが必要で、後、補助として、res.zipファイルも必要のようです。これらのファイルは、しぃちゃんさんのサイトLink からダウンロード出来ます。

 これら2つのファイルをmodulesディレクトリに入れます(res.zipは解凍せずにこのままで)。後は、作成したPCHファイルを、以下の形式で指定すればOKです。

[media:ppdraw1238971539.spch:300:pch/]

 わざわざ、この形式を書き出すのはメンドイので、「動画サイト選択」のプルダウンメニューに「PCHファイル」という項目を追加しました。これで、上の例で言えば、テキストエリア内にppdraw1238971539.spchという文字列があれば、それを上のmedia形式に書き換えます。

ppdraw1238971539
例によってマウスで適当に。所要時間は1分ほど。

 尚、生成されたPCHファイルは、初めは、キャッシュディレクトリに作られます。便利なことに、このPCHファイルは、しぃペインターで呼び込むことが可能です。なので、レジューム機能(再開)も利用できるようにしてます。管理画面エディタの「しぃペインター」ボタンを押すと、このディレクトリにあるPCHファイルをリスト表示するので、その中から任意のPCHファイルを選択できます。また、この画面で「通常モード」か「プロモード」かを選べるようにしました。


— posted by martin at 09:33 am   commentComment [2]  pingTrackBack [0]

T: Y: ALL: Online:
Created in 0.0074 sec.
prev
2017.11
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