139
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Qiitaのいろいろランキング2018

Last updated at Posted at 2018-12-29

はじめに

早いもので2018年も終わりに近づきました。
個人的な恒例と化してきたQiitaランキング記事を今年も書いていこうと思います。
これまでのものはこちら。

この記事を書くにあたり、いつものようにデータを集めていますが 2018年12月22日あたり のデータになっています。ご認識ください。

やること

昨年時点でぱっと思いつくランキングはやってしまったので、基本的にやることは昨年と同じです。

  • ユーザ別Contributionランキング
  • ユーザ別記事数ランキング
  • ユーザ別フォロワーランキング
  • 記事別いいねランキング
  • その他分析いろいろ

枠組み自体は昨年と同じものを使うので、昨年からの推移に着目しようかと思います。

あとは今年の新しい分析として、 organizations ランキングもやってみます。
弊社 も非公式ながらorganizationを作り、 Advent Calendar にもエントリーできたので、やってみたいなと思った次第です。

前準備

例によってシェル芸で分析をしていくのですが、いかんせんデータが多いので事前に準備をしておきます。
昨年使ったデータ収集シェル芸は当然使えなくなっていたので、少し手直しをしつつデータを集めておきます。

ここから先のデータフォーマットは 昨年 同様ですので、昨年のシェル芸がそのまま使えるというわけです。ありがたい。

qiita_user_data.csv
$ 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さんの力でグラフ化するとこんな感じ。

member_graph.png

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年いろんなことがあったなぁということと、プラットフォームとして成長していっているのが素直に見えるので、 分析やって楽しい というのが率直な感想です。
それではまた来年。良いお年を~。

139
107
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
139
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?