Posted at
DiverseDay 6

qiita Advent Calendar に「なんか」って書いてる数を数えてみる

More than 3 years have passed since last update.

みなさん、Advent Calendar 楽しんでますか?

ぼくを含め、カレンダーの枠予約コメントに「なんか」等書かれている数が多かったように感じたので、現時点の「なんか」をスクレイピングしてさくっと集計することにしてみました。

qr/(な[んに]|何)か/ という正規表現で、「なんか」「なにか」「何か」が見つかれば「なんか」を含んでいるということにします。

結果は、以下の通りです。

# 12/6 11:00 時点の集計値

スクレイピングできたカレンダー数:367
カレンダーごとの最大なんか数: 13
全カレンダー通してのなんか数: 1009
なんかが書かれてるカレンダー数: 244
なんかが書かれてるカレンダーあたりの平均 nanka 数: 4.135246

まず、qiita に公開されているカレンダー 367 カレンダーのうち 66% である 244 カレンダーに「なんか」が含まれていることがわかりました。

そのうち、最も「なんか」が多かったカレンダーには、13件「なんか」が含まれておりました。

また、「なんか」カレンダーの平均「なんか」は、4.1 件でした。

ぼくも含め、「なんか」書きたいけどネタはこれから考える!って場合が一定数あることがわかりました。

最近の活動を振り返って公開できることを記事にしたり、カレンダーのために頑張って tips やネタを生み出して書き続けることに意義があると思うので、前もって書く内容が決まっているか、「なんか」あとで最後の最後までネタを絞り出すかにかかわらず、みんなで頑張ってカレンダーを埋めていきたいですね!

最後に、スクレイピングと集計に使ったスクリプトを載せておきます。


nanka-scraper.pl

#!/usr/bin/env perl

#
# perl nanka-scraper.pl | tee nanka.log
#
use strict;
use warnings;

use Web::Scraper;
use LWP::UserAgent;
use URI;
use utf8;

$Web::Scraper::UserAgent = LWP::UserAgent->new(agent => 'Nanka Counter (http://qiita.com/woremacx/)'); die;

my $s_pager = scraper {
process 'a.js-next-page-link', 'next' => '@HREF';
process 'td.adventCalendarList_calendarTitle > a', 'calendar[]' => '@HREF';
};

my $s = scraper {
process 'div.adventCalendarItem_comment', 'comment[]' => 'TEXT';
process 'div.adventCalendarCalendar_join', 'join[]' => 'TEXT';
};

sub process_summary {
my $uri = shift;
my $scraped = $s->scrape($uri);

my $re = qr/(な[んに]|何)か/;
my $summary;
$summary->{$_} = 0 for qw/blank nanka join others/;
for my $line (@{ $scraped->{comment} || [] }) {
unless (length($line)) {
$summary->{blank}++;
}
elsif ($line =~ /$re/) {
$summary->{nanka}++;
}
else {
$summary->{others}++;
}
}

$summary->{join} = scalar(@{ $scraped->{join} || [] });
printf("summary waiting_for_join:%d comment_blank:%d comment_nanka:%d comment_others:%d url:%s\n",
$summary->{join}, $summary->{blank}, $summary->{nanka}, $summary->{others},
$uri->as_string);
}

sub main {
$| = 1;
binmode STDOUT, ":utf8";

my $top = 'http://qiita.com/advent-calendar/2015/calendars';
my $uri_next = URI->new($top);
while (1) {
warn $uri_next;
my $scraped = $s_pager->scrape($uri_next);

for my $calendar (@{ $scraped->{calendar} || [] }) {
process_summary(URI->new_abs($calendar, $uri_next));
sleep(1);
}

last unless $scraped->{next};
$uri_next = URI->new_abs($scraped->{next}, $uri_next);
};
}

main;



nanka-summary.pl

#!/usr/bin/env perl

#
# cat nanka.log | perl nanka-summary.pl
#
use strict;
use warnings;
use List::Util qw(max);

my %data;
while (my $line = <>) {
next unless $line =~ /^summary/;

$line =~ s/^summary //;

my %row;
map {
my @tmp = split(/\:/, $_, 2);
$row{$tmp[0]} = $tmp[1];
} split(/\s+/, $line);

$data{ $row{url} } = \%row;

}

my @nanka_calendar = grep { $_->{comment_nanka} > 0 } values(%data);
my $have_nanka_count = scalar(@nanka_calendar);
my $nanka_sum;
$nanka_sum += $_->{comment_nanka} for @nanka_calendar;
my @each_comment_nanka = map { $_->{comment_nanka} } @nanka_calendar;
my $nanka_max = max(@each_comment_nanka);

printf("スクレイピングできたカレンダー数:%d\n", scalar(keys(%data)));
printf("カレンダーごとの最大なんか数: %d\n", $nanka_max);
printf("全カレンダー通してのなんか数: %d\n", $nanka_sum);
printf("なんかが書かれてるカレンダー数: %d\n", $have_nanka_count);
printf("なんかが書かれてるカレンダーあたりの平均 nanka 数: %f\n", $nanka_sum / $have_nanka_count);