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 |

2011-08-09

keyhacでカラーピッカー(画面上の任意の場所から色コード取得)

20110808232618現在はまっているkeyhac*1Win+Cを押すとマウスカーソル位置の色コードを取得し、クリップボードコピーするようにしてみました。

■ コード

from keyhac import *

def configure(keymap):

    ## バルーンヘルプ(ツールチップ)を指定の位置に開く
    #
    # keyhac_keymap.py / popBalloon() を流用
    #
    def pop_balloon(name, text, timeout=None, pos=None):
        if pos == None:
            # オフセット量
            OFFSET_X = 0
            OFFSET_Y = -20

            # マウスカーソルの位置を取得
            pos_x, pos_y = pyauto.Input.getCursorPos()
            pos_x += OFFSET_X
            pos_y += OFFSET_Y
        else:
            pos_x, pos_y = pos

        keymap.balloon.setText(pos_x, pos_y, text)

        if keymap.balloon_timer:
            keymap.killTimer(keymap.balloon_timer)
            keymap.balloon_timer = None

        if timeout:
            def onTimerCloseBalloon():
                keymap.closeBalloon(name)
            keymap.balloon_timer = onTimerCloseBalloon
            keymap.setTimer(keymap.balloon_timer, timeout)

        keymap.balloon_name = name

    ## カーソル位置のRGB情報取得
    def color_picker():
        root = pyauto.Window.getDesktop()
        img = root.getImage()

        width, height = img.getSize()
        x, y = pyauto.Input.getCursorPos()

        if not (0 <= x < width and 0 <= y < height):
            rgb = u"範囲外"
        else:
            start = (width * y + x) * 3
            buf = img.getBuffer()[start:start + 3]
            r, g, b = [ord(c) for c in buf]

            if 0:  # 10進表記
                rgb = u"(%d,%d,%d)" % (r, g, b)
            else:  # 16進表記
                hex_24_bit = lambda val: u"#%06X" % val
                rgb = hex_24_bit((0x10000 * r) + (0x100 * g) + b)

        pop_balloon("color_picker", rgb, 1500)
        setClipboardText(rgb)
        print rgb

    keymap_global = keymap.defineWindowKeymap()

    # カーソル位置のRGB情報取得
    keymap_global["W-c"] = color_picker

■ さいごに

カーソル位置の色を取得するAutoHotkeyスクリプト - Hail2uに触発され書いてみました。このリンク先とは違って取得するカラーコードは16進表記になっています。もし10進表記の方がよければコードの中の「if 0:」を「if 1:」へ変更してからお使い下さい。

■ 参考リンク

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

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-06-18

PCで音楽再生中に一時停止し、ちょっとしたら自動再開させる方法

ゴールデンウィークあたりからkeyhacというソフトでのカスタマイズにハマっています。

これで何ができるかというと、ソフトの名前(キーハック)のとおりいろんなソフトのショートカットキーをハックできてしまうのです。

ショートカットキーといえばCtrl+CのコピーとかCtrl+Vの貼り付けが有名どころですが、これらのキーと同じようなやつをユーザー側で定義して、勝手にショートカットキーを後付けしてしまおうというソフトな訳です。

で、その定義方法はLL言語Python記述するようになっています。これが良い。すごく良い。

Pythonはまだ始めたばかり(条件文や関数のあとの:をしょっちゅう忘れるくらい)ですが、基本的にシンプル言語なので書いてて楽しい。この処理よく使うな、よし定義だ、みたいな。

で、前置きが長くなったんですが、「Windows Media Playerとかで音楽再生中に一時停止し、5分したら自動再開させる」という「Alt+Shift+P」で実行させるためのスクリプト

from keyhac import *

def configure(keymap):

    def music_pause_and_play():

        def job_music_pause_and_play(job_item):
            import time
            keymap.command_InputKey("(%d)" % VK_MEDIA_PLAY_PAUSE)()
            time.sleep(5 * 60)  # [sec]
            keymap.command_InputKey("(%d)" % VK_MEDIA_PLAY_PAUSE)()

        job_item = JobItem(job_music_pause_and_play)
        JobQueue.defaultQueue().enqueue(job_item)

    keymap_global = keymap.defineWindowKeymap()
    keymap_global["Alt-Shift-P"] = music_pause_and_play

ちなみに

            keymap.command_InputKey("(%d)" % VK_MEDIA_PLAY_PAUSE)()

の部分は、以下のように書き換えても同様に動作します。(多分 ↓ こっちの方が処理は軽い)

            pyauto.Input.send([pyauto.Key(VK_MEDIA_PLAY_PAUSE)])

なお、上記のスクリプトは、『no title』でAutoHotkey*1を使った方法として紹介されていてナルホドな〜、と思ったのでkeyhacでもやってみました。

PCで音楽を聴いているところに電話がかかってきたときに便利ですね。

(とっさにAlt+Shift+Pは個人的にはちょっと押しにくい気もするけど)

そんな訳でkeyhacおすすめです。WindowsユーザーでPythonに興味のある方は是非。また何か思いついたら書きたいと思います。

*1keyhacと同様のショートカットキー定義ソフト、こっちの方が有名だが独自言語に馴染めなかった

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
あわせて読みたいブログパーツ