RubyGems.orgにおける車輪の大発明的な話

大発明じゃなくて再発明、な。

ISBN を操作するための Ruby のライブラリを作った。

ISBN (International Standard Book Number)っていうのは、Wikipedia によると、図書の識別に使われる国際規格コードで、日本語では「国際標準図書番号」という。

別に新しいものでもなく、Ruby 用のライブラリも RubyGems.org で検索すればすでにいくつも存在することがわかる。チェックディジットのアルゴリズムも簡単だし、ちょっとやってみるのにはお手軽なのかも。そのせいかどうかは知らないけど、どのライブラリ(gem)をみても俺のニーズとずれている(約30分の調査による)。要するに気に入らない。俺のほしいのは:

  • 妥当性の検証
  • チェックディジットの計算
  • 現行規格(ISBN13)と旧規格(ISBN10)の相互変換
  • ハイフネーション

が簡潔にできる機能であって、こういうのはモジュール関数でやればいいんだよ。わざわざ ISBN クラスなんて作る必要ないんだ。

というわけで、RubyGems.org に登録されてないのも含めると何百回目だか何千回目だかわからない車輪の再発明をしたわけだ。コードは GitHub に上げてある。

で、せっかく作ったんだから RubyGems.org にも上げておこう(みんなそう思ったんだろうな)として rake release したら「そっくりな名前の gem がすでにあるんやで」みたいなメッセージが出て拒否された。一応、既存の gem とはかぶらないことを確認して isbn_utils っていう名前にしたんだけど、似ているだけでもダメみたいだ。そうなのか。知らなかった。

そういうわけなので、とりあえず RubyGems.org での公開は保留。いい名前が思いついたら再チャレンジする。かも。

Python: BOMつきUTF-8のCSVファイルを読み込む

Windows の Excel で、CSV ファイルに UTF-8 で出力ができることを知った。調べてみると結構前からできるようになってたようだ。

Excel で作ったデータを CSV ファイルに出力して Python のスクリプトで処理する、っていうのを時々やるんだけど、今まではいったん Shift JIS で出力したのを秀丸エディタを使って UTF-8 に変換してから処理していた。スクリプトは Linux でも使うから入力データのエンコーディングは UTF-8 にしておきたいんだよね。

で、Excel が UTF-8 の CSV をはいてくれるなら面倒な変換の手間を省いてそのままスクリプトで処理できる……と思ってやってみたらエラーになった。BOM(バイトオーダーマーク)がついているのが原因らしい。UTF-8 に BOM がついてるのとついてないのがあるのは知ってたけど、気にしたことはなかった。今回初めて BOM つきの UTF-8 に出くわした。軽くググってみると Windows だけが BOM をつけるらしい。

さて、本題。

Python で BOM つきの UTF-8 を読み込むには、ファイルを開くときのエンコーディングに utf-8-sig を指定してやればいい。↓こんな感じ。

>>> import csv
>>> with open('data_with_bom.csv', encoding='utf-8-sig') as f:
...     for row in csv.reader(f):
...         if row[0]:
...             print(row[0])
...

utf-8-sig というエンコーディングは BOM なしの UTF-8 も扱える。なので UTF-8 であることがわかっていれば BOM を気にしなくていい。

>>> with open('data_without_bom.csv', encoding='utf-8-sig') as f:
...     for row in csv.reader(f):
...         if row[0]:
...             print(row[0])
...

というわけで、解決。

[余談]

コード中に if row[0]: とあるのは Excel のはいた CSV ファイルの後ろのほうにカンマだけの行がくっついてるからそれを避けるため。なんでそんな行がくっつくのかは謎。

っていうか Python って後置の if が使えないんだね。ちょっと使いにくいな。

自宅ネットワーク内のコンピュータのIPアドレス割当てを固定にした

昨日、今日と2日続けて停電が発生した。午後に降った雷雨のせいだ(たぶん)。停電は短時間(1分もない)だったけど断続的に発生して、おかげで普段つけっぱなしの PC の電源が落ちた。サーバにしている PC も、だ。

雨がおさまってきたころ、PC の電源を入れて立ち上げたけど、サーバ PC で動かしている web アプリにアクセスしても繋がらなくなっていた。どうも IP アドレスが変わってしまったようだ。停電でルータの電源も落ちたからだな(たぶん)。

たいていの家庭のネットワークも同じだと思うけど、ウチのネットワークもルータの DHCP 機能を利用して各 PC に自動で IP アドレスを割り当てている。今回、ルータの電源も落ちたことで、PC を立ち上げたときに割り当てられたアドレスが変わってしまったらしい。

で、リモートではつながらないのでローカルにログインして、割り当てられている IP アドレスを確認して、hosts ファイルを修正したら繋がるようになった。

さて、もしかすると明日も雷雨で停電するかもしれないし、それでまた IP アドレスが変わってしまうようなことになればまた今日と同じ作業をしなくちゃいけなくなる。そんなのは面倒なので、DHCP で割り当てられる IP アドレスを固定にすることにした。

ルータは web インターフェイスで設定できるので、ログインしたら DHCP の設定のページで固定割り当ての設定をする。もう少し詳しく書くと、PC の NIC の MAC アドレスと、割り当てたい IP アドレスの組を登録しておくってことだ。PC が何十台もあるわけじゃないから大した作業ではない。

ともあれ、これで電源が落ちても今日みたいな作業をしなくても済むはずだ。もっと早くやっときゃよかった。