Chrome Beta for Android 㧠Client Hints ã試ã
ãã®è¨äºã¯ãHTML5 Advent Calendar 2013ã®17æ¥ç®ã®è¨äºã§ãã
1. ããã¤ã¹ãã¯ã»ã«æ¯ã®æ©ã¿
æè¿ Retina ãå§ãã¨ããé«è§£å度ãã£ã¹ãã¬ã¤ã®æ®åã¨é²æ©ã¯åããã®ãããã¾ããç§ã¯ãã¶ã¤ã³ã®æè½ãç¡ãã®ã§ããã³ãã¨ã³ãã®è¨è¨ãããæ©ä¼ã¯ã»ã¼ãªãã§ãããããWebãã¶ã¤ãã¼ã®æ¹ã¯æ¬¡ã 販売ãããæ§ã ãªã¯ã©ã¤ã¢ã³ãã®é«è§£å度ãã£ã¹ãã¬ã¤å¯¾å¿ãæ°ã«ããªãã¨ãããªãã®ã¯æ¬å½ã«å¤§å¤ã ã¨æãã¾ãã
ä»ååãã¦ç¥ã£ãã®ã§ããããã®é«è§£å度ãã£ã¹ãã¬ã¤ã®å¯¾å¿ãããã«ããããããã¤ã¹ãã¯ã»ã«æ¯ãã¨ããå¤ãéè¦ãªæå³ãæã¤ããã§ãã詳ããã¯ããã¡ãã®ããã°ã「いまさら聞けないRetina対応のための「ピクセル」の話」 ãåç §ãã¦ããã ããããããã¤ã¹ãã¯ã»ã«æ¯ãã§æ¤ç´¢ããã¨ãã£ã±ãè¨äºãåºã¦ãã¾ãã
ãã®ããã¤ã¹ãã¯ã»ã«æ¯ã®å¯¾å¿ã§å¤§å¤ãªã®ã¯ã
- ããã¤ã¹ãã¯ã»ã«æ¯ã¯æ©ç¨®ã«ãã£ã¦éã(ç¾ç¶1.0ã3.0ã¾ã§ãã©ãã©)ã
- ããã¤ã¹ãã¯ã»ã«æ¯ããããããç¥ããã¨ãã§ããªã(User-Agentåãªã©ã§èª¿ã¹ãªãã¨ãããªãï¼ã
- ããã¤ã¹ãã¯ã»ã«æ¯ã«ãã£ã¦ç»åã®ãµã¤ãºãªã©ãå¤ããªãã¨ã¬ã¤ã¢ã¦ããå´©ããå ´åãããã
ã¨ãã£ããã¨ã®æ§ã§ããï¼å®éã«èªåã§Webã®ãã¶ã¤ã³ãã¦ããªãã®ã§å®æããªãã®ã§ããããã³ã大å¤ããã§ããï¼
ãã®åé¡ã解決ããããã«ãW3Cã¯picture要素ãsrcset属性ãJavaScriptã® window.devicePixelRatio ãªã©ã®æ¤è¨ãé²ãã¦ãã¾ãããã¾ã ä¸é¨ã§å®è£ ãå§ã¾ã£ãã°ããã§ã³ã³ãã³ãã®å¤æ´ãå¿ è¦ãªäºãããåé¡è§£æ±ºã¾ã§ã«ã¯ã¾ã 課é¡ãããããã§ãã
2. Client Hints ã¨ã¯ï¼
Client Hints ã¨ã¯ããã®ããã¤ã¹ãã¯ã»ã«æ¯çã¯ã©ã¤ã¢ã³ãå´ã®ããã¤ã¹æ
å ±ã HTTP ã®ãªã¯ã¨ã¹ããããã«è¨è¼ãã¦ãµã¼ãã«éç¥ãã¦ããããã¨ã®ä»çµã¿ã§ããGoogle ã® Developer advocate ã§ãã Ilya Grigorik ãããä»æ§åãé²ãã¦ãã¾ãã
HTTP Client-Hints (Internet Draft)
ãã®ä»çµã¿ã¯ããã®ããã° 「Automating DPR switching with Client-Hints」 ã«è©³ããã§ããããã£ã¨ç°¡åã«èª¬æããã¨ã
- ã¯ã©ã¤ã¢ã³ãããã¤ã¹ã®æ å ±ãéãHTTPãªã¯ã¨ã¹ããããã¨ãã¦ãæ°ãã« CH- ãã¬ãã£ãã¯ã¹ãã¤ãããããã使ãã
- ç¾ç¶ ããã¤ã¹ãã¯ã»ã«æ¯æ å ±ãéã CH-DPR 㨠ããã¤ã¹ãªã½ã¼ã¹ã®å¹ (Resource Width)ãéã CH-RW ã®2種é¡ãè¦å®ããã¦ããã
- ãµã¼ãã¯ãã¯ã©ã¤ã¢ã³ãããåãåã£ã CH-XXX æ å ±ãå ã«ãã¯ã©ã¤ã¢ã³ãããã¤ã¹ã«æé©ãªãªã½ã¼ã¹ãéä¿¡ããã
- ãµã¼ãã¯ãã¬ã¹ãã³ã¹ãããã«åãåã£ãæ å ±(CH-DPRãªã DRPãããã«ãã®å¤ï¼ãä»ä¸ãããã£ãã·ã¥ã®å½±é¿ãåããªããã CH-XXX æ å ±ã Vary ãããã«è¿½å ãã¦ã¯ã©ã¤ã¢ã³ãã«è¿ãã
ã¡ããã©å³ã«è¡¨ãã¨ä»¥ä¸ã®ãããªæãã§ãã
å¾æ¥ãã®ãããªã³ã³ãã³ããã´ã·ã¨ã¼ã·ã§ã³ã®ä»çµã¿ã¯ãAccept ã Accept-Encoding ãããçã§è¡ããã¦ãã¾ããããä»åæ°ãã CH-XXX ããããä½ãã¯ã©ã¤ã¢ã³ãããã¤ã¹ã«ç¹åããæ
å ±ããã¯ã©ã¤ã¢ã³ããããµã¼ãã«éããã¨ããææ¡ã§ãï¼ã¾ã ãã©ããã®æ®µéãªã®ã§ä»å¾ã©ããªããã¯ãããã¾ããï¼ãããã使ãã¨ããµã¼ãå´ãã¯ã©ã¤ã¢ã³ãã®ããã¤ã¹ãã¯ã»ã«æ¯å¤æãã¦ãªã½ã¼ã¹ãåºãããã¦ãããã®ã§ãã¯ã©ã¤ã¢ã³ãå´ã¯æèããã«æ¸ãã¨è¨ã£ãã¡ãªãããããã¾ãããµã¼ãå´ãåçã«ç»åã®çæã»å¤æãªã©ãããµã¼ãã¹ãéç¨ãã¦ããã°é常ã«æå¹ãªæ¹æ³ã§ãã
3. Chrome Beta for Android 㧠Client Hints ã試ã
Google ãææ¡ãã¦ãããã¨ã§ããããããããããã£ãæ°æ©è½ã¯ãã Chrome ã«å®è£
ããã¾ãã(Firefoxã«ã¯ææ¡ä¸ï¼ã
Issue 24451003: Client Hints (Closed)
ãã¹ã¯ããããã½ã³ã³ã§ã¯ããã® CH-DPRãéãChromeæ¡å¼µãç¨æããã¦ãã¾ãããå
æ¥ãã® Client Hints ãå®è£
ããããã¼ã¸ã§ã³ã Chrome Beta for Android (32.0.1700.58) ã«éãã¦ãã¾ãããæ¬å½ã®ã¢ãã¤ã«ããã¤ã¹(Nexus4 ããã¤ã¹ãã¯ã»ã«æ¯ã¯2.0)ã§æ©éãã® Client Hints ã試ãããã¨æãã¾ãã
å°ã以ä¸ã¯è©¦é¨çãªæ©è½ã®è©ä¾¡ã®ããã«ä½æ¥ãè¡ã£ããã¨ãè¨è¿°ãããã®ã§ãããããçä¼¼ã¦çºçããä¸åã®è²¬ä»»ãè² ãããã¾ãã®ã§ã注æä¸ããã
3-1. ã¯ã©ã¤ã¢ã³ãå´ã®æºå
Client Hintsãæå¹ã«ããã«ã¯ãChrome å´ã§ã¯ã³ãã³ãã©ã¤ã³ãªãã·ã§ã³ã§ --enable-client-hints ãå¿ è¦ã§ããAndroid ããã¤ã¹ã§ã¯ç´æ¥ãªãã·ã§ã³æå®ã㦠Chrome ãèµ·åã§ãã¾ããã®ã§ã /data/local ãã£ã¬ã¯ããªã« chrome-command-line ãã¡ã¤ã«ãä½æãã¦æå®ãã¾ãã
root@mako:/data/local # ls -l ls -l -rw-rw-r-- root root 29 2013-12-13 17:05 chrome-command-line root@mako:/data/local # cat chrome-command-line cat chrome-command-line chrome --enable-client-hints root@mako:/data/local #
Chrome Beta for Android ãèµ·åãã¦ã about://version ã§ãªãã·ã§ã³ãã©ã°ã確èªãã¦ã¿ã¾ãã --enable-client-hints ãè¨è¼ããã¦ããã°æåã§ãï¼ä¸å³èµ¤ç·ï¼ã
å° SPDY Proxy ãæå¹ã«ãã¦è©¦é¨ããã¨ãããç»åã®èªã¿è¾¼ã¿ã極端ã«é
ããªããã¨ãããã¾ãããGoogle ã® SPDY Proxy ãµã¼ãã¹ã¨ãªã«ãç¸æ§ãæªãã®ã§ãããããä»å㯠SPDY Proxy ã®æ©è½ãå¤ãã¦è©¦é¨ãã¾ããã (â ãµã¼ãå´ã®ã³ã¼ããééã£ã¦ã¾ããã jpg ç»åãªã®ã« content-type ã png ã«ãã¦ãã®ãåé¡ã§ãããããããªãã Google ããã)
ã¾ãããã³ããºã¼ã ããã«ããã£ã¹ãã¬ã¤ãªã©ã®å¯¾å¿ã¯ã¾ã ã®æ§ã§ãã
3-2. ãµã¼ãå´ã®æºå
Client Hints ãæã¤HTTPãªã¯ã¨ã¹ããåãããã Node.jsã使ã£ã Client Hints 対å¿ãµã¼ããä½ãã¾ãããç»å㯠Ilya Grigorik ããã試é¨ãµã¼ãä¸ã§å
¬éãã¦ãããã³ãã®ç»å3種é¡(1X, 1.5X, 2.0X)ã使ãã¾ããã
https://github.com/igrigorik/http-client-hints/tree/master/server/ch-dpr-server/assets
Node.js ãµã¼ãã³ã¼ãã¯ä»¥ä¸ã®éãã§ãã ãªã¯ã¨ã¹ããããã® ch-dpr å¤ãè¦ã¦ã3種é¡ã®ç»åãåºãããã¦ãã¾ããããã¦ã¬ã¹ãã³ã¹ã«å¿
è¦ãªããã(CDR, Vary)ãå ãã¦ããã ãã§ãã
// Client Hints ããã¤ã¹ãã¯ã»ã«æ¯ 対å¿ãµã¼ã var http = require('http'); var fs = require('fs'); // ããã¤ã¹ãã¯ã»ã«æ¯ã«å¿ãã¦3種é¡ã®ç»åãç¨æ var image_1x = fs.readFileSync('./assets/photo-1.0x.jpg'); var image_1_5x = fs.readFileSync('./assets/photo-1.5x.jpg'); var image_2x = fs.readFileSync('./assets/photo-2.0x.jpg'); var server = http.createServer(function(req, res) { var content,content_length,content_type; var dpr = req.headers['ch-dpr']; // Client Hintsã®ããã¤ã¹ãã¯ã»ã«æ¯ãåå¾ switch(req.url) { case '/photo.jpg': content_type = 'image/jpg'; if (dpr === undefined) { content = image_1x; content_length = image_1x.length; break; } dpr = parseFloat(dpr); // ããã¤ã¹ãã¯ã»ã«æ¯ã«å¿ãã¦éä¿¡ããç»åãåãã if(dpr>= 2.0) { content = image_2x; content_length = image_2x.length; } else if ( dpr >= 1.5) { content = image_1_5x; content_length = image_1_5x.length; } else { content = image_1x; content_length = image_1x.length; } break; default: content_type = 'text/html'; var dpr_msg = dpr ? dpr: 'No Device Pixel Ratio in Client Hints'; content = '<!doctype html><html><head>Client Header</head><body>' + '<h1>Device Pixel Ratio:' + dpr_msg + '</h1>' + '<img src="photo.jpg" /></body></html>'; content_length = Buffer.byteLength(content); } if (dpr) { res.setHeader('dpr', dpr); // åãåã£ã DPR å¤ãè¿ã res.setHeader('vary', 'ch-dpr'); // ãã£ãã·ã¥ã«å½±é¿ãããªããã vary ããããè¿ã } res.writeHead(200, { 'content-type': content_type, 'content-length': content_length }); res.end(content); }); server.listen(80, function() { console.log('Listening on port 80'); });
4. Client Hints ã§ã©ãå¤ããï¼
ããå®éã«ã©ããªããè¦ã¦ã¿ã¾ãããã
4.1 Chrome Beta for Android with Client Hints
Nexus4(DPR 2.0) ã® Chrome for Android(32.0.1700.58) 㧠Client Hints ã使ã£ãããã®ããã«å¤§ããªç»å(2X)ã«ãªãã¾ããã
4.2 Chrome for Android without Client Hints
ã¡ãªã¿ã« Client Hints ã«å¯¾å¿ãã¦ããªã Chrome for Android(31.0.1650.59:ãã¼ã¿ã§ãªãï¼ã使ãã¨ãã®ããã«å°ããªç»å(1X)ã«ãªãã¾ãã
ä»å¾ãã®ä»æ§ãã©ã®ããã«å±éãã¦ããã®ããããã¾ããããä»ã¾ã§ viewport ãã CSS ããã§è¦å´ãã¦ãããã¨ããClient Hints ã使ã£ã¦ HTTP ã®ãããã³ã«ã¬ãã«ã§ã®å¯¾å¿ãããã¨ã§ãå°ãï¼ããªãï¼ï¼ã¯æ¥½ã«ãªãã¨ãããã¨ã§ãï¼å®å
¨ã«æ¥½ã«ãªããã¯ãããã¾ãããï¼ã
ã§ãããããWebã®é²åããããã³ã«ãå¤ãã¤ã¤ãããã¨ããä¸ã¤ã®ä¾ãããªããã¨æãã¾ãã