ぽよメモ

レガシーシステム考古学専攻

ライフサイエンス辞書で単語を引くAlfred Workflowを作った

きっかけ

生物学を学んでいる身としては論文を読んでるときとかにパパッとライフサイエンス辞書を引けたら嬉しいなと思ったのと,ただ単に検索結果のURLをブラウザで開くだけなら最初からブラウザ使えば良いよねと思ったので,自作してみることにしました.

Go言語を使ったわけ

ライフサイエンス辞書は通常開くウインドウとは別に,こういった検索方法も存在します.最初はこれをただURL開くだけで良いかとも思ったのですが味気なく,しかしJSONXMLなどのAPIでもないためこれを再利用するにはスクレイピングが必須です.

AlfredのWorkflowでは様々なスクリプトを実行できますし,そのままターミナルを叩けるのですが,スクリプト言語の利用できるライブラリはその環境に依存してしまいます.スクレイピングをするのに外部ライブラリ無しという縛りはあまりにも鬼畜であるので,どうにかしてライブラリを使いつつ,環境依存を減らしたいなと考えたときにGoを思い出しました.

バイナリ一発で動くというのが魅力で,今回の用途に適しているのではないかと考えやったことも無いのにとりあえず書いてみることにしました.

環境

  • Alfred v3.3.1
  • Go 1.8.1
  • Glide 0.12.3

今回はGoのパッケージ管理にGlideを使用しました.なお,このWorkflowを動作させるだけであればGoもGlideも必要ありません.自分でビルドする場合のみ導入してください.

lsd-alfred

リポジトリは以下になります.

github.com

できること

ライフサイエンス辞書から単語を引くことが出来ます.英語,日本語どちらでも検索可能です.
検索方法は以下の4通りあります.

  • 前方一致: lsd begin "{query}"
  • 後方一致: lsd end "{query}"
  • 部分一致: lsd in "{query}"
  • 完全一致: lsd eq "{query}"

検索してブラウザで開く

検索した後Shift + Enterでデフォルトブラウザを使用して開きます.

f:id:pudding_info:20170410104855g:plain

検索してクリップボードにコピー

検索した後Command + Enterクリップボードにコピーします.
また,最前面の入力ウインドウに対して自動的に入力を行います.この設定はWorkflow中のCopy to Clipboard中のオプションを変更することで無効にもできます.

f:id:pudding_info:20170410111425p:plain

f:id:pudding_info:20170410110044g:plain

検索結果から再検索

検索した後Fn + Enterで再検索をかけます(意味があるのかは分からない…)

f:id:pudding_info:20170410110330g:plain

検索結果をさらに検索エンジンにかける

検索した後Ctrl + Enterでググります.

f:id:pudding_info:20170410110650g:plain

検索結果をSpotlight検索にかける

検索した後Alt + EnterでSpotlight検索にかけることができます.(GIF略)

検索結果の一覧ページを開く

See all resultsの項目でShift + Enterすると一覧が開きます.(GIF略)

ホットキーを使用して選択文字列を検索

初期では使用できません.使いたい場合,Alfred Workflowの設定を開いてlsd-alfredのHotKeyの項目に好きなキーを割り当ててください.デフォルトでは部分一致検索を行います.

f:id:pudding_info:20170410123745g:plain

できないこと

まだシソーラスコーパス検索には対応していません.が,原理的には同様にスクレイピングをするだけで実現可能であるため,実装すれば実現は容易です.

まとめ

f:id:pudding_info:20170410111429p:plain

作ろうと思い至ってからGoに入門して完成までだいたい2日でここまできたので個人的には満足です.が,まだまだ常用ツールとしては未熟な作りでひどいコードなので少しずつリファクタリングしていきたい…たぶんバグたくさんあるのでPR待ってます(他力本願)

一応.alfredworkflowなパッケージは以下からダウンロードできます.使用は自己責任で…

Releases · pddg/go-lsd-alfred · GitHub

Alfred Workflowの作り方

ネットを検索していると何か色々とWorkflowの作り方が出てきますが大抵古いです.現在は標準でAlfred 3がエクスポートの機能を持っており,外部ツールを用いる必要はありません.

Alfred無しで(CI等で).alfredworkflowなパッケージを作るにはどうもzip圧縮して拡張子を変更してやれば良いだけ?っぽいです.

以下簡単に手順です.

  1. Blank Workflowを作成し,詳細情報を入力
  2. 作成したWorkflowを二本指タップするとOpen in Finder…が出てくるのでそれを押す
  3. 開いた場所に実行するスクリプトや必要な設定ファイル等を置く
  4. 編集する
  5. Exportする

以上です.

Workflowとスクリプトの連携について

phpなどを使う場合,あらかじめ用意されたworkflow.phpなどを利用する方法が出てきますが,今回のように自作バイナリを叩く場合の記述に関しては全然見当たらなかったので本家の英語ドキュメントを軽く読んでやりました.今でも合っている自信が無いです.

Alfred 3からはXMLだけでなくJSONも使用できます.一応XML後方互換のために残しているだけのような感じなので,JSONを使用していこうと思います.Workflowで使用するのはScript Filterです.

www.alfredapp.com

{"items": [
    {
        "uid": "ID",
        "type": "file|default|skipcheck",
        "title": "title",
        "subtitle": "subtitle",
        "arg": "url",
        "autocomplete": "title",
        "valid": true
        "icon": {
            "type": "fileicon",
            "path": "path"
        },
        "mods": {
            "alt": {
                "valid": true,
                "arg": "url",
                "subtitle": "subtitle"
            }
        },
        "text": {
            "copy": "Text to copy",
            "largetype": "Large Text"
        },
        "quicklookurl": "url"
    }
]}
  • uid: ユニークキー.ここの値を元にソートされるっぽい.
  • type: このオブジェクトがファイルなのか,それ以外なのかを示す.fileを指定すると存在するかのチェックが入るので嫌な場合はskipcheckにせよと書いてある.
  • arg: 表示されたオブジェクトを選択してEnterを押したとき,次に渡される値.URLなど.
  • icon: typepathも空欄にしておくとパッケージに含めたicon.pngが勝手に使用される.
  • valid: Enter押したときに次のアクションを行うかどうか
  • mods: 修飾キーと組み合わせたとき,次に渡す値を変化させることが出来る.例えばalt+ Enterのときはタイトルを出力するが,Cmd+ EnterのときはURLを出力すると言った挙動に出来る.使える修飾キーはCmdAltCtrlShiftFn
  • text: copyの値はコピーしたときクリップボードにコピーされる値.largetypeCmd + Lを押したときに表示されるLargeTypeに表示するテキスト.

最終的に上記の形式(全てを含めなくても良い)のJSONを標準出力にPrintするだけで簡単に使えます.最高.

まとめ

Goは言語自体はシンプルなのですが,どうにもエラー処理やスライスの周りで頭が混乱してしまいます.もう少し使えるようになればかなり便利そう…

Alfred 3,Workflowでできることがとても多くて重宝しています.課金して良かった.

続・授業ノートをMarkdownでとって管理する

poyo.hatenablog.jp

以前こういう記事を書きましたが,以降いくつか新しいエディタを発掘したのでメモを残しておきます. 今回は事情によりMacスクリーンショットのみですが,全てマルチプラットフォーム対応です.

wri.pe

f:id:pudding_info:20170329221837p:plain

StackEditと同様のオンラインエディタです.

良いところ

やはりオンラインエディタの良いところは,手元にブラウザとインターネット環境があれば使用可能なところでしょう.iPhoneiPadAndroidでも使用が可能です.
このエディタはEvernote及びDropboxに接続してノートを管理することが出来ます.ただしDropboxについては即時反映ではなく,"Daily Backup"な模様です.(以下,wri.peより)

Daily automatic backup to Dropbox. It stores up until 14 generations of changes. Your files are private and can’t be accessed by our service.

面白いのはカレンダーが内包されており,そのノートを作成した日などがカレンダーに記録されていくようです.そこからノートの編集画面へと飛んだりも出来ます.

微妙なところ

数式やフローチャートなど,拡張機能には一切対応していません.コードブロックの記述は出来ますがシンタックスハイライト等はできないようです.
また,pdfなどへの出力機能はなく,保存形式としてはDropboxまたはEvernoteの二択となり,正直劣化版StackEditな気はしないでもないです.一応ノートのExportの項目もありますが,全ノートがテキストファイルとしてzipで固められているだけのものになります.
また,使用に際してはFacebookまたはGithubのアカウントが必要になります.

ノートの管理方法

Evernoteとの同期が最も適しているとは思いますが,タグの付与がエディタ上から出来ない*1ため,使い勝手は微妙と言えます.Dropboxへの同期もテキストファイルとなり,.mdですらないので微妙…

総評

うーん,正直StackEditの拡張性に比べるとしょぼいというかなんというか…他の選択肢を選ぼうかなという気になります.

QOwnNotes

f:id:pudding_info:20170330002408p:plain

ownCloudとの連携が強いエディタです.

良いところ

とにかくownCloudとの親和性が高いです.自前のownCloudサーバがあれば,版管理からToDo管理,バックアップまで全てをこなしてくれます.
GUIが充実しており,Wordなどのように太字,斜体などをGUIから設定できます.また,PhotoshopなどのようなパネルスタイルのGUIが実装されており,カスタマイズが豊富です.例えば,Markdwonのプレビュー画面だけ独立させたり,編集画面とプレビュー画面を横並びにすることもも縦並びにすることもできます.多くのMarkdownエディタはシンプルなUIを実装していることから,それらの画面に納得できなかった人には良い選択肢でしょう.
ノートの保存先はownCloudのディレクトリ以外に,ローカルに指定したディレクトリも設定できます(複数設定・切り替え可).

微妙なところ

ownCloudサーバが無ければちょっとGUIが豊富なだけの普通のエディタです.補完はそこそこ気持ちよく効きますが,コードブロックのシンタックスハイライトは非対応,数式非対応,シーケンス図やフローチャート非対応など拡張性は微妙です.

ノートの管理方法

ownCloudで管理するのが最も適しています.ただし,そうでない場合でもディレクトリを複数選択して保存先として設定できることから,gitで管理も可能でしょう.

総評

UIがリッチなのはリッチなのですが,個人的にはたかがメモ,ノートにそれほど複雑なUIを求めていないのでちょっと装飾過多かなぁと感じました.

Simplenote

f:id:pudding_info:20170330095805p:plain

WordPress.comを運営するAutomattic社が作ったシンプルなエディタです.

良いところ

モダンでシンプルなUIになっており,使い方がわかりやすいです.また,app.simplenote.comに全て同期されており,サインインすることで全てのノートブックにアクセスできます.

以下の画像のように履歴が保存されており,いつでも任意の地点に戻ることが出来るのも良いところだと思います.

f:id:pudding_info:20170330100939p:plain

Webへのパブリッシュがかなりお手軽なのも良いところです.Make public linkをオンにするだけで閲覧可能なURLが発行されます.

f:id:pudding_info:20170330101446p:plain

微妙なところ

サインアップ必須です.メールアドレスがあればアプリからアカウントを作成できるので簡単ではあります.
エクスポートが全ノート一括でのzip出力しかありません.クラウドで保存されているとはいえ,何らかの外部出力はやはり欲しいものです.ローカルでの保存先も不明なので,simplenote.com次第ということになります.
また,Macのβ版クライアントではコードブロック及びシンタックスハイライトに対応していましたが,Web編集画面ではコードブロックに対応していません.

f:id:pudding_info:20170330102016p:plain

publlish画面ではコードブロックには対応していますが,シンタックスハイライトには対応していません.なぜWeb版とクライアント版で対応の可否が変わっているのか不思議です…
また全体を通して数式,フローチャート等の拡張機能には非対応です.つらい.

ノートの管理方法

simplenote.comでの同期一択となります.Evernoteのようにタグでの管理が可能なので,これ単体での運用は難しくないかと思います.publish以外の共有方法としてCollaboratorの追加が可能で,simplenote.comにサインアップしたユーザ同士で編集が可能になっています.

総評

Macのクライアントは非常に快適ですが,Webでのプレビューと必ずしも一致しないことがかなり不満です.特にシンタックスハイライトはまだしもコードブロック非対応がかなり苦痛で,#でのコメントアウトが全て<h1>タグとして認識されてしまいます.
当然Webベースであり現在も開発が進んでいるようなので,今後改善される可能性は高そうです.Macのメモアプリの上位互換と考えればかなり有用であると思うので,マルチプラットフォームかつ特殊な記法が不要,メモをタグで管理したいというユーザには良いのではないでしょうか.

Typora

f:id:pudding_info:20170330002200p:plain

真 打 ち 登 場

Typora — a minimal markdown reading & writing app

良いところ

f:id:pudding_info:20170331234052p:plain

  • マルチプラットフォーム
  • 数式,フローチャート,シーケンス図,上付き文字下付き文字対応
  • ワードカウント,アウトラインの表示
  • タイプライターモード(文字入力地点が常に画面中央に来る)搭載
  • 複数のカラーテーマ
  • 無料

エディタの画面がスッキリしていて不要な情報が排除されているため,書くことに専念できます.カスタマイズが豊富で,先ほど上げた各種機能はデフォルトではオフになっています.
プレビュー画面では,対象の行にフォーカスするとプレビュー画面でも元のMarkdown構文が表示され,編集が可能になっています.これはシーケンス図やコードブロックでも同様で,プレビュー画面でもしっかりと編集できます.
残念ながらクラウドとの同期機能などは全く備わっていません.が,独自のデータベースを構築したりもしないため,gitやDropboxなどとの連携は容易でしょう.

さらにExport機能も豊富です.

f:id:pudding_info:20170401002242p:plain

微妙なところ

やはりクラウドとの連携がデフォルトでついていない所でしょうか.バックアップや同期の手段は自分で用意する必要があります.Gitを使う場合は別でソフトウェアを使うなり,コマンドを叩くなりする必要があります.そういう意味では玄人向けです.
また,それに絡んでノートにタグを付けたりすることが出来ません.そういう意味でこれは「ノートやメモを取るソフトウェア」ではなく,「Markdown特化エディタ」です.

ノートの管理方法

色々考えられますが,結局のところこれはエディタです.後からの検索性という意味では他のタグをつけることのできるソフトウェアと比較してかなり劣ります.
プロジェクトのドキュメントを書く,すぐPDFにする,クラウドに頼りたくないなどの場面で活躍できるのではないでしょうか.

総評

高機能かつ使いやすい,そして無料とあって非常に魅力的です.個人的にはタイプライターモードが気に入りました.常に視線は中央に置いておいてどんどん書き進められるのが快適で気持ちよかったです.

まとめ

  • 金を払いたくない・高機能が良い・管理は自分でやる
    → Typora
  • 金を払いたくない・機能はそれほど求めない・ファイル管理を気にしたくない
    → Simplenote
  • Evernoteを使っている・高機能が良い・検索性を良くしたい
    → Marxico
  • オフラインで使うことはない・高機能が良い
    → StackEdit

Marxicoはローカルに保存したファイルを開いてエディタとして使うには不向きなソフトウェアです.僕はTyporaとMarxicoを使い分けて使っています.

Typoraは前回コメントで教えていただき非常に気に入ってしまいました.今後もコメント等でこんなのもあるとか,あんなのもあるとか,教えていただければ幸いです.

*1:もしかしたら僕が項目を見つけ切れていないだけかも…

Dockerで簡単にNetatalkを動かしてTimeMachineでバックアップできるようにする

きっかけ

support.apple.com

applech2.com

うちのサーバではsambaでファイル共有をしているのですが,これまでMacではafpプロトコルしか認めておらず,かつてNetatalkをソースからビルドしたときは依存関係に苦しんだことも有り,バックアップは見送り続けてきました.
しかし上記の記事を読んで,本家のサイトでもSMBサポートが記載されていたことも有り,喜び勇んで設定しようとしたもののダメでした.悲しい.

というわけでNetatalk環境を構築しようかと.

環境

  • Ubuntu Server 16.04
  • Docker 1.13.1
  • Docker-compose 1.8.0

前準備

ZFSRAID-Z1を組んでいるので,バックアップ用にボリュームを切り分けます.このとき容量に制限をかけています.

$ sudo zfs create -o mountpoint=/data/timemachine data/timemachine
$ sudo zfs set quota=300G data/timemachine
$ df -h | grep timemachine
data/timemachine   300G   128K  226G  25% /data/timemachine

今回は/data/timemachineNetatalkコンテナにマウントし,バックアップの永続化を行います.

設定

コンテナの選定

今回の目的はTimeMachineでバックアップをとることで,特にファイル共有周りは目的でない(Sambaで間に合っている)ので,以下のコンテナを選択しました.

github.com

odarriba/timemachine - Docker Hub

docker-compose.ymlに書く

特に難しいところは無いです.今回はホストのポートにマッピングしました.

version: "2"
services:
  netatalk:
    container_name: timemachine
    image: odarriba/timemachine:latest
    volumes:
      - /data/timemachine:/timemachine
    ports:
      - 548:548
      - 636:636
    restart: always
    environment:
      AFP_LOGIN: ユーザ名
      AFP_PASSWORD: パスワード
      AFP_NAME: timemachine

AFP_LOGINAFP_PASSWORDの設定が必須です.AFP_NAMEに関してはおそらくMacからマウントしたときに見えるホスト名か何かだろうと思っていたのですが,どうもMac側からは乱数のような値になっていました…

必要な場合はAFP_SIZE_LIMITをMB単位で指定すると良いでしょう.

複数ユーザでの使用

複数ユーザから使用する場合は新たにコンテナに対してコマンドを発行すれば良いようです.

$ docker exec -it timemachine add-account USERNAME PASSWORD MOUNT_POINT [VOL_SIZE_MB]

このコンテナでは起動時にentrypoint.shを実行しています.その際add-accountコマンドを発行しMOUNT_POINTAFP_NAMEを割り当てているようです. しかし,Docker Hubにて作者は

MOUNT_POINT should be an absolute path, preferably a sub-path of /timemachine (e.g., /timemachine/backup), so it will be stored in the according sub-path of your external volume.

としています.ちょっとこの辺り怪しいのでもう少し詳しく調べてissueでも建ててみようかと思っています.

バックアップする

接続テスト

Finderを開いて Cmd + K,サーバのアドレスを指定してログインします.

f:id:pudding_info:20170320230144p:plain

どうもAFP_NAMEが使用されずユーザ名が使用されているようです.

TimeMachineを設定

f:id:pudding_info:20170320231328p:plain

TimeMachineの設定を開いてディスクを選択すると表示されました.後はOKを押して電源に繋ぐだけです.

まとめ

かつて依存関係に苦しんだりしたのは嘘のよう…

今回は必要ないと考えたのでAvahiの設定はしませんでした.したほうが便利なのかなぁ…