TIL

Today I Learned. 知ったこと、学んだことを書いていく

has_focus(value)で渡したUIControl(Window)にフォーカスがあるか確認する - Python

指定したコントロールにフォーカスがあるかどうか

prompt_toolkit.layout.layout.Layout.has_focus()で確認できる

has_focus(value)

Check whether the given control has the focus.
:param value: UIControl or Window instance.

Reference — prompt_toolkit 2.0.6 documentation

WindowUIControlを渡す

使い方としてはキーバインディング

@kb.add('o')
def _(event):
    logger.debug(event.app.layout.has_focus(left_window))

って感じにする

まず、キーが押された時に、現在起動中のApplicationlayoutを取得する

こんなApplicationだったばあい

from prompt_toolkit.application import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.buffer import Buffer
from prompt_toolkit.layout.containers import VSplit, Window
from prompt_toolkit.layout.controls import BufferControl
from prompt_toolkit.document import Document
from prompt_toolkit.key_binding.bindings.focus import focus_next, focus_previous
from prompt_toolkit.keys import Keys

from logging import getLogger, config
config.fileConfig("logger.conf")
logger = getLogger(__name__)


def get_text():
    return '\n'.join([chr(i) for i in range(65, 65+26)] * 3)


left_window = Window(BufferControl(Buffer(document=Document(get_text(), cursor_position=0), read_only=True)))
right_window = Window(BufferControl(Buffer(document=Document(get_text(), cursor_position=0), read_only=True)))
split_line = Window(width=1, char='|')

body = VSplit([
    left_window,
    split_line,
    right_window
    ])

# キーバインディング
kb = KeyBindings()
kb.add(Keys.Tab)(focus_next)
kb.add(Keys.BackTab)(focus_previous)


@kb.add('q')
def _(event):
    event.app.exit()


@kb.add('o')
def _(event):
    logger.debug(event.app.layout)


app = Application(
        layout=Layout(body),
        key_bindings=kb,
        full_screen=True)

app.run()

出力されるのは、

2018-11-02 07:39:37:DEBUG Layout(<prompt_toolkit.layout.containers.VSplit object 
at 0x1017b5be0>, current_window=Window(content=<BufferControl buffer=<Buffer
(name='', text='A\nB\nC\nD\nE\nF\n...') at 4319711808> at 4319711640>))

event.app.layoutでApplication()のコンストラクタのlayoutに指定した参照が取得できる。

指定のウィンドウにフォーカスがあるか調べる

左側のウィンドウにフォーカスがあるかどうかはLayout.has_focus()left_windowを渡せばいい

@kb.add('o')
def _(event):
    logger.debug(event.app.layout.has_focus(left_window))

左側にフォーカスがある時にoを押すとTrue、右側にあるときはFalse

基本的には、ウィンドウとかはインスタンスを変数に入れておけば良いのかな

このhas_focus()を使えば、特定のウィンドウにフォーカスがあるときのみ、キーバインドを実行するとかできるのかな?
fillterとか使えそう...?


logger.confは以下の通り

;ロガーを使用するときには以下のように記述する
;from logging import getLogger, config
;config.fileConfig("logger.conf")
;_logger = getLogger(__name__)

[loggers]
keys=root

[handlers]
keys=fileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=fileHandler

[handler_fileHandler]
class=FileHandler
level=DEBUG
; ハンドラで使用するフォーマッタを指定
formatter=simpleFormatter
; FileHandlerのコンストラクタへの引数
args=("log.log", "a+")

[formatter_simpleFormatter]
format=%(asctime)s:%(levelname)s %(message)s
; 時間の表示形式を設定
datefmt=%Y-%m-%d %H:%M:%S

参考文献

vimっぽいページスクロール(c-dとc-u)をpython-prompt-toolkitで実装 - Python

python-prompt-toolkitを使って、ページのスクロールを実装したからメモメモ

以下の2つだけとりあえず、実装してみる

https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/prompt_toolkit/key_binding/bindings/page_navigation.py#L48-L65

    handle('c-d')(scroll_half_page_down)
    handle('c-u')(scroll_half_page_up)

prompt_toolkit.key_binding.bindings.scrollscroll_half_page_downscroll_half_page_upの2つだ!

from prompt_toolkit.application import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.buffer import Buffer
from prompt_toolkit.layout.containers import Window
from prompt_toolkit.layout.controls import BufferControl
from prompt_toolkit.document import Document
# これ
from prompt_toolkit.key_binding.bindings.scroll import scroll_half_page_down, scroll_half_page_up


def get_text():
    return '\n'.join([chr(i) for i in range(65, 65+26)] * 3)


body = Window(BufferControl(Buffer(document=Document(get_text(), cursor_position=0), read_only=True)))

# キーバインディング
kb = KeyBindings()
# これ
kb.add('c-d')(scroll_half_page_down)
kb.add('c-u')(scroll_half_page_up)


@kb.add('q')
def _(event):
    event.app.exit()


app = Application(
        layout=Layout(body),
        key_bindings=kb,
        full_screen=True)

app.run()

できた!!!!!!!

c-dで半分下にスクロール、c-uで半分上にスクロール!!


できなかったやーつ

prompt_toolkit.key_binding.bindings.page_navigationload_vi_page_navigation_bindingsっていうのがあった

試してみる

以下のようにして、実行したら、c-dで半分下に移動ができなかった...
ただ呼ぶだけじゃだめなのかな?

from prompt_toolkit.application import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.buffer import Buffer
from prompt_toolkit.layout.containers import Window
from prompt_toolkit.layout.controls import BufferControl
from prompt_toolkit.document import Document
from prompt_toolkit.key_binding.bindings.page_navigation import load_vi_page_navigation_bindings


def get_text():
    return '\n'.join([chr(i) for i in range(65, 65+26)] * 3)


body = Window(BufferControl(Buffer(document=Document(get_text(), cursor_position=0), read_only=True)))

# キーバインディング
kb = KeyBindings()
load_vi_page_navigation_bindings()


@kb.add('q')
def _(event):
    event.app.exit()


app = Application(
        layout=Layout(body),
        key_bindings=kb,
        full_screen=True)

app.run()

ソースを見ると、ConditionalKeyBindingsインスタンスを返してるから、それをなんかするのかも?

https://github.com/prompt-toolkit/python-prompt-toolkit/blob/master/prompt_toolkit/key_binding/bindings/page_navigation.py#L48-L65

def load_vi_page_navigation_bindings():
    """
    Key bindings, for scrolling up and down through pages.
    This are separate bindings, because GNU readline doesn't have them.
    """
    key_bindings = KeyBindings()
    handle = key_bindings.add

    handle('c-f')(scroll_forward)
    handle('c-b')(scroll_backward)
    handle('c-d')(scroll_half_page_down)
    handle('c-u')(scroll_half_page_up)
    handle('c-e')(scroll_one_line_down)
    handle('c-y')(scroll_one_line_up)
    handle('pagedown')(scroll_page_down)
    handle('pageup')(scroll_page_up)

    return ConditionalKeyBindings(key_bindings, vi_mode)

prompt_toolkit.key_binding.key_bindings.ContiditionalKeyBindings

viモードのときにしか聞かないのかな?

選択値とは別の値をテキストボックスのvalueに設定する - JQuery

github.com

devbridge/JQuery-Autocompleteを使って、Autocompleteを実装したときのメモ

onSelectを使う

suggestionsが以下のようになっていた場合

suggestions: {[
    {
        value: "山田太郎 20歳",
        data: {
            name: "山田太郎",
            age: "20"
        }
    },
    {
        value: "山田次郎 18歳",
        data: {
            name: "山田次郎",
            age: "18"
        }
    }
]}

やりたいのは「山田太郎 20歳」を選択時、テキストボックスのvalueに「山田太郎」をセットすること

$(function() {
  $('.autocomplete-horse-name').autocomplete({
    serviceUrl: '/api/v1.0/person',
    dataType: 'json',
    transformResult: function(response) {
      return {
        suggestions: $.map(response, function (item) {
          return {value: item.name + " " + item.age + "歳", data: item};
        })
      }
    },
    onSelect: function(suggestion) {
      this.value = suggestion.data.name;
    }
  })
});

onSelectで選択したときに呼ばれる処理を記述できるため、それを使う。

suggestionが選択した項目のデータ、thisが入力中のHTMLElementとなっているため、こんな感じで書ける。

参考文献

ghqとpecoとhubを使ったリポジトリの管理

リポジトリをダウンロードして、見たりするときとかいいのかも

ずっとやろうって思ってたのをやっとできたから、メモメモ

それぞれをインストールする

ghq

go get github.com/motemen/ghq

peco

go get github.com/peco/peco/cmd/peco

hub

go get github.com/github/hub

エイリアスの設定

~/.bashrcに以下を追加

alias gcd='cd $(ghq root)/$(ghq list | peco)'
alias gh='hub browse $(ghq list | peco | cut -d "/" -f 2,3)'

gcdして、検索して矢印キーで移動して、Enterでカレントディレクトリをそれに変更する
ghして、検索して矢印キーで移動して、EnterでGitHubでそれを開く

ghqの使い方

ghq get {リポジトリのURL}

ghq get https://github.com/requests/requests.git

~/.ghq/github.com/requests/requestsにダウンロードされる

その他のコマンドの説明はmotemen/ghq: Remote repository management made easyで確認する

また、~/.gitconfigに以下を追加することで、ダウンロード先を変えることもできる(デフォルトでは~/.ghqにダウンロードされる)

[ghq]
    root = ~/src/repos

参考文献

PipenvでImportError: cannot import name 'get_installed_distributions'ってエラー出た

pipenvのgraphしたらエラーが出たから、その時の対処のメモと言うか、いらないと思うけど、メモっとく

$ pipenv graph
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/pipdeptree.py", line 17, in <module>
    from pip._internal import get_installed_distributions
ImportError: cannot import name 'get_installed_distributions'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/pipenv/cli.py", line 922, in graph
    do_graph(bare=bare, json=json, json_tree=json_tree, reverse=reverse)
  File "/usr/local/lib/python3.6/site-packages/pipenv/core.py", line 2363, in do_graph
    import pipdeptree
  File "/usr/local/lib/python3.6/site-packages/pipenv/vendor/pipdeptree.py", line 20, in <module>
    from pip import get_installed_distributions, FrozenRequirement
ImportError: cannot import name 'get_installed_distributions'

ここに書いてあった

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pipenv

でできた

参考文献

TNSLSNR.EXEの停止

JavaのWebプロジェクトを起動しようとしたら、8080のポートが使われてた。8080のポートを使っているプロセスを特定、停止までの道のり。


8080を使っているPIDをみつける

netstat -ao | find "8080"
... ... ... 4312

PID4312のプロセス名を取得する

tasklist | find "123"

TNSLSNR.exe

TNSLSNRってなに

Oracleのなんかのソフトらしい

TNSLSNR.exeを停止

管理者権限のコマンドプロンプトで以下を実行

> lsnrctl

LSNRCTL for 64-bit Windows: Version 11.2.0.2.0 - Production on 12-10-2018 14:40:30

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> stop
(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))に接続中
コマンドは正常に終了しました。
LSNRCTL> exit

8080が使えるようになった!!

参考文献