2014年2月26日水曜日

PlayFrameworkで会員制ギャラリーサイトを作る習作:2ページ目以降をAjaxで取得する

それでだ、
Play Frameworkで会員制ギャラリーサイトを作っている途中。
前回のところでデータを取ってきて表示するところまで行きました。
app/views/ajax/listAjax.scala.html今回は画面をスクロールしたら2ページ目、3ページ目が読み込まれるところの処理を作っていきます。

なお、今回からTypesafe Activatorでアプリケーションを起動させるのはやめました。だって、play cleanがされなくて改修前の実装コードが残ってしまうのだもの・・・・。
すなおに play debug runするようにしました。

さて、2ページ目以降を取得する処理です。

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/commit/5756fc962c1ef328e3020beb0b92d5e20c3a3b51

のコミットが全てなのですが、処理の流れを見て行きましょう。

まずはCntroller


app/controllers/ajax/ListAjaxController.java
にしました。なおパッケージ名はcontrollers/ajax/***とかcontrollers/api/*** とかのように、共通するレスポンス形式とかでまとめておいたほうが後々フィルタをかけて処理させるときとかに楽になります。

1Action1Controllerファイルくらいにしておくと大規模開発にも耐えられるようになります。(コンフリクトが起きにくくなるという意味で)

1Controllerに入れていいのはせいぜいフォームの入力・確認・完了処理くらいまでかと思います。あとは分けましょう。
デメリットとしてはコンパイルが遅くなります。
ちなみにajax/ListAjaxController.javaの名前の付け方はイケてないです。

中身の処理は引数をページ番号としてまあ結果一覧を取得して返すだけの処理です。
 
public static Result index(int page) {
   List<SiteBean> resultList = SiteBeanService.getSiteBeanResultList(page);
   return resultList.size() == 0 ? ok("") : ok(views.html.ajax.listAjax
     .render(page, resultList));
  }

テンプレートでは面倒なのでhtmlを返しています。
JSONで返して、Javascript側でゴニョゴニョしてもいいかと思います。

conf/routes
にルーティングの設定を追加しておきましょう。
 
GET     /listAjax/:page                           controllers.ajax.ListAjaxController.index(page:Integer)

次にテンプレートから呼び出す方法


さて、最初の画面を表示して2ページ目以降を取得する処理ですが、
jquery_bottom
を利用してアクションを呼び出すようにします。

ページのフッターに次に呼ぶページ番号と更に読み込むページがあるかのフラグ用の値をセットしておきます。
 
<input type="hidden" id="hasNext" value="0" />
<input type="hidden" id="page" value="1" />


あとは呼び出す処理が呼ばれた際の中身を書いていきます。

 
 $(window).on('bottom', function() {
  var obj = $(this);
  // since this ajax call might take a while
  if (!obj.data("loading") && $("#hasNext").val() == 0) {
   obj.data("loading", true);
   $("#loading").show();
   $.ajax({
    url : "/listAjax/" + $("#page").val(),
    dataType : "html",
    success : function(data) {
     if (data == "") {
      $("#hasNext").val(1);
     } else {
      $("#listContainer").append(data);
     }
     var page = parseInt( $("#page").val() );
     $("#page").val(page + 1);
     // remove the loading text
     $("#loading").hide();
     // now that the ajax call is done, we can re-enable this
     obj.data("loading", false);
     $("#list"+page).preloader();
    },

    error : function(data) {
     console.log(data);
    }
   });
  }
 });


  1. 次に呼び出すページがあるようであればページ番号を渡してAjaxリクエスト
  2. レスポンスが空だったら処理終わりのフラグを立てて終了
  3. レスポンスがあったら帰ってきたレスポンスのhtmlをappendして表示
  4. ページ番号を1追加する
  5. ローディングを隠す
  6. 画像をかっこ良く表示させるpreloaderを呼ぶ

みたいなことをやっています。

2014年2月23日日曜日

PlayFrameworkで会員制ギャラリーサイトを作る習作:EBeanを使ってデータの取得を行う

さて、それではさっそくデータを取得してトップ画面に一覧を表示する機能を作っていきます。

プロジェクトの概要はこちら

今回の機能に関するIssueはこちらになります。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/issues/9

ロジック層

まずはデータを取得していく、MVCで言えばMのあたりから作っていきます。

modules/core/app/services/bases/SiteService.java
を作ります。

データの件数取得、データの一覧取得の条件は
getSiteCriteria
のメソッドにして共通の処理を呼ぶようにしています。

 public static PagingList<Site> getSiteCriteria() {
  return find.where().orderBy().desc("createDate")
    .findPagingList(ApplicationConfigUtils.MAX_PER_PAGE);
 }

 public static List<Site> getSiteResultList(Integer page) {
  PagingList<Site> pagingList = getSiteCriteria();
  Page<Site> currentPage = pagingList.getPage(page);
  return currentPage.getList();
 }

 public static Integer getSiteResultCount(Integer page) {
  PagingList<Site> pagingList = getSiteCriteria();
  return pagingList.getTotalPageCount();
 }


なかなかPlayFrameworkでページャーを使ってるサンプルがないのですが、このようにして呼ぶみたいです。

つぎにSiteServiceをextendsしたクラス
を作ります。
 
 public static List<SiteBean> getSiteBeanResultList(Integer page) {
  ArrayList<SiteBean> list = new ArrayList<SiteBean>();
  List<Site> resultList = getSiteResultList(page);
  for (Site site : resultList) {
   list.add(setSiteBean(site));
  }
  return list;
 }

SiteServiceはDBに直接操作を行うクラスという位置づけにしていて、
Controller側ではそのラッパーのSiteBeanServiceを呼ぶようにしています。
このクラスではDBからデータを取得する処理をSiteServiceから呼び出して、SiteBeanにセットする処理をしています。

こうすることで今後例えばキャッシュ機構を組み込む、などのようになった場合にDBアクセス層のSiteServiceはそのままで、SiteBeanServiceにキャッシュ機構を組み込めばいいようになります。

今の段階ではSiteBeanはSiteクラスをextendsしていますが、これはEBeanのModelではないため、多分extendsはやめると思います。。

JavaだとこういったModel,Bean系はsetter,getterを使うのが常ですが、Playはpublicにするのが流儀っぽいので、そういう感じにしています。

1ページに表示する件数については
modules/base/app/utils/base/ApplicationConfigUtils.java
に記述しています。こういうのは1つのサービス上統一するケースが多いと思うので、baseモジュールに書いてあります。
 
public static final int MAX_PER_PAGE = 10;

コントローラ層

 app/controllers/Application.java
のコントローラ側では
 
List resultList = SiteBeanService.getSiteBeanResultList(0);

のようにSiteBeanServiceを呼びます。
テンプレート側では
@(message: String, description: String, beanList: List[models.beans.SiteBean])

のようにしてリストを渡します。

 
<div class="container">
<div class="row">
 @if(beanList != null && beanList.size() > 0){
     @for(bean <- beanList){
    <div class="col-sm-6 col-md-4">
      <div class="thumbnail">
      <a href="@{bean.url}"><img title="@{bean.title}" src="@{bean.thumbUrl}" alt="@{bean.url}" /></a>
      </div>
    </div>
     }
 }
</div>
</div>

 でSiteBeanの一覧を表示します。
出来上がったのがこんなかんじになっています。


2014年2月21日金曜日

PlayFrameworkで会員制ギャラリーサイトを作る習作:EBeanを使用してModelの作成を行う

さてEBeanを使ってModelを作っていきます。
作成するModelの定義はこちらのIssueのとおり。


まずはModelを作成していきます。作るのはcoreのサブプロジェクト内。

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/f2f8ff770ea3b3ca15a04137a0d56fe269f6c962/modules/core/app/models/bases/Site.java

@Entity
public class Site extends Model {

 private static final long serialVersionUID = 3890695880010099962L;

 @Id
 public Long siteId;

 @Required
 @NotNull
 public String title;

 @Required
 @NotNull
 @Lob
 public String url;

 @CreatedTimestamp
 public Date createDate;

 @Version
 public Date updateDate;
}

個人的にはLazyLoadとかを信頼してないので、Model同士のひも付けは自前でする派です。

urlは255文字を超える場合もあるので(企業の採用ページだったら超えることもほぼ無いはずですが)、@Lobにしています。

ちなみに、NotNullのアノテーションですが、
libraryDependencies ++= Seq(
  // Select Play modules
  javaJdbc,  // Java database API
  javaEbean, // Java Ebean plugin
  //javaJpa,   // Java JPA plugin
  javaCore,  // The core Java API
  cache,
 "org.webjars" %% "webjars-play" % "2.2.0",
 "org.webjars" % "bootstrap" % "3.1.1",
   "org.webjars" % "font-awesome" % "4.0.3",
  "mysql" % "mysql-connector-java" % "5.1.29",
  "org.avaje.ebeanorm" % "avaje-ebeanorm-api" % "3.1.1")

のようにして呼ぶ必要があります。



2014年2月19日水曜日

PlayFrameworkで会員制ギャラリーサイトを作る習作:アプリケーションの雛形を準備する

さて、アプリケーションの作成に先立って、PlayFrameworkのアプリケーションの準備をしておきます。

  • Typesafe Activatorを元にプロジェクトを作成する
  • Bootstrapの3系を組み込む
  • Ebeanを組み込む
  • 各種設定ファイルを管理がしやすいように分割しておく
ところまでやったのがこのリビジョンです。(料理番組的・・・)

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/cbd6850947c7d31fc3d4cb9899a4ee197aeaf57f

今回のアプリケーションではユーザー側と管理者側とを同じ1台のサーバで処理する想定です。
この場合、データベースは一緒になりますが、ルーティング及びコントローラは別になるため、サブプロジェクトとして予め準備をしておきます。

このエントリーはこのチケットの解説です。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/issues/7

サブプロジェクトの作り方はこちらのエントリーを参照して下さい。
Play Frameworkでサブプロジェクトを使い倒す

このエントリーと同じ設計思想で

  • common:自作ライブラリ系
  • base:Controller共通処理系・Filter系
  • core:ORM・DB操作系
  • admin:管理画面

のサブプロジェクトを用意します。

common

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/common

どうやらコンパイルをすると自動的に

  • .classpath
  • .project

ファイルが生成される模様。多分あとで消す。
src/main/javaなどのフォルダも自動的に生成されていました。とりあえずGitで管理したいので、 .gitkeep を置いておきます。

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/common/src/main/java/components

にあるような、Javaで使いまわせるようなUtilityを配置します。

base

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/base

これはPlayのサブプロジェクトになります。
各ディレクトリの形式もPlayの形式に従っています。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/base/app/cache/base

にあるような、Playのapiを使用する共通処理を配置します。
わざわざcacheフォルダの中にサブプロジェクト名と同じサブフォルダを掘っているのは、後述のadminプロジェクトの構成と合わせるためこのようにしています。

  • Cache処理
  • Filter処理

などのように、Playのプロジェクトで共通して使えるような処理系を配置します。
これはPlay形式のサブプロジェクトになるので、build.sbtを配置しておきます。

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/master/modules/base/build.sbt

とりあえずnameをサブプロジェクト用に書き換えたものを置いてみました。

ちなみにPlay Framework2.2.xでcacheを使うときには
libraryDependencies ++= Seq(
  // Select Play modules
  javaJdbc,  // Java database API
  javaEbean, // Java Ebean plugin
  //javaJpa,   // Java JPA plugin
  javaCore,  // The core Java API
  cache,
 "org.webjars" %% "webjars-play" % "2.2.0",
 "org.webjars" % "bootstrap" % "3.1.1",
   "org.webjars" % "font-awesome" % "4.0.3",
  "mysql" % "mysql-connector-java" % "5.1.29")

のようにlibraryDependenciesにcacheを追加しておきます。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/master/build.sbt

core

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/core

ここにはフロントエンド側、管理画面側で共通で使えるDB操作系の処理を配置します。
model周りやmodelを操作するservice周り、modelのラッパー的に使用するbeansを置くことになると思います。

admin

お待たせしました、やっとそれっぽいサブプロジェクトの登場です。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/tree/master/modules/admin

ここでは管理画面の処理を起きます。
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/master/modules/admin/app/controllers/admin/ApplicationController.java

のような感じですね。個人的にControllerのクラス名にはXXXControllerとしたいのは僕だけでしょうか?
さて、ちょっとControllerのパッケージがフロントエンド側とかぶると、ルーティングとかがめんどくさくなるので、controllers/admin/ApplicationController.java みたいな感じの場所においています。viewも同様です。

ルーティングですが、
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/master/conf/routes

->  /admin admin.Routes

みたいな感じでサブプロジェクトのルーティングルールを呼びます。

https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/blob/master/modules/admin/conf/admin.routes

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

GET /index                  controllers.admin.ApplicationController.index()

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)
GET     /webjars/*file              controllers.WebJarAssets.at(file)

assets,webjarsについてはadminとフロントエンドと分ける方法が未だによくわかりません・・・・。

Play Framework 2.2.x では以前ブログに書いた2.1.x系とサブプロジェクトの作り方が変わっていたので大変でした。以上。


PlayFrameworkで会員制ギャラリーサイトを作る習作:アプリケーションの概要を決める

PlayFrameworkに付属のサンプルではあまり実際の業務レベルのものが無いため、実際の業務レベルに耐えうる会員制ギャラリーサイトを作っていきたいと思います。

プロジェクトの要件を決める(PTF)

まずはプロジェクトの要件を決めます。

企業の採用ページデザインを集めたギャラリーサイトの作成

CSSのギャラリーサイト、フラットデザインのギャラリーサイトなどの採用ページ版を作成する。


  • ユーザーはログインしてサイトを登録することが出来る。
  • 外部APIを利用してサイトのキャプチャを表示する。
  • 他のユーザーが投稿したサイトに対してコメントをつけたり、評価をしたりすることが出来る。
  • ログインしなくてもギャラリーの表示はできる。
  • 今どきっぽいデザインにする。
  • 同じサーバ上で管理画面を用意して不適切な投稿・コメントの削除、ユーザーの管理ができるようにする。

開発要件

実際の開発にあたっての要件です。


  • フレームワーク:Play Framework 2.2.1 for Java
  • サーバ:さくらのVPSを想定(協賛者募集中です。@aimluck_iwasaki まで)
  • ソースコード管理・チケット管理:Github
  • デザイン:Bootstrap
  • Jenkinsを使ってビルド・デプロイを自動化する
  • テストコードを書く!
  • メンテナンスをしやすいように可読性の高いコードにしておく










2014年2月18日火曜日

Play FrameworkにBootstrap3系を組み込む

Typesafe Activatorで作ったPlayFrameworkのアプリケーションでは初期の状態でBootstrapが組み込まれていました。 この設定はbuild.sbt
に記述されています。
libraryDependencies ++= Seq(
  // Select Play modules
  //jdbc,      // The JDBC connection pool and the play.api.db API
  //anorm,     // Scala RDBMS Library
  //javaJdbc,  // Java database API
  //javaEbean, // Java Ebean plugin
  //javaJpa,   // Java JPA plugin
  //filters,   // A set of built-in filters
  javaCore,  // The core Java API
  // WebJars pull in client-side web libraries
  "org.webjars" %% "webjars-play" % "2.2.0",
  "org.webjars" % "bootstrap" % "3.1.1"
  // Add your own project dependencies in the form:
  // "group" % "artifact" % "version"
)

ここのところのバージョンを変えることで、読み込むBootstrapのバージョンを変更することが可能です。
"org.webjars" % "bootstrap" % "3.1.1"
対応しているバージョンやライブラリは http://www.webjars.org/ から探します。






Play FrameworkにBootstrapのSassを組み込む

Play Frameworkの場合、バージョンによって手順がもろもろ異なるので注意が必要です。 

事前準備


まず事前準備としてsassをコンパイルできるように不本意ながらsassをインストールします。
sudo gem install sass sass -v Sass 3.2.14 (Media Mark)

Play Frameworkの設定


さて次にPlayFrameworkにSass組み込みの設定をします。 PlayFramework 2.2.x系の場合です。

  https://github.com/jlitola/play-sass

project/plugins.sbt

resolvers += "Sonatype OSS Releases" at "https://oss.sonatype.org/content/repositories/releases"
addSbtPlugin("net.litola" % "play-sass" % "0.3.0")

build.sbt

import net.litola.SassPlugin
play.Project.playScalaSettings ++ SassPlugin.sassSettings

Play 2.0,2.1系は他にも設定が必要なようです。詳しくは
https://github.com/jlitola/play-sass をご確認下さい。

なお
http://qiita.com/Liberty/items/51dd4c6113ffc52efd3b
も参考にさせていただきました。

Bootstrap Saasの読み込み


 最後にBootstrapのSassを組み込みます。
http://getbootstrap.com/getting-started/#download
からSassのファイルをダウンロードして解答します。
解答するとvendorフォルダが出来上がるので、vendor内のassetsフォルダをPlay Frameworkのassetsフォルダにコピーします。

最終的には
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole/commit/84150e65946ef30e0840867eccb67cdbeb111bcc
のようになります。





Typesafe Activatorで作ったapplicationをgithubにpushする方法

普段はGithub上でリポジトリを作ってpullしてローカルでもろもろのファイルを作るのですが、Typesafe Activatorはapplicationを作成する際にディレクトリの中にファイルが在ると、アプリケーションが作れないので先にローカルでアプリケーションを作成し、github上にpushする必要があります。

Github上でリポジトリを作る際には、全く空の状態にしたいので、「Initialize this repository with a README」にチェックを入れないようにします。

Githubで空の状態でリポジトリを作ると、実行すべきコマンドが表示されるので、それをベースにコマンドを実行します。
全部のファイルをaddしてコミットします。

cd /Users/myname/Documents/workspace/PlayFrameworkRecruitConsole
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole.git
git push -u origin master
GithubにPushします。
git remote add origin https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole.git
git push -u origin master
https://github.com/YoshiteruIwasaki/PlayFrameworkRecruitConsole
プロジェクトの準備が出来ました。
EclipseからGitのひも付けが出来るよう「チーム」→「プロジェクトの共用」を選んで「Git」→「プロジェクトの親フォルダー内のリポジトリーを使用または作成」にチェックを入れることでEclipseからGitのヒストリーなどが確認できるようになります。

2014年2月17日月曜日

Typesafe Activatorでapplicationを削除する方法


Typesafe Activatorでアプリケーションを作ってる時に、サンプルで作ったアプリケーションなどを削除したい場合があります。
アプリケーションを作成したディレクトリを削除しますが、なぜか一覧に残ってしまいます。


設定ファイルにアプリケーションの情報が残っているのでそれを削除します。
vim ~/.activator/1.0/config.json
{"applications":[]} 

のようにします。
http://stackoverflow.com/questions/19464093/remove-application-from-typesafe-activator

Typesafe Activator から Play Frameworkのプロジェクトを作成する

Play Frameworkのバージョンが挙がっているので、動作を試してみます。
どうやら2.2系からTypesafe Activator によるアプリケーションのセットアップが出来るようになったようです。
この辺よくわかってないので実際に手を動かして確認してみます。

http://www.playframework-ja.org/downloadから
Typesafe Activator1.0.13をダウンロードします。 

ダウンロードしたファイルを解凍して
/Users/myname/Documents/lib/activator-1.0.13
に展開をしてみました。(Macのパス)

ターミナルから以下を実行してみます。
/Users/myname/Documents/lib/activator-1.0.13/activator ui 
初回は依存関係のあるjarファイルがダウンロードされます。
しばらくするとブラウザが立ち上がります。

ベースとなるTemplateと
プロジェクトのName、Locationを選択してプロジェクトを作成します。



正直Templateはどれを選択していいかよくわからないので、「Hello Play Framework」を選んでおきました。他にも色いろあるようですが、これってユーザーが自由に作ったものもリストアップされてるんでしょうか?

上記のTemplateを選択するとScala版をベースに作成されるようです。
Javaベースで開発したい場合は以下を選びます。注意!

[basics] Hello Play Framework (Java Only)
Play Framework is the High Velocity Web Framework for Java and Scala. Play is based on a lightweight, stateless, web-friendly architecture. Built on Akka, Play provides predictable and minimal resource comsumption (CPU, memory, threads) for highly-scalable applications. This app will teach you how to start building Play 2.1 apps with Java.

完了すると格好いいコンパネっぽい画面が表示されました。


出来上がったProjectをEclipseにインポートする方法ですがこのコンパネから「Open project in Eclipse」を選択すると、Eclipseのプロジェクトファイルを生成してくれます。

その上で以下の手順でEclipseにインポートすることが可能です。

Now that you've generated your project files:
  1. Launch Eclipse and select Import... from the File menu.
  2. In the import dialog, choose Existing Projects Into Workspace and click Next.
  3. In the import dialog, browse to /Users/myname/Documents/workspace/PlayFrameworkAdminConsole. You should see your app's project(s) there.
  4. Select your project and click Finish.
If you need to (re)generate your project files, start over.
Hello Play Framework (Java Only)だとScalaプロジェクトだと判定されているのか、.classpathが正常に生成されないみたいです。。。

2014年2月10日月曜日

東京都知事選に見るツイートとの相関関係

今回の東京都知事選挙に向け、「2014年東京都知事選挙東京都知事選挙に関するツイートから本当の人気をランキング!」というサイトを立ち上げました。
http://tokyo.negaposia.com/
http://tokyo.negaposia.com/
このサイトでは

  • 各候補者名でTwitterを検索
  • 形態素解析を使ってつぶやきの内容を単語に分解
  • 単語ごとにネガポジ判定
  • ネガポジ判定を元に1日1回集計

を行って各候補者の人気をランキングしています。


こちらのランキングのソースは
https://github.com/YoshiteruIwasaki/NegativePositieAnalyzerForJa
で公開しています。

また、ネガポジ判定のロジックはrikyuを使用しています。
https://github.com/YoshiteruIwasaki/rikyu

ネガポジ判定ロジックとしてはyonagaもありますが、こちらはネガティブの割合のほうが重くなる傾向があるため今回は使用していません。


さて、今回当選をしたのは舛添要一氏でした。
舛添氏のランキングを見てみると最終日のランキングは最下位になっています。


また公示後のランキングについても見てみると、2月4−6日にかけては上位に食い込んできましたが、それ以外の期間はランキング下位が続いています。

舛添氏に関するツイートはネガティブな内容ポジティブな内容もどちらも多い、支持する人も多いけれど、反対する人も多い、といった傾向にあるようです。


途中まで、隠れた支持率の高い人を見出すため、その人に対するツイートに対するポジティブの割合をランキング上位に来るようにしていましたが、選挙は民主主義、数の理論のため、途中から純粋にポジティブなツイートからネガティブなツイートを引いた数、でランキングを出すようにしました。

今回の結果としては実際の結果とは外れた形になるので、精度を上げていきたいところです。やはりネットでつぶやく層と投票に行く層とは違うのでしょうか?
このロジックの今後の改善点として以下が挙げられます。


期間途中、ツイート数増加に耐えられず解析が間に合わない期間がありました。1候補者につき、1日3000から4000件ほどはつぶやかれているようです。

ツイート検索ロジックのリファクタリングが必要そうです(例えば今回「家入一真」氏は「家入 一真」で検索をかけましたが、「家入 かずま」と言った形でつぶやかれるケースも想定されます。)


形態素解析以外の重み付け手法の検討。今回は形態素解析でネガティブ・ポジティブを解析しましたが、あくまで単語ベースでの重み付けとなり、「この候補者マジでクソ。だが応援する」などの文章から判断することはできていないので、文章でその単語が出てくる場所(後半の方に重みをもたせる)、逆説のあとは重み付けを強くするなどの処理が必要かもしれません。(この辺りになってくると研究的側面が出てくるので、どなたか良いjarファイルをご存知であれば教えて下さい。)


最後に皆さん、投票には行きましょう!
以上。