2013/08/25

Raspberry Pi の電気代はいくら?

これのつづきで、Raspberry Pi の電気代も考えてみたいと思います。

Raspberry Pi は24時間 常時電源ONで、Webサーバとして動かすとします。

ココによると、3.5W 以上食うことはないということです。

3.5W ✕ 24 = 84Wh/日 → 2.5kWh/月 ≒ 3kWh/月 とします。

Raspberry Pi 導入以前の電気代を114kW/月とすると、導入後は+3kW なので 117kW/月となります。

関西の場合は、ココで 114kW と 117kW を入力して差分をとります。

  • 導入前:114kW : 2,533円/月
  • 導入後:117kW : 2,598円/月

2,598 - 2,533 = 65円/月 と出ました。

65円/月 なら容赦なく常時ONにできます。


ここからは余談です。

私の Raspberry Pi (Type B) にはセンサやカメラ等はつけておらず、Mac のUSBポート(非Powered USB)につないでいるので、最大でも 500mA → 5V ✕ 0.5A = 2.5W のはずです。とすると同様の計算では44円/月 以下になります。

Mac mini 2012 は アイドル時 11W 未満 とのことですが、これをWebサーバとして使うと 273円/月 となります。

これを単純に比較すると、Raspberry Pi は Mac mini の 6倍以上安上がりということになります。

しかし、一方で、よく使う重めの Pythonコードで簡易ベンチを取ってみると Raspberry Pi は Mac mini の 30倍ほど遅いという結果も出ています。

何が安いか、考えどころです。

「x 秒後に自動的にジャンプします。」な Javascript

よく見かける「x 秒後に自動的にジャンプします。」な Javascript サンプルです。

JQuery は使っていません。「x 秒後」の数字の部分は 10, 9, 8, 7, ... と変化します。

リダイレクトするだけなら、ヘッダに下の1行を書き足せばいいのですが、

<meta http-equiv="refresh" content="10;URL=http://www.google.co.jp/" />

数字を変化させるとなると Javascript 書くしかないかなと。

ちなみに、クロージャを使っています。

CSS の 'rgba(255,255,255,1.0)' と #fff を変換する

Pythonによる、CSS3 の 'rgba()' 表記と従来の #16進数表記の相互変換の関数です。

文字列を指定した文字数ずつに分割する

Python の文字列の split() は区切り文字による分割はできますが、「何文字ずつに分割する」ということはできないと思います。

Split string into strings by length? で Pythonic な解決方法を示してくれた方がおられました。

シンプルさに感動したので関数化して置いておきます。

2013/08/24

KeyRemap4MacBook で Chrome のキーバインドを変更

KeyRemap4MacBook で Google Chrome のタブ切り替えを F11/F12 でできるようにしてみました。

  • F12: Ctrl + TAB
  • F11: Ctrl + Shift + TAB

~/Library/Application Support/KeyRemap4MacBook/private.xmlに下記を書き足します。

KeyCode, ModifierFlag の順に書かないとダメなようです。

2013/08/20

Emacs で ssh 接続してファイルを開く

ふつうに C-x C-f で開けます。

C-x C-f /ssh:ユーザ@ホスト#ポート番号:ファイル名

例:
C-x C-f /ssh:john@192.168.1.2#1022:/etc/hosts

ポート番号はデフォルト(22)のときは省略可です。

Raspberry Pi の Debian で最初の設定

Raspberry Pi / Wheezy で、インストール後に最初にやることのおぼえがきです。

HDMIでディスプレイにつないで、

  • User: pi
  • Pass: raspberry

でログイン。

まずは一般ユーザをつくる

$sudo su
#adduser hoge  <-- ユーザ 'hoge'を追加

sudo できるようにする

#chmod +w /etc/sudoers
#vi /etc/sudoers
        :
    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    hoge   ALL=(ALL:ALL) ALL   <-- この行を追加
        :

#chmod -w /etc/sudoers

sshのポート番号を変更する

$cd /etc/ssh/
$sudo cp sshd_config sshd_config.orig
$sudo vi sshd_config

    Port 22 --> Port 1022とか

IPアドレスを確認した後にリブート

$ifconfig
$sudo reboot

ここまでやると ssh でつながるので、Ethernet ケーブルをつないで、PC から

ssh 192.168.xx.xx -p 1022

で入ります。

タイムゾーンを UTC → JST へ

tzconfig は deprecated らしいので、下記で。

$sudo dpkg-reconfigure tzdata

  Asia / Tokyo

$date
Sun Aug 18 09:42:34 JST 2013

現在時刻がJSTで表示されればOK。

まずはここまで。

2013/08/19

Raspberry Pi の Debian に mod_wsgi をインストール

以下は、Raspberry Pi のApacheに mod_wsgiをインストールしたときのメモです。

  • Debian(Wheezy)
  • Apache 2.2.22
  • Python 3.3.2

最初は mod_python を試そうとしたのですが、ココによると、

mod_python は古くてメンテされていないので、 mod_wsgi の方がイーンジャネ。

とのことなので入れてみたしだいです。流されやすくてすいません。

ほぼココのまんまです。

まずは mod_wsgi を入れます。Python3を使っているので mod-wsgi も Python3用のものを入れます。

$sudo apt-get install libapache2-mod-wsgi-py3

テストとして走らせる .py を入れるディレクトリを作ります。

$cd /var/www
$sudo mkdir test

テストとして走らせる .py をそこに置きます。

$cd test
$sudo vi wsgi0.py
-----------
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]
-----------

バーチャルホストを設定します。

このRaspberry Pi のローカルIPアドレスは 192.168.1.2 とし、架空のDDNSサービス(ddns.net)で mynetというホストを登録した例です。

$cd /etc/apache2/sites-available
$sudo cp default hoge
$sudo vi hoge
-----------
NameVirtualHost 192.168.1.2:80
<VirtualHost 192.168.1.2:80>
        ServerAdmin admin@hoge.mynet.ddns.net
        ServerName  hoge.mynet.ddns.net 
        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        WSGIScriptAlias / /var/www/test/wsgi0.py
        <Directory "/var/www/test">
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
-----------
$sudo a2ensite hoge

Apache を再起動します。

$sudo /etc/init.d/apache2 restart

WWWブラウザで http://192.168.1.2/test にアクセスして 'Hello World!' と出ればOKです。

ルーターのポートを開放してあれば、http://mynet.ddns.net/test でも同様に 'Hello World!' と出るはずです。

2013/08/15

Python の takewhile と dropwhile

map のようにリストを高階関数で回して、途中で終了したいときや途中から始めたいときに便利です。

takewhile:条件が成立しているうちは継続し、成立したら中断

>>> from itertools import takewhile
>>> l = [0, 1, 2, 3, None, 5, 6, 7, 8, 9]
>>> list(takewhile(lambda x: x != None, l))
[0, 1, 2, 3]

dropwhile:条件が成立しているうちは読み飛ばし、不成立になったらそこから継続

>>> from itertools import dropwhile
>>> l = [0, 1, 2, 3, None, 5, 6, 7, 8, 9]
>>> list(dropwhile(lambda x: x != None, l))
[None, 5, 6, 7, 8, 9]

他にも itertools には使いでがありそうなものが多いです。

filter, map をリストの内包表記で。

Python3 では、filter や map がイテレータオブジェクトを返すらしく、Python2の習慣でリストのように扱おうとすると TypeError が発生します。

>>> l = filter(lambda x: x % 2, range(10))  # 奇数だけ抜き出し
>>> l
<builtins.filter at 0x10ff1ff90>
>>> l[0]
TypeError: 'filter' object is not subscriptable

これを回避するには、下のように list() で包んでやればいいのですが、ちょっと冗長な気がします。

>>> l = list(filter(lambda x: x % 2, range(10)))
>>> l
[1, 3, 5, 7, 9]
>>> l[0]
1

やはりPython的には、リストの内包表記で書きなおす方法が自然なので、filter は下記のように。

l = list(filter(lambda x: x % 2, range(10)))  # 奇数だけ抜き出し
       ↓
l = [x for x in range(10) if x % 2]   

同様に map は下記のように。

l = list(map(lambda x: x * 2, range(10)))  # 各要素を2倍する
       ↓
l = [x * 2 for x in range(10)]

reduce は… for で回す…くらいなら from functools import reduceします… 。