rootzoll / konfetti-app Goto Github PK
View Code? Open in Web Editor NEWthe mobile and desktop app for konfetti
Home Page: http://konfettiapp.de
License: GNU General Public License v3.0
the mobile and desktop app for konfetti
Home Page: http://konfettiapp.de
License: GNU General Public License v3.0
Users should have unique nicknames and emails..
we will work with the browser version in the beginning. make sure that email is sent on registering and password recovery is working.
All these type Integers want to be enums -> type safety
remove the "send konfetti" text when you can send konfetti on party so that it is enough room for "admin" or "reviewer" text if so
for testing I am creating a lot of test accounts. make it possible to list and delete accounts in admin GUI to clean up database after testing on production DB.
When app is admin on a party on the more tab there is the option to generate coupons. But the backend fails to send this coupons to the users eMail. On my test the API was giving back a 500 wit the message "Was not able to send eMail with Coupons to [email protected]". locking the logs it said - was not able to connect to the configured email service. Try to get this running.
no change to enter code or something - quick solution: deinstall & reinstall
The PartyController around line 183 was trying to delete old not anymore needed notifications - to clean up space and dont have them shown up on other clients or new install of app. But causes Exception (see below). Deactivated for quick bug fix - but needs attention in the future.
18:49:49.670 ERROR 1 --- [http-nio-9000-exec-7] de.konfetti.controller.PartyController : Was not able to get optional client info on request for party(1): No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:413)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:491)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy99.deleteByUserIdAndPartyIdAndTimeStampLessThan(Unknown Source)
at de.konfetti.service.NotificationServiceImpl.deleteAllNotificationsOlderThan(NotificationServiceImpl.java:71)
at de.konfetti.controller.PartyController.getParty(PartyController.java:183)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:107)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
at com.sun.proxy.$Proxy97.remove(Unknown Source)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$DeleteExecution.doExecute(JpaQueryExecution.java:274)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:102)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:92)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 75 common frames omitted
If i login with email and password.. i dont see neither my email in the settings nor the username.. worse, there is a field to set an email for backup and important announcement, instead of showing my email I logged in with.
On test5 step 15 the admin/clientB sees not the extra text info added by clientA on step 09. Check if this is an error on client side (not publishing or not displaying to admin) or something on the server side is missing.
??? on arabic autotranslation and chat
In order to have proper security handling it might make sense to use Spring's built in security framework. Just not sure if that works with the device id stuff. Should though....
When trying to upload an image (on changing profile image on request or on adding image as extra info to request) there is still a enum error I am not sure why.
Detailed info on request return:
"Bad Request" exception:"org.springframework.http.converter.HttpMessageNotReadableException"
message:"Could not read document: Can not deserialize value of type de.konfetti.data.enums.MediaItemTypeEnum from String "TYPE_IMAGE": value not one of declared Enum instance names: [TYPE_MULTILANG, TYPE_DATE, TYPE_IMAGE, TYPE_UNKOWN, TYPE_LOCATION, TYPE_TEXT]↵ at [Source: java.io.PushbackInputStream@259ad086; line: 1, column: 9] (through reference chain: de.konfetti.data.MediaItem["type"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type de.konfetti.data.enums.MediaItemTypeEnum from String "TYPE_IMAGE": value not one of declared Enum instance names: [TYPE_MULTILANG, TYPE_DATE, TYPE_IMAGE, TYPE_UNKOWN, TYPE_LOCATION, TYPE_TEXT]↵ at [Source: java.io.PushbackInputStream@259ad086; line: 1, column: 9] (through reference chain: de.konfetti.data.MediaItem["type"])"
path:"/konfetti/api/media"
This has higher priority, because its a basic feature of the app needed for first test releases.
When you like a task always just one one konfetti gets added to to the task. If you want to support a task with 100 konfetti it takes 100 clicks ... thats too much.
On WelcomeCamp a lot of community active attendees ask to connect konfetti to social media like twitter and facebook so that actions in konfatti app can be promoted and spread on social media. also think of a login via facebook for browser version.
The rule should be: konfetti should not depend on those third party services but should integrate them for additional features.
I dont know spring boot well, is there a solution to pump the logs from running konfetti java backend into something like graylog to manage logs (warns and exception) in a comfort way?
I started to install graylog on our dev server. https://www.digitalocean.com/community/tutorials/how-to-install-graylog2-and-centralize-logs-on-ubuntu-14-04 --> At the step to test with graylog demo "sudo java -jar /opt/graylog2-server/graylog2-server.jar --debug" shows that still not connecting to elestic search (installed before like in tutorial).
Thats were my progress on this topic ended. But would be great if someone can catch up, get graylog running and configure our konfetti app to pump logs in dev-config-profile into graylog. For dev server access contact me.
Open to other log management solutions - if you make it run, that would be great :)
in my test the app just opened the detail view, but was not focusing the chat section after clicking the notification. this should work for better user directions.
In the Java Backend all Dataservices having to do with persistence are still very simple so that they just work. This would become a performance bottle neck as soon as we grow out of small beta testing.
The task to do would go thru the data services. Search for TODOS in the code and keep eye open how to better get the results. For example in the AccountingService: If it should deliver all transactions for one user, it gets ALL transactions from the database and then filters out the ones of the user with a for-loop. There should be better ways to do this within the Spring/JDBC. To refactor this soon, would be great. Thx.
test on iPhone5
back and now allows just unique username and email - reflect this in the app and give feedback to user about it
in a test run thru the first time when opening the reward dialog and selecting a the clientB, then pressing OK ... it just closed. On console there was this message:
Failed to load resource: the server responded with a status of 500
It worked in second try - check out why again while monitoring request calls on app and server.
On dash board I reworked the app language select dialog. On changing the lang on desktop browser it switches - not on my mobile (Android, GalaxyS7). Check why.
Also the translated arabic shows up with a lot of ???????? - check on that too.
After the changes on the database with having the level of user like Admin or Reviewer persisted differently I got on error, when loading the party as an admin (working when normal user)
was not able to reproduce when i started fresh user and promoted to admin ... maybe this logs are a hint:
2016-11-10 10:15:36.043 WARN 1 --- [http-nio-8280-exec-8] de.konfetti.controller.PartyController : PartyController getAllParties(): TODO: mustHaveParty to add to partylist
2016-11-10 10:15:36.047 INFO 1 --- [http-nio-8280-exec-8] de.konfetti.controller.PartyController : Was not able to get optional client info on request for party list: result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException: result returns more than one elements
2016-11-10 10:15:36.047 INFO 1 --- [http-nio-8280-exec-8] de.konfetti.controller.PartyController : RESULT number of parties is 2
2016-11-10 10:15:40.853 INFO 1 --- [pool-2-thread-1] d.k.notifier.NotifierBackgroundTask : |
Also there seems another Exception on the NotifierBackgroundTask after the changes:
2016-11-10 10:13:05.854 INFO 1 --- [pool-2-thread-1] d.k.notifier.NotifierBackgroundTask : Notification seconds(232131) id(9) party(1) user(null) type(REVIEW_WAITING)
2016-11-10 10:13:05.856 ERROR 1 --- [pool-2-thread-1] d.k.notifier.NotifierBackgroundTask : EXCEPTION on NotifierBackgroundTask loop:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: de.konfetti.data.Party.reviewerUser, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:587)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:204)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:566)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:135)
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)
at java.util.AbstractCollection.addAll(AbstractCollection.java:343)
at de.konfetti.service.UserServiceImpl.getAllUsersReviewerOnParty(UserServiceImpl.java:73)
at de.konfetti.notifier.NotifierBackgroundTask.shouldNotificationGetHigherAttention(NotifierBackgroundTask.java:202)
at de.konfetti.notifier.NotifierBackgroundTask.runNotifierBackgroundTaskThread(NotifierBackgroundTask.java:129)
at de.konfetti.notifier.NotifierBackgroundTask.periodicStartUpTimer(NotifierBackgroundTask.java:101)
at sun.reflect.GeneratedMethodAccessor137.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
2016-11-10 10:13:10.853 INFO 1 --- [pool-2-thread-1] d.k.notifier.NotifierBackgroundTask : |
In the translation of the tasks in the details seem not yet the translated texts attracted .. in the listing goes the translation, but if one clicks a request with the chats, then the title is no longer translated.
Hey. Great to have a greylog running in our setup. Would be great to use it for error logs directly from the app running - so that we can improve the App without depending on user feedback alone.
I started to implement that: I created an input on greylog - see "System > Inputs" called "App Error Reports". Its listening already on port 12185 and I opened up the port on azure.
But I dont get a respose to a POST call with Potman to:
http://fourcores2016.cloudapp.net:12185/gelf
I wanted to follow this tutorial: http://docs.graylog.org/en/2.1/pages/sending_data.html#gelf-via-http
I think its because the port is not routed to the correct docker container - didnt wanted to mess something up, so it would be great if can get this port open and the API call working.
If we get to this point, then it would be great to have a skype to discuss the structure of the error data send by the app, to get the best results out of it. Not a high priority, bit would be great to have this working.
Otherwise non-valid email or worse: from other person can be used
When adding a location to a task, the following needs to be improved:
Also make sure that on small screens the "x" button is not pushed party out of the div like on this screenshot:
When adding a date to the task the following is to improve:
Also the added date could look nicer - breaks a bit the UI on small screens:
on my mobile i tested to enter a code directly after registration as new user on welcome screen.
it accepted the code but then I was at the welcome screen again. It should directly go to the party lit and display the party the code belongs to.
after I said OK, then search in my area it showed the party, but displayed me as "reviewer" (why?) and I just git the standard 100 Konfetti even though it said I I got extra konfetti from the code before. Check why.
the test server seems down. rebuild on docke setup.
saves some code and simplifies development
when the dev config from sample file under docu
is running .. it should gently skip the parts where the more complex config is used (pushnoti, email, etc)
find a way to do this for the admin easy way
When entering a non existing confetti coupon code, a Server Error returns:
{"timestamp":1477994750244,"status":500,"error":"Internal Server Error","exception":"java.lang.NullPointerException","message":"No message available","path":"/konfetti/api/account/redeem/4234234234"}
PartyController (around line 250) the personal distance to a user of a party gets calculated ... somehow, this meter distance gets written back into the object ... or at least the next time the party gets requested ... the party is delivered with a modified meter value. Find out why.
Although the backend has no user interface, it sends out eMails and other text that is visible to the user. Those parts of the backend need i18n translation. I am sure Spring has something to offer here. Would be great if someone could get this started.
Check Backend Code for TODOs containing the mention of 'multi lang' - this will quickly show you the most spots were english texts need to get i18n.
On most API calls the client has a language code as parameter, if this is missing somehow let me know so that I can improve the API calls on the client side.
Should be added to the google group.
Once a user was rewarded with konfetti on a task it should be noted in the task detail view. If this features is done, add this to the test protocol on test9 step06.
After resetting the password, I cannot log in with the new credentials.
Request URL:http://fourcores2016.cloudapp.net:9000/konfetti/api/account/login?mail=patrick.XXXXXX%40gmail.com&pass=XXXX
Request Method:GET
Status Code:500 Internal Server Error
Remote Address:168.61.167.61:9000
(Credentials have been sent to me a couple of minutes ago and are good. :))
having the new location and date picker online they contain the possibility to add an comment string directly to the items what makes a lot of sense. these means that the data objects on the backend (an so the DB schema) needs to be extended. Also when date and location combined this should become a new meeting object (in the future).
Both would be a great example for me to learn how to do this correctly. Lets plan this together on a skype call.
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.