argius note

プログラミング関連

Potaufeu v1.0.0 をリリースしました

自作のソフトをリリースしました。
バージョン1.0.0の正式版です。


これは何ですか?

Javaで書いたコマンドラインユーティリティーで、findみたいな動作をします。
Java8以降のJREが必要です


GitHubに公開しています。

GitHubWikiページにユーザーガイドを掲載しています。

インストー

コマンドで自動インストールできるようにしました。
自動インストールには、Bashなどのシェル環境と、curlunzipコマンドが必要です。

もっとも短いコマンドは、

$ curl -L j.mp/instpotf | sh

です。
無駄な出力を出したくない場合は、curlのオプションを-fsSLにすると良いです。

とは言っても、野良ソフトをいきなりインストールするのは怖いと思うので、curl -L j.mp/instpotf -o install.shでインストースクリプトをいったんダウンロードして確認してみてください。

このコマンドのURLは、https://raw.githubusercontent.com/argius/potaufeu/master/install.sh短縮URLです。


自動インストールについては、Mac(OS X, macOS)、いくつかのLinuxディストリビューションWindowsの場合はCygwinBash on Ubuntu on Windowsで動作確認しています。MinGW(Git Bashを含む)は、最小限の環境のため対応を見送っています。1

本体はJavaアプリなので、自動インストールに対応していない環境でも、基本的にはJavaが動作する環境であれば使えます。

Windowsなら、リリースされたZIPをダウンロードしてJarを取り出し、java -jar /path/to/potaufeu-X.X.X.jar %*/path/toはJarを置いた場所)をpotf.batファイルに書いて、そのbatファイルをどこかパスの通っているディレクトリーに置けばOKです。

使ってみる

インストールに成功したら、まずpotf --helpでヘルプを表示してみて、それから以下のコマンドを試してみて下さい。
コマンドライン引数に何も指定しないと、findと同じくカレントディレクトリーから全てのファイルを検索しますので注意してください。

$ potf --depth 1 --heads -FL

これは、「カレントディレクトリーに対して(デフォルトの動作)、最大の再帰深度を1(--depth 1)にして、ディレクトリーを除くファイル(-F)の最初の10件(--heads = --head 10)をPOSIX風に出力(-L)」という意味です。


Potaufeuは、findほど多機能ではないけれど、簡潔で直観的な入力で実行できるのが特徴です。

$ potf -d src -d tmp .java Test -t 201705- -L

このコマンドは、

  1. カレントディレクトリーのサブディレクトリーであるsrctmpを対象に(-d src -d tmp)、
  2. 拡張子.javaのファイル(.java)である、
  3. かつ、パスのどこかにTestが含まれる、
  4. かつ、最終更新日時が2017年5月以降(-t 201705-、実際には2017-05-01 00:00:00以降という意味)である
  5. 上記条件に合致するファイルをPOSIX風リストですべて出力

します。2と3はオプションではなく、パターンを表す基本の引数です。

一部を除いて、OR条件を指定できないのが貧弱なところですが…今後の課題です。
globや正規表現も使えるようにしたいですね。
どちらも実装はそれほど難しくなくて、記法さえ決まればすぐに導入したいところです。


このツールのもうひとつの特徴として、対話モードというのがあります。 まだ機能は充実していませんが、検索結果をいったんメモリー上に保存して、さらに絞り込んだり、結果を合成したり、保存・復元したりできます。

対話モード以外では、基本的に読取専用の処理しかしないはずなので、ヘルプとユーザーガイドを参考にして試してみて下さい。

リリースまでの経緯

個人的に欲しかった機能を、最低限の完成品としたものがこのソフトです。

Javaを使っているのは、複数のOSで同じバイナリーを扱えて楽だからです。
(ただ、良く考えてみると、このリリース方式を使えばGoみたいなクロスコンパイルしたものでも行けそうな気がしてきました。なので、使い慣れていてコンパクトだからということにしておきます。)

すでに類似のものを作っていましたが、いくつか不満がありました。

  • コードベースが古すぎるのでもう触りたくない(Java5以前)
  • インストールが面倒

これらを改善すべく、Java8でラムダやストリームが使えるようになったことだし、これを使って作ってみることにしました。
最初のベータ版が2年前で、2か月ほど開発していたものの、それから2年近く放置してしまいました。
個人的にちゃんと使える状態にしておきたかったので少しやる気がでて、なんとか最初の安定版までは頑張ろうと思い、やっとリリースできました。

実装はJava8の新機能を使いまくっているので、Java8以降でないと(今回の方法では)作れなかったのですが、それ以外は特に難しいこともなかったので3年前には完成させておきたかったんですけどね。

(おわり)


  1. MinGWは、デフォルトでは/usr/local/binなどの適切なインストール先ディレクトリーが無い、mktempが使えないなどの理由で断念しました。Git Bashは最初からcurlunzipが入っているので惜しかった。