CLIでファイルとかディレクトリを選択するツールを Go で書いた

fod というツールを Go で書いてみました。 ちみちみと書いてきて、思いの外の苦労もありましたが、コンセプトを示しつつそこそこドッグフーディング的に使えるようになってきた気がするので、GitHub で公開しました。 インストール方法やリファレンス的な事は GitHub ページの README をご覧ください。このポストでは、READMEには書かなかった補足的な雑文を書いてみようと思います。

github.com

何奴?

GUIで良くある「ファイルを開く」ダイアログみたいなことをCLIでやります。 対話的にディレクトリやファイルを選択して、そのパスを標準出力に送ります。 このツール単体では特別な意味はほとんどありません。ls や cd、rm といった、ディレクトリやファイルのパスを引数にとるコマンドと組み合わせて使うことを想定しています。 もしかしたら同じことをするアプリがありそうですが、もしご存知の方がいらっしゃいましたら、@kandayasu までお知らせ下さい。

mv $(fod)

どこかで見た気がするのですが、パーソナルコンピューティングでは、ディレクトリの移動やファイルの検索(アプリケーション的な意味ではなくて、人間が行う動作として)が操作時間の7割を占めるとか。つまり、ファイルやディレクトリの選択を効率よく、かつミスなく行えるようにすることは作業効率の向上に寄与します。 実際に、これらの操作を素早く行うためのツールやUIというのは、実に多様な手法とアプリケーションが存在しています。

なぜ作った?

たとえば、peco/peco とか junegunn/fzf というツールがあります。 fod もこれらとノリが近いと思うのですが、これらはフィルタであったりファインダと銘うたれていています。 fod はこれらと違い、File Open Dialog の名が示すとおり「ファイルを開く」ダイアログの挙動をCLIに逆輸入(?)することを目的としました。

逆に、選択する以外のことは一切行わないのがコンセプトのようなものになっています。 細かくいうと、一つのことを上手くやる小さいアプリケーションとして機能する、他のツールとの柔軟な連携を可能とする、複雑すぎる設定やオプションの指定をできるだけ省く、などといったところです。

おまちしております

もし興味があって使ってみてくださるという方は、ぜひ感想などをお寄せ下さい。 PR もどうぞ。

rthornton128/goncurses をインストールしようとして苦労した話

Abstract

表題のとおり、Go 言語で ncurses バインディングであるところの rthrnton128/goncurses を使おうとしてインストールに苦労した話し。 最後には(肯定的な理由で)nsf/termbox-go を使う事にしたのですが、ネタとして供養したいので書いてみます。

goncurses がインストールできない

環境は OS X + Homebew 0.9.5 + Go 1.4.2 です。 goncurses のインストールのためには、まず ncurses と、pkg-config をインストールする必要があるっぽい。 というわけでインストールします。

$ brew install ncurses pkg-config
...

続いて gonucurses をインストールしようとするも、これが通りません。 pkg-config でなんだかかんだか言われているみたいです。

$ go get github.com/rthornton128/goncurses
...
# pkg-config --cflags ncurses form menu ncurses ncurses panel
Package ncurses was not found in the pkg-config search path.
Perhaps you should add the directory containing `ncurses.pc'
to the PKG_CONFIG_PATH environment variable
No package 'ncurses' found
...

どうやら goncurses が想定している ncurses のインストール後の状態と、Homebrew によって作られた ncurses インストール後の状態がうまくかみ合わないみたいです。 具体的には goncurses が参照する pkg-config の .pc ファイルに相当するものが、Homebrew からは作られないみたいです。

Homebrew ncurses の .pc ファイルとして次のようなものを生成します。 見た感じ、w とプリフィックスされていて、マルチバイト対応されたバージョンをインストールしているのでしょうか? goncurses は w プリフィクス付きでないものを想定しているようで、ここで食い違いが発生しています。

  • /usr/local/opt/ncurses/lib/pkgconfig/formw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/menuw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/ncurses++w.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/ncursesw.pc
  • /usr/local/opt/ncurses/lib/pkgconfig/panelw.pc

解決策として

作っていたプログラムのリポジトリに、goncurses に対応するための .pc ファイルを用意しました。 用意したファイルは次のとおりです。

pkg-config がこれを参照できるように、環境変数 PKG_CONFIG_PATH を設定します。 シェルの設定ファイルに、こんな感じで追加することにしました。

export PKG_CONFIG_PATH=path/to/repo/pkg-config-files:$PKG_CONFIG_PATH

これで元の goncurses にむやみに手をいれたり、Homebrew の中身を荒らす事無く goncurses がインストールできるようになりました。 この対応を行うにあたり、次の記事が参考になりました(というかほぼそのままです)

なぜ nsf/termbox-go に乗り換えたの?

まず一つに、こんなことがあったので ncurses に依存するのは筋が悪いかなと思い、Pure Go termbox implementation をうたっている termbox-go を選びました。 移植性に優れるという Go の良さをスポイルする選択はしたくないよな、というところです。

二つ目に、作りたいツールが比較的シンプルなコンセプトだったというものがあります。 そもそも両者の目指す方向性は異なるのでしょうが、ncurses とくらべて termbox は良く言えばシンプル、悪く言えば貧弱な印象があります。 しかし、貧弱といえども、作りたいものに合うプリミティブさを持ったライブラリを選択するのが良いと考えた結果となります。

C88にいってきたのん

リピートはみてません

C88三日目にサークル参加してまいりました。 新刊20部弱程度の頒布予定数でしたが、無事全てハケました。 ありがとうございました。 How To Implement Extend Squirrel Interpreterはまたもや頒布しきれませんでした。

遅刻

起床したら8時・・・サークル入場締め切りが9時なので遅刻確定。 とりま会場に向かい、着いたのは9時をやや過ぎたくらい。

ダメもとでサークル入場入り口まで行ったらそのまま並ばされて、開催時刻と同時に入場。 つまり、一般入場の先頭グループと同程度の扱いという事になります。 「次はちゃんと来てね」ぐらいの注意がスタッフから降ってきました。 申し訳ない。

いやーこんな仕組みになってるんですね。アピールとか申込書セットみてもそれと思しき記載が見つけられなかったので、正直焦りました。 そこから参加受付、見本誌提出なんかやるわけですが、焦りからか見本誌票を表紙1に貼り付けてしまい、ここでも注意をうける。 表紙2か表紙4に貼れとのこと。 申し訳ない。

無事10時30分くらいには出展準備が整ってあとはいつも通りです。 そんなこんなで、今回はいろいろ無様で全方位的に迷惑をかけまくってしまい、なんとも反省の絶えないコミケとなりました。

C89

C89も申し込みをしていますが、これでやっと状況が落ち着いた感じです。 夏から冬はスケジュール的に辛みがあるけど、冬の方が気候的にラクなんで今度は冬に行きたいですね。

C88

C88参加します。 日曜日東O49b、サークル名「ちくわおでん」にてお待ちしております。 ちくわ成分だけを残して前回からサークル名変えておりますのでよろしくお願いいたします。

コミケはC87は当選しなかったので、C86以来の参加です。 ものっそい汗っかきなので、できれば冬の当選がよかったけれどもなぜ夏当選が連続するんじゃい!

新刊情報

f:id:kandayasu:20150804034003p:plain

  • Goでラーメン二郎WEB APIサーバ
  • B5版
  • 表紙カラー, 本文モノクロ
  • 36P(本文 + 表紙)
  • 頒布価格 500JPY

Go初心者のおれがGoで簡単なWebAPIサーバを作ってみようという内容になります。 二郎とうたっておきながら二郎成分はほぼ表紙のみという表紙詐欺っぽさがウリの一冊です。

これにあわせてC86で頒布しきれなかった既刊のHow To Implement Extend Squirrel Interpreter も小々持ち込む予定です。

SONY SBH-50


f:id:kandayasu:20141112224635j:image

 
遊んでた回線を解約しに行ったら、ポイントが溜まってるから適当な商品を選んで持ってけと言うので SONY SBH-50 をもらってきた。
 
ぼくは普段から歩きながら音楽やラジオ、ポッドキャストといった音声メディアを聞くことはなかったけど(ケーブルをひょろひょろさせているのが不格好だなあと思って、むしろ避けてたといってもいいかもしれない)、せっかくもらったのだし、ものは試しという具合にここ最近持ち歩いてみている。
 
ボタンは誤爆しやすいし、イヤホン付けるからケーブルが結局うっとうしいし、付属の電源ケーブルは短いしイヤホンはむしろ付けないでほしいレベルだったりするけど、最近増えた通勤での電車の乗車時間の良い暇つぶしの道具になりつつある感じ。

C86の感想とか書こうと思ってたら二週間くらい過ぎそうになってた

夏コミ(C86)書こうと思ってたら、すでに二週間がすぎそうになってました。 サークルにお越しいただいた方々、ありがとうございました。 備忘録も兼ねて、少し思ったことというか知見的なやつをポストしておこうかと。

ペーパーと電子版

今回は電子版も用意したので、その宣伝をと思ってペーパーを若干部数持っていきました。 これが少し裏目にでて、電子版もあるって説明すると「そっちが良い」といって、現物が出ない事態に。

結果として需要を食い合うような形になってしまって、失敗した感じ。 ちなみに電子版はこちらになります。

表紙はキャッチーに

今回の新刊の表紙は英語のタイトルに動物を使ったものでしたが、これが良くなかったように思います。 チラ見はするけど、手に取って見てくれる人が C85 と比べて明らかに少なかった。 特にタイトルは、パッと見で概要が伝わりやすいよう、日本語にするのが良さそう。

あとイーゼル持っていったけどこれは裏目だったかも。 遠巻きには視認しやすいかもしれないけど、逆にスペースに近づいてくれなくなるので声かけはしづらい。

島の外周部(?)という配置位置

島の外周部、といって合っているかどうかわかりませんが、壁に接する島側に位置されると人の流れが速い。速いとサックリとスルーしていく人が多くなる。 C85 は島中に配置されたので、人詰まりが起こりやすい反面、自然とじっくり見てくれる人が多くなるという状態になっていた気がします。

C87 も申し込みしましたが、新しいネタが決まっていません。 冬までは期間が短いので、小さくても瞬発力のあるネタがいいと思ってますが、なにか面白そうなのはないでしょうかねえ。

C86追加情報

sqe リポジトリを公開しました

C86にて頒布予定の「How To Implement Extend Squirrel Interpreter」に関連するリポジトリを公開しました。 ソースコードと、ビルドから簡単なテストまでを行える仮想化 Ubuntu 環境を構築するための Vagrant 設定ファイルなどが同梱されています。

電子データ版の配付について

今回からPDFフォーマットでの電子データ版の配付も試しに始めています。 Gumroad ってのを使ってみていますが、使い方がいまいちよくわかったいません。

リンクをクリックすれば Gumroad のサイトに飛んで、そこから支払いなどができたりするはず。 TeX〜の方は、Pre-order でないプロダクトとして登録してしまったので、リンク先にとんでもだめかも。 C86 の開催にあわせて手動で公開しようと思います。