SlideShare a Scribd company logo
1 of 29
USE RUBY TO WRITE (AND TEST) YOUR

 
 
 
 NEXT ANDROID APP
Joel Byler
Software Craftsman
@joelbyler
June 1, 2013
Pittsburgh TechFest
La Roche College
Saturday, June 1, 13
WHO AM I?
 
 
 
 JOEL BYLER
 Software Craftsman
 Organizer for CleRb
 Enterprise Java Developer
 Relatively new to Ruby
 ... and Android
Saturday, June 1, 13
Saturday, June 1, 13
NEW TO ANDROID AND RUBY???
 Software Craftsmanship
Reduce risk with TDD / ATDD
 <3 Ruby and want to learn more
 <3 Mobile apps, who doesn’t?
Warning: this may turn out to be a lot of code to absorb in a short
amount of time. Slides and code will be made publicly available
Saturday, June 1, 13
RUBY ON ANDROID USING RUBOTO
JRuby optimized for the Android OS
 JRuby is a JVM language
 Android uses something like the JVM
but actually Dalvik VM
=+
<<< MAGIC >>>
Saturday, June 1, 13
IRB ON YOUR ANDROID DEVICE
 Interactive Ruby Shell
 Edit and run scripts in Android
 demo...
Saturday, June 1, 13
PERFORMANCE CONSIDERATIONS
Other than initial startup to load
JRuby, the performance of the app
appears to be as good as many
native Android apps
Saturday, June 1, 13
RUBOTO CORE
 A separate app available on the
Google Play Store
 Allows Ruboto Runtime (JRuby
on Dalvik VM) to be shared
 An alternative would be to use
the --with-jruby option
Decisions, decisions...
Saturday, June 1, 13
HOW DOES THIS
MAKE YOU FEEL?
This is what your users will
see if they don’t already have
the Ruboto Core installed
Using the --with-jruby
option will add ~10mb
to the size of your app
or
Saturday, June 1, 13
CREATE A NEW PROJECT
Ruboto Application Generator
$ ruboto gen app --package com.leandog.mastermind.ruboto
--name MasterMindRuboto --target android-15
--with-jruby --path=RubotoMasterMind
This will generate application with
'What hath Matz wrought?' sample code.
Saturday, June 1, 13
RUBOTO CLASS GENERATOR
Ruboto Class Generator
$ ruboto gen class Activity --name MasterMindMainActivity
This will generate code for the activity and add it to
the project manifest.
You can also use this to generate a
BroadcastReceiver or Service class
Saturday, June 1, 13
YOUR GENERATED APP
Saturday, June 1, 13
YOUR GENERATED CODE (RUBY .RB)
Saturday, June 1, 13
YOUR GENERATED TEST (ALSO .RB)
Saturday, June 1, 13
RAKE INSTEAD OF ANT
$ rake install start
Install the project on a device or emulator and start
it running.
$ ant debug
$ adb install example.apk
$ adb shell am start -n com.foo.bar...
$ rake update_scripts
Install the project on a device or emulator and start
it running.
$ adb install example.apk
$ rake -T List other available rake tasks
Saturday, June 1, 13
ADD IN THE ATDD
$ gem install testgen
This is one of @chzy 's testing gems
$ testgen project yourapp --with-gametel
This will add everything you need to use cucumber
to test your Ruboto app
Saturday, June 1, 13
NOW FOR SOME UNIT TESTS
$ mkdir spec This is where your specs will live
Add rspec to Rakefile (created by testgen)
Saturday, June 1, 13
UNIT TESTING
Use rspec to test your ruby code, just like you
normally would.
rspec
JUnit 3
rake spec
Saturday, June 1, 13
INTEGRATION TEST?
Instruments and installs app on device when running
rake test
similar to ActivityInstrumentationTestCase2
Saturday, June 1, 13
ACCEPTANCE TESTING
Feature: Input Screen
Scenario: Welcome the user
When the application launches
Then I see "Enter four numbers below and submit your guess"
Scenario: User can guess
Given I enter 4 numbers
When I press the submit button
Then I see "Nice guess!"
rake features
Cucumber
Gametel
Brazenhead
ADB gem
class MainScreen
include Gametel
text(:number1, :index => 0)
text(:number2, :index => 1)
text(:number3, :index => 2)
text(:number4, :index => 3)
def guess (first, second, third, forth)
number1 = first.to_s
number2 = second.to_s
number3 = third.to_s
number4 = forth.to_s
end
end
Then(/^I enter 4 numbers$/) do
on(MainScreen).guess 1, 2, 3, 4
end
Saturday, June 1, 13
YOUR RUBOTO CLASS FILES
 They're just .rb files
 Allows you to make changes without a full
rebuild
 fast feedback
 Ruboto uses ruby classes that are backed by java
classes for improved performance.
 Can still reference Java resources
example:
R::string::header_text
Saturday, June 1, 13
QUICK TOUR OF THE CODE
* Time permitting
Saturday, June 1, 13
Saturday, June 1, 13
THE RUBOTO COMMUNITY IS GROWING
Some of these projects are still young or have a small
user base.
- They will probably continue to change (improve)
- Ruboto is only version 0.12
Example:
Wasn't able to add a menu to the main activity. Instead
I had to wrap it with the 'launch' activity.
The good news is that they could definitely use YOUR
HELP!
Anyone up for trying to make the debugger work?
Saturday, June 1, 13
CONCLUSION
Ruboto is a great Open Source project with a
growing community that promises to get even
better.
Yes, it does increase your app's startup time
slightly, but offers a great dynamic nature for
rapidly changing apps.
Virtually all code can be Ruby, but can also
reference Java resources if you so desire.
Saturday, June 1, 13
RESOURCES
Sample Code
https://github.com/joelbyler/Ruboto-MasterMind
Ruboto
http://ruboto.org/
ATDD Training Resource
https://leanpub.com/cucumber_and_cheese
More In-Depth Personal Training
http://www.TestAutomationBootCamp.com/
Saturday, June 1, 13
DOMO ARIGATO MR. ROBOTO!
Fun fact:
domo arigato actually means
"Thanks a lot!"
in Japanese
http://en.wikipedia.org/wiki/Domo_arigato
So....
Domo Arigato!
Saturday, June 1, 13
THAT’S A WRAP!
Joel Byler
@joelbyler
Saturday, June 1, 13
COME FLOAT WITH US!
Located on a 10,000 square foot boat on the
Cleveland waterfront, our team exemplifies
how Agile values & principles are practiced.
Come float, deliver, and learn with us, or
leverage our expertise to help you change
your company culture.
@leandog www.leandog.com
Saturday, June 1, 13

More Related Content

What's hot

What's hot (20)

Librerías Opensoure de Square
Librerías Opensoure de Square Librerías Opensoure de Square
Librerías Opensoure de Square
 
A tour of React Native
A tour of React NativeA tour of React Native
A tour of React Native
 
React-Native for multi-platform mobile applications @ Codemotion Rome 2017
React-Native for multi-platform mobile applications @ Codemotion Rome 2017React-Native for multi-platform mobile applications @ Codemotion Rome 2017
React-Native for multi-platform mobile applications @ Codemotion Rome 2017
 
Creating books app with react native
Creating books app with react nativeCreating books app with react native
Creating books app with react native
 
React native
React nativeReact native
React native
 
What is FED
What is FEDWhat is FED
What is FED
 
Experiences building apps with React Native @DomCode 2016
Experiences building apps with React Native @DomCode 2016Experiences building apps with React Native @DomCode 2016
Experiences building apps with React Native @DomCode 2016
 
What's This React Native Thing I Keep Hearing About?
What's This React Native Thing I Keep Hearing About?What's This React Native Thing I Keep Hearing About?
What's This React Native Thing I Keep Hearing About?
 
Building native mobile Apps with ReactNative
Building native mobile Apps with ReactNative Building native mobile Apps with ReactNative
Building native mobile Apps with ReactNative
 
Flutter Intro
Flutter IntroFlutter Intro
Flutter Intro
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Learn Once; Write Anywhere
Learn Once; Write AnywhereLearn Once; Write Anywhere
Learn Once; Write Anywhere
 
Introduction to React Native
Introduction to React NativeIntroduction to React Native
Introduction to React Native
 
React Native "A Bad Idea Or A Game Changer" at Code Mania 101
React Native "A Bad Idea Or A Game Changer" at Code Mania 101React Native "A Bad Idea Or A Game Changer" at Code Mania 101
React Native "A Bad Idea Or A Game Changer" at Code Mania 101
 
Hot and spicy Java with Lombok. Live!
Hot and spicy Java with Lombok. Live!Hot and spicy Java with Lombok. Live!
Hot and spicy Java with Lombok. Live!
 
Capistrano for non-rubyist
Capistrano for non-rubyistCapistrano for non-rubyist
Capistrano for non-rubyist
 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007
 
Android is going to Go! Android and Golang
Android is going to Go! Android and GolangAndroid is going to Go! Android and Golang
Android is going to Go! Android and Golang
 
Use groovy & grails in your spring boot projects
Use groovy & grails in your spring boot projectsUse groovy & grails in your spring boot projects
Use groovy & grails in your spring boot projects
 
(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi
 

Similar to Use Ruby to Write (and Test) Your Next Android App

Docker Deployments
Docker DeploymentsDocker Deployments
Docker Deployments
Docker, Inc.
 
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" EngineRuby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Joseph Ku
 

Similar to Use Ruby to Write (and Test) Your Next Android App (20)

Tools/Processes for serious android app development
Tools/Processes for serious android app developmentTools/Processes for serious android app development
Tools/Processes for serious android app development
 
Show an Open Source Project Some Love and Start Using Travis-CI
Show an Open Source Project Some Love and Start Using Travis-CIShow an Open Source Project Some Love and Start Using Travis-CI
Show an Open Source Project Some Love and Start Using Travis-CI
 
RubyMotion: Put your Dreams in Motion with Ruby
RubyMotion: Put your Dreams in Motion with RubyRubyMotion: Put your Dreams in Motion with Ruby
RubyMotion: Put your Dreams in Motion with Ruby
 
Reverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android appsReverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android apps
 
Practical JRuby
Practical JRubyPractical JRuby
Practical JRuby
 
Docker Deployments
Docker DeploymentsDocker Deployments
Docker Deployments
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Developing cross platform desktop application with Ruby
Developing cross platform desktop application with RubyDeveloping cross platform desktop application with Ruby
Developing cross platform desktop application with Ruby
 
Philly Spring UG Roo Overview
Philly Spring UG Roo OverviewPhilly Spring UG Roo Overview
Philly Spring UG Roo Overview
 
JRuby in Java Projects
JRuby in Java ProjectsJRuby in Java Projects
JRuby in Java Projects
 
Scaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global OrganizationScaling Puppet Usage to a Global Organization
Scaling Puppet Usage to a Global Organization
 
Why don't you Groovy?
Why don't you Groovy?Why don't you Groovy?
Why don't you Groovy?
 
Bitter Java, Sweeten with JRuby
Bitter Java, Sweeten with JRubyBitter Java, Sweeten with JRuby
Bitter Java, Sweeten with JRuby
 
9 reasons why programmers should learn react native
9 reasons why programmers should learn react native9 reasons why programmers should learn react native
9 reasons why programmers should learn react native
 
JRuby and Google App Engine
JRuby and Google App EngineJRuby and Google App Engine
JRuby and Google App Engine
 
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" EngineRuby on Google App Engine: Upgrade to Google App "Turbo" Engine
Ruby on Google App Engine: Upgrade to Google App "Turbo" Engine
 
Languages used by web app development services remotestac x
Languages used by web app development services  remotestac xLanguages used by web app development services  remotestac x
Languages used by web app development services remotestac x
 
Take A Gulp at Task Automation
Take A Gulp at Task AutomationTake A Gulp at Task Automation
Take A Gulp at Task Automation
 
roofimon@njug5
roofimon@njug5roofimon@njug5
roofimon@njug5
 
Mobile development in 2020
Mobile development in 2020 Mobile development in 2020
Mobile development in 2020
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Recently uploaded (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Use Ruby to Write (and Test) Your Next Android App

  • 1. USE RUBY TO WRITE (AND TEST) YOUR NEXT ANDROID APP Joel Byler Software Craftsman @joelbyler June 1, 2013 Pittsburgh TechFest La Roche College Saturday, June 1, 13
  • 2. WHO AM I? JOEL BYLER  Software Craftsman  Organizer for CleRb  Enterprise Java Developer  Relatively new to Ruby  ... and Android Saturday, June 1, 13
  • 4. NEW TO ANDROID AND RUBY???  Software Craftsmanship Reduce risk with TDD / ATDD  <3 Ruby and want to learn more  <3 Mobile apps, who doesn’t? Warning: this may turn out to be a lot of code to absorb in a short amount of time. Slides and code will be made publicly available Saturday, June 1, 13
  • 5. RUBY ON ANDROID USING RUBOTO JRuby optimized for the Android OS  JRuby is a JVM language  Android uses something like the JVM but actually Dalvik VM =+ <<< MAGIC >>> Saturday, June 1, 13
  • 6. IRB ON YOUR ANDROID DEVICE  Interactive Ruby Shell  Edit and run scripts in Android  demo... Saturday, June 1, 13
  • 7. PERFORMANCE CONSIDERATIONS Other than initial startup to load JRuby, the performance of the app appears to be as good as many native Android apps Saturday, June 1, 13
  • 8. RUBOTO CORE  A separate app available on the Google Play Store  Allows Ruboto Runtime (JRuby on Dalvik VM) to be shared  An alternative would be to use the --with-jruby option Decisions, decisions... Saturday, June 1, 13
  • 9. HOW DOES THIS MAKE YOU FEEL? This is what your users will see if they don’t already have the Ruboto Core installed Using the --with-jruby option will add ~10mb to the size of your app or Saturday, June 1, 13
  • 10. CREATE A NEW PROJECT Ruboto Application Generator $ ruboto gen app --package com.leandog.mastermind.ruboto --name MasterMindRuboto --target android-15 --with-jruby --path=RubotoMasterMind This will generate application with 'What hath Matz wrought?' sample code. Saturday, June 1, 13
  • 11. RUBOTO CLASS GENERATOR Ruboto Class Generator $ ruboto gen class Activity --name MasterMindMainActivity This will generate code for the activity and add it to the project manifest. You can also use this to generate a BroadcastReceiver or Service class Saturday, June 1, 13
  • 13. YOUR GENERATED CODE (RUBY .RB) Saturday, June 1, 13
  • 14. YOUR GENERATED TEST (ALSO .RB) Saturday, June 1, 13
  • 15. RAKE INSTEAD OF ANT $ rake install start Install the project on a device or emulator and start it running. $ ant debug $ adb install example.apk $ adb shell am start -n com.foo.bar... $ rake update_scripts Install the project on a device or emulator and start it running. $ adb install example.apk $ rake -T List other available rake tasks Saturday, June 1, 13
  • 16. ADD IN THE ATDD $ gem install testgen This is one of @chzy 's testing gems $ testgen project yourapp --with-gametel This will add everything you need to use cucumber to test your Ruboto app Saturday, June 1, 13
  • 17. NOW FOR SOME UNIT TESTS $ mkdir spec This is where your specs will live Add rspec to Rakefile (created by testgen) Saturday, June 1, 13
  • 18. UNIT TESTING Use rspec to test your ruby code, just like you normally would. rspec JUnit 3 rake spec Saturday, June 1, 13
  • 19. INTEGRATION TEST? Instruments and installs app on device when running rake test similar to ActivityInstrumentationTestCase2 Saturday, June 1, 13
  • 20. ACCEPTANCE TESTING Feature: Input Screen Scenario: Welcome the user When the application launches Then I see "Enter four numbers below and submit your guess" Scenario: User can guess Given I enter 4 numbers When I press the submit button Then I see "Nice guess!" rake features Cucumber Gametel Brazenhead ADB gem class MainScreen include Gametel text(:number1, :index => 0) text(:number2, :index => 1) text(:number3, :index => 2) text(:number4, :index => 3) def guess (first, second, third, forth) number1 = first.to_s number2 = second.to_s number3 = third.to_s number4 = forth.to_s end end Then(/^I enter 4 numbers$/) do on(MainScreen).guess 1, 2, 3, 4 end Saturday, June 1, 13
  • 21. YOUR RUBOTO CLASS FILES  They're just .rb files  Allows you to make changes without a full rebuild  fast feedback  Ruboto uses ruby classes that are backed by java classes for improved performance.  Can still reference Java resources example: R::string::header_text Saturday, June 1, 13
  • 22. QUICK TOUR OF THE CODE * Time permitting Saturday, June 1, 13
  • 24. THE RUBOTO COMMUNITY IS GROWING Some of these projects are still young or have a small user base. - They will probably continue to change (improve) - Ruboto is only version 0.12 Example: Wasn't able to add a menu to the main activity. Instead I had to wrap it with the 'launch' activity. The good news is that they could definitely use YOUR HELP! Anyone up for trying to make the debugger work? Saturday, June 1, 13
  • 25. CONCLUSION Ruboto is a great Open Source project with a growing community that promises to get even better. Yes, it does increase your app's startup time slightly, but offers a great dynamic nature for rapidly changing apps. Virtually all code can be Ruby, but can also reference Java resources if you so desire. Saturday, June 1, 13
  • 26. RESOURCES Sample Code https://github.com/joelbyler/Ruboto-MasterMind Ruboto http://ruboto.org/ ATDD Training Resource https://leanpub.com/cucumber_and_cheese More In-Depth Personal Training http://www.TestAutomationBootCamp.com/ Saturday, June 1, 13
  • 27. DOMO ARIGATO MR. ROBOTO! Fun fact: domo arigato actually means "Thanks a lot!" in Japanese http://en.wikipedia.org/wiki/Domo_arigato So.... Domo Arigato! Saturday, June 1, 13
  • 28. THAT’S A WRAP! Joel Byler @joelbyler Saturday, June 1, 13
  • 29. COME FLOAT WITH US! Located on a 10,000 square foot boat on the Cleveland waterfront, our team exemplifies how Agile values & principles are practiced. Come float, deliver, and learn with us, or leverage our expertise to help you change your company culture. @leandog www.leandog.com Saturday, June 1, 13