Ringを使って魔法のようにkeynoteとslackをコントロールしてみる


##Ringの紹介

Ringは「Shortcut Everything」をコンセプトにした指輪型デバイスです。
Ringを人差し指にはめて、ハリーポッターの杖みたいに、「エイッ！」ってやれば、魔法のようにいろんなことができちゃうっていうデバイスです。

この動画を見ていただければ、すぐに世界観は掴めるかと。

 [
![Screen Shot 2014-11-25 at 2.14.21 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1418/0fd17cad-0760-7e98-e125-94f6effdaa1e.png)
] (http://vimeo.com/108370571) [Vimeoで見る] (http://vimeo.com/108370571)

kicksterterというクラウドファンディングサービスで資金を集めているときに資金提供させてもらった「Ring」がようやく届いたので、とりあえず色々いじってみました。
![8ab3195e54cc61f6e44f17e509072b48.jpg](https://qiita-image-store.s3.amazonaws.com/0/1418/9b163b31-1f76-7148-854a-2d52649a17fd.jpeg)


##KeynoteをRingでコントロールしてみるとちょ〜かっこいい

プレゼンテーションツールの「keynote」を遠隔でコントロールするスマホアプリとかはたくさん出ていますが、「Ring」を使って指で「次へ」とか「前へ」とかができたらかっこいいのでやってみます。

###まずはnodeでAPIを作る

```app.js
    
    var express = require('express');
    var app = express();

    function sendkey(code, callback) {
      var exec = require('child_process').exec;
      //keynoteをアクティブにする
      exec("osascript -e 'tell application \"Keynote\" to activate\'", function(err, stdout, stderr) {
        //Apple Scriptでkeynoteをコントロールできるようにする。
        exec("osascript -e 'tell application \"System Events\" to key code " + code + "'", function(err, stdout, stderr) {
          callback();
        });
      });
    }

    app.get('/right', function (req, res) {
      sendkey(124, function() {                                                                                                                              
        res.sendStatus(200);
      });
    });

    app.get('/left', function (req, res) {
      sendkey(123, function() {
        res.sendStatus(200);
      });
    });

    app.listen(3000);

```

あとは、

```package.json
    {                                                                                                                                                          
      "name": "ring-keynote",
      "version": "0.0.1",
      "private": true,
      "scripts": {
        "start": "node app"
      },
      "dependencies": {
        "express": "*"
      }
    }
```

```console
    npm install
    npm start
```

とするだけ。


あとは、macのIPアドレスを調べてブラウザでアクセスすれば、keynoteのスライドを行ったり来たりできるようになります。

http://(MacのIPアドレス):3000/left
http://(MacのIPアドレス):3000/right


###次にRingのOpenURIで、新しいアクションを追加する

1. Ringのアプリを開く
2. 最下部の「EDIT YOUR ACTION」をタップ
3. 最下部の「Add New Actions」をタップ
4. 「Open URI」をタップ
5. 「Add」をタップ
6. ジェスチャーをタップ
7. APIのURLを入力
8. 必要に応じてジェスチャーも編集できる

7番で入力するAPIのURLは、以下２つ。
http://(MacのIPアドレス):3000/right/
http://(MacのIPアドレス):3000/left/


これで、あとはジェスチャーをするだけ！

実際にジェスチャーをカスタマイズして、こんな感じにしてみました。
![5109a4276635b89504107a50496fa197.jpg](https://qiita-image-store.s3.amazonaws.com/0/1418/b9294273-b052-d963-7ad6-b84c068d15d5.jpeg)

人差し指で「右！」ってやるとkeynoteが次のスライドに行くっていう素敵な状態になりました。

 [
![Screen Shot 2014-11-25 at 10.35.46 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1418/96921290-532f-8473-8c6a-e28789e911aa.png)
] (https://vimeo.com/112767817) [Vimeoで見る] (https://vimeo.com/112767817)

##slackでいいね！的な返事をRingを使って一瞬で済ませてみる

皆さんご存知チャットツール「Slack」を使って、チャット内での「いいね！」的な簡単なコミュニケーションをわざわざアプリを見なくともできると楽だなと思ったので、作ってみました。

これはAPIをrailsアプリにして作ってみました。

```console
    rails new slack_by_ring
```
　
slackにポストするメソッドを作成

```app/model/slack_post.rb

    require 'addressable/uri'
    require 'net/http'
    
    class SlackPost

      def self.post_to_slack
        endpoint = 'https://slack.com/api/chat.postMessage'
        token="#{SLACK_API_TOKEN}"
        channel=params[:channel]
        text=':thumbsup:' #何でもいい
        username="#{USERNAME}"
        icon_url="#{ICON画像のURL}"
    
        uri = Addressable::URI.parse(endpoint)
        query = {token: token, channel: channel, text: text, username: username, icon_url: icon_url}
        uri.query_values ||= {}
        uri.query_values = uri.query_values.merge(query)
    
        Net::HTTP.get(URI.parse(uri))

      end
        
    end

```

apiを作成

```app/controller/apis_controller.rb
    
    class ApisController < ApplicationController
    
      def send_to_slack
        eval("SlackPost.post_to_slack(#{params[:channel]})")                                                                                                              
        render json: {result: "done"}
      end
    
    end

```

これで、localhostでサーバーを立ち上げて、パラメータに投稿したいchannel名を指定してアクセスすれば、指定のslackのchannelにいいね！の絵文字が投稿される。

http://localhost:3000/apis/send_to_slack?channel=#{CHANNEL_NAME}

 [
![Screen Shot 2014-11-25 at 10.36.04 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1418/1895c819-ebe2-9267-4bb9-6107673c2640.png)
] (https://vimeo.com/112767818) [Vimeoで見る] (https://vimeo.com/112767818)


####利用イメージ

slackのデスクトップノーティフィケーションで見えた内容で判断して「いいね！」ってやりたいときに、slackをアクティブにしなくても、Ringでジェスチャーをするだけで、「いいね！」って送れるので楽！！

ただ、それだけですｗ


まだまだアイデア次第では色々なことができそうですね！！
面白い！！