ちょろっと計算したくなったときに使える関数電卓ツール

# 経緯

急に計算したくなったとき、皆さんはどうしているのでしょうか。

私はこれまで以下の方法を使ってきました。
が、どれもかゆいところに手が届かなかったり、私の性格上合わなかったりでいつもなんだかなーという状況になってました。

- **暗算する**
    - 子供の頃そろばん塾に通っていたのですが、暗算できるほどのスキルは身につきませんでした（汗）
    - 計算間違いの実績多数で信用できない
- **OSに付属している電卓を起動して計算する**
    - 一番良くやってた方法でした
    - 起動が若干遅い
    - マウスとかトラックパッドを動かさないと起動できなかった
    - 長い計算式入れるときに先に計算するところを考えるのが面倒
- **スマホ（主にiPhone）で使える電卓アプリを起動して計算する**
    - スマホが手元にないときが・・・
    - 外出時などPCの前に居ないときにはこれ1択じゃないかと思う
- **物理的な電卓（引き出しの中）を使う**
    - 会議中とか離席中に限って使いたくなること多数
    - 使いたいときに限って電池切れ問題
    - 電卓がどっかいっちゃった問題（整理整頓苦手問題）
- **Excelで計算する**
    - 表計算なら間違いないのですが、ちょろっとした計算にはタスキに長い感が。
    - たまたまExcel開いていたら良いが、起動がめちゃ遅い。
- **簡易的にプログラム書いて実行する**
    - ちょっと長い計算式が必要だなというときにはこれをよくやってた。
    - 言わずもがな、手間はかかる。
- **PHPなどのREPLを起動して計算する**
    - `php -a`して、echoとかprintとか書くのが面倒
    - scalaのREPLは結構良かったが、ちょっとレスポンスが遅い気がする。
- **vimで計算する**
    - `Ctrl + r`で計算
        - https://qiita.com/noc06140728/items/429a7729ee7b42eef204
    - 私はvimmerなんですが、vimを開いていないときに限って計算したくなる不思議。

4/25追記

- **Googleで検索する**
    - 何でも行ける
    - ネット回線とブラウザが必須だが、正直コレが一番優秀かもしれない（笑）

# 偶然出会った関数電卓ツール

全く違う件でGithubのリポジトリを検索していたとき、たまたまinsectというオープンソースのツールに出会いました。
そしてこれを見つけた瞬間、これだと思いました。

## insectとは

insectとは、言うなれば **コマンドラインの関数電卓** です。PureScriptで書かれているようです。

画面イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171774/b7e219b7-5073-2af6-24c6-f0a1438f0539.png)

## インストール方法

https://github.com/sharkdp/insect/releases

こちらでWindows/macOS/Linuxごとに実行形式のバイナリファイルが提供されていますので、ダウンロードしてそれを実行すればいいだけです。簡単です。

```sh
cd $HOME/bin
wget https://github.com/sharkdp/insect/releases/download/v5.0.0/insect-linux-x64
chmod +x insect-linux-x64
ln -s insect-linux-x64 insect
```

brewなどでもインストールすることができます。

```
brew install insect
```

その他のインストール方法

https://github.com/sharkdp/insect#terminal-version

インストールができない環境であれば、インターネットに接続できればWebのインターフェイスも用意されています。
以下のサイトにアクセスすれば、insectをそのまま利用できます。

https://insect.sh/

### 個人的に行ったカスタマイズ

インストール後にinsectというツール名がパッと出てこなかったので
私は.zshrc/.bashrcにcalcというエイリアスを作っておきました。

```
alias calc=insect
```

Windows PCにもバイナリをインストールしてタスクバーにピン留めしちゃいました。

## 特徴

### 計算式をそのまま入力できる

関数電卓なら当たり前感はありますが、計算式をそのまま入力できます。

```
>>> 1234 + 5678 + 90 * 100

  1234 + 5678 + 90 × 100

   = 15912

```

カッコ付きでも可能

```
>>> (12 + 34 + 56) / (78 + 90)

  (12 + 34 + 56) / (78 + 90)

   = 0.607143

```

### 数学関数も使えます

基本的な数学関数も揃っています。

例えば平方根や三角関数を使った例です。

```
>>> sqrt(1.4^2 + 1.5^2) * cos(pi/3)^2

  sqrt(1.4^2 + 1.5^2) × cos(pi / 3)^2

   = 0.512957

```

四捨五入ももちろん可能です。

```
>>> 60 * 1.08

  60 × 1.08

   = 64.8

>>> round(60 * 1.08)

  round(60 × 1.08)

   = 65

```

### 単位変換ができる

コレが個人的には一番便利だなーと思ったのですが、単位変換が簡単にできます。

変換するには数値の後に単位を指定して `->` や `to` `→` を入力した後に、変換後の単位を指定します。

例えば13インチをcmに変換したいときは以下のように書けます。

```
>>> 13 inch -> cm

  13 in ➞ cm

   = 33.02 cm

```

他にもいろいろな単位に対応しています。

```
>>> 120 km/h -> m/s

  120 km / h ➞ m / s

   = 33.3333 m/s

>>> 365 days -> weeks

  365 d ➞ week

   = 52.1429 week

>>> 1.5 V * 2 A -> W

  1.5 V × 2 A ➞ W

   = 3 W

```

その他に対応している単位は以下を参照してください。

https://github.com/sharkdp/insect#reference

### ユーザー定義関数が作れる

なんとユーザー定義関数が作れるのです。

例えば広告のクリック率（広告クリック数÷広告表示数×100）の計算を以下のようにユーザー定義関数（CTR）として定義するとこうなります。

```
>>> CTR(imp, click) = click / imp * 100

  CTR(imp, click) = (click / imp) × 100

>>> CTR(10000, 30)

  CTR(10000, 30)

   = 0.3

```

READMEに記載されていますが、物体の運動エネルギーの計算をユーザー定義関数(kineticEnergy)に定義した例です。

```
>>> kineticEnergy(mass, speed) = 0.5 * mass * speed^2 -> kJ

  kineticEnergy(mass, speed) = 0.5 × mass × speed^2 ➞ kJ

>>> kineticEnergy(800 kg, 120 km/h)

  kineticEnergy(800 kg, 120 km / h)

   = 444.444 kJ

```

なお、ユーザー定義関数名には日本語も使えます。
使いやすいかどうかは別として、こう書くとわかりやすいですね。

```
>>> クリック率(表示数, クリック数) = クリック数 / 表示数 * 100

  クリック率(表示数, クリック数) = (クリック数 / 表示数) × 100

>>> クリック率(1000,2)

  クリック率(1000, 2)

   = 0.2

```

## 唯一の欠点

プログラマにとっては、ある意味致命的とも言えるのですが、2進数と16進数を扱えないのがとてもつらいです。

```
>>> 0x12

  0 × x12

  Unknown identifier: x12
```

> Insect does not have a special mode for hexadecimal or binary numbers (yet).

yetがついているということは近々対応してくれそうなのでそれに期待です。
（自分でPull Request上げろという主張はご尤も。。）

あとは％にも対応してくれると嬉しいなーなんて思ったり。

## 感想

良いもの見つけたな。っと思ったのですが、欠点が割と致命的でした（オチ）
ですが、コマンドラインで簡単に計算できるのはとても便利です。
使い始めて日は浅いですが、すでに今までにない便利さを痛感しています。
開発の際にはいろいろなOSで作業することが多いので、どのOSでも同じ関数電卓が使えるというのが地味に嬉しかったです。

願わくば2進数16進数にも早期に対応してくれることを切に願っています（他力本願）

4/25 追記

Google検索のことをすっかり忘れてましたが、Google使えるならそれが一番手っ取り早い気がする(終了)

# 参考

https://github.com/sharkdp/insect