SimpleBoxes

Serene Bach テンプレートの互換性問題

Serene Bach 2 のテンプレートでは、入れ子になった独自ブロックを擬似的に扱っています。

一方、Serene Bach 3 のテンプレートでは、入れ子になった独自ブロックをきちんと階層的に扱うように変更されました。

例えば、

_main-1
******
<!-- BEGIN test1 -->
test1-1
<!-- BEGIN test2 -->
test2
<!-- END test2 -->
test1-2
******
<!-- END test1 -->
_main-2

のような構成のテンプレートがあったとして、

  • 独自ブロック test1 を 2 回繰り返す
  • 独自ブロック test2 を 1 回繰り返す

という場合、

_main-1
******
test1-1
test2
test1-2
******
test1-1
test2
test1-2
******
_main-2

のようになるのが自然だと思いますが、Serene Bach 2 ではそのように出力することができませんでした。

Serene Bach 3 では、このような入れ子構成を維持したまま、テンプレート処理を行なうので、期待通りに出力されます。

しかしながら、その代償として「同じ名前の独自ブロックが離れて置かれた」ようなテンプレートに対して、Serene Bach 2 と同じように出力されないという互換性の問題がありました。

例えば、

_main-1
<!-- BEGIN test1 -->
<!-- BEGIN test3 -->
test3-1
<!-- END test3 -->
test1-1
test1-2
<!-- BEGIN test3 -->
test3-2
<!-- END test3 -->
<!-- END test1 -->
_main-2

のような構成のテンプレートがあった場合、独自ブロック test3 が離れた場所に二カ所あります。

これまでの Serene Bach 3 では、このようなテンプレートを Serene Bach 2 と同じように出力することができなかったので、テンプレートの修正が必要になっていました。

この互換性の問題は、Serene Bach 3 の次のβ版リリースで解消されます。これによりテンプレートに関して Serene Bach 2 との互換性がかなり向上しています。

「Serene Bach テンプレートの互換性問題」の評価です。

今日の進捗 2009.04.14

問題
与えられた配列の n 番目の要素 (先頭の要素は 0 番目とする) に対して、同じ値を持つ要素が、配列のその要素の前にいくつあるかを返す関数を作成して下さい。

例えば、以下のような配列

A,B,B,B,C,D,E,F,G,G,G,G,H,I,J,J,J,J,J,J,J,J,J,J,K,L

があった場合、

  • n = 0 の時は 0 (値が A である要素はひとつしかない)
  • n = 1 の時は 0 (値が B である最初の要素)
  • n = 2 の時は 1 (値が B である二番目の要素なので 1 を返す)
  • n = 3 の時は 2 (値が B である三番目の要素なので 2 を返す)
  • n = 4 の時は 0 (値が C である要素はひとつしかない)
  • ……以下、続く

のようになります。

とりあえずの解答 (perl のコード) は「続き」に。

続きを読む>>

「今日の進捗 2009.04.14」の評価です。

リノベーションは楽じゃない 総集編 - 廊下

昨年末から今年始めにかけて行なったリノベーション (改築)。

見所 (?) を数回に分けてお送りしています。

今回は、唯一の増築部分ながら見栄え的にはやや地味な廊下。

ほぼ同一地点から撮ったショットです。

[写真] 廊下・リノベーション前後

増築された箇所が分かるでしょうか。

正面に見える玄関の位置が改築前後で変わっています。

改築後で白いマットが敷いてある辺りが改築前の玄関の位置でした。

「増築部分」はもともと壁に囲まれていた部分でしたので、増築というより「外になっていた部分を内に取り込んだ」といった方が良いかもしれません。

改築前後で照明の位置を変えていないため、広がった奥の部分は若干暗めになっています。

例によって、壁・天井・床の下地・仕上げは、嫁さんとの共同作業です。

床はフローリングになって、ニスのようなものをペイントして仕上げました。

床が乾くまでには数時間かかるので、寝る直前に塗るなど、できるだけ生活に支障が出ないように配慮して、寝室からトイレへの経路も

[写真] 廊下・床ペイント注意

のように確保しました。

これまでの関連記事

「リノベーションは楽じゃない 総集編 - 廊下」の評価です。

Serene Bach 多言語への対応

Serene Bach では、多言語対応を行なうライブラリとして sb::Language というモジュールが用意されています。

sb::Language の主な役割は二つ。

  • 定型文字列の多言語対応
  • 文字コードの変換

Serene Bach 3 になって仕組みは若干変わりましたが、基本的な内容はほぼ一緒です。

定型文字列の取得

例えば、

my $error = sb::Language->get->string('No article.');

のようにすると $error に「No article.」に対応した文字列がセットされます。

比較的よく利用されるインタフェースなので、Serene Bach 3 では

my $error = sb->string('No article.');

という形式のショートカットも用意されています。

言語リソースは特定ディレクトリ内にテキストファイルとして置かれています。

  • リソースディレクトリ (例 : /lib/resource/)
    • ja.txt : 日本語リソース
    • en.txt : 英語リソース

Serene Bach 2 では、基本的な言語リソースはモジュール内に記述されていましたが、Serene Bach 3 では上述のリソースファイルに移っています。

文字コード変換

文字コードの変換処理は sb::Language モジュールにあるインタフェースを利用します。

my $output = sb::Language->get->convert($input,'sjis');

現在のところ、あまり高度で複雑な処理などは想定されてなく、単に Jcode.pm のラッパーとして機能しています。

将来的には標準モジュールである Encode を利用するように変更したいところです。

Serene Bach のコンストラクタ

sb::Language は Singleton オブジェクトなので、どこで取得しても同一なオブジェクトが取得できることが保証されています。

Serene Bach では、new 以外に get がコンストラクタとして利用できます。

sb::Language->get->string('No article.');

のように、より自然な形で利用できるようにしています。

get コンストラクタは、sb::Object を継承した全てのクラスで利用できます。

関連記事

「Serene Bach 多言語への対応」の評価です。

mixi アプリを開発するのに携帯電話のメールアドレスが必須な件

「mixi アプリ」オープンβ版公開ということで、やはり一開発者としては気になるじゃないですか。

アプリ作成手順を見ると、まず開発者登録が必要らしいので、登録してみようと……

け、携帯電話のメールアドレスが必要なんですね、これ。……海外在住なので受け取れません。

そこで mixi 運営事務局にお問い合わせしてみました。頂いた返信メールにて

携帯電話をお持ちではない場合や、対応機種外の携帯をご利用の場合には、申し訳ございませんが、デベロッパー登録を行っていただくことはできかねます。

とのこと。

そう言えば、mixi に参加すること自体、携帯電話のメールアドレスが必須になったんでしたっけ。

携帯からの認証をおこなっていただかない限り、PCからの操作のみでは新規登録はできません。

(中略)

ユーザーの皆様にとってさらに安心感のあるコミュニティとしてmixi をご利用いただくために実施するもので、利用規約で禁止している迷惑行為等の被害を最小限にしていくための、安全性強化に関する取組みのひとつ

[mixi] ヘルプ > 登録 > 携帯がないと登録できないのですか?

ふむふむ。なるほど。

実際のところ、携帯電話のメールアドレスが必須になってから、当然ながら迷惑行為が減ったとして、どの程度の効果がこれまであったのか、一利用者としては気になるところです。

ちなみにインプレスが始めたサービス「GANREF」でもクラブメンバーになるのに mixi 同様「携帯電話のメールアドレスによる認証」が取り入れられています。

でも、mixi と決定的に違うのは、携帯電話がなくても登録する方法が用意されていることです (2009.04.11 現在)。

GANREF では、携帯電話がない場合、住所を記述して認証コードを郵送してもらうことで本人確認を行なっています。

[写真] GANREF から届いた認証メール

実際、私は海外から登録して、携帯電話のメールアドレスなしで GANREF のクラブメンバーになることができました。

ただし、私の場合認証コードの送付先は日本の住所を指定しました (海外の住所を受け付けているかどうかまでは確認していません)。

「mixi アプリを開発するのに携帯電話のメールアドレスが必須な件」の評価です。

リノベーションは楽じゃない 総集編 - ゲストルーム

昨年末から今年始めにかけて行なったリノベーション (改築)。

見所 (?) を数回に分けてお送りしています。

今回は、リビングと離れていてアクセスが今ひとつだったキッチンから、生まれ変わったゲストルーム。

ほぼ同一地点から撮ったショットです。

[写真] ゲストルーム・リノベーション前後

キッチンの取り外しはビルダーの方にやってもらいましたが、ペイントと床は嫁さんとの共同作業。

床はビニール敷きなのですが、最初は接着剤の適量が分からず塗りすぎて苦戦した覚えがあります。

ゲストルームは、オンスイート (Ensuite) になっていて、シャワー・トイレ・洗面台がついています。

[写真] ゲストルーム・オンスイート

ゲストルームは南側に位置するのですが、三面に渡って窓があるので、採光は十分です。

ニュージーランドは南半球にあるので、基本的には北側が日当りの良い面になります。

黄ばんでいた壁もすっきりと塗り直したので、明るい部屋になって印象はがらりと変わりました。

これまでの関連記事

「リノベーションは楽じゃない 総集編 - ゲストルーム」の評価です。

ちょいメモ 2009.04.09

イースター連休

明日からイースター連休になります。

イースター連休の始まりは例年都市部から出て行く方面が渋滞するのですが、今年は学校ホリデー開始と重なってやや早めに渋滞が始まるようです。

と言っても日本の渋滞ほどの激しさはありませんけれども。

イースターエッグ

職場でイースターエッグ (チョコレート) をもらいました。

ラップトップの横に置いていたら、ラップトップからの熱でいつの間にかゆるゆるになってました。危ない、危ない。

Serene Bach 3 開発進捗

Serene Bach 2 からデータ変換ツールの Ajax 部分を思案中です。

基本的には Serene Bach 2 同様、再構築の Ajax 部分をそのまま再利用するのですが、JavaScript を共有して利用するか、継承して利用するかで少し悩みました。

現在、継承はしないで、同じオブジェクトを共有して利用する方向で実装しています。

継承も検討した名残 (?) で JavaScript で継承を行なう関数 extend も追加しています→JavaScript継承パターンまとめ

「ちょいメモ 2009.04.09」の評価です。

着衣泳

着衣泳ってご存知ですか。

そのまんま「衣服を着たまま泳ぐこと」です。服を着た状態で、体力を温存しながら浮き続けることは、水難事故から身を守る手段として最も有効な技術と言えます。

日本でも最近「着衣泳」を学校でやるところがあるようです。どんな泳ぎ方よりもまず最初に優先して教えた方がいいんじゃないかと思うぐらい大切な技術だと思います。

娘は現在毎週一度の水泳教室に通っています。そこでは 1 ターム (およそ三ヶ月) に 2 回ほど「water safety」のレッスンがあります。どんなものか一度様子を見てみたいと思っていました。

[写真] Water Safety

奥で泳いでいるのが娘。ピンク色の上着を着て泳いでいるのが分かるでしょうか。

レッスンの基本的な流れとしては、

  • 服を着たまま泳いでみる [前・写真]
  • 助けの呼び方
  • 溺れている人を助けるには
  • 身の回りにある浮き具 [後・写真]
  • ボート転覆のシミュレーション

という感じでしょうか。

それほど長い時間ではないので、やや詰め込んでいる印象もなくはありませんでしたが、丁寧に説明していました。

[写真] 子供に説明する先生

水泳教室なので、実際にやってもらうという実技的な内容も多いのですが、思ったよりも先生がしっかり説明しているのが印象的でした。

子供向けレッスンなので、まず大事な点として、大人と一緒に泳ぐという点を強調していました。

着衣泳とは言いますが、実際には体力を温存しながら浮き続けることが大事なようです。着衣した状態で浮くこと自体は、むしろ着衣しないときよりも大変ではない様子です。私も機会があれば、意識しながら着衣泳を体験したいと思います。

「着衣泳」の評価です。

リノベーションは楽じゃない 総集編 - 子供部屋

夏時間 (Day Light Saving) も終わり、日本との時差が 3 時間になりました。

昨年末に触れたきりでしたが、リノーベーション (改築) 作業はほぼ全て終了しています。

大きなリノベーションだったので、色々見所 (?) はあるのですが、いくつかピックアップしていきたいと思います。

今回はランドリーから華麗に変身を遂げた子供部屋。

ほぼ同一地点から撮ったショットです。

[写真] 子供部屋・リノベーション前後

改築前では正面奥にある扉の先が勝手口のような形になっていました。

改築でそのスペースは部屋の一部になり、ちょっと出っ張ったような形になっています。

この改築後の写真ではすっきりしていますが、現在は娘のベッドが置かれて、また娘の大切なものが所狭しと収納 (?) されているので、かなり狭くなっています。

壁・天井の漆喰 (プラスター) 塗り、床のヤスリがけ (サンディング) は基本的に嫁さんが担当して、仕上げのペイントを私が担当しました。

子供部屋は改築行程の中でも後の方でしたので、嫁さんのプラスター技術もかなり洗練されてきていて、自己満足ではありますが、結構奇麗に仕上がっています。

ペイントの色は娘が選びました。青みがかった色でやや涼しげな感じですが、不思議と「冷たい」印象は薄くて (おそらく照明の影響もあると思います) 可愛らしい感じ。娘もとっても気に入っているようです。

これまでの関連記事

「リノベーションは楽じゃない 総集編 - 子供部屋」の評価です。

コマンドプロンプト (cmd) 覚え書き

バッチファイル (.bat) は、定型作業を自動化するのに便利なので、それなりに利用します。

ディレクトリ内のファイルに対して個々にある操作を行ないたい

dir/b オプションを利用して、テンポラリファイルにファイル一覧を書き出し、for ループで回します。

例えば、develop ディレクトリ内のファイル・ディレクトリに対して svn cleanup / update を実行するバッチファイルは以下の通り。

dir /b develop > _tmp_file.txt
for /f %%L in (.\_tmp_file.txt) do  (
  svn cleanup develop/%%L
  svn update develop/%%L
)
del _tmp_file.txt

遅延環境変数の展開

コマンドプロンプトを利用する際、

cmd /v:on

を実行すると、「遅延環境変数の展開 (delayed environment variable expansion)」を有効にすることができます。

「遅延環境変数の展開」を有効にしておくと、バッチファイル内で環境変数をローカル変数のように扱うことができます。

環境変数をバッチファイル内に局所化するコマンドとして

setlocal

がありますが、その引数に enabledelayedexpansion を指定すると、バッチファイル内で「遅延環境変数の展開」を有効にすることができます。

なお、遅延評価された環境変数は以下のコードのように !VARIABLE! と「%」の代わりに「!」を使います。

setlocal enabledelayedexpansion
for /f %%L in (en ja fr) do  (
  set RSRC_DIR=resource\%%L\
  svn update !RSRC_DIR!
)
endlocal

バッチファイル内での入力受付

set/P オプションを利用すると、バッチファイルでユーザーに処理を尋ねるプロンプト表示を利用することができます。

例えば、引数が指定されていない場合にオプションを尋ねたい場合には

if "%1"=="" (
  set /P USERINPUT=option? 
  if not '%USERINPUT%'=='' set USERINPUT=%USERINPUT:~0,3%
) else (
  set USERINPUT=%1
)
if '%USERINPUT%'=='' goto usage

のようにします。

if not '%USERINPUT%'=='' set USERINPUT=%USERINPUT:~0,3%

がややトリッキーですが、これは入力された内容の最初の 4 文字だけを利用するためのおまじないです。

set/P オプションはファイルからのリダイレクトも利用できます。

例えば、file の内容を %FILEINPUT% にセットする場合、

set /P FILEINPUT<=file

のようなコードになります。

「コマンドプロンプト (cmd) 覚え書き」の評価です。

3/18