PositLog、すげぇ2007年05月24日 13時35分43秒

お試しページのスクリーンショット

PositLog [ポジログ]

(via: MOONGIFT: » 必見!物凄く自由なWebツール「PositLog」:オープンソースを毎日紹介

MOONGIFTさんで紹介されてるのですでに大勢の人が目にしているだろうから、あえてこんなしょぼブログで紹介しなくてもとも思うが、あまりに感動したので。

ほんとにこりゃすごい。詳細はリンク先を見てもらうとして、付箋ログとでもいうか、ホワイトボードに付箋を好きに貼り付けてさらにマーカーで書き込んでいるような、なんとも自由度の高いアプリケーションだ。

個人的には漠然とこんな感じのシステムが欲しかったのだが、アイディアとして浮かんでもアプリケーションのディテールまでは見えてこないし、ましてや自分で実装なんぞは遥か彼方だった。それがここまで高度な操作感で実現されるとは。しかもMITライセンスのオープンソースで。

MOONGIFTさんが

PositLogのすごさは実際に触ってみてもらうのが一番いい。かなりの衝撃を受けるはずだ。
とおっしゃるとおり、触ってみるべき。あらかじめ説明を読んでいても、触ってみたときの衝撃はいささかも衰えないし。

format.js更新2007年05月24日 21時21分10秒

日付・数値フォーマットライブラリ「format.js」を更新してみた。ダウンロードはこちらから

parseExact静的メソッドの追加

DateとNumberに文字列を解析するparseExactメソッドを追加。使い方は以下の感じ。

// Date.parseExact
Date.parseExact( "2007年05月24日 19時00分00秒", "yyyy年MM月dd日 HH時mm分ss秒" ); // → 2007/05/24 19:00:00 を表す Date

// Number.parseExact
Number.parseExact( "1,000", "#,##0" ); // → 1000
第一引数に解析対象の文字列、第二引数にフォーマットパターンを指定する。フォーマットパターンは#formatメソッドで使用可能な書式指定文字列と同じものが使用できる。

動作サンプル

Date
書式:  
結果:  
Number
書式  
結果  

動作仕様

例によって.NET Framework劣化コピーな仕様。

Dateの書式指定子の仕様は以下の通り。

書式指定子 説明
yyyy、yy、y 年として解析。yyyyは4桁、yyは下2桁、yは1桁または2桁の数字を解析する。 y 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。 解析した年の値が100以下の場合、30未満は2000年台、30以上は1900年台として解釈する。
MM、M 月として解析。MMは2桁、Mは1桁または2桁の数字を解析する。 M 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。
dd、d 日として解析。ddは2桁、dは1桁または2桁の数字を解析する。 d 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。
HH、H 時として解析。HHは2桁、Hは1桁または2桁の数字を解析する。。 H 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。
mm、m 分として解析。mmは2桁、mは1桁または2桁の数字を解析する。 m 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。
ss、s 秒として解析。ssは2桁、sは1桁または2桁の数字を解析する。 s 以外のパターンを使用した場合、パターンの文字列長と解析する文字列の長さが一致した場合のみ正常に解析できる。
fff、ff、f ミリ秒として解析。 パターンが f の場合は秒以下、ffの場合は0.1秒以下が丸められる。例えば、ミリ秒部が「12」の場合、fでは0ミリ秒、ffでは 10ミリ秒、fffでは 12ミリ秒 になる。
年とミリ秒以外はパターンと文字列の長さが一致しなくてもよしなに解釈するのは.NETの動きに準じている。ミリ秒については、.NETは桁数が一致しない場合例外がスローされるが、formatの逆変換として解析するようにしてある。

Numberの書式指定子の仕様は以下の通り。元々Number()を使用することでほとんど十分ということもあり、桁数など細かい部分は手を抜いている。

書式指定子 説明
#,##0[.0+] 3桁ごとにカンマで区切る書式を解析する。小数点以下の桁数は保証されないので、"1,000.123"を"#,##0.00"でparseしてた場合でも結果は「1000.123」になる。
0+[.0+] 0詰の書式を解析する。Number()に丸投げしているだけ。
x[n]、X[n] 16進数を解析する。対象文字列の先頭に"0x"をくっつけてNumber()に丸投げしているだけ。
これはほとんどカンマ区切り書式の解析にのみ存在意義がある。

その他の修正点

年書式指定子"y"の動作仕様を変更。従来は単純な数字出力にしていたものを、2桁までに制限するように変更した。

// 2007年だとして
new Date().format( "y" ); // → "7"、以前は"2007"
new Date().format( "yy" ); // → "07"
new Date().format( "yyyy" ); // → "2007"

反省というかぼやきというか

なんとか実装はできたが、とてもスマートとはいえない実装になっている。 format実装時の設計を引きずって書式指定子オブジェクト(Date/Numberのformattersの要素)に実際の解析メソッドを実装する形でやってみたが、書式指定子間での連携が考慮されていないので、 たとえばこの状態からAMやPMに対応する書式指定子を実装できない(タイムゾーンくらいは実装できそうだが)。

また、おもったよりコンパクトにならなかったので、ますますこのライブラリの存在意義が薄い気がしているがまあ気にしないようにしよう。

関連エントリ