Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mruby & MobiRuby

mruby & MobiRuby

Yuichiro MASUI

February 13, 2013
Tweet

More Decks by Yuichiro MASUI

Other Decks in Programming

Transcript

  1. MobiRuby
    iOS + Ruby = Super Awesome!!
    Thursday, February 14, 13

    View Slide

  2. Hi! I’m @masuidrive.
    • Yuichiro MASUI - Ichi
    • Open source developer, Ruby fun
    • Pukiwiki, Ruby on Rails tutorial movie in
    Japanese, IKEA hacker
    • Furo-grammer (Coding in hot tub)
    • FrogApps, Inc. CTO // ex-Appcelerati
    Thursday, February 14, 13

    View Slide

  3. Hi! I’m @masuidrive.
    • Yuichiro MASUI - Ichi
    • Open source developer, Ruby fun
    • Pukiwiki, Ruby on Rails tutorial movie in
    Japanese, IKEA hacker
    • Furo-grammer (Coding in hot tub)
    • FrogApps, Inc. CTO // ex-Appcelerati
    ϛΠϧ
    Thursday, February 14, 13

    View Slide

  4. mruby
    Thursday, February 14, 13

    View Slide

  5. mruby
    • Ruby for less resources
    • ISO/JIS compliant
    • CRuby subset. Not included File, Socket,
    Thread and more ext libraries
    • OS / CPU Independent
    • Not required POSIX, only C99
    Thursday, February 14, 13

    View Slide

  6. Configurable
    • Drop off unnecessary features
    • Parser / Compiler
    • Struct, Time, Math, STDIO, Regexp, sprintf
    • Table algorithm - hash or list
    • NaN Boxing
    Thursday, February 14, 13

    View Slide

  7. mruby target
    • Embedded
    • Digital Appliance
    • Game console
    • Vendor machine
    • Bundle with applications
    Thursday, February 14, 13

    View Slide

  8. mruby internals
    • VM structure - Multi VM instance
    • No C global variable
    • Generational incremental GC (Mark&Sweep)
    • Not thread safe
    • Build system build on CRuby
    Thursday, February 14, 13

    View Slide

  9. development
    • Spring 2010 - Subsidy
    • Matz, some companies and colleges
    • April 22, 2012 - Publish to GitHub
    • mruby got some contributors
    Thursday, February 14, 13

    View Slide

  10. mrbgems
    • Daniel (@bovi) created extension package
    feature at end of Nov 2012.
    • Easy to install from GitHub
    • Supported cross build
    • Already provided 40+ gems
    Thursday, February 14, 13

    View Slide

  11. mrbgems
    • Daniel (@bovi) created extension package
    feature at end of Nov 2012.
    • Easy to install from GitHub
    • Supported cross build
    • Already provided 40+ gems
    Thursday, February 14, 13

    View Slide

  12. Thursday, February 14, 13

    View Slide

  13. Thursday, February 14, 13

    View Slide

  14. When will you release RiteVM? I want to run it on iOS/
    Android
    .
    It’s mruby. I need more time to make public (probably
    June) Should I give you access to private repos?
    Yes! I want to try it!
    What’s your github account?
    Thursday, February 14, 13

    View Slide

  15. Thursday, February 14, 13

    View Slide

  16. What’s MobiRuby?
    • iOS app development kit on mruby
    • MIT license
    • Can access native functions
    • Have plan for Android version
    • Already released MobiRuby based app
    • Search “mobiruby” in AppStore on iOS
    Thursday, February 14, 13

    View Slide

  17. Vision
    • Provide Ruby power to Mobile devices
    • Meta programming is most important Ruby
    power
    Thursday, February 14, 13

    View Slide

  18. Hello world
    \
    class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, index|
    if index.to_i == 1
    app = Cocoa::UIApplication._sharedApplication
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    alert = Cocoa::MyAlertView._alloc._initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    Thursday, February 14, 13

    View Slide

  19. Hello world
    \
    class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, index|
    if index.to_i == 1
    app = Cocoa::UIApplication._sharedApplication
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    alert = Cocoa::MyAlertView._alloc._initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    Thursday, February 14, 13

    View Slide

  20. class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, idx|
    if idx.to_i == 1
    app = Cocoa::UIApplication._sharedApplica
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, idx|
    if idx.to_i == 1
    app = Cocoa::UIApplication._sharedApplica
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    Hello world - 1st half
    Thursday, February 14, 13

    View Slide

  21. class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, idx|
    if idx.to_i == 1
    app = Cocoa::UIApplication._sharedApplica
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    Hello world - 1st half
    class Cocoa::MyAlertView < Cocoa::UIAlertView
    Thursday, February 14, 13

    View Slide

  22. class Cocoa::MyAlertView < Cocoa::UIAlertView
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, idx|
    if idx.to_i == 1
    app = Cocoa::UIApplication._sharedApplica
    urlstr = "http://mobiruby.org"
    url = Cocoa::NSURL._URLWithString(urlstr)
    app._openURL url
    end
    end
    end
    define C::Void, :alertView, Cocoa::Object,
    :clickedButtonAtIndex, C::Int do |me, idx|
    Hello world - 1st half
    Thursday, February 14, 13

    View Slide

  23. Hello world - 2nd half
    \
    alert = Cocoa::MyAlertView._alloc.
    _initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    alert = Cocoa::MyAlertView._alloc.
    _initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    Thursday, February 14, 13

    View Slide

  24. Hello world - 2nd half
    \
    alert = Cocoa::MyAlertView._alloc.
    _initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    alert = Cocoa::MyAlertView._alloc.
    _initWithTitle "Hello",
    :message, "I am MobiRuby",
    :delegate, nil,
    :cancelButtonTitle, "I know!",
    :otherButtonTitles, "What's?", nil
    alert._setDelegate alert
    alert._show
    Thursday, February 14, 13

    View Slide

  25. Next step
    \
    class MyAlertView < MobiRuby::AlertView
    title "Hello"
    message "I am MobiRuby"
    cancelButton "I know!" do
    end
    button "What's?" do
    openURL "http://mobiruby.org"
    end
    end
    alert = MyAlertView.new
    alert.show
    Thursday, February 14, 13

    View Slide

  26. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  27. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  28. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  29. mruby-cfunc
    • C function bridge for mruby
    • Call C based function directly
    • Based on libFFI
    • Same as Ruby/DL library on CRuby
    Thursday, February 14, 13

    View Slide

  30. mruby-cfunc
    str = "STRING"
    CFunc::call(CFunc::Void, "puts", str)
    STRING
    Thursday, February 14, 13

    View Slide

  31. mruby-cfunc
    str = "STRING"
    ptr = CFunc::Pointer.malloc(7)
    result_ptr = CFunc::call(CFunc::Pointer,
    "strcpy", ptr, str)
    ptr.to_s
    -> “STRING”
    Thursday, February 14, 13

    View Slide

  32. mruby-cfunc
    \
    class TestStruct < CFunc::Struct
    define CFunc::SInt8, :x,
    CFunc::SInt16, :y
    end
    test = TestStruct.new
    test[:x] = 10
    Thursday, February 14, 13

    View Slide

  33. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  34. mruby-cocoa
    • Cocoa bridge for mruby
    • Use Cocoa functions transparently
    • Based on mruby-cfunc and Cocoa runtime
    • Manipulate Cocoa objects
    • Create class/instance, inherit existing classes
    • Garbage collection
    Thursday, February 14, 13

    View Slide

  35. Bridge Cocoa runtime
    • Objective-C has powerful runtime features
    • Create and modify class dynamically
    • ObjC class <- Ruby class <- ObjC class
    • ObjC value interconverted with Ruby value
    • Supported delegate and blocks
    Thursday, February 14, 13

    View Slide

  36. Memory
    management
    • Objective-C - Reference count
    • mruby - Mark & Sweep
    • Swizzled Objective-C “release” method
    • awful performance bottleneck
    Thursday, February 14, 13

    View Slide

  37. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  38. mobiruby-common
    • Will be common utilities with Android ver.
    • require method
    • Some POSIX based functions
    Thursday, February 14, 13

    View Slide

  39. MobiRuby stack
    iOS
    mruby
    mruby-
    cfunc
    Your code
    mruby-
    cocoa
    mobiruby-
    common
    mobiruby-
    ios
    Thursday, February 14, 13

    View Slide

  40. mobiruby-ios
    • iOS specific utilities
    • Bootstrap
    • Xcode integration
    • Wrapped classes
    Thursday, February 14, 13

    View Slide

  41. Wrapped APIs
    \
    class MyAlertView < MobiRuby::AlertView
    title "Hello"
    message "I am MobiRuby"
    cancelButton "I know!" do
    end
    button "What's?" do
    openURL "http://mobiruby.org"
    end
    end
    alert = MyAlertView.new
    alert.show
    Thursday, February 14, 13

    View Slide

  42. Road map
    • Finished building Cocoa bridge
    • Fix bugs, Improvement
    • Packaging
    • Documentation
    • Build wrapped APIs
    Thursday, February 14, 13

    View Slide

  43. Road map
    • Finished building Cocoa bridge
    • Fix bugs, Improvement
    • Packaging
    • Documentation
    • Build wrapped APIs
    Version 1
    Q1 2013
    Thursday, February 14, 13

    View Slide

  44. Road map
    • Finished building Cocoa bridge
    • Fix bugs, Improvement
    • Packaging
    • Documentation
    • Build wrapped APIs
    Version 1
    Q1 2013
    Thursday, February 14, 13

    View Slide

  45. Current status
    • Already MobiRuby based app is in AppStore
    • Finally released alpha 1
    • Can call almost iOS native functions
    • Writing test codes
    • It's only for iOS and mruby hackers
    Thursday, February 14, 13

    View Slide

  46. Pros.
    • Ruby power
    • Based on Matz implemented Ruby
    • mrbgems
    • MIT license
    • Compact (~4000 lines)
    Thursday, February 14, 13

    View Slide

  47. Cons.
    • Unstable
    • Less classes / functions
    • Don't have debugging feature
    • Need to understand iOS and Cocoa
    Thursday, February 14, 13

    View Slide

  48. Action!
    • Provide Ruby Power to the world
    • Create worldwide portfolio
    • Talk it at one or two foreign conferences
    Thursday, February 14, 13

    View Slide

  49. Questions?
    • If you have more questions, please tweet to
    @mobiruby or post to github issues.
    • http://twitter.com/mobiruby
    • http://github.com/mobiruby
    Thursday, February 14, 13

    View Slide

  50. Thank you
    • Logo design: Maylis Agniel
    • English review: @tenderlove and ebi-chan
    • http://mobiruby.org
    • http://github.com/mobiruby
    • http://twitter.com/mobiruby
    • http://fb.me/mobiruby
    Thursday, February 14, 13

    View Slide