Java Day Tokyo 2016に行ってきた

f:id:kitanow:20160524090845j:plain

5/24(火)に東京マリオットホテルで行われたJava Day Tokyo 2016に有休決めて行ってきたのでメモ。
あくまで自分用に書いているので箇条書きです。

Togetterのまとめもあります。


Innovate, Collaborate, with Java

  • 会場は20代が1/3、30代が1/3とのこと
  • 色々なところでJava使われてますよという話
  • JCP(Java Community Process)について
  • 開発者向けにJava Magazineというのを発行している
  • Javaが今後取り組んでいくのはセキュリティ、これはクラウドでの活用を見据えて
  • 起動速度やGCの改善を行っていく
  • Java 9
  • NetBeans
    • HTML/CSS/JavaScriptの開発に対応
    • 見た目が完全にIntelliJなのですが
    • Java開発者はJavaScriptのコードを書くことが多い
    • 変更した内容が即座にブラウザに反映される(まーIntelliJでもできますが。。。)
    • Jigsawを試すこともできる
  • Java EE
    • モノリスからマイクロサービスへ進化
      • 集中から分散
      • ステートフルからステートレス
      • オンプレミスからクラウド
      • Polyglot(Java以外の言語と組み合わせる)
      • チーム開発の変化(縦割りから小さな専門チームへ)
    • インフラのクラウド
      • コンテナの変化
      • IPがダイナミックに付与
      • イミュータブル
    • サービスがお互い隔離されている
      • マルチテナント
      • マイクロコンテナ
      • ドメインパーテーション
  • 感想
    • モジュラリティ(Jigsaw)とマイクロサービス推しまくり
    • マイクロサービスといえばSpring Bootなのだが、Java EE 8でマイクロサービスってどうなの?

損保ジャパン日本興亜JAVA戦略

Twitter上ではライブレビュー状態だったが、お堅い保険会社のメインフレームの刷新にしては攻めている方だと思う。やりたいかと言われるとそこは丁重にお断りさせていただきます。

Night Hacking

JJUGの活動紹介

内容としては5/21(土)に行われたJJUG CCC 2016 Springの基調講演の短縮版かな。

ドローンデモ

  • Oracle IoT Cloud Service
  • Secure IoT Gateway
  • SAM(Secure Access Module)
    • 重要データの管理・保護
    • データ暗号化
    • 認証機能
      • 操縦者・機器の承認
      • 指定日時・場所による運用管理
      • 認証側での停止制御
      • OSGiでアップデート

Papperデモ

  • Papperのカメラで写真を撮影してCloud Storageにアップロード
  • タブレットで撮った写真をCloud Storageにアップロードし、Papperが更新を通知
  • サーバ側はOracle Cloud Platform
  • クライアント側(画像ファイル管理コンソール)はOracle JETで実装

Introduction to MVC 1.0 (JSR 371)

  • Software Technical EvangelistのDavid Delabassee氏(@delabassee)
  • 最終日に空きが出たので登録したセッション
  • MVC1.0はアクションベースのMVC
    • JSRで標準化
    • JSRの参照実装にOzarkがある
  • MVCは新しいものではなく、25年以上使われている
    • Model, View, Controllerのコンポーネントにはそれぞれ役割が決まっている
    • Modelはインタフェースの状態をキープするための中間的な状態を保持するところ
    • Viewはユーザが操作するためのボタン、フィールドなど
    • Controllerはリクエストをユーザから受け取り、ビジネスロジックを実行する
  • MVC
  • Java EE 7の標準はJSF(コンポーネントベース)
  • MVC 1.0はアクションベースMVCの選択肢を提供する
  • リファレンス実装はOzarkというOSSがある
    • Model
      • CDI, Bean Validation, JPA
      • 推奨するのはCDIベース
    • View
      • Facelets, JSP
      • View engineにはsupportsとprocessViewという2つのメソッドが用意されており、他のViewもサポートしている
      • 例外処理はJAX-RSのものをそのまま使用している(Exception mapping providers)
    • Controller
  • アクションベースMVCは悪くはない
    • 今あるものを活用できる
    • JAX-RSが分かっていれば難しくない
    • もっと知りたければOzarkを見る
  • MVC Specification
  • The Aquarium Blog

Java EE 7アプリケーションとWebセキュリティ

  • @skrbさんのJigsawはすごい混みそうだったのでこちらにした(まーこっちも満席ですけど)
  • うらがみさん(@backpaper0)と言えばJAX-RSDomaだけど今回はセキュリティネタ
  • イントラのシステムはセキュリティが甘くても致命傷にはなりにくい
    • でも、仕様が変わって公開することもある
    • ならば、最初からセキュアなコードを書いておけば要件が変わっても問題ない
    • 但し、そこに掛けるコストは無視できない
    • 対策することでコードリーディングのノイズとなることも
  • フレームワークが対応していれば実装もなくノイズもない
  • ビュー・コントローラで対応する場合は個別による実装が発生
  • その他
    • ビジネスロジックで対応しなければいけないもの
    • その場合でもInterfaceなどで切り分けるようにする
  • 対策の基準
  • XSS
    • 反射型、蓄積型、DOM型がある
    • ここでは反射型と蓄積型についての対策
    • JSPの対応
      • jstlのc:outタグを使うことで対応できるが見づらい
      • 関数を自作してf:hの関数として呼び出せるようにするとEL式だけで表せる(hというメソッドを作り、fでsetAttribute)
      • カスタム関数はTLDファイル(XML)で定義を作成する必要があり、気軽にパッケージ変更できない
    • Faceletsの対応
      • デフォルトでエスケープされる
      • そのまま出す場合はescape="false"と指定する
    • メソッドの呼び出し漏れをチェック
      • JSPの場合はHTML出力に使われているEL式を洗い出す必要があり、面倒
      • Faceletsはそこまでしなくてよく、escape="false"と指定している箇所だけチェックすればよい
  • CSRF
    • ユーザのセッションが生成されたタイミングで乱数(トークン)を生成し、hiddenに埋め込む
    • リクエスト時に一緒にポストして、サーバ側で正しいかをチェックする
    • JSPの対応
      • 自力で実装
    • Facelets
      • javax.faces.viewstateがCSRFトークンとして機能する
      • ページを開くたびにvalueが変わる
      • 但し、これはステートフルの場合で、ステートレスビューの場合はvalueが固定になるのでCSRF対策にならない
      • ステートレスビューでは表示用のビューと処理実行用のビューを分ける
      • faces-config.xmlに記載したURLパターンに一致するビューを保護するようにする
  • SQLインジェクション
    • JPAのJPQL
    • em.createqueryではプレースホルダーを使ってパラメータをバインドする
    • @namedQueryは定数しか渡せず、動的に文字列連結できないのでこちらがおすすめ
      • Criteria APIを使ってJavaでクエリを組み立てることもできるが、学習コストは低くない
  • セッション管理の不備
    • ログインしたタイミングでセッションIDをリフレッシュ
    • Java EEのログイン認証
      • Servlet APIのform認証
      • Glassfishは認証成功後にセッションIDがリフレッシュされるがJDBCレルムの設定が必要
      • HttpServletRequest.changeSessionId()を呼び出す
      • URLにセッションIDを埋め込まない
      • Cookieに格納し、Secure属性を付ける
  • ファイル操作・パス名
    • 未チェックのパラメータ(パス)でファイル操作をする
    • ファイル操作を行う前に想定したパスかチェックする必要がある
    • 漏れ検出
      • ファイル操作はSEのAPIなので漏れ検出は難しい
      • 自前のAPIでラップし、ファイルのAPIを直接使用していないかをチェックする
      • インターフェースを用意するとテストコードが書きやすい
      • この対策は保険的対策で根本的対策としてはファイル名を直接指定する実装を避ける
      • 根本的対策を施す場合でも自前のAPIでラップする
  • クリックジャンキング
    • X-Frame-Optionsレスポンスヘッダを付けるだけ
    • 但し、frameやiframeが無効になるためAjaxで使われていれば、そちらも無効になる
    • 制限をDENYではなく、SAMEORIGINにすれば生成元が同じiframeは読み込める
  • HTTPヘッダインジェクション
    • Java EEだと自力でHTTPレスポンスを書き出すことが無いので対策不要
  • メールヘッダインジェクション
    • 対策もHTTPヘッダインジェクションと同様だが、意図しないヘッダを書き出すことはできる?
    • ヘッダにセットしない、セット前にチェックする
  • OSコマンドインジェクション
    • 外部プロセスを起動することがないので省略
  • バッファオーバーフロー
    • 直接メモリを操作しないので省略
  • アクセス制御
    • アプリケーションによるところなので省略
  • その他
    • X-Content-Type-Options: nosniff
      • Content-typeが設定されていないリソースに対して自動で判断する(IEの機能)
      • このsniffを無効にする
    • Content-Security-Policy
      • 最強のXSS対策レスポンスヘッダ
      • この対策でDOM型のXSSにも対応できる
      • 任意のHTMLを書き出す脆弱性があったとしてもJavaScriptが動かない
      • style-srcやimg-srcで個別に制約を設定できる
  • まとめ
    • Java EEで対応しているものもあれば、自分で対応するものもある
    • 仕組みを理解しないとなぜそれで防げるのか分からない
    • 資料を読んで普段からセキュアなコードを書く癖をつける
  • 感想
    • 話としてはオーソドックスなセキュリティ対策
      • こういうのを設計段階で決めておくと、リリース直前でセキュリティ対策が漏れていて炎上するみたいなことはなくなると思う
    • SQLインジェクションDomaに触れなかったのはOracleへの配慮かな?

コンテナとJavaOracle JETによるアプリ開発ハッカソン

  • Oracle Cloud Platform
  • Application Container Cloud
    • Dockerベースの軽量プラットフォーム
    • 多様な開発言語に対応
    • ロードバランサを内包、無停止で拡張/縮退可能
    • 特徴として組み込みJFR(Java Flight Recorder)による稼働記録、Java SEのupdateを長期間提供
    • デプロイはアプリケーションのjarとメタデータファイル(json)をzipファイルに固めたものを、アップロードするだけ
  • Oracle JET
  • デモアプリ
    • サーバサイド
      • 全てJava製のもので構成
      • REST APIコンテナとしてSpring Bootを使用し、組み込み型のTomcatで動かす
      • O/RマッパーはEclipseLink(JPAの実装の1つ)
      • RDBはDerby(内部でDBを持たせている)
      • レスポンスはJSON
    • クライアントサイド
      • Oracle JETを使用
      • Model/View/ViewModelパターンに基づいて実装
  • ハンズオン
    • デモアプリをローカルの環境で動かす
    • 編集したデモアプリをApplication Container Cloud上でデプロイ
  • ハッカソン
    • デモアプリをもとにアプリを開発
    • 発表者には粗品(Javaグッズ)をプレゼント

パネル・ディスカッション - Java Day Night Session with NightHacking Tour

  • 日本のJavaコミュニティはとても熱気に溢れているが、質問が少ない
  • Java Championはコミュニティへの貢献を評価されたリーダ
    • 日本人は一人(@skrbさん)しかいない、アジアでも少ない、英語で発信していないから
    • @skrbさんはLooking Glassで英語の発表をやっていたから推薦されたとのこと
  • Java Championになるには
    • 技術的なリーダであること
    • コミュニティのために教育をしていること
    • コミュニティメンバとして啓蒙活動をしていること
    • オラクルから独立していること
      • オラクルに入ったので私はJava Championでなくなった(@steveonjava)
    • Coolなアプリケーションを開発している
    • 他のJava Championからの推薦
  • JCPは今後、企業以外での参加も可能になるとのこと
  • #てらだよしおがんばれ
    • マイクロソフトJavaエバンジェリスト
    • 前職ではJava EEなど製品ベースの仕事をしていたが、現職はより上のレイヤーで見るようになった
    • Java Championに相当するものとしてマイクロソフトにはMVPがあり、MVPが主体となって勉強会などを行う
    • ぼくは元々、こっち側の人間です
    • Javaコミュニティについて
      • もっとJavaに興味を持っている人を参加しやすくする
      • あるいはエンタープライズ向け、こども向け、などに特化したコミュニティ
      • それをJJUGが担うのがよいのかは分からない
      • JJUGの幹事は多忙なので現状の運営だけでも大変
  • その後はStephen Chin氏によるRaspberry Piのプレゼン

その他

  • 展示コーナーにNightHacking Interviewのブースがあり、色々な人がインタビューを受けていました
  • 皆さん英語で受け答えしていて素晴らしい

全体の感想

  • 初のJava Day Tokyoとても楽しめた
    • Twitterではスーツ率高いとあったけどOracle Open Worldに比べたら全然少ない(Oracle Open Worldはスーツの人しかいない)
  • 1日中セッション聴くのは疲れるので初めてハンズオンに参加してみる
    • 参加者が少ないのでゆったり座れた
    • ハンズオンの会場は机、電源、Wifiあり:-)
    • 後半はハッカソンだったが全く作れずに終了orz
    • @cero_tさんや@kawashimaさんの発表も聴きたかったけど
  • 満席セッションでも入れるみたいなので事前予約の意味があまりないのでは
  • 昼は11:30-13:00だったのでゆっくり出来た
    • 昼食は少し歩いて北品川商店街の「プサン」という韓国料理店
  • JAVAおじさん問題
    • 最前列で寝ているおじさんがいるというので、それは発表者に失礼だなと
    • 参加料を取るようにすれば来なくなると思う
    • 業務の一環(研修とか)で来ている場合、有料だと会社に書類(申請書や報告書)を提出しないといけなくなるはずで、そうなれば面倒で来ないだろう
    • 本当に来たいと思う奴は有給休暇取ってでも来るし、自腹でも来る
  • Java Day TokyoとJJUG CCC(あくまで個人的な意見です)
    • Java Day TokyoはJavaの最新動向をキャッチアップするところ
    • JJUG CCCはJavaフレームワーク、活用事例などをキャッチアップするところ
      • セッションのバラエティはCCC
      • 但し、Java Day Tokyoにもスポンサーセッションというのが設けられているので事例もある
    • Java Day Tokyoはformal、JJUG CCCはinformal(発表者の立場という意味で)
      • 会社として発表するのか、個人として発表するのか
      • CCCの方がお祭り感(土曜だからなのかもしれないけど)があるし、純粋に楽しむならCCCがいいかもしれない
    • ちなみに私はCCCに参加していませんが。。
      • 前参加した時に、お目当てのセッションが立ち見状態なので心が折れた
      • 何処が満席セッションなのか分かりづらい、分かっていれば第2候補とか第3候補を考えられる
      • 土曜潰してまで疲弊したくないという極めて老害な理由
      • CCCはでかくなり過ぎた感が否めない
      • 昔の寂れた感じの方がよかったと言ったら怒られそうだが、その場の気分で好きなセッションを気軽に聴きに行くという感じではない

圧倒的初心者がDroidKaigiに参加した

ダメ元で抽選枠に応募したら当選したので行ってきました。
プロジェクトでAndroid/iOSのネイティブアプリを開発することになりAndroid開発の知見を得たかったのでとてもよかった。
Androidは4年程前に簡単なRSSリーダを作ってから触っていない圧倒的初心者。(開発環境に心が折れてドロップアウトした勢)

発表資料まとめ

発表資料やTogetterは以下にまとまっている。


聴講したセッションのメモ

午前のセッションがないのはお察しください。

初学者に嬉しいAndroid開発環境(あとMVCとか)(@hkusu_)

今どきのAndroid開発でどんなものを使われているかを知りたかったのでとても参考になる発表だった。

  • やっぱり今だとIDEAndroid Studio
  • エミュレータはGenymotion
  • ViewのマッピングにはButter Knifeというのが便利らしい
  • イベント通知はEventBusを使うのがよい
  • HTTPクライアントだとRetrofitとかOkHttp
  • WebAPIで結果を受ける場合にJSONならGsonとか、画像ならPicassoを使う
  • ORMはActiveAndroidとかRealmを使う
  • MVCはSIでもおなじみなので同じように捉えることができるのがよい
    • MVP(Model-View-Presenter)のほうがよいという話もある
  • 画面遷移はActivityをIntentで切り替えるのではなくFragmentを切り替える
  • アプリケーションにActivityは1つ、画面1つに対してFragmentは1つにしてFragment on Fragmentは避ける
  • Fragmentの行数が増えたらControllerやModelに分割する
  • はじめはドットインストールで勉強して慣れてきたらmixiの資料を読むとよいらしい
  • 端末の向きを固定にした方がよいらしい
  • 書籍の中では「AndroidエンジニアのためのモダンJava」が気になった

AndroidエンジニアのためのモダンJava

AndroidエンジニアのためのモダンJava

MVC構成のサンプルがGitHubに置いてある。

Androidを学ぶ君へ。生き抜くためのナレッジ共有(@operandoOS)

Android開発におけるLifeHackのような話。
Android開発にかぎった話ではないがなかなか実践できていないと感じた。

  • Android開発するなら端末を買うというのは今も同じらしい
  • コードを書かないと書いたものがクソコードだと気付かない
  • コマンドを使ってActivityの状態を調べるとかアプリを操作できるのは覚えておくと便利そう
  • テストコードがない場合はまずユニットテストからはじめる(JUnit+Mockito)
  • プルリクエストにチェックリストを付けることでチェック漏れを防ぐのはいいね*1

スライドにあるリンクはGitHubにまとまっている。

新言語KotlinでAndroidプログラミング(@ngsw_taro)

Kotlinと言えば@ngsw_taro氏だが発表を聞くのは今回がはじめて。
KotlinだとJavaよりもすっきり書けるという印象を受けた。

  • クラスの説明にあるプロパティがよく分からなかったがJavaでフィールドにアクセスするさいに書くgetter/setterをいい感じで扱ってくれるものらしい
  • Java8で追加されたlambdaが使えるとか高階関数によるコレクション操作ができるとか
  • インライン関数は高階関数を呼び出すさいのコストを低減できる
  • 拡張関数で既存クラスに独自のメソッドを追加することができる
  • JavaのOptional型はnullを直接代入できてしまうがKotlinはnullを許容するかしないかを変数の宣言で制御できるようになっている
  • Android Studioと開発元が同じなのでAndroid Studioとの相性は抜群によさそう
    • メニューからJavaのコードをKotlinに変換できる

フォロー記事があがっている。

ARTのメモリ管理(@haru067)

この発表までランタイムが変更されたことを知らなかった。
ARTのGCまわりについてDalvik VMとの違いが分かりやすく(よい意味でざっくりと)まとまっていた。
特にLargeObjectSpace(LOS)の説明がすばらしい。

つかえるGradleプロジェクトの作り方(@zaki50)

Androidのビルドツールと言えばGradleかなーと思い、Gradleの話を聞きに行く。
設定ファイル(build.gradle)のTipsについての紹介。
Groovyで設定を書けるのがよい。

テンプレートをGitHubに公開している。
その他の記述は「Android実践プログラム」の5章が詳しい。

アプリを公開する前に、最低限知っておきたいセキュリティ事項(@taro_gaku)

セキュリティについてあまり知らなかったのでためになった。

Android Security  安全なアプリケーションを作成するために

Android Security  安全なアプリケーションを作成するために

アプリビジネスで転ばないためのスマートフォンプライバシーの基礎知識 (Next Publishing)

アプリビジネスで転ばないためのスマートフォンプライバシーの基礎知識 (Next Publishing)

マテリアルデザインを用いたデザインリニューアル(@ninjinkun, @yuki930)

ここまでで事例の話を聞けていなかったのでFablicの人の話を聞く。

FrilのAndroid版リニューアルにともないマテリアルデザイン対応をしたという話。

マテリアルデザインガイドラインに沿ってナビゲーションドロワーを付けたが既存ユーザの使い勝手が悪くなったという話はいかにもUXっぽい。

  • マテリアルデザインを理解する上でキーとなる4つのポイント
  • Androidの標準に合わせたら既存ユーザの使い勝手を悪くしてしまった
    • お知らせを見るのに既存よりも1タップ余計にかかる
    • ドロワーを表示するとバッチ(新着通知)が見えなくなる
    • ユーザの動線はタイムラインを見てお知らせをチェックする
    • @yuki930「やっぱりボタンは表示する必要がある」
    • @ninjinkun「ボタンとバッチは作るのがめんどう」
  • UIのパーツはGoogleが提供している
  • アイコンを外部フォントにしているところはおもしろいなと思った
    • TextViewは外部フォントに対応していないのでCalligraphyでTextViewを拡張している
  • 実装はRxJavaでPromiseを書いているところがいいなと思った
  • Scroll to Full Screenは今ならSupport LibraryでできるけどAndroid-ObservablScrollViewの方がもっとよいらしい
  • ActivityやFragmentの継承を使わないのはへぇーという感じ
    • 差分の見通しが悪くなるのは分からないでもない

感想

開発まわりは色々と便利になっているなーと感じた。

机があるのはありがたい。
隣と間隔が空いているのでゆったりと聴講できた。

聴講したセッションはハズレなしでどれも満足。(TLを見ると裏のセッションも盛況だったのでどちらを聴講しても満足できたはず)

Android開発のモチベーションがあがったイベントだった。

4Uをクローリングして画像リンクを抽出する

このエントリはクローラー/スクレイピング Advent Calendar 2014 - Qiitaの21日目になります。

4Uという美女画像を投稿してみんなで共有するソーシャルブックマークサービスをクローリング/スクレイピングしてみたいと思います。

4U

4Uが公開されたのは2008年なのでWebサービスとしては老舗です。
今年の2月にリニューアルがあり、ページ構造が変更されています。
リニューアル前のページ構造に対応したものは誰かが作っていますが、リニューアル後のページ構造に対応したものはなさそうなので作ってみました。

4Uのページ構成

いわゆる一覧ページ(小さい画像が並んだページ)と詳細ページ(大きい画像があるページ)で構成されています。
ほしいのは大きい画像なので以下のようにクローリング/スクレイピングします。

  1. 一覧ページから詳細ページへのリンクを抽出する
  2. 詳細ページから画像のURLを抽出する
  3. 一覧ページでページングできるところまでクローリングする

作ったもの

crawler4u.py

GitHubに置いてあります。

言語はPython2.7、HTMLパーサはBeautiful Soupを使っています。
引数に人名と出力先のパスを渡すと、詳細ページのURL、詳細ページにある画像のURL、引用元のURLをCSVで出力します。
ちなみにWindowsでしか試してないのでMacLinuxで動くかは不明です。

以下、ざっくりとした解説です。

詳細ページのリンクを抽出

詳細ページのパスはimage/xxxなのでaタグのhrefがimage/で始まるものを抽出します。
詳細ページのリンクが見つからない場合は処理を終了します。

詳細ページから画像のURLを抽出する

画像URLはimgタグのaltに人名があるので引数の人名と一致していればsrcの値を抽出します。

GitHubのソースでは引用元のURLも抽出していますが、引用元のURLは<td class="t-left">の直下にあるaタグを抽出します。
Beautiful SoupだとjQueryセレクタのようにsoup.select("td.t-left a")と書けます。

ページングできるところまで一覧ページ(list.php)をクローリング

一覧ページは13件ずつ表示されることを考慮します。
GETパラメータのlimがそのページの起点(例えばlim=13なら14~26件を表示)になるのでlimを13ずつ増やしながらクローリングすると全てのURLを抽出できます。

ここまで美女画像がぜんぜん出てきていないので、このプログラムを使って集めたURLから美女画像をGetした結果をのせておきます。
吉木りさ」で抽出した結果から得た画像をダウンロードしています。*1
4UだとGoogle画像検索のように関係ない画像が混ざらないのがよいです。


本当は引用元の画像の方がサイズが大きいので引用元から画像を抽出したかったけど簡単ではないので保留しました。*2

*1:2014/6のデータなので件数が現在より少ない

*2:引用元が画像の直リンクでないとか、Tumblrのリブログで実体がないとか、JavaScriptのページだとか

第3回Webスクレイピング勉強会@東京(最終回)に参加しました

参加したのでメモ。
ちなみに今回が最終回で4回目の予定はないとのこと。
メモは自習用に書いているので発表資料に沿っていないものもあります。

発表資料はconnpassのページに全てあがっています。

togetterもあります。

クローリングしにくいものに挑戦(@lumin)

@luminさんの資料は後半ほとんど非公開になっている。
闇実装なので仕方がないところもありますが、資料を見てブログ(復習)を書こうと思っていたので当てが外れました。。

  • wgetはクローラで最も基本となるツールcurl再帰で使えないのでクローラとは呼べない、UAをブラウザにするとか、Cookieに対応するとかはクローラ作りでは常套手段
  • クローリングしにくいのはHttpsのようなProxy、WebSocket(最近少し下火)、SPDYはGoogleの開発した次世代のHTTPプロトコル
  • 特定されないようにしたい、匿名クローリングするにはTorを使う
  • クローリングしにくいページ
    • JavaScriptの動的コンテンツはページが読み込まれないと情報が取得できないので、ヘッドレスブラウザやブラウザでクローリングを行う、ブラウザはFirefoxがおすすめ
      • CasperJS
    • ガラケーのサイトはキャリアのIPアドレスに制限されているものがある
    • スマホサイトはUAJavaScriptで取得していたり、縦横表示の切り替え(Orientation)で判定しているためUAを偽造するだけではうまくいかない
    • 課金ダウンロードサイトはダウンロードするまで待たされるので、それが嫌なら課金してしまう
  • 日本と外国からではインターネットの見え方が異なる
    • 海外のVPSクラウドを借りてクローリングする
    • 通信料課金があるので注意が必要
    • RTTは重要でRTTが悪いと使いものにならない
  • P2PクローラでWinnyやShare、BitCoinなどののクローリングを行っている
  • Flashのスクレイビングは逆コンパイルで行う、ゲームのチートを取得したりする
  • データの保管はどうやっているのかという質問
    • MySQLに入れるとかKVSに入れるとか色々やっているが、KVSは大量データに向いていない、TBオーダーになると厳しい

ソーシャルスクレイビング(仮)(@YuzoAkakura)

@nezuqさん曰く、これまでの勉強会では技術がメインで事例についての発表がなかった。
最近、データジャーナリズムというのが注目されており、データジャーナリズムの第一人者である@YuzoAkakuraさんに発表をお願いしたとのこと。

  • データジャーナリズムとは「データからニュースを発見し、わかりやすく伝える手段」
  • New York Times
    • 全米の水質に関する2009年の調査報道
    • 水質データを地図にマッピングすることで、汚染水を垂れ流していた企業、施設を特定
      • これまでの報道は記事を書いて終わりだったので伝わりずらい
      • 地図上に表現されることで住んでいる地域がどうなのか身近な問題として捉えやすくなる
  • データジャーナリズムが注目されたのはWikiLeaksが注目された時期と重なる
  • データジャーナリズムのリソースはソーシャルメディア、オープンデータ(政府、自治体、企業)、センサーデータなどの多種多様かつ膨大なデータであり、日々生み出され続けている
  • データジャーナリズムはニュースの表現方法、発見方法、制作プロセスに革新を起こしている
    • ニュースの表現方法はこれまでテキスト中心であったが地図や動画、アニメーションなどの多様な表現を組み合わされるようになった
    • ニュース発見方法は取材対象として「データ」がより重視されるようになった
    • ニュースの制作プロセスでは制作過程の分業が浸透してきた
      • ProPublicaやICIJなどの報道団体がある
  • データジャーナリズムのポイントはデータを探すこと
  • ソーシャル・スクレイピング=社会との関わりを持ったWebスクレイピング
  • Journalism Innovation Awardを企画している
  • データジャーナリズムは技術者が不足しているので興味がある方は試してほしい

LT

AWSを利用してスクレイピングの悩みを解決するチップス(@dkfj)

Rubyによるクローラー開発技法」の著者である@dkfjさんの発表。
書籍でいうと「6-4 クラウドを活用する」に書かれている内容です。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

じっくりと読めていませんが@luminさんの発表にあったJavaScriptのページのスクレイビングについての解説もあり、Webデータを取得したい人にとってはとても参考になります。

  • データ収集の課題
    • クローリングに時間が掛かる
      • 収集先が膨大、収集データが大きい
    • IPアドレス制限
      • 単位時間あたりで既定の回数を超えるとブロックされる
      • IPアドレスをトリガーにされる(Google BAN)
      • 会社のプロキシサーバをBANされると会社全体に影響が出てしまう
    • データの保存方法
      • 収集したデータを長時間保存したい
  • AWS(EC2, S3, SQS)で解決できる
    • EC2を並べて稼働
    • EC2の処理結果をS3に集約
    • SQSでジョブ制御
  • 巡回先サイトに配慮する
    • 巡回する時間間隔を空ける(1秒ルール)
    • 同一サイトを対象にする場合は多重度をあげない
      • GoogleAmazonなら問題にはならないけど中小のシステムだと1秒あたり20~30件ほどしか処理できないこともある
    • Robots.txtに従う

私が開発しているhappyou.infoについて(@shogookamoto)

次回があれば肝となる抽出手法の発表を聞きたい内容。
学術研究では半構造データのマイニング、繰り返し構造のマイニングという分野かと思われます。
なんでもRSSを開発した東工大 奥村研が国内では第一人者ですが、なんでもRSSは10年ぐらい前のツールなので最新の研究動向はどうかなと思います。

リサーチ向け・ブラウザだけでスクレイピング(@hirosuke_asano)

実践Excelスクレイピング(@h_sinohara)

  • Perlスクレイピングはめんどい
  • ExcelでWebスクレイピング
    • Webクエリという機能がExcel2003からある
      • URLを指定してデータを選択して取り込むことができる
      • Webページが更新された場合に再取得することが可能
    • Excel2013からは取得データの可視化もできる
      • Power Viewのマップ

その他(@nezuq)

感想

東京スクラッパーの勉強会は3回目ですが、今回もよい勉強になりました。
アンケートではPythonが人気のようで、自分もPythonユーザとして是非ともPythonのクローラ本がほしいなと思いました。

ゆるふわ非構造#1に参加しました

久しぶりに勉強会に参加したのでメモ。
東京スクラッパーというコミュニティの勉強会でデータ前処理を扱います。
メモは自習用に書いているので発表資料に沿っていないものもあります。

発表資料はconnpassのページに全てあがっています。

テキスト前処理のための形態素解析入門 ゆるふわ編 (@yamano357)

テキスト前処理のための形態素解析

形態素解析は文法や辞書、コーパスから学習したスコアをもとに文を形態素という意味を持つ最小単位に分解すること。

形態素解析
  • 辞書引きしてすべてのパターンの形態素を出力する
    • 辞書検索のためのデータ構造にはトライ木を使用する
    • 出力結果はラティスという形態素をノードとしてその間をリンクでつなげたグラフで表現される
  • コスト最小法により最適解を発見する
    • 隣接コスト(連接コスト)と生起コスト(単語コスト)が最小になる解を求める
      • 隣接コストは形態素同士のつながりやすさ、生起コストは形態素の出現しやすさを数値にしたもの
    • 動的計画法の一種であるビタビ(Viterbi)アルゴリズムを使用する
  • コスト推定
日本語の形態素解析

素性抽出

素性抽出はテキストの特徴を数値にしたもの、機械学習に適用しやすいようにベクトルや行列の形式であらわす。

  • Bag of Words
    • 文書に含まれる単語の頻度で表現する
  • 言語データは単語を特徴次元とすると疎なベクトル(ほとんどの要素が0)になる
    • 全ての発生しうる単語のうち、使われる単語はごく一部
  • 疎なベクトルはHashMap(KeyとValueのペア)のようなデータ構造で表現する

CaboChaで始める係り受け解析 (@nezuq)

  • CaboChaはSupport Vector Machinesに基づいた日本語係り受け解析器
  • Ubuntu14.04 + Python3の環境でCabochaを使う
    • インストールするさいはconfigureのオプションで--with-charset=utf8を付ける
    • Python3で使用するにはPythonバインディングのソースを修正しないとエラーになる

RDF/OWLの概要とOSS実装、及び活用イメージについて~非構造データの構造化ゴールとしてのLinkedData~ (@masayuki_isobe14)

LinkedData

  • 非構造データと構造化データの中間に位置する
    • 一部をLinkedOpenDataとして公開することや社内向けにはLinkedCloseDataとしてデータを蓄積するという活用ができる

LinkedDataを支える実装技術

  • RDF(Resource Description Format)
    • リソースを記述するフォーマットで有向グラフのノードとエッジに型と名前が付いたようなもの
      • ノードとノードをエッジでつないだものはRDFトリプルと呼ばれる
      • ノードとエッジはURIとして記述する
  • 定義済みの用語
  • RDFでデータを記述すると実体とメタ情報、メタ情報のメタ情報といった情報表現が可能となる
  • RDFS
  • OWL
    • RDFSのクラスとプロパティの機能を拡張してクラスの集合演算やプロパティの値制約を記述できる
  • RDFXMLで表記できるがN-Triples, Notation3, Turtleといった簡易表記方法がある
  • SPARQL(RDFクエリ言語)
    • RDF文書からRDFトリプルを検索/挿入/書き換えするクエリ言語
  • SWRL(セマンティックWebルール言語)
    • サブルーチンのようにクエリを組み合わせる使い方ができる

RDF/OWLのOSS実装

LT

LTはPrologとfluentdの話。
内容はゆるふわな感じで理解しました。

感想

初級者向けの勉強会なので自然言語処理機械学習の専門知識がなくても参加しやすいと感じました。
勉強会の目的としては以前あったさくさくテキストマイニングに近いかもしれません。

プログラミング生放送勉強会 第17回@品川 #pronama に参加しました。

マイクロソフト@品川で行われたプログラミング生放送勉強会に参加しました。

プロ生はあまり知らない言語とか技術を勉強できるところがおもしろいなと思います。
今回はVisual Studio 2012で使えるC++11やlinq.jsの発表がおもしろく、早くVisual Studio 2012いれろという感じですね。

午前はプログラミングシンポジウムに行っていたので、40分ほど遅れての参加。
そのため、はじめの2つは聞けてないので省略します。

linq.js ver.3 and JavaScript in Visual Studio 2012 neueccさん(@neuecc)

今回、協賛しているgloopsのエンジニアneueccさんのlinq.jsの発表。
ソーシャルゲームの会社でもVisual StudioとかSQL Serverとか使うんですね。

JS and Collection Library

  • コレクションは配列のようにデータを入れて、ループでまわして使うもの。
    • C#ならforeachとかでぐるぐるまわす。
  • コレクション処理:要素の値を変形する、集計する、フィルタする。
    • ループでまわすのはやぼったい。さくっと書けるようにしたい。
  • JavaScriptにはprototype.jsがありましたね。
    • prototype.jsRubyゆずりの強力なコレクション処理があった。(けど死んだ)
  • jQueryはmapとfilterぐらいしかない。
  • EcmaScript5
    • ちょっと追加されたぐらいで、まだまだ足らない。
    • 互換性がー、IE6がー
  • コレクション処理のライブラリ

LINQ

linq.js

  • JavaScriptでLINQ to Objectsを実現したLINQ好きのLINQ好きによる万人のためのライブラリ。
  • お試しで書ける。
  • ver.3ではUpperCamelCaseをlowerCamelCaseに。Visual Studio 2012によく対応していて、IntelliSenseが強化されてがしがし補完をきかせて書ける。QUnitに連携できる。

JavaScriptエディタとしてのVisual Studio

  • Visual Studio Express 2012 for Web
    • IntelliSense(入力補完)
      • ドット打てば完ぺきにチェーン補完。
      • 無名メソッド内部の引数まで驚異的に追随して補完。
      • ツールチップヘルプ+オーバーロードも完ぺき、オプション引数も[]囲みで表現。
    • jQueryもIntelliSenseに対応。(日本語版Visual Studioに同梱されているのは日本語のヘルプ)
    • Page Inspector
      • Visual Studio統合のページプレビューでdocument.writeでコンソールアプリケーションぽく使えたりQUnitのテスト結果画面を表示したりも便利。

Announce

  • linq.jsはLINQのあつかえるデータソースのうちIEnumerable(LINQ to Objects)だけでした。
  • 今回あらたにLINQ to XML for JavaScriptができました。
    • C#でもXML操作に革命を起こしたLINQ to XMLをJSに。
      • DOMは使いづらいのでLINQ to XML for JavaScriptで快適にXML操作ができるように。
      • linq.js ver.3の上に構築される。
  • JavaScriptXMLはいる?
    • JavaScriptといえばJSON
    • JavaScriptの用途は広がっているので、XMLをあつかうこともあるはず。
      • Node.js, Office 2013, WinRT(Windows8), etc...
      • XMLは今もたくさん存在している。

いいパブッ!! はじめてのEPUB3 プロ生出張版 ろすさん(@lost_and_found)

電書ちゃんねる のろすさんの発表。
HTML5とか勉強会」で発表した資料をもとにプロ生版を作ろうかと思ったけど、少しやさしめの内容にしましたとのこと。

まず電子出版を3つに分類して整理しています。

  • Reading System: 電子書籍を閲覧するSW/HW。ReaderやViewerともいわれる。
  • Platform: 出版社が電子書籍を販売するためのインフラ。
  • Format: 電子書籍データ形式
  • フォーマットにはEPUBやPDFのようなオープンのものと、AmazonのAZWやKF8のような企業固有のものがある。

EPUB

  • EPUBのロゴェ
  • IDPF(国際電子出版フォーラム)が開発・管理をしている。
  • EPUB is the distribution and interchange format for digital publications based on web standards
  • アメリカの出版社はKindle電子書籍を出版するときEPUBで入稿する。Kindle StoreではAZWに変換して、DRMをかけて配信する。
    • BtoBで使われるのがInterchange、BtoCで使われるのがDistribution。
    • EPUBは配信フォーマットで使われることもあるのでBtoB、BtoCともに使われる。
  • HTML5, CSS, JavaScriptなどWebの規格を取り入れている。
  • Reflow(リフロー): EPUBの特徴のひとつでスクリーン幅や文字の大きさによって折りかえしを制御する。
  • EPUB3(EPUB 3.0)はEPUBの3回目の改訂バージョンです。
  • EPUB3の作りかた
    • XHTML5で書いたコンテンツ文書を作成する。
    • metadata, manifestを記述したパッケージ文書を作成する。
    • すべてのファイルをzipでまとめる。

EPUB3はなにが新しいの?

  • Multimedia
    • Audio/Video
  • Scripting
  • Media Overlay
    • コンテンツのテキストに音声を同期して読みあげるための仕様。
    • Content DocumentとAudio clip(MP3)をコンテンツのどの部分を、オーディオファイルのどのタイミング・どの範囲を再生するかを.smil(XML)で指定することで音声読みあげが同期できる。
  • Globalization
    • 日本語テキストに対応。
      • Ruby(ルビ), Vertical Writing(縦書き), Tate-chu-yoko(縦中横)
      • ちなみに縦書きにしてるのは日本の他、台湾とモンゴルだけ。
  • HTML5、CSS3により表現の幅が広がった。

進化をつづけるEPUB3

Fixed layout

漫画のようなレイアウトが固定されたコンテンツだとリフローと相性が悪かった。
固定レイアウトをあつかう EPUB 3 Fixed-Layout Documents という文書が2012年に公開された。

Adaptive layout

リフローを高度に制御して複雑なレイアウトを実現する。

Hybrid layout

固定レイアウトとリフローを切り替える。

EPUB電子書籍には課題があるが、確実に状況はよくなっているとのこと。

パッと見でわかるC++11 επιστημηさん(@epitwit)

Wikipediaにも記載されているεπιστημη(えぴすてーめー)さんの発表。
C++はほとんど使わないのですが、発表はとてもおもしろかったです。

Visual Studio (VC++) と C++11

  • Visual Stidio 2012に対応したC++11の話。
    • C++11のなかでも言語仕様、ライブラリ拡張によって読みやすくなった、書きやすくなったものを紹介します。
    • 今回紹介するものはVisual Studio 2012で動作するものです。(Visual Studio 2010で動くものもある)
  • Visual Studio 2012では言語レベルの強化とライブラリ追加でC++11に迫っている。
    • でも、フルセットではない。フルセットを試すならGNU, GCC, LLVM Clang(Xcode)で。

array

  • 固定長配列のためのクラスarrayが追加されてます。
  • arrayではbegin(), end(), size()などの関数が使える。

begin(), end()

  • 先頭/末尾の要素が取れる関数がコンテナと配列で同じように書ける。

auto

  • 型推論してくれるのでvector::iterator...と書かなくてよい。

range-based for

  • 範囲を指定するfor
    • C#のforeachのあたるもの。Javaのrange-based forにちかいかも。
  • 関数begin(), end()が使えるコンテナであればrange-based forが使えます。
  • foreachではできない参照ができます。auto&とすれば型推論して参照ができる。

lambda式

  • 関数オブジェクトをよびだしたその場で書いてしまう。
  • Visual Studio 2012ではstateless-lambda(キャプチャをしないlambda)が関数ポインタに暗黙変換できる。

スレッドライブラリ

  • Windows APIだとスレッド本体と着火がわのあいだにwrapperが必要となる。
  • C++11のスレッドライブラリを使うと簡単に書ける。
    • threadのコンストラクタに関数オブジェクト([&](int x, int y) {result = plus_int(x,y);})と引数を書くだけ。join()で終わるのを待つ。
  • async/future
    • asyncは引数を非同期で実行し、結果をfutureで受ける。
    • get()でasyncが終わるのを待つ。
  • mutex:排他制御
  • atomic
    • mutexよりも短い操作のロック。

Bingなんてもういらいない!質問応答システム入門 torotokiさん(@torotoki)

最後は自然言語処理機械学習を勉強している高1のtorotokiさん。
さくさくテキストマイニング形態素解析の発表を聞いたことがありますが、今回も難しい話です。

発表を聞いて思いだしたのは、マイクロソフトでもダイアログナビという質問応答システムがありました。

質問応答システム

  • 質問応答システムは自然言語をもとに回答してくれるシステム。
    • 今年の東京の人口は?→13,227,730人
    • 既存の質問応答システムにはIBM WatsonやSiriがある。

質問システムの構成

  • 質問解析:質問タイプの特定
    • 固有表現抽出/SVM
  • 文書検索:質問文からクエリを作成
    • TF-IDF/Okapi BM25
  • 回答候補抽出:取得した文章から回答候補を抽出
    • 質問タイプをもとに回答候補上位N件
  • 回答選択:確率の高いものを回答
    • SVM+ランキング

質問解析

  • 質問文と回答候補のタイプを照合し同じだったら、最終的な候補になる。
  • 質問分ですでに解答のタイプが決まっているものとする。
  • 回答候補のタイプ推定は固有表現抽出をつかう。
    • 人名、地名、組織名などの単語を認識する。
    • IREXの基準なら係り受け解析器のCabochaに付属している。
  • 質問分のタイプ推定は自前で用意。
    • 質問文-質問タイプのペアで機械学習をする。

文書検索

  • 質問文から検索クエリをつくるのは自立語(品詞が助詞、助動詞以外)をフィルタする。
    • 「空は何色ですか?」→「空、何、色」となるので簡単な例だとそれなりにうまくいきそう。
  • 変換したクエリから文書を検索するのはTF-IDFとOkapi BM25をつかう。
    • TF-IDFは単語の頻度と単語が含まれる文書頻度の逆数。
    • Okapi BM25はTF-IDFを改良したもの。

回答候補抽出

  • クエリにたいする文書のランキングが取得できれば文書を上位N件にしぼる。
  • N件の文書に固有表現抽出を使い、固有表現と質問文の質問タイプを照合する。
  • タイプが同じならば固有表現がすべて回答候補となる。

回答選択

  • SVMを使用して回答を機械学習する。
    • 質問文-回答-候補文書(ソース)のペアで学習する。
    • 回答候補のスコアを算出し、もっともスコアが高いものを回答とする。

データ

  • 質問解析(質問文-質問タイプ)のデータは日本語だとない。
  • 回答選択(質問文-回答-根拠文)のデータは日本語だとNTCIR-6 QACのデータが公開されている。
    • ただし毎日新聞のデータを買わないといけないので大学とか研究機関でないと無理かも。

さいごに、Bingはやっぱり必要ということで。

参考文献の「質問応答システム」は買うかな。

質問応答システム (自然言語処理シリーズ2)

質問応答システム (自然言語処理シリーズ2)

  • 作者: 磯崎秀樹,東中竜一郎,永田昌明,加藤恒昭,奥村学
  • 出版社/メーカー: コロナ社
  • 発売日: 2009/07/28
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 29回
  • この商品を含むブログ (3件) を見る


力尽きたので、LTは省略します。

GraphDB勉強会に行ってきました

フューチャーアーキテクトで行われたGraphDB勉強会に参加しました。

The Definition of GraphDB (@doryokujin)

Graph Type for GraphDB

Graphとは?
  • NodeとEdge
    • NodeとNodeのあいだにはEdgeがあり、EdgeにはNodeとNodeの関係(Relationship)をもっている。
  • Undirected Graph, Directed Graph
  • Mixied Graph
    • Undirected Graph + Directed Graph
  • Multigraph
    • NodeとNodeに複数のEdgeがある、Edgeがループしている
  • システムとしてあつかいやすくするため、矢印のないものは両方向に矢印をもつ2本のEdgeとし、1本の矢印は片方の方向しかもたないものとしましょう。
  • Sigle-Relational Graph
    • NodeとEdgeの関係はひとつだけ
  • Multi-Relational Graph
    • NodeとEdgeの関係は複数ある
  • Property Graph
    • Multi-relational Graphを拡張しNodeとEdgeにプロパティ(keyとvalue)をもたせる。
    • GraphDBであつかうグラフはほぼProperty Graph

Graph Traversals

Traversal
  • GraphDBのクエリはあるNodeやEdgeを中心に隣接をたどっていく。
  • RDBやNoSQLでもグラフ構造のデータをもたせることはできる。
    • クエリはあるNodeやEdgeの集合から条件に満たすNodeやEdgeを見つける。
  • Traversalは指定の条件をもとに、幅優先または深さ優先で探索する。
  • NodeからNodeの移動は2Step(NodeからEdge(1step)、EdgeからNode(1step))
  • あるNodeを基準に近傍のNodeやEdgeをもってくるモデルがGraphDBに適している。
  • あるプロパティの条件を満たすNodeを検索するようなモデルは適してない。
    • RDBやNoSQLのほうがいい(かも)。

Index Free Adjacency

  • GraphDBはNodeからNodeに移動するのにIndex-Treeを見ません。
    • Mini-IndexというそれぞれのNodeが接続の情報をもっている。
      • Lookupのコストが小さい、グラフが大きくなってもほぼコンスタント。
    • ただしNodeとEdgeのプロパティはIndex-Treeを作ります。
      • はじめのNodeを見つけるのにIndex-Treeを使う。

An Introduction to Neo4j (@doryokujin)

Introduction

  • なんでJava?
    • EnterPriseむけだから
  • #neo4jをつけてTweetすればNeo4jのなかの人がRetweetしてくれます。

Code Example

Cypher

  • TraversalをSQLのように記述できる。

Other Features

  • High Availability
    • レプリケーションはEnterprise版のみ対応。
    • シャーディングは対応していない。(1Server-1Graph)
  • Backup
    • FullBackup、Incremental BackupはEnterprise版のみ対応。
    • Export/Importならオフラインにしてディレクトリコピーでできる。(コールドバックアップ)
  • Tools

An Introduction to Tinkerpop (@doryokujin)

  • TinkerpopはGraphDBを統一してあつかうライブラリを提供するプロジェクト。

Blueprints

  • GraphDBのJDBC
  • TinkerGraph
    • ライトウェイトなIn-MemoryのGraphDB

reXster

  • RESTfulに操作できるAPI
    • ランク・スコア計算もできる
    • ブラウザで操作できるThe Dog House

Gremlin

  • Groovyで記述されたTraversal Language
  • Code Example
    • v.outE: Node vから外にむかって出ているEdgeを取りだす。
    • v.outE.inV: Node vから外にむかって出ているEdgeとつながるNodeを取りだす。
      • またはv.outと書ける。
    • filter: 条件を満たすNodeとEdgeを取りだす。
    • paths: 起点から終点までのパスを取りだす。
    • loop: Traversのくりかえしをイテレーションしながら取りだす。

Pipes

Enjoy Graph DB! (@bibrost)

GraphDBにアクセスする方法

  1. ネイティブドライバで直接接続する
  2. DB固有のHTTPインターフェイス
  3. TinkerPop/Gremlinを経由
  4. Tinkerpop/Rexster経由(HTTP)
  • どれも微妙。。。
    • ディープに使い切るなら心中する覚悟で(1)をScala/Groovy/Clojureを使う。(Javaはなかったことに)
    • GraphDBをそれなりに使いこなしたいなら(3)をScala/Groovy/Clojureを使う。
    • とりあえずお試ししたいなら(4)を自分の慣れた言語から使う。
  • 今回はTinkerpop/Rexter経由(HTTP)でGraphDBをPythonで使ってみる。
    • ORMぽいライブラリがあったので試してみる。

Enjoy!への道

  • JVM環境を入れておく。
  • Rexterのパッケージをダウンロードする。
    • 0.6があるけどbulbsは0.5用なので0.5をダウンロードしましょう。
    • Rexterを起動する。
      • rexster-start (sh|bat)
  • Bulbsをインストールする。
    • easy_install bulbs
  • あとはEnjoy!

ここで問題

  • ユーザ[u]のまだ友だちになっていない友だちの友だちを取りだすクエリ。
    • Except Pattern
    • g.v(u).ouot.aggregate(x).out.except(x)で書ける。
      • aggregate(x): 友だちの集合をxにいれる。
      • except(x): xを除く集合(差集合)を取りだす。
    • じっさいは自分が友だちに含まれているので集合に自分を含めるとか、uniqueObjectで同じ人を排除する。
    • コードはGitHubにあげてある。

告知

  • 次回はミクシィでやる(予定)

参考

時間があれば読みたい。