Scalaで中規模のプロダクトで参考にしたいものを探したかったので抽出してみた

言語習得をしようとした場合、ある程度のところにきたら参考にしたほうがいいと思われる現実に動いているコードを見たくなります。ところが門外漢の場合はその分野はよく分からないので非常に探しづらいです。探せても、ものすごく規模の大きいコードだったりするので辛いです。そこで、

  • 世の中の公開されていて有用なコードは大抵githubにある
  • そういうコードは大量にstarがついている

この仮定に基づきgithub apiを使用して見た方が良さそうなプロダクトを出してみました。

  • starの数でorderをかけて上位をもらってきました。
  • さらにそこからsizeでorderをかけて表示しています

さすがにSparkは人気高すぎですね(sizeも大きすぎますが)。
単純にsizeで切り分けるとfpinscala当たりから下が割と見るのに楽そうかな
と思いました。

結果

size: 1301149 stars: 2975 url: https://github.com/apache/spark
size: 239164 stars: 3584 url: https://github.com/akka/akka
size: 184359 stars: 3696 url: https://github.com/scala/scala
size: 117478 stars: 5866 url: https://github.com/playframework/playframework
size: 117306 stars: 2580 url: https://github.com/twitter/kestrel
size: 104082 stars: 1725 url: https://github.com/scalaz/scalaz
size: 91885 stars: 1767 url: https://github.com/twitter/scala_school
size: 72924 stars: 1462 url: https://github.com/mesos/spark
size: 71091 stars: 1565 url: https://github.com/snowplow/snowplow
size: 48598 stars: 2097 url: https://github.com/sbt/sbt
size: 45302 stars: 1636 url: https://github.com/gatling/gatling
size: 33105 stars: 5941 url: https://github.com/PredictionIO/PredictionIO
size: 32448 stars: 1798 url: https://github.com/spray/spray
size: 32011 stars: 3226 url: https://github.com/twitter/finagle
size: 25413 stars: 3795 url: https://github.com/takezoe/gitbucket
size: 24529 stars: 1197 url: https://github.com/apache/kafka
size: 22289 stars: 1155 url: https://github.com/mesosphere/marathon
size: 20726 stars: 1962 url: https://github.com/twitter/scalding
size: 17587 stars: 2455 url: https://github.com/swagger-api/swagger-core
size: 13333 stars: 1508 url: https://github.com/scala-js/scala-js
size: 12360 stars: 1563 url: https://github.com/scalatra/scalatra
size: 11948 stars: 1430 url: https://github.com/twitter/summingbird
size: 6742 stars: 1152 url: https://github.com/fpinscala/fpinscala
size: 5850 stars: 1366 url: https://github.com/pocorall/scaloid
size: 5458 stars: 2432 url: https://github.com/twitter/flockdb
size: 5284 stars: 1951 url: https://github.com/twitter/gizzard
size: 5265 stars: 2032 url: https://github.com/twitter/snowflake
size: 4580 stars: 1157 url: https://github.com/GravityLabs/goose
size: 602 stars: 2947 url: https://github.com/lhartikk/ArnoldC
size: 494 stars: 1721 url: https://github.com/MojoJolo/textteaser

抽出用スクリプト

use strict;
use warnings;
use LWP::UserAgent;
use JSON;

my $url = 'https://api.github.com/search/repositories?q=language:scala&sort=stars&order=desc';
my $ua  = LWP::UserAgent->new;

my $response = $ua->get($url);

unless( $response->is_success ) {
    die $response->status_line;
}

my $json = $response->decoded_content;
my $data = decode_json($json);

for my $item ( sort { $b->{size} <=> $a->{size} }  @{ $data->{items} } ) {
    printf("size: %s stars: %s url: %s\n", $item->{size}, $item->{stargazers_count}, $item->{svn_url});
}