GithubHelp home page GithubHelp logo

iamantoniodinuzzo / cinemates Goto Github PK

View Code? Open in Web Editor NEW
15.0 2.0 3.0 63.89 MB

CineMates is a modern android application for movie fans in which you will be able to search for movies and consult information provided by The Movie DB.

License: GNU General Public License v3.0

Java 0.38% Kotlin 99.62%
viewbinding databinding jetpack-navigation viewpager2 themoviedb-api retrofit mvvm-architecture viewmodel youtube-api dagger-hilt

cinemates's Introduction

CineMates [⚒ Work in progress on develop ⚒]

GitHub last commit Contributors Forks Stargazers Issues MIT License

CineMates Logo

🔎 Project Overview

The application is still in its initial state, lacking all the necessary tests to make it a secure and stable application.

The purpose of this application is to provide the user with a tool to track down all information regarding movies and TV series.

The project is constantly changing as a personal gym in Android development.

🗝 API Key.

Find a file called local.properties in the .gradle file in the home directory.

  • Add TMDB_API_KEY = "YOUR-API-KEY" (The API of The Movie DB obtainable here)

👨‍💻 What I learned.

  • Retrieve data from the Internet with Retrofit and the API of TheMovieDB
  • Use ListAdapters and DiffUtil
  • Use the MVVM pattern
  • Incorporate data binding and view binding
  • Use the Navigation, ViewPager2 component.
  • Flow and MutableStateFlow
  • Use Dagger Hilt for dependency injection.
  • Clean Architecture
  • Create unique customize views to reduce boilerplate code
  • Version Catalogue

📽 Screenshots

Home Movie details Actor details Tv Details Search

🤝 Contributing

Feel free to open an Issues or submit a Pull requests for any bugs/enhancement.

If you have 💡 ideas 💡 you can submit them here.

📚 Libraries

Personal

cinemates's People

Contributors

dependabot[bot] avatar iamantoniodinuzzo avatar jxareas avatar

Stargazers

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

Watchers

 avatar  avatar

cinemates's Issues

Smooth & Refactor Animations

Even though Cinemates does have animations based in the Material Motion framework (mainly in the top level destinations) that help provide a better user experience, there are still some abrupt transitions, such as:

  • The re-enter transition in the DiscoverFragment (when navigating back from SearchFragment / FilterFragment)
  • The visibility of the clean/apply buttons (as well, in the DiscoverFragment).
  • The transition from DiscoverFragment to FilterFragment

These are transitions that could be smoothened so as to provide a more pleasant and sleek interaction, as aforementioned. Any other animation that could be possibly refactored might be mentioned here, as I'll take on this issue.

Single Activity Structure

Rimuovere le activity eccetto per la MainActivity logicamente, e fare in modo di gestire tutto tramite fragment

From Filter to a List

Is your feature request related to a problem? Please describe.

A user from the Discovery screen can create custom filters and retrieve a set of movies or TV series that meet these parameters. The user must be able to create from the results of this filter, a list containing all the movies that are the subject of this result

Describe alternatives you have considered.

No response

Additional Context

No response

Generalize info sections

Is there a project named like this repo?

  • I have searched

Is your feature request related to a problem? Please describe.

image
As you can see from the image, there is a repetition of the same design thus composed:

<androidx.appcompat.widget.LinearLayoutCompat
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:orientation="horizontal"
                       android:weightSum="100">

                       <TextView
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content"
                           android:layout_weight="50"
                           tools:text="Title"
                           android:textColor="@color/geyser"
                           android:textSize="14sp"
                           android:textStyle="bold" />

                       <TextView
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content"
                           android:layout_weight="50"
                           android:textColor="@color/alabaster"
                           android:textSize="14sp"
                           tools:text="Sample value" />
                   </androidx.appcompat.widget.LinearLayoutCompat>

This design is also repeated in FragmentMovieInfo so it would be good to generalize it

Describe alternatives you have considered.

No response

Additional Context

No response

Trailer video in MovieDetails

When a movie has a trailer, it should to be into a recycler view but, it's appear when we selected another movie details.

So if I clicked on "American psycho" it has a trailer but it's not into rcv. If I click into similar recyclerview and open another movie detail page, it shows a trailer but it's American psycho trailer.

Conversion to Kotlin

To facilitate the use of the latest technologies and methodologies, I decided to switch to using Kotlin

Fix Images Page in `MovieDetailsFragment` ViewPager

When visiting several movies, the images of the latest movies are appended at the end, which is not the intended behavior, as can be evidenced by the following recording:

Screen_Recording_20221020_163511_CineMates.mp4

Show more on home screen

On the home screen, when the various sections appear, you can expand a section into a bottom sheet, so as to display more movies per column

Better search design

Is there a project named like this repo?

  • I have searched

Is your feature request related to a problem? Please describe.

It would be good if the user could already enter the query in the HomeFragment without having to move to another screen.

A user should be able to have in the toolbar of the home screen, a box in which they can enter the query. Once the user confirms the query, the screen changes and transfers the search to the appropriate SearchFragment.

In this case the bottombar icon to access the DiscoverFragment should change and be meaningful.

Describe alternatives you have considered.

No response

Additional Context

No response

Actor details and biography

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

On an actor's details page, when you have a very long bio, it's hard to scroll down to read it all because of the CollapsingToolbar trying to close, making it very difficult (impossible) to keep it from closing.

Expected Behavior

The user must be able to read the biography of an actor without having difficulty and without the CollapsingToolbar trying to close

Steps To Reproduce

  1. Select an actor from the main screen or from any movie
  2. Expand the biography text
  3. Try to scroll down to read the biography

Relevant log output

No response

Anything else?

No response

MovieService's GET requests crash the app

As of now, calling some methods inside of the init block of HomeViewModel instantly crashes the app, due to the fact that the MovieService is not deserializing the data correctly.
Furthermore, the GET requests for trending movies / actors by week return a bad request, as evidenced below, by the LoggingInterceptor.

result

Dynamic sections in HomeFragment

Is your feature request related to a problem? Please describe.

On the home screen the user sees pre-set sections.
This makes the home section not very dynamic and monotonous, which goes against the customization to which this project aspires.
Moreover if a user doesn't want to see an uninteresting section he can't remove it or if he wants to see a section of his interest he can't add it.

Describe alternatives you have considered.

  • The user must be able to add sections to the main screen such as:
    • Movies of their favorite actors
    • Movies similar to their favorite movies
  • The user must be able to reorder sections and also remove them from the main list with the constraint of not being able to remove what are the default sections [to be chosen].

Additional Context

The idea to achieve this is to create a Dashboard entity that represents the set of all the sections present in the home. This entity could have:

  • A list of sections that can be removed and added then a list that can be empty.
  • A HashMap of sections that you can't modify, which will contain the default sections as value and as key the parameter that generated that section (for example if my section is about Tom Cruise's movies the hashMap will have as key "Tom Cruise" and as value the list ).
  • The logic to make these operations

⚠This is not the official solution but something to start from

The BottomBar overlaps the fab in FilterableFragment

Is there an existing issue for this?

  • I have searched the existing issues

Current Behavior

The user fails to click on the FAB for choosing a random movie within the FilterableFragment because the bottombar overlaps the FAB.

Expected Behavior

The BottomBar should only be visible in top level destinations and therefore should not be visible inside 'FilterableFragment'.

Steps To Reproduce

  1. Select the Discovery section in the Bottom bar
  2. Select any filter or one of the filtering parameters
  3. Apply filter

Relevant log output

No response

Anything else?

No response

Connectivity Management

Is there a project named like this repo?

  • I have searched

Is your feature request related to a problem? Please describe.

Connectivity within the app is not managed, any connection errors or no internet can't be handled.

A class must be inserted to manage connectivity and error and recyclerview loading states.

Describe alternatives you have considered.

No response

Additional Context

No response

HomeFragment causes app crash on scroll

As of now, the app crashes when scrolling the HomeFragment because it doesn't get a proper reference to the MainActivity's BottomNavigationView (it also crashes when clicking a movie, but this is referenced by #52).
This current issue is being addressed in #53.

Add Kotlin Flow and Live Data Transformations

This is an enhancement that would provide an easier and more reactive approach to the management of classes like MovieDetailsViewModel, which has 5 methods inside of the init block, with most of them actually depending on a single source, the selectedMovie LiveData.

The MovieCastFragment and MovieImagesFragment crash the app

I think the problem has to do with how in the view model I try to retrieve the information.

In MovieDetailsViewModel there is a public setSelectedMovie method that is called once when the MovieDetailsFragment is opened.

This method is responsible for retrieving various additional movie information and filling in variables that will then be used in the fragments inherent in the movie details

Serie details

Is your feature request related to a problem? Please describe.

  • The details of a user selected series must be retrieved and displayed in a 'SeriesDetailsFragment' screen

The screen should also show:

Describe alternatives you have considered.

To improve the abstraction between the Movie.kt class and the Tv.kt class, as they have many attributes in common, it would be appropriate to create a parent class Media.kt from where they both inherit.

I report below a generic code to perform such a request:

// Define the parent class
@Entity(tableName = "parent_table")
abstract class Parent(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val name: String
)

// Define the first child class
@Entity(tableName = "child_one_table",
        foreignKeys = [ForeignKey(entity = Parent::class,
                                parentColumns = ["id"],
                                childColumns = ["parentId"])],
        indices = [Index("parentId")])
data class ChildOne(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val parentId: Int,
    val childOneProperty: String
) : Parent(parentId, name)

// Define the second child class
@Entity(tableName = "child_two_table",
        foreignKeys = [ForeignKey(entity = Parent::class,
                                parentColumns = ["id"],
                                childColumns = ["parentId"])],
        indices = [Index("parentId")])
data class ChildTwo(
    @PrimaryKey(autoGenerate = true) val id: Int,
    val parentId: Int,
    val childTwoProperty: String
) : Parent(parentId, name)

Additional Context

The details screen for a series and for a movie will display similar details, but when displaying the details of a series it would be appropriate to also show the seasons and episodes viewable in a dedicated tab.
No response

Personal Lists

Is your feature request related to a problem? Please describe.

A user at the current state of the app can only create:

  • List of seen movies
  • List of movies to watch
  • List of favorite movies

A user must have the ability to create personal lists to which they can add the movies/series they want. A list must be characterized by:

  • Mandatory title
  • Optional description
  • Automatic creation date
  • Last modified date

Database Structure

cinematesdb

Blue Tables to create

Describe alternatives you have considered.

To be considered optional the possibility to enrich the list with tags.

Additional Context

No response

LEE RecyclerView (Paging)

Loading Error Empty RecyclerView is a custom recyclerview attentive to empty, error, and loading states.

It is about implementing a view that facilitates the use of these states to improve UX

The dialog about collections (CollectionDialogFragment) causes a crash

When selecting a movie from this dialog the app crashes because it cannot find a NavController:

java.lang.IllegalStateException: View android.widget.LinearLayout{d2982d2 VFE...C.. ...P.... 395,28-706,595} does not have a NavController set
        at androidx.navigation.Navigation.findNavController(Navigation.kt:71)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.navigateToMovieDetails(ItemsRecyclerViewAdapter.kt:185)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.onBindViewHolder$lambda-1(ItemsRecyclerViewAdapter.kt:82)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.$r8$lambda$s5jmOxcUQBSRALnhdqPzMD5vUUw(Unknown Source:0)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter$$ExternalSyntheticLambda3.onClick(Unknown Source:4)
        at android.view.View.performClick(View.java:7509)
        at android.view.View.performClickInternal(View.java:7486)
        at android.view.View.access$3600(View.java:841)
        at android.view.View$PerformClick.run(View.java:28709)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8061)

always on feat_single_activity_structure branch

To solve issues w/ Room

The migration to Kotlin has caused problems with the use of Room which needs to be revised

User must be able to delete a filter

Is your feature request related to a problem? Please describe.

Quando un utente crea un filtro in DiscoverFragment, deve poter eliminarlo anche dal database

Describe alternatives you have considered.

A solution could be to create an OnLongClickListener on the Filter items of the recyclerView in DiscoverFragment and, once activated the listener show a confirmation dialog where the user can confirm the deletion of the filter

Additional Context

No response

Result in SearchFragment are not cleared when query is empty

Describe the bug

when you perform a search and then clean the query or return to the previous fragment the results are not emptied

To Reproduce

Steps to reproduce the behavior:

  1. Go to search icon in menu
  2. Search something
  3. Clear search query

Expected behavior

When the query is cleared, the recycler view of the results should be emptied. the same effect must have when you want to return to the previous fragment

Screenshots

Additional context

New features of DiscoverFragment

The filter class should be enriched with other parameters which can be modified by the user via the DiscoverFragment UI.

I imagine that a user can choose in addition to movie's genre also :

  • the maximum length of a movie
  • sort them by popularity, release date, revenue, and average rating

In addition, the user should be able to create a custom bundle filter. Maybe a user always uses the same filtering that includes particular genres, and other types of filters. Then the user should be able to create a clickable filter with recurring properties.

The filter could have an automatically generated or customizable name, which would then be displayed in the FilterableFragment toolbar

App crashes on Movie click

When selecting a movie, the app crashes with the following error:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.cinemates, PID: 21441
    java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.cinemates.model.data.Collection.hashCode()' on a null object reference
        at com.example.cinemates.model.data.Movie.hashCode(Unknown Source:2)
        at androidx.navigation.NavBackStackEntry.hashCode(NavBackStackEntry.kt:256)
        at java.util.HashMap.hash(HashMap.java:338)
        at java.util.HashMap.put(HashMap.java:611)
        at androidx.navigation.NavController.linkChildToParent(NavController.kt:143)
        at androidx.navigation.NavController.addEntryToBackStack(NavController.kt:1918)
        at androidx.navigation.NavController.addEntryToBackStack$default(NavController.kt:1813)
        at androidx.navigation.NavController$navigate$4.invoke(NavController.kt:1721)
        at androidx.navigation.NavController$navigate$4.invoke(NavController.kt:1719)
        at androidx.navigation.NavController$NavControllerNavigatorState.push(NavController.kt:287)
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:246)
        at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.kt:162)
        at androidx.navigation.NavController.navigateInternal(NavController.kt:260)
        at androidx.navigation.NavController.navigate(NavController.kt:1719)
        at androidx.navigation.NavController.navigate(NavController.kt:1545)
        at androidx.navigation.NavController.navigate(NavController.kt:1472)
        at androidx.navigation.NavController.navigate(NavController.kt:1930)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.navigateToMovieDetails(ItemsRecyclerViewAdapter.kt:176)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.onBindViewHolder$lambda-1(ItemsRecyclerViewAdapter.kt:74)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter.$r8$lambda$s5jmOxcUQBSRALnhdqPzMD5vUUw(Unknown Source:0)
        at com.example.cinemates.adapter.ItemsRecyclerViewAdapter$$ExternalSyntheticLambda3.onClick(Unknown Source:4)
        at android.view.View.performClick(View.java:7509)
        at android.view.View.performClickInternal(View.java:7486)
        at android.view.View.access$3600(View.java:841)
        at android.view.View$PerformClick.run(View.java:28709)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8061)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

Modify ReadMe

  • There is old and no longer influential information
  • Gif needs to be updated
  • More concise in the project overview
  • Add Android shied
  • Add Future upgrade
  • Add a guide on how to Contribute

MovieDetailsFragment recreates itself multiple times

In the feat_single_activity_structure branch, when you click a movie and open the MovieDetailsFragment for the first time and go back, you don't have crashes.

If within MovieDetailsFragment you click another movie, it is shown without any problems but if you try to go back you have problems with the ViewPager trying to recreate itself because, in the backstack, there is another instance of MovieDetailsFragment

Hide & show animation bottom bar

The bottom bar is shown only in the top destinations but has two problems

  • When in movie details you want to insert a movie in a list, before the bottomsheetfragment appears, the bottombar appears for a second
  • In homefragment, the appearance of the bottombar is slow

Adding ViewModel for each view

To comply with the MVVM pattern, one of the best practices indicated by Google is to have a ViewModel for each fragment, and this would be useful as it would relieve the responsibilities of the current ViewModel

Move each string into xml file

Is your feature request related to a problem? Please describe.
Many strings in the code are written in English or Italian

Describe the solution you'd like
Each string in the code must be inserted in the 'string.xml' file

Describe alternatives you've considered
Nothing

Additional context
Nothing

Divide et impera in repository

Is there a project named like this repo?

  • I have searched

Is your feature request related to a problem? Please describe.

In the model/repository package, the MovieRepository class has methods that are not related to movies (e.g. methods that retrieve details about an actor, or actors via search).

  • These methods should reside in a separate class.
  • In the package model/api there is the class MovieService which contains methods inherent to the actors and therefore must be separated into an ActorService class

Describe alternatives you have considered.

No response

Additional Context

No response

Cannot passing args with global action

Untitled-2022-08-22-1943

Link to piece of code

As can be seen from the graphic , we want to get to the same destination from multiple fragments and since the action is about clicking on an item in a recyclerview and the click is handled by the adapter, the solution would be 2:

  • Convert the whole adapter to kotlin using a list adapter but the effort would be complex as it is not a simple adapter but concerns a sectioned recycler view. However, we would have a language much more conducive to using the navigation component
  • Trying to figure out how to pass a topic to a global action.

The main problem is that I do not understand why my log gives this error:

error: cannot find symbol
        MovieDetailsFragmentDirections.ActionGlobalMovieDetailsFragment action =
                                      ^
  symbol:   class ActionGlobalMovieDetailsFragment
  location: class MovieDetailsFragmentDirections

And every time I try to use the ActionGlobalMovieDetailsFragment class, it brings me back as the inner class of all the fragments in my navigation graph. This way I don't know which one to choose and none of them are successful

Poster

Instead of allowing posters to be downloaded, it would be nice to allow a user to change the movie poster in their lists.

App crashes at startup

On the feat_viewModel_each_view branch, I get this error message when I start the app:

2022-08-24 17:01:40.804 6410-6410/com.example.cinemates E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.cinemates, PID: 6410
    java.lang.RuntimeException: Unable to instantiate application com.example.cinemates.di.component.BaseApplication: java.lang.ClassNotFoundException: Didn't find class "com.example.cinemates.di.component.BaseApplication" on path: DexPathList[[zip file "/data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/lib/arm64, /data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1248)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6964)
        at android.app.ActivityThread.access$1500(ActivityThread.java:258)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1983)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:236)
        at android.app.ActivityThread.main(ActivityThread.java:8061)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.cinemates.di.component.BaseApplication" on path: DexPathList[[zip file "/data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/lib/arm64, /data/app/~~n7EnAWxWhh12YRnlQpxc8Q==/com.example.cinemates-BWI2vlflhkII0Vr4DVv27Q==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
        at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:52)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1159)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1240)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6964) 
        at android.app.ActivityThread.access$1500(ActivityThread.java:258) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1983) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:236) 
        at android.app.ActivityThread.main(ActivityThread.java:8061) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 
    	Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/example/cinemates/di/component/Hilt_BaseApplication;
        at java.lang.VMClassLoader.findLoadedClass(Native Method)
        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
        		... 14 more

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.