
YAPC::Asia 2012 LTソン muraveスライド&デモ動画
- 2012/09/30
- murave
- IronPython
- YAPC
- イベント

RBC、MobiRubyイベント無事終了(スライド付)

MobiRubyのサンプル作りました(動画付)
新着情報、『9/22(土) Rubyビジネス・コモンズが「【RBC Tech Saturday】MobiRubyでiOSアプリをつくろう ~スマホアプリ開発にmrubyがやってきた~」を開催します』でお知らせしておりますとおり、明日、引越し前の弊社新オフィスでRBCのMobiRubyイベントを開催します。まだ参加枠あります。ぜひ!
さて、本題。このイベント用に簡単なサンプルを作成しました。
起動するとBGMを演奏、中央にキャラクターを表示。画面をタッチすると効果音をならしてタッチ先にキャラクターがアニメーションで移動します。
再生すると音がでます。
BGMと効果音はユウラボ8bitサウンド工房のものを使用させていただいています。
ソースコード(roundnyaabe.rb)を貼ります。
samegame用のext.rbを使わせてもらっているので頭でrequireしています。
require 'ext'
def CGPointMake(x, y)
point = Cocoa::Struct::CGPoint.new
point[:x], point[:y] = x.to_f, y.to_f
return point
end
class Cocoa::MyViewController < Cocoa::UIViewController
define C::Void, :viewDidLoad do
#背景(黒)
screen_rect = Cocoa::UIScreen._mainScreen._bounds
background_view = Cocoa::UIView._alloc._initWithFrame(screen_rect)
background_view._setBackgroundColor(Cocoa::UIColor._blackColor)
self._view._addSubview(background_view)
#にゃ〜ぶ登場
@nyaabe_image_view = Cocoa::UIImageView._alloc._initWithFrame(CGRectMake(0, 0, 50, 50))
@nyaabe_image_view._setImage(Cocoa::UIImage._imageNamed(_S("nyaabe_iphone.png")))
point = Cocoa::Struct::CGPoint.new
point[:x] = (screen_rect[:size][:width] / 2).to_f
point[:y] = (screen_rect[:size][:height] / 2).to_f
@nyaabe_image_view._setCenter(point)
self._view._addSubview(@nyaabe_image_view)
end
def calcPosition(touches)
touch = touches._anyObject
location = touch._locationInView(self._view)
x = location[:x]
y = location[:y]
return [x, y]
end
define C::Void, :touchesBegan, Cocoa::Object, :withEvent, Cocoa::Object do |touches, event|
(@touchesBeganLock ||= Mutex.new).block do
x, y = calcPosition(touches)
C::call C::Void, "AudioServicesPlaySystemSound", $tap_se
p ":touchesBegan x:#{x}, y:#{y}"
nyaabe_move_to(x, y)
end
end
def nyaabe_move_to(x, y)
#アニメーション
context = C::call(C::Pointer, "UIGraphicsGetCurrentContext")
Cocoa::UIView._beginAnimations nil, :context, context
Cocoa::UIView._setAnimationDuration C::Double(0.2)
Cocoa::UIView._setAnimationCurve Cocoa::Const::UIViewAnimationCurveLinear
point = CGPointMake(x, y)
@nyaabe_image_view._setCenter(point)
Cocoa::UIView._commitAnimations
end
end
#BGM
bgm = AudioPlayer.new("sht_a05", "mp3")
bgm.loops = -1
bgm.volume = 0.25
bgm.play
#効果音初期化
soundPath = Cocoa::NSBundle._mainBundle._pathForResource _S("se_byuin"), :ofType, _S("mp3")
soundURL = Cocoa::NSURL._fileURLWithPath soundPath
$tap_se = C::Int(0)
C::call C::Void, "AudioServicesCreateSystemSoundID", soundURL, $tap_se.to_pointer
screen_rect = Cocoa::UIScreen._mainScreen._bounds
$window = Cocoa::UIWindow._alloc._initWithFrame screen_rect
$viewController = Cocoa::MyViewController._alloc._init
$window._addSubview $viewController._view
$window._makeKeyAndVisible
今日は福岡で開催されるmrubyのセミナーに参加するのでこれから福岡に移動です。
mrubyのことがわかったらMobiRubyのことがもっとわかるはず。たのしみ!






長崎ITCamp 2012
- 2012/09/17
- uchida
このブログは読みやすいようにサブタイトルをまとめてみました。
お好きなところから読むことが出来ます。
0. はじめに
1. 8時半集合だけど5時までLTの練習をする。
2. 割り箸をたてるゲーム全然だめだった・・。
3. デスマのにおいがぷんぷんする。
4. 作業開始
5. LT失敗
6. 旅館にてITCampというか修学旅行の雰囲気を感じる。
7. めちゃくちゃ美味しく感じたのり弁。
8. 色々苦労したけど堂々の2位だった!(3チーム中)
ITCampが開催されるということで、行くかどうか真剣に悩んだ結果、行ってきました。
そして、そこで思ったことや感じたことを書いていきます。(かなりゆるい感じで)
LTってやったことないけど、どや顔で話したいことでもいいということで、
私の作ったAndroidアプリ「ダイエットビューアー」を
宣伝したい気持ちになりLTすることにしました。
でも、準備をするのがなぜか嫌で嫌で仕方がなかった。
そして気づいたら何の準備もせずに午前1時になっていた。
準備を1時間でして2時に寝ることにしたが、
Webなどでスライドの参考とかLTの仕方とか、勉強に1時間を費やした。
それからスライドをパワーポイントで作って、evernoteに原稿を書いて2時間半、
午前4時半から午前5時まで声に出して時間を計ってみる。(夜中に何をやっている・・。)
完璧な準備ができて就寝する。
とりあえず、5分遅刻してしまう。汗(すいません・・。)
チーム分けが終了して、(4人で1チーム)
運営の木原さんが、「割り箸を輪ゴムでどれくらい高く積み上げれるかで、
チームワークが、どの程度かわかる。」という。
私は(図工苦手だったし、いやだな〜。)という
気持ちが少しあったせいか、チーム内では全然役に立たなかった・・。
どうやれば高く積み上げれるのか全く思いつかなかった。
2回やって、2回とも3位でチームワークが悪いのかなとちょっと思う。
(こりゃだめだ(笑))
私のチームは、私以外、全員が学生で
2人がプログラマーで、1人がデザイナー。
まず、どんなWebアプリを作るか考えるタイム。
私たちのチームは、Twitterの登録をしたものの全然使わない人たち「bocchi」を
救済するアプリを作ることにした。
「bocchi」がTwitterでつぶやいて、そのつぶやきに対して返信したら
ポイントがもらえる。
そのポイントによってユーザーのレベルがアップ!
アイコンも進化する。
これはうれしいねー!というアプリ。
そして、実際に誰がどの部分を作るか計画していくタイムになる。
デザイナーを目指す学生の人が、HTMLと素材を担当することになった。
プログラマーを目指す2人と私の3人でプログラムを担当することになったが・・。
問題発生。
2人の話を聞くと、言語としてJavaは出来るけど、
HTMLとSQLなどは使えなくて、ServletやJSPも知らないという話だった・・。
Eclipseも触ったことはない。
終わったときにみんなが満足出来るようにするにはどうしたらいいんだろう・・。
たぶん、実際にプログラムを組んでもらうのが一番満足するんだろうけど、
二日間ということと、Webアプリということを考えると、
やっぱり勉強してもらうしかなく、HTMLとSQLを勉強してもらうことにした。
(申し訳ない・・。orz・・。
プログラムだけ出来るっていう場合に、思いつく作業がなかった・・。)
しかし、出来上がっていく途中のプロジェクトなどは2人のPCに環境を作って
どういう風に動くのか、見せていくことにした。
私の作業は、実際にプロジェクトを作るのと、プログラマー2人に環境の作り方
Eclipseの使い方などを教えるのに時間を費やして焦りを感じていた。
(もうあきらめちゃおっかな〜と何度か心が折れそうになる。)
しかし、デザイン担当のメンバーは順調に素材とHTMLを作っていく。
このままでは、プレゼンのときになって、素材とHTMLは出来ました。
こんな感じに動く予定でしたー!となってしまう・・。
これはすごく残念なので、がんばってプログラミングしていく。
一日目のITCampが終了して飲み会となった。
しばらくして、LT大会が始まり私の番になった。
はじめのスライドまでは上手くいったが、
実際にエミュレーターでデモを見せるときになると、、動かない・・・。
押しても押してもエミュレーターが反応しない・・。
結局、エミュレーターを再起動して見せることに・・。
evernoteに原稿まで書いてたのに全ての手順が頭から吹っ飛んで、
結局アドリブで見せたいところを見せて終わってしまった・・。
(次回やるときはちゃんと直前に動くか試すようにしよう。)
旅館にて、ゆっくりして感じた雰囲気が、「修学旅行」。
私以外の人が全員学生でしかもほとんどが知り合いだったらしい・・。
(な、馴染めてないか!?)とか気になったが・・、
プロジェクトがデスマすぎて頭の中がそれどころじゃなかった・・。
結局、PCを出して必死で足りない分のプログラミングをする。
(どんな場面でもある程度のものが出来ないと、
気が済まないタイプなのかな〜・・。)
2日目の昼食時、運営の人たちが弁当を用意してくれていた。のり弁だった。
(なんでカツ丼にしてくれないんだよ木原さん〜〜orz・・。)
とか思って食べてみたら、めちゃくちゃ美味しかった・・。
人生でこんなにのり弁を美味しく感じたのは初めてってくらいに。
ものすごくエネルギー消費してたんだろうか・・。
デザイン担当のメンバーのHTMLと素材を、プロジェクトに組み込み。
問題点がいくつかあるもののプロジェクトは完成。
というか時間切れのため仕方なくここまでという感じ。
プレゼンタイムに入り、他のチームの人たちが、どっかんどっかん笑いを取る。
(まぁ、そういう趣旨のプレゼンでは、ないんだけど・・。)
私のチームのプレゼンも完了して、評価タイムになる。
うまい棒を投票用紙に見立てて、袋の中に入れていく投票形式。
そして結果、私のチームは堂々の2位入賞!
とりあえず、色々と無事に終わってよかった。
あと疲れた〜。
私のチームのメンバーの皆さんお疲れさまー!






OSC2012 Tokyo/Fall 終了!
ただいま羽田に移動して帰りの飛行機を待っております。まずは一安心。
ブースにお足をお運びいただいた方々、ありがとうございました。
足を止めてくださる方がすくないマイナーブースではありますが、来て下さった方々はみなさん熱心に話を聞いてくださってとても刺激になりました。
刺激といえば他のブースの方々からもいろいろと。
まず、Joe’sさんの10周年記念漫画にガツン!とやられ(ツインタワーに飛行機がー!)、
Ejectコマンドユーザー会さんの Raspberry Pi を使用した低消費電力なEjectソリューションにニヤニヤし(薄い本買いました)、
自宅ラック友の会さんのラックに感動したり諸々いろんな刺激を受けまくったり!(Tシャツ買いました。MobiRuby勉強会で着よう)
などなど。
いいイベントでした。
移動は大変ですけど(多分自宅に帰り着くのは25:30位です)。
そろそろ搭乗のようです。それでは。






観光に仕事で五島(GOTO)にいってきた話
- 2012/09/07
- uchida
1.全然上手く行かない1日目
1日目はとにかくトラブルの連続であまり上手くいきませんでした。
カーナビの仕事だったので、五島の炎天下の中、
駐車場で「ならない、ならない、ならない」の連続。
なんでならないのかその糸口もつかめない状態でしたが、
uraさんから鶴の二声が・・。(問題点を2つも発見)
助言があり、何が問題なのかがわかり、
yoshidaさんと私で夜のうちに問題点を修正し明日、再挑戦することになった。
2.飲み会
今回作っているシステムの詳しい話を聞いて、
初めてどんな規模のプロジェクトに関わっているかを知る(遅・・。)。
あと、五島では海のものがかなり新鮮な状態で食べられるらしく
色々美味しいものを食べさせてもらいました。
3.夜のプログラミング
とにかく、明日上手く行かなかったら大変なことになるため、
問題点が解決するまでコーディング、コーディング!
私のほうもyoshidaさんのほうも結構あっさり問題が解決し、
万全の準備ができて就寝。
4.上手くいった2日目
次の日は、解決策が見事に効いて、
1日目のトラブルがうそのように、全てがすんなりいき、とても嬉しかったです。
5.ギリギリだった五島観光システムが上手くいっているかをテストするためのドライビング
テストしながら、色々なポイントを回っているうちに
時間がなくなりフェリーに間に合うかどうかギリギリに・・。
そうこうしているうちに、EV車の電気がなくなりさらにギリギリに・・。
電欠ギリギリ時間ギリギリでも、
最後にはきちんと間に合って長崎まで帰れました。






OSC2012 Tokyo/Fall はじまります
ブースの準備できました。
本日14時からは弊社、峰松が
『県庁並行稼働中!OpenCOBOL汎用機ダウンサイジングでのハマりどころ』
と題しましてセミナーを行います。よろしくお願いします。
飛び入り参加大歓迎です。






DNSサーバへのANY? . な連続リクエスト対応
管理してるサーバのネットワークトラフィックが妙に高まっていてなんだコレ?と調査しておりましたら…
16:00:11.143581 IP (tos 0x0, ttl 233, id 62542, offset 0, flags [none], proto: UDP (17), length: 61) 184.154.183.56.5325 > 60.32.189.190.domain: [no cksum] 32583+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:00:11.143674 IP (tos 0x0, ttl 233, id 62543, offset 0, flags [none], proto: UDP (17), length: 61) 184.154.183.56.5325 > 60.32.189.190.domain: [no cksum] 32583+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:00:11.143738 IP (tos 0x0, ttl 233, id 62544, offset 0, flags [none], proto: UDP (17), length: 61) 184.154.183.56.5325 > 60.32.189.190.domain: [no cksum] 32583+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:00:11.143823 IP (tos 0x0, ttl 233, id 62545, offset 0, flags [none], proto: UDP (17), length: 61) 184.154.183.56.5325 > 60.32.189.190.domain: [no cksum] 32583+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:00:11.143898 IP (tos 0x0, ttl 233, id 62546, offset 0, flags [none], proto: UDP (17), length: 61) 184.154.183.56.5325 > 60.32.189.190.domain: [no cksum] 32583+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:00:11.144194 IP (tos 0x0, ttl 64, id 26513, offset 0, flags [none], proto: UDP (17), length: 56) 60.32.189.190.domain > 184.154.183.56.44493: [bad udp cksum 5296!] 22153 ServFail- q: ANY? . 0/0/1 ar: . OPT UDPsize=4096 (28)
16:00:11.144323 IP (tos 0x0, ttl 64, id 26514, offset 0, flags [none], proto: UDP (17), length: 56) 60.32.189.190.domain > 184.154.183.56.44493: [bad udp cksum 5296!] 22153 ServFail- q: ANY? . 0/0/1 ar: . OPT UDPsize=4096 (28)
16:00:11.144432 IP (tos 0x0, ttl 64, id 26515, offset 0, flags [none], proto: UDP (17), length: 56) 60.32.189.190.domain > 184.154.183.56.44493: [bad udp cksum 5296!] 22153 ServFail- q: ANY? . 0/0/1 ar: . OPT UDPsize=4096 (28)
16:00:11.144539 IP (tos 0x0, ttl 64, id 26516, offset 0, flags [none], proto: UDP (17), length: 56) 60.32.189.190.domain > 184.154.183.56.44493: [bad udp cksum 5296!] 22153 ServFail- q: ANY? . 0/0/1 ar: . OPT UDPsize=4096 (28)
おお、DNSサーバへの激しい連続request。測ったところ50回/秒以上のペースで複数箇所から投げてきてるようでした。request内容も ANY? . ということで、弊社のDNSコンテンツサーバが応答する必要がない(ので ServFailを返している)内容のようです(DNS ampなDDoSのシカケにしては、偽装された?rewuest元IPが色々と分散していて謎です)。
複数箇所から飛んでくるのはDNSサーバの運命ですからしかたないとしてServFailを返すだけでも負荷が高まりますし、帯域も多少埋まって勿体ないのでiptablesでフィルタすることにしました。
tcpdump -n -vvv -X -s1500 -i eth1
にてもう少し詳しくパケットの内容を拾ってみると。
16:22:35.827460 IP (tos 0x0, ttl 238, id 36986, offset 0, flags [none], proto: UDP (17), length: 61) 97.93.19.246.hexarc > 60.32.189.190.domain: [no cksum] 61037+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
0x0000: 4500 003d 907a 0000 ee11 cd03 615d 13f6 E..=.z......a]..
0x0010: 3c20 bdbe 1ce5 0035 0029 0000 ee6d 0100 <......5.)...m..
0x0020: 0001 0000 0000 0001 0000 ff00 0100 0029 ...............)
0x0030: 2328 0000 0000 0000 0000 0000 00 #(...........
16:22:35.944826 IP (tos 0x0, ttl 233, id 48921, offset 0, flags [none], proto: UDP (17), length: 61) 77.99.52.123.25697 > 60.32.189.190.domain: [no cksum] 6521+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
0x0000: 4500 003d bf19 0000 e911 96d9 4d63 347b E..=........Mc4{
0x0010: 3c20 bdbe 6461 0035 0029 0000 1979 0100 <...da.5.)...y..
0x0020: 0001 0000 0000 0001 0000 ff00 0100 0029 ...............)
0x0030: 2328 0000 0000 0000 0000 0000 00 #(...........
な内容でしたので、iptablesにて
iptables -t raw -I PREROUTING -p udp --destination-port 53 \
-m string --algo kmp --from 30 \
--hex-string "|010000010000000000010000ff0001000029232800000000000000000000|" \
-j DROP
とIPパケットの30byte目からのパターンに注目してhex-string形式で指定してみます。
結果:
16:40:37.686016 IP (tos 0x0, ttl 238, id 51404, offset 0, flags [none], proto: UDP (17), length: 61) 97.93.19.246.32175 > 60.32.189.190.domain: [no cksum] 15020+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:40:37.686094 IP (tos 0x0, ttl 238, id 51405, offset 0, flags [none], proto: UDP (17), length: 61) 97.93.19.246.32175 > 60.32.189.190.domain: [no cksum] 15020+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:40:37.686176 IP (tos 0x0, ttl 238, id 51406, offset 0, flags [none], proto: UDP (17), length: 61) 97.93.19.246.32175 > 60.32.189.190.domain: [no cksum] 15020+ [1au] ANY? . ar: . OPT UDPsize=9000 (33)
16:40:37.853317 IP (tos 0x0, ttl 234, id 23094, offset 0, flags [DF], proto: UDP (17), length: 69) 201.6.2.85.14604 > 60.32.189.190.domain: [udp sum ok] 11303% [1au] AAAA? ns.server.st. ar: . OPT UDPsize=4096 (41)
16:40:37.854079 IP (tos 0x0, ttl 64, id 44172, offset 0, flags [none], proto: UDP (17), length: 110) 60.32.189.190.domain > 201.6.2.85.14604: 11303*- q: AAAA? ns.server.st. 0/1/1 ns: server.st. SOA[|domain]
16:40:37.855922 IP (tos 0x0, ttl 234, id 23093, offset 0, flags [DF], proto: UDP (17), length: 69) 201.6.2.85.62860 > 60.32.189.190.domain: [udp sum ok] 15132% [1au] A? ns.server.st. ar: . OPT UDPsize=4096 (41)
16:40:37.856467 IP (tos 0x0, ttl 64, id 44173, offset 0, flags [none], proto: UDP (17), length: 143) 60.32.189.190.domain > 201.6.2.85.62860: 15132*- q: A? ns.server.st. 1/2/2 ns.server.st. A 60.32.189.190 ns: server.st.[|domain]
ServFailも返すことなく、返すべきrequestについては正しく応答を返してますね。
何事も平和が一番です(´ー`)






OS X Mountain Lion セットアップ日記 4 Bazaar激闘編
激闘なんかしたくなかった。
MacOSXDownloads – wiki.bazaar.canonical.com
最新の Stable、Snow Leopard (10.6 – Python 2.6) 2.5.0 をインストールしました。
Mountain Lion 用どころか Lion 用のインストーラーもないんだよね。
でも Bazaar Explorer を起動できたので大丈夫だと思っていた、まだ幸せだった、あの頃。
地獄変
盆休み明けにコードの編集始めようリポジトリを選択したら Bazaar Explorer がぶち落ちやがった。
$ bzr explorer
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
〜 250行位略 〜
QKqueueFileSystemWatcherEngine::addPaths: open: Too many open files
QEventDispatcherUNIXPrivate(): Unable to create thread pipe: Too many open files
QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe
zsh: abort bzr explorer
(´・ω・`)
いろいろ試してみるとターミナルから操作しても bzr-svn プラグインでエラーとなることが判明。
$ bzr log
〜 略 〜
revno: 14
committer: Junya Murabe
branch nick: trunk
timestamp: Mon 2011-05-09 19:12:41 +0900
message:
chkPassowordCharをapp_modelに移動。chkFilenameChar作成。
bzr: ERROR: exceptions.ImportError: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site-packages/subvertpy/repos.so, 2): Symbol not found: _svn_fs__path_change2_create
Referenced from: /usr/lib/libsvn_fs-1.0.dylib
Expected in: /usr/local/lib/libsvn_fs_util-1.0.dylib
in /usr/lib/libsvn_fs-1.0.dylib
Traceback (most recent call last):
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 930, in exception_to_return_code
return the_callable(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 1141, in run_bzr
ret = run(*run_argv)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 673, in run_argv_aliases
return self.run(**all_cmd_args)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 697, in run
return self._operation.run_simple(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/cleanup.py", line 136, in run_simple
self.cleanups, self.func, *args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/cleanup.py", line 166, in _do_with_cleanups
result = func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 1158, in ignore_pipe
result = func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/builtins.py", line 2895, in run
Logger(b, rqst).show(lf)
File "/Library/Python/2.6/site-packages/bzrlib/log.py", line 382, in show
self._show_body(lf)
File "/Library/Python/2.6/site-packages/bzrlib/log.py", line 412, in _show_body
lf.log_revision(lr)
File "/Library/Python/2.6/site-packages/bzrlib/log.py", line 1558, in log_revision
lines.extend(self.custom_properties(revision.rev))
File "/Library/Python/2.6/site-packages/bzrlib/log.py", line 1476, in custom_properties
lines = self._foreign_info_properties(revision)
File "/Library/Python/2.6/site-packages/bzrlib/log.py", line 1498, in _foreign_info_properties
foreign.foreign_vcs_registry.parse_revision_id(rev.revision_id)
File "/Library/Python/2.6/site-packages/bzrlib/foreign.py", line 185, in parse_revision_id
foreign_vcs = self.get(revid.split("-")[0])
File "/Library/Python/2.6/site-packages/bzrlib/registry.py", line 177, in get
return self._dict[self._get_key_or_default(key)].get_obj()
File "/Library/Python/2.6/site-packages/bzrlib/registry.py", line 74, in get_obj
self._obj = get_named_object(self._module_name, self._member_name)
File "/Library/Python/2.6/site-packages/bzrlib/pyutils.py", line 51, in get_named_object
obj = __import__(module_name, {}, {}, from_list)
File "/Library/Python/2.6/site-packages/bzrlib/plugins/svn/mapping.py", line 23, in
from subvertpy import properties
File "/Library/Python/2.6/site-packages/subvertpy/__init__.py", line 130, in
raise ImportError("Unable to load subvertpy extensions: %s" % e)
ImportError: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site-packages/subvertpy/repos.so, 2): Symbol not found: _svn_fs__path_change2_create
Referenced from: /usr/lib/libsvn_fs-1.0.dylib
Expected in: /usr/local/lib/libsvn_fs_util-1.0.dylib
in /usr/lib/libsvn_fs-1.0.dylib
bzr 2.6b2 on python 2.6.7 (Darwin-12.0.0-x86_64-i386-64bit)
arguments: ['/usr/local/bin/bzr', 'log']
plugins: bash_completion[2.6b2], bzrtools[2.5.0], changelog_merge[2.6b2],
colo[0.4.0], email[unknown], explorer[1.3.0], fastimport[0.14.0dev],
git[0.6.8], keychain[0.1.0], launchpad[2.6b2], loom[2.2.0],
netrc_credential_store[2.6b2], news_merge[2.6b2], pipeline[1.4.0],
po_merge[2.6b2], qbzr[0.23.0], rewrite[0.6.3], svn[1.2.2], upload[1.1.0],
weave_fmt[2.6b2], xmloutput[0.8.8]
encoding: 'utf-8', fsenc: 'utf-8', lang: 'ja_JP.UTF-8'
*** Bazaar has encountered an internal error. This probably indicates a
bug in Bazaar. You can help us fix it by filing a bug report at
https://bugs.launchpad.net/bzr/+filebug
including this traceback and a description of the problem.
中央リポジトリは Subversion なので死活問題。
解決編
bzr-svn
先に解決したのは bzr-svn。こいつのエラーが原因で explorer も落ちてるのかも?と思っていたので(違ったのですが)先に対処しました。
エラーメッセージを読むと subvertpy でエラーが出ています。調べると Mercurial でも Mountain Lion で Subversion 連携が動作しなくなったとの情報などありました。
JavelinDev ブログ: Mountain Lionでpython関係のライブラリが動かなくなったのを復旧した手順
bzr-svn も subvertpy でエラーが起きているので入れなおすことにしました。インストールの邪魔になるので、まず、元のファイルをどかします。消すのは怖いので mv しました。
$ sudo mv /Library/Python/2.6/site-packages/subvertpy ~/
$ sudo mv /Library/Python/2.6/site-packages/subvertpy-0.8.10-py2.6.egg-info ~/
そしてインストール。
$ sudo easy_install-2.6 subvertpy
bzr-svn 復活!
$ bzr commit
Committing to: svn+http://###.###.###.###/##/#######
modified app/controllers/jobs_controller.php
/Library/Python/2.6/site-packages/bzrlib/plugins/svn/commit.py:252: DeprecationWarning: bzrlib.revisiontree.InventoryRevisionTree._get_inventory was deprecated in version 2.5.0.
for child_name, child_ie in base_tree.inventory[file_id].children.iteritems():
/Library/Python/2.6/site-packages/bzrlib/plugins/svn/commit.py:703: DeprecationWarning: bzrlib.revisiontree.InventoryRevisionTree._get_inventory was deprecated in version 2.5.0.
return self.old_tree.inventory[file_id]
/Library/Python/2.6/site-packages/bzrlib/plugins/svn/commit.py:685: DeprecationWarning: bzrlib.revisiontree.InventoryRevisionTree._get_inventory was deprecated in version 2.5.0.
old_ie = self.old_tree.inventory[file_id]
/Library/Python/2.6/site-packages/bzrlib/plugins/svn/commit.py:303: DeprecationWarning: bzrlib.revisiontree.InventoryRevisionTree._get_inventory was deprecated in version 2.5.0.
base_tree.inventory[child_ie.file_id].parent_id != child_ie.parent_id):
/Library/Python/2.6/site-packages/bzrlib/plugins/svn/commit.py:364: DeprecationWarning: bzrlib.revisiontree.InventoryRevisionTree._get_inventory was deprecated in version 2.5.0.
base_tree.inventory[child_ie.file_id].parent_id != child_ie.parent_id):
Committed revision 83.
commit 時に非推奨ワーニング(DeprecationWarning)がでたりしてますが動作しているようです。
Bazaar Explorer
Bug #926439 “Can’t open project in GUI “Too many open files”” : Bugs : Bazaar Explorer
の #9 にあげてくださってる workaround-926439.patch で解決しました。
$ cd /Library/Python/2.6/site-packages/bzrlib/plugins/explorer
$ sudo patch -p0 -b < ~/Downloads/workaround-926439.patch
ここにたどり着くまで、長かった。
調べたりやってみたりしたけどたぶん無駄だったこと
プリインストールの Python が2.7系も入るようになったので(Lionから?)2.6系を使用している Bazaar が動かなくなるという不具合が過去に発生していたようです。コードを見たところこの不具合への対処は入っていました。
Bazaar Explorer が落ちる件、ダウンロードページに「 QT をバージョンアップしてみなよ」とか書いてあるので QT の再インストールを何通りかの方法でやってみましたが症状は変わりませんでした。結果的に Homebrew で入れた QT を使用している状態ですが今回のエラー対処には影響していないとおもいます(たぶん)。
こんな状態だと Bazaar 、オススメできないなぁ。




