2008年8月31日日曜日

落雷でモデムが壊れた (+_+)

最近の天候はいったい何だ?! (@_@;) 子どものころは、もう少し春夏秋冬がはっきりしていたようなイメージがあるけれど、最近は暑くなったと思ったら寒くなり、また梅雨にでもなったかと思うような雨。しかも、一気に大量に降るし、カミナリもすごい。記憶では、昔は適度に雨が降っていたような気がする。量にしても、降る日の回数にしても。

それにしても落雷がすごかった。この地方はめったに雷が鳴ることはなかったように思うけれど、長いことゴロゴロと鳴っていた。いや、バリバリバリ!!!って感じか。雷に対して怖いという感情は持ったことがなかったけれど、今回は夜中 & 長時間の雷鳴ということもあって眠れなくなり、恐怖と苛立ちを感じた。光と音の具合からして、近くに何回か落ちたのではないかと思う。

さて、そんなカミナリがゴロゴロと鳴り続けている中、 PC を使っていたら突然ネットが使えなくなってしまった。 PC に問題はなく正常に動いていた。ブラウザからルータにアクセスして状況を確認したら、ネットへの接続が切れていた。ルータは問題なく動作していた。この状況は翌朝も続き、ISP に連絡したらモデムを交換することに。ネットに接続できなくなった以外どの電化製品も問題がないため、落雷によってネット用のケーブルから電気が入りモデムが壊れた可能性が高いそうだ。確かに、翌日モデムを交換してもらったら、何の問題もなくネットにつながった。

ところで、どうやってモデムが壊れたのだろう?雷が電線に落ちて、一時的に電圧が上がり、その影響がモデムに来たのだろうか?もしそうであるなら、なぜモデムが壊れたのにそのとき起動していた自分の PC は無傷なのだろうか?

 

雷サージ

調べてみると、「被害のメカニズムから守り方まで ネットワークの落雷対策:Part1 / SAFETY JAPAN [特集] / 日経BP社」がわかりやすく解説してある。

雷の電流は,通信ケーブルや電力線などの電線を伝わってやってくる。このように,電線を伝わってくる雷の電流を雷(らい)サージ電流※7という。

(上記の記事より、太字は引用者による)

雷サージ – Wikipedia によると、

雷サージ(らいサージ、かみなりサージ 英:lightning surge)とは、の影響により発生するサージ電流のことを言う。落雷後、瞬間的あるいは断続的に、電圧電流が異常に上昇する。

surge を Yahoo!辞書 – surge で調べてみると、

1I([副])] 〈海が〉波となって打ち寄せる, うねる, 〈群衆などが〉波[怒とう]のように押し寄せる, 殺到する
A swarm of boys surged into the stadium.
少年の群れがスタジアム(の中)へと殺到した.

2 〈感情などが〉沸き上がる((up)) 
Anger surged up within her.
彼女の心に怒りがこみあげた.

3 〈物価などが〉急騰する.

4 〈電圧・電流が〉異常に急増する.

なるほど、「ぼわぁっ!」という感じのイメージの動詞か。電圧が雷によって、一時的に急上昇 ~。

 

無線 LANが幸いしたのか!?

上記の記事を読んでいたら、

雷サージは,ネットワーク機器やそれにつながるパソコンにとって回避しづらいやっかいな性質がある。電流である雷サージは,出口があるところに流れ込みやすい。つまり,ケーブルが2本以上つながっている装置で起こりやすいのだ

(被害のメカニズムから守り方まで ネットワークの落雷対策:Part1 / SAFETY JAPAN [特集] / 日経BP社 の「抜け道があると被害に遭いやすい」より)

とてもわかりやすい図が描かれていた。

 

家では、有線のネットワークを使っていない。デスクトップパソコンであっても無線を使っている。これについてはセキュリティのことを考え、「なぜ家中の壁に有線を引いておかなかったのか。」と常々言っていた。しかし、これが逆に幸いしたのだろうか?上図を見てわかるように、無線を使っている自分のパソコンはコンセントにしかつながっていない。コンセントも雷対策がされているものではない。しかし、有線 LAN がなかったために被害がなかった?もし、有線 LAN だったら、電流がモデムからルータ、ルータから自分の PC へと影響があったのかもしれない。

ん?あれまてよ、そういえば、何でルータは無傷なんだろ… (@_@;) ルータもモデムから線で繋っていて、当然コンセントをつなげているので、雷サージの影響があってもおかしくないと思うのだけれど。電流が流れなかったのか、それとも壊れる閾値に達しなかったのか、不思議…。

 

対策

雷サージ – Wikipedia によると、

雷サージによる被害を軽減するためのサージプロテクタというコンセント型の器具も市販されている。また、テーブルタップ無停電電源装置などに内蔵されているものもある。

調べてみると、お手軽なところでは、

B0013CSB5K ヤザワ 雷サージ付トリプルタップ3コ口白 STT153W
Yazawa

by G-Tools

B000G1T6E4 ELECOM ぬけ止めマグネット雷タップ T-Y04A
エレコム 2006-06-15

by G-Tools

B0013P6TGK ヤザワ 雷サージ・ブレーカー内蔵スイッチ付タップ SHV1521WH
Yazawa

by G-Tools

 

無停電電源装置についても検索してみたけれど、さすがに一般の家庭ではちょっと… ^^;

B000MQCF8W サンワサプライ 小型無停電電源装置 UPS-350C
サンワサプライ

by G-Tools

 

タップのような形をしたものもあったけれど、さすがに高いなぁ~ (@_@;)

B0017KRF7S サンワサプライ 小型無停電電源装置 UPS-350TK
サンワサプライ 2008-04-01

by G-Tools

Skype で複数の人でしたチャットを簡単に開くには

Skype には、複数の人でチャットできる、「グループチャット」や「オープンチャット」という機能がある。みんなでチャットしたウィンドウは、一度閉じてしまうと、誰かがその場で発言してくれないと、自分でそのチャットのウィンドウを開けなくなって困ることがある。 (+_+)

 

ブックマーク

後で、そういった過去のみんなでしたチャットを開くことができるようにするために、チャットのウィンドウ上部に「ブックマーク」という機能がある。

080831-002

 

080831-006ただし、このブックマーク、今一使い勝手がよいと感じない。 ブックマークをするときはいいのだけれど、開くときはメインウィンドウのメニューより 「チャット > ブックマークしたチャット」を選択しなければならない。

メニューからの選択というのはちょっと面倒。 よく使う機能なので、例えば、 Skype のメインウィンドウのタブに「ブックマーク」なるタブがあって、アクセスしやすい状態にしてもらえるとうれしいのだけれど…。 (+_+)

 

ブラウザのブックマークへ

Skype のブックマークは使いにくかったので、「オープンチャット」をブラウザのブックマークで開くようにした。

まず、オープチャットのウィンドウの上部より「オプション > チャットを宣伝」を選択。

ウィンドウが開かれるので、「クリップボードへリンクをコピー」ボタンを押す。

080831-007

 

ブラウザを開き、コピーしたものをアドレスバーにペーストする。

リンクが表示されるので、それをブックマークする。例えば、ブックマークツールバーへドラッグアンドドロップ。または、リンクを右クリックして、「このリンクをブックマーク」を選択。

080831-003

 

デスクトップのアイコンへ

上記で、ブラウザにブックマークしたアイコンをつかみ、デスクトップへドラッグアンドドロップ。これでブラウザを開かなくてもデスクトップからオープンチャットを開くことができる。

 

080831-001Skype の履歴

上記のようにして、素早くアクセスすることができるようにしていた。そういうことをしていない友だちの操作を見ていて、「なるほど、こういう簡単な仕方があるのか」と思った方法がある。

  1. Skype のメインウィンドウにおいて、履歴タブを開く。
  2. 上記ですぐに目的のものが見つけることができなかった場合、ウィンドウ下部の検索フィールドでチャットの名前の一部を入力して抽出する。

これが一番シンプルで簡単なやり方かなぁ (@_@;)

わが家のシンプル測定ダイエット - そろそろやばい母の三段腹 ^^;

追記(2008.9.6) : ダイエット表を作成するには → http://4diet.appspot.com/


家族は自分以外みんなぽっちゃりしている。いや、ぽっちゃりというレベルではないかも。 ^^; ダイエットに何度か挑戦しているが長続きしない。世にダイエットに関する様々な方法論があるけれど、結局、必要以上に食事を摂らず、されど必要な栄養はキチンと摂り、かつ運動をして健康的に痩せるということしかないと思う。やることは極めてシンプル。しかし、「たくさん食べながら、なおかつ痩せたい」という、さっぱり意味不明な意図に、これまた失敗するなといつもながら思うのだった。 (@_@;)

 

計るだけダイエット

いろいろなダイエットの方法について聞かされた。りんごダイエット、バナナダイエット…。その中で結構効果的だと感じた方法がある。それは食事に関する制限とか、運動の方法に関するものではない。「自分が今どのくらいの体重なのか」を記録するだけという、一見そんなことに意味があるのか ?! と思ってしまう方法だ。それを「計るだけダイエット」と言うらしい。

なぜこれに「なるほど」と感心したかと言えば、ダイエットの方法論の中心であるはずの「食事の摂取・運動」に焦点を当てず、専ら自分の体重を自覚するという、フィードバックによる心理的な効果を狙っているからだ。最近では、食事をしたものを記録するだけという「レコーディングダイエット」なるものがあると聞いたが、これも同様な心理的な効果を狙っているのだろう。  (cf. レコーディング・ダイエット – Wikipedia )

ところで、「計るだけダイエット」とういのは、その名の通り体重の変化を毎日記録するというもの。この効果は、先ほど述べたように毎日の体重の変化を自覚させ、強く印象付けるということ。例えば、前日に非常に体重が増えてしまったとする。この場合、記録したものを見て、「昨日のお菓子の食べすぎが原因だ」とか、「食事の量が多かった」など、色々とその体重増加の理由についてあれこれ考えるようになる。体重について考えたという経験が、翌日食べすぎてしまいそうになったとき、「あ、いかんいかん」と抑止力として働く。

わが家では、この日々の体重の変化の記録を、みんながいつでも見える位置である冷蔵庫の扉に貼っておき、毎日記録をつけるということを実践した。結果をみんなに見えるようにしておくと、家族の間で自然とダイエットの話が出てくることになり、「今日どうだった?」「やった!痩せた。」などと会話が生まれる。これがまた食事の摂りすぎに気をつけようという気にプラスの影響をもたらすようだ。 ^^

まとめると、体重を記録するということには 、次の二つの効果があると考えられる。

  • 体重の変化について自覚的になり、それが食べることへの抑止力となる。
  • 記録を他人に公開することによって、ダイエットをしているということに関して自覚的になる。

 

記録方法

記録用紙は、表計算ソフトを使って、折れ線グラフを手書きで書けるようにマスを細かく区切り、印刷したものを使っている。わざわざ記録をコンピュータに残すことはしていない。非常にアナログ。というか、コンピュータに記録を残すほどのデータでもない。 ^^; その月に「どのくらい体重が減った・増えた」ということが一目で大雑把にわかったら、それで用が済んでしまう。毎月用紙を保存したとしても 1 年で 12 枚なので、それをざっと眺めるなり、別の用紙に変化を記録するなりすれば一年の状況もすぐに把握できる。

 

用紙作成のコツ

ちなみに、マス目を作るコツは、なるべく体重の増減がわかるようにするため、一目盛を 0.1 kg にしておくこと。増えたときはゲンナリしてしまうが、減ったときは、「お!減ってる!!!」と、良いフィードバックがされ、明日も頑張って気をつけようという気にさせてくれるようだ。

 

使い方

使い方はいたってシンプルだけれど、次のような工夫をしている。下図は、一ヶ月の体重の変化を記録した紙。一ヶ月で一枚。一枚の記録用紙で複数の人の記録ができるように、表の左右にはそれぞれ異なる数値を書き込んでいる。目盛は細かく、先ほど言ったように 0.1 kg ごとに横線を書き入れている。

080830-001

 

この紙に月の始めに書くとき、

  1. 先月の体重の変動を縦軸で表の左側に示す。上図の表では黄色の線で書いてあるのがそれに相当する。先月において一番重かった体重の値と、一番軽かった値をバーで表わす。
  2. 今月の目標となる体重のラインを書きいれる。

これで一ヶ月の記録を録り、月末になったら上記と同様にその月で一番重かった体重と軽かった値を線で結びバーで示すことにしている。それが上図の表の右側にある青いライン。

 

年間記録

一年が経過すると、12 枚記録用紙がたまる。これを一ヶ月ごとの状況を別の用紙に転記し、一年の変化を大雑把に把握できるようにしている。以下の図がその様子を示している。一ヶ月の体重の記録をしたときに、最後に描いた青いバーを以下のように一ヶ月ごとに書き込む。後は、その書き込んだバーの真ん中辺りを結んで折れ線グラフ にして完成。正確ではないけれど、これで大体どのような変化が起こったのか十分把握できる。

080830-002

 

感想

当初、表計算ソフトを使って毎日記録し、グラフ化するということを考えていた。しかし、そこまでするのは手間だし、その必要性もないことに気がついた。体重を記録するということであれば、手書きで十分。むしろ、手書きの方がお手軽でよいことが実感できた。

目的は記録を録って、そのフィードバックを得ること。それに対して必要にして十分、かつ、使い勝手がよいということが大事。もし、多数の人間の正確な統計を取りたいというのであれば、正確な記録が必要となるが、正確性が必要ないのであれば、操作性の良さを優先させなければならないということを改めて認識させられた。

 

結果

まぁ、減ることもあれば、増えることもあるよね。 ^^;

 

参考


関連記事

CSS で要素の相対的な位置を指定する

1. position プロパティ

HTML の特定の要素を、CSS である要素の相対位置で指定したい。

詳解HTML&XHTML&CSS辞典(p435)によると、position: relative を利用する。

通常の状態で配置される位置からの相対位置で配置されるようにします。

基準となる要素の位置は position-スタイルシートリファレンス によると、

static

特に配置方法を指定しません。この値のときには、top、bottom、left、rightは適用されません。これが初期値です。
relative
相対位置への配置となります。positionプロパティでstaticを指定した場合に表示される位置が基準位置となります。

 

2. 例

例えば、 id が hoge である div 要素をセンタリングする。その下に hoge 要素から右へ 50 px だけ移動した位置に、id が piyo である div 要素を位置付けたい。ただし、それぞれの要素の幅は固定で 500 px とする。

080830-005

<html>
  <head>
    <title>相対的な位置</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <style type="text/css">
    <!--
    #hoge {
        margin: auto;
        width: 500px;
        
        background-color: #fbb;
    
    }
    #piyo {
        margin: auto;
        width: 500px;
        
        position: relative;
        left: 50px;
        
        background-color: #bfb;
    }
    -->
    </style>
    
  </head>
  <body>

    <div id="hoge">
        hoge
    </div>
    
    <div id="piyo">
        piyo
    </div>
    
  </body>
</html>

最初に、hoge 要素に対して、margin と width プロパティにより、位置・大きさを設定する。

次に、piyo 要素に対して、同じく margin, width プロパティを指定する。

そして position プロパティにより、前の要素からの相対的な位置で指定をすることを示し、 left プロパティにより位置を右へずらす。

CSS で要素の相対的な位置指定 (2) につづく…

CSS で要素をセンタリング - テーブルと文字列を中央に配置する

1. HTML の要素をセンタリング

HTML の要素をセンタリングしたい。

1. ボックスのセンタリング

margin: auto

ブロックレベル要素の左右のマージンを両方共に「auto」に設定すると、両者が同じ値となるため、結果としてボックスがセンタリングされます。

(詳解HTML&XHTML&CSS辞典, p399 より)

 

2. ブロックレベル要素のセンタリング

text-align: center

「中央揃え」に設定します。

(詳解HTML&XHTML&CSS辞典, p377 より)

 

3. 垂直方向

垂直方向で真ん中に配置するには、

  • vertical-align: middle

(詳解HTML&XHTML&CSS辞典, p379)

 

2. 例

  1. id が content である div 要素 (ピンク色の部分) をセンタリングし、
  2. その中の文字「ぴよ」を中央揃えにし、
  3. テーブル要素もセンタリングする。

080830-004

<html>
  <head>
    <title>要素をセンタリング</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <style>
    <!--
    #content {
        margin: 10% auto;
        width: 60%;
        background-color: #fbb;
    }
    .piyo {
        text-align: center;
    }
    
    table {
        margin: auto;
        border-collapse: collapse;
        border: solid 1px;
    }
    tr, td {
        border: solid 1px;
    }
    -->
    </style>
    
  </head>
  <body>

    <div id="content">
    
        <p>ほげ</p>
        <p class="piyo">ぴよ</p>
        <p class="piyo">ぴよぴよ</p>
        
        <table>
            <tr>
                <td>hoge</td>
                <td>piyo</td>
            </tr>
            <tr>
                <td>hogehoge</td>
                <td>piyopiyo</td>
            </tr>
        </table>
        
    </div>

  </body>
  • content を margin の auto によってセンタリング。
  • 「ぴよ」は text-align で center と指定。
  • テーブルは、 content を指定したときのように、margin の auto によってセンタリングをする。

2008年8月28日木曜日

CSS で印刷するときに特定の要素を消す

CSS を指定する中において、 CSS の要素を

@media print { }

の中に記述する。

 

以下は、ブラウザ上では全て表示されるが、印刷、または印刷プレビューにて確認すると、「あーあーあー」が表示されなくなる。

<html>
  <head>
    <title></title>

    <style type="text/css">
    <!--
    @media print {
        .ah {
            display: none;
        }
    }
    -->
    </style>

  </head>
  <body>

    <p class="ah">あーあーあー</p>
    <p>ただいまマイクのテスト中</p>
    
  </body>
</html>

 

参考

Python で関数の説明を書く - ドキュメンテーション文字列

翌日になれば、昨日書いたメソッドの内容なんて忘れてしまう。 ^^; わかっているからいいやと思ってコメントを書くのを面倒くさがっていると、いつの間にかコードの森で迷子に…。 パタッ(o_ _)o~†

Python でも、関数の説明を書くための書式に慣習があるようだ。「ドキュメンテーション文字列」と言うそうだが、最初見たときに違和感を感じた。関数の定義の前にその関数の説明を書くのではなく、関数の中の冒頭にコメントとして書く。他の言語では定義の前に書くことが多いので、これも Python 的と言えばそうなのだろうか。 (@_@)

 

書き方

4. その他の制御フローツール の「4.7.6 ドキュメンテーション文字列」から要点のみを抽出すると、

  • 最初の行は、常に対象物の目的を短く簡潔にまとめたもの
    • 対象物の名前や型を明示する必要はありません。
    • 最初の行は大文字で始まり、ピリオドで終わっていなければなりません。
  • 二行目は空行
  • 最初の行の 後にある 空行でない最初の行が、ドキュメント全体のインデントの量を決めます。

Pythonを始めよう:CodeZine には、関数だけではなくモジュールの説明の書き方の例が記述されていた。とは言っても、何か特別なことをするわけではなく、関数と同じようにモジュールの先頭にコメントを書くだけのようだ。

 

では、試しに「身長と体重から求めるいくつかの指標を定義」したモジュールがあるとして、これにドキュメンテーション文字列を加えてみる。 heightAndWeight.py というファイルを作成し次のように記述した。

u""" 身長と体重から求めるいくつかの指標を定義。
"""

def bmi(weight, height):
    u""" 体重と身長から肥満度を判定するための BMI 指標を計算する

    体重(kg) / 身長(m)2 によって求められる。
    """
    return weight / height ** 2

これ以降にいくつかの関数が定義されると仮定してのもの。

コメントの前に `u’ を付けてユニコードであることを示しているのは、以下の操作で文字化けてしまったため。 (cf. Python で簡単なテキスト処理) しかし、上記のサイトの例では `u’ なんて付いてないし、どうすればいいんだろう… (@_@;)

同ファイルにおいて次のように続けた。

if __name__ == '__main__':
    print bmi.__doc__
    print help(__name__)

 

__doc__

上記を実行すると、まず __doc__  の呼出しにより、

 体重と身長から肥満度を判定するための BMI 指標を計算する

    体重(kg) / 身長(m)2 によって求められる。

というように、関数の冒頭に書いたコメントによる関数の説明が表示される。__doc__ については 3.11.1 型とメンバ を参照。

 

help()

次に help() によって、今度はモジュール全体の情報が表示される。

Help on built-in module __main__:

NAME
    __main__ - 身長と体重から求めるいくつかの指標を定義。

FILE
    (built-in)

FUNCTIONS
    bmi(weight, height)
        体重と身長から肥満度を判定するための BMI 指標を計算する
        
        体重(kg) / 身長(m)2 によって求められる。


None

2.1 組み込み関数 によると、

help([object])

組み込みヘルプシステムを起動します (この関数は対話的な使用のためのものです)。(…)

引数が文字列の場合、文字列はモジュール、関数、クラス、メソッド、キーワード、またはドキュメントの項目名として検索され、ヘルプページがコンソール上に印字されます。引数が何らかのオブジェクトの場合、そのオブジェクトに関するヘルプページが生成されます。 バージョン 2.2 で 新たに追加 された仕様です。

「対話的な使用のためのもの」とあるので、普通はファイルに記述して実行のようなことはしないのだろうか…。 上記の結果において、FILE の項目を見ると、(built-in) となっている。なぜだろう?次のように、別のモジュールから help() を呼びだしてみる。

test.py というファイルを作成。

import heightAndWeight
help(heightAndWeight)

これを実行すると、

Help on module heightAndWeight:

NAME
    heightAndWeight - 身長と体重から求めるいくつかの指標を定義。

FILE
    c:\develop\src\python\heightandweight.py

FUNCTIONS
    bmi(weight, height)
        体重と身長から肥満度を判定するための BMI 指標を計算する
        
        体重(kg) / 身長(m)2 によって求められる。

モジュールの名前とファイル名が表示された。考えてみれば、先ほどのコードでは help(__name__) としており、そのファイルをスクリプトの実行の起点としているので、 __name__ は メインモジュールの名前、つまり __main__ となり、bmi 関数はそこに所属するということになるのだろう。多分。 ^^;

 

参考

上記の指標の内容については、

2008年8月27日水曜日

Python で正確な小数の計算 (1) - Decimal モジュールを使う

1. 思っていた答えと違った少数の計算

実際に行った計算の例を挙げる。

29 - (54.2 - 52.0) / 0.1

暗算すれば、答えは 7 ということはわかる。

ある実装において、上記の計算に対して、

  1. int() 関数を適用して、
  2. その値を元に、配列の要素を取得する

という操作を行った。その結果、想定していた挙動と違い、ハマった。 (+_+)

print range(0,10)[int(29 - (54.2 - 52.0) / 0.1)]

7 という答えが返ってくるかと思いきや 6 。

 

2. いろいろな丸め関数

int() 関数について調べると、2.1 組み込み関数 には、

int([x[, radix]])

文字列または数値を通常の整数に変換します。(…)浮動小数点数から整数へ変換では (ゼロ方向に) 値を丸めます。引数が通常整数の範囲を超えている場合、長整数が代わりに返されます。引数が与えられなかった場合、0 を返します。

(太字は引用者による)

「ゼロ方向に値を丸める」というところに注目。試してみる。

print int(0.1), int(0.5), int(0.5), int(0.9)

結果は、切り捨てのような結果になる。

0 0 0 0

 

round, ceil, floor 関数

似たような関数 (round, ceil, floor) について試しておく。

print round(0.1), round(0.4), round(0.5), round(0.9)
import math
print math.ceil(0.1), math.ceil(0.4), math.ceil(0.5), math.ceil(0.9)
print math.floor(0.1), math.floor(0.4), math.floor(0.5), math.floor(0.9)

結果は、

0.0 0.0 1.0 1.0
1.0 1.0 1.0 1.0
0.0 0.0 0.0 0.0

それぞれ、「四捨五入、切り上げ、切り捨て」の計算が行われる。

 

3. 浮動小数点と固定小数点の違い

    print type(54.2)

を実行すると、

<type 'float'>

と値が返される。つまり、54.2 は浮動小数点。

浮動小数点数 – Wikipedia とは、、

固定小数点数と比較するとさまざまな誤差が発生しやすいが、大きな値や、逆に小さな値を表現するのに向いている。そのため、誤差の概念がはっきりしている分野や極端な数を扱う分野(科学計算など)で多く用いられている。

これに対して、固定小数点数 – Wikipedia は、

浮動小数点数に比べて表現できる値の範囲ははるかに狭いが、情報落ちが起こらないことや高速に演算できることが利点に挙げられる。

大きな値を扱えるけれど誤差が生じてしまう「浮動小数点」と、扱える値は浮動小数点に比べて小さいけれど正確で高速な「固定小数点」という対立する二つの小数表現がある。

そういえば、浮動小数点の表現方法なんて忘れてた… ^^;

浮動小数点の誤差の種類に関しては、エラー(誤差) を参照。

 

4. 正確な少数の計算が行える Decimal クラス

Python には、浮動小数点を表す float 以外に、Decimal クラスが存在する。

11. 標準ライブラリミニツアー - その 2 の「11.8 10 進浮動小数演算」によると、

decimal では、 10 進浮動小数の算術演算をサポートする Decimal データ型を提供しています。組み込みの 2 進浮動小数の実装である float に比べて、この新たなクラスがとりわけ便利なのは、厳密な 10 進表記計算精度の制御法的または規制上の理由に基づく値丸めの制御有効桁数の追跡が必要になる金融計算などのアプリケーションや、ユーザが手計算の結果と同じ演算結果を期待するようなアプリケーションの場合です。

(装飾は引用者による)

float , int() 関数を適用した結果と、Decimal 型で行う計算を比較してみる。

a = 29 - (54.2 - 52.0) / 0.1
b = int(29 - (54.2 - 52.0) / 0.1)
from decimal import Decimal
c = 29 - (Decimal('54.2') - Decimal('52.0')) / Decimal('0.1')

print a, b, c

結果は、それぞれ

7.0 6 7

上記の変数をリストに入れ、print を適用すると、より詳しく内容を見ることができる。

print [a, b, c]
[6.9999999999999716, 6, Decimal("7")]

これで int() 関数を適用した結果が 7 ではなく、 6 となってしまった理由がわかった。 float 型の計算の結果、誤差が生じていたということ。

 

0.1 を浮動小数点では正確に表現できない

0.1 を2 進浮動小数では、スパッと表現できない。

print [0.1, 0.5]
[0.10000000000000001, 0.5]

追記(2008.9.8) : B. 浮動小数点演算、その問題と制限 によると、

浮動小数点数は、計算機ハードウェアの中では、基数を 2 とする (2進法の) 分数として表現されています。例えば、小数

0.125

は、 1/10 + 2/100 + 5/1000 という値を持ちますが、これと同様に、 2 進法の分数

0.001

は 0/2 + 0/4 + 1/8 という値になります。これら二つの分数は同じ値を持っていますが、ただ一つ、最初の分数は基数 10 で記述されており、二番目の分数は基数 2 で記述されていることが違います。

残念なことに、ほとんどの小数は 2 進法の分数として正確に表わすことができません。その結果、一般に、入力した 10 進の浮動小数点数は、 2 進法の浮動小数点数で近似された後、実際にマシンに記憶されます。

(via str()関数とrepr()関数 - バリケンのPython日記 - pythonグループ)

 

dicimal の意味

Yahoo!辞書 – decimal によると、

[形]

1 小数の

a decimal fraction
小数

2 十進法の

decimal classification
十進法図書分類法

━━[名]小数.

[中ラテン語. ラテン語decima(10分の1)+-AL. △DIME

なるほど、「10 分の1」 という意味から来ているのか。

 

5. 関連記事

Google App Engine (Python) でログを出力

1. ログを出力するための概略

Logging Events in Your Application - Google App Engine - Google Code の説明に従った。

概略は次の通り。

  1. loggin モジュールのインポート。
  2. ログを出力するレベルをアプリケーションにおいて設定する。
  3. loggin のメソッドを使って出力したいログの内容を書く。

 

2. logging モジュール

まず、logging モジュールをインポートする。

import logging

 

3. ログのレベルに対応したメソッド

logging のメソッドには、debug(), info(), error() などがあり、

14.5 logging -- Logging facility for Python によると、

Logged messages also have levels of importance associated with them. The default levels provided are DEBUG, INFO, WARNING, ERROR and CRITICAL.

(太字は引用者による)

ログとして出力するメッセージに「レベル」を設定できる。そして、それぞれのレベルに対応したメソッドが定義してある。

The methods are debug(), info(), warning(), error() and critical(), which mirror the default levels.

(同上より、太字は引用者による)

ログのレベルについては、以下のような段階がある。

ちなみに、この loggin はドキュメントに

New in version 2.3.

とあるように、Python のライブラリに含まれている。

 

4. ログを出力するレベルの設定

app.yaml の handlers で指定してある、script のmain 関数において、次のように記述する。

logging.getLogger().setLevel(logging.DEBUG)

上記のように設定すると、DEBUG レベル以上のログが出力されるようになる。

 

5. 出力された結果

Web アプリケーションを起動したときのコマンドラインにおいて、次のように表示された。

080827-003

ブラウザにおいては、アプリケーションの URL に

?debug

を追加すると、ログを表示するウィンドウが表示される。

080827-005

 

6. logging のみを試す

Google App Engine を使わずに、Python の一ファイルで、上記を真似てみる。

import logging

# ログの出力レベルを設定
logging.getLogger().setLevel(logging.INFO)

logging.error("hoge")
logging.warning("piyo")
logging.info("fuga")
logging.debug("hogehoge")

これを実行すると結果は、

ERROR:root:hoge
WARNING:root:piyo
INFO:root:fuga

ログを出力するレベルを INFO にしたので、それ以上のレベルがログとして表示されていない。 DEBUG は INFO よりも下なので表示されていない。

 

参考

Inkscape で印刷したい範囲を変更する

Gimp について「描く範囲を後で拡大する」を書いたので、ついでに同じような要請があった場合の Inkscape の対処方法も。Inkscape は Gimp と違って、新規にイメージを作成すると真ん中にページのガイドとなるようなものが表示される。「この中に描かなくてはいけないのかな?」と思いきや、絵を描くことができる場所は枠の外に実質無限に広がっている。 Gimp のようにキャンバスのサイズを変更するということは必要ない。好きな場所に好きな大きさで描くことができる。ただし、印刷しようとするとページのガイドとなる枠の中のものしか印刷されない。

 

描いたものを印刷用紙の大きさに合わせる

この場合、ドロー系のソフトの強みを利用する。ドロー系は画像をどれだけ拡大・縮小しても、その画像の質が損われることがない。そこで、印刷したい画像がページの枠に対してはみだしている場合、それらを全部選択し、表示される拡大縮小のハンドルの内、四隅のどれでもいいので  Ctrl キーを押しながらドラッグする。そうすると縦横の比率を保ったまま拡大縮小が行われる。これにより、ページの枠に画像を合わせることができる。

080827-003

 

印刷する用紙の大きさを変更

上記とは逆に、印刷する用紙の大きさを変更したい場合は次のようにする。メニューより、File > Docuent Properties において、Format の用紙のサイズを変更するか、または Custom size の値を変更する。その後は上記のように描いたものを用紙に合わせて拡大縮小させる。

ところで Custome size を変更する際、Fit page to selection ボタンを押すと、ページの枠が画像の大きさに合わせたサイズとなる。しかし、この設定は印刷のためにあるようで、いくら Fit page to selection を使ってページのガイドを変更しても Format が変更され、思った範囲を A4 の紙のサイズに合わせるという用途に使うことはできない。用紙のサイズに画像を合わせたい場合は、上記のように画像の方を紙に合わせるように拡大縮小するということになるだろう。

080827-005

Explorer を再起動した後に EasyTune 5 Pro が起動しない

最近、特定のアプリケーションが固まることがしばしばある。、タスクマネージャの「アプリケーション」タブで、そのアプリの状態が「応答なし」となっていることを確認した後、右クリックしてそのプロセスを表示させるとなぜか explorer.exe が表示される。仕方がないので、エクスプローラを再起動をして対処しているが、その後決まって EasyTune5 Pro を起動できなくなってしまう。

 

対処

アプリケーションが固まり explorer.exe を再起動する前に、タスクトレイにある 080827-001 EasyTune 5 Pro を終了させておく。これにより、後で EasyTune 5 Pro を起動できるようになる。

それにしても、フリーズの原因に EasyTune 5 Pro は関係しているのだろうか? (@_@;) とりあえず、EasyTune 5 Pro を使って倍率を変更した後は、タスクトレイに常駐させないで様子を見ることにした。

2008年8月26日火曜日

Gimp で描く範囲を後で拡大する

080826-002フリーハンドでささっと図や絵を描きたいとき、 Gimp または Inkscape を使う。それぞれ、ペイント系、ドロー系のメリットがあるので用途に合わせて使い分けている。

Gimp で新規にイメージを作成するとき、まず最初に画像の大きさを決めなくてはいけない。「ちょっとした図を描くだけだから、あまり大きくなくていいかな」と思い小さめの値を設定すると、大抵後で間にあわなくなる。 (@_@;)

 

方法

そういうとき、現在のキャンバスの大きさを変更することによって描く範囲を広くすることができる。

メニューより、Image > Canvas Size.... を選択する。

080826-004

 

キャンバスのサイズを変更するダイアログが表示されるので、Canvas Size の値を変更する。ここで例えば、今描いているものの左上に新たに追加して描きたいとする。その場合、

  1. Offset に表示されている画像のサムネイルをつかんで右下の方へ持っていく。
  2. Layers の Resize layers: を「All layers」に変更する。
  3. Resize ボタンを押す。

080826-006


関連記事

2008年8月25日月曜日

python の条件文 if __name__ == '__main__':

1. メインモジュールの名前は __main__

Python のモジュールを眺めていると、ソースコードの最後の方で、以下の記述をしばしば見かける。

if __name__ == "__main__":
    # 処理...

__name__ とは? __main__ とは何を表しているのだろう?

6. モジュール によると、

… Python では定義をファイルに書いておき、スクリプトの中やインタプリタの対話インスタンス上で使う方法があります。このファイルを モジュール (module) と呼びます; モジュールにある定義は、他のモジュールや main モジュール (実行のトップレベルや電卓モードでアクセスできる変数の集まりを指します)import (取り込み) することができます。

モジュールは Python の定義や文が入ったファイルです。ファイル名はモジュール名に接尾語 ,py がついたものになります。モジュールの中では、(文字列の) モジュール名をグローバル変数 __name__ で取得できます

「実行のトップレベル」というのは、スクリプトを実行したモジュールを指す。また、「電卓モード」とは、対話モードのことのようだ。

4.1 名前づけと束縛 (naming and binding) によると、

あるモジュールの名前空間は、そのモジュールが最初に import された時に自動的に作成されます。スクリプトの主モジュール (main module)は常に __main__ と呼ばれます。

対話モードでモジュールの名前を確かめてみる。

C:\>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print __name__
__main__

確かに `__main__’ と表示された。

 

2. モジュールで __name__ により名前を取得する

ソースコード

以下の2つのモジュールがある。

  • a.py
  • b.py

b.pya.py を import する。

a.py

print __name__

b.py

import a
print __name__

 

実行した結果

b.py 上でスクリプトを実行すると、出力は、

a
__main__

一行目で

`a’

と表示された。これは a.py のモジュール名を表す。2行目で、

`__main__’

と表示された。これは、b.py を起点にスクリプトを実行したことにより、b.py がメインモジュールになったということ。

もし、a.py 上でスクリプトの実行を行えば、a.py 内の __name__ で`__main__’ と表示される。

 

メインモジュールの名前で条件分岐

a.py に、モジュールが main の場合に実行するコード追加し、 a.py 上で実行してみる。

print __name__

if __name__ == "__main__":
    print "a.py"

結果は、

__main__
a.py

しかし、b.py 上で実行した場合、

a
__main__

`a.py' は出力されない。なぜなら、a.py はこのときメインモジュールではないため。

 

3. 結論

以上より、

if __name__ == '__main__':

は、それが記述されているモジュール上で、スクリプトが実行されたときに実行される「ガード条件」ということになる。

参考記事

__name__ の Python の中での位置付けは、

を参照。

Python のイテレータ (3)

以前、「Python のイテレータをジェネレータで作成」で、次のようなコードを書いた。

091126-005.png

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + " " + str(self.age)
        
class Group:
    def __init__(self):
        self.persons = []

    def add(self, person):
        self.persons.append(person)
        return self
    
    # ジェネレータ。__iter__(), next() の置き換え。
    def iter(self):
        for person in self.persons:
            yield person
        

group = Group().add(Person("Tarou", 21)).add(
                    Person("Hanako", 15)).add(
                    Person("Jiro", 15))

# iter() を呼出す
for person in group.iter():
    print person.name

for a in group.iter():
    print a.age

この書き方だと、イテレータを呼びだすときに、「Python のイテレータ」で __iter__(), next() を自前で書き、それに対して for ループを適用するときに比べて group.iter() と for ループで呼出さないといけないから、何だかなぁ~って思っていた。 (@_@;)

 

__iter__() に変更

ところで、イテレータとはそもそも何かと言えば、次のようにイテレータプロトコルに従っていればよい。

イテレータオブジェクト自体は以下の 2 のメソッドをサポートする必要があります。これらのメソッドは 2 つ合わせて イテレータプロトコル を成します:

__iter__()

イテレータオブジェクト自体を返します。このメソッドはコンテナとイテレータの両方をfor および in 文で使えるようにするために必要です。

next()

コンテナ内の次の要素を返します。もう要素が残っていない場合、例外 StopIteration を送出します。

(2.3.5 イテレータ型 より)

このことを考えると、上記のコードの場合、「Python のイテレータ」で __iter__(), next() を自前で書いていたときは Group クラスがイテレータプロトコルに従っており、Group クラス自体がイテレータオブジェクトということになる。しかし、上記で示したコードになった場合、Group#iter() の呼出しによりジェネレータが作成され、これがイテレータの役割をする。

ところで、ジェネレータは Python のジェネレータ (1) の最初の例で述べたように、

(…) yield を使って定義した関数が、あたかもオブジェクトのように振る舞っているように見える。さながら、 generator1() によってインスタンス化されたオブジェクトがあり、それが next() というメソッドを持っていて、呼出す度に yield で動作を止め、そのとき yield に渡された値を返し、そして最後の yield 呼出しが終ると次回 next() の呼出しで、StopIteration を投げる。

というようにイテレータプロトコルに従っている。つまり、イテレータオブジェクトと言えるのだろう。多分。 ^^;

話を戻して、上記に示したコードのようにジェネレータ関数を Group クラスに定義したということは、もはや Group クラスはイテレータプロトコルに従っているわけではなく、イテレータオブジェクトではなくなってしまっている。あくまでもイテレータオブジェクトなのは、Group 関数に定義したジェネレータ。当然ながら、Group クラスのインスタンスをそのまま for ループの中では適用できなくなっている。

これでは何かメリットが失われてしまったと感じるので、次のようにコードを修正した。修正箇所は簡単で、

def iter(self):

def __iter__(self): 

に変更するだけ。

091126-006.png

 

念のためコードを示す。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + " " + str(self.age)

class Group:
    def __init__(self):
        self.persons = []

    def add(self, person):
        self.persons.append(person)
        return self

    # ジェネレータ
    def __iter__(self):
        for person in self.persons:
            yield person


group = Group().add(Person("Tarou", 21)).add(
                    Person("Hanako", 15)).add(
                    Person("Jiro", 15))

for person in group:
    print person.name

for a in group:
    print a.age

これにより、for ループでの記述が以前のようにシンプルになった。

 

__iter__() の実装を変更

以前に、Beautiful Soup を使ったことがある。このソースコードの中では __iter__() が使われているだろうかと思って調べてみたら、 Tag クラスに定義されており、その実装は iter() 関数を呼出し、その引数に Tag クラスのインスタンス変数であるシーケンス型のオブジェクトが渡され、それが返されようになっていた。

return iter(self.contents)

2.1 組み込み関数 によると、

iter(o[, sentinel])

イテレータオブジェクトを返します。2 つ目の引数があるかどうかで、最初の引数の解釈は非常に異なります。2 つ目の引数がない場合、 o反復プロトコル (__iter__() メソッド) か、シーケンス型プロトコル (引数が 0 から開始する __getitem__() メソッド) をサポートする集合オブジェクトでなければなりません。…

(太字は引用者による)

これを真似するなら、上記の __iter__() の実装を変更する。

    def __iter__(self):
        return iter(self.persons)

こちらも一応全てのソースコードを示すと、

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return self.name + " " + str(self.age)

class Group:
    def __init__(self):
        self.persons = []

    def add(self, person):
        self.persons.append(person)
        return self

    def __iter__(self):
        return iter(self.persons)


group = Group().add(Person("Tarou", 21)).add(
                    Person("Hanako", 15)).add(
                    Person("Jiro", 15))

for person in group:
    print person.name

for a in group:
    print a.age

うーん、どちらがいいんだろう…。 (@_@;)

追記 (2009.11.26) : 変更可能なシーケンス型 は、シーケンス型プロトコルに多分従っているだろうから、iter 関数使った方が効率的。反復プロトコル、または、シーケンス型プロトコルに従っていないタイプで要素を保持する場合、yield を使ってジェネレータを生成するのが良いだろう。

 

関連記事

PyScripter で UnitTest を自動で生成

PyScripter では UnitTest を作成するとき、対象となるモジュールからテストの雛形を自動で作成してくれる。

 

方法

UnitTest を作成したいモジュールを開き、メニューより Tools > Unit Test Wizard... を選択する。

080825-002

 

テスト対象のメソッドを選択するダイアログが表示されるので、必要なものをチェックする。

080825-003

 

例えば、上記は HtmlTable.py ファイルの HtmlTable クラスのメソッドから UnitTest を作成しようとしている。必要なメソッドを選択した後、 OK ボタンを押すと次のようなコードが自動的に生成された。

#This file was originally generated by PyScripter's unitest wizard

import unittest
import HtmlTable

class TestHtmlTable(unittest.TestCase):

    def setUp(self): 
        pass

    def tearDown(self): 
        pass

    def testsetCell(self):
        pass

    def testtoHtml(self):
        pass

if __name__ == '__main__':
    unittest.main()

unittest.TestCase のサブクラスとしてテスト用のクラス TestHTmlTablle が作成され、中にテスト対象のメソッドに対応したテスト用の空のメソッドが作成されている。 setUp, tearDown メソッドはテストの前処理・後処理で、後二つは先ほど選択したメソッドに対応したもの。

 

ファイルの保存

まず最初に、自動で作成されたテスト用のモジュールをテスト対象と同じディレクトリに保存すること。これをしないでテストを実行しようとすると、次のようなエラーダイアログが表示されてしまう。

exceptions.ImportError: No module named HtmlTable

 

テスト対象のモジュール名

次に、テスト用のメソッドの中でテスト対象のクラスを利用するには、

モジュールの名前.テスト対象のクラス

というように、必ず「モジュールの名前.」を付けること。これを忘れてテストを実行すると、赤い文字で次のように表示される。

TypeError: 'module' object is not callable

はじめこんな初歩的なミスに全然気がつかず悩んでしまった。 ^^;

Windows Live Writer で「編集」モードにおいて「特殊ペースト」によりソースコードの貼り付ける

1. Windows Live Writer のソース表示では編集しづらい

Windows Live Writer にソースコードを貼り付けるとき、Blogger で色付けされるようにしている。

次のような HTML を入力する必要がある。

<blockquote>
    <pre class="prettyprint">ソースコード</pre>
</blockquote>

Windows Live Writer に、HTML としてソースコードをペーストするとき、HTML のソース表示にしていた。

  • メニューより View > Source)

HTML のソース表示では、記事全体の位置が把握しずらい。画像も表示されないので、どこに文字を挿入すればいいのか分かりづらい。特に複数のソースコードの断片を使いたいときには嫌気がさす。 (+_+)

もっとお手軽に HTML のコードを挿入したい。

 

2. 「編集」モードで特殊なペーストをする

080825-001Windows Live Writer には「特殊なペースト」がある。

  • メニューより Edit > Paste Special…、

ショートカットキーでは、

Shift + Ctrl + V

で HTML の要素を「HTML」として挿入することができる。

ソースコードを「編集」モードの状態で貼り付けるとき、わざわざ HTML のソース表示しなくても良い。通常の編集モードにおいて「特殊なペースト」を使うことができる。

 

3. AutoHotkey で自動化

AutoHotkey を利用すると、ソースコードのコピーから、Windows Live Writer への貼付けまでをキーボードショートカットに割り当てることができる。

 

関連記事

Windows Live Writer (14.0.3920.528) Technical Preview で良くなった点 | すぐに忘れる脳みそのためのメモ

Windows Live Writer でサイドバーを閉じるとき

使っている PC の画面は小さい。そのため、Windows Live Writer でブログを書くとき、ウィンドウを小さくすることがある。その際、WLW のサイドバーを閉じる。

このとき、サイドバー上部にある

>>

の部分をクリックしていた。ここは、小さいのでクリックしずらい。 (+_+)

080825-001

… と思っていたのだけれど、以下の丸で囲った部分であれば、クリックすればサイドバーが閉じた。 (@_@;)

コピー ~ 080825-001

インターフェイスのデザインにより、思わぬ誤解を招くことってあるんだなぁ。

追記(2008.8.25) : ショートカットキーである F9 を使ってサイドバーを開閉するのができる。

PyScripter の Run コマンドと同じキーと覚えておこう。

2008年8月24日日曜日

HTML の要素を装飾するために、CSS で複数の class を指定する

HTML の要素を装飾するのに、CSS を組み合わせて指定したい。

Blog.okuryu : CSS で複数のクラスを指定する方法 によると、

class 属性値をスペースで区切って指定すると複数のクラスの CSS が適用される。

080824-012

例えば、テーブルの「枠や背景色」を装飾したいとする。CSS で

  1. 「枠の太さ」
  2. 「セルの背景色」

を、別々の class で指定する。

テーブルの枠の指定の方法は、「HTML のテーブルで、一部の枠だけ太くする」を参照した。

<html>
  <head>
    <title>複数の CSS を class で指定</title>

    <style type='text/css'>
      <!--
	  table { border-collapse: collapse; }
	  table, td { border: solid 1px; }
	  
	  .sunday{ background-color: #FFEEFD; }
	  .saturday{ background-color: #EEF2FF; }
	  .x_axis{ border-top: solid 3px; }
	  .y_axis{ border-right: solid 3px; }
	-->
    </style>

  </head>
  <body>

    <table>
      <tr>
	<td class='sunday y_axis'>hoge</td>
	<td class='saturday'>hogehoge</td>	
      </tr>
      <tr>
	<td class='sunday y_axis'>piyo</td>
	<td class='saturday'>piyopiyo</td>
      </tr>
      <tr>
	<td class='sunday x_axis y_axis'>fuga</td>
	<td class='saturday x_axis'>fugafuga</td>	
      </tr>
    </table>

  </body>
</html>

2008年8月23日土曜日

手帳に最適なコンパクトな 4 色ボールペン – REPORTER 4 COMPCT (TOMBOW)

1. デフォルトの筆記用具は、4色ボールペン

自分にとって、デフォルトの筆記用具といったら、鉛筆でもシャープでも万年筆でもなく、「 4 色ボールペン」。必須のアナログツール。

昔は、シャープ。そのまた昔は、鉛筆。

鉛筆は、ナイフを使って削っていた。

「手を使う方が頭にいい」

とか言われ、長いこと鉛筆削りを使わせてもらえなかった。 ^^;

鉛筆には鉛筆のよさがあり、それは削るときに感じる

「これだけ勉強したんだなぁ~」

という満足感・達成感。削っているときに無心になれる心地よさ。

シャープを使うようになったときのことは、今でも覚えている。鉛筆を卒業し、ちょっと大人になった気分だった。今時の子はどうなんだろうなぁ…。

 

情報の整理に色分けする

シャープからボールペンへと、デフォルトの用具が変わったのは、本を読むときにボールペンで線を引くようになったため。

ちゃんと読みたいものについては、ブラウズするときや PDF ファイルを読むときでも色付けするようになった。

当然ながら、メモをするときにも 4 色ボールペンを使う。色や線の太さを効果的に使うことによって情報の整理をすることができ、頭の中もスッキリとする。昔は本を読むことが苦手だったけれど、 4 色ボールペンを使うようになってから、以前よりも内容が理解しやすくなったように感じる。

 

2. TOMBOW の REPORTER 4 コンパクトを購入

愛用しているのは、TOMBOW の REPORTER 4

以前に述べたように、色を目で確認しなくても、色ごとにボタンの形が異なっているので使いやすい。この REPORTER 4 の後継として、コンパクトなバージョンがでていたので、以前から購入しようと考えていたが、ついに昨日手に入れた。

 

3. 普通サイズのボールペンとの違い

長さが違うというのはすぐにわかるが、使い心地はいくつかの点で異なる。

握り

使ってみてすぐに気がつくのは、握りの部分。通常の長さのものはゴムが使われていて滑りにくいが、コンパクトな方は溝が入っているだけ。

通常の使用では問題ないが、ゴムの感触に慣れてしまっていたので、ゴムでないことが、なんとなく気になってしまう。 (@_@;)

スイッチの切り替え

コンパクトの方が長さが短くなった分だけ、今までとはスイッチの位置が違う。

自分の場合、手が小さめなので問題ないが、手が大きい人の使い心地はどうだろうか。小さいので切り替えがやりにくということがあるのかもしれない。

ちなみに、自分はこれについてはすぐに慣れた。むしろ、小さくなって切り替えがやりやすい。

重さ

当初、これには全く気がつかなかった。コンパクトを使いしばらくした後に、元のボールペンで書こうとしたら、思いの他重い。 (@_@;) スイッチがついているヘッドの方に引っぱられる感覚がする。コンパクトの方が断然使いやすい。再びコンパクトに戻ると、軽くてスイスイと書くことができる。

4 色ボールペンなので重いのが当り前という感覚があったが、軽くてとてもいい。

この点がコンパクト最大の利点だと言える。

芯が短い

替えの芯も購入したが、当り前だけれどインクが短い。これは替えをたくさん用意しておかねば…。

その他

コンパクトには、ひもを通す部分も良さげ。 ^^

Firefox, Internet Explorer で背景色も印刷する

1. Firefox で背景色も印刷する

Firefox でページを印刷すると、背景色が印刷されない。

例えば、次のようなページを印刷しようとして、

080823-002

印刷プレビューを見ると、以下のように背景色がなくなってしまう。 (+_+)

080823-006

 

方法
  • メニューより、ファイル > ページ設定 > 書式とオプション >オプション

の「背景色と背景画像も印刷」にチェックをつける。

080823-007

印刷プレビューを見ると背景色がちゃんと表示された。 ^^

080823-009

 

2. Internet Explorer で背景色も印刷する

  • メニューより、ツール > インターネット オプション > 詳細設定 > 設定 > 印刷

の「背景の色とイメージを印刷する」にチェックをする。

080823-010

 

3. 参考サイト

2008年8月21日木曜日

Python である月の日曜日の日付のリストを取得

指定した年月における「特定の曜日」の日付を取得したい。例えば、

「 2008 / 8 において日曜日である日付のリストを得たい」

とする。

5.18 calendar -- 一般的なカレンダーに関する関数群 によると、

monthcalendar(year, month)

月のカレンダーを行列で返します。各行が週を表し、月の範囲外の日は0になり ます。 それぞれの週はsetfirstweekday()で設定をしていない限り月曜日か ら始まります。

上記の関数とリスト内包表記を用いて、

import calendar

# 2008/8 の日曜日の日付をリストとして取得
print [x[calendar.SUNDAY] for x in calendar.monthcalendar(2008, 8)]

結果は次のように表示される。

[3, 10, 17, 24, 31]

 

monthcalendar の定義

\Python25\Lib\calendar.py を見ると、上記のようなメソッドは Calendar クラスに定義されておらず、代わりに

# Support for old module level interface
c = TextCalendar()
#...
monthcalendar = c.monthdayscalendar

というように変数に関数が代入されている。 TextCalendar クラスは Calendar クラスのサブクラスで、 monthdayscalendar() 関数は Calendar クラス内で定義されている。そして同ファイルの変数 __all__ にシーケンスの要素として、 文字列 “monthcalendar” が存在する。上記で引用したドキュメントはリリース 2.4 に基いており、今自分が使っている Python のバージョンは 2.5.2 。 5.2 calendar -- General calendar-related functions を見ると Python 2.5 でいろいろと関数が追加されているのがわかる。

ところで上記の __all__ っていったい何だろうか? (@_@;)

 

public names

6.12 import 文 によると、

モジュールで 公開されている名前 (public names) は、 モジュールの名前空間内にある __all__ という名前の変数を調べて決定します...

__all__ 内にある名前は、全て公開された名前であり、実在するものとみなされます。

(太文字は引用者による)

つまり、モジュールのインターフェイスのようなものか。逆にこれが定義されていないと、

__all__ が定義されていない場合、モジュールの名前空間に見つかった名前で、アンダースコア文字 ("_") で始まっていない全ての名前が公開された名前になります。

(同上より、太文字は引用者による)

Python って、クラスのコンストラクタ __init__(self) のように、アンダースコアではじまると特別な動作がされるわけか。 (@_@)

結局、この __all__ の役割というのは、

__all__ には、公開されている API 全てを入れなければなりません。 __all__ には、(...) API を構成しない要素を意に反して公開してしまうのを避けるという意図があります。

(同上より、太文字は引用者による)

というように、情報隠蔽するものであって、疎結合を保つための手段の一つのようだ。

 

monthdayscalendar 関数

上記の定義より、monthcalendar 関数は別の関数へのアダプターになっているようだ。5.2 calendar -- General calendar-related functions によると、

monthdayscalendar(year, month)

Return a list of the weeks in the month month of the year as full weeks. Weeks are lists of seven day numbers.

この実装を見ると、

days = list(self.itermonthdays(year, month))
return [ days[i:i+7] for i in xrange(0, len(days), 7) ]

イテレータを返す関数があり、それを元にして上記の関数が定義されている。

itermonthdays(year, month)

Return an iterator for the month month in the year year similar to itermonthdates(). Days returned will simply be day numbers.

Calendar モジュールでは、日付を数字で返す関数と、datatime オブジェクトを返すものがあるようで、monthdayscalendar  に対応して、よく似た名前の monthdatescalendar がある。はじめこの違いに気がつかずに、こちらを使って monthcalendar と同じようになるように書いていた。

print [x[calendar.SUNDAY].day for x in cal.monthdatescalendar(2008,8)]
datetime オブジェクトには day という日付にアクセスするための属性があったのでそれを利用した。

 

その他

さて、変数 __all__ も出てきたことだし、 6. モジュール の構成方法についてもそろそろ目を通さねば…(@_@)

2008年8月19日火曜日

PC が熱暴走 (5) – CPU クーラーのファンを交換

PC が熱暴走 (4) - ケースファンの交換と増設 のつづき

1. CPU クーラーのファンを交換できる

暑い日が相変わらず続いている。 34 度を超える日もある。 (@_@;)

リヤのケースファンを交換し、ハードディスクを増設する位置に無理矢理ケースファンを増設しても CPU を定格で動作させることができない。

ケースを変えるしかないかな

と思っていたところ、自分が使っている CPU クーラーと同じ ANDY SAMURAI MASTER に関する記事を見つけた。

ANDY SAMURAI MASTER (SCASM-1000)のレビューと評価: かなりいい感じです! [conecoクラブ]

このクーラーはFAN交換によって別物に化けます。...

FANの装着クリップを少し曲げる事によって、38mm厚のリブ無しFANを装着できます。私はX-FANのPWM対応38mmFANと併用してCore 2 Quad Q6600 B3ステッピングをCommandoで3.00GHz(333MHzX9倍)で常用していますが、真夏でも全く問題ありませんでした。

ANDY の CPU に取り付けられているファンはでかくて、普通のケースファンに似ている。これを交換できるとは気がつかなかった。 ^^; ANDY に元々付いているファンの暑さは 25 mm 。よって、この厚さのファンであれば交換できる。

ANDY SAMURAI MASTER VS ZALMAN CNPS9700NT - PC自作日記 - 楽天ブログ(Blog) によると、

通常は25mm厚のFANがついていますが、今回はX-FANの38mm厚PWM対応品を使用しました。まずは写真から。38mm厚FANに載せ変えると非常に大きく感じます。…

取り付け金具はラジオペンチを使って少し曲げます。

無難に 25 mm のファンと交換することにした。 X-FAN の RDL1225S-PWM を購入。

http://www.x-fan.jp/products/120.html

X-FAN via kwout

 

2. ファンの方向を変更

08-07-21_14-20右の写真は、前回無理に設置したケースファン。フロント上部から吸気するように設置した。

これを、排気する方向へ変更した。

 

3. 結果

CPU の倍率を定格の 13 倍に設定。前回と同じように、スカイプのビデオチャットを付けたままにした。前回の結果は、

室温が 33 度でサイドパネルをつけた状態でも、CPU の倍率を 9 倍にしておけば、スカイプでビデオチャットをしていても、CPU の温度は 50 度台でおさまった。しかし、定格の 13 倍で動かすと 80 度近くに。 (ケースファンの交換と増設 より)

今回は、室温 32.5 度で、CPU の温度は 60 度台前半で落ち着いた。負荷がかかると一時的に 70 度を超えることもあった。 (@_@;)

スカイプのビデオチャットを切れば、50 度後半だった。しかし、室温が 34 度を超えた場合、 70 度を超えてしまうため、 CPU の倍率を 9 倍に設定しなくてはだめに。やはり、 38 mm の方のファンを付けた方がよかったかなぁ…。

とりあえず、前よりも冷えるようになった。

それにしても、室温が 32 度を超えると CPU の温度ってちょっとしたことで変わるものなんだなぁ…。 (@_@;)

PC が熱暴走 (6) – 余ったファンを取り付け につづく