Code Monkey home page Code Monkey logo

headsinventory's People

Contributors

cc007 avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

mah1987

headsinventory's Issues

As HI I want to be able to search for UUIDs

In custom categories you can specify a specific head's uuid by prefixing the search term with uuid:. It would be nice to also support this when using /headsinv search uuid:<headOwner> or alternatively /headsinv uuid <headOwner>

catch errors from remote API

Is it possible, when the connection failure intercept and give a feedback to users, that this searchpage has an error?

[20:40:01] [Server thread/INFO]: ADMIN issued server command: /headsinv search worms
[20:40:01] [Thread-76/INFO]: [com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl] Updating heads for: worms
[20:40:01] [Thread-76/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Got response with status code: 502 (Bad Gateway)
[20:40:01] [Thread-76/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] For request: https://freshcoal.com/api.php?query=worms
[20:40:01] [Thread-76/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Request headers:
[20:40:01] [Thread-76/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Response headers:
 - connection: keep-alive
 - content-length: 181
 - content-type: text/html
 - date: Mon, 20 Jul 2020 18:42:58 GMT
 - server: nginx/1.4.6 (Ubuntu)
[20:40:01] [Thread-76/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Body:
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>

[20:40:01] [Thread-76/WARN]: Exception in thread "Thread-76" feign.FeignException$BadGateway: [502 Bad Gateway] during [GET] to [https://freshcoal.com/api.php?query=worms] [FreshCoalClient#find(String)]: []
[20:40:01] [Thread-76/WARN]: 	at feign.FeignException.serverErrorStatus(FeignException.java:235)
[20:40:01] [Thread-76/WARN]: 	at feign.FeignException.errorStatus(FeignException.java:180)
[20:40:01] [Thread-76/WARN]: 	at feign.FeignException.errorStatus(FeignException.java:169)
[20:40:01] [Thread-76/WARN]: 	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder.decode(StatusCodeHandlingErrorDecoder.java:49)
[20:40:01] [Thread-76/WARN]: 	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:96)
[20:40:01] [Thread-76/WARN]: 	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
[20:40:01] [Thread-76/WARN]: 	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
[20:40:01] [Thread-76/WARN]: 	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100)
[20:40:01] [Thread-76/WARN]: 	at com.sun.proxy.$Proxy154.find(Unknown Source)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.integration.daos.heads.FreshCoalDao.getHeads(FreshCoalDao.java:66)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.lambda$requestHeads$1(HeadSearcherImpl.java:137)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1321)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
[20:40:01] [Thread-76/WARN]: 	at java.util.Iterator.forEachRemaining(Iterator.java:116)
[20:40:01] [Thread-76/WARN]: 	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
[20:40:01] [Thread-76/WARN]: 	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.requestHeads(HeadSearcherImpl.java:135)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.updateSearch(HeadSearcherImpl.java:103)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.getHeads(HeadSearcherImpl.java:70)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl$$FastClassBySpringCGLIB$$2807e26f.invoke(<generated>)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
[20:40:01] [Thread-76/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl$$EnhancerBySpringCGLIB$$9777e985.getHeads(<generated>)
[20:40:01] [Thread-76/WARN]: 	at com.github.cc007.headsinventory.search.HeadsSearch.lambda$search$2(HeadsSearch.java:152)
[20:40:01] [Thread-76/WARN]: 	at java.lang.Thread.run(Thread.java:748)
[20:40:49] [Server thread/INFO]: ADMIN issued server command: /headsinv search worm
[20:40:49] [Thread-77/INFO]: [com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl] Updating heads for: worm
[20:40:49] [Thread-77/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Got response with status code: 502 (Bad Gateway)
[20:40:49] [Thread-77/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] For request: https://freshcoal.com/api.php?query=worm
[20:40:49] [Thread-77/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Request headers:
[20:40:49] [Thread-77/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Response headers:
 - connection: keep-alive
 - content-length: 181
 - content-type: text/html
 - date: Mon, 20 Jul 2020 18:43:46 GMT
 - server: nginx/1.4.6 (Ubuntu)
[20:40:49] [Thread-77/ERROR]: [com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder] Body:
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>

[20:40:49] [Thread-77/WARN]: Exception in thread "Thread-77" feign.FeignException$BadGateway: [502 Bad Gateway] during [GET] to [https://freshcoal.com/api.php?query=worm] [FreshCoalClient#find(String)]: []
[20:40:49] [Thread-77/WARN]: 	at feign.FeignException.serverErrorStatus(FeignException.java:235)
[20:40:49] [Thread-77/WARN]: 	at feign.FeignException.errorStatus(FeignException.java:180)
[20:40:49] [Thread-77/WARN]: 	at feign.FeignException.errorStatus(FeignException.java:169)
[20:40:49] [Thread-77/WARN]: 	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.config.feign.statuscodes.StatusCodeHandlingErrorDecoder.decode(StatusCodeHandlingErrorDecoder.java:49)
[20:40:49] [Thread-77/WARN]: 	at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:96)
[20:40:49] [Thread-77/WARN]: 	at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
[20:40:49] [Thread-77/WARN]: 	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
[20:40:49] [Thread-77/WARN]: 	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100)
[20:40:49] [Thread-77/WARN]: 	at com.sun.proxy.$Proxy154.find(Unknown Source)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.integration.daos.heads.FreshCoalDao.getHeads(FreshCoalDao.java:66)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.lambda$requestHeads$1(HeadSearcherImpl.java:137)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1321)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
[20:40:49] [Thread-77/WARN]: 	at java.util.Iterator.forEachRemaining(Iterator.java:116)
[20:40:49] [Thread-77/WARN]: 	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
[20:40:49] [Thread-77/WARN]: 	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.requestHeads(HeadSearcherImpl.java:135)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.updateSearch(HeadSearcherImpl.java:103)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl.getHeads(HeadSearcherImpl.java:70)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl$$FastClassBySpringCGLIB$$2807e26f.invoke(<generated>)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
[20:40:49] [Thread-77/WARN]: 	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsplugin.business.services.heads.HeadSearcherImpl$$EnhancerBySpringCGLIB$$9777e985.getHeads(<generated>)
[20:40:49] [Thread-77/WARN]: 	at com.github.cc007.headsinventory.search.HeadsSearch.lambda$search$2(HeadsSearch.java:152)
[20:40:49] [Thread-77/WARN]: 	at java.lang.Thread.run(Thread.java:748)

Missing categories

Paper 1.20.4-324
HeadsPluginAPI 3.2.1
HeadsInventory 1.11.1

On server start-up:

[16:12:01] [Craft Scheduler Thread - 8 - HeadsPluginAPI/INFO]: [com.github.cc007.headsplugin.business.services.heads.CategoryUpdaterImpl] Found categories to be updated: [miscellaneous, food-drinks]
[16:12:01] [Craft Scheduler Thread - 8 - HeadsPluginAPI/WARN]: [com.github.cc007.headsplugin.business.services.heads.CategoryUpdaterImpl] No heads found for category miscellaneous. Skipping this category
[16:12:02] [Craft Scheduler Thread - 8 - HeadsPluginAPI/WARN]: [com.github.cc007.headsplugin.business.services.heads.CategoryUpdaterImpl] No heads found for category food-drinks. Skipping this category
[16:12:02] [Craft Scheduler Thread - 8 - HeadsPluginAPI/INFO]: [com.github.cc007.headsplugin.business.services.ProfilerImpl] Done updating necessary categories in 1.515s.

Identify updates in console/log

Spigot 1.18.2 (and previous)
HeadsPluginApi 3.0.2
HeadsInventory 1.11.0

Please identify the following as being generated by HeadsInventory, so they can be found in searches.

[08:00:32] [Craft Scheduler Thread - 3/INFO]: Updating category: mobs
[08:00:37] [Craft Scheduler Thread - 3/INFO]: Updating category: miscellaneous
[08:01:47] [Craft Scheduler Thread - 3/INFO]: Updating category: humanoid
[08:04:41] [Craft Scheduler Thread - 3/INFO]: Updating category: pokemon
[08:04:45] [Craft Scheduler Thread - 3/INFO]: Updating category: color
[08:04:46] [Craft Scheduler Thread - 3/INFO]: Updating category: devices
[08:04:49] [Craft Scheduler Thread - 3/INFO]: Updating category: blocks
[08:05:38] [Craft Scheduler Thread - 3/INFO]: Updating category: food-drinks
[08:06:24] [Craft Scheduler Thread - 3/INFO]: Done updating necessary categories in 353.883s.

Error by search

[Server thread/INFO]: mah1987 issued server command: /headsinv msearch patrick [Server thread/ERROR]: null org.bukkit.command.CommandException: Unhandled exception executing command 'headsinv' in plugin HeadsInventory v1.10.0-rc1 at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[patched_1.15.2.jar:git-Paper-334] at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.15.2.jar:git-Paper-334] at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:761) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.PlayerConnection.handleCommand(PlayerConnection.java:1860) ~[?:git-Paper-334] at net.minecraft.server.v1_15_R1.PlayerConnection.a(PlayerConnection.java:1668) ~[?:git-Paper-334] at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:47) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.PacketPlayInChat.a(PacketPlayInChat.java:5) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.PlayerConnectionUtils.lambda$ensureMainThread$0(PlayerConnectionUtils.java:23) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.TickTask.run(SourceFile:18) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.MinecraftServer.ba(MinecraftServer.java:1097) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.MinecraftServer.executeNext(MinecraftServer.java:1090) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.MinecraftServer.sleepForTick(MinecraftServer.java:1051) ~[patched_1.15.2.jar:git-Paper-334] at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:966) ~[patched_1.15.2.jar:git-Paper-334] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252] Caused by: java.lang.IllegalStateException: zip file closed at java.util.zip.ZipFile.ensureOpen(ZipFile.java:686) ~[?:1.8.0_252] at java.util.zip.ZipFile.getEntry(ZipFile.java:315) ~[?:1.8.0_252] at java.util.jar.JarFile.getEntry(JarFile.java:240) ~[?:1.8.0_252] at java.util.jar.JarFile.getJarEntry(JarFile.java:223) ~[?:1.8.0_252] at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:133) ~[patched_1.15.2.jar:git-Paper-334] at org.bukkit.plugin.java.JavaPluginLoader.getClassByName(JavaPluginLoader.java:216) ~[patched_1.15.2.jar:git-Paper-334] at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:111) ~[patched_1.15.2.jar:git-Paper-334] at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:100) ~[patched_1.15.2.jar:git-Paper-334] at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_252] at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_252] at com.github.cc007.headsplugin.api.HeadsPluginApi.getHeadSearcher(HeadsPluginApi.java:73) ~[?:?] at com.github.cc007.headsinventory.search.HeadsSearch.search(HeadsSearch.java:147) ~[?:?] at com.github.cc007.headsinventory.commands.HeadsInventoryCommand.validateArgsAndSearch(HeadsInventoryCommand.java:237) ~[?:?] at com.github.cc007.headsinventory.commands.HeadsInventoryCommand.onSearchCommand(HeadsInventoryCommand.java:216) ~[?:?] at com.github.cc007.headsinventory.commands.HeadsInventoryCommand.onHeadsInventoryCommand(HeadsInventoryCommand.java:169) ~[?:?] at com.github.cc007.headsinventory.commands.HeadsInventoryCommand.onPlayerCommand(HeadsInventoryCommand.java:84) ~[?:?] at com.github.cc007.headsinventory.commands.HeadsInventoryCommand.onCommand(HeadsInventoryCommand.java:68) ~[?:?] at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[patched_1.15.2.jar:git-Paper-334] ... 17 more
Its also happend by /headsinv search patrick.
Playerheads works fine

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.