GrabBox が Sierra で動かなかった

## 概要

- Mac で GrabBoxというキャプチャツールをいまだに使っている(http://d.hatena.ne.jp/tell-k/20110523/1306166332)
- OS を Sierra したら動かなくなっていた。(本当に Sierra のせいなのかどうかは謎) 悲しい
- とりあえず急場しのぎの対応をしたのでメモ

## 状況

- GrabBoxは正常にインスコされてるが、**Shift + Cmd + 4** でキャプチャを取ってもDropboxに画像ファイルが保存されない
- DrobpoxにあるGrabBoxのアプリのディレクトリに直接画像ファイルを置くと公開されるのは確認できた。

## 対応

- キャプチャを取ったら、Dropboxの所定のディレクトリに画像を移動させることができれば、いままでと使い勝手が一緒なので良い。
- Macでスクリーンショットの保存先を変えることはできるので、Pythonで雑に以下のようなことをするスクリプトを用意した。

1. スクリーンショットの保存先を、特定のディクレトリにする
2. 特定のディクレトリを監視して、ファイル作成を検知する(watchdog)
4. 作成したファイルが画像だったら、適当にユニークな名前にリネームする
5. Retineは画像サイズが2倍になるらしいので、1/2 にリサイズずる(Pillow)
6. リサイズした画像を、DropboxのGrabBoxのディクレトリに移動
7. Dropboxの公開用のURLを生成する
8. 公開用URLをクリップボードにコピーする(pbcopy)

スクリプトの内容はこんな感じ

```python:move2dropbox.py
# -*- coding: utf-8 -*-
import time
import os
import uuid
import shutil
import subprocess

from PIL import Image
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

here = os.path.abspath(os.path.dirname(__file__))
HOME_DIR = os.path.expanduser('~')

SCREENSHOT_DIR = os.path.join(here, 'screenshot')
DROPBOX_DIR = os.path.join(HOME_DIR, 'Dropbox', 'アプリ', 'GrabBox')
DROPBOX_URL = 'https://dl.dropboxusercontent.com/spa/xxxxxxxxx/'

CMD_LOCATION = 'defaults write com.apple.screencapture location {}'.format(SCREENSHOT_DIR)  # NOQA
CMD_NAME = 'defaults write com.apple.screencapture name "grabox"'
CMD_KILLALL = 'killall SystemUIServer'


def resize_for_retina(imgfile):
    img = Image.open(imgfile)
    resized = img.resize([int(0.5 * s) for s in img.size])
    resized.save(imgfile)


class MyHandler(FileSystemEventHandler):
    def on_created(self, event):
        for img in os.listdir(SCREENSHOT_DIR):
            if not img.endswith('.png'):
                continue
            new_img = '{}.png'.format(uuid.uuid4().hex)
            resize_for_retina(os.path.join(SCREENSHOT_DIR, img))
            shutil.move(
                os.path.join(SCREENSHOT_DIR, img),
                os.path.join(DROPBOX_DIR, new_img)
            )
            subprocess.call(
                'echo "{}" | pbcopy'.format(DROPBOX_URL + new_img),
                shell=True
            )

if __name__ == "__main__":
    if not os.path.exists(SCREENSHOT_DIR):
        os.makedirs(SCREENSHOT_DIR)

    subprocess.call(CMD_LOCATION, shell=True)
    subprocess.call(CMD_NAME, shell=True)
    subprocess.call(CMD_KILLALL, shell=True)

    observer = Observer()
    observer.schedule(MyHandler(), path=SCREENSHOT_DIR, recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
```

最後に、このスクリプトをバックグラウンドで叩くシェルスクリプトを作る

```bash:move2dropbox.command
nohup python /path/to/move2dropbox.py > /dev/null 2>&1 &
```

**「.command」** という拡張子にして、あとは **「システム環境 > ユーザとグループ > ログイン項目」** に登録する


![79875dc4b71446639623ade7b08f0421.png](https://qiita-image-store.s3.amazonaws.com/0/1843/be30df70-b57d-4b6c-3a48-7d426f41c0a7.png)


これでログイン時に、上記監視スクリプトが勝手に実行される。

# まとめ

- あなたのオススメのキャプチャツールを今すぐ教えてください(切実)

# 追記(2016/10/31)

おすすめされたものを列挙

- Monosnap(https://monosnap.com/welcome)
- Screenpresso(http://www.screenpresso.com/) Windows and iOS only

おわり