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

keyhacからcomtypes経由でExcelマクロ関数をコールする

前回に引き続き、keyhacネタkeyhacPythonコードWindowsショートカットキーをカスタマイズできるフリーソフト。バージョン1.34からcomtypesが使用できるようになった。

このおかげでWScriptでやれていたことがkeyhacでもできるようになった。下記コードのようにすればExcel側で定義している自作マクロ関数も呼び出せる。

from keyhac import *


def configure(keymap):

    def personal_xls(macro_name, *args):
        def _job_1(job_item):
            import comtypes.client
            xl = comtypes.client.GetActiveObject("Excel.Application")

            is_older_than_2007 = lambda: float(xl.Version) < 12
            if is_older_than_2007():
                book_name = "PERSONAL.XLS"
            else:
                book_name = "PERSONAL.XLSB"

            xl.Run(book_name + "!" + macro_name, *args)

        def _job_2(job_item):
            # print macro_name, args
            pass

        job_item = JobItem(_job_1, _job_2)
        JobQueue.defaultQueue().enqueue(job_item)

    # Excel用キーマップ
    keymap_excel = keymap.defineWindowKeymap(exe_name=u"EXCEL.EXE")
    # ボタンを大きくするマクロ
    keymap_excel["C-S-b"] = lambda: personal_xls("SwitchLargeButtons")
    # 引数付きの関数もコール可能!
    keymap_excel["C-S-m"] = lambda: personal_xls("Macro1", u"abcde.")
    keymap_excel["C-S-n"] = lambda: personal_xls("Macro1", u"あいうえお!")

一応Excel2003も2007も動くようにしている。

それとSwitchLargeButtonsは前に書いたやつ → 一発でエクセルのボタンをビッグサイズに切り替えるマクロ

ちなみにこのコードではJobQueueを使っているが、これを使わずに直に関数コールするとエラーにになってしまう。

ERROR : _onKeyDown failed
[Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。
Traceback (most recent call last):
  File "keyhac_keymap.pyo", line 804, in _onKeyDown
  File "keyhac_keymap.pyo", line 728, in _keyAction
  File "C:\Program Files\craftware\keyhac\config.py", line 1764, in <lambda>
  File "C:\Program Files\craftware\keyhac\config.py", line 1747, in personal_xls
  File "comtypes\client\__init__.pyo", line 180, in GetActiveObject
  File "comtypes\__init__.pyo", line 1165, in GetActiveObject
  File "_ctypes/callproc.c", line 936, in GetResult
WindowsError: [Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。

Excelは無理なのかなと色々試してたら一応動いた。結果オーライ。ますますkeyhacが便利になったなー。

■ 参考リンク

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と同様のショートカットキー定義ソフト、こっちの方が有名だが独自言語に馴染めなかった

2011-01-20

サクサク軽快な!EijiroX(英辞郎のchrome拡張)を秀丸から使う!

英辞郎ってご存じですか?スペースアルク(http://www.alc.co.jp/)でも公開されている英和・和英辞書です。

オンラインなら無料で検索できてスゴイ便利。

だけどオフラインの環境でプログラムを書いたりすることが多くて、いちいちネットに繋がっている端末まで移動して、検索するというのが面倒になりAmazonで英辞郎 第五版を購入しました。

これで移動せずに検索できるようになり、便利になったな〜と思っていました。つい先日までは

でも↓の動画を見て衝撃を受けたのです!(10秒目あたりから注目)

D

なんじゃ!この圧倒的なスピードは!!!

これは是非とも使いたい!と、オフライン環境なのでGoogle Chromeも入っていなかったのでここからchromeの完全版インストーラダウンロードし、ブラウザで英辞郎を検索する EijiroX - by edvakf in hatenaを参考にしながら拡張とTEXTのコンバートを実行しました。(TEXTコンバートは5回ほど失敗したが、タスクマネージャでchromeの優先度を高に変更したら無事変換できた)

これって便利だけど、さらにテキストエディタに連動させると更に良いのでは?と思って書いたのが今回紹介するマクロです。

★ セットアップ

1.次のブロックを「EijiroX.MAC」と名前を付けて保存する。

    //  chrome.exeのパス設定(\→\\と変えること!)
    $chrome_path = "C:\\Users\\(ユーザ名)\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe";
    
    if (selecting == 0) {
        //  入力ダイアログ
        $search_word = input("検索文字を入力(日本語はNG)", "word");
    } else {
        //  選択文字列の文字列取り込み
        $search_word = gettext(seltopx, seltopy, selendx, selendy, 1);
    }
    
    //  EijiroX起動
    run "\""
      + $chrome_path
      + "\" --app=\"chrome-extension://incofakicgjnjoggkkepbldklfocgafh/public_html/index.html#query="
      + $search_word
      + "\"";

(注意)2行目のchromeのパスは要変更!!!

2.マクロを登録

秀丸メニュー>マクロマクロ登録を選択

 タイトル:EijiroX

 ファイル名:(1で保存したファイルを選ぶ)

20110120004924

3.右クリックメニューに登録

秀丸メニュー>その他メニュー編集ユーザーメニュータブを選択

 メニュー:選択中右ボタン で、[追加]ボタンを押して

 コマンド:メニュー/マクロを選び、マクロ1:EijiroXを選択したら[追加]ボタンを押す

 最後に[OK]ボタン

20110120004925

以上で、セットアップは完了。

これで秀丸で、文字列を選択状態で右クリックすればEijiroXという項目が追加されているハズです。

20110120004926

↓で、EijiroXをクリックすると、スッとEijiroXが起動&サッと検索されます!

20110120004734

※この記事を書いている環境では、コンバートしてないので検索は出来ない(^^;

と、まあこんな感じです。ちなみに↑のマクロでは英語しか検索できません。多分日本語は渡すときにエンコードしなきゃダメなんだと思うんですがとりあえず英語が検索できればいいかなと。

(追記ここから)アプリケーションショートカットモードを使わなければ日本語もOKみたいです。日本語対応にしたい場合は下記のように修正してください。

      + "\" --app=\"chrome-extension://incofakicgjnjoggkkepbldklfocgafh/public_html/index.html#query="

 ↓こう変えるとOK!(--app= を取る)

      + "\" \"chrome-extension://incofakicgjnjoggkkepbldklfocgafh/public_html/index.html#query="

(追記ここまで)

ちなみに秀丸以外のエディタでも他アプリが起動できるマクロが搭載されていれば同様の処理で起動できるハズです。

そんな訳でEijiroXサイコーですので、是非使ってみては?

¥ 2,500
Amazonで詳細を見る by AmaGrea

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