2013/07/22

例外処理 try .. except のサンプル (Python3版)

割り算を繰り返している最中に、ゼロで割り算してしまったら、そこで ZeroDivisionError という例外が発生します。

例外処理 try..except を使わない not_used() 関数は、そこでプログラムが異常終了してしまいますが、 例外処理を使っている used() 関数は処理を中断せずに最後まで実行します。

プログラムにとって、途中で異常終了するのは最悪なことです。

とくにマルチユーザのプログラムでは、1人のユーザの操作が原因で全員の作業を中断させてしまうことにもなります。なので、このような致命的な事態はできるだけ避けなければなりません。

上の例のように、原因が分かりきっているバグはすぐに取ってしまえばいいですが、原因が予測できないケースや、原因が多岐にわたるケースもあります。

そのような場合は、エラーを避けるための事前確認処理として if .. elif .. else を何個も入れることになり、結果として読みづらいコードになりがちです。

例外処理 try..except を使えば比較的シンプルにエラー処理を書くことができ、開発時には想定していなかったケースにも対応しやすいです。

2013/07/20

消してしまったファイルをDropboxから復活させる

よく忘れるので、メモります。

  1. Dropboxのサイトにログインします。
  2. ページの右上にあるゴミ箱アイコンをクリックし、ゴミ箱が閉じたアイコンになるようにします。

    普段は削除したファイルは表示されませんが、この状態にすると、削除したファイルがグレーで表示されるようになります。
  3. フォルダ階層をたどって、消してしまったファイルを探します。
    フォルダごと削除した場合は、そのフォルダを探します。
  4. 目的のファイルを右クリックし、メニューから「Restore」を選びます。

同期が終われば、ファイルが復活しているはずです。

TimeMachineの操作が重いので、最近は Dropboxからファイルを復旧することの方が多くなってきました。

Dired から Mac の openコマンドでファイルを開く

Emacs の Dired では、ファイルを選択してEnterキーを押すと、何でもかんでも Emacsで開こうとします。しかし画像や動画のファイルは専用のソフトで開きたいところです。

Mac ではファイルごとに関連付けられたデフォルトのアプリでファイルを開く open コマンドがあります。

このコマンドと、以前試したQuick Look のこれを使って、 Dired で Enter を押したしたときに自動判別して開くようにしてみました。

下記では jpeg や png などの静止画は Quick Look で、avi などの動画や pdf は open で開きます。

2013/07/18

wget でサイトをまるごとダウンロード

ウェブ上に置いてあるマニュアルや読み物は、ローカルに落としてじっくり読みたいものです。

wget で CSSや画像を含めてまるごと取得するには、下記の例のようにします。

wget -p -r http://diveintopython3-ja.rdy.jp/index.html

この例では Dive into Python3 日本語版 を取得しています。

2013/07/17

html-modeで閉じタグにジャンプする

web-mode.el ではweb-mode-tag-matchというコマンドで開始タグと閉じタグの間をジャンプできます。

これを html-mode で使うには、

(require 'web-mode)

(add-hook 'html-mode-hook
          '(lambda ()
             (define-key html-mode-map "\M-]" 'web-mode-tag-match)))

単純に上のようにすればいいです。

しかし、なんとなく mic-paren のカッコ間ジャンプと同居させてみたくなったので、下記のようなのを仕込みました。

これで、カーソル位置がカッコならカッコ間ジャンプ、それ以外ならタグ間ジャンプをしてくれます。

Pythonで「ImportError: No module named …」が出た時の3つの対処法

このエラーは、インポートしている .pyファイルが見つからないときに出ます。

果てしなく既出っぽいですが、他のモジュールを使うときの3通りの方法をまとめます。

例:main.py が /path/to/dir/sub.py をインポートする場合

1. インポートする側のソースファイルで対処

インポートする側のソース(main.py)の先頭に下記を書き足す。

 import sys
 sys.path.append('/path/to/dir')

2. シェルで対処

.bashrc 等に下記を書き足す。

 export PYTHONPATH=/path/to/dir:$PYTHONPATH

3. 実行する度に対処

ふだん、main.py を実行するとき、

 $python main.py

としているのを、

$PYTHONPATH=/path/to/dir python main.py

として実行する。

カレントディレクトリ配下のディレクトリを指定する場合は、下記のように。

$PYTHONPATH=. python main.py 

いずれの場合も、インポートされる側のディレクトリに__init__.pyを置くのを忘れないように注意。

/path/to/dir
          |
          +-- __init__.py
          |
          +-- sub.py

2013/07/16

光からADSLに変更

フレッツ光の2年縛りが解けたので、ADSLに変更します。

今月中にやらなければ自動更新されてしまい、2年後の契約満了月までに解約すると違約金が発生するらしいので。

固定電話は休止中のものがあるので、これを再利用の手続きをしてからADSLに変更しました。

以下は、フレッツ光からADSLに変更した時の個人的なメモです。

1.ADSLプロバイダを探して目星をつける

価格.comなどを参考に。

2.休止させている固定電話を復活させる。

NTTに電話をかける。

ちなみに、NTT西日本では 0800-2000116(2013年7月現在 )。 
土日祝 9:00-21:00。携帯フリーコールOK。

担当者さんにつながるまで気長に待つ。(10分ほどかかった)

「利用休止中の固定電話を再利用したいのですが」といえば話しが通じる。

下記を聞かれるので予め準備できればベター。

  • 電話の名義
  • 停止した時の固定電話の電話番号
  • 停止した時の住所
  • 停止申請時に連絡先として教えた電話番号(携帯等)
  • 停止した時期

この電話でフレッツ光の解約もできるようなので、担当者さんにお願いする。

新しい電話番号を取得して、折り返し電話をくれるとのこと。

3.電話を受ける

新しい電話番号の候補を5つほど教えてくれるのでメモを取って、その場で決める。

電話の工事日付を指定する(立ち会い工事)。

フレッツ光をいつ止めるか聞かれるので11日後(土日除く)以降の日付を指定する。

4.目星をつけたプロバイダの申し込み手続きをする。

今回は Nexys.BB で。

電話番号は、先ほど復活させた電話番号を入力する。

利用開始日付は、フレッツ光が止まる11日後を指定する。

申込書は郵送で届く。

5.現在利用中のプロバイダの解約手続きをする。

ウェブで解約手続きをする。

後は、郵送で送られてくるものを順次処理すれば完了です。

その他、注意事項

  • 現在利用中の光モデム等はNTTから返送用の袋が送られてくるので、それに入れてコンビニで送る(着払い)。
  • 固定電話の工事費用は2100円(電話の差込口がある場合)。NTTに支払うのはこれのみ。
  • 固定電話の支払いは再度手続きが必要。NTTから申込書が送られてくる。

Spotlight で見つけたファイルの場所を開く

よく忘れるので、メモを残します。

見つけたはいいけど、そこへはどうやって行けばいいのか。

はい。Command + r でファインダーで開けます。

コンテキストメニューにでも出してくれればいいのに…。

参考にさせていただいたサイト

2013/07/14

Dired でファイルを削除したときに、ゴミ箱に移動する

Dired でDキーを押してファイルを削除したときに、直接消さずにゴミ箱に移動するようにするには、下記の1行を .emacs に追加するだけでOKです。

(setq delete-by-moving-to-trash t)

Emacsで開いているファイルの場所をターミナルで開く

これのつづきです。

とりあえず、やっつけで作りました。ちょっと難ありです。

現状の問題点は、

  • Mac専用
  • 1つでもターミナルを開いていることが前提
  • 他のターミナルのウィンドウがすべて前面化される

一応 Dired でも使えます。

参考にさせていただいたサイト

2013/07/13

Genshi のテンプレートにHTMLリテラル文字列を挿入したい

HTMLタグの含まれた文字列を Genshi に渡すと、>< などがエスケープされてしまい、意図した動作になりません。

公式サイトのFAQ では3通りの解決方法を挙げていますが、その一つのMarkupクラスを使う方法を示します。

単純に、文字列をMarkupクラスでラップして渡してやればOKです。

以下に例を。

2013/07/12

mkvmerge で英語音声を日本語に変更するシェルスクリプト

mkvmerge をコマンドラインで使い、英語音声を日本語に変更するのつづきです。

編集する mkvファイルが多い時は煩雑になるので、同じフォルダにあるすべてのmkvファイルを一括変更するシェルスクリプトにしました。

このスクリプトを、パスの通った場所か mkvファイルと同じ場所に置いて実行すると、下記のように日本語音声のトラックIDを聞いてきます。

$cd /video/test/hoge
$mkv.sh 
71 files in /video/test/hoge
----------------------------
Track ID 0: video (V_MPEG4/ISO/AVC)
Track ID 1: audio (A_AC3)
Track ID 2: audio (A_AC3)
Track ID 3: subtitles (S_TEXT/SSA)
Track ID 4: audio (A_AC3)
Track ID 5: subtitles (S_TEXT/ASS)
Track ID 6: subtitles (S_TEXT/ASS)
Track ID 7: subtitles (S_VOBSUB)

INPUT 'Track ID' OF JP-AUDIO:2      <------ 入力

トラックIDを入力した後はただ待つだけです。元のファイルはorigという名前のサブフォルダに待避します。

なお、ファイルによっては日本語音声のトラックIDが違うこともあるので、編集後のファイルの確認は必要と思います。

ファイル名に空白が含まれていると、シェルのfor文で回したときにうまく動かない

ファイル名に空白が入っていると、シェルスクリプトのforで回したときにファイル名が空白で分割されてしまい、期待した動作になりません。

そんなときの対処法は、単にシェル変数IFSに改行文字のみを設定すればいいです。

この変数は区切り文字を表すのですが、通常はこの変数にスペースやタブ文字が含まれていることが原因です。

2013/07/10

Python 3.3 で CherryPy

Python2.7までは、CherryPy のインストールは不要でした。

公式サイトから一式をダウンロードして、その中身の cherrypyフォルダをスクリプトと同じ場所にコピーするだけ動いたのです。

しかし、Python3.3では今のところこの方法は使えないようです。

現在、公式サイトにある CherryPy の最新バージョンは 3.2.2 ですが、このバージョンはまだ Python3.3 に対応していません。

Python 3.3 で CherryPy 3.2.2 を使うと、下記のエラーが発生します。

AttributeError in cherrypy.process.plugins - threading._Timer

未対応箇所については、このあたり で議論されており、pip のパッケージ(usr/lib/python3.3/site-packages/cherrypy/)にある CherryPy 3.2.4 は対応済みの模様です。

ですので、ローカル環境で動かすには、

$sudo pip install cherrypy

とすれば、Python3.3で cherrypy が動きます。

リモートサイトに上げるときは、この pip で取得した cherrypy フォルダをアップロードすることになります。

2013/07/09

自分の Gist が検索できるようになっている件

今頃気づくなと言われそうですが、Gistのページの一番上にあるテキストボックスにキーワードを入力すると、検索できるようになっているようです。

上図の赤枠にキーワードを入れると、該当する候補がプルダウン表示されます。

どうやら、

  • 大文字/小文字を区別する(Case Sensitive)
  • 自分のGistと、スターをつけた誰かのGistが検索対象
  • Description に書いた内容を検索

のような感じなので、Gist に置いたソースの全文を検索してくれるわけではないみたいですが、自分のGistを検索するには便利になりました。

できれば、ファイル名も引っ掛けてくれるとありがたい…。

microchip の送料無料クーポン

少し前に、RN-42というBluetoothモジュールについて、microchip のサポート に質問したことがありました。

チケットを発行して質問を英語でポストすると、向こうの担当者さんがそれを見て回答してくれるという、一般的なバグトラッキングシステムです。

担当者さんと何度かやり取りしたおかげで原因が判明したので、「僕的には解決しました。ありがとう。」と伝えました。

そして10日ほど過ぎたある日、microchip からメールが。単に 「ステータスを Resolved にしたよ。」の知らせかと思いきや、

As a thank you for designing with Microchip products, we are offering you Free Shipping on your next Development Tool/Software order on microchipDIRECT. Simply enter this single-use coupon code, **, first at the final checkout screen. Offer expires 30/Sep/2013. Microchip reserves the right to expire the promotion at any time and without warning.

9/30までに microchip Direct で何か注文すれば、送料無料になるとのこと。

microchip Directで注文すると、小さなものでも送料が$9程度かかるので、これはありがたいです。

2013/07/08

mkvmerge をコマンドラインで使い、英語音声を日本語に変更する

mkvmerge(MKVToolNix) は mkvファイルの編集に重宝します。

しかし mkvmerge のGUIはちょっと使いづらいので、コマンドラインで使うことが多いです。

下記は mkvmerge で mkvファイルのデフォルト音声を変更する方法です。 当然ながら、mkvファイルに日本語の音声トラックが含まれていないとできませんのでご注意を。

以下は、カレントディレクトリにある hoge.mkv を日本語音声に変更する例です。

まず、-i オプションで mkvファイルの情報を見て、日本語音声っぽい TID(Track ID) を探します。(Macの場合)。

$/Applications/Mkvtoolnix.app/Contents/MacOS/mkvmerge -i hoge.mkv
 File 'hoge.mkv': container: Matroska
 Track ID 0: video (V_MPEG4/ISO/AVC)
 Track ID 1: audio (A_AC3)
 Track ID 2: audio (A_AC3)
 Track ID 3: subtitles (S_VOBSUB)
 Track ID 4: subtitles (S_VOBSUB)

Track ID 1 が英語音声、Track ID 2 が日本語音声だとすると、オプションとして --default-track 2 を指定すると、日本語音声がデフォルトになります。

具体的には、下記のようなコマンドになります。

$/Applications/Mkvtoolnix.app/Contents/MacOS/mkvmerge -o hoge_mod.mkv --default-track 2 hoge.mkv

hoge_mod.mkv を再生するとデフォルト音声が日本語になっていると思います。なっていない場合は、TIDの指定が間違っているので、別のTIDを試します。

コマンドラインオプションは、

が詳しいです。

シェルスクリプト化しました → mkvmerge で英語音声を日本語に変更するシェルスクリプト

2013/07/06

iPhone5のWi-Fiがよく切れるときの、その場しのぎな対処法

今年の3月に購入した iPhone5 のWi-Fiが、最近特につながらなくなりました。

購入当初から、速度が遅かったりよく切れたりしていましたが、まだ許せる範囲でした。しかし、最近はアプリのダウンロードもできなくなる始末。最近話題の Google ハングアウトもつながった試しがありません。

「iPhone5 Wi-Fi」でウェブを探すと、やはり5GHzの無線ルータに買い替えるという対処法がゴロゴロ出てきます。

でも、すぐにルータを替えるお金なんてないので、ここは対処療法でなんとかしてみます。

その場しのぎな対処法は、

ルータのオートチャネルの設定を無効化し、速いチャネルを手動で設定

です。どこが速いチャネルなのかは実際に iPhone の速度ベンチをとらないと分かりませんので、手間はかかります。

私のルータ WN-G300DGR では、下記のように設定しました。

参考までに、ベンチを下記に。

↓オートチャネル

↓固定チャネル(7CH)

チャネルを手で設定してからは、切れることが少なくなりました。

難点としては、その時々の隣近所の電波の混みあいで速いチャネルは変わるので、その都度チャネルを変える必要があることです。

辛抱できなくなったら、その時 5GHzルータを買うことにします。

参考にさせていただいたサイト

2013/07/05

Raspberry Pi: Type A と Type B の違い

RS Components の製品ページから両者の仕様を比較してみました。

Type A (24.00ポンド 約3600円)

  • 256MB RAM
  • USB 2.0 socket

Type B (31.20ポンド 約4700円)

  • 512MB RAM
  • 2 x USB 2.0 sockets
  • 10/100 BaseT Ethernet socket

というわけで主な違いは、メモリUSBポート数Ethernetポートの有無 の3点です。

有線でネットにつないで何かしたい場合は Type B 一択になりそうです。USB経由でLANアダプタ等もできなくはないですが…。

なお、上記の価格は RS Components のものです。

下記は共通仕様です。

共通仕様

  • Broadcom BCM2835 700MHz ARM1176JZFS processor with FPU and Videocore 4 GPU
  • GPU provides Open GL ES 2.0, hardware-accelerated OpenVG, and 1080p30 H.264 high-profile decode
  • GPU is capable of 1Gpixel/s, 1.5Gtexel/s or 24GFLOPs with texture filtering and DMA infrastructure
  • Boots from SD card, running a version of the Linux operating system
  • HDMI video out socket
  • RCA composite video out socket
  • 3.5mm audio out jack
  • SD card socket
  • Powered from microUSB socket
  • Raspberry Pi HD video camera connector
  • Size: 85.6 x 53.98 x 17mm"

Emacs でも、Win/Mac のような 全選択を。

最近のEmacsは Shift + カーソル移動でテキストを選択できるようになっているようです。

全選択(Select All)もそれっぽいのが欲しくなったので、似たようなのを作ってみました。

M-a するとバッファ内のすべてに色がつき、カーソルがバッファ末尾に移動します。

参考にさせていただいたサイト

Monolingual ⊂ CCleaner @Mac

Monolingual は、普段使わない言語リソースを削除してディスクを節約するソフトです。

システムディスクがSSDになったこともあり、できるだけ容量を節約したいときには重宝していました。

しかし、Mac版の CCleaner には Monolingual の機能が含まれているようです。

まず、左側の Options > Languages と進み、不要な言語を設定します。(必要な物だけ チェック)

Options > Languages

次に、左側の Cleaner > Mac OS X タブと進み、Unneeded Languages をチェックします。

Cleaner > Mac OS X

あとはいつものように、掃除をするだけで不要な言語リソースを削除してくれます。

CCleaner はWindowsでは有名な掃除ソフトですが、Mac版も素晴らしい出来のようです。

あまりソフトの紹介は得意ではないのですが、久々に感動したのでつい。

2013/07/04

recentf のホームディレクトリを "~" に置換

recentf-ext のディレクトリを色付けに引き続き、recentfネタです。

recentf で列挙されるパスのホームディレクトリ部分(Mac では "/Users/hoge"など)を "~" に置換します。

↑こういう表示が、↓こういう感じになります。

既出っぽいネタですが、これで視認性がよくなりました。

recentf-ext のディレクトリを色付け

人は俺を「recentfマスター」と呼ぶ の recentf-ext.el を使うと、最近使ったファイルだけでなくディレクトリも列挙されるようになります。

あとは、そのディレクトリを選んでEnterを押すだけで dired で開けます。これに慣れてしまうと、M-x diredC-x C-dしてディレクトリ名を入力なんて、やってられません。大抵の場合は、recentf して近場のディレクトリ名をインクリメンタルサーチして Enterすれば事足ります。

とても便利になりましたが、どれがディレクトリなのか見分けづらいこともあります。

そこで、ディレクトリだけを色付けするようにしてみました。

recentf がマイナーモードということもあって色付けには overlay を使いましたが、こういうものは本来 syntax-table か font-lock ですべきなのかもと思ったのは書いた後でした。

z を bash で使う

コマンドラインでのディレクトリ移動が楽になる z を bash で使うためのメモです。

z は、簡単にいえば cd で移動したディレクトリの履歴を取ってくれて、その後に移動する時の入力補完に使おうというものです。autojumpもいいのですが、こちらのほうが入れるのが楽なので。

インストール

パッケージなどはないので、手動で入れます。といっても z.sh というシェルスクリプト1個だけです。

インストール先としては、とりあえず ~/bin にしときます。~/binがない場合は、適宜掘ります。

https://github.com/rupa/z から z.sh をダウンロードして、~/bin に置きます。

その後、.bashrc に以下の1〜2行を追加します。

PATH=$PATH:$HOME/bin     # 今回、初めて ~/bin を掘った場合のみ追加
source ~/bin/z.sh

編集が終わったら、

source ~/.bashrc

として、.bashrcを再読み込みします。これで z が使えるようになっているはず。

使いかた

どこかに cd すれば、それを z が履歴として保存してくれます。 ためしに、

$cd /usr/local/share/info
$cd /var/log/cups

とカレントディレクトリを移動したあとで z と打ってみます。

$z
4          /private/var/log/cups
8          /usr/local/share/info

引数なしで z を実行すると移動履歴が表示されます。(4とか8はランクかな?)

zでカレントディレクトリを移動するには、cdと同様に

 z 移動先ディレクトリ

としますが、この移動先を入力するときにTABキーによる補完が効くというわけです。

z logとタイプした後、TABキーを押すと、z /private/var/log/cups と展開されます。

同様に z shでは、z /usr/local/share/info/ と展開されます。

キーワードが一致すれば、先頭・末尾に限らず何でもいいので、うろ覚えで移動が可能です。