凄く便利で分かりやすいのに、見た目だけで保守派に嫌われそうな??演算子

?? 演算子 (C# リファレンス)

?? 演算子は、左側のオペランドが null 値でない場合にはこのオペランドを返し、null 値である場合には右側のオペランドを返します。

?? 演算子 (C#)

??演算子は下記、サンプルのようなコードの場合、aがnullなら0を返す。という動作をします。

int? a = null;
Console.WriteLine(a ?? 0);

もちろん、二つの値だけではなく、以下のような使い方もできます。

左から右の順に初めてnullでは無い値を返します。

下の場合cが初めてnullでは無い値なのでcの値である2を返します。

int? a = null;
int? b = null;
int? c = 2;
int? d = null;
Console.WriteLine(a ?? b ?? c ?? d ?? 0);

新しい演算子なので、当たり前ですが見慣れないので、三項演算子に並んで保守派に忌避されそうな演算子ですね。

ほんの30秒だけMSDNの該当ページを読めば分かる処理内容で分かりやすく読みやすくなるのですが・・・。

Share
カテゴリー: C#

以前のパズル:nまでの整数を二つの組に分けて合計した結果が同じだった2番目と3番目を出力するで見つけた式は隣接三項間漸化式という事が分かった

数式にするとこんな感じ?勉強していないので表記が間違っているかもしれませんが・・・

N¥tiny kを任意の整数とし

N¥tiny 0¥large =-1

N¥tiny 1¥large =0

としたとき、

N¥tiny k+1¥large=N¥tiny k ¥large 6-(N¥tiny k-1 ¥large -2)

となる。

パズル:nまでの整数を二つの組に分けて合計した結果が同じだった2番目と3番目を出力する その2 – NAL-6295の舌先三寸

で見つけた式は隣接三項間漸化式という事がわかった。(多分。)

という事は、この漸化式から一般解が導ければ、その後、数学的帰納法で証明することが可能という事か?

#まだ、続いていたのか。という話題。

Share

ある整数xとyの最小公倍数を出す時の法則を見つけた

ある整数xとyの最小公倍数を出す計算をして結果を眺めていたら、ある法則がある事がわかった。

xとyをそれぞれ素因数分解して、xの素因数リストとyの素因数リストを出し、

xの素因数リストとyの素因数リストの重複部分を打ち消し、

残ったxの素因数リストを乗算して算出した値にyを掛けると、

xとyの最小公倍数になる。

例:

xが12でyが20の時、

xの素因数が2,2,3

yの素因数が2,2,5

重複部分を打ち消しあうと

xの素因数の残りが3

yの素因数の残りが5

yにxの素因数の残りを掛けると60

(ついでに)xにyの素因数の残りを掛けても60

12と20の最小公倍数は60

無知ゆえの発見が楽しい。

#ちなみに、やっと数学的帰納法の意味がわかりました。

Share

ある整数xとyの最大公約数を出す時の法則を見つけた

前回のエントリで最小公倍数を出す法則を見つけたが、その過程で最大公約数を出している事が分かった。

xとyの素因数リストの中にある重複部分を掛けた結果が最大公約数。

重複した部分が無い場合は1が最大公約数。

xとyをそれぞれ素因数分解して、xの素因数リストとyの素因数リストを出し、

xの素因数リストとyの素因数リストの重複部分を打ち消し、

残ったxの素因数リストを乗算して算出した値にyを掛けると、

xとyの最小公倍数になる。

例:

xが12でyが20の時、

xの素因数が2,2,3

yの素因数が2,2,5

重複部分を打ち消しあうと

xの素因数の残りが3

yの素因数の残りが5

yにxの素因数の残りを掛けると60

(ついでに)xにyの素因数の残りを掛けても60

ある整数xとyの最小公倍数を出す時の法則を見つけた – NAL-6295の舌先三寸

上記例を使うと、

xの素因数 2,2,3とyの素因数 2,2,5のうちの重複部分である、

2,2

をかけると、4となり、

12と20の最大公約数は4である。

となる。

Share

最大公約数を算出するためのユークリッドの互除法

2 つの自然数(または整式) a, b (a ≧ b) について、a の b による剰余を r とすると、 a と b との最大公約数は b と r との最大公約数に等しいという性質が成り立つ。この性質を利用して、 b を r で割った剰余、 除数 r をその剰余で割った剰余、と剰余を求める計算を逐次繰り返すと、剰余が 0 になった時の除数が a と b との最大公約数となる。

ユークリッドの互除法 – Wikipedia

素因数分解しなくても、ユークリッドの互除法という方法を使えば、もっと早く算出できるという事がわかった。

というか、読んだから分かったんだけど。

20と12なら

20/12 = 1あまり8

12 / 8 = 1 あまり 4

8 / 4 = 2 あまり 0

で4が最大公約数となる。

これは、便利な方法だ。

Share

むしろ蛍光灯より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