みなさんこんにちは。
サイバーエージェントでアメーバブログを担当している山田と申します。
今日は最近気になっているASWIFTについて書いてみようと思います。

ASWIFTとGoogle AdSense

ASWIFTとはVelocity2010でグーグルのArvind JainとMichael Kleberによって発表された、JavaScriptファイルのロード方法で、Google AdSenseで利用されています。
Velocity2011については弊社エンジニアも参加させていただき、レポートをあげていますのでご覧ください。

ASWIFTが考案された背景としてAdSenseのスクリプトファイルであるshow_ads.jsを改修し、ページ全体の表示速度を改善することが意図されているようです。

Steve Soudersの提唱する<script>の配置のベストプラクティスは</body>の直前であり、これはかなり一般的になりました。しかし、show_ads.jsはDOM上の任意のポイントに配置された<script>からロードされ、そのポイントに広告が表示されます。これはDOM操作にそれほど詳しくないサイトオーナーも直感的に出力位置を決定できるというメリットがある一方、ページ途中での<script>のロード・実行によるブロッキングが発生してしまいます。これについては古くから議論され、改修が試みられていますが、ASWIFTはこの問題に対するグーグルの最新のソリューションという位置づけになるようです。

ASWIFTとはどのような技術か?

Velocityの発表をさらに要約すると
  • show_ads.jsからメインのロジックを切り離し、ファイルサイズを小さくする
  • show_ads.jsはsame-domainな<iframe> を生成する
  • <iframe>の contentWindow.documentで<script>をdocument.writeで生成する。
  • <script>がメインのロジックを格納する show_ads_impl.jsをロードする
ということのようです。
<iframe>内に<script>を非同期に書きこむ手法、"Asynchronous Script Written into IFrame Tag"です。発表によるとASWIFTによりブロッキング時間を短縮することに成功したということらしいです。

ASWIFTの利用の実態

試しにameblo.jpで利用させていただいているAdSenseを手元のFirebugで分析してみたところ、どうもshow_ads.jsとshow_ads_impl.jsの<script>が並んで出力されているようで、same-domainな<iframe>も見当たりません。しかし、Google AdSense成功事例に掲載されているサイトをいくつか拝見したところ、id="aswift_0"という<iframe>が確かに存在しています。どうもASWIFTが利用されるサイトとそうでないサイトがあるようです。

ASWIFTの効果

それでは実際にASWIFTを使って外部スクリプトを読み込んでみます。
実験環境は以下のとおりです。

OS : WinowsXP
CPU : core2 duo e6850 3.0GHz
メモリ : 1.5G
ブラウザ : FireFox 5.0

高負荷な外部スクリプトを<script>で10回ロードし、ブロッキングの様子を観察します。
このスクリプトにはサーバーサイドで1秒間のレイテンシーを与えています。

結果
http://stat100.ameba.jp/1px/aswift /test1_1.html (通常)

ASWIFT検証(通常)

test1_1.htmlでは外部スクリプトを処理する間、ダウンロードがブロッキングされています。
画面上でもレンダリングが止まってしまいます。

http://stat100.ameba.jp/1px/aswift/test1_2.html  (ASWIFT)

ASWIFT検証(ASWIFT)

test1_2.htmlでは<iframe>からロードされたメインのロジックが処理し終わるのを待たずに次のリクエストが始まります。描画も止まらずアメーバのロゴがすぐに表示されます。

ASWIFT をどう使えばいいのか?

ASWIFTはページ途中の<script>タグにブロッキングさせないためのソリューションなので、やはり広告配信システムやブログパーツなど自社以外のサイトからロードされることを想定したスクリプトのロードに適していそうです。「+1」や「like」などの共有ボタン系もいいかもしれません。ただ、メインロジックが完了するまで window.onloadが発行されない、インジケーターが回り続けるなど課題もあるので、スクリプト自体の一般的なチューニングはやはり必要です。

以上になります。
長文にお付き合いいただきありがとうございます。

こんばんは、1 pixel運営委員です!掲載記事のお知らせです。

弊社でPico Worldの開発を担当している、渡邊美由紀の記事が@ITに掲載されました。
ここが大変だよ「Facebookアプリで世界進出!」


以下のような内容で、Facebookアプリを開発する上でのポイントをご紹介しています。
ぜひご覧ください!

はじめまして。
サイバーエージェントでフロントエンドの開発をしております 原(@herablog) です。

今回は、「HTML5 Web Applicationのつくりかた」と題してスマートフォン版 アメーバピグ新規作成で使用した技術について触れたいと思います。
#ちなみにこの記事ではHTML5を「最新ブラウザ向けのwebアプリケーション作成技術」というかなり広い解釈で使用していますので予めご理解ください。

今までDesktop・Android向けはFlashで作成されていたのですが、今回はiOS, Androidともに対応したいということで、HTML5でできるところまでやってみることにしました。

1 pixel|サイバーエージェント公式クリエイターズブログ-pigg新規作成 for mobile

No Lag

作るにあたり大事にしたものは、とにかく速さ。特に、選択してからの待ち時間をなくし、ユーザーのストレスを軽減することを目標としました。

さっそく問題が・・・

しかし、さっそく大きな問題にぶちあたりました。アメーバピグのアバターは型・色合わせて全部で約1700種類のパーツの組み合わせでできています。これだけ多くの種類から選べるからこそ自分そっくりのアバターを作成できるのですが、データサイズの面からは問題となってしまいます。どうやってアバターを描くか、しかも速くストレスなく、といった方法を探す必要があったのです。
1 pixel|サイバーエージェント公式クリエイターズブログ-Piggはたくさんのパーツから成り立っています

4つの方法

最適な方法を探すため、4つの方法を試してみました。

1. Image
◯ すでにパーツが用意されていて実装が簡単。
× パーツ数が多すぎて一度にダウンロードできない。必要時にリクエストしてもレスポンスに時間がかかる(特に3G回線では顕著)。

2. CSS Sprites
◯ 画像容量減少。ある程度まとめて先読みできる。
× パーツ数が多いことに変わりなく、すべて読み込んだ時点でメモリを消費しパフォーマンスが悪くなってしまう。

3. SVG
◯ Aiデータとの相性良し。色はcssで変更できるため型のデータのみ所持すればいいので容量削減可能。
× Android非対応...。

4. Canvas
◯ 型、色データともテキスト形式でもてるので容量減少。iOS, Androidともに比較的実装が進んでいる。
× OSのバージョンごとに少々バグあり。うまくいく保証がない。

テストを重ねた結果、今回はCanvasでアバターを描くことにチャレンジすることにしました。

Ai→Canvas

AiデータをCanvasデータに変換するにあたりAi→CanvasというIllustratorプラグインを使用しました。Aiデータを以下のような数値データに変換してくれます。
1 pixel|サイバーエージェント公式クリエイターズブログ-Canvasデータ
これでパーツ(型)データが汎用的に使えるようになりました。

容量激減

さらに容量を削減させるため、すべてのパーツを変換した後、数値データを抜き出し、JSON化しました。すると仮にすべて画像データにする場合(1MB)にくらべJSONデータ (420KB)では53%データサイズを削減することができました。さらにgzip圧縮して転送することで転送量を120KBに、当初に比べ88%削減できました。

容量88%減


アバターを描く方法に目処がたったところで、ページの作成に移ります。

控えめなJavaScript

作成にあたり、HTML, CSS, JavaScriptそれぞれの役割を大切にし、JavaScriptに頼り過ぎないように設計しました。

HTML・・・構成する要素を記述
CSS・・・要素をどう表示するか
JavaScript・・・ユーザーアクションに対する動作・処理

もちろん、作ろうとするサイト・アプリケーションにもよりますが、表示内容を変更しようとする際にスクリプトを読む必要がないのは大きなメリットではないでしょうか。今回JavaScriptはページ遷移、アバターの描画を担当しています。

表示要素はHTML1枚で

表示要素は全ページまとめて1枚のHTMLに記述しました。ページごとのリクエストが不要で、遷移時にタイムラグをなくすことができます。

window.onhashchange

ページ遷移にはHTML5で新たに追加されたwindow.onhashchangeを使っています。URLの#以降が変更されたときに指定のページを表示させています。iOS, Androidどちらのブラウザも対応していたこと、サーチエンジンやページキャッシュへの対応が必要なかったため採用しました。

<a href="#eye">次へ</a>をタップ(クリック)
→URLがhttp://~~~.jp/#eyeに変更される
→window.onhashchange, hash = #eyeが起こる
→<div id="eye"></div>を表示させる


Custom Data Attribute

HTML5では「data-」をつけることでHTML属性を設定することができるようになりました。JavaScriptからはgetAttribute, setAttribute, dataset(iOS4.3, Android2.3では未対応)でアクセスでき、CSSからは属性セレクタで指定できます。

今回はdata-parts, data-item2つの値をJavaScriptで取得し、アバターを描画しています。

<ul data-parts="face">
<li data-item="0"></li>
<li data-item="1"></li>
</ul>

Data URI Scheme

Data URI Schemeを使うことで高コストであるHTTPリクエストさせずに画像を表示することができます。画像のバイナリデータをbase64エンコードし、 HTMLもしくはCSSに埋め込みます。

・HTML
<img src="data:image/gif;base64,R0lGODlhTgBOANUAAP////f39+/...">

・CSS
background: url(data:image/gif;base64,R0lGODlhTgBOANUAAP////f39+/...);

今回はローディング画像に使用し、HTMLが読み込まれると同時にいち早く表示させ、ローディング中に画像が出ないことを防いでいます。データサイズが約130%増になってしまうため、すべての画像に適用することが最適ではありませんが、アイコン等小さな画像やCSSによるキャッシュ、gzip圧縮して転送するなど合わせて使用すると効果があります。

Sass

HTML5とは直接関係ありませんが、CSSの記述にSassを使用しました。SassはCSS拡張メタ言語と呼ばれるもので、従来のCSSに構造化、定数・変数、分岐、ループ、関数、Mixinなど強力な機能を追加してくれます。今回はよりCSSに近いSCSSという記法で記述しました。

・構造化
#confirm{
.lead{
margin: 15px 0 0;
font-weight: bold;
text-align: center;
}

.submitArea{
margin: 59px 0 0;
}

・ループ
@for $i from 0 through 6 {
ul[data-parts="face"] li[data-item="#{$i}"] { background-position: removePx((-11 + -$i) * $thumbWidth) removePx(-10 * $thumbWidth); }
}

・関数
@function removePx($v){
@if $v == 0{
@return $v;
} @else {
@return #{$v}px;
}
}

・Mixin
@mixin border-radius($radius: 4) {
-moz-border-radius: removePx($radius);
-webkit-border-radius: removePx($radius);
border-radius: removePx($radius);
}

続いて、今後のWebで重要なトピックスである高速化について、今回実施したことをまとめます。

大前提はHTTPリクエストを減らすこと

Googleが検索順位決定の要素に速度を追加していくと発表したこと、ユーザーの利用時間の奪い合いが激化していること、スマートフォンに代表されるモバイル環境の普及・マルチデバイス化などの理由でWebサイトの高速化はますます重要なトピックスになってきていきます。
Webサイトの速度に関する多くの時間はファイルのダウンロードに費やされています。そのため高速化を考える際にはまずHTTPリクエストを減らすこと、つまりHTML, CSS, JavaScript, 画像ファイル, swf等ファイル数を減らす必要があります。

CSS Sprites

画像のHTTPリクエストを減らす方法として画像をひとまとめにするCSS Spriteがあります。
1 pixel|サイバーエージェント公式クリエイターズブログ-CSS Sprites
CSS でbackground-image, background-positionを指定して表示させます。
また、Data URI Scheme(前述)を使うことも有効な手段です。

画像最適化

PhotoshopやFireworksで書き出された画像データの多くには表示には必要のないデータが含まれています。OptiPNGなどのツールを使うことでそれらのデータを除去し、ファイルサイズを減らすことができます。
今回は約3%(79KB→77KB)データサイズを減らすことができました。

ファイル結合

画像と同様にCSSファイル、JavaScriptファイルを結合することでHTTPリクエストを減らすことができます。今回のプロジェクトでは計7つのファイル(HTML 1つ、CSS 1つ、JavaScript 2つ、JSON 1つ、画像 2つ)に収めています。

Minify

テキスト系のデータは、コメント、改行、空白、タブを削除することでデータサイズを減らすことができます。
1 pixel|サイバーエージェント公式クリエイターズブログ-Minify
今回はYUI Compresserを使い、33%(286KB→191KB)データサイズ削減できました。

gzip圧縮

仕上げにgzip圧縮転送の設定をします。こちらはサーバー側の設定になりますが、 Apache, mod_deflateで設定することができます。画像ファイル、pdfファイル等に設定すると容量が増えてしまうことがあるので、テキスト系のデータのみ設定する必要があります。
大体、70%程データサイズを削減することができます。
gzip圧縮で73%削減

トータル

上記の対応をすることで、最初の段階から67% (786KB→246KB)データサイズを減らすことができました。

67%削減



フルスクリーンモード

最後におまけ機能の紹介です。iOSにはフルスクリーンモードという機能があり、Webアプリをまるでネイティブアプリのように表示させることができます。Safariで表示されるロケーションバー・メニューバーの非表示、ステータスバーの色指定、ロック時もJavaSccriptを動かすことができます。
逆に、[戻る][進む][更新]といったナビゲーションをWeb内に入れ込む必要があります。

フルスクリーンモード

フルスクリーンモードをONするには以下の3行を追加するだけです。

<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-startup-image" href="起動時の画像">

以上、スマートフォン版 アメーバピグ新規作成で使用した技術をご紹介しました。アメーバピグその他の機能も現在開発中です。その際の技術も追ってお伝えできたらと思っています!

勉強会の様子はこちらの記事からどうぞ!
>> クリエイター勉強会でのひとこま

はじめまして、宇納(@TasukuUno)と申します!
インターネット広告事業本部CAMP事業部で、ディレクションや、フロントエンド開発の実装全般を担当しています。実は、このブログの運営委員なんかもやったりしています。


今回は、先日社内で開催されたクリエイターの勉強会について紹介します!

クリエイター勉強会

弊社のクリエイター・エンジニアの間では、勉強会が至る所で開催されています。
内容や規模はその時々で色々ですが、
  • イラスト初心者のためのデッサン教室
  • FlashディベロッパーのためのJavaScript勉強会
  • イラストレーターのためのFlashアニメーション勉強会
などなど、スキルの幅を広げたり深めたいと思う人がたくさん集まっています。
また、外部から講師をお招きして開催することもあります。


今回紹介するのは、Amebaでフロントエンド開発を担当している原(@herablog)の勉強会です。

スマホ版Pigg新規作成Projで用いた最新技術

PCでスタートしたアメーバピグは、全てFlashで動いています。Androidではairベースのアプリをリリースしていますが、Flashに対応していないiPhoneでは、なかなかそれを再現することが難しいのが現状です。

ですが、現在はそのiPhoneでも、ピグの新規作成画面を再現することに成功しています。
HTML5やその周辺の技術を使ってリッチなUIを再現している、という部分に食いつき、
この勉強会には多くのクリエイターが集まりました。

クリエイター勉強会
弊社セミナールームにて


クリエイター勉強会
講師担当の原


クリエイター勉強会
興味津津です!


クリエイター勉強会
参加者からも質問や意見が飛び交いました


こんな雰囲気の勉強会でした。
個人的な感想としては、HTML5やCSS3が使えるとはいえ、スマートフォンはあくまでモバイルのデバイスなので、極限まで軽量化したり最適化することが欠かせないのだな、と感じました。
あと、Sassがすごく気になる!使ってみたい!!

また、このような形で、プロジェクトや事業部の違うクリエイターが集まって勉強会をするというのもいい機会だな、と改めて実感しました。今後も続けていきたいですね。

さて、実際の勉強会の技術的な内容はこの後の記事でご紹介します!
続けてどうぞ!

>> HTML5 Web Applicationのつくりかた


はじめまして。
サイバーエージェント・アメーバ事業本部
ピグディビジョン所属の馬場です。


現在、ソーシャルゲームのピグライフを開発をしていて、
アートディレクション・UIデザイン・イラストレーションを担当しています。
今回は、ピグライフの世界観が出来るまでの一部をご紹介したいと思います。


開発初期の取材風景

$1 pixel|サイバーエージェント公式クリエイターズブログ
旧古河庭園と、リッツカールトンのティールームです。
取材を進め、「英国庭園」というコンセプトが決まりました。


集めたデザイン資料たち

$1 pixel|サイバーエージェント公式クリエイターズブログ
チームにある本棚の一角です。
デザインの資料の為にあつめた沢山の本が並んでいます。
ピグライフのデザインはほとんどここの資料達から出来ています。


取材や資料をもとに制作したコンセプトブック

$1 pixel|サイバーエージェント公式クリエイターズブログ
こちらは初期に描いたコンセプトブック。
中身は英国庭園のモチーフで凝縮しています。
ピグライフの原点であり、今後のシナリオも詰まっています。

$1 pixel|サイバーエージェント公式クリエイターズブログ
生産家具のスケッチは、ほぼ同じイメージに仕上がって行きました。


夢がつまったキャラクターのアイデア

$1 pixel|サイバーエージェント公式クリエイターズブログ
この沢山の付箋はキャラクターのアイデアメモです。
思いついたキャラクターを片っ端から書き留めてあります。
現在活躍中のエミリー、ノラ、レイラ、ロビンはこの中から生まれました。
今後の新キャラクターもこの中から登場していきます!


新しい挑戦になったシネマ機能

$1 pixel|サイバーエージェント公式クリエイターズブログ
ピグライフでは新たに、ゲーム中にキャラクターが登場するシネマ機能が追加されています。
キャラクターのアイデアが豊富にでた為、シネマ機能を作ろうというきっかけになりました。
現在では、ストーリー付きの楽しいイベントを配信できて、
ユーザーの皆様にもご好評を頂いております。


$1 pixel|サイバーエージェント公式クリエイターズブログ
家、洋服、食べ物、植物のほんの一部です。
この段階になると、もうひたすらで作りまくる!というフェーズでした。
そんな中でも、イラストは一つ一つ丁寧にデフォルメしています。


$1 pixel|サイバーエージェント公式クリエイターズブログ
ピグライフチームの窓辺ではラディッシュやハーブを栽培中。
日々、緑化が進んでいます!

チーム一丸になって楽しい機能やイベントをどんどん考えて行きますので
これからのピグライフを宜しくお願いします!

新芽ピグライフはこちらから
http://pigg-life.ameba.jp/

はじめまして。

サイバーエージェント・アメーバ事業本部・ピグディビジョン所属の浦野です。
現在、ピグライフというソーシャルゲームのディレクション・プロデュース・インタラクションデザインなどを担当しています。

好物は、プロレスとNUI (Natural User Interface) です。


ピグファイター

今回は、私たちが最近つくったゲーム「PiggFighter」を紹介します。
PiggFighterは、KinectとFlashを使用し、アメーバピグと連動させた体験型対戦格闘ゲームです。(Ameba・アメーバピグの正式なサービスではなく、実験的なプロジェクトです)



子供の頃、誰しも、波動拳や覇王翔吼拳など架空の必殺技を素振りしていた日々がありました。

「波動拳を出したい・・・!」

そんな切実な願いから生まれた作品が、PiggFighterです。
このゲームでは、プレイヤー自身のジェスチャーによってアバターを操作して遊びます。
必殺技ピグファイヤーや超必殺技ピグゲイザーを駆使して戦います。


Kinect Hack with Flash

本プロジェクトを進めるにあたって、まず Kinect を Flash で使えるようにするためのライブラリ「kinectas」を開発しました。

uranodai/kinectas - Spark project

最新バージョンの v0.0.2 では、Mac OS 10.6 + Adobe AIR 2.0 をサポートし、プレイヤーの骨格情報 (各ジョイントの位置座標) を取得することができます。

現在はOpenNI/NITEで開発していますが、今後はマイクロソフト公式のKinect for Windows SDK版もつくる予定です。


Web Designing セミナー

先日、Web Designing セミナー「Kinect Hack with Flash」というイベントを開催し、PiggFighterのメイキング解説とデモをおこないました。

1 pixel|サイバーエージェント公式クリエイターズブログ

1 pixel|サイバーエージェント公式クリエイターズブログ

イベント当日は約100名の方にご来場いただきましたが、実際に多くの方々にPiggFighterを体験して遊んでいただき、予想以上に盛り上がったことが本当に嬉しかったです。


おばかアプリ選手権

8月20日に、第5回おばかアプリ選手権というイベントに出場し、PiggFighterを発表しました。
イベント当日は約70名の方にご来場いただき、結果はWindows Azure賞を受賞することができましたねこへび

見逃した方はこちらから視聴できるのでぜひ!→ http://www.ustream.tv/recorded/16767260


クレジット

PiggFighterプロジェクトのクレジットです。

Programmer : @uranodai
Direction+Flash : @bao_bao
Flash : @tessonn
Flash : @sixgraphica
Designer : @eriiiiiiiiiiii
Fighter : @mooky1213
Sound : Takahiro Kurashina
Voice : Yuriya Morisaki
Special Thanks : Emi Baba, Tasuku Uno


さいごに

サイバーエージェント・ラボ部(仮)では、通常業務以外でラボ的な活動として新しいデバイスやユーザーインターフェースを使った実験的な作品をいろいろとつくったりしています。

今後また機会があればイベントなどで発表していきたいと思います。

はじめまして。

サイバーエージェント技術推進本部クリエイティブ部門で
統括やってます、内波です。


この度、サイバーエージェントのオフィシャルブログの一つ
としてクリエイターズブログをスタートする事となりましたっ!

以前からよく言われる、「サイバーは営業だけの会社」
「アメーバも外部の制作会社が作ってるはず」みたいな誤解を
払拭すべく、中の人をどんどん表に出していこうと思います。

また、業界への貢献、採用目的、いろいろあると思いますが、
とにかく、続けられそうな目処がたったのでスタートです。


それでは、
サイバーエージェントクリエイターズブログ 「1 -one- pixel 」
始まるYoo!!