03 買った....つもり
iPhone 買った....つもり
D4 買った....つもり
emonster 買った....つもり
溢れる物欲を抑えられないので、
買ったつもりになってみました
妄想だけならお金はいらないもんね
ペーパークラフトでも作るか....
2008年6月30日月曜日
2008年6月23日月曜日
初めてのPDA
[W-ZERO3応援コラム]WILLCOM 03発売まであと4日~W-ZERO3を応援する訳
W-ZERO3が発表されたときはホント興奮しましたね。買わなかったけど
PDA初体験の話ですが、僕の場合はpalm pilotでした
palm pilotはラスベガスに出張で行ったときに、現地メーカーのパーティの景品でもらいました。palm貰った時は機能的でカッコイイいう思いと、クレードルとの接点のエッジ端子がむき出しな本体の危うさに衝撃的でした。
一緒に居た同僚に端子を触られまくって、その日の内に故障しました
帰国してから日本法人のサポートに電話したら、アメリカで買ったものはサポートできないと言われて、仕方なくemailを米palm社のサポートに送ったら、日本のサポートの連絡先を返信されたり、たらいまわしにされたりして1ヶ月ぐらいかかってmailのやり取りした末にようやく本体交換してくれました
当時はplamは日本ではあまり知られて無くって、友人に自慢してたら、microsoftの社員の友人がPocketPCを持っていて見せてもらいましたが、PocketPCってダッサイなんて思いました
いまやPocketPCはWindowsMobileになってPlamはどっか行っちゃいましたけど
W-ZERO3が発表されたときはホント興奮しましたね。買わなかったけど
PDA初体験の話ですが、僕の場合はpalm pilotでした
palm pilotはラスベガスに出張で行ったときに、現地メーカーのパーティの景品でもらいました。palm貰った時は機能的でカッコイイいう思いと、クレードルとの接点のエッジ端子がむき出しな本体の危うさに衝撃的でした。
一緒に居た同僚に端子を触られまくって、その日の内に故障しました
帰国してから日本法人のサポートに電話したら、アメリカで買ったものはサポートできないと言われて、仕方なくemailを米palm社のサポートに送ったら、日本のサポートの連絡先を返信されたり、たらいまわしにされたりして1ヶ月ぐらいかかってmailのやり取りした末にようやく本体交換してくれました
当時はplamは日本ではあまり知られて無くって、友人に自慢してたら、microsoftの社員の友人がPocketPCを持っていて見せてもらいましたが、PocketPCってダッサイなんて思いました
いまやPocketPCはWindowsMobileになってPlamはどっか行っちゃいましたけど
gigashot GSC-A40Fで実際に撮影してみた
東芝のハイビジョンムービーカメラ「gigashot GSC-A40F」で実際に撮影してみた
欲しくなってきた...
ビックカメラ.comで56,400円 +ネットポイント「10%」(5,640P)サービス
安いと思う、お金があったら買ってしまいそう
Xacti DMX-HD700は手軽でよかったんだけど、ちゃんと撮りたいって時もあるのです
GSC-K80Hはビック特価:59,800円(税込) +ネットポイント「10%」(5,980P)サービス
720Pで80GB
GSC-K40Hはビック特価:49,800円(税込) +ネットポイント「10%」(4,980P)サービス
720Pで40GB
なんだ、この値段は
インターレースの1080iよりプログレッシブの720pの方が良いと思うんですけど、世間一般ではあまり評価されてないみたい。数年後に1080pが普及して、インターレースなんて使えねーって事にならないかな~と
欲しくなってきた...
ビックカメラ.comで56,400円 +ネットポイント「10%」(5,640P)サービス
安いと思う、お金があったら買ってしまいそう
Xacti DMX-HD700は手軽でよかったんだけど、ちゃんと撮りたいって時もあるのです
GSC-K80Hはビック特価:59,800円(税込) +ネットポイント「10%」(5,980P)サービス
720Pで80GB
GSC-K40Hはビック特価:49,800円(税込) +ネットポイント「10%」(4,980P)サービス
720Pで40GB
なんだ、この値段は
インターレースの1080iよりプログレッシブの720pの方が良いと思うんですけど、世間一般ではあまり評価されてないみたい。数年後に1080pが普及して、インターレースなんて使えねーって事にならないかな~と
SpursEngine搭載ノート
東芝、SpursEngineを搭載したAVノート「Qosmio G50/F50」
~上位モデルは1,920×1,080ドットの18.4型ワイド
お金のある人は、こういう尖った仕様のパソコンを買うべきだと思うよ。
~上位モデルは1,920×1,080ドットの18.4型ワイド
お金のある人は、こういう尖った仕様のパソコンを買うべきだと思うよ。
2008年6月21日土曜日
無線LAN付プリンタ
HPの無線LAN、スキャナ付のAll in one プリンタがなんだか安い
HP Photosmart C4380 All-in-One CC284C#ABJ
実は4月にamazonで12000円也+3000円キャッシュバックキャンペーンで購入したんだけど、そのときも9000円って安い!!と思ったけど更に安くなってる
HPのプリンタって前面給紙で、設置しやすいです。写真画質は日本メーカのプリンタの方がきれいみたいだけど、前面給紙とか自動用紙認識機能とかの使い勝手の良さがHPは昔から進んでると思ってました。
C4380は上位機種とは性能機能的には劣るけど、コンパクトで場所をとらないのが良いです。電源とUSBケーブルが背面より、少し飛び出すので壁にぴったりつけて設置は出来ないけど、奥行き30cm程度のキッチンのカウンターに置けました
こんな感じで置いてます
無線LANもついているのでLANケーブルを挿す必要も無く、家中のPCから印刷できて便利でした
スキャナ品質、スピードはそれなりです。メモリカードスロットが付いているので、上位機種みたいにメモリカードにスキャンデータを保存できると期待していたけど、出来ませんでした。
ネットワーク経由でスキャナとメモリカードを使用することは出来ます
家ではPostCardをスキャンして保存するために使っています。こんな
HP Photosmart C4380 All-in-One CC284C#ABJ
実は4月にamazonで12000円也+3000円キャッシュバックキャンペーンで購入したんだけど、そのときも9000円って安い!!と思ったけど更に安くなってる
HPのプリンタって前面給紙で、設置しやすいです。写真画質は日本メーカのプリンタの方がきれいみたいだけど、前面給紙とか自動用紙認識機能とかの使い勝手の良さがHPは昔から進んでると思ってました。
C4380は上位機種とは性能機能的には劣るけど、コンパクトで場所をとらないのが良いです。電源とUSBケーブルが背面より、少し飛び出すので壁にぴったりつけて設置は出来ないけど、奥行き30cm程度のキッチンのカウンターに置けました
こんな感じで置いてます
無線LANもついているのでLANケーブルを挿す必要も無く、家中のPCから印刷できて便利でした
スキャナ品質、スピードはそれなりです。メモリカードスロットが付いているので、上位機種みたいにメモリカードにスキャンデータを保存できると期待していたけど、出来ませんでした。
ネットワーク経由でスキャナとメモリカードを使用することは出来ます
家ではPostCardをスキャンして保存するために使っています。こんな
帰国しました
嫁さんがね。
留守中はうちの母親と叔母さんが助けに来てくれたので、子供たちの晩御飯を作らなくて済んだので助かった。
やっぱり9日間分の晩御飯を作るのはちょっとムリかな
秋にも海外旅行に行くらしいので、それまでには、料理のレパートリーを増やしておかないと...
留守中はうちの母親と叔母さんが助けに来てくれたので、子供たちの晩御飯を作らなくて済んだので助かった。
やっぱり9日間分の晩御飯を作るのはちょっとムリかな
秋にも海外旅行に行くらしいので、それまでには、料理のレパートリーを増やしておかないと...
2008年6月14日土曜日
iGoogleガジェットを作ってみる
展覧会案内の週間リスト表示が一応できたので、iGoogleのガジェットとして表示できるようにしてみます
iGoogleっていうのは、自分用のgoogleのtopページを作れるサービスで、ニュースとか天気予報との表示枠をガジェットとして配置することができます
このガジェットを自分で作成することが出来るので、今回はこれを作ってみることにします
ガジェットの作り方を勉強する
まずはGoogle ガジェットのページからスタートガイドざっと読みます。日本語ページなので助かります。
ただし、Google gadgetはiGoogle以外にdesktop用等種類があって、微妙にAPIの対応等が異なるみたいです。最初はガイド通りに作っても、動作しなくて悩みましたが、gadgets.* APIが
iGoogle Sandbox デベロッパー ガイドかLegacy Developer's Guideを読んだほうが良いかも。他人の作ったgadgetのソースを見ることができるのですが、いわゆるレガシーな記述が多いと思うのでLegacy Developer's Guideが参考になりそうです。Legacy....の方は日本語ページが無いので、Englishページからしか見つけられません
開発環境を準備する
必要なものはwebブラウザだけです。テキストエディタすら要らないです。
コーディングとプレビューはweb上のGoogle Gadgets Editorを使用します。これも日本語ページからは見つかりませんでした。Google Gadget Editor(以降ggeと書きます)はiGoogle上に配置できます
あとはdeveloper.xmlガジェットを使うと便利です。作成したgadgetはgoogleのサーバ上でキャッシュされるので開発時に変更したコードがiGoogle上で反映されないことが良くあります。developerガジェットでCachedチェックを外しておくとキャッシュされなくなります
上記のガジェットと作成中のガジェットをiGoogleに配置したタブを作成することができます
コードを書いてみる
ggeで最初にHello, worldサンプルコードが表示されているのでこれを書き換えていきます。previewタグで書き換えたコードを直ぐに試すことが出来ます
Hello, world の部分にhtmlを直接書いていく感じです。javascriptもここに書きます
まず
でページが表示されるときに、function jump()を実行します
jump()内で、展覧会案内の週間リストhtmlをサーバーからロードします
ロード後にfunction(responseText){...}が実行されるので<div id="week"> を受信したhtmlで書き換えます
最後にガジェットの表示高さを
で調整して終わりです
その他、表示コンテンツ内のボタンを押したときの処理をするfunctionも書いておきます。表示の体裁を整える<style TYPE="text/css">もここに書いちゃいました
後はガジェットのタイトルとかを記述して完成です
iGoogleで使えるようにアップロードする
ggeのEditorタブのFileメニューからSave Asでファイル名を決めて保存します。保存先はgoogleのサーバでアカウント毎に管理されてます。保存したファイルはOpenメニューで再編集することも出来ます。
保存したらPublishでiGoogleに登録します
Add to my iGoogle page をクリックするとiGoogleに追加できます
Add to a webpage で自分のウェブページに貼り付けることも出来ます
↓こんな
こんな感じで週間展覧会案内リストのiGoogleガジェットが出来ました。週間リストの内容はxmlで受信してjavascriptで表示の体裁を整えるようにしたほうが、自由度が高くて良いかなと思いました。そのうち書き換えようと思ってます
iGoogleっていうのは、自分用のgoogleのtopページを作れるサービスで、ニュースとか天気予報との表示枠をガジェットとして配置することができます
このガジェットを自分で作成することが出来るので、今回はこれを作ってみることにします
ガジェットの作り方を勉強する
まずはGoogle ガジェットのページからスタートガイドざっと読みます。日本語ページなので助かります。
ただし、Google gadgetはiGoogle以外にdesktop用等種類があって、微妙にAPIの対応等が異なるみたいです。最初はガイド通りに作っても、動作しなくて悩みましたが、gadgets.* APIが
iGoogle Sandbox デベロッパー ガイドかLegacy Developer's Guideを読んだほうが良いかも。他人の作ったgadgetのソースを見ることができるのですが、いわゆるレガシーな記述が多いと思うのでLegacy Developer's Guideが参考になりそうです。Legacy....の方は日本語ページが無いので、Englishページからしか見つけられません
開発環境を準備する
必要なものはwebブラウザだけです。テキストエディタすら要らないです。
コーディングとプレビューはweb上のGoogle Gadgets Editorを使用します。これも日本語ページからは見つかりませんでした。Google Gadget Editor(以降ggeと書きます)はiGoogle上に配置できます
あとはdeveloper.xmlガジェットを使うと便利です。作成したgadgetはgoogleのサーバ上でキャッシュされるので開発時に変更したコードがiGoogle上で反映されないことが良くあります。developerガジェットでCachedチェックを外しておくとキャッシュされなくなります
上記のガジェットと作成中のガジェットをiGoogleに配置したタブを作成することができます
コードを書いてみる
ggeで最初にHello, worldサンプルコードが表示されているのでこれを書き換えていきます。previewタグで書き換えたコードを直ぐに試すことが出来ます
Hello, world の部分にhtmlを直接書いていく感じです。javascriptもここに書きます
<script type="text/javascript">
function jump(str){
var url = 'http://forlune.appspot.com/week?startdate='+str;
_IG_FetchContent(url, function (responseText) {
var html = responseText;
_gel("week").innerHTML = html;
});
_IG_AdjustIFrameHeight();
}
function dateclick(str){
jump(str);
}
function cardclick(str){
window.open('http://forlune.appspot.com/card?key='+str,'_blank');
}
_IG_RegisterOnloadHandler(jump);
</script>
<div id="week">Loading...</div>
まず
_IG_RegisterOnloadHandler(jump);
でページが表示されるときに、function jump()を実行します
jump()内で、展覧会案内の週間リストhtmlをサーバーからロードします
_IG_FetchContent(url, function (responseText) {});
ロード後にfunction(responseText){...}が実行されるので<div id="week"> を受信したhtmlで書き換えます
最後にガジェットの表示高さを
_IG_AdjustIFrameHeight();
で調整して終わりです
その他、表示コンテンツ内のボタンを押したときの処理をするfunctionも書いておきます。表示の体裁を整える<style TYPE="text/css">もここに書いちゃいました
後はガジェットのタイトルとかを記述して完成です
iGoogleで使えるようにアップロードする
ggeのEditorタブのFileメニューからSave Asでファイル名を決めて保存します。保存先はgoogleのサーバでアカウント毎に管理されてます。保存したファイルはOpenメニューで再編集することも出来ます。
保存したらPublishでiGoogleに登録します
Add to my iGoogle page をクリックするとiGoogleに追加できます
Add to a webpage で自分のウェブページに貼り付けることも出来ます
↓こんな
こんな感じで週間展覧会案内リストのiGoogleガジェットが出来ました。週間リストの内容はxmlで受信してjavascriptで表示の体裁を整えるようにしたほうが、自由度が高くて良いかなと思いました。そのうち書き換えようと思ってます
展覧会案内webサービスを作る(6) 週間リストを作る
google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますよの続き
とりあえず、ハガキを表示する所まで作ったけど、このままだと一覧性にかけているので週間リストを表示するようにします。
pythonのコードとしてはmainページとあんまり変わらない、表示の体裁を整える為にテーブルにしたぐらい。改めてココに書くような内容はない。
次に週間リスト表示をメインページにのっける方法を考えました
最初はmainページ内に週間リストページを<iframe>で埋め込んでみたけど、全体が表示されなかったりしたのでjavascriptで週間リストページを読み込んで埋め込む様にしてみました
main.html内に<div id="week"></div> を埋め込んで、
更にjavascriptも埋め込みます
週間リストの読み込みは非同期に行いたいのでprototype.jsを使いました。僕のjavascriptの知識は日経ソフトウェアプレミアム総集編プログラミングまるごとパック (2007)
のページが殆どなので他の事はできません。とにかくprototype.jsを使えば良し
prototype.jsはアップロードしなくてもgoogleサーバから読み込めるので
と書いておきます。mainページ読み込み時に週間リストも読み込むようにしておきます
{{startdate}}はpythonのテンプレートで書き換えます
jump(str) 関数は '<<' '>>' ボタンで日付の移動をするために用意しました
いまのところこんなイメージです
もうちょっと、デザインをナントカしたいとか、sidebar側に関係ない色が侵入してたり、やることはまだいっぱいあります。
とりあえず、ハガキを表示する所まで作ったけど、このままだと一覧性にかけているので週間リストを表示するようにします。
pythonのコードとしてはmainページとあんまり変わらない、表示の体裁を整える為にテーブルにしたぐらい。改めてココに書くような内容はない。
次に週間リスト表示をメインページにのっける方法を考えました
最初はmainページ内に週間リストページを<iframe>で埋め込んでみたけど、全体が表示されなかったりしたのでjavascriptで週間リストページを読み込んで埋め込む様にしてみました
main.html内に<div id="week"></div> を埋め込んで、
更にjavascriptも埋め込みます
週間リストの読み込みは非同期に行いたいのでprototype.jsを使いました。僕のjavascriptの知識は日経ソフトウェアプレミアム総集編プログラミングまるごとパック (2007)
のページが殆どなので他の事はできません。とにかくprototype.jsを使えば良し
prototype.jsはアップロードしなくてもgoogleサーバから読み込めるので
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("prototype", "1.6.0.2");</script>
と書いておきます。mainページ読み込み時に週間リストも読み込むようにしておきます
<script type="text/javascript"><!--
var WEEK ='week';
function init(){
new Ajax.Updater('week', WEEK+'?startdate={{startdate}}', {method: 'GET'});
}
function jump(str){
new Ajax.Updater('week', WEEK+'?startdate='+str, {method: 'GET'});
}
Event.observe(window, 'load', init);
// --></script>
{{startdate}}はpythonのテンプレートで書き換えます
jump(str) 関数は '<<' '>>' ボタンで日付の移動をするために用意しました
いまのところこんなイメージです
もうちょっと、デザインをナントカしたいとか、sidebar側に関係ない色が侵入してたり、やることはまだいっぱいあります。
2008年6月13日金曜日
2008年6月12日木曜日
いじわる~ん
意地悪なことを言う人は、何か抑圧されたものがあるのだと思う
僕の周りで意地悪な意見を言う人は、それが最高に冴えた考えだと思っている様に見えます
ちなみに僕は結構意地悪父さんです
娘に良く
「いじわる~ん」
と言われます。
それがまた可愛いので、もっと言ってやりたくなります
僕の周りで意地悪な意見を言う人は、それが最高に冴えた考えだと思っている様に見えます
ちなみに僕は結構意地悪父さんです
娘に良く
「いじわる~ん」
と言われます。
それがまた可愛いので、もっと言ってやりたくなります
2008年6月11日水曜日
旅行
嫁さんが、今日からフランス旅行に行ってしまいました
子供達と、お父さんはお留守番です
iPhoneとEMONSTER liteの発表がありましたね、iPhoneの発表が無ければEMONSTER liteも魅力的に思えたんだろうけど、iPhoneを見てしまうと霞んで見えます。
EMONSTER欲しいナーと思っていたけど、iPhoneはもっと欲しい、いや両方欲しい
「iPhone独壇場の時代は終わった」と千本氏
と言うなら
なんて思っちゃいましたね。なんか負け惜しみっぽく感じたわけです。
なかでも一番気に食わないのが
U-29(若者応援キャンペーン)
おっさんを応援しろ!
子供達と、お父さんはお留守番です
iPhoneとEMONSTER liteの発表がありましたね、iPhoneの発表が無ければEMONSTER liteも魅力的に思えたんだろうけど、iPhoneを見てしまうと霞んで見えます。
EMONSTER欲しいナーと思っていたけど、iPhoneはもっと欲しい、いや両方欲しい
「iPhone独壇場の時代は終わった」と千本氏
と言うなら
- HTC Touch Diamondを出そうよ
- iPhoneの後追いしていて言うことじゃないなー
- レベニューシェアモデルが生存しえなくなれば、変えればいいだけだし、現に変わりそうだし
- ブガッティの高級車を意識してデザイン、って言っちゃうところが恥ずかしいなー、ガキっぽい
- そこまでいうならiPhone採用の可能性はキッパリ否定しろ
- 日本の携帯、世界では孤立状態!とか言っても海外から端末買ってるだけだろ
なんて思っちゃいましたね。なんか負け惜しみっぽく感じたわけです。
なかでも一番気に食わないのが
U-29(若者応援キャンペーン)
おっさんを応援しろ!
2008年6月8日日曜日
展覧会案内webサービスを作る(5) 入力ページを作る
Google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますよの続き
案内葉書データを入力するページを作る
ページを作成するのは、なんと言うかセンスが無いし大変なので、よそから頂戴することにした
http://www.phpform.org/
入力ページはloginしないと作成できない様にapp.yamlファイルに設定を記述する
members,imagesはStringListPropertyなので、連結して単一の文字列オブジェクトにしておいた
template内でfor文を使って処理することもできるけど、このほうがスッキリする?
入力フォームページはtemlateとして使用するので初期値をvalue="{{ entity.title|default:"" }}"のように書き換えておく
入力したフォームを処理するcgiとしてformタグにaction="/postcard"としておく
アプリ側でPOSTされたデータを識別するためにフォームにkeyデータを埋め込んでおく
これで、アプリは
の様に新規作成されたデータか、既存のデータを編集したのかを判断できる
後は、Postされたフォームのデータをひたすら拾ってデータベースにputする
最後にルートにリダイレクトして終わり
これで、とりあえず使えるページが出来た。
ただ、見栄えとか良くしたり、早見表みたいなのをつけたりしたい
案内葉書データを入力するページを作る
ページを作成するのは、なんと言うかセンスが無いし大変なので、よそから頂戴することにした
http://www.phpform.org/
入力ページはloginしないと作成できない様にapp.yamlファイルに設定を記述する
- url: /inputpage新規作成する場合と、既存のデータを編集する場合があるので、httpリクエストのクエリとしてkey=xxxを処理するようにした
login: required
script: forlune.py
class InputPage(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
key = self.request.get('key')
if key:
entity = db.get(key)
else:
entity = PostCard( \
date_s = datetime.date.today() + datetime.timedelta(hours=9), \
date_e = datetime.date.today() + datetime.timedelta(hours=9,days=1), \
opentime = datetime.time(hour=10,minute=0,second=0), \
closetime = datetime.time(hour=18,minute=0,second=0) \
)
members = ",".join(entity.members)
images = ",".join(entity.images)
template_values = {
'key' : key,
'members': members,
'images' : images,
'entity' : entity
}
path = os.path.join(os.path.dirname(__file__),'input.html')
self.response.out.write(template.render(path,template_values))
members,imagesはStringListPropertyなので、連結して単一の文字列オブジェクトにしておいた
template内でfor文を使って処理することもできるけど、このほうがスッキリする?
入力フォームページはtemlateとして使用するので初期値をvalue="{{ entity.title|default:"" }}"のように書き換えておく
入力したフォームを処理するcgiとしてformタグにaction="/postcard"としておく
アプリ側でPOSTされたデータを識別するためにフォームにkeyデータを埋め込んでおく
<input type="hidden" name="key" value="{{key}}" />
これで、アプリは
key = self.request.get('key')
if key:
postcard = db.get(key)
else:
postcard = PostCard()
の様に新規作成されたデータか、既存のデータを編集したのかを判断できる
後は、Postされたフォームのデータをひたすら拾ってデータベースにputする
class PutCard(webapp.RequestHandler):
def post(self):
key = self.request.get('key')
if key:
postcard = db.get(key)
else:
postcard = PostCard()
postcard.images = self.request.get('images').rsplit(',')
postcard.title = self.request.get('title_name')
postcard.place = self.request.get('place')
postcard.address = self.request.get('address')
postcard.zip = self.request.get('zip')
db.put(postcard)
self.redirect('/?kind=all')
最後にルートにリダイレクトして終わり
これで、とりあえず使えるページが出来た。
ただ、見栄えとか良くしたり、早見表みたいなのをつけたりしたい
展覧会案内webサービスを作る(4)
Google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますの続き
前回までにPostCardデータベースを日付に合わせて表示できるようになったけど、説明を省いたところについて書いておく
htmlのリクエストクエリとして?kind=208-5-1の様に日付を指定した場合に、startdateにdateオブジェクトとして値をセットする処理
まず、日付処理をするために
を追加した。こんなの追加しなくてもいいような気もする
今日の日付を取得する
today()メソッドで取得した日付は9時間づれているので、修正しておく。タイムゾーンの扱いについてドキュメントに記述があったけど、なんだか理解できなかったので、簡単に9時間足すだけにしといた
文字列オブジェクト(kind)からdateオブジェクトに変換する
kind=2008-6-7
と入っていたら'-'文字で分割してint()に変換してyear,month,dayオブジェクトを作る
datetimeオブジェクトをdatetime(year,month,day)で生成する
kindに無効な文字が入っていら例外が発生するのでtodayを代入すりる
enddateオブジェクトはspanクエリでstartdate基準で1日、1週間、1ヶ月後の日付を入れる
htmlに"2008年6月1日~2008年6月7日"のような表示をするためにdatetimeオブジェクトから文字列に変換する
日本語表記にしたかったのでstrftime()メソッドは使わなかった
前回までにPostCardデータベースを日付に合わせて表示できるようになったけど、説明を省いたところについて書いておく
htmlのリクエストクエリとして?kind=208-5-1の様に日付を指定した場合に、startdateにdateオブジェクトとして値をセットする処理
まず、日付処理をするために
import datetime
を追加した。こんなの追加しなくてもいいような気もする
今日の日付を取得する
today = datetime.datetime.today() + datetime.timedelta(hours=9)
today()メソッドで取得した日付は9時間づれているので、修正しておく。タイムゾーンの扱いについてドキュメントに記述があったけど、なんだか理解できなかったので、簡単に9時間足すだけにしといた
文字列オブジェクト(kind)からdateオブジェクトに変換する
try:
year,month,day = [int(num) for num in kind.split('-')]
startdate = datetime.datetime(year,month,day)
except:
startdate = today
kind=2008-6-7
と入っていたら'-'文字で分割してint()に変換してyear,month,dayオブジェクトを作る
datetimeオブジェクトをdatetime(year,month,day)で生成する
kindに無効な文字が入っていら例外が発生するのでtodayを代入すりる
enddateオブジェクトはspanクエリでstartdate基準で1日、1週間、1ヶ月後の日付を入れる
if span=='day':
enddate = startdate.date()
elif span=='week':
enddate = startdate.date() + datetime.timedelta(days=6)
elif span=='month':
enddate = startdate.date() + datetime.timedelta(days=calendar.monthrange(startdate.year,startdate.month)[1])
else:
enddate=None
htmlに"2008年6月1日~2008年6月7日"のような表示をするためにdatetimeオブジェクトから文字列に変換する
日本語表記にしたかったのでstrftime()メソッドは使わなかった
pagectrl=u'%d年%d月%d日~%d年%d月%d日の葉書 ' % ((startdate.timetuple()[:3]+enddate.timetuple()[:3]))次はデータ入力ページを作る
2008年6月7日土曜日
展覧会案内webサービスを作る(3)
Google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますの続き
指定した日付の期間中に開催している展覧会案内葉書(PostCard)のデータが取得できたので、html形式に整形して表示する
htmlにする前に、表示するPostCardの数を指定できるようにする
Queryオブジェクトならfetch()メソッドを使う用に思うけど、既にQueryオブジェクトではなくてlistになっているので、素直にスライスを使う
このへんは処理パフォーマンス的にどうかと思うけど、どうせそんなに大きなデータを使うわけでもないので、気にしない事にする
htmlとして表示するには、
の様にhtmlをそのまま吐き出せばいい
ただプログラムでいちいちhtmlをoutputするのは面倒なので、templateを使う。
チュートリアルでもtemplateを使っているので同じようにする
login処理のhtmlも同様にhtml文字列を返す関数を作った
指定した日付の期間中に開催している展覧会案内葉書(PostCard)のデータが取得できたので、html形式に整形して表示する
htmlにする前に、表示するPostCardの数を指定できるようにする
entitys=entitys[start:start+maxcount]
Queryオブジェクトならfetch()メソッドを使う用に思うけど、既にQueryオブジェクトではなくてlistになっているので、素直にスライスを使う
このへんは処理パフォーマンス的にどうかと思うけど、どうせそんなに大きなデータを使うわけでもないので、気にしない事にする
htmlとして表示するには、
self.response.out.write(u'')
の様にhtmlをそのまま吐き出せばいい
ただプログラムでいちいちhtmlをoutputするのは面倒なので、templateを使う。
チュートリアルでもtemplateを使っているので同じようにする
template_values = {temlateはindex.htmlにtemplate_valuesに定義されたオブジェクトを埋め込んだhtml文字列を生成してくれる。
'today':today,
'pagectrl':pagectrl,
'login':login(self),
'cards':cards,
}
path = os.path.join(os.path.dirname(__file__),'index.html')
self.response.out.write(template.render(path,template_values))
<html>temlateでもfor文でlistを展開したり出来る。チュートリアルでもそうなっていたけど、temlate内にプログラム的な記述を書くのがだんだん面倒になってきたので、pythonのプログラムでPostCard表示部分のhtmlを生成してcardsオブジェクトに埋め込むことにした
<head>
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>
<body>
<div>{{today}}</div>
<div>{{pagectrl}}</div><div>{{login}}</div>
<a href="inputpage">入力フォーム</a><br>
<div>{{ cards }}</div>
</body>
</html>
login処理のhtmlも同様にhtml文字列を返す関数を作った
def login(self):
user = users.get_current_user()
if user:
login = u'<b>%s: </b><a href="%s">Logout</a>' % (user.nickname(),users.create_logout_url(self.request.uri))
else:
login = u'<b>guest: </b><a href="%s">Login</a>' % (users.create_login_url(self.request.uri))
return login
2008年6月6日金曜日
展覧会案内webサービスを作る(2)
"Google AppEngineを使って展覧会案内葉書のデータベースサービスを作ります"
チュートリアルで簡易掲示板みたいなのを動かしてみて、なんとなくわかったこと
データストアクラスを作る
まず展覧会案内葉書に必要な項目について考える
クラスのメンバは
db.UserProperty
db.StringProperty
db.DateTimeProperty
等の型が使える
Types and Property Classesに一覧がある。
DateTimePropertyには作成時に現在の日付を初期値として自動的に割り当てることができる。でも日本との時差で9時間ずれている
LinkPropertyとかEmailPropertyなんてものもあるけど、よくわからないのでStringPropertyにして、葉書画像のリンクの様に複数データが必要なものはStringListPropertyとした
メインページはurl:http://forlune.appspot.com/にアクセスしたときに表示するhtmlを生成する
チュートリアルを改造して MainPage クラスを作る
GETリクエストを受け取ったときの処理を記述
kind=all,yyyy-mm-dd
start=n
maxcount=n
span=day,week,month
とする。kind=allでPostCardを全て表示する、日付を指定するとその日以降開催している展覧会の葉書を表示する様にする
spanで表示期間を1日,1週間,1ヶ月とする
start,maxcountで表示する枚数を制限する
プログラムでクエリはPOST,GETリクエストともに
self.request.get('kind')
の様に受け取る
文字列を数値に変換するために int() 関数を使う、変換に失敗したら例外が発生するので、例外処理も含めておく
指定した日付で終了していないPostCardを取り出す
データベースから条件を指定してデータを取り出すには、gqlとかいうのを使うらしい
Getting Entities Using a Query
gqlはsqlに似たデータベース言語だけど、sqlすら使ったこと無いので良くわからん
よくわからないけど、日付で範囲を指定してデータを取り出すには以下の様に記述すると出来た
本当は、指定した期間内に開催中のPostCardを抽出するようにしたいのだけど、gqlでは抽出条件に異なるプロパティに対して不等号を条件として設定することが出来ないみたい?
例えば date_s <=enddate AND date_e >= startdate こういう条件はダメ?
仕方が無いのでenddate側の絞込みはプログラムでやってみる
これをやっちゃうとentitysもうQueryクラスではなくてリストになる?
Queryクラスってのが、いまひとつ理解できてないけど、リストとは違うみたい
ここには
つづく
チュートリアルで簡易掲示板みたいなのを動かしてみて、なんとなくわかったこと
- python はvbやc#のようなbegin..endや{ } の代わりに、インデントで文を区切る
- データベースに登録するクラスは class XXX(db.Model) で定義する
データストアクラスを作る
まず展覧会案内葉書に必要な項目について考える
- データ作成者
- データ作成日(更新日)
- 葉書の画像URL、裏表あるので、複数のリンクを保存する必要がある
- 展覧会タイトル
- 展覧会開始日、終了日
- 開場時間
- 会場
- 会場住所
- 地図
- イベント(オープニングパーティがあるよ!とか、最終日は4時までとかの情報
クラスのメンバは
db.UserProperty
db.StringProperty
db.DateTimeProperty
等の型が使える
Types and Property Classesに一覧がある。
DateTimePropertyには作成時に現在の日付を初期値として自動的に割り当てることができる。でも日本との時差で9時間ずれている
LinkPropertyとかEmailPropertyなんてものもあるけど、よくわからないのでStringPropertyにして、葉書画像のリンクの様に複数データが必要なものはStringListPropertyとした
class PostCard(db.Model):メインページの表示を作る
author = db.UserProperty()
images = db.StringListProperty()
title = db.StringProperty()
members = db.StringListProperty()
update = db.DateTimeProperty(auto_now=True)
date_s = db.DateProperty()
date_e = db.DateProperty()
opentime = db.TimeProperty()
closetime = db.TimeProperty()
place = db.StringProperty()
address = db.PostalAddressProperty()
zip = db.StringProperty()
phone = db.PhoneNumberProperty()
point = db.GeoPtProperty()
content = db.StringProperty(multiline=True)
comment = db.StringProperty(multiline=True)
closed = db.StringListProperty()
events = db.StringListProperty()
visible = db.BooleanProperty()
メインページはurl:http://forlune.appspot.com/にアクセスしたときに表示するhtmlを生成する
チュートリアルを改造して MainPage クラスを作る
GETリクエストを受け取ったときの処理を記述
class MainPage(webapp.RequestHandler):GET リクエストで受け取るクエリとして
def get(self):
.....
kind=all,yyyy-mm-dd
start=n
maxcount=n
span=day,week,month
とする。kind=allでPostCardを全て表示する、日付を指定するとその日以降開催している展覧会の葉書を表示する様にする
spanで表示期間を1日,1週間,1ヶ月とする
start,maxcountで表示する枚数を制限する
プログラムでクエリはPOST,GETリクエストともに
self.request.get('kind')
の様に受け取る
文字列を数値に変換するために int() 関数を使う、変換に失敗したら例外が発生するので、例外処理も含めておく
try:PostCardをデータベースから取り出す
start=int(self.request.get('start'))
except:
start=0
entitys=PostCard.all().order('-update')これで全部のPostCardを更新順に取り出せる
指定した日付で終了していないPostCardを取り出す
データベースから条件を指定してデータを取り出すには、gqlとかいうのを使うらしい
Getting Entities Using a Query
gqlはsqlに似たデータベース言語だけど、sqlすら使ったこと無いので良くわからん
よくわからないけど、日付で範囲を指定してデータを取り出すには以下の様に記述すると出来た
entitys = PostCard.gql("WHERE date_e >= :1 "+"ORDER BY date_e LIMIT 10",startdate)ここでstartdate は表示する期間の開始日をセットしてある、同じように終了日をenddateに設定してる。つまり4/1から一週間の間に開催中の展覧会を表示したい場合はstartdateに4/1、enddateに4/7をセットする
本当は、指定した期間内に開催中のPostCardを抽出するようにしたいのだけど、gqlでは抽出条件に異なるプロパティに対して不等号を条件として設定することが出来ないみたい?
例えば date_s <=enddate AND date_e >= startdate こういう条件はダメ?
仕方が無いのでenddate側の絞込みはプログラムでやってみる
entitys = [entity for entity in entitys if entity.date_s <= enddate]これはリストの内包表記というやつで、
new_entitys = []を簡単に書ける
for entity in entitys:
if entity.date_s <= enddate:
new_entiys.append(entity)
entitys = new_entitys
これをやっちゃうとentitysもうQueryクラスではなくてリストになる?
Queryクラスってのが、いまひとつ理解できてないけど、リストとは違うみたい
ここには
って書いてあった。クエリの結果にアクセスするにはfetch()、かイテレータインターフェイスとある。上記の場合はイテレータインターフェイスということになるのかなQueryオブジェクトもGqlQueryオブジェクトも、実はアプリがその結果にアクセスしようとするまではクエリを実行しないんだ。つまり、アプリが結果にアクセスしようとした時にクエリが実行され、Modelクラスのインスタンスとしてメモリに読み込まれるってコトだな。ちなみに、どっちのクラスも結果へのアクセス方法は2つある。1つがfetch()メソッドを使う方法、そしてもう1つがイテレータインターフェースだ。
fetch()メソッドは返却される結果の上限値を「fetch(上限値)」の形式で表現するぜ!それからオプションでスキップするオフセットを指定する事もできる。書き方としてはfetch(上限値, offset=オフセット値)って感じになる。上限値の部分で指定してるのが、datastoreから引っ張ってくる結果の数で、オフセットで指定するのが実際にメソッドの結果として返される結果の数ってコトになってるゼ! 簡単にまとめると、まずはメモリ上に上限値までの全ての結果を引っ張ってきて、それから初めてオフセットに従った結果を返す為の処理が行われるってワケだな。つまり、オフセットで指定する値はdatastoreからとってくる結果の数には影響を与えなくて、あくまでもfetch()メソッドの実行結果を返す段階で使われるダケって話だ。
つづく
2008年6月5日木曜日
uGReader Ver1.021
2008年6月4日水曜日
uGReader Ver1.02
まだテスト中なので、特に問題が出なければ、cabファイルとソースを明日にでもアップロードします
zipファイル
cabファイルを作りました
オフラインはまだ手をつけてないです...ごめんなさい
- ももたろさんパッチでリストの先頭と最後がつながりました
- menu->SortByOldestにチェックしておくと古い順にfeedをダウンロードします
- menu->Settingに詳細表示中のFontSizeを%で指定できるようにしました
zipファイル
cabファイルを作りました
オフラインはまだ手をつけてないです...ごめんなさい
展覧会案内webサービスを作る
"Google AppEngineを使って自分用のデータベースサービスを作る"
という内容で、作成過程やつまずいた所、解決できた内容等をblogにメモしていこうと思ってます
が、やる前からメンドクサくなってきました
気を取り直して、まずは環境から
インストールとか導入は、他のサイトで紹介されているのでそちらを参考にします
(なんだ、全然役に立たないエントリだな)
とにかく、チュートリアルのgettingstartedぐらいまでなら、わからないなりに動かすことができるので、とりあえずチュートリアルどおりに入力して、デバック環境で実行してみます
http://code.google.com/appengine/docs/gettingstarted/
チュートリアルも解説してる日本語ページが結構あるのでそちらを参考にします
(日本語で解説しているページのリンクぐらい載せるべきだね)
続く.....
.... のか?
う~ん、こういうのは向いてないなぁ。続かないというより、続ける意味が無いなぁ
という内容で、作成過程やつまずいた所、解決できた内容等をblogにメモしていこうと思ってます
が、やる前からメンドクサくなってきました
気を取り直して、まずは環境から
インストールとか導入は、他のサイトで紹介されているのでそちらを参考にします
(なんだ、全然役に立たないエントリだな)
とにかく、チュートリアルのgettingstartedぐらいまでなら、わからないなりに動かすことができるので、とりあえずチュートリアルどおりに入力して、デバック環境で実行してみます
http://code.google.com/appengine/docs/gettingstarted/
チュートリアルも解説してる日本語ページが結構あるのでそちらを参考にします
(日本語で解説しているページのリンクぐらい載せるべきだね)
続く.....
.... のか?
う~ん、こういうのは向いてないなぁ。続かないというより、続ける意味が無いなぁ
2008年6月3日火曜日
2008年6月2日月曜日
最後のマンガ展
昨日は日本水彩展を見に上野まで行ってきました。その後、上野の森美術館でやっている井上雄彦 最後のマンガ展を見ようと寄ってみましたが、当日券売り切れで入れませんでした。前売り券を持っている人も入場制限で結構ならんでました。
見られなくて残念、平日に行ったほうが良いみたい
その後、長男が前々から行きたがっていた、秋葉原のポポンデッタにいきました。店内は狭いので、鉄道模型に興味の無いお父さんは店の外で子供が出てくるまで待ちぼうけ。店の前で、TVの取材みたいなのをやってました。店の前の自販機が電車っぽいペイントになっている由来を話してました
同じように、孫を待つお婆ちゃんもいました....仲間だ!
その後、銀座に行ったらSONYビルでFREEDの展示をやってました。写真合成の出来る広告を配っていたので、ゲットして早速近くの画廊で合成
床に広告を置いて、携帯で写真を撮って、メールを送るとFreedが合成された写真がメールで送られてきます。同じようなのが、BMWでもありましたね
画廊の人、ごめんなさい~
見られなくて残念、平日に行ったほうが良いみたい
その後、長男が前々から行きたがっていた、秋葉原のポポンデッタにいきました。店内は狭いので、鉄道模型に興味の無いお父さんは店の外で子供が出てくるまで待ちぼうけ。店の前で、TVの取材みたいなのをやってました。店の前の自販機が電車っぽいペイントになっている由来を話してました
同じように、孫を待つお婆ちゃんもいました....仲間だ!
その後、銀座に行ったらSONYビルでFREEDの展示をやってました。写真合成の出来る広告を配っていたので、ゲットして早速近くの画廊で合成
床に広告を置いて、携帯で写真を撮って、メールを送るとFreedが合成された写真がメールで送られてきます。同じようなのが、BMWでもありましたね
画廊の人、ごめんなさい~
登録:
投稿 (Atom)