むしろ蛍光灯よりCO2とその他の物質の排出を促進するキャンドルナイトをするくらいなら

LEDを使って、LEDナイトにでもしてみたらどうだろうか。

「電気を消して、スローな夜に。」

ではなく、

「LEDを使って、スローな夜に。」

と思ったんだけど、

LEDナイトよりも、さっさと早く寝てしまえば、

「早く起きて、スローな朝を。」

になってこっちの方が良さそう。

追記:

指摘されましたので、キャンドルと蛍光灯の比較を。

電気は発電コスト。0.36kgCO2/kWh(電力会社のページによる)

ろうそくは、その時に燃焼した量です。

パルックボールは10Wなので、10時間つける(ろうそく一本の燃焼時間)と0.01kW×10h×0.367kg=0.0367kgで37g発生します。

ロウソクの場合はちょっとわからないので調べました。

下記引用です。(引用元を付記しました。)

主成分をパルミチン酸 CH3(CH2)14COOHとすると、分子量は256で炭素数は16であるから、完全燃焼すると二酸化炭素16分子ができ、分子量は 704(12×16+16×32)で、パルチミン酸1gに対し2.8g(1g×704÷256)の二酸化炭素ができる。仮にロウソク1個20gとすると、全部燃焼させると56gの二酸化炭素が発生する。

http://www.bekkoame.ne.jp/~mineki/candlenight.htm

実際には、すすになったりする炭素もあるので、もう少し少ないのですが(まぁすすも発生してほしくないのですが)、キャンドルナイトのHPにあるような状況(やたらとろうそく使っている。少なくとも10本以上は。)

http://www.candle-night.org/jp/

だと、パルックボールを使ってあげた方が、はるかに環境にも目にも優しそうです。

ちなみに、LEDを使うと電力も発熱量も少ないので、環境負荷はさらに低減すると思います。

Share

とはいえ、試みる姿勢が重要

一時的に、現状より後退しているように見えても、試みる姿勢が重要である。

掃除だって一旦、元より散らかるし。

そして短期的に評価してやめてしまうのではなく、短期的な評価によって微調整しながら全体としては、長期的な視野で評価する必要がある。

ゆとり教育にしろ、経済にしろ、政治にしろ、最近はどうも短期的な評価を過剰に取り入れているように見える。

Share

お小遣い帳のテンプレートで出力値をエスケープしていなかったのでエスケープするようにした

通常djangoでパラメータを出力する時は

{{ parameter }}

としますが、パラメータの値中にあるhtmlにとっての特殊文字をエスケープして出力する場合(ver0.95まで)

{{ parameter | escape }}

といったようにescapeフィルタをつけてあげることで実現します。

このような仕様によって、コードからテンプレートにエスケープ処理を追い出す事が可能になっていて、結果的に複雑度を分散しそれぞれがシンプルになっています。

また、出力仕様は出力するところに書くことで、出力仕様に関連するスコープも狭くする事ができました。

余計な話ですが、開発版である0.97preでは、自動エスケープがデフォルトの設定で

{{ parameter }}

の状態でエスケープが行われます。

これを解除(つまりエスケープしないようにする)場合は明示的に値が安全であることを示すために

{{ parameter | safe }}

safeフィルタをつけてあげる必要があります。

私もASP.NETでカスタムコントロールを利用して似たような事をしていたので、こちらの仕様に変わる事については歓迎です。

というわけで、djangoのテンプレートの部分だけ再掲

{{ parameter }}

となっていた部分のうち数値以外が入る部分について

{{ parameter | escape }}

としてあります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{{ userName|escape }}のお小遣い帳</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="./styles/styles.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="./scripts/util.js" ></script>
<script type="text/javascript" src="./scripts/index.js" ></script>
</head>
<body>
<div id="body">
<div id="header">
<div id="user">
お小遣い帳
</div>
<div id="navigationOperation" >■</div>
</div>
<div id="navigation" >
<div id="logonControl">
{{ userName|escape }} <br />
<a href="{{ logoutUrl }}">ログオフ</a>
</div>
<div id="settings">
<form action="/" method="post">
<div>チャージ額:<br /><input type="text" name="chargedValue" value="" tabindex="1" accesskey="1" /><br /></div>
<div>前回チャージ後総額:<br />{{ setting.properValue }}円<br /></div>
<div>総利用額:<br />{{ setting.totalPayment }}円<br /></div>
<div>残額:<br />{{ currentValue }}円<br /></div>
<div><input type="submit" value="チャージ"  tabindex="2" accesskey="s" /></div>
{% if settingErrorMessage %}
<div class="errorMessage">{{ settingErrorMessage|escape }} </div>
{% endif %}
</form>
</div>
</div>
<div id="contents">
<form action="/" method="post">
<div>使った内容:<select name="titles" tabindex="3">
<option value="" selected="selected"></option>
{% for value in titles %}
<option value="{{ value }}" >{{ value|escape }}</option>
{% endfor %}
</select><input type="text" name="title" value="" tabindex="4" accesskey="c" /></div>
<div>使った金額:<input type="text" name="payment" value="" tabindex="5" accesskey="3" /><br /></div>
<div><input type="submit" value="設定"  tabindex="6" accesskey="s" /></div>
{% if paymentErrorMessage %}
<div class="errorMessage">{{ paymentErrorMessage|escape }} </div>
{% endif %}
</form>
<div id="list" >
過去20件の利用状況:
<table border="1" cellspacing="0" >
<tr>
<th>日付</th>
<th>使った内容</th>
<th>金額</th>
</tr>
{% for value in outputValues  %}
<tr>
<td>{{ value.date }}</td>
<td>{{ value.title|escape }}</td>
<td>{{ value.value }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<div id="footer">ご利用は計画的に。</div>
</div>
</body>
</html>
Share

とりあえず、暫定的に日本時間で表示されるようにした。

google app engineは通常だと標準時間の表示になります。

つまり日本時間-9時間になります。

そこで、本当はtz_info等を利用してちゃんとするべきなのですが、暫定的に

PaymentInfo(支払い情報)モデルクラスにjapan_timeメソッドを追加し、djangoのテンプレート側でそれを呼んであげることで、PaymentInfo.dateの日付情報を+9時間して表示するようにしました。

まず最初にmodels.pyの該当部分ですが、コメントで解説しています。

class PaymentInfo(db.Model):
author = db.UserProperty()
title = db.StringProperty()
value = db.IntegerProperty()
date = db.DateTimeProperty(auto_now_add=True)
#ここで、japan_timeというメソッドを追加しておき、dateプロパティの値に9時間足しています。
def japan_time(self):
return self.date + datetime.timedelta(hours=9)

そして、django側の該当部分ですが、

{% for value in outputValues  %}
<tr>
{# value.japan_timeとすることで、PaymentInfoで定義したメソッドを呼ぶようになっています。#}
<td>{{ value.japan_time }}</td>
<td>{{ value.title|escape }}</td>
<td>{{ value.value }}</td>
</tr>
{% endfor %}

ちなみに、今までイメージを貼ってませんでしたが、お小遣い帳のイメージはこんな感じです。

f:id:NAL-6295:20080708012444p:image

Share

iPhoneの料金プランについて

一応、

ホワイトプラン(i)+S!ベーシックパック(i)+パケット定額フル(i)=7280円

からスタートという事になっているけど、もし全く電話するつもりが無いのであれば

シンプルオレンジS+S!ベーシックパック(i)+パケット定額フル(i)=7150円

が最安値ですね。

と思ったら、特別割引が800円くらい安くて結果的に割高なんですね・・・。

Share

プログラマの数学

とりあえず、プログラマの数学を買ってみた。

今更ながら、簡単なところから読み飛ばさずに理解しながら読んでみようかなと。

初歩的なところですが、なぜnの0乗が1なのかにガッテンしました。

プログラマの数学

プログラマの数学

Share

この前作ったサンプルのデザインだけ流用して1時間以内でお小遣い帳にしてみた

仕様は、

・持ち金をチャージできる。

・チャージ時の総額と総利用額と残金を表示。

・使った時は、何に使ったかと金額を入力。

・過去20件の利用データを表示。

・過去100件の利用データ中の何に使ったかをドロップダウン表示して選択できる。

・エラーチェックはまだしていない。

・オモローと表示していた部分を「ご利用は計画的に。」に変更。

気づいたこと。知ったこと。

・djangoのテンプレートに渡す値にmodelを使えるのが管理が煩雑にならないので楽だと思った。

・GQLでSQLのTOP 20をやりたいときは、ORDER BY等の後にLIMIT 20とやる。

・ORDER BY等はおおむねSQLと同じ。

・時間制限のため、コードが汚い(エクスキューズです。)。

・datetime型を使う場合はdatetimeモジュールをインポートする。

・djangoのテンプレート側で四則演算が出来ない。

・スペルミスで結構エラーになった。

サンプルか修正したオブジェクトだけ表示。

・テンプレート

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{{ userName }}のお小遣い帳</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="./styles/styles.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="./scripts/util.js" ></script>
<script type="text/javascript" src="./scripts/index.js" ></script>
</head>
<body>
<div id="body">
<div id="header">
<div id="user">
お小遣い帳
</div>
<div id="navigationOperation" >■</div>
</div>
<div id="navigation" >
<div id="logonControl">
{{ userName }} <br />
<a href="{{ logoutUrl }}">ログオフ</a>
</div>
<div id="settings">
<form action="/" method="post">
<div>年間チャージ額:<br /><input type="text" name="chargedValue" value="{{ setting.chargedValue }}" tabindex="1" accesskey="1" /><br /></div>
<div>前回チャージ後総額:<br />{{ setting.properValue }}円<br /></div>
<div>総利用額:<br />{{ setting.totalPayment }}円<br /></div>
<div>残額:<br />{{ currentValue }}円<br /></div>
<div><input type="submit" value="設定"  tabindex="2" accesskey="s" /></div>
{% if settingErrorMessage %}
<div class="errorMessage">{{ settingErrorMessage }} </div>
{% endif %}
</form>
</div>
</div>
<div id="contents">
<form action="/" method="post">
<div>使った内容:<select name="titles" tabindex="3">
<option value="" selected="selected"></option>
{% for value in titles %}
<option value="{{ value }}" >{{ value }}</option>
{% endfor %}
</select><input type="text" name="title" value="" tabindex="4" accesskey="c" /></div>
<div>使った金額:<input type="text" name="payment" value="" tabindex="5" accesskey="3" /><br /></div>
<div><input type="submit" value="設定"  tabindex="6" accesskey="s" /></div>
{% if paymentErrorMessage %}
<div class="errorMessage">{{ paymentErrorMessage }} </div>
{% endif %}
</form>
<div id="list" >
過去20件の利用状況:
<table border="1" cellspacing="0" >
<tr>
<th>日付</th>
<th>使った内容</th>
<th>金額</th>
</tr>
{% for value in outputValues  %}
<tr>
<td>{{ value.date }}</td>
<td>{{ value.title }}</td>
<td>{{ value.value }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<div id="footer">ご利用は計画的に。</div>
</div>
</body>
</html>

・データモデル

# -*- coding: utf-8 -*-
from google.appengine.ext import db
class UserMaster(db.Model):
#paymentを利用するユーザのマスタを定義するクラスです。
#db.Modelを継承しています。
author = db.UserProperty()
chargedValue = db.IntegerProperty()
totalPayment = db.IntegerProperty()
properValue = db.IntegerProperty()
class PaymentInfo(db.Model):
author = db.UserProperty()
title = db.StringProperty()
value = db.IntegerProperty()
date = db.DateTimeProperty(auto_now_add=True)

・index.py

# -*- coding: utf-8 -*-
import wsgiref.handlers
import cgi
import datetime
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.api import users
import models
import os
from google.appengine.ext.webapp import template
from google.appengine.ext.db import djangoforms
class MainPage(webapp.RequestHandler):
def view(self,user,settingErrorMessage = None,paymentErrorMessage = None):
settings = models.UserMaster.gql("where author = :author",author=user)
setting = None
if settings.count() > 0:
setting = settings[0]
else:
setting = models.UserMaster()
setting.author = user
setting.chargedValue = 600000
setting.properValue = setting.chargedValue
setting.totalPayment = 0
setting.put()
outputValues = models.PaymentInfo.gql("where author = :author order by date DESC LIMIT 20",author=user)
titles = self.titles(user)
template_values = {
'userName' : user.nickname(),
'logoutUrl': cgi.escape(users.create_logout_url("/")),
'setting' : setting,
'currentValue':setting.properValue - setting.totalPayment,
'outputValues': outputValues,
'titles': titles,
'settingErrorMessage': settingErrorMessage,
'paymentErrorMessage': paymentErrorMessage
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def titles(self,user):
selections = models.PaymentInfo.gql("where author = :author order by title",author=user)
values = []
prev = ''
for value in selections:
if prev != value.title:
values.append(value.title)
prev = value.title
return values
def get(self):
user = users.get_current_user()
if not user:
self.redirect(users.create_login_url(self.request.uri))
return
self.view(user)
def post(self):
user = users.get_current_user()
if not user:
self.redirect(users.create_login_url(self.request.uri))
return
if self.request.get('chargedValue'):
if self.request.get('chargedValue').isdigit():
settings = models.UserMaster.gql("where author = :author",author=user)
setting = settings[0]
setting.properValue = setting.properValue + int(self.request.get('chargedValue'))
setting.put()
else:
self.view(user,u'チャージ金額には数字を入力してください。')
return
else:
payment = models.PaymentInfo()
payment.author = user
if len(self.request.get('titles')) == 0:
payment.title = self.request.get('title')
else:
payment.title = self.request.get('titles')
payment.value = int(self.request.get('payment'))
payment.put()
settings = models.UserMaster.gql("where author = :author",author=user)
setting = settings[0]
setting.totalPayment = setting.totalPayment + payment.value
setting.put()
self.view(user)
def main():
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
Share

Microsoft Equipt(office+OneCareのサブスクリプション)

Equiptは、サブスクリプション版のOffice HomeおよびStudentに、Microsoftが提供するウイルス対策製品となる「OneCare」をバンドルしており、OneCare単体での推奨購入価格より20ドルだけ高い、年間69ドルの利用価格が設定されている。

MS、Officeのサブスクリプションサービス「Microsoft Equipt」を発表:ニュース – CNET Japan

これは、うれしい。

日本に展開される事があるのか、展開されるとしたらいつなのかは、全然謎だけど。

Share

.NET関連で困った時に調べる順番

.NET関連で困った時、昔は

1.Google

2.MSDN

という順番だったのだが結局正しい情報として検索結果の中からMSDを選択することが多かったので、最近は

1.MSDN

2.Microsoftの開発者向け情報サイト(http://asp.net等)

2.Google

という順番が多い。

そして、大抵1番で終了するパターンが多い。

あえてGoogleを使うときもMSDNの中を検索する為に利用する事が多い。

ナレッジベースなんかはGoogleでKB{番号}で検索した方が明らかに早いし。

それだけに、MSDNの重さとか、使いやすさがもうちょっと、どうにかならんもんかなと思う。

Share
カテゴリー: .NET

Hotmailのインタフェースに不満

用があって久しぶりにHotmailを使ってみた。

未読メールが死ぬほどあったので、一括で既読にしたかったんだけど、なぜかツールバーに存在するのは

「未開封にする」

のみだった。

結局、未読メールを既読にするのは諦めてブラウザを閉じた。

「開封済みにする」がなんで無いのだろうか・・・。

追記:

コメントでご指摘していただいたので、いろんな環境でアクセスしたところ。

どうも、標準バージョンだと「未開封にする。」しかできないだけのようです。

IEを利用して拡張バージョンのUIを使う事で、コンテキストメニューに「開封済みにする。」が表示されました。

これで、とりあえず纏めて開封済みにできました。

標準バージョンにも、「開封済みにする。」を用意しておいてほしいですね。

なんとか目的を達成できましたが、とりあえず、インタフェースに不満があることには変わりないですね。

とりあえず、FireFox2.0でも拡張バージョンが使えると書いてあったので、是非3.0にも対応してほしいところです。

ヘルプを見てみましたが、「拡張バージョン」とか「標準バージョン」とかが明記されていないですね。

「拡張バージョンの時のみできる」等の記述があれば良いのにと思いました。

http://help.live.com/help.aspx?project=mailfull&market=ja-jp&querytype=topic&query=wl_mail_proc_markreadunread.htm

まあ、そんなに利用しないので良いのですが・・・。

ちなみに、gmailは、簡易HTML表示でもちゃんと、一通りの操作ができるようになっていました。

Share
カテゴリー: Tool