SlideShare a Scribd company logo
1 of 62
Make GUI Apps with Shoes
         Brian Hogan
Shoes?
simple GUI toolkit
why ruby?
• Highly dynamic
• Very high level
• 100% object oriented
• 100% open-source
• Really easy to learn
simple code.
age = 42
first_name = "Homer"
start_date = Date.new 1980, 06, 05
annual_salary = 100000.00
Ruby is dynamically
       typed
but strong-typed!
so a string and a
  number can be
declared without a
      type...
...but you can’t just add
  a number to a string
 without converting it.
age = 25
"you are " + age.to_s + " years old!"
there’s a shortcut for
building strings though:

  age = 25
  "you are #{age} years old."
#{} embeds an
 expression in a string,
converting the result to
       a string!
Ruby has simple logic.
 if on_probation(start_date)
   puts "Yes"
 else
   puts "no"
 end
Methods (functions) are
     simple too.
  # if start date + 6 months is > today
  def on_probation?(start_date)
      (start_date >> 6 > Date.today)
  end
Classes can be boring...
class Person
  @first_name
  @last_name

  def first_name=(f)
    @first_name = f
  end

  def first_name
    @first_name
  end

  def last_name=(l)
    @last_name = l
  end

  def last_name
    @last_name
  end
end
...or awesome!
class User
  attr_accessor :first_name, :last_name
end
Everything is an
object... even integers
     and strings!
Arrays

colors = ["Red", "Green", "Blue"]
Hashes (dictionaries)
attributes = {:age => 25,
              :first_name => "Homer",
              :last_name => "Simpson"}
=>
Hashes as parameters
for methods are very
     common.
Blocks
some_method do
  some_code_you_wrote
end
Blocks can iterate...
@colors = ["red", "green", "blue"]

@colors.each do |color|
  puts color
end
and encapsulate code
create_table :products do |t|
  t.string :name
  t.text :description
  t.boolean :visible
  t.integer :price
end
You use them all the
   time in Ruby.
in fact, every method
   can take a block.
     5.times do
       puts "Hello!"
     end
Blocks make it easy to
   write your own
      language.
DSL - Domain Specific
      Language
Shoes is a DSL for
making GUI apps.
A Shoes app is an
     object.
You use blocks to
   define the user
interface and trigger
       events,
Shoes.app :title => "Hello World" do
  alert "Hello World"
end
Shoes.app :title => "Hello World" do
  button "Click me" do
    alert "Hello World"
  end
end
Shoes.app :title => "Hello World",
          :width => 320,
          :height => 240 do

  background red

end
Shoes.app :title => "Hello World",
          :width => 320,
          :height => 240 do

  background red..black

end
stacks
Shoes.app :title => "Hello World",
          :width => 320,
          :height => 240 do

  stack do
    para "Hello"
    para "World"
  end
end
flows
Shoes.app :title => "Hello World",
          :width => 320,
          :height => 240 do

  flow do
    para "Hello"
    para "World"
  end
end
Combine stacks and
     flows.
Shoes.app :title => "Hello World",
          :width => 320,
          :height => 240 do

  stack :width => "100%" do
    background gray
    title "Hello World"
  end

  stack :width => "50%" do
    flow :width => "100%" do
      para "Left side has some text"
    end
  end

  stack :width => "50%" do
    background white
    para "Right side has some text"
    para "without an inner flow."
  end

end
Shoes.app :title => "Hello World" do
  stack do
    banner "Hello there."
    title "The quick"
    subtitle "brown fox"
    tagline "jumped"
    caption "over"
    para "the"
    inscription "lazy dog"
  end
end
edit_line
Shoes.app :title => "Hello World" do
  para "Enter your name"
  @name = edit_line
end
edit_line
Shoes.app :title => "text boxes" do
  para "Password"
  @pass = edit_line(:secret => true)
end
edit_box
Shoes.app :title => "text boxes" do
  para "About Me"
  @about = edit_box
end
list_box
Shoes.app :title => "text boxes" do
  para "Colors"
  @color = list_box :items => ["green", "red", "blue"]
end
Use .text to grab the
        values in the boxes.
Shoes.app :title => "Hello World" do
  para "Enter your name"
  @name = edit_line
  button "Go" do
    name = @name.text
    alert "Hello #{name}"
  end
end
Since everything is an
object, you can work
 with it... even stacks
      and flows!
Shoes.app do
  para "add name"
  button "Add" do
    @names.append do
      para @name.text
    end
    @name.text = ""
  end
  @names = stack
end
Ooooh.. windows!
Shoes.app do
  button "Open window" do
    window :title => "Child" do
      para "Hello!"
    end
  end
end
Shoes can load images,
 play music, and play
       movies.
You can use and embed
  almost every Ruby
        library
It can open browser
      windows...
..and hook into the
OS’s open, save, fonts,
  and color pickers.
Make games with
    Shoes!
You can build installers
for Windows, Linux, and
         Mac.
What makes Shoes so
      great?
It lets you build things
          fast...
...and have fun doing it.
http://github.com/napcs/shoes_demo_apps/
           http://the-shoebox.org/
    http://github.com/whymirror/shoes/
questions?
brianhogan@napcs.com
   twitter: bphogan
http://www.napcs.com/

More Related Content

Viewers also liked

MVC for Desktop Application - Part 1
MVC for Desktop Application - Part 1MVC for Desktop Application - Part 1
MVC for Desktop Application - Part 1
晟 沈
 
MVC for Desktop Application - Part 2
MVC for Desktop Application - Part  2MVC for Desktop Application - Part  2
MVC for Desktop Application - Part 2
晟 沈
 

Viewers also liked (17)

MVC for Desktop Application - Part 4
MVC for Desktop Application - Part 4MVC for Desktop Application - Part 4
MVC for Desktop Application - Part 4
 
MVC for Desktop Application - Part 1
MVC for Desktop Application - Part 1MVC for Desktop Application - Part 1
MVC for Desktop Application - Part 1
 
MVC for Desktop Application - Part 2
MVC for Desktop Application - Part  2MVC for Desktop Application - Part  2
MVC for Desktop Application - Part 2
 
Request-Response Cycle of Ruby on Rails App
Request-Response Cycle of Ruby on Rails AppRequest-Response Cycle of Ruby on Rails App
Request-Response Cycle of Ruby on Rails App
 
Cross-platform Desktop application with AngularJS and build with Node-webkit
Cross-platform Desktop application with AngularJS and build with Node-webkitCross-platform Desktop application with AngularJS and build with Node-webkit
Cross-platform Desktop application with AngularJS and build with Node-webkit
 
Web : Request-Response Lifecycle (Ruby on Rails)
Web : Request-Response Lifecycle (Ruby on Rails)Web : Request-Response Lifecycle (Ruby on Rails)
Web : Request-Response Lifecycle (Ruby on Rails)
 
React.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIsReact.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIs
 
How We Do DevOps at Walmart: OneOps OSS Application Lifecycle Management Plat...
How We Do DevOps at Walmart: OneOps OSS Application Lifecycle Management Plat...How We Do DevOps at Walmart: OneOps OSS Application Lifecycle Management Plat...
How We Do DevOps at Walmart: OneOps OSS Application Lifecycle Management Plat...
 
Ruby application based on http
Ruby application based on httpRuby application based on http
Ruby application based on http
 
An introduction to the ruby ecosystem
An introduction to the ruby ecosystemAn introduction to the ruby ecosystem
An introduction to the ruby ecosystem
 
Deployment with Ruby on Rails
Deployment with Ruby on RailsDeployment with Ruby on Rails
Deployment with Ruby on Rails
 
MVC for Desktop Application - Part 3
MVC for Desktop Application - Part 3MVC for Desktop Application - Part 3
MVC for Desktop Application - Part 3
 
Software Requirements Specification for restaurant management system
Software Requirements Specification for restaurant management systemSoftware Requirements Specification for restaurant management system
Software Requirements Specification for restaurant management system
 
Software Requirement Specification
Software Requirement SpecificationSoftware Requirement Specification
Software Requirement Specification
 
Project Plan And Srs Final
Project Plan And Srs FinalProject Plan And Srs Final
Project Plan And Srs Final
 
SRS for student database management system
SRS for student database management systemSRS for student database management system
SRS for student database management system
 
Software Requirement Specification
Software Requirement SpecificationSoftware Requirement Specification
Software Requirement Specification
 

Similar to Make GUI Apps with Shoes

Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
Building an e:commerce site with PHP
Building an e:commerce site with PHPBuilding an e:commerce site with PHP
Building an e:commerce site with PHP
webhostingguy
 

Similar to Make GUI Apps with Shoes (20)

Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7Intro to Ruby - Twin Cities Code Camp 7
Intro to Ruby - Twin Cities Code Camp 7
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
Ruby
RubyRuby
Ruby
 
The Why Of Ruby
The Why Of RubyThe Why Of Ruby
The Why Of Ruby
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift Talk
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)
 
Rails 2010 Workshop
Rails 2010 WorkshopRails 2010 Workshop
Rails 2010 Workshop
 
Learning To Walk In Shoes
Learning To Walk In ShoesLearning To Walk In Shoes
Learning To Walk In Shoes
 
Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
 
Building an e:commerce site with PHP
Building an e:commerce site with PHPBuilding an e:commerce site with PHP
Building an e:commerce site with PHP
 
Python slide
Python slidePython slide
Python slide
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
An Introduction To Shoes
An Introduction To ShoesAn Introduction To Shoes
An Introduction To Shoes
 
Intro to ruby
Intro to rubyIntro to ruby
Intro to ruby
 
Writing Apps the Google-y Way (Brisbane)
Writing Apps the Google-y Way (Brisbane)Writing Apps the Google-y Way (Brisbane)
Writing Apps the Google-y Way (Brisbane)
 
P2 2017 python_strings
P2 2017 python_stringsP2 2017 python_strings
P2 2017 python_strings
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fu
 
Getting Started with Microsoft Bot Framework
Getting Started with Microsoft Bot FrameworkGetting Started with Microsoft Bot Framework
Getting Started with Microsoft Bot Framework
 
Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015Design Patterns the Ruby way - ConFoo 2015
Design Patterns the Ruby way - ConFoo 2015
 

More from Brian Hogan

FUD-Free Accessibility for Web Developers - Also, Cake.
FUD-Free Accessibility for Web Developers - Also, Cake.FUD-Free Accessibility for Web Developers - Also, Cake.
FUD-Free Accessibility for Web Developers - Also, Cake.
Brian Hogan
 
Responsive Web Design
Responsive Web DesignResponsive Web Design
Responsive Web Design
Brian Hogan
 
Turning Passion Into Words
Turning Passion Into WordsTurning Passion Into Words
Turning Passion Into Words
Brian Hogan
 

More from Brian Hogan (19)

Creating and Deploying Static Sites with Hugo
Creating and Deploying Static Sites with HugoCreating and Deploying Static Sites with Hugo
Creating and Deploying Static Sites with Hugo
 
Automating the Cloud with Terraform, and Ansible
Automating the Cloud with Terraform, and AnsibleAutomating the Cloud with Terraform, and Ansible
Automating the Cloud with Terraform, and Ansible
 
Create Development and Production Environments with Vagrant
Create Development and Production Environments with VagrantCreate Development and Production Environments with Vagrant
Create Development and Production Environments with Vagrant
 
Docker
DockerDocker
Docker
 
Getting Started Contributing To Open Source
Getting Started Contributing To Open SourceGetting Started Contributing To Open Source
Getting Started Contributing To Open Source
 
Rethink Frontend Development With Elm
Rethink Frontend Development With ElmRethink Frontend Development With Elm
Rethink Frontend Development With Elm
 
Testing Client-side Code with Jasmine and CoffeeScript
Testing Client-side Code with Jasmine and CoffeeScriptTesting Client-side Code with Jasmine and CoffeeScript
Testing Client-side Code with Jasmine and CoffeeScript
 
FUD-Free Accessibility for Web Developers - Also, Cake.
FUD-Free Accessibility for Web Developers - Also, Cake.FUD-Free Accessibility for Web Developers - Also, Cake.
FUD-Free Accessibility for Web Developers - Also, Cake.
 
Responsive Web Design
Responsive Web DesignResponsive Web Design
Responsive Web Design
 
Web Development with CoffeeScript and Sass
Web Development with CoffeeScript and SassWeb Development with CoffeeScript and Sass
Web Development with CoffeeScript and Sass
 
Building A Gem From Scratch
Building A Gem From ScratchBuilding A Gem From Scratch
Building A Gem From Scratch
 
Intro To Advanced Ruby
Intro To Advanced RubyIntro To Advanced Ruby
Intro To Advanced Ruby
 
Turning Passion Into Words
Turning Passion Into WordsTurning Passion Into Words
Turning Passion Into Words
 
HTML5 and CSS3 Today
HTML5 and CSS3 TodayHTML5 and CSS3 Today
HTML5 and CSS3 Today
 
Web Development With Ruby - From Simple To Complex
Web Development With Ruby - From Simple To ComplexWeb Development With Ruby - From Simple To Complex
Web Development With Ruby - From Simple To Complex
 
Stop Reinventing The Wheel - The Ruby Standard Library
Stop Reinventing The Wheel - The Ruby Standard LibraryStop Reinventing The Wheel - The Ruby Standard Library
Stop Reinventing The Wheel - The Ruby Standard Library
 
Intro to Ruby
Intro to RubyIntro to Ruby
Intro to Ruby
 
Story-driven Testing
Story-driven TestingStory-driven Testing
Story-driven Testing
 
Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009
 

Recently uploaded

Recently uploaded (20)

Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
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
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
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
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Make GUI Apps with Shoes

Editor's Notes

  1. Hi, I’m Brian, and I’m gonna talk to you about Shoes.
  2. No, not THOSE kind of shoes..
  3. This kind of Shoes. A simple framework for writing graphical apps in Ruby. You can use it to write fun stuff like games, or serious stuff like database viewers or a full-blown point-of-sale system.
  4. Highly dynamic, high level, 100% object oriented, 100% open source, and really easy to learn.
  5. The syntax is simple - no unnecessary semicolons or curly braces. The interpreter knows when lines end.
  6. so the type is set when you assign something to the variable.
  7. but once it’s set, it’s set.
  8. here we use the to_s method to turn the integer 25 into the string 25.
  9. This is pretty common though, so Ruby handles it.
  10. It even handles nils gracefully.
  11. Note that the parameters you pass in aren’t typed.
  12. This is a common pattern you see in Java, .Net, PHP, and other object oriented languages. You create instance bariables but you use getters and setters to access them.
  13. Ruby has a built-in way of handling this pattern. It’s a huge time-saver.
  14. Square brackets means array.
  15. Hashes are lookups. You have the curly braces surrounding the hash’s contents.
  16. HashRocket.
  17. Remember... everything is an object.
  18. The simplest Shoes app ever.
  19. Here we can make an alert pop up when we click the button. Notice how easy it is to read that code?
  20. Some methods set colors. Also notice that when we use hashes as parameters, it’s extremely clear to the reader of the code what’s configured. And the order doesn’t matter.
  21. You can create gradients if you create a range
  22. Shoes uses stacks to line elements on top of eachother. If you’ve done HTML, you can think of Stacks as block elements... each one starts on a new line.
  23. Flows simply align next to eachother.
  24. Shoes has helpers for various types of text.
  25. You can grab user input easily
  26. and you can make that input secret. It’s not encrypted in your code though.
  27. You can use a edit box instead of an edit line if you want a multiline input box
  28. You create dropdown lists by passing an array to the list box.
  29. The @names section contains the names we add, and names get added when we click the button.
  30. A window is just another Shoes app. There are some tricks you can use to pass data between the windows, too.
  31. The video player plays mp3s, oggs, avis, movs, flvs and more.
  32. When the app starts, these libraries get installed to the user’s home directory.
  33. This searches YouTube and displays thumbnails of videos it finds that match the search. Clicking a video plays the clip.
  34. This is a simple MP3 player.
  35. So you can load files, save files, and choose colors.
  36. Lots of people make games with Shoes, and it’s a great way to get your kids or younger siblings interested in programmin.g Since the code is open-source, you can learn from it.
  37. You can grab the sample apps you saw here from my repository on GitHub, and you can grab Shoes there too.