私と里傭兵

里洋平と最後に飲んだのはいつだろうか。

あれは去年の夏ごろだったと思う。渋谷にあるおしゃれなビアバーに二人で入った。
店の名前は忘れたが、一階にレジがあり、そこでビールを購入して二階のテーブルまで自分たちで持っていって飲むという珍しい方式だったことを覚えている。

そのころ私は転職活動中だった。
まだ寒い時期に受けたC社は、最終面接に合格したにもかかわらず、その後に行われた面談で落とされた。
次に受けたM社は、筆記テストの後に「この問題を解けたのはあなたが初めてです」と言われたが落ちた。
私には何かが足りない。壁にぶつかっていた。

そのころの里洋平は会社を立ち上げて間もないころで、社員はまだ5人いなかったと思う。
業績は好調で常に人手不足だということだった。
私は言った。
「君のところで僕を雇ってもらうことはできないかい？」
里洋平は言った。
「ダメだよ。君は技術力はあるが人間性に問題があるから」

そうか、私に足りないのは人間性だったのだ。

彼の一言に衝撃を受けた私は、人間性を取り戻すために世界中を回る旅に出た。
その途中に立ち寄ったサウジアラビアで油田を掘り当てたというのはみなさんご存じだと思う。
里洋平のこの一言がなければ今の私はなかったのである。

さて、転職といえば最近の IT 界隈では雇用流動性が高まっていて転職者が多いと聞く。
久しぶりに会うといつの間にか転職していたということを聞かされることも少なくない。
そこで、秘密裏に転職している輩(やから)をあぶりだす方法を考えてみたいと思う。

まず、Qiita のアドベントカレンダーは昨年からカテゴリ分けされており、その中に「企業・学校・団体」というカテゴリがある。
ここを見ると、2015年と2016年に各ユーザがどの企業に所属しているかだいたい分かる。
2015年と2016年の所属企業が異なるユーザを抜き出せば、転職者リストが出来上がるのではないだろうか。

さっそくスクレイピングコードを書いてみる。

### 1. 企業リストの抽出

Qiita のアドベントカレンダーに参加している企業のリストを2015年と2016年でそれぞれ抽出する。

```r:R
# url <- "http://qiita.com/advent-calendar/2015/categories/company"
url <- "http://qiita.com/advent-calendar/2016/categories/company"

library(rvest)

html <- read_html(url)

html %>% 
  html_nodes(xpath = '//*[@id="main"]/div[3]/div/table/tbody/tr/td[1]/a') %>%
  {
    name <- html_text(.)
    link <- html_attr(., "href")
    data.frame(name, link)
  } -> result
head(result)
```

```:結果
                   name                                 link
1                ACCESS         /advent-calendar/2016/access
2               AltPlus        /advent-calendar/2016/altplus
3 BRIGHT VIE エンジニア      /advent-calendar/2016/brightvie
4   Ceresクリエイティブ /advent-calendar/2016/ceres-creative
5            CrowdWorks     /advent-calendar/2016/crowdworks
6          DATUM STUDIO    /advent-calendar/2016/datumstudio
```

それぞれのデータを "adcale2015com.csv", "adcale2016com.csv" というファイルに保存する。

### 2. ユーザリストの抽出

各年のアドカレに参加しているユーザリストを抽出する。

```r:R
library(readr)
library(purrr)
data <- read_csv("adcale2015com.csv")
# data <- read_csv("adcale2016com.csv")
n <- nrow(data)

base_url <- "http://qiita.com"

result <- data.frame()

for (i in seq_len(n)) {
  cat(".")
  Sys.sleep(1)
  row <- data[i, ]
  company <- row$name
  company_id <- basename(row$link)
  url <- paste0(base_url, row$link)
  
  html <- read_html(url)
  html %>%
    html_nodes(xpath = '//*[@id="main"]/div[5]/div/div') %>% {
      if(length(.) == 0) return(data.frame())
      map(., function(n) html_nodes(n, xpath = "div/div")) %>%
        keep(function(ns) length(ns) == 3) %>%
        map(function(ns) {
          date <- html_text(ns[1])
          id <- html_text(ns[2])
          title <- html_text(ns[3])
          data.frame(company_id, company, date, id, title)
        }) %>%
        reduce(rbind)
    } -> df
  
  result <- rbind(result, df)
}
head(result)
```

```:結果
  company_id  company   date           id                                                        title
1   wantedly Wantedly 12 / 1  reikubonaga                   ロジスティック解析を使ったデータ分析の方法
2   wantedly Wantedly 12 / 2   izumin5210                         Groovy+Spock for Android app testing
3   wantedly Wantedly 12 / 3       awakia                           コードレビューの際に気をつけること
4   wantedly Wantedly 12 / 4       usa619               エンジニアでもSketchを効率的に使うためのまとめ
5   wantedly Wantedly 12 / 5      cattaka               AndroidとRubyを使ってURLを叩くと光る置物を作る
6   wantedly Wantedly 12 / 6    tan-z-tan db:migrateすると何が起こるか。ActiveRecordコードリーデイング
```

この結果をそれぞれ "adcale2015com_users.csv", "adcale2016com_users.csv" というファイルに保存する。

### 3. 結合

2015年データと2016年データを結合することで、2015年と2016年の両方の企業アドカレに参加したユーザのリストが出来上がる。

```r:R
library(readr)
library(dplyr)

data2015 <- read_csv("adcale2015com_users.csv")
data2016 <- read_csv("adcale2016com_users.csv")

d2015 <- data2015 %>% 
  group_by(id) %>% 
  summarise(company = unique(company) %>% paste(collapse=", ")) %>%
  rename(company2015 = company)
d2016 <- data2016 %>%
  group_by(id) %>% 
  summarise(company = unique(company) %>% paste(collapse=", ")) %>%
  rename(company2016 = company)

result <- d2015 %>% inner_join(d2016, by = "id")
result
```

```:結果
# A tibble: 477 × 5
                 id       company_id2015      company2015 company_id2016                                     company2016
1          _BSmile_                  tis     TIS Engineer     techcircle                            Tech-Circle Hands on
2             _bsoo eure-advent-calendar         エウレカ         eureka                                          eureka
3            _pawa_                pixiv ピクシブ株式会社          pixiv                                ピクシブ株式会社
4            ainame                 mixi     mixiグループ           mixi                                    mixiグループ
5  aKatsuhiroMihara               access           ACCESS         access                                          ACCESS
6          akegashi               access           ACCESS         access                                          ACCESS
7        aKenjiKato               access           ACCESS         access                                          ACCESS
8       AkiraKaneko              nijibox     ニジボックス        nijibox                                         NIJIBOX
9          akiray03           crowdworks クラウドワークス     crowdworks                                      CrowdWorks
10      akiyoshiaki                 eeic             eeic           eeic eeic （東京大学工学部電気電子・電子情報工学科）
# ... with 467 more rows
```

2015年と2016年の両方で企業アドカレに参加したユーザーは 477 人であった。

この中から、2015年と2016年で所属企業の異なるユーザを抜き出す。

```r:R
result %>% filter(company_id2015 != company_id2016) %>% select(id, company2015, company2016)
```

```:結果
# A tibble: 118 × 3
           id                      company2015                               company2016
1    _BSmile_                     TIS Engineer                      Tech-Circle Hands on
2       _bsoo                         エウレカ                                    eureka
3   awesomest                         エウレカ                                    eureka
4  bananaumai                 Livesense(その2) Livesense, Livesenseその2, Livesenseその3
5    blackawa                     TIS Engineer                      Tech-Circle Hands on
6  boscoworks                        Livesense                                 Livesense
7    butchi_y                            KAYAC      数学カフェ_4次元コンテンツ出展の記録
8   Chan_moro                     TIS Engineer                                 Nextremer
9     Chitama ★若葉組のつぶやき★, dots girls                               dots.女子部
10   dkatsura                 Livesense(その2) Livesense, Livesenseその2, Livesenseその3
# ... with 108 more rows
```

複数のアドカレに投稿している人もいるのでたくさん出てくる。
(ここらへんの情報を使うともっとうまくできそうだが http://qiita.com/organizations)
目grepで抜き出すと次のようになった。

```:転職者リスト
              id                            company2015                                                          company2016
1       butchi_y                                  KAYAC                                 数学カフェ_4次元コンテンツ出展の記録
2      Chan_moro                           TIS Engineer                                                            Nextremer
3       gates1de                           岩手県立大学                                             リクルートライフスタイル
4       haminiku                                   gumi                                                                 DeNA
5       kajinari               リクルートライフスタイル                                    eureka, IT勉強会/コミュニティ運営
6   karupanerura                   モバイルファクトリー                                            IT勉強会/コミュニティ運営
7    kimikimi714                               ドワンゴ                                                         DeNA (その2)
8       koudaiii                 Wantedly, TIS Engineer                                                 Tech-Circle Hands on
9  m_nakamura145               リクルートライフスタイル                                                               トレタ
10     maaya8585                     オープンストリーム                                                       GeekWomenJapan
11     makkoruri                                 Viibar                                                            WHITEPLUS
12      n0bisuke LIGinc, ジーズアカデミー, 岩手県立大学 dotstudio, ジーズアカデミー, 岩手県立大学, IT勉強会/コミュニティ運営
13     namusyaka                               ドワンゴ                                                  DeNA, 第2のドワンゴ
14       nownabe                        IDCフロンティア                                                            Goodpatch
15      omega999                           岩手県立大学                                                       Livesenseその3
16       pine613                   モバイルファクトリー                                            IT勉強会/コミュニティ運営
17      rina0521                           TIS Engineer                                    Hortonworks, Tech-Circle Hands on
18       risacan                        IDCフロンティア                                                    Rails Girls Japan
19     shibukawa                                  pyspa                                                                 DeNA
20     shimpeiws                               Wantedly                                                             Akatsuki
21         tarom                          第2のドワンゴ                                                            Engraphia
22      woremacx                                Diverse                                                           エムスリー
23       youcune                             エムスリー                                                         Shinosaka.rb
24    yutasuzuki                                 LIGinc                                                        Ateam引越し侍
```

余計なのがいろいろ混じっているが、転職者リストが作成できた。

こうしてオープンなデータを使うだけで、秘密裏に転職している人たちをあぶりだすことができた。
彼らにとっては迷惑な話だが、こういう嫌がらせ的なことを行うのは私の趣味である。

世界中を旅したが、残念ながら人間性を改善することはできなかった。