2016/09/11(日)RecentChangesページを考慮したブラウザキャッシュ制御

PukiWiki: RecentChangesページを考慮したブラウザキャッシュ制御

PukiWiki If-Modified-Since(条件付きリクエスト)対応のコメントでやりとりしていた、RecentChangesページを考慮したブラウザキャッシュ制御の機能をbodycache改良版に追加しました。

PukiWiki bodycache改良版のページで公開しています。なお、追加機能を使うには設定が必要です。*1

RecentChangesを考慮したページ更新日時

基本的な方針は、「Wikiページキャッシュ更新日時とRecentChanges更新日時のうち新しい方」をページの更新日時と見なすというものです。

以下の関数がこの新しい方の更新日時を返す関数です。$bodycache_lastmod_whatsnewはpukiwiki.ini.php内の設定で、$bodycache_lastmod_whatsnewがtrueの時のみこの機能は動作します。

  • bodycache.php
    // Get last-modified time for client side cache control
    function get_lastmodtime($page)
    {
    	global $bodycache_lastmod_whatsnew;
    	global $whatsnew;
    	static $lastmodtime = null ;
    	if ($lastmodtime !== null) {
    		return $lastmodtime ;
    	}
    
    	$cachetime = get_cachetime($page);
    	if ( $cachetime != 0 && $bodycache_lastmod_whatsnew ) {
    		$whatsnewtime = get_filetime($whatsnew);
    		$lastmodtime = ( $cachetime >= $whatsnewtime ) ? $cachetime : $whatsnewtime;
    	} else {
    		$lastmodtime =  $cachetime;
    	}
    
    	return $lastmodtime;
    }
    

この関数が返す日時を、ブラウザに返却するLast-Modifiedや、If-modified-sinceの比較に用いることで、RecentChanges更新時にはブラウザキャッシュも更新される動作になります。

追記

get_lastmodtimeは複数回呼ばれるので、処理量を減らすために1回目に呼ばれたときの結果を$lastmodtimeに残して2回目以降は$lastmodtimeを返すだけにしているのですが、今の書き方では引数の$pageを変更して呼ばれると正しく動作しなくなってしまいます。

今のコードでは、$pageを変更してget_lastmodtimeを呼ぶことはないので問題は起こりませんが、get_lastmodtimeの引数を変えてはいけないという制約ができてしまっているのであまり良くないですね。(うっかり忘れて将来事故を起こしそう^^;)そのうち修正するかもしれません。

*1 : 機能が不要な場合に負荷が増えないように。

その他のbodycache改良版の更新

更新のついでに、bodycache.php内の不要な記述の削除とコードインデントのタブへの統一*2も実施しました。

また、bodycache.php内にあった設定用の変数$bodycache_del_depthをpukiwiki.ini.phpに移動しました。

*2 : PukiWikiのコードが基本的にタブだったので。

2016/07/30(土)さくらのレンタルサーバーにPHP7を導入

2016年12月14日からPHP7.1が使用できるようになったので、この作業をする必要は無くなりました。→さくらのレンタルサーバ PHP7.1 提供開始のお知らせ | さくらインターネット

さくらのレンタルサーバーにPHP7を導入

さくらのレンタルサーバーがなかなかPHP7に対応しないので自力でインストールしてみました。

注意:この方法でPHP7を導入した後は、自身の責任においてセキュリティーアップデート(最新版の再導入)をしてください。

続きを読む

2016/03/20(日)PukiWikiを1.5.1に更新

PukiWikiを1.5.1に更新

ECO-Wiki (acronia)で使っているPukiWikiは2015/03/25のスナップショットでしたが、PukiWiki 1.5.1 がリリースされたのでバージョンアップしました。

改造箇所があるのでdiff-patchで適用しましたが、大きな修正が必要な衝突もなく上手く動いているようです。

続きを読む

2016/02/28(日)働クリッカーをやってみた

働クリッカーをやってみた

一週間くらい前に働クリッカーで遊んでてtwitterに最速クリアタイム載せたりしてたのですが、クリアタイムが環境依存でそれだけ見てもよく分からないので、ソースコードを載せてみます。

そのうち解説/攻略みたいなの書くかも?

全実績解除

最初は資格とプログラミングをバランス良く買う。170msくらいだった。

(function(g){
  var purchase = g.purchase;
  var work = g.work;
  var i,j,k;

  start();
  //働きつつ資格とプログラミングを買う
  for(i=27;i;i--){
    for(j=124;j;j--){
      for(k=8;k;k--){
        work();
      }
      purchase(0);
    }
    for(k=107;k;k--){
      work();
    }
    purchase(4);
  }
  //働きつつプログラミングを99まで買う
  var work_num = 90;
  for(i=73;i;i--){
    for(j=work_num;j;j--){
      work();
    }
    purchase(4);
    work_num+=3;
  }
  //働いて一億+残りの買い物の費用を稼ぐ
  for(i=25285;i;i--){
    work();
  }
  //買い物する
  for(i=99;i;i--){
    purchase(3);
    purchase(2);
    purchase(1);
  }
  purchase(1);
})(this);

全実績解除その2

最初は資格だけを買う。170msくらいだった。こっちでも大して速さ変わらないという(^_^;)

(function(g){
  var purchase = g.purchase;
  var work = g.work;
  var i,j,k;

  start();
  //働きつつ資格を買う
  for(i=3600;i;i--){
    for(k=8;k;k--){
      work();
    }
    purchase(0);
  }
  //働きつつプログラミングを99まで買う
  var work_num = 30;
  for(i=154;i;i--){
    for(j=work_num;j;j--){
      work();
    }
    purchase(4);
    work_num+=1;
  }
  //働いて一億+残りの買い物の費用を稼ぐ
  for(i=24550;i;i--){
    work();
  }
  //買い物する
  for(i=99;i;i--){
    purchase(3);
    purchase(2);
    purchase(1);
  }
  purchase(1);
})(this);

ゲームクリアのみ

ゲームクリア(一億円達成)のみ。120msくらい。

(function(g){
  var purchase = g.purchase;
  var work = g.work;
  var i,j,k;

  start();
  //働きつつ資格とプログラミングを買う
  for(i=22;i;i--){
    for(j=124;j;j--){
      for(k=8;k;k--){
        work();
      }
      purchase(0);
    }
    for(k=120;k;k--){
      work();
    }
    purchase(4);
  }
  //働いて一億稼ぐ
  for(i=21287;i;i--){
    work();
  }
})(this);