focus-shift / jollyday Goto Github PK
View Code? Open in Web Editor NEWJollyday - A worldwide public holidays library
License: Apache License 2.0
Jollyday - A worldwide public holidays library
License: Apache License 2.0
St. Andrews day in Scotland is not on the 11.11. it is on the 30.11.
https://en.wikipedia.org/wiki/Public_holidays_in_Romania - Good Friday is also a non-working day in Romania
The 'Spring Bank Holiday' e.g. on the 02.06.2022 is provided in jollyday as 'Bank Holiday'
With the new version of jollyday the parsers are stored in a cache with their holidays. So new holidays will not be processed. Of course this is not the way we want it. So I disabled the parser cache atm.
We need to find a good solution and also readd the tests for the parsers.
At the moment Easter Sunday is no public holiday in Hessen but should be.
as you can see here https://en.wikipedia.org/wiki/Public_holidays_in_Luxembourg - christmas eve is not a public holiday in luxemburg.
At the moment java.util.logging.*
is used for logging. We want to provide a facade with slf4j to abstract the implementation from the api. Therefore we will add slf4j and logback as implementation for logging on tests.
Added new NZ public holiday - Matariki
At the moment Pentecost and whit Sunday are "the same" in different holiday files like in Germany. We should split these up and correct the files.
Describe the bug
The Holidays for Denmark are wrong: https://github.com/focus-shift/jollyday/blob/6d5b20dd13c32fae484f5251606baea3afc9b1a9/jollyday-core/src/main/resources/holidays/Holidays_dk.xml in version 0.12.0.
Christmas is described as December 25, but it is actually December 24. December 25 is Christmas Day, and December 26 is 2. Christmas day.
Also of note is that Great Prayer Day has been removed effective 2024: https://en.wikipedia.org/wiki/Store_Bededag
Please see:
https://www.visitaarhus.dk/aarhusregionen/planlaeg-din-tur/helligdage-i-danmark-gdk1101954
https://da.wikipedia.org/wiki/Danske_helligdage
To Reproduce
Steps to reproduce the behavior:
HolidayManager holidayManager = HolidayManager.getInstance(ManagerParameters.create(HolidayCalendar.DENMARK));
holidayManager.getHolidays(2023, "dk");
Expected behavior
The holidays should be correct
There have been some changes in the latest release that include org.glassfish.jaxb:jaxb-runtime; the dependencies of the jollyday jaxb version however include com.sun.xml.bind which breaks the gradle build with
Entry BOOT-INF/lib/jaxb-core-4.0.1.jar is a duplicate but no duplicate handling strategy has been set. Please refer to https://docs.gradle.org/7.6/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy for details.
Fixed it with the following gradle dependency:
implementation("de.focus-shift:jollyday-jaxb:0.11.0") {
exclude("com.sun.xml.bind", "jaxb-impl")
}
We should check and fix if whit Sunday is or is not a public holiday in Swiss
Easter should not be a public holiday in the UK.
AE_COMMEORATION_DAY should be fixed to AE_COMMEMORATION_DAY
The order of boxing day and Christmas is wrong for 2022.
It is at the moment very hard to test that a public holiday is properly configured in the xml files, because we need to test "every year". With PBT we can write tests that will test with a subset of years that a public holiday is correctly configured over the years.
We want to take a look at jqwik
The 'Summer Bank Holiday' e.g. on the 29.08.2022 is provided in jollyday as 'Bank Holiday'
We will change a lot at the actual code, like the gav and package names etc. So we will also remove all deprecated code.
Friday 7th April: Good Friday
See https://www.gov.mt/en/About%20Malta/Pages/Public%20Holidays.aspx
EASTER
and EASTER_MONDAY
entries in Holidays_me.xml
configuration file were missing descriptionPropertiesKey
property.
Describe the bug
When compiling the release 0.7.1 with Java 17, the test run causes an exception:
19:40:52,428 |-INFO in ch.qos.logback.core.ConsoleAppender[console] - Enabling JANSI WindowsAnsiOutputStream for the console.
19:40:52,429 |-WARN in ch.qos.logback.core.ConsoleAppender[console] - Failed to create WindowsAnsiOutputStream. Falling back on the default stream. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.fusesource.jansi.WindowsAnsiOutputStream
at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.fusesource.jansi.WindowsAnsiOutputStream
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:68)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:39)
at at ch.qos.logback.core.ConsoleAppender.getTargetStreamForWindows(ConsoleAppender.java:88)
at at ch.qos.logback.core.ConsoleAppender.start(ConsoleAppender.java:79)
at at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
at at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
at at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:64)
at at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:134)
at at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
at at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388)
at at de.focus_shift.configuration.ConfigurationProviderManager.<clinit>(ConfigurationProviderManager.java:19)
at at de.focus_shift.configuration.ConfigurationProviderManagerTest.<init>(ConfigurationProviderManagerTest.java:24)
at at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at at org.junit.platform.commons.util.ReflectionUtils.newInstance(ReflectionUtils.java:550)
at at org.junit.jupiter.engine.execution.ConstructorInvocation.proceed(ConstructorInvocation.java:56)
at at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at at org.junit.jupiter.api.extension.InvocationInterceptor.interceptTestClassConstructor(InvocationInterceptor.java:73)
at at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:77)
at at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestClassConstructor(ClassBasedTestDescriptor.java:355)
at at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateTestClass(ClassBasedTestDescriptor.java:302)
at at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateTestClass(ClassTestDescriptor.java:79)
at at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:280)
at at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:272)
at at java.base/java.util.Optional.orElseGet(Optional.java:364)
at at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:271)
at at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31)
at at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:102)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:101)
at at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:66)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90)
at at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
at at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
at at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
at at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
at at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
at at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
at at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
at at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
at at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
at at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
at at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
at at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
at at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:150)
at at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:124)
at at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
at at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
at at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
at at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
Caused by: java.lang.ClassNotFoundException: org.fusesource.jansi.WindowsAnsiOutputStream
at at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:55)
at ... 89 common frames omitted
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Class should not be missing and test run should succeed without errors
Desktop (please complete the following information):
Additional context
Maybe a dependency is missing, e.g.
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>2.4.0</version>
</dependency>
The description key should be more explicit
EASTER
and EASTER_MONDAY
entries in Holidays_mk.xml
configuration file were missing descriptionPropertiesKey
property.
We start with the modules
EASTER
and EASTER_MONDAY
entries in Holidays_md.xml
configuration file were missing descriptionPropertiesKey
property.
see https://en.wikipedia.org/wiki/Public_holidays_in_Malta
Easter is not a official public holiday in Malta.
At the moment we provide jaxb as parsing library to read the holidays from the XML files. We also want to provide Jackson as library to parse the XML files and hydrate them into the java object.
We focus on the Jackson version that will be used with spring boot 3.2.x. So that there are no conflicts with the dependency
Affected country
Affected public holiday
Source of the information
https://www.gov.uk/government/news/bank-holiday-announced-for-her-majesty-queen-elizabeth-iis-state-funeral-on-monday-19-september
More Information
Added Queen's state funeral following pattern for adding Queen's Platinum Jubilee
Since 2023 international womens day is a holiday in Mecklenburg-Vorpommern
see title
We want to check if the Portuguese public holidays are up to date.
The Portuguese public holidays has a very special case, every city has their own public holiday, "city day", and these are not completely configured.
Names of the holidays on December 25 and 26 are incorrect. I would argue that the English Wikipedia also has the incorrect names. In Danish they are litterally called first and second christmas day (perhaps with the first it is often just called christmas day). I can see that there is a first and second Christmas day name
refs #191
Good friday should be julian.
We only want to use assertj as assertion library.
We will base the dependencies on spring boot 3.x, so that we should be almost in sync with it.
Improve the readme so everyone could use or contrribute to jollyday.
We want to check if the spanish public holidays are up to date.
<!-- JAXB -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
is has at the moment the scope "provided" this means that the application that uses jollyday needs to at this dependency. This should be replaced by "compile", so that this dependency is provided by jollyday.
Describe the bug
When compiling with Java 17 I get errors due to encoding issues, e.g.:
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ jollyday-jaxb ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 44 source files to E:\EBS\jollyday-0.7.1\jollyday-jaxb\target\classes
[ERROR] /E:/EBS/jollyday-0.7.1/jollyday-jaxb/target/generated-sources/jaxb/de/focus_shift/jaxb/mapping/HolidayType.java:[4,4] unmappable character (0xC4) for encoding UTF-8
[ERROR] /E:/EBS/jollyday-0.7.1/jollyday-jaxb/target/generated-sources/jaxb/de/focus_shift/jaxb/mapping/HolidayType.java:[16,20] unmappable character (0xFC) for encoding UTF-8
The problems are the used Umlauts within the Java files.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Compile shouldn't fail.
Screenshots
If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
Additional context
Similar problems occur when generating the javadocs. The Umlauts also causes errors.
Maybe converting everything to UTF-8 would be a good solution for the future or omit special characters.
We need a new gav.
JaxbConfigurationService
is implementing ConfigurationDataSource
. I think the idea was to use the ConfigurationService
instead.
Dear Jollyday development team,
when running the following test in JUnit 5
import de.focus_shift.Holiday;
import de.focus_shift.HolidayManager;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Set;
@ExtendWith(MockitoExtension.class)
public class JollydayTests
{
@Test
void printHollydaysForOneYearGermany()
{
final HolidayManager holidayManager = HolidayManager.getInstance();
}
}
I run into the following error:
java.lang.IllegalStateException: Cannot instantiate datasource instance of de.focus_shift.jaxb.JaxbConfigurationService.
What is the reason for this error and how can this error be fixed? In my pom.xml I have imported jollyday-core (0.14.0) and jollyday-jaxb (0.14.0):
<dependency>
<groupId>de.focus-shift</groupId>
<artifactId>jollyday-core</artifactId>
<version>0.14.0</version>
</dependency>
<dependency>
<groupId>de.focus-shift</groupId>
<artifactId>jollyday-jaxb</artifactId>
<version>0.14.0</version>
</dependency>
My Java version is 19.0.2 and my Maven version is 3.9.0
Germans 'Day of Repentance and Prayer' is not correct before 1995 see https://de.wikipedia.org/wiki/Bu%C3%9F-_und_Bettag
More information also via https://github.com/nager/Nager.Date/blob/master/src/Nager.Date/PublicHolidays/GermanyProvider.cs#L111
Is it possible to get Java 8 compatibility for this module? It would be useful to have a dropin replacement for the old Jollyday, which doesn't support Java 17 but does support Java 8.
Stanford CoreNLP uses Jollyday to detect holidays, but it apparently does not support Java 17:
and some of our users are running into that issue:
Describe the bug
Looks like jollyday ignores the federals in germany.
To Reproduce
Using the following example code:
package org.example;
import de.focus_shift.Holiday;
import de.focus_shift.HolidayManager;
import java.time.LocalDate;
import java.util.Set;
public class Main
{
public static void main(String[] args)
{
HolidayManager holidayManager = HolidayManager.getInstance();
Set<Holiday> days = holidayManager.getHolidays(
LocalDate.of(2023,1,1),
LocalDate.of(2023,12,30),
"de", "bw"
);
System.out.println("\n" + days.size() + " of 12 days found:");
for( Holiday tag: days )
{
System.out.println( tag.toString() );
}
// Fixed: 6th of january
System.out.println( "Heilige drei Könige: " +
holidayManager.isHoliday(LocalDate.of(2023, 1, 6), "de", "bw") );
// Moving: 60 days after Christ's resurrection day
System.out.println( "Fronleichnam: " +
holidayManager.isHoliday(LocalDate.of(2023, 6, 8), "de", "bw") );
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test_jollyday</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>de.focus-shift</groupId>
<artifactId>jollyday-jaxb</artifactId>
<version>0.16.0</version>
</dependency>
</dependencies>
</project>
yields:
9 of 12 days found:
2023-05-01 (Tag der Arbeit)
2023-04-10 (Ostermontag)
2023-04-07 (Karfreitag)
2023-01-01 (Neujahr)
2023-05-18 (Christi Himmelfahrt)
2023-05-29 (Pfingstmontag)
2023-10-03 (Tag der Deutschen Einheit)
2023-12-25 (1. Weihnachtsfeiertag)
2023-12-26 (2. Weihnachtsfeiertag)
Heilige drei Könige: false
Fronleichnam: false
while these days are defined in the xml (Holidays_de.xml:52):
<tns:SubConfigurations hierarchy="bw" description="Baden-Württemberg">
<tns:Holidays>
<tns:Fixed month="JANUARY" day="6" descriptionPropertiesKey="EPIPHANY"/>
<tns:Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
<tns:RelativeToFixed validFrom="1945" validTo="1989" descriptionPropertiesKey="REPENTANCE_PRAYER">
<tns:Weekday>WEDNESDAY</tns:Weekday>
<tns:When>BEFORE</tns:When>
<tns:Date month="NOVEMBER" day="23"/>
</tns:RelativeToFixed>
<tns:ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
</tns:Holidays>
</tns:SubConfigurations>
Desktop (please complete the following information):
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.