研究室にはネコがいる

こんにちは.北山です.

さて,タイトルの「研究室にはネコがいる」ですが,もちろんリアルなネコがいるわけではありません.じゃあポケモンGO(とりあえず流行なのでいいたいだけ)のようなARか?というとそうでもありません.Slackで動いているBotです.

このSlack Botなネコですが,第1期生の置き土産である研究室ロゴの原案を元に,第2期生が書き起こしてくれたネコ画像を使って,第3期生の時代から運用しています.第4期生である今年はイヌというライバルが出現しました(学生が作ってくれたので卒業するときに引き継ぎどうしようというありがたい悩みがあります).

このネコですがどんなことができるのか?というと,

  • 誰?:ランダムでメンバ選定
  • {A,B,C} どの順番?:A,B,Cをランダムに並び替えてくれる
  • {A,B,C} どれ?:A,B,Cの中からランダム選択
  • 電話:電話を受けた時の報告テンプレ
  • 報告:報告関係フォームの紹介
  • ドライブ:よく使うGoogleDriveファイルの紹介

と多機能なネコで,特に前の3つのランダムに適当に決めてくれるというのはひどく重宝します.

私が学生の時に,毎回嫌な思いをしていたのが「研究ミーティングでの発表順決め」です.指導教員は「研究ミーティングというのは発表したい人が枠を争うもの」という認識,学生側は「発表しないと進まないけど,発表すると大体怒られるからなるべくやりたくないもの」という認識でした.そのため,研究ミーティング開始時に順番が決まっていない(みんな1番が嫌)ことも多く,決まってないことで怒られるのも馬鹿らしいので,1番に発表を始めれる時は自分から開始するようになっていきました.

そんなこんなで,順番決めのためだけに「各自,現状の進捗具合からの優先度を報告」「取りまとめがその優先度を元にスケジュールを組む」などの仕組みが作られたりしたのですが,結局は学生の負担が増すばかりという結果に(まあ,おかげでマネジメントの勉強になったといえばなったのでしょうか).

こういうことに限らず「第3者がなるべく公平に決めてくれることが平和的解決」という場面は多いと感じています.ただ,最近研究室内の決め事をネコに頼りすぎてて,話し合いで解決の比重が下がっているように感じるのはちょっとした問題かなぁとも思います.

Slack Botの作成は「初心者がGASでSlack Botをつくってみた | CAMPHOR- Tech Blog 」を参考にしました.ちなみにネコbotのコードは以下です.

function doPost(e) {
  var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
  var bot_name = "ネコ";
  var bot_icon = アイコン画像のURL;
  var verify_token = 秘密;

  if (verify_token != e.parameter.token) {
    return app.postMessage(固定チャンネル名, "失敗してるにゃ", {
      username: bot_name
    });
  }

  var app = SlackApp.create(token);
  var message;

  if (e.parameter.text.indexOf('オーダー') != -1 || e.parameter.text.indexOf('順番') != -1){
    if (e.parameter.text.match(/[\{{.*[\}}]/) || Math.random() < 0.95){
      var str0 = e.parameter.text.match(/[\{{].*[\}}]/);
      var str = str0[0].substring(1,str0[0].length-1).split(/[,,と]/);
      var order = shuffle(str);
      message = ". oO(";
      var i = 0;
      for(; i < order.length -1; i++){
        message += order[i] + ",";
      }
      message += order[i] + "の順がいいにゃぁ)";
    } else {
      message = ". oO(それは無理な相談だにゃぁ)";
    }
  } else if (e.parameter.text.match(/[\{{.*[\}}]/)){
    var str0 = e.parameter.text.match(/[\{{].*[\}}]/);
    var str = str0[0].substring(1,str0[0].length-1).split(/[,,と]/);
    var select = str[ Math.floor( Math.random() * str.length ) ];
    if (select == "" || Math.random() > 0.95){
      message = ". oO(どれでもいいにゃぁ)"
    } else {
      message = ". oO(" + select + " がいいにゃぁ)";
    }
  } else if(e.parameter.text.indexOf('誰') != -1 || e.parameter.text.indexOf('だれ') != -1) {
    var temp_member = app.usersList().members;
    var member = [];
    for(var i = 0; i < temp_member.length; i++){
      if(temp_member[i].deleted == false){
        member.push(temp_member[i]);
      }
    }
    var name = member[ Math.floor( Math.random() * member.length ) ].name;
    if (name == "slackbot"){
      message = ". oO(だれでもいいにゃぁ)";
    } else {
      message = ". oO( @" + name + " だろうにゃぁ)";
    }
  } else if ( e.parameter.text.indexOf('電話') != -1) {
    message = "がちゃ(電話を受けたら以下を報告だにゃぁ) \n";
    message += "名前:\n日時:\n要件:";
  } else if ( e.parameter.text.indexOf('ドライブ') != -1) {
    message = ". oO(よく使いそうなのは以下だにゃぁ)\n"; 
    message += "連絡会:\n ドライブのURL \n";
    message += "研究会:\n ドライブのURL \n";
    message += "発表練習:\n ドライブのURL";
  } else if ( e.parameter.text.indexOf('報告') != -1) {
    message = ". oO(よく使いそうなのは以下だにゃぁ)\n"; 
    message += "欠席・遅刻届:\n フォームのURL \n";
    message += "文献紹介:\n フォームのURL \n";
    message += "研究聴講:\n フォームのURL \n";
    message += "就活報告:\n フォームのURL";
  } else if ( e.parameter.text.indexOf('能力') != -1 || e.parameter.text.indexOf('できる') != -1 ) {
    message = ". oO(以下のことができるにゃぁ)\n"; 
    message += "誰?:ランダムでメンバ選定 \n";
    message += "{A,B,C} どの順番?:順番決定 \n";
    message += "{A,B,C} どれ?:ランダム選択 \n";
    message += "電話:電話を受けた時の報告テンプレ \n";
    message += "報告:報告関係フォームの紹介 \n";
    message += "ドライブ:よく使うGoogleDriveファイルの紹介";
  } else {
    var neko = ["にゃー", "みゃー", "ふー", "にゃ?", "ばしっ!(猫パンチ)"];
    message = neko[ Math.floor( Math.random() * neko.length ) ];
  }

  return app.postMessage(e.parameter.channel_id, message, {
  username: bot_name,
  icon_url: bot_icon
  });
}

function shuffle(array) {//ランダム化する関数
  var shuffled = [];
  var len;
  while(len = array.length){
    var ele = array.splice(Math.floor(Math.random() * len),1)[0];
    shuffled.push(ele);
  }
  return shuffled;
}

さて,今日はこのくらいで.ではでは.

広告

研究室にはネコがいる」への2件のフィードバック

  1. ピンバック: 関係アルゴリズムったー | kitayama lab

  2. ピンバック: GASでスプレッドシートにアクセスしてキューを作る | kitayama lab

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中