hjuutilainen / munkiadmin Goto Github PK
View Code? Open in Web Editor NEWmacOS app for managing Munki repositories
License: MIT License
macOS app for managing Munki repositories
License: MIT License
When extracting icons for pkgs, if you close the floating window with the red x MunkiAdmin freezes.
If you close the floating window by clicking in the Cancel button it does not freeze
MunkiAdmin currently crashes while saving (on trying to backup) if a package is imported and its values are edited before saving. Fix coming in version 1.0.1.
It would be a nice feature addition if there were a tickbox that would allow you to add licensed seat tracking to pkgsinfos
licensed_seat_info_available
https://code.google.com/p/munki/wiki/LicenseSeatTracking
This also requires users to run MunkiWebAdmin server, however currently, admins have to add this line to their pksinfos manually.
Ran into a situation where i needed an "empty" BlockingApplications array so that an application could be updated even if it was already running (see https://groups.google.com/forum/#!topic/munki-dev/4cmdt1Bca-Q). However, there is no way to add such an empty array with munkiadmin, and it appears that editing a package object in munkiadmin after manually adding the empty array removes the empty array!
Hey Hannes!
Thanks for the MunkiAdmin beta for Munki 2 - I was able to successfully extract icons from nearly all of the packages in my repo. Between the support for icons, categories, and developers, modernizing our repository was quick!
I remembered you mentioning over Twitter that you'd like examples of packages that fail to extract icons. I tried extracting icons from two of our Adobe CC packages (both Bridge and Acrobat) and MunkiAdmin stalled on expanding the package.
Is this something you want to support? I understand the Adobe packages are typically a different situation than other types of packages. Are there any logs I can provide to help?
Thanks!
Mike
MunkiAdmin doesn't write changes to disk when adding and removing packages in catalogs view.
After opening an existing repo with existing packages, I am attempting to modify a package to add "requires" attributes on the "Requirements" tab of the package properties. Upon closing the properties window by pressing the "Ok" button, and saving the repo, the changes are not saved to the pkginfo.
So I've run the defaults command needed for it to auto grab the correct catalog mentioned in #34
however now the behavior has reached an odd level of irritation. It now doesn't assign a catalog to any type of item imported at all.
first time app has ever crashed on me...
MunkiAdmin translates "--" to an "M-dash" when typed in to an uninstall script. There seems to be no way to force the double dash. This breaks the script.
Just a suggestion, but shouldn't items like "uninstall method" inside the item properties be drop down's?
A couple of similar things:
Contents->Installs-Type
Uninstall->Uninstall Method
Many of these things should be turned into a limited selection of items as munki only has a few valid methods.
Many of us have been bitten by creating a manifest for a host, 'including'/nesting a more generic manifest, and neglecting to select a single catalog. A warning on save, post creation of a new manifest, would be a nice failsafe.
Add support for destination_item key in items_to_copy and fix the handling of new keys. MunkiAdmin shouldn't clear keys it doesn't know about.
For whatever reason the standard user I run as has no munkiimport defaults set, yet I keep getting things imported into the 'testing' catalog. I'd like to change it, and I don't see how...
Report by user:
"Sometimes the catalog checkboxes don’t show up under "Basic Info" for a package, in the bottom right box. Reloading the munki_repo usually fixes it."
And this is a bug which I've seen myself too. Needs investigating.
We have both the english and swedish versions of Firefox in our repository, published in english and swedish catalogs:
catalogs/common
catalogs/english
catalogs/swedish
pkgsinfo/Adium-1.3.10
pkgsinfo/Firefox_EN-3.6.9
pkgsinfo/Firefox_SV-3.6.9
Most information in the pkgsinfo is identical between the two versions, but the following differ:
<key>display_name</key>
<string>Firefox (English)</string>
<key>installer_item_location</key>
<string>Firefox-3.6.9-EN-Hum100913.pkg</string>
<key>display_name</key>
<string>Firefox (Swedish)</string>
<key>installer_item_location</key>
<string>Firefox-3.6.9-SV-Hum100913.pkg</string>
In MunkiAdmin, instead of being listed as Firefox (English) and Firefox (Swedish), Firefox (English) is listed twice.
All of my packages are Bundles and it seems I can import them through cli, but MunkiAdmin errors saying Bundle packages are not supported. Possible to see this supported?
Error:
File type not supported
Bundle file packages are not supported. MunkiAdmin only supports regular files.
If a pkginfo is enabled in a catalog or manifest, alert the user if they attempt to delete it. Notify as to which catalog/manifest(s) it is still active in and offer to remove from those as well, just delete the pkinfo (leaving references to it intact), or cancel.
I manually added the category and icon_name key/string pairs to one of my printer definition nopkg pkginfos, and munkiadmin skipped it during scan, removing it from the catalogs it was in, but not the manifests.
Removing those two keys restored proper operation of the scanning function.
What can be done to address this? What additional information can I provide to help troubleshoot?
First of all, love how the app has come along, really very useable at this point.
This is not so much a bug as it is a few feature request... When in manifest view it would be very useful if one could double-click/right click on an included manifest or enabled pkginfo to edit it directly, reducing the amount of jumping back and forth that is needed to make quick edits.
Additionally it would be handy to have an option to group the packages in catalog view by enabled/disabled to improve visual scanning without having to scroll through excessively long lists of packages. The list could remain sorted by name, but have a grouping by whether the packages are enabled or disabled. Either a preference item or a toggle in the catalog view would work.
Thanks and keep up the good work!
A lot of packages from commercial vendors aren't named suitably (I'm looking at you Microsoft and your Office 2011 Updates) or have a useless version number (Yes, Oracle, why are all Java updates using a package version of 1.0?)
It would be handy to be prompted (or to have an option to chose to be prompted) for the basic package metadata, with the info pre-filled if MunkiAdmin detects it's an update to an existing package - a-la munkiimport.
Any complex editing of metadata can, and should, still be done in the regular MunkiAdmin interface however a dialog with fields to fill in the basic Package Name, Display Name, Description and Version would be good to have when importing packages.
I don't know how to explain this other than the graphics glitch out in 0.2.13. It seems when I change between manifests it happens. See SS.
I'm happy to have caught the state of the repo in a recent git checkin, and have logging turned up for your perusal, but this was quite the Monday AM surprise, all manifests(only) were completely dumped of content. I know you're on vacation, the log file is sitting in dropbox for when you return, will send out-of-band.
Slightly different behavior in
[self.managedObjectContext refreshObject:object mergeChanges:YES];
Crashes on 10.6 if object==nil
Fix is on it's way.
More of a question than a bug:
I saw issue #29 concerning the default catalog override. Has this been implemented yet? Or fixed?
This project is still one of my absolute favorites concerning Munki
I'm using the new version of munkitools (0.8.4.1770.0) and when I import Dropbox into my repository using munkiimport, everything goes as expected. However, if I open and resave the repository using MunkiAdmin, suddenly users start being prompted to download/install the latest version of Dropbox, even when it's already installed.
The issue seems to be that, even though I'm not altering the Dropbox package in MunkiAdmin, MunkiAdmin changes the this XML:
CFBundleIdentifier
com.getdropbox.dropbox
CFBundleName
Dropbox
CFBundleShortVersionString
Dropbox 2.0.8
CFBundleVersion
2.0.8
path
/Applications/Dropbox.app
type
application
version_comparison_key
CFBundleVersion
to the following:
CFBundleIdentifier
com.getdropbox.dropbox
CFBundleName
Dropbox
CFBundleShortVersionString
Dropbox 2.0.8
path
/Applications/Dropbox.app
type
application
If you make changes to package info, catalogs, or manifests and forget to "Save" and/or "Make" before Command-Q or red-jewel quitting the app, all changes will be lost without any warning.
A visual cue on the "Save" icon and/or a warning dialog if the user attempts to quit while there are unsaved changes in the would be very useful.
So I'm not sure if this is a bug or a feature request, but let me try to explain this the best I can.
I have 2 catalogs, testing and production. I have a manifest "site_default" that only points to the "production" catalog. Despite this, a package that I have in the "Installs" section shows "3 matching packages (x.y.z)." I only have 1 of these packages (with an older version number) available in the "production" catalog, but it also detects items from the "testing" catalog.
Would it be possible to have the "Installs" section only show the number of packages and the latest version number available based on the catalog(s) that the manifest is linked to?
The menu item "Import Packages..." could be misleading to new users who don't realize you can import pkgs wrapped in dmg's. Could we use clearer wording, would "Import DMGs/Flat PKGs" or "Import Software" be more clear?
Hi,
Im running version 0.2.9 and in Catalog view I can make a new catalog and add items. However I cant delete the catalog.
I have to manually remove the catalog file and the catalog's string from each package that has been added to that catalog and then run makecatalogs
Any Ideas ?
One improvement I’d like to suggest to streamline the workflow when importing is to skip the step where you need to select where the pkgsinfo file goes into.
So, if I import an Office 2011 Update, and select the pkg to go into pkgs/microsoft - can MunkiAdmin remember that I’m using the microsoft subdirectory and put the pkgsinfo file into pkgsinfo/microsoft - rather than prompting me separately for it’s location.
Requesting feature for ⌘+R to Reload the repository.
When editing the pre/post install/check scripts MunkiAdmin is converting standard single and double quotes into smart quotes (i.e " to ” and ' to ‘).
While this isn't a problem if constructing a script entirely in MunkiAdmin, becomes a problem if copy/pasting from another app, then subsequently editing with MunkiAdmin.
this only started with v 0.3.0
When using munkiimport from the command-line, one of the last questions it asks you is to "Upload item to subdirectory path []:"
In all the Munki repos that I manage, I keep them sorted by software vendor, so it's easier to go through them and see what's there.
Would it be possible to add this as an option for MunkiAdmin?
When performing maintenance, etc, sometimes a manifest will contain a reference to a package which was removed via another process (or was not activated properly in the related catalog, etc).
There should be a sanity check run by the program when a save or make is initiated by the user, to help locate these items. Often, the only indication of this condition is when munki starts to throw multiple warnings:
• Could not process item GitHub for optional install. No pkginfo found in catalogs: production
When I go into MunkiAdmin, select a package, right-click on it and chose to Add and icon, it brings up the add icon window. I have successfully been able to import an .icns file manually to add icons, but when I hit the Extract button on either a .pkg installer or an install from dmg installer, nothing happens.
I enabled debug logging in MunkiAdmin and here's the output:
The first bunch of log entries at 10:39:17 were attempting to extract an icon from a .pkg (note that this .pkg doesn't have a custom icon on it)
The second set of log entries at 10:39:58 were attempting to extract an icon from Firefox
29/08/14 10:39:17.829 AM MunkiAdmin[24350]: -[NSWindow beginSheet:completionHandler:]: unrecognized selector sent to instance 0x7fac0cac65a0
29/08/14 10:39:17.830 AM MunkiAdmin[24350]: An uncaught exception was raised
29/08/14 10:39:17.830 AM MunkiAdmin[24350]: -[NSWindow beginSheet:completionHandler:]: unrecognized selector sent to instance 0x7fac0cac65a0
29/08/14 10:39:17.833 AM MunkiAdmin[24350]: (
0 CoreFoundation 0x00007fff94bc4b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff91ee93f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff94c5b40a -[NSObject(NSObject) doesNotRecognizeSelector:] + 186
3 CoreFoundation 0x00007fff94bb302e ___forwarding___ + 414
4 CoreFoundation 0x00007fff94bb2e18 _CF_forwarding_prep_0 + 232
5 MunkiAdmin 0x0000000109dc3c04 MunkiAdmin + 379908
6 AppKit 0x00007fff8d264959 -[NSApplication sendAction:to:from:] + 342
7 AppKit 0x00007fff8d2647b7 -[NSControl sendAction:to:] + 85
8 AppKit 0x00007fff8d2646eb -[NSCell _sendActionFrom:] + 138
9 AppKit 0x00007fff8d262bd3 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 1855
10 AppKit 0x00007fff8d262421 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 504
11 AppKit 0x00007fff8d261b9c -[NSControl mouseDown:] + 820
12 AppKit 0x00007fff8d25950e -[NSWindow sendEvent:] + 6853
13 AppKit 0x00007fff8d255644 -[NSApplication sendEvent:] + 5761
14 AppKit 0x00007fff8d3be6ba -[NSApplication _realDoModalLoop:peek:] + 582
15 AppKit 0x00007fff8d3be91e -[NSApplication runModalForWindow:] + 120
16 MunkiAdmin 0x0000000109dbb420 MunkiAdmin + 345120
17 AppKit 0x00007fff8d264959 -[NSApplication sendAction:to:from:] + 342
18 AppKit 0x00007fff8d39a36c -[NSMenuItem _corePerformAction] + 406
19 AppKit 0x00007fff8d39a05a -[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 133
20 AppKit 0x00007fff8d08720f -[NSMenu _internalPerformActionForItemAtIndex:] + 36
21 AppKit 0x00007fff8d087097 -[NSCarbonMenuImpl _carbonCommandProcessEvent:handlerCallRef:] + 135
22 AppKit 0x00007fff8d393165 NSSLMMenuEventHandler + 342
23 HIToolbox 0x00007fff8e23ad1a _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1206
24 HIToolbox 0x00007fff8e23a1e9 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 410
25 HIToolbox 0x00007fff8e24ffc9 SendEventToEventTarget + 40
26 HIToolbox 0x00007fff8e286ca9 _ZL18SendHICommandEventjPK9HICommandjjhPKvP20OpaqueEventTargetRefS5_PP14OpaqueEventRef + 443
27 HIToolbox 0x00007fff8e22ba21 SendMenuCommandWithContextAndModifiers + 59
28 HIToolbox 0x00007fff8e22b9d3 SendMenuItemSelectedEvent + 254
29 HIToolbox 0x00007fff8e22b85f _ZL19FinishMenuSelectionP13SelectionDataP10MenuResultS2_ + 94
30 HIToolbox 0x00007fff8e3a1e79 _ZL19PopUpMenuSelectCoreP8MenuData5PointdS1_tjPK4RecttjS4_S4_PK10__CFStringPP13OpaqueMenuRefPt + 1673
31 HIToolbox 0x00007fff8e3a1794 _HandlePopUpMenuSelection7 + 629
32 AppKit 0x00007fff8d41656b _NSSLMPopUpCarbonMenu3 + 3916
33 AppKit 0x00007fff8d4155f8 -[NSCarbonMenuImpl _popUpContextMenu:withEvent:forView:withFont:] + 189
34 AppKit 0x00007fff8d56fff3 -[NSMenu _popUpContextMenu:withEvent:forView:withFont:] + 200
35 AppKit 0x00007fff8d735937 -[NSView rightMouseDown:] + 130
36 AppKit 0x00007fff8d464cfb -[NSControl _rightMouseUpOrDown:] + 534
37 AppKit 0x00007fff8d259b81 -[NSWindow sendEvent:] + 8504
38 AppKit 0x00007fff8d255644 -[NSApplication sendEvent:] + 5761
39 AppKit 0x00007fff8d16b21a -[NSApplication run] + 636
40 AppKit 0x00007fff8d10fbd6 NSApplicationMain + 869
41 libdyld.dylib 0x00007fff930c27e1 start + 0
)
29/08/14 10:39:58.897 AM MunkiAdmin[24350]: -[NSWindow beginSheet:completionHandler:]: unrecognized selector sent to instance 0x7fac0cac65a0
29/08/14 10:39:58.898 AM MunkiAdmin[24350]: An uncaught exception was raised
29/08/14 10:39:58.898 AM MunkiAdmin[24350]: -[NSWindow beginSheet:completionHandler:]: unrecognized selector sent to instance 0x7fac0cac65a0
29/08/14 10:39:58.902 AM MunkiAdmin[24350]: (
0 CoreFoundation 0x00007fff94bc4b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff91ee93f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff94c5b40a -[NSObject(NSObject) doesNotRecognizeSelector:] + 186
3 CoreFoundation 0x00007fff94bb302e ___forwarding___ + 414
4 CoreFoundation 0x00007fff94bb2e18 _CF_forwarding_prep_0 + 232
5 MunkiAdmin 0x0000000109dc3c04 MunkiAdmin + 379908
6 AppKit 0x00007fff8d264959 -[NSApplication sendAction:to:from:] + 342
7 AppKit 0x00007fff8d2647b7 -[NSControl sendAction:to:] + 85
8 AppKit 0x00007fff8d2646eb -[NSCell _sendActionFrom:] + 138
9 AppKit 0x00007fff8d262bd3 -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 1855
10 AppKit 0x00007fff8d262421 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 504
11 AppKit 0x00007fff8d261b9c -[NSControl mouseDown:] + 820
12 AppKit 0x00007fff8d25950e -[NSWindow sendEvent:] + 6853
13 AppKit 0x00007fff8d255644 -[NSApplication sendEvent:] + 5761
14 AppKit 0x00007fff8d3be6ba -[NSApplication _realDoModalLoop:peek:] + 582
15 AppKit 0x00007fff8d3be91e -[NSApplication runModalForWindow:] + 120
16 MunkiAdmin 0x0000000109dbb420 MunkiAdmin + 345120
17 AppKit 0x00007fff8d264959 -[NSApplication sendAction:to:from:] + 342
18 AppKit 0x00007fff8d39a36c -[NSMenuItem _corePerformAction] + 406
19 AppKit 0x00007fff8d39a05a -[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 133
20 AppKit 0x00007fff8d08720f -[NSMenu _internalPerformActionForItemAtIndex:] + 36
21 AppKit 0x00007fff8d087097 -[NSCarbonMenuImpl _carbonCommandProcessEvent:handlerCallRef:] + 135
22 AppKit 0x00007fff8d393165 NSSLMMenuEventHandler + 342
23 HIToolbox 0x00007fff8e23ad1a _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 1206
24 HIToolbox 0x00007fff8e23a1e9 _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 410
25 HIToolbox 0x00007fff8e24ffc9 SendEventToEventTarget + 40
26 HIToolbox 0x00007fff8e286ca9 _ZL18SendHICommandEventjPK9HICommandjjhPKvP20OpaqueEventTargetRefS5_PP14OpaqueEventRef + 443
27 HIToolbox 0x00007fff8e22ba21 SendMenuCommandWithContextAndModifiers + 59
28 HIToolbox 0x00007fff8e22b9d3 SendMenuItemSelectedEvent + 254
29 HIToolbox 0x00007fff8e22b85f _ZL19FinishMenuSelectionP13SelectionDataP10MenuResultS2_ + 94
30 HIToolbox 0x00007fff8e3a1e79 _ZL19PopUpMenuSelectCoreP8MenuData5PointdS1_tjPK4RecttjS4_S4_PK10__CFStringPP13OpaqueMenuRefPt + 1673
31 HIToolbox 0x00007fff8e3a1794 _HandlePopUpMenuSelection7 + 629
32 AppKit 0x00007fff8d41656b _NSSLMPopUpCarbonMenu3 + 3916
33 AppKit 0x00007fff8d4155f8 -[NSCarbonMenuImpl _popUpContextMenu:withEvent:forView:withFont:] + 189
34 AppKit 0x00007fff8d56fff3 -[NSMenu _popUpContextMenu:withEvent:forView:withFont:] + 200
35 AppKit 0x00007fff8d735937 -[NSView rightMouseDown:] + 130
36 AppKit 0x00007fff8d464cfb -[NSControl _rightMouseUpOrDown:] + 534
37 AppKit 0x00007fff8d259b81 -[NSWindow sendEvent:] + 8504
38 AppKit 0x00007fff8d255644 -[NSApplication sendEvent:] + 5761
39 AppKit 0x00007fff8d16b21a -[NSApplication run] + 636
40 AppKit 0x00007fff8d10fbd6 NSApplicationMain + 869
41 libdyld.dylib 0x00007fff930c27e1 start + 0
)
Would it be possible to have Munki Admin check to see if the munki repo is version controlled with git and if so add and commit and changes in the repo (and maybe even push to remote origin) when the makecatalogs command is run?
Under File menu, you can create new Catalogs, Manifests, etc. Would be handy to be able to create nopkg pkginfo files as well.
If I duplicate a manifest and the manifest already exists, munkiadmin prompts me to confirm I want to replace the manifest. However, choosing "replace" when prompted does not replace the manifest. Not a big deal though.
When trying to import a package I am receiving the error "Failed to create a pkginfo".
Any idea what can be causing it?
Thanks!
When trying to open a mounted Winodws smb repository I get the following:-
Invalid repository
Munki repositories usually contain subdirectories for catalogs, manifests and pkginfo files. This repository definitely does contain those.
08/08/2014 15:47:18.349 MunkiAdmin[10321]: openRepository:
08/08/2014 15:47:19.687 MunkiAdmin[10321]: Selecting repo: /Volumes/munki
08/08/2014 15:47:19.697 MunkiAdmin[10321]: Not a repo!
Can we override the logic that munkiadmin uses not decide whether something is a repo or not?
Not sure how hard this would be to implement but it would be nice if the sidebar "Directories" section has an expand all & collapse all arrow. My pkgsinfo has quite a few sub-directories and navigating through the sections can sometimes be a pain on smaller laptop screens. This could also be implemented with a right-click if you didn't want visual clutter.
This was a head-scratcher of an omission, because you can mass-nest manifests by shift-clicking a list and then selecting options already, but when I try to add a catalog(which is my number 1 workflow oversight when adding manifests!) to multiple manifests the selections don't appear. I'm asking other folks to confirm it's not just my install/setup
Just installed the latest release version and while the subfolder improvements work well I noticed an issue while duping a manifest in a subfolder. It's mostly cosmetic but the resolution is kind of counter-intuitive so I figured I'd post it. When initiating a duplication operation on a manifest in a subfolder (subfolder/mymanifest) the resulting pop up dialog lists the current subfolder and manifest name as a placeholder (subfolder/mymanifest). Changing the name to say, subfolder/mymanifest2 does not create the duplicate manifest. Removing the subfolder name and slash and then entering the duplicate name, e.g. mymanifest2 creates the manifest and places it in the subfolder the source is in. I intended to have the duplicate created inside the subfolder but it may be cause for confusion for others.
Thanks,
Pepijn.
Extracting icons works fine with .pkg packages for me, but .dmgs are consistently failing. It goes through "mounting," "processing," and "ejecting" and then the app quits unexpectedly.
I can provide full crash logs if it would be helpful. Beginning of the log is below:
Process: MunkiAdmin [90861]
Path: /Applications/MunkiAdmin.app/Contents/MacOS/MunkiAdmin
Identifier: fi.obsolete.MunkiAdmin
Version: 1.0 (1.0)
Code Type: X86-64 (Native)
Parent Process: launchd [249]
User ID: 501
Date/Time: 2014-09-18 15:33:38.789 -0700
OS Version: Mac OS X 10.8.5 (12F45)
Report Version: 10
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: 0x000000000000000a, 0x00000001117ba6af
VM Regions Near 0x1117ba6af:
Stack 000000011171a000-000000011179c000 [ 520K] rw-/rwx SM=COW thread 3
--> mapped file 000000011179c000-0000000111860000 [ 784K] r--/rwx SM=COW Object_id=3df9ce60
STACK GUARD 0000000111860000-0000000111861000 [ 4K] ---/rwx SM=NUL stack guard for thread 8
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.