[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
動機と言えば、例によってシゴタノでよくタイマーが取り上げられるからなのですが。
使ってみて思った以上に便利だと言うことがわかりました。
時計があればタイマーなんていらないと思っていたのですが、
タイマーのいいところ、それは「時間が減っていく」ところだと思います。
時計は見るたびに時間が増える。数字が増えていく。
だから無駄に使っているというイメージが直感的にわかないのだと思いました。
方やタイマーはどんどん0に向かって減っていく。直感的に時間が無くなるというイメージが
沸いてきますから、良い感じで焦りが生まれますね。
たとえば、RTM(Remember the Milk)にならいまして、日付は「today」とか「4th sunday」とかで指定したいところですし。
そういったリッチなUI機能を実装するために、javascriptのライブラリについて調査してみました。
すでにいくつものサイトでjavascriptライブラリの比較記事が上がっています。
まずはメジャーどころから、@ITの記事。
Webアプリに使えるAjaxライブラリ8選! - @IT
続きまして個人ブログでの比較記事が二つ。
blog.shimazu.org : JavaScript ライブラリ比較
GANCHIKU.com » Javascriptライブラリ比較
こちらは海外の記事。
The JavaScript Library World Cup [JavaScript & AJAX Tutorials]
最後に、非常にたくさんのライブラリが一覧としてあげられているページ。
あるSEのつぶやき: Ajaxライブラリまとめ
聞いたことがあるprototype.jsやdojo、jQueryをはじめ、Yahoo UI Library、Mochikit、Google Web Toolkit、script.aculo.us、Ricoなどなどなどなど・・・これではきりがありません。
こんなにたくさんあるのではどこから手をつければよいのかすらさっぱりです。
おそらく、具体的にライブラリを使ってどのような機能を実装したいのか、イメージがまだできあがってないから適切なライブラリが選択出来ない状態に陥っているのかなぁと思います。
まずはjavascriptなしで立派に動作する画面を作って、それからですね。
一応、使うときはRuby on Railsでも使用されておりメジャーどころであるprototype.jsか、または最近よく名前を聞くjQueryを使ってみようと考えております。dojoは超高機能ですが重いらしいですし私には使いこなせそうもありません。
2週間ぐらい前から、Google App Engineで動かすためのアプリケーションを作成しています。
進捗状況はといえば、要件定義がだいたい終わって、ようやくそれらしい画面のレイアウトを作るのに成功したという程度で、あまり芳しくありません。
HTMLやCSSに詳しくなかったり、DjangoどころかPython自体初心者なので調べ物をしながら進めているのが主な遅延原因でしょうか・・・
ともかく!Djangoのテンプレートエンジンを使用して出来た画面がこちらです。
この程度の画面を作るのに休みを丸一日つぶしてしまったなんて・・・
やはり実際に手を動かして作ってみると、自分のスキルのなさが如実にわかっていいですね。もっと勉強してやろうという気になります。
閑話休題。画面の説明をします。
いわゆるよくあるヘッダ+右サイドバー付きのコンテンツ+フッタで構成される画面ですが、個人的にテーブルでレイアウトを作るのが大嫌いなので、なんとしてでもCSSだけで綺麗にレイアウトを作ってやろうと考えました。
しかしCSSでどうやって2段構成を作っているのかなんてまるでわかりません。
Google先生に聞いてみたところ、一番良い解答を返してくださったのがこちら。
Learn CSS Positioning in Ten Steps: position static relative absolute float
実際に10ステップのチュートリアルを踏まえて、CSSをどのように設定すればどのようなレイアウトが作れるのかが説明されています。ひとまずはここのやり方をパク・・・拝借しました。
↓こちらが先ほどの画面のテンプレート用のソース。
↓そしてこちらがCSSのソース。
↓最後に、pythonスクリプト(リクエストハンドラ)のソース。
見ての通り、リクエストハンドラの中で複数のテンプレートを読み込んで、
それをテンプレートパラメータとしてメインのテンプレートに埋め込むという手法をとってます。
この方法で問題ないのかと思っていたのですが、
実はDjangoにはテンプレートの継承という機能があることがわかりました。
テンプレートの継承とプロトタイプ | スパムとか
Django | The Django template language: For template authors | Django Documentation
1:すべての親になるテンプレートを作成し、{% block %}タグを埋め込む。
2:{% extends %}タグを利用して、親テンプレートのblockタグを実装した子テンプレートを作る
3:子テンプレートをrenderする
この手順を踏むことで、今回のようにわざわざ5種類ものテンプレートをインクルードしたりしなくてもすむみたいです!明日、早速試してみます。
Remember the Milkというタスク管理ツールを試してみました。
以前からシゴタノで何度も紹介されていたのですが、結局何度もスルーしてしまいました。しかし、今月と来月は例大祭に簿記の試験、さらにはGoogle Developer Dayと、やりたいことが盛りだくさん。しっかりと時間とスケジュールを管理しないととてもじゃないですが乗り切れません。ということで今更感もありますが、ついに私も手を出しました。
「タスク管理ツール」と言うとつい身構えてしまいますが、実際にはその名が示すとおり「ミルクを買うのを忘れないでね!」といった程度の内容を記録するために使う程度の、気楽なツールです。
・・・気楽なツールだから機能的には大したこと無いんだろうって?
大間違いです。
これこそまさに、私が求めていた「時間を管理するための時間の家計簿」です。
以下にRemember the Milk(以下RTM)の強さを自分なりに考えてまとめてみました。
- 軽快で、自然言語が解釈でき、多数のショートカットキーを備えた超強力なユーザーインターフェース
- それによってもたらされる継続性(単に予定を入力するのが楽しい!)
- 1日のうちに継続した予定を作成する時間が得られるということで、フランクリン・コヴィーのプランナーや「7つの習慣」と非常に相性がよい
- 入力した予定を自分の望む切り口で分析できる「スマートタグ機能」
- 「具体的にそのタスクをこなすには何時間かかるのか」がボトムアップ式に得られる
- 強力な外部連携機能(モバイル、Googleカレンダーをはじめとする各種カレンダー、ブックマークレット)
それでは詳細な説明を以下に。
「シーツをかえる」 の 「か」は換える?替える?変える?どれなんでしょう?
個人的には替えるだと思ってたのですが・・・
しかーし。我々日本人にはアレルギーとでも言わんばかりの英語嫌いがありまして、日本語のインターフェースにしない限り、どんなによいアプリでも誰も使ってくれません。それはさておいても、これからの国際社会を生き残るためには、「国際化対応?英語でアプリケーションを作ってハイおしまい!」でよいわけが無く、簡単にローカライズが出来るような仕組みを理解した上でアプリケーションを作ったほうがいいと思うわけです。
御託はこれぐらいにしまして。
というわけで、Python標準機能のローカライズモジュール"gettextを使用しまして、アプリケーションのローカライズにチャレンジしてみました。
参考にしたサイトはこちら。
2006-01-18 - himainuの日記
21.1 gettext -- Multilingual internationalization services(Python2.5.2公式ドキュメント)
6.27 gettext -- 多言語対応に関する国際化サービス(Python2.3日本語化ドキュメント)
公式のドキュメントを見ると意味不明な関数の羅列が並んでいて、コレでいったいどうすればいいんだと途方にくれてしまいます。
こんなときは、実装されたソースを読めばいいんです。なんといったってCやJavaと違いソース=モジュールですから、いちいちソースをダウンロードしてくる手間すらありません。インタプリタ言語って素敵。
gettext.pyをエディタで開いて格闘すること1時間、おおよその動きはつかめました。図にまとめるとこんな感じです。
なんだか射的の的みたいなステートチャートになってしまいましたが、要するに先ほど紹介しました参考サイトの中で指摘されているように、「gettext.install()」を呼び出して「_('MESSAGE')」みたいにアンダースコア関数を使えばいいだけです。たったの2ステップ。滅茶苦茶楽勝です。
さっそくやってみました。
まずは翻訳元になるソースを書いて、pythonインストールフォルダにあるTools/i18n/pygettext.pyスクリプトを呼び出します。
python pygettext.py test.py
みたいに。
うまくいきました。途中%の使い方を間違えて散々苦労している姿が見受けられますが気にしないでください。
pygettext.pyスクリプトを呼び出すとpo形式のファイルが出力されますので、コレをエディタで開いて思う存分に翻訳します。以下、翻訳内容です。手を加えたところは強調表示しています。
最も重要なのは一番下のmsgstrと、ヘッダ中のContent-Typeです。特にContent-Typeのcharsetは極めて重要で、poファイルの文字エンコードとあわせないとうまくいきません。
# TESTTEST.
# Copyright (C) 2008 akisute
# FIRST AUTHOR <abesix@bakasu.com>, 2008.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"POT-Creation-Date: 2008-05-08 10:44+JST\n"
"PO-Revision-Date: 2008-05-08 00:00+JST\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=Shift_JIS\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
#: test.py:13
msgid "Q.E.D \"Ripples of %s Years\""
msgstr "Q.E.D \"%s年の波紋\""
編集したら次はTools/i18n/msgfmt.pyスクリプトを呼び出して、poファイルをmoファイルにします。
python msgfmt.py poファイルのファイル名(拡張子は不要)
私はpoファイルのファイル名をja.poにしていたので、python msgfmt.py jaと入れたらうまくいきました。
で、生成したファイルを以下のように配置してみました。
C:\Python25\workspace>tree /f
フォルダ パスの一覧
ボリューム シリアル番号は 0000EE57 1C83:607F です
C:.
│ ja.po
│ test.py
│ utf8ja.po
│
└─locale
└─ja
└─LC_MESSAGES
ja.mo
ポイントは、install関数の引数localdirの指定と、LC_MESSAGESと言うフォルダを間に挟むことと、moファイル名を引数domainで指定することでしょうか。localdirとLC_MESSAGESの間にlanguagesフォルダがあって、これはなにやら環境変数から取得するだの何だのと言う話があったのですが、さっぱりわからないのでディレクトリ名をjaとしてみました。
moファイルも生成したし、早速試してみましょう。
・・・やっぱりだめでした。明らかにmoファイルを読み込んでくれていません。99%がlanguageフォルダの指定がうまくいっていないせいだと思われます。
だってWindowsの環境変数にLANGUAGEもLANGもLC_ALLも無いですし。だからといっていちいち環境変数を設定しなければ動かないシステムなんて欠陥です。第一環境変数に左右されるシステムなんてちょいと問題があります。
ですが、gettext.install()はそのままではlanguageを引数に取れません。仕方が無いのでgettext.translation()を使うことにします。再度試してみました!
ばっちりですね!
いやースクリプト言語はデバッグが難しい!ここまで来るのにだいぶ苦しみました。完成したときには正直軽く小躍りしてしまいましたよ。
・・・が。ダメです。まだ完成ではありません。
poファイルの文字エンコードが「Shift_JIS」じゃないと動作してくれないのです。UTF-8に変えて再度moファイルを生成し、試すと文字化けします。
別にShift_JISでいいじゃん?確かにその通りなのですが、Googleの発表によるとすでにWeb上のリソースの半数はASCIIではなくUnicodeになっているそうなので、ここでその流れに反するようなまねをするわけにはいきません。なんとしてもUnicodeで動作させたい。
Content-Typeの指定ミスかと何回も見直しましたがそうではない様子。困りました。
ここでNullTranslation.install()メソッドのソースを見直してみると・・・第2引数にunicode=Falseというものが指定されています。どうもこれが怪しい。さっそくt.install()としているところをt.install(unicode=True)にして再実行してみました。
ブラボー!やはりこいつでした。この引数の値に応じて_にバインドする関数をgettextとugettextで変化させているのが原因だったようです。
さて、次はこの成果をGoogle App Engine上で利用できるかどうかを試さなくてはいけませんね。
アクセスしてくるURLに応じて適切に言語体系を振り分ける必要がありそうです。どうしようかな・・・
ゴールデンウィークの間観光地までお出かけしていたら、すっかり情報に疎くなってしまいました。
12 | 2025/01 | 02 |
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
横幅900px以上、Firefox 3, Safari 3, Opera 9.5, Chrome 0.2以上。IE7ギリギリ対応。IE6未対応。