iOSãã©ãããã©ãŒã ïŒæè¿iPhone OSãšåŒã°ãããã®ïŒã§ã®ããã°ã©ãã³ã°ã¯ãå®ãå€ãä»äºããã®åã³ãšæœ®ã«éãã£ãŠæ³³ãããšã®èŠçã®å¥åŠãªçµã¿åããã§ãã åéçºè
ã¯ããããã®ã³ã³ããŒãã³ãã®ã©ã¡ããåªå
ããããã«ã€ããŠç¬èªã®æèŠãæã£ãŠããŸãã å人çã«ã¯ããã®ã¬ãã¹ã³ã奜ããªã®ã§ã次ã®ãããžã§ã¯ãã«åãçµã
ããã»ã¹ã®å°è±¡ãå
±æããã®ãé©åã ãšæãããŸããã
3æäžæ¬ãç§ã¯iPhoneçšã®
Bookmateã®ã¢ãã€ã«çãæžãããã«é ŒãŸããŸããã ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã®èšèšã¯ãåãPSDã®åœ¢ã§ãã§ã«æºåãæŽã£ãŠããŠããµãŒããŒåŽã§ã¯äœæ¥ãæ¬æ Œçã§ããããObjective-Cã§ã¯ã©ã€ã¢ã³ãéšåãããã ãæžãå¿
èŠããããŸããã
ãã®èšäºã§ã¯ãç§ãã¡ãæ»æããã¬ãŒããåããæåã®ã³ã³ããã«ã€ããŠèª¬æããŸãã Starcraftããã¬ã€ããå Žåãéåžžã¯ä¿¡ããããªãã»ã©ã®éã®ãã¹ãŠã®ã¯ã©ãã¯ããçªç¶äžæããzergãšã®é¡æšãããé©åã§ãã
建ç¯
äžèšã§èšãã°ãBookmateã¯ãäžé£ã®HTMLãã¡ã€ã«ã§æ§æãããæ¬ãä¿åãããµãŒããŒã§ãã Bookmateã¯ã©ã€ã¢ã³ãïŒäžè¬ã®äººã
ãããªãŒããŒãïŒã®äž»ãªã¿ã¹ã¯ã¯ããã®HTMLã衚瀺ããŠåŠçããããšã§ãã HTMLãéžã¶çç± ããšãã°ãPDFãšã¯ç°ãªãããã©ã³ããµã€ãºãå€æŽããéã«åãã©ãŒãããããã®ã¯éåžžã«ç°¡åã§ããããã¯ãå°ããªç»é¢ã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯çµ¶å¯Ÿã«å¿
èŠã§ãã äžæ¹ãHTMLã«ã¯éåžžã®ããŒãžãšããæŠå¿µããªããããå³å¯ã«èšãã°ãåŸæ¥ã®ããŒãžããšã®åœ¢åŒã§æ¬ã衚瀺ããã®ã«ã¯ããŸãé©ããŠããŸããã ç»é¢ã«åãŸããªãè¡ã次ã®ããŒãžã«æ£ãã転éããã«ã¯ãããŒãžã®åçŽã€ã³ãã³ããç¥ãå¿
èŠããããŸãã ãããè¡ãã«ã¯ãHTMLãšã³ãžã³ã¯æåã«ããã¥ã¡ã³ãå
šäœãåŠçããã¹ã¿ã€ã«ã·ãŒãã«åŸã£ãŠããã¥ã¡ã³ãå
ã®ãã¹ãŠã®ãããã¯ã®ãµã€ãºãšåº§æšãèšç®ããå¿
èŠããããŸãã ãã®åŸãAdobe InDesignãQuarkXPressãªã©ã®çµçããã°ã©ã ã§ã§ããããšãå®è¡ã§ããŸãã
åœæã®ããã¯ã¡ã€ãã®ååã¯ãããããã¹ãŠçŸããè¿
éã«è¡ãJavaScriptã®ã©ã€ãã©ãªããã§ã«äœæããŠããŸããã
ããã«ã¡ã¯iPhone
ããŒã¹ã®ãã¹ããã©ãããã©ãŒã ãšããŠãiPhone 3GãéžæããŸããã ãã·ã¢ã§éåžžã«äººæ°ããããç§ãä¿åããæå€ã®iPhoneã¢ãã«ã§ãã ãã¹ãããã¯ã®1ã€ã¯ããµã€ãºã890 KBã®åäžãã¡ã€ã«ã®Julio Cortazarã«ããåºçç©ãModels for Assemblyãã§ããã
æåã®ãããã¿ã€ãã¯ãUIWebViewãJavaScriptã©ã€ãã©ãªãããã³Objective-Cã§ã®ãããã®éã®ïŒããªãéèŠã§ã¯ãããïŒéã®äžéå±€ã³ãŒãã§ããã
iPhone 3Gã¯éåžžã«ã¹ããŒããªã¹ããŒããã©ã³ã§ãã
å Žæ㧠ã æ£çŽãªãšããããã®ãããªéããµã€ããMobile Safariã§éãããšã¯ã»ãšãã©ãããŸããã§ããããããããèªç¶çã«ãããã©ããã¯ããããŸããã 貧ããiPhoneïŒ ãã¢ã»ã³ããªã®ã¢ãã«ããéãã®ã«40ç§éããã£ã圌ã¯ãã¡ã¢ãªäžè¶³ã®ããã«ä»ã®ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãéããŠãã¡ã¢ãªãå®å
šã«ãªããªããšå«ã³ãå°é£ãªéåœã«ã€ããŠããããŸããããããŠãbaskã¯äœãå€æŽã§ããŸããã
ãããããã®ç¬éã«ã¯åè«ãèšãæéã¯ãããŸããã§ããã åè¡ããã®æåã®ã¶ãŒã°ã¯è¶³ãæ¡ããå°çã¯å€§çŸ€ã®äžã§éãããŸã èŠããªããããã§ã«æãããã
æ¬è³ªçã«æé©åãããã®ã¯ãããŸããã§ããã ãããã®40ç§éã®ããªãã®æéãWebKitã¯è§£æãDOMã®æ§ç¯ããžãªã¡ããªã®åèšç®ãããã³ïŒä»ã®çšèªããªãããã«ïŒã¡ã¢ãªã®è²ªé£ã«åŸäºããŸããã åŸè
ã¯ãä»®æ³ã¡ã¢ãªã«ãã£ã¹ã¯ã䜿çšã§ããªããããiOSèªäœã®æ·±å»ãªåé¡ã§ãããŸãããã®å Žåãããã¯ã°ã©ãŠã³ãããã°ã©ã ïŒã¡ãŒã«ãé»è©±ãªã©ïŒã®ããã«ã¡ã¢ãªãç·æ¥ã«è§£æŸããå¿
èŠãçããŸããã DOMå
šäœã§ã®JavaScriptã®å埩åŠçãWebKitãçµäºããŸããã
ãã®ãããªããã©ãŒãã³ã¹ã¯ãæããã«ã誰ã«ãé©ããŠããªãã iPhoneã®JavaScriptãç§ãã¡ã®ç®çã«ãšã£ãŠååã«éããªãã20 MBã®ã¡ã¢ãªãè²·ãäœè£ããªãããšã¯æããã§ããã
ãããŠãããã«ã€ããŠã©ãããã°ããã§ããïŒ
çœå®³ã®èŠæš¡ãããããç解ããã«ã¯ãå°ãäžæããŠãçºçããç¶æ³ã説æããå¿
èŠããããŸãã WebKitã¯
ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã§ãã ããããiOSã§ã¯ã
ãã©ã€ããŒãAPIãæã
ãŸãã ããã®äœ¿çšã¯Appleã«ãã£ãŠçŠæ¢ãããŠããŸãã iOSçšã®WebKitãèªåã§ãã«ãããéçã©ã€ãã©ãªãšããŠããã°ã©ã ã«å«ããããšãã§ãããšããŠããUIKitã¯ãã§ã«WebKitã«ãªã³ã¯ããŠãããå¿
ç¶çã«ãã£ã©ã¯ã¿ãŒã®è¡çªã«ã€ãªãããŸãã WebKitå
šäœã®ååãå€æŽããŠè¡çªãåé¿ããå Žåã§ããUIWebViewã¯ãããæ§ç¯ãããŠããWebKitã³ã³ããŒãã³ããžã®ã¢ã¯ã»ã¹ãæäŸããŸãããäžèšã®ãã©ã€ããŒãAPIã®äœ¿çšãåç
§ããŠãã ããã JavaScriptããªããã°ãObjective-CããçŽæ¥DOMã«å°éããããšã¯ã§ããŸããã ãããŠããã¯ãçç®ç²ç®ã«ã¡ãæè¿èšã£ãããã«ããããŠã誰ããèªæµ·ããããšããããšã§ãã
æ®ã£ãŠããã®ã¯ãWebKitãå¿ããããšã§ããlibxmlã䜿çšããŠHTMLã解æããDOMãæåã§æç»ããŸãã ã€ãŸããHTMLãšã³ãžã³ãäœæããå¿
èŠããããŸãã ãããããã©ãŒãã³ã¹ã®èŠ³ç¹ããçã«ããªã£ãŠãããã©ãããç解ããããã«ãç§ã¯å®éšã®ããã ãã«ããã«åæããããšãã§ããŸããã æçµçã«ãWebKitã®ãœãŒã¹ã³ãŒããèŠãŠããããã¯ããã«é«éã«ããªãããããã ããæžãçŽãããšããããšã®ç¡çããèªèããŠããŸãã äžæ¹ãWebKitã®æ©èœã¯10ïŒ
ã䜿çšããŠããŸããã é«åºŠã«ç¹åããç¬èªã®ãšã³ãžã³ãäœæãããšãææ°ã®ãã©ãŠã¶ããã10å軜ããªããŸãã ãããç§ãã¡ã®ãã®ã¯æ¶ããŸããã§ããïŒ
libxml
ææªã®APIã®ããã°ã©ããŒã®ããã®å°çã§ã®å¹Žæ¬¡ã³ã³ãã¹ãã§ãlibxmlã¯åã³å€§è³ãåè³ããŸããã ç§ã¯ééããèŠã€ãããããããŸãããããœãŒã¹ã³ãŒãã¯
ããã¥ã¡ã³ããããã¯ããã«æ確ã§ãã å
žåçãªäŸïŒ
Function: htmlCtxtReset
void htmlCtxtReset(htmlParserCtxtPtr ctxt)
Reset a parser context
ctxt: an HTML parser context
çå£ã«ããããŠããã ãã§ããïŒïŒ ããã«æžãããŠããããšã¯ãã¹ãŠãé¢æ°ãšåŒæ°ã®ååããæããã§ãã ãã®é¢æ°ã¯æ£ç¢ºã«äœãããŸããïŒ ãªãå¿
èŠãªã®ã§ããïŒ ãã€ããã䜿çšããŸããïŒ ç³ãèš³ãããŸãããã
å£ççã¯ãããæžããŸãããïŒ åº§ã£ãŠãlibxmlãdeuceã
å
¬å¹³ã«èšãã°ãã©ã€ãã©ãªèªäœã¯ã»ãšãã©ãã¹ãŠã®äººã䜿çšã§ããã»ã©ååã«æ©èœããŠãããšèšã䟡å€ããããŸãã ãããŠãç掻ã®äžã§ããã¯ã¯ããã«ç°¡åã§ãã ãããŠããã¹ãŠã®iPhoneã«ãããŸãã
æåã®çµæ
è¡ãæ¢ãŸãã®éçºã§ã§ããã ãæéãç¡é§ã«ããªãããã«ãæãé
ãã»ã¯ã·ã§ã³ããå§ããŸããã ããã¯ãããã¹ãã®ãããã¯ã®ãµã€ãºã®èšç®ã§ããã
ã°ãªãã®ãµã€ãºãåèšããããšã«ãªã
ãŸã ã ããã©ãŒãã³ã¹æž¬å®ã®çµæã«ã¯ãé©ãããããŸããã
- UIWebView + JavaScript-38ç§ã20 MBã®ã¡ã¢ãªã ããã¯ããã¹ãŠã®æé©åã®åŸã®æåã®ãªãã·ã§ã³ã§ãã
- NSStringã-sizeWithFontïŒ-14ç§ã8 MBã®ã¡ã¢ãªã åããã©ã³ãã§åãã°ãªãã®ãµã€ãºãç¹°ãè¿ãèšç®ããããšã¯æå³ããªããããçµæã¯ãã£ãã·ã¥ãããŸãã æéã®35ïŒ
ã¯ãã¡ãœããåŒã³åºã-[NSString sizeWithFontïŒ]ã«è²»ããããŸãã
- iPhone OS 3.1.3ã®ã³ã¢ããã¹ã-70ç§ä»¥äžã Core Textã¯ãããŒãžã§ã³3.2ããåã®iPhone OSã®ãã©ã€ããŒãAPIã§ãããã®é床ãæ¯èŒãããã£ãã®ã¯ã ããã¯é©ãã»ã©äœ¿ããããããããŒããŒã«ã§éåžžã«é«éã§ãã
æ°åã§æŠè£
ããŠãç§ã¯ãããã«æçŽãæžããŸããã éçºè
åãã®ãµããŒãïŒãããã
DTS ãäžè¬ã«ææãµãŒãã¹ã§ããéçºè
ãã¯ãã«ã«ãµããŒãïŒã åæã«ãåºã«ãªãé¢æ°CGFontGetGlyphsForUnicharsïŒïŒ-[NSString sizeWithFontïŒ]ããã©ã€ããŒãAPIãåç
§ããçç±ãå°ããŸããã
ã ããããç§ã¯Appleãå°æ¬ããŠããã®ã§ããéçºè
ãã€ã³ã¿ãŒãããå
šäœã§æ³£ãèšãèšãã®ã§ã¯ãªããã確ç«ããã圢åŒã«åŸã£ãŠã質åãããšãã®éçºè
ã«å¯Ÿããæ
床ã®ããã§ãã 2æ¥åŸã質åã«å¯Ÿãã詳现ãªåçãåãåããŸããã
- WebKitãžã®ã¢ã¯ã»ã¹ã¯ãããŒãã£ãŒããªã·ãŒã«ãã£ãŠæäŸãããŠããŸããã
- ããŒãžã§ã³3.2ããåã®iPhone OSã®ã³ã¢ããã¹ãã¯ãé
ããããããã©ã€ããŒãAPIã§ãã ããŒãžã§ã³3.2以éãUIWebView + JavaScriptããã倧å¹
ã«é«éã«ãªãã¯ãã§ãã
- CGFontGetGlyphsForUnicharsïŒïŒã¯ãèšèšãäžé©åãªãããã©ã€ããŒãAPIã§ãã ã€ã³ã¿ãŒãããäžã§é¡äŒŒç©ãèŠã€ããŠããããæ£ããããšã確èªã§ããŸãã
- å
šäœãšããŠãç§ã¯æ£ããæ¹åã«é²ãã§ããŸãã圌ãèªèº«ã¯ããäžæ¹ãç¥ããªãããã§ãã
- [NSString sizeWithFontïŒ]ãšCore Graphicsã®é床ã®ãããããéžæããå¿
èŠããããŸãã
åå ã«ïŒ
ããã¹ããã¬ã€ã¢ãŠãããããã®ã¢ã«ãŽãªãºã ã¯ã詳现ã«å
¥ããªããã°ãéåžžã«ç°¡åã«èãããŸãã æåã«ãããã¹ããåãã¹ã¿ã€ã«ã®ãã©ã°ã¡ã³ãã«åå²ããå¿
èŠããããŸããããšãã°ãããã¹ãã®ãããã¯ã®éäžã«æäœã®ãã¬ãŒãºãããå Žåããã®ãããªãããã¯ã¯3ã€ã®ã¹ã¿ã€ã«ãã©ã°ã¡ã³ãã«åå²ãããŸãã 次ã«ãããã¹ã
ãæ°ããè¡ã«è»¢é
ã§ããå Žæãç解ããå¿
èŠããããŸãããããã¯ãååãšããŠãåèªéã®å¥èªç¹ãŸãã¯åèªå
ã®ãã€ãããŒã·ã§ã³ã§ãã ç§ãã¡ã¯åœŒãã移ç±åè£è
ãšåŒãã§ããŸãã 次ã«ããã€ãããŒã·ã§ã³åè£ã®éã®ããã¹ããã©ã°ã¡ã³ãã1ã€ãã€åãåºããé·ããèæ
®ããŠããããã®åèšé·ãè¡ã®é·ããè¶
ãããŸã§ããããè¡ã«é
眮ããŸãã åæ§ã«ããŒãžã«ã€ããŠãã次ã®è¡ãããŒãžã®é«ããè¶
ããŠã¯ããŒã«ãããŸã§è¡ãè¿œå ããŸãã
å°è±¡çãªãªããžã§ã¯ãã®ã»ãããååŸãããŸããããã¹ãã®åãããã¯ïŒããšãã°ã段èœïŒã¯ããããããå«ãè¡ã®é
åã§æ§æãããŸãã
ã°ãªãã®å®è¡ -åãã¹ã¿ã€ã«ã®ããã¹ãã®æçã ãããã®åãã°ãªãã©ã³ããã®ãŸãŸå
šäœãšããŠæç»ããŸãã
ãã®æç¹ã§ãæé©åã®èå³æ·±ãæ©äŒãçŸããã³ãŒãã¯ããã«ã¹ãã²ããã£ã«å€ãããŸãã æäžäœã¬ãã«ã®APIã«é²ããšãèšèªæè²ãååã§ãªãããšãæããã«ãªããŸãã æ°ããã³ãŒãäœç³»ã¯ããã®ã³ãŒããæ©èœããªãå°å¹³ç·äžã«åºçŸããŠããŸãã ããšãã°ãã¢ã©ãã¢èªãããã©ã€èªã®ããã«æåã®æ¹åã®ãããã¿ã€èªã®ããã«åèªéã«ã¹ããŒã¹ããªãããã§ãã
ãã®çµæãæåã®è©Šã¿ã§åºå€§ããææ¡ããããšã¯äžå¯èœã§ãããšèªèããå³ããå·Šãžæžãæ¹åã®èšèªãšã¿ã€èªã®ãããªããŸãç¥ãããŠããªãèšèªã®ãµããŒãã延æããªããã°ãªããŸããã§ããã åãçç±ã§ãäž¡åŽã®ããã¹ãã®äœçœ®åããã®å®è£
ã¯å»¶æãããŠããŸã-å¹æçãªãã€ãããŒã·ã§ã³ã·ã¹ãã ãå¿
èŠã§ãããã®ããã«ã¯ãååèªã®èšèªãç¥ãå¿
èŠããããŸãã
ãã ããããã©ãŒãã³ã¹ã®ç¹ã§ã¯ãéå§æãšæ¯èŒããŠå€§å¹
ãªé²æ©ããããŸããã ããã§ãCortazarã®åäœã6ç§ïŒïŒïŒç§ä»¥å
ã«ç»é¢ã«è¡šç€ºãããŸãã 倧å€ãªæã§ããã ç§ã¯äžæçã«è³ããªãã©ãã·ã¥ããªããã°ãªããŸããã§ããã ãã®éãã£ãšã劻ã¯ç§ã®é
ããããªã声ãšæ¯èŠªã ããèããŸããã ã¯ã©ã€ã¢ã³ãã«ãšã£ãŠãçãã¯ãããŸããã§ããã第äžã«ã誰ãäœåãªæãé Œãã«ããŠããŸããã§ããã第äºã«ããããžã§ã¯ãã®äœæ¥ã®éå§ãèœèããŸããïŒãè¯ãã¹ã¿ãŒãã次ã«äœãèµ·ããã§ããããïŒãïŒã第äžã«ãä¿èšŒããããŸããã§ããããã®åæ¿ã®æã¯é¢éžããããšããã§ããŸãã ããããå±éºãåããªã圌ã¯åŸæ©ã§æ©ããŸãã ãããŠãç§ãã¡ã¯ç©ºã«ãšãŠã欲ããã£ãïŒ
Bookmateã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«
App Storeã§å©çšå¯èœã§ãïŒãªã³ã¯ã¯iTunesã§éããŸããäœããã®çç±ã§åäœããªãå Žåã¯ããã©ãŠã¶ã§éã
代æ¿ã®æ¹æ³ããããŸãïŒã
ãšãããŒã°
ã¹ãã£ãŒããžã§ããºã«ã€ããŠãã®ãããª
話ãããŸãã 1983幎ã圌ã¯ãšã³ãžãã¢ã«æ¬¡ã®èšèã§Macã®èµ·åæéãæé©åãããã説åŸããŸããã çŸäžïŒ ãããããŸããã æ°å¹Žã®ãã¡ã«ã500äžäººãå°ãªããšã1æ¥ã«1åã¯Macã®é»æºãå
¥ãããšæããŸãã èµ·åæéã10ç§ççž®ã§ãããšããŸãããã ããã«500äžäººã®ãŠãŒã¶ãŒãæãããšãæ¯æ¥5,000äžç§ãåŸãããŸãã 1幎éãããã¯ããããæ°å人ã®åœã§ãã ããŠã³ããŒãã10ç§éããããšãæ°å人ã®åœãæãããŸããã ããŠãããã ãã®äŸ¡å€ã¯ãããŸããïŒã ããæãã