自堕落な技術者の日記

基本は喰ってるか飲んでるかですが、よく趣味でカラオケ・PKI・署名・認証・プログラミング・情報セキュリティをやっています。旅好き。テレビ好きで芸能通

Python

(小ネタ) MacPortsのpythonのbsddbモジュールロードエラーの回避方法

みなさま、ゴールデンウィーク中如何お過ごしでしょうか。 近々、Bitcoinの技術的なお話をさせて頂くことになり、ゴールデンウィークもプログラミングして試したり資料書いたりしております。

さて、PythonのBitcoin用便利ツール "bitcointools" を使っていろいろ試していたんですが、Mac OS Xで動いているbitcoindのローカルにあるブロックデータでも見てみようかと "dbdump.py" を動かしてみようとするもエラー発生。bitcoind のブロックデータはBerkley DB形式で保存してるんですが、Mac OS X MacPortsのPython ではそのライブラリを読もうとするとエラーになるみたいなんです。

$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import bsddb
Traceback (most recent call last):
File " File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bsddb/__init__.py", line 67, in import _bsddb
ImportError: No module named _bsddb
>>>
グーグル先生に聞いてみたところ みなさんも同様に悩んでおられる様子

ActivePython 2.7にある"_bsddb.so" を MacPortsにコピーすれば動くみたいな話が書いてあったので試してみたら動きました。

まずは、ActivePythonをサイトからダウンロードしてインストールします。

MacPorts PythonとActivePythonではインストール先が違います。

ActivePython for Mac OS Xのインストール先
/Library/Frameworks/Python.framework/Versions/2.7
MacPorts の Pythonのインストール先
/System/Library/Frameworks/Python.framework/Versions/2.x (いろいろ)
インストールしたら早速ファイルコピーします。
% cd /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
% sudo cp -i lib-dynload/_bsddb.so /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/
これで MacPorts Pythonでも無事 bsddb が使えるようになりました。
$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import bsddb
>>>
今日はこんなところで。

GoogleのコマンドラインツールGoogleCLをcygwinで試してみたゾ

GoogleからカレンダーやらDocsやらがコマンドラインから操作できるオープンソースのツールGoogleCLがリリースされたそうで、ちょっとcygwinでできるか試してみました。Pythonで実装されているというのもソソるじゃないですか。

cygwinでのインストール

  1. cygwin で python パッケージを入れておく
  2. 入ってなければgdata-python-clientをインストール
    % tar xvfz gata-2.0.10.tar.gz
    % cd gdata-2.0.10
    % python setup.py install
  3. googlecl をインストール
    % tar xvfz googlecl-0.9.7.tar.gz
    % cd googlecl-0.9.7
    % python setup.py install

使ってみる

インストールは難なくできたんで、早速使ってみます。初回、何かのコマンドを使おうとするとブラウザで「次のURLにアクセスしなさい」みたいなのが出てきてGoogleのアカウントで認証してGoogleCLで使えるようにするか聞いてきて、OAuthの認証トークンなんかの設定情報が~/.googleclディレクトリに保存されるようです。自動ログイン設定までの流れはこんな感じ、、、

Did not find config / preferences file at ~/.googlecl/config ...
making one.
Please specify user: Googleアカウント名
Please log in and/or grant access via your browser at
Failed to launch web browser: could not locate runnable browser
Please log in and/or grant access via your browser at
https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=...
then hit enter.
すると初回のgoogle docs listコマンドの結果が表示されます。

コマンド例

結果はUTF8で表示されちゃうのでLANGの設定に気を付けます。 例えば、こんな感じです、、、

% export LANG=ja_JP.UTF8
% google docs list
文書1, http...
文書2, http...


% google calendar title,when --date 2010-01-01,2010-04-01
あそび, Jan 04 00:00 - Jan 05 00:00
あそび2, Jan 10 00:00 - Jan 11 00:00
カレンダーの情報なんかをコマンドラインで得られるのは結構うれしいかもしれません。

参考リンク

PythonのGoogle Calendar Data APIを使ってみた

自分のオフィスでは、社員共通のスケジュール管理はサイボウズOffice6を使っています。利用者のコメントなんか見ていると他の製品やサービスとの連携は難が多いようです。

最近、iPhoneを手に入れまして、スケジュール管理は「さいすけ」が評判がいいようなので、基本的には無料アプリばっかりで通していたんですが、これだけは買ってしまいました。
さいすけ

さいすけはGoogleカレンダーと同期ができて、iPhoneでちまちまスケジュール入力するよりも、パソコンでGoogleカレンダーに入力する方が大量にスケジュール入力するときは楽です。

さて、これらのスケジュールの同期を取る場合、

  • サイボウズはスケジュールをCSVテキスト形式でインポート、エクスポートできる。

  • GoogleカレンダーはRFCにもなっているiCalendar形式でインポート、エクスポートできる。

  • さいすけはGoogleカレンダーとボタン一つで同期できる。


ということで何とか同期はできそうです。

ツールとしてはogawaさんのcybozu2icalというオープンソースがあるんですが、自分のcygwin環境ではうまくインストールすることができませんでした。

仕方なく、とりあえず以下の3つのスクリプトを作りました。

サイボウズのスケジュールのCSVエクスポート
サイボウズのスケジュールのエクスポートをブラウザからでなくコマンドラインから行えるようにしたスクリプト。開始月と期間の指定ができる。
csvの差分ファイル作成ツール
サイボウズのスケジュールをCSVでエクスポートした際、同じ期間で古いのと新しいのとを比較して、追加になったイベントのCSV、削除になったイベントのCSVを生成するスクリプト
サイボウズのCSVからGoogleのiCalendarに変換する
サイボウズのCSV形式のファイルからGoogleカレンダーでインポートできるiCalendar形式に変換するツール

両方ともPerlのText::CSV_XSモジュールを使った簡単なものです。

これで、サイボウズに新規に登録されたものだけを、Googleカレンダーにインポートして登録するところまではでき、さいすけとも同期が取れました。

でも、サイボウズでキャンセルになったスケジュールをGoogleカレンダーで削除するところは標準機能だけではダメなようです。

仕方なく調べてみると、Google Calendar Data APIというのがあって、カレンダーなんかも操作でき、Java、.NET、Python、PHP、Objective-C、JavaScriptなど様々な言語をサポートしていることがわかりました。

自分としてはキャンセルされたスケジュールの削除だけが、とりあえずできればよいので、簡単そうなPythonを使ってみることにしました。

ここからgdata-2.0.5.zipというPythonのライブラリを落とします。

Python 2.2以上に対応しているそうで、cygwinでは2.5.2だったので問題ありませんでした。インストールは以下で終わりです。

% unzip gdata-2.0.5.zip
% cd gdata-2.0.5
% ./setup.py install


さて、簡単なところからGoogleカレンダーの登録されているイベントを表示するようなサンプルを動かしてみようと、一覧表示部分を抜き出して実行しましたがダメでした。

#!/usr/bin/python
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのアドレス@gmail.com'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()
feed = client.GetOwnCalendarsFeed()
for i, an_event in enumerate(feed.entry):
 print '\t%s. %s' % (i, an_event.title.text,)
 for p, a_participant in enumerate(an_event.who):
  print '\t\t%s. %s' % (p, a_participant.email,)
  print '\t\t\t%s' % (a_participant.name,)
  print '\t\t\t%s' % (a_participant.attendee_status.value,)


AttributeError: 'CalendarListEntry' object has no attribute 'who'


動かないサンプルなんか入れとくな〜〜〜っ!!!と怒りの気持ちをおさえつつ、queryなら動くようなのでちょっと手直しして

#!/usr/bin/python
# coding: cp932
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのGmailアドレス'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()

query = gdata.calendar.service.CalendarEventQuery('あなたのGmailアドレス', 'private', 'full')
query.max_results = 50

feed = client.CalendarQuery(query)
for i, an_event in enumerate(feed.entry):
 title_u8 = an_event.title.text
 title = unicode(title_u8, 'utf-8').encode('cp932', 'replace')
 when = an_event.when
 print '件名: %s' % (title,)
 print '場所: %s' % (an_event.where[0].value_string,)
 print '詳細: %s' % (an_event.content.text,)
 print '日付: %s - %s' % (when[0].start_time, when[0].end_time,)
 print '参照: %s' % (an_event.GetEditLink().href,)
 print ''


実行してみるとカレンダーに登録されたイベントが表示されます。

件名: 仕事始め
場所: None
詳細: None
日付: 2010-01-04 - 2010-01-05
参照: http://www.google.com/calendar/feeds/○×1

件名: PKI定点観測
場所: None
詳細: None
日付: 2010-01-18 - 2010-01-19
参照: http://www.google.com/calendar/feeds/○×1


さて本題のカレンダーのイベントの削除ですが、消したいと思うイベントをクエリや件名などで絞り込んでから、実際に消すにはイベントan_eventに対して以下を実行すればオーケーです。

client.DeleteEvent(an_event.GetEditLink().href)


サイボウズからエクスポートされたCSVに対して、差分生成ツールによりスケジュールの更新によりキャンセルされたイベントのCSVは出てくるので適当に処理して、上のDeleteEventメソッドを実行してやればよいわけです。

APIを勉強した今では、登録も削除もAPI使った方が一貫性があるような気もしますが、とりあえず目的は達成されたので、時間が取れるまではこれで凌ごうと思っています。

ではでは、













JRubyかJythonか

私は今やすっかりプログラムを作ることは仕事ではなくなってしまい、プログラミングはもっぱら趣味の状態なので、署名暗号、暗号ライブラリの動作の確認、ちょっとしたツール(XAdESのフルセットの検証器はもはやちょっとしたツールとは言えないんだけども、、、)を作るのにJava系のスクリプト言語であるJythonを使っています。

RubyのJava版であるJRubyは日本にはファンが多いし、JRubyの開発者がSunに行ったことから由緒正しくなってしまったJava系スクリプト言語なんですけど、どうもRubyの文法が体に馴染まない、、、、、

class Foo
 def initialize
  print "初期化します...\n"
 end

 def hoge
  print "ほげします...\n"
 end
end


多分、この"class〜end"、"def〜end" の括りが大学の授業以来ずっと抵抗のあったPascalの"begin〜end"を想像させるからだろうなぁ、、、、と思います。(同様にDelphiも馴染めなかった)。C、Perl、Java、Lispみたいに括弧の方が良くないですか?文の始まりと終わりの対応関係が取りやすいし、、、(Emacsだと特に、、、、)

Pythonは空白文字のインデントで文を表すオモシロイ文法なんですが、ちょっと書いてみると昔お世話になったPrologに似てるなと思ってみたり、、、、

■Python
def foo(i):
 """↓3の倍数と3がつくときにアホになる関数"""
 if i % 3 == 0 or "3" in str(i):
  print "オモロー"
■Prolog
foo(I) :-
 I mod 3 =:= 0,
 write('オモロー').
foo(I).


基本はシンタックスの体に馴染むJythonで良いと考えているんですが、唯一JRubyで惹かれるのが「JRuby on Rails」です。本当にこれだけのためにJRuby使ってしまうかも、、、、、

<追記>
2008年3月にJythonの開発者もSunに入ったそう。- @IT 米サン、JRubyに続いてJythonの開発者を採用 2008.03.08

ナンプレ(数独)キラー Python

うちのカミさんや子どもは前からナンプレ(数独 or SUDOKU)が好きで、暇があれば新聞の土曜版やら本を買ったりしてやっています。

ちょっと前は海外出張した際に、恋人たちがなかむつまじく二人でSUDOKUやりながら飛行機を待っているなんていう姿もよく見かけました。日本円は弱いしカミさんはあまりお土産など欲しがらないみたいなので、フランスやスペインやドイツのナンプレ(SUDOKU)を買ってきてあげると、まぁ、結構うれしいらしく子どもと競ってやっているようです。あれは、言語が変わってもやり方は同じなのでアラブ語だろうがフィンランド語だろうがお土産にはイイみたい、、、、、

話し変わって、「LispプログラマのためのPython入門」(邦訳)という記事を書いたPeter Norvingさんという方がいらっしゃいます。これはいまだにLispのプログラムはEmacsのためだけに書くことがある私にとってPythonを最初勉強するのにとてもありがたかった記事です。Peterさんは私も昔生業としていた人工知能に関する記事も書いておられ、NASAに勤めておられる雰囲気です。

たまたま氏のサイトを眺めていたら「Solving Every Sudoku Puzzle」という記事があるのを発見しました。

ここでは任意の数独のパズルを解くことができるたった100行程度のPythonのプログラムを紹介しています。実装方法としては、昔懐かしい人工知能の制約伝播やら解の探索やら枝刈りやらそんな方法を使っています。

未定のマスを"0"として9×9の行列を一行で"0001034008..."のように一つのパズルを表現すれば、それを入力ファイルとして処理してくれます。

Java実装のPythonであるJython 2.1 で試してみたところ dict, set, max, min など一部の組込み関数がなかったために実行できませんでした。

仕方なくcygwinのPython 2.5を使ってみると一つの問題解くのに0.1秒もかかっていないような感じです、、、、、空しい、、、、、

4 1 7 |3 6 9 |8 2 5
6 3 2 |1 5 8 |9 4 7
9 5 8 |7 2 4 |3 1 6
------+------+------
8 2 5 |4 3 7 |1 6 9
7 9 1 |5 8 6 |4 3 2
3 4 6 |9 1 2 |7 5 8
------+------+------
2 8 9 |6 4 3 |5 7 1
5 7 3 |2 9 1 |6 8 4
1 6 4 |8 7 5 |2 9 3


暇があれば、足りない組込み関数実装してJythonでも動くようにしといてパズルの入力や解く仮定を表示するようなGUIをSwingなんかで作れるといいなとおもっています、、、、

しかし空しい、、、、、やっぱり、頭は使わなくちゃね、、、、

最新記事
Categories
Archives
Twitter
記事Google検索

本ブログ内をGoogle検索
Yahoo!アクセス解析
Travel Advisor
記事検索
QRコード
QRコード
  • ライブドアブログ