うごイラ Tech Talks
うごイラ Tech Talksに行ってきた。
プレイヤーやバックエンド、コードレビューや企画の話まで、一つのプロダクトについてまるっと聞ける機会は珍しい感じで興味深い感じだった。
技術的な部分もさることながら、プロダクトメンバ全体で面白いサービスを作ろうという意志が感じたのが一番印象的だったのだなあ。立場的にはそういう流れを作る側なわけで悩ましさがある。
うごイラ Tech Talksなんかこうサービスに対する熱意の差というか、今の会社もとてもよいのだけれど皆興味の範囲は仕事の外という感じがするし、なんだろうなー。それもまたマネジメントか
— 愛猫の名はニンゲンちゃん (@castor_4bit) 2014, 8月 1
終了後にレーザーでうごイラ描いていたの面白かった。(ソースはこれらしい)
あとフロアの後ろのほうでは、ずっとラブライブの曲が流れていた。
以下メモです。
うごく企画と開発管理
- @bash0C7さん
- 経緯
- 片桐社長の意志が強く反映されたもの(ITmediaの記事より)
- アニメGIFに対応しよう → 単に対応するのは違うのでは
- 「Webサービス開発徹底攻略」でのクックパッドの手法を採用した
- マトリクスでやることとかメンバの割り振りとか整理した
- クッパッ会と呼んでいた
- idobataを使ってチーム横断したチャットとか、URLを貼ったり画像貼ったりとか
- マネジメント
- やりましょうを始める
- やめましょうを決める(古いブラウザの切り捨てとか)
- 終わらせる方向への風向きを維持する
うごイラのコンセプトとUI
- @ykskさん
- アップロードUIのデザインと実装、プレイヤーUIのデザインと実装を担当
- アニメ作ろうという話がでた
- 単にアニメGIF対応ではpixivならでは感がない
- コンセプト
- デスクトップの壁紙が「ちょっと」動く感じ → イラストが動いている感じで、動画ではない
- 高画質・大画面 → アニメGIFでは不可能
- pixivならでは感
- 高画質なJPEG/PNGを複数枚アップロードする
- アップロード時に動きを編集するUIを用意した
- 複数選択で表示時間の変更や、ドラッグ&ドロップで順序を入れ替えたりできる
- 最近のフロンドエンド
- grunt/bower/CoffeeScript/stylus(SCSS/Compassやめる流れ)/Handlebars
- 処理の流れ
- FileAPIでローカルファイルを取得して、バイナリ解析してファイル種別を確認
- 画像をBase64で表示して、FormDataで送信
- 少し動けばいい
- pixivはソースマップあるので元のコードも読める
- プレイヤー
- あくまでイラストが動くコンセプト
- しっかり設計すれば意図は伝わるっぽい
- 目的が達成できれば手段は何でも構わない
- JavaScriptでバイナリ解析するとか、twitterのアニメGIF対応(mp4変換)とか
- 最近のJavaScriptは結構なんでもできる
うごイラと画像変換
- @tototoshiさん(資料)
- 画像周り(アップロード、変換、ストレージ、配信)を担当
- pixiv百科事典にzipでダウンロードする方法が書かれている
- 画像をzipに詰めて配信 -> JavaScriptで解凍している
- 「うごイラについてちょっと考えてみた」という記事 → だいたいあってる(80点くらい)
- Canvasに描画しているので右クリックで保存できない話
- 何故アニメGIFではないのか
- twitterのアニメGIF対応について
- mp4変換されて、ファイルサイズは小さくなるけれど画質劣化が激しい
- うごイラ
- zipで配信しているので、ファイルサイズは大きいが画質はよい
- APNGとかMNGとか(APNGは実は対応している)
- MJPEGは検討したけれど、ノウハウないのとffmpeg使いたくなかった
- うごイラに適したよいフォーマットがなかった
- 動画よりは画像のままのほうが画質良い
- ImageMagickにくわえてffmpegと戦うの嫌だった
- zipプレイヤーが既に実装されていた(あとで発表ある)
- 振り返り
- 画質良いの最高
- サイズが大きい
- うごイラの今後
- ファイルサイズ小さくしたい
- .ugoフォーマットを作る?
- まとめ
- うごイラはアニメGIFじゃない
- うごイラは動画じゃない
ugoku player
- @marcan42さん(資料)
- フォーマットについて
- HTML5 Canvasは最近のモダンブラウザではだいたい動く
- zipは展開簡単で作成用のライブラリも多い。枯れてる
- JavaScriptではArrayBuffer/UTF8Array/DataView/Blob...などを駆使して読み込む
- rangeリクエストでzipファイルを分割ダウンロードして徐々に展開
- zip_playerはgithubで公開している
- プログレス読み込みで逐次ヘッダを展開して、タイミングとか描画とか
- JSONでメタ情報を保持している
- IE10未満やAndroid4.0未満では問題がある
Ugoku Backend
- @harukasanさん(資料)
- うごイラのために気を使った部分はそれほどない(いつもやっている通りにやった)
- pixivの数値
- 37億PV/月,、1100万ユーザ、4500万投稿
- ピーク時 7Kreq/sec(画像は30Kreq/sec)、12Gbpsを10Gbps x 3、40TBのデータ、400台のサーバ
- うごイラの画像アップロード
- 最大150枚がアップロードされるのを、ユーザを待たせずに変換する必要がある
- 非同期アップロード
- ファイルアップロード → 情報入力 → 完了画面 という流れ
- アップロードされたらRedisにキューを積んで、すぐに入力画面に遷移させる
- 裏でサムネイルマスターの生成とGIF分割を実行して、アクティブとスタンバイにアップロード
- 情報入力完了時点で処理が終わっていなければ待たせる
- GIF画像の分割はgifsplitで、githubで公開している
- うごイラでは小さめの画像とオリジナル画像、サムネイルマスターの3種類を保持する
- WebDAVでストレージにアップロード
- ダイナミックサムネイル生成
- Contents Delivery Cluster
- うごイラのバックエンドは普通に動いている
- きれいなシステムもいいけど、動いているのが前提
- 動いた上で拡張しやすいように
- 質問
Ugoku PHP Development
- @notonauさん
- うごイラスクリーンセイバー
- これまではdeployをrsyncで行なっていた
- うごイラで使用するライブラリの都合で、Composerでのパッケージ管理にした
- Composerのautoloadが、rsync中に同期されていないファイルへのアクセスを行うので必ずエラーが発生した
- シンボリックリンクを張り替える運用にした
- 2分かけて徐々に反映される症状があった → realpath cacheを無効化して対応(負荷に目立った変化はなし)
- deployのたびにZend Opcacheのwested memoryが増えて開放されない問題 → 空いている時間にgraceful restartするようにした
- 質問
- ロードバランサなどで構成を切り替える運用にはしなかったのか
- アプリサーバが数十台あるが、すべて差し替えるだけのリソースはなかった
- 1台ずつ切り離して更新する方法もあるが、DB変更などでも不整合のないように一気に更新したかった
- ロードバランサなどで構成を切り替える運用にはしなかったのか
うごかなイラ
- @shobyshobyさん
- iOSアプリを作っている
- うごイラリリース → 好評あったが、アプリで閲覧できない問い合わせが多数
- リリース遅延と深刻なバグ
- うごかなイラの作り方
- Webと同時リリースするために(iOS審査があるので)先行で開発を始めた
- APIは本体側の機能に依存しているが、ぎりぎりまでAPIがないまま審査には出さないといけない状況
- 直前までAPIができなかったのでモックで開発
- OHHTTPStubs
- リリース後にキャッシュ周りで深刻な問題があった(モックでは気付けない問題だった)
- zipをダウンロードして展開
- CADisplayLinkが呼ばれるタイミングで描画
- drawRectは描画領域が大きくなるほど重くなる(iPadなど)
- 描画は最小限でaffine transで変換かけた
- 未実装機能のAPI
- APIのURLとレスポンス、DB設計は同時に決めるのがよい
- Model部分はモック化すると差し替えに強くなるかも
- 動作確認なしで審査に出す
- 質問
うごイラAndroid
- @RooandQooさん
- 社員3名とアルバイト1名で開発した
- ウェブと同時リリースを目指していた → Web版の翌日にリリースできた
- リリース翌日に「ながもんゲーム」が話題になったが、Android版では一時停止できないので遊べなかった
- 実装はできたものの、再生/停止のエフェクトで背景が黒くなったりちらついたりの問題で困ったりなどした
- Android 2系滅ぼしたい
うごいてるコードレビュー
ugocat
- @edvakfさん(資料)
- geta6氏がTerminalで画像をcatしていた
- うごイラでもやりたい
- node-canvas + ansi.js でイラストは対応できた
- zip_playerをnpm installしようとしたらpackage.jsonがなかった
- 通信周りはnode-xhr2、node界隈では壊滅的なBlob/ObjectURLはbase64ByteArrayという素敵polyfillがあった
- jQuery依存部分はイベント関連のみだったので、event-targetで自作した
- ここまで作ったところで、AAで動画再生するライブラリ libcaca を教えてもらったので、node-canvasを対応させた
- nodeのDOM互換ライブラリはいろいろあるけれど、仕様をまたいだものがないので全部のせのものがほしい