PHP IRC Log ViewerをリファクタリングしてTiarra対応にしてみた

日本では廃れてしまった感のあるIRCですが、海外の開発コミュニティでは未だよく使われています。

なので、私もTiarraでログをとっているチャネルがあるのですが、ログファイルはエディタでは読みづらいので、ログビューアが何かないか探してみました。

そして、GitHubで以下のPHP IRC Log Viewerというのを見つけました。

必要な最低限の機能があり、これでいいように思えました。

インデックスページ: スクリーンショット

日付別のページ: スクリーンショット

ところが、実際に使ってみると、ログファイルのフォーマットが違うという問題がありました。

リファクタリング

そこで、このPHP IRC Log Viewerに手を入れようと思ったのですが、4年前に作られたもので作りがレガシーで、ロジックも分散していて変更しづらかったので以下のようにリファクタリングしました。

  • クラスの導入
    • 分散していたロジックや関数をクラスにまとめる
  • Autoloaderの導入
  • コーディングスタイルを今風に

ログフォーマットに関する知識は、

  • libs/LogFormatOrig.php(元々のログフォーマット)
  • libs/LogFormatTiarra.php(Tiarraログフォーマット)

にあるクラスにまとめました。

ということで、

まだ、ビューでグローバル変数がそのまま使われているなどレガシーさが残りますが、それなりに改善されたと思います。

Tiarraでの使い方

デフォルトはTiarraのログフォーマットになっていませんので、ログフォーマットのクラスをTiarra用に変更します。

--- a/index.php
+++ b/index.php
@@ -34,9 +34,9 @@ $format = $uri_match_date && in_array($m[2], $valid_formats) ?
 //var_dump($uri, $uri_match_date, $uri_match_index, $date, $format); exit;

 // for Original sample logs
-$logFormat = new LogFormatOrig($channel);
+//$logFormat = new LogFormatOrig($channel);
 // for Tiarra logs
-//$logFormat = new LogFormatTiarra('');
+$logFormat = new LogFormatTiarra('');

 $logManager = new LogManager($logdir, $logFormat);

PHPビルトインWebサーバの起動スクリプトを用意してありますので、設定を変更します。特にログファイルのあるフォルダを環境変数APP_LOGDIRに設定します。

--- a/local.sh
+++ b/local.sh
@@ -1,6 +1,6 @@
 #!/bin/sh

-#APP_CHANNEL=rest \
-#APP_NETWORK=irc.freenode.net \
-#APP_LOGDIR=./logs \
+APP_CHANNEL=fuelphp \
+APP_NETWORK=irc.freenode.net \
+APP_LOGDIR=./logs \
 php -S localhost:8000 router.php 

これで、

$ ./local.sh

としてWebサーバを起動し、http://localhost:8000/にアクセスします。

PHP 5.3の場合は、別途、Webサーバを用意して環境変数も設定してください。

関連

Tags: php, irc

電脳書房に書籍を売るためのCSVファイル作成ツールをFuelPHPで作ってみた

電脳書房というプログラマ御用達のコンピュータ書籍専門の古書店があります。

ここに書籍を売る場合、書籍のリストをCSVファイルで送り事前に見積りしてもらうと、値段がついた書籍10冊につき500円プラスして買い取ってもらえます。

そこで、書籍リストのCSVファイルを作成するためのツールをFuelPHP 1.7で作成しました。

インストール

$ git clone https://github.com/kenjis/csv-maker-for-bookcyber.git
$ cd csv-maker-for-bookcyber
$ php composer.phar install

起動

PHP 5.4以上の場合、

$ php oil server

これでPHPのビルトインWebサーバが起動しますので、http://localhost:8000/にアクセスしてください。

PHP 5.3の場合は、別途、Webサーバを用意し、csv-maker-for-bookcyber/publicフォルダをブラウザからアクセス可能に設定してください。

使い方

見たらわかると思いますが、売りたい書籍を書籍タイトルでキーワード検索して、リストに追加したい書籍をクリックし、リストが完成したらCSVファイルをダウンロードしてください。

スクリーンショット

それだけしか機能はありません。「書籍の状態」は記入できませんのでダウンロードしたCSVを表計算ソフトで加工してください。

アプリのソースは、

にあります。ページのデザインもひどいですし、テストもありません。ソースを見て直したくなった人はPull Requestしてください。:-)

関連

Tags: fuelphp

CodeIgniter 2.xのDatabaseクラスを外部から利用する

CodeIgniterのDatabaseクラスを外部から使う方法を考えてみました。CodeIgniter 2.1.4で確認しています。

CodeIgniter/dbtest.php:

<?php

// CodeIgniterの定数
define('APPPATH', __DIR__.'/application/');
define('BASEPATH', __DIR__.'/system/');

// 実行に必要なファイルや関数などを準備
require BASEPATH.'database/DB.php';
require BASEPATH.'core/Common.php';
require BASEPATH.'core/Controller.php';
function &get_instance()
{
    return CI_Controller::get_instance();
}
new CI_Controller();

// ここからがDatabaseクラスを使うコード
$db = DB();
$query = $db->query('SELECT * FROM example');

foreach ($query->result() as $row)
{
   echo $row->id . ' ';
   echo $row->language . "\n";
}

ここでは、ファイルをCodeIgniterフォルダに置いてますが、定数のパスを調整すればどこにでも配置できます。また、データベース設定はCodeIgniterのデータベース設定ファイルに記載していますが、DB()関数にDSNで渡すことも可能です。

コマンドラインから実行してみます。

$ php dbtest.php 
1 PHP
2 Java
3 Ruby
4 Python
5 Perl

はい、動作しました。

意外に簡単に動きましたが、名前空間を使っていないCodeIgniterなので、グローバル空間にCodeIgniterの定数や関数、クラスが配置されるのはいたしかたないですね。

もし、それが問題になるとしたら、CodeIgniterのコードに手を入れて名前空間を加えるか、作成するアプリの方の名前を衝突しないように変更するしかないでしょうね。

まあ、作成するアプリに名前空間を付けて、関数は使用しないというコーディングをしていれば、まあ問題になることはないと思いますが。

Tags: database, codeigniter