究極の多様性コミュニティ伊藤会について

この記事は[Classi Advent Calendar 2018](https://qiita.com/advent-calendar/2018/classi) 9日目の記事です。

はじめまして、Classiの伊藤です。
今回は、Classiの非公式にして謎のコミュニティ、伊藤会について書きたいと思います。

# 伊藤会とは

Classiで働く、名字が伊藤の人ならもれなく、むしろ強制的に加入できるコミュニティです。
逆を返せば伊藤さん以外は、伊藤さんと結婚してもらうか、養子に入ってもらうかしない限り加入することは出来ません。

伊藤姓は全国でも５本の指に入る人数の多さですが、それでも1000人いたら8人程度の比率です。ところが、Classiでは120人程度の中で6人という異常な比率となっています。Classiの5%は伊藤で出来ていると言っても過言ではありません。むしろ、Classiのiは伊藤のiです！（嘘です。）

# 伊藤会のメンバー構成

- Classiの創業当時から在籍しておりかれこれ5年目を迎える、プロダクト部所属の伊藤さん（この記事を書いている人）
- 経営推進部所属で人事を担当している伊藤さん（2018年2月入社）
- マーケティング部所属でカスタマーサクセス、企画となんでもこなす伊藤さん（2018年4月入社）
- AI室所属でデータサイエンティストの伊藤さん（2018年5月入社）
- 企画部所属で最近結婚して伊藤姓になった伊藤さん（2018年5月入籍）
- そして11月にClassiにジョインしたUX室所属の伊藤さん（2018年11月入社）

ご覧の通り、今年に入ってから異常なペースで伊藤さんが増えています。しかも、Classiの各部署に満遍なく伊藤さんが配属されており、これは、会社として伊藤採用が行われているなど、なにか大きな力が働いていると思わざるを得ません。

# 伊藤会の活動

伊藤会では以下のような活動（というほどでも無いですが。）をしています。

### 月イチのランチ会
企画部で新婚の伊藤さんセレクトのBIODYNAMIE新宿店でのひとコマ。UX室の伊藤さんの歓迎ランチ。
![iOS の画像_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/47919/d8de1498-cc76-b40e-e5d3-a86f41956db3.jpeg)

### 不定期の呑み会
伊藤会初の呑み会での乾杯ショット。ランチの写真もそうですが、マーケ部の伊藤さんの自撮りと編集がイケてます。
![iOS の画像_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/47919/c6a0dae3-94bf-5013-81ca-24ed033212f4.jpeg)


### Slackの伊藤会チャンネルでのコミュニケーション
UX室の伊藤さんジョイン時のひとコマ。こうやってあらためて見るとカオスですね。
<img width="408" alt="IMG_1497.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/47919/95bb9656-beb0-91e0-2d94-1f7738ccf59c.png">

# 伊藤会の良いところ

### 謎の親近感と結束力
名字が同じというだけでなぜか親近感が湧き、普段の業務ではほぼコミュニケーションの無いメンバーですが謎の結束力があります。ひょっとしたら遠い先祖で繋がっているのかもしれません。

### 点と点のコミュニティ
社内コミュニケーションの重要性が叫ばれている昨今、部門内の上下間の「縦」の繋がりや、同期・同僚といった「横」の集まり、フットサル・テニス同好会のような「斜め」のコミュニティなどによるコミュニケーションはよく聞きますが、これらは、同じ部門、業務であったり、同じ年代、同じ趣味嗜好、といったように少なからず共通項が出来ます。

ところで、Classiが掲げるバリューには「Love Difference」というものがあります。直訳すれば「違いを愛せ」。（Classiのバリューに関しては[こちら](https://qiita.com/keikomito/items/53582920ef521e004e89)を御覧ください。）
「名字が伊藤」という点のみでつながる伊藤会は、縦でも横でも斜めでも無い、点と点のあつまりで、上に記載したような共通項は名字以外には無く、究極の多様性を体現したコミュニティであり、Love Differenceの権化とも言えますね。

実際、部署も趣味嗜好も性格も考え方もバラバラだけど、謎の親近感を持ったメンバーとの会は、多様な情報の共有が出来たり、それぞれが持っている強みを認め合ったり、異なる意見をぶつけて高め合ったりと、とても良い刺激を受けられる場になっています。

# 伊藤会の良くないところ

「加入の難易度が高すぎる！」
この一言につきます。
この点は、不定期で会にゲスト（伊藤さんじゃない人）を呼び、伊藤さんに囲まれる会を実施したりと新しい風を入れる試みもしています。

# まとめ

「やってみよう！」と思って出来るコミュニティでは無いですが、やってみると想像以上に面白い会になるので、結成出来る環境にある人は、ぜひやってみると良いと思います。

また、Classiでは、エンジニア、プランナー、マーケターなど、まだまだ一緒に働く仲間を募集していますので、ぜひこれを読んだ伊藤さんは応募いただければと思います！

[Classi株式会社の会社情報 - Wantedly](https://www.wantedly.com/companies/classi/projects)
　
　
　
　
　
　
　
# おまけ

Qiitaらしくプログラムを。ということで、おまけとして、Googleカレンダーの予定をSlackのステータスに表示するGoogle Apps Script（**予定無し時は伊藤アイコン表示** ＆プレミアムフライデー表示も）を載せておきます。

<img width="393" alt="スクリーンショット 2018-12-07 12.24.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/47919/18043cf4-42ac-19cc-175a-079dc4316252.png">

1. Slackのカスタム絵文字に伊藤アイコン（:ito:）、プレミアムフライデーアイコン（:premiumfriday:）をアップロード
2. 下記のスクリプトをGoogle Apps Scriptで作成
3. 【メールアドレス】にGoogle Appsのアカウントのメールアドレスを設定
4. 【Slackのトークン】にSlackの[Legacy token](https://api.slack.com/custom-integrations/legacy-tokens)を設定
5. SetSlackStatusFromGoogleCalendarを1分おきの起動となるようトリガーを設定

```js:SetSlackStatusFromGoogleCalendar.gs
function SetSlackStatusFromGoogleCalendar() {
  var email = '【メールアドレス】'
  var token = '【Slackのトークン】'
  var googleCalendarToSlack = new GoogleCalendarToSlack(email, token)
  googleCalendarToSlack.setStatus()
}

var GoogleCalendarToSlack = function(email, token) {
    this.email = email
    this.token = token
}

GoogleCalendarToSlack.prototype = {
  setStatus: function() {
    var events = this.getCurrentEvents()
    var text = this.createStatusText(events)
    this.changeSlackStatus(text)
  },
  getCurrentEvents: function() {
    var start = new Date()
    var end = new Date(start.getTime() + 60 * 1000)
    var calendar = CalendarApp.getCalendarById(this.email)
    return calendar.getEvents(start, end)
  },
  createStatusText: function(events) {
    var text = ''
    for (var idx in events) {
      var event = events[idx]

      // 不参加は除外
      if (event.getMyStatus() == CalendarApp.GuestStatus.NO) {
        continue
      }
      // 終日のイベントは除外
      if (event.isAllDayEvent()) {
        continue
      }

      var schedule = this.getEventSchedule(event)
      var message = ''
      if (!this.isPrivateEvent(event)) {
        message = event.getTitle()
        if (event.getLocation() !== '') {
          message += '@' + event.getLocation()
        }
      } else {
        message = '予定あり'
      }

      // 複数予定の場合カンマ区切り
      if (text !== '') {
        text += ', '
      }
      text += schedule['start'] + ' - ' + schedule['end'] + ' ' + message
    }

    return text
  },
  isPrivateEvent: function(event) {
    return event.getVisibility() == CalendarApp.Visibility.CONFIDENTIAL
        || event.getVisibility() == CalendarApp.Visibility.PRIVATE
  },
  getEventSchedule: function(event) {
    return {
      start: Utilities.formatDate(event.getStartTime(), 'Asia/Tokyo', 'H:mm'),
      end: Utilities.formatDate(event.getEndTime(), 'Asia/Tokyo', 'H:mm'),
    }
  },
  changeSlackStatus: function(text) {
    var profile = {
      'status_text': text,
    }
    if (text == '') {
      // 予定なしの場合「伊藤」アイコン
      profile.status_emoji = ':ito:'
      if (this.isPremiumFriday()) {
        profile.status_emoji = ':premiumfriday:'
      }
    } else if (text.match(/休/i)) {
      // 「休」という文字があった場合はアイコンを休みアイコンに。
      profile.status_emoji = ':yasumi:'
    }
    UrlFetchApp.fetch("https://slack.com/api/users.profile.set?token=" + this.token + "&profile=" + encodeURIComponent(JSON.stringify(profile)))
  },
  isPremiumFriday: function() {
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth();
    var date = new Date(year, month, 1);
    var weekday = date.getDay();

    var day_4week = new Date(year, month, 7*3 + 6 - weekday);
    var day_5week = new Date(year, month, 7*4 + 6 - weekday);
    var end_of_month = new Date(year, month + 1, 0);
    
    Logger.log(today);
    Logger.log((day_5week > end_of_month ? day_4week : day_5week));

    return today.getDate() == (day_5week > end_of_month ? day_4week.getDate() : day_5week.getDate());
  },
}
```