« 2006年9月 | メイン | 2006年11月 »

2006年10月31日

デフォルト派のためのWindowsデフォルトテクニック
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

先週ウノウに入社しましたkomagataです。

入社したてなのでPCのセットアップなどをやっていました。便利なフリーソフトでも紹介できればよいのですが、僕はWindowsには「なるべく余計なソフトを入れずに済ませたい」というデフォルト派なのでデフォルトでWindowsを便利に使うためのTipsを少し紹介できればと思います。

Windowsキーを積極的に使う

軟弱なキーと思われがちなWindowsキーですがWindowsをデフォルトで使うには欠かせません。ショートカットキーを表記する場合はEmacs等のC-sのようにWindowsキー+eはW-eと表記します。(本当か?)

  • W-e --- エクスプローラ起動
  • W-d --- デスクトップの表示/非表示
  • W-w --- ウインドウを閉じる(=M-F4)
  • W-l --- コンピュータのロック
  • W-m --- 開いている全てのウインドウを最小化
  • W-M --- 上記最小化のキャンセル
  • W-f --- ファイル検索
  • W-r --- ファイル名を指定して実行(重要!)

2つのランチャーを使い倒す

Windowsにデフォルトで入っている至高のランチャー、それが

file_launch.png

“ファイル名を指定して実行”

と、

quick_launch.png

“クイック起動”

です。

これらを便利に使いこなすためには、以前人気になったこともあったこの一覧を頭に叩き込みます。
“ファイル名を指定して実行”から素早くフリーセルを立ち上げ、仕事をサボるようになれば一人前です。

更に“クイック起動”のフォルダにパスを通せば“クイック起動”に放り込んだショートカットが“ファイル名を指定して実行”からも実行できるようになって一石二鳥です。

クイック起動のフォルダ:

C:\Documents and Settings\ユーザー名\Application Data\Microsoft\Internet Explorer\Quick Launch

2launch.png

(hosts.batはhostsファイルをメモ帳で開くだけのバッチファイル)

また、開発者の方はコレを“クイック起動”に置けばマウスを使わずにunix環境へ入れて便利です。

他にも便利なデフォルトテクニックを見つけたら教えてください。

追記1

p0t: デフォルト派のすすめ

デフォ派ですが…ファ実で補完が効かない?

「インラインオートコンプリート」がオンになってないわけではなくて?

Posted by: Bar | 2006年11月01日 15:59

個人のブログの方で教えていただきました。

inline_completion.png

インラインオートコンプリートをオン(デフォルト)にすると、

launch_completion.png

“ファイル名を指定して実行”でも補完が!

追記2

nak2kのメモ帳 - 環境変数PATHEXTを使ったJavaScriptの実行

環境変数PATHEXTに拡張子を追加設定すると、例えばhello.jsであればhelloと入力するだけでスクリプト実行できて便利ですよ。

ただ、デフォルトでは拡張子.jsはWScript.exeに関連付けられているので、CScript.exeで動かしたい場合は新しい拡張子.jscとでも追加して、それをCScript.exeと関連付けてから上記の環境変数設定まで行うといいです。

はてブのコメント欄で教えて頂きました。

PATHEXTなんて環境変数があったなんて知りませんでした。それにcscriptなんてものがあったこともはじめて知りました。

言語毎のエンジンとは別にスクリプトホストがあるんですね。

  • wscript --- 出力をGUIのウィンドウに出す。
  • cscript --- 出力をCUIの標準出力に出す。

(via Windows管理者のためのWindows Script Host入門

激しく便利そうです。

C:\Documents and Settings\komagata>cscript
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
 
使い方 : CScript scriptname.extension [オプション...] [引数...]
 
オプション :
 //B         バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
 //D         アクティブ デバッグを使用可能にする
 //E:engine  スクリプト実行時にエンジンを使用する
 //H:CScript 既定のスクリプト ホストを CScript.exe に変更する
 //H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
 //I         対話モード (既定値、//B と逆の動作)
 //Job:xxxx  WSF ジョブを実行する
 //Logo      ロゴを表示する (既定値)
 //Nologo    ロゴを表示しない : 実行時に見出しを表示しない
 //S         このユーザーの現在のコマンド ライン オプションを保存する
 //T:nn      秒単位のタイムアウト時間 :  スクリプトを実行できる時間の最大値
 //X         デバッガでスクリプトを実行する
 //U         コンソールからリダイレクトされた I/O に Unicode を使用する

デフォルト派のjs好きはGreasemonkeyやSpiderMonkeyじゃなくてcscriptで頑張るしか?

2006年10月30日

携帯サイト作成時の注意点(SoftBank編)
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

はじめまして。今月ウノウの一員になりましたharukです。

前職では携帯サイトを作っていました。
その際につまづいた点を少しまとめてみたいと思います。
SoftBank編です。


技術資料はこちらにあります。
http://developers.softbankmobile.co.jp/dp/tool_dl/list/

[HTTP編 2.0.0 2006-10-01]
●locationでのリダイレクトの回数は制限されている (P144)
C型は2回、それ以外は3回まで
できる限り、連続でリダイレクトは行わないようにしましょう。

●metaタグでContent-Typeを指定する (P190)
指定をしておかないと、UTF-8になってしまってUTF-8のリクエストが飛んできたりします。

[HTML編 2.0.0 2006-10-01]
●使用してはいけないクエリ名がある (P51)
pid,sid,uid,lid,gid,rpid,rsid,nl,cl,ol,pl,jsky(*),prc,cnt,reg,vsekey,vsernk
は公式CPしか使っちゃいけないらしいので
リンクやformでは使用しないようにしましょう。

●nonumber属性が3GCから使えなくなった (P135)
accesskeyにしましょう

●mailtoでの本文はUTF-8の文字列をエンコード (P138)
3GCまではmailbody属性が使えましたが
3GCでは使えませんので、日本語を使用する場合はUTF-8の文字列をurlencodeして使って下さい。

●3GC型端末の中には絵文字を違う形式で送ってくる端末がある (P34,P211~222)
従来の、[0x1B]$[G,E,F,O,P,Q](*)[0x0F]という形式ではなく、
UTF-8またはShift_JISの外字領域のコードで送出されてきます。
同じく資料の中で以下のことが再三書かれています。

一部の3GC型端末では、絵文字は送出を保障しないことに注意すること

知っている限りでは、
・絵文字を送ってこない(削除されたものが送られてくる)
・全角空白で送ってくる
端末がありましたので、すべてに対応することは不可能です。

[その他]
●J-PHONE => Vodafoneにはlocal-partに「?」「/」「+」などが使えた
(http://developers.softbankmobile.co.jp/dp/tech_svc/mail/)
@?.vodafone.ne.jpのメールアドレスの入力チェックなどを行う際に注意が必要です。
@softbank.ne.jpの場合は新しく設定し直す形式のため、一般的(?)になりました。


という感じです。
詳細は資料をきちんと見ないといけませんが
量が量なので、その中でもつまづいた記憶がある箇所を書いてみました。

少しでもお役に立てれば幸いです。

2006年10月27日

PHPのちょっとしたコツ
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

Keitaです。

個人的には、Pythonの思想を取り入れた JavaScript 1.7 がとても気になっているのですが、それは明日の Keita(個々一番さん)が説明してくれると思うので楽しみに待つことにしましょう☆
ウノウの社員は、スルー力も必要なようです。

さて、そんな世迷言はみなかったことにして、PHPの話題です。
PHPいいよ、PHP素敵だよ。

さて、今回は日ごろ気をつけているPHPのコーディングのコツをTIPS形式で書いていこうと思います。

しかし、はるか過去にいろいろな所で情報収集したので情報の出典を忘れてしまいました。
わかる限りはURLを記載していきますが、記載されてない所があったらすいません&コメントで補足いただけると助かります。

1. array_pushは遅い
いくつかのBlogで語られてることですが、array_pushは、次のような書き方のほうが早いそうです。

	//array_puth($array, 'arraydata');
	$array[] = 'arraydata';

PHPをいじってきた感想でいうと、全体的に組み込み系の関数の類を使うよりは、PHPの構文として定義されているものを利用するほうが早いことが多いです。

2. array_key_existsよりハッシュを使え
array_searchは、毎回全データを検索するので遅いです。
データに配列の順序が関係ないなら、連想配列 + issetを使うほうが高速です。
連想配列の場合ハッシュの仕組みが使われるのでその分高速です。
同様に、array_key_existsよりissetのほうがはるかに高速です。


//$array[] = 'arraydata';
//if (array_search('arraydata', $array)) {
// echo 'あるよ。';
//}

$array['arraydata'] = 'arraydata';
if (isset($array['arraydata'])}
echo 'あるよ。';
}


上の2つの、array関係は、多数の値がある場合に結構変わってきます。

※情報が不正確でしたこちらの記事を参照ください


3. $_ほげほげは直接使わない
これは心得の問題です。
$_GETや、$_POSTなどの値は直接使わないようにしましょう。
特に$_SERVERには、外部から送られてくる値を直接格納している場合がありますのでこれを直接使うとひどい目にあいます。
一般的なフレームワークなら、これらをラッピングする関数などが準備されているハズですのでこれを使いましょう。

4. if文は「===」を使う
PHP勉強会で、Dinoのhnwさんに教わったことですが、'0.00' == '0'は真です。
もし、仮に、パスワード処理でデータ側でMD5などのハッシュ化してない場合に、上記が真になっては非常にまずいのではないでしょうか。
さらにいえば、もっといろいろな形で、真となる場合があるので「==」は使わず、「===」を使いましょう。

    if ($str === 'hoge') {
    if (! ($str === 'hoge')) {
    if (is_null($null) === false) {
5. countは配列数を毎回数えてる これを知ったのは、Pukiwkiのクリーンアップの記事を見たときなのですが。 countは配列の件数を数えるらしいので次のような書き方に直したほうが無難です。
    // if(count($array))
   if(! empty($array))
   // for($i = 0; $i < count($array); $i++)
   $count = count($array);
   for($i = 0; $i  < $count; $i++)
※毎回数えてるわけではないらしい。 お詫びして訂正します。

まぁ、基本的に、ZendFrameworkや、Pearのコーディング規約でことたりるような気もします。

2006年10月26日

Firefox 2.0に移行する際のお勧め設定(中級編)
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちわ、hide です。

10月25日早朝にFirefox 2.0が正式にリリースされました。少し前にInternet Explorer 7も英語版がリリースされていたりして、最近Webブラウザ周りがにわかに熱いようです。

Firefox 2.0の主な変更点は次の通りで、レンダリングエンジン自体に変更はないとのこと。先日のジュンヤさんのエントリにRC2の先取りレビューがあるので、個々の機能についてはそちらを参考にして頂ければと思います。 Firefox 2
  • デフォルトテーマのデザイン変更
  • フィードのプレビュー機能とRSSリーダ購読機能
  • タブ機能の強化
  • 検索バーでのサジェスト機能
  • JavaScript 1.7


さて、今日はFirefox 2.0に移行する際のお勧め設定について書きます。通常の設定画面では行えない、中級者以上の方向けのちょっとだけマニアックな設定です。と言ってもそんなに難しくないので、初心者の方でも自分で責任をとれる方は挑戦してみてください。

その方法ですが、ロケーションバー(URLが表示されるところ)に“about:config”と入力してください。変数がたくさん表示されますが、フィルタで絞り込むと目的の変数を探しやすくなると思います。値を変更するには、行をダブルクリックすると入力ボックスが表示されたり、trueとfalseが入れ替わったりします。たまにこの変数がなかったりするのですが、その場合は焦らずに 右クリック→[新規作成] を選択すればOKです。

about_config.png


設定方法が分かったところで、お勧めの設定を一つずつ説明していきます。
1.xで使えていた拡張機能を有効にする

拡張機能のバージョンチェックを無効にします。2.0にアップグレードして、今まで使えていた便利な拡張機能が軒並み使えなくなるのではないかと心配していたのですが、この設定をすることで多くの拡張機能はそのまま使えるようです。
ただ使えなかったのが、Tab Mix Plus。これはFirefox2.0自体が、タブ並び替えや閉じるのアンドゥ機能、セッションリストア機能を備えているので必要ないかもしれません(Dev-Build版は2.0でも動作するようです)。

設定名:extensions.checkCompatibility
値:false

タブの閉じるボタン

1.xの頃と違って、閉じるボタンが各タブに表示されるようになりました。気に入らない人は、カスタマイズしましょう。私は "0" (アクティブなタブだけに表示)に設定しています。

設定名:browser.tabs.closeButtons
値:0 (アクティブなタブにだけ表示)
1 (全てのタブに表示) デフォルト
2 (表示しない)
3 (タブバー右端に表示) 1.xと同じ

スクロールが始まるタブ幅を変更する

2.0になって、一度に多くのタブを開いた際に横スクロールするボタンが追加されました。しかし、スクロールをし始めるのが早すぎる感じがします。この値を小さくすることで、より多くのタブを開いてもスクロールしにくくなるように設定します。私は、50 に設定しています。

設定名:browser.tabs.tabMinWidth
値:100 デフォルト
0 (スクロール無効)

グーグル等のページ先読みを止める

Firefoxにはページの先読み機能があって、例えばグーグルの検索結果の最上位ページを裏で先読みしたりしています。見もしないページでも勝手にアクセスされてしまうのは気持ち悪いし、履歴にも残ってしまうので無効にします。

設定名:network.prefetch-next
値:false

スペルチェックを止める

この設定は、日本語版を使っている方には関係ありません。英語版で新たに追加されたスペルチェック機能の調整を行います。

設定名:layout.spellcheckDefault
値:0 (無効にする)
1 (textareaでのみ有効) デフォルト
2 (inputフィールドも有効)

個人的には、Pythonの思想を取り入れた JavaScript 1.7 がとても気になっているのですが、それは明日の Keita(個々一番さん)が説明してくれると思うので楽しみに待つことにしましょう☆

2006年10月25日

ソフトウェアテストに向いている人材とは
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは! やまもと@テスト番長です。

日に日に寒くなってきておりますが、皆様お元気にお過ごしでしょうか?ウノウでは風邪で調子を崩す人が多くなってきております。食欲の秋を満喫する為にも体調管理に気をつけたい今日この頃です。

先日リクルートページにテスターの募集が追加されたのですが、その際「テスターの募集条件ってどうしたらいいの?」という問い合わせを受けました。
確かに、ふつうのエンジニアに比べるとテスター(QA)の募集条件って難しいです。
今回はどんな人がテスターに向いているのかを書いてみたいと思います。

1)アプレンティス(徒弟)型

これがもっとも一般的な形ですね。
まだ技術力の低い新卒・学生のプログラマ志望の方などが、見習い的な位置づけからスタートするケースで、その業務の中にテストがあるという場合です。
見習いをするより、すぐ最前線でやってみたい!という人も多いでしょう。
プログラマは人材不足気味なので、まだ開発パワーの無い方でも働くところは沢山あります。
しかし、低レベルの受託開発などでいきなり奴隷船のような状態で実装に関わってしまい道を踏み外していくよりは、ある程度技術力のある会社で見習い期間を持つのはとても有意義だと思います。
「すぐメインスタッフとして働けます!」なんて求人をよく見ますが、逆にいえば新人がすぐに活躍できるということは会社の人材層が極めて薄く未熟な会社であるということです。

この型の募集条件はこんな感じです。
・何らかのプログラミングをしてみたことがある
・エクセルくらいは使える
・コミュニケーション好きで、学習能力が高い

2)サブスキル開発型

営業・マネージャー・デザイナーなどとして活躍中の方で、サブスキルを伸ばそうと考えている方。
テストを覚えるとクローザーとしての能力が高まり、一層人材価値が上がります。
プログラムは出来る気がしないけれど、仕事上製品のチェックをする機会はよくあるという方は多いはず。

この型の募集条件はこんな感じです。
・ソフトウェア開発に他職種で一年以上関わっていた
・粘り強い性格である
・将来のビジョンが明確 (単にドロップアウトしただけの方はご遠慮申し上げたいので)


3)乗り換え型

全く他業種の方でIT系に乗り換えてみたいという方。
以下のような職業に従事していた方は、プログラマやデザイナーになるよりテスターに適正があるかもしれませんよ。

司書、校正者、テクニカルサポート経験者、サイト運営経験者、翻訳家、法律を学んだことのある方、製品のヘビーユーザーなど

この型の募集条件はこんな感じです。
・元の業種でかなりの実績がある
・常時インターネットに触れている
・オフィス製品はもちろん使える
・将来のビジョンが明確
・コミュニケーション好きで、学習能力が高い

元の業種と開発するプロダクトの種類とが合致すると、とてつもなく頼りになるテスターが誕生します。

4)リタイヤ型

リタイヤした腕利きプログラマやプロジェクトマネージャーにテストをやっていただく形です。
例えば結婚や病気などで一旦最前線を退き、復帰しようと考えているけれど
フルタイムでは動けない故に元の仕事に戻れない方などは知識経験共に豊富で最高のテスターになれます。
プログラマ経験者であればテストツール作成などでも力になってくれるでしょう。
そんな人材を確保出来た開発チームは幸せですね。


5)QAまっしぐら型

我こそはQAの星になろうという方。ほとんどお目にかかったことはありませんが、
もちろん来てくださればありがたいことこの上ありません。


さて、前の記事を読んでくださっている方はもうお気づきかと思いますが、
只今ウノウでは、

テスターさんを大募集

しています。 詳しくはHPのリクルートページに掲載されていますので、 ご興味がおありの方は是非ご応募ください。 というわけで、今回もTipsに見せかけた求人情報でした。

お待ちしてまーす!

2006年10月24日

Global standard programming with GNU Autotools
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

尾藤正人です。

UNIXのソフトウェアをインストールするときに、よくやるのが

./configure
make
make install

という手順ですが、この configure スクリプトや Makefile を自動的に生成してくれるツールは GNU Autotools と呼ばれます。

GNU Autotools は使うとすごく便利なんだけど、結構知らない人が多そうだった(実際あまり知らなかった)ので、昨日の勉強会の時に紹介しました。せっかくなので資料を公開します。

プレゼン資料(OpenOffice)
プレゼン資料(PowerPoint)
bat.tar.gz
bat-0.0.1.tar.gz

プレゼン資料はOpenOfficeで作りました。念のためPowerPoint用に変換したのもおいておきます。

単に説明だけだと内容がよく分からないので簡単な例として bat コマンドを作りました。標準入力を受け取って標準出力に出すというだけの簡単なコマンドです。catよりも機能がないので bat にしました。bat コマンドは無駄にライブラリ libbat を生成して bat コマンドは libbat を共有ライブラリとして使用します。

bat.tar.gz に GNU Autotools を適用する前の最小限のファイルを固めてあります。

tar zxvf bat.tar.gz
cd bat
./autosetup.sh

で GNU Autotools を使って configure とか Makefile.in を生成します。 autosetup.sh はこんな感じで GNU Autotools のコマンドを実行してます。

#!/bin/sh
touch AUTHORS ChangeLog NEWS README
test -e config || mkdir config
aclocal
libtoolize
aclocal
autoheader
automake -af
autoconf

そのまま

./configure
make dist

とやると配布用の tarball である bat-0.0.1.tar.gz を作ってくれます。

rpmファイルが簡単に生成できるように spec ファイルも含まれるようにしてみました。

rpmbuild -ta bat-0.0.1.tar.gz

で簡単に rpm が作れるようになってます。

UNIXのソフトウェアを作るときの参考になれば幸いです。

2006年10月23日

ビジターをユーザーに替える3ポイント
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは、sashaです。

フォト蔵 のような、使ってもらって何ぼのWeb Applicationは、ビジターをいかにユーザに替えることが出来るか、というのが鍵になるかと思います。どうしたら、ビジターがユーザになってくれるだろう、ということを考えていたら、こんなことを思いつきました。題して、「ビジターをユーザーに替える3ポイント」です。

ビジョンを与えるのが鍵。

ユーザーとしてログインしていないときにビジターが見ることの出来るページは、未登録ビジターにとってサービスの疑似体験が出来るものでなくてはなりません。もちろん、サービスはユーザーのためにあるべきなので、登録ユーザには、未登録ビジターとは差別化された特権を与えなければならず、それが、写真アップロード権限であったり、SNSサービスであったりするわけです。ただ、そういったユーザのみのサービスは使えなくとも、少なくとも、このサービスを使ったらこんな気分になるんだ!こんな楽しいことが出来るんだ!こんな便利なんだ!ということを実感してもらわなくてはならないのです。ユーザになったらどんな体験が出来るのか、そういうビジョンを持ったビジターは、サービスに対して一定の期待感を持って入会します。プロバイダは、その期待感を保障するために、日々開発に勤しむのです。

ショー・ウィンドウ方式のティーザーページ。

さて、ではどんな風にビジターは、ユーザーになったときの自分の体験をビジュアライズするでしょう。ビジターのビジョン形成を助けるのは、未ログインページのビジュアル・デザインであったり、サービスについて説明されたページのUIであったりするでしょう。ここでは、登録したときに自分が体験するサービスの情報をふんだんに見せる必要があると思います。仮に、勝手にショーウィンドウ方式と呼んでみることにします。ショーウィンドウには、商品がただ、ぽんと置かれているわけではありませんよね。スタイルのいいマネキンが、カラーコーディネイトもばっちりで、「ああ、あのジャケットを買ったら、こんな着こなし方をするといいんだな」というインスピレーションを与えてくれます。それと同じように、未ログイン時のホームページは、実際にそのサービスはどんなテイストで、どんな使い方が出来るのか、というインスピレーションを与えるものであるべきだと思います。豊富なスクリーンショットなんかも、きっと有効でしょうね。

ホームページは重要?

私は毎日のようにYouTubeのページを目にしますが、自分からYouTubeのホームページを尋ねていって、そこから各ページを閲覧して回るようなことはまずありません。他にも、RSSを購読しているいくつかのサイトでは、そのサイトの「1ページ」を毎日のように目にしますが、実際にサイトのホームページを見ることはほとんどありません。WebサービスがRSSやリンクやブログに依存しているとき、サイトのホームページは、将来のユーザーにとってそれほど重要ではなくなります。というより、未ログイン状態で見ることの出来る「1ページ」ごと全てが、未登録ビジターを登録ユーザーに替える上で重要な「1ページ」になるのです。



----------------------
さて、フォト蔵は、こんなことも念頭において、これからも常に進化し続けますよー、っと☆




2006年10月18日

すべてのWebデベロッパーに必須なFirefox拡張20(+1)選
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

naoyaです。
CyberKonowledgeに20 FireFox Extensions That Every Web Designer Should Know Aboutという記事がありました。ちょうど、タイムリーな記事だったので、さっそくすべてのFirefox拡張を試してみましたので紹介します。

Web Developer Toolbarは説明する間でもない定番でとても便利な拡張です。CSSのクラスが定義されている範囲をみたり、JavaScript/CSSをオフ/オンできたりととても便利です。



Gnu Aspellというスペルチェッカーを使ってすぐにスペルの確認ができる拡張です。使い方は、右クリックで表示されるコンテキストメニューからAspellを選択します。
この拡張は、最初ページ全体に対してスペルチェックができると思ったのですが、そうではなく単語を入力して単語のスペルをチェックする拡張でした。個人的には、あまり使わない拡張だと思いました。



SEOツールのようです。インストールすると、上部に専用のツールバーが表示されます。このツールバーからサーバのヘッダ情報を見たり、Alexaのランキングをすぐに表示することができます。たくさん機能があるのですべて試すことができませんでした。



IEViewと似ていますが、この拡張はOperaでページの表示を確認することができる拡張です。OperaもIEViewと同じように組み込みができるかと思って使ってみましたが、実際は普通にOperaを起動させて、Firefoxで表示していたページをOperaで表示しています。思っていた通りではありませんでしたが、Operaでの表示を確認したときに便利です。



この拡張は、IEでの表示を確認することができます。Firefoxのタブ上でIEのレンダリングに切り替えることができます。この拡張を使うと、ステータスバーのFirefoxアイコンをクリックするだけでIEに切り替えられるので便利です。



Total ValidatorというページのHTMLの文法をチェックするサービスを簡単に使うための拡張です。Total Validatorをインストールすると、ステータスバーにアイコンが表示されるので、そのアイコンをクリックするだけで今表示しているページをチェックすることができます。ただし、ログインが必要なページはチェックできません。このようなときは、後で紹介するHtml Validatorがすごく便利です。



このツールも別のページで知ったのですが、かなり便利です。GoogleやYahooで検索したときの検索結果画面に検索結果順序のデータ(Googleだとページランクに相当します)がまとめて表示されます。デフォルトではかなりのデータが表示されるので、表示する項目を絞った方がいいと思います。また、デフォルトだとデータが表示されないのでクリックするか、設定を変更して自動的に表示するようにした方がいいでしょう。



HttpLiveHeaderも定番です。HTTPの通信ヘッダ情報をチェックすることができる拡張ですね。初めて使う場合にちょっと注意したいのは、HTTPLiveHeaderの画面を開いている状態でページを読み込まないとHTTPヘッダ情報が表示されませんところです。



Firefoxから好きなエディタを登録しておいて、右クリックメニューから登録したエディタを選択してCSSやHTMLなどを好きなエディタで開くことができます。Cyber Knowledgeでは、IE7を登録していますが、いくつかブラウザを登録しておければIEViewやOperaViewと同じ機能にすることができるので便利です。



僕が普段から使っている拡張です。ステータスバーのアイコンをクリックするだけですぐにブログに投稿できる拡張です。僕は、ブログを二つ書いているのですが、一つは技術系、もう一つはもっと簡単な内容のブログを書いているのですが、Performancingでこの二つのブログを登録しておいて、それぞれのブログに投稿しています。あと、コンテキストメニューからこのページのリンクを張ってすぐにブログに書けるのも便利ですね。



コンテキストメニューからリファラーを送らずにページを開くことができる拡張です。たまにリファラーを送りたくないときにブラウザ自体の設定を変更せずにすぐにできるので 便利です。



ページの表示時間を計測することができる拡張です。この拡張をインストールすると、上部のステータスバーにページの表示時間を表示することができます。個人的にはステータスバーに表示されるのがよかったのですが、仕方ないですね。Webアプリケーションでは、ページの表示時間が常に重要になるので重宝しそうな拡張です。



User Agent(UA)を変更することができる拡張です。僕は、上部のツールバーにUser Agent Switcherアイコンを追加して必要なときに切り替えています。 ウノウでは、最近VPOPという携帯電話専用の動画共有サイトを始めたのですが、この開発のときにはよくUser Agent Switcherで携帯電話のUser Agentに切り替えるために使っていたようです。



この拡張も定番ですが、かなり便利です。サイドバーのEditCSSのCSSを編集するとリアルタイムにCSSの変更を確認することができます。この拡張を使うことで、CSSを変更する度にブラウザをリロードすることがなくなります。EditCSSで編集した内容は、ファイルとして保存できます。



この拡張も定番です。JavaScriptやCSSを含んだコードをデバッグできます。僕は、Ajaxを使ったページのデバッグをするときによくFireBugを使っています。



ページのサイズを測定できる拡張です。MeasureItをインストールすると、左下のステータスバーにアイコンが表示されるので、このアイコンをクリックするとページのサイズを測ることができます。この拡張も便利です。



FirefoxをFTPクライアントにすることができる拡張です。作成したページをアップロードするときに便利です。ウノウでは、FTPは使っていないので実際に使う機会はなさそうです。



ページの色情報を取得することができる拡張です。この拡張もMeasureItと同様にインストールするとステータスバーの左下にアイコンが表示されるので、アイコンをクリックして色情報を取得することができます。



この拡張は、ページ内で選択されたテキストの内容でHTMLリンクの内容でコピーすることができます。たとえば、前回のテスト番長のブログの一部をCopy as HTML Linkすると次のようなコードとしてクリップボードにコピーされます。

テスターさんを募集

シンプルでかつとても便利な拡張です。


いかがでした?今日は、Webデベロッパーに必須の20のFirefox拡張を紹介しました。
最後に、Cyber Knowledge には紹介されていなかったWebデベロッパーに必須の一つのFirefox拡張を紹介します。

HTML Validatorは、Total Validatorと似ているのですが表示しているページのHTMLの文法チェックをしてくれるので、ログインが必要なページでもすぐに文法のチェック結果をステータスバーで確認することができます。 HTML Validatorを使うと、常にページの文法チェックができるのでかなり重宝しています。

2006年10月17日

チームリーダーが心掛けるべき10のポイント(テストチーム編)
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちはー! やまもと@テスト番長です。

現在ウノウのテスト専任のスタッフは自分一人です。
いわば一人親方(建設業界用語)状態なのですが、
前職では総勢6人のテストチームを組織しておりました。
その頃心掛けていた、チームリーダー心得を書いてみたいと思います。

1.聞き上手になる
組織はコミュニケーションが命です。
話しにくいリーダーだと、必要な情報がうまく伝わりません。
気軽に相談を受ける・噂話が耳に入ってくるようでなくてはいけません。
そのためには聞き上手に徹すること。特に批判的な態度は控えることが重要です。
そんな相手には、誰も何も相談しないでしょう。

2.「おいしい仕事」を独り占めしない。
重要な判断や、やりがいのある仕事はなるべくメンバーに廻すようにします。
一見、重要な仕事はリーダーがこなすべき事のように見えますが、
その裏で他のメンバーがつまらない仕事ばかりすることになっていませんか?それでは他のメンバーが育ちませんし、業務を負荷分散しないと重要な案件を抱え込んだままリーダーが倒れ、破綻するケースもあります。

3.仕事に気分を持ち込まない。
いつでも平静で平等な感覚を保ちましょう
言わずもがなですが、リーダーは精神的にタフでなくてはいけません。

4.日和見主義なくらいがよい。
個人の好みやプライドに変に拘らず、常に広い視点で物事を判断するように心がけましょう。
強いリーダーであろうとすると自分の意見を貫こうとしてしまいがちですが、意見を聞いてくれない・説得の難しいリーダーだと思われると、メンバーからの意見提案が発生しなくなります。

5.人の能力を見抜き、適切に扱うよう努力する。
メンバーにとって働く上で自分を理解してもらうことは大きな喜びとなります。
どんな人物か、どんな能力を持っているかを理解することは、適切に仕事を割り当てる為にも必須です。
ただ仕事を片付けるという視点でメンバーの能力のほんの一部だけに注目し、
会社の部品のように扱うことは絶対やってはいけません。

6.採用に参加し、信頼出来るメンバーを集める
一番良い結果が出るだろうと考えたスタッフに仕事を任せたならば
後はどんな結果が出ようとも、それはリーダーの責任です。
すべてお任せにして丸投げした挙句、失敗をスタッフのせいにしていませんか?
もちろん、信頼の置けないスタッフを守るのは難しいことです。
ですからそのためには、採用時に良い人材を厳選しておくことが大事です。
これからリーダー職を任命される方は、人事権について交渉しておくことを強くお勧めします。

7.仕事をさせるのではなく、仕事しやすい環境を作る
仕事が上手く進まない時は色々細かい指示を出したくなりますが、それは往々にして良いやり方ではありません。人間は機械ではないので、他人の指示通り正確に動くようには出来ていないからです。
仕事しやすい環境や人間関係を作り、労働意欲が自然に沸いてくるような状態を作りましょう。

8.頑張らせ過ぎないように気をつける
テストは同じような作業を延々と繰り返すことが多いので常に気持ちのリフレッシュを心掛けましょう。
テスターは真面目で仕事に没頭しがちな人がほとんどなので、時々差し入れをしたり外に連れ出して気分転換にコーヒーを飲んだりするのも良いです。我慢強く重労働の連続に耐えるようなスタッフはとてもありがたい存在ですが、それに甘えてはいけません。
どんなにタフでもそんな状態をずっと続けられるわけはないのです。

9.チームの結束を第一に考える。
自分も含め、メンバー同士が支えあう組織を作りましょう。
失点をカバーし合う組織は弾力があり、トラブルに強くなります。
メンバー同士を競わせたりしてはいけません。
そういうベクトルのマネジメントが行き着くところは、お互いの足の引っ張り合いです。
個人の利益を優先したいならフリーランスになればいいのです。

10.常にマネジメントの手法について学ぶ姿勢を持つ。
常にチーム力を高める努力をしましょう。リーダーの作法も時と共に変化します。進歩を怠ると、気がついた時には古いタイプのリーダーになっているかも知れません。

果たして自分はこの通り実行出来ていたか、あまり自信はないのですが
一応このような状態を目指してやっておりました。

さて、(実はここからが本題)
只今ウノウでは、

テスターさんを募集

しています。
詳しくはHPのリクルートページに掲載されていますので、
ご興味がおありの方は是非ご応募ください。
というわけで、今回はTipsに見せかけた求人情報でした。

お待ちしてまーす!

【サイト研究】第6回 Lingr - Comet を利用した ConnectiveChat - (10/16)
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

akano です。

今回は、江島健太郎氏のチームが開発した、「ブラウザ上で動くチャット」Lingr の研究を行いました。

チャットという Web アプリは 20世紀から存在するネットアプリです。CGIBOY のチャットは自分もよく使っていました。
チャットというのは複数の人間が同時にアクセスしており、その Web ページはリアルタイムに変化することになっています。そのリアルタイム性を担保するために Web ブラウザは○秒おきにサーバに対してリクエストを送り、サーバは○秒毎の最新のページを生成しブラウザ(クライアント)に送信します(ボーリング)。
それはすなわち、「ただページを表示するだけで」チャットサーバに対して膨大なアクセスがくることを意味します。例えば、1000 ユーザが同時接続している状態で、1秒に1度の間隔でポーリングを行うと、月間で26億ヒットとなり Google のページビュー(12億/月)も超えてしまいます。これではコストが高くチープ革命が達成できません。

開発者江島氏のブログ(前編:機能紹介)(後編:技術解説)によると、この Lingr の特徴として、タグクラウドやプライベートルーム(コミュニティ/アクセス制限)、パーマリンクや画像/動画の貼り付けといういわゆる Web2.0 的な機能の他、お手軽さということを売りにしています。
Lingr は新たにソフトウェアをダウンロードすることなく、firefox 等既存のブラウザ上で、ボーリングによる画面のちらつきや情報の遅延がなくリアルタイムな情報表示が行われます。(ちなみにMSNメッセンジャーは擬似的な P2P モデルで実装されています。)


その仕組みとして、Comet という JavaScript で実現されている仕組みを用いています。

Comet: Low Latency Data for the Browser : 命名者 Alex Russell による Comet の説明
上ページの和訳

ここでいう Comet とは、従来サーバとクライアントの間でぶつ切りで行われている通信を繋ぎっぱなしにする技術です。

As is illustrated above, Comet applications can deliver data to the client at any time, not only in response to user input. The data is delivered over a single, previously-opened connection. This approach reduces the latency for data delivery significantly.

The architecture relies on a view of data which is event driven on both sides of the HTTP connection. Engineers familiar with SOA or message oriented middleware will find this diagram to be amazingly familiar. The only substantive change is that the endpoint is the browser.

上で図示されるように、Comet アプリケーションはユーザー入力に対するレスポンスに限定されず、好きなときにクライアントにデータを配信できる。データは単一の、事前にオープンされたコネクションを通じて配信される。このアプローチを使うと、データ配信の遅延を大幅に削減できる。

このアーキテクチャは HTTP コネクションの両端でデータがイベントドリブンのように見えるということに拠っている。 SOA やメッセージ指向ミドルウェアに馴染んでいるエンジニアはこの図がそれとびっくりするくらい似通っていることに気づくだろう。本質的な違いは、一端がブラウザであることだけだ。


図は Alex Russell のページで確認してください。

Lingr以外にも、実際にComet型チャットを実装し公開している方もいます。
Dojo には Comet 用の API が装備されています。
しかし、Web サーバの側では、「サーバに対してHTTPコネクションを張り続ける」必要性に対応しておりません。Apache では IdentityCheckTimeout( Ident リクエストがタイムアウトするまでの期間)を 30 秒に定めるように RFC 1413 で推奨されています。そのため、Comet の機能をフルに用いたアプリを作るには、以前までの作り方の根本を見直す必要があるようです。

Lingr は Java ベースの Jetty 6 を採用し、独自のメッセージング・ハブを構築する道を選んでいます。Jetty による Continuations(継続)については Collection & Copy さんのまとめが分かりやすいです

江島氏曰く、

チャットというアプリケーションでは、全体のうちかなりの割合の期間をアイドル状態(何もイベントが発生しない状態)が占めます。全体に占めるアイドル期間が長ければ長いほどCometを採用することによる利得が大きくなるということです。
(中略)
従っ先にポーリングだと1000コネクションでグーグルのページビューを超えるほど恐ろしくリソース食いだという話をしましたが、Lingrの現在の見積もりでは、1000同時コネクション程度ならもろもろのアプリケーションオーバーヘッド込みでもLinuxサーバ数台で片付くのではないかと見ています。むしろデータベースへの負荷の方がよっぽど心配です。

とのこと。早速われわれウノウも接続し使ってみました。

使ってみた感想として、確かにリアルタイム性は快適だったのですが、サーバ接続に関しては重いという印象を受けました。これは jetty システムの不適合というよりも DB まわり等、他の問題の可能性があります。

Comet を大々的に取り入れている挑戦的なサービスなので、そのサービスの運営のノウハウは今後の Web 制作の大きな指針となる可能性があると思います。

1016_1st posted from フォト蔵


1016_2nd posted from フォト蔵

2006年10月16日

vim7の新機能をいろいろ使ってみた
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。satoです。

いまさらですが vim7の新機能をつかってみました。
詳しくはスクリーンキャストをどうぞ

流れは
 □タブで新しいファイルを開く
 □タブの移動
 □変数補完
 □c/g tags で定義関数に画面分割してジャンプ
 □分割した画面のサイズ変更
 □PHP関数のオムニ補完

みたいな感じでです。

便利ですね!

2006年10月13日

PHPでコマンドラインから使えるグーグル電卓
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは,ttsuruoka です.

linux 上で使える良い電卓が見つからなかったので, グーグル先生の力を借りて電卓を作ることにしました.

「gc」という名前の,PHP で動くプログラムです. ソースコードは下のほうにあります.

使い方

- 足し算
$ ./gc 10 + 1
10 + 1 = 11

- 引き算
$ ./gc 10 - 2
10 - 2 = 8

- 掛け算
$ ./gc 10 x 3
10 * 3 = 30

- 割り算
$ ./gc 10 / 5
10 / 5 = 2

- 数学関数(平方根)
$ ./gc sqr 2
sqr(2) = 1.41421356

- 数学関数(三角関数),定数(円周率)
$ ./gc 'sin(pi/2)'
sin(π / 2) = 1

- 基数変換
$ ./gc 2^32 - 1 in hex
(2^32) - 1 = 0xFFFFFFFF

- 物理定数
$ ./gc electron mass
電子の質量 = 9.10938188 * 10^-31 キログラム

- 物理定数(日本語も使えます)
$ ./gc 真空の誘電率
真空の誘電率 = 8.85418782 * 10^-12 m^-3 kg^-1 s^4 A^2

- 度量衡変換
$ ./gc 88 mph in km/h
88 mi/h = 141.622272 km/h

- 通貨換算
$ ./gc 100 usd in euro
100米ドル = 79.7448166 euro

- 通貨換算(日本語も使えます)
$ ./gc 16.5億ドルは何円
16.5億米ドル = 1973.235 億円

ソースコード

gc という名前で保存して,実行権限を付与してください.

「#!/opt/php/bin/php」は, PHP の実行パスに合わせて変更してください.


#!/opt/php/bin/php
<?php
error_reporting(E_ALL);
mb_http_output(mb_internal_encoding());
$oe = mb_internal_encoding();
$g = 'http://www.google.co.jp/search?num=1&hl=ja&oe='.$oe.'&q=';

$msg_h = <<< EOT
Examples:
  gc 10 + 1
  gc 10 - 2
  gc 10 x 3
  gc 10 / 5
  gc sqr 2
  gc 'sin(2/pi)'
  gc 2^32 - 1 in hex
  gc electron mass
  gc 88 mph in km/h
  gc 100 usd in euro
  gc 16.5億ドルは何円?
EOT;
$msg_e = 'Invalid expression';

if ($argc == 1) {
    echo $msg_h."\n";
    exit;
}

array_shift($argv);
$q = urlencode(mb_convert_encoding(implode(' ', $argv), 'UTF-8'));
$c = file_get_contents($g.$q);
$ptn = '@calc_img\.gif>(.+?)<b>(.+?)</b>@';
preg_match($ptn, $c, $matches);
if (empty($matches[2])) {
    echo $msg_e."\n";
    exit;
}
$c = $matches[2];

$r = array(
    '@<font size=-2> </font>@' => '',    // 1<font size=-2> </font>000 => 1000
    '@<sup>(.+?)</sup>@'       => '^\1', // 10<sup>30</sup => 10^30
    '@&#215;@'                 => '*',   // &#215; => *
);
$c = preg_replace(array_keys($r), array_values($r), $c);

echo $c."\n";
?>

2006年10月12日

自作ソフトに写真投稿機能をつけよう~フォト蔵API(Delphi版)を公開
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

さかとくです。開発ツールのDelphiから使える、フォト蔵APIライブラリを公開します。
フォト蔵APIライブラリを使うと、画像ファイルをフォト蔵に投稿できます。

DelphiはWindowsで動く自作ツールやフリーソフトの作成で人気の開発ツールです。
もし、Delphiで画像ビューワなど、画像を扱うツールを作っているなら、画像を投稿する機能を手軽に追加できるでしょう。フォト蔵では、1万枚の画像、動画ファイルをアップロードすることができるので、自作ソフトをフリーソフトとして公開しているなら、きっとユーザーの人にも喜ばれる機能となるはずです。

demo
demo posted from フォト蔵

以下に機能を追加する方法を紹介します。

まずは、以下よりライブラリをダウンロードしてください。
→フォト蔵APIライブラリ(for Delphi)をダウンロード

ここでは、Delphi7で、写真投稿機能を行う手順を紹介します。
(Delphi6を利用されている方で、Indy9がインストールされてなければ、Indy9をインストールしてください。)

ダウンロードしたアーカイブを解凍します。すると、photozou_api というフォルダができます。
次に、Delphiを起動します。
プロジェクトに名前を付けて保存します。そして、先ほど解凍した<photozou_api>のフォルダに入っているPASファイルをすべてプロジェクトに追加します。

そして、フォームの設計画面に戻って、Delphiの[ファイル-ユニットを使う]から「frmPhotozouUploadU」を追加します。これで準備は完了です。

あとは、ボタンを作って、ボタンのイベントに以下のように記述します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  frmPhotozouUpload.Show;
end;

これで機能が追加されました。ボタンをクリックすると、写真をアップロードする画面が表示されます。ログイン→画像を選択→アップロードまでの機能がすべて追加されます。

もし、プログラム側でアップロードしたいファイルやタイトルを指定したいときは、以下のように、テキストボックスにデフォルト値を指定しておきます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  frmPhotozouUpload.edtTitle.Text := 'SAMPLE PHOTO';
  frmPhotozouUpload.edtFile.Text := 'c:\sample.jpg';
  frmPhotozouUpload.Show;
end;

このように手軽にアップロード機能を実装できます。
お絵かきソフトや画像加工ソフトなどなど、ちょっとしたソフトに
ぜひ、フォト蔵へのアップロード機能をつけてみてください。

2006年10月11日

Firefox 2 RC2 を使ってみる - 対応していない拡張機能も強引に使えるようにする方法
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは、ジュンヤです。

Firefox 2 RC2 をダウンロードして使ってみました。タブやボタンがちょっとかっこよくなっています。

firefox0
firefox0 posted from フォト蔵

いくつか新機能を紹介してみましょう。

Google検索ツールバーに補完機能がつきました。結構便利です。特に英語のキーワードなどは、スペルミスして検索し、「もしかして○○」と言われることが少なくなります。

firefox1
firefox1 posted from フォト蔵

ツール > オプション で開くオプションタブに新たにフィードというタブが追加されました。ここで自分がいつも使っているフィードリーダーを選択しておくと、RSSのアイコンやリンクをクリックしたとき、xmlが表示されるかわりに、それぞれのフィードリーダーへの登録画面になります。残念ながら僕が利用している Fresh Reader には対応していませんが、もしかするとなんとか対応させる方法があるのかもしれません。

firefox2
firefox2 posted from フォト蔵

新機能の中で僕が結構魅力的だなと思ったのが、スペルチェック機能です。英語版フォト蔵の開発日誌に僕もたまにエントリーを書いたりするのですが、そういうときに役立ちそうです。テキストエリア内のスペルチェックをおこなってくれます。デフォルトでは辞書がインストールされていないようで、インストールするには、テキストエリア内で右クリックし、言語 > 辞書を追加 を選択します。開いた Firefox Add-ons のページで、United States English Dictionary 2.0.0.1 を選択しました。ミスしている部分に赤い下線が付き、その上で右クリックすれば候補を表示してくれるようになります。

firefox3
firefox3 posted from フォト蔵

まだまだある新機能について知りたければ、本開発マイルストーンの新機能と改良点を見てください。

実は、1.5 -> 2.0 にアップデートするとたいがいの拡張機能が対応していないために、使えなくなってしまいます。例えば僕が愛用している、All-in-One Gestures なんかも使えなくなってしまいました。

そこで、Nightly Tester Tools という拡張機能を使い無理やりそうした未対応の拡張機能を使えるようにします。この Nightly Tester Tools をインストールし拡張機能に加え、ツール > アドオン でアドオン画面を開くと、Make all compatible というボタンが右下に表示されるようになります。

firefox4
firefox4 posted from フォト蔵

これをクリックすれば未対応の拡張機能が使えるようになります。僕の場合は、View formatted source が残念ながらうまく動かなくなってしまいましたが、All-in-One Gestures や Live HTTP Headers といったほかの愛用している拡張機能は使えるようになりました。

注意しなくてはいけないのは、こうした拡張機能は 1.5 のときにインストールしておいてから、2.0 にアップグレードし、Nightly Tester Tools を使って利用できるようにしないといけない、ということです。2.0 にアップグレードしてからだと、例えば All-in-One Gestures をインストールしようとしても、「対応していない拡張機能です」と言われてしまいインストールできません。

皆さんも Firefox2 を使ってみてはいかがでしょう。こんな使い方があるとか、この機能がオススメだというのがあればぜひお聞かせください。

2006年10月10日

php で 簡単にデバッグする方法
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

尾藤正人です。

Ruby で debug する7つの方法

Perl での print debug の方法の紹介がブーム(?)だったので、自分がよく行ってる Ruby での debug 方法7つについて書いてみます。

ということなので、僕が PHP でやってること書いてみたいと思います。

preprint_r()

print_r() とか var_dump() だと HTML の中に出してブラウザで見るときにすごく見にくくなります。 そこで preprint_r() という関数を定義して、<pre></pre> で囲んで見やすいように出力しています。

function preprint_r(&$var, $title = '')
{
    echo _preprint_r($var, $title);
}

function &_preprint_r(&$var, $title = '')
{
    if (!defined('UNOH_DEV') && UNOH_DEV) {
        return '';
    }

    $html = '<table>';
    if ($title) {
        $html .= "<tr><th align=\"left\">$title:</th></tr>";
    }
    $html .= '<tr><td><pre>';
    $html .= htmlspecialchars(print_r($var, true));
    $html .= "</pre></td></tr></table>\n";

    return $html;
}

preprint_r() では UNOH_DEV が定義されているかどうかチェックしています。 開発版の場合は UNOH_DEV が必ず定義されているので、もし仮にデバッグで入れた preprint_r() がプログラムに残った状態でコミットされても、本番環境で表示されないようにしています。

実はこの preprint_r() という関数は前職の HDE にいた頃に覚えました。 大変便利なので、僕はいつもこの関数を定義して使うようにしています。

preprint_r smarty plugin

smarty の中でも使いたいということで preprint_r smarty plugin も作っています。

function smarty_function_preprint_r($params, &$smarty)
{
    if (empty($params['var'])) {
        $smarty->trigger_error("preprint_r: missing 'var' parameter");
        return;
    }

    $title = isset($params['title']) ? $params['title'] : '';
    return _preprint_r($params['var'], $title);
}
smartyテンプレートの中で
{preprint_r var=$hoge}

という風に書くと変数がダンプされて表示されます。

set_error_handler() でエラーが起きた時にメールを送信する

PHP ではエラーが起きた時にどういう処理を行うかを set_error_handler() を使って変更することができます。 フォト蔵ではエラーが起きた時にメールで送信するようになっていて、エラータイプ、エラーメッセージ、エラーが起きたファイル、行数、URI、$_SERVER, $_COOKIE とかの変数のダンプ、バックトレース等、デバッグに必要な情報を送信しています。

ウノウでは開発者毎にバーチャルドメインをきって開発環境が独立しているので、個人の開発環境で起こったエラーは個人に送るようにしていて、本番環境で起こったエラーに関してはみんなに送信するようにしています。

xdebug を使う

xdebug にはいろいろ機能がありそうですが、プロファイラーにしか使ってません。

プログラムの最後に

preprint_r(xdebug_get_profiler_filename(), 'profile');
という風に書いておくと
/home/masato/photo/var/xdebug/cachegrind.out.573339192

こんな感じでプロファイルの情報が入っているファイル名が表示されます。これをプロファイラで表示してやれば、どの処理にどれくらい時間がかかってるのかがすぐ分かるようになります。

僕は WinCacheGrindというソフトウェアを使ってます。ホームディレクトリを samba で共有しているので、Windows からそのままファイルを開くだけで大丈夫です。

他に

こんな方法使ってるよっていうのがありましたら、ぜひ教えてください!!

2006年10月 6日

Services_TechnoratiでTechonoratiを使い倒そう
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

はじめまして.新入社員のjokagiです.ウノウ株式会社に入社して丁度1週間のまだ右も左も分からない新入社員です.よろしくお願いいたします.

さてみなさまよくご存じ(?)当番制のウノウラボですが,今日が私が当番だということに夕方気づいたので!!さっきネタを作りました. というか当番とかいうわりに日付が変わってしまいましたがみなさま気にせず興味のある方だけ生ぬるく読んでください.

お題

今回はServices_Photozouの公開をしようかと思ったのですが,見て楽しいものを用意できませんでした.そこで気を取り直して自分が欲しかったPEAR::Services_Technorati(以後Services_Technorati)を用いてキーワード「unoh」を検索し,その結果をSmartyでさくっとRSSとHTMLにするサンプルを作ってみました.

サンプルイメージ:

Technorati(テクノラティ)はブログに特化した検索などが行えるサイトです(日本サイトとしてTechnorati JAPANがあります).より詳細な情報についてはTechnorati: About Usが参考になると思います.

TechnoratiのAPI Keyの取得

今回のネタを自分のところで実験するにはAPI Keyを取得する必要があります. API Keyの取得は残念ながらTechnorati Japanにはないようなので,本家で英語を読みながら頑張ります. といってもTechnorati Japanでアカウントを作成していれば,http://www.technorati.com/developers/apikey.htmlにアクセスし,ログインすれば(ログイン後はさっきのURLに再度アクセスしましょう)API Keyを取得できます. 文章らしい文章は読まなくていいので簡単です.

API Keyの規約はhttp://www.technorati.com/developers/apikey.htmlにAPI Keyと合わせて記述されていますので、そちらを読むようにしてください.
※規約についてのご指摘をいただきました

とりあえず画面推移をキャプチャーしてみました. 参考にしてみてください.

Developer Centerにアクセス.
Sign Up
Sign In posted from フォト蔵
右上のSign Inをクリックしてログイン.
ログイン直後の画面

パッケージの準備

今回検索結果のキャッシングにPEAR::Cache_Lite(以後Cache_Lite)を使用します. PEARの数あるウェブサービス系パッケージでは定番の組み合わせです. PEARがコマンドラインで管理できる環境なら

pear install --alldeps Cache_Lite Services_Technorati
でインストールすることができます.

Services_Technoratiの使い方

取り立てて難しいことはありません.staticメソッドのfactoryでインスタンスオブジェクトを生成し,それを用いて検索など情報取得をします. 下記は「unoh」で検索し,print_r()で出力をする例です.

$ php -r '
  require_once "Services/Technorati.php";
  $client = &new Services_Technorati( "<あなたのAPI Key>", $cache);
  print_r( $client->search("unoh"));'
Array
(
    [version] => 1.0
    [document] => Array
        (
            [result] => Array
                (
                    [query] => unoh
                    [querycount] => 556
                    [rankingstart] => 0
                )

            [item] => Array
                (
                    [0] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => Twisted Mind
                                    [url] => http://d.hatena.ne.jp/Voluntas
                                    [rssurl] => http://d.hatena.ne.jp/Voluntas/rss
                                    [atomurl] => 
                                    [inboundblogs] => 11
                                    [inboundlinks] => 23
                                    [lastupdate] => 2006-10-05 16:47:17 GMT
                                )

                            [title] => [dojo]
                            [excerpt] => ■[dojo] 20:13  ウノウラボ Unoh Labs: DoJoで簡単にクロスドメインAjaxを実現  http://labs.unoh.net/2006/10/dojoioscriptsrcioajax...  とてもわかりやすい説明:-)  画像が出てくるのがカッコイイ。
                            [created] => 2006-10-06 11:13:44 GMT
                            [permalink] => http://d.hatena.ne.jp/Voluntas/20061006#1160133224
                        )

                    [1] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => devworks
                                    [url] => http://d.hatena.ne.jp/devworks
                                    [rssurl] => http://d.hatena.ne.jp/devworks/rss
                                    [atomurl] => 
                                    [inboundblogs] => 6
                                    [inboundlinks] => 11
                                    [lastupdate] => 2006-10-06 12:08:18 GMT
                                )

                            [title] => [Ajax]DoJoで簡単にクロスドメインAjaxを実現
                            [excerpt] => ■[Ajax]DoJoで簡単にクロスドメインAjaxを実現  ウノウラボ Unoh Labs: DoJoで簡単にクロスドメインAjaxを実現   XMLHttpRequestはセキュリティ上の問題から、他のドメインに対してリクエストを送ることがで...  [Dojo] JavaScriptのみでクロスドメインXMLHttpRequest Kawa.net Blog(ゆうすけブログ)/ウェブリブログ   内部でiframeを使用しているようです。  技術的には非常に興味があるのですが、今は「どう業務に使おう? 」と考え中です。
                            [created] => 2006-10-06 01:11:58 GMT
                            [permalink] => http://d.hatena.ne.jp/devworks/20061006/1160097118
                        )
(略)

はい配列が取得できました. ってことでこの配列を再構成し,Smartyに渡せば自由な形式で出力できますね. その辺りを含めて実装してみます.

Smartyを絡めて出力する

今回はRSS 2.0とHTMLを出力するようにしてみました.CLIで実行ではなくHTTPアクセスを前提にしたのでGETで引数(?type=<type>)を付加することで出力形式を切り替えます(type=xmlでRSSを,type=htmlでHTMLを出力します). ついでにCache_Liteで4時間検索結果のキャッシングを行います. これ以上ちょっとずつ実装していくとエントリが長くなるので一気にやっちゃいます. 実装はちょっとイマイチ感もありますが,ざっとこんな感じにしてみました.

index.php
<?php

require_once 'Services/Technorati.php';
require_once 'Smarty.class.php';
require_once "Cache/Lite.php";
$cache_lifetime = 4 * 60 * 60; //  4時間
     
$type = isset($_GET['type'])? $_GET['type']: 'html';
$type = in_array($type, array('xml', 'html'))? $type: 'html';

header("Content-Type: text/$type; charset=UTF-8");

$options = array(
    'cacheDir' => dirname(__FILE__).'/tmp/services_technorati/',
    'lifeTime' => $cache_lifetime,
    'pearErrorMode' => CACHE_LITE_ERROR_DIE
);
$cache = &new Cache_Lite( $options);

$client = &new Services_Technorati('<あなたのAPI Key>', $cache);
$search_result = $client->search('unoh');

$feed_items = array();
foreach ($search_result['document']['item'] as $index=>$item) {
    $feed_item = array();
    $feed_item['title'] = sprintf( '%s - %s', $item['title'], $item['weblog']['name']);
    $feed_item['link'] = $item['permalink'];
    $feed_item['permlink'] = sprintf('%d-%s', $index, md5($item['permalink']));
    $feed_item['author'] = $item['weblog']['name'];
    $feed_item['body'] = $item['excerpt'];
    $feed_item['datetime'] = date( 'r', strtotime( $item['created']));

    $feed_items[] = $feed_item;
}

$feed = array(
  'encoding'=>'UTF-8',
  'generator'=>'elf.no-ip.org',
  'datetime'=>date('r'));

$site = array();
$site['feed'] = $feed;
$site['title'] = 'Topic of unoh';
$site['link'] = sprintf('http://%s%s', $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF']);
$site['description'] = 'Topics about unoh searched with technorati.';
$site['language'] = 'ja';
$site['items'] = $feed_items;

$smarty = &new Smarty;
$smarty->template_dir = dirname( __FILE__);
$smarty->compile_dir = dirname( __FILE__).'/tmp/smarty/templates_c';
$smarty->assign('site', $site);

$smarty->display("feed_{$type}.tpl");
?>

次にRSS用Smartyテンプレートです.

feed_xml.tpl
<?xml version="1.0" encoding="{$site.feed.encoding|escape:"html":"UTF-8"}" ?>

<rss version="2.0"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
    <channel>
        <title>{$site.title|escape:"html":"UTF-8"}</title>
        <link>{$site.link|escape:"html":"UTF-8"}</link>
        <description>{$site.description|escape:"html":"UTF-8"}</description>
        <dc:language>{$site.language|escape:"html":"UTF-8"}</dc:language>
        <generator>{$site.feed.generator|escape:"html":"UTF-8"}</generator>
        <lastBuildDate>{$site.feed.datetime|escape:"html":"UTF-8"}</lastBuildDate>

{foreach item=item from=$site.items}
        <item>
            <title>{$item.title|escape:"html":"UTF-8"}</title>
            <link>{$item.link|escape:"html":"UTF-8"}</link>
            <content:encoded>{$item.body|escape:"html":"UTF-8"}</content:encoded>
            <pubDate>{$item.datetime|escape:"html":"UTF-8"}</pubDate>
            <guid isPermaLink="false">{$item.permlink|escape:"html":"UTF-8"}</guid>
        </item>
{/foreach}
    </channel>
</rss>

escapeとか入りまくりで見づらいかもしれませんが気にしないでください(ちゃんと読みたい方はエディタにでもコピペしてください).

実は恥ずかしながらRSSには精通していないのでRSS Validatorでエラーが出ない程度の内容になっています. おかしなところはコメントをいただければと思います.

ちなみにこれを書いていて気づいたのですが,いつのまにかSmartyのescape修飾で文字コードの指定ができるようになってたのですね. すばらしい.

最後はHTML用Smartyテンプレートです.

feed_html.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><?xml version="1.0" encoding="{$site.feed.encoding|escape:"html":"UTF-8"}" ?>
<html lang="{$site.language|escape:"html":"UTF-8"}">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset={$site.feed.generator|escape:"html":"UTF-8"}" />
  <meta generator="{$site.feed.generator|escape:"html":"UTF-8"}" />
  <title>{$site.title|escape:"html":"UTF-8"}</title>
</head>
<body>
  <h1>{$site.link|escape:"html":"UTF-8"}</h1>
  <div id="description">{$site.description|escape:"html":"UTF-8"}</div>
  <div id="lastBuildDate">Build date:{$site.feed.datetime|escape:"html":"UTF-8"}</div>
  <hr />
  <div id="items">
    <ul>
{foreach item=item from=$site.items}
      <li><div class="item">
        <div class="title">
          <a href="{$item.link|escape:"html":"UTF-8"}">{$item.title|escape:"html":"UTF-8"}</a>
          ({$item.datetime|escape:"html":"UTF-8"})
        </div>
      </div>
      <div class="body">{$item.body|escape:"html":"UTF-8"}</div>
      </li>
{foreachelse}
      <li>no item.</li>
{/foreach}
    </ul>
  </div>
</body>
</html>

実行してみる

まずindex.php,feed_xml.tpl,feed_html.tplを同一ディレクトリに保存します. 次に一時ファイルを保存するためのディレクトリを作成し,パーミッションの調整をします.

$ mkdir -p tmp/{smarty/templates_c,services_technorati}
$ chmod o+w tmp/{smarty/templates_c,services_technorati}

さくらインターネットの共有サーバーなどのようにPHP CGIなどでsuexecされた環境ではパーミッションの設定は必要ないかもしれません. また,パーミッションの追加は場合によっては「o+w」ではなく「a+w」などを求める環境もあるかもしれません(滅多にないと思いますが). 上記ファイル群を使用した実行サンプルはとりあえずhttp://elf.no-ip.org/php/dev/services_technorati/にとりあえず置いておきます.

Services_Technoratiは他に何ができるのか?

後から気づいたのですがServices_Technoratiは簡易的ではありますが,有志が作成した日本語マニュアルがあります(いつもながらありがとうございます). これとhttp://www.technorati.com/developers/api/をあわせて参照するとある程度何をどうすればいいか理解できるかもしれません.

終わり

次回までにはServices_Photozouで何か面白いことができたらいいなぁ~~~と思いますが,どうなるかわかりません. 期待せずに待っていてください.

最後に今更ではありますが,もしタグではなく検索結果をRSSで取得する方法をご存じの方がいらっしゃったら恥ずかしいのでこっそり教えてください. それではあでゅー.

2006年10月 5日

Dojoで簡単にクロスドメインAjaxを実現
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちわ、hideです。

最近、JavaScriptライブラリのDojoを使い初めて、その便利さに目覚めてしまいました。Ajaxで使用される通常のXMLHttpRequestではセキュリティ上の理由から、現在表示しているページ以外のドメインに対してリクエストを送ることができません。そこで考え出されたのが、JSONP(JSON with padding)という方法です。JavaScriptのインクルードは、同一ドメインでなくても読み込めるという性質を利用しています。


まずは下のボタンを押してみてください。実際にYahoo!から画像検索が実行されます。サーバを介さずにブラウザから直接Yahoo!APIを呼び出しているところがポイントです。



簡単に説明するとこういう仕組みです。次のようにリクエスト時のパラメータとして、callback関数を指定します。
http://example.com/json/?callback=importJS
サービス提供側は、このcallback関数でくくってデータを返します。
importJS([{"color":"red", "price":100}, {"color":"blue", "price":200}]);
このレスポンスは、JavaScriptとして実行されるので、importJSという関数を自分で用意しておけば、JSON形式のデータを引数で受け取って処理できるというわけです。このJSONPは、いろいろなJavaScriptライブラリから使えるのですが、DoJoを利用すると通常のXMLHttpRequestと同じように利用することができます。

次が、サンプルコードです。
<html>
  <head>
    <script type="text/javascript" src="dojo.js"></script>
    <script type="text/javascript">
      dojo.require("dojo.io");
      dojo.require("dojo.io.ScriptSrcIO");

      function getJSONP() {
        dojo.io.bind({
          url: 'http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=jsondemo' +
                '&output=json&results=20&query=beach',
          transport: "ScriptSrcTransport",
          jsonParamName: "callback",
          load: function(type, data, event, kwArgs) {
            showOutput(data);
          }
        });
      }

      function showOutput(json) {
        data = json['ResultSet']['Result'];
        var html = '';
        for (var i=0; i<data.length; i++) {
          html += '<a href="'+data[i].RefererUrl+'">';
          html += '<img src="' + data[i].Thumbnail.Url + '" height="100"></a>';
        }
        document.getElementById('output').innerHTML = html;
      }
    </script>
  </head>
  <body>

    <input type="button" onclick="getJSONP()" value="Run"/>
    <div id="output"></div>

  </body>
</html>
このDojoですが、IT戦記さんのブログで紹介されているようにMochiKitを管理下に置けたりしてかなり面白いです。難点は日本語の情報がほとんどないことですが、本家のドキュメントが充実しているので使い方は理解できるんじゃないかと思います。

今、僕はDojoとPythonで書かれた非同期フレームワークTwistedをバックエンドにおいたComet型チャットを作っているので、近いうちに公開したいと思います。

【サイト研究】第5回 Piczo - また一風変わった写真共有 - (10/02)
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

akano です。
今回は、我らがフォト蔵とよく似た名前のサービス、Piczo を研究しました。

http://www.piczo.com/

Piczo は1日あたり3万5000人の新メンバー登録追加があり、その75%は13才から16才といったティーンエージャー。月間1000万人のユニークビジター、25億のページビューを持つという巨大サイトです。最大手のflickrには及ばないもののマーケティングにお金を使わずにこの成長をしたのは大変な成功となります。

このサービスの特徴として挙げられるのはデザインの自由さです。
各種blogなりSNSなりを使っている人間にとって、各種サイトのデザインの骨格をいじることができないというのはある種の常識になっています(mixiはテーマの選択すらできません)。

転じて Piczo では、Javascript で実現されたエディタにより、自分の好きな画像やHTMLソースを、自分のサイトの好きな部分に配置することができます。そのため各ユーザごとに共通したデザインのフォーマットが一切ありません。各自が自由にページを作成するため、よく言えば個性的、悪く言えばごちゃごちゃしたサイトがたくさん生成されています。
また Piczo は blog(日記)やメッセージボード、足あと通知などのコミュニティ形成機能が見当たりませんでした。新たな画像を登録したときに RSS で通知する機能もありませんでした。

以上のことより、これは「他者と画像(情報)を共有したい」ユーザよりも、「制作により自己実現を果たしたい」ユーザ向けのサービスであるという印象を受けました。

実際に使ってみると、その自由さの裏返しなのかXSSが容易にできてしまいました。
またコミュニケーションツールとしての機能が弱いのはやっぱり物足りないという印象を受けました。


Piczo に劣らないインターフェイスを持ち、かつコミュニティ機能がある NOTA の方が面白いのでは?


1002_1st posted from フォト蔵


1002_2nd posted from フォト蔵


1002_3rd posted from フォト蔵

2006年10月 4日

【Web Design】なるほどリンク集 その1
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんばんわ、sashaです。

ラボブログの当番が回ってきて、ネタがなくて困っていたところに、私がCSSでデザインをする上で参考にしているサイトを書いてみたら、とみんなに言われました。なるほどねー!じゃ、そうしよう。

ただ、恐縮ですが、私は7月にウノウに入社するまで6年間海外にいたため、リソースも英語サイトばっかです。おっと。アレルギー反応を起こさないでください。興味がある分野で日々英語のサイトを見続けるのも、英語に親しむ手段の一つです。

逆に、国内のリソースに関しては浦島太郎状態なので、皆様からの「このサイトいいよ!」をお待ちしてます☆

さて、第一回目は、日々チェックしたいサイトたちです。今後、「チュートリアル系」、「ユーザビリティ系」など、気が向いたときにまとめたいと思います。


日々の読み物 - 最低限、目を通したいサイトたち


日々のインスピレーション - CSS編


日々のインスピレーション - いろいろ編


他にももちろん色々あるけど、とりあえずはこんな感じで。それではまた!

2006年10月 3日

人のソースを読むと勉強になる
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

Keitaです。
僕はもともと、Delphiの技術者で、PHPに関してはほとんど独学で勉強してきました。
もともとHTTP周りのアプリケーションには興味があり多少の知識やバッドノウハウはあったのですが、明確なスタイルは、いくつかの書籍を呼んでみても残念ながら得られませんでした。

で、ある日悩んでたところ、Pukiwikiというオープンソースのスクリプトを設置することになり、設置の方法について調べているうちにソースを読むことになりました。

で、Perlで掲示板!!とかいう時代のころにしては、Pukiwikiってわりと綺麗なソースなのでコーディングスタイルを含めてかなりいろいろなところが勉強になりました。

特に印象に残っているのがこのコードです。

function input_filter($param)
{
    static $magic_quotes_gpc = NULL;
    if ($magic_quotes_gpc === NULL)
        $magic_quotes_gpc = get_magic_quotes_gpc();

if (is_array($param)) {
return array_map('input_filter', $param);
} else {
$result = str_replace("\0", '', $param);
if ($magic_quotes_gpc) $result = stripslashes($result);
return $result;
}
}

僕がみたころのコードはもっとはるかに単純だったと思います。
このプログラムは再起処理をする必要があるプログラムでarray_mapで処理しています。
このため、より高速にプログラムが処理できるようになっています。
このわずか15行にもみたないプログラムでも、いろいろなことを学びました。

今世の中で、公開されているPHPのスクリプトはわりといいものも悪いものもあったりして、どれを読んだらいいのかというのはわかりづらいかと思いますが、もし、今読むとしたら。
Zend Frameworkや、EthnaSymfonyなどのフレームワークがお勧めです。

僕はEthnaを読むことが多いのですが、PHP4的なオブジェクト指向の絶妙な妥協点とかが見えて非常に面白いです。


あと、最近は、Cの勉強をしようかとおもっていて、PHP本体のソースコードにも目を通すようになりました。
まだぜんぜんわからないですが、少しずつわかってきてこれでいざとなったら、PHPのバグも直せるようになったらなーと思っています。

オープンソースが流行して、いろいろなソースが読めるような時代になったのは、技術者として非常にエキサイティングな時代になったと思います。
もし、読んでる途中でバグを見つけたりしたら、そのパッチを投げたりすれば、もしかすると新しい出会いがあるかもしれません。

社内のコードばかり見ているのもいいですが、たまには外のコードを時間をかけて読んで見てはいかがでしょうか。

2006年10月 2日

次世代のデータ記述言語(かも!)JAXON
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

ひらっちです。

Webプログラミングではどのようなデータが送られてきても正常に動作するよう、入力データの検証が欠かせません。一方で、ユーザがフォームに入力したデータを、JavaScriptを使ってその場で検証して表示できれば、ユーザビリティの向上につながります。

この二つの機能は、データの検証についてはほんんど同じ機能です。しかし、多くの場合、サーバサイドではJavaScriptとは違う言語でプログラミングされているので、共通のコードにすることはできませんでした。

今回私が作成したものは、プログラミング言語に依存しないかたちで検証方法を書くためのライブラリです。まだ機能が絞り込まれていなかったり、足りなかったりしますが、一応動く形になりましたので公開します。

この機能を実現するため、最初はJSONを使っていました。しかし、JSONはある程度を超えた複雑な表現をしようとすると、見た目に煩雑になってしまいます。そこで、この機能を実現するために、まだ仕様が固まっていませんが、JAXON(Javascript Appliable Crosslanguage Object Notation)というデータ記述言語を考えてみました。

JSONが連想配列と配列でデータ構造をあらわすのに対して、JAXONでは関数呼び出しの形でデータ構造をあらわします。今回作成したデータ検証を例にとると:

Validate(input1(IsNumber('must be number')));

このような形です。

input1は、フォームのINPUT要素をあらわすオブジェクトです。 つまり、これは「input1が数値であることを検証する」と読めます(文字列はエラー時のメッセージです)。

また、Validate,input1はそれぞれ、可変長の引数をとります。複数の要素が指定された場合は、すべての要素の検証を行います。

JAXONによるデータ検証の記述は、大まかに次のようになります。

// 入力の記述
Input(入力名1);
Input(入力名2);
……

// 検証の記述
Validate(
    // 入力に対して、その引数の検証を行う
    入力名(動作(エラーメッセージ, 引数 ...)),
    // 第一引数の検証が真の場合、第二引数以降の検証を行う
    when( 入力名(動作(...)),
        入力名(動作(...))),
    ...);

JavaScript版のデモと、PHP版のデモが動くようにしておきました。ダウンロードはこちらです。ライセンスはMIT/Xスタイルです。

今回できなかった機能は、

  • 複数の入力の間の関係の検証
  • 配列型の入力の検証
  • JAXONの拡張のための簡単なインターフェイス

などです。

とくに、JAXONの拡張が容易になれば、Webアプリの多くの部分が親言語に依存しない形で書けるようになるんじゃないでしょうか。