ããWWDC2015ã楜ããããã«
WWDC2015ãæ¥é±ããéå¬ãããã®ã§ããã楜ããããã®TipsããŸãšããŠã¿ãã
ãµã³ãã©ã³ã·ã¹ã³
ãã®ææã¯æ±äº¬ãããšãŠãå¯ããã·ãªã³ã³ãã¬ãŒã®éœæ°ãªå€©æ°ããèããããªãäœå¯ãã®ã§ããžã£ã±ããå¿ é ã ã
æ¥æ¬ãšæ¯ã¹ããšãã¡ããæ²»å®ã®æªãå°åã¯ãããSOMAãTenderloinãããã¯é¿ããã»ããè¯ãã
ã«ãã§çã§è·ç©ãçãŸããäºã¯ããã®ã§ãç§ã¯åžãç«ã€æè·ç©ã眮ããŠããå Žåã¯
Would you mind keeping an eye on my luggage.
ãšã声ããããŠããäºãå€ãã
ç»é²
éå§åæ¥ã®9am~7pmã«åä»ãåºæ¥ããåä»ãçµãããšãå ¥é€šèšŒãšãžã£ã±ããã2014幎ã¯ããããã WWDCæéäžã¯åä»ãåºæ¥ããšæãã®ã§ãããã»ã©æ¥ãå¿ èŠã¯ãªãã ã¡ãªã¿ã«ãåä»æã¯ãã¹ããŒãå¿ é ïŒãããã¯è±èªã®èº«å蚌ææžïŒãªã®ã§æ³šæãå¿ èŠã ã
ïŒç§ã¯æšå¹Žé転å 蚱蚌ããæã£ãŠãªãã£ãããããŸããŸæ¥æ¬èªãèªããéåœç³»ã¢ã¡ãªã«äººãããã®ã§äºç¡ããåŸãã
åæ¥
åæ¥ã¯WWDCã®ç®çã€ãã³ãKeynoteããããã¹ã±ãžã¥ãŒã«ã¯ä»¥äžã®ãšããã
Keynoteãçµãã£ãåŸã«çºè¡šãããbetaçãããŠã³ããŒãããããšãã§ãããäžéã®äŒæ©å®€ã§æç·ã«ã€ãªãããšãã§ããkeynoteåŸã¯ãšãŠãæ··ãã
keynoteã«äžŠã°ãªã
WWDCã®ç®çã€ãã³ãã§ãããç§ãæšå¹Žæ·±å€ãã䞊ã³ãäžè¬åžã®æååããèŠãã ããããç®çã€ãã³ãã§ãããæ ã«ãããã«ãªã³ã©ã€ã³ã§æ å ±ã確èªã§ããã ãŸããã¹ããªãŒãã³ã°ãã¥ãŒã€ã³ã°ãè€æ°ã®å Žæã§å®æœãããŠããã
Apple WWDC 2015 - Keynote Viewing Breakfast
keynoteåŸã«betaçãããã¥ã¡ã³ããæäŸãããã®ã§ãWWDCãæãæå¹ã«æŽ»çšããããã«ã¯ãããã§äœåãæž©åãéçºã«éäžããæ¹ãããããã§ããã
ã»ãã·ã§ã³
WWDCã®ã¢ããªãããã®ã§ããŠã³ããŒããã¹ã±ãžã¥ãŒã«ãäºåã«ç¢ºèªããŠããã ã¡ãªã¿ã«iPadçã®æ¹ãèŠãããã®ã§iPadãæã£ãŠãã人ã¯ãã¡ããããããããã
keynoteåã«ã¯å šãŠã®ã»ãã·ã§ã³ã¯å ¬éãããŠããªããïŒæšå¹Žã ãšSwifté¢é£çïŒ
倧ããéšå±ã®å ¬æŒã¯ããäžè¬åããªãã®ãå€ããéçºè åãã§ããã¢ãã¯ãªãã®ã¯æ¯èŒçå°ããéšå±ã§è¡ãããäºãå€ãã
å šéšã¢ããããŒããããã®ã ãç§ã¯æããèŠãªãã®ã§ãäžäººã ãšèŠãªãããªå 容ãéžã¶ããšã«ããã
å人çã«æšå¹Žã®ã»ãã·ã§ã³ã§é¢çœãã£ãã®ã¯ä»¥äžã®ã»ãã·ã§ã³ã Advanced Graphics and Animations for iOS Apps
ãŸããæå¿ã«ãã£ãŠå šæãASCIIwwdcã«ã¢ããããŒããããã
Lab
å人çã«ã¯WWDCã§æãéèŠãªèŠçŽ ãAppleã®éçºè ã«çŽæ¥è³ªåãã§ãã幎ã«äžåã®æ©äŒã ã
æšå¹Žã¯Swiftãæ°ãããªã£ãXcodeãStoryboardçå€å²ã«ãããå 容ãèãããšãã§ãããèªãè©Šããæ°ã«ãªã£ãå 容ã質åãããã®å Žã§è§£æ±ºã§ããã®ã§ããããã ã
ãŸããèªåã®ã¢ããªãAppleã®UI/UXãã¶ã€ããŒã«è³ªåããã³ãŒããŒããããiOSã¢ããªéçºã®åçååãå£éèŠãããšãã§ããã
ãã楜ãã
bash
Yuerba Buena Gardensã«ãŠæšææ¥ã«éå¬ãããã©ã€ãã€ãã³ããAppleãéžãã ä»ã€ã±ãŠãã¢ãŒãã£ã¹ããããã©ãŒãã³ã¹ãããé£äºãšããŒã«ãæäŸãããç¥ãæãããããŸããAppleã§åã人ã ãæ¥ãã®ã§Tim CookãšäŒããããããããããªãã
åšèŸºã€ãã³ã
WWDCã«åãããŠå瀟ãMeetupã€ãã³ããéå¬ããŠããã äžçååœã®éçºè ãšåºäŒãããã£ã³ã¹ã ã
話ã
äŒå Žã§ã¯å€ãã®éçºè ãããã ãœãã¡ãŒã§ãã€ããã§ãããšã話ããããŠãã人ãå€ãã ãããã©ãåããã¯äººã«ãããšæãããæ¥æ¬ãããèŠç¥ãã¬äººãšäŒè©±ããäºãèªç¶ãªã®ã§æ°ã«ãã声ããããã»ããã¹ãã¬ã¹ã¯å°ãªãã
é£äº
WWDCéå¬äžã¯ãæé£ãã©ã³ããããã€ãæäŸãããŠããã ã¢ã¡ãªã«çãªåŒåœã ããå²ããšãããã
Gunosy for Apple Watchãã§ãããŸã§
Gunosyã2015/05/27ã«Apple Watch meetup @ HillsGarageãéå¬ããã
ç§ã«ãšã£ãŠã¯åããŠã®åå è 100人è¿ãã€ãã³ãã ã£ãã®ã§åŠã³ãå€ãã£ãã
Apple Watch meetup @ HillsGarageãéå¬ããŸããã
çºè¡šå 容
Gunosy for Apple Watchãã§ãããŸã§ã«çªç Žãã課é¡éããŸãšããå 容ã Twitteräžã§åå¿ããã£ãå 容ãäžéšæç²ããŠçŽ¹ä»ããã
Watch App
willActivate()ã®æŽ»çš
çŸåšApple Watchäžã§ã®ãã¥ãŒãåŒã³åºããããŸã§ã®æé ã¯ä»¥äžã®ããã«ãªã£ãŠããã
- Watch AppãåŒã³åºããã
- Storyboardãèªã¿èŸŒãŸãã
- 察象ç»é¢ã®init, awakeãèµ°ã
- Watchäžã§ç»é¢ã衚瀺ããã
- willActivate()ãåŒã°ãã
çµæçã«ãinitãšawakeã§ã®åŠçãæå°éã«ããããšã§ãŠãŒã¶ãŒã®äœæã¹ããŒããäžããã
// MARK: Life cycle override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) if context != nil { self.article = context as? ArticleEntity } } override func willActivate() { super.willActivate() if article != nil { self.layout(article!) } }
WKInterfaceGroupã®å©çš
ç»åãçšããå Žåã¯WKInterfaceImage
ãWKInterfaceGroup
ã®äžã«å
¥ãããšäŸ¿å©ã§ãããPlaceholderãšããŠã䜿ããããstoryboardããè§äžžã®èšå®ãã§ããã
Placeholderãèšå®ããå Žåã¯ä»¥äžã®ãšããã
self.imageGroup.setBackgroundImage(UIImage(named:"no_image"))
è§äžžã«èšå®ããããã«ã¯ãWKInterfaceGroup
ãéžæããAttribute inspectorããRadiusãå€æŽã§ããã
Glance
è€éãªæç»ãæ¬äœã§
Apple Watchçšã®Storyboardã¯iOSã¢ããªçšãšæ¯èŒããŠã¬ã€ã¢ãŠãã«å¶éãå€ãã
ããã§Gunosyã¢ããªãäœãéã«ã¯ãExtensionäžã§CATextLayer
ã䜿ã£ãŠæç»ããNSDataãšããŠWatchã«è»¢éããŠããããã®éäœã£ãã©ã€ãã©ãªã¯ä»¥äžã§å
¬éããŠããã
GitHub - jeffsuke/GlanceWordRainbowImage
åèïŒApple Watch meetup ã§çºè¡šããŸãã
ã€ãã³ãéå¬ããäžã§ã®åŠã³
å人çã«ã¯å€§ãç®ã®ã€ãã³ãã ã£ãã®ã§éå¬ããäžã§ã®åŠã³ãå€ãã£ãã ä»åŸäŒŒããããªã€ãã³ããéå¬ããäžã§ã®åèã«ãªãã°å¬ããã
- é£äºã¯ãã¶ã倧人æ°ã ã£ã
- ããŒã«è€æ°çš®é¡ãããšè¯ã
- 100人å泚æãããšäœã
- ãã¶ãŒãã¯ãããªã
- æ€ åã®åããšããé³æ¥œãé°å²æ°ã工倫ããªããšãããé°å²æ°ã«ãªããã¡
- äŒç€Ÿãã4人çä»ãã«åå ãããã足ããåšãã«ååããŠãããå¿ èŠããã£ã
- HillsGarageã¯ãã©ã ããããé³é¿ããããåºãããæé«ã®äŒå Žã ã£ã
- å匷äŒã®æéã¯æŒããã®ããããã¡ãç©ããã
iOSããŒãžã§ã³åå²ã®è©±
iOSã®ããŒãžã§ã³ã«ããåå²ãåèã«ããŒãžã§ã³åå²ãå®è£ ããã®ã ããäžæãè¡ããªãã£ãã®ã§å¯Ÿå¿çå«ããŠæžãã
iOSã§ã¯äž»ã«ã[UIDevice currentDevice].systemVersion
ãçšããŠããŒãžã§ã³å€å®ããæ¹æ³ãšãNSFoundationVersionNumber
ãã¯ãã䜿ã£ãŠããŒãžã§ã³å€å®ãããæ¹æ³ããããåè
ã¯String, åŸè
ã¯doubleãªãããæ°å€æ¯èŒãç°¡åã«å®æœããã«ã¯NSFoundationVersionNumber
ã®æ¹ãããã ããã
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) { // Above iOS7.0 }
ïŒäžèšèšäºã§ã¯floor()
ãçšããŠå°æ°ç¹ä»¥äžãåãæšãŠãŠããããNSFoundationVersionNumber
ã®ãªã¿ãŒã³ããªã¥ãŒãdoubleãªã®ã§ããã®å¿
èŠã¯ãªãã
ã¡ãªã¿ã«ãã¯ãã®äžèº«ã¯ãããªæãã
#if TARGET_OS_IPHONE #define NSFoundationVersionNumber_iPhoneOS_2_0 678.24 #define NSFoundationVersionNumber_iPhoneOS_2_1 678.26 #define NSFoundationVersionNumber_iPhoneOS_2_2 678.29 #define NSFoundationVersionNumber_iPhoneOS_3_0 678.47 #define NSFoundationVersionNumber_iPhoneOS_3_1 678.51 #define NSFoundationVersionNumber_iPhoneOS_3_2 678.60 #define NSFoundationVersionNumber_iOS_4_0 751.32 #define NSFoundationVersionNumber_iOS_4_1 751.37 #define NSFoundationVersionNumber_iOS_4_2 751.49 #define NSFoundationVersionNumber_iOS_4_3 751.49 #define NSFoundationVersionNumber_iOS_5_0 881.00 #define NSFoundationVersionNumber_iOS_5_1 890.10 #define NSFoundationVersionNumber_iOS_6_0 992.00 #define NSFoundationVersionNumber_iOS_6_1 993.00 #define NSFoundationVersionNumber_iOS_7_0 1047.20 #define NSFoundationVersionNumber_iOS_7_1 1047.25 #endif
åèæç®
ãªã¯ã«ãŒããã¯ãããžãŒãºããGunosyã«è»¢è·ãã
éè·
2014幎12ææ«ããã£ãŠãªã¯ã«ãŒããã¯ãããžãŒãºãéè·ããŸããã ç³ããã°ã©ãã ã£ãç§ã«ãå匷æéãšãµããŒããäžããŠé ããããŸããéçºè ãšããŠå€±æããããã£ã³ã¹ããæçµçã«ã¯ã¹ã¯ã©ã ãã¹ã¿ãŒç圹å²ãŸã§ããããŠé ããã 1幎3ã¶æãšçãæéã§ãããããšãŠãè¯ãçµéšãç©ãããšæã£ãŠããã
èªåã«ãšã£ãŠå°è±¡ã«æ®ã£ãç¹ã¯ã
- 倧äŒæ¥ã®å®å®æãšããªã¯ã«ãŒãçã¹ããŒãæã®ãã©ã³ã¹
- ããžãã¹ã«å¯Ÿããå èŠ
- 人ã倧åã«ãã瀟颚
- æãäžããã°ãããã
- ãŸãã¯ãè©ŠããŠã¿ãããšããæåã
éã«ãæ £ããã«å°ã£ãç¹ã¯ã
- ææã衚瀺ããæãäžããªããšããšã¹ã«ã¬ãŒã¿ãŒåŒã«ããããäºãéã£ãŠããäºã¯ãŸããªã
- è¯ããæªããããã£ã±ãå¶æ¥ã匷ãäŒç€Ÿ
- æ©èœäŒç€ŸãšããŠã®ç«ã¡äœçœ®ïŒå¥ãã¹ãã§è©³ããæžããŸããïŒ
ããææãåºã人ãèŠãŠãããšãåµæ¥è æ±å¯ããã®
èªãæ©äŒãåµãåºããæ©äŒã«ãã£ãŠèªããå€ããã
ãšããèšèãå®çŸã§ããŠãããã©ãããããŒã ã£ããšæããã
éçºè ãšããŠã®ã¿ãªãããèµ·æ¥å®¶çãªé¢ã§ãè¯ã圱é¿ãåããããšãåºæ¥ããšæããç¹ã«ãèªåã®ããžãã¹ããµãŒãã¹ã«å¯ŸããŠç±ãæ³ããæã€äººãå€ããããåŠã³ãšãªã£ãã 人ã«ãæµãŸããæ¬åœã«è¯ãæéãéããããšæã£ãŠããã
ïŒã¡ãªã¿ã«ãå°ã£ãã®ãŒã¯ãªäººãå€ã掻èºããŠããããŠãŒã¶ãŒãå€ãæ±ãããµãŒãã¹ãæè¡é¢ã§æ¯ããŠããã®ã¯åœŒçã®åªåã«ãããäŸãã°ã¢ãã€ã«ã§ã¯ãAndroidã¢ããªéçºãPushåºç€ãªã©ãåèã«ãªãäºäŸã ã
ãã®åŸ
2015幎1æããã¯Gunosyãšãããã¥ãŒã¹ã¢ããªãäœãäŒç€Ÿã§åããŠããã éçºè åå人ã®èœåãšãåžåã®ã¹ããŒãããšãŠãæ©ããè °ãæãããã ã©ããªããŒã ããšãããšããã¶ã€ããiOSã¢ããªãæžããiOSã¢ããªéçºè ãAPIãæžãããããªããŒã ã
æ°ããæè¡ã®æ¡çšã«ãç©æ¥µçã§ãçŸåšAPIã¯Goèšèªã§æžãããŠããããã®èŠæš¡ã®ãããã¯ã·ã§ã³ã§ãåœå ã§Goãæ¬æ Œçã«äœ¿ã£ãŠãããµãŒãã¹ã¯ããããGunosyãããã ããã
ãŸãããªãã£ã¹ãæè¿å æ¬æšãã«ãºã«ç§»è»¢ããå¿«é©ãªç°å¢ã§åããŠè¯ãã
ã¹ã¿ãŒãã¢ãããšããç°å¢ã§æãŸããªãããæè¡é¢ã䌞ã°ããŠããããã ãŸããGunosyã§ã¯æ°ãã仲éãåéããŠããã®ã§ãèå³ãããæ¹ã¯æ¯éã
800万DL突破!Gunosyと共に成長したいiOSエンジニア急募! - Gunosyの新卒・インターンシップ - Wantedly
■iOSエンジニア急募!■GunosyのiOS開発リーダー候補を大募集中! - Gunosyの求人 - Wantedly
iOSã§åç»ã¹ããªãŒãã³ã°ãç°¡åã§ååãªããæ¹ã
åç»ã¹ããªãŒãã³ã°ãå®è£ ããæ©äŒããã£ãã®ã§ããŸãšããã
ããæ¹ã¯å€§ãããããŠïŒã€
- HTTP Live Streaming
- Media Player framework
åè ãçšããå Žåã®åçæ¹æ³ã¯
- AV Foundation framework
- OpenAL framework
ãªã©ããããŸãã
ããããããš
UITableViewCelläžã§ãµãŒããŒäžã«ããåç»ãåçããã
æ¹é
ä»åã®èŠä»¶ãæºããã®ã«ã¯ãMedia Player frameworkã§ååãªã®ã§ãããã䜿ããMPMoviePlayerControllerãšããã¯ã©ã¹ãçšãããããã¯iOS2.0ããããã¯ã©ã¹ãªã®ã§ãããŒãžã§ã³å¯Ÿå¿ãããããªã
Media Player frameworkã䜿ãäžã§ã®æ³šæç¹
- Simulatoräžã§åããããšãåºæ¥ãªãå Žåãããã
- è€æ°ã®åç»ãåæã«åçããäºã¯ã§ããªããMedia Player frameworkã§æ°ããåç»ãåçãå§ãããšããã®çŽåã«åçããŠããåç»ã®ãã£ãã·ã¥ã¯åé€ãããã
- ãããªã®é·ãã10å以äžã5åéã®ããŒã¿éã5MB以äžã§ããã°ãHTTP Live Streamingãçšããå¿ èŠãããã
- ã¢ããªåŽã§åç»ããã¥ãŒãã§ããªã
å®è£
ãŸããviewDidLoad
ã«ãŠMPMoviePlayerController
ãåæåããã
@interface JSKMainTableViewController () @property (nonatomic) MPMoviePlayerController *moviePlayer; @end static NSString *const kURLString = @"https://ia802302.us.archive.org/27/items/Pbtestfilemp4videotestmp4/video_test.mp4"; @implementation JSKMainTableViewController - (void)viewDidLoad { [super viewDidLoad]; self.moviePlayer = [[MPMoviePlayerController alloc] init]; // ã¹ããªãŒãã³ã°ãããã self.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; self.moviePlayer.contentURL = [NSURL URLWithString:kURLString]; // UITableViewCelläžã«è¡šç€ºãããããåç»æäœããŒãã¯é衚瀺 [self.moviePlayer setControlStyle:MPMovieControlStyleNone]; // åç»ããªããŒããã self.moviePlayer.repeatMode = MPMovieRepeatModeOne; }
ãã®moviePlayerãã- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
ã«ãŠCellã«æž¡ãã
CellForRowAtIndexPath
ã§æž¡ããŠããªãã®ã¯ãStoryboard+AutolayoutãçšããUIViewã®äžã«è²Œãä»ããŠãããããViewãçæãããã®ãåŸ
ã€å¿
èŠãããããã
- (void)layoutWithUrl:(NSString *)url { // 貌ãä»ããäºå®ã®UIViewã®ãµã€ãºãååŸ player.view.frame = _videoSuper.frame; [self.videoSuper addSubview: player.view]; // åç [player prepareToPlay]; [player play]; }
以äžã§åçãã§ããã
Cellã衚瀺ããŠããæã®ã¿åç»åç
ä»åã¯CellãåºçŸããã¿ã€ãã³ã°ã§åçãå®æœãããã£ãã®ã§ãUITableViewCellå
ã®[player play];
ãåé€ããUITableViewã«ä»¥äžãå®è£
ããã
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell.class isSubclassOfClass:JSKVideoTableViewCell.class]) { // åç»åæ¢ [self.moviePlayer pause]; } } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell.class isSubclassOfClass:JSKVideoTableViewCell.class]) { // åç»ã®è²Œãä»ã [(JSKVideoTableViewCell *)cell layoutWithPlayer:self.moviePlayer]; // åç»åç [self.moviePlayer play]; } }
ããã«ãããç»é¢äžã«Cellã衚瀺ãããŠããæã®ã¿åç»ãåçãããã
ãªã¯ã«ãŒããã¯ãããžãŒãºã«æããããŠ
ãã®ãšã³ããªãŒã¯ãæ ªåŒäŒç€Ÿãªã¯ã«ãŒããã¯ãããžãŒãº Advent Calendar 2014ã®25æ¥ç®ã§ãã
ç§ã®æå±ãããªã¯ã«ãŒããã¯ãããžãŒãºã«ã€ããŠãçé¢ç®ã«æžããŠã¿ãã åæãšããŠããªã¯ã«ãŒããã¯ãããžãŒãºã«å ¥ç€Ÿã 1幎 3ãæãããã£ãŠãããèŠèãçãããŸãããã®äŒç€Ÿã§å€ãã®ãã£ã³ã¹ããããæé·ã§ãæè¬ããŠããããããªåæãèžãŸããŠä»¥äžãèªãã§æ¬²ããã
ãã®ç«ã¡äœçœ®
ãªã¯ã«ãŒãã°ã«ãŒãã¯çŸåšãITäŒæ¥ãšããŠã®å€è²ãéãã€ã€ããããã®äžè§ãæ ãã®ããªã¯ã«ãŒããã¯ãããžãŒãºã§ãããITã«ãã競ååªäœæ§æ§ç¯ã®äžå¿ãæ ã£ãŠããã äž»ãªäºæ¥å 容ã¯ããªã¯ã«ãŒãã°ã«ãŒãã®ããžãã¹ã«ãããITã»ãããããŒã±ãã£ã³ã°ãã¯ãããžãŒã®éçºã»æäŸããšãªã£ãŠããããªã¯ã«ãŒãã°ã«ãŒãå šäœã«å¯Ÿããã³ã³ãµã«ãã£ã³ã°ãã¡ãŒã ãæ å ±ã·ã¹ãã éšéçãªåœ¹å²ãæ ã£ãŠãããäžåã®äºæ¥ã¯æãããæè¡æäŸãšããæ©èœïŒâSIerãšç§ã¯è§£éããŠããïŒã®ã¿ããæã£ãŠããã ITäŒæ¥ãžã®é²åã®éæž¡æãšããããšãããããªã¯ã«ãŒããããéšåãšSIerãããéšåãæ··ããåã£ãç¶æ ã ã
ãªã¯ã«ãŒããã¯ãããžãŒãºã®ãªã¯ã«ãŒãããã
ã¹ããŒãæãããã ã¢ããã人æã倧äºã«ããçãªã¯ã«ãŒããããã¯æ©èœäŒç€Ÿã«ãªã£ãŠãæ®ã£ãŠããã
ããã ã¢ãã
æãæãã人ããããããªã¯ã«ãŒãã¯ç€Ÿå¡ççµå¶è 䞻矩ãã€ãŸãå売ã®å匷ãåºæ¥ãäŒç€Ÿã§ãããïŒæ±å¯æµ©æ£ããªã¯ã«ãŒãã®DNAãïŒããããäºããäžé·ã圹å¡ã«ãã¬ãŒã³ãããã®å¹æãããžã«ã«ã«ç€ºãããšãåºæ¥ãã°ããã£ã³ã¹ãè²°ãããããæåããã°ææåéãããã äŸãã°ã2014幎2æã®iOSã¢ããªXcode5ãã«ãå¿ é åæã«ãå ¥ç€Ÿäžã¶æã¡ãã£ãšã®ç§ãåããŸãšããããšæãæãããã£ã¬ã³ãžãããŠããã£ããããŠããã
å§åçåœäºè æè
èªããã³ãããããäºã¯ãåœäºè æèããã£ãŠãããããšããããšãATIãšç¥ãããã¹ã¿ã³ã¹ãšãéãšèšãããå Žåããããããåãªãã©ãããïŒããšèãããäºãå€ãã瀟å ã§æŽ»èºããŠãã人æã¯ããã®åœäºè æèã匷ããã©ããªæã§ãåããŠãããšããå°è±¡ããã£ãã
ãã©ãããªç€Ÿé¢š
ç§ãé å±ãããéšçœ²ã®ãã°ã«ãŒããããŒãžã£ãŒã¯20代ããŸãã圹å¡ã瀟é·ãšãäŒè°äŸé Œãéãã°æ®éã«è©±ã«è¡ãäºãã§ããããŸãã瀟é·å«ãã©ããªäººã«ãããããä»ãã§åŒã¶æåã§ãããæèŠãã¶ã€ããããšãå€ã ããããããŠå ¥ç€Ÿå¹Žæã«é¢ä¿ãªãçã®è¯ãæèŠã§ããã°æ¡çšãããã
å人ã®èœåéçº
ãªã¯ã«ãŒãã°ã«ãŒãå šäœã«èšããããå人ã®èœåéçºã«åŒ·ãåãå ¥ããŠããã2011幎é ããå°å ¥ãããWill Can Mustã·ãŒãããã®ä»çµã®äžã€ã§ãããWillã¯äœãå®çŸãããããCanã¯äœãã§ããã»ã§ããããã«ãªãããã®ããMustã¯éæãã¹ãããã·ã§ã³ã瀺ããŠããããã®Willã«é¢ããŠã¯ãäŒç€Ÿå ã ãã§ãªããèŸããåŸã®äºãèšèŒããã瀟å€ã®æŽ»åãå«ããŠãäžé·æçãªãã£ãªã¢ãäžé·ãäžç·ã«ãªãè°è«ã§ããç°å¢ã¯ä»ã«ã¯ãªãã®ã§ã¯ãªãã ãããã
ãŸããåªç§ãªéçºè ãããã®ã§ããããã人ãã¡ããæåããµããŒããããŠããããç°å¢ã¯ããã£ããã¹ã¿ãŒãã¢ããã«è¡ã£ãŠãããããããªäœè£ã¯ãªãã£ãã ãããå ±éåãšãæšæºåã¿ãããªæèãçãŸãããä»ã¢ããªãäœã£ãŠãäžã§ã®åºç€ã¯ããã§ã»ãšãã©åŠãã ã
ã¹ãããäŒæ
以äžãªã¯ã«ãŒããã¯ãããžãŒãºã®å ¬åŒãŠã§ããµã€ãããåŒçšã
æ倧é£ç¶28æ¥éãå€ç¶3幎以äžã®ç€Ÿå¡ãªã誰ã§ã3幎ããšã«ååŸã§ããé·æäŒæã§ããå¿èº«ããªãã¬ãã·ã¥ããããèªå·±ã®æé·æ©äŒã«ãããªã©ãç®çã¯èªç±ãå ããŠããããå¿æŽããæåœãšããŠäžåŸ30äžåãæ¯çµŠãããŸãã
ããŒãããŒæå
æ¥åå§èšã®äººãã¡ããå€æ³šãšåŒã°ããããŒãããŒãšåŒã¶æåããªã¯ã«ãŒãã«ã¯ããããªã¯ã«ãŒããã¯ãããžãŒãºãäŸå€ã§ã¯ãªããåããµãŒãã¹ãå ±ã«äœã£ãŠãããããŒãããŒã ãããšã®ããšããã®ããŒãããŒãšç€Ÿå¡ã®å¢ç®ãä»ç€Ÿã«æ¯ã¹ããšèãã®ãç¹åŸŽã§ãã°ã«ãŒãã®æŠç¥ããéçºæšé²ãããŒãããŒãæ ã£ãŠãããããããã®ããŒãããŒã®å€§åã¯éåžžã«åªç§ãªäººãå€ããããã®ã³ããã¿ãŒã¿ãããªäººããããšãã
èªç±ãªç€Ÿé¢š
ããã¯éçºè ãšçžæ§ã®è¯ãæåãæè£ èªç±ã§ãã¬ãã¯ã¹å¶ãã³ã¢ã¿ã€ã ãããã°ã«ãŒããããã
瀟å SIerçãªèŠçŽ
ITäŒæ¥ã«çãŸãå€ããçºã«ãããã®èŠçŽ ã¯åŸã ã«å€ãã£ãŠããã®ã ãšæããæ¡çšã«ãåãå ¥ããäžéã§ãŠãŒã¶ãŒäŒæ¥ã§åãããã¿ãããªäººïŒ@hotchemiãšãïŒãéããŠããã®ã§ãããã ã¢ãããªãªã¯ã«ãŒãã®ç€Ÿé¢šãªãæ¹åãããŠããã®ã§ã¯ãšæã£ãŠããã
äºæ¥ãæã£ãŠããªã
æ©èœäŒç€Ÿãªã®ã§ãèªåã®æ ã£ãŠãããµãŒãã¹ã®æ¹éã«å ¥ã蟌ãã«ã¯ãïŒã©ãã®äŒç€Ÿã§ãåãã ãšã¯æããïŒãããªãã®å°äœãç¯ããã倧ããªä¿¡é Œãç²åŸãããããªããšé£ããããã®äººãå§åçåœäºè æèãæã£ãŠããªãéãã¯ããããŸã§äžè«ãSIerãšä»£ãããªãä»äºããåºæ¥ãªãä»çµã¿ã«ãªã£ãŠããŸã£ãŠãããç¹ã«ãªã¯ã«ãŒããããäœè²äŒç³»æåã«éŠŽæããªãéçºè ã¯ããã€ã®ã§ã¯ãšæã£ãŠããã
éçºãããæšé²
ã³ãŒãã£ã³ã°ã¯äžèšã®éãããŒãããŒãå®æœããŠããããšãå€ãããããŸã ãŸã 瀟å¡ã«ã¯æšé²èœåãæ±ããããããšã®æ¹ãå€ããæ°å°ãªãéçºãåºæ¥ã瀟å¡ããã®èæ¯ç¥èãçç±ã«ãçäžãããžã§ã¯ãã«æšé²ãªãŒããŒãšããŠæå ¥ãããŠããã人ãåãããŠäŸ¡å€ãçãæ¹ãã倧ããªäŸ¡å€ãçããšããã®ãåããããéçºè ã§ãããç§ã«ãšã£ãŠã¯æšé²æ¥åãããéçºãããããšæã£ãŠããŸãã
人æ
ç¬ç«ããæ©èœäŒç€Ÿãªã®ã§ãè²»çšèšç®ã¯äººæåäœãšãªããããèªäœæªã ãšæããªãããæ¢ã«å€ãèªãããŠããããã«äººæèšç®ã®ããžãã¹ã¢ãã«èªäœã«ã¯å€§ããªåé¡ç¹ãããã®ã¯æããèªãããŠããããšã
äžæ¬çŽåã®ããžãã¹ã¢ãã«ïœ€å€éè«è² æ§é ãã£ãã§ã³ã·ããªéçºäœå¶
SIerãéè·ããŸãããã
æ¬åœã®SIerãšéãããã®ã¢ãã«ã¯äºæ¥äŒç€Ÿãšã®é¢ä¿æ§ãããŒã«ãã£ã³ã°ã¹ã®äžå£°ã§å€§ããå€ããå¯èœæ§ããããç§ã¯éçºãšäºæ¥ãäžäœã«ãªãå ããããã®ã§ã¯ãšæã£ãŠããã
ãã®ä»äŒããŠããããäº
åœéç人æããŸã ãŸã å°ãªã
æäœéã®è±èªããåãã人æãå°ãªããå šç€Ÿå¡ãéãŸãäŒã§ãè±èªã¯åããªããŠããæµ·å€åºåŒµå€§äžå€«ã§ãããã£ãŠèããæã«ã¯ãé ãçããªã£ããéã«ãåœé人æã«ãšã£ãŠã¯ãã£ã³ã¹ãã€ãã¿ãããç°å¢ã§ã¯ãããçŸã«ãç§ã¯äžå¹Žéã«äºåæµ·å€åºåŒµã«æŽ»ãããŠè²°ã£ãŠããè¡ã£ãŠããããã ããåœé人ãåãååã«çºæ®åºæ¥ãç°å¢ãã§èšããšæªãããæµ·å€ã®å£²äžãå¢ãããŠãããšã¯èšãããªã¯ã«ãŒãã°ã«ãŒãã®äž»ãªå£²äžã¯åœå ã®ã¡ãã£ã¢ã§ãããç¹ã«ãªã¯ã«ãŒããã¯ãããžãŒãºãä¿ãé åã¯ãã¡ã¹ãã£ãã¯ãªé åãå€ããä»åŸãããã°ã«ãŒãå šäœã®æè¡åãæ¯ããäŒæ¥ãšããŠãåœéçãªæè¡è ã®æ¡çšã¯å¿ é ã ãšèããŠããã
å®å¹ŽãŸã§åãã
ãªã¯ã«ãŒããã¯ãããžãŒãºå ¥ç€Ÿæã«ãå®å¹ŽãŸã§åããç°å¢ãæ瀺ãããããšèšããã³ã£ããããããªã¯ã«ãŒãã¯äžå¹Žã§èŸããŠç¬ç«ããããã®äŒç€Ÿããšæã£ãŠããããã ããªã¯ã«ãŒããã¯ãããžãŒãºã§ã¯ãç¬ç«æ¯æŽã®å¶åºŠããããé·ãåãããšãåæã«ããéè·éå¶åºŠãšãªã£ãŠããããããããªã¯ã«ãŒãããããšSIerãããã®æ··ããåã£ãäžæè°ãªæããçãã§ããã®ã ãããããã
ã¡ãã£ã¢ãã¯ãããžãŒã©ããšã¢ããã³ã¹ããã¯ãããžãŒã©ã
ãŠã§ãç³»ã®æ°èŠäºæ¥ã¯ããŒã«ãã£ã³ã°ã¹ç®¡èœã®ã¡ãã£ã¢ãã¯ãããžãŒã©ããæ ã£ãŠããããããªã¯ã«ãŒããã¯ãããžãŒãºã¯æ¢åã¡ãã£ã¢ã®ãšã³ãã³ã¹åæ§ç¯ãã¢ããªé åã¯ã¡ã€ã³ã«ãªãããããäŒç€ŸãšããŠæ°èŠäºæ¥ã«åãçµãã®ãé£ããæ§é ã«ãªã£ãŠãããããèªäœã¯æªã§ã¯ãªãããªããªã瀟å¡åèªã¯New Ringãšãã瀟å èµ·æ¥ããã°ã©ã ã«åå ããæ¡æãããã°ã¡ãã£ã¢ãã¯ãããžãŒã©ãã«ç§»ç±ã§ããããã ããŸãããŠããäž»äœæ§ãåãããŠããã
ãŸããæ¬åœã®ã®ãŒã¯ãéãŸã£ãŠãããããã®ãã¢ããã³ã¹ããã¯ãããžãŒã©ãïŒATLïŒã§ãããèªç¶èšèªåŠçãçšããŠããã¬ããšãããããèªåãçŽæ¥ATLã«é¢ãã£ãŠããªãã®ã§ããåãã£ãŠããªãäºå®ã
ãŸãšã
ãªã¯ã«ãŒããã¯ãããžãŒãºã«å¯Ÿããæãèªã£ãã ITäŒæ¥ãšããŠçãŸãå€ããéæž¡æã®è©±ã§ãããåŸã ã«å€åããŠããã®ã ãšæãã ãªã¯ã«ãŒãã°ã«ãŒãITåã®äžæ žãšããŠåããŠã¿ãã人ããããæ¯éäžéæ¡çšã«ç³ã蟌ãã§æ¬²ããã
Qiita API v2 Hackathonã«åå ããŠããïŒåçæ®ã£ãŠQiita Teamã«ã¢ããããŒã
ãã®ãšã³ããªãŒã¯ãæ ªåŒäŒç€Ÿãªã¯ã«ãŒããã¯ãããžãŒãº Advent Calendar 2014ã®17æ¥ç®ã§ãã
2014/12/13ããªã¯ã«ãŒãæ¬ç€ŸãµãŠã¹ã¿ã¯ãŒã§è¡ããã Qiita API v2 Hackathon ã§ãQiitaSnapãªãã¢ããªãäœãçºè¡šãããŠããã ããŸããã
ååã¯ãšãŠã豪è¯ã以äžã®ãšããã
- iPad Air 2
- Kindle Voyage
- Chromebook
çŽ æµãªãµãŠã¹ã¿ã¯ãŒ41éã®æ¯è²ãçžãŸã£ãŠããšãŠã楜ããäŒã§ããã
ïŒãªã¯ã«ãŒããåºãŠããã®ã¯ãããŸã§ã§ãã
Hackathonã®ããŒã
ä»åã®Hackathonã®ããŒãã¯ãQiita APIv2ãå©çšããŠæ¯æ¥ã®éçºã楜ãããªãããŒã«ã®éçºã§ããã ç§ã®ããŒã ã§ã¯Qiita Teamã䜿ã£ãŠãããUIUXèšèšæã®ãã¯ã€ãããŒãäžã®ã¡ã¢ãè°äºé²ãšããŠæçš¿ããããšããããããŸããã ãããæå€ãšé¢åãªã®ã§ãäžç§ã§Qiita Teamäžã«ã¢ããããŒãã§ããiOSã¢ããªãäœããŸããã
ã€ãã£ããã®
UIImagePickerController
ãçšããŠåçãæ®åœ±ããParseã«ç»åãã¢ããããŒãããQiita API v2ã§ç»åãã¢ããããŒãããã·ã³ãã«ãªä»çµã¿ã§ãã
ã«ã¡ã©ã«é¢ããŠã¯UIImagePickerController
ãçšããªãã§ãAVFoundation Frameworkãçšããã°ã«ã¹ã¿ãã€ãºå¯èœãªã«ã¡ã©ãå®è£
ã§ããã®ã§ãããçæéã§ã®å®è£
ã ã£ãããããç°¡åã«å®è£
ã§ããUIImagePickerController
ãçšããŸããã
ãŸããèµ·åçŽåŸã«ã«ã¡ã©ãèµ·åãããã®ç»é¢äžã§æçš¿ããQiita Teamãéžæãããã¿ã³ã衚瀺ã
ã«ã¡ã©ã®éšåã¯ãUIViewControllerã®äžã«ä»¥äžã®ã³ãŒããæžããŠããã
- (void)viewDidLoad { [super viewDidLoad]; // UIImagePickerControllerã®åæèšå® self.picker = [[UIImagePickerController alloc] init]; self.picker.delegate = self; self.picker.allowsEditing = NO; // èµ·åããã®ã¯ã«ã¡ã© self.picker.sourceType = UIImagePickerControllerSourceTypeCamera; // ãã¿ã³ã®èšçœ® UIButton *button = [UIButton buttonWithType:100]; [button setBackgroundImage:[UIImage imageNamed:@"team"] forState:UIControlStateNormal]; [button setFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 200, 100, 42)]; [button addTarget:self action:@selector(teamAction:) forControlEvents:UIControlEventTouchUpInside]; self.picker.cameraOverlayView = button; [self presentViewController:_picker animated:YES completion:NULL]; }
ããã§ã«ã¡ã©ã®å®è£ ã¯å®äºã
ã«ã¡ã©ã§æ®åœ±åŸã¯ãUIImagePickerViewControllerDelegate
ã®- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
delegateã¡ãœããããæ®åœ±ç»åãååŸããç»åãµã€ãºãUIGraphicsBeginImageContext
ã«ãŠå€æŽããŠããã
// Resize image UIGraphicsBeginImageContext(CGSizeMake(640, 960)); [image drawInRect: CGRectMake(0, 0, 640, 960)]; UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
ããã«ããçæãããç»åãParseã«ã¢ããããŒãã ãã®ç»åããªã¯ãšã¹ãããURLãååŸããããã«PFFileãªããžã§ã¯ããååŸããã
//PFFileãªããžã§ã¯ããååŸãã PFFile *fileData = [objectData objectForKey:@"imageData"]; //ç»åããŒã¿URLãååŸãã imageURL = fileData.url;
æçµçã«ãã®URLãå ã«POSTããå 容ãçæã ä»åã¯ãæéããªãå¹³æã§ãäžã€ã®Stringã§ä»¥äžã®ããã«ããã
NSString *json = [NSString stringWithFormat:@"{\"body\": \"![](%@)\",\"tags\": [{\"name\": \"QiitaSnap\"}],\"title\": \"è°äºé² %@\",\"tweet\": true}", imageURL, stringFromDate];
ãããQiita API v2ã«ãŠã/api/v2/itemsãšã³ããã€ã³ãã«ã¢ããããŒãããããšä»¥äžã®ããã«æçš¿æçš¿ãããã
ãããã
å€ã«èŠããã圢ã«ããŠããªãªãŒã¹ãããã
ãŸãšã
- Qiita API v2 Hackatonåºãã
- Qiita APIã¯äœ¿ããããã
- ããã«ãœã³ã§äœå䜿ã£ãŠã«ã¡ã©ã¢ããªäœã£ãã