「プログラミング」タグアーカイブ

ログ解析「Visitors」

1秒で10万行を処理するフリーの超高速なログ解析ソフト「Visitors」

Visitorsはapacheのログを僅か数秒で解析して表示してくれる、コマンドラインベースのプログラム。Graphvizを利用するとリファラーを利用して視覚的なユーザ追跡(Tracking)も可能。通常はCron tabで解析結果を自動出力することを想定していると思われます。

しかし、この解析速度であれば、日時範囲を指定してオプションを切り替えながら、ログを比較してみたいものです。使いやすいGUIフロントエンドはないでしょうかね?

ちなみに、これ、ソースコードで配布されてます。Windowsにはコンパイルしたお試し版がありますけど、完全版実行ファイルは有料サービスです。以下にVisual C++ 2005での修正個所を記しておきます。

#tail.c
#line3
- #include <unistd.h>
+ #include "unix2win.h"

#visitors.c
#line22
+ #include "unix2win.h"
unix2win.h
#ifdef WIN32
#define snprintf	_snprintf
#define vsnprintf	_vsnprintf
#define strcasecmp	strcmpi
#define strncasecmp	strnicmp
#define ssize_t	int
#define inline __inline
#include <io.h>
#define off_t _off_t
#define read _read
#endif

firefox用アドオンfirebugでサイトレイアウト編集

これは凄い! Ajax最強のデバッグツール"FireBug 1.0"リリース

後藤大地氏の記事は「これは凄い!」と毎回名題されます。記事のタイトルに恥じず、このfirebug、本当にすごいです。

オフラインページは元より、閲覧しているサイトページも、firebugで編集出来ます。HTMLタグだけに留まらず、CSSやjavascriptまであらゆる要素を弄れるのです。

DOMツリーとサイト内マーカーを確認しながらのリアルタイム作業なので、RADプログラマーであれば、手に馴染むのではないでしょうか?私はCSSの雛形確認によく起動させています。

今時のJavaScriptコーディング法

そろそろきっちりJavaScript

ブラウザ毎に実装がまちまちでありながら、Ajax(エイジャックス)のようなユーザビリティ向上用に復権しつつあるJavaScript。最近のコーディング法では、関数ポインタのような使い方も可能です。クラスのような概念もあり、プログラミング言語としては十分実用的です。

過去に勉強した事がある人も、今一度再学習してみては如何でしょうか。

PerlとPHPでのヒアドキュメント構文の違い

Perlの場合。

print << EOF;
hello world!
EOF

PHPの場合。

echo <<< EOD
hello world!
EOD;

上記、何れも出力結果は次のようになります。

Hello world!

文末記号;(セミコロン)を置く場所が違ってたり、出力子<の数が異なったり、いろんな言語を使ってると混乱してケアレスミスを犯してしまいます。この僅かな違いが命取りですね。皆さんも気をつけて下さい。

STLの罠 iteratorの動作

C++のSTLライブラリを使い出してから、面倒な処理を書く手間が緩和されるのを体感します(もっとも、ライブラリの汎用性のため見慣れぬ難解な構文になり、返って可読性が悪くなる場合もあります)

今日はVectorコンテナへifstreamからファイル内容を読み込んだときのアクシデントを紹介します。なんと汎用性を持たせたら速度が劇的に遅くなってしまったのでした!

Vector以外のコンテナで影響が出ないようにiteratorを使った例[460KBで11秒]

std::vector vctr;
std::ifstream ifs;

ifs.open(FileName.c_str(), std::ios::in | std::ios::binary);
vctr.assign(std::istreambuf_iterator(ifs), std::istreambuf_iterator());
ifs.close();

Vectorのメモリ空間をファイルサイズ分確保し一気読みした例[460KBで0秒]

ifs.open(FileName.c_str(), std::ios::in | std::ios::binary);
ifs.seekg(0, std::ifstream::end);
vctr.resize(ifs.tellg());
ifs.seekg(0, std::istream::beg);
ifs.read(&vctr[0], vctr.size());
ifs.close();

両者の違いは、前者が1バイトずつファイルアクセス、後者がファイルサイズ分1回だけのアクセスとなります。iteratorの実装により動作は変わるでしょうが、少なくともVC2005のistreambuf_iteratorは効率が悪いです。バイナリ読み込みには使わないほうがいいでしょう。

Vectorは配列のラッパークラスとして、連続したメモリ空間が仕様で保証されています。したがって、後者のような一見危険に見えるコーディングでもOKとなるのでした。