Home > Archives > 2008-02

2008-02

HD DVDとBlue-Ray

「ハードディスク」と「ブルーレイ」ってどう違うのって昨日ある人から聞かれた。

そうだよな。なんも知らなきゃハードディスクってって読めるよな。
そういう私も最初にHD DVDって見たときは、DVD付ハードディスクレコーダーだと思ったもんなぁ。

規格がどうのこうのより、名前が悪かった。エイチディーディーブイディーって早口言葉だよ。

携帯の「電源をお切りください」とマナーモードについて

昨日飛行機の乗ったときに、携帯電話の電源を切った。
飛行機においてあった電子機器の説明書きを見ていると、電波を発するというのがひとつのキーワードになっていた。

電波を発するとまずいことがあるから、電車でも「優先席付近では電源をお切りください」ということになっている。

ところで、優先席付近だからといって携帯電話の電源を切っている人がどれくらいいるんだろう。

そもそも、携帯電話はいまや電話やメールの機能だけではなく、カメラだったりゲームだったり音楽プレーヤー(←これは使っている人あまり見ないけど)だったりする。でも電話だから電波を発するわけで電源を切らなきゃいけない。

しかも最近の携帯電話は電源を入れ直すのに時間がかかる。電話くらい電源入れたらさっさと動けと思う人間からするとちょっとイライラする。

いきなり結論なんだけど、電話もボタンひとつで電波遮断モードになれればいいんじゃないか?
こうすれば、優先席付近でも簡単に設定できて、電波を止めてくれる人が増える気がする。

ここまできたら今のマナーモードという名前もおかしな気がしてきた。
だって、静かなコンサートや映画館でバイブのブルブル音が響いたってだめでしょ。
電車でマナーモードにしてるからって、着信して話し始めたらだめでしょ。
マナーモードの時は電波を遮断するほうがいいのでは?

私の脳内イメージではこんな感じ。
現在のマナーモード ⇒ 新名称「サイレントモード」
電波遮断+「サイレントモード」 ⇒ 新「マナーモード」

どうでしょう?

Django newformsのBooleanFieldで問題

newformでBooleanField関連のバグ(?)にあたった。
使っているのはsvn最新版のDjangoでバックエンドはMySQL5.0。

1.modelでBooloeanFieldを定義する
2.データベースにはtinyint型になる -> 0 or 1が入る
3.ModelFormを使ってフォーム作成
4.as_hiddenで出力 -> valueには0が設定される
5.そのままフォームで受け取ってバリデーション
6..データがTrueになってる!

Djangoのソースを見てみる。

newforms/forms.py 533行目から

PYTHON:
  1. class BooleanField(Field):
  2.     widget = CheckboxInput
  3.  
  4.     def clean(self, value):
  5.         """Returns a Python boolean object."""
  6.         super(BooleanField, self).clean(value)
  7.         # Explicitly check for the string 'False', which is what a hidden field
  8.         # will submit for False. Because bool("True") == True, we don't need to
  9.         # handle that explicitly.
  10.         if value == 'False':
  11.             return False
  12.         return bool(value)

bool(value)で0という「文字列」がTrueとなって返るみたい。
うーん。Falseって文字列だけチェックはまずくない?
"which is what a hidden field will submit for False"って、0か1が入ってるよ!

参考までに、db関連のコードがどうなっているか見てみた。

db/models/fields/__init__.py 445行目付近

PYTHON:
  1. class BooleanField(Field):
  2.     def __init__(self, *args, **kwargs):
  3.         kwargs['blank'] = True
  4.         Field.__init__(self, *args, **kwargs)
  5.  
  6.     def to_python(self, value):
  7.         if value in (True, False): return value
  8.         if value in ('t', 'True', '1'): return True
  9.         if value in ('f', 'False', '0'): return False
  10.         raise validators.ValidationError, _("This value must be either True or False.")

db/backends/utils.py 86行目

PYTHON:
  1. def typecast_boolean(s):
  2.     if s is None: return None
  3.     if not s: return False
  4.     return str(s)[0].lower() == 't'
  5.  
  6. 〜数行省略〜
  7.  
  8. def rev_typecast_boolean(obj, d):
  9.     return obj and '1' or '0'

二つのコードは違うけど、似たような処理をしている。
(typecast_booleanのほうは、文字列の0や1が入るのは想定していない様子。)
こんな感じの実装をnewformsのほうにも入れるべきなんだろうなー。
今回はカスタムフィールドを作る練習として、自分でMyBooleanFieldを定義して回避しといた。

関係ないけど、ModelFormはform_for_modelとかform_for_instanceに比べて自然な感じでいいと思う。

Home > Archives > 2008-02

Search
Feeds
Meta

Return to page top