日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Hubotによるポエム、猫、それはまさにすばらしきこのせかい。

この記事はChatOps Advent Calendar 2015 - Qiitaの6日目として書かれています。

こんにちは @ara_ta3 です。
私は Dark - Developers at Real Kommunity | Doorkeeper というコミュニティで活動してるのですが、このコミュニティではSlackをコミュニケーションツールとして利用してます。
今日はそこでよく使われているDark Botの話をしようと思います。

Dark Bot?

私達のコミュニティのSlack内にいるHubotです。

Hubot - https://hubot.github.com

どんな機能があるの?

例えば dark catdark poemです。
なんとなくわかりそうでわからないと思いますが、Dark Bot

  • dark cat 猫による癒やしを与える。
  • dark poem オサレポエムによって自らの中にあるなんとも言えない気持ちを解消してもらう。

と言った機能を持っています。
つまりこれらは僕らの気持ちの状態をいい方向へ持って行ってくれるすばらしい機能です。
例えば、心が廃れた時、猫の画像が見たくなるじゃないですか。
例えば、心が廃れた時、オサレポエムが見たくなるじゃないですか。
ちなみに私は dark cat マンチカンとうちます。
Chatによって、人の状態を改善するOpを実行する。最高のChatOpsですね!!!11

実装について

dark cat

ただただhubot imageです。

github.com

dark cat -> dark image 猫
dark cat hoge -> dark image 猫 hoge
となるような実装を行っています。

こんな感じになります。
f:id:arata3da4:20151206020431p:plain

つい先日長らくDeprecatedだったAPIが閉じられたせいでhubot imageが無料で使えなくなったりしましたが、Google Custom Searchを利用すれば利用可能です。
無料枠は100 requests / day みたいですね。

developers.google.com

Google Custom Searchの設定等は本アドベントカレンダーの2日目の記事がとてもわかりやすいと思います。

qiita.com

dark catだけで猫の画像が見れる最高の機能でした。

dark poem

ただただ、設定されたポエムのリストの中からランダムで1つを返してくれる機能です。
poems.jsonにポエムリストをためておき、その中からランダムで取得しています。
例えばこんな感じです。
f:id:arata3da4:20151206021900p:plain

実装は下記のような形。

poem.coffee

json = require '../settings/poems.json'

class Util

  shuffleAll: (targets) ->
    i = targets.length
    if i is 0 then return false
    while --i
      j = Math.floor Math.random() * (i + 1)
      tmpi = targets[i]
      tmpj = targets[j]
      targets[i] = tmpj
      targets[j] = tmpi
    return targets

  shuffle: (targets, idx) ->
    targets = this.shuffleAll targets
    idx = if(idx == undefined ) then 0 else idx
    targets[idx]

util = new Util

module.exports = (robot) ->

  robot.respond /poem$/i, (res) ->
    res.send util.shuffle json.poem

特におすすめのオサレポエムの参考はここです。matome.naver.jp

まとめ

  • 猫やポエムは人の心を救う。
  • なにかつらいことがあったらdark poem または dark catと打ちましょう。きっと救われます。

明日の ChatOps Advent Calendar 2015 - Qiitapine613 さんによる記事です。
お楽しみに。

Darkを支える技術 #1 Slackでユーザを招待する編

この記事は Dark - Developers at Real Kommunity Advent Calendar 2015 - Adventar の5日目として書かれています。

こんばんは。たなあら (@ara_ta3) | Twitter です。
Darkのアドベントカレンダーに絶対に空きは作りません。
酔っ払った勢いで書ける唯一のアドベントカレンダーとして書き続けます←

Darkというコミュニティのアドベントカレンダーとして書いています。
もし興味を持たれた方はTwitter等で絡んで頂ければと思います。
Dark - Developers at Real Kommunity | Doorkeeper

DarkではSlackを利用して、日頃の闇を・・・ごほんごほん。日頃のコミュニケーションを行っております。
そのインテグレーションの紹介でもできたらなーって思いで今日はポエムを書きます。

DarkのSlackではインテグレーションがいくつかあります。
こんな感じです。

f:id:arata3da4:20151130235229p:plain

今日はこのSlack APIの利用について話そうかと思います。

このグループではSlackの招待はイベントに来てくださった方に招待を送っているのですが、どうしても招待を送るタイミングがイベント後になってしまって当日のタイミングでSlackに入れないということが起こってしまいます。
なので、2015/12/12のイベントから招待制にすることにしました。
そうして利用したのがSlackInというライブラリ。

github.com

これを利用して、自分のサーバに立てました。
こんな感じです。

f:id:arata3da4:20151130235708p:plain

README.mdにもある通りにコマンドを実行すれば問題なく招待ページが起動出来ます。

$npm install -g slackin
$slackin "your-team-id" "your-slack-token"

そして、nginxで一部のパスだけslackinのほうに下記のようにroutingしています。
昔インストールされているapacheのversionが2.4でsocket.ioの設定がうまく出来なかったのでnginxにしました。

server {
  listen 80;
  server_name my.domain.com;

  root /path/to/document/root;
  access_log /path/to/access/log;

  proxy_redirect                          off;
  proxy_set_header Host                   $host;
  proxy_set_header X-Real-IP              $remote_addr;
  proxy_set_header X-Forwarded-Host       $host;
  proxy_set_header X-Forwarded-Server     $host;
  proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

  location /slack {
    auth_basic "Restricted";
    auth_basic_user_file /path/to/.htpasswd;
    proxy_pass http://localhost:3000/;
  }

  location /assets {
    proxy_pass http://localhost:3000/assets;
  }

  location /invite {
    auth_basic "Restricted";
    auth_basic_user_file /path/to/.htpasswd;
    proxy_pass http://localhost:3000/invite;
  }

  location /socket.io {
    proxy_pass http://localhost:3000/socket.io/?$args;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

いやー最高。これでポチポチ招待送ってた地味な作業もごほんごほん。

ただ、私のサーバにはBasic認証を入れているので、イベントに来ないと招待できない仕様になっています。
イベントに来なくても招待できてもいいかなぁと思いつつとりあえずはイベントに来てくださった方だけにしようかなと思いました。

興味持たれた方は是非ご参加よろしくお願いしまっすヽ(´ω`)ノ
http://yamiga.waka.ru.com/

Dark - Developers at Real Kommunity | Doorkeeper

Slackに新しいチャンネルができたら、特定のチャンネルに通知を送るスクリプトを組んでみた。

この記事はSlack Advent Calendar 2015の4日目として書かれています。

qiita.com

こんにちは@ara_ta3です。
自分が属してるDarkというコミュニティでSlackを利用しているのですが、なにかおもしろいチャンネルができても気が付けないことがあるので、チャンネルが出来たことに気が付きたいと思いました。
Real Time Messaging API | Slack とかあるので、チャンネルが出来たというイベントを元にSlackにメッセージを送れればできるのでとても簡単なはずです
Slack RTMのライブラリ絶対あるだろって思ったらさくっと見つかりました。

xBytez/slackbotapi · GitHub

言語がJavaScriptなのは初めHubotでやろうと思ってたからです。

今回作ったレポジトリはこちら

github.com

JavaScript実装

var slackAPI = require('slackbotapi');
var token = process.env.WEB_SLACK_TOKEN;
var botName = process.env.BOT_NAME;
var targetChannel = process.env.TARGET_SLACK_CHANNEL;

if (!token) {
    console.error("slack web api token is not set");
    console.error("please `export WEB_SLACK_TOKEN`");
    process.exit(1);
}
var slack = new slackAPI({
    'token': token,
    'logging': true,
    'autoReconnect': true
});

slack.on('channel_created', function (data) {
    var data = {
        channel: targetChannel,
        username: botName,
        text: "new channel <#" + data.channel.id + "|" + data.channel.name +"> has been created",
    };
    slack.reqAPI("chat.postMessage",data);
});

という感じです。
利用したライブラリが機能豊富でとてもよかったです。
reqAPIというメソッドによって Slack Web API | Slack の方も呼べるので便利です。

実行結果

起動すると下記のようなログが流れます。

22:11 20s 621ms [Transport] [SlackAPI]      Received: {"type":"hello"}
22:11 20s 622ms [Transport] [SlackAPI]      Received: {"reply_to":2458,"type":"message","channel":"C068Q2S5N","user":"U068Q58E6","text":"%hoge","ts":"1448280564.000023"}
22:11 27s 955ms [Transport] [SlackAPI]      Received: {"type":"channel_marked","channel":"C08A0JK4H","ts":"1448284253.000021","unread_count":0,"unread_count_display":0,"num_mentions":0,"num_mentions_display":0,"mention_count":0,"mention_count_display":0}
22:11 46s 540ms [Transport] [SlackAPI]      Received: {"type":"channel_created","channel":{"id":"C0F4824MD","is_channel":true,"name":"dummy","created":1448284306,"creator":"U068Q58E6"},"event_ts":"1448284306.887779"}
22:11 46s 753ms [Transport] [SlackAPI]      Received: {"type":"channel_joined","channel":{"id":"C0F4824MD","name":"dummy","is_channel":true,"created":1448284306,"creator":"U068Q58E6","is_archived":false,"is_general":false,"is_member":true,"last_read":"0000000000.000000","latest":null,"unread_count":0,"unread_count_display":0,"members":["U068Q58E6"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"","creator":"","last_set":0}}}
22:11 46s 753ms [Transport] [SlackAPI]      Received: {"user":"U068Q58E6","type":"message","subtype":"channel_join","text":"<@U068Q58E6|arata> has joined the channel","channel":"C0F4824MD","ts":"1448284306.000002"}
22:11 46s 753ms [Transport] [SlackAPI]      Received: {"type":"pref_change","name":"has_created_channel","value":true}
22:11 47s 439ms [Transport] [SlackAPI]      Received: {"text":"new channel <#C0F4824MD|dummy> has been created","username":"slackbot","type":"message","subtype":"bot_message","channel":"C091NMHGT","ts":"1448284307.000003"}

4行目でchannel_createdのイベントが起きて、8行目でbot_messageとしてチャンネルが出来たよっていうメッセージが飛んでるのがわかりますね。

まとめ

これでSlackにどんなに人が増えて、色んな人が色んなチャンネルを作ったとしても気がつけますね!
最高!!11

明日の担当は@nofrmmさんです!
楽しみにしてます!

(だいたい)新卒エンジニア向け技術交流会vol.4 を実施して話したという話

9/19(土)にこんなイベントがありました。

ngineerxiv.doorkeeper.jp

今回シルバーウィーク前だし、そんなに人来ないかもしれないから発表するって言っておこうって思ったら結構発表者多くなってびっくりでしたw
今回はScala.jsがネタにあふれて面白そうだったので、使ってみた感じの話をしました。

■自分の発表

資料はこんな感じです。

www.slideshare.net

やったのはVue.jsのExampleにもあるTODOアプリ(?)をScala.jsで書いてみた感じのことです。
レポジトリはこちら

github.com

そして、感想にも書いたのですが、Dom周りと密接に関わるライブラリを使ってScala.jsでJavaScriptを書くのはDynamicを利用する部分が多く、Scalaの良さを活かしきれない感じがしました。
あとコンパイルの速度の話はしませんでした。

■他の方の発表

@petitviolet 氏による 「初めての関数型プログラミング

speakerdeck.com

名前初め読めませんでしたが、覚えました←w
もなどについてよくわかってないのですが、理解が少し深まった気がします。

@__papix__ 氏による「キラキラ技術に群がる俺達お前達に物申す」

資料は見当たらなかったのですが、タイトルから変更して、YAPC::EUに発表者として参加してきた時の話をしてくれました。
スペインのエレベータは閉じるボタンが無く、閉じるだと思って押すとブザーがなるというつらいインターフェースの話が心に残ってますw
インターフェース大事ですね

YAPC::Europe 2015


@YAMITZKY 氏による「Alfred Workflowで業務効率化してみた」

Alfredの無料のものを使っている、コミットメントが足りない我々に対する熱いメッセージが伝わりましたww
ライセンスを買った有料版だと色々カスタマイズしたスクリプトをターミナルから起動したり出来るみたいですね。
興味はわいたのでお金に余裕があるときに買ってみてもいいかなぁ・・・って思って・・・ます。

www.alfredapp.com

■次回予告とか

一度参加していただけた方をSlackチームに招待して色々他のイベントとかもやってたりします
今度は中で結成したチームでIsuconに出るつもりです。
(チーム名は「Dark」です)
このイベント自体はまた3ヶ月後の12月にやろうと思います。
気になる方々は是非参加してください〜

Dark - Developers at Real Kommunity | Doorkeeper