Git Product home page Git Product logo

profilecreator's Introduction

Latest pre-release version tag macOS version support Latest release download total

Download

See the latest download in Releases

Contribute

If you want to contribute to the payloads available in this project, please go to the ProfileManifests repo:

ProfileManifests

There is a getting started guite to describe the basics on how to create your own manifest:

ProfileManifests - Getting Started

ProfileCreator

macOS application to create configuration profiles.

ProfileCreator

System Requirements

ProfileCreator requires macOS 10.12 or newer.

Development

Getting started

In order to develop for ProfileCreator, the following pieces of software are required

  • Xcode 14 or higher
  • macOS 12.0 or higher

In addition to those pieces of software you will also need to clone ProfilePayloads alongside the ProfileCreator repository (The repositories must be adjacent to each other).

Compiling

In order to compile ProfileCreator, please navigate to where the Xcode Project file is located and run the following command

xcodebuild -project ProfileCreator.xcodeproj -scheme ProfileCreator -configuration Debug

This will compile the application and output the result in the DerivedData path as set by your Xcode preferences. The default DerivedData location will be ~/Library/Developer/Xcode/DerivedData/.

In addition, please take a look at the ProfileManifests project which supplies ProfileCreator with its payloads is very much active!

Have Questions?

Consult the wiki. Join the conversion over in the #profilecreator channel in the MacAdmins Slack.

Acknowledgements

Icon is created by Katherine M. Ahern:

UI Icons have been taken from the following sites:

Open Source code included in this project:

profilecreator's People

Contributors

apizz avatar erikberglund avatar kevinmcox avatar nider avatar willyu91 avatar wjk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

profilecreator's Issues

Implement platform setting for profile

User should be able to specify the target platforms and versions for the profile, which then would make the interface only show payload keys and types that are valid in that platform setting.

The ui for that settings is currently greyed out in the settings popover.

Crash when trying to save profile with AD cert info

Where is the console log with crash inside.

24/06/2016 14:14:27,578 [VERBOSE] -[PFCProfileEditor buttonSave:]
24/06/2016 14:14:27,578 [DEBUG] Saving settings for manifest domain: com.apple.ADCertificate.managed.manifest
24/06/2016 14:14:27,579 [DEBUG] Settings to save: {
    "0876B806-BF31-4EA5-86E3-15657DCA7420" =     {
        Value = "srv-cert";
    };
    "142A27DF-6AD5-44F7-B1B2-6735C52D171C" =     {
        Value = "cert ca";
    };
    "22A6513F-65DD-48C8-AB89-D7FCDC9272FA" =     {
        Value = "AD Cert desc";
    };
    "3C9F3FFE-CC74-464F-A87F-52F2012AC77A" =     {
        Value = Ordinateur;
    };
    "55EF75E2-3BB6-48B4-A0F2-35F0945E4087" =     {
        Value = user;
    };
    "602DAB08-AE68-4536-B31C-8425CE23FF61" =     {
        ValueCheckbox = 1;
    };
    "7F59E5CA-AFA9-4E92-B393-344A6EB1D922" =     {
        ValueCheckbox = 1;
    };
    "DD667296-F6F6-4B0D-9ADC-D3E80254C915" =     {
        Value = RPC;
    };
    "DE282055-F4AE-4F9E-A21E-EC12ED7E9623" =     {
        Value = pass;
    };
}
24/06/2016 14:14:27,579 [DEBUG] Current manifest settings count: 1
24/06/2016 14:14:27,579 [DEBUG] Current manifest tab count: 1
24/06/2016 14:14:27,579 [DEBUG] Replacing current settings at index 0
24/06/2016 14:14:27,579 [VERBOSE] Saving settings: (
        {
        "0876B806-BF31-4EA5-86E3-15657DCA7420" =         {
            Value = "srv-cert";
        };
        "142A27DF-6AD5-44F7-B1B2-6735C52D171C" =         {
            Value = "cert ca";
        };
        "22A6513F-65DD-48C8-AB89-D7FCDC9272FA" =         {
            Value = "AD Cert desc";
        };
        "3C9F3FFE-CC74-464F-A87F-52F2012AC77A" =         {
            Value = Ordinateur;
        };
        "55EF75E2-3BB6-48B4-A0F2-35F0945E4087" =         {
            Value = user;
        };
        "602DAB08-AE68-4536-B31C-8425CE23FF61" =         {
            ValueCheckbox = 1;
        };
        "7F59E5CA-AFA9-4E92-B393-344A6EB1D922" =         {
            ValueCheckbox = 1;
        };
        "DD667296-F6F6-4B0D-9ADC-D3E80254C915" =         {
            Value = RPC;
        };
        "DE282055-F4AE-4F9E-A21E-EC12ED7E9623" =         {
            Value = pass;
        };
    }
)
24/06/2016 14:14:27,579 [DEBUG] Profile runtime path: /Users/ygi/Library/Application Support/ProfileCreator/Profiles/ABFEA23A-5612-4A8B-B0BB-49C264164C4D.pfcconf
24/06/2016 14:14:27,579 [DEBUG] Profile save path: /Users/ygi/Library/Application Support/ProfileCreator/Profiles/ABFEA23A-5612-4A8B-B0BB-49C264164C4D.pfcconf
2016-06-24 14:14:27.762 ProfileCreator[26052:1466346] -[__NSCFString allKeys]: unrecognized selector sent to instance 0x600000c5b210
2016-06-24 14:14:27.762 ProfileCreator[26052:1466346] -[__NSCFString allKeys]: unrecognized selector sent to instance 0x600000c5b210
2016-06-24 14:14:27.763 ProfileCreator[26052:1466346] (
    0   CoreFoundation                      0x00007fff90ff14f2 __exceptionPreprocess + 178
    1   libobjc.A.dylib                     0x00007fff84e9cf7e objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff9105b1ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00007fff90f61571 ___forwarding___ + 1009
    4   CoreFoundation                      0x00007fff90f610f8 _CF_forwarding_prep_0 + 120
    5   ProfileCreator                      0x00000001000873ab -[PFCManifestParser tableViewColumnsFromArray:settings:] + 2971
    6   ProfileCreator                      0x0000000100085d81 -[PFCManifestParser manifestContentFromDict:settingsDict:] + 1633
    7   ProfileCreator                      0x0000000100084749 -[PFCManifestParser manifestFromPlistAtURL:settings:] + 425
    8   ProfileCreator                      0x0000000100095ff4 -[PFCManifestLibrary manifestsFromPlistsAtURL:library:] + 708
    9   ProfileCreator                      0x0000000100093f21 -[PFCManifestLibrary libraryUserLibraryPreferencesLocal:acceptCached:] + 385
    10  ProfileCreator                      0x0000000100092e44 -[PFCManifestLibrary libraryAll:acceptCached:] + 276
    11  ProfileCreator                      0x00000001000949c4 -[PFCManifestLibrary manifestsWithDomains:] + 132
    12  ProfileCreator                      0x000000010000b729 -[PFCProfileEditor saveProfile:] + 2889
    13  ProfileCreator                      0x000000010000e0ec -[PFCProfileEditor buttonSave:] + 2012
    14  libsystem_trace.dylib               0x00007fff8eb4d07a _os_activity_initiate + 75
    15  AppKit                              0x00007fff946dadbd -[NSApplication sendAction:to:from:] + 460
    16  AppKit                              0x00007fff946ecf12 -[NSControl sendAction:to:] + 86
    17  AppKit                              0x00007fff946ece3c __26-[NSCell _sendActionFrom:]_block_invoke + 131
    18  libsystem_trace.dylib               0x00007fff8eb4d07a _os_activity_initiate + 75
    19  AppKit                              0x00007fff946ecd99 -[NSCell _sendActionFrom:] + 144
    20  libsystem_trace.dylib               0x00007fff8eb4d07a _os_activity_initiate + 75
    21  AppKit                              0x00007fff946eb3be -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2693
    22  AppKit                              0x00007fff94733f04 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 744
    23  AppKit                              0x00007fff946e9ae8 -[NSControl mouseDown:] + 669
    24  AppKit                              0x00007fff94c3e3c9 -[NSWindow _handleMouseDownEvent:isDelayedEvent:] + 6322
    25  AppKit                              0x00007fff94c3f3ad -[NSWindow _reallySendEvent:isDelayedEvent:] + 212
    26  AppKit                              0x00007fff9467e539 -[NSWindow sendEvent:] + 517
    27  AppKit                              0x00007fff945fea38 -[NSApplication sendEvent:] + 2540
    28  AppKit                              0x00007fff94465df2 -[NSApplication run] + 796
    29  AppKit                              0x00007fff9442f368 NSApplicationMain + 1176
    30  ProfileCreator                      0x0000000100033492 main + 34
    31  libdyld.dylib                       0x00007fff9532d5ad start + 1
    32  ???                                 0x0000000000000003 0x0 + 3
)

Profile Preview

Implement the profile preview in the main window.

This view will contain a preview of the selected profiles settings, payloads and possible errors to be corrected.

Currently the place for the preview only shows "x profile selected".

External dependencies should use subtree instead of submodule

Hello

Regarding third part project used in your code, you should use git subtree instead of submodule to simplify the source management

http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/

subtree is appropriate to import a required third part repo into a specific project.
submodule is made to make inclusion of specific part of code optional. Imagine you're working on a big project with client, server and lib, you might not want to clone everything when you code but still have a centralized repo with everything read for build.

JSS API Connection

A feature to add a JSS, and through the API download, edit and upload profiles would be really useful.

Profile name default value in new profile

The default profile name displayed when creating a new profile should be displayed as a placeholder instead of a real content.

(plus instead of "Untitled Profile..." it should be "Untitled Profile…" since … is a specific char and not just three dot)

pfm_value_placeholder only supports string

When attempting to create a manifest with a placeholder value as an integer ProfileCreator will use the value of 1 instead of my placeholder. This works with string but pfm_value_placeholder needs to match pfm_type from my tests.

Pretty low priority issue but it can be replicated with the following using 0.1 beta3 of ProfileCreator.

<dict>
    <key>pfm_app_min</key>
    <string>3.0.0</string>
    <key>pfm_default</key>
    <true/>
    <key>pfm_description</key>
    <string>Change how often the Microsoft AutoUpdate daemon will look for updates. The default is 720 minutes (12 hrs). By reducing this value MAU will look for updates sooner.</string>
    <key>pfm_name</key>
    <string>UpdateCheckFrequency</string>
    <key>pfm_title</key>
    <string>Update check frequency</string>
    <key>pfm_type</key>
    <string>integer</string>
    <key>pfm_value_placeholder</key>
    <integer>720</integer>
</dict>

screen shot 2018-07-19 at 9 46 20 am

Add basic accessory view on export

When exporting profiles, the user should get a view inspecting the settings for the profile being exported, and in the cases it's possible, allow the user to override them.

For example, scope, organization, distribution method etc.

Implement scope, distribution and supervised settings for profile

User should be able to specify the scope, distribution and if the profile should show "supervised" keys, which then would make the interface only show payload keys and types that are valid for that setting.

The ui for that settings is currently active in the settings popover, but not implemented.

Have all manifest content dict cell types conform to the PFCCellTypeProtocol

All content dictionary celltypes need to conform to the protocol before the application can be released.

They all need to conform to:

  • populateCellView... (What's shown in the UI)
  • verifyCellType... (If there are any errors, required fields etc.)
  • createPayloadForCellType... (Export correct payload key and value)
  • lintReportForManifestContentDict... (Not really required but extremely encouraged.)

CellType Progress:

  • Checkbox
  • DatePicker
  • DatePickerNoTitle
  • File
  • PopUpButton
  • PopUpButtonLeft
  • RadioButton
  • SegmentedControl
  • TableView
    • TableViewCheckbox
    • TableViewPopUpButton
    • TableViewTextField
    • TableViewTextFieldNumber
  • TextField
  • TextFieldCheckbox
  • TextFieldDaysHoursNoTitle
  • TextFieldHostPort
  • TextFieldHostPortCheckbox
  • TextFieldNumber
  • TextFieldNumberLeft
  • TextLabel
  • TextView

Implement Payload Library Filter

The filer search field in the editor library view is currently not connected to anything.

This will have to be implemented.

In the proof of concept application, this field also stored the searches between all libraries, this is what needs to be done when implemented.

When basic string matching is done, options to search for other things should be available, like searching for specific keys, and or combinations.

Automatically increment the payload version if settings have changed

On export, if the profile have been exported before, add a feature to automatically increment the payload version if the payload have changed.

This should possibly be a setting per payload, also an override on export to not do that when testing.

The implementation might be a hash of the settings on export, connected to the version. Then, on next export, compare hashes and if they differ, increment the version number if not overridden.

Tab highlighting under Applications

I noticed that when switching through the tabs under the Applications (Munki, NoMAD) that "General" remains depressed/highlighted even when other tabs are selected. In the case of this screenshot I have the "Log" tab selected. This is running on macOS 10.12.6.

Munki options

Implement "Smart Groups"

The "Smart Group" is supposed to work like smart folders in mail etc. where it's a set of criteria where any profile that matches will be included in the group automatically. Works like a static search.

The Group Interface item is implemented, but not the functionality.

Implement "Search" in Main Window

The search field in the Main Window is not connected to an actual search method. This will need to be implemented.

Considerations have to be take to how this should be done effectively, as currently the profile table view array is just a UUID-list and when a profile is selected or edited, it's fetched from the profile library class.

The search would have to search in the library class to get the actual values. Another issue with that is that settings are stored as the indetifier, UUID, and not a value, so searches or smart groups that want to find all profilest with value x for key y would need to retrieve that information in a possibly costly operation. This needs thought and testing.

Prompts for keychain access as soon as app is launched

The prompt for keychain access comes out of nowhere and may confuse users who don't connect the "need keychain access to sign things" with the prompt right away. It should only pop up when actually trying to sign a profile for the first time, or when selecting the signing certificate in preferences. Perhaps when setting your certificate in preferences, the UI could be a button to load available certificates that triggers the prompt the first time (or successive times if the user doesn't click Always Allow)?

Mark sensitive fields, like passwords, to identify how they should be stored.

Currently all settings are stored in the plain text plist template format.

This is not ideal for profiles containing payload keys with sensitive information like preshared keys, passwords etc.

These fields should be marked in the framework, and then display a UI warning that they will be saved in plain text.

Later, when an application keychain is implemented, this marking will be used to determine what settings should be stored there.

Feature Idea: Search and Import Community maintained Profiles

One of the things that make autopkg great is the way it allows individuals to commit their own recipes (and find recipes of others) without having to change the app itself. I don't know how hard this would be to achieve in swift, but have you thought of a way users can maintain their own profiles and offer them to the community?

Let's use menu.nomad.login.ad as an example. Maybe users could subscribe to a repo containing the profile and every time a new key is added, ProfileCreator would detect the change and update the reference in the app.

I'm aware that this would add some complexity, but it would allow ProfileCreator to focus on a set of core profiles to maintain (probably the macOS/iOS ones) vs patching every change in every supported profile.

No focus ring on "No Payloads" view in payload library

When no payload is present in the payload library, the "No Payloads" view is shown.

If you drag a payload from the profiles part back down on the library part, no focus ring is shown when hovering that view. This should be fixed.

Edit Profile button in Toolbar

Currently, the only way to edit a profile is by double-click.

Should add an edit button beside the create button. As well as an edit menu item in the application menu.

Profile Configuration Error

Implement visual and descriptive error when a profile contains error in the configuration.

Examples:

  • Missing a required field.
  • Invalid input in a field, not matching requirements.
  • Mismatching scope/distribution/platform in selected payloads.
  • etc.

Verify export from OS X payloads match profile manager export.

Need to verify all fields export correctly.

OS X Only Payloads

  • AD Certificate
  • Accessibility
  • Directory
  • Dock
  • Energy Saver
  • Finder
  • Identification
  • Login Items
  • Login Window
  • Messages
  • Mobility
  • Parental Controls
  • Printing
  • Proxies
  • Restrictions
  • Security & Privacy
  • Software Update
  • Time Machine
  • Xsan

Make the profile editor "Settings" button a toggle

Currently, the button "Settings" opens the settings view.

But it doesn't remember where you were editing before, so you would have to click in the library list again to get back. A good feature should be to make the settings button a toggle instead to be able to just bring up the settings and change a thing and dismiss them without leaving your place in the app.

The settings button might not be logical in it's currently implementation and might change to just a menu item, or move etc.

Also the settings view, if it will be made just a quick view to put "over" the profile editor, that might change it's looks to be more like a sheet that's not attached to the window top. This is just speculations so I've saved them somewhere.

Implement MCX Parser

Create a parser to handle MCX settings to Profile Manifest and Settings.

Should handle both server and local if there are any differences.

When looking at ManagedClient.app, the manifests included there doesn't cover all of MCX, so my first idea of just parsing the manifests wont work. Need to create static manifests for the MCX settings.

Implement single payload key enable/disable

Need to add the enable/disable checkbox for single payload keys to allow user to select only the keys he/she want's to use in the profile.

The enable/disable checkbox is currently greyed out in the settings popover.

This is useful for the "standard" mode of operation, and in the additive custom state it won't be used where you start empty and only add what you need.

Profile Setting: Signing

There need to be an option for signing the profiles on export.

This setting should have a default in the application preferences with a default selected signing certificate. An option in the editor to set per profile, and then an override option on export to change or verify the certificate used and to check/uncheck that a profile should be signed.

Banner settings not saving value

When attempting to add the banner message to the login window payload, the values entered are not being saved. It seems to be removing the values whenever another option is selected. I also noticed that no values are being moved over to the xml view.

Add Payload Library: MCX

The old MCX settings are still relevant in profile format, but not all are converted by Apple.

This means a new library with all MCX-settings need to be added.

Application Keychain

There is a need to store sensitive information in a secure way, and an application keychain should be a good implementation where all fields marked as sensitive in some way will store their settings.

Enable Localization

Enable the localization strings files throughout the application.

Most UI strings use the LocalizedStrings macro, but the application need to be checkd again, and the strings files need to be created.

Also, the how the localization extends into the framework will have to be verified and implemented.

Implement "Server MCX" to see all currently configured MCX settings in an Open Directory

This list will be added to the new group type in the main window along with Installed Profiles.

Idea is to be able to see currently configured MCX settings in selected Open Directory and export them as profiles.

In the Application Preferences I've added Open Directory connection settings that work and can connect and get all MCX-settings. No MCX parser has been created.

Duplicate option for profiles

A way to duplicate a profile should be added to the application menu, and possible the future right-click contextual menu to allow a profile with all it's settings to be duplicated.

Implement "Sorting" in the Main Window profile table view.

The Main Window has a sorting interface item (PopUp Button) in place, but no method attahed. Currently the main window profile table view doesn't handle any sorting.

Will have to define and implement sorting, like Mail.app where you can select on what to sort, and either ascending or descending.

Clicking "Save" has no visible action

When you click save on the profile creation window, the profile is saved in the background but there's no visible action taken (i.e. window close)

Implement all Profile Manager payload collections.

All payload collections from Profile Manager and Apple Configurator 2 are going to be added.

This issue will keep track of those implemented and the ones remaining.

The order in which these are being implemented is up to requests. If you want to see a specific payload collection sooner, please comment here and I'll prioritize it higher. Else, I will add those I think are most useful to the most people first.

Payload collections only targeting iOS will not be prioritized, unless there is a demand. I assume profiles for macOS will be more relevant for administrators using this tool.

Those with parenthesis show if the payload collection only targets a single platform.

Custom Settings is not included here, as that is will be implemented in an entirely separate part of the application.

If you see any errors or payload collections missing, please comment and I'll update the list.

Completed

  • Certificates
  • Passcode

Working On

Empty

Remaining

  • AD Certificate (macOS)
  • Accessibility (macOS)
  • AirPlay
  • AirPrint (iOS)
  • App Configuration (iOS)
  • Calendar
  • Cellular (iOS)
  • Contacts
  • Content Filter (iOS)
  • Directory (macOS)
  • Dock (macOS)
  • Domains (iOS)
  • Energy Saver (macOS)
  • Exchange
  • Finder (macOS)
  • Fonts
  • General
  • Global HTTP Proxy (iOS)
  • Google Account
  • Home Screen Layout (iOS)
  • Identification (macOS)
  • LDAP
  • Lock Screen Message (iOS)
  • Login Items (macOS)
  • Login Window (macOS)
  • macOS Server Account (iOS)
  • Mail
  • Mobility (macOS)
  • Network
  • Network Usage Rules (iOS)
  • Notifications (iOS)
  • Parental Controls (macOS)
  • Printing (macOS)
  • Proxies (macOS)
  • Restrictions (iOS)
  • Restrictions (macOS)
  • Security & Privacy (macOS)
  • SCEP
  • Single App Mode (iOS)
  • Single Sign-On (iOS)
  • Software Update (macOS)
  • Subscribed Calendars (iOS)
  • Time Machine (macOS)
  • VPN
  • Web Clips
  • Wi-Fi
  • Xsan (macOS)

Multiple Payloads

Implement adding multiple payloads for the payload types that allow it.

This is a basic feature, will be implemented pretty soon.

Smartcard Profile - Enable Certificate Trust Validation

In the app there is only enable/disable for checkCertificateTrust. The value for this key should be an integer:

0 certificate trust check is turned off
1 certificate trust check is turned on
2 certificate trust check is turned on and revocation check is set to the soft level
3 certificate trust check is turned on and revocation check is set to the hard level

Add all OS X Only Payloads from Profile Manager.

For first release only include the os x only payloads.

NOTE: Will not include the custom settings payload, that will be added separately.

OS X Only Payloads

  • Identification
  • Restrictions
  • Security & Privacy
  • AD Certificate
  • Directory
  • Login Window
  • Login Items
  • Messages
  • Mobility
  • Dock
  • Software Update
  • Printing
  • Energy Saver
  • Parental Controls
  • Time Machine
  • Finder
  • Accessibility
  • Xsan
  • Proxies

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.