keyhac で Emacs 風ショートカットを定義する

キーカスタマイズソフト keyhac において、“複数のキー入力へアクションを割り当てる”ことが可能になっていた。要するにこれは、Emacs 風のショートカットを実現するためのものだ。

from keyhac import *

def configure( km ):
    # グローバルキーマップ
    kmg = km.defineWindowKeymap()

    # “切り取り”は C-W に退避させておく
    kmg[ "C-W" ] = "C-X"

    # マルチストローク設定
    kmg[ "C-X" ] = km.defineMultiStrokeKeymap()
    # 開く
    kmg[ "C-X" ][ "C-F" ] = "C-O"
    # 上書き保存
    kmg[ "C-X" ][ "C-S" ] = "C-S"
    # 名前をつけて保存
    kmg[ "C-X" ][ "C-W" ] = "A-F", "A"
    # 終了
    kmg[ "C-X" ][ "C-C" ] = "A-F4"

これにより、Control を押下したまま、XC と順に叩いてウィンドウを閉じることができる。さらに応用として、

Continue reading

【Perl, Python】日本の祝日の一覧を取得する

とかく日本は祝日の多い国である。しかも祝日となる日付は毎年異なり、その法則も他国のように単純なものではない。

2007 年(平成 19 年)からは国民の祝日が合計 15 日となった。これは先進国では最多であり、「ワーカホリック」ともいわれる日本の意外な一面でもある。
http://ja.wikipedia.org/wiki/国民の祝日

Perl の場合

Perl で祝日判定を行うならば Calendar::Japanese::Holiday モジュールが使いやすい。

Calendar::Japanese::Holiday – search.cpan.org
http://search.cpan.org/~kztomita/Calendar-Japanese-Holiday-0.03/lib/Calendar/Japanese/Holiday.pm

Perl 祝日名の取得 – とみぞーノート
http://wiki.bit-hive.com/tomizoo/pg/Perl%20%BD%CB%C6%FC%CC%BE%A4%CE%BC%E8%C6%C0

インストールは次のコマンドを打つだけだ。

Windows(ActivePerl)の場合

C:\> ppm install Calendar::Japanese::Holiday

Linux、Mac OS X 等の場合

$ cpan -i Calendar::Japanese::Holiday

Continue reading

keyhac で簡単なマクロを作ってみる

keyhac を使ってキー配列をいじるスクリプトを紹介してきたが(その 1その 2)このソフトではキーボードやマウスを使ったマクロを書くこともできる。今回は簡単な例として、Putty + GNU Screen での例を書いてみる。

Putty + GNU Screen でウィンドウを簡単に切り替える

GNU Screen で複数のウィンドウを切り替える場合は“コントロールキャラクタを押した後に数字キー”という操作を行う。具体的には、

  1. Control + Z を押す1
  2. Control + Z を離す。
  3. 3 を押す。

これで 3 番のウィンドウに切り替わる。毎回 Control を離す動作が面倒なのだ。これを、単に Control + 3 だけで切り替わるようにしたい。

config.py(部分)

def configure( km ):
    km_putty = km.defineWindowKeymap( exe_name = u"PUTTY.EXE" )
    for i in xrange( 10 ):
        km_putty[ "C-" + str( i ) ] = km.command_InputKey( "C-Z", str( i ) )

2 行目では特定のプログラム(PUTTY.EXE)でのみ有効なキーマップ(km_putty)を得ている。そして 4 行目がキモ。command_InputKey メソッドは引数に並べたキーを順に押した場合と同じ効果を得るための関数を返す。

このスクリプトを使うと、Putty + GNU Screen な環境で Control + 09 を押すと、0 番~ 9 番のウィンドウに切り替わるだろう。

Continue reading

【Python 事始め】404 エラーを補足する

指定された URL からファイルをダウンロードする方法を「【Python 事始め】進捗を表示しながらダウンロードする」に書いたが、ここで使った urllib.urlretrieve 関数はダウンロードできなかった場合(404 エラー等)でも問題なく終了してしまう。これを回避するには次のようにする。

How to catch 404 error in urllib.urlretrieve – Stack Overflow
http://stackoverflow.com/questions/1308542/how-to-catch-404-error-in-urllib-urlretrieve

urllib.FancyURLopenerhttp_error_default メソッドをオーバーライドしたクラスを作成すればよい。

Continue reading

【Perl, Python】シュワルツ変換あるいは優雅なる DSU

【Perl, Python】map、grep、sort の比較」に続き、mapsort を使って高速なソート手法であるシュワルツ変換を書いてみよう。

シャチ泳ぎとシュワルツ変換 – perl-mongers.org
http://perl-mongers.org/2008/05/schwartzian_transform_and_orcish_maneuver.html

Schwartzian transform – Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Schwartzian_transform

シュワルツ変換とは、ある配列の要素をそれぞれの属性値に従ってソートする場合、一度属性値を全て計算した配列を作ることでソートを高速化することを言う。

……と、言葉で説明してもアレだし、例を挙げてみよう。次のように、九州の各県の人口を表したテキストファイルがあるとする1

kyushu.txt

エンコーディングは UTF-8 とする。

長崎県 1,478,632 人
佐賀県 866,369 人
福岡県 5,049,908 人
熊本県 1,842,233 人
大分県 1,209,571 人
宮崎県 1,153,042 人
鹿児島県 1,753,179 人
沖縄県 1,361,594 人

これを人口の少ない順に並べ直し、次のような出力を得たい。

佐賀県 866,369 人
宮崎県 1,153,042 人
大分県 1,209,571 人
沖縄県 1,361,594 人
長崎県 1,478,632 人
鹿児島県 1,753,179 人
熊本県 1,842,233 人
福岡県 5,049,908 人

Continue reading