Path.Combine() で死亡

難しいこと気にせず、指定した文字列を "\" でつなげてくれる「お手軽深いパス生成器」と思っていたのですーがー

var path = Path.Combine(@"c:\foo", @"\kashira")
// path == "\kashira"

あー ('A`)

言われてみれば「ですよねー」っていう。 頭に "\" ついてたらカレントドライブ直下からの絶対パス的な扱いですもんねーっていう。



投げる値はちゃんと面倒見ないとアカンすなぁ…

System::Call がDLL内の関数を呼んでくれなくて死亡

System::Call '$INSTDIR\Kanaria::Kashira(i, i) i($HWNDPARENT, 0).r0 ? u'

こんな記述だと、インストールパスに丸カッコ "()" が含まれている場合、DLL内関数呼び出しに失敗します。 $INSTDIR 内に展開されるカッコでパースが上手くできないからでしょう。 爆発しろ!

以下で対応可能です

# ↓SetCurrentDirectory()
SetOutPath "$INSTDIR"

# ↓カレントにある Kanaria.dll を読み込む == 相対DLL読み込み
System::Call 'Kanaria::Kashira(i, i) i($HWNDPARENT, 0).r0 ? u'

64bit環境でデフォルトのインストール先が C:\Program Files (x86) だったりするので、結構ワナにはまりやすいですHAHAHA!!!! 爆発しろ!


tweepy の Cursor を使うと AttributeError で切腹なさる

Traceback (most recent call last):
  File "foo.py", line 48, in 
    test()
  File "foo.py", line 33, in test
    for status in tweepy.Cursor(api.user_timeline).items(50) :
  File "tweepy\cursor.py", line 181, in next
    self.current_page = self.page_iterator.next()
  File "tweepy\cursor.py", line 101, in next
    old_parser = self.method.__self__.parser
AttributeError: 'function' object has no attribute '__self__'

AttributeError: 'function' object has no attribute '__self__' ってなんだよお前ぇええ!! 何で見つからないんよぉぉぉ!!! ('A`)

tweepy version 2.3 / python 2.6.6 です

解決方法

  1. tweepy に含まれる "binder.py" を開きます
  2. ファイル最後の return の前を、下にあるソースのようにちょぃと編集します。
  3. DogDay の Blu-ray を Amazon で発注します
  4. Enjoy!!
    # Set pagination mode
    if 'cursor' in APIMethod.allowed_param:
        _call.pagination_mode = 'cursor'
    elif 'max_id' in APIMethod.allowed_param and \
                    'since_id' in APIMethod.allowed_param:
        _call.pagination_mode = 'id'
    elif 'page' in APIMethod.allowed_param:
        _call.pagination_mode = 'page'
    _call.__self__ = config['api']  # **** !! append !! **** #

    return _call

原因

"function" なオブジェクトに "__self__" な属性が居ない事が原因です。 まんまじゃねか! トン!

……すいません(ぉ



落ちてるところの "self.method.__self__.parser"self.method は、APIクラス内のメソッドが代入されます。 user_timeline とか search とか。 で、この関数オブジェクトに __self__ が無いわけですが、api.user_timeline とかやりゃ、'api'というインスタンス付で関数オブジェクト取れるんちゃうのー? …と思ってしまう所ですが、このメソッドは実のところプロパティで return bind_api(...) を返してる。 build_api() は、builder.pydef _call(*args, **kwargs) の関数オブジェクトを返してる。 _call() 関数内関数なので self なんて持つわけがない。 俺の関数がこんなに self を持たないわけがない!

→ return するまでに call の __self__ プロパティを作成、'api' のインスタンス設定してあげました。



おわり


python通な人ではないので、正しく解決方法かは分からぬですが*1、まぁ俺ローカルでは動いたから、まぁいいかなって…(ぉ

おまけ

DogDays' (ダッシュ) ってのもあるよ!

DOG DAYS´ 1(完全生産限定版) [Blu-ray]
アニプレックス (2012-09-26)
売り上げランキング: 42,736

*1:特に __self__ を自前で代入とか良いんだろうか…

Picasa3のエクスポートがJPEG強制なので元ファイルがPNGだとうっへり気分になるのをなんとかした

Picasa3 で画像を管理して、最近ぷよクエのキャプチャ画像も管理するようにしました。

やりたいこと

多くの画像の中から必要な画像を選び、そのファイルを別フォルダにコピーしたい

発生した問題

blog更新用にとウン百枚とある中から必要な画像を選択 → エクスポートして必要な画像をコピーしたのですが、出力フォーマットが JPEG強制なんですよね…。 元ファイルはiPad/AndroidPNGなキャプチャ画像なので、無駄な劣化は避けたいところであります


http://ir9.jp/hd14/0714_00.png
↑必要な画像ファイルを条件で抽出してエクスポート

http://ir9.jp/hd14/0714_01.png
JPEGじゃないですかヤダー!

http://ir9.jp/hd14/0714_02.png
↑管理元ファイルはPNG



代案を考えてみはするのですが…

うーむ…?


対応方法

結局こうしました

  1. JPEGでもいいので、いったん必要なファイルを出力
  2. コマンドプロンプトを開いて出力したフォルダに移動
  3. そして、おもむろにコマンドを叩く…
>for /f "usebackq delims=" %f in (`dir /b *.jpg`) do copy 元ファイルのディレクトリパス\%~nf.png .

↑意訳:出力された JPEG 一覧のファイル名を列挙して、対応するPNGファイルを元フォルダからコピーしてくる




 手 動 対 応 (ドンッ!





……どうにかなりませんかねぇ…(苦笑 orz



Picasa は画像管理ツールじゃなくて「写真管理ツール」なんだなぁと強く実感した事例でありました。 コスプレ写真管理する用途じゃ満足してるんだけどなー

「Service not enabled: 'receive-pack'」と言いやがってコミットできない

※以下、かなり例外的な事項な気がしてるので、まずは他のサイト見た方が良いと思います^^;

http-backend で公開しているリポジトリに push すると 403 が帰ってきて、apache さんの errorログに 「Service not enabled: 'receive-pack'」 と残ります。 git config receivepack true もしたのに……

私の環境での解 - その1

リポジトリの構成が怪しい状態でした。 こんな感じ……………… なんで branches とか config とか諸々ダブってるの!?

-- .git
-- HEAD
-- branches
-- config
-- description
-- hg2git-heads
-- hg2git-mapping
-- hg2git-marks
-- hg2git-state
-- hooks
-- applypatch-msg.sample
-- commit-msg.sample
-- post-update.sample
-- pre-applypatch.sample
-- pre-commit.sample
-- pre-rebase.sample
-- prepare-commit-msg.sample
`-- update.sample
-- info
-- exclude
`-- refs
-- logs
`-- refs
`-- heads
`-- master
-- objects
-- info
`-- packs
`-- pack
-- pack-8b5641ffa110db925c030900466b920c3bb6c892.idx
`-- pack-8b5641ffa110db925c030900466b920c3bb6c892.pack
`-- refs
-- heads
`-- master
`-- tags
`-- b1
-- HEAD
-- branches
-- config
-- description
-- hooks
-- applypatch-msg.sample
-- commit-msg.sample
-- post-update
-- pre-applypatch.sample
-- pre-commit.sample
-- pre-rebase.sample
-- prepare-commit-msg.sample
`-- update.sample
-- info
`-- exclude
-- objects
-- info
`-- pack
`-- refs |-- heads `-- tags

.git にある方の諸々を1コ上の階層の所に持ってくるという非常に危険な力業をした後に、再度 git config http.receivepack true した所、push 出来るようになりました。

私の環境での解 - その2

/configには receivepack = true 書いてあったけど、.git/config には書いて無かったので、.git/config へ手動で以下を追記したところ、(上記のダブってるディレクトリ構成のままで)push に成功しました。

[http]
	receivepack = true

…どっちが正解なのかはワシには解らん………!

ってか、ディレクトリ構成がダブるとか、おいら何をやらかしたのだろう… orz

「libcurl-4.dll が無ぇよ!」と言われる

解決方法

msysgit を上書きせずに、消してから最新版を入れてみた所動作するようになりました。

理由

私のケースで 且つ 「おそらく」 の情報になりますが…

msysgit の古いバージョン(具体的なバージョン番号は不明すまぬ) から、1.9.2 に上書きインストールした後、gitを利用したところ「DLLが無いんだけど!死ねよ!」と言われ始めたものと思われます。

これは、古いバージョンには含まれているけど、1.9.2 には含まれていない git-http-push.exe が libcurl-4.dll を参照していたため……すなわち、git-http-push.exe が更新されずに古いままだったからですね。


…まぁ、それだったら、libcurl-4.dll だって消えずに残ってるハズなんじゃねぇの!? …と言われると、確かにそうなのですが、ドライブ中全てを検索してもそんな DLL は存在せず。 うーむ…



…というわけで、本当の真相は "えいえんのせかい" に吹っ飛んでしまいましたが^^;、少なくとも 再インストール したら動作するようになったのは間違いないです。 ……とはいいつつ、私の場合公式HPから直接ダウンロードできるものではなく、有志の方が作った git-http-push.exe 入りのインストーラーを利用した形ではありますけどもももも^^;

「git: 'http-push' is not a git command.」なんてヘソを曲げる

msysgit 1.9.2 (preview20140411) で、WebDavで構築した自鯖のgitリポジトリサーバーに push しようとしたら、"http-push なんで無ぇーよ。アホか。糞か。死ねよそれと便座カバー" と怒られました…

解決方法

次の google グループ ディスカッション内の下の方にあるファイルを利用すれば解決しました。ありがとう Erik Faye-Lund さん!

原因

Git\libexec\git-coregit-http-push.exe が無いからそうな。

古いバージョンにあったのに、新しいバージョンで無くなってる理由は不明。なにかあるのかも知れない。