2009年10月27日火曜日

processingでMostPixelSever

Most Pixel Sever を動かしてみます。
processing,C++版の両方があるらしいので、粒数を増やしたアプリケーションを作成する場合はC++がお勧めのようですが、今回は簡便なprocessingで。

情報元はこちら

リンク先の展示では巨大ディスプレイに映像を出力している様子ですが、よく見るとディスプレイ自体は1枚でできているものでなく、複数枚をつないでできていることが分かります。。
複数のディスプレイ間のイメージを同期させる仕組みですね。


下記のMost Pixel Severアプリでは、クリックに応じて出力される粒がランダムな方向・速度で画面に出力されます。

TCPソケットに乗せてデータの授受を行っており、各アプリケーションごとに立ち上がった画面間を、粒が飛び交うように見えます。





























DLしたファイルは下記3つ、ブログ記載時点で動かしたものです。
ここではServer,Library,Exampleの各バージョンを揃えておかないと正常に動作しませんでした。(Server_v1上でのExample_v2実行などが不可)
  • ProcessingExample_TCP_v1.zip
  • ProcessingLibrary_TCP_v1.zip
  • Server_TCP_v1.zip

サンプルの動かし方は丁寧にWikiに記載されているので、大まかに流れだけ。
  1. DLした各ファイルを解凍。
  2. Serverの.jarファイルは適当なフォルダに配置。
  3. Libraryの.jarファイルはいつものprocessingのLibrary格納場所へ。
  4. ターミナルで、項番2.でServer.jarの置いたディレクトリまで移動。
    コマンド「java -jar mpeServer.jar -debug1 -framerate30 -screens2」を実行して、Serverを起動。
  5. Sampleに含まれる、mpeTest> client0app フォルダ内のmpeTest.appおよび、mpeTest> client1appフォルダ内の同名.appを起動します。
  6. いずれかのmpeTest.appで立ち上がった画面上でクリックすると粒が出力されます。
    飛ばされた粒は画面をまたいで表示されます。

※1:
裏では、ターミナルに各粒の位置情報が書き出されますが、これは設定ファイル(mpe.ini)で出力有無を選択できるので不要であればOFFにします。

※2:
mpe.ini設定ファイルで調節できる値は以下のもの。
マスターの大きな板の上に、任意の小さな板を複数ならべ、それら板上でデータ連携を行うといった具合です。

 id=0;
 server=localhost;
 port=9002;
 localScreenSize=200,400;
 localLocation=0,0;
 masterDimensions=400,400;
 debug=1;


このライブラリは距離を隔てたディスプレイ上でのインスタレーションに利用しやすいですね。

2009年10月9日金曜日

perlでFizzBuzz

ワンライナーって普段書かないので興味本位で調べてみました。
今回の素材はFizzBuzzの例。

FizzBuzzは、1から順に整数をカウントしていって、3の倍数のとき"Fizz"、5の倍数のとき"Buzz"、15の倍数のとき"FizzBuzz"と出力するものです。

上から順にコードが短いものを列挙します。
※書式の都合上、改行あり。


 perl -e 'print $_ % 15 == 0 ? "FizzBuzz\n"
: $_ % 5 == 0 ? "Buzz\n"
: $_ % 3 == 0 ? "Fizz\n"
: "$_\n" for 1 .. 100'


 perl -e 'for(1..100){print;print"\b\b\bFizz"
if$_%3==0;print"\b\b\bBuzz"if$_%5==0;print"\n"}'


 perl -le 'print $_%15?$_%5?$_%3?$_
:Fizz:Buzz:FizzBuzz for(1..100)'


 perl -le 'print(($_%3?"":Fizz).($_%5?"":Buzz)or$_)for 1..100'


最下段のが最短とのことでした。。
いやはや、perlはフリー&カオス。

2009年10月8日木曜日

perl/processing で client/server

下記構成で試してみました。
TCP経由でのデータ連携のコードです。

クライアント処理: Perl
サーバ処理: Processing
port番号: 12345


【クライアント】
#!/usr/bin/perl
use strict;
use IO::Socket;

my $sock = new IO::Socket::INET(PeerAddr=>'localhost',
 PeerPort=> 12345,
 Proto=>'tcp');

die "IO::Socket : $!" unless $sock;

$sock -> print("hello world\n"); # 送信用の文字列を用意
print $sock -> getline; # サーバに文字列を送信

close($sock);



【サーバ】
/***
TCP:12345 portで受信したStringをprintlnする
Compiler: Proce55ing ver1.0.1 later
Date: 2009/10/08
***/
import processing.net.*;

int port = 12345;
Server server;
String str;

void setup(){
 size(200,200);
 server = new Server(this, port);
}

void draw(){
 Client client = server.available();
 
 /* Clientがある場合 */
 if(client != null){
  if((str=client.readString()) != null){ // 文字列を送ってきているなら受信
  print(str);
  client.write("echo: "+str); // Clientに送り返す
   }
 }
}

/* Clientが接続した時 */
void serverEvent(Server s, Client c){
println("Client connect - IP:"+c.ip()); // IPアドレス表示
}



サーバプログラム実行し、サーバ起動中にクライアントプログラムを実行すれば、サーバがリスポンスを返します。

processing で RSS/Atom

Processingで普通にXMLファイルを扱うならこちら

ただし、ここではAtomRSSフィードの加工ができませんでした…。

調べてみたところ、下記サイトを見る限りでは、Atomの加工はできそうです。
http://workshop.evolutionzone.com/2007/09/24/code-read-rss-feed-in-processing/


以下から、ライブラリ2つ「rome.jar」「jdom.jar」をダウンロードします。

ライブラリのダウンロード先:
http://georss.geonames.org/
rome-0.9.jar
jdom-1.0.jar

ダウンロードした.jarファイルを、いつものようにprocessingの外部ライブラリにそれぞれ新規追加しておきます。


ここで、試しにコード「feedParser.pde」を動かすも、jdom.Documentで問題発生、 .class fileから見えないらしい、とのこと。

このコードを見直してみると、2つのクラスしかimportしておらず、これらはどちらもrome.jarからのもの…。

import
com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.*;


ということで、jdomのクラスから下記をごっそり追加importしたところ、

import org.jdom.adapters.*;
import org.jdom.transform.*;
import org.jdom.output.*;
import org.jdom.xpath.*;
import org.jdom.input.*;
import org.jdom.filter.*;
import org.jdom.*;

コードは無事に動きました。


フィードごとのURL,Date,Descriptionが取れてます。

2009年10月7日水曜日

proce55ing/processing で Box2d

ざっと見た限り、processingでBox2dをいじる日本語文献が見当たらなかったので、備忘録がてらに。

もともとC++で動くところのBox2dをJava用に直したのがjBox2d。で、このjBox2d自体はprocessingのcore.jarをもとに動いているとあり。。
では、processingではデフォルトで動くかというとそうでもありませんでした。


下記、試行錯誤。

SourceforgeにあがっているjBox2d(JBox2d-2.0.1.zip)をダウンロードして、いつものよう(※)に外部ライブラリに組み込んだものの、org.jbox2d.p5 が見当たらないというエラーを吐いて、コードは動きませんでした。

※)
processing.appの右クリック>パッケージ表示>Contents>Resources>Java>Libraries の直下に新規フォルダ「jBox2d」を作成後、さらにその下に新規フォルダ「library」を作成。
その中に、ダウンロードしたライブラリ内にあるjbox2d-2.0.1-library-onlyをコピー&リネームして "jBox2d.jar"として先ほどのlibrary直下に配置。












SourceforgeにあるjBox2dライブラリをそのまま使うことはできないようなので、本家サイトのFAQを参照したところ、「BoxWrap2D」なるライブラリがあるとのこと。

「BoxWrap2D」ライブラリのダウンロード先はこちら


試しに、processing上でこのBoxWrap2Dライブラリをimportしてみると、

import org.jbox2d.util.nonconvex.*;
import org.jbox2d.dynamics.contacts.*;
import org.jbox2d.testbed.*;
import org.jbox2d.collision.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.joints.*;
import org.jbox2d.p5.*;
import org.jbox2d.dynamics.*;

と、Box2dを動かすのに必要な要素はすべて含まれていそうでした。


ということで、BoxWrap2DライブラリをDLしてその中に含まれるBoxWrap2D.jar上記(※)の手順同様で作成した「jBox2d」>「library」の中に”jBox2d.jar”とリネームして配置し、Box2dのコードを実行すると動作しました。


















追記:2009/10/07

サンプルコード内で、下記のようにインポート箇所が含まれる場合があるのですが、これらはコメントアウトして除いても動作するようです。
import org.jbox2d.testbed.tests.*;
import org.jbox2d.testbed.*;
import org.jbox2d.testbed.timingTests.*;
import org.jbox2d.util.blob.*;

Blogger Syntax Highliter