Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

プレゼン、ボランティアコーチします!

勉強会でスピーカーをやりたいけど、プレゼンが初めて、苦手という方に無償でコーチします!資料レビューや録画リハへアドバイスします。Twitter@jyukutyoまでメンションでもDMでも。

私はデブサミやJJUG CCCなど200人規模で登壇経験ありです。海外での登壇も短いながらあり。デブサミ2017では公募スピーカー1位でした!

デブサミ2012に参加してきた

今年も行って来た、デブサミ。今回で10周年。

僕は4回目だ。

関西から毎度すべて自費で参加してる。


デブサミに参加して、改めてわかった。

デブサミでスピーカーをやってる人たちに、

エンジニアリングを楽しんでいない人なんていない!

ってこと。


自分が描くエンジニア像に近づいているのか?

楽しんでいるのか?

そういうメッセージも多かった。

それがNoなら、ジョブズが言うように何かを変えなくてはいけないってことなんだろう。

【16-C-2】大規模化するピグライフを支えるインフラ 〜MongoDBとChefについて〜


アメーバのピグライフ

360万のユーザがいて、20万ユーザが接続してくる。

アメーバピグとは異なるアーキテクチャ。Flashは両方に共通する。

アプリケーションサーバはnode.jsで構築し、

DBにMongoDBを使用している。

WebSocketも使用している。

staticなサーバはnginxで構築。

課題は、Replica Setsとシャーディングだった。

Mongoを使用することで、やり取りするデータのフォーマットをJSONで統一できた。

変更に強いスキーマレスなデータ構造にできた。

シャーディング。

mongocにチャンクを振り分ける。

アプリはmongocを見る。

振り分けはMongoの設定のみで実現できる。


Replica Sets。

死活監視。

最小単位は3台。

実運用では?

Mongoが140台。

mongosにスケーラビリティはない。

mongosはapサーバに同居させる。

サーバへの負荷は少ない。

mongocもスケーラビリティはない。

ただし、リソースは豊富に用意する。

2フェーズコミット。

mongod。i/o。

定期的に書き出す。

書き込みはグローバルロック。

複数コアは効率がよくない。

データはメモリにキャッシュする。

Mongoはバージョン2.0でindexが高速化された。

バックアップ。

fsyncコマンドで停止し、dumpを取得する。

グローバルロックが問題。

将来実装されるコレクションロックで解決される予定。

チャンク。

auto balanceではデータアクセス頻度でシャーディングされない。

manual balaceする。

ただし、全mongosの再起動が必要となる。

バージョン2.0ではauto balanceがよくなっている。

バグはバージョンアップで解決する。


chefはRubyのサーバ構築自動化ツール。

37signals、EngineYardとかが使っている。

内部DSLをRubyで記述し、

プラットフォームの差異を吸収する。

nodeとは管理対象のサーバ。

rule管理対象のグルーピング。

cookbookは設定。

attributes、recipes、templates。

dry-runできない。

chefの運用。

pxe + kickstart + chef。

script resourceは使わない。

何度でも実行されるため。

environmentはproduction,staging,developmentがある。

【16-D-3】ヤフーのHTML5対応

yahooってどうなの?

月間500億pv、2.5億ユニークブラウザ。

1日16pv、150サービスある。

oauth,openid,yui,yahooラボ。

HTML5は手段。

以下を使っている。
offline and storage
device access
multimedia
3D graphics & effects

スマホ先行。

ブラウザが限定される。

下位互換が不要である。

HTML5を利用できる。

500億のうち8割がデスクトップ。

残りはスマホ。

スマホの伸び率は、2009年10月から伸び率は2,500%。

3倍速い。

JSの読み込みを分割。

cssスプライト。

Base64

画像をBase64化してストレージに格納。

情報の削減。


29*29pxブロックが最小値。

見た目よりも大きなタッチ領域を確保。

localstorage。

CSSでは、transformとgradient。

yui app frameworkにはhistory apiがある。

geo location。

緯度経度から住所に変換。


CSS transform。
gpuを使う。

CSS gradient。

ボタンは画像ではない。

これらに対応しない機種への対応が必要。

スニペットジェネレーター。

web view。

web-clip-icon。

HTML5の課題。

ブラウザの独自実装。

セキュリティ。

ローカルストレージ。

クライアント処理の増加。

リソース。

エンジニアとデザイナー不足している。

【16-A-4】Effective Smartphone UX at GREE

スマホのホーム画面では、ななめに指を動かす。

スマホのメール受信画面は使いやすいか?

タッチパネルからアプリケーションが反応する時間が重要。

すぐに応答を返す。

たとえばハイライトを出す。

slideする、アニメーションする。

指からタッチパネルの距離。

ボタンの配置。

スマホは移動しながら操作する。

間違えてもすぐやり直せるようにする。

greeでは、ガラケーからの移植が多い。

スマホらしいUI リスト、ボタン。

push、連絡帳、カメラなどネイティブも使う。


onclick delay。

jsのonclickに300msの遅延。

ダブルクリックを待つため。

有名な問題。

ontouchstartとontouchendを代わりに使う。

でも単純な話ではない。

timeline context。

戻るでページの先頭に戻ってしまう。

ajaxベースのアプリでの問題。

offline。

iphoneアプリpathでは、フライトモードでも写真を投稿できる。
onlineになると、自動でアップロードする。

ソーシャルゲームでは、継続してもらうことが重要。

cross platform vs os culture。

facebookはどのプラットフォームでもアプリの挙動が同じ。

evernoteはiosとandroidでまったく異なる。

ユーザーの文脈を壊さないことが大事。

【16-A-5】node.jsテクノロジースタック for ソーシャルアプリケーション

node.js。

nodeはp*言語よりも速い。

v8 JITコンパイル時。

イベント駆動のノンブロッキングIO。

スケーラブルなネットワークアプリを構築するためのプラットフォーム。

node.jsモジュールのリポジトリ

c10k対応。

ネイティブアプリ並のパフォーマンスを発揮。

CPUパワーを要求するタスクにはあまり向かない。

サービス-ユーザ間のインタラクション表現に向く。

greeでは、strict mode。

クライアントとサーバでコードを共有。

browserify。

コールバックのネストが深くなってしまう。

seqを用いる。

long-stack-trace。

デバッグ情報を出力。

greeはgithubエンタープライズ。

モバイルではブラウザの機能サポートが良好。

websocket + node.js = socket.io。

websocketがない場合、ajaxで代用となる。

ただし、パフォーマンスが悪い。

独自実装する。

global対応。

redis。

pubsubバックエンドで水平スケーリング。

【16-A-6】いまどきのi18nのはなし

i18n

l10n

nfc/nfd/nfkc/nfkd。

絵文字。

ライブラリのデファクトスタンダード

icu/cldr。

rfc 5646。

bcp 47。

言語タグ。例、eg.zh-Hans-CH。

語順を考慮する必要がある。

数字フォーマットのロケール

日付フォーマット。

言語により表示幅は変わる。

画像ボタンの文字を切り替える。これはやめたい。

JavaScirptの文字列を多言語化する。

ユーザがブラウザの言語切り替えをしたら?

Bi-Di。アラビア文字

メニューポップアップなども逆に出さなければならない。

ソートや通貨。

各種フォーマット、複数形。

timezone。

決め打ちしていくしかない。

how to i18n

message formatはicu

uft-8。

MySQL utf8mb4 not utf8。

timezoneはutcがおすすめ。

MySQLならDateよりDatetime。

JSで調整ならGoogle Closureにライブラリがある。

Feature Flag。

IP Geolocation。

legacyの場合、message formatterで置き換える。

コメントの日本語は無視する。

サーバーサイドはエンコーディングフィルタを適用。

RDBMS

ujis(eucjp)。encodingをalterする。

80%カバーすればとりあえずよい。

世界の半分はカバーしてる。

とりあえず2言語!

【17-B-1】差別化で未来を生き抜くエンジニアの7つの秘訣

Twitter4j。

新日鉄ソリューションズ、BEA、fast search & transfer、Red Hatと転職。

きっかけ。

タイミング?キャリアビジョン?

10年前に今の流行はあったか。

逆に10年後はどうか。

テクノロジの先を見通すのは難しい。

いつやめるか、やめるべきかどうか。

自分を差別化できるかを考える。

いつやめるかはネガティブ。

会社が嫌とか。

学べるか、将来役立つか。

楽しいか。

普通に稼げるか。


情報発信して情報収集する。

教えたがりを利用する。

反応がある。

インタレストグラフ。

問題解決。

楽をするためならどんな苦労でもする。

閉鎖空間での貢献は避ける。

スケールしないから。

オープンな世界で自己顕示。

よりスケールすることで差別化できる。

差別化が大事。

JavaCOBOL 2.0。

日本語は無難な言語ではない。

【17-B-2】JavaOne Tokyo と Java の今後について

伝説の謝罪会見とは今年は違う!

JSR-337。

2013 summer。

hotrockit、type annotation、date。

rhino -> nashorn。

js engine in jdk

rhinoに置き換わる。

invoke dynamic。

ecmascript 262。

debug & node.js support。

パフォーマンス向上。

Lambda。

さくらばさんの記事参照。

マルチコアcpuを使い切ることは難しい。

マルチスレッドでは対応できない。

マルチコアに対応するためにラムダが導入される。

jigsaw。

クラスパスの排除。

自動ダウンロード、インストール。

ネイティブパッケージ。

増分ダウンロード。

高速クラスロード。

起動時、実行時のパフォーマンス向上。

javame以外のjavaseサブセット。

javafx3.0 in java se8。

swing死亡。

jdkは2年周期で提供。

javaee

エンタープライズにおいて、日本は世界から大きく離されている。

4000万ダウンロード(glassfish含む)。

3月9日くらいにjavaee書籍が出る。

javaee7。

paasにフォーカス。

json api

elasticity伸縮性。

閾値を超えると自己調整する。

トリガー(cpuとか日付)を指定して閾値を設定する。

glassfish v4.0。

paasコンソール。

paas環境へデプロイ。

paas環境の監視。

マルチテナンシー。

jpa2.1では、インスタンスレベル、スキーマレベル、レコードレベルでのマルチテナンシー。

eclipselink。

@Multitenant、@Tenantdisriminatorcolumnがすでにある。

persintence.xmlにテナントidを指定する。

javaee7は今年の年末。

JavaOneにはusから本場dukeが来る。

alex buckley、テクノロジーキーノート。

richard bair。

jasper potts。

david holmes。

charile hunt。

rob benson、twitter所属。

【17-E-3】オンライン機械学習で実現する大規模データ処理

大規模データ処理。

人工知能

人間をコンピュータで模倣する。

チューリングテスト

機械学習

人間が知識や知能を獲得する過程をコンピュータで実現する。

分野の専門家。

演繹から帰納への変化。

データから法則を抽出する。

機械学習からデータマイニング


アノテーション済みコーパス

自然言語の文章に対する注釈。

形態素解析機械学習ベース。

機械学習ウェブサービスへの応用。

検索エンジン。

hadoop。

rdbmsの置き換えではない。

hdfs:分散ファイルシステム

mapreduce:unstructured、フォールトトレラント、並列プログラミングモデル。

データサイエンティストが重要となる。

jubatus。

多クラス分類。

【17-D-5】Java/Android セキュアコーディング入門

マルウェアの6割がandroidをターゲット。

ユーザの実行環境が異なる。

c2dmとのインテグレーション。

ファイルのパーミッション

WebView。

JSONハイジャック。

暗号化鍵のハードコーディング。

乱数のエントロピー不足。

センシティブな情報の外部送信。

エラーメッセージにセンシティブな情報。

言語非依存のセキュアコーディング。

strutsxss

入力値検査。

パス名は正規化する。

java言語特有。

スーパークラスに変更を加えた時、サブクラスがセキュアでなくなる。

androidsqlite

データベースファイルのパーミッションを設定して、作成する。

androiduriクラス。

/をurlエンコードすることで任意の/を文字列に残せる。

ディレクトリトラバーサル

jpcert.or.jp/java-rules/を参照。

【17-B-6】Building scalable web apps

7aspects.

codebase.
stored in scm.
doesnot contain config.
doesnot contain deps.

dependencies.
libs.
declared in manifest.
dependency management tools.

config.
per deploy-values.
auth credentials.
conn string.
not stored in files.
stored in Env Vars.
language agnosic.

backingservices.
databases.
caching.
queueing.
twitter/s3/email/etc.
add-ons to app.

setup.
connect via api.
auth.

build.
compiles codebase with dependencies.

release.
applies config to build.

runtime.
runs the release in the exection env.

proccses.
web process.
worker.
clock scheduled run cron.
run independently.
run in isolation.
do not write locally.
processes are disposable. scalable.

logs.
introspection into runtime.
need for troubleshooting.
great notification system.
are not files.
are streams of data.

loggly.
papertrailapp.
custom syslog setup.

older app deploy.
app dev.
op&dep.
system enginerring.

new app deploy.
no op&dep.
app dev&deploy.
op&system engineering -> infrastructure service.

heroku way.
no infra.
only app dev.

12 factor app.

heroku-wantedly.

【17-D-7】実践Android Developer Testing

androidテスト部。atec。

単体テスト結合テストを合わせてデベロッパーテスティング。

robotium、monkeyrunner。

native driver、fonemonkey。

monkey、sikuli。

android testing framework。

andriodmock、roblectric。

guiテスト自動化するか?

androidなら複数機種、バージョンがある。

アプリのバージョンアップが頻繁。

連続、同時タップなどの並列処理。

自動テストの記述コスト。

テスト成否判定を書く。

サーバとの通信、dbテスト。

guiのテストは無理なく計画的に。

できる範囲で。そのかわり下層のテストを厚く。

ユニットテスト

activityのテスト。

oncreate、onclick。

activityのコードは、modelとviewのコードが混在する。

testcase2のsetupメソッドでdb初期化。

activityとtestの2スレッドが立っている。

データから想定されるviewの結果を検証。

Unitテストとは言えない。

modelのテストでスレッドやactivityに注意するのは、作成コストが高い。

activityからモデルを分離する。

dbテスト。

テストデータの投入。

レコードが大量になったら?

fixture library。

androidにはない。

Jenkinsのandroid emulator plugin。