DOM manipulation by Gainer/Wiimote over HTTP
Yusuke Kawasaki【川﨑有亮】
http://www.kawa.net/
YAPC::NA 2008 in Chicago
Wednesday, 18 June 2008
Keyboard operation
- [→] next
- [←] prev
- [↑] index
The slides use JavaScript-based "S6" presentation tool created by amachang.
One-click translation
Demo: Hello!
The slides are translatable for 24 languages with Google AJAX Language API
【一】
Introduction
Question #1
- Do you know XML?
<?xml version='1.0' encoding='UTF-8'?> <document> <foo>bar</foo> </document>
Thank you all for raising your hand to do exercise.
Next.
Question #2
- Do you know DOM?
var foo = document.getElementById('foo'); var bar = document.createElement('a'); foo.appendChild( bar );
Cool.
Question #3
When you develop an Ajax-based application,
- Do you like to manipulate XML documents with such DOM methods?
This is the key of this talk.
Only few people love to manipulate DOM.
Question #4
- Do you like to play Nintendo Wii?
Wii Remote is a device ONLY for the Wii game console?
Why don't you like to manipulate DOM like playing Wii?
Imazine DOM manipulation by Wii Remote...
TODAY'S AGENDA
- Demo: DOM manipulation
- Who's Kawasaki?
- JavaScript animation
- Real device web services
- Wii Remote
- Gainer
【二】
Who's Kawasaki?
Yusuke Kawasaki
川﨑 有亮
I came from Japan
日本から来ました。
CPAN Author
XML::TreePP
use XML::TreePP; my $tpp = XML::TreePP->new(); my $url = "http://use.perl.org/index.rss"; my $tree = $tpp->parsehttp( GET => $url ); print $tree->{"rdf:RDF"}->{channel}->{title}, "\n"; print $tree->{"rdf:RDF"}->{channel}->{link}, "\n";
Perl module to manipulate XML without Wiimote.
XML and Perl object mapper. (hash/array/scalar)
Pure Perl impl., fast and very less dependencies.
http://www.kawa.net/works/perl/treepp/treepp-e.html
Since 2006.02.20
JKL.ParseXML
<script src="jkl-parsexml.js"></script> <script> var url = "zip.xml"; var http = new JKL.ParseXML( url ); var data = http.parse(); document.write( data.items.item.jpref ); // like E4X </script>
JavaScript library to manipulate XML without Wiimote.
http://www.kawa.net/works/js/jkl/parsexml.html
Since 2005/05/18
【三】
JavaScript animation
Animation.Cube demo
Animation.Raster demo
JavaScript + Canvas Powered 3D Engine
Under development.
[DEMO 1]
[DEMO 2]
[DEMO 3]
http://www.kawa.net/works/js/wire3d/v2/wiimote3d.html 2008/03/17
wire3d.js
<script src="wire3d.js" type="text/javascript"></script> <script src="wire3d-wiimote.js" type="text/javascript"></script> <script type="text/javascript"> var wii = new Wire3D.Item.Wiimote(); wii.resize( 1.0, 1.0, 1.0 ); wii.rotate( 0.0, 0.3, -0.5 ); var space = new Wire3D.Space(); space.append( wii ); camera = new Wire3D.Camera( 'demo_here', space ); camera.display(); </script>
【四】
Real device web service
Wiimote
WoH's architecture
Player number indicator
Get Wiimote over HTTP server right now!
http://code.google.com/p/wiimote-over-http/
- Java (not Perl...)
- Jetty embedded HTTPd
- BLUECOVE 2.0.2
- WIDCOMM Driver
API Response
<?xml version="1.0" encoding="UTF-8" ?> <response> <status>200</status> <method>getStatus</method> <data> <wiimote index="1"> <a>0</a> <b>0</b> <xPos>-0.969388</xPos> <yPos>-0.060606</yPos> <zPos>0.299065</zPos> <roll>-1.322725</roll> <pitch>-0.060643</pitch> <plus>0</plus> <minus>0</minus> <one>0</one> <two>0</two> <home>0</home> <up>0</up> <down>0</down> <left>0</left> <right>0</right> <nunchuk> <roll>0.0</roll> <yPos>0.0</yPos> <xPos>0.0</xPos> <c>0</c> <zPos>0.0</zPos> <yVec>0.0</yVec> <xVec>0.0</xVec> <z>0</z> <pitch>0.0</pitch> </nunchuk> </wiimote> </data> </response>
WebService::Device::Wiimote
use WebService::Device::Wiimote; my $wiimote = WebService::Device::Wiimote->new; my $stat = $wiimote->getStatus; my $wiimote = $stat->root->{data}->{wiimote}; print 'A: ', $wiimote->{a}, "\n"; print 'B: ', $wiimote->{b}, "\n"; print 'Up: ', $wiimote->{up}, "\n"; print 'Down: ', $wiimote->{down}, "\n"; print 'Right: ', $wiimote->{right}, "\n"; print 'Left: ', $wiimote->{left}, "\n"; print 'Pitch: ', $wiimote->{pitch}, "\n"; print 'Roll: ', $wiimote->{roll}, "\n";
【五】
Real device web service
Gainer
digital/analog x I/O x 4
Device::Gainer Usage
use Device::Gainer; my $opt = { host => '192.168.1.xx' }; my $gainer = Device::Gainer->new( %$opt ); $gainer->on_pressed(sub { print "PRESSED\n"; }); $gainer->on_released(sub { print "RELEASED\n"; }); $gainer->turn_on_led(); $gainer->turn_off_led();
POE::Component::Server::HTTP
use POE qw( Component::Server::HTTP ); use HTTP::Request::AsCGI; use CGI; my $aliases = POE::Component::Server::HTTP->new( %$conf ); POE::Kernel->run(); sub handler { my ($req, $res) = @_; my $ascgi = HTTP::Request::AsCGI->new($req)->setup; my $cgi = CGI->new(); $res->content_type('text/plain'); $res->content('Hello, World!'); $res->code(RC_OK); return RC_OK; }
GoH's architecture
Over the Net means...
【六】
Announcement
Mashup Award 4th
A largest contest for web application development in Japan.
1st prize: JPY¥1,000,000! (≒US$10K)
http://mashupaward.jp/english/
Acknowledgements
Thank you.
Feel free to contact me:
u-suke [at] kawa.net
http://www.kawa.net/