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

【チラシの裏のエンジニアリング】 オッサンだらけで作る 主婦向けアプリ開発の舞台裏 @ Yah...

【チラシの裏のエンジニアリング】 オッサンだらけで作る 主婦向けアプリ開発の舞台裏 @ Yahoo! x DeNA UI/UXデザイナー勉強会

Yahoo! BASE6で行った発表のキーノートをpdfで書きだしたものです(アニメーションなくなるの痛いなーSpeaker Deck...)。なんか自分だけ技術寄りだわめっちゃ時間オーバーするわでホントゴメンナサイ・・・

Chronum Sintario

July 16, 2014
Tweet

More Decks by Chronum Sintario

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ w 4IJOUBSP,VSPOVNB w .BD04J04&OHJOFFS w ʙ೔ຊޠม׵ͷ+ࣾ͞ΜͰ.BD޲͚ͷΞϓϦ։ൃ w ʙ%F/" w

    (SPPʜ͍͑ͳΜͰ΋ͳ͍Ͱ͢ w νϥγϧɹˡΠϚίί w Ұिؒલʹ਌஌ΒͣҾͬ͜ൈ͔Εͯઈࢍࢮ๢த
  2. 04ͷҧ͍Λ ٵऩ͖͠ΕͨΓແཧͩͬͨΓ w ($.͖͔͚ͬͰόοΫάϥ΢ ϯυνϥγσʔλऔಘɺΫϥΠ ΞϯταΠυͰνϥγ഑৴ͷ 1VTI௨஌ΛεέδϡʔϦϯά w MBZPVUYNM w

    όοΫΩʔ w ΢ΟδΣοτ 33ࢪࡦ "OESPJE w 4JMFOU1VTI͖͔͚ͬͰόοΫ άϥ΢ϯυνϥγσʔλऔಘɺ 6*-PDBM/PUJpDBUJPOͰϓογϡ ௨஌ʜ͋Εಈ͍ͯແ͘Ͷʁ w "VUP-BZPVU w ී௨ʹφϏόʔ͔Β໭Δ w ΢ΟδΣοτ͸J04଴ͪ J04
  3. νʔϜฤ੒ w "OESPJEਓ w J04ਓ w αʔόਓ w σβΠφʔਓ ˡΦοαϯ

    žТž  ˡΦοαϯ žТž  ˡΦοαϯ žТž  ˡΠέϝϯ 㷥› ͜ ʖ㷥›
  4. νʔϜฤ੒ w "OESPJEਓ w J04ਓ w αʔόਓ w σβΠφʔਓ ˡΦοαϯ

    žТž  ˡΦοαϯ žТž  ˡΦοαϯ žТž  ˡΠέϝϯ 㷥› ͜ ʖ㷥› ओ්ͷؾ͕࣋ͪΘ͔Βͳ͍ʜ ɾТɾA
  5. ྫ  DBUFHPSZ UBQUBC \JE͓ถɾௐຯྉ^ ɹɹʮछྨͰ୳͢ʯͰ͓ถΧςΰϦʹ੾Γସ͑  DBUFHPSZ qJOH \^

    ɹɹ׳ੑεΫϩʔϧ  DBUFHPSZ NFNP \DPOUFOUࢁܗݝ͞Μͭ΍ඣ^ ɹɹͭ΍ඣΛϝϞొ࿥ͨ͠
  6. ྫ  DBUFHPSZ UBQUBC \JE͓ถɾௐຯྉ^ ɹɹʮछྨͰ୳͢ʯͰ͓ถΧςΰϦʹ੾Γସ͑  DBUFHPSZ qJOH \^

    ɹɹ׳ੑεΫϩʔϧ  DBUFHPSZ NFNP \DPOUFOUࢁܗݝ͞Μͭ΍ඣ^ ɹɹͭ΍ඣΛϝϞొ࿥ͨ͠
  7. ྫ  DBUFHPSZ UBQUBC \JE͓ถɾௐຯྉ^ ɹɹʮछྨͰ୳͢ʯͰ͓ถΧςΰϦʹ੾Γସ͑  DBUFHPSZ qJOH \^

    ɹɹ׳ੑεΫϩʔϧ  DBUFHPSZ NFNP \DPOUFOUࢁܗݝ͞Μͭ΍ඣ^ ɹɹͭ΍ඣΛϝϞొ࿥ͨ͠  DBUFHPSZ UBQEFUBJM \DPOUFOUΏΊͽΓ͔ ๺ւಓ^ ɹɹΏΊͽΓ͔๺ւಓͷৄࡉ΁
  8. ྫ  DBUFHPSZ UBQUBC \JE͓ถɾௐຯྉ^ ɹɹʮछྨͰ୳͢ʯͰ͓ถΧςΰϦʹ੾Γସ͑  DBUFHPSZ qJOH \^

    ɹɹ׳ੑεΫϩʔϧ  DBUFHPSZ NFNP \DPOUFOUࢁܗݝ͞Μͭ΍ඣ^ ɹɹͭ΍ඣΛϝϞొ࿥ͨ͠  DBUFHPSZ UBQEFUBJM \DPOUFOUΏΊͽΓ͔ ๺ւಓ^ ɹɹΏΊͽΓ͔๺ւಓͷৄࡉ΁ Ϣʔβʔ͕໨ʹු͔Ϳϩά
  9. ྫ  DBUFHPSZ UBQUBC \JE͓ถɾௐຯྉ^ ɹɹʮछྨͰ୳͢ʯͰ͓ถΧςΰϦʹ੾Γସ͑  DBUFHPSZ qJOH \^

    ɹɹ׳ੑεΫϩʔϧ  DBUFHPSZ NFNP \DPOUFOUࢁܗݝ͞Μͭ΍ඣ^ ɹɹͭ΍ඣΛϝϞొ࿥ͨ͠  DBUFHPSZ UBQEFUBJM \DPOUFOUΏΊͽΓ͔ ๺ւಓ^ ɹɹΏΊͽΓ͔๺ւಓͷৄࡉ΁ Ϣʔβʔ͕໨ʹු͔Ϳϩά ࢓ࠐΈ΍ϩάઃܭ͸େม͕ͩʜ
  10. +40/31$ w ΫϥΠΞϯτ"1*αʔόʔؒ௨৴ϓϩτίϧ w ϦΫΤετɾϨεϙϯε͢΂ͯ+40/Ͱܰྔɾ୯७ --> { "method": "echo", "params":

    ["Hello JSON-RPC"], "id": 1}! <-- { "result": "Hello JSON-RPC", "error": null, "id": 1}! w ͳͷ͕ॏཁόονϦΫΤετ --> [ {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"}, {"foo": "boo"}, {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"}, {"jsonrpc": "2.0", "method": "get_data", "id": "9"} ] <-- [ {"jsonrpc": "2.0", "result": 7, "id": "1"}, {"jsonrpc": "2.0", "result": 19, "id": "2"}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"}, {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"} ] w ͏·͘૬ؔ͠ͳ͍Α͏ʹ"1*ɾΫϥΠΞϯτΛ࡞Ε͹ɺγʔέ ϯγϟϧͰ΋όονͰ΋͍͚ͪΌ͏ʢ௨৴ύϑΥʔϚϯεͷ֬ อɾ࠶ར༻ੑɾॊೈੑͷߴ͞ʣ
  11. όονϦΫΤετͷྫ νϥγߋ৽ॲཧ w ҎԼ͸όονϦΫΤετͰҰܸϦΫΤετɺϨεϙϯε͸෼ղͯ͠ ΫϥΠΞϯτଆͰฒྻॲཧ΁ < \KTPOSQD NFUIPEνϥγऔಘ QBSBNT< 

    > JE^  \KTPOSQD NFUIPEνϥγͳ͍͓ళͷ৘ใऔಘ QBSBNT<  > JE^  \KTPOSQD NFUIPElΞϓϦͷߋ৽৘ใऔಘ QBSBNT< > JE^  \KTPOSQD NFUIPE͓ళઃఆಉظ QBSBNT\^ JE^  \KTPOSQD NFUIPEΫϥΠΞϯτϩάૹ৴ QBSBNT<> JE^ > < \KTPOSQD SFTVMU<νϥγྻ> JE^  \KTPOSQD SFTVMU<99݄::೔·Ͱνϥγ͋ͬͨΑ> JE^  \KTPOSQD SFTVMU<ߋ৽ͳ͍Α> JE^  \KTPOSQD SFTVMU<͸͍Α> JE^  \KTPOSQD SFTVMU<͸͍Α> JE^  >
  12. -(void)batchUpdateWithShopIDs:(NSSet*)shopIDs shopsToGetContents:(NSArray*)shopsToGetContents lastUpdate:(NSDate*)lastUpdateDate completion:(void(^)(BOOL hasNewContents, NSError *err))completion { __weak typeof

    (self) wSelf = self; ONRPCRequest *req = [[CRSJSONRPCRequest alloc] init]; ! // APIϦΫΤετͱύϥϝλΛੵΈࠐΈɻϦΫΤετID͕ฦ٫͞ΕΔͷͰั֫ɻ id getUpdatesReqID = [req crs_getUpdateInfoAfterLastUpdateDate:lastUpdateDate shopIDs:shopIDs]; id getContentsReqID = [req crs_getChirashiContentsWithShops:shopsToGetContents]; id getShopDataReqID = [req crs_getShopDataWithShopIDs:shopIDs]; id updateUserShopListReqID = [req crs_updateUserShopListWithShopIDs:shopIDs]; ! // ૹ͓ͬͯ͠·͍ɺͷAPIϦΫΤετ΋ੵΈࠐΈʢ݁Ռ͸ղੳ͠ͳ͍ͷͰϦΫΤετID͸ั֫ͤͣʣ [req crs_sendHadoopLogs:@[[[CRSNotificationStatusLog notificationStatusLog] JSONObject]]]; NSManagedObjectContext *ctx = get_worker_context(); CRSBatchUpdateResult *batchUpdateResult = [[CRSBatchUpdateResult alloc] init]; [[…[[[CRSAPIClient defaultClient] enqueueRequest:req] continueWithSuccessBlock:^id(BFTask *task) { CRSJSONRPCResponse *response = task.result; // શମΤϥʔͷνΣοΫ NSError *err = [response.jsonRpcError crs_apiError]; err = err ?: response.error; if (err) { return [BFTask taskWithError:err]; } batchUpdateResult.response = response; return response; }] continueWithSuccessBlock:^id(BFTask *task) { // νϥγऔಘ݁Ռͷ൓ө CRSJSONRPCResponse *response = [task.result responseForRequestID:getContentsReqID]; CRSGetContentsResult *result = [CRSGetContentsResult resultWithResponse:response]; NSError *err = result.error; if (err) { return [BFTask taskWithError:err]; } BFTaskCompletionSource *tcs = [BFTaskCompletionSource taskCompletionSource]; [ctx performBlock:^{ [wSelf updateContents:result.contents shops:shopsToGetContents onDate:result.updateDate inContext:ctx]; batchUpdateResult.getContentsResult = result; [tcs setResult:task.result]; }]; return tcs.task; }]…]; // ॾʑશ෦໰୊ͳ͚Ε͹CoreDataӬଓԽɺUIߋ৽΁
  13. ·ͱΊ w νϥγϧ͸"OESPJE'JSTU։ൃɺJ04͸ਗ਼ॻ ˠओ්ʹࢗ͞ΔαʔϏεվળΛͲΜͲΜࢼ͢ ˠ04ػೳࠩͷٵऩ͸ৗʹ՝୊ w νϥγϧʢϮοαϯʣNFFUTओ් ˠΘ͔Βͳ͍΋ͷΛແཧʹໝ૝͠ͳ͍ w Ϣʔβʔͷχʔζ΍ෆຬΛޮ཰Α͘र͏޻෉

    ˠ6TFS0QFSBUJPO-PH ˠۤ৘͸ࣗࣾͷ͓໰͍߹Θͤ૭ޱʹྲྀ͠ࠐΜͰରԠ ˠ+40/31$Λ༻͍ͨཪଆσʔλॲཧͷޮ཰Խ ˠΤϯδχΞ΋ਓͱ࿩࣌͢୅ɺͻ͖͜΋ΓŘŞūŘ