読者です 読者をやめる 読者になる 読者になる

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使えばいいと思う
    • 少し補足(もしくはメモの取り忘れかもしれないが)
      • このようなセキュリティ方針は設計段階で決めるもの
      • 後回しにしてリリース直前のセキュリティ診断でNGが出たら、はい炎上けってーい
      • フレームワーク選定の段階で、フレームワークで吸収しているのはどこか、個別で実装しないといけないのがどこか、そのスコープを予めフィックスしておかないと実装に掛かる工数がぶれる
      • 対応方法まで落とし込んで単体開発に入れば、単体テストでチェックができる
      • 単体テストでNGになれば、それはただの単体バグとして対処できる
      • そう、セキュリティ対策漏れはただの単体バグであり、それを後回しにするというのは単体バグを残したままリリースを迎えるのと同じ
      • アプリ基盤担当者とかアーキテクトとか名乗っている方々は当然そういうことは分かっていないといけない

コンテナと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はでかくなり過ぎた感が否めない
      • 昔の寂れた感じの方がよかったと言ったら怒られそうだが、その場の気分で好きなセッションを気軽に聴きに行くという感じではない

今さらだけど、例のSIer退職エントリについて


出典*1

少し前ですが、以下のSIerに関する増田が盛大にバズっていたので、自分が思ったことを書き留めておく。以下、あくまで個人の意見・見解であり、所属する会社とは一切関係ございません。

関連するエントリもいくつかあるが、目に付いたものを以下にピックアップしておく。

毎度のことではあるが、SIerの退職エントリは何でこういうダメなところをあげるものしか出てこないのか。何故、ドロップアウトした後にここがダメだったとか言い出すのか。はっきり言って、関係者に仕返し目的で情報晒しているとしか思えないのだが。20万人月案件は守秘義務あるのでって、そこ気にするなら書かなくていいし、社名晒すのがOKっていう基準も分からない。現職の社員ならNGなのでは。この増田に便乗して、5年目社員やら10年目社員やら何かわらわら出てきたけど、その辺の言及をしてもらいたかったですね。

そんなに書きたければ「Vorkers」にでも書いてください。あそこは記事を見る手続きが面倒なので大事にはならないだろう。それにあれを見るのは他の会社の評価を見たいというより、自分の会社の評価を見ることの方が需要が多い気がする。実際、私も登録したら自分の会社のクチコミを見て「あるある」って思いました。はい、話が脱線しましたよ。

こんなことをつらつら書いていると、この社畜老害スタティックおじさんマジうぜええええって思うだろう。まーどう思われてもいいので、せいぜい頑張ってくれ。あ、ちなみに私はプログラマー定年にはなっていない程度のSIerですよ。(今年でなりますが)
さて、本文を何回か読み返して、そもそもこの話は富士通関係ないですね。結局のところ、希望通りの職種に就けないジョブアンマッチなんて富士通だけの話ではなくて何処にでも存在する事案です。自分が数年経験した狭い価値観だけで、SIerはダメだと嘆いて転職する人の一人でしかないので文の冒頭に「あくまで個人の意見です。」と断り書きを入れてもらいたいですね。(はい、これもあくまで個人の意見に過ぎません)
あと、上でも紹介した「Vorkers」に「富士通」で検索したら退職理由に同じようなこと書いている人がいるからさ、ネタとして投稿するならオリジナリティ出しましょうか。

真面目な話、新卒の配属枠ってどこどこの部は何人という定数が予め決まっているもの。その自動(出身大学とか、成績とか?)で決まる椅子取りゲームに負けたというだけの話。初めの山奥の工場行きを断って代わりに行けるところは、人手不足の炎上プロジェクトぐらいしかなかったのだろう。

ちなみに、自分が新人の時に配属されたのはカスタマーサポートっていうコールセンターみたいなところだ。自分も増田と同じで情報系の院卒だから、バリバリ開発をやるつもりでいたし、会社を選んだのもいわゆるITゼネコンのような多重請負だけでなく、自社開発にも力を入れていたから。それなのにメインの業務と言えば電話とメールでお客さんの質問に回答するっていう、そもそもエンジニアリングなのかこれ?って思うような仕事。だから自分も椅子取りゲームに負けた人間だということ。当然、配属が決まった当日に上司に文句を言ったのを覚えている。それでも、辞めなかったのは同じ部内に新技術(と言ってもWeb系では流行が過ぎた技術ではあるが)に取り組み、プロジェクトに適用するというやりがいを感じさせてくれるチームがあるから。そこで働いてつまらないと思ったら辞めるつもりだった。
そのためには、まずそのチームに入らなければならないが、ただ「仕事がつまらない」と言っているだけでは変わることはできない。だからシャドーワークとしてセミナーや勉強会に参加するとか、普段の仕事では使わないが、PHPでWebアプリを作るとかAndroidアプリを作るとかして、技術に関心があること、自ら研鑽していることをしれっとアピールした。それが功を奏したのか分からないが部の改編に乗じて、そのチームに移ることができたので今はそれ程不満はない。PHPAndroidはその後の仕事で使う機会があったので、その経験も無駄ではなかった。それでも移るまで入社から5年掛かっているので、これに耐えられるかどうかだろう。
特に保守プロジェクトを担当すると移るのが難しくなる。お客さんとの信頼関係が求められる保守プロジェクトでは、付き合いの長い担当者の方がお客さんにとっても安心して仕事を任せることができるため、担当が変わるタイミングが難しくなる。

庇護じゃなくて擁護になるが、カスタマサポートが何の役にも立たなかったかと言えば嘘である。顧客とのコミュニケーションに関しては内製開発しかしてこなかった人たちよりも分かっていると思う。その現場経験は本を読んでも得られないものだから、その点については感謝している。おかげであまりやりたくない顧客対応業務にアサインされることもあるが。

オチはない。20万人月案件はこの話の本質からすれば割とどうでもいいので言及するつもりはない。誤解しないでもらいたいのが、退職が悪いなんて書いていない。キャリアパスから外れた時の選択肢は、その会社を辞めるか、留まるかだろう。その選択肢に正解も不正解もない。自分の場合は、希望する仕事が近くにあったので、現職に留まり社内で移動する方が、転職して希望する仕事に就ける確率より高いと判断しただけのこと。富士通ぐらいの規模であれば、やりたい仕事は何処かにはあるのかもしれないが、そこに行くまでのプロセスがどの程度掛かるかを考えての判断であれば退職は間違った選択ではないだろう。

冒頭でも書いた通り、このエントリはあくまで個人的見解に基づくものであり所属する会社とは一切関係ありません。(つーか、そもそもお前誰よ?って)

追記

さて、もはや熱が冷めてて今さら感あるけどアップするかと思っていたら、こんなエントリがバズっていて、もうここまできたらこれも言及せずにはいられないのだが。

後発の増田くん、どちらも増田だから意識高い系増田くんとでもしておくか、の本文を何回か読みましたが、何が言いたいのかよく分かりません。そう感じるのは、何がやりたくて富士通に入社したのか書かれていないからだと思う。その起点が抜け落ちているため、長々と書かれている文章も胡散臭くなる。胡散臭いと感じてしまうと、富士通からWebベンチャーの転職も一貫性がないなとか粗ばかり見えてくる。むしろ、富士通から地方公務員の方が一貫性あるのでは。
とりあえず大手受けて、富士通に内定貰ったから入社したけど、仕事つまらなかったので転職しましたの方が納得できる。後半に、転職先で苦労するのは転職のツメが甘いと書かれていて、その持論については概ね同意する。ただ、私から言わせれば就職のツメが甘いけど。あと、富士通の内情なんてはっきり言ってどうでもいいですね。程度の差こそあれ、SIerの内情なんて何処でも同じだと思っている。SIerの問題点は先人たちが既に書いているのでggrksで終わりでよい。

知りたいのは以下に関する増田くんの「思慮」なのだが。回りくどいので書籍の引用とかもいりません。

筆者に言わせれば、それは転職のツメが甘いのだ。

現職のどこに不満を持っていて、そのうち、どこが改善の余地があり、妥協するべきであり、次の職で改善を期待するのか、についての思慮が浅い。

強いて言えば、これは現職でも同じことを考えるべきだと思う。転職は手段であり目的ではないでしょう。

圧倒的初心者が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開発のモチベーションがあがったイベントだった。

2015年とこれから

昨年、ざっくりした目標を書いていたので、今年も書いておく。

2014年のふりかえり

仕事

開発ばかりやっていた1年だった。

Webシステムの設計からリリースまで担当。
Play Frameworkを使った。コンパイルが遅いことを除けば悪くない。
Playに同梱されているFluentLeniumというテスティングフレームワークjQueryっぽく書けるのがよい。

RESTなWebシステムの設計も少し分かるようになった。

シャドーワークのようなもの

普段の仕事とは別に自分だけのプロジェクトを持つのは大事な時間。

昨年はOpenCVをメインでやっていた。

Bijostagramというオサレなツールがどうやっているのか気になっていたので、ちょっと調べてみた。

Bijostagramが話題になったのは2011年、当時はPythonOpenCVを使うためのよい文献がなかった。
今だと実践 コンピュータビジョンがよくまとまっている。
やったこととしては6章「画像のクラスタリング」、7章「画像検索」、8章「画像認識」あたり。

英語は無料で読めるらしい。

何となく分かってきたが、もう少し整理が必要。

昨年ブログで書いたMahoutやMongoDBはできていない。
そのへんは趣味でやっていることなのでモチベーションを優先している。

ふりかえるとコードを書く時間があまり確保できなかった。だらだら残って退社に失敗するのを何とかしたい。

2015年

今年で34になるので正直焦る気持ちはある。

転職も考えないことはないが働いている環境には満足している。今よりよくなる要素は少ないと感じている。
そういう考え方は老害なのかもしれないが、何も考えずに目先のことに飛びつくほど若くもない。
と言いつつも、SIで何時まで自分のやりたいことができるのかという不安もある。

ワークとしてはRESTと機械学習を中心に学習するつもりでいる。

RESTとかWeb APIとか

理解を深めるためWebを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)を読む。
その次はWeb API: The Good Partsを読む。

機械学習まわり

実践 機械学習システムを読む。
あとは入門 ソーシャルデータ 第2版 ―ソーシャルウェブのデータマイニングを読んで、前に作ったTwitterクローラを改良したい。

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の話。
内容はゆるふわな感じで理解しました。

感想

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