Hatena::ブログ(Diary)

Koonies/こりゃいいな! このページをアンテナに追加 RSSフィード

2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |

2012-06-11

Koonies2012-06-11

TortoiseHgのカスタムツールバーを設定する方法

TortoiseHg 2.4.1リリースされました。で、1つ前のバージョン2.4で追加されたカスタムツールバーはどうやって設定するのかずっと気になっていましたがようやく分かったのでメモを兼ねて、書いておきます。

設定方法

[tortoisehg-tools]

# Execute a mercurial command. These _MUST_ start with "hg"

# Note that we can use any built-in TortoiseHg icon

update_to_tip.command = hg update tip

update_to_tip.tooltip = Update to tip

update_to_tip.icon = hg-update

no title

上記のように設定ファイルへ[tortoisehg-tools]という項目を追加し、それに続けてコマンドの設定を書きます。それで書けたらソフトを再起動します。

.command必須で、.tooltip.iconオプション(無くても可)ということです。ちなみに上記の引用元のサイト記述例は

誤:update_to_tip.ico = hg-update

正:update_to_tip.icon = hg-update

という風にnが抜けているためアイコンが正しく設定できていないようです。

それとアイコンの設定にはicoファイルのフルパスの他、hg-updateのように内蔵アイコンも設定可能みたいです。これ以外にも下記のアイコンが使える模様。

(右上のスクリーンショットはコレの一覧)

application-exit

document-new

edit-cut

edit-find

go-down

go-jump

go-next

go-previous

go-up

hg-annotate

hg-archive

hg-clone

hg-commit

hg-grep

hg-incoming

hg-log

hg-merge

hg-outgoing

hg-pull

hg-push

hg-qguard

hg-qpop-all

hg-qpop

hg-qpush-all

hg-qpush

hg-rename

hg-status

hg-tag

hg-update

mail-forward

process-stop

tasktab-refresh

thg-console

thg-log-load-all

thg-mq

thg-qreorder

thg-reporegistry

thg-sync

view-filter

view-refresh

さいごに

どうやって設定するんだろ、と1ヶ月もモヤモヤしてたのがスッキリしました。

よかったら参考にしてください。それでは。

2011-08-08

keyhacでクリップボード内のJavaScriptコードを整形/圧縮(JSBeautifier/SlimIt)

JavaScriptをさわってる人ならご存知の人も結構いそうなOnline JavaScript beautifier。JavaScriptコードを見やすく整形してくれるWebサービスです。

僕はブックマークレットを作る際など便利でよく使っているのですが、サイトを見てるとコマンドラインバージョンということでPythonコードでも公開されていました。探したらSlimItという圧縮する方も発見。

keyhac*1クリップボード内のテキストに対して直接実行できたら便利だろうなと書いたのが ↓ のコード。

Win+Jで整形、Win+Sift+Jで高圧縮、Win+Ctrl+Jで低圧縮、というキー配置にしています。

from keyhac import *

## 関数を返す関数にするデコレータ
def ret_func(func):
    import functools

    @functools.wraps(func)
    def _ret_func(*args, **kw):
        @functools.wraps(func)
        def __ret_func():
            return func(*args, **kw)
        return __ret_func
    return _ret_func

## JobQueue/JobItem でサブスレッド処理にするデコレータ
def job_queue(func):
    import functools

    @functools.wraps(func)
    def _job_queue(*args, **kw):

        num_items = JobQueue.defaultQueue().numItems()
        if num_items:   # 処理待ちアイテムがある場合は、その数を表示
            print u"JobQueue.defaultQueue().numItems() :", num_items

        def __job_queue_1(job_item):
            return func(*args, **kw)

        def __job_queue_2(job_item):
            # print "job_queue : ", func.__name__, args, kw
            pass

        job_item = JobItem(__job_queue_1, __job_queue_2)
        JobQueue.defaultQueue().enqueue(job_item)

    return _job_queue

## JavaScriptコードを整形
# JSBeautifier : http://jsbeautifier.org/
@job_queue
def jsbeautifier():
    import jsbeautifier
    clipboard_text = getClipboardText()
    if clipboard_text:
        js_options = jsbeautifier.default_options()

        js_options.jslint_happy = True
        new_code = jsbeautifier.beautify(clipboard_text, js_options)

        setClipboardText(new_code)
        print
        print "/*  jsbeautifier  */"
        print "// before --------------------"
        print clipboard_text
        print "// after --------------------"
        print new_code

## JavaScriptコードを圧縮
# SlimIt : http://slimit.org/
# PLY : http://www.dabeaz.com/ply/
@ret_func
@job_queue
def jsminify(mangle=False):
    import slimit
    clipboard_text = getClipboardText()
    if clipboard_text:
        new_code = slimit.minify(clipboard_text, mangle)

        setClipboardText(new_code)
        print
        print "/*  SlimIt (mangle=%s)  */" % mangle
        print "// before --------------------", len(clipboard_text), "byte"
        print clipboard_text
        print "// after --------------------", len(new_code), "byte"
        print new_code

def configure(keymap):

    keymap_global = keymap.defineWindowKeymap()

    # JavaScriptコードを整形
    keymap_global["W-j"] = jsbeautifier

    # JavaScriptコードを圧縮(高圧縮)
    keymap_global["W-S-j"] = jsminify(mangle=True)

    # JavaScriptコードを圧縮(低圧縮)
    keymap_global["W-C-j"] = jsminify(mangle=False)

ライブラリインストール

・JSBeautifier

https://github.com/einars/js-beautify/raw/master/python/jsbeautifier.py

↑ のファイルをkeyhacのextensionフォルダコピーする。

・SlimItとPLY(コード解析)

https://github.com/rspivak/slimit

圧縮ファイルをダウンロードし、圧縮ファイルのsrcフォルダ下にslimitをフォルダごとkeyhacのextensionフォルダへコピーする。

http://www.dabeaz.com/ply/

圧縮ファイルをダウンロードし、圧縮ファイルのplyをフォルダごとkeyhacのextensionフォルダへコピーする。

■ さいごに

ブックマークレットをよく書くという方は特に便利だと思うので、よかったら使ってみてください。

■ 参考リンク

*1Autohotkeyみたいなフリーソフトで、Pythonコードで色んなソフトショートカットキーを設定できる

2011-07-31

keyhacのPythonスクリプトにも便利なデコレータ

引き続き、keyhacネタ。keyhacPythonでスクリプト(設定ファイル)を記述するのでもちろんデコレータも使えます。デコレータの説明はdecorator.htmlが分かりやすかったので、こちらを見ていただくとして早速コードの紹介。

■ 処理時間計測

上記のサイトで紹介されていたのをちょこっといじったのが、最初に紹介する処理時間計測をするデコレータ。

・デコレータ
from keyhac import *

## 処理時間計測のデコレータ
def profile(func):
    import functools

    @functools.wraps(func)
    def _profile(*args, **kw):
        import time
        timer = time.clock
        t0 = timer()
        ret = func(*args, **kw)
        print '%s: %.3f [ms] elapsed' % (func.__name__, 1000 * (timer() - t0))
        return ret
    return _profile

↑ をconfig.pyの先頭で定義しておく。そして、以下のように測りたい関数の直前に@profileを挿入する。

・使用サンプル
def configure(keymap):

    ## メモ帳を起動
    @profile
    def exe_notepad():
        shellExecute( None, None, "notepad.exe", u"", u"" )

    keymap_global = keymap.defineWindowKeymap()
    keymap_global["W-n"] = exe_notepad

するとこの関数が実行されたとき(=Win+Nが押されたとき)にkeyhacのコンソール画面に以下のような情報が出力されるという仕掛け。

exe_notepad: 352.611 [ms] elapsed

新しく関数を追加するときなどに、こうした方が処理は速くなるかな?ってときにお手軽に時間計測できます。機能は地味だけどとても便利。

■ サブスレッド処理

つぎはサブスレッド化ってやつを簡単にするデコレータ。処理に時間がかかる関数は、サブスレッド処理で実行することが推奨されているようです。

・デコレータ
from keyhac import *

## JobQueue/JobItem でサブスレッド処理にするデコレータ
def job_queue(func):
    import functools

    @functools.wraps(func)
    def _job_queue(*args, **kw):

        num_items = JobQueue.defaultQueue().numItems()
        if num_items:   # 処理待ちアイテムがある場合は、その数を表示
            print u"JobQueue.defaultQueue().numItems() :", num_items

        def __job_queue_1(job_item):
            return func(*args, **kw)

        def __job_queue_2(job_item):
            # print "job_queue : ", func.__name__, args, kw
            pass

        job_item = JobItem(__job_queue_1, __job_queue_2)
        JobQueue.defaultQueue().enqueue(job_item)

    return _job_queue
・使用サンプル

メモ帳起動関数をサブスレッド処理化。(関数定義の前に@job_queueを付ける)

    @job_queue
    def exe_notepad():
        shellExecute( None, None, "notepad.exe", u"", u"" )

もし ↑ をデコレータ使わずに書いたら ↓ になる。

    def exe_notepad():
        def _exe_notepad_1(job_item):
            shellExecute( None, None, "notepad.exe", u"", u"" )

        def _exe_notepad_2(job_item):
            pass

        job_item = JobItem(_exe_notepad_1, _exe_notepad_2)
        JobQueue.defaultQueue().enqueue(job_item)

1つ2つなら良いが、毎回この処理を書くのが面倒になってきて、デコレータを使うようにしたらすごく楽チンになった。

■ キー定義

3つ目はキー定義。このキーが押されたらこの関数の実行するというのを関数定義と一緒に行う。

・デコレータ
from keyhac import *

## キー定義用デコレータ
def def_key(window_keymap, key):
    def _def_key(func):
        window_keymap[key] = func
    return _def_key
・使用サンプル

このデコレータは、@def_key(ウィンドウキーマップ, キー表記文字列) という風に使う。

def configure(keymap):

    keymap_global = keymap.defineWindowKeymap()

    ## メモ帳を起動
    @def_key(keymap_global, "W-n")  # Win + N
    def exe_notepad():
        shellExecute( None, None, "notepad.exe", u"", u"" )

これは以下のコードと同等になる。

def configure(keymap):

    ## メモ帳を起動
    def exe_notepad():
        shellExecute( None, None, "notepad.exe", u"", u"" )

    keymap_global = keymap.defineWindowKeymap()
    keymap_global["W-n"] = exe_notepad  # Win + N

このデコレータではコード記述量は減らないが、関数定義とキーへの紐付けを同時にできるのでコードがシンプルで分かりやすくなる。

■ 関数を返す

4つ目は関数を返す関数にするデコレータ。引数をともなう関数をキー割り当てするときには、関数を返す関数にする必要がある。それが面倒になって作ったのがこのデコレータ。

・デコレータ
from keyhac import *

## 関数を返す関数にするデコレータ
def ret_func(func):
    import functools

    @functools.wraps(func)
    def _ret_func(*args, **kw):
        @functools.wraps(func)
        def __ret_func():
            return func(*args, **kw)
        return __ret_func
    return _ret_func
・使用サンプル

関数定義の前に@ret_funcを挿入する。

def configure(keymap):

    # 引数のパスを起動する
    @ret_func
    def exe_sub(path):
        shellExecute( None, None, path, u"", u"" )

    keymap_global = keymap.defineWindowKeymap()
    keymap_global["W-n"] = exe_sub("notepad.exe")

これは以下のコードと同等になる。

def configure(keymap):

    # 引数のパスを起動する(デコレータ無し版)
    def exe_sub(path):
        def _exe_sub():
            shellExecute( None, None, path, u"", u"" )
        return _exe_sub

    keymap_global = keymap.defineWindowKeymap()
    keymap_global["W-n"] = exe_sub("notepad.exe")

■ さいごに

とりあえずこんなところで。デコレータおもしろい。というかPythonおもしろいです。また何かあったら追加しときます。

追記(2011.08.02)

■ キー定義(別パターン)

3つ目のキー定義の亜種。このサイトの@addtoを使ってwindow_keymapを呼び出し可能にしてしまう。上で書いたやつよりシンプルでいいかもしれない。

・デコレータ
from keyhac import *

# http://wiki.python.org/moin/PythonDecoratorLibrary#Easy_adding_methods_to_a_class_instance
def addto(instance):
    def decorator(f):
        import types
        f = types.MethodType(f, instance, instance.__class__)
        setattr(instance, f.func_name, f)
        return f
    return decorator

def configure(keymap):

    def define_window_keymap(*args, **kw):
        window_keymap = keymap.defineWindowKeymap(*args, **kw)
        print args, kw

        @addto(window_keymap)
        def __call__(self, key):
            def def_key(func):
                self[key] = func
            return def_key

        return window_keymap
・使用サンプル
    # keymap.defineWindowKeymap の代わりに define_window_keymap を使う
    keymap_global = define_window_keymap()

    # 通常どおりのキー設定も可能
    keymap_global["S-C-w"] = "LWin"

    # デコレータにもなる
    @keymap_global("W-n")
    def exe_notepad():
        shellExecute( None, None, "notepad.exe", u"", u"" )

■ 参考リンク

2010-10-02

お手軽便利な!Chromeでライブブックマークな拡張「Foxish Live RSS」

FirefoxにあってGoogle Chromeにないもの、それはRSSのネイティブサポート

FirefoxではRSSフィードを自動検出し、これをユーザーが登録するとブックマークバーからBlog等の新着記事を開くことができるようになります。

これをライブブックマーク機能と言います。(要はRSSリーダー、詳しくはコチラ

これをGoogle Chromeでも再現できちゃうエクステンションが、今回紹介するFoxish Live RSS。以下、導入方法です。

1.まずは「Foxish Live RSS」のダウンロード

Foxish live RSS - Google Chrome 拡張機能ギャラリー20101002183737

上記サイトに行き、「インストール」 ボタンを押し、続くダイアログでもインストールボタンを押します。

2.ライブブックマーク用のブックマークフォルダの作成(省略可)

ブックマークマネージャーまたは、ブックマークバー上で右クリックの「フォルダの追加...」で、「RSS」という名前のブックマークフォルダを作ります。(場所はドコでもOK)

20101002191235

3.RSSフィードの登録

ではRSS登録のサンプルとして、このホームページで試してみます。

20101002205955

  • 次に「RSS 2.0」をクリックすると、以下ような画面が表示されます。

20101002205954

  • ここで登録するフォルダを選択します。「Parent Folder」から先ほど作成した「RSS」を選択し、「Subscribeボタン」をクリック
  • 以上で、登録は完了で、5分ほど待てばRSSで取得した新着の記事が設定したフォルダに登録されます。
★ さいごに

じつはこの間までRSS Live Linksという同様の機能を持った拡張を使っていたのですが、2日前のDev版アップデート後はエラーで使えなくなってしまいました。

とりあえずこの拡張無しでいいかと最初は思ったのですが、無くなるとすごく不便なことに気付きこの拡張に行き着いた次第です。

導入も簡単ですし、一度試されてみては?

追記:「chrome ライブブックマーク」でGoogle 検索してみると、いきなりこの記事が2番目に表示されています。ChromeユーザーはGoogleリーダー使っているから、ライブブックマーク必要ないんですかね??

謎だ。

関連記事


便利!Chromeでライブブックマーク再現のExtension「RSS Live Links」

2010-05-18

amazon.deで注文したボードゲームが無事届いた!

amazon.deってのはドイツのアマゾン。海外のオンラインショッピングというのは今回が初めてだったので、届くまでは本当に無事来るんだろうか??とかなりドキドキでしたが、注文から8日で難なく到着

日本のamazonは普段から愛用していますが、ドイツのamazonもなかなかGood!のようです。

そもそもamazon.deを使おうと思ったのは、先月買ったカルカソンヌというボードゲームがきっかけ。

このゲームはamazon.co.jpにて3200円で購入しました。初のボードゲーム体験でしたが、噂どおり大変面白くて買って良かったなと大満足だったのですが、このゲームはamazon.deなら12.98ユーロという半額に満たないくらいの値段で売っていることを後になって知りました。

じゃあamazon.deでレパートリーを増やそうってことで、ドイツアマゾンでボードゲームを買う!を参考にしながら、今回注文したのが次の7個のボードゲーム。

上から小さめ4個と大きめ3個のゲームです。

★ amazon.deはメチャ安!

ボードゲームをamazon.deで買うメリットは次の3点が挙げられます。

・商品が安い

・VATという消費税(14%)が日本からの注文だと課税されない

送料14ユーロ固定

当然ながらドイツで買えばルールなども基本ドイツ語。その点については注意が必要なんですが、探せば翻訳されたルール等も公開されているので物によってはドイツ語版でも問題なく十分遊べます。

それとamazon.deでは送料が14ユーロ固定(1ユーロ=120円で1680円)です。これを安いと思うか、高いと思うかは人それぞれだとは思いますが、そのかわり商品代金には14%のVATがかかりません。

なのでトータルで税込み100ユーロ分買っちゃえばVATで送料を相殺できちゃうってことです。

★ 梱包はへぼい!

有名な話みたいですが、amazon.deから来る荷物はあまり丁寧に梱包されていません。これを承知の上で今回注文したので、更にドキドキ倍増。そして到着した段ボールの写真がコチラ。

20100519072115

角からは中が見えてます。税関対策なんだろうか?とも考えられますが、お世辞にでも頑丈とは言えません。

で、開けてみるとほとんど無傷で一安心。

ドイツゲームの箱って結構頑丈な作りなんですね、やわやわ段ボールでも今回は大丈夫だったようです。(*チケット to ライド メルクリンの箱に若干の凹みを発見。ただ遊ぶのには全く支障なし。)

ついでに集合写真。想像してたより箱デカいな!どこに片付けようか。

20100519072116

前述のとおり100ユーロを目標にして、2人でも遊べる評判の良いものを中心にセレクトしていたんですが、あれも面白そう、これも面白そう、てな感じになってすぐに100ユーロという目標は崩れ去りました。

最終的な購入価格は送料込みで119.79ユーロ。この「どれにしようかな〜」と選ぶ作業自体もなかなか楽しかったです。(ゴールデンウィーク中のかなりの時間をこれに費やしました)

そんな取捨選択の作業で一番参考になったのがこのページ。

ボードゲームランド BoardGameLand

管理人のカバレロさんや他の方のレビューに加え、ゲームごとに別のサイトでのレビューページにリンクが貼ってあってすっごくお世話になりました。ありがとうカバレロさん。

そしてこの日の夜、早速嫁さんと「ロスバンディッド」で遊んでみました。ルールを見るだけだと何が楽しいんだろって感じなんですが、ゲーム終盤は熱い!正解です。いやぁ買って良かった。amazon.deバンザイ!!

★ さいごに

ただいま空前の円高・ユーロ安ですし、ボードゲームに興味がある方は一度amazon.deをのぞいてみてはいかがでしょうか。


■ 参考リンク

→ Google Chrome用の翻訳エクステンション。独→英翻訳でチンプンカンプンのドイツ語もこれで問題なしでした。ページ移動なしに即翻訳なので決済画面のようなログインが必要な画面も翻訳が可能なスグレモノ。

→ amazon.deで買い物するなら結構便利だとおもう。

→ ゲームのオリジナルタイトル(原題)や言語依存度など調べられます。

→ レビュー豊富。リンクも豊富。

→ 注文後買っておけば良かったと後悔したアイテム、3.98ユーロで買えるカードホルダー。

2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |
日記の検索

ads
最近のコメント
etc
あわせて読みたいブログパーツ