scala勉強会の、今までの参加者一覧と、参加回数の取得script

つっくったぜぃ(・∀・)/
まぁ明らかに効率悪いところが多数ありますが、そこはあとで改善する or これを元に他の人がさらに拡張してくれるのも面白いので、どんどんいじってください


追記 ちょっとへんこうしたお

object Hoge{
  
  def main(args:Array[String]){
    
    val atnd = """(http://atnd.org/events/)(\d+)""" r
      
    (2 to 18).map{ //第2回から、第18回までのURLを作成
      n =>
      "http://scala-users.org/shibuya/index.php?title=%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC"+
      n + "%E5%9B%9E"
    }.map {
      getHtml(_) //それぞれすべてのhtmlを文字列で取得しちゃうwww効率悪いwww
    }.collect {
      case Some( wikiHtml ) => 
      atnd.findFirstIn( wikiHtml ) //正規表現でATNDのURLを探す
    }.collect { 
      case Some(atnd(_ ,eventID)) => //eventIDのみ取り出す
      getHtml( "http://api.atnd.org/events/users/?event_id=" + eventID ) //API用のURL作成して、結果のxml取得
    }.collect{
      case Some( xmlResponce ) =>
      scala.xml.XML.loadString( xmlResponce ) \\ "nickname" map{_.text} //参加者の名前だけ取り出す
    }.flatten.groupBy(a => a).map{
      case (name,list) => (name,list.size)//ここの処理groupBy使って、最初に載せたものから変えた
    }.toList.sortWith{
      case ((_,x),(_,y)) => x > y //参加回数多い順に並べ替え
    } foreach {
      println //名前と、参加回数のTupleのまま、printする
    }
  }
  
  /**
   * @param url 取得するURL
   * @param encode エンコード
   * @return htmlを一気に全部文字列にして返す。 htmlの一部しか使用しない場合かなり非効率www
   */
  def getHtml(url:String,encode:String = "UTF-8" ):Option[String] = {
    using{ io.Source.fromURL( url , encode) }{_.mkString}
  }
  
  //前に載せた、ローンパターンでリソース自動で閉じる関数
  def using[A <: {def close()},B](resource:A)(func:A => B):Option[B] =
    try{
      Some( func(resource) ) //成功したら、Someに包んで返す
    }catch{
      case e:Exception => e.printStackTrace
      None  //失敗したら、ログ吐いて、None返す
    }finally{
      if(resource != null) resource.close()
    }

}



変更前の一部↓

    }.flatten.foldLeft(collection.mutable.Map[String,Int]()){ 
      case (map,name) => //flattenしたあと、それぞれの参加者の名前が何度でてくるか数える(このあたりとか、絶対もっと効率いい方法ありそう)
      if(! map.contains(name) ){
        map += ( name -> 0 )
      }
      map(name) = map(name) + 1
      map
    }.toList.sortWith{

(12月17日2:00くらいの時点で実行した)結果がこれ↓
(まだ実施してない17回と18回も含んでる)

(kaigaiengineer,17)
(hito_asa,16)
(xuwei_k,15)
(tototoshi,14)
(shoma.h4a,12)
(uchida75cm,12)
(k.hayashi,11)
(cooldaemon,10)
(Nkjason,9)
(faith_and_brave,9)
(gkojax,8)
(kiris,7)
(hydrocul,7)
(nanjakkun,6)
(ueno1969,4)
(m4i,4)
(nemui_fujiu,4)
(yuusaku_tan,4)
(tmiyamon,3)
(chimerast,2)
(migrs,2)
(youhei,2)
(Kato Kazuyoshi,2)
(kxbmap,2)
(tabe1hands,2)
(morihime,2)
(koduki,2)
(daishi_hmr,2)
(akusumoto,2)
(sagara177,2)
(melpon,2)
(diizuka,2)
(rti7743,1)
(awn,1)
(yousuke.hara,1)
(watarum_atnd,1)
(takiuchi,1)
(zentooo,1)
(technohippy,1)
(toru_inoue,1)
(gami,1)
(masahiko,1)
(@pomu0325,1)
(_hidemi_,1)
(yusukei,1)
(maeda_,1)
(アグス,1)
(lafesta,1)
(r153,1)
(bannyan,1)
(Dubhead,1)
(illness072,1)
(cobalt,1)
(PHP初心者勉強会,1)
(nexrei_again,1)
(yamashitatoshinari,1)
(bdush,1)
(mikiohokari,1)
(georgenano,1)
(kazz,1)
(つかもとあきひと,1)
(kaz_hiramatsu,1)
(tukiyo_gmail,1)
(yuroyoro,1)
(hatchup_nagatatakayuki,1)
(vevisuke,1)
(tamaquit,1)
(chikaram,1)
(giuniu,1)
(maison,1)
(shyoon,1)

プログラム自体は、もうなんだか、どこで分けるのかを考えるのがめんどくさかったので、つなげられつところは全部つなげちゃいましたw*1
scalaに慣れてる人はともかく、ほとんどの人にとってはかなり読みづらいかと思います(´・ω・`)
本当は、PartialFunctionとか使うといいんですかねぇ。
あと、html全部取得して、Stringのオブジェクト生成してるから、明らかに遅いです(´Д`)*2
まぁ、本当にLL的にscriptとしてというか、1度しか実行せず使い捨てならば、実行時間よりプログラムの作成時間とかのほうが重要だと思うので、こういう使い方もありなんじゃないかと思います。

時間あれば、もうちょっと改造して、表とかグラフとかつくってみようかなぁ・・・

*1:20行以上がまるまる1つの式

*2:それより何より、IOに時間かかってる気もするが