Gyazoというサービスがあります。これはPC上で撮影したスクリーンショットをサーバーにアップロードし、共有するサービスです。「操作方法を質問したい」「エラーが出たので見てほしい」「おもしろいWeb広告見つけた」などなど、PCを利用していると、今の画面の状態をそのまま人に見せたいシーンには数多く遭遇しますよね。Gyazoはそんな時に活躍するツールです。デスクトップ上の選択した領域のスクリーンショットを撮影し、サーバーにアップロードしてURLを生成してくれます。
大抵のデスクトップ環境にはスクリーンショットを撮影する機能が用意されています。UbuntuであればPrtScキーを押してスクリーンショットアプリを起動し、保存した画像をDropboxあたりにアップロードすれば、Gyazoを使わなくても目的を達成することは可能です。しかし、これは非常に手間ですよね。Gyazoは「やっていることは単純だけれど、面倒なひと手間を劇的に軽減してくれる」タイプのツールです。実際筆者の職場でも、なにかを人に見せる時は画面をgyazoって[1]、URLをSkypeに貼るのが定番の運用になっています。今回はUbuntuでのGyazoの使い方と、プライベートなGyazoサーバーの構築手順を紹介します。
Gyazoクライアントをインストールする
GyazoのLinuxクライアントのソースコードはGitHubに用意されています。Gyazoクライアントは単なるRubyのスクリプトですので、ここから手動でインストール、あるいは手元でパッケージをビルドしても構いませんが、Ubuntu用のDebパッケージが用意されています。通常はDebパッケージからインストールするのがお手軽です。以下のコマンドを実行してください。
Gyazoの使い方
Dashから「gyazo」で検索してクライアントを起動してください。するとマウスカーソルが十字に変形しますので、この状態でgyazoりたい範囲をドラッグ&ドロップで指定してください。その領域のスクリーンショットがサーバーにアップロードされ、Firefoxで開かれます。あとはこのURLを共有したい相手に伝えるだけです。ドラッグ&ドロップでなく、ウィンドウをクリックして領域を指定することもできます。すると、そのウィンドウ全体のスクリーンショットが撮影されます。また、現在デスクトップに表示されている情報ではなく、既にファイルとして保存されている画像をgyazoりたい場合もあるでしょう。この場合はもちろん、適当な画像ビューアーでファイルを開いた上でウィンドウをgyazoってもよいのですが、もっと簡単な方法があります。コマンドラインから以下のコマンドを実行してください。
gyazoは引数にファイル名を指定すると、領域を選択するモードに入ることなく、その画像ファイルを直接アップロードしてくれるのです。gyazoのソースから引用します。
このように、gyazoは内部でImageMagickのimportコマンドを呼び出して画面をキャプチャしているのですが、ARGV[0]に存在するファイルが指定された場合はimportではなく、そのファイルを直接convertしてアップロード用のpng画像に変換するという挙動をするのです。しかしいちいち端末を開いてコマンドを入力するのは、Gyazoのお手軽さから言えば本末転倒です。そこで、画像を右クリックで直接gyazoれるようにしてみましょう。
「nautilus-actions」パッケージをインストールしてください。エクステンションを有効にするため、一度ファイル(Nautilus)を再起動しておきます。
Dashから「Nautilus-Actions Configuration Tool」を起動し、以下の手順で新しいアイテムを登録してください。
- Define a new actionボタンをクリック。
- ActionタブのContext labelにgyazoと入力。
- CommandタブのPathに/usr/bin/gyazoと入力。
- Parametersに%fと入力。
- MimetypesタブのMimetype filterの「*」を「image/*」に変更。
- 保存して終了。
画像ファイルを右クリックすると「Nautilus-Actions actions」→「gyazo」というメニューが増えています。これを実行すると、ファイルを直接gyazoれます。
Gyazoサーバーを構築する
Gyazoにアップロードした画像には、パスワード等による保護がかかっていません[2]。Gyazoサーバーは、クライアントのリモートアドレスとアップロードされた日時を繋げた文字列のMD5ハッシュ値を元に、画像のファイル名を生成します。URLの推測は困難なため、URLを知らない第三者が目的の画像に到達する可能性は低いでしょう。しかしだからといって、業務上の機密情報が含まれる可能性がある画像をアップロードするわけにはいきません。そこで、ローカルネットワーク内にプライベートなGyazoサーバーを置くことで、この問題を解決しましょう。
画像を受け取るサーバー側のコードもGitHubにあります。これは、画像を受け取ったらファイル名を生成して保存し、そのURLを返すだけのシンプルな実装です。Apache Webサーバーをインストールし、upload.cgiを置いてあげるだけで動作します。それでは実際にやってみましょう。まずはApache WebサーバーとRubyをインストールし、ApacheのCGIモジュールを有効にしておきます。
GyazoサーバーはCGIとして動作しますので、/etc/apache2/mods-available/mime.confを書き換え、.cgiファイルをCGIスクリプトとして動作するようマッピングします。以下のAddHandlerのコメントアウトを解除してください。
Gyazoサーバーは/var/www/html以下に置くことにしました。このディレクトリでCGIが実行できるよう、/etc/apache2/apache2.confのOptionsにExecCGIを追記します[3]。
/var/www/html以下にデータ用のディレクトリを作成します。またGyazoサーバーのスクリプトをダウンロードして配置します。
Gyazoクライアントは画像をアップロードした後、その画像を自動的にWebブラウザで開きましたよね。この際クライアントがブラウザに渡す画像のURLは、サーバーのレスポンスから生成されています。しかし、サーバーが返すのレスポンスの文字列にgyazo.comのURLがハードコーディングされているため、このままではローカルのGyazoサーバーに画像をアップロードしても、ブラウザはgyazo.comを開きに行ってしまいます(そして404になります)。
そこで、ダウンロードしたupload.cgiの最後の一行を以下のように変更してください。
最後にApacheを再起動してください。
次はクライアント側です。Gyazoクライアントも、スクリプト内にアップロード先のエンドポイントがハードコーディングされているため、ここをローカルのアドレスに書き換える必要があります。/usr/bin/gyazoの60行目付近に以下の記述がありますので、HOST変数をGyazoサーバーのFQDNに書き換えてください。
Gyazoクライアントは、バージョン1.1からデフォルトでHTTPSを利用するようになりました。そのためサーバー側にSSL証明書の設置が必要になります。しかし今回はローカルネットワーク内での使用に限定していますので、SSLは使わないことにしました。/usr/bin/gyazoの100行目付近を以下のように書き換えます。
以上で作業は完了です。書き換えたGyazoクライアントでスクリーンショットをgyazoると、ローカルのGyazoサーバーに画像がアップロードされます。
ローカル向けにGyazoクライアントを修正する
前述のように、Gyazoクライアントはスクリプト内に様々なパラメータがハードコーディングされているため、ローカル環境で利用するためにはスクリプトの書き換えが必要です[4]。しかしパッケージから/usr/bin以下にインストールしたスクリプトを直接書き換えるのは、筋が悪すぎると言わざるをえません。またGyazoクライアントには本来、アップロードしたURLを自動的にクリップボードへコピーする機能があるのですが、前述の方法でインストールしたパッケージでは
- xclipパッケージがDependsに指定されていないためインストールされない
- xclipコマンドのオプションが間違っている
という2つの問題があり、この機能が動作していません。
そこで、これらの問題を修正することにしました。URLを開くためのコマンド、クリップボードに文字列をコピーするコマンド、サーバーのエンドポイント、CGIのパス、SSL使用の有無といったパラメータを~/.gyazo.config.ymlから読みこむようにしてみました。改変後のコードはここにあります。cloneした後に、deb.shを実行するとDebパッケージがビルドできます。
アップロード先を変更するために、以下の内容で~/.gyazo.config.ymlを作成してください[5]。host以外の値はデフォルトのままでも構いません。
あとは、標準のGyazoクライアントと同様に使えます。
いかがでしたでしょうか。筆者はGyazoクライアント内にGIMPのフィルタを挟み、スクリーンショットを加工しながらひたすら家庭内Gyazoサーバーに送り込むシステムがあれば、もしかして原稿用のスクリーンショットの撮影や加工が捗るかな、なんて考えています。Gyazoは非常に便利で、特にチャットベースでのコミュニケーションと相性がよいツールです。社内LANにおひとつどうでしょうか?