Python: 週番号に基づいて日付を分類する

2008.12.25 python

年間を通してそれぞれの週に番号を割り当て、該当する日付を分類します。週番号の付け方は3種類あります:

  • 日曜日を週の始まりとして番号を増やしていく方法
  • 月曜日を週の始まりとして番号を増やしていく方法
  • ISO の規格に基づいて番号を付ける方法

Python ではいずれの方法でも簡単に番号を取得できます。

#!/usr/bin/evn python
# vim: set fileencoding=utf-8:

import datetime
import time

db = {}

def insert_db(weeknum, d):
    global db
    if not db.has_key(weeknum):
        db[weeknum] = []
    db[weeknum].append(d)
#end def insert_db

# start
date_start = datetime.date(2009,1,1)

d = date_start
for x in xrange(0, 365):
    difference = datetime.timedelta(days=x)
    d = date_start + difference
#    weeknum = d.strftime("%U") # Sunday as the first day of the week
#    weeknum = d.strftime("%W") # Monday as the first day of the week
    weeknum = d.isocalendar()[1] # ISO week number
    insert_db(int(weeknum), d)

# output
for (weeknum,d) in db.items():
    b = d[0].strftime("%Y年%m月%d日")
    e = d[-1].strftime("%Y年%m月%d日")
    print '%d週: %s〜%s' % (weeknum+1, b, e)

参考ページ Dates and Times - PLEAC-Python

Arch Linux: xorg-server 1.5.3 の日本語キーボードの設定

2008.12.13 linux

xorg-server 1.5.3 になって Xorg が hal を通してデバイスを自動的に認識して設定してくれるようになったけれど、Arch Linux のデフォルト設定では日本語キーボードがうまく設定されてなかったので hal のハードウェアポリシーを設定した。参考ページは「Xorg-server 1.5.3でGnomeのキーマップを変更(その2) 多分これでOK」です。

/usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi/etc/hal/fdi/policy/10-keymap.fdi にコピーして、10-keymap.fdi を修正することで日本語キーボードが日本語配列で扱えるようになった。 ただし動作確認を行ったのが GNOME 2.24.2 だけです。GNOME のキーボード設定も同時に行った。

/etc/hal/fdi/policy/10-keymap.fdi

10-keymap.fdi の中身です。編集できたら /etc/rc.d/hal restart で HAL デーモンを再起動します。GDM が動いていたら /etc/rc.d/gdm restart も忘れずに。

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keymap">
      <append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
    </match>

    <match key="info.capabilities" contains="input.keys">
      <merge key="input.xkb.rules" type="string">evdev</merge>

      <!-- If we're using Linux, we use evdev by default (falling back to
           keyboard otherwise). -->
      <merge key="input.xkb.model" type="string">keyboard</merge>
      <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
             string="Linux">
        <merge key="input.xkb.model" type="string">evdev</merge>
      </match>

      <merge key="input.xkb.layout" type="string">jp</merge>
      <merge key="input.xkb.variant" type="string" />
    </match>
  </device>
</deviceinfo>

GNOME のキーボード設定

パネルから System > Preferences > Keyboard を開く。Layouts タブの Keyboard model を「Japanese 106-key」にする。Selected Layouts に「Japan」を追加して他のレイアウトを削除する。

携帯のアクセスをモバイル専用ページに転送する方法

2008.11.28 web

ドコモ、au、ソフトバンクなどの携帯電話によるウェブページへのアクセスをモバイル専用ページにリダイレクトする htaccess の設定です。モバイル専用ページはディレクトリ /m/ に置かれているものとします。

Options FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/m/
RewriteCond %{HTTP_USER_AGENT} "DoCoMo" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "J-PHONE" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "KDDI" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "DDIPOKET" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Vodafone" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "SoftBank" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Nokia.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^MOT-.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "L-mode" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "UP.Browser" [NC]
RewriteRule ^(.*)$ http://www.myhostname/m/ [R=301,L]

注意点として RewriteCond %{REQUEST_URI} !^/m/ の記述を忘れると転送が無限ループしてしまい、結果的にモバイル用のページを閲覧させることができません。

またPC版のどのページへのアクセスも問答無用でモバイル用ページのホームにリダイレクトしています。PC版URLに対応したモバイル用URLがあるのなら RewriteRule$1 を設定すると良いでしょう。

RewriteRule ^(.*)$ http://www.myhostname/m/$1 [R=301,L]

Pythonで一時変数を使わない数値の交換

2008.11.05 python

一時変数を使わないでふたつの変数の値を交換するをPythonで書きます。

一時変数を使わずに値を交換するには論理演算のひとつであるXOR(排他的論理和)を使います。


>>> a = 123
>>> b = 456
>>> a = a ^ b
>>> b = a ^ b
>>> a = a ^ b
>>> a,b
(456, 123)

^演算子はint型でしか使えません。またこのアルゴリズムは物理メモリが少ない環境での実装に効果的です。処理速度は一時変数を使うやり方のほうが速いです。

100万回の計算でベンチーマークしてみた結果が以下です。

## swap.py の結果。
# uname -r # 2.6.23-gentoo-r9
# python --version # Python 2.5.2

# 1回目
Normal: 0.805381
XOR: 1.309535

# 2回目
Normal: 0.793384
XOR: 1.304315

# 3回目
Normal: 0.793322
XOR: 1.271404

swap.py のソースコード


import time

max = 1000000

a = 123
b = 456

# Normal swap
start = time.time()
for x in range(0, max):
    tmp = a
    a = b
    b = tmp
stop = time.time()
print "Normal: %f" % (stop - start)

a = 123
b = 456
# XOR swap
start = time.time()
for x in range(0, max):
    a = a ^ b
    b = a ^ b
    a = a ^ b
stop = time.time()
print "XOR: %f" % (stop - start)

社内のチャットはIRCで

2008.10.31 IRC

livedoor ディレクター Blog に「枯れた技術で社内を潤す IRCを使おう!」という記事が掲載されていました。IRCのメリットが上手くまとめられています。

マイクロソフトなどが提供するインスタント メッセージング サービスはアカウントの作成とクライアント ソフトウェア依存なところがあります。IRCではアカウントの作成ステップはクライアントでニックネームを設定するだけですし、複数のIRCサーバーが世界中でリンクされているので特定のサーバーに接続できなくても他のサーバーに切り替えることで問題を回避できることもあります。

また社内でIRCサーバーを運用すればセキュリティを強化できる事やIRCサーバー ソフトウェアのカスタマイズが出来るメリットもあります。

ちなみに僕が勤めている会社でもIRCサーバーを運用してます。たいてい話が広がりすぎて雑談になっていきます(笑)。社内IRCで感じているメリットは:

  • テーマ毎のチャットルームが即座に開ける。
  • 多人数での会話が基本なのでひとつの話題に豊富な返信がある。
  • 気分がのらないときはROMで。
  • ファイルが送れる(クライアントがサポートしていることと、OSでポートの開放が必要)。
  • 内緒話(1対1の会話)ができる。
  • チャットのログ(会話)を編集することで有益な情報としてプールできる(wikiまたはブログに掲載)。
  • ウェブページのタイトルを取得するボットが常駐しているので投稿されたURLの閲覧価値を判断できる。

以上です。

技術面の補足情報として、IRCサーバーソフトウェアはこちらのものをGentoo Linuxで動かしてます。クライアントはWindowsな人はLimeChat、Macな人はColloquyです。