2017年06月14日

memoコマンドのご紹介

ちょっと指示されたことや思いついたアイデア、調べたこと、作業ログなど、サッとメモ取りたい。
メモ入力までの手間を少なくしつつ、ある程度整理しておきたい。
そんなときは、普段から開いてあるターミナルでおもむろにmemoコマンド使いましょう。

memoコマンド?

このようなときにCLI環境でメモを取る作業を補助するコマンドがmattn/memoです。
作者様による紹介はこちら > Big Sky :: golang でメモ専用コマンド「memo」作った。

タイムスタンプ付きでのファイル作成・好きなエディタでそのまま開く・メモ全体へのgrepなどが簡単にできます。
VimやEmacsなど、CLIのエディタを常用している人には非常に便利だと思います。

入手方法

入手方法については、githubから、もしくはgo言語の環境があればgo getを使います。

githubの場合はリポジトリのreleaseページより各自の環境に応じたバイナリをダウンロードできます。
もしくはgo get github.com/mattn/memoでも入手可能です。

releaseページを見るとわかるように、こちらのコマンドはwindowsでも動作するようです
(筆者はmacとlinuxしか使わないので未確認)。

できること

何ができるのかについては上記の作者様のブログを見るのがわかりやすいので、
ここでは機能全体はごく簡単に一覧するにとどめ、
一部の機能について筆者の利用例を紹介したいと思います。

memo --helpすると以下のように(抜粋)表示され、
メモの作成・一覧・編集・削除・検索および設定と、基本的な機能が並んでいることがわかります。
またメモをmarkdownで書いておけばそれらをブラウザ上でHTMLとしてみることもできます。

COMMANDS:
     new, n     create memo
     list, l    list memo
     edit, e    edit memo
     delete, d  delete memo
     grep, g    grep memo
     config, c  configure
     serve, s   start http server
     help, h    Shows a list of commands or help for one command

筆者による利用例

memoコマンドの便利なところを状況ごとに紹介します。

例1. 「あのときにメモってたやつが確か…」

memo editでは引数としてメモファイル名を指定することでそのファイルを編集できますが、
引数なしで実行するとセレクタ(デフォルトではpeco)が起動して対象ファイルをメモ一覧から絞り込むことができます。

事例として、仕事でpostgresqlの操作をする必要があるがコマンドをちゃんと覚えていない、
でも研修でやったから確かその時のメモにあるかも…ということがありました。

そこでmemo editを起動して’kensyu’まで入力すると次のような状態になりました。

QUERY> kensyu
2017-05-12-kensyu_soft-raid.md
2017-05-12-kensyu_backup-restore.md
2017-05-09-kensyu_cluster_postgresql.md
2017-05-09-kensyu_cluster_mariadb.md
2017-05-02-kensyu_infra_ha2.md
2017-04-28-kensyu_infra_monitor.md
2017-04-28-kensyu_infra_cache.md
2017-04-27-kensyu_ha_db.md
2017-04-25-kensyu_infra_nfs.md
2017-04-25-kensyu_infra_ha.md
2017-04-25-kensyu_infra_bsd.md
2017-04-24-kensyu_所感メモ.md
2017-04-24-kensyu_infra_ftp.md
2017-04-21-kensyu_infra_mail.md
2017-04-21-kensyu_infra_2.md
2017-04-20-kensyu_infra_1.md

それっぽいのが出てきているので、追加で’ postg’まで入力して確定すれば目的のファイルが開きます。
このように、たくさんメモがあっても簡単に目的のファイルが探せます。

例2. 「あれするときのコマンドのオプションなんだったかな…」

memo grepでは、書き溜めたメモ全体からgrepによるワード検索ができます。
そこで、たまに使わないといけないけど覚えるには長い、みたいなコマンドをメモしておいて検索すると便利です。

以下はSSL証明書のCSR発行や貰った証明書の確認をするためにopensslコマンドのオプションを調べる例です。

~ > memo g openssl
/Users/hikaru.inomoto/.config/memo/_posts/2017-05-23-example_ssl.md
4:openssl x509 -noout -modulus -in {証明書} | openssl md5
5:openssl rsa -noout -modulus -in {鍵} | openssl md5
7:openssl x509 -issuer_hash -noout -in {証明書}
8:openssl x509 -subject_hash -noout -in {中間証明書}

/Users/hikaru.inomoto/.config/memo/_posts/2017-05-22-ssl_csr.md
4:  - opensslに`-utf8`オプションをつければutfでいける
5:  - `openssl asn1parse -in file`すれば確認可能

/Users/hikaru.inomoto/.config/memo/_posts/2017-05-16-example-ssl.md
9:* `openssl genrsa 2048 -out server.key`
10:* `openssl req -new -key server.key -sha256 -out server.crt`

/Users/hikaru.inomoto/.config/memo/_posts/2017-03-15-sensortag-setup.md
3:* apt-get install python3 python3-pip git libglib2.0-dev gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

ネットで調べてもすぐ出てきますが、こうしてローカルでサッと出てくると非常に便利です。

例3. 「あのコマンド長過ぎるよなぁ…」

上記の他にも、覚えることはできるんだけどやたらと長いコマンドや

~ > memo g firewall-cmd
/Users/hikaru.inomoto/.config/memo/_posts/2017-05-09-kensyu_cluster_postgresql.md
36:firewall-cmd --add-service postgresql --zone public --permanent
37:firewall-cmd --reload
92:  - `firewall-cmd --direct --permanent --add-rule ipv4 nat PREROUTING 0 -d 192.168.33.140 -j REDIRECT`
200:firewall-cmd --add-port 9898/tcp --zone public --permanent
201:firewall-cmd --add-port 9999/tcp --zone public --permanent
202:firewall-cmd --reload

/Users/hikaru.inomoto/.config/memo/_posts/2017-04-25-kensyu_infra_ha.md
39:  - `firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s8 --destination 224.0.0.18 --protocol vrrp -j ACCEPT`
40:  - `firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp0s8 --destination 224.0.0.18 --protocol vrrp -j ACCEPT`
49:  - `firewall-cmd --direct --permanent --add-rule ipv4 nat PREROUTING 0 -d 192.168.33.100 -j REDIRECT`

shellのワンライナーなど、

~ > memo g uniq
/Users/hikaru.inomoto/.config/memo/_posts/2017-05-31-XXXXXXXX.md
21:  - `cat clean.log| sed -e "s/LOG:  duration: //g" -e "s/:\ */:/g" | tr '\t' ' ' | sed "s/[^:]*://g" | tr -s ' ' | sort | uniq -c | sort -n -r | less -S`

/Users/hikaru.inomoto/.config/memo/_posts/2017-05-15-memo.md
34:* `cat file | cut -d" " -f 1 | sort | uniq -c | sort -k 1 -n -r`とかでいける

サッと出してコピペで迅速に利用可能です。

カスタマイズ

memoコマンドはエディタやセレクタ、検索コマンドといった外部コマンドを利用し、それらはmemo configで変更できます。
例として、筆者の場合は

memodir = "/Users/hikaru.inomoto/.config/memo/_posts"
editor = "vim"
column = 20
selectcmd = "peco"
grepcmd = "ag ${PATTERN} ${FILES}"
# grepcmd = "grep -nH ${PATTERN} ${FILES}"
assetsdir = "."
pluginsdir = "/Users/hikaru.inomoto/.config/memo/plugins"
templatedirfile = ""
templatebodyfile = ""

となっています。デフォルトからgrepcmdをag(The Silver Searcher)に変更しており、
このようにそれぞれ自分の好みのコマンドを設定することができます。

これらコマンドは(少なくともMac, Linuxでは)シェルで実行しているだけなので、例えば

grepcmd = "grep -nH ${PATTERN} ${FILES} | sed 's|${DIR}/||g'"

のようにsedにパイプで繋いで整形することもできます(この例はファイル名からディレクトリ名を消すものです)。

また、「プラグイン」としてmemoのサブコマンドを増やすことができますし、
memoコマンド自体もGo言語で書かれた800行程度のプログラムなので自分で改造するのも良いと思います。

まとめ

一つ一つの機能は特別複雑なものではないので手動でもできることはできるのですが、
それでもコマンド一つでサッと使えるのは非常に便利です。

ターミナル上で生活しているような方は是非使ってみると良いと思います。

※ 筆者はgrepcmdをデフォルトのgrepからagに変更しているため、例2の出力例はデフォルトとは異なります。

RELATED POSTS