スポンサーリンク

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で何となく同じ仲間の文字もヒットするようになります。

2016年10月13日木曜日

Emacs25 の package-selected-packages を何とかする

Emacs25 になって、インストールされたパッケージが package-selected-package 変数に保持されるようになりました。これはパッケージを削除する時などに依存性に矛盾が発生しないようにするために使われるようです。

パッケージを保持するだけならばいいのですが、問題は、M-x list-packages などを実行した時に、この値が init.el (まはた .emacs)の末尾に勝手に書き込まれてしまうことです。

超新星とは何か

NGC6751
NASA/The Hubble Herritage Team(STScI/AURA)

誤解されている用語

作家の星新一氏は、よく人から「星新一って逆から読むと一新星となり、いい名前ですね」と言われ、その都度、新星ってのは星が死んでいく時の最後の姿なんだけどなとボヤいている、とエッセイに書いておられました。因みに「星新一」はペンネームではなく、星氏の本名です。

最近でもよく「野球界に新星誕生」みたいな使い方をされます。そう言えば「超新星」なんていう音楽グループもいましたっけ。新星は英語で言うと Nova です(超新星は Supernova)。これもよく使われる名前です。死ぬゆく星の名前だということ認識してるのでしょうか。

新星/超新星は最も誤解されている天文用語です。

2016年10月12日水曜日

次世代の高速検索ツール ripgrep を howm で使う

高速検索ツール ripgrep

以前、howm で ag (The Silver Searcher) を使う という記事を書きました。しかし ag を使っていても、howm のメモが数千を越えるとそれなりに検索に時間がかかるものです。それに ag はバグが多いという問題もあります。

そんな時、るびきちさんのブログ 見て ripgrep なるツールがあることを知りました。

初めて ag の検索を見た時、その速度に驚いたものですが、ripgrep は更にその数倍の速度を叩き出しています。ag でもうこれ以上劇的なパフォーマンスの向上はないだろうと思い込んでいましたが、まだこれだけ改善の余地があった事には驚きです。実際に使ってみても、おっ!と思うくらい速いのが実感できます。

2016年10月7日金曜日

Emacs 25.1 で起動時に警告が

Emacs 25.1 を使ってみた

Emacs 25.1 がリリースされたので、早速使ってみました。24.5 の時の設定は、何も変更せずにほぼそのまま使えました。

一点だけ問題があり、起動時に以下の警告が出るようになってしまいました。

Warning (bytecomp): (lambda (arg) ...) quoted with ' rather than with #'

警告なので内容からしても無視してして構わないと思いますが、起動する度にこれが出るのは精神衛生上よくありません。

lambda 関数のクォートに #' ではなくて、' が使われていることに対して警告を出しているようです。

2016年9月30日金曜日

Android AppCompatActivity で openOptionsMenu() が機能しない

AppCompatActivity を使っていて openOptionsMenu() が機能しないことに気づきました。普通の Activity であれば以下のコードでメオプションニューを起動できます。

    View button = findViewById(R.id.menu_button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openOptionsMenu();
        }
    });

これが AppCompatActivity では機能しません。Google はどうもアクションバー以外からオプションメニューを起動させたくないようです。アクションバーを使用しない NoActionBar という選択肢もあるのに、それでも openOptionsMenu() は機能しません。

Activity や Fragment 上に配置したボタンからオプションメニューを起動したい場合もある筈です。なのでその方法を探してみました。

2016年9月22日木曜日

Android アプリの後方互換性と前方互換性

Android アプリの互換性

Android アプリには後方互換性(backward compatibility)と前方互換性(forward compatibility)が保証されています。

これらの互換性は build.gradle の中の以下のパラメータで制御されます。

  • compileSdkVersion
  • minSdkVersion
  • targetSdkVersion

これらは使用可能な API レベルや互換性をコントロールする重要なパラメータですが、意外にも正確なところがあまり理解されていないようです。 なのでこれらのパラメータを整理してみました。

2016年9月21日水曜日

Windows10 Anniversary Update で Genymotion が起動せず

自動更新で Windows10 Anniversary Update (Version 1607)がなかなか降ってこないので、手動で更新チェックを行なったらあっさりとダウンロードが開始されました。

更新してみて、少し触ってみた限りでは、ここ何年も迷走しているスタートメニューが少し変わったくらいで、どこが使い易くなったのかさっぱり分かりません。Edge や Cortana がアップデートされたようですが、最初から使っていないし、事前のアナウンスの割にはどうでもいい更新でした。

まあそれはそれとして、困ったことに Genymotion がまったく起動しなくなってしまいました。起動しないだけならまだいいのですが、Windows そのものがクラッシュしてしまいます。久し振りに見ました、ブルースクリーン。今こんなんなってんのね。



何か情報を収集いていますが、こんなもので物事が解決した事はありません。

2016年9月10日土曜日

Android AppCompat の闇 - カスタムスタイルの落とし穴

テーマ、スタイル、アトリビュート...

Android のテーマとスタイルは謎に包まれています。Android の闇と言っていいかも知れません。

スタイルは個々の View に適用するもので、スタイルを集めたものがテーマです。テーマは Application や Activity に適用するものです。ここまでの考え方は非常にシンプルです。
しかしソースコードの中に入るとシンプルとは程遠いものです。まずややこしいのが、このテーマとスタイル、XML 的にはどちらも同じ <style> タグで定義していること。そしてシステムの themes.xml や styles.xml、attrs.xml あたりをトレースしたことがある人なら分かると思いますが、これらのファイル、定義が定義を呼びあって、肥大化し、依存関係がスパゲッティの様に絡まりあっています。悪いデザインの見本みたいなものです。まあよくこれで秩序を保っていられるなあと逆に感心してしまいます。

ここに AppCompat 系のテーマが入ってくると更に話はややこしくなります。この AppCompat が引き起こす問題について説明したいと思います。

2016年9月5日月曜日

helm のアップデートで Emacs の起動エラーが


helm は Anything の時代から、Emacs のユーザインタフェースに革新を持たらしました。今や Emacs と helm は切っても切れない関係です。しかしそれにしても helm のアップデートの激しさは異常です。Melpa の最新版を追い掛けていると、ほぼ毎日アップデートされています。もう何が何だか、更新内容なんて追跡する気にもなれません。アップデートの激しさだけからすると、よっぽどデザインが悪いんだろうなという気がします。

これだけ頻繁にアップデートされるとやはり問題が起こるものです。最近(2016年8月のいつか)のアップデートで Emacs の起動エラーが出るようになってしまいました。原因を切り分けていくと、やはり helm でした。その時は時間もなかったこともあり、helm を少し前のバージョンに戻し、そのままにしておきました。

しかしいつまでもこのままにしておくわけにもいかなので、ちゃんと調べてみました。

Android AppCompat系テーマでのカスタム View の落とし穴

現在の Android Studio で普通にプロジェクトを作成すると、テーマとして Theme.AppCompat.Light.DarkActionBar 等が使われています。いわゆる AppCompat 系のテーマです。

Android で普通にマテリアルデザインを使おうとすると Android5.0 以上が必要ですが、さすがに Android4 以下を切り捨ててしまうのは現時点ではあまり現実的ではありません。そこで AppCompat 系のテーマが使われる訳です。AppCompat 系テーマは appcompat-v7 ライブラリに含まれていることからも分かるように、APIレベル7(Android2.1) まで遡ってマテリアルデザインを使用することができます。

しかしこの AppCompat テーマには意外な落とし穴があることを発見しました。というか自分が落とし穴に嵌まっただけですが。

2016年9月2日金曜日

Android - カスタムViewにカスタムレイアウトを適用する

ViewGroup をカスタマイズする

内部に複雑なレイアウト構造を持つ ViewGroup をカスタムクラス化すると、内部が隠蔽され、レイアウトを単純な View パーツとして扱うことができます。

TextView や Button 等の単純な View をカスタム化する方法はあらゆるところで解説されていますが、LinearLayout や FrameLayout 等の ViewGroup をカスタム化する方法はあまり見あたりません。今まで自分で試行錯誤しながらやってきましたが、自分の辿ってきた道を基に、ViewGroup をカスタマイズする方法を解説したいと思います。

2016年8月28日日曜日

小学生でも分かる相対性理論


相対性理論は難解?

20世紀の物理学の最大の成果は相対性理論と量子力学です。特にアインシュタインの相対性理論は時間の進み方が変化したり、ブラックホールという変なものを生み出してしまったりと、それまでの常識を引っくり返すような結論を導き出し、世間をあっと言わせました。難解な理論の代表とでも言える相対性理論は、専門的な勉強をした人でなければ理解できないと思っている人は多いのではないでしょうか?しかしその根底にあるアイデアは驚くほど単純なものです。

2016年8月26日金曜日

Android Studio で依存性循環に立ち向かう

依存性循環とは

漫然とプログランミングをやっていると、ついクラス間の参照(依存性)に循環が発生してしまいます。オブジェクト指向プログラミングの原則では依存性の向きは一方向であるべきであり、循環は悪しき存在とされています。循環があるとクラス間の結合が密になり、改造に対して脆弱になります。

例えば ClassA が ClassB を参照し、ClassB も ClassA を参照するとクラス間の依存性に循環が発生します。ここで両クラスが別のパッケージに属しているとパッケージ間の依存性循環にもなります。

このように二つのクラス間で相互参照が発生している場合はまだ分かり易いのですが、これが A → B → C → A の様に三つ、またはそれ以上のクラスを介して循環していると直感ではなかなか判別できません。

Android Studio にはこの依存性の循環を検出する仕組みが備わっています。この記事は IntelliJ IDEA にもそのまま適用できる内容ですが、自分のフィールドが Android Studio なので、Android Studio をベースに説明していきます。