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
EASTER
and EASTER_MONDAY
entries in Holidays_me.xml
configuration file were missing descriptionPropertiesKey
property.
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
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
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.
The 'Spring Bank Holiday' e.g. on the 02.06.2022 is provided in jollyday as 'Bank Holiday'
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.
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
<!-- 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.
The order of boxing day and Christmas is wrong for 2022.
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.
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.
JaxbConfigurationService
is implementing ConfigurationDataSource
. I think the idea was to use the ConfigurationService
instead.
see title
as you can see here https://en.wikipedia.org/wiki/Public_holidays_in_Luxembourg - christmas eve is not a public holiday in luxemburg.
We should check and fix if whit Sunday is or is not a public holiday in Swiss
Good friday should be julian.
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:
We only want to use assertj as assertion library.
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>
Friday 7th April: Good Friday
See https://www.gov.mt/en/About%20Malta/Pages/Public%20Holidays.aspx
Since 2023 international womens day is a holiday in Mecklenburg-Vorpommern
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
AE_COMMEORATION_DAY should be fixed to AE_COMMEMORATION_DAY
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.
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")
}
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
https://en.wikipedia.org/wiki/Public_holidays_in_Romania - Good Friday is also a non-working day in Romania
see https://en.wikipedia.org/wiki/Public_holidays_in_Malta
Easter is not a official public holiday in Malta.
EASTER
and EASTER_MONDAY
entries in Holidays_md.xml
configuration file were missing descriptionPropertiesKey
property.
We start with the modules
St. Andrews day in Scotland is not on the 11.11. it is on the 30.11.
The 'Summer Bank Holiday' e.g. on the 29.08.2022 is provided in jollyday as 'Bank Holiday'
We need a new gav.
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 want to check if the spanish public holidays are up to date.
The description key should be more explicit
Easter should not be a public holiday in the UK.
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
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):
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
We will change a lot at the actual code, like the gav and package names etc. So we will also remove all deprecated code.
At the moment Easter Sunday is no public holiday in Hessen but should be.
EASTER
and EASTER_MONDAY
entries in Holidays_mk.xml
configuration file were missing descriptionPropertiesKey
property.
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.