bgregos / foreground Goto Github PK
View Code? Open in Web Editor NEWSimple Android personal task manager with Taskwarrior integration
License: Apache License 2.0
Simple Android personal task manager with Taskwarrior integration
License: Apache License 2.0
I am trying to use this offline without setting up a taskwarrior server. But I try to add a new task, I don't see any way to save it. Is this intended behavior?
Create a publicly-accessible CI instance to create and distribute builds. This should reduce the amount I need to post test .apks on issues.
Currently you cannot create repeating tasks and repeating task templates do not spawn new tasks when required.
After a certain amount of syncing when using Foreground 1.4.2, the following error is raised:
TaskwarriorMessage [headers={client=taskd 1.1.0, code=500, status=ERROR: Could not find common ancestor for }, payload=Optional.empty]
This is most likely due to an error in Foreground's sync process. No other information about the error is known at this time. Please leave a comment if you're able to determine steps to reproduce.
Currently most business logic is in the views and should be moved out into Jetpack ViewModels.
Most/all strings that are UI-facing are hardcoded right now. Migrate these to strings.xml so that they can be localized.
Add signup screen for users interested in using sync. The signup screen should be (or point to) a document giving a quick overview of taskwarrior, why a user might want to enable syncing with it, and it should direct users to services like inthe.am or freecinc.
Add frontend for User Defined Attributes (UDAs)
It would be nice to be able to share links to the app to be added as a new task item.
Two options:
Issue 9, regarding sort by due date, was closed in February 2019. However, I don't see any "sorting" option in the app (version 1.2.2.). The selling point of Taskwarrior is precisely this automation by "urgency".
Hi,
Thanks this great app.
I got the actual realease 1.3.0 crashing and the master branch too on my pixel 3a running grapheneOS.
I really would like to get this cool app working but i can't find the problem.
I attach here a the few error lines i got when pressing the sync button everytime. I was never be able to sync.
03-02 07:30:15.453 588 588 E AndroidRuntime: Process: me.bgregos.brighttask, PID: 588
03-02 07:30:15.453 588 588 E AndroidRuntime: de.aaschmid.taskwarrior.ssl.TaskwarriorKeyStoreException: Could not generate certificates for '/data/user/0/me.bgregos.brighttask/files/cert_ca': com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0c0000a2:ASN.1 encoding routines:OPENSSL_internal:NOT_ENOUGH_DATA
03-02 07:30:15.458 1050 5393 W ActivityTaskManager: Force finishing activity me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity
03-02 07:30:15.515 1050 3199 I WindowManager: WIN DEATH: Window{5bb98ac u0 me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity}
03-02 07:30:15.515 1050 3199 W InputDispatcher: Attempted to unregister already unregistered input channel '5bb98ac me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity (server)'
03-02 07:30:15.515 1050 1948 I ActivityManager: Process me.bgregos.brighttask (pid 588) has died: fg TOP
03-02 07:30:15.960 1050 1066 W ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{c7ffedd u0 me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity t-1 f}}
...
03-02 07:34:35.208 2519 2519 E AndroidRuntime: Process: me.bgregos.brighttask, PID: 2519
03-02 07:34:35.208 2519 2519 E AndroidRuntime: de.aaschmid.taskwarrior.ssl.TaskwarriorKeyStoreException: Could not generate certificates for '/data/user/0/me.bgregos.brighttask/files/cert_ca': com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0c0000a2:ASN.1 encoding routines:OPENSSL_internal:NOT_ENOUGH_DATA
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at de.aaschmid.taskwarrior.ssl.KeyStoreBuilder.createCertificatesFor(KeyStoreBuilder.java:133)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at de.aaschmid.taskwarrior.ssl.KeyStoreBuilder.build(KeyStoreBuilder.java:103)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at de.aaschmid.taskwarrior.TaskwarriorClient.<init>(TaskwarriorClient.java:46)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at me.bgregos.foreground.task.RemoteTaskManager.<init>(RemoteTaskManager.kt:35)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at me.bgregos.foreground.TaskListActivity$onSyncClick$1.invokeSuspend(TaskListActivity.kt:120)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:938)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at android.os.Looper.loop(Looper.java:223)
--
03-02 07:34:35.208 2519 2519 E AndroidRuntime: Caused by: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0c0000a2:ASN.1 encoding routines:OPENSSL_internal:NOT_ENOUGH_DATA
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.OpenSSLX509Certificate.fromX509DerInputStream(OpenSSLX509Certificate.java:103)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509DerInputStream(OpenSSLX509CertificateFactory.java:234)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509DerInputStream(OpenSSLX509CertificateFactory.java:224)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser.generateItem(OpenSSLX509CertificateFactory.java:112)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: ... 18 more
03-02 07:34:35.208 2519 2519 E AndroidRuntime: Caused by: java.lang.RuntimeException: error:0c0000a2:ASN.1 encoding routines:OPENSSL_internal:NOT_ENOUGH_DATA
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.NativeCrypto.d2i_X509_bio(Native Method)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: at com.android.org.conscrypt.OpenSSLX509Certificate.fromX509DerInputStream(OpenSSLX509Certificate.java:97)
03-02 07:34:35.208 2519 2519 E AndroidRuntime: ... 21 more
03-02 07:34:35.211 1050 1946 W ActivityTaskManager: Force finishing activity me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity
03-02 07:34:35.212 1050 2663 I DropBoxManagerService: add tag=data_app_crash isTagEnabled=true flags=0x2
03-02 07:34:35.215 1050 2663 W DropBoxManagerService: Dropping: data_app_crash (3898 > 0 bytes)
03-02 07:34:35.239 2519 2551 W System : A resource failed to call close.
03-02 07:34:35.249 2519 2519 I Process : Sending signal. PID: 2519 SIG: 9
03-02 07:34:35.287 1050 1948 I ActivityManager: Process me.bgregos.brighttask (pid 2519) has died: fg TOP
03-02 07:34:35.288 1050 1950 I WindowManager: WIN DEATH: Window{cc7f107 u0 me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity}
03-02 07:34:35.289 816 816 I Zygote : Process 2519 exited due to signal 9 (Killed)
03-02 07:34:35.290 1050 1950 W InputDispatcher: Attempted to unregister already unregistered input channel 'cc7f107 me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity (server)'
03-02 07:34:35.301 1050 5519 W WindowManager: Cannot find window which accessibility connection is added to
03-02 07:34:35.336 1050 1075 I libprocessgroup: Successfully killed process cgroup uid 10693 pid 2519 in 48ms
03-02 07:34:35.336 3826 3826 D Orbot : trim memory requested: memory on device is moderate
03-02 07:34:35.354 1050 1066 W ActivityManager: setHasOverlayUi called on unknown pid: 2519
03-02 07:34:35.366 1115 2515 I iorapd : Perfetto TraceBuffer saved to file: /data/misc/iorapd/me.bgregos.brighttask/6/me.bgregos.foreground.TaskListActivity/raw_traces/1614666875356970880.perfetto_trace.pb
03-02 07:34:35.367 30363 30363 W AppButtonsPrefCtl: App is not explicitly stopped
03-02 07:34:35.367 1824 1870 I com.android.systemui: NativeAlloc concurrent copying GC freed 5976(311KB) AllocSpace objects, 0(0B) LOS objects, 66% free, 13MB/41MB, paused 81us total 119.766ms
03-02 07:34:35.367 1824 1872 W System : A resource failed to call release.
03-02 07:34:35.376 28048 28088 I cr_BindingManager: onTrimMemory: level=80, size=0
03-02 07:34:35.376 1525 1525 D AppCenterCrashes: The memory running level (40) was saved.
03-02 07:34:35.379 30363 2511 W TileUtils: Found com.android.traceur.MainActivity for intent Intent { act=com.android.settings.action.IA_SETTINGS } is primary profile only, skip loading tile for uid 10
03-02 07:34:35.397 30363 2665 D SettingsActivity: No enabled state changed, skipping updateCategory call
03-02 07:34:35.459 2557 2557 D EventBus: No subscribers registered for event class com.privateinternetaccess.android.model.events.SeverListUpdateEvent
03-02 07:34:35.460 2557 2557 D EventBus: No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
03-02 07:34:35.548 1050 3196 E IntervalStats: Unable to parse usage stats package 1637
--
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: OpenGL ES Shader Compiler Version: EV031.31.04.00
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Local Branch : gfx-adreno.lnx.2.0
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Remote Branch :
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Remote Branch :
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Reconstruct Branch :
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Build Config : C P 11.0.1 AArch64
03-02 07:34:35.622 30363 30396 I AdrenoGLES-0: Driver Path : /vendor/lib64/egl/libGLESv2_adreno.so
03-02 07:34:35.626 30363 30396 I AdrenoGLES-0: PFP: 0x016ee189, ME: 0x00000000
03-02 07:34:35.700 1050 1946 E IntervalStats: Unable to parse usage stats package 1637
03-02 07:34:35.704 1050 1946 E IntervalStats: Unable to parse usage stats package 1637
03-02 07:34:35.713 1050 1066 W ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{49d7bf8 u0 me.bgregos.brighttask/me.bgregos.foreground.TaskListActivity t-1 f}}
03-02 07:34:35.714 1050 1946 E IntervalStats: Unable to parse usage stats package 1637
03-02 07:34:35.714 1050 1946 E IntervalStats: Unable to parse usage stats package 1695
03-02 07:34:35.721 1824 1824 W Choreographer: Frame time is 0.150865 ms in the future! Check that graphics HAL is generating vsync timestamps using the correct timebase.
03-02 07:34:35.723 30363 30363 W ControllerTask: The updateState took 65 ms in Controller AppNotificationPreferenceController
03-02 07:34:35.727 30363 30363 D AppUtils: Have 0 number of activities in preferred list
03-02 07:34:35.760 30363 30363 V BatteryUtils: package: org.chromium.chrome
03-02 07:34:35.760 30363 30363 V BatteryUtils: type: 0 time(us): 1323606000
03-02 07:34:35.760 30363 30363 V BatteryUtils: foreground time(us): 1323606000
03-02 07:34:35.760 30363 30363 V BatteryUtils: package: null
03-02 07:34:35.760 30363 30363 V BatteryUtils: type: 0 time(us): 0
--
03-02 07:34:35.767 30363 30363 V BatteryUtils: foreground time(us): 0
03-02 07:34:35.767 30363 30363 V BatteryUtils: package: com.geecko.QuickLyric
03-02 07:34:35.767 30363 30363 V BatteryUtils: type: 0 time(us): 0
03-02 07:34:35.767 30363 30363 V BatteryUtils: foreground time(us): 0
03-02 07:34:35.767 30363 30363 V BatteryUtils: package: im.vector.app
03-02 07:34:35.767 30363 30363 V BatteryUtils: type: 0 time(us): 0
03-02 07:34:35.768 30363 30363 V BatteryUtils: foreground time(us): 0
03-02 07:34:35.769 30363 30363 V BatteryUtils: package: com.android.settings.intelligence
03-02 07:34:35.770 30363 30363 V BatteryUtils: type: 0 time(us): 4937000
03-02 07:34:35.770 30363 30363 V BatteryUtils: foreground time(us): 4937000
03-02 07:34:35.770 30363 30363 V BatteryUtils: package: me.bgregos.brighttask
03-02 07:34:35.770 30363 30363 V BatteryUtils: type: 0 time(us): 78146000
03-02 07:34:35.770 30363 30363 V BatteryUtils: foreground time(us): 78146000
03-02 07:34:35.770 30363 30363 V BatteryUtils: package: io.github.hidroh.materialistic
03-02 07:34:35.770 30363 30363 V BatteryUtils: type: 0 time(us): 0
03-02 07:34:35.770 30363 30363 V BatteryUtils: foreground time(us): 0
03-02 07:34:35.771 30363 30363 V BatteryUtils: package: com.android.cellbroadcastreceiver.module
03-02 07:34:35.771 30363 30363 V BatteryUtils: type: 0 time(us): 0
03-02 07:34:35.771 30363 30363 V BatteryUtils: foreground time(us): 0
03-02 07:34:35.771 30363 30363 V BatteryUtils: package: com.revolut.revolut
03-02 07:34:35.771 30363 30363 V BatteryUtils: type: 0 time(us): 0
CA, cert and key are not null when I browse files, and they are working with task sync
on laptop.
How can I help you?
Regards,
Cyrinux
Hello!
I am not sure how the application was created to function but when I set one of my task to a certain time and date. The application does not alarm or give any indication that I set my task when the time of the task as reached.
Android 5.1
Tecno driod pad
Also, consider adding license to your repository.
Thanks βΊ
In tablets large enough to trigger the side-by-side view, there's no mechanism to save a task and update the task list. This means the task list gets outdated after the user changes it and the list does not update until the app is closed and re-opened.
Tasks i created in Foreground seem to not have an "Entered" value set, since tasks that I sync on other devices via task sync will have it set to the date at time of syncing. So a task created 5 hours ago in Foreground will appear as freshly created (or entered) after it got synced on my other device within taskwarrior.
Due dates should appear on a calendar on the user's system (configurable)
Foreground currently uses a custom patched version of Taskwarrior Java Client that adds support for PKCS#1 keys. I submitted a PR to that project with the changes and they have been included in the v1.0 release, meaning this app can switch back to the unpatched version.
Task warrior has a concept of "waited" tasks, which are not displayed (by default) until a certain date. It would be nice to support both adding/modifying/removing a wait date on a task, as well as adding the ability to hide them (currently waited tasks appear to be always displayed).
Pressing the sync button when it's in the overflow menu causes a crash.
Itβs quite easy to touch the completed button accidentally. There should be some way to undo that and get the task back.
Running your app on a samsung s6 tablet (android 10);
server address: taskwarrior.inthe.am (also tried inthe.am by itself)
port: 53589
user credentials: (same thing that intheam lists and in my task.d)
ca cert/private key file/private certificate (same ones that i use to sync with the taskwarrior android app: https://play.google.com/store/apps/details?id=kvj.taskw&hl=en_US&gl=US)
When I hit back the app seems to crash when i hit the sync button
Sorry in advance if this is just a configuration error on my end but I cannot figure it out.
When I try to connect to my taskd server at
task.example.com:54321
I get the error message
failed to connect to task.example.com/aaaa:bbbb:ccc:d:eee:f:gg:hh:ii:jj (port 54321) from /:: (port 98765): connect failed: ECONNREFUSED (Connection refused)
I don't understand the address it is trying to connect to which seems to have an IPv6 address appended to it and I also don't understand where the second port number comes from.
Syncs currently need to be performed manually by the user; add support for periodic or event-triggered syncs.
I added a url (http://...) to a task as a annotation. After changing and syncing the task with foreground Taskwarrior crashed. After debugging it a little bit I found out that foreground converted http:\/\/
to http:\\\\
. This seems to happen only with annotations.
In the latest foreground build as of this comment, the new support for tasks with blank names is not allowed by taskd. This feature should be rolled back to reject/autodelete tasks with no name.
Sync errors are currently either truncated at two lines (not useful) or show a general error. Add a "More" button to the popup to reveal full errors.
New tasks that are hidden because of the current filter settings can appear to disappear once entered to new users.
Create a snackbar message (like the message that appears when hitting the sync button) that tells the user when the task they just entered is hidden because of their filter settings.
Under some versions of android, filenames in the certificate picker are not correct and instead show numbers. This does not affect ability to sync, but can mislead users.
I haven't yet been able to find a pattern to which tasks are not synced. My best guess is that it's tasks which haven't been recently modified. Example in case the details help you figure out what's going on:
Upon initial sync, task 7 did not appear in foreground. Here's how it looked from my command-line client:
ID 7
Description pay homeowners policy
Status Pending
Entered 2018-07-05 16:04:47 (10mo)
Due 2019-04-01 00:00:00
Last modified 2018-07-05 16:04:47 (10mo)
Virtual tags OVERDUE PENDING READY UNBLOCKED YEAR
UUID xxxxxxxxxxxxxxxxxxxxx
Urgency 13.79
If I take the following steps, this task then appears in foreground:
task 7 modify project:bills
task 7 modify project:
task sync
It looks like a lot of work has been done since the initial release to the play store. Maybe it makes sense to release a new version, at least to the beta Channel?
Add support for Reports to foreground.
Feel free to list in the comments what reports you would find most helpful, or if you have any other input on this feature.
hi, I love the android app! tried a few others but they're not as easy or visually pleasing!! I'd like to up vote the filter by projects and (UDA) feature requests and propose ... have you considered a homescreen widget to display tasks (ideally with filters for project and / or urgency - that would allow for several diffn widgets on the homescreen) ... and ... it would be great to have homescreen widget or a shortcut to quick-add a task (literally click > type/dictate > save). in the past I've tried workarounds in KLWP/ tasker/ emailMe for these things but they never lasted long.
Anyway, whether you do or not ... KEEP UP THE GOOD WORK. Really appreciate it.
bw
atul.
Hi here!
I have a lot of my tasks but I wish they wouldn't wake me up at night (00:00) !
Would it be possible to add an option to set the time at which a stain without a time rings on its due date?
Thanks for your effort π
Task dates and times are shown in UTC and not the user's local time when syncing; the server expects UTC, and Foreground provides the local time.
Under the current version, tasks are stored internally using the user's local time. This is not ideal for a few reasons, including the sync issue shown above and because a user may travel into a different time zone, causing unexpected results.
A solution to this includes setting up a migration of the local task database if a "last seen version" flag isn't present in the app's saved properties. The local-time tasks are migrated to UTC, and new tasks are created in UTC. User-facing displays and input can then be updated to turn UTC into local time and back again.
The app will crash every [background sync interval] minutes whenever background sync is enabled. This issue resolves itself once background sync is toggled off and back on again.
This happens because the background sync worker registered by the previous version (1.3.0 and older) has been moved to a different package in 1.4.0+. The old worker location is called still, and a ClassNotFoundException is thrown and not caught.
Planned mitigations are to map all calls from the old worker to the new one, and catch further ClassNotFoundExceptions here and report them in logcat.
I believe it would be more idiomatic if selecting the "No Priority Assigned" button removed the priority field from the task. Currently, I think it adds "priority":"No Priority Assigned"
to the task, and this propagates to the Taskserver and other clients.
The user should be able to view tasks that they have completed, and un-complete them. Requirements for making this happen is follows:
There is some issue with how the waitDate
is parsed/read at some point. The main issue is that tasks which are due for the same date but later will show up as pending instead of waiting.
I was able to track down the issue to some problem with waitDate
. The value of task.waitDate
in shouldDisaply
function in Task.kt
. For example, when the actual date is Fri Dec 18 18:28:00 GMT+05:30
it shows as Fri Dec 18 12:58:00 GMT+05:30
. Not exactly sure where/how this is coming through though.
As a result of this(most probably) the state is set as pending
instead of waiting
.
Sort the task list by due date instead of enter date. Fall back to enter date for items without due dates.
The app works great, and it's UI is wonderful. THANK YOU.
It would be great if it could display only tasks of a selected project.
And if a project is selected the project field could be prefilled when creating a new task.
So I have setup a self-hosted taskserver, using a self-signed CA cert, which works fine when syncing from my laptop, but obviously Android is more paranoid when choosing the trusted cert. When I try to enable sync in foreground, an exception is thrown with the message: "Trust anchor for certification path not found."
Things I have tried:
I got no luck. According to the documentation, it looks like some extra code work has to be done so the application can accept a self-signed ca.
Create a CONTRIBUTING.md file to set expectations and provide guidance to those wishing to make PRs.
Include the following at minimum:
Add data beyond just the name and due date to task cards. At minimum, include priority, project, and tags if these fields are present.
An example of how this could look:
Task Name
Due Date
Priority : Project : Tags
I'm certainly open to a more creative/exciting design for this though! Perhaps express the priority through a color bar on the side instead of spelling it out?
HI!
To show my appreciation, I'd like to add your app to F-Droid. I'm sketching a merge request at my fork and I'd like to do it in the best possible manner - I want the app to include localized descriptions and screenshots. According to their docs, it's done with either of the methods described here:
The 1st option - using fastlane seems to me the best method because it's connected to the development workflow. But I wanted to get your impression first, before I go and do everything.
If I'll get your π I'll happily do it all by myself and open a PR here before the MR at fdroid.
Also, it could help to bring this to the attention of users by adding some badges to the README as explained here: https://gitlab.com/fdroid/fdroiddata/-/blob/master/CONTRIBUTING.md#after-you-added-your-app
Creating an app help menu can help answer common questions users have, or even serve as full app manual.
My current idea is to fill out the repo wiki (currently mostly unused) and link to it from inside the app's settings menu.
Thanks for this excellent app! Certainly a significant improvement over earlier TW app attempts.
I'm very interested in specifying new tasks by voice to TaskWarrior, the same way as one would say to Google Assistant ("remind me to ... ").
How hard is that to implement?
If you do not have time for this I'd be happy to help. I'm certainly not an Java guru or anything but if you specified what needs to be implemented for this I'd be happy to give it a go
On the task list screen, the add task button sits on top of task complete buttons when there are enough tasks to fill the screen.
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.