ãããŸããããªãããã«ãæ¬è³ªã瀺ããŸãã æ°ããä»äºã«å¿åãããšãã圌ãã¯ç§ã«æ¬¡ã®ããã«ç°¡åã«èª¬æã§ãããã¹ãã¿ã¹ã¯ããããŸããïŒãã«ã¹ã¿ã ã¹ãã¢ãªã³ã©ã€ã³ã¹ãã¢ã«å ¥ããŠãŒã¶ãŒã®ã€ãã³ããå°çèŠèŠåããããã®ã°ããŒã®é¡äŒŒç©ãæžããŠãã ãããã ç°¡åã«èšãã°ãç¹å®ã®ã€ãã³ãã®çºçã«ã€ããŠã·ã¹ãã ãã°ãç£èŠãããããã®å ŽåããŠãŒã¶ãŒã®IPã¢ãã¬ã¹ã«ãã£ãŠæ±ºå®ããããããäžã®ãã€ã³ãã衚瀺ïŒãã®å ŽåïŒããå¿ èŠããããŸãã å®è£ ã®ç®çïŒãã¬ãŒã³ããŒã·ã§ã³ã®ç®çã§ãèŠãç®ã調åãšçŸç快楜ã®nã«æµžãããšãã§ãããèŠæ ãã®è¯ããããã¡ãããäœæããã äž»ãªæ¡ä»¶ã¯ãéçºããã»ã¹ã§ã®Javaãã¯ãããžãŒã®ã¹ã¿ãã¯ã®äœ¿çšã§ãããããã«ããå€ãã®æ±ºå®ãæ¡çšãããŸããã ããã«ãããã1ããŒãžã®ãµã€ããšããŠå®è£ ããããšã決å®ãããŸããã ãããŠãç§ã¯éåžžã«è¡šé¢çã«JavaãšWebã«ç²ŸéããŠããããïŒäž»ã«C / C ++ã§äœæããŸããïŒãå€ãã®ããšãåŠã¶å¿ èŠããããŸããã ãŸããç§ãã¡ã¯äžç·ã«ãããææ¡ããŸãã
ãã®èšäºã¯ãèå³ã®ãã人ãåå¿è ã察象ãšããŠããŸãããããã¥ã¡ã³ããå°éèšäºã䜿çšããŠèŠã€ããããšãã§ããåçŽãªãã®ããåããããšã¯ãããŸããã æãæçšãªãªãœãŒã¹ããœãŒã¹ãžã®ãªã³ã¯ïŒ BSDã©ã€ã»ã³ã¹ã®äžã§é åžãããŠããŸã ïŒãããã³äœæ¥ããŒãžã§ã³ãžã®ãªã³ã¯ã¯ãèšäºã®æåŸã«èšèŒãããŠããŸãã
ãšã«ãããåè¿°ã®ã°ããŒã®ãœãŒã¹ã䜿çšããŠã¿ãŸãããïŒ ãŸãããããã¯MozillaãæäœããããŒã¿ã®éã«éåžžã«åºæã§ã-èµ·åæ¥ã«Firefoxãã€ã³ã¹ããŒã«ãããåæ°ãšããã°ã·ã¹ãã ãåæ£åãããŠãããšããäºå®ãæãåºããŠãã ããã ãã®äŸã§ã¯ãããŒã¯æã«1ç§ãããçŽ100ãšã³ããªãåäžã®ãã°ãã¡ã€ã«ã«æžã蟌ãŸããŸããããã®äžéšã®ã¿ãèŠèŠåããå¿ èŠããããŸãã 第äºã«ãGlowã®ãããã¯ãèŠãã®ãæã楜ãããã®ã§ã¯ãããŸããã ãããŠç¬¬äžã«ãããã¯ãã¹ãã¿ã¹ã¯ã§ã:)
ã¯ã€ãã¯ã«ãã¯
ããã·ã¹ãã ã«ã¯äœãå¿ èŠã§ããïŒ
- ãã°ãã¡ã€ã«ã®æŽæ°ã远跡ããŸãïŒ
tail -f
ãªã©ïŒã ããã«ããã°ãã¡ã€ã«ã¯1æ¥1åéããããæ éã«ã¢ãŒã«ã€ããããæ°ãããã¡ã€ã«ã代ããã«äœ¿çšãããããšã«æ³šæããŠãã ãããã€ãŸãããããã®ã¢ã¯ã·ã§ã³ãç£èŠããçŸåšã®ãã°ã«åãæ¿ããå¿ èŠããããŸãã - ãã°ã®åæ°ãããšã³ããªã«å¯Ÿå¿ããã€ãã³ãã®ã¿ã€ãã決å®ããããããã€ã³ããšããŠãããäžã«è¡šç€ºããå¿ èŠãããå Žåã¯ãã¬ã³ãŒãã«å«ãŸããIPã¢ãã¬ã¹ã«ãã£ãŠãã€ã³ãã®åº§æšãèš±å¯ïŒè§£æ±ºïŒããŸãã
- ã€ãã³ãããŒã¿ããªã¢ã«ã¿ã€ã ã§ã¯ã©ã€ã¢ã³ãã«éä¿¡ããå¿ èŠããããŸãïŒãã®å Žåãã¯ã©ã€ã¢ã³ãã®ãã©ãŠã¶ãŒã®ã¹ã¯ãªããïŒã
- ã¯ã©ã€ã¢ã³ãã¹ã¯ãªããã¯ã察å¿ããã€ãã³ãã®ã¿ã€ãã«å¿ããŠè²ä»ãããããã€ã³ããå«ããã¡ããšãããããã®åœ¢åŒã§æ å ±ã®åºåãåŠçããå¿ èŠããããŸãã
åé ç®ã«ã€ããŠå°èŠæš¡ãªèª¿æ»ãè¡ã£ãåŸã次ã®ããšã決å®ãããŸããã å°ããªJavaããŒã¢ã³ïŒããããèãããŸãããããããããŸãããäœãããããŸããïŒã¯ããã°ãç£èŠããã¬ã³ãŒãã解æããIPã解決ããHTTP POSTãä»ããŠãµãŒããŒã«ããŒã¿ãéä¿¡ããŸãã ããã«ãããã·ã¹ãã ã®åã ã®éšåãé çãªãç°¡åã«å€æŽã§ããŸãã ãµãŒããŒã¯ãµãŒãã¬ããã³ã³ããã®äžéšã«ããªãã察å¿ãããµãŒãã¬ãããäœæããŸãã ã¯ã©ã€ã¢ã³ãåŽã¯ããµãŒããŒãšéåæã§éä¿¡ããäœããã®çš®é¡ã®ããããŠã£ãžã§ããïŒãããã¬ã³ããªã³ã°ïŒã§ããå¿ èŠããããŸãã åºæ¬çãªæ¹æ³ãããã€ããããŸãïŒè©³çŽ°ã«ã€ããŠã¯ãèšäº[1]ããã³ã¬ãã¥ãŒ[2]ãåç §ïŒã
- åœæã ã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«æ¥ç¶ãããµãŒããŒã¯æ¥ç¶ãåæããŸããããæ¥ç¶ãéãããŸãŸã«ããŸããããã«ãããæ°ããããŒã¿ãããã«ã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããŸãïŒããã·ã¥ïŒã ãªãã·ã§ã³ãšããŠã WebSocketãã¯ãããžãŒã䜿çšããŸãã
- é »ç¹ãªæ祚ã ç¹å®ã®é »åºŠã§ã¯ã©ã€ã¢ã³ãããµãŒããŒãããŒãªã³ã°ããŠæ°ããããŒã¿ãæ¢ããŸãã
- ãé·æãããŒãªã³ã°ïŒé·æããŒãªã³ã°ïŒã åã®2ã€ã®æ¹æ³ã®éã®äœãã ã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒã«æ°ããããŒã¿ãèŠæ±ãããã®ããŒã¿ããŸã ãµãŒããŒã«ãªãå ŽåããµãŒããŒã¯æ¥ç¶ãéããŸããã ããŒã¿ãå°çãããšãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããã¯ã©ã€ã¢ã³ãã¯åã³æ°ããããŒã¿ã®èŠæ±ãéä¿¡ããŸãã
WebSocketã¯ãã¹ãŠã®ãã©ãŠã¶ã§ãµããŒããããŠããããã§ã¯ãªã ãé »ç¹ã«ããŒãªã³ã°ãè¡ããšããµãŒããŒãªãœãŒã¹ãå©çšããªãããã©ãã£ãã¯ãç¡é§ã«ããã ããªã®ã§ãéžæã¯é·ãããŒãªã³ã°ã«äŸåããŸãã ããã«ãJetty WebãµãŒããŒïŒããŒãã¿ã€ã ãµãŒãã¬ããã³ã³ããïŒã䜿çšãããšã ç¶ç¶æè¡ã䜿çšããŠé·ãããŒãªã³ã°ãªã¯ãšã¹ããåŠçã§ããŸãïŒ [1]ãåç §ïŒã ããããããã§ãªã¢ã«ã¿ã€ã ãæããŠãã ããã é£è¡æ©çšã®çµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ãªãããã¡ããšãããã¬ãŒã³ããŒã·ã§ã³ããããäœæããŠããã®ã§ããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãšãªãã¶ãŒããŒãããäžã®ãã€ã³ãã®1ã2ç§è¡šç€ºã®é 延ã¯ããã»ã©éèŠã§ã¯ãããŸãããã
ããããšã³ãžã³ã®äžã§ã Leafletã¯ãæãå¿«é©ãªå€èŠ³ãšã·ã³ãã«ã§äœ¿ããããAPIã®1ã€ãšããŠéžã°ããŸããã ãŸããLeafletã®åªãããã©ãŠã¶ãµããŒãã«ã泚æããŠãã ããã
ãããå§ããŸããããå ¥å Žã®åé¡ã解決ããŸãã
ãã°ããããŒã¿ãååŸãã
å®æçãªã¢ãŒã«ã€ãäœæãèæ ®ããŠããã°ã®æŽæ°ãç£èŠããæ¹æ³ã¯ïŒ ããšãã°ãããç¥ãããŠããApache Commonsã©ã€ãã©ãªã®
Tailer
ã¯ã©ã¹ã䜿çšã§ããŸãããéšåçã«ã¯åãæ¹æ³ã§ç¬èªã®æ¹æ³ã§é²ããŸãã
TailReader
ã¯ã©ã¹
TailReader
ããã°ã眮ãããŠãããã£ã¬ã¯ããªããã°ãã¡ã€ã«ã®ååãèšè¿°ããéåžžã®
TailReader
ïŒå€æŽã§ããããïŒãããã³æŽæ°æéïŒãã°å ã®æ°ãããšã³ããªãå®æçã«ãã§ãã¯ããæéïŒã«ãã£ãŠåæåãããŸãã ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã¯æšæºã®å ¥å/åºåã¹ããªãŒã ã§ã®åäœã«äŒŒãŠããŸããããã°ã«æ°ãããšã³ããªã衚瀺ãããªãå Žåã
nextRecord()
åŒã³åºããããšãã«å®è¡ããã»ã¹ããããã¯ããŸãã ïŒããã¯ããã«ïŒæ°ãããšã³ããªã確èªããã«ã¯ã
hasNext()
ã¡ãœããã䜿çšã§ããŸãã ãã°ã¯åå¥ã®ã¹ã¬ããïŒI / Oãã¹ã¬ãããšæ··åããªãããã«ïŒã§ç£èŠãããããããããŒãå¶åŸ¡ããããã®
start()
ããã³
stop()
ã¡ãœããããããŸãã ãã¡ã€ã«ã¹ããªãŒã ãéããããå ŽåïŒãã°ãã¢ãŒã«ã€ãçšã«éä¿¡ãããå ŽåïŒãæå®ãããåæ°ã®èªã¿åããè©Šè¡ããåŸãã¯ã©ã¹ãªããžã§ã¯ãã¯æ°ãããã°ãéãæéã§ãããšå€æããŸãã ãã°ã¯
getLogFile()
æå®ãããã«ãŒã«ã«åŸã£ãŠæ€çŽ¢ãããŸãã
/** * - * @return - null */ private File getLogFile() { File logCatalog = new File(logFileCatalog); File[] files = logCatalog.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.canRead() && pathname.isFile() && pathname.getName().matches(logFileNamePattern); } }); if (0 == files.length) return null; if (files.length > 1) Arrays.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { return (int) (o1.lastModified() - o2.lastModified()); } }); return files[files.length - 1]; }
ãã°ã®æŽæ°ãç£èŠããããšãåŠãã åŸããããã®æŽæ°ã§äœããããå¿ èŠããããŸãã ãŸãããã®ã€ãã³ãã®ã¿ã€ããå€å¥ããå¿ èŠããããŸãããããã«è¡šç€ºããå¿ èŠãããå Žåã¯ãã¯ã©ã€ã¢ã³ãIPãåŒãåºããŠãå°ç座æšã«è§£æ±ºããŸãã
ã
RecordParser
ã
RecordParser
ã¯ã©ã¹ã¯æ£èŠè¡šçŸã䜿çšããŠãã°ãã¡ã€ã«ã®è¡ãåæããŸãã
LogEvent parse(String record)
ã¡ãœããã¯ãã€ãã³ãã¿ã€ããšIPã¢ãã¬ã¹ãã«ãã»ã«åããåçŽãªãªããžã§ã¯ããè¿ããŸãããã®ãã°ãšã³ããªãé¢å¿ãæããªãå Žåã¯
null
è¿ããŸãïŒããã¯ãJavaéçºã®äžçã§ã®ãã¹ããã©ã¯ãã£ã¹ãšã¯ã»ã©é ã-Nullãã¿ãŒã³ã䜿çšããæ¹ãè¯ããªããžã§ã¯ã ïŒã åæã«ãæ€çŽ¢ããããããã®ãªã¯ãšã¹ããããã¬ã³ãŒãããã£ã«ã¿ãŒãããŸãïŒå®éã«ã¯ã¹ãã¢ãŠãŒã¶ãŒã§ã¯ãããŸããããïŒïŒã
æåŸã«ã
IpToLocationConverter
ã¯ã©ã¹
IpToLocationConverter
ã MaxmindãµãŒãã¹ïŒ Java APIã®å Žå ïŒããã³IpGeoBase ïŒ XML APIãä»ããŠã¢ã¯ã»ã¹ããããã®ããžãã¯ã¯ããã±ãŒãž
com.ecwid.geowid.daemon.resolvers
ã«ãã»ã«åãããŸãïŒã䜿çšããŠãIPã¢ãã¬ã¹ã察å¿ããå°ç座æšã«
IpToLocationConverter
ãŸãïŒ Maxmindã¯ãã·ã¢ã®äœæãããªããç²æ«ã«è§£æ±ºãããããããã«IpGeoBase'omã䜿çšããŸãã Maxmind APIã¯ç°¡åã§ã解決ã¯ããŒã«ã«ã«ããããŒã¿ããŒã¹ãã¡ã€ã«ãä»ããŠè¡ãããŸãã ãªãŸã«ããŒã¯IpGeoBaseçšã«äœæãããæãããªçç±ã§ãµãŒãã¹åŒã³åºãããã£ãã·ã¥ããŸãã
ãµãŒããŒãããŒãããªãããã«ã1ã€ã®ããã¯ã®ã¬ã³ãŒããæéçã«ãããã«ç°ãªãããšããªãããã«ãããŒã¿ãããã€ãã®ããŒã¹ã®ããã¯ã§éä¿¡ããŸãã ãããè¡ãããã«ããããäžã®èŠèŠåã®ããã«èç©ããããã€ã³ããªããžã§ã¯ãïŒ
Point
ã¯ã©ã¹ïŒã¯ãããã¡ãŒã«ä¿åãããŸã
PointsBuffer
ã¯ã©ã¹ã®ãªããžã§ã¯ãã§ãJSON圢åŒã§ãµãŒããŒã«å ¥åããããšãç Žæ£ããããŸãïŒ Gsonã䜿çšããŠãªããžã§ã¯ããã·ãªã¢ã«åããŸãïŒã
æªéã®ããžãã¯ã¯ãã¹ãŠ
GeowidDaemon
ã¯ã©ã¹ã«ãããŸãã ããŒã¢ã³ã®èšå®ã¯XMLã§ä¿åãããŸãïŒç§ã®åŽã§ã¯äžåã§ãproperies-filesãYAMLã䜿çšã§ããŸããã XMLããObjectãžã®ãããã³ã°ãè©ŠããŠã¿ããã£ãã®ã§ãïŒã ã«æ³šæããŠãã ãã
<events> <event> <type>def</type> <pattern>\b((?:\d{1,3}\.){3}\d{1,3})\b\s+script\.js</pattern> </event> <event> <type>mob</type> <pattern>\b((?:\d{1,3}\.){3}\d{1,3})\b\s+mobile:</pattern> </event> <event> <type>api</type> <pattern>\b((?:\d{1,3}\.){3}\d{1,3})\b\s+api:</pattern> </event> </events>
ã€ãã³ãã®çš®é¡ïŒdef-ãéåžžã®ãã«ã¹ã¿ãããŒãéããmob-ã¢ãã€ã«ã«ã¹ã¿ãããŒãéãã
api
-APIãµãŒãã¹ãåŒã³åºã ã¿ã€ãã¯ãIPãã°ã«ãŒãã«å²ãåœãŠãããŠããç¹å®ã®ã¬ã®ã¥ã©ãŒã«å¯Ÿå¿ãããµãã¹ããªã³ã°ã®ãã°ãšã³ããªå ã®å Žæã«ãã£ãŠæ±ºå®ãããŸãã
ãããã¯ãŒã¯ã®åºå€§ãã§ããŒã¢ã³ãèµ·åãããã°ãããã¹ã¯ãªãããèŠã€ãããŸããã
ã客æ§ãšããŒã¿ãå ±æããŸã
ãããJetty APIã®èªæ ¢ã®ç¶ç¶ã«ã€ããŠã¯ã©ãã§ãããïŒç¬¬7ããŒãžã§ã³ã®ãµãŒããŒã䜿çšããããšã«åæããŸãïŒã ããã¯ãã³ãŒãäŸãå«ãããã¥ã¡ã³ã[3]ã«éåžžã«ããæžãããŠããŸãã ãããã䜿çšããŸãã
GeowidServlet
ãµãŒãã¬ãã
GeowidServlet
æå°éã®ãã®ã§ããããŒã¢ã³ããããŒã¿ãåä¿¡ããã¯ã©ã€ã¢ã³ãã«æäŸã§ããŸãã 次ã®ã³ãŒãã¯ããã®ç¹ã§æãèå³æ·±ããã®ã§ãã
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { synchronized (continuations) { for (Continuation continuation : continuations.values()) { continuation.setAttribute(resultAttribute, req.getParameter(requestKey)); try { continuation.resume(); } catch (IllegalStateException e) { // ok } } continuations.clear(); resp.setStatus(HttpServletResponse.SC_OK); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String reqId = req.getParameter(idParameterName); if (null == reqId) { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Request ID needed"); logger.info("Request without ID rejected [{}]", req.getRequestURI()); return; } Object result = req.getAttribute(resultAttribute); if (null == result) { Continuation continuation = ContinuationSupport.getContinuation(req); synchronized (continuations) { if (!continuations.containsKey(reqId)) { continuation.setTimeout(timeOut); try { continuation.suspend(); continuations.put(reqId, continuation); } catch (IllegalStateException e) { logger.warn("Continuation with reqID={} can't be suspended", reqId); resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } else if (continuation.isExpired()) { synchronized (continuations) { continuations.remove(reqId); } resp.setContentType(contentType); resp.getWriter().println(emptyResult); } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Request ID conflict"); } } } else { resp.setContentType(contentType); resp.getWriter().println((String) result); } }
ããã§äœãèµ·ãã£ãŠããŸããïŒ
ã¯ã©ã€ã¢ã³ããæ°ããããŒã¿ãååŸãããšããGETãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãŒã«äžæã®èå¥åãååšãããã©ããã確èªããŸãïŒå®éã«ã¯ãç䌌äžæã§ããã¯ã©ã€ã¢ã³ãéšåã®å®è£ ã
getPseudoGUID()
é¢æ°ãåç § ïŒ
getPseudoGUID()
ããªãå Žåãã¯ã©ã€ã¢ã³ãããéä¿¡ãããŸãã ããã¯ãç¹å®ã®ã¯ã©ã€ã¢ã³ãã«é¢é£ä»ããããç¶ç¶ãæ£ããèå¥ããããã«å¿ èŠã§ãã 次ã«ãå¿ èŠãªããŒã¿ãå«ãå±æ§ããã®ãªã¯ãšã¹ãã«èšå®ãããŠãããã©ããã確èªããŸãã åœç¶ãã¯ã©ã€ã¢ã³ããç§ãã¡ã«åããŠæ¥ãå ŽåãããŒã¿ã«ã€ããŠè©±ãããšã¯ã§ããŸããã ãããã£ãŠãæå®ãããã¿ã€ã ã¢ãŠãã§ç¶ç¶ãäœæããäžæåæ¢ããŠãä¿åçšã®ããã·ã¥ããŒãã«ã«å ¥ããŸãã ãã ããç¶ç¶ã¿ã€ã ã¢ãŠããæéåãã«ãªã£ãããããŒã¿ããªãã£ãå ŽåããããŸãã ãã®å Žåã
if (continuation.isExpired())
æ¡ä»¶ããã§ãã¯ãããšãæž¡ããšãã«ãµãŒãã¬ãããã¯ã©ã€ã¢ã³ãã«JSONã®ç©ºã®é åãäžããæå®ãããã¯ã©ã€ã¢ã³ãã«å¯Ÿå¿ããç¶ç¶ãäžå¿ èŠã«ããŒãã«ããåé€ããŸãã
ããŒã¿å±æ§ãèšå®ãããŠããå Žåããã®ããŒã¿ãã¯ã©ã€ã¢ã³ãã«è¿ãã ãã§ãã ãã®ããŒã¿ã¯ã©ãããæ¥ãã®ã§ããïŒ ãã¡ãããPOSTèŠæ±ãã³ãã©ãŒã§ã ããŒã¢ã³ãããŒã¿ãéä¿¡ãããšããã«ããµãŒãã¬ããã¯ãäžæãç¶ç¶ããŒãã«ãå®è¡ããåå±æ§ã«ããŒã¿ãèšå®ããåå±æ§ãåéïŒåéïŒããŠãããããŒãã«ãã¯ãªã¢ããŸãã ãã®æç¹ã§ã
doGet()
ã¡ãœãããåç¶ç¶ã«å¯ŸããŠåå ¥åãããŸããããŠãŒã¶ãŒã¯å¿ èŠãªããŒã¿ã䜿çšããŸãã
ããšãã°ãè² è·ã®ããã£ããããã¡ã€ã©ãŒã䜿çšããŠããããã®éåžžã«ç¶ç¶çãªäžæè°ãªåã枬å®ã§ããŸãã ãã®ããã«ãèè ã¯VisualVMãšSiegeã䜿çšããŸããã èè ããã¯ããã¹ã¿ãŒã¯å¹³å¡ãªã®ã§ããã¹ãã¯éåžžã«äººå·¥çãªãã®ã«èŠããŸããã JVMã¯çŽ1æéããŠã©ãŒã ã¢ããããã15MBã®ããŒãã¹ããŒã¹ã«èœã¡çããŸããã ãã®åŸãSiegeã䜿çšããŠããµãŒããŒã«æ¯ç§3000ãªã¯ãšã¹ãã䞊è¡ããŠããŒãããŸãïŒéããŠãããã¡ã€ã«ãªã©ã®å¶éãåŒãäžããããã«ã·ã¹ãã å ã移åããããããŸããã§ããïŒã JVMã¯çŽ250Mbã®ããŒãã¹ããŒã¹ãæ¶è²»ããããã»ããµã³ã¢ã«çŽ10ã15ïŒ ã®è² è·ããããŸããã åå¿è ã«ã¯è¯ãçµæã ãšæããŸãã
å¯èŠåãµãŒ
ããã«äºçŽããŸãããããããJavaScriptã³ãŒãã¯ãããã®ããã³ããšã³ãéçºè ã®èŠ³ç¹ããã¯ãéæšæºçãã«èŠããã§ãããã ç§ã®ã³ãŒããç解ãã人ãå€æããã«ã¯:)
ããã§ããªãŒãã¬ããã䜿çšããŸãã å°å³äžã«ãã€ã³ããã©ã®ããã«è¡šç€ºããŸããïŒ æšæºããŒã«ãŒã¯äžé©åã«èŠããŸãã pngãŸãã¯ãW3CãgifãçŠæ¢ãããšããã€ã³ãã®ã¢ãã¡ãŒã·ã§ã³ã§çŽ æŽãããç»åãå®çŸã§ããŸããã 2ã€ã®æ¹æ³ããããŸãã
- SVGã«ããã¢ãã¡ãŒã·ã§ã³ã ãã®ããŒãã«é¢ããåªããèšäºãæè¿ããã«æ²èŒãããŸãã é·æïŒLeafletã«ã¯ãåªããRaphaëlã©ã€ãã©ãªã䜿çšããåªãããã©ã°ã€ã³ããã ïŒããŒãžäžéšã®ãã¢ã«æ³šæããŠãã ããïŒããã®ã©ã€ãã©ãªã«ããIE6ïŒããæ£ç¢ºã«ã¯VML ïŒã§ãSVGãæç»ã§ããŸãã çæïŒSVGã®è©³çŽ°ã®ããããã®äžã§ã®ã¢ãã¡ãŒã·ã§ã³ã¯éåžžã«ãªãœãŒã¹éçŽåã®æäœã§ãïŒãã©ãŠã¶ãŒã®ä»£ããã«èªåèªèº«ãæ³åããŠãã ããïŒã»ãšãã©ã®å ŽåãXMLã解æãããã®å€æŽã«åŸã£ãŠã°ã©ãã£ãã¯ãã¬ã³ããªã³ã°ããå¿ èŠããããŸãïŒã
- HTML5ã®
. , , , ( www.html5canvastutorials.com KineticJS). : , . : .