Hatena::ブログ(Diary)

bonlife このページをアンテナに追加 RSSフィード

言及ISBN/ASIN
  • Ringo EXPO 08 [DVD]
  • 三文ゴシップ
  • my way
  • ビジネスパーソンのための話し方入門 (日経文庫)
  • ザ・グーグルウェイ グーグルを成功へ導いた型破りな戦略
  • 考え・書き・話す3つの魔法
  • 自分の答えのつくりかた―INDEPENDENT MIND

2007-02-23 椎名林檎の音がゴージャス過ぎます。

PukiWikiのshowrssプラグインを改造して表示件数を制限するサンプル

会社休んで花粉症の薬をもらうために病院に行く予定でしたが、寝坊してすっかりテンションダウンのbonlifeです。市販の薬飲んだら眠いのなんのって…。

さてさて、人力検索はてなhttp://q.hatena.ne.jp/1172196359 を見て、RSSの表示件数ぐらい制御したいよなぁ、と思ったのでPukiWikiの plugin/showrss.inc.php を修正してみました。もっと上手いやり方もありそうですが、とりあえずなノリで。

まず、USAGEを修正してやる気を出す。

  • 後ろに引数を1つ追加して表示件数を制御させる想定
define('PLUGIN_SHOWRSS_USAGE', '#showrss(URI-to-RSS[,default|menubar|recent,Cache-lifetime,Show-timestamp,Show-number])');

続いて、plugin_showrss_convert関数を修正。

  • 追加した引数を$shownumとして処理
  • $shownumが数値かどうかのチェック
  • $shownumが指定されなかった場合、$rssの件数を取得し、それを$shownumにセット
  • オブジェクト生成時に$shownumを2つ目の引数で渡す
function plugin_showrss_convert()
{
	static $_xml;

	if (! isset($_xml)) $_xml = extension_loaded('xml');
	if (! $_xml) return '#showrss: xml extension is not found<br />' . "\n";

	$num = func_num_args();
	if ($num == 0) return PLUGIN_SHOWRSS_USAGE . '<br />' . "\n";

	$argv = func_get_args();
	$timestamp = FALSE;
	$cachehour = 0;
	$template = $uri = '';
	$shownum = '';
	switch ($num) {
	case 5: $shownum   = trim($argv[4]);			/*FALLTHROUGH*/
	case 4: $timestamp = (trim($argv[3]) == '1');		/*FALLTHROUGH*/
	case 3: $cachehour = trim($argv[2]);			/*FALLTHROUGH*/
	case 2: $template  = strtolower(trim($argv[1]));	/*FALLTHROUGH*/
	case 1: $uri       = trim($argv[0]);
	}

	$class = ($template == '' || $template == 'default') ? 'ShowRSS_html' : 'ShowRSS_html_' . $template;
	if (! is_numeric($cachehour))
		return '#showrss: Cache-lifetime seems not numeric: ' . htmlspecialchars($cachehour) . '<br />' . "\n";
	if ( $shownum != '' && ! is_numeric($shownum))
		return '#showrss: Show-Number seems not numeric: ' . htmlspecialchars($shownum) . '<br />' . "\n";
	if (! class_exists($class))
		return '#showrss: Template not found: ' . htmlspecialchars($template) . '<br />' . "\n";
	if (! is_url($uri))
		return '#showrss: Seems not URI: ' . htmlspecialchars($uri) . '<br />' . "\n";

	list($rss, $time) = plugin_showrss_get_rss($uri, $cachehour);
	if ($rss === FALSE) return '#showrss: Failed fetching RSS from the server<br />' . "\n";
	if ($shownum == '' ) $shownum = count($rss);

	$time = '';
	if ($timestamp > 0) {
		$time = '<p style="font-size:10px; font-weight:bold">Last-Modified:' .
			get_date('Y/m/d H:i:s', $time) .  '</p>';
	}

	$obj = new $class($rss,$shownum);
	return $obj->toString($time);
}

最後に表示処理を行う基本となるShowRSS_htmlクラスを修正。

  • カウンタ変数$iを使って、$shownumと比較しながら表示
  • $shownumで指定した回数表示したら処理を終了(return)
  • $shownumで指定した数が$rssの件数より多い場合、foreachまかせ
class ShowRSS_html
{
	var $items = array();
	var $class = '';
	var $i     = '';

	function ShowRSS_html($rss,$shownum)
	{
		$i = 1;
		foreach ($rss as $date=>$items) {
			foreach ($items as $item) {
				if ($i > $shownum) {
					return;
				} else {
					$i++;
				}
				$link  = $item['LINK'];
				$title = $item['TITLE'];
				$passage = get_passage($item['_TIMESTAMP']);
				$link = '<a href="' . $link . '" title="' .  $title . ' ' .
					$passage . '" rel="nofollow">' . $title . '</a>';
				$this->items[$date][] = $this->format_link($link);
			}
		}
	}

後ろの関数は省略してます。全表示の場合でも毎回$iとの比較を行ってしまうので、無駄が多いような気もしますね。表示件数が指定されなかった場合と指定された場合の関数を分けておいた方がスッキリするかもしれませんが、まぁ、そのあたりは素人なので気しないことにします。

以下のような感じで5つ目の引数に件数を指定すれば表示件数に反映されます。(下記の例では3件に制限。)

#showrss(http://d.hatena.ne.jp/bonlife/rss,menubar,24,0,3)

これを見た気が利くPHPプロな人がより良い方法を考えてPukiWikiに反映させてくれるんじゃないかなぁ、と期待しつつ。(それにしてもxamppって楽ですね。)

B0018AIY54
ポニーキャニオン GRAPEVINE
購入: 3人 クリック: 84回

2007-02-06 勉強が間に合いそうにありませんが、負けません。

MD5ハッシュ値を表示するスクリプトサンプル

最近C言語勉強を始めたbonlifeです。先日、ベンダーから会社で使っているミドルウェアのPatchが送られてきた時、MD5ハッシュ値メールに記載されていました。今まであまり気にしたことはなかったのですが、せっかくなので、簡単なスクリプトを書いて、確認してみることにしました。得意な言語がないので、色々と試しちゃいましたよ。(ファイルMD5ハッシュ値を調べることなんて滅多にないとは思いますが…。)

  • Perlのサンプル
#! /usr/local/bin/perl

use strict;
use warnings;

use Digest::MD5 qw(md5 md5_hex);

my @files;

foreach (@ARGV) {
    push @files, glob "$_" ;
}

foreach (@files) {
    eval {
        open (FH, $_) or die "Can't open '$_' : $!";
        binmode(FH);
        print Digest::MD5->new->addfile(*FH)->hexdigest, " : $_\n";
        close(FH);
    };
    if ($@) {
        print "error occured while processing '$_' : $!\n";
    }
}
  • Rubyのサンプル
require 'digest/md5'

ARGV.each {|file|

  begin
    print Digest::MD5.new(File.open(file,'rb').read), " : ", file , "\n"
  rescue
    abort(("error occured while processing '" << file << "' : " << $!))
  end

}
# coding: utf-8
import sys
import glob
import md5

# [参考URL]
# http://white.s151.xrea.com/wiki/index.php?cmd=read&page=memo%2Fpython%2Fmd5

def getMd5(path):
    m = md5.new()
    for f in open(path,'rb'):
        m.update(f)
#    m.update(open(path,'rb').read())
    return m.hexdigest()

for i in range(1,len(sys.argv)):
    for f in glob.glob(sys.argv[i]):
        try:
            print getMd5(f), ":", f
        except:
            print "error occured while processing '" + f + "' :", sys.exc_info()[0]
  • PHPのサンプル
<?php

for ( $i = 1; $i < count($argv) ; $i++ ){
    foreach (glob($argv[$i]) as $file){
        print md5_file($file) . " : $file\n";
    }
}

?>

全て結果は同じになりました!という当たり前の結果にちょっと感動したりして(苦笑)。

PHPコマンドラインで実行するのってやっぱり違和感ありますね。専用の関数があって一番楽なんですけどね。引数の1番目をどう扱うのかが言語によって違ってたりするのを体感できて面白かったです。Pythonだけ(他の人のスクリプトを参考にして)関数を定義していたり、バランスが良くないですが、まぁ、ご愛嬌。

ところで、そもそもMD5ハッシュ値ってどういう意味があるんでしょう。よく、ファイルダウンロードできるところで、そのファイルMD5ハッシュ値が記載されてたりしますが、改ざんに対しては無防備ですよね。(ファイル書き換えられるぐらいなら、WEBページも同時に書き換えるでしょうし。)DL途中にファイルが壊れなかったことの確認にはなるかしら。

最後に-Mスイッチでモジュール呼び出してる無理矢理感のあるPerlワイライナーも載せておきます。

perl -MDigest::MD5 -e 'foreach (@ARGV) { open (FH, $_) or die "open \"$_\": $! ";binmode(FH);print Digest::MD5->new->addfile(*FH)->hexdigest, " : $_\n";close(FH); }' filename [filename...]
perl -MDigest::MD5 -e "foreach (@ARGV) { open (FH, $_) or die \"open \'$_\' : $! \";binmode(FH);print Digest::MD5->new->addfile(*FH)->hexdigest, \" : $_\n\";close(FH); }" filename [filename...]

そんなこんなで、ワンライナーの中でシングルクォートを使う方法が分からないbonlifeなのでした。(誰かご存知でしたら教えてくださいませ。)

2006-11-26 明日はAPOGEEのライヴです。

「PHPによるデザインパターン入門」買いました

UNIQLOのカシミヤタートル(レディースのXL)を買ってついに女装デビューしたbonlifeです。いや、シルエットが少しタイトでメンズMより良かったんですよ。そんな私(ワタクシ)、「Do You PHP」なid:shimookaさんなどが書いた「PHPによるデザインパターン入門」を買ってみました。

PHPによるデザインパターン入門

PHPによるデザインパターン入門

Javaを無駄に避け続けている私にはデザインパターンは敷居が高い気もしますが、雰囲気(というより基本的な考え方)だけでも掴んでおきたいな、という甘い誘惑に負けて買ってしまいました。Perl勉強ばっかりしてても飽きてしまうので、たまにはPHPも、というノリもありつつ。これで読み進める本が6冊になりました…。どれもこれも遅々たる歩みになりそうですが、負けません。だって男の子ですから!

2006-08-21 RHODIAってローディアじゃなくてロージャって読むんですね。

「PHPカンファレンス2006」に行ってみました

研修の代休で今日までオヤスミのbonlifeです。なんだかもう髭が漂流民のようです…。8月19日の出来事。id:kidd-number5さんと「PHPカンファレンス2006」に行ってきました。kidd-number5さん、初対面の私に色々と教えてくださってTHANXです。(京ぽんや、MOLESKIN、RHODIAなど持ち物も良い感じの方でした。)ほど良い時間に会場に到着し、結構前の席で楽しんできました。(3列目ぐらいだったかしら。)

GREEなどでお馴染みの藤本さんの挨拶の後、まずは廣川類さんの基調講演。(あ、そういや廣川さんのはてなダイアリー、プライベートモードになっちゃいましたね。残念。)テーマは「PHPの今とこれから2006: PHPの最新事情」。気になったのはセキュリティ強化版PHP(hardened-php.net)のお話。速度低下が5%程度だったらオーケーな気がしちゃいます。(規模にもよるんでしょうけどね。)ここでの成果の一部はPHP6で取り込まれる可能性があるとか。PHP6におけるUnicode完全対応はインパクト大みたいです。mbstringが不要になっちゃうみたいですし。

続いて、Ethnaな藤本さん、symfonyな月宮さん、Mapleな高橋(id:kunit)さん、Zend Frameworkな(?)石川直人(ishinao)さんの4人によるフレームワークについてのパネルディスカッション。小山哲志さんがナヴィゲーター。なんとなくRailsのインパクトの大きさを思い知る内容でしたよ。話の端々で「Railsのパクリ、いやインスパイア」ってフレーズが飛び出しちゃう感じ。藤本さんもRailsライクなPHPフレームワークのCakePHPとか気にしてたようですし。Rails以前、以後でLLのフレームワークはだいぶ変わってきているようです。まさに戦国時代。フレームワークで出来ることがだいたい見えてきちゃってる的なことを藤本さんが言ってたなぁ。そこを乗り越えて次何を目指すか、というところにはまた大きなブレイクスルーがありそうな予感。とりあえずは、PHP本家ともいえるZendがZend Frameworkをそろそろ出すので、それによる変化をウォッチしていきたいです。とりあえず、それぞれのフレームワークの今後の展望について一言ずつコメントしていたものをメモ。

  • EthnaはRESTのCRUDをActiveRecordライクに簡単に書けるようにしたい
  • symfonyはしばらくはチケットの処理に追われる雰囲気
  • Mapleはプレゼンテーション層に特化していたが、今後はフルスタックを目指す
  • Zend Frameworkはシンプルに (ってishinaoさんが開発してるわけじゃないけれども)

その先がやっぱり気になりますよね。仮にZend Frameworkがデファクトスタンダードになったとして、その上のアプリケーション寄りの部分に各種フレームワークが乗ってくる感じになるのかしら。CUIベースからGUIベースになっていく動きについても注目しておきたいですね。Webブラウザ上でIDEが実現されて、簡単にWebアプリ作れちゃう時代が来たりするのかしら。ボタン1つでアプリが作れる時代になった時に技術者は何をすべきか、とかとか気になるところです。

午後はテクニカルな話題について。まずは小山哲志さんによる「AJAX with PHP」というテーマでのセッション。実際のサンプルアプリを使っての説明は非常に分かりやすかったです。(ホントに基本的な内容でしたが。)xhrって言葉が出てきて一瞬「何ソレ!」って思いましたが、XMLHttpRequestオブジェクトのことですね。勉強不足を痛感(苦笑)。JavaScriptの変数としてセッションIDを管理することでCSRFにも強いページを作れるってのが印象的でした。ただ、やっぱりログインした状態なのに画面を更新しただけでログイン画面に戻されちゃったらちょっと凹むケースも多いような。利便性とセキュリティって難しいわ。AjaxのUIの限界が見え隠れしてる今日この頃なので、個人的にはFlexあたりを交えたUIの話も聞きたかったです。

続いて大垣さんによる「危険なコード」についてのセッション。実際にsourceforgeで公開されているそこそこ人気がありそうなWebアプリのソースコードを使っての説明はリアルで面白かったです。「リスクはバウンダリにある」ってことをしっかり念頭においてWebアプリを開発しなさいよ!ってことですね。紹介されていた危険なコードとその対応について簡単にご紹介。

  • strip_tagsと共にallowable_tagsを設定した場合、許可したタグの属性部分にJavaScriptを埋め込まれちゃうことがありますよ
  • $_REQUESTを使うと属性ドメインの場合、DOSが簡単に起きちゃいますよ
  • PHP_SELFはパス情報を含むことが出来てしまうので、JavaScript埋め込まれちゃいますよ
    SCRIPT_NAMEで十分でしょう
  • クッキーの有効期限は短く
  • .incなんて拡張子にしてると丸見えになっちゃう可能性ありますよ
    .inc.phpで良いんじゃないの
  • Locationヘッダは絶対パス指定するところなのでお間違えなく

「危険なコード」の例が多過ぎて全部説明していただけなかったのが残念なところ。もっと色々と知りたかったなぁ。と思った方は以下の書籍を読むと良いらしいですよ。

Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?

Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?

続いてライトニングトーク。3人。まずは鈴木祥真さんによる「PEARに登録するまで」というテーマでのトーク。プレゼン内容とプレゼンの仕方が面白かったです。小山さんのもそうだったのですが、Appleのkeynoteのプレゼンはキレイですね。フォントが良い。(あれってOsakaかしら。)画面遷移のアニメーションもグルンとしててナイス。shomaさんは新たなプレゼン手法である「巻き戻し」も披露してました。ここは端折って…と飛ばしていくうちにラストのスライドが表示され、皆がビックリして注目したところで戻ってまとめについて説明するというスタイル。斬新!そういや、shomaさんは今流行のnewsingにも関係してるんですって。ほえー。

続いてSeiji Masugata(id:masugata)さんによるPHPコアのHackについてのトーク。変な動きをする関数の問題点をCのソースコードをたぐりながら追求していく様子を丁寧に説明してくれてました。ちょっとCに詳しい人だったら頑張れば出来そうな雰囲気でしたね。初心者の気分を忘れずにガッツで頑張る姿がアツかったです。最後に求職するなど、抜け目のなさも素敵。

最後はサイボウズ・ラボの鶴岡直也さんによる「Getting Rich with PHP4 (and Ethna)」というテーマでのトーク。ライトニングトークは普通5分でしょう!という突っ込みから始まる高橋メソッドでのプレゼン。(プレゼン資料で「Rich」って部分が欠けてる部分があったような気がしたのは気のせいかしら。)なんだかんだでPHP4でもEtnaやSimplePieとか使ってアレコレ出来るじゃん!って感じでした。そういや、廣川さんも基調講演で「私も何か作ろうと思ったらPHP4で書くと思います。」とか言ってたなぁ。

そしてそして、ラストはZeev Suraski氏による「PHP6 & The PHP Collaboration Project」というテーマでの講演です。(資料はこちら。)前日よりもなんとなく良い感じでした。内容については資料見ていただければだいたい書いてありますので割愛。そうそう、アシアル田中さんの通訳凄かったなぁ。時折内容飛ばしてたけど、前日のプロ通訳さんより話の内容を理解してるのでスムースでしたね。質疑応答では調べればすぐに分かる「PHP5ではいつ頃からOracleはサポートされますか?」なんて質問があってガッカリしましたが、質問をしようとする姿勢は見習いたいところですね。「PHP6はPHP5よりシンプルになりますか。」って質問はちょっと奥が深い気がしました。何をもってプログラミング言語を「シンプル」だと捉えるのか。便利な関数を沢山用意して、整理することで開発が簡単に行えるのがシンプルなのか、それとも無駄をそぎ落とした数少ないコマンドを組み合わせることで何でも実現できるようにするのか。(CISCとRISCみたいな。)Zeevさんが考えるシンプルは前者っぽいですよね。違うかな。

なんだかんだありましたが、日本のPHP界を支えている有名人を間近で見ることができて、良い刺激になりました。もう少し勇気があったら懇親会に参加してお友達作りたかったなぁ。まぁ、緊張しぃの人見知りなので無理な話ですが。タイミングが合えば今後もこういった集まりに参加していきたいところです。

後、どうでも良い話ですが、LOFTの店頭でRHODIAに「ロージャ」ってフリガナがふってあったので、「へぇ、ローディアとかロディアじゃなくてロージャって読むんだぁ…。」と思っていたのですが、最近完全にロディアが優勢ですよね。結局のところ、日本人としてはどう発音したら良いのでしょう。ロディアで良いのかしら、どうなのかしら。

2006-08-18 明日の夜には大阪です。

「エンタープライズPHP最新動向 Zend Framework Seminar with Zeev Suraski」に行ってみました

PerlだのRubyだの行ってますが、結局PHPが好きなbonlifeです。なんだかんだでプログラム開始30分前に着いてしまって1番乗り…(恥)。記憶が鮮明なうちに感想をメモっておきます。

まずは、ゼンド・ジャパン株式会社の代表取締役社長、鈴木義幸さんの挨拶。なんだかとっても緊張していた様子がビリビリと伝わってきてこっちまで緊張してしまいましたよ。色々言ってた気がしますが、忘れてしまいました。

続いて、「IBM System i5の現状ならびにPHPへの取り組みについて!」というテーマで日本IBM株式会社のシステムi事業部事業部長の野々下信也さんの講演。正直、IBMの製品ラインナップがよく分からないのですが、iSeries(i5)ってのでPHPがオフィシャルにサポートされたそうですよ。オフコンの進化版らしいのですが、オフコンがピンとこないんだから話になりません。無知って怖いわ…。中小企業のシステム担当者には朗報だったりするのかしら。どうなんでしょう。

次は「PHPを使ったOracle Database 活用法」というテーマで日本HP株式会社の篠田典良さんの講演。この方、ORACLE MASTER Platinum 9iの取得者なんですね。すごーい。この講演の中では「バインド変数の利用」ってのが重要っぽかったです。また後で勉強しなきゃ。後は…当たり前だけど結構実践されていない「テーブルの所有ユーザとアクセス・ユーザは分離すべき」などについての説明もあったりして。なんだか耳が痛い話です。それなりに勉強になりました。

続いて「オープンソース・アプリケーション開発の最前線 〜LAMP技術を活かしたシステム開発と製品開発〜」というテーマで株式会社CECの方の講演。「OpusSquare CRM」ってツール(とそれを使ったソリューション)の宣伝でしたね…。元となるSpikeSource社から提供されるパッケージ群は結構興味深かったです。オープンソースって言うと組み合わせによって予想外のトラブルが発生しちゃったりすることに不安があったりして(日本の保守的な)エンタープライズでは活用されていないと思うのですが、このSpikeSource社はちゃんとテストをした後にリリースしてくれるらしいのです。これは安心。提供されるツールも幅広かったですよ。案外使えるかもしれません。

そしてラストはZend Technologies Ltd.のCTOであるZeev Suraski氏の講演!テーマはZend Frameworkだったのかな。Zeev Suraski氏はPHP3の開発者なんですね。かなり早い時期からPHPの中心で活躍してきた猛者ですよ。講演の前半は「PHP使ってるサイト増えてます!」、「PHP開発者も増えてます!」、「多種多様なサイト、プロジェクトでPHP使われてます!」、「色んな人のお墨付きもらっちゃってます!」とかそんな自慢話でしたが、Zeev Suraski氏が話すとなんとなく重みがありました。「Simplicity」と「Community」がPHPの繁栄を支えている、っていう説明には納得。後、PHP5.2ではようやくPHP4より速くなるらしいです。良いねっ。後半のZend Frameworkの説明はサラッとしてました。仕様だけじゃなくて用例に関するドキュメントも充実させます宣言には期待したいところです。逐次通訳はなんだか疲れる感じでしたが、充実したヒトトキでした。

ただ質疑応答は結構酷かったですね…。文字コードがどうのこうの、など「それZeev Suraski氏に聞くこと?」って質問多数。完全な質問力不足ですね。通訳の女性はあきれた感じでしたが、Zeev Suraski氏はイヤな顔をしないで丁寧に答えてました。神!ただ、最後の質問ぐらいは明るい話題にして気分良く終わって欲しかったなぁ…。

ちなみに、帰り際にこの本をもらいました。2番目の講演者、篠田典良さんの著作ですって。後で読んでみます。

Oracle 10gによるPHP活用マニュアル

Oracle 10gによるPHP活用マニュアル

っと一番重要なことを書くのを忘れてました。運営者に文句2点。

  • 会場が寒いよ、死んじゃうよ
  • 水くらい用意してくれても良いじゃないの

まず、1点目ですが、ホントに寒かったです。日本の夏真っ盛りなのに会場は冷え冷え。半袖ボーイズは皆腕を組んでブルブル震えてましたよ。そりゃあ、講演者とか主催者関係者はスーツ着てますが、クールビズのご時勢、大半の参加者は半袖ですよ。ちょっと酷かったです…。帰り際、冷え過ぎた腕が変なしびれ方してかなり焦りました。

続いて、2点目。水くらい机に用意しておいていただきたかった。残念!(気分は児玉清。)「お暑い中、お集まりいただき…」とか言ってる暇があったら水をください。(って私は持って行っていたのですが。)休憩時に皆飲み物買ってたじゃないの。コーヒー用意してる暇があったら水をくださいませ。

ということで、明日はPHPカンファレンス!こっちはかなり楽しみです。