Aug 29, 2008

Cybozu2iCal 0.30公開 改め0.31公開

サイボウズオフィスのカレンダーアイテムを取得して、iCalendar形式に変換するスクリプト、Cybozu2iCalを更新しました。

Cybozu2ICal - ogawa - Google Code

0.20から0.30へのアップデートでは、ようやく重い腰を上げてサイボウズオフィス7に対応(参考: Ogawa::Buzz: サイボウズオフィス7の SyncCalendarと ApiCalendar)してみました。

config.yamlで使えるオプションが2つ追加されています。

calendar_driver
どのAPIを使ってカレンダー情報を取得するかを指定します。現状ではApiCalendar(デフォルト)かSyncCalendar(サイボウズオフィス6専用)のいずれかを指定できます。サイボウズオフィス6を使っている場合にはSyncCalendarを指定しておくと高速化されます。
date_range
取得するカレンダー情報の日付範囲を指定します。date_rangeにNを指定すると、今日のN日前からN日後までの範囲のアイテムのみをサイボウズオフィスから取得して処理します。デフォルトのdate_rangeは「30」です。この機能はcalendar_driverとしてApiCalendarを指定している場合のみ有効です。

注意点は以下の通り。

  • ApiCalendarではバナー予定は取得できません。
  • date_rangeに大きな数値を指定すると処理に非常に時間がかかります。DoS攻撃と間違われないようにマイルドな数値を指定することをお勧めします。
  • ほとんどテストしていないので人柱よろしくお願いします。

追記 (2008-08-30):

さっそくですが、致命的なバグを報告していただいたので修正した0.31を公開しておきます。

Aug 28, 2008

サイボウズオフィス7の SyncCalendarと ApiCalendar

職場のサイボウズオフィスがとうとうバージョン7にアップデートされた結果、自作のcybozu2icalが使えなくなってしまった。

どうして使えなくなるのかと言うと、サイボウズオフィス6にはSyncCalendarとApiCalendarという二つのAPIが用意されているのに対して、7にはApiCalendarの方しかないが、cybozu2icalは効率上の理由からSyncCalendarを使って実装してあるからだ。

ということで、cybozu2icalのApiCalendar対応に向けてちょっと2つのAPIを調べてみた。

まず、SyncCalendarの使用例はこんな感じ。

#!/usr/bin/perl
use strict;
use warnings;
use constant {
    URL    => 'https://your.domain.name/cgi-bin/ag.cgi',
    USER   => 'username',
    PASSWD => 'password',
};
 
my $auth_param = {
    _System  => 'login',
    _Login   => 1,
    _Account => USER,
    Password => PASSWD,
};
 
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
 
my $res = $ua->post( URL . '?page=SyncCalendar', $auth_param );
print $res->content;

(この例では与えていないが)sm, emというパラメータを与えることで最長一年前から一年後までのスケジュールを取得できるようだ。職場の環境がアップデートしてしまったので確認できないのだけど。

一方、ApiCalendarの方はこんな感じ。

#!/usr/bin/perl
use strict;
use warnings;
use constant {
    URL    => 'https://your.domain.name/cgi-bin/ag.cgi',
    USER   => 'username',
    PASSWD => 'password',
};
 
my $auth_param = {
    _System  => 'login',
    _Login   => 1,
    _Account => USER,
    Password => PASSWD,
};
 
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
 
my $res = $ua->post(
    URL . '?page=ApiCalendar',
    {
        %$auth_param,
        SetDate => 'da.2008.8.1',
        EndDate => 'da.2008.9.1',
    }
);
print $res->content;
 
for ( split( /\r?\n/, $res->content ) ) {
    next unless $_ =~ /^ts\.\d+,(\d+),(da\..+)$/;
    my $res = $ua->post(
        URL . '?page=ApiCalendar',
        {
            %$auth_param,
            EID  => $1,
            Date => $2,
        }
    );
    print $res->content;
}

要は、ApiCalendarでは(SyncCalendarとは異なり)2フェーズでカレンダー情報を取得することになる。最初のリクエストで取得したい範囲の日付を指定してEIDとDateのペアのリストを得た後、個々のEID・Dateペアに関して再度リクエストすることで詳細なカレンダー情報を得る。

ApiCalendarには問題が2つあって、1つはアホみたいに時間がかかること。(件数+1)回呼び出さなきゃならんからね。もう1つは分かりにくい問題なのだが、実はApiCalendarではバナー予定が取得できないこと。こっちの問題は洒落にならんね。

そういうわけで、cybozu2icalをサイボウズオフィス7用にポートするならこの2つの問題には目をつぶってもらうしかない。さてどうしよう。

Aug 26, 2008

Re: 世界の野球は変化しているのかも。

世界の野球は変化しているのかも。(関連資料編) - NOBODY:PLACE - MUTTER

勘ぐり過ぎかもしれないが、別に世界の野球が変化しているわけではなくて、日本のプロ野球で審判の地位が異常に低いのが遠因なんじゃないかと私は思う。

アマや海外だと審判の権限がある程度強くて、プロ野球では許されないほどストライクゾーンが可変だったり、恣意的な判定も審判の裁量の範囲で許容されているのではないか。アトランタで日本のアマチームが相手投手をボッコボコに打ち崩していたのは、そういう背景があるんじゃないか。単に後にプロ野球で活躍するタレントを豊富に擁していたってだけでなく(そうそう、アマ野球・国際試合に精通していてオリンピックにも思い入れのある三菱ふそうの垣野多鶴や日本生命の杉浦正則に任せていたら、別の結果もあり得たし、そうならなくても人材発掘オリンピックになって面白かったんじゃないかな)。

まったく別の言い方をすると、好打者には多分二種類あってそれは、自分のストライクゾーンを確固として持っていてゾーン外の球には手を出さないクレバーな打者と、逆にアベレージはそこそこで併殺打も少なくないけど三振は少なくて状況に応じて悪球打ちもできる打者だろう。前者はプロ野球では高い打率・出塁率を誇るけど国際試合の恣意的なジャッジの下でアベレージを残すのには必ずしも向かず、後者が国際試合に向いている、ってことじゃあるまいか(実は青木やイチローは後者の打者なんだけどレフティーと俊足のおかげでアベレージが高くなる打者だよね)。プロ野球の審判の地位の低さは、打者に相対的にクレバーであることを結果的に条件付けるものであって、後者の打者の育成の障害になっているんじゃないか。それが、打撃面での国際的な競争力の低下を招いているのではないか。

つまりは、ボブは腹立つけどボブに鍛えられることも重要だってこと。勘ぐりばっかりで申し訳ないけど。

プロ野球の審判の地位を低下させるのに最も貢献した選手・監督と言っても過言でない人物が、日本代表の監督を任されたというのも皮肉な話だなあと思う。

Aug 25, 2008

Templets 0.01公開

Ogawa::Buzz: Pluggableなテンプレートセットを実現する Templetsフレームワークで説明したTempletsプラグインを正式にリリースしておきました。

Templets - ogawa - Google Code

テンプレットの開発者ガイドも書きましたよー。

TempletDevelopersGuide - ogawa - Google Code

Aug 20, 2008

Movable Type Developer Conference でLightning Talkしてきた

Movable Type Developer Conferenceに参加して、Lightning Talkしてきました。私はOgawa::Buzz: Pluggableなテンプレートセットを実現する Templetsフレームワークの話を5分でするという無茶なことをやりました。5分ギリギリなのは計画通り。

使ったスライドを若干編集して置いておきます。デモはカットですが雰囲気で読んでください。英語版も用意しておいたのでBeauにも手土産として渡しておいてください。>中の人

日本語版プレゼンテーション: OOo Presentation PDF

英語版プレゼンテーション: OOo Presentation PDF

Lightning Talkって要はポスターのショートプレゼンですね。趣向を凝らした発表が多くて感心しました。

必死でメモとっている人がいて気の毒だったので、ポスターと同様ハンドアウトを用意してあげるとよいと思いました。発表する人はあらかじめネタを仕込んでるわけだから用意できる人は用意できますよね。紙がもったいなかったらUSBメモリに入れて配ればいいんです、運営の手間を度外視して言えばですけどね。

Aug 17, 2008

Pluggableなテンプレートセットを実現する Templetsフレームワーク

Movable Type Developer ConferenceのLightning Talkで話す予定の内容をフライングで公開しておきます。5分で話し切るのは無理だと思いますので。

はじめに

テンプレートセットは、Movable Typeバージョン4(以降MT4)で導入された概念で、インデックステンプレート、アーカイブテンプレート、テンプレートモジュールなどを含むテンプレートの集合のことです。

MT4では、ブログに配備されているテンプレートセットをまとめて操作するための機能が提供されています。例えば、[一覧]→[テンプレート]→[ブログのテンプレートを初期化]からテンプレートセットをインポートして配備できます(テンプレートセットの選択と入れ替え | Movable Type 4 ドキュメント)。その反対に、export-tsTemplateSetExporterのように、ブログに配備されているテンプレートセットをイクスポートするツールやプラグインも有志の手で実現されています。

また、テンプレートセットはプラグインとして配布できるようになっており、有用なテンプレートセットをユーザ間・システム間で共有するのにも役立つ手段となっています。

しかしながら、テンプレートセットにはいくつか欠点もあります。一つは、操作の粒度がテンプレートセット単位であることです。つまり、テンプレートセットの一部をテンプレートセットとしてインポート・イクスポートすることはできません。もう一つは、インポート操作が排他的であることです。テンプレートセットをインポートすると、それ以前のテンプレートセットの状態が失われてしまいます。

これらの欠点を言い換えるなら、テンプレートセットはテンプレートセットの一部をプラグインとして配布・再利用・共有する目的に使えないということです。

Templetsフレームワーク

Templetsフレームワークは、上述のテンプレートセットの問題を解決するために、テンプレット(pluggableな部分テンプレートセット)を実現するフレームワークです。

Templetsフレームワークを使うと、下図のようにベーステンプレートセットに対して、ウィジェットテンプレートライブラリのテンプレット、iPhone用のテンプレット、携帯電話用のテンプレットなどを追加していくことで、カスタマイズされたテンプレートセットを構築できるようになります。

つまり、テンプレートデザイナーは、すべてのテンプレートをデザインする必要はなく、自分が追加・拡張したいテンプレートだけを定義したテンプレットをプラグイン形式で配布できるようになります。ユーザは、そうしたテンプレットプラグインを組み合わせることで自分の用途に合ったテンプレートセットを柔軟に構築できるようになります。

Templetsフレームワークの実装は、Templetsプラグイン(フレームワークの実装)とテンプレットプラグイン(個々のテンプレットの実装)からなります。以下ではそれぞれについて説明します。

Templetsプラグイン

Templetsプラグインは、Templetsフレームワークのコア機能を実装しています。今のところ、テンプレットを現在のテンプレートセットに追加する機能のみを実現していますが、テンプレット単位でテンプレートセットからテンプレートを削除したり、テンプレットの更新をテンプレートセットに反映したり、テンプレートを選択してテンプレットとして出力したりなどといったフレームワークに必要な機能はゆくゆく実装していく予定にしています。

開発版は以下でダウンロードできます。

Templets-0.01.zip

Templetsプラグインをインストールすると、[一覧]→[テンプレート]のアクションリストに[テンプレットを追加]というリンクが表示されます。テンプレットプラグインが一つ以上システムにインストールされている場合には、[テンプレットを追加]ダイアログからテンプレットを一つ選択して[追加]することができます。

首尾よく追加できると、テンプレート一覧にテンプレットによって追加されたテンプレートが表示されるでしょう。

テンプレットプラグイン

個々のテンプレットは、テンプレットプラグインとしてテンプレートデザイナーが実装することになります。

そう言うと難しく思えますが、テンプレットプラグインは、テンプレートセットプラグイン(テンプレートセットの登録 | Movable Type 4 ドキュメント)とほとんど同じ方法で実装できます。テンプレートセットとテンプレットの違いは、

  • テンプレートセットでは「template_setsのhoge_set」を定義するのに対して、テンプレットでは「templetsのhoge_templet」を定義する。
  • テンプレートセットではhoge_setで使用するすべてのテンプレートを定義する必要があるのに対して、テンプレットでは定義したいテンプレートのみ定義すればよい。

ということだけです。

例として、cremaさんのiPhoneテンプレートfor MTをiPhoneTempletという名前のプラグインとしてテンプレット化することを考えます。

iPhoneテンプレートfor MTは、iPhone用のメインページ(iphone_index)とブログ記事(iphone_entry)の2つのテンプレートを含んでいます。

このときプラグインは、以下のようなディレクトリ構成を採ります。

plugins/iPhoneTemplet/config.yaml (テンプレットプラグインの定義ファイル)
plugins/iPhoneTemplet/templates/iphone_index.mtml (iPhone用のメインページのテンプレート)
plugins/iPhoneTemplet/templates/iphone_entry.mtml (iPhone用のブログ記事のテンプレート)
mt-static/plugins/iPhoneTemplet/ (テンプレートが使用するJavaScriptなどを格納するディレクトリ)

テンプレットプラグインの定義ファイルであるconfig.yamlは、以下のように書きます。

name: iPhone Templet
id: iphone_templet
key: iphone_templet
description: iPhone Templet is a templet for (snipped)
templets:
    iphone_templet:
        base_path: templates
        label: iPhone Templet
        templates:
            index:
                iphone_index:
                    label: Main Index (for iPhone)
                    outfile: i/index.html
                    rebuild_me: 1
            individual:
                iphone_entry:
                    label: Entry (for iPhone)
                    mappings:
                        individual:
                            archive_type: Individual
                            file_template: i/%c/%f

冒頭のname、id、key、descriptionはプラグインのメタ情報を設定するものです。テンプレット本体は、templets以降で記述しています。記述方法自体は、テンプレートセットの登録 | Movable Type 4 ドキュメントのYAMLによる方法とまったく同じであることがお分かりになるでしょう。「template_setsのmy_set」の代わりに「templetsのiphone_templet」を定義しているという点を除いては。

iPhoneTempletの開発版は以下でダウンロードできます。

iPhoneTemplet-0.01.zip

まとめ

テンプレートセットはテンプレートセットの一部をプラグインとして配布・再利用・共有する目的に使えないという問題を解決するために、Templetsフレームワークを実装しました。このフレームワークを利用すると、テンプレートデザイナーが実装したテンプレットを自由に配布・再利用・共有することができ、ユーザは複数のテンプレットを組み合わせて自分でテンプレートセットをカスタマイズできるようになります。

実のところ半日ででっち上げたもの(このドキュメントの方が時間かかってます)なので不具合はあるかもしれません。

Aug 13, 2008

下呂温泉 湯之島館

週末にワイドビューひだに乗って下呂温泉に行ってきました。

下呂温泉 湯之島館公式HP 下呂温泉の老舗宿

ここは湯量豊富な露天風呂もいいですが、建物が素晴らしいです。三階建ての豪奢な本館と洋館のミクスチュアが、昭和レトロなアドヴェンチャーゲームの世界に入り込んだような錯覚を引き起こしてくれます。夜中にスタンプラリーがてら徘徊するのがベストです。

Aug 11, 2008

Movable Type 4.2 パーフェクトガイド

一週間ほど東京を離れていたため報告が遅くなりましたが、荒木さんの「Movable Type 4.2 パーフェクトガイド」をいただきました。

これは荒木さん渾身の作ですね。私などにはとても真似のできない技です。大抵の読者は6章に目が行くと思いますが、私は5章の「テンプレートとテンプレートセットの作成」で、テンプレートセットの説明に果敢に挑戦されているところがよいと思いました。特に書籍では、テンプレートセットあるいはテンプレートセット・プラグインの構成について今まで説明を試みた例はほとんど(?)なかったと記憶しています。

あ、ちなみに全然関係ありませんが、Movable Type Developer Conferenceはインタフェースがテーマっぽいので、Lightning Talkではテンプレートセット絡みのインタフェースネタを話す予定です。

Aug 6, 2008

遅ればせながら山本昌200勝おめでとう!

出張中でネットにつながっている時間が短い+時差ぼけで出遅れました。

山本昌選手200勝おめでとうございます!

クワガタにラジコンにスーパーカー(ついでに野球)と、70年代の少年の夢をそのまま抱えて大人になったような昌さん。小松辰雄、今中慎二、山本昌、野口茂樹、川上憲伸と連なる中日のエース史の中で最も短命で、鉄腕と呼ばれたこともなかった昌さん。そんな昌さんがしぶとくしぶとく投げ続けることで200勝の大台に到達することを証明してくれたことが、私にはうれしくてうれしくてしょうがないです。

来年は最年長最多勝投手を!

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com