ClipMenuがCPU使用率100%以上になる場合

ClipMenu を使用していると稀に高負荷状態に陥り CPU 使用率が100%を上回る状態が続くことがあります。CPU ファンがうなり続ける状態です。

大抵の場合はアプリを強制終了し再起動すれば治るのですが、アプリを何度再起動しても高負荷状態が続く現象に遭遇しました。

これはクリップボード履歴データが怪しいということで、初期化を行ったところ解決しましたので方法をメモしておきます。

クリップボードデータの初期化方法

ClipMenu は操作不能のため、アプリを終了した状態でターミナル上で以下の操作を行い初期化しました。

cd ~/Library/Application\ Support/ClipMenu/
cp clips.data clips.data.bak
:> clips.data

最後のコロンコマンドの意味は シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法 で少し触れています。何もしないコマンドですが、リダイレクトするとそのファイルが空になります。

~/Library/Application Support/ClipMenu/clips.data がクリップボードデータの実体ファイルパスになります。履歴データは消えてしまいますが、同様の症状の場合は試してみるといいかも。

至高のクラウドメモ環境を求めて

メモ環境に求めているもの

メモ環境に対して求めているものを整理して見なおしてみました。
同じようなことを求めている人はこの記事を読むと幸せになれるかもしれません。

  1. プレーンテキストでメモできること
    • リッチテキスト的なテキスト装飾は不要
  2. Markdown をサポートしていること
    • Markdown の入力補助
    • Markdown のプレビュー
  3. コードブロックのシンタックスハイライトに対応していること
  4. タイトルや本文で全文検索できること
  5. 保存した時点でクラウド環境に同期されること
  6. 特定のツールに依存せず、任意のツールでメモにアクセスできること
  7. メモにタグ付けできること
  8. 複数のデバイス環境でメモを閲覧・編集できること
    • Mac (メイン)
    • iPhone (サブ)
    • Windows (サブ)

今までのメモ環境

Evernote のみ

おなじみ、圧倒的に支持されているクラウドメモサービスです。

使っていて便利だなあと思いつつも、漫然とした不満を持ちながら使っていました。こうしてメモ環境に求めているものを並べてみると、多くのニーズを満たしていないことが分かりますね…。

エンジニアにとってプレーンテキスト前提の設計思想ではないこととコードブロックに対応していないことは辛いものがあるのではないでしょうか。

Evernote というぬるま湯便利環境に浸っていてはいけないとメモ環境の改革を決意しました。

新しいメモ環境

Dropbox + nvALT + MacDown + Nebulous Lite

新しいメモ環境は最終的にこのような組み合わせになりました。

メモ環境

nvALT は高速な全文テキスト検索を備えたシンプルなテキストエディタで、MacDown は賢いシンタックスハイライトを備えた Mou ライクなマークダウンエディタです。

MacDown

メモの検索やちょっとしたメモは nvALT で行い、がっつり文章を書くときやプレビューしたい時は MacDown で開くようなイメージです。

あとはメモの保存先を Dropbox にしておけば他のデバイスと同期できます。ファイルベースで保存されるので好きなツールでメモファイルにアクセスできます。

iPhone アプリは Nebulous Lite をいれてみました。全てのメモをファイル名で検索でき、一応マークダウンのプレビュー表示にも対応しています。

各ツールのいいとこ取りのような環境で、求めていた環境に近い環境ができあがりました。

nvALT の検索タグについての懸念

この環境の若干の不安要素は nvALT のタグが OpenMeta というあまり先行きが明るくないとされる規格で保存されることでしょうか。OpenMeta タグは Nebulous Lite では検索できません。

なので、ファイル名にタグ情報を含めてしまう感じで運用してみようと思っています。例えば以下のような感じで。

  • ログファイルのフィルタリング方法[bash][log][tips].md
  • ○○○○の基本設計検討MTG[design][minutes].md

…なんだかこういう基本的な仕組みを組み合わせて頑張る運用、昔 ChangeLog + Chalow + 秀丸でメモしてた頃を思い出して、少し複雑な気持ちになってしまいます。

各ツールの設定方法メモ

nvALT の設定

Preference > Notes

nvALT設定1

  • Read notes flom folder を Dropbox 上の任意フォルダに変更
  • Storage タブ
    • Plain Text Files に変更
    • 拡張子に md を追加しチェックアイコンでデフォルトに変更

Preference > Editing

nvALT設定2

  • External Text Editor を MacDown.app に変更

これで設定で開いているメモを MacDown で開けるようになります。ショートカットキーの Command + Shift + E で開くのが一番楽だと思います。

MacDown の設定

Preference > Rendering

  • Syntax highlighting in code blocks にチェック

その他、お好みで。

他に検討したメモ環境達

1. Simplenote

Simplenoteはシンプルで軽快なクラウドメモサービスで、必要最小限の機能を備えます。
かなり良さげですが Markdown のサポートが弱いため今回は見送りました。

2. Kobito

Mac のマークダウンメモアプリです。UI 構成は Evernote ライクで、Qiita にそのまま投稿もできます。

簡単かつ便利なので非常に迷いましたが、メモデータが DB に保存されるため他のツールと連携しにくいことと iOS アプリが無かったので見送りました。

3. Dropbox + Sublime Editor

Sublime に Markdown 系の拡張をいれ、Dropbox の共有フォルダをプロジェクトとして開いておくとそこそこ便利な環境が出来上がります。

今回は至高を求めていたため見送りました。

まとめ

現状で至高と思えるメモ環境ができました。ブログ名にも「メモ帳」と入ってたりするのですが、メモに関してはこれからも向き合っていくようにしたいなと思っています。

メモしていて Markdown ってやっぱり手軽に便利で素晴らしいなと思いますし、対応ツールも増えてきて嬉しい限りですが、まだまだ非エンジニアへの認知度が低い気がするのでもっと広がって欲しいなと願っています。まずは Qiita:Team に日報書く文化を社内に根付かせるところあたりから始めて見るのがいいかもしれませんw

他におすすめのツールなどあればコメントお待ちしています。

シェルスクリプトでset -eしているときに処理を中断せずエラーを扱う方法

シェルスクリプトで set -e しておくと、スクリプト中に実行したコマンドの戻り値が非0だった時、つまりコマンドが失敗したときにそこでスクリプトを中断してくれるようになります。(ここでいう戻り値とは「Exit code」「Return status」などと呼ばれるものです。)

都度エラー判定を書かなくてもよくなるので便利なオプションですが、個別にエラーハンドリングをしたくなった時にも意図せずスクリプトが中断されてしまい困ったことになります。

以下の例では、false コマンドの戻り値は常に1(失敗)でそこでスクリプトが中断されるため “finish” が出力されることはありません。

#!/bin/bash -e
false
# 以降のコマンドは実行されない
echo "finish"

-eオプションで困ってしまうケースの例

例えば grep コマンドで検索結果が見つからなかった場合にエラーメッセージを出力したいケースがあったとします。grep は検索結果が何か見つかれば0(成功)、見つからなければ1(失敗)の戻り値が返るという仕様です。

以下の例では grep で見つからなかった場合、そこでスクリプトが中断されてしまうため、以降の if ブロックが実行されることはありません。

#!/bin/bash -e
grep "apple" hoge.txt >/dev/null
ret=${?}

if [[ $ret != 0 ]]; then
  # ここに入ってくることはない!
  echo "apple を含む行が見つかりませんでした。" 1>&2
  exit 1
fi

これについて対処法を4つメモしておきます。

対処法1: コロンコマンドを利用する (:コマンド)

#!/bin/bash -e
grep "unmatch pattern" hoge.txt && :
echo "return value: ${?}"

→ return value: 1

解説

これは -e オプションにおける特殊な特性を利用した方法です。
: は一つの built-in command で、何もせずに0(成功)の戻り値を返すだけのコマンドです。

式の評価の流れ:

  • grep の戻り値が0(成功)だった場合、&& 演算子により右側も評価され : を実行。一連のコマンドの戻り値は0(成功)。
  • grep の戻り値が1(失敗)だった場合、&& 演算子によりそこで評価を終了。なので一連のコマンドの戻り値は1(失敗)。

更に set -e オプションには && や || で結合された式リストの最後にあるコマンドが1(失敗)だった場合のみスクリプトを中断するという特性があるため、そのままスクリプトを続行できます。$? にもちゃんと grep の戻り値が入っています。

そのためちょっと直感的ではないですが、以下のコマンドの出力は “route1″のみ となります。

#!/bin/bash -e
false && false
echo "route1"

false
echo "route2"

対処法2: trueコマンドを利用する

grep "unmatch pattern" hoge.txt && true
echo "return value: ${?}"

→ return value: 1

解説

対処法1と同じ理由です。true コマンドも : と同じく何もせず常に0(成功)を返すコマンドです。

対処法3: 戻り値を取得せずifでそのまま判定する

#!/bin/bash -e
if ! grep "apple" hoge.txt >/dev/null; then
  echo "Not found apple..." 1>&2
fi

解説

この方法は一番シンプルに解決できる方法かもしれません。
こちらも-eオプションにおける挙動の特性を利用しており、if の評価式部分のコマンドに関しては失敗しても中断されないという特性があるため、スクリプトを続行できます。

対処法4: 一時的に set +e して -e オプションを解除する

#!/bin/bash -e
set +e
grep "unmatch pattern" hoge.txt
echo "return value: ${?}"
set -e

→ return value: 1

解説

個人的に少しダサさを感じてしまいますが、この方法が楽そうならこれで。最後に set -e で元に戻すのを忘れずに。

感想

対処法3のケースなど普段何気なく実現できていたことも、ちょっとした挙動の特性により実現出来ていたことが理解できました^^
個人的にはコロンコマンドを使用した方法がシンプルで好きですが、時と場合で使い分けたいと思います。

参考資料

編集履歴

  • 2018/11/22: 全体的に例や内容をブラッシュアップしました。