Pages

2012年4月15日日曜日

Dance! Dance! Dance! Perfume

GitHubにPerfume降臨

GitHubにperfumeが登場して話題となったのは、確か3月。Perfumeの世界戦略用のWebサイトで公開されたコンピュータグラフィックスによるダンス動画に使用されたモーション・ピクチャー・データと中田ヤスタカの音楽データをGitHubで提供されたのだ。サンプル・プログラムと共に。
忙しくてダウンロードしたままだった。やっと遊んでみることにした。

Perfume Global site
http://www.perfume-global.com/

GitHub perfume-dev
https://github.com/perfume-dev/

ダウンロードしたデータ

ダンスのMotion Picture Data (BVH形式)
  • あーちゃん用 aachan.bvh
  • かしゆか用 kashiyuka.bvh
  • ノッチ用 nocchi.bvh
音楽 nakata yasutaka 様謹製
  • perfume_globalsite_sound.wav
サンプルプログラムは、Processing用のソースをダウンロード。 とりあえず動かしてみる。3人が準備体操しているだけ。なるほど orz

プログラムソースファイル構成
  • p5f_sample.pde -- メインルーチン
  • PBvh.pde -- pvhデータを扱うモデル
  • PvhParser.pde -- PBvhで利用。bvhデータを解析。
  • BvhBone.pde -- PBvhで利用。フレームの位置情報を扱っている?

サンプルプログラムを修正

プログラムソースをみると、dataフォルダに A_test.bvh, B_test.bvh, C_test.bvhのデータがあり、これを読み込んで動かしているようなので早速、ダウンロードしたbvhファイルに入れ替えて再度実行。
おお!動きました。でも音がない。

  1. 入手したbvhファイル、wavファイルをプログラムソース直下のdataフォルダにコピー
  2. p5f_sample.pdeの中のファイル読み込み部分のファイル名を変更

以下の方のブログを参考に minimライブラリを利用してみました。
http://r-dimension.xsrv.jp/classes_j/minim/

サンプルのままでも、面白いのですが、せっかくサンプルソースが公開されているのですから、ちょっとだけ手を入れてみます。
  • 三人のフレームは色を変えてみる
  • フレームの形状をsphere (球)からbox(立方体)に変更
  • フレームの末端、つまり頭、足首、手首を大きくした
// p5f_sample 修正
import ddf.minim.*; // サウンドライブラリ minimをインポート
Minim minim;        // 音源クラス用の変数を宣言
AudioPlayer player; // 演奏クラス用の変数を宣言

BvhParser parserA = new BvhParser();
PBvh bvh1, bvh2, bvh3;
public void setup()
{
  size( 1280, 720, P3D );
  background( 0 );
  noStroke();
  frameRate( 30 );
  
  // dataフォルダからダンスデータを読み込む
  bvh1 = new PBvh( loadStrings( "aachan.bvh" ) );
  bvh2 = new PBvh( loadStrings( "kashiyuka.bvh" ) );
  bvh3 = new PBvh( loadStrings( "nocchi.bvh" ) );

  // sound add この当たりがサウンド操作
  // 一回鳴らしたきりになっているがどうしたら良いか不明
  minim = new Minim(this);
  player = minim.loadFile("Perfume_globalsite_sound.wav");
  player.play();

  loop();
}

public void draw()
{
  background( 0 );
  camera((float) mouseX, (float) mouseY, 100.f, (float) (width/2.f), (float) (height/2.f), 0.f, 0.f, 1.f, 0.f);
  pushMatrix();
  translate( width/2, height/2 + 100, 0);
  scale(-1, -1, -1);
  bvh1.draw( millis() , 1); //aachan 識別子として Integer値を渡すことにした
  bvh2.draw( millis() , 2); //kashiyuka
  bvh3.draw( millis() , 3); //nochi
  popMatrix();
}

void stop()
{
  player.close();
  minim.stop();
  super.stop();
}
PBvh.pde ソースだけ、手を入れてみました。
// PBvh.pde の一部
  public void draw( int ms , int co) // 識別子用のパラメータ co を追加
  {
    parser.moveMsTo( ms, 3000 ); 
    BvhBone root = parser.getBones().get(0);
    update(root);
    draw(co); // protected な drawに間接的に識別子を渡す
  }
//
// 途中 省略
//
  protected void draw(int co)
  {
    //fill(color(100));
    // 識別子 co によって、塗りつぶし色を変更している。
    if(co == 1){
      fill(127,0,0);
    }else if(co == 2){
      fill(0,127,0);
    }else if(co == 3){
      fill(0,0,127);
    }else{
      fill(color(100));
    }
    
    for( BvhBone b : parser.getBones())
    {
      pushMatrix();
      translate( b.absPos.x, b.absPos.y, b.absPos.z);
      //sphere(2);
      box(5); // 立方体に変更
      popMatrix();
      if (!b.hasChildren()) // 子を持たない。終端のことか。
      {
        pushMatrix();
        translate( b.absEndPos.x, b.absEndPos.y, b.absEndPos.z);
        //sphere(2);
        box(25); // でかい立方体に変更
        popMatrix();
      }    
    }
  }
実際はもっと格好良いのだが!
修正したプログラムは、ここでみることが出来ます。appletなので起動まで時間が掛かかりますね。
Perfume Dance sample applet
気になること
  • 音がループしないし、動きと同期していない。
  • もっと、大胆にカスタマイズしたい。youTubeでは既に多くの人が楽しんで凄いことになっている

右手首をくるくると回しながら、三人が立ち位置を入れ替えているところは、何度観てもかわいいなあ

2012年1月31日火曜日

jQuery Mobile 最初の一歩か

Railsがらみで、jQueryを少しだけ使っていたら、世の中はjQueryだらけ、そしてモバイルもjQueryが最有力という。
すこし、まとめて jQueryと jQuery Mobileについての記事を読んでみた。
最初の一歩なので、基本の"き"を羅列してみる。

jQueryのポイント

  • java Scriptの言語拡張は、おこなっていない
  • 繰り返し記述がない
  • 返値は、jQueryオブジェクト
  • ドキュメントへのアクセスは $()で
  • CSSへのアクセスは css() で
  • ドキュメント読み込み完了イベントは、$(function(){処理})
  • エレメント読み込み完了イベントは、$(エレメント).ready(function(){処理})
なんか、おまじないみたいになってきた。

jQuery Mobileの初歩

  • ひとつのhtmlに記述する
  • html5のカスタム属性 data-* を使う
  • ページ遷移はページ内リンク
jQueryのcss, ajax機能を基礎にあらゆるモバイル端末向けのドキュメントをSPIで記載するのだな。

サンプル・ソース

以下のサイトから、サンプルソースを拝借しました。
http://www.amitpatil.me/getting-started-with-jquery-mobile-twitter-app/

jQeury Mobile + java scriptで作成したシンプルなTwitter閲覧ソフトだ。
jQueryMobileで書かれたhtml (index.html)と、実際の動作を受け持つ javascript (app.js)の2本のファイルで構成されている。
ユーザIDを検索すると、最近の10ツイートを表示する。
サンプル

index.html


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
 <script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
 <script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
 <script src="js/app.js"></script>
</head>
<body>  
    <div data-role="header" data-position="inline">
        <h1>jQueryMobile Twitter</h1>
    </div>
    <div style="padding-left:1%;">
        <input type="search" name="tuser" id="tuser" value="" width="3"/>
  <a data-inline="true" data-role="button" href="#" data-theme="c" class="ui-btn ui-btn-inline ui-btn-corner-all ui-shadow ui-btn-up-c" onClick="javascript:getTweets()">
   <span aria-hidden="true" class="ui-btn-inner ui-btn-corner-all">
    <span class="ui-btn-text">Get Tweets</span>
   </span>
        </a>
    </div>
    <div style="padding-left:1%;">
        <div class="content-primary">
            <ul data-role="listview" data-inset="true" id="tweets">
            </ul>
        </div>
    </div>
    <br>
    <div data-role="header" data-position="inline">
        <h1></h1>
    </div>
</body>
</html>

javascript部

//ドキュメント読み込み完了時に
$(function(){
 //検索する関数
 getTweets = function(){
 //ID "tuser"の値を取得
 var user = $("#tuser").val();
 if(user != ""){
  //リスト表示部を空白、初期化
  $("#tweets").html('');
  //検索中を示すため、読み込み中メッセージを表示
  $.mobile.showPageLoadingMsg();
  //Twitter APIを使って結果を取得し、dataパラメータに渡す。
  $.getJSON('http://twitter.com/status/user_timeline/'+user+'.json?count=10&callback=?', 
  function(data){
   var template = "";
   var screenname = "";
   var realname = "";
   var tweet = "";
   var avataar = "";
   //抽出結果を一つづつ取り出して、index.htmlのitemにセット
   $.each(data, function(index, item){
    screenname  = item.user.screen_name;
    realname = item.user.name;
    tweet  = item.text;
    created_at = item.created_at;
    avataar  = item.user.profile_image_url;
    created_at  = created_at.split(" ");
    
    // item内のドキュメント(テンプレート)を作成
    $("#tweets").append('<li><a href="#"><img style="margin:1%;" src="'+avataar+'" /><h3>'+screenname+'</h3><p>'+tweet+'</p><p class="light-text">'+created_at[1]+' '+created_at[2]+'</p></a></li>');
    
    // list内を読み込みして再表示
    $("#tweets").listview();
    $("#tweets").listview("refresh");
   });
   //読み込み中のダイアログを消す
   $.mobile.hidePageLoadingMsg();
  });
   }
 }
});

コードの解説が全くない。後で、書き足すことにしよう。とりいそぎ、ここまで。

2012年1月22日日曜日

MacPortsをアップデート

OSXで、オープンソースを利用する場合、パッケージシステムはいくつか選択肢があるが、私は、MacPortsを使っています。
http://guide.macports.org/

# 昔は、時々自分が何を使っている忘れて、複数のパッケージシステムを入れて混乱したりしました。

MacPortsは、バイナリを配布するのではなく、ソースをダウンロードして、コンパイルするタイプのパッケージ管理システムです。そのため、コンパイラが必要です。OSXの場合は、Xcodeが必要になります。そのため、Xcodeをインストールしておくことが必須です。

さて、Lionにしてからパッケージのアップデートしてませんでしたので、やってみました。以下の手順です。
  1. リポジトリ情報を最新にする
  2. インストール済みのport(パッケージ)を最新にする

リポジトリ情報の更新

CodeRider:~ baker$ sudo port selfupdate
Password:
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.0.3 installed,
MacPorts base version 2.0.3 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

selfupdateコマンドは、公開されているMacPortsのリポジトリで、ローカルのportsを更新するために使われます。結果、ローカルのportsは、最新のヴァージョンになります。このコマンドは、またMacPorts基盤 ( MacPorts base)の最新バージョンをチェックし、必要であれば最新のものに、アップグレードします。(macports.org コマンド解説 3.1.2. selfupdate)

つまり、selfupdateでは、リポジトリの情報のみがアップデートされて、既にインストールされているパッケージが更新されるわけではないと言うことです。ただし、ローカルで利用するportとか、MacPortsのコマンド群(MacPorts Base)は、このタイミングで最新版に更新されます。

パッケージの更新

インストール済みのパッケージを全て最新版にします。upgradeコマンドを使うのですが、

upgradeコマンドは、デフォルトの使用では、更新されたパッケージを削除しません。非アクティブにするだけです。(非アクティブについては、Package Image, Destroot, Activate Phasesの項を参照してください)もし、古いportを削除したいのであれば、uオプションを使用しましょう。
(macports.org コマンド解説 3.1.15. upgrade Note)

なので、uオプションを使用して、古いportは削除し、新しいものに入れ替えました。もちろんアップグレード可能なもののみの話ですが。

CodeRider:~ baker$ sudo port -u upgrade outdated
--->  Computing dependencies for gdbm
--->  Fetching archive for gdbm
--->  Attempting to fetch gdbm-1.10_1.darwin_11.x86_64.tgz from http://packages.macports.org/gdbm
--->  Fetching gdbm
--->  Attempting to fetch gdbm-1.10.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/gdbm
--->  Attempting to fetch gdbm-1.10.tar.gz from http://distfiles.macports.org/gdbm
--->  Verifying checksum(s) for gdbm
--->  Extracting gdbm
--->  Configuring gdbm
--->  Building gdbm
--->  Staging gdbm into destroot
--->  Installing gdbm @1.10_1
--->  Cleaning gdbm
--->  Computing dependencies for gdbm
--->  Deactivating gdbm @1.9.1_0
--->  Cleaning gdbm
--->  Activating gdbm @1.10_1
--->  Cleaning gdbm
--->  Uninstalling gdbm @1.9.1_0
--->  Cleaning gdbm
(途中、たくさん省略)

古いportがクリーンされてますね。
コンパイルするので、少し時間が掛かりましたが、無事 終了です。