スポンサーリンク

2016年12月2日金曜日

続・ howm + ripgrep のちょっとした問題

前回 howm + ripgrep を使う上で発生する問題を考えました。
http://extra-vision.blogspot.jp/2016/11/howm-ripgrep.html

要約すると、ripgrep はマルチスレッドで並列検索を行なうため、howm-menu の「最近のメモ」の順番が狂ってしまう。-j1オプションを付けるととりあえずは回避できるが、シングルスレッド検索になるので、ripgrep の高速性を活かせない、というものでした。

まあ致命的な問題でもないし、それ以外の検索では ripgrep は十分速いので、最初は無視していたのですが、しかしどうにも気持ち悪いので何とかしてみました。

2016年11月30日水曜日

howm + ripgrep のちょっとした問題

少し前に howm で ripgrep を使う記事を書きました。
http://extra-vision.blogspot.jp/2016/10/ripgrep-howm.html

しかし使い初めてすぐに気付いたのですが、howm-menu に表示されるメモの順番がおかしくなるのです。

通常 howm-menu はメモファイルのタイムスタンプでソートし、最後に更新したメモ(の見出し)を一番上に表示してくれます。これがどうにもちゃんと順番が揃いません。更に howm-menu を表示する毎に、メモの順番が少しずつ変わます。

最初は何が起こっているのかさっぱり分かりませんでした。そこで読めない elisp を苦労してトレースしてみると、howm 自身はファイルのソートを正しく行ない、そのファイルリストを ripgrep に引数として渡しています。しかし ripgrep の出力結果が引数の順番通りになっていないのです。

2016年11月27日日曜日

Kotlin の正規表現を使う

Kotlin を使い始めても色々な点で未だ Java 的なコーディングから抜けきれません。正規表現もそんな一つです。こんなことじゃいけないと思い、Kotlin の正規表現検索をちゃんと勉強すべく、色々情報をを探し回ったのですが、意外なことにまとまった情報が見つかりません。断片的な解説ページはいくつか有りますが、ちゃんと体系立って説明したものが見つからないのです。日本語、英語どちらにもです。

なので試行錯誤的に使い込んで分かってきたことを整理しておきます。

2016年11月25日金曜日

Emacs のマニア度を判定する方法

Emacs で C-t を使うかどうかで習熟度が分かると言われています。キーストロークを節約するために C-t を使っている人は相当なハードユーザーです。

通常 C-t は transpose-chars というコマンドにバインドされていて、これは前後の二文字を入れ替えます。文字を入れ替えるタイプミスをしてしまった場合、C-t で修正する人は相当 Emacs を使い込んでいる人です。

2016年11月24日木曜日

Android でテキストをブリンクさせる

意外なことに Android にはテキストをブリンクさせる機能がありません。

なのでアニメーションを使ってブリンクさせる例をよく見かけます。例えばこんな感じ。

        Animation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(1000L);
        animation.setRepeatMode(Animation.REVERSE);
        animation.setRepeatCount(Animation.INFINITE);

        View textView = findViewById(R.id.text_view);
        textView.startAnimation(animation);

Android 3.0 以降であれば ObjectAnimator を使って、以下でもよいでしょう。

        View textView = findViewById(R.id.text_view);
        ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "alpha", 0.0f, 1.0f);
        animator.setDuration(1000L);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animator.start();

しかしアニメーションを使う方法は値を連続的に変化させるのでCPUに負荷がかかり、ブリンクさせている間中ずっとこの負荷がかかり続けます。この点がどうも気になります。

2016年11月18日金曜日

Kotlin の let(), apply(), run(), with() を使いこなす

始めに

Kotlin の標準ライブラリの中に let(), apply(), run(), with() という一連の関数があります。これらは Standard.kt という数十行の短かいソースコードの中で、それぞれ一行で定義されています。

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
public inline fun <R> run(block: () -> R): R = block()

これを一目見て理解できる人は相当な強者です。初心者にとっては宇宙語を読んでいるようで、まず理解できないでしょう。

これらの関数はその定義のシンプルさとは裏腹に強力なパワーを秘めています。これらが使いこなせるようになると、Kotlin の表現力がぐっと増します。

どの関数も引数に関数オブジェクトをとり、あるクラスインスタンスに対してその関数オブジェクトを適用する、という基本機能を持っています。しかしそれぞれ実装が違うため、使い方が微妙に異なります。

2016年10月31日月曜日

Emacs 25.1 の isearch のちょっとした改良点

Emacs 25.1 もだんだん手に馴染んできました。24からあまり大きな変化は見られないというのが正直な感想ですが、細かいこところで地味な改良があるのを時々発見します。

isearch にもちょっとした改良が行なわれていました。以下の設定を init.el に追加します。

(setq search-default-mode #'char-fold-to-regexp)

こうしておくと、例えば isearch (C-s) で "(ダブルクォーテーション文字)を検索した場合、«» や ❝❞ 等の、非ASCIIで何となく同じ仲間の文字もヒットするようになります。