はじめまして。
2012年度入社のニイノミ(@nomi_ryota)と申します。
現在は、お題に一言ボケるスマートフォン向け大爆笑コミュニティサービス『アメーバ大喜利』のフロントエンドを担当しています。
趣味は黄色いもの集めです。


さて、本日は最近(ちょっと前か)話題のフィジカルコンピューティングデバイス『LeapMotion』のJavaScriptを用いた開発について紹介したいと思います。
僕が日頃業務でやっている内容とはちょっと異なるフィジカルコンピューティングのお話ですが、とても面白い世界なのでお付き合い頂ければ幸いです。

LeapMotionとは

LeapMotion(以下Leap)はLeap社が開発した動きやジェスチャーを認識し、コンピュータ操作を行えるデバイスです。
2012年春頃から予約が始まり、今年の7月頃にようやく世界中に発送され利用できるようになりました。
Leapの特徴としては、

 ・手のひらサイズのコンパクトさ
 ・両手の指1本1本すべて検知でき、手の向きも検知できるので仮想的にモノをつかんだりすることが可能
 ・XY軸に加えて、奥行きを表すZ軸を持つ
 ・センサーの反応範囲は約600mm
 ・スキャン速度は、最大290fps(Kinectの約10倍)
 ・C++, Objective-C, Java, Javascriptなど様々な言語で制御可能

が挙げられます。
同様のデバイスにMicrosoft社が開発したKinectがありますが、Kinectと比較したLeapの利点はやはり、

 ・手のひらサイズのコンパクトさ
 ・手のひら、指の細かな情報を認識できる

だと思います。
サイズはKinectの1/7以下と扱いやすい大きさですし、手のひらや指の情報に関してはその位置だけでなく向きや角度、ジェスチャーのパターンまで認識できるので細かな動きを制御するには非常に優れたデバイスです。
イメージ的にKinectは身体全体を使った操作に、Leapは手を使った細かな操作に向いているといった感じでしょうか。

開発準備

Leapを使ったアプリケーションはC++, Objective-C, Java, JavaScriptなど様々な言語で開発可能ですが、今回は比較的扱いやすいJavaScriptを使っていきます。
LeapをPCで使えるようにするには予め専用のソフトウェアをインストールしておく必要があります。
Leapのサイトから手順に沿って行うだけです。非常に簡単です。
JavaScriptでLeapを扱うにはLeapJSというオープンソースライブラリを使用します。LeapJSの使い方は次の項で説明します。

LeapJSについて

Leapはコンピューターにドライバが組み込まれた状態であればポート番号6437でWebSocketサーバが立ち上がるのでそれをJavaScriptで受け取ればJSON形式のトラッキングデータ(手や指の情報)を取得することができます。
これをJavaScriptから簡単に扱えるようにしたのがLeapJSです。
説明するよりもコードを見た方が早いですよね?早速LeapJSを使ってみましょう。

LeapJSを読み込みます。
ダウンロードしたファイル以外にもLeapJSのページにホスティングされているファイルを読み込む方法もあります。


<script src="//js.leapmotion.com/0.2.1/leap.min.js"></script>

LeapJSは「loop」メソッドを使うことでWebSocket経由でトラッキングデータを取得できます。

Leap.loop({enableGestures: true}, function(frame){
  // 処理
});


第1引数にはオブジェクト形式で色々設定可能ですが、ここではジェスチャーの検出設定のみ行います。

インスタンスからイベントバインド形式で書くことも可能です。
以降で紹介するデモではこちらを利用しようと思います。


var controller = new Leap.Controller({enableGestures: true});
controller.on('frame', function(frame) {
  // 処理
});
controller.connect();  // 接続

指先の座標やジェスチャー等のトラッキングデータは、コールバック関数に渡される引数(frame)に格納されます。

例:
 frame.gestures  // ジェスチャーのデータ(配列)
 frame.hands  // 手のデータ(配列)
 frame.fingers  // 指のデータ(配列)

例えば、検出されている指の本数は下記のように取得できます。


Leap.loop({enableGestures: true}, function(frame){
  console.log(frame.fingers.length);
});

このようにLeapJSを用いることで簡単にトラキングデータを扱うことができます。
ワクワクしますね。

LeapJSで制御してみる

それでは取得したトラッキングデータを色々使ってみましょう。

はじめに、Canvasを用いて手を描いてみます。
人間の手をパーツ別に考えると、手のひらと指に分けることができるのでそれらを別々に描画していきます。
検出されている手のひらは、「frame.hands」で配列として取得できます。
また、その位置は手のひら配列の中の「palmPosition」の中にこちらも配列としてx座標、y座標、z座標が格納されています。

var hand = frame.hands[0],
        posX = hand.palmPosition[0],
        posY = hand.palmPosition[1],
        posZ = hand.palmPosition[2];


指の情報も「frame.pointables」を用いて手のひらと同じ要領で取得します。
手を描画する全コードは以下の通りです。


var controller = new Leap.Controller({enableGestures: true}),
    canvas     = document.getElementById("js_canvas"),
    ctx        = canvas.getContext("2d"),
    winWidth   = window.innerWidth,
    winHeight  = window.innerHeight;
var resetDraw = function(){
    ctx.clearRect(0, 0, winWidth, winHeight);
};
//手の描画
var draw = function(arg, isFinger){
    var _posX = winWidth/2 + arg.posX,
        _posY = winHeight - (arg.posY),
        _radius = (isFinger) ? 30 : 90;
    ctx.fillStyle = "rgba(0,0,0,0.4)";
    ctx.beginPath();
    ctx.arc(_posX, _posY, _radius, 0, Math.PI*2, false);
    ctx.fill();
};
var init = function()
    canvas.width  = winWidth;
    canvas.height = winHeight;
    controller.connect();
};
//トラッキング
controller.on("frame", function(frame){
    resetDraw();
    //検出した手の数だけ実行
    for (var i = 0, _len = frame.hands.length; i < _len; i++) {
        var _hand = frame.hands[i];
        draw({
            posX : _hand.palmPosition[0]*3,
            posY : _hand.palmPosition[1]*3 - 150
        }, false);
    }
    //検出した指の数だけ実行
    for (var i = 0, _len = frame.pointables.length; i < _len; i++) {
        var _pointable = frame.pointables[i];
        draw({
            posX : _pointable.tipPosition[0]*3,
            posY : _pointable.tipPosition[1]*3
        }, true);
    }
});
init();

猫の手のようなかわいい手が描けました!

実際にLeap上で手を動かすと画面上の手の位置も更新されます。
上のコードで使っているのは手のひらと指先の位置だけなのでリアルな人間の手とはほど遠いですが、指の長さを取得する「pointables.length」や指の平均幅を取得する「pointables.width」など使えばもっと人間っぽい手を再現できるかもしれません。

因に、CSS3のtranslate3dプロパティを利用すればCanvasではなくDOM操作で手軽にリアルな3Dの手を描画することもできます。

デモ(LeapMotionが繋がれた状態でご覧下さい)

ジェスチャー

では、次にジェスチャーを取得していきます。

Leapではユーザーの考えられうる特定の動きのパターンがジェスチャーとして予め登録されています。
ジェスチャーを取得するには、予めインスタンス化の際のカスタム設定オブジェクトの「enableGestures」をtrueにしておく必要があります。


var controller = new Leap.Controller({enableGestures: true});

ジェスチャーの種類は、以下の4パターンがあります。

 circle: 指で円を描く動作
 swipe: 水平方向に直線を描く動作
 screenTap: 指を画面方向に素早く動かす動作
 keyTap: 指を下に素早く動かす動作

これらのジェスチャーは「gesture.type」で取得できます。


frame.gestures[0].type;

また、「gesture.state」でジェスチャーの状態(start, update, stop)も取得することができます。
下記はcircleジェスチャーでボックスを回転させるコードです。


var controller   = new Leap.Controller({enableGestures: true}),
    winWidth     = window.innerWidth,
    winHeight    = window.innerHeight,
    canvas       = document.getElementById("js_canvas"),
    ctx          = canvas.getContext("2d"),
    drawRectAble = true,
    boxSize      = 200,
    gesType      = null,
    rotateAngle  = 15,
    rotateCount  = 0,
    currentDown  = 0,
    downState    = null,
    downCount    = 0,
    upCount      = 0;
//ボックス
var boxObj = {
    x : winWidth/2 - boxSize/2,
    y : winHeight/2 - boxSize/2,
    size : boxSize
};
var resetDraw = function(){
    drawRectAble  = true;
    ctx.fillStyle = "rgba(100, 100, 100, 1)";
    if (!gesType) {
        ctx.clearRect(0, 0, winWidth, winHeight);
        ctx.fillRect(boxObj.x, boxObj.y, boxObj.size, boxObj.size);
    }
    //回転処理
    else if (gesType == "circle") {
        ctx.clearRect(0, 0, winWidth, winHeight);
        ctx.fillRect(boxObj.x, boxObj.y, boxObj.size, boxObj.size);
        ctx.translate(winWidth/2, winHeight/2);
        ctx.rotate(rotateAngle/180*Math.PI);
        ctx.translate(-1*winWidth/2, -1*winHeight/2);
        rotateCount++;
        if (rotateAngle*rotateCount >= 360) {
            gesType = null;
            rotateCount = 0;
        }
    }
};
//衝突&ジェスチャー判定
var checkGesture = function(_gesture, _posX, _posY){
    if (_gesture && _posX > boxObj.x && _posY > boxObj.y && _posX < boxObj.x+boxObj.size && _posY < boxObj.y+boxObj.size) {
        //circle
        if(_gesture.type == "circle" && _gesture.state == "start" && !gesType) {
            gesType = _gesture.type;
        }
    }
};
//描画
var draw = function(arg){
    var _posX = winWidth/2 + arg.posX,
        _posY = winHeight - (arg.posY);
    checkGesture(arg.gesture, _posX, _posY);
    //指
    ctx.fillStyle = "rgba(255,255,255,0.4)";
    ctx.beginPath();
    ctx.arc(_posX, _posY, 10, 0, Math.PI*2, false);
    ctx.fill();
};
var init = function(){
    canvas.width  = winWidth;
    canvas.height = winHeight;
    controller.connect();  //接続
};
//トラッキング
controller.on("frame", function(frame){
    resetDraw();
    //検出した指の数だけ実行
    for (var i = 0, _len = frame.pointables.length; i < _len; i++) {
        var _pointable = frame.pointables[i];
        draw(_obj = {
            posX : _pointable.tipPosition[0]*3,
            posY : _pointable.tipPosition[1]*3,
            posZ : _pointable.tipPosition[2]*3,
            gesture : (frame.gestures[0]) ? frame.gestures[0] : null
        });
    }
});
init();

実行結果は画像ではわかりづらいので動画でご覧下さい。



ちゃんとcircleジェスチャーを認識してくれました。

最後に認識するジェスチャーの種類を増やし、ジェスチャーごとにアクションを変えてみます。

 circle:ボックス回転
 keyTap:ボックス降下
 screenTap:背景色変更



結構な精度でそれぞれのジェスチャーを認識してくれてます。(動きが地味ですが笑)
ただ、keyTapは下げた指をしっかり上まで戻さないとジェスチャーとして認識されなかったので、その辺の調整は必要かもしれません。

このように予め用意されているジェスチャーを用いれば簡単に画面を操作することが可能です。
マウスを使わなくてもWebサイトの閲覧ぐらいはできそうですね。

最後に

最後までお付き合い頂きありがとうございました。
今回はJavaScriptを用いたLeapMotionの制御について紹介させて頂きました。
いかがでしたか?
フィジカルコンピューティング、面白いですよね。
まだまだ仕事として扱うには難しいかもしれませんが、これからの未来を担う可能性のある分野だと僕は思っています。
マイノリティ・リポート的な未来が来るのもそう遠くはないかもしれませんね。
興味が湧いた方、是非トライしてみて下さい!

大爆笑コミュニティサービスの『アメーバ大喜利』もよろしくね♪

こんにちは。原(@herablog)です。
HTML5 Web Applicationのつくりかた」以来久しぶりの投稿となります。

今回は「Git」をフロントエンジニア向けに導入したお話をさせていただきます。

ソースコード管理システムとしてスタンダードになっているGitですが、機能が豊富で「なんか怖い」と思ってしまいがちです。特にフロントエンドの担当者にとっては距離を感じるものではないでしょうか。サイバーエージェントではGitHub Enterprise導入を期に、フロントエンジニアも利用し、効率・クオリティアップにつなげることができました。Gitを取り入れるメリット、よく使うGitコマンド、実際の現場でどのように使われているのかなどをお伝えします。

Gitを理解するポイント

どこでも一緒 「分散」の感覚

Gitは分散型のシステムであり、すべての環境が対等です。リモートであろうとローカルであろうとすべて同様の操作ができます。ですので、ローカル環境で色々チャレンジして、失敗しながら覚えていくことができます。

ブランチ たくさん作って作業

Gitのブランチはすべてのファイルそのものをコピーするわけではないので、容量を気にせず、気軽に複数のブランチを作成して作業します。作業に応じて適切にブランチを作成することで管理性の向上や、リリーススケジュールに対して柔軟に対応することができます。

ツリーをイメージし、綺麗にする

Gitでの作業ではたくさんのブランチを作成するため、それぞれを都度マージ(統合)させる必要があります。その際に、どのコマンドを使うとどのように取り入れられ、どのようなツリー表示になるかイメージできるようになると面白くなってきます。

Amebaでの開発フローは「git-flow」+ 「Pull Request」
Gitは数多くの機能を提供しているため、使い方は様々ですが、作業フローをまとめた有名なものとして「git-flow」や「GitHub Flow」といったものがあります。Amebaでは以下の理由から「git-flow」を採用しました。

・リリース日を決めた定期的なリリースに向いている
・オープンソースでも比較的採用されているので覚えて損はない

また、ソースコードのクオリティを担保するために、GitHubが提供している「Pull Request」という機能を使ってソースレビューをしています。

ブランチの運用ルール
ブランチは以下のルールにしたがって命名・運用されます。

master (製品版ブランチ)

このブランチは他のブランチからマージされるのみで、このブランチ上では作業しない。すべての内容はこのブランチにマージされたあと本番環境にリリースされる。

develop (作業内容マージ用ブランチ/masterブランチから作成)

作業ブランチの内容をマージし、 作業内容の確認はこのブランチから作成される。

feature/fixブランチ (作業用ブランチ/developブランチから作成)

作業用ブランチ 新規開発時は「feat/」、バグ修正には「fix/」という接頭辞をつけるようにルールを設けている。

release (リリース用一時的ブランチ/developブランチから作成)

リリース前確認用として一時的に作成される。

hotfix (バグ修正用一時的ブランチ/masterブランチから作成)

バグ修正用として一時的に作成される。

branches


Amebaでの作業フロー
作業開始から終了までをまとめると以下の図のようになります。

all


初回のみの作業

1. 共有リポジトリ(ameba)から自分のアカウント内(parsonal)に複製(*Fork)する
2. 自分のアカウント(personal)からlocal(PC内)に複製(**git clone)する
3. 共有リポジトリ(ameba)を「upstream」という名前で登録し、developブランチをlocal(PC内)に複製(**git checkout)する

通常フロー

3'. 初回以外は共有リポジトリ(ameba)の最新状態と同期をとる(**git pull)
4. 3で作成したdevelopブランチから作業用のブランチ(feat/new-menu, fix/tap-timingなど)を作成(**git checkout -b)し、作業する
5. 作業した内容を確定(**git add, git commit)する
6. 他の人が修正し、共有リポジトリに加えられた変更を作業用ブランチに取り込む(**git pull --rebase)
7. 作業したブランチを自分のアカウント内に複製する(**git push)
8. 作業したブランチの変更内容を「*Pull Request」し、コードレビューしてもらう
9. 変更内容に問題がないことを確認し、共有リポジトリ(ameba)のmasterブランチに取り込む(**git merge --no-ff)

リリースフロー

10. 開発環境もしくは本番環境にリリースする

* GitHubが提供している機能です
** Gitが提供している機能です

おおざっぱにいうと、共有リポジトリからファイルを落としてきて(1-3)、作業後(3'-5)、チェックをしてもらい(6-7)、共有リポジトリに取り込みます(9)。


便利なGUIツール「SourceTree」
Gitには様々な機能があり、それらを直感的に理解するのはなかなか難しいものです。普段コマンドラインでの操作に慣れていない場合はなおさらです。そういった場合にはGUIツールを使うと良いでしょう。この記事では無料で利用できるSourceTreeを使用します。

soucetree

http://www.sourcetreeapp.com/

よく使うGitコマンド・GitHub機能
それでは、よく使うGitコマンド・GitHub機能をご紹介しましょう。よりわかりやすくするために、実際の業務フローの流れとともにお伝えします。

Fork

1. 共有リポジトリ(ameba)から自分のアカウント内(parsonal)に複製(*Fork)する
公開用の共有リポジトリとしてGitHubを使用します。プロジェクトのページに行き、Forkボタンを押します。そうするとGitHubの自分のアカウント内に複製されます。

fork01

Forkボタンを押します。

fork02

Fork中にはフォークのイラストが出現します。

fork03

自分のアカウント内に複製されます。


git clone {URL}

2. 自分のアカウント(personal)からlocal(PC内)に複製(**git clone)する
先ほどforkしたリポジトリをcloneしローカル環境に複製します。そうするとmasterブランチができあがります。ここからしばらくローカル環境での作業になります。

clone01

表示されているURLをcloneします。

git clone http://github.sample.com/hara-kazunari/amebame-community.git


clone02

SourceTreeの場合は、[新規作成]からURLを指定します。


git remote add  {name} {URL}

3. [初回時] 共有リポジトリ(ameba)を「upstream」という名前で登録し、developブランチをlocal(PC内)に複製(**git checkout)する

プロジェクトの最新情報を追いかけるために共有リポジトリを「upstream」という名前で登録します。

remote1

表示されているURLをaddします。

git remote add upstream http://github.sample.com/amebame/amebame-community.git


remote_ST

右上の[設定]から追加します。


git checkout -b {branch_name} --track {repository}/{branch}

共有リポジトリを「upstream」として登録した後、upstreamから直接developブランチをlocalに複製します。その際、upstreamの更新情報を常にチェックするために--trackオプションをつけておきます。

git checkout -b develop --track upstream/develop


checkout

右クリックでメニューを出し、chekoutを選択します。


git pull

3'. [初回以外] 共有リポジトリ(ameba)の最新状態と同期をとる(**git pull)
共有リポジトリ(ameba)の最新状態を取り込み、同期をとります。
developブランチは最新の変更を取り込む用として、作業開始時には必ずpullを実行するとよいでしょう。

git pull


pull

・git branch  存在するブランチ、選択中のブランチを確認する
存在するブランチを表示します。選択中のブランチに*印がつきます。

* develop
  master


branch

SourceTreeでは選択中のブランチが太字表示されます。


git checkout -b {branch_name}

4. 3で作成したdevelopブランチから作業用のブランチ(feat/new-menu, fix/tap-timingなど)を作成(**git checkout -b)し、作業用のブランチを作成します。なお、現在選択中のブランチから作成されます。
1機能ごとにブランチを作成すること、機能追加には[feat/]、修正には[fix/]という接頭辞をつけることといったルールを設けています。

git checkout -b feat/new-menu


chekout-b

上部のBranchボタンを押して作成します。


git add {file or directory}, git commit -m "{Comment Message}"

5. 作業した内容を確定(**git add, git commit)する
git addでコミットするファイル・ディレクトリを選択した後、作業内容を記録するためにコミットします。コミットの単位は同一アクションごとにするとよいでしょう。SVNと違いこの時点ではリモートのソースコードには反映されません。あとで変更したり、削除したり、合体させたりできるのでどんどんとコミットできます。

git add ./git commit -m "Insert the new game icon. refs #1234"


commit

[Stage file]を押してコミットする内容を選択したあと、[commit]ボタンを押します。


git pull --rebase {repository} {branch}

6. 他の人が修正し、共有リポジトリに加えられた変更を作業用ブランチに取り込む(**git pull --rebase)
コミットが終わったのでリモートにプッシュしたいところですが、その前に最新の状態を取り込みます。--rebaseオプションを付けることによりdevelopブランチの履歴を保ったまま、その後に自らのコミット内容を追加できます。

git pull --rebase upstream develop


rebase

[Rebase instead og Merge]にチェックを入れます。

branch_rebase

rebaseすると、developブランチの変更を取り込んだ後、feat/fixブランチの変更内容を追加することができます。


git push {repository} {local_branch}:{remote_branch}

7. 作業したブランチを自分のアカウント内に複製する(**git push)
コミットした作業内容をリモートに反映させます。ここではPull Requestをするために自分のアカウントに反映させます。

git push origin feat/new-menu:feat/new-menugit push

clone元にpushするため、{repository} {local_branch}:{remote_branch}は省略することも可能です。

push

pushするブランチを選択します。


Pull Request

8. 作業したブランチの変更内容を「*Pull Request」し、コードレビューしてもらう
作業完了し、自分のアカウント内(origin)にpushしたブランチを共有リポジトリ(upstream)にPull Requestし、コードレビューをしてもらいます。実際のプロジェクトでは「自分以外の誰か」がチェックすることにして、クオリティをアップさせています。

Pull Requestを送る際は、リクエスト先が正しいか、ブランチ名が適切か、コミットメッセージが適切か、コミット単位がきちんと作業ごとに分けられているかを確認し、見る人にとって見やすいPull Requestにするように心がけます。

行単位でコメントすることができ便利です。ここでわかりにくい内容を解説したり、疑問点を議論することもよくあります。


git merge --no-ff {branch}

9. 変更内容に問題がないことを確認し、共有リポジトリ(ameba)のmasterブランチに取り込む(**git merge)
作業が完了したブランチ(ここではreleaseブランチ)をmasterブランチにマージします。この際、--no-ffオプションを付けると各ブランチでの作業がわかりやすくなります。
なお、実際のプロジェクトではこの作業をjenkins Jobにし、自動化しています。

merge

--no-ffオプションをつけると、必ずマージコミットを作成します。こうすることでそれぞれのブランチが独立し、修正内容を追いやすくなります。


おまけ (サンプルを使った予行練習)
Git導入の際、フロントエンジニアからは「なんか怖い」といった声が上がりました。Gitはあくまでツールであるため、一連の流れさえ覚えてしまえば問題ないので、あらかじめ以下のような予行練習をしました。

Mission 1 間違った名前を書き換える

まず最初に、メンバーの各自、自分の名前を正すミッションをこなしました。
ここでは、共有リポジトリからForkし、ローカルへclone、作業ブランチで作業し、Pull Requestするまでの流れを体験します。Pull RequestはMission 作成者(Gitに詳しい人)が行うとよいでしょう。
原 二成
烏山 幸佑
渡邉 美田紀


Mission 2 名前にローマ字表記を追加する

次に、自分の名前の横にローマ字表記を追加します。Mission 1の復習を兼ねています。ここではPull Requestを受ける練習もします。自分の下にある人のPull Requestを受けるルールにします。

原 一成 (hara_kazunari)
烏山 幸佑
渡邉 美田紀


Mission 3 項目を追加する (コンフリクトを解決する)

最後に、自分の名前の下にtwitter ユーザー名を追加します。改行が入るため、コンフリクトが発生する可能性が高くなり、それを解決してPull Requestを送らなくてはなりません。より実践に近い内容になります。

原 一成 (hara_kazunari)
* @herablog
烏山 幸佑
渡邉 美田紀



簡単なまとめになりましたが、いかがでしたでしょうか。
まだまだたくさんの機能や使い方がありますが、基本的には上記の内容を理解すると、ある程度使えるようになると思います。

AmebaではGit + GitHubを取り入れることにより作業スピード、品質共に向上させることができました。とても優れたプロダクトだと思いますので、ぜひ取り入れてみてください。
その際の参考になれば嬉しいです!

はじめまして。漆原と申します。
現在、アメーバピグ コンテンツグループのデザイナーとして、機能開発兼アイテムイラストのクオリティ管理を担当しております。
今回は、今年で5年目に突入したアメーバピグにおいて、『アバターアイテムがどのように進化しているのか?』というところを、リリース当初のアイテムと現在のアイテムを比較しながらご紹介させて頂きます。

各アイテムトレンドの流れ

・きせかえ


リリース当初は汎用的にコーディネート出来るシンプルなアイテムが求められました。トップスなら三つボタンのジャケットやチェックのワンピース、パンツならジーンズ、のような形で、カテゴリごとのアイテムもオーソドックスな視点のものが多かったです。
アイテムごとの形が明確に見えるものが好まれたため、色相や明度のメリハリが比較的強めになる傾向がありました。

最近では、ユーザー層も幅広くなり、以前より個性がはっきりとしたアイテムが求められます。
右上のイラストの様に、髪型や小物使いなど、ポイントとなるアイテムを取り入れる事で個性を引き出しています。
また、人気のあるシリーズは各アイテムをコーディネートした際、シルエットが豊かに見えるものが多いという事がわかってきました。
その流れから、コーディネートした時の統一感を出し易くする為、色やメリハリは以前より控え、柔らかいトーンで構成し、髪の毛に自然な動きを付けたり、素材の厚みや質感など細かいニュアンスを丁寧にシルエットに反映させることで、完成度を高めています。

・家具


家具もリリース当初はシンプルなテーマのアイテムがほとんどでした。
部屋の中に自然ととけ込むような家具が多かったのですが、部屋を拡張できるようになり、もようがえ出来る範囲が広がっていく中で、楽しみ方も広がり、家具も様々な進化を必要としてきました。

最近では、メルヘン系、ストリート系、ナチュラル系などなど、テーマもかなり幅広くなり、階段機能が付いたツリーハウスのような大型の家具や、アニメーションを楽しめる家具など、飾りつけだけではない楽しみ方が出来るアイテムも増えています。

・コスメ


ピグの特徴として、パーツの中で一番目立つのが顔周りです。初期から簡単なメイクは出来たのですが、昨年コスメ機能がリリースされてから、一気にピグの表情が豊かになりました。
最近では、引き続き人気のカラコンに新作が追加され、更に個性が引き出せる様になりました。

広がる表現の幅


今年、お外機能がリリースされてから更にアイテムの楽しみ方が広がっています。
上のイラストにある様に、以前はお部屋の中に合わせるアイテムだけでしたが、お外を飾れる様になり、空やアパルトマン風の建物、カフェ風の庭など、以前にも増して臨場感のある飾り付けが出来る様になりました。
今後はお外アイテムの拡充をはじめ、お部屋の中も更に楽しめるような企画を考えています。

まとめ

いかがだったでしょうか?ピグもリリース当初から比べるとかなり楽しめる機能が増え、それに伴いアイテムも日々進化しています。これからも、トレンドを読み取りながら表現の幅が広がるアイテムを制作していきますので、引き続き、アメーバピグをよろしくお願いします!
ありがとうございました。
はじめまして、パシャオクのデザインを担当している今尾と申します。
今回は、UI設計や表現の話ではなく、プロジェクト進行における効率化の一環として

・次々に打ち出される改善施策へのスピーディな対応
・デベロッパーとのスムーズなデザインファイル共有
・新参スタッフや後任者へのスムーズなデザイン作業移管

などのために、パシャオクでテスト的に実践しているデザイン管理の方法をご紹介したいと思います。

ページの構成とスピーディーなデザイン改善

Amebaのいくつかのサービスと同様に、パシャオクの各ページも、
複数の異なる情報群にユーザーが効率的に接触できる場にすることと、回遊性の向上を目的に
ひとつのストリームラインを複数の「モデュール」で構成しているポータル的なつくりが
ページ設計のひとつの特徴になっています。

またパシャオクはオークションというサービスの性質上、キーワード検索やカテゴリ検索、
出品/入札/落札管理など機能的なモデュールが非常に多く存在します。

フィード


「ユーザー視点」という鉄則のもと、ユーザーの行動を綿密に想定し、
最適なコンテンツ構成を考慮した上で、ページがプランニングされているわけですが、
みなさんもご存知のとおり、緻密に設計したそれらも、
サービスを運用していくことで、次々とスピーディな改変を求められます。

抜本的な改革に踏み切る、いわゆる「ダカイゼン」は別として、
それら「カイゼン」は主に部分的なモデュールに対しての改修や、
モデュールの抜き差しによるページ構成の再編などが中心となります。

改善例


モデュール単位でのデザイン管理

そこでパシャオクでは、キャンペーンや特集用などの企画系ページ以外は
ページごとでデザインファイルを管理せず、機能単位で別けた
モデュール単位での管理を行っています。

ファイル管理


もちろん初期設計や大幅な構成の見直しの際は、全体の文脈の整合性などを考慮する上でも、
ページ単位でのデザインを行いますが、
以降の改修やアレンジメントは各モデュール単位のファイルに対してデザインの
アップデートを行っていきます。

複数コンテンツや機能が混在しているため、比較的大きく(長く)なりがちな
それぞれのページファイルを、部分的な改修のために開いて作業を行うよりも
予めモデュールごとに細分化したデザインファイルに対して作業を行う方が、
効率的だと考えたためです。

また、多くの場合、複数ページにまたがって使用している回遊施策のためのモデュールも
ワンソース管理ができるので、ページごとの新旧混在や先祖返りを回避すること
にもつながるためです。

ディベロッパーへのファイルの受け渡し

デベロッパーとのファイルの受け渡しも
ナンバリングしたモデュールごとのデザインファイルと、
それらが他のどのモデュールとどういった順序で組み合わさりページを構成するのかを記した、
設計図としての簡易構成書を共有ファイルとすることで、
従来のページ単位をベースとした重く複雑なファイルをやりとりするよりも、
格段にスムーズになります。

各モデュールファイルにレイアウトガイドなどのデザインガイドラインを
記述すれば、別でデザインガイドラインを用意することなく、
レイアウト指示などを行うこともでき、デベロッパーの実装に役立つ他、
全容を熟知していない新参メンバーも、スピーディに改修作業に取り組めます。

モデュールリスト



以上、
あくまでも現段階ではまだテスト的に行っている取り組みですが、
ご参考程度にしていただければと思います。

フロントエンドエンジニアの谷です。

本記事ではGoogle Chromeの開発者ツール、Chrome DevToolsを使いこなすために参考になるサイト、ページの紹介をします。

すでに多くのフロントエンドエンジニアが開発で使っているかもしれませんが、「要素のインスペクタなどの基本的な機能しか使っていない」「UA切り替えくらいしかつかってない」というような方や、そもそもほとんど使ったことがない、という方もこれらを参考にフロントエンド開発を効率化していきましょう!

基本的な使い方

Chrome DevTools Overview

基本はやはり公式ドキュメント。基本機能や各パネルの使い方 + ちょっとした小技なども紹介されています。ショートカットの説明もあるので合わせて覚えたいですね。

Discover DevTools

Code Schoolというオンライン学習のWebサービスのいちコンテンツ。Google監修で、より詳しく正しいです。この後でも紹介する、デバッグ、パフォーマンス分析といったところの方法も解説しながら、実際に簡単なトレーニングもおこなうことができます。なんと無料。

JavaScript開発、パフォーマンス・チューニング

JavaScriptデバッグ

JavaScriptまたはHTML/CSSのデバッグの基本について解説しているページ。Chrome DevToolsに限らず、Firefox+Firebugなど他のブラウザの開発者ツールでも使える方法も含まれます。 貴重な日本語リソースでは、吉川さんのこちらのスライドが秀逸。このスライドでは主にSources、Timeline、Profilesパネルについて解説しています。 Canvasのデバッグについての紹介も。 CoffeeScriptやTypeScriptや、Sassといったプリプロセッサによる開発、またはClosure CompilerやYUI Compressorなどのコードの圧縮によって、開発上の触るコードとの差が生まれ、デバッグが難しいということがあります。

それを解決するためのSourceMapという機能(オリジナルのコードと、コンパイル・圧縮後のファイルとひもづけるファイル)があり、それを介してDevToolsでもデバッグを容易にすることができます。下記はDevToolsで使うための方法について。

パフォーマンス・チューニング

DevToolsによるパフォーマンス・チューニング、主にネットワーク系のチューニングについては、Ilya Grigorik氏のこちらのスライド。 中に登場するHARについては彼のブログでも解説されている。ページ内で紹介されている動画もチェックしよう。 AirBnBという自宅や余った部屋を他人・旅行者に貸出するのを仲介するという世界的に人気のあるサービスがあり、その開発者によるパフォーマンス・チューニングの話。どのように最適化していったかというプロセスなどが見られるので必見。 メモリについての解析、チューニングについて。 ネットワークだけでなく、ペイント(描画)のチューニングについても今はフォーカスされています。そのための手法など。

リモートデバッグ

Chrome for Androidでデバッグ

Google Playで配布されているChrome for Androidを通じてデバッグすることができます。利用するためには、Chrome for Androidの他にAndroid SDKのインストールも必要です。あとは実機にUSB接続、設定を進めれば可能になります。 [追記:2013/10/10]
@agektmrさんより、後述のCanaryバージョンであればSDK不要で、接続してchrome://inspectを開けばデバッグできるようです。安定版でも可能になるのが楽しみですね。情報ありがとうございます!

また安定版でもChrome ExtensionのADBを使えば、安定版でもSDK無しでデバッグ可能です。@t32kさんありがとうございます!

iOS Mobile Safariでデバッグ

GoogleがGithubで公開しているiOS WebKit Debug Proxyを使えば、iOSシミュレータやUSB接続した実機端末でのデバッグができます。iOS WebKit Debug ProxyはHomebrewを使ってインストールができます。

試験的な機能を使う

Google Chrome Canary

Google Chrome Canaryは安定版として提供される前に、開発者向けの機能が試験的に実装されるバージョンのGoogle Chromeです。ほぼ毎日更新され、新しい機能やUIをいち早く試すことができるのですが、不安定でもあるため、バグによって操作できなくなるということもあります。ただ安定版のものとは別でインストール、起動できるので、Canaryの影響で安定版が動かなくなるということは基本的にありません。

開発者としては新しい機能に触れられるのは興味深いことですし、インストールして置いて損はないかとおもいます。

なんと今回紹介したGoogle Chrome + DevToolsに関わる開発者がサイバーエージェントにやってくる!

2013年10月30日(水)当社主催の技術セミナー「Frontrend(フロントレンド)」にて、Google本社からゲストスピーカー(Paul Irish、Addy Osmani、Jake Archibald)を招き、Chromeをテーマにしたイベント「Frontrend x Chrome Tech Talk Night Extended」を開催します!

DevToolsや周辺ツールを使っていかに開発効率をあげるか、ウェブ開発におけるパフォーマンス最適化などのトピックについて、世界を代表する開発者である彼らから聞けるのは本当に貴重ですので、ぜひ皆さんご参加ください!


※残席残り僅かです。

あなたの欲しい機能が実装されるかも?

イベントのあとには懇親会もあるので、すでにDevToolsを使いこなしている人も、今回の記事をみて使い始めた人も、彼らに欲しい機能を要望すれば、それが実装されるかもしれません。当日までにDevToolsをどんどん使いましょう。

最後まで記事をお読みいただきありがとうございました、またイベントに参加される方は会場でお会いしましょう。
皆さん初めまして!
2013年度新卒ディベロッパーのスエ@sueと申します。
私は現在、スマートフォン向けブラウザゲーム「ペコロッジ」を開発しています。

今日はそのペコロッジで主に使用しているスマートフォン向けJavascriptライブラリ tofu.jsをテーマにお話したいと思います。

 tofu.jsってなんか聞いたことあるな?って感じたあなた。はい、そうです。以前、同じく2013年度新卒デベロッパーのチャーリー@charlie10151015がtofu.jsの特徴について説明してくれました。(「 スマートフォン向けJavascript tofu.js 」参照)今回はこのtofu.jsを用いたスマートフォンのデバイス対応について焦点をあてて説明していきたいと思います!

デバイスのレンダリング性能の差異

ブラウザのレンダリング性能の特徴はスマートフォンの機種やバージョンによって様々です。例えばあるAndroid端末の場合、Android2.x系はDOMのレンダリングが致命的に遅いという特徴があります。Android4.x系ではDOMのレンダリングが大幅に改善されましたが、しかし今度は逆にCanvasの描画が遅い、といった具合に同じAndroidでもバージョンによってレンダリング能力は様々です。
 
以下にiOSとAndroidの主要バージョンのレンダリング性能を簡単にまとめてみました。

 このように機種やOSのバージョンによってレンダリング能力は全く異なるため、一つ一つ対応していては大変な開発工数をとられてしまいます。 そこでtofu.jsでは1行で描画の制御ををCanvas,DOMに切り替えることを可能にしています。こちらの記事でも紹介していますので詳細はそちらを御覧ください。

それでは実際にどれくらい描画速度が変わるのかベンチマークをとって確認してみましょう。

ベンチマークテスト


 複数のオブジェクトの「角度・スケール・透明度・座標」に対するアニメーションを同時に処理します。オブジェクト数を増やしていき最大FPSが20以下になったときのオブジェクト数をベンチマークとしました。

http://suemasa.me/test


tofu.jsはFPSが著しく下がった場合、描画をスキップする機能も搭載されているため、今回その機能は外しています。
iOS,Androidを含む5種類の端末を試した結果、以下のような結果となりました。オブジェクト数が0となっているものはそもそも動作が困難だったものになります。


上図より、描画モードによってその性能が大きく変化しているのがわかります。またバージョンが同じでも機種が異なるとその特徴も変わってきます。
このように、デバイスの特徴にあわせて描画モードを選択することで大幅な速度改善が可能になります。tofu.jsでは、この描画モードを簡単に切り替えることができるため、大幅に開発コストを格段に下げることができ、またこのようなテストを経て、デバイスに最適な描画方法を容易に選び取ることができます。

webGLを利用したレンダリング

先ほどの結果ではcanvasモード,htmlモードどちらを用いても、たかだか50~100個のオブジェクトを同時に動かしだだけでFPSが20を下回りました。またオブジェクト数が増えた場合、再描画範囲を限定するというtofu.jsの強みも生かせません。

そこで現在新規開発中の一部のブラウザゲームではGPUを活用できるwebGLを利用することにより、アニメーションの高速化を試みています。webGLはもともと3次元コンピュータグラフィックスをブラウザで実現させるためのものでしたが、2Dでもその威力を発揮します。
 webGLは現状スマフォでは、Androidの一部端末でしか対応されていませんが、このwebGLを用いることで、CanvasやDOMによる描画処理が重いアニメーションも容易に処理することができます。今回はこのwebGLを利用したjavascriptライブラリPixi.jsを用いて再度同じ方法でベンチマークを取ってみました。

0となっているものは、非対応機種になります。
先ほどの結果と比べて格段に性能が向上していることが分かります。webGLは依然実装されているスマフォは少ないままですが、このままwebGLが普及していけばスマフォブラウザでネイティブと同等のアニメーションも可能になるんじゃないでしょうか。

まとめ

最後までお付き合い頂きありがとうございました!今回はスマートフォンの描画性能についてお話しました。
端末の性能の差異は常々私達webデベロッパーを悩ましている問題ですが、私達は新しい技術をどんどん取り入れることで、全ての端末で快適な動作を提供することを目指しています。ペコロッジではこの他にもユーザにストレスを与えないための工夫を凝らしています。次回はそちらにも触れられればと思います。

皆さんも是非ペコロッジで遊んでみてね♪


参考資料

tofu.js
pixi.js
ベンチマーク:suemasa.me/test

こんにちは。
以前「Three.jsとBlenderによるWebGL」という記事を書かせて頂いた、
html5、javascript、flashなどのクライアント開発をメインに担当しております、
菅家(@KA_ka_YY)と申します。

6月にリリースした担当プロジェクトにおいて、
数字やアイコンをカスタマイズしたWebフォントとして作成し、使用しました。
Webフォントは非常に使い勝手がいいのと、カスタムフォントを作るのに
非常に便利なソフトを見つけたので紹介させていただきたいと思います。

Webフォントのメリット

  • ベクター形式なので拡大縮小による劣化がない
    フォントデータはベクターデータです。
    つまりスマホ開発においてretio別に画像を切り出したりする必要がない!

  • 制御のしやすさ
    html上で指定文字を記述するだけ。デコレーションもcssによってある程度行える。
    陰、グラデーションなど

  • 容量比較 :画像フォントと比較した場合
    Webフォントの場合
    プロジェクトで使用したフォント数は31文字で、容量8KB!
    画像文字の場合
    圧縮と減色ツールを用いて9KB
    (※ファイル容量は差がないのですが、
    画像だとさらに制御用jsおよびcssファイルを読み込む必要があるので、
    トータルだとWebフォントの方が軽かったりします。)
    また、フォントを色別けしたい場合などは、画像の場合 色の分だけ
    書き出さなければならないが、Webフォントだとstyleの色指定のみで済む

  • 更新性が高い
    もしどこか1文字に変更があったとしても、Webフォントなら フォントを変更するだけで、カーニング調整など自動でしてくれる。画像だと変更文字の幅が変わると、他の文字マップ情報に影響が出てくる。つまり単色系ならWebフォントを使用した方が圧倒的に便利!

Webフォントのデメリット

  • cssによるテキストへのグラデーションなどフィルタースタイル系はPCやiOS6以上でないとできない。Androidは未対応。

  • cssによるshadowを大量にかけてアニメーションをさせると処理落ちが目立ってしまう。つまりディティールの凝った装飾には向いてない。

  • 著作権に注意!
    手元にあるテキストフォントデータの一部を抜き出して使用する場合、
    いくら画像書き出し用としてフォントの使用権を買っていたとしても、
    カスタムWebフォントとして使用する場合は著作権に引っかかる可能性があります!
    規約をよく確認の上使用することをおすすめします。
    なるべく、オリジナルフォントを作成して使用することをおすすめします。

CSSでのWebフォント指定方法

cssでのWebフォント指定方法は、検索すれば大量にでてきますが一応のせておきます。

@font-face {
font-family: 'myfont';
font-style: normal;
url("myfont.woff") format('woff'),
url("myfont.otf") format('opentype');
}
.myfont {
font-family: 'myfont';
color: #f00;
}

カスタムフォントの作り方

「OTEdit」という有償ソフトを使用した作成方法となります。
http://opentype.jp/oteditmac.htm

作成の流れ
  1. イラレで1000×1000でフォントを作成し、SVG書き出し
  2. OTEditで任意の文字を選び、SVGをインポート!
  3. サブセットフォントメーカーにて任意の文字を指定し書き出し!以上!

では詳細を以下にのせておきます。
「龍」という文字を打つと龍のイラストになるオリジナルフォントを作成したいと思います。
  1. イラレで1000×1000でフォントを作成し、SVG書き出し
    $1 pixel|サイバーエージェント公式クリエイターズブログ-龍

  2. OTEditで任意の文字を選び、SVGをインポート!
    • OTEditを立ち上げ、新規作成
      $1 pixel|サイバーエージェント公式クリエイターズブログ-新規作成

    • オリジナルのフォントの書体名やコピーライトを入力
      $1 pixel|サイバーエージェント公式クリエイターズブログ-書体詳細

    • まっさらな正方形のウインドウが出てきますので、 ウインドウ上部にある「A」をクリックし、「龍」と打ち込んでOKを押して下さい。
      $1 pixel|サイバーエージェント公式クリエイターズブログ-編集文字選択

    • すると「龍」という文字の編集ウインドウが開いたと思います。 そうしましたら、先ほど書き出したSVGをインポートしましょう。
      $1 pixel|サイバーエージェント公式クリエイターズブログ-インポート

    • インポート完了!
      $1 pixel|サイバーエージェント公式クリエイターズブログ-龍フォント

    • この状態で保存しましょう。ここでは名前「ryuFont.otf」にしておきます。これでオリジナルフォントは完成し、もう使えるのですが、ファイル容量が大きいです。238KBもあります。

  3. サブセットフォントメーカーにて任意の文字を指定し書き出し
    容量が大きいのは、「龍」以外の文字の余分なデータがあるためです。 そこで「サブセットフォントメーカー」(フリー)というアプリを用いてこのフォントの中身を「龍」という文字のみにしたいと思います。

    $1 pixel|サイバーエージェント公式クリエイターズブログ-サブセットフォントメーカー

    「作成開始」を押しましょう。
    完成です!! 4KB!!

    さらに「作成終了後、WOFFコンバータを起動するに」チェックをすれば
    「作成開始」ボタンと同時にwoff形式の軽量フォントを一緒に書き出してくれます。

    ちなみに上でも書きましたがプロジェクトで使用しているフォントは31文字で8KBです。

カスタムフォントの応用一例

カスタムWebフォントにアニメーションをかけたサンプルを作りました。
是非スマホで確認してみて下さい。
http://kf-plvs-vltra.com/sample_webfont.html

使用ソフト

  • OTEdit (シェアウェア:1ライセンスにつき¥12,000)
    http://opentype.jp/oteditmac.htm

  • サブセットフォントメーカー
    http://opentype.jp/subsetfontmk.htm

  • まとめ

    ほぼ、メリット、デメリットに書いた通りですが、
    1. retioごとに画像を書き出したりする必要がない
    2. 更新性が高い
    3. 制御しやすい
    4. グラデはまだ無理
    5. 過度なアニメーション処理に弱い
    6. 著作権に注意!
    です。

    また、フォントのフォーマットはWOFF・TTF・EOT・SVG などがあります。Webフォントとしての普及率はWOFFが最も高く軽量です、今後主流になるでしょうが、 僕がスマホの実機で調べた所、WOFFはAndroid2.2以下で表示されませんでした。 そのため「woff」と「otf」の2つを指定しておいた方がいいでしょう。

    参考文献

    みなさんはじめまして!
    2013年度新卒入社デザイナーの横尾麻衣と申します。
    Ameba事業本部でJKJC向けコミュニティサービスCandyのデザインを担当しております。

    今回は社内で行われた、ママ事業部主催のママブログデザインコンペに参加した際のデザイン行程や、制作時の工夫についてをお話したいと思います。

    はじめに:ママブログデザインって!?


    私が参加する事になったのは、今年新設されたママ事業部の、アメブロでママがつながるコミュニティ『Ameba ママブロ』内で使用するブログデザインの社内コンぺです。
    お題はずばり、ママに刺さるブログデザインの制作!

    最初にぶち当たった壁はズバリ「ママ!」でした。

    お題は「ママ」ですが、私はママではないので、ママ達が好むデザインがわかりません。
    「ママ」というターゲットは、一口に言ってもその層はものすごく広く、年代や趣味によって様々な系統のママが居ます。

    そこでまず私が始めたのは、”ママのイメージ調査”です。
    調査のためにこんな所からリサーチをかけてみました。

    ・ママ雑誌をかたっぱしから読んでみる
    ・アメブロを利用しているママ達のブログを読んでみる
    ・ママの友達からヒアリングしてみる

    その結果、

    ・ママ達自身すごくお洒落な方が多い
    ・最近の子供服やおもちゃなどもすごく可愛いものが多い
    ・子供に着せる服や小物、子供部屋のインテリアにもかなりこだわりがある
    ・子供らしく、赤ちゃんのような淡くやさしい色合いを好む
    ・ふんわりとした可愛いものを好む

    という事がわかりました。

    次はコンセプトの決定

    ママの好むものを自分なりに調査したら、次はコンセプトの決定です。
    コンセプトを決めるには「○○な人には○○が受けるだろう!」という仮説を立てる必要がありました。

    そこで今回私は「ペルソナの設定」にこんなママを想定してみました。

    「4歳と0歳の子供が居る、にぎやかで元気なママ」

    このママをペルソナにした理由は、以下の3点です。

    ・アメブロを利用しているママの年代に多いのが20~30代。
    ・一人のママに対して年齢の離れた、4歳と0歳の2人の子供を設定する事で、育児の年齢層が広がり、より広いママ層に刺さるデザインができると思った為。
    ・自分と同じ状況のママ同士でブログやSNSからコミュニティを形成していく傾向があり、そこからリアルのママコミュニティも発生しているため。


    ◎キーワード

    次は設定したペルソナからデザインイメージのキーワードを設定します。

    ・可愛い
    ・ポップ
    ・にぎやか
    ・子供らしい

    など、全体の雰囲気の最適な落としどころを言葉で表現します。
    (たくさん出しすぎずにある程度の数に絞ったほうが後々迷わないです)

    ◎ムードボード

    キーワードの次は、上記のキーワードから、漠然としたデザインイメージを明確にさせるためにムードボードを作成します。
    ムードボードを作成することで、頭の中にある制作前のあやふやなイメージを見える形にし、色合いやモチーフ、デザイン全体の世界観を固めることができます。
    (ムードボードをしっかり作成しておかないと、デザインの方向性で迷った時に戻るものがないため、ここでしっかりイメージを固める必要があります)

    デザイン制作の流れ

    ムードボードができたら、ようやくデザインにとりかかります。
    ここからの流れとしては
    「ラフの作成」→「イラストの作成」→「配置」→「最終調整」となります。
    (正直、この道のりは長かったです)

    ◎ラフの作成

    ムードボードからブログの全体イメージが固まったらラフを描きます。
    ラフができたら、パーツに使用するモチーフや、大きさのバランスなどを決定していきます。

    ラフを作成する上で気をつけた点は、モチーフを決める段階であれも可愛い、コレも可愛い!と色々要素を盛り込みすぎて、ヘッダーがごちゃつくのを防ぐ為に、パーツ1つ1つの大きさの微妙なバランスと、メインのパーツとサブのパーツのメリハリに注意しながら作成しました。

    メインパーツは上から掛かっているカラフルなフラッグガーランドと、ヒヨコです。
    サブパーツは賑やかしとして使うので、ボタンと糸巻きで全体のバランスを補う為にメインパーツよりも小さめに、点々と配置しています。ラフの段階では割と大まかに進めます。


    ◎イラスト作成

    カンプ(デザイン案)を作成したら、次はイラスト制作に入ります。
    制作中に構想がぶれないように、ムードボードのイメージを参考にしながら、全体の雰囲気に合ったイラストを描いていきます。

    今回のスキンはヘッダーで子供部屋を表現したかったので、楽しげで可愛いフラッグガーランドや、コロコロとしたボタンで子供らしさを表現し、ステッチやアップリケなどの手芸っぽさでお母さんらしさを表現しました。

    イラストを作成する時に注意した点は、なるべく作り込まずに単純なカタチでつくりました。
    特に賑やかしで使用するボタンは、[1]パスで丸を作る→[2]更に小さい丸を二つ作る→[3]パスを型抜きしてボタン穴を作るという、これだけの作業で完成するので、これを複製して色・柄違いで量産すると、簡単なのに可愛いボタンがいっぱいできます。

    私は凝ったイラストが描けないので、毎回パスで簡単に作れるイラストを多様しています。この手法だと時間短縮になりますし、今回は単純なカタチにするほど子供らしさも出てくるので、全体の雰囲気をぐっとコンセプトに近づける事ができました。


    ◎配置と最終調整

    イラストが完成したら、メインに見せたいパーツなど優先順位を付けながら、全体の位置や使用するカラーのバランスを見てを調整しながらパーツを配置していきます。

    ・パーツのバランスの調整
    ラフの時点で「ココにこんなのを置こう!」と決めた配置にイラストを置き、全体のバランスを見てパーツを足したり引いたりしてきます。
    だいたいのパーツを置き終えたら、そこから微妙な大きさの調節に入ります。
    パーツの大きさがちょっとでも大きすぎたり、小さすぎたりするとかなり印象が変わってくるので、何度もチェックを重ねて、「コレだ!」という時が来るまで執念で調整し続けます。

    ・質感の調整
    ママ向けという事で、ヘッダーにあわせて、カラムにも布のような柔らかい質感を表現するためにいくつか工夫をいれました。
    大きなポイントとしてはヘッダーに使用したボタンのアイコンを配置することで全体に統一感を出しました。

    ・カラーの調整
    パーツを並べ、最後は全体のカラーを違和感がないように調整します。
    今回は背景に使用した淡い黄色をキーカラーとして全体を元気で明るい印象でまとめました。
    なるべく賑やかな印象にしたかったので、カラフルな色を使いつつも、散漫にさせない為に淡すぎず、ビビットすぎない絶妙なトーンで調整しています。
    イラストのカタチが単純なので、単色だと寂しい印象にになってしまう為、賑やかしに使うものにはドットやチェックなどの可愛い柄を入れて、更に賑やかさをアップさせることも意識しました。

    ここまできて、やっと完成です!


    ママに刺さるデザインの工夫

    ◎意識した点

    このブログデザインを見る度に、赤ちゃんや子供を見た時のような、ぱっと明るく、やさしい気持ちになれる色使いを心がけました。
    子供にも分かりやすい鳥やボタン等のモチーフを使用し、ママだけではなく子供も見て可愛いと思えるデザインにしています。
    毎日ブログを書くのが楽しくなり、親子の楽しい生活をブログで綴ってほしいなと考えながら制作しました。

    ◎工夫した点

    はじめてのブログデザイン制作で、しかも自分とは状況の違うターゲットに対してのデザインだったので、まずはそこから難題でした。
    自分一人ではわからない事だらけだったので、先輩にこまめにチェックをしていただいたり、ブラッシュアップの為に同期を捕まえてデザインレビューを行ったりしました。
    デザインレビューでは、コンペに参加している同期の進捗チェックもしつつ、

    ・実装可能か
    ・コンセプトからぶれていないか
    ・デザインとして美しいか

    をポイントに意見交換を行いました。

    コンペ参加者はライバル同士でもありますが、沢山のママたちに使ってほしいという気持ちは一緒なので、みんなで協力してブラッシュアップを行いました。
    これからアルバイトなどでデザインを始める方は、ぜひいろいろな人に意見をもらってみてください。
    一人では気づかない事がたくさん見えてくると思います。



    おわりに

    最後までお読みいただきありがとうございます。
    ママブログのブログデザインということでまさに未知へのチャレンジ、すごく大変でした。
    でも、その大変さを上回る収穫がたくさんありました。

    今回私はこのコンペで最優秀賞を頂き、私の案を2案も採用していただく事ができましたが、私以外の同期の採用案6つも本当に素晴らしく、自分にはこの発想はなかったな、と思うものばかりでした。
    リリースしたてなので、是非私たちが心を込めて作ったブログデザインを沢山のママに使って頂き、素敵なブログを書いて頂きたいと思っています!
    ママブロ限定ブログデザインは続々公開中です♪是非チェックしてみてください!

    Amebaのママ向けサービスをよろしくおねがいします♪ 


    【Ameba mama+(ママプラス)】
    Ameba発 ニュースやブログで育児情報・ママ友がたくさんみつかる情報サイト
    http://r.ca-mpr.jp/s/925/?i4a=86


    私がデザインを担当している、Candyも是非よろしくお願いします♪

    【Candy by Ameba】
    1番かわいいガールズブログ&プロフ
    http://candy.am/

    はじめまして。
    サイバーエージェント教育事業、通年インターンシップ担当の松山です。

    夏のインターンシップを通して、
    更なる挑戦をしたいとお考えの学生の皆様へ。
    サイバーエージェント通年インターンシップのご紹介です!

    1 pixel|サイバーエージェント公式クリエイターズブログ
    サイバーエージェントではこの夏より、
    「小学生向けプログラミング教育事業」を開始しました。

    この事業では、既に数百名もの小学生たちに
    プログラミングを教えています。
    ですが、まだ立ち上がったばかり。

    これから数千名、数万名の子ども達にプログラミング教育を届けるため、
    小学生たちの未来を切り開く、優秀な技術者たちの力が必要です。

    日本でも 世界でも注目を浴びているプログラミング教育。
    「新しい産業を自らの手で創り上げ、教育業界のリーダーになる」
    そんな想いを持った人材の募集を開始します。

    インターンシップの特徴

    サイバーエージェントの小学生向けプログラミング教育事業の
    立ち上げメンバーとして、教材の制作や、
    教員として実際に子どもたちへプログラミングを教える活動等を
    行っていただきます。

    1 pixel|サイバーエージェント公式クリエイターズブログ
    教材は例えばサイトデザインや、アプリのUI/UX、ゲームのイラスト制作など、
    教える内容に合わせて様々なものがあるため、
    現場で使われる実際のクリエイティブ制作にチャレンジしていただきます。
    また、子どもたちへ教える過程を通して、
    今まで身につけられなかった高いスキルの習得を目指す、
    実践型のインターンシップです。

    小学生へのプログラミング教育を行うための各種研修もご用意

    「プログラミング教育」というと、
    プログラミングに自信が無いので…という方もいらっしゃるかと思います。
    ですが、当インターンシップでは、子どもに教えるために必要な
    スキルアップの研修やコミュニケーションのための研修を用意しています。

    1 pixel|サイバーエージェント公式クリエイターズブログ
    プログラミングの勉強をしたい、
    コーディングのスキルを身につけたい、など
    デザインだけでなく更なるスキルアップを目指したいという方にも
    チャレンジしてほしいと思います。

    インターンシップ詳細

    ◆日程
    各種業務やイベント・スクール授業の開催等、
    スケジュールに合わせての参加が可能です。
    ※インターンシップスタートは2013年10月からとなります

    ◆給与
    ・時給1,000円
    ・交通費全額支給
    ※研修期間においては、報酬はなしとさせていただきます

    ◆参加特典
    ・サイバーエージェント新卒採用本選考において、
     選考プロセスを一部免除
    ・優秀者は教育事業を行うサイバーエージェント連結子会社の
     CA Tech Kidsにて幹部メンバーとして登用

    ◆募集対象
    ・四年制大学・大学院生 全学年対象
    (※大学1年生・2年生の応募も歓迎いたします。)

    ◆募集人数
    10名程度

    ◆応募
    締め切り:9月20日(金)

    詳細▼
    http://www.cyberagent.co.jp/recruit/fresh/internship_fullyear/

    エントリーはこちらから▼
    1 pixel|サイバーエージェント公式クリエイターズブログ

    皆様のチャレンジ、お待ちしております!

    1 pixel|サイバーエージェント公式クリエイターズブログ
    みなさんこんにちは!
    現在ブラウザベースの新規ゲームの立ち上げをしています、2013年入社のチャーリー@charlie10151015です!
    主にフロント側をメインにJavaScriptというへんてこな言語を書いています。
    最近のマイブームは3D関連でthreejs, webGL, Blenderなどに手を伸ばしております。

    さて、本日は社内で利用されているJavaScriptライブラリのひとつである tofu.jsについてお話できればと思います。

    tofu.jsとは?

    tofu.jsはHTML5に組み込まれたcanvasをFlashライクなコードで利用できるJavaScriptのライブラリです。
    弊社の主席エンジニアが開発し、公開もされているので是非使ってみてください!

    - github https://github.com/suguru/tofu.js

    tofu.jsの主な特徴として
    描画範囲の限定
    DOMに書き出すHTML_MODE
    の2つが挙げられます。

    簡単な使い方とともに、以上の2点を説明していきたいと思います。

    描画範囲の限定

    canvasを利用する際にcanvas全体をフレームごとに再描画することがあります。
    毎フレーム画面全体を大きくアニメーションするような場合、canvas全体を再描画することは有効かもしれませんが、画面の一部のみをアニメーションする場合に画面全体を再描画すると再描画する必要なない静止した部分の無駄なレンダリングが発生してしまいます。

    そこでtofu.jsでは新しい状態の画面全体ではなく、現在のフレームと次のフレームの画面の差分のみをレンダリングすることで描画にかかる負荷を下げています。描画範囲の限定を内部的にしており、tofu.jsを利用する開発者が意識せずに描画範囲の最適化を行ってくれます。

    tofu.jsにはdebug modeとして再描画領域を可視化してくれるオプション(#1)があるので有効にして実際にアニメーションしてみます。

    #1
    // 再描画範囲の表示 (tofu.js line: 26)
    STROKE_DRAW_REGION
    = 1;
    実際に書いたコードは以下です。
    #1

    var w = 400,
    h = 400,
    frameRate = 20,
    imageArray = [];

    // create stage
    var stage = tofu.createStage({
    width: w,
    height: h,
    frameRate: 20
    });

    // add renderer elm
    document.getElementById('stage').appendChild(stage.container());

    // create field
    var field = tofu.createGraphics({
    width: w,
    height: h
    });
    field.fillStyle = '#EEE';
    field.fillRect(0, 0, field.width, field.height);

    // add field to stage
    stage.add(field);

    // create image
    for (var i = 0 ; i < 3; i++) {
    var image = createImage();
    imageArray.push(image);
    }

    // start animation
    animation();

    function createImage() {
    // create image
    var image = tofu.createBitmap({
    url: 'http://jsrun.it/assets/9/P/Y/C/9PYCC.png',
    scaleX: 0.5,
    scaleY: 0.5
    });
    image.on('load', function() {
    image.dx = 2 * Math.random();
    image.dy = 2 * Math.random();
    image.x = (w - image.width / 2) * Math.random();
    image.y = (h - image.width / 2) * Math.random();
    field.add(image);
    });
    return image;
    }

    // animaion
    function animation() {
    for (var i = 0 ; i < imageArray.length; i++) {
    var image = imageArray[i];
    if (!image.x || !image.y) continue;
    image.x += image.dx;
    image.y += image.dy;
    if (image.x > w - image.width / 2 || image.x <= 0) {
    image.dx *= -1;
    }
    if (image.y > h - image.height / 2 || image.y <= 0) {
    image.dy *= -1;
    }
    image.update();
    }
    requestAnimationFrame(animation);
    }

    #2 再描画範囲表示サンプル (jsdoit) ※リンクで開いてください
    $1 pixel|サイバーエージェント公式クリエイターズブログ-redraw region

    サンプル(#2)を見ると赤い枠で囲まれている範囲が基本的な再描画範囲です。
    オブジェクトが重なった部分は重なったオブジェクト全てを含めた短形でレンダリングすることによりレンダリングの回数を減らしています。
    オブジェクトが移動するとそれに伴って再描画範囲も動的に変化し、最適化されていることが分かると思います。

    DOMで書き出すHTML_MODE

    次にtofu.jsのHTMLモードを紹介します。

    スマートフォンでcanvasを使うにあたり、ひとつの壁となるものが様々な機種によってcanvasのパフォーマンスが異なるということです。
    iOS, AndroidなどのOSの違い、safari, chromeなどのブラウザの違い、また機種ごとによってcanvasのパフォーマンスは様々です。特にAndroid4.x系では、canvasの一部の処理が非常に重いという問題があります。

    tofu.jsでは、canvasで描画するモードに加えて、DOMを使い画面を制御するHTMLモードを用意し、OSに合わせて切り替える仕組みで対処しています。
    #4のようにたった一行でHTMLモードに切り替わり、canvasで処理していたものと同じソースでHTMLを吐き出してくれます。

    実際に画像を一枚表示するサンプルを書いてみます。(#5)

    #5

    if (htmlモードにするOSなど) {
    tofu.htmlMode();
    }

    // stageの作成
    var stage = tofu.createStage({
    width: 400,
    height: 400,
    frameRate: 40
    });

    // bodyに描画領域をappend
    document.body.appendChild(stage.container());

    // bitmap imageの生成
    var image = tofu.createBitmap({
    url: 'simon.png'
    });

    // loadされたら描画
    image.on('load', function() {
    image.update();
    });

    // stageにimageを追加
    stage.add(image);

    $1 pixel|サイバーエージェント公式クリエイターズブログ
    以上のコードで画像が表示できました。
    次にcanvasモード, htmlモード時のbodyの中身を見てみます。

    #6 canvasモードで生成されたbodyの中身
    <body>   
    <canvas width="400" height="400" style="width: 400px; height: 400px;">
    </canvas>
    </body>

    canvas一枚のみがbodyに挿入されます。
    次にHTMLモードの時を見てみましょう。

    #7 htmlモードで生成されたbodyの中身
    <body>
    <div class="tofu tofu tofu-stage" style="width: 400px; height: 400px; overflow: hidden;">
    <div class="tofu tofu-stage-body">
    <div id="tofu1" class="tofu tofu-object" style="-webkit-transform: matrix(1, 0, 0, 1, 0, 0); background-image: -webkit-canvas(c1); width: 200px; height: 200px; background-repeat: no-repeat no-repeat;"></div>
    </div>
    <div class="tofu tofu-stage-touch" style="width: 400px; height: 400px;">     
    </div>
    </div>
    </body>

    このように全てDOMとして挿入されます。
    tofu.jsのモードを切り替えるだけで開発者は意識せずにcanvasかDOMでの描画を切り替えることができます。canvasでの描画が著しく重い端末はHTMLモードを試してみると良いかもしれません。

    Android ファースト

    社長がブログでちらっとAndroidファーストについて触れています。(Androidファーストについては様子見状態ですが...)

    渋谷ではたらく社長のアメブロ
    http://ameblo.jp/shibuya/entry-11607865241.html

    現在のスマートフォンシェアのiOSとAndroidの比率は、Androidの方が多いです。
    ブラウザゲームなどを作り込んでいると、どうしても総合的にブラウザの動作が快適なiPhoneベースでものを作ってしまいがちです。
    iPhoneで検証しながら作っていたものがAndroidの特定端末で動作しない、なんてことは日常茶飯事だと思います。しかし、現状で多くのシェアを獲得しているAndroidでもしっかりと快適に動くアプリケーションを作っていかなければなりません。

    tofu.jsはひとつのソースでcanvasでの描画、DOMでの描画を効率的に切り替えることができ機種ごと、OSごとの特性を見て最適な描画方法を検討可能です。

    現在のプロジェクトでは、Android4.x系の最新機種で実装されはじめているwebGLを使い、処理の高速化を試みています。
    まだ特定機種でしか実装はされていませんが、スマートフォンブラウザ上でwebGLなどの技術にいち早く挑戦し、すべての端末でさらに快適なアプリケーションを作っていきたいと思います。

    最後に

    最後までお付き合いいただきありがとうございました。
    今回はtofu.jsについて紹介させていただきました。
    tofu.jsはMITライセンスで利用できるので是非興味がわいたら使ってみてください。

    - tofu.js https://github.com/suguru/tofu.js

    次回は3D周りでなにか書かせていただければと思います!
    ありがとうございました!