はじめに
早いもので2018年も終わりに近づきました。
個人的な恒例と化してきたQiitaランキング記事を今年も書いていこうと思います。
これまでのものはこちら。
この記事を書くにあたり、いつものようにデータを集めていますが 2018年12月22日あたり のデータになっています。ご認識ください。
やること
昨年時点でぱっと思いつくランキングはやってしまったので、基本的にやることは昨年と同じです。
- ユーザ別Contributionランキング
- ユーザ別記事数ランキング
- ユーザ別フォロワーランキング
- 記事別いいねランキング
- その他分析いろいろ
枠組み自体は昨年と同じものを使うので、昨年からの推移に着目しようかと思います。
あとは今年の新しい分析として、 organizations ランキングもやってみます。
弊社 も非公式ながらorganizationを作り、 Advent Calendar にもエントリーできたので、やってみたいなと思った次第です。
前準備
例によってシェル芸で分析をしていくのですが、いかんせんデータが多いので事前に準備をしておきます。
昨年使ったデータ収集シェル芸は当然使えなくなっていたので、少し手直しをしつつデータを集めておきます。
ここから先のデータフォーマットは 昨年 同様ですので、昨年のシェル芸がそのまま使えるというわけです。ありがたい。
$ grep t_nakayama0714 qiita_user_data.csv
t_nakayama0714,38,9744,270,[エンジニアなら知っておきたい、絵で見てわかるセキュア通信の基本](https://qiita.com/t_nakayama0714/items/83ac0b12ced9e7083927):3593,[不思議の国のSE用語](https://qiita.com/t_nakayama0714/items/478a8ed3a9ae143ad854):1843,[Ansibleをはじめる人に。](https://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c):978,[NoSQLについて 勉強する。](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1):702,[無料で整える趣味チームの開発環境](https://qiita.com/t_nakayama0714/items/c0eb5e298524c127bccd):376
ちなみに昨年の集計時点(2017年12月12日)では 200,902 ユーザが存在していましたが、今年は
$ wc -l qiita_user_data.csv
299396 qiita_user_data.csv
ということで、この1年で 約10万ユーザを伸ばした ようです。
ユーザ分析
ではまずはユーザごとの分析からいきましょう。
ユーザContributionランキング
ランク | 前年比 | ユーザ名 | 総Contribution | 前年比 | 記事数 | 平均いいね | Top数 | Top占有率 | Top記事 |
---|---|---|---|---|---|---|---|---|---|
1 | 0 | @jnchito | 42002 | +8169 | 217 | 193.558 | 2884 | 6.86634% | モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう |
2 | 0 | @hirokidaichi | 40739 | +7556 | 38 | 1072.08 | 6410 | 15.7343% | ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習 |
3 | 0 | @icoxfog417 | 32733 | +4837 | 150 | 218.22 | 3406 | 10.4054% | Pythonを書き始める前に見るべきTips |
4 | 0 | @suin | 27999 | +5468 | 862 | 32.4814 | 4811 | 17.1828% | 【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超 |
5 | 0 | @shu223 | 21669 | +1826 | 203 | 106.744 | 1398 | 6.4516% | ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換) |
6 | +1 | @mizchi | 21312 | +3721 | 250 | 85.248 | 2095 | 9.83014% | なぜ仮想DOMという概念が俺達の魂を震えさせるのか |
7 | +39 | @rana_kualu | 20385 | +12901 | 273 | 74.6703 | 2528 | 12.4013% | 2017年のフロントエンドエンジニアならこの程度は知ってて当然だよな? |
8 | +1 | @mpyw | 20245 | +3193 | 281 | 72.0463 | 2311 | 11.4152% | PHPでデータベースに接続するときのまとめ |
9 | +2 | @opengl-8080 | 19889 | +3100 | 264 | 75.3371 | 1245 | 6.25974% | AngularJS使い方メモ |
10 | -4 | @KeithYokoma | 19457 | +1214 | 143 | 136.063 | 5319 | 27.3372% | うまくメソッド名を付けるための参考情報 |
11 | -1 | @kenju | 18899 | +2035 | 120 | 157.492 | 2619 | 13.8579% | 中上級者になるためのJavaScript【知識編】 |
12 | -4 | @yuku_t | 18658 | +1498 | 205 | 91.0146 | 1622 | 8.69332% | 中規模Web開発のためのMVC分割とレイヤアーキテクチャ |
13 | -1 | @awakia | 17042 | +1215 | 154 | 110.662 | 1644 | 9.64676% | 開発フロー研修 @ Wantedly |
14 | -1 | @mono0926 | 15707 | +870 | 94 | 167.096 | 1397 | 8.89412% | ローディング時のズルい進捗表示 |
15 | -1 | @b4b4r07 | 14746 | +1619 | 57 | 258.702 | 1692 | 11.4743% | さいつよのターミナル環境を構築しよう |
16 | 0 | @cognitom | 14636 | +1591 | 97 | 150.887 | 2066 | 14.1159% | そろそろ真面目に、HTMLで帳票を描く話をしようか |
17 | -2 | @muran001 | 14192 | +1114 | 34 | 417.412 | 5136 | 36.1894% | Gitでやらかした時に使える19個の奥義 |
18 | 0 | @edo_m18 | 14127 | +1493 | 390 | 36.2231 | 1338 | 9.47123% | WebのUIテスト自動化 - Seleniumを使ってみる |
19 | 0 | @koher | 14075 | +2073 | 69 | 203.986 | 1559 | 11.0764% | null安全でない言語は、もはやレガシー言語だ |
20 | -3 | @haminiku | 13906 | +893 | 73 | 190.493 | 3097 | 22.271% | 2016年 独りで新規WEBサービスを開発・運用した際の知見 |
21 | +2 | @zaru | 13862 | +2364 | 142 | 97.6197 | 1657 | 11.9535% | Webフロントエンド表示速度、最速化手法まとめ |
22 | -1 | @kazunori279 | 12197 | +561 | 43 | 283.651 | 1320 | 10.8223% | Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話 |
23 | -1 | @susieyy | 12092 | +548 | 50 | 241.84 | 2039 | 16.8624% | Swiftで作られたイケてるUIライブラリたち |
24 | +3 | @kenmatsu4 | 12050 | +2060 | 66 | 182.576 | 1725 | 14.3154% | 【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。 |
25 | -5 | @appwatcher | 11978 | +148 | 60 | 199.633 | 2133 | 17.8076% | iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ!作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ! |
26 | +35 | @shibukawa | 11906 | +5647 | 113 | 105.363 | 3671 | 30.8332% | イマドキのJavaScriptの書き方2018 |
27 | +3 | @takeharu | 11750 | +2053 | 18 | 652.778 | 1745 | 14.8511% | JavaScriptの「this」は「4種類」?? |
28 | -4 | @yimajo | 11730 | +675 | 163 | 71.9632 | 755 | 6.43649% | iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法 |
29 | -3 | @hshimo | 11078 | +1057 | 307 | 36.0847 | 2671 | 24.1109% | プログラマが独立・起業する時によくするミスと対策 まとめ |
30 | -2 | @ynakayama | 11005 | +1116 | 195 | 56.4359 | 792 | 7.19673% | scikit-learn から学ぶ機械学習の手法の概要 |
31 | -6 | @kawasima | 10993 | +797 | 82 | 134.061 | 1059 | 9.6334% | GitHub English Challenge Cheat Sheet |
32 | +3 | @tadsan | 10799 | +1608 | 192 | 56.2448 | 1995 | 18.4739% | ライセンスの選択を恐れる必要はありません |
33 | -2 | @uasi | 10607 | +936 | 118 | 89.8898 | 2321 | 21.8178% | 英語のコメントや issue で頻出する略語の意味 (FYI, AFAIK, ...) |
34 | -5 | @hkusu | 10426 | +655 | 218 | 47.8257 | 963 | 9.23652% | [WEB開発] 私的な最近のおすすめサービス/ツール 14選 ~2014年版~ |
35 | -3 | @kidach1 | 10410 | +808 | 85 | 122.471 | 1374 | 13.1988% | Nginx導入時やること |
36 | 新 | @poly_soft | 10376 | 新 | 40 | 259.4 | 2550 | 24.5759% | 2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。 |
37 | +2 | @tonkotsuboy_com | 10297 | +2270 | 114 | 90.3246 | 974 | 9.45907% | GitHubのmasterブランチをWebページとして公開する手順(GitHub Pages) |
38 | -5 | @joker1007 | 10159 | +620 | 105 | 96.7524 | 1162 | 11.4381% | てめえらのRailsはオブジェクト指向じゃねえ!まずはCallbackクラス、Validatorクラスを活用しろ! |
39 | +10 | @Hironsan | 10142 | +2856 | 50 | 202.84 | 1231 | 12.1376% | 学年ビリのアホが1年半でTOEICスコアを300点から840点に上げた英語勉強法の話 |
40 | -6 | @tukiyo3 | 10097 | +796 | 1603 | 6.29881 | 490 | 4.85293% | たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ |
41 | +14 | @t_nakayama0714 | 9744 | +3023 | 38 | 256.421 | 3593 | 36.874% | エンジニアなら知っておきたい、絵で見てわかるセキュア通信の基本 |
42 | +23 | @kazukichi | 9713 | +3774 | 37 | 262.514 | 3234 | 33.2956% | エンジニアで稼ぐために大切な20のコト |
43 | +13 | @tag1216 | 9706 | +2995 | 110 | 88.2364 | 3194 | 32.9075% | インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識 |
44 | -8 | @usagimaru | 9650 | +1069 | 177 | 54.5198 | 1245 | 12.9016% | iOS ヒューマンインターフェースの原則 |
45 | -3 | @Quramy | 9551 | +1779 | 94 | 101.606 | 2225 | 23.296% | Electronでアプリケーションを作ってみよう |
46 | +1 | @Qiita | 9357 | +1972 | 5 | 1871.4 | 7277 | 77.7707% | Markdown記法 チートシート |
47 | 新 | @youwht | 9234 | 新 | 23 | 401.478 | 1659 | 17.9662% | 「赤の他人」の対義語は「白い恋人」 これを自動生成したい物語 |
48 | -11 | @kawaz | 9003 | +760 | 146 | 61.6644 | 2045 | 22.7147% | 最強のSSH踏み台設定 |
49 | -8 | @zembutsu | 8955 | +1032 | 102 | 87.7941 | 1319 | 14.7292% | Docker 入門ハンズオン資料 |
50 | +14 | @howdy39 | 8887 | +2908 | 69 | 128.797 | 1308 | 14.7181% | フロントエンドにテストを導入 |
51 | 新 | @drken | 8851 | 新 | 36 | 245.861 | 1360 | 15.3655% | AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ |
52 | -9 | @sion_cojp | 8774 | +1044 | 41 | 214 | 4226 | 48.165% | インフラエンジニアとしてよく使うコマンド集 |
53 | -9 | @vvakame | 8773 | +1139 | 55 | 159.509 | 1501 | 17.1093% | Gradle入門 |
54 | -6 | @y_hokkey | 8627 | +1337 | 61 | 141.426 | 1690 | 19.5897% | Dockerで即実行できる、社内・自宅向けオープンソースWebアプリ |
55 | +5 | @amay077 | 8600 | +2148 | 289 | 29.7578 | 598 | 6.95349% | Xamarin(ザマリン) とはなんぞや |
56 | -18 | @okappy | 8477 | +379 | 29 | 292.31 | 5940 | 70.072% | 非デザイナーエンジニアが一人でWebサービスを作るときに便利なツール32選 |
57 | -7 | @tbpgr | 8477 | +1237 | 746 | 11.3633 | 1511 | 17.8247% | Markdown記法 サンプル集 |
58 | 新 | @jabba | 8444 | 新 | 35 | 241.257 | 2706 | 32.0464% | 開設後3週間で収益10万円を得た個人開発サイトでやったことの全部を公開する |
59 | -2 | @n0bisuke | 8060 | +1477 | 327 | 24.6483 | 723 | 8.97022% | 3行のソースコードを入れるだけで機械学習できると噂のindicoをNode.jsで使って機械学習入門してみる |
60 | +24 | @TakahikoKawasaki | 7912 | +2938 | 28 | 282.571 | 2620 | 33.1143% | 一番分かりやすい OAuth の説明 |
61 | -16 | @syui | 7900 | +365 | 228 | 34.6491 | 1377 | 17.4304% | MacBookAirで使っている便利ツール |
62 | -11 | @kaiinui | 7640 | +449 | 47 | 162.553 | 2462 | 32.2251% | 最近の行儀のよい JavaScript の書き方 |
63 | -9 | @yuya_presto | 7556 | +745 | 40 | 188.9 | 828 | 10.9582% | Gitコンフリクト解消ガイド(git mergetoolの使い方) |
64 | -2 | @jacksuzuki | 7541 | +1423 | 5 | 1508.2 | 7528 | 99.8276% | ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】 |
65 | -12 | @tatesuke | 7541 | +668 | 41 | 183.927 | 2327 | 30.858% | You Don't Need jQuery |
66 | 新 | @tmknom | 7501 | 新 | 11 | 681.909 | 2850 | 37.9949% | AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ |
67 | -15 | @Jxck_ | 7446 | +454 | 62 | 120.097 | 1269 | 17.0427% | DELETE_FLAG を付ける前に確認したいこと。 |
68 | 新 | @ryuichi1208 | 7208 | 新 | 51 | 141.333 | 1887 | 26.1792% | エンジニアが情報収集とトレンドを追うのに読むと良いサイト |
69 | +13 | @shizuma | 7100 | +1974 | 102 | 69.6078 | 857 | 12.0704% | GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ |
70 | -12 | @gogotanaka | 7028 | +457 | 57 | 123.298 | 3589 | 51.0672% | ネイティブと働いて分かった英語コミットメッセージの頻出動詞10つ |
71 | -1 | @mochizukikotaro | 6874 | +1420 | 261 | 26.3372 | 1213 | 17.6462% | 初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 |
72 | +5 | @tenntenn | 6832 | +1479 | 78 | 87.5897 | 2487 | 36.4022% | Go言語の初心者が見ると幸せになれる場所 #golang |
73 | +21 | @zaburo | 6775 | +2038 | 309 | 21.9256 | 441 | 6.50923% | gitでシンプルなデプロイ環境を作る |
74 | 新 | @okunokentaro | 6750 | 新 | 110 | 61.3636 | 1351 | 20.0148% | AngularJSモダンプラクティス |
75 | +4 | @ukiuni@github | 6704 | +1437 | 77 | 87.0649 | 2645 | 39.4541% | JavaScriptを読んでて「なにこれ!?」と思うけれど調べられない記法8選。 |
76 | -2 | @disc99 | 6684 | +1268 | 29 | 230.483 | 2085 | 31.1939% | Javaを使うなら知っておきたい技術、フレームワーク、ライブラリ、ツールまとめ |
77 | +4 | @pugiemonn | 6667 | +1523 | 283 | 23.5583 | 1186 | 17.7891% | こんなHTMLとCSSのコーディング規約で書きたい |
78 | 新 | @terrierscript | 6634 | 新 | 131 | 50.6412 | 422 | 6.36117% | 【古い記事】Babelにおける import / export |
79 | +14 | @nonbiri15 | 6463 | +1651 | 292 | 22.1336 | 1447 | 22.389% | 優秀な技術者を追い出してしまう方法 |
80 | -2 | @hik0107 | 6452 | +1130 | 22 | 293.273 | 969 | 15.0186% | Pythonでデータ分析するのに必要なツールのまとめ |
81 | -18 | @yaotti | 6384 | +274 | 151 | 42.2781 | 1292 | 20.2381% | gitでありがちな問題の解決方法まとめ |
82 | -11 | @nekoneko-wanwan | 6324 | +872 | 56 | 112.929 | 1598 | 25.2688% | はじめてajaxを使うときに知りたかったこと |
83 | +15 | @takahirom | 6322 | +1700 | 93 | 67.9785 | 395 | 6.24802% | AndroidStudioのPostfix Completionで爆速コーディング |
84 | +11 | @shuntaro_tamura | 6300 | +1583 | 64 | 98.4375 | 939 | 14.9048% | フロントエンド、サーバサイド、インフラの具体例 |
85 | -18 | @magicant | 6288 | +580 | 37 | 169.946 | 2286 | 36.355% | クラスの命名のアンチパターン |
86 | 新 | @alt | 6163 | 新 | 0 | - | - | *** % | - |
87 | 新 | @Ted-HM | 6124 | 新 | 16 | 382.75 | 4591 | 74.9673% | プログラミングでよく使う英単語のまとめ【随時更新】 |
88 | -13 | @hidekuro | 6103 | +701 | 82 | 74.4268 | 2618 | 42.8969% | VagrantとDockerについて名前しか知らなかったので試した |
89 | -23 | @r7kamura | 6088 | +229 | 56 | 108.714 | 720 | 11.8265% | RailsでAPIをつくるときのエラー処理 |
90 | -21 | @koba04 | 6043 | +527 | 38 | 159.026 | 779 | 12.8909% | 私のJavaScript情報の集め方 |
91 | -23 | @daxanya1 | 5990 | +372 | 30 | 199.667 | 4806 | 80.2337% | 数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路 |
92 | -19 | @koogawa | 5987 | +540 | 70 | 85.5286 | 1351 | 22.5656% | iPhoneアプリ申請やAppleの審査に関するメモ |
93 | -6 | @ryounagaoka | 5923 | +964 | 47 | 126.021 | 2336 | 39.4395% | もう逃げない。HTMLのviewportをちゃんと理解する |
94 | 新 | @toshihirock | 5920 | 新 | 213 | 27.7934 | 913 | 15.4223% | Linuxパフォーマンス調査などで使うコマンドメモ |
95 | -23 | @voluntas | 5794 | +343 | 107 | 54.1495 | 1328 | 22.9203% | docker コマンド チートシート |
96 | 新 | @soarflat | 5744 | 新 | 26 | 220.923 | 979 | 17.0439% | webpack 4 入門 |
97 | -14 | @colorrabbit | 5732 | +668 | 253 | 22.6561 | 843 | 14.7069% | 覚えておきたい Vim コマンド 備忘録 |
98 | -6 | @k0kubun | 5652 | +836 | 65 | 86.9538 | 1291 | 22.8415% | ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い |
99 | 新 | @akameco | 5628 | 新 | 177 | 31.7966 | 1219 | 21.6596% | Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する |
100 | 新 | @yoshizaki_kkgk | 5624 | 新 | 41 | 137.171 | 1221 | 21.7105% | 機械学習案件を納品するのは、そんなに簡単な話じゃないから気をつけて |
僕は昨年の55位から41位にランクアップ。やったね。
今年一番の驚きは @alt さんが「 記事0でTop100にランクイン 」を果たしたことでした。
最初集計をミスったかと思ったのですが、編集リクエストの積み重ねから Contribution を増やしているようです。
どこかで見たことあるなー、と思って自分の記事の編集履歴を見てみたところ、僕にも編集リクエストをいただいていました。
多くはシンタックスハイライトやtypo修正など、軽微と言えば軽微ですが、Qiitaプラットフォームにおける記事の質を上げたという意味ではこれもContributionそのものだなと思いました。
TOP100順位の上下
昨年との順位変動の傾向としては以下のように、
上昇 | 下降 | 維持 | 新規 | |
---|---|---|---|---|
2018 | 26 | 52 | 8 | 14 |
2017 | 43 | 42 | 4 | 11 |
差 | -17 | +10 | +4 | +3 |
となりました。
昨年も順位変動については見ていましたが、 上昇ユーザが減少 し、 下降ユーザ、新規ユーザが増加 しています。
TOP5が変わっていないことからも、「トップランカーの牙城はより強固になる一方、下位ユーザの入れ替わりが激しくなっている」という傾向が見て取れます。
2018年で順位変動が最も大きかったのが @rana_kualu さんでした。
[2017年のフロントエンドエンジニアならこの程度は知ってて当然だよな?](https://qiita.com/ran _kualu/items/cad8dbbe5f5a1f1b3ba1) に続く、 2018年のフロントエンドエンジニアならこの程度は知ってて当然だよな? など、技術トレンドを俯瞰する記事の多くが1000いいねを獲得するなど、2018年でContributionを12901伸ばし、一気に39位も順位を上げたようです。
Contributionの分布
Contributionの分布もみてみましょう。
total | none | 0 | 1- | 10- | 100- | 1000- | 10000- | |
---|---|---|---|---|---|---|---|---|
2018 | 299396 | 11752 | 245485 | 16842 | 16730 | 7351 | 1196 | 40 |
2017 | 200902 | 2247 | 169576 | 10701 | 11985 | 5516 | 851 | 26 |
差 | 98494 | 9505 | 75909 | 6141 | 4745 | 1835 | 345 | 14 |
約10万ユーザが増えたとはいえ、変動分のうち8.5万ユーザはContribution0か凍結ユーザのようです。
分布の比率でみるとこうなります。
total | none | 0 | 1- | 10- | 100- | 1000- | 10000- | |
---|---|---|---|---|---|---|---|---|
2018 | 100% | 3.93% | 81.99% | 5.63% | 5.59% | 2.46% | 0.40% | 0.01% |
2017 | 100% | 1.12% | 84.41% | 5.33% | 5.97% | 2.75% | 0.42% | 0.01% |
差 | 0% | 2.81% | -2.41% | 0.30% | -0.38% | -0.29% | -0.02% | 0.00% |
ここ1年で凍結ユーザの比率が上がったようですね。
コミュニティ規模の増大からすれば仕方のないことなのかもしれません。
この比率をgnuplotから円グラフで出そうかと思ったのですが、データの偏りがありすぎてあまりいい感じに表現できませんでした。
グラフ自体は以下の通りにしてほぼ書けたので残念です。
ユーザ記事数ランキング
記事数ランキングも出しておきましょう。
|ランク|前年比|ユーザ名|記事数|前年比|Contribution数|Top記事|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|0|@7of9|5818|+783|4864|Qiita > 「いいね」機能についての要望|
|2|0|@tukiyo3|1603|+48|10097|たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ|
|3|新|@kaizen_nagoya|1215|新|3168|プログラマが知っているとよい色使い(安全色)|
|4|+1|@ohisama@github|948|+440|548|ウィルスと闘ってみた。|
|5|-1|@suin|862|+165|27999|【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超|
|6|-3|@tbpgr|746|+18|8477|Markdown記法 サンプル集|
|7|+12|@YumaInaura|667|+409|2495|拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。|
|8|新|@ekzemplaro|501|新|573|ubuntu 18.04 に mecab をインストール|
|9|-3|@chen7897499|457|0|71|rails devise|
|10|-1|@edo_m18|390|+18|14127|WebのUIテスト自動化 - Seleniumを使ってみる|
|11|-4|@tcsh|387|+4|1333|[JAWS-UG CLI] ハンズオン一覧|
|12|-4|@snaka|385|+10|3450|rails console の tips |
|13|+3|@jkr_2255|369|+106|4086|セッション管理の要注意点|
|14|+3|@Nabetani|356|+93|1332|C++ の、スマートだと思う人がいるかもしれないコードの書き方12選のつもりが6個ぐらいで断念|
|15|-2|@cielavenir|341|+69|730|paiza 非公式難易度表|
|16|-2|@n0bisuke|327|+61|8060|3行のソースコードを入れるだけで機械学習できると噂のindicoをNode.jsで使って機械学習入門 してみる|
|17|新|@setouchi|325|新|1701|UbuntuでMacレベルに使いやすくておしゃれな環境構築|
|18|新|@shinyama|312|新|300|追い込まれないと動かない自分を、いつでも動かせるようになった画期的な方法|
|19|新|@zaburo|309|新|6775|gitでシンプルなデプロイ環境を作る|
|20|-10|@hshimo|307|0|11078|プログラマが独立・起業する時によくするミスと対策 まとめ|
今年も @7of9 さんがトップ、記事数+783と今年も猛烈に記事数を増やしたようです。
しかし、 @kaizen_nagoya さんが新顔にも関わらず記事数1215で3位にランクイン。
おそるおそる見てみると、確かに2017年の暮れから活動が活発化し、大半である 1209記事 を2018年に書かれていました。
誰も届かないと思われた @7of9 さんの牙城ですが果たして...。
ユーザフォロワー数ランキング
次はフォロワー数ランキング。
|ランク|前年比|ユーザ名|フォロワー数|前年比|Contribution数|Top記事|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|0|@hirokidaichi|3106|+958|40739|ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習|
|2|0|@jnchito|2943|+970|42002|モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう|
|3|+2|@mizchi|2242|+465|21312|なぜ仮想DOMという概念が俺達の魂を震えさせるのか|
|4|+4|@icoxfog417|1930|+496|32733|Pythonを書き始める前に見るべきTips|
|5|-1|@dankogai|1916|+88|3194|Swiftで面倒なJSONの取り扱いをさらに10倍便利にするclass JSON |
|6|-3|@taguchi|1876|-9|9|ドットインストールで『PICO-8入門』を作ったときの学習ログ|
|7|-1|@yukihiro_matz|1764|+160|115|24時間一人mrubyハッカソン|
|8|+1|@mpyw|1717|+355|20245|PHPでデータベースに接続するときのまとめ|
|9|-2|@supermomonga|1709|+115|832|PHPとしても実行できるRubyの書きかた|
|10|新|@kaizen_nagoya|1672|新|3168|プログラマが知っているとよい色使い(安全色)|
|11|-1|@shu223|1600|+278|21669|ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)|
|12|-1|@kenmatsu4|1465|+332|12050|【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。|
|13|新|@suin|1356|新|27999|【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超|
|14|-1|@mattn|1322|+213|3173|本物の golang を... 本物の Gopher を、お見せしますよ。|
|15|新|@poly_soft|1191|新|10376|2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。|
|16|-4|@hyuki|1172|+63|168|Vimで、文字列を別のところに「持って行って置換する」効率的な方法は?|
|17|-1|@joker1007|1160|+147|10159|てめえらのRailsはオブジェクト指向じゃねえ!まずはCallbackクラス、Validatorクラスを 活用しろ!|
|18|-4|@naoya@github|1149|+59|3175|React Native ファーストインプレッション|
|19|+1|@Qiita|1136|+207|9357|Markdown記法 チートシート|
|20|新|@kazukichi|1113|新|9713|エンジニアで稼ぐために大切な20のコト|
@taguchi さんがフォロワーを減らしているようです。
このクラスにいながらフォロワーが減少するというのはちょっと興味深いですね。
また、こちらでも @kaizen_nagoya さんが10位にランクイン。
記事分析
総記事数
まずは総記事数をみてみます。昨年は26万強の記事がありましたが、今年はどうでしょう。
$ cat qiita_user_data.csv | awk -F"," 'BEGIN{SUM=0}{SUM+=$2}END{print SUM}'
364605
昨年はユーザあたり1.29でしたが、今年は 1.22 となりました。微減、でしょうか。
none | 0 | 1- | 10- | 100- | 1000- | |
---|---|---|---|---|---|---|
2018 | 11752 | 244514 | 33911 | 8966 | 250 | 3 |
2017 | 2247 | 168427 | 23553 | 6496 | 177 | 2 |
差 | 9505 | 76087 | 10358 | 2470 | 73 | 1 |
記事数1以上のアクティブユーザについて、平均記事数は昨年8.6155に対し、今年は 8.4536 となりました。
記事いいねランキング
Qiita全体の記事についていいねでランキングをとってみます。
|ランク|前年比|いいね数|前年比|記事|
|:---:|:---:|:---:|:---:|:---:|:---:|
|1|0|7528|+1422|ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】|
|2|0|7277|+1340|Markdown記法 チートシート|
|3|+1|6410|+1369|ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習|
|4|-1|5940|+303|非デザイナーエンジニアが一人でWebサービスを作るときに便利なツール32選|
|5|0|5319|+612|うまくメソッド名を付けるための参考情報|
|6|0|5136|+594|Gitでやらかした時に使える19個の奥義|
|7|+1|4811|+483|【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超|
|8|-1|4806|+292|数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路|
|9|+13|4591|+1763|プログラミングでよく使う英単語のまとめ【随時更新】|
|10|0|4445|+372|もう保守されない画面遷移図は嫌なので、UI Flow図を簡単にマークダウンぽく書くエディタ作った|
|11|0|4341|+653|新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡|
|12|0|4226|+658|インフラエンジニアとしてよく使うコマンド集|
|13|0|3969|+478|初心者向け、「上手い」シェルスクリプトの書き方メモ|
|14|+5|3732|+746|翻訳: WebAPI 設計のベストプラクティス|
|15|新|3671|新|イマドキのJavaScriptの書き方2018|
|16|+13|3593|+1008|エンジニアなら知っておきたい、絵で見てわかるセキュア通信の基本|
|17|-3|3589|+221|ネイティブと働いて分かった英語コミットメッセージの頻出動詞10つ|
|18|0|3538|+520|何かのときにすっと出したい、プログラミングに関する法則・原則一覧|
|19|+8|3488|+792|オブジェクト指向と10年戦ってわかったこと|
|20|+1|3406|+515|Pythonを書き始める前に見るべきTips|
|21|-4|3336|+282|そこそこセキュアなlinuxサーバーを作る|
|22|+2|3335|+587|Reactを使うとなぜjQueryが要らなくなるのか|
|23|-7|3241|+143|コードを書く際の指針として見返すサイトまとめ|
|24|+17|3234|+950|エンジニアで稼ぐために大切な20のコト|
|25|+3|3224|+555|Gitのコミットメッセージの書き方|
|26|-3|3194|+413|インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識|
|27|-12|3176|+35|特にプログラマーでもデータサイエンティストで ないけど、Tensorflowを1ヶ月触ったので超分かりやすく解 説|
|28|-2|3123|+419|Vim幼稚園からVim小学校へ|
|29|-9|3097|+146|2016年 独りで新規WEBサービスを開発・運用した際の知見|
|30|+29|3050|+1057|「AWS is 何」を3行でまとめてみるよ|
|31|+5|3003|+578|GitHubで使われている実用英語コメント集|
|32|+13|2960|+713|質問は恥ではないし役に立つ|
|33|-8|2884|+180|モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう|
|34|+20|2850|+782|AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ|
|35|-1|2737|+245|画像処理の数式を見て石になった時のための、金の針|
|36|-6|2713|+132|誰も教えてくれなかったMySQLの障害解析方法|
|37|新|2711|新|エンジニアの情報収集法まとめ|
|38|新|2706|新|開設後3週間で収益10万円を得た個人開発サイトでやったことの全部を公開する|
|39|0|2701|+362|[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか|
|40|-9|2671|+93|プログラマが独立・起業する時によくするミスと対策 まとめ|
|41|-9|2656|+85|英語コミットコメントに使えるオシャレフレーズ集|
|42|-9|2649|+95|Linux開発環境の基礎知識|
|43|+19|2645|+676|JavaScriptを読んでて「なにこれ!?」と思うけれど調べられない記法8選。|
|44|-7|2627|+216|不安とストレスから解放される見積りとスケジュール方法|
|45|新|2620|新|一番分かりやすい OAuth の説明|
|46|-8|2619|+238|中上級者になるためのJavaScript【知識編】|
|47|+1|2618|+460|VagrantとDockerについて名前しか知らなかったので試した|
|48|-6|2614|+332|脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)|
|49|新|2550|新|2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。|
|50|+23|2528|+648|2017年のフロントエンドエンジニアならこの程度は知ってて当然だよな?|
|51|+13|2487|+519|Go言語の初心者が見ると幸せになれる場所 #golang|
|52|新|2465|新|[2018] 個人でも使える!おすすめAPI一覧|
|53|-18|2462|-4|最近の行儀のよい JavaScript の書き方|
|54|+2|2442|+387|ゼロからDeepまで学ぶ強化学習|
|55|+11|2422|+466|使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」|
|56|-12|2420|+159|30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで|
|57|-7|2411|+294|npm とか bower とか一体何なんだよ!Javascript 界隈の文脈を理解しよう|
|58|新|2411|新|コーディングをするときに鼻血がでるほど便利なwebツールリスト(随時更新予定)|
|59|-12|2376|+198|WebAPIでエラーをどう表現すべき?15のサービスを調査してみた|
|60|新|2368|新|Chrome拡張の高速な英語辞書ツールをつくりました(Mouse Dictionary)|
|61|-1|2364|+375|究極のIT系最新技術情報収集用Slackチーム公開 - モヒカンSlack -|
|62|-22|2356|+67|日本の行政機関等が公開しているAPIについてのまとめ(2016年8月17日暫定版。随時更新)|
|63|新|2352|新|プログラミング勉強を加速させる7つの習慣|
|64|-21|2350|+72|httpsだからというだけで安全?調べたら怖くなってきたSSLの話!?|
|65|-2|2336|+368|もう逃げない。HTMLのviewportをちゃんと理解する|
|66|-20|2327|+148|You Don't Need jQuery|
|67|-12|2311|+256|PHPでデータベースに接続するときのまとめ|
|68|-19|2286|+158|クラスの命名のアンチパターン|
|69|-8|2225|+247|Electronでアプリケーションを作ってみよう|
|70|-13|2186|+149|データサイエンティストを目指す人のpython環境構築 2016|
|71|-19|2156|+58|あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた|
|72|新|2141|新|エンジニアは全員技術記事を書くことを習慣化した方がいいぞ|
|73|新|2118|新|VSCodeのオススメ拡張機能 24選 (とTipsをいくつか)|
|74|+3|2113|+258|Android開発を受注したからKotlinをガッツリ使ってみたら最高だった|
|75|新|2106|新|新卒からの質問をソシャゲっぽい仕組みにしたら捗った話|
|76|+4|2095|+268|なぜ仮想DOMという概念が俺達の魂を震えさせるのか|
|77|-10|2092|+146|Markdownテキストでシーケンス図とフローチャートを描く|
|78|-9|2085|+146|Javaを使うなら知っておきたい技術、フレームワーク、ライブラリ、ツールまとめ|
|79|新|2071|新|なぜ我々はいまだに文字列でコメントを書いているのか|
|80|-2|2066|+225|そろそろ真面目に、HTMLで帳票を描く話をしようか|
|81|-23|2045|+13|最強のSSH踏み台設定|
|82|-14|2039|+98|Swiftで作られたイケてるUIライブラリたち|
|83|-9|2018|+147|Git・GitHubに隠された便利な機能 - GitHub Cheat Sheet(日本語訳)|
|84|-19|1995|+30|ライセンスの選択を恐れる必要はありません|
|85|-4|1987|+199|初心者エンジニアにおすすめしたい「進捗どうなった?」と言われないための仕事の進め方|
|86|新|1969|新|プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話|
|87|新|1964|新|もっと気軽にアウトプットできる技術ブログサービス「Qrunch(クランチ)」をリリースした【個人開発】|
|88|新|1958|新|【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話|
|89|-14|1957|+87|プレゼンテーションに使う画像の探し方|
|90|-19|1939|+55|エンジニアとして成長するべく私が実践している学習方法|
|91|-21|1935|+3|ここ数年前から2015/5までのモダンフロントエンドを総まとめしてみた|
|92|-20|1933|+52|春からはじめるモダンJavaScript / ES2015|
|93|新|1913|新|iPhone/iPad/Apple Watch解像度(画面サイズ)早見表|
|94|新|1911|新|GitHub に AWS キーペアを上げると抜かれるってほんと???試してみよー!|
|95|新|1887|新|エンジニアが情報収集とトレンドを追うのに読むと良いサイト|
|96|新|1878|新|ブロックチェーンを作ることで学ぶ ~ブロックチェーンがどのように動いているのか学ぶ最速の方法は作ってみることだ~|
|97|-21|1868|+10|読んで良かった基礎知識の入門書|
|98|新|1858|新|動的言語だけやってた僕が、38日間Go言語を書いて学んだこと|
|99|新|1855|新|初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」|
|100|新|1849|新|文系エンジニアが機械学習に入門するために小学校の算数から高校数学までを一気に復習してみました。|
1位は昨年と変わらず、サバイバルガイドですね。1位を維持しながらも、この1年で1400ほどのいいねを伸ばしています。
また、今年新たにTop100入りした記事は 23記事 ありました。
そんな今年の記事で最も当たった(?)のが イマドキのJavaScriptの書き方2018 でしょうか。
ちなみに例によってこのランキングには欠陥があります。
ランクイン数 | ユーザ名 |
---|---|
5 | @jnchito |
5 | @hirokidaichi |
3 | @suin |
3 | @icoxfog417 |
2 | @poly_soft |
2 | @muran001 |
2 | @mizchi |
というように、 @jnchito さんと @hirokidaichi さんが5記事入っていますが、記事データはユーザトップに出てくる5記事しか取っていないので、6記事目以降がランクインするかどうかは判定していません。
というわけでこのあたりを恥ずかしながら人力でフォローすると、
|ランク|前年比|いいね数|前年比|記事|
|:---:|:---:|:---:|:---:|:---:|:---:|
|51|新|2519|新|新人プログラマに知ってもらいたいメソッドを読みやすく維持するいくつかの原則|
|53|新|2482|新|新人プログラマに正月休み中を使って読んでみてほしい技術書をセレクトしてみた。|
|100|新|1867|新|新入社員が来てメンターになれって言われたけど、どうすればいいのかという対話テクニック|
下位3位が退き、上の3つがTop100に入ります。
ちなみに追い出された3つは奇しくも全てTop100に複数入りしている @jnchito / @suin / @poly_soft さんの記事でしたので、複数ランクインの状況について
ランクイン数 | ユーザ名 |
---|---|
8 | @hirokidaichi |
4 | @jnchito |
3 | @icoxfog417 |
2 | @suin |
2 | @muran001 |
2 | @mizchi |
1 | @poly_soft |
という感じになります。
Organization分析
さて、それでは最後に今年の目玉(?)である Organization分析 に入りたいと思います。
全体
ユーザ分析では全体のユーザ数もみてましたので、こちらではOrganization数をみておきましょう。
$ wc -l qiita_organization_data.csv
648 qiita_organization_data.csv
昨年データがないのでなんとも言えませんが、とりあえず現時点で およそ650 Organization あるようです。
Organization別いいねランキング
それではユーザ同様に、Organization別のいいねランキングをみてみましょう。上位から30位を出してみます。
ちなみにユーザだと記事のいいねに加え、編集リクエストによる貢献もあるため総合してContributionがカウントされますが、Organizationだと所属メンバによる記事のいいねだけがカウントされているようです。
ランク | Organization名 | 総いいね | 記事数 | 平均いいね | Top数 | Top占有率 | Top記事 |
---|---|---|---|---|---|---|---|
1 | @mercari | 90816 | 1461 | 62.1602 | 5318 | 5.8558% | うまくメソッド名を付けるため の参考情報 |
2 | @tis | 59841 | 876 | 68.3116 | 3406 | 5.69175% | Pythonを書き始める前に見るべきTips |
3 | @increments | 53907 | 834 | 64.6367 | 7274 | 13.4936% | Markdown記法 チートシート |
4 | @sonicgarden | 48142 | 433 | 111.182 | 2884 | 5.99061% | モデルやメソッドに名 前を付けるときは英語の品詞に気をつけよう |
5 | @wantedly | 44438 | 508 | 87.4764 | 2039 | 4.58842% | Swiftで作られたイケてるUIライブラリたち |
6 | @cyberagent | 41159 | 951 | 43.2797 | 1745 | 4.23966% | JavaScriptの「this」は 「4種類」?? |
7 | @rector | 40733 | 38 | 1071.92 | 6410 | 15.7366% | ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習 |
8 | @yyphp | 37735 | 1337 | 28.2236 | 4809 | 12.7441% | 【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超 |
9 | @yumemi | 33207 | 1334 | 24.8928 | 1003 | 3.02045% | スタートアップはお金を払ってでも使うべきプロダクト14選 |
10 | @future | 31686 | 647 | 48.9737 | 3669 | 11.5792% | イマドキのJavaScriptの書き方2018 |
11 | @shouldbee | 29558 | 1026 | 28.809 | 4809 | 16.2697% | 【まとめ】これ知らないプログラマって損してんなって思う汎用的なツール 100超 |
12 | @dwango | 25060 | 789 | 31.7617 | 1555 | 6.20511% | 高校生にWeb上でプログラミング を教え始めたエンジニアがこの8ヶ月間で得た気づき |
13 | @dena_coltd | 24567 | 952 | 25.8057 | 2709 | 11.027% | エンジニアの情報収集法 まとめ |
14 | @pixiv | 22405 | 613 | 36.5498 | 1995 | 8.90426% | ライセンスの選択を恐れる必要はありません |
15 | @m3dev | 21040 | 832 | 25.2885 | 1345 | 6.39259% | インストールするだけでVSCodeをカッコよくする拡張4つ |
16 | @iotlt | 20455 | 1416 | 14.4456 | 723 | 3.53459% | 3行のソースコードを入れるだけで 機械学習できると噂のindicoをNode.jsで使って機械学習入門してみる |
17 | @yahoo-japan-corp | 20110 | 874 | 23.0092 | 1117 | 5.55445% | iOSアプリ 個人開発で使ってるツールとかノウハウを公開してみる |
18 | @freee | 20013 | 588 | 34.0357 | 713 | 3.56268% | GitHubを使って3分でHPを公開する。 |
19 | @qoncept | 19873 | 145 | 137.055 | 2113 | 10.6325% | Android開発を受注したからKotlinをガッツリ使ってみたら最高だった |
20 | @synapse | 19504 | 300 | 65.0133 | 2311 | 11.8489% | PHPでデータベースに接続する ときのまとめ |
21 | @atrae | 19241 | 330 | 58.3061 | 5940 | 30.8716% | 非デザイナーエンジニアが一人でWebサービスを作るときに便利なツール32選 |
22 | @lifull | 19190 | 788 | 24.3528 | 1612 | 8.40021% | ターミナルの作業が捗るかもな小技5つ |
23 | @sakura_internet | 18487 | 425 | 43.4988 | 1319 | 7.13474% | Docker 入門 ハンズオン資料 |
24 | @jrits | 18468 | 993 | 18.5982 | 1542 | 8.34958% | 全国のSeleniumer必読 |
25 | @crowdworks | 17841 | 439 | 40.6401 | 2850 | 15.9744% | AWSアカウントを取得し たら速攻でやっておくべき初期設定まとめ |
26 | @iwate-pu | 16711 | 714 | 23.4048 | 1069 | 6.39698% | homebrewとは何者か。仕組みについて調べてみた |
27 | @nri | 16500 | 196 | 84.1837 | 1659 | 10.0545% | 「赤の他人」の対義語は「白い恋人」 これを自動生成したい物語 |
28 | @mixi | 16033 | 519 | 30.8921 | 1573 | 9.81101% | tigでgitをもっと便利に! addやcommitも |
29 | @aktsk | 15473 | 261 | 59.2835 | 1867 | 12.0662% | 読んで良かった基礎知識の入門書 |
30 | @globis | 15248 | 430 | 35.4605 | 1496 | 9.81112% | 日本人が間違いやすいコーディング上の英語 |
1位は @mercari さんでした!おめでとうございます!
2位の @tis さんに 1.5倍 ほどの差をつけ、現時点で圧倒的トップです。
また、Organization上位と言えども、大多数のいいねが特定のユーザに依っていることがよく見られる中、メルカリのすごいところは Top5の記事が全て異なるユーザ で構成されています。
層の厚さというか、Qiitaを通じたアウトプットの活発さが感じられます。
ちなみに弊社は40位でした。精進します。
Organization記事数ランキング
ここからおまけです。10位まで。
|ランク|Organization名|記事数|総いいね|平均記事いいね|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|@mercari|1461|90816|62.1602|
|2|@iotlt|1416|20455|14.4456|
|3|@yyphp|1337|37735|28.2236|
|4|@yumemi|1334|33207|24.8928|
|5|@shouldbee|1026|29558|28.809|
|6|@jrits|993|18468|18.5982|
|7|@dena_coltd|952|24567|25.8057|
|8|@cyberagent|951|41159|43.2797|
|9|@tis|876|59841|68.3116|
|10|@yahoo-japan-corp|874|20110|23.0092|
@mercari さん2冠!
Organizationメンバ数ランキング
では メンバの数 ではどうでしょう。
|ランク|Organization名|メンバ数|総いいね|1人あたりいいね|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|@iotlt|102|20455|200.539|
|2|@yumemi|79|33207|420.342|
|3|@lifull|75|19190|255.867|
|4|@mohikanz|69|11750|170.29|
|5|@yahoo-japan-corp|68|20110|295.735|
|6|@cyberagent|66|41159|623.621|
|7|@dwango|66|25060|379.697|
|8|@future|62|31686|511.065|
|9|@oracle|61|2265|37.1311|
|10|@mercari|59|90816|1539.25|
こちらはIoT勉強会の @iotlt がトップでした。 コミュニティ 、って感じがしますね。
100人を超えるOrganization がこれ以外にないというのが非常にびっくりしました。
富士通 さんあたりがもっといるもんだと思っていましたが、意外とないもんですね。
気になったのでメンバ数の分布を調べたところ、以下のような感じでした。
total | 0- | 10- | 20- | 30- | 40- | 50- | 60- | 70- | 100- |
---|---|---|---|---|---|---|---|---|---|
648 | 412 | 136 | 54 | 16 | 14 | 7 | 6 | 2 | 1 |
100.00% | 63.58% | 20.99% | 8.33% | 2.47% | 2.16% | 1.08% | 0.93% | 0.31% | 0.15% |
gnuplotさんの力でグラフ化するとこんな感じ。
Organization1人あたりいいね数ランキング
最後に 1人あたりいいね のランキングをみてみましょう。
|ランク|Organization名|1人あたりいいね|メンバ数|総いいね|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|@rector|13577.7|3|40733|
|2|@shouldbee|9852.67|3|29558|
|3|@synapse|6501.33|3|19504|
|4|@consensus-base|5538|2|11076|
|5|@qoncept|3974.6|5|19873|
|6|@ics|3271.5|4|13086|
|7|@sonicgarden|2831.88|17|48142|
|8|@wantedly|2777.38|16|44438|
|9|@yyphp|2695.36|14|37735|
|10|@increments|2567|21|53907|
@rector さんの数値がえらいことになっていますが、これは @hirokidaichi さんを擁する一方、メンバが3人しかいないことに起因します。
少数組織はこういう感じになりがちなので、「 メンバ数20名以上 」のOrganizationに絞ってみるとこんな感じです。
|ランク|Organization名|1人あたりいいね|メンバ数|総いいね|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|1|@increments|2567|21|53907|
|2|@mercari|1539.25|59|90816|
|3|@tis|1014.25|59|59841|
|4|@sakura_internet|880.333|21|18487|
|5|@cyberagent|623.621|66|41159|
|6|@nri|611.111|27|16500|
|7|@iwate-pu|596.821|28|16711|
|8|@m3dev|584.444|36|21040|
|9|@litalico|548.476|21|11518|
|10|@pixiv|533.452|42|22405|
本年のシェル芸
基本的に昨年と同じデータフォーマットで同じ分析をしているだけなので、シェル芸として真新しいものは特にありません。
とはいえ同じようにやるのも芸がないので、昨年のシェル芸を眺めながら以下の点で少しだけ改良(?)を加えたりしてみました。
ループの回し方
昨年はリストに対するループ操作をfor文でやっていました。
$ cat items.list
apple
banana
orange
$ for ITEM in $(cat items.list) ; do echo ${ITEM} ; done
apple
banana
orange
というような具合です。
機能的になんの問題もないのですが、個人的に「 ループ対象リストがあり、ループ対象を取り出して、処理する 」という思考の流れに対して、コードの記載順が「 ループ対象を、ループ対象リストから取り出して、処理する 」というようになっていたので少し違和感がありました。
左から右にコードを書く 割に、「リストから取り出す」部分で少し逆戻りして理解するようなところです。
というわけなので、ひたすら左から右に流れるよう、以下のようにwhile文で書きました。
$ cat items.list | while read ITEM ; do echo ${ITEM} ; done
apple
banana
orange
これなら思考の流れの通りにコードが記載でき、個人的に違和感がなくなりました。
ちなみに、速度ですが
$ time seq 100000 | while read LINE ; do echo ${LINE} ; done > while.out
real 0m2.948s
user 0m2.088s
sys 0m0.858s
$ time for LINE in $(seq 100000) ; do echo ${LINE} ; done > for.out
real 0m1.896s
user 0m1.568s
sys 0m0.325s
forのほうが速いようです。なんか意外。
strace
で見てみるとずいぶんと様相が違うようです。
strace
# strace -c ./for.sh
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
94.85 0.280198 3 100000 write
4.70 0.013896 3 4610 read
0.12 0.000356 4 91 mremap
0.08 0.000250 17 15 6 openat
0.06 0.000163 54 3 dup2
0.04 0.000118 118 1 clone
0.03 0.000094 31 3 munmap
0.02 0.000060 1 78 brk
0.01 0.000038 3 13 mmap
0.01 0.000036 2 17 rt_sigaction
0.01 0.000035 4 8 mprotect
0.01 0.000028 2 12 rt_sigprocmask
0.01 0.000023 2 12 close
0.01 0.000020 3 6 stat
0.01 0.000015 2 8 1 fcntl
0.00 0.000010 1 8 fstat
0.00 0.000009 5 2 1 wait4
0.00 0.000007 2 3 2 ioctl
0.00 0.000007 7 1 pipe
0.00 0.000006 2 3 lseek
0.00 0.000005 3 2 prlimit64
0.00 0.000004 1 5 5 access
0.00 0.000004 2 2 getpid
0.00 0.000004 4 1 sysinfo
0.00 0.000003 3 1 rt_sigreturn
0.00 0.000002 2 1 uname
0.00 0.000002 2 1 geteuid
0.00 0.000002 2 1 getegid
0.00 0.000002 2 1 getppid
0.00 0.000002 2 1 getpgrp
0.00 0.000002 2 1 arch_prctl
0.00 0.000001 1 1 getuid
0.00 0.000001 1 1 getgid
0.00 0.000000 0 1 execve
------ ----------- ----------- --------- --------- ----------------
100.00 0.295403 104914 15 total
# strace -c ./while.sh
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.262751 87584 3 1 wait4
0.00 0.000000 0 8 read
0.00 0.000000 0 12 2 close
0.00 0.000000 0 6 stat
0.00 0.000000 0 7 fstat
0.00 0.000000 0 3 lseek
0.00 0.000000 0 11 mmap
0.00 0.000000 0 8 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 16 rt_sigaction
0.00 0.000000 0 15 rt_sigprocmask
0.00 0.000000 0 1 rt_sigreturn
0.00 0.000000 0 3 2 ioctl
0.00 0.000000 0 5 5 access
0.00 0.000000 0 1 pipe
0.00 0.000000 0 1 dup2
0.00 0.000000 0 2 getpid
0.00 0.000000 0 2 clone
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 uname
0.00 0.000000 0 3 1 fcntl
0.00 0.000000 0 1 sysinfo
0.00 0.000000 0 1 getuid
0.00 0.000000 0 1 getgid
0.00 0.000000 0 1 geteuid
0.00 0.000000 0 1 getegid
0.00 0.000000 0 1 getppid
0.00 0.000000 0 1 getpgrp
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 14 6 openat
0.00 0.000000 0 2 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.262751 137 17 total
この結果を見て「なぜ遅いのか」を説明できるようになることを2019年の目標にしてみます。
処理用変数を減らす
これは主に昨年順位との比較を行ったときのものですが、今年順位リストに昨年順位リストを併記するような操作で、処理用変数を使っていました。
# 2017年の順位ファイル
$ cat rank2017.list
1 apple
2 banana
3 orange
# 2018年の順位ファイル
$ cat rank2018.list
1 banana
2 orange
3 grape
# 2018年の順位に2017年の順位(LAST)をアペンド
$ cat rank2018.list | while read LINE ; do LAST=$(grep $(echo ${LINE} | cut -d " " -f 2) rank2017.list | cut -d " " -f 1) ; echo ${LINE} ${LAST} ; done
1 banana 2
2 orange 3
3 grape
というように、昨年順位を一旦 LAST
変数に格納し、もとの LINE
にアペンドして出力するような感じです。
が、やはりシェル芸的にはちゃんと1行で流れるように書きたいと思っていました。
そこで、以下のように変更しています。
$ cat rank2018.list | while read LINE ; do grep $(echo ${LINE} | cut -d " " -f 2) rank2017.list | cut -d " " -f 1 | echo ${LINE} $(cat) ; done
1 banana 2
2 orange 3
3 grape
こちらでは LAST
で一旦昨年順位を保管していたところ、ひたすらパイプに流して最終的に $(cat)
で受け取っています。
このことを簡単にやると、
$ LINE="World!"
$ echo "Hello ${LINE}"
Hello World!
$ echo "World!" | echo "Hello $(cat)"
Hello World!
というような感じです。
このことを知らない場合はパイプ前の内容を一旦変数に格納することになりますが、実はパイプで繋いで cat
すると、catはパイプで流れてきた内容を標準出力してくれます。
これもひたすら左から右に流れるようなコードになり、個人的には満足しています。
おわりに
今年も長々とやってしまいました。
毎年やっているので特に何も考えなくても凶悪なワンライナーでランキングを出せるようになってきましたが、やはりシェルに通すまでのデータ準備が大変ですね。
昨年の20万ユーザに対し、今年は30万ユーザでしたので、単純に収集時間だけでもバカになりませんし、収集し始めてから「あっ!」なんてことで1からやり直し、みたいなこともどんどん辛くなりそうです。
来年はドモホルンリンクル方式でゆっくり、ながーく収集したほうがいいんですかね。
(とはいえ、最初と最後で時間が開いてしまうとランキングとして不正確というか不誠実というか...)
ただ、こうやって毎年眺めているとQiitaで1年いろんなことがあったなぁということと、プラットフォームとして成長していっているのが素直に見えるので、 分析やって楽しい というのが率直な感想です。
それではまた来年。良いお年を~。