里洋平と最後に飲んだのはいつだろうか。
あれは去年の夏ごろだったと思う。渋谷にあるおしゃれなビアバーに二人で入った。
店の名前は忘れたが、一階にレジがあり、そこでビールを購入して二階のテーブルまで自分たちで持っていって飲むという珍しい方式だったことを覚えている。
そのころ私は転職活動中だった。
まだ寒い時期に受けたC社は、最終面接に合格したにもかかわらず、その後に行われた面談で落とされた。
次に受けたM社は、筆記テストの後に「この問題を解けたのはあなたが初めてです」と言われたが落ちた。
私には何かが足りない。壁にぶつかっていた。
そのころの里洋平は会社を立ち上げて間もないころで、社員はまだ5人いなかったと思う。
業績は好調で常に人手不足だということだった。
私は言った。
「君のところで僕を雇ってもらうことはできないかい?」
里洋平は言った。
「ダメだよ。君は技術力はあるが人間性に問題があるから」
そうか、私に足りないのは人間性だったのだ。
彼の一言に衝撃を受けた私は、人間性を取り戻すために世界中を回る旅に出た。
その途中に立ち寄ったサウジアラビアで油田を掘り当てたというのはみなさんご存じだと思う。
里洋平のこの一言がなければ今の私はなかったのである。
さて、転職といえば最近の IT 界隈では雇用流動性が高まっていて転職者が多いと聞く。
久しぶりに会うといつの間にか転職していたということを聞かされることも少なくない。
そこで、秘密裏に転職している輩(やから)をあぶりだす方法を考えてみたいと思う。
まず、Qiita のアドベントカレンダーは昨年からカテゴリ分けされており、その中に「企業・学校・団体」というカテゴリがある。
ここを見ると、2015年と2016年に各ユーザがどの企業に所属しているかだいたい分かる。
2015年と2016年の所属企業が異なるユーザを抜き出せば、転職者リストが出来上がるのではないだろうか。
さっそくスクレイピングコードを書いてみる。
1. 企業リストの抽出
Qiita のアドベントカレンダーに参加している企業のリストを2015年と2016年でそれぞれ抽出する。
# 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. ユーザリストの抽出
各年のアドカレに参加しているユーザリストを抽出する。
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年の両方の企業アドカレに参加したユーザのリストが出来上がる。
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年で所属企業の異なるユーザを抜き出す。
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引越し侍
余計なのがいろいろ混じっているが、転職者リストが作成できた。
こうしてオープンなデータを使うだけで、秘密裏に転職している人たちをあぶりだすことができた。
彼らにとっては迷惑な話だが、こういう嫌がらせ的なことを行うのは私の趣味である。
世界中を旅したが、残念ながら人間性を改善することはできなかった。