Git Product home page Git Product logo

overshare-kit's Introduction

OvershareKit

A soup-to-nuts sharing library for iOS.

NOTA BENE: OVERSHAREKIT IS NO LONGER UNDER ACTIVE DEVELOPMENT. SEE http://blog.jaredsinclair.com/post/90064823470/oversharekit-to-be-maintenance-only-for-ios-8

Table of Contents

Why OvershareKit?

Sharing is far too cumbersome to implement on iOS. UIActivityViewController is too limiting, and rolling your own library is too time-consuming. Most devs end up settling for underwhelming sharing options for lack of the time or inclination to make something better.

OvershareKit makes it trivial to add rich sharing options to your iOS apps. In a word, OvershareKit has everything:

  • Beautiful share sheets with pixel-perfect, full-color icons in a simple layout.

  • Lots of tweakable options, including a gorgeous dark mode.

  • Built-in integration with iOS Twitter and Facebook accounts.

  • Built-in integration with popular third-party services like App.net, Instapaper, and more.

  • Complete multi-account management, including authentication and storing credentials securely in the Keychain.

  • Killer text editing views with as-you-type Twitter syntax highlighting, Riposte-style swipe gesture cursor navigation, and automatic smart quotes.

Screenshot

Pull Requests and New Features

We happily accept any pull request that adds meaningful value for the OvershareKit community. Bug fixes can be submitted on any branch, but significant changes and new features must be submitted on the dev branch for wider testing and review. Our day-to-day work is done on the dev branch. Watch the dev branch for an idea of what’s coming.

OvershareKit also has a public Pivotal Tracker project available here.

How to Use OvershareKit

OvershareKit is designed to be dead simple for the easy cases, while still being flexible enough to scale up to more complex needs, and without breaking inbetween.

After including OvershareKit in your Xcode project (see the detailed requirements below), the steps to get started couldn't be easier:

  1. Create an instance of OSKShareableContent, ideally via one of the convenient class-level constructors like contentFromURL:

  2. Pass that shareable content to the OSKPresentationManager via one of the presentActivitySheetForContent: methods.

  3. There is no step 3.

OvershareKit Versus UIActivityViewController

We are frequently asked why someone would use OvershareKit instead of UIActivityViewController (UIAVC) and UIActivity. UIAVC is great for apps that know they’ll never have a need for any of the following:

  1. Never need to integrate with more than one or two third party services.
  2. Never need to tweak the UI for the activity sheet and sharing screens.
  3. Never care to provide separate, media-specific content for each sharing type (email versus SMS, etc.)
  4. Never need to have multiple items such as a Copy Text versus a Copy Link in the same sheet.
  5. Don't mind that all non-system-provided activities get stuck with boring monochromatic icons.

Many apps can't fit comfortably within those restrictions, which is why we made OvershareKit.

The most important difference between UIAVC and OvershareKit is in how content is structured. UIAVC uses unstructured arrays of content (which contain one or more of a grab-bag of objects, usually strings, images and URLs). UIAVC lets each UIActivity decide which of these objects, if any, it will act upon and how. The shortcoming of this API design is that activities don't know anything about the context in which a sharing session is taking place. For example, the formatting for an email message generated from an Instagram post should look very different from an email generated from an RSS article. But with UIAVC, there's no easy way to communicate that context. Most crucially, it is impossible to do this using UIAVC without providing substitutes for the system-provided mail activities.

Activities should not be given that much responsibility over content. The content should be ready to consume before it is handed to an activity. Furthermore, the content should be formatted in a manner that is appropriate to each type of activity.

This is why OvershareKit uses an instance of OSKShareableContent that bristles with many flavors of OSKShareableContentItem. This API design allows the part of your app that has knowledge of context to prepare all the various types of OSKShareableContentItems before handing it off to an OvershareKit sharing session. This results in a more satisfying sharing experience for the user, and less overall hassle for the developer.

Architecture

OvershareKit has lots of classes, but here are the main players:

  • OSKPresentationManager: This singleton instance manages the user-interface layers of OvershareKit. It's the class you access to present activity sheets (share sheets). It's also how you can customize the UI of OvershareKit, via four delegates, each for different customization purposes: a style delegate, a color delegate, a localization delegate, and a view controller delegate. If you already like the default look & feel of OvershareKit, you probably won't need to implement any of these delegates.

  • OSKActivitiesManager: This singleton instance handles model level logic around sharing activities. Unless you're writing your own view controllers, you probably won't need to access this class much (except to provide application-specific third-party credentials, see Authentication section below).

  • OSKActivity: This semi-abstract base class is the heart and soul of OvershareKit. All sharing activities inherit from it. OvershareKit comes with lots of built-in subclasses of OSKActivity. You can easily write your own subclasses, too. Activities provide important information about how they perform their tasks via lots of required methods.

  • OSKShareableContent: is the highest-level OvershareKit model object for passing around shareable content. It's sole purpose is to bristle with subclasses of OSKShareableContentItem, making it easy to pass many flavors of content in a single method argument.

  • OSKShareableContentItem: represents the user's data in a structured, readable, portable way. It is an abstract base class with many subclasses. Because each kind of OSKActivity requires different bits of data and metadata, there is an OSKShareableContentItem subclass for each conceivable type of activity. Think of OSKShareableContentItem like UINavigationItem or UITabBarItem. Navigation controllers and tab bar controllers use those items to keep title and toolbar item changes in sync with child view controller changes. It’s a convenient paradigm that is useful for our purposes, too. OSKShareableContent (see above) has many OSKShareableContentItem subclass properties like emailItem, microblogPostItem, webBrowserItem, etc.

  • OSKManagedAccount: Third-party accounts (like App.net accounts) are represented in OvershareKit by instances of OSKManagedAccount. OvershareKit manages the creation, authentication, and storage of these accounts. This class is not intended to be subclassed. OvershareKit does not create managed accounts for services that are managed at the system level (i.e. Twitter or Facebook).

  • OSKManagedAccountStore: This singleton instance manages storing and organizing all the OSKManagedAccounts for activities tied to third-party services.

  • OSKSystemAccountStore: This singleton instance manages access to system-level accounts like Twitter and Facebook.

Authentication

For the most part, OvershareKit will handle all aspects of authentication by itself. There are several crucial exceptions to this which every app will need to be configured to handle:

Application-Specific Credentials

Some third-party services require application-specific credentials in order to authenticate user actions. The sample app that ships with OvershareKit has been configured to use some test app credentials if the compiler flag for DEBUG is set to 1.

You must not ship OvershareKit's test credentials in a production application. They may be revoked at any time. We will not be responsible for any consequences if that happens. Please see the next several paragraphs for more information on setting up application credentials.

You can provide your app's credentials via the customizationsDelegate property of OSKActivitiesManager. These credentials are represented by instances of OSKApplicationCredential.

The list of services currently requiring application credentials are:

  • App.net: App.net posting requires an application ID. Visit http://developers.app.net for more information. You will need to create a developer-tier account to register your app (currently $99 USD per year). Don't forget: registering your app with App.net may also entitle you to participate in the Developer Incentive Program ($$$). Contact App.net for more information. You will also need to register the default redirect URI for OvershareKit: http://localhost:8000. The other app-specific details they require (like a bundle identifier) are unique to your registered application. Note: if you want your users to also be able to sign in via the App.net Passport application, you'll need to follow App.net's instructions for setting up a custom URL scheme.

  • Pocket: Visit http://getpocket.com/developer/ for more information. In addition to registering your app, you'll need to follow their instructions for setting up a custom URL scheme, including downloading the Pocket iOS SDK. There is no way to sign into Pocket without setting up this URL scheme.

  • Facebook: The iOS authentication requirements for Facebook include passing an application ID. Register your app at http://developers.facebook.com/.

  • Readability: You'll need to obtain an application key and secret by registering your app via a new developer account. Visit http://www.readability.com for more information.

  • Google Plus: You'll need to obtain an application key by registering your app with Google Plus.

If you have any questions about this setup process, don’t hesitate to ask.

URL Schemes

  • App.net Passport: The App.net Passport app allows users to sign in without having to type their username and password. This option is automatically enabled by OvershareKit whenever the application is installed. You will need to include the App.net Login SDK in your project. You'll also need to set up a custom URL scheme according to App.net's instructions in order for this method to function properly. If you don't set up the URL scheme, users will be prompted to sign in via OvershareKit's web view.

  • Pocket: Pocket authentication requires setting up a custom URL scheme according to their instructions. You'll also need to include the Pocket-iOS-SDK to enable Pocket sign-in.

Dependencies

OvershareKit is almost entirely a standalone library. All of its categories and classes have been properly namespaced with the OSK prefix to avoid collisions.

There are two required external libraries, which are included as git submodules in the Depedencies directory:

The Google Plus framework in the Dependencies directory is not a submodule.

In-App Purchases

You can optionally configure certain activity types to require in-app purchase. OvershareKit does not handle purchasing or receipt validation, but it does handle the logic around presenting your custom purchasing view controller at the appropriate time. OvershareKit will even badge the activity icons with cute little price tags when they have not yet been purchased. See the header files for OSKActivitiesManager and OSKPurchasingViewController for more details.

So Much More

There’s a ton of stuff to work with in OvershareKit. All of the major and many of the minor classes have been documented with appledoc syntax. More documentation is coming. If you have questions, please reach out to us.

Contributors

Jared Sinclair

Jared Sinclair

Primary Author and API Design
Twitter: @jaredsinclair
App.net: @jaredsinclair

Jared is an independent iOS app designer and developer. He makes apps like Unread an RSS Reader and Riposte for App.net.

Justin Williams

Justin Williams

API Design & iOS Account Integration
Twitter: @justin
App.net: @justin

Justin is an independent iOS and Mac app developer at Second Gear. He is a frequent public speaker at tech events.

Apps Using OvershareKit

Recent additions are at the top of the list.

Cardasee
Modern Quick Notes.
Website | App Store

nvNotes
The professional Note-taking App that allows you to focus on writing.
Website | App Store

Unread
An RSS Reader
By Jared Sinclair
Website | App Store

Redd
A Reddit client for iOS 7.
By Craig Merchant
Website | App Store

Sunlit
Shared photos and stories, built with App.net.
By Manton Reece and Jonathan Hays
Website | App Store

App.net - Broadcast With Push
Never miss important news again with App.net Broadcast.
By App.net
Website | App Store

Attributions

OvershareKit contains portions of other open-source code, either verbatim or (more commonly) with some pruning and refactoring. The following projects were immensely helpful:

  • DerpKit: By Steve Streza. Objective-C categories and subclasses of things that should be in Foundation and other frameworks On GitHub

  • AFNetworking: By Mattt Thompson. A delightful iOS and OS X networking framework. On GitHub

  • UIColor-Utilities: By Erica Sadun. Helpful utilities for UIColor for iPhone. On GitHub

  • TwitterText: By Twitter. An Objective-C implementation of Twitter's text processing library On GitHub

  • Gist 1102091: By Ole Zorn. Creating arbitrarily-colored icons from a black-with-alpha master image (iOS). On GitHub

  • UIDevice-Hardware: By InderKumarRathmore. This category helps to check the hardware version[s] of [iOS devices]. On GitHub

  • RPSTPasswordManagementAppService: By Riposte LLC. An iOS utility class for launching 1Password via URL schemes. On GitHub

License

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

overshare-kit's People

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

overshare-kit's Issues

Facebook sharing fails in sample app

When I try to share to Facebook in the sample app, a dialog pops up that says "Couldn't Access Your Accounts" and "You have previously denied this app access to your accounts. Please head to the Settings app's Privacy options to enable sharing". I have recently installed the Facebook app, and I did not deny it access to my accounts. It never even asked for access. There is also nothing in the Privacy section of the Settings app that allows me to give the app access to my accounts.

Ability to use existing keychain data for third party authentication

I've already rolled my own authentication in my app for Instapaper, Readability, and Pocket, and want to continue to let users use these services without having to re-login. It would be great if I could pass one of my classes as a authentication manager delegate (?), so that I could provide OvershareKit with the credentials that I already have stored.

Sample app fails to build

When I try to build the sample app, I get the following build error. Perhaps this is related to commit d5655fd.

Undefined symbols for architecture armv7:
"OBJC_CLASS$_OSKSaveToCameraRollActivity", referenced from:
objc-class-ref in OSKActivitiesManager.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

"Application-Specific Credentials" document not specific enough (maybe?)

Here's the confusing part: (maybe only I was confused)
"Facebook: The iOS authentication requirements for Facebook include passing an application ID. Register your app at http://developers.facebook.com/."

I've registered my Facebook App and got and App Id. However I don't know how to pass this App Id to OvershareKit.

I've tried change the demo's bundle id to mine, and it doesn't work, showing error like this:
facebook remote_app_id does not match stored id.

Maybe this is more of an ask for help than a bug report, am I doing something wrong?

customizationsDelegate is released after presenting Activity Sheet

Sorry for the tweet spam. I realized I should just write up an issue.

I'm setting my customizationsDelegate with my Facebook API key before presenting the activity sheet via the Presentation Manager and what I'm seeing is that the customizationDelegate is acknowledged to show the Facebook activity itself but when the user clicks on the Facebook activity as if to share to it, when it comes time to call up on the customizationsDelegate again to get that Facebook API Key , the customizationsDelegate has been released already (weak delegate property).

I fixed this of course by making the property strong but I realize delegate properties are supposed to be weak so I'm not sure what a better workaround is.

Animation Timing Doesn't Feel Like Native iOS

The animation timing for the OSK menu doesn't feel like it has the same timing that other transitions in iOS 7 do. For me, this makes OSK feel a bit less integrated. Is this something that can be changed?

Sorting activity

Depending on the context of the app could be important to specify the order of the activity displayed.
Is there a way to do that ?

Email Share Generates Service Termination Error on iOS 8

When using email share activity, the view service terminates when running on iOS 8. Error below.

2014-09-11 22:41:14.717 Overshare[32357:646951] viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)" UserInfo=0x7fcbf957a690 {Message=Service Connection Interrupted}
2014-09-11 22:41:25.702 Overshare[32357:647590] <MFMailComposeRemoteViewController: 0x7fcbf9576f50> timed out waiting for fence barrier from com.apple.MailCompositionService

Presenting view controller from activity

I'm working on Evernote activity with generic authentication. SDK Evernote have method for authentication:
-authenticateWithViewController:(*UIViewController) completionHandler:^(NSError *error)
How i can create view controller, pass to method and present it without appDelegate?

Sorry for my english.

Add Cocoapods podspec

Hi, thanks for a great project!

Would you consider adding Overshare to Cocoapods? You could use subspecs to allow the developer to conditionally require one, both, or neither of the ADN and Pocket SDKs.

Skipping built in Activity Sheet

Hello,

I am attempting to skip the built in Activity Sheet as currently my app only has a limited selection of sharing options, but will be expanding in the future. So, for now, I am going to use a couple buttons to trigger sharing to specific services.

My question is that I found the code block below in OSKPresentationManager, but I'm not sure how to create an activity such as OSKFacebookActivity (or another) myself.

/**
 Use this method to skip the activity sheet view controller and proceed straight to the built-in flow 
 through purchasing, authentication, and publishing view controllers.

 This method is for applications that wish to present their own activity sheet UI, but still wish
 to use Overshare Kit for all the other view controllers & logic.

 @param activity The user's selected activity. It's up to you to create & obtain this activity.

 @param presentingViewController The view controller from which OSK will present it's view controllers.

 @param options A dictionary of options. The accepted keys are `OSKPresentationOption_ActivityCompletionHandler` 
 and `OSKPresentationOption_PresentationEndingHandler`.
 */
- (void)beginSessionWithSelectedActivity:(OSKActivity *)activity
                presentingViewController:(UIViewController *)presentingViewController
                                 options:(NSDictionary *)options;

Does the OSKActivitiesManager need to be used, and the appropriate activity picked out of the array returned by

- (NSArray *)validActivitiesForContent:(OSKShareableContent *)content options:(NSDictionary *)options;

?

Is there another way to create a specific activity and activity specific content?

Thank you for your time.

Add pinterest support

Pinterest support would be great but I know their current iOS SDK is not so great as of yet. Still figured this was worth putting a placeholder in for

Presentation for iPad as iPhone

Firstly , thank you for sharing us this awesome source.
how can I implement the presentation for iPad as iPhone view not as popover

thank you

Xamarin bindings

It would be super nice with bindings/dll for Xamarin/MonoTouch

Instagram support

I see that Instagram is there as a URLScheme type but the implementation is not there yet. I'm wondering if Instagram support is in the works or not.

Implemented Sina Weibo and Tencent Weibo activities

I implemented Sina Weibo and Tencent Weibo activities in the master branch of my fork.

They are very similar to twitter: use the iOS system accounts, are limited to 140 characters and support up to one image. Note that Tencent Weibo needs an App Key but I am not providing any example one (Tencent Weibo made it more difficult to get app keys outside Chine since I got mine).

If my Tumblr activity pull request gets merged, I'll submit a new one for this.

Many instances of 'release' and 'retain' (pre-ARC) and other errors

I know this was written pre-ARC and I'm getting dozens of errors on 'release', 'retain', and 'autorelease'. I'm also getting a bunch of casting errors that I'm doing my best to fix. I've only been developing in xcode for a few months so this activity is very difficult for me.

MPMoviePlayerThumbnailImageKey GooglePlus error

I'm using OvershareKit form CocoaPods, and starting today, I'm getting this error when building:

(null): "_MPMoviePlayerThumbnailImageKey", referenced from:

(null): -[GPPMediaPreviewView thumbnailImageRequestDidFinish:] in GooglePlus(GPPMediaPreviewView.o)

(null): "_MPMoviePlayerThumbnailImageRequestDidFinishNotification", referenced from:

(null): -[GPPMediaPreviewView initWithFrame:mediaAttachment:] in GooglePlus(GPPMediaPreviewView.o)

(null): -[GPPMediaPreviewView thumbnailImageRequestDidFinish:] in GooglePlus(GPPMediaPreviewView.o)

(null): "_OBJC_CLASS_$_MPMoviePlayerController", referenced from:

Since it has something to do with GooglePlus, I'm guessing it's related to OvershareKit

Undefined symbols for architecture x86_64 - GooglePlus

After installing with Cocoapods, is there another step? This is the error I am getting:

    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_GPPShare", referenced from:
          objc-class-ref in libPods.a(OSKGooglePlusActivity.o)
      "_OBJC_CLASS_$_GPPSignIn", referenced from:
          objc-class-ref in libPods.a(OSKGooglePlusActivity.o)
      "_kGTLAuthScopePlusLogin", referenced from:
          -[OSKGooglePlusActivity authenticate:] in libPods.a(OSKGooglePlusActivity.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

Crash in OSKCopyToPasteboardActivity when copy image

Here the self.pasteboardItem.text is nil and it crashes

  • (void)performActivity:(OSKActivityCompletionHandler)completion {
    [[UIPasteboard generalPasteboard] setString:self.pasteboardItem.text];
    if (completion) {
    completion(self, YES, nil);
    }
    }

Documentation regarding installation

Hi,

The docs read: "After including OvershareKit in your Xcode project (see the detailed requirements below), the steps to get started couldn't be easier:"

There are no 'detailed requirements' listed below and I'm having trouble integrating the library into a project.

Email default appearance

Apple requires that emails follow the standard iOS look and feel. When customising your app appearance (together with overshare-kit), it changes the headers and other fields of emails, making it non-standard.

To get past this, I had to reset appearance to standards before sharing via email, and set it back afterwards. It took a lot of fiddling to get it right.

This issue is not specific to overshare-kit, but I think it would be great to support this behaviour right inside it, since email is usually invoked via sharing.

Smart quotes curled the wrong way

Tried out the as-you-type quote smartener in Sunlit. Please forgive me if the following is a bug only in Sunlit but not in OvershareKit.

If you type an "opening" punctuation character -- think: ( { [ -- and then type a single or double quote, OSK will give you a closing quote, but clearly should give you an opening quote.

In the case where you type a quote immediately after a quote:

  1. If you type two of the same quotes (double-quote double-quote, or single- single), you should get an opener then a closer. OSK does this correctly.
  2. If you type two different quotes in succession (double- single-, or single- double), you should get two opening quotes, because the user is likely writing a quote of a quote. OSK gets this wrong -- it always closes the second quote.

Unable to submit apps due to GooglePlus framework causing validation errors

It's currently impossible to submit to the app store due to validation failures.

Google has updated their API to resolve the issue, but due to the fact that the project includes the source of a much older version of the library it still fails.

Is there a specific reason that the source for GooglePlus is included in project instead of just relying on cocoa pods to pull it down?

[OSKFacebookPostContentItem] More options for a Facebook Share.

A Facebook Share should be able to have a link (which will result in a link box attached below the status on Facebook).

Also posts on Facebook support a lot more meta data.. that should be reflected in Overshare. I would recommend a type called OSKFacebookPostContentItem which has all specific Facebook parameters.

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.