RubyMotion 㧠AWS iOS SDK ã使ã (ããã㯠Objective-C ã©ã¤ãã©ãªã®ä½¿ãæ¹ããããã¯ãã©ã¯ã¨10ã«ã¤ãã¦)
ããã³ãå³æããRuby・・・ã
ããã³ãå·¦æããiOS SDK・・・ã
ããã³ãåä½!!!ã
ããã³ãéåè§£æ¾ RubyMotion!!!!ã
・・・ãããããç´ãæãããã§ãããããã«ã¡ã¯ãã¿ãªãããã©ã¯ã¨10ãã£ã¦ã¾ããï¼ã¼ãã¯å ¨è·ã«ã³ã¹ããªã®ã§ãã£ã¦ã¾ããï¼ãã¨æ°æ¥ã§å ¬éã®ããã1.2ãå¾ ã¡ç¦ããã¦ãã¾ãã次ã®ã¢ãããã¼ãã«æå¾ ãã¦ãã®ã¯ãªãã¨ãã£ã¦ãéæ³æ¦å£«ã§ãããã以åã«ã¿ãã¨ããã«ããã¨éæ³æ¦å£«ã«ã¯MPãä»ã®ãã¬ã¤ã¤ã¼ã«åãä¸ããMPããµã¼ã¨ããè·æ¥ã¹ãã«ããã£ã¦ããã©ãã£ã³ã®HPããµã¼ãå°ç¨ãããªãã£ãããã«ãããéå°ç¨ã¹ãã«ã®ããã§ããã¨ããããã¨ã¯ï¼ä½ã£ãMPãæ¦é家ãªãçè³ãªãã«åãã¦ç¡éã¿ã¤ã¬ã¼ã¯ãã¼ãªãã¦ãã¨ãå¯è½ãããããã¯ç±ã・・・å½åäºå®ã®MPããµã¼ã®ä»æ§ã«ä¿®æ£ãå ¥ããªããã°ãã§ããã©ãã¹ãã£ãã¯100ã«æ¯ã£ã¦ãèªåã¨ãã¦ã¯ã¹ã¼ãã¼ã¹ã¿ã¼ãã¹ãã£ãã¯è£ åå¯è½ã ã£ãã®ãã°ãã¨æ¥ã¾ããããã¨ã¯ã¤ã³ã¹ã¿ã³ã¹ã ・・・ ããããã¿ã¾ãããRubyMotionã®è©±ã§ããããRubyMotionã
ãããªãã㧠RubyMotion ãã AWS iOS SDK ã使ããã¨ãã話ãRubyMotion Advent Calendar 2012 (http://www.adventar.org/calendars/18) ã®21æ¥ç®ã®è¨äºã¨ãªãã¾ã¼ãã
RubyMotion ã¨ãµã¼ããã¼ãã£ã©ã¤ãã©ãª
RubyMotion ã¨è¨ãã° BubbleWrap ã SugarCube ãªã©ã®ãRuby like ãªã·ã³ã¿ãã¯ã¹ãå¼·åããçãªã©ããã¼ç³»ã©ã¤ãã©ãªã«æ³¨ç®ãéã¾ããã¡ã§ããå æ¥ã Clay Allsopp ãããä¾ã«ãã£ã¦ http://rubymotion-wrappers.com/ ãªãã¼ã¸ãå ¬éãã¦ãã¾ãããããã§ããã
ä¸æ¹ãè¨å¤§ãªæ¢åè³ç£ã§ããæ¢åã® rubygems ããã®ã¾ã¾ã§ã¯ä½¿ããªããã¨ããã®ã RubyMotion ã®æ®å¿µãªã¨ããã®ã²ã¨ã¤ã¨ãããã¾ããããã§ããããèªåã¯ç´ ã® Ruby ã®æ¹ã¯ãã¾ãæ¸ããªãã®ã§ããã§ããã©ãCPAN ã使ããªã perl ã¨è¨ããããããããé£åã ã¨æããããå¾ãªãã
ã ãããã! RubyMotion ã®æ¡å¼µã¨ããæå³ã§éè¦ãªã®ã¯ BubbleWrap ã§ã rubygems ã§ããªãã®ã ã諸å!
RubyMotion 㯠Objective-C ã®ã·ã³ã¿ãã¯ã¹ã Ruby ã¨ã»ã¼1対1ã§ãããã³ã°ãã¦ããã¨ããé¢ä¿ä¸ãæ¢åã® Objective-C ãªã©ã¤ãã©ãªãã»ã¼ãã®ã¾ã¾å©ç¨ã§ãããã§ããiOS ã®ã¢ããªãéçºããã«ããã£ã¦æ¢åã® rubygems ã®ã©ã¤ãã©ãªã使ãããã¨ã¨ãObjective-C ã®ã©ã¤ãã©ãªã使ãããã¨ã©ã£ã¡ãéè¦ãã¨è¨ããããå¾è ã ã¨ãã人ã¯å¤ãã®ã§ã¯ãªãã§ãããããè¤é㪠GUI ç³»ã®å®è£ ã¨ããããããã®ãæ¢åã®å®è£ ããæµç¨ã§ããã¨èããã°ã
Cocoapods 㨠RubyMotion ã®ç´ æµãªé¢ä¿
ã¨ãã㧠Objective-C ã§å¤é¨ã©ã¤ãã©ãªã¨ããã°ãå°ãåã¾ã§ã¯ãã¤ã³ã¿ã¼ãããä¸ã®é©å½ãªãµã¤ããããã¦ã³ãã¼ããã¦ãã¦è§£åã㦠Xcode ã§ããã¸ã§ã¯ãã«è¿½å ãã・・・çãªãã®ã§ããããã¼ã¸ã§ã³ç®¡çãã®ä»ã®æ©æ§ã¯å ¨ããªãããã®è¾ºã¯æå¼å½ãªæãã§ããã®ã«ãã£ã¦ãã¬ã¼ã ã¯ã¼ã¯ã®è¿½å ã®ä»æ¹ãéã£ãããã¦ãã©ã¤ãã©ãªä¸å使ãå§ããã®ã«ã¯ã¾ã£ã¡ãããªãã¦ãã¨ããã°ãã°ããã¾ã©ãããããªãã・・・ã¨æºæ¯ãã¤ããiOSã¢ããªéçºè ã®æ°ã¯å¤©æå¦çæ°åã«ä¸ãããã§ãã
ãã㧠CocoaPods ã®ç»å ´ã§ãã
è¦ã¦ã®ã¨ãã Cocoa åãå¤é¨ã©ã¤ãã©ãªã®éç©æãBundler çãªããã³ãã¨ã³ãã使ã£ã¦ä¾åé¢ä¿å«ããã¤ã³ã¹ãã¼ã«å¨ãã管çã§ãã¾ããç´ æµï¼ èªåãåã㦠Cocoapods ã«ã¤ãã¦è³ã«ããã®ã¯ 2011 å¹´ããã§ã確ããã®ãããã«ãªãªã¼ã¹ããããã®ã ã¨è¨æ¶ãã¦ãã¾ããå½åã¯ç»é²ããã¦ããã©ã¤ãã©ãªãå¤ããªãã£ãã®ã§ã¾ã ã¾ã ããããã¨ããæãã§ããããçµæ§ãªæéãçµã£ã¦ãã¦ã ãã¶ãã®è¾ºãå å®ãã¦ãã¾ããã
ã§ãRubyMotionãRubyMotion 㯠Objective-C ã®å¤é¨ã©ã¤ãã©ãªãã»ã¼ãã®ã¾ã¾ä½¿ããã¨ããç¹æ§ãæ´»ãã㦠Cocoapods ãããããªä½¿ãã¾ããmotion-cocoapods ã¨ããããã³ãã¨ã³ãã使ã£ã¦çµ±åãã¾ãã
è¦ã¦ã®ã¨ãã HipByte ãéçºãã¦ããã®ãå®å¿ã§ãããã³ãã³ããã¿ã® @watson1978 ããã®ã¢ã¤ã³ã³ãè¦ãã¾ããã
motion-cocoapods ã®ä½¿ãæ¹ã¯é常ã«æ¥½ã¨ããããCUI ã¡ã¤ã³ã«ãªã£ã¦ãã RubyMotion ã¨ãããã¨ããã£ã¦ Objective-C 㧠Cocoapods 使ãã¨ããããããã«ç°¡åã§ãã
% gem install motion-cocoapods % pod setup
ã§ã¤ã³ã¹ãã¼ã«ãã¦ãRubyMotion ã¢ããªã±ã¼ã·ã§ã³ã® Rakefile ã«
$:.unshift("/Library/RubyMotion/lib") require 'motion/project' require 'motion-cocoapods' Motion::Project::App.setup do |app| app.name = 'AWS' # ãã®è¾º app.pods do pod 'AWSiOSSDK' end end
ã¨æ¸ãã ããRakefile ã Bundler ã§ããã¨ããã® GemfileãCocoapods ã§ããã¨ããã® PodfileãCarton ã§ããã¨ããã® Makefile.PL ã«ç¸å½ãã¦ãã¾ããå¼æ°ã§ãã¼ã¸ã§ã³ãæå®ããããã¨ãã£ãããªãã¿ã®æ©è½ãããã¾ãã
ã§ããã¨ã¯ãã¤ãéãã»ã®ã¼ã® rake ãã㨠vendor ãã£ã¬ã¯ããªå ã«ã©ã¤ãã©ãªãä¸è¨ã®å ´å㯠AWSiOSSDK ãå±éããã¦ãã«ãããããããã§ãµã¼ããã¼ãã£ã©ã¤ãã©ãªãæä¾ãã API ãå¼ã¶ãã¨ãã§ããããã«ãªãã¾ãããªã«ããç°¡åããã・・・ã
RubyMotion ãã Amazon S3 ã«åçãã¢ãããã¼ããããï¼
ã»ãã¨ã«ã¡ããã¨åãã®ãã? ã¨ãããã¨ã§æ¤è¨¼ãã¾ããããAWS SDK for iOS (http://aws.amazon.com/jp/sdkforios/) ã RubyMotion ã¢ããªãã使ã£ã¦ã¿ã¾ãããã¼ã«ã«ã®ãã©ãã©ã¤ãã©ãªã®åçã Amazon S3 ã«ã¢ãããã¼ããããç½²åã¤ãURLãçºè¡ãã¦ãããé²è¦§ããã¨ããäºã¤ã®æ©è½ãããã£ã¨SDKã®ãµã³ãã«ããRubyMotionã«ç§»æ¤ãã¦ã¿ã¾ãããã
ãªã SDK ã®ä½¿ãæ¹ã¯ http://www.slideshare.net/AmazonWebServicesJapan/aws-sdk-for-android-and-ios ã«ãã AWS ã®çããã®ã¹ã©ã¤ããåèã«ãªãã¾ããã
ã§ãã½ã¼ã¹ã¯ãã¡ãã
ã³ã³ããã¼ã©ã®ã³ã¼ããè²¼ã£ã¦ããã¾ãããã
class S3UploadViewController < UIViewController ACCESS_KEY_ID = "â¦" SECRET_KEY = "â¦" def viewDidLoad super self.navigationItem.title = "S3 Uploader in Motion" self.view.backgroundColor = UIColor.whiteColor @s3 = AmazonS3Client.alloc.initWithAccessKey(ACCESS_KEY_ID, withSecretKey: SECRET_KEY) response = @s3.createBucket(S3CreateBucketRequest.alloc.initWithName("s3uploader-motion-sample")) if (response.error != nil) alert(response.error) end UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |button| button.setTitle("Upload Photo", forState:UIControlStateNormal) button.frame = [[10, 100], [view.frame.size.width - 20, 40]] button.when(UIControlEventTouchUpInside) do showImagePicker end self.view.addSubview(button) end UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |button| button.setTitle "Open Photo", forState:UIControlStateNormal button.frame = [[10, 150], [view.frame.size.width - 20, 40]] button.when(UIControlEventTouchUpInside) do showInBrowser end self.view.addSubview(button) end end def showImagePicker UIImagePickerController.new.tap do |picker| picker.delegate = self self.presentModalViewController(picker, animated:true) end end def imagePickerController(picker, didFinishPickingMediaWithInfo: info) image = info.objectForKey(UIImagePickerControllerOriginalImage) processDispatchUpload(UIImageJPEGRepresentation(image, 1.0)) picker.dismissModalViewControllerAnimated(true) end def processDispatchUpload(imageData) UIApplication.sharedApplication.setNetworkActivityIndicatorVisible(true) Dispatch::Queue.concurrent.async do req = S3PutObjectRequest.alloc.initWithKey("sample.jpg", inBucket: "s3uploader-motion-sample").tap do |r| r.contentType = "image/jpeg" r.data = imageData end response = @s3.putObject(req) Dispatch::Queue.main.sync do if (response.error != nil) alert(response.error) end UIApplication.sharedApplication.setNetworkActivityIndicatorVisible(false) end end end def showInBrowser Dispatch::Queue.concurrent.async do request = S3GetPreSignedURLRequest.new.tap do |r| r.key = "sample.jpg" r.bucket = "s3uploader-motion-sample" r.expires = NSDate.dateWithTimeIntervalSinceNow(3600) r.responseHeaderOverrides = S3ResponseHeaderOverrides.new.tap { |o| o.contentType = "image/jpeg" } end err = Pointer.new(:object) url = @s3.getPreSignedURL(request, error:err) Dispatch::Queue.main.sync do if (url == nil) if (error[0] != nil) alert(error[0]) end else App.open_url(url) end end end end def alert(msg) UIAlertView.new.tap do |v| v.message = msg v.show end end end
ä¾ãã° @s3.createBucket(â¦)"
ã¨ããã®è¾ºã SDK ãæä¾ãã API ã§ãããã¤ãéã Objective-C â RubyMotion ã¸ã®ã·ã³ã¿ãã¯ã¹å¤æã«ã¼ã«ã«å¾ã£ã¦å¼ã¶ã ããSDK ããã¨ã㨠Objective-C åãã®è¨è¨ã«ãªã£ã¦ãã®ã§ AWS SDK for Ruby ã«æ¯ã¹ã㨠Ruby ããããªã API ã§ãããã¾ããã®è¾ºã¯ç®ãã¤ã¶ãã¾ããããããã¨ãªã£ãããããããã©ãããæ¸ãã¦ãã¾ãã°ããããã§ãã
API ã³ã¼ã«ã«ãã£ã¦ã¯ AWS ã« HTTP ãªã¯ã¨ã¹ããçºè¡ãã¦ãããã¯ããã¨ãããããã®ã§ããã㯠GCD ã使ã£ã¦ä¸¦è¡å¦çãã¦ãã¾ããDispatch::Queue ã§å²ãã§ããã¨ããã§ããããã®è¾ºãããã£ã¨æ¸ããã®ãè¯ãã§ããã
å®éåããã¦ã¿ã¾ãããã
ãããªæãã§ç«ã¡ä¸ãã
ããã«ã¼ã§åçãé¸æããã¨ãAmazon S3ã«ã¢ãããã¼ãããã¾ãã
ç½²åä»ãURLãçºè¡ãã¦ãã©ã¦ã¶ã§ç¢ºèªãã¡ããã¨è¡¨ç¤ºããã¦ã¾ãããSDK ã¯ä½ã®åé¡ããªãåãã¦ããããã§ãããã£ããã
ã¾ã¨ã
ã¨ããããã§ãRubyMotion ã¯æ¢åã®iOSéçºè³ç£ã使ããã¨ãããè¯ãã§ãããã¨ããã話ã§ããã
å®ã¯ä»åã®ãã¿ã¯ Objective-C ã§æ¸ãããã©ã¤ãã©ãªãæªæ¦è¦éã®æ«å°å ¥ãã¦ã¿ã¦ãã®é¡æ«ãã¾ã¨ããã¨ããã®ãèãã¦ããã®ã§ãããmotion-cocoapods ããããã®ä»ç°¡åã«ä½¿ãã¦ãã¾ãããããé¡æã«ãããã¨ããã£ã¦ãã AWS iOS SDK 㯠Cocoapods ã«ç»é²ããã¦ãã・・・ã¨ãããã¨ã§æªæ¦è¦éã¯å ¨ãããã¾ããã§ããã
Advent Calendar ã®ä¸ã§ @satococoa ããããå æ¥ã® Google Maps ã¢ããªã§ä½¿ããã¦è©±é¡ã«ãªã£ã¦ãã NimbusKit ã motion-cocoapods ã§å°å ¥ããè¨äºãæ¸ããã¦ãã¾ãã (http://satococoa.github.com/blog/2012/12/17/use-nimbus-css-with-rubymotion/)ããã¡ããåèã«ãã¦ã¿ã¦ãã ãããã¾ã Cocoapods ã«å ¥ã£ã¦ããªãã©ã¤ãã©ãªã使ãå ´å㯠@watson1978 ããã® Google Analytics SDK for iOS å°å ¥è¨äº (http://watson1978.github.com/blog/2012/08/30/use-google-analytics/) ãåèã«ãªãã§ãããã
- RubyMotion ã§ã¯ Objective-C ã®æ¢åè³ç£ã使ãã¾ã
- motion-cocoapods 㧠Cocoapods ãç°¡åã«ä½¿ãã¾ã
- API å¼ã³åºãã¯ãã¤ãéãã® Objecitive-C â RubyMotion å¤æã«ã¼ã«ã§OK
- ãã©ã´ã³ã¯ã¨ã¹ã10ã®ã¢ãããã¼ã 1.2 ã¯ã¾ããªãã§ããã¦ã§ã¼ã£ãã¹ã¯ã¨ãã¡ãããã¸ã«ã¬ãªãã¥ã