Slide 1

Slide 1 text

Using RubyMotion to Build Something Useful Chicago RubyMotion User Group November 19, 2013 Chicago, IL USA

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Demos What & Why Q & A

Slide 4

Slide 4 text

Demo: iOS

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

126 def start_game_timer 127 @game_timer = NSTimer.scheduledTimerWithTimeInterval(0.01, 128 target: self, 129 selector: "move_ball", 130 userInfo: nil, 131 repeats: true) 132 end

Slide 7

Slide 7 text

78 def move_ball 79 # If ball exits right, +1 for the left player 80 if (@ball_view.center.x > self.view.frame.size.width) 81 increment_left_score 82 @direction_x *= -1 83 self.reset_ball 84 end 85 86 # If ball exits left, +1 for the right player 87 if (@ball_view.center.x < 0) 88 increment_right_score 89 @direction_x *= -1 90 self.reset_ball 91 end 92 93 # If ball hits top or bottom wall, bounce y in the opposite direction. x-direction remains unchanged. 94 if ((@ball_view.center.y + @ball_view.frame.size.height > ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! self.view.frame.size.height) || @ball_view.frame.origin.y < 0) 95 @direction_y *= -1 96 end 97 98 # If the ball didn't hit anything, keep on moving... 99 @ball_view.center = [@ball_view.center.x + @direction_x, @ball_view.center.y + @direction_y] 100 101 # If ball collides with a paddle, change direction. 102 check_paddle_collision 103 104 end

Slide 8

Slide 8 text

Demo: OS X

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Code: OS X

Slide 14

Slide 14 text

def ejectThreeDisks alert = NSAlert.alloc.init response = %x(/usr/sbin/diskutil eject SiiGBlack) + "\n" response += %x(/usr/sbin/diskutil eject Ultra3TB) + "\n" response += %x(/usr/sbin/diskutil eject WDSilver) + "\n" alert.setMessageText response alert.addButtonWithTitle "OK" alert.runModal ! !end

Slide 15

Slide 15 text

@TwitterAPI http://www.businessweek.com/articles/2013-11-07/the-hidden-technology-that-makes-twitter-huge

Slide 16

Slide 16 text

@TwitterAPI v1.1 JSON only. Authentication required.

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

What?

Slide 19

Slide 19 text

RubyMotion Objective-C ARM x86 LLVM logo by Teresa Chang http://llvm.org/Logo.html

Slide 20

Slide 20 text

RubyMotion Objective-C ARM x86 Without LLVM: Extra work.

Slide 21

Slide 21 text

Xcode RubyMotion Editor

Slide 22

Slide 22 text

Why?

Slide 23

Slide 23 text

Mobile MVP. Now.

Slide 24

Slide 24 text

Learn more Ruby.

Slide 25

Slide 25 text

Why not?

Slide 26

Slide 26 text

Ruby’s future on iOS & OS X.

Slide 27

Slide 27 text

Demo: REPL

Slide 28

Slide 28 text

~/Code/Ruby/RubyMotion$ motion create helloruby Create helloruby Create helloruby/.gitignore Create helloruby/Rakefile Create helloruby/app Create helloruby/app/app_delegate.rb Create helloruby/resources Create helloruby/spec Create helloruby/spec/main_spec.rb ~/Code/Ruby/RubyMotion$

Slide 29

Slide 29 text

~/Code/Ruby/RubyMotion/helloruby$ rake Build ./build/iPhoneSimulator-6.0-Development Compile ./app/app_delegate.rb Compile ./app/home_controller.rb Link ./build/iPhoneSimulator-6.0-Development/helloruby.app/helloruby Create ./build/iPhoneSimulator-6.0-Development/helloruby.dSYM Simulate ./build/iPhoneSimulator-6.0-Development/helloruby.app (main)>

Slide 30

Slide 30 text

~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$

Slide 31

Slide 31 text

~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$

Slide 32

Slide 32 text

1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 @window.backgroundColor = UIColor.grayColor 7 true 8 end 9 end

Slide 33

Slide 33 text

1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 @window.backgroundColor = UIColor.grayColor 7 true 8 end 9 end

Slide 34

Slide 34 text

1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 @window.backgroundColor = UIColor.grayColor 7 true 8 end 9 end

Slide 35

Slide 35 text

1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 @window.backgroundColor = UIColor.grayColor 7 true 8 end 9 end

Slide 36

Slide 36 text

1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 @window.backgroundColor = UIColor.grayColor 7 true 8 end 9 end

Slide 37

Slide 37 text

3 @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) Resource Raw Object Allocation Initialization Object Source: Object Creation, https://developer.apple.com

Slide 38

Slide 38 text

Human Interface Guidelines (HIG)

Slide 39

Slide 39 text

Interface Builder .xib files

Slide 40

Slide 40 text

FizzBuzz

Slide 41

Slide 41 text

view.viewWithTag 1 Object ID = 1 1

Slide 42

Slide 42 text

~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$

Slide 43

Slide 43 text

resources/fbib.xib

Slide 44

Slide 44 text

1 class FizzBuzzViewController < UIViewController 2 3 def loadView 4 views = NSBundle.mainBundle.loadNibNamed "fbib", owner:self, options:nil 5 self.view = views[0] 6 @counter = 0 7 @view_handle = self.view 8 end

Slide 45

Slide 45 text

10 def viewDidLoad 11 @label = view.viewWithTag 1 12 plus_button = view.viewWithTag 2 13 minus_button = view.viewWithTag 3 14 reset_button = view.viewWithTag 4 15 end

Slide 46

Slide 46 text

FizzBuzz

Slide 47

Slide 47 text

TDD MacBacon, Guard, & rm-redgreen

Slide 48

Slide 48 text

~/Code/Ruby/RubyMotion/fizzbuzzrm[master]$ tree . !"" Gemfile !"" Gemfile.lock !"" Guardfile !"" Rakefile !"" app # !"" app.rb # !"" app_delegate.rb # !"" fizzbuzz_view_controller.rb # !"" home_controller.rb # !"" kernel.rb # !"" rm-ansiterm.rb # $"" string.rb !"" interfaces !"" resources $"" spec !"" 00-redgreen.rb !"" home_controller_spec.rb $"" main_spec.rb

Slide 49

Slide 49 text

1 describe "FizzBuzz Calculator Function" do 2 before do 3 @this_number = 38 4 end ... 17 18 (1..10).each do |this_number| 19 if this_number % 15 == 0 20 it 'should return buzz for multiples of 15' do 21 HomeController.fizzbuzz_calc(this_number).should == 'fizzbuzz' 22 end 23 elsif this_number % 3 == 0 24 it 'should return fizz for multiples of 3' do 25 HomeController.fizzbuzz_calc(this_number).should == 'fizz' 26 end 27 elsif this_number % 5 == 0 28 it 'should return buzz for multiples of 5' do 29 HomeController.fizzbuzz_calc(this_number).should == 'buzz' 30 end 31 else 32 it 'should return the original number' do 33 HomeController.fizzbuzz_calc(this_number).should == this_number 34 end 35 end 36 end 37 end home_controller_spec.rb

Slide 50

Slide 50 text

describe "FizzBuzz Calculator Function" do before do @this_number = 38 end ... (1..10).each do |this_number| if this_number % 15 == 0 it 'should return buzz for mults of 15' do HomeController.fizzbuzz_calc(this_number) .should == 'fizzbuzz' end home_controller_spec.rb

Slide 51

Slide 51 text

Ruby Version Manager (RVM)

Slide 52

Slide 52 text

$ gem install formotion

Slide 53

Slide 53 text

1 $:.unshift("/Library/RubyMotion/lib") 2 require 'motion/project/template/ios' 3 require "bundler/gem_tasks" 4 require "bundler/setup" 5 6 $:.unshift("./lib/") 7 require './lib/formotion' 8 9 Motion::Project::App.setup do |app| 10 # Use `rake config' for project settings. 11 app.name = 'Formotion' 12 end Rakefile Source: http://clayallsopp.com

Slide 54

Slide 54 text

1 class LoginController < Formotion::FormController 2 def init 3 form = Formotion::Form.new({ 4 title: "Login", 5 sections: [{ 6 rows: [{ 7 title: "User Name", 8 type: :string, 9 placeholder: "name", 10 key: :user 11 }, { 12 ... Source: http://clayallsopp.com

Slide 55

Slide 55 text

Source: http://clayallsopp.com

Slide 56

Slide 56 text

$ gem install bubble-wrap $ gem install sugarcube

Slide 57

Slide 57 text

Source: Ben Scheirman of http://nsscreencast.com/

Slide 58

Slide 58 text

~/Code/Ruby/RubyMotion$ ios profiles:list +----------------------------------+--------------+---------+ | Profile | App ID | Status | +----------------------------------+--------------+---------+ | WisdomGroup iOS Development | ABCDEFGHIJ.* | Active | | WisdomGroup RubyMotion | ABCDEFGHIJ.* | Active | | ChicagoRubyRubyMotion iPad | ABCDEFGHIJ.* | Active | | iOS Team Provisioning Profile: * | ABCDEFGHIJ.* | Active | | RTHiPhone4S | ABCDEFGHIJ.* | Active | +----------------------------------+--------------+---------+ ~/Code/Ruby/RubyMotion$ ios help $ gem install cupertino

Slide 59

Slide 59 text

$ gem install cocoapods $ pod setup $ gem install motion-cocoapods

Slide 60

Slide 60 text

$ rake ctags

Slide 61

Slide 61 text

Resources http://rubymotion-tutorial.com Multi-page tutorial by Clay Allsopp. Also see http://clayallsopp.com http://pragmaticstudio.com/screencasts/rubymotion Pragmatic Studio’s intro to RubyMotion (free) plus a paid intro to Ruby. http://chicagoruby.org/videos/archives/2012/09/04/rubymotion-for-rubyists/ Bill Svec builds a simple RubyMotion weather app in about 90 minutes. http://motioncasts.tv Tutorial videos by Michael Erasmus and Hendrik Swanepoel. http://nshipster.com Mattt Thompson's weekly journal of Objective-C and Cocoa. http://nsscreencast.com/ Ben Scheirman’s Objective-C screencasts, plus a short one on RubyMotion.

Slide 62

Slide 62 text

Thanks!