
èšäºã®ç¿»èš³ã è±èªçã®ãªãªãžãã«ãSitePointã§å ¬éãããŠããŸã-ã 匷åãªè»œéã°ã©ãã£ãã¯ã©ã€ãã©ãªã§ããGraphicsJSã®çŽ¹ä» ãã
HTML5ã¯ãææ°ã®Webã®åºç€ã§ãã ãããŠä»æ¥ãã€ã³ã¿ã©ã¯ãã£ããªã°ã©ãã£ãã¯ã¹ãäœæããããšã課é¡ã§ããå ŽåãSVGãCanvasãªã©ã®ãã¯ãããžãŒãæãããéžæãããŸãã Flashã¯å¿ããããŠãããSilverlightã¯Webã®è£ã«äœãçããé³¥ã§ããããµãŒãããŒãã£ã®ActiveXããã³Javaãã©ã°ã€ã³ãèŠããŠãã人ã¯ã»ãšãã©ããŸããã
SVGãšCanvasã®é·æãšçæã¯ããç¥ãããŠããŸã -äžè¬ã«ãSVGãã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãäœæããŠæäœããã®ã«ããé©ããŠãããšããäºå®ã«åž°çããŸãã ããã¯XMLããŒã¹ã®ãã¯ã¿ãŒåœ¢åŒã§ããã
<svg>
ã䜿çšããŠç»åãããŒãžã«ããŒããããšããã®å éšèŠçŽ ã®ãããããSVG DOMã§å©çšå¯èœã«ãªããŸãã
ãã®èšäºã§ã¯ã GraphicsJSã«ã€ããŠèª¬æããŸãã ããã¯ãSVGãã¯ãããžïŒIEã®å€ãããŒãžã§ã³ã®VMLïŒã«åºã¥ãã匷åãªãªãŒãã³ãœãŒã¹ã®ã°ã©ãã£ã«ã«JavaScriptã©ã€ãã©ãªã§ãã ãŸããGraphicsJSã®åºæ¬ãç°¡åã«çŽ¹ä»ãã次ã«2ã€ã®å°ãããªãããå®äŸã§ã©ã€ãã©ãªã®æ©èœã説æããŸãã ãããã®æåã®ãã®ã¯èŠèŠèžè¡ã«æ§ããããŠããŸãã 2ã€ç®ã¯ã50è¡æªæºã®ã³ãŒãã§ã¿ã€ã ãã©ãŒã®ãžã£ã³ã«ã§ã·ã³ãã«ãªã¢ãŒãã²ãŒã ãäœæããæ¹æ³ã瀺ããŸãã
ãªãGraphicsJS
SVGã§ã®äœæ¥ã容æã«ããã©ã€ãã©ãªãããªããããŸããRaphaël ã Snap.svgã BonsaiJSãæé©ã§ãã ããããã«é·æãšçæããããŸããããããã®è©³çŽ°ãªæ¯èŒã¯ã次ã®åºçç©ã®ããããã®ãããã¯ã«ãªããŸãã ãã®èšäºã¯ãGraphicsJSã®ã¿ã察象ãšããŠããŸãã次ã«ããã®ã©ã€ãã©ãªãåªããŠãããä»ã®è£œåãšæ¯ã¹ãŠéç«ã£ãŠããçç±ã説æããŸãã
ãŸããGraphicsJSã¯éåžžã«è»œéã§ãéåžžã«æè»ãªJavaScript APIãåããŠããŸãã ããŸããŸãªãã©ãŠã¶ãŒã®ç¹å®ã®HTML DOMãšã¯ç¡é¢ä¿ã«ãä»®æ³DOMãšåæ§ã«ãããã¹ãã®æžåŒèšå®ã®è±å¯ãªæ©äŒãæäŸããŸãã
第äºã«ããã®ã©ã€ãã©ãªã®ã³ãŒãã¯æšå¹Žç§ã«ã®ã¿å ¬éãããŸãã ã AnyChart㯠ãã€ã³ã¿ã©ã¯ãã£ãããŒã¿ã®èŠèŠåãœãªã¥ãŒã·ã§ã³ã®éçºã«ããããªãŒããŒã®1ã€ã§ãããçŽ3幎éïŒAnyChart 7.0ã®ãªãªãŒã¹ä»¥éïŒåçšè£œåã®ã°ã©ãã£ãã¯ãšã³ãžã³ãšããŠGraphicsJSã䜿çšããŠããããããã®ã©ã€ãã©ãªã¯æŠéæ¡ä»¶ã§ãã¹ããããŠããŸãã ïŒå 責äºé ïŒç§ã¯AnyChartã®RïŒD責任è ã§ãããGraphicsJSã®äž»ä»»éçºè ã§ããïŒ
第äžã«ãä»ã®AnyChart補åïŒã°ã©ãäœæçšJavaScriptã©ã€ãã©ãªïŒãšã¯ç°ãªããGraphicsJSã¯åçšããã³éåçšç®çã®äž¡æ¹ã§èªç±ã«äœ¿çšã§ããŸãã ã©ã€ãã©ãªã¯ãApacheã©ã€ã»ã³ã¹ã®äžã§GitHubã§å ¥æã§ããŸãã
第4ã«ãGraphicsJSã«ã¯ãInternet Explorer 6.0以éãSafari 3.0以éãFirefox 3.0以éãOpera 9.5以éã®ãµããŒããªã©ããã©ãŠã¶éã®äºææ§ããããŸãã IEã®å€ãããŒãžã§ã³ã§ã¯ãã©ã€ãã©ãªã¯ä»ã®ãã¹ãŠã®ãã©ãŠã¶ãŒïŒSVGïŒã§VMLã䜿çšããŸãã
æåŸã«ãGraphicsJSã䜿çšãããšãã°ã©ãã£ãã¯ã¹ãšã¢ãã¡ãŒã·ã§ã³ãå¹ççã«çµã¿åãããããšãã§ããŸãã å³æžé€šã®ã¡ã€ã³ã®ã£ã©ãªãŒã ã芧ãã ãããçãããç« ã å転ããéæ²³ ã éš ã æç¶ãçã«çæãããè ã 15ããºã«ãªã©ã®äŸããããŸãã APIã®è©³çŽ°ãªããã¥ã¡ã³ããšè©³çŽ°ãªèª¬æã§ã GraphicsJSã®äœ¿çšäŸãããã«èŠã€ãããŸã ã
GraphicsJSã®åºæ¬
GraphicsJSãéå§ããã«ã¯ãã©ã€ãã©ãªèªäœãæ¥ç¶ããå°æ¥ã®æç»ã®ããã«HTMLã³ãŒãã®ãããã¯èŠçŽ ãäœæããå¿ èŠããããŸãã
<html lang="en"> <head> <meta charset="utf-8" /> <title>GraphicsJS Basic Example</title> </head> <body> <div id="stage-container" style="width: 400px; height: 375px;"></div> <script src="https://cdn.anychart.com/js/latest/graphics.min.js"></script> <script> // GraphicsJS </script> </body> </html>
次ã«ãã¯ãŒã¯ã¹ããŒã¹ãæ§ç¯ãããã®äžã«äœããæãå¿ èŠããããŸããäŸãã°ã é·æ¹åœ¢ ã åããŸãã¯ä»ã®åœ¢ç¶ã§ãã
// var stage = acgraph.create('stage-container'); // var stage.rect(25, 50, 350, 300);
ããã«CodePenã®äŸããããŸããããã§ããå°ãé²ãã§ã Deathly Hallowsã®ãµã€ã³ãæããŸãã
ç§ãã¡ã®æåã®åäœ
茪éãè²ããã¿ãŒã³ã®å¡ãã€ã¶ã
å¡ãã€ã¶ããšã¢ãŠãã©ã€ã³ã® èšå®ã䜿çšããŠãä»»æã®åœ¢ç¶ãŸãã¯ç·ãè²ä»ãã§ããŸã ã ãã¹ãŠã«ãã¹ïŒå¢çç·ïŒããããŸãããå¡ãã€ã¶ãã¯å³åœ¢ãšéããç·ã§ã®ã¿äœ¿çšã§ããŸãã
GraphicsJSã¯ãå¡ãã€ã¶ããšã¢ãŠãã©ã€ã³ã®äž¡æ¹ã§ãç·åœ¢ããã³æŸå°ç¶ã®ã°ã©ããŒã·ã§ã³ãŸã§ããããã®ãã©ã¡ãŒã¿ãŒã®å€æ°ã®èšå®ãæäŸããŸãã ç·ã¯ç Žç·ã«ããããšãã§ããããã€ãã®ã¿ã€ã«ã¢ãŒãã§ç»åãå¡ãã€ã¶ãããšãã§ããŸãã ãã ãããã®ãããªäžé£ã®é¢æ°ã¯ãã»ãšãã©ãã¹ãŠã®ã©ã€ãã©ãªã«ãããŸãã GraphicsJSãéç«ãããŠããã®ã¯ã ããããšãã¿ãŒã³ã®å¡ãã€ã¶ããªãã·ã§ã³ã§ãã32ïŒïŒïŒæ¢è£œã®å¡ãã€ã¶ããªãã·ã§ã³ããéžæã§ããã ãã§ãªããå³åœ¢ãããã¹ãããç¬èªã®ãã¿ãŒã³ãç°¡åã«äœæã§ããŸãã
ããã§ã¯ãæ£ç¢ºã«äœãã§ããããèŠãŠã¿ãŸãããã å°ããªçµµïŒå®¶ã®è¿ãã«ç«ã£ãŠããç·ïŒãæããŠãè²ãšãã¿ãŒã³ã§å¡ãã€ã¶ããŠæŽç·ŽãããŸãã ç°¡åã«ããããã«ã ãã€ãŒãã¢ãŒãã®ã¹ã¿ã€ã«ã®ã€ã¡ãŒãžã«ããŸãïŒ ããªã¥ããã«ãªããªãããã«ããŸãïŒã è¡ããïŒ
// var stage = acgraph.create('stage-container'); // var frame = stage.rect(25, 50, 350, 300); // var walls = stage.rect(50, 250, 200, 100); var roof = stage.path() .moveTo(50, 250) .lineTo(150, 180) .lineTo(250, 250) .close(); // var head = stage.circle(330, 280, 10); var neck = stage.path().moveTo(330, 290).lineTo(330, 300); var kilt = stage.triangleUp(330, 320, 20); var rightLeg = stage.path().moveTo(320, 330).lineTo(320, 340); var leftLeg = stage.path().moveTo(340, 330).lineTo(340, 340);
çµæã¯CodePenã§è¡šç€ºã§ããŸãã
ã芧ã®ãšãããããã§ã¯å€æ°ã䜿çšããŸããã¯ãŒã¯ã¹ããŒã¹ã«äœããæç»ãããã¹ãŠã®ã¡ãœããã¯ãäœæããããªããžã§ã¯ããžã®ãªã³ã¯ãè¿ããããã䜿çšããŠå€æŽãŸãã¯åé€ã§ããŸãã
ããã«ãGraphicsJSã§ã¯ããã§ãŒã³ã³ãŒã«ïŒ
stage.path().moveTo(320, 330).lineTo(320, 340);
ïŒãç©æ¥µçã«äœ¿çšã§ããŸã
stage.path().moveTo(320, 330).lineTo(320, 340);
ããã«ãããã³ãŒããççž®ã§ããŸãã ãã®æ©èœã¯æ éã«äœ¿çšããå¿ èŠããããŸãããé©åãªã¢ãããŒãã䜿çšãããšããã§ãŒã³åŒã³åºãã«ããã³ãŒããæ¬åœã«ã³ã³ãã¯ãã§èªã¿ããããªããŸãã
ããã§ãç§ãã¡ãæã£ãŠããåçãåäŸã«æž¡ããè²ä»ãããããã«é Œãããšãã§ããŸããåäŸã§ã次ã®ããªãã¯ããã¹ã¿ãŒã§ããããã§ãã
// // frame.stroke(["red", "green", "blue"], 2, "2 2 2"); // walls.fill(acgraph.hatchFill('horizontalbrick')); // roof.fill("#e4d96f"); // kilt.fill(acgraph.hatchFill('plaid'));
ããã§ãäŸã¯æ¬¡ã®ããã«ãªããŸã ã
åçã¯ãã«ãã®ãã€ã©ã³ããŒã瀺ããŠããŸãã 圌ã¯brickãå±æ ¹ã®ã¬ã³ã¬é ãã®åã®è¿ãã«ç«ã£ãŠããŸãã ãã£ã³ã¹ãã€ããã§ãå®éã«ç§ãã¡ã®åçãèžè¡äœåãšåŒã¶ããšãã§ããŸãããã®èäœæš©ã¯ç§ãã¡ãä¿è·ããããã®ã§ãã ããŠãç§ãã¡ãèšå®ããããã¹ããã¿ãŒã³ã§ã®å ã®å¡ãã€ã¶ãã®å©ããåããŠãããè¡ããŸãããïŒ
// 169 - var text = acgraph.text().text(String.fromCharCode(169)).opacity(0.2); var pattern_font = stage.pattern(text.getBounds()); pattern_font.addChild(text); // frame.fill(pattern_font);
ã芧ã®ãšãããããã¯éåžžã«ç°¡åã§ãã ããã¹ããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠãããã¯ãŒã¯ã¹ããŒã¹ã«ãã¿ãŒã³ãäœæããæåŸã«ãã¿ãŒã³ã«ããã¹ããæ¿å ¥ããå¿ èŠããããŸãã
50è¡æªæºã®ã³ãŒãã§ã¢ãŒãã²ãŒã ïŒã¿ã€ã ãã©ãŒïŒãæç»ããŸã
èšäºã®æ¬¡ã®éšåã§ã¯ãGraphicsJSã䜿çšããŠã Cookie Clickerã®ãããªCookie Clickerã²ãŒã ã50è¡æªæºã®ã³ãŒãã§æç»ããæ¹æ³ã瀺ããŸãã
ãã®ã²ãŒã ã®ååã¯ã颚ã®ç®¡ç人ãã§ãã ãã®äžã§ããŠãŒã¶ãŒã¯ã颚ã®åŒ·ãç§ã®æ¥ã«éããæé€ããçšåå¡ãšããŠæ©èœããŸãã ããã¯ãéšåçã«ãGraphicsJSã®ã£ã©ãªãŒããæé çã«çæããããªãŒããå«ããµã³ãã«ã³ãŒãã䜿çšããŸã ã
ã²ãŒã ã®æçµããŒãžã§ã³ã¯ãCodePen ïŒãŸãã¯ãã®èšäºã®æåŸïŒã§èŠãããšãã§ããŸã ã
ã¬ã€ã€ãŒãzIndexãä»®æ³DOM
ïŒåã®äŸã®ããã«ïŒã¯ãŒã¯ã¹ããŒã¹ãäœæããããšããå§ããŸãã ãããŠãããã€ãã®ãœãŒã¹å€æ°ã宣èšããŸãã
// var stage = acgraph.create("stage-container"); // var palette_fill = ['#5f8c3f', '#cb9226', '#515523', '#f2ad33', '#8b0f01']; var palette_stroke = ['#43622c', '#8e661b', '#393b19', '#a97924', '#610b01']; // var leavesCounter = 0;
ã²ãŒã ãäœæããããã«ãGraphicsJSã§èŠçŽ ãã°ã«ãŒãåãããªããžã§ã¯ãã§ããã¬ã€ã€ãŒãæäœããæ©èœã䜿çšã§ããŸãã èŠçŽ ãã°ã«ãŒãåããŠãåãå€æŽïŒå€æãªã©ïŒãé©çšããããããå¿ èŠããããŸãã ã¬ã€ã€ãŒã¯ãµã¹ãã³ãã¢ãŒãã§å€æŽã§ããŸãïŒåŸã§èª¬æããŸãïŒãããã«ãããããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã
ãã®äŸã§ã¯ãã¬ã€ã€ãŒã®æ©èœã¯ãèãã°ã«ãŒãåããèãäœææãåºããããã瀺ãç¢æã§èŠãããªãããã«ããã®ã«åœ¹ç«ã¡ãŸãã ãããè¡ãã«ã¯ãæåã«ç¢æãäœæãã次ã«
stage.layer
ã¡ãœããã䜿çšããŠãäœæ¥é åå šäœã®ã¬ã€ã€ãŒãäœæããäœæ¥é åã«ç¢æãããäœã
zIndex
ãå²ãåœãŠãŸãã
// var counterLabel = stage.text(10,10, "Swiped: 0", {fontSize: 20}); // var gameLayer = stage.layer().zIndex(counterLabel.zIndex()-1);
ããã§ããã®ã¬ã€ã€ãŒã«ããã€ã®èãäœæããŠããããã¹ãã®äžã«è¡šç€ºãããããšã¯ãããŸããã
å€æ
次ã«ã䟿å©ãªå€æçšã®APIã䜿çšããŠèãã¬ã³ããªã³ã°ããé¢æ°ãè¿œå ããŸããããã«ãããèŠçŽ ãšèŠçŽ ã®ã°ã«ãŒãã®äž¡æ¹ã移åãæ¡å€§çž®å°ãå転ãããªãã³ã°ã§ããŸãã GraphicsJSãæäŸããä»ã®æ©èœïŒã¬ã€ã€ãŒããã³ä»®æ³DOMïŒãšçµã¿åãããŠãããã¯éåžžã«åŒ·åãªããŒã«ã§ãã
function drawLeaf(x, y) { // var index = Math.floor(Math.random() * 5); var fill = palette_fill[index]; var stroke = palette_stroke[index]; // var scale = Math.round(Math.random() * 30) / 10 + 1; var angle = Math.round(Math.random() * 360 * 100) / 100; // () var path = acgraph.path(); // path.fill(fill).stroke(stroke, 1, 'none', 'round', 'round'); var size = 18; path.moveTo(x, y) .curveTo(x + size / 2, y - size / 2, x + 3 * size / 4, y + size / 4, x + size, y) .curveTo(x + 3 * size / 4, y + size / 3, x + size / 3, y + size / 3, x, y); // path.scale(scale, scale, x, y).rotate(angle, x, y); return path; };
ã芧ã®ãšãããåè¡ã¯åãæ¹æ³ã§äœæãããŸãããå€æãããŸãã çµæã¯éåžžã«çŽ æŽãããã©ã³ãã ãªèã®ãã¿ãŒã³ã§ãã
ã€ãã³ããæäœãã
GraphicsJSã®ãã¹ãŠã®ãªããžã§ã¯ããã¯ãŒã¯ã¹ããŒã¹ãã¬ã€ã€ãŒã¯ã€ãã³ããåŠçã§ããŸã ã å©çšå¯èœãªãã¹ãŠã®ã€ãã³ãã®ãªã¹ãã¯ã EventType APIã«ãããŸã ã åæã«ãã¯ãŒã¯ã¹ããŒã¹ã¯ã¬ã³ããªã³ã°å¶åŸ¡ã®ããã«4ã€ã®ç¹å¥ãªã€ãã³ãããµããŒãããŸãã
ã²ãŒã ã®äŸã§ã¯ãåãªããžã§ã¯ãïŒã·ãŒãïŒã«é¢é£ä»ããããã€ãã³ããªã¹ããŒã䜿çšããŠãèã®äžã«ããŠã¹ã眮ããšèã1ã€ãã€æ¶ããŸãã ãããå®çŸããã«ã¯ã
return
åã«ã
drawLeaf
é¢æ°ã®æåŸã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
path.listen("mouseover", function(){ path.remove(); counterLabel.text("Swiped: " + leavesCounter++); if (gameLayer.numChildren() < 200) shakeTree(300); });
ãããããèãã«ãŠã³ãããããã«ã¬ã€ã€ãŒã䜿çšãããããšãæããã§ãã
if (gameLayer.numChildren() < 200) shakeTree(300);
å®éãããã§ã¯èã®æ°ãä¿åããŠããŸããã èã¯ãããã¬ã€ã€ãŒãŸãã¯å¥ã®ã¬ã€ã€ãŒã«è¿œå ãŸãã¯åé€ãããç·ã§ãããããç§ãã¡ãæã£ãŠããåã®æ°ïŒãããã£ãŠãæ®ã£ãŠããèã®æ°ïŒã远跡ã§ããŸãã
GraphicsJSã©ã€ãã©ãªã䜿çšãããšãHTML DOMã®æœè±¡åã§ããä»®æ³DOMã䜿çšã§ããŸãããã®ä»®æ³DOMã¯ã軜éã§ãããŸããŸãªãã©ãŠã¶ãŒã§SVG / VMLã䜿çšããä»æ§ã«äŸåããŸããã ãã®ãã¯ãããžãŒã¯ããã¹ãŠã®ãªããžã§ã¯ããšã¬ã€ã€ãŒã®å¶åŸ¡ãã°ã«ãŒããžã®å€æã®é©çšãããã»ã¹å šäœã®è¿œè·¡ãšå¶åŸ¡ãå¯èœã«ããã¡ãœããã䜿çšããã¬ã³ããªã³ã°ã®æé©åãªã©ãå€æ°ã®äŸ¿å©ãªæ©èœã®å®è£ ã«åœ¹ç«ã¡ãŸãã
ããã©ãŒãã³ã¹ã®æé©å
ä»®æ³DOMãšã€ãã³ããã³ãã©ãŒã®ãããã§ãGraphicsJSãŠãŒã¶ãŒã¯ã¬ã³ããªã³ã°ãå¶åŸ¡ã§ããŸãã ã©ã€ãã©ãªããã¥ã¡ã³ãã®èšäºã ããã©ãŒãã³ã¹ ãã§ããããã®é¢é£æ§ã«ã€ããŠèªãããšãã§ããŸãã
ã²ãŒã ã§ãªãŒããçæãããŠããæç¹ã§ãã¬ã³ããªã³ã°ãäžæåæ¢ãããã¹ãŠã®å€æŽãè¡ããããããã«æŽæ°ããå¿ èŠããããŸãã
function shakeTree(n){ stage.suspend(); // for (var i = 0; i < n; i++) { var x = Math.random() * stage.width()/2 + 50; var y = Math.random() * stage.height()/2 + 50; gameLayer.addChild(drawLeaf(x, y)); // } stage.resume(); // }
èŠçŽ ãè¿œå ãããã®æ¹æ³ã䜿çšãããšãæ°ããèãã»ãŒç¬æã«è¡šç€ºãããŸãã
// shakeTree(500);
æåŸã«ã
shakeTree()
ã¡ãœãããåŒã³åºããŠããã¹ãŠã®èãç Žæ£ããŸãã
æçµçµæ
ãããã«
HTML5ã«åãæ¿ãããšWebãå€ãããŸããã ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ãåçŽãªãµã€ãã«è³ããŸã§ãã°ã©ãã£ãã¯ã®æäœãå¿ èŠãšããã¿ã¹ã¯ã«ééããããšããããããŸãã ã©ã®ãããªç¶æ³ã§ãå®å šã«æ©èœãããœãªã¥ãŒã·ã§ã³ãèŠã€ããããšã¯äžå¯èœã§ãããGraphicsJSã©ã€ãã©ãªã«æ³šæããããšããå§ãããŸãã ãªãŒãã³ãœãŒã¹ã³ãŒããšãªãŒãã³ãœãŒã¹ã©ã€ã»ã³ã¹ããããéåžžã«æ©èœçã§çç£çã§ãåªãããã©ãŠã¶ãµããŒããšå€ãã®æ©èœãåããŠããŸãã ããããã¹ãŠããGraphicsJSãèå³æ·±ãã䟿å©ã§ããããŠãã¡ãããå¹æçãªãœãªã¥ãŒã·ã§ã³ã«ããŸãã
ã³ã¡ã³ãã§GraphicsJSã«ã€ããŠã®ãã£ãŒãããã¯ãããã ããã°å¹žãã§ãã ãã§ã«ãã®ã©ã€ãã©ãªã䜿çšããŠããŸããïŒ æ°ãããããžã§ã¯ãã§ãã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããå¯èœæ§ãæ€èšããæºåã¯ã§ããŠããŸããïŒ ãªãããªãããã§ãªãã®ããç¥ãããšã¯èå³æ·±ãã§ãããã ãšããã§ãç§ã¯çŸåšãæé«ã®ã°ã©ãã£ãã¯JavaScriptã©ã€ãã©ãªã®ãªã¹ããšããããæ¯èŒããèšäºã®äœæã«åãçµãã§ããã®ã§ãã©ã®ã©ã€ãã©ãªã«è¡šç€ºãããã®ããã³ã¡ã³ãã§æžãããšããå§ãããŸãã
ãªã³ã¯é
- äžè¬çãªæ
å ±
- å³æžé€š
- ã°ã©ãã£ãã¯ã¹js
SitePointã«é¢ãããªãªãžãã«èšäºã®èè ïŒRoman Lubushkinã