唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

はてなブックマーク数が多い2017年のアドベントカレンダーのランキングを調べた

QiitaとAdventarにあるアドベントカレンダーについて、個別の記事とカレンダー全体のはてなブックマーク数のランキングを29日の21時ごろに集計した
個別記事上位100件のURLについては軽く目で見て文字化けを直したり最近の記事ではないURLをフィルタリングしてある(スクリプトのバグや作業ミスで抜けてる場合があったらご容赦ください。バグを直していただけるととても嬉しいです)

カレンダーごとの合計数のランキング

カレンダーとカレンダーに登録されている記事のはてなブックマークの合計数

順位 カレンダー名 はてなブックマーク数
1 Mercari 3411
2 ex-mixi 2870
3 ひとりでデータ分析ガチ勉 2627
4 武蔵野 1920
5 python 1888
6 CrowdWorks 1886
7 はてなエンジニア 1787
8 Livesense - 学 1621
9 ドワンゴ 1601
10 退職者 1548
11 freee developers 1494
12 freee developers 1484
13 mixiグループ 1471
14 Akerun 1152
15 スマートスピーカー 1143
16 退職者その2 1119
17 フリーランス 1096
18 Increments 1082
19 Chromium Browser 1040
20 TIS 979
21 FOLIO 953
22 Vue.js #3 922
23 ブロックチェーン 918
24 RECRUIT MARKETING PARTNERS 861
25 編集とライティングにまつわるアレコレ 847
26 SHIROBAKO 815
27 今年買ってよかったもの 806
28 Gunosy 790
29 個人開発 786
30 第2のドワンゴ 770
31 WACUL 676
32 U-TOKYO AP 662
33 ソフトウェアテストの小ネタ 659
34 エムスリー 658
35 python 637
36 KAYAC 633
37 Advent Calendar 2017 608
38 Livesense - 関 606
39 Misoca 573
40 Service Design 550
41 AWS re:Invent 2017 新サービス紹介 548
42 Go 546
43 コネヒト 545
44 JavaScript 542
45 やる夫 539
46 Vue.js #1 527
47 LIFULL 521
48 WebAssembly 516
49 MySQL Casual 516
50 eureka Native Engineer 516
51 React Native 511
52 Elm 2 510
53 さくらインターネット 504
54 Recruit Engineers 502
55 Mackerel 486
56 eureka Engineering 483
57 機械学習と数学 479
58 Arduino 479
59 AWSサーバーレス 472
60 クソアプリ 467
61 Vim 466
62 Speee 457
63 Node.js 2 446
64 一休.com 446
65 Yahoo! JAPAN Tech 435
66 OPENLOGI 433
67 Okinawa.rb 430
68 Go2 424
69 FUJITSU 413
70 Ateam Lifestyle 409
71 トレタ 403
72 LIFULLその2 393
73 マサカリ 379
74 Elastic stack (Elasticsearch) 375
75 Retty Inc. 374
76 Go3 368
77 NTTコミュニケーションズ 359
78 グロービス 359
79 Fablic 352
80 KMC 338
81 ピクシブ株式会社 333
82 AWS Fargate 333
83 フューチャーアーキテクト 330
84 自由ライセンスで記事を公開してみよう 326
85 Webパフォーマンス 325
86 iOS 324
87 Vim2 322
88 Linux 316
89 数学とコンピュータ 309
90 pyspa 308
91 ベーシック 306
92 PHP 290
93 React #1 289
94 Raspberry Pi 288
95 OSS紹介 285
96 Redash 284
97 Go4 283
98 Webスクレイピング 279
99 Sketch 277
100 Selenium/Appium 273

記事ごとのランキング

順位 記事名 はてなブックマーク数 カレンダー名
1 Pythonの学び方と,読むべき本を体系化しました2018〜初心者から上級者まで - Lean Baseball 1768 python
2 11ヶ月間でTOEICスコアを300点から835点に上げた英語学習法 - Qiita 1443 Livesense - 学
3 Webアプリケーションフレームワーク導入時に考慮すべき22の観点 - Qiita 1272 CrowdWorks
4 社内の面倒な手作業はZapierにやらせようーーノンプログラマーでも業務自動化ができるツールを導入してみて - Mercari Engineering Blog 1112 Mercari
5 Google Homeでやったことまとめ - Qiita 960 スマートスピーカー
6 テストがなかった無法地帯にテストを導入して開発速度を1.7倍にした話 - Qiita 952 mixiグループ
7 仮想通貨マイニングに関するまとめ - Gunosy Tech Blog 899 ブロックチェーン
8 Amazon Auroraの先進性を誰も解説してくれないから解説する - Qiita 899 武蔵野
9 グリグリ動くUIをVueとSVGでサクッと書く - No Regrets in Bathing 804 Vue.js #3
10 会社勤めのエンジニアが開発したサービスを買い取って独立した話 - Qiita 799 ex-mixi
11 【Day-14】株価や仮想通貨で使える、5つのテクニカル分析を解説&Pythonで実装してみた - プロクラシスト 737 ひとりでデータ分析ガチ勉
12 【2017年版】買ってよかったもの60選。生活が豊かになるものをまとめました。 - ものものブログ 734 今年買ってよかったもの
13 パソコンをロックせずに放置する人をしつける12個のいたずら - フォトシンス エンジニアブログ 650 Akerun
14 Bing検索の裏側―BitFunnelのアルゴリズム - Hatena Developer Blog 643 はてなエンジニア
15 仮想通貨自動取引入門 - Qiita 632 U-TOKYO AP
16 27歳フリーランスエンジニアが1200万稼いでみて、得たものと失ったもの | Permanent Til 631 フリーランス
17 市場バグを引き起こした優秀なデータたち - ボドゲを愛するテスト屋さん 619 ソフトウェアテストの小ネタ
18 ID生成大全 - Qiita 599 TIS
19 エンジニアのベンチャー企業の選び方/働き方/やめ方 - mizchi's blog 599 退職者
20 エンジニアが読みたくなる職務経歴書 - dwango on GitHub 582 ドワンゴ
21 半年で40kg痩せた!ダイエットでわかるリーンなプロジェクトマネジメント手法 - Qiita 562 ex-mixi
22 ディープラーニングでアスキーアートを作る - Qiita 537 やる夫
23 暮しの手帖のすごさをネットサービスの設計者はみんな理解したほうがいい話|えの|note 512 Service Design
24 技術書を作るための技術スタック - Mercari Engineering Blog 495 Mercari
25 エンジニアが転職する時のチェックリスト - とりあえずやってみればいいじゃん 486 退職者その2
26 ひとりでCPUとエミュレータとコンパイラを作る Advent Calendar 2017 - Qiita 480 Advent Calendar 2017
27 Reactを使って本気でアンケートシステムをつくった - Qiita 479 エムスリー
28 ちょっとしたツールを作るのに便利なPythonライブラリ - Qiita 477 LIFULL
29 極めろ!!Google Chrome Devtools 52の関節技 - Qiita 476 Livesense - 関
30 【Day-17】DeepLearning系ライブラリ、『Keras』の使い方まとめ(2.x対応版) - プロクラシスト 469 ひとりでデータ分析ガチ勉
31 ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM — hayato.io 466 Chromium Browser
32 Elixir から Elm の流れで、いよいよオブジェクト指向に対する懐疑心が無視できないレベルに達した2017年冬。 – ゆびてく 461 Elm 2
33 jQueryが必要とされなくなってきたのは,Reactなどの他のフレームワークが登場したせいではなく,標準DOM APIが進歩したおかげです - ncaq 451 JavaScript
34 データを見続けて6年。ウェブ編集者が知っておくべき13のルール(消さずにすんだ) - @d_tettu blog 433 編集とライティングにまつわるアレコレ
35 新QiitaでReactをやめてhyperappを採用した背景 - Qiita 430 Increments
36 退職 - zatsu 427 退職者
37 カタカタカタッターンを可視化した - Qiita 410 クソアプリ
38 武蔵野アニメーション総務 興津由佳の左眼について - Konifar's WIP 410 SHIROBAKO
39 Node.js Performance 改善ガイド - from scratch 406 Node.js 2
40 まだ CSV の文字化けで消耗してるの?(Excel で直接開いても文字化けしない CSVファイルを Python3 で作成するスマートな方法) - akiyoko blog 403 python
41 gitbookで設計書を作成したら最高だった話 - フォトシンス エンジニアブログ 398 Akerun
42 デッドロックおじさん戦記 - Mercari Engineering Blog 387 Mercari
43 【Day-23】機械学習で使う"距離"や"空間"をまとめてみた - プロクラシスト 386 機械学習と数学
ひとりでデータ分析ガチ勉
44 開発以外の仕事でやってるちょっとした自動化の紹介 - Qiita 386 Misoca
45 デザイナーの僕がいかにしてビデオゲームのUIから「インタラクション・デザイン」を学ぶのか | 超ゲームウォーカー! 377 FOLIO
46 お手軽に静的サイトを構築する - Qiita 375 mixiグループ
47 I/O負荷の正確な状況はiowaitでは分かりません - Qiita 373 さくらインターネット
48 既存のサービスを組み合わせて本質的な開発に集中する - star__hoshi's diary 372 個人開発
49 2017年のディープラーニング論文100選 - Qiita 368 FUJITSU
50 dev.toがなぜinsanely fastを実現出来ているか - Qiita 349 Okinawa.rb
51 突撃!隣のキーボード - freee Developers Blog 348 freee developers
freee developers
52 2018 年は Hyperapp の年だ - Qiita 337 Increments
53 わかりやすい画像のdiffを求めて - Qiita 331 WACUL
54 エンジニアのフリーランスの始め方/働き方/やめ方。あるいは業務委託の利点と正社員の利点 - みんからきりまで 328 フリーランス
55 個人開発のWebサービスで、Trelloを使っていい感じに開発ロードマップを公開した話 - NOT SO BADなブログ 327 個人開発
56 スマートスピーカーを使って業務システムを作る(考察編) - Qiita 327 OPENLOGI
57 運用に耐えるRailsによるWebアプリケーションの作り方 - Qiita 326 トレタ
58 どのように40万文字を超える技術書籍を執筆したのか? - Qiita 321 ex-mixi
59 HTTP/2における双方向通信とgRPCとこれから - Qiita 320 第2のドワンゴ
60 シェルスクリプトを何万倍も遅くしないためには —— ループせずフィルタしよう - Qiita 319 自由ライセンスで記事を公開してみよう
61 メルカリの分析チームとは?その全ての疑問にひとつひとつ答えます - Mercari Engineering Blog 315 Mercari
62 【Day-1】データ分析/機械学習を行うために知っておきたいことを列挙する - プロクラシスト 314 ひとりでデータ分析ガチ勉
63 Vue.js いろいろまとめ - Qiita 312 Vue.js #1
64 ヘッドレスChromeの自動化ツール「Chromeless」を使って自動テストを実施する #serverless #adventcalendar | Developers.IO 301 AWSサーバーレス
65 SDN 温故知新 - Qiita 296 武蔵野
66 一休.com で 1 年半の間に取り組んできた改善内容について - 一休.com Developers Blog 292 一休.com
67 現場で役立つシステム設計の原則にあるUMLをPlantUMLで書いてみる - Qiita 292 フューチャーアーキテクト
68 freeeのChatbotが問い合わせの4割近くを解決できるようになるまで - freee Developers Blog 289 freee developers
freee developers
69 Raspberry Pi で簡単にネットワークブートができるようになったよ,という話 - Qiita 284 Raspberry Pi
70 やはりお前らの真偽値メソッド名は間違っている。 〜「Xxx できる?」系メソッドの命名〜 - Qiita 281 マサカリ
71 PM(Product Manager)って何やってるのか具体的な案件を見ながら説明してみる - freee Developers Blog 276 freee developers
freee developers
72 インターネット溶かすボタンできた - マルシテイア 274 はてなエンジニア
73 開発現場に根強く残る8個のバグレポートアンチパターン - Qiita 265 ex-mixi
74 ネイティブアプリエンジニアが伝える、バックエンドエンジニアに認識して欲しい4つのこと | eureka tech blog 259 eureka Native Engineer
75 負荷試験のためのノウハウと Webフレームワークの負荷試験 (Python,Node,Go,PHP) - Qiita 258 Retty Inc.
76 Webベンチャーから電機メーカーに転職して思うこと (近況まとめ) - sseze's blog 257 ex-mixi
77 VRで「結月ゆかり」になって生放送する - Qiita 255 ドワンゴ
78 チームの課題から考える、Adobe XDとSketchの導入メリット – PSYENCE:MEDIA 253 RECRUIT MARKETING PARTNERS
79 なぜあなたは SHOW ENGINE INNODB STATUS を読まないのか - そーだいなるらくがき帳 248 MySQL Casual
80 学生エンジニアは時給1000円のベンチャーでバイトをするのをやめろ - 未来永劫 242 klis
81 物理フリックを30個量産販売している話 - Qiita 235 Arduino
82 強いエンジニアにHelloWorldさせてみた(縛りあり) - Qiita 221 LIFULLその2
83 Seleniumでスクリプトを書くのに使える記録ツールあれこれ | 品質向上ブログ 217 Selenium/Appium
84 Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる - Qiita 214 CrowdWorks
85 SHIROBAKOと後輩の門出 - Konifar's ZATSU 212 SHIROBAKO
86 git grepでソースコード内検索のあれこれ - エンジニアをリングする 211 FOLIO
87 AWS FargateとLambdaでサーバーレスなクローラー運用 - orangain flavor 209 Webスクレイピング
88 コスパで学ぶ自動テストのはじめ方 - 若き JavaScripter の悩み 208 モバイル 自動化 / 自動テスト
89 QuipperにおけるReact Native活用事例 - Quipper プロダクトチームのブログ 205 React Native
90 コンポーネント指向フロントエンド開発におけるデザイナーの参画について - Qiita 204 ドワンゴ
91 React とGUI 設計論、あるいは新世代のホームページビルダー - Qiita 201 React #1
92 「書き直したい」 をグッと抑えて小さな改善を積み重ねよう – PSYENCE:MEDIA 201 RECRUIT MARKETING PARTNERS
93 大規模memcached障害と私 - Qiita 198 ex-mixi
94 非エンジニアのマネージャがエンジニアチームと上手くやる方法 - Qiita 197 CData Software User Group
95 ブルゾンちえみ判別器をブラウザ上に実装する - Qiita 191 WebAssembly
96 PID制御について宇宙一わかりやすく解説してみる - ロボット・IT雑食日記 190 Robot/ロボット
Arduino
制御工学
97 今度こそ絶対あなたに理解させるPaxos - Qiita 189 武蔵野
98 HTTP/2が速いという幻想 - Webパフォーマンスについて 187 Webパフォーマンス
99 マスターデータ管理を優しくExcelから解き放つ (ドリコムアドベントカレンダー9日目) 186 ドリコム
ドリコム
100 数学系向けDeepLearning/Tensorflow入門 - Qiita 185 数学とコンピュータ

去年の記事

sucrose.hatenablog.com

調べるのに使ったソースコード

雑実装なのでページがutf-8以外だと文字化けしたりします

# -*- coding: utf-8 -*-

import pyquery
import time
import requests
import json

banned = set(['https://twitter.com/', 'https://www.google.co.jp', 'https://twitter.com'])


def getQiitaCalendarList(year, page):
    calendar_list = pyquery.PyQuery(url='http://qiita.com/advent-calendar/{}/calendars?page={}'.format(year, page))
    calendars = set()
    for elm in calendar_list.find('.adventCalendarList_calendarTitle > a'):
        a = pyquery.PyQuery(elm)
        href = a.attr('href')
        calendars.add((href[22:], a.text()))
    return calendars

def getQiitaArticles(name):
    calendar = pyquery.PyQuery(url='http://qiita.com/advent-calendar/2017/{}'.format(name))
    article = set()
    for elm in calendar.find('.adventCalendarItem_entry > a'):
        a = pyquery.PyQuery(elm)
        url = a.attr('href')
        if 'http' in url and url not in banned:
            article.add(url)
    return article

def getAdventarCalendarList(year):
    calendar_list = pyquery.PyQuery(url='http://www.adventar.org/calendars?year={}'.format(year))
    urls = set()
    for elm in calendar_list.find('.mod-calendarList-title > a'):
        a = pyquery.PyQuery(elm)
        href = 'http://www.adventar.org' + a.attr('href')
        urls.add((href, a.text()))
    return urls

def getAdventarArticles(url):
    calendar = pyquery.PyQuery(url=url)
    article = set()
    data = calendar.find('div[data-react-class]').attr('data-react-props')
    for entry in json.loads(data)['entries']:
        url = entry['url']
        if url is not None and 'http' in url and url not in banned:
            article.add(url)
    return article

def getHatenaBookmarkCount(urls):
    assert len(urls) <= 50
    try:
        return requests.get('http://api.b.st-hatena.com/entry.counts', params={'url': urls}).json()
    except:
        time.sleep(2)
        return requests.get('http://api.b.st-hatena.com/entry.counts', params={'url': urls}).json()

if __name__ == '__main__':
    result = []
    result_article = []
    
    calendars = set()
    for i in range(1, 31):
        calendars |= getQiitaCalendarList(2017, i)
        time.sleep(1)

    for name, title in calendars:
        articles = getQiitaArticles(name)
        calendar_url = 'http://qiita.com/advent-calendar/2017/' + name
        urls = [calendar_url] + list(articles)
        hatebu_count = getHatenaBookmarkCount(urls)
        result.append((sum(hatebu_count.values()), calendar_url, title))
        result_article.extend([(url, count, calendar_url, title) for url, count in hatebu_count.items()])
        time.sleep(1)
    
    calendars = getAdventarCalendarList(2017)
    time.sleep(1)
    
    for calendar_url, title in calendars:
        articles = getAdventarArticles(calendar_url)
        urls = [calendar_url] + list(articles)
        hatebu_count = getHatenaBookmarkCount(urls)
        result.append((sum(hatebu_count.values()), calendar_url, title))
        result_article.extend([(url, count, calendar_url, title) for url, count in hatebu_count.items()])
        time.sleep(1)
    
    result.sort(reverse=True)
    print u'|*順位|*カレンダー名|*はてなブックマーク数|'.encode('utf-8')
    for i, (count, name, title) in enumerate(result[:100], 1):
        print u'|{0}|<a href="{1}">{2}</a>|{3}|'.format(i, name, title, count).encode('utf-8')
    
    result_article.sort(key=lambda x: -x[1])
    print
    print u'|*順位|*記事名|*はてなブックマーク数|*カレンダー名|'.encode('utf-8')
    for i, (url, count, calendar_url, title) in enumerate(result_article[:120], 1):
        try:
            print u'|{0}|<a href="{1}">{2}</a>|{3}|<a href="{4}">{5}</a>|'.format(i, url, pyquery.PyQuery(url=url).find('title').text().replace('|', '&#x7c;'), count, calendar_url, title).encode('utf-8')
        except:
            print u'|{0}|<a href="{1}">{2}</a>|{3}|<a href="{4}">{5}</a>|'.format(i, url, url, count, calendar_url, title).encode('utf-8')
        time.sleep(1)