Github上のprofile.cljから、使われているLeiningenプラグインを調べてみた

#よく使われているLeiningenプラグインの調査

##概要
github上で公開されている profile.clj ファイル124個を調査し、使われているLeiningenプラグインの出現頻度を調査した。

##背景と問題点
Leiningenプラグインは便利だが、便利なLeiningenプラグインを見つけるのは手間がかかる。さらに、
最もよく用いられている手法は「詳しい人から教えてもらう」というものだが、
この手法は知り合いが少ないボッチプログラマにとっては適用が難しい。

##提案手法
一部のClojureプログラマは、Leiningenの設定ファイルであるprofile.cljをインターネット上に公開している。また、そのようなユーザーは比較的情報感度が高く、レベルが高いプログラマである事が期待される。よって、インターネット上に公開されているprofile.cljを網羅的に調べ、利用されているプラグインを数え上げることによって、システマティックに良プラグインを発見できることが期待される。

##実装

今回は、Githubを対象とした。Github上で公開されているprofile.cljを気合いで検索してURLのリストを作成し、それをClojureプログラムを書くことにより処理して、各プラグインの出現回数を計測した。対象としたのはAppendixで述べる124個のファイルである。なお、依存関係によって暗黙に導入されるプラグインは考慮されていない。

##結果

以下に計測結果と、上位プラグインの簡単な説明を示す。各プラグインへのURLは、著者らの豆腐メンタルと時間的に無理だったので本項では割愛した。

| プラグイン  | 登場回数 | 概要・備考 |
|:-----------|------------:|:------------|
|lein-pprint	|42| プロジェクトの属性とか設定項目を表示してくれる|
|cider/cider-nrepl	|30|Emacs上での定番開発環境。|
|lein-ancient	|28|依存ライブラリのバージョン情報/更新チェック|
|lein-exec	|28|コマンドライン上からClojureプログラムを実行できる。ワインライナーのようなこともできるようになる。|
|lein-kibit	|27|Clojureプログラムのlintツール|
|lein-midje	|27|clojure.testより柔軟なテストフレームワークMidjeのLeiningenプラグイン|
|lein-clojars	|24|（Clojarsへのデプロイツールだが、Leiningen本体が対応したため現在では不要）|
|lein-try	|24|新しいライブラリをお手軽に試したいとき、project.cljに追加しなくても一時的にREPLで試すことができる|
|lein-marginalia	|21|ソースコードのドキュメンテーションツールであるMarginaliaのLeiningenプラグイン|
|lein-difftest|20|clojure.testの結果表示を改善する|
|lein-cljsbuild	|17|ClojureScriptの必須プラグイン|
|jonase/eastwood	|16|Clojureプログラムのlintツール|
|codox	|12|Clojureで書かれたAPIのドキュメント生成ツール|
|lein-ritz	|12|EmacsのLisp環境SLIMEのためのプラグイン|
|lein-bikeshed	|11|Clojureプログラムのlintツール|
|lein-cloverage	|11|ソースコードカバレッジツール|
|lein-localrepo	|11|ローカルのMavenリポジトリからプラグインやライブラリをインストールできる|
|lein-immutant	|10|アプリケーションフレームワークWildFlyを使うためのLeiningenプラグイン|
|lein-swank	|10|（ritzかCIDERを使いましょう。This project is no longer under active development.）|
|lein-typed	|9||
|lein-expectations	|6||
|lein-simpleton	|6||
|lein-vanity	|6||
|lein-catnip	|5||
|lein-midje-doc	|5||
|cljs-template	|4||
|com.aphyr/prism	|4||
|com.jakemccrary/lein-test-refresh	|4||
|com.palletops/pallet-lein	|4||
|hiccup-bridge	|4||
|lein-bin	|4||
|lein-licenses	|4||
|lein-noir	|4||
|lein-outdated	|4||
|jonase/kibit	|3||
|lein-autoreload	|3||
|lein-beanstalk	|3||
|lein-checkout-deps	|3||
|lein-create-template	|3||
|lein-datomic	|3||
|lein-drip	|3||
|lein-environ	|3||
|lein-guzheng	|3||
|lein-html|5||-docs	|3||
|lein-ring	|3||
|lein-tar	|3||
|lein-tarsier	|3||
|org.timmc/nephila	|3||
|quickie	|3||
|refactor-nrepl	|3||
|clj-stacktrace	|2||
|environ/environ.lein	|2||
|joodo/lein-joodo	|2||
|lein-annotations	|2||
|lein-autoexpect	|2||
|lein-autotest	|2||
|lein-cljs	|2||
|lein-clr	|2||
|lein-debian	|2||
|lein-depgraph	|2||
|lein-deps-tree	|2||
|lein-describe	|2||
|lein-droid/lein-droid	|2||
|lein-gentags	|2||
|lein-gnome/lein-template	|2||
|lein-grep	|2||
|lein-miditest	|2||
|lein-newnew	|2||
|lein-ns-dep-graph	|2||
|lein-open	|2||
|lein-pedantic	|2||
|lein-shell	|2||
|lein-spell	|2||
|mvxcvi/whidbey	|2||
|org.bodil/lein-noderepl	|2||
|pallet/lein-template	|2||
|perforate	|2||
|varspotting	|2||
|alembic	|1||
|lazytest	|1||
|lein-antlr	|1||
|lein-cascalog	|1||
|lein-checkouts	|1||
|lein-clojuredocs	|1||
|lein-difftest/lein-difftest	|1||
|lein-dynalint	|1||
|lein-gorilla	|1||
|lein-light	|1||
|lein-oneoff	|1||
|lein-plz	|1||
|lein-release/lein-release	|1||
|lein-test-out	|1||
|org.clojars.strongh/lein-init-script	|1||
|org.clojars.tcrawley/lein-release	|1||
|org.clojure/tools.nrepl	|1||
|org.danielsz/lein-runit	|1||
|radagast	|1||
|speclj	|1||


##Appendix

調査したURLのリスト：
（`#=()`を用いた、read時に処理が起動されるようなコードが含まれているものもあるが、これは計測時に除外している）

https://gist.github.com/devn/4403577
https://github.com/mjwillson/dotfiles/blob/master/.lein/profiles.clj
https://github.com/zcaudate/vinyasa/blob/master/profiles.clj.sample
https://github.com/teropa/hiccups/blob/master/profiles.clj
https://github.com/ckirkendall/enfocus/blob/master/profiles.clj
https://github.com/ardumont/dot-files/blob/master/profiles.clj
https://github.com/tmarble/clj.emacs.d/blob/master/lein.profiles.clj
https://github.com/bitemyapp/dotfiles/blob/master/.lein/profiles.clj
https://github.com/technomancy/lein-profiles/blob/master/src/leiningen/hooks/profiles.clj
https://github.com/pallet/clj-jclouds/blob/master/profiles.clj
https://github.com/pallet/pallet-aws/blob/master/profiles.clj
https://github.com/noprompt/matilde/blob/master/lein/profiles.clj
https://gist.github.com/jamesmacaulay/5603176
https://github.com/pallet/rbenv-crate/blob/master/profiles.clj
https://github.com/pallet/lein-pallet-crate/blob/master/profiles.clj
https://github.com/mcohen01/dotfiles/blob/master/profiles.clj
https://github.com/alanning/meteor-crate/blob/master/profiles.clj
https://github.com/sritchie/awaze/blob/master/profiles.clj
https://github.com/magomimmo/ciao/blob/master/profiles.clj
https://github.com/hyPiRion/dotfiles/blob/master/.lein/profiles.clj
https://github.com/marick/lambda-jam/blob/master/profiles.clj
https://github.com/pallet/forever-crate/blob/master/profiles.clj
https://github.com/dgrnbrg/dotfiles/blob/master/profiles.clj
https://github.com/denno-clojure/mascarpone/blob/master/profiles.clj
https://github.com/hugoduncan/hornetq-clj/blob/master/server/profiles.clj
https://github.com/hugoduncan/hornetq-clj/blob/master/example/profiles.clj
https://github.com/pallet/maven-resolver/blob/master/profiles.clj
https://github.com/pallet/ami-crate/blob/master/profiles.clj
https://github.com/bostonaholic/dotfiles/blob/master/profiles.clj
https://gist.github.com/samaaron/5684888
https://github.com/bodil/leiningen-for-dummies/blob/master/profiles.clj
https://github.com/RyanMcG/dotfiles/blob/master/.lein/profiles.clj
https://github.com/harob/dotfiles/blob/master/.lein/profiles.clj
https://github.com/Leonidas-from-XIV/dotfiles/blob/master/home/.lein/profiles.clj
https://github.com/proger/unixconf/blob/master/lein/profiles.clj
https://github.com/jamii/emacs-live-packs/blob/master/profiles.clj
https://github.com/sundbp/dot_files/blob/master/lein/profiles.clj
https://github.com/hozumi/dot_files/blob/master/.lein/profiles.clj
https://github.com/drewr/dotfiles/blob/master/d/.lein/profiles.clj
https://github.com/misfo/dotfiles/blob/master/.lein/profiles.clj
https://github.com/jeluard/dotfiles/blob/master/lein/profiles.clj
https://github.com/jwhitbeck/dotfiles/blob/master/.lein/profiles.clj
https://gist.github.com/loliveira/5610163
https://gist.github.com/stianeikeland/8235512
https://github.com/jimbarritt/dot-files/blob/master/.lein/profiles.clj
https://github.com/benburkert/dotfiles/blob/master/lein/profiles.clj
https://github.com/ccann/dotfiles/blob/master/profiles.clj
https://github.com/gworley3/daemontools-crate/blob/master/profiles.clj
https://github.com/ilkka/dotfiles/blob/master/home/.lein/profiles.clj
https://gist.github.com/m9dfukc/6110867
https://github.com/asmala/dotfiles/blob/master/leiningen/profiles.clj
https://github.com/azumafuji/dotfiles/blob/master/profiles.clj
https://github.com/citizenparker/dotfiles/blob/master/profiles.clj
https://github.com/AlexBaranosky/.lein/blob/master/profiles.clj
https://github.com/nathanic/dotfiles/blob/master/config/lein-profiles.clj
https://github.com/gauravagarwalr/Script-BackUp/blob/master/OS%20X/.lein/profiles.clj
https://github.com/gauravagarwalr/Script-BackUp/blob/master/OS%20X/.lein/profiles.clj
https://github.com/crooney/dotfiles/blob/master/lein/profiles.clj
https://github.com/jaju/config/blob/master/rc/lein-profiles.clj
https://github.com/borh/dotfiles/blob/master/lein/profiles.clj
https://github.com/cola-zero/cola-zero-dotfiles/blob/master/lein/profiles.clj
https://github.com/feltnerm/dotfiles/blob/master/lein/profiles.clj
https://github.com/zonpantli/dotfiles/blob/master/.lein/profiles.clj
https://github.com/zonpantli/dotfiles/blob/master/.lein/profiles.clj
https://github.com/nickmbailey/HomeDir/blob/master/.lein/profiles.clj
https://github.com/cldwalker/leinfiles/blob/master/profiles.clj
https://github.com/haruyama/Settings/blob/master/.lein/profiles.clj
https://github.com/cldwalker/leinfiles/blob/master/profiles.clj
https://gist.github.com/devn/4403577
https://github.com/sandhu/emacs.d/blob/master/profiles.clj
https://github.com/magomimmo/fb/blob/master/profiles.clj
https://github.com/bitemyapp/dotfiles/blob/master/.lein/profiles.clj
https://github.com/niftyn8/dotfiles/blob/master/lein/profiles.clj
https://github.com/dgrnbrg/dotfiles/blob/master/profiles.clj
https://github.com/zerowidth/dotfiles/blob/master/lein/profiles.clj
https://github.com/bodil/leiningen-for-dummies/blob/master/profiles.clj
https://github.com/RallySoftware/rally-emacs/blob/master/profiles.clj
https://github.com/expez/dotfiles/blob/master/profiles.clj
https://github.com/marick/lambda-jam/blob/master/network-free-install/lein/profiles.clj
https://github.com/mcohen01/dotfiles/blob/master/profiles.clj
https://github.com/bostonaholic/dotfiles/blob/master/profiles.clj
https://github.com/edn-format/data.edn/blob/master/profiles.clj
https://github.com/goldfeld/dotfiles/blob/master/profiles.clj
https://github.com/gfredericks/dotfiles/blob/master/.lein/profiles.clj.symlink
https://github.com/NSinopoli/dotfiles/blob/master/.lein/profiles.clj
https://github.com/Leonidas-from-XIV/dotfiles/blob/master/home/.lein/profiles.clj
https://github.com/DAddYE/dotfiles/blob/master/.lein/profiles.clj
https://github.com/ubolonton/dotfiles/blob/master/.lein/profiles.clj
https://github.com/mjwillson/dotfiles/blob/master/.lein/profiles.clj
https://github.com/amdt/dot-files/blob/master/profiles.clj
https://gist.github.com/haksior/9ff315afcf4e68f07e37
https://github.com/drewr/dotfiles/blob/master/d/.lein/profiles.clj
https://gist.github.com/friemen/5153156d765265fe5c13
https://github.com/frankiesardo/dotfiles/blob/master/.lein/profiles.clj
https://github.com/hyPiRion/dotfiles/blob/master/.lein/profiles.clj
https://github.com/misfo/dotfiles/blob/master/.lein/profiles.clj
https://github.com/roryk/dotfiles/blob/master/lein/profiles.clj
https://github.com/lunaryorn/dotfiles/blob/master/clojure/.lein/profiles.clj
https://github.com/tmarble/clj.emacs.d/blob/master/lein.profiles.clj
https://github.com/danielsz/dotfiles/blob/master/leiningen/profiles.clj
https://github.com/jr0cket/dot-files-ubuntu/blob/master/.lein/profiles.clj
https://github.com/julienXX/dotfiles/blob/master/profiles.clj
https://github.com/matlux/coretyped/blob/master/profiles.clj
https://github.com/jonschoning/dotfiles/blob/master/.lein/profiles.clj
https://github.com/ardumont/dot-files/blob/master/profiles.clj
https://github.com/harob/dotfiles/blob/master/.lein/profiles.clj
https://github.com/kjw/dot-files/blob/master/profiles.clj
https://github.com/davejacobs/dotfiles/blob/master/lein/profiles.clj
https://github.com/jamii/emacs-live-packs/blob/master/profiles.clj
https://github.com/hozumi/dot_files/blob/master/.lein/profiles.clj
https://github.com/noprompt/matilde/blob/master/lein/profiles.clj
https://github.com/jetmind/dot/blob/master/profiles.clj
https://github.com/bengillies/homedir/blob/master/.lein/profiles.clj
https://github.com/jrheard/dotfiles/blob/master/home/.lein/profiles.clj
https://gist.github.com/jcrossley3/6144603
https://gist.github.com/mcandre/5323679
https://github.com/denno-clojure/mascarpone/blob/master/profiles.clj
https://github.com/samroberton/dotfiles/blob/master/clojure/lein/profiles.clj
https://github.com/Gonzih/dotfiles/blob/master/.lein/profiles.clj
https://github.com/haruyama/Settings/blob/master/.lein/profiles.clj
https://github.com/ilkka/dotfiles/blob/master/home/.lein/profiles.clj
https://github.com/chaptastic/dotfiles/blob/master/lein-profiles.clj
https://github.com/oakes/play-clj-examples/blob/master/minimal-3d/android/project.clj