Ubuntu Weekly Recipe

第413回UbuntuでGyazoサーバーを構築する

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パッケージからインストールするのがお手軽です。以下のコマンドを実行してください。

$ curl -s https://packagecloud.io/install/repositories/gyazo/gyazo-for-linux/script.deb.sh | sudo bash
$ sudo apt-get install gyazo

Gyazoの使い方

Dashから「gyazo」で検索してクライアントを起動してください。するとマウスカーソルが十字に変形しますので、この状態でgyazoりたい範囲をドラッグ&ドロップで指定してください。その領域のスクリーンショットがサーバーにアップロードされ、Firefoxで開かれます。あとはこのURLを共有したい相手に伝えるだけです。ドラッグ&ドロップでなく、ウィンドウをクリックして領域を指定することもできます。すると、そのウィンドウ全体のスクリーンショットが撮影されます。また、現在デスクトップに表示されている情報ではなく、既にファイルとして保存されている画像をgyazoりたい場合もあるでしょう。この場合はもちろん、適当な画像ビューアーでファイルを開いた上でウィンドウをgyazoってもよいのですが、もっと簡単な方法があります。コマンドラインから以下のコマンドを実行してください。

$ /usr/bin/gyazo (gyazoりたいファイル名)

gyazoは引数にファイル名を指定すると、領域を選択するモードに入ることなく、その画像ファイルを直接アップロードしてくれるのです。gyazoのソースから引用します。

imagefile = ARGV[0]

if imagefile && File.exist?(imagefile) then
  system "convert '#{imagefile}' '#{tmpfile}'"
else
  configfile = "#{ENV['HOME']}/.gyazo.config.yml"
  command = (File.exist?(configfile) && YAML.load_file(configfile)['command']) || 'import'
  system "#{command} '#{tmpfile}'"
end

このように、gyazoは内部でImageMagickのimportコマンドを呼び出して画面をキャプチャしているのですが、ARGV[0]に存在するファイルが指定された場合はimportではなく、そのファイルを直接convertしてアップロード用のpng画像に変換するという挙動をするのです。しかしいちいち端末を開いてコマンドを入力するのは、Gyazoのお手軽さから言えば本末転倒です。そこで、画像を右クリックで直接gyazoれるようにしてみましょう。

「nautilus-actions」パッケージをインストールしてください。エクステンションを有効にするため、一度ファイル(Nautilus)を再起動しておきます。

$ sudo apt-get install nautilus-actions
$ nautilus -q

Dashから「Nautilus-Actions Configuration Tool」を起動し、以下の手順で新しいアイテムを登録してください。

画像
  1. Define a new actionボタンをクリック。
  2. ActionタブのContext labelにgyazoと入力。
  3. CommandタブのPathに/usr/bin/gyazoと入力。
  4. Parametersに%fと入力。
  5. MimetypesタブのMimetype filterの「*」「image/*」に変更。
  6. 保存して終了。

画像ファイルを右クリックすると「Nautilus-Actions actions⁠⁠→⁠gyazo」というメニューが増えています。これを実行すると、ファイルを直接gyazoれます。

画像

Gyazoサーバーを構築する

Gyazoにアップロードした画像には、パスワード等による保護がかかっていません[2]⁠。Gyazoサーバーは、クライアントのリモートアドレスとアップロードされた日時を繋げた文字列のMD5ハッシュ値を元に、画像のファイル名を生成します。URLの推測は困難なため、URLを知らない第三者が目的の画像に到達する可能性は低いでしょう。しかしだからといって、業務上の機密情報が含まれる可能性がある画像をアップロードするわけにはいきません。そこで、ローカルネットワーク内にプライベートなGyazoサーバーを置くことで、この問題を解決しましょう。

画像を受け取るサーバー側のコードもGitHubにあります。これは、画像を受け取ったらファイル名を生成して保存し、そのURLを返すだけのシンプルな実装です。Apache Webサーバーをインストールし、upload.cgiを置いてあげるだけで動作します。それでは実際にやってみましょう。まずはApache WebサーバーとRubyをインストールし、ApacheのCGIモジュールを有効にしておきます。

$ sudo apt-get install apache2 ruby
$ sudo a2enmod cgi

GyazoサーバーはCGIとして動作しますので、/etc/apache2/mods-available/mime.confを書き換え、.cgiファイルをCGIスクリプトとして動作するようマッピングします。以下のAddHandlerのコメントアウトを解除してください。

AddHandlerのコメントアウトを解除
#AddHandler cgi-script .cgi
↓
AddHandler cgi-script .cgi

Gyazoサーバーは/var/www/html以下に置くことにしました。このディレクトリでCGIが実行できるよう、/etc/apache2/apache2.confのOptionsにExecCGIを追記します[3]⁠。

OptionsにExecCGIを追記
<Directory /var/www/>
        Options Indexes FollowSymLinks ExecCGI    ← ExecCGIを追記
        AllowOverride None
        Require all granted
</Directory>

/var/www/html以下にデータ用のディレクトリを作成します。またGyazoサーバーのスクリプトをダウンロードして配置します。

$ sudo install -d -m 755 -g www-data -o www-data /var/www/html/data
$ sudo install -d -m 755 -g www-data -o www-data /var/www/html/db
$ sudo wget -O /var/www/html/upload.cgi https://raw.githubusercontent.com/gyazo/Gyazo/master/Server/upload.cgi
$ sudo chown www-data:www-data /var/www/html/upload.cgi
$ sudo chmod +x /var/www/html/upload.cgi

Gyazoクライアントは画像をアップロードした後、その画像を自動的にWebブラウザで開きましたよね。この際クライアントがブラウザに渡す画像のURLは、サーバーのレスポンスから生成されています。しかし、サーバーが返すのレスポンスの文字列にgyazo.comのURLがハードコーディングされているため、このままではローカルのGyazoサーバーに画像をアップロードしても、ブラウザはgyazo.comを開きに行ってしまいます(そして404になります⁠⁠。

そこで、ダウンロードしたupload.cgiの最後の一行を以下のように変更してください。

GyazoサーバーのFQDNに書き換える
cgi.out(headers){"http://gyazo.com/#{hash}.png"}
↓
cgi.out(headers){"http://(GyazoサーバーのFQDN)/data/#{hash}.png"}

最後にApacheを再起動してください。

$ sudo service apache2 restart

次はクライアント側です。Gyazoクライアントも、スクリプト内にアップロード先のエンドポイントがハードコーディングされているため、ここをローカルのアドレスに書き換える必要があります。/usr/bin/gyazoの60行目付近に以下の記述がありますので、HOST変数をGyazoサーバーのFQDNに書き換えてください。

GyazoサーバーのFQDNに書き換える
# endpoint https://gyazo.com/api/docs
HOST = 'upload.gyazo.com'
CGI = '/upload.cgi'
UA   = 'Gyazo/1.2'

# endpoint https://gyazo.com/api/docs
HOST = 'GyazoサーバーのFQDN'
CGI = '/upload.cgi'
UA   = 'Gyazo/1.2'

Gyazoクライアントは、バージョン1.1からデフォルトでHTTPSを利用するようになりました。そのためサーバー側にSSL証明書の設置が必要になります。しかし今回はローカルネットワーク内での使用に限定していますので、SSLは使わないことにしました。/usr/bin/gyazoの100行目付近を以下のように書き換えます。

SSLを使わないように修正
https = Net::HTTP::Proxy(proxy_host, proxy_port).new(HOST,443)
https.use_ssl = true

https = Net::HTTP::Proxy(proxy_host, proxy_port).new(HOST,80)
https.use_ssl = false

以上で作業は完了です。書き換えたGyazoクライアントでスクリーンショットをgyazoると、ローカルのGyazoサーバーに画像がアップロードされます。

ローカル向けにGyazoクライアントを修正する

前述のように、Gyazoクライアントはスクリプト内に様々なパラメータがハードコーディングされているため、ローカル環境で利用するためにはスクリプトの書き換えが必要です[4]⁠。しかしパッケージから/usr/bin以下にインストールしたスクリプトを直接書き換えるのは、筋が悪すぎると言わざるをえません。またGyazoクライアントには本来、アップロードしたURLを自動的にクリップボードへコピーする機能があるのですが、前述の方法でインストールしたパッケージでは

  • xclipパッケージがDependsに指定されていないためインストールされない
  • xclipコマンドのオプションが間違っている

という2つの問題があり、この機能が動作していません。

そこで、これらの問題を修正することにしました。URLを開くためのコマンド、クリップボードに文字列をコピーするコマンド、サーバーのエンドポイント、CGIのパス、SSL使用の有無といったパラメータを~/.gyazo.config.ymlから読みこむようにしてみました。改変後のコードはここにあります。cloneした後に、deb.shを実行するとDebパッケージがビルドできます。

$ sudo apt-get install devscripts debhelper ruby imagemagick xdotool xclip
$ git clone https://github.com/mizuno-as/Gyazo-for-Linux.git
$ cd Gyazo-for-Linux
$ ./deb.sh
$ sudo dpkg -i ../gyazo_1.2ubuntu1~wily1_all.deb

アップロード先を変更するために、以下の内容で~/.gyazo.config.ymlを作成してください[5]⁠。host以外の値はデフォルトのままでも構いません。

browser_cmd: 'xdg-open'
clipboard_cmd: 'xclip'
clipboard_opt: '-sel clip'
host: 'GyazoサーバーのFQDN'
cgi: '/upload.cgi'
use_ssl: false
http_port: 80
ua: 'Gyazo/1.2'

あとは、標準のGyazoクライアントと同様に使えます。

いかがでしたでしょうか。筆者はGyazoクライアント内にGIMPのフィルタを挟み、スクリーンショットを加工しながらひたすら家庭内Gyazoサーバーに送り込むシステムがあれば、もしかして原稿用のスクリーンショットの撮影や加工が捗るかな、なんて考えています。Gyazoは非常に便利で、特にチャットベースでのコミュニケーションと相性がよいツールです。社内LANにおひとつどうでしょうか?

おすすめ記事

記事・ニュース一覧