keyhac

Macsierraにアップグレードしたらkarabinerが使えなくなったので、かわりにkeyhacを試してみる。

keyhacはkarabinerとちがって、コントロールキーとコマンドキーを交換という定義ができず、常に

keymap["Ctrl-a"] = "Cmd-a"

というふうにメインキーとの組み合わせで定義しなければならないもよう。これは非常の多くの組み合わせがあり、かつ複数のアプリケーションで定義したいので、いちいち全部をconfig.pyに書くのはつらい。そこでメソッド化。

def changeKey(keymap):
keymap["Ctrl-a"] = "Cmd-a"
keymap["Ctrl-c"] = "Cmd-c"
keymap["Ctrl-d"] = "Cmd-d"
keymap["Ctrl-f"] = "Cmd-f"
keymap["Ctrl-p"] = "Cmd-p"
keymap["Ctrl-q"] = "Cmd-q"
keymap["Ctrl-r"] = "Cmd-r"
keymap["Ctrl-s"] = "Cmd-s"
keymap["Ctrl-t"] = "Cmd-t"
keymap["Ctrl-v"] = "Cmd-v"
keymap["Ctrl-w"] = "Cmd-w"
keymap["Ctrl-x"] = "Cmd-x"
keymap["Ctrl-z"] = "Cmd-z"
return keymap

を作り、

    keymap_chrome = keymap.defineWindowKeymap(app_name="com.google.Chrome")
keymap_chrome = changeKey(keymap_chrome)

で呼び出すようにする。

sshセッションのタイムアウトを防止する

最近AWSを使うことが多くなって、EC2のインスタンスsshで接続して作業するが、なにかというとタイムアウトするので不便。ちょっと調べたら

  • サーバの/etc/ssh/sshd_configに

    ClientAliveInterval 60

    を設定する
  • ~/.ssh/configに

    ServerAliveInterval 60

    を設定する

のいずれかでタイムアウトしなくなるらしい。

EntityManager#createNativeQueryで一部のデータを取り出すとき

EJBのEntityManagerでテーブルをselectしてそのテーブルのエンティティを返すのは普通にやることだが、group byしてキーだけ取り出したい、などのときは以下のようにObjectの配列のリストとして扱う。

    val keys = em.createNativeQuery("select t1.key1, t1.key2, t1.key3 " + 
"from T1 t1 " +
"group by t1.key1, t1.key2, t1.key3 " +
.getResultList().asInstanceOf[java.util.List[Array[Object]]]
var result = List[fooPK]()
keys.foreach(k => result :+= new fooPK(k(0).toString, k(1).toString.toInt, k(2).toString.toInt))

pythonで正規表現を使った結果の判定

pythonで文字列に数字が含まれているかどうかを判定したいとき、

import re
def hantei(v):
return re.search(\d, v)
とすると、re.search()がBooleanではなく、re.MatchObjectを返すので使えない。こういうときは、
    return re.search(\d, v) is not None
とするとすっきり。

オブジェクトの値をコピーする

case class Foo(key:Int, key2:String, key3:Int)
のクラスからオブジェクトを生成し、それを他のオブジェクトにコピーしたいとき、scalaではcopyメソッドが使える。
val foo = Foo(100, "test", 200)

val zoo = foo.copy(key = 300)

とすると、keyは300がセットされ、他の値は元のオブジェクトからコピーされる。ただし、この機能はcaseクラスのみで、コピーされる対象は()内のプロパティのみ。
case class Foo(key:Int) {
var v1:String =_
var v2:Int = _
}
だと、v1, v2はコピーされない。

となると、caseクラスのプロパティはすべて()内に書いちゃうほうがいいのかな。キーになる項目だけ(equalsで比較の対象となるべきものだけ)を定義するものだと思っていたんだけど。

scalaでxmlのCDATAを扱う

普通に

val naiyo = あいうえお x < y
var nodes = Queue.empty[Node]
nodes :+= {naiyo}

みたいなことを書くと、

x < y

に変換されてしまう。これをしないように、CDATAを使うには

{scala.xml.PCData(naiyo)}

とすればよい。

KarabinerでEclipseのキーバインドを変更

eclipse-4.4を使ってみる。Cntl+SPACEでいつものように補完をさせようとするとしなくなった。調べると、Karaibnerがeclipse-4.2と4.4を別に識別しているらしい。~/Library/Application Support/Karabiner/private.xmlを修正する。eclipse-4.2はなにもしないでECLIPSEとして認識されていたが、4.4は

  
ECLIPSE_LUNA
org.eclipse.platform.ide
を定義して、
    
Swap Control-Space and Command-Space
ECLIPSE
private.chrome.swap_controlSpace_and_commandSpace
--KeyToKey-- KeyCode::SPACE, VK_CONTROL, KeyCode::SPACE, VK_COMMAND
--KeyToKey-- KeyCode::SPACE, VK_COMMAND, KeyCode::SPACE, VK_CONTROL
    
Swap Control-Space and Command-Space
ECLIPSE, ECLIPSE_LUNA
private.chrome.swap_controlSpace_and_commandSpace
--KeyToKey-- KeyCode::SPACE, VK_CONTROL, KeyCode::SPACE, VK_COMMAND
--KeyToKey-- KeyCode::SPACE, VK_COMMAND, KeyCode::SPACE, VK_CONTROL
とするとキーバインドを変更できる。