OS X에 놀러간 루비 이야기
-
Upload
byblue -
Category
Technology
-
view
1.184 -
download
4
description
Transcript of OS X에 놀러간 루비 이야기
![Page 1: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/1.jpg)
OS X에 놀러간 루비 이야기
deepblue @ openmaru
1
![Page 2: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/2.jpg)
2
![Page 3: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/3.jpg)
루비
루비 온 레일스
루비 코코아
맥 루비
3
![Page 4: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/4.jpg)
• 루비 1.8.6 p36+
• 루비젬• 레일스 1.2.3
• 루비 코코아 0.12.0
• DTrace
• BridgeSupport
• ScriptBridge
4
![Page 5: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/5.jpg)
5
![Page 6: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/6.jpg)
puts 'Hello Ruby!'
6
![Page 7: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/7.jpg)
class Greeter def initialize(name) @name = name.capitalize end
def salute puts "Hello #{@name}!" endend
g = Greeter.new("world")g.salute
7
![Page 8: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/8.jpg)
Objective-C와 루비
• 스몰토크• 카테고리 / 열린 클래스
• 오리 타이핑
8
![Page 9: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/9.jpg)
class Fixnum def -(op) self + op endend
1 - 1
1 - 1 #=> 0
#=> 2
9
![Page 10: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/10.jpg)
http://stuffthathappens.com/blog/2008/03/13/number-of-methods-in-the-string-class/
10
![Page 11: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/11.jpg)
for i in (1..3) do puts iend
(1..3).each {|i| puts i}
1.upto(3) {|i| puts i}
11
![Page 12: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/12.jpg)
http://blog.obiefernandez.com/content/2008/01/growth-in-ruby.html
12
![Page 13: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/13.jpg)
•happiness•sustainable productivity•beautiful code
13
![Page 14: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/14.jpg)
14
![Page 15: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/15.jpg)
for iPhone WebApp
• 최고의 MVC 웹 프레임워크
• Resource + Multi View
• Plugin: rails_iui
15
![Page 16: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/16.jpg)
16
![Page 17: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/17.jpg)
http://rubycocoa.sourceforge.net/ProjectsUsingRubyCocoa17
![Page 18: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/18.jpg)
왜 루비를?
• 재미, 생산성
• GC
• DSL -> 적은 코드
• attr_accessor :foo
• 익숙한 문법
• 스몰토크에 더 가깝다
18
![Page 19: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/19.jpg)
어떻게?
• Objective-C 객체를 내부적으로 관리
• 프록시• 메시지와 예외를 전달
• 객체 변환
19
![Page 20: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/20.jpg)
NSString *stringURL = @"http://deepblue.springnote.com/";
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:stringURL]
];
url = NSURL.URLWithString('http://deepblue.springnote.com')
NSWorkSpace.sharedWorkspace.openURL(url)
20
![Page 21: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/21.jpg)
[coder encodeObject:personName forKey:@'personName'];
coder.encodeObject_forKey(personName, 'personName')
21
![Page 23: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/23.jpg)
Rucola
• The Rails Way
• 디렉토리 구조 관례
• 명령행과 코드 생성기
• DSL
• Textmate!
• TDD / BDD
23
![Page 24: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/24.jpg)
24
![Page 25: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/25.jpg)
25
![Page 26: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/26.jpg)
26
![Page 27: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/27.jpg)
27
![Page 28: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/28.jpg)
notify_on('LoginSuccess') {|noti| check_main_window(true)
}
@implementation Foo -(id)init { NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:(loginSuceess:)
name:@"LoginSuccessNotification" object:nil]; } return self; } -(void)loginSuccess:(NSNotification *) notification { [self checkMainWindow:True] }@end
28
![Page 29: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/29.jpg)
describe 'ApplicationController' do before do @controller = ApplicationController.alloc.init end it "should set itself as the application delegate" do OSX::NSApp.expects(:delegate=).with(@controller) @controller.ib_outlet(:main_window).
expects(:inspect) @controller.awakeFromNib endend
29
![Page 30: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/30.jpg)
DEMO - DropBox
30
![Page 31: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/31.jpg)
31
![Page 32: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/32.jpg)
ib_outlet :url_text, :import_checkbox, :status_image, :background
ib_action :mode_changeddef mode_changed(sender) @status_image.image = load_image(import_mode? ? 'import' : 'attachment')end
def import_mode? @import_checkbox.state.to_i == 1end
def load_image(name) @image_loaded ||= {} return @image_loaded[name] if @image_loaded[name] bundle = OSX::NSBundle.mainBundle path = bundle.pathForImageResource(name) OSX::NSImage.alloc.initWithContentsOfFile(path)end
32
![Page 33: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/33.jpg)
def register_drop_target @background.register_drop self @status_image.register_drop selfend
33
![Page 34: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/34.jpg)
class DropArea < OSX::NSImageView def register_drop(controller) @controller = controller registerForDraggedTypes available_types end
# .... protected def available_types OSX::NSArray.arrayWithObjects(OSX::NSFilenamesPboardType, nil) endend
34
![Page 35: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/35.jpg)
def performDragOperation(sender) pb = sender.draggingPasteboard return false unless pb.availableTypeFromArray(available_types) paths = pb.propertyListForType(OSX::NSFilenamesPboardType).to_ruby paths.each do |path| @controller.import_mode? ? import(path) : attach(path) end if paths.respond_to?(:to_ary) trueend
35
![Page 36: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/36.jpg)
def import(path) url = @controller.springnote_client.import(path) url_obj = OSX::NSURL.URLWithString(url) OSX::NSWorkspace.sharedWorkspace.openURL url_objend
def attach(path) @controller.springnote_client.attach(path)end
36
![Page 37: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/37.jpg)
나머지 코드• OAuth
• KeyChain
• SecKeychainAddGenericPassword
• SecKeychainFindGenericPassword
• SpringnoteResources
• visit http://myruby.net/
37
![Page 38: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/38.jpg)
http://programming.nu/rubycocoa-and-rubyobjc
가끔은...
•두개의 언어가 섞여있다•이름 공간 충돌•객체 변환의 부담•객체 모델의 중복•Thread•GC
38
![Page 39: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/39.jpg)
• a port of Ruby 1.9 (with YARV)
• for the Objective-C runtime and GC
• Ruby objects = Objective-C objects
• Keyed Arguments
MacRuby
http://ruby.macosforge.org/39
![Page 40: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/40.jpg)
Links
• http://myruby.net/
• http://rubycocoa.springnote.com/
• http://rubycocoa.sourceforge.net/
• http://del.icio.us/byblue/ruby+cocoa
40
![Page 41: OS X에 놀러간 루비 이야기](https://reader035.fdocuments.net/reader035/viewer/2022062418/555a44a7d8b42a83368b52b8/html5/thumbnails/41.jpg)
Q & A
41