Thank you to anyone who has already donated - your generous donations helped make three months of treatment possible.
My brother Nate continues to fight stage IV Hodgkin's lymphoma. He's just 31, with a wife and baby girl. They have no active income (since he's been unable to return to work), no insurance, and cannot afford the treatment he needs. Nate and his family need your help. Please consider a donation, every dollar helps. Thanks.
Hal Fulton: Future of Ruby
History of Ruby
"Java will be the COBOL of the early 21st century."
Perl(6).kill?(Ruby(2.0)) # => false
"When Perl 6 gets here, it will still have many of the disadvantages of being Perl."
Larry Wall's said publicly that Perl 6 will borrow heavily from Ruby.
...
Andrea Wright: Games with Ruby
Ruby/SDL
low-level
ships with nifty little graphics thingies
bouncing, tetris, alpha blending, etc.
setVideoMode sets everything off to start with
openGL not well-integrated with Ruby API
typical physics bouncey stuff in Sprite class
steven davidovitz' nebular gauntlet:
simple particle engines
asteroids with alpha stuff and good graphics
console interface (!)
RUDL
dead, but good ideas and interesting resources
more Rubyish API for SDL
Ruby/SDL setVideoMode returns DisplaySurface object
RUDL uses DisplaySurface.new, etc.
RUDL has less direct mapping, and apparently less access to defaults and constants
more readability, less power? (tradeoffs)
OpenGL
set Z 0 for 2-D
RubyGame
high-level with wrappers on SDL
initially based on PyGame
SpriteGroups
Rects - little grid thingies
give it inflate(-x) and it deflates
totally Pythonic
Polygons (stuff) and Boundaries (space)
catch(:quit) do
loop do
scene.draw()
scene.refresh()
end
end
gosu
polished and compact
teh complete
includes really well thought out tutorial
Window class (gasp!) instead of Rects or Boundaries
seems to work mainly by overriding predefined callbacks
kinda Railsy that way
def draw
@thing.draw
@bkg.draw
@other_things.each {|thing| thing.draw}
yadda.yadda[yadda]
end
idiomatic Ruby
seems niftiest library so far
Escave - volcano lava splat game
silly platform scroller where you feed sleep-walking witch chili, ice cream, chocolate
ASCII tiles (ascii boxes) to define levels
chars map to sprites/objects
newly added: support for ImageMagick
morphing and stuff
written in C++
uses SWIG
has a native Ruby feel
sprites + ImageMagick = acid tetris?
GGZ Gaming Zone Project
portal or something
Ogre.rb
3D modelling
Ruby wrapper around 3D modelling thing
smoke, lighting, 3D modelling package
testing framework for 3D modelling
how crazy is that?
Shattered Ruby - Ogre wrapper based on Rails (wtf?!)
similar MVC shit
making assumptions about views, file locations, formats, etc.
convention/configuration
:x.to_v # => Symbol#to_vector
timers are what makes Shattered tick
Rails: app/models, app/views, test/units, etc.
RMaterials modelling files with ERb
Chipmunk
Shattered-compatible physics engine
scene_manager, camera, viewport, timer, space :gravity => :blahblahblah
Shattered can drop to Ogre the same way ARec can drop to SQL
Shattered forces GC with each frame
easy to export from Blender
giant bee
...
Ezra Z on Ruby Performance
Performance dichotomy
Beautiful code slow / Reasonably pretty code fast
Web apps, bottleneck usually DB or network
benchmarking on idioms
Symbol#to_proc "a little Perlish-looking"
also way slow compared to regular code
benchmarked on a million iterations
equivalent:
def foo
yield
end
def bar &proc
proc.call
end
Ruby interpreter heavily optimized for yield, not #call
equivalent code with each or inject: inject twice as slow
=~ vs. match() # => =~ faster, much faster when match succeeds
"tongue" operator
overhead of creating a MatchData object
re = /foo/o # => pre-compilation; actually slower than regular regexes
method call overhead in Ruby surprisingly expensive
"a lot of this stuff is fixed in Rubinius"
:send slower than direct invocation
regular args instead of options hashes - significantly faster
"most of the stuff that's expensive in Matz's Ruby is expensive in JRuby"
benchmarking is definitely the key
eval() really expensive due to new abstract syntax trees, nested interpreting essentially
suggested no-eval pragma
enables a lot of optimizations that depend on eval()'s absence
benchmarking produces efficient coding habits
"profiling - measure, don't guess"
sudo gem install ruby-prof
result = RubyProf.profile do
code_you_want_to_profile
end
helper profiler allows you to plug in ruby-prof on Merb code Ez wants to profile
obviously adaptable to Rails or other frameworks
gives it args saying "show me anything which takes more than X amount of time"
auto-generates reporting
Merb - result of hosting many Rails apps
Rails gives Ruby bad name for being slow as Rails uses some slowish idioms
not bagging on Rails
metaprogramming slower than regular programming
metaprogramming frenzy in Rails community slows stuff down
Merb started out as Mongrel handler + Erb
cgi.rb => ugliest piece of code in the Ruby standard library
Merb basically a performance-oriented alternative to ActionPack
Mutex-conservative, as opposed to Rails, which is more sort of Mutex-greedy
Rails did it because making a thread-safe framework only helps when client programmers write thread-safe apps
Merb 2x - 3x faster than Rails on average
ORM-agnostic
short stack traces
Favor simple code over magic code
Rails cultural convention of metaprogramming and then metaprogramming somebody else's metaprogramming:
result is very deep call stacks
(specifically, sequences of alias_method_chain calls)
Rails actions seemed unRubyish, so he made renders just the return values of actions in Merb
can return any IO object that responds to read
INCLUDING PROCS
(how insanely cool is that?)
very useful with Object#to_json
very fast by avoiding rendering chain
"No code is faster than no code"
"simplicity and clarity trumps magic every time"
Merb plugin architecture: gems
nice and simple
Merb is about 6,000 lines of code
"big fan of hacker-friendly frameworks"
smaller, slimmer, more flexible, no one golden path
"Rubinius IS going to be the new Ruby"
based on Smalltalk
anyone who knows Ruby can work on core Rubinius
trunk Merb two times faster than current release
Merb gets faster
Rails gets slower
Merb uses RSpec but has open-ended handlers that allow you to use Test::Unit if you want
open-door SVN policy (like Rubinius)
"Rails ripoff"
Merb by itself only uses 10 or 12MB of RAM
(huge difference between def foo and define_method :foo
slower to define, slower to call as well
3 times slower
not in Rubinius!
because of the closure
"ActiveRecord objects are quite expensive to instantiate"
memory overhead
slow definition
slow calling
one extra :include in a :find can up Mongrel memory usage by 100MB)
back to Merb:
DataMapper
more complex schemas
defaults to ActiveRecord patterns
identity map cache in memory - won't re-create or re-obtain if it already has a copy
transactional object memory
Rubinius:
cool mode for IRB: debug-compiler
s-expression
rubinius assembly
bytecodes (optional)
Ruby -> Rubinius assembly code -> bytecode
|