Git Product home page Git Product logo

dromos's Introduction

Dromos

image

Purpose

Dromos is designed to enhance user engagement and collaboration within a specific interest community through dynamic interactive node graphs which users can create, edit, maintain. This platform targets both public and private sector researchers, scientists and stakeholders, offering tools that not only facilitate comprehensive visualization of causal pathways, but also encourage collaboration and knowledge sharing.

This Readme explicates the following with the regard to the Dromos front-end. For back-end related topics, such as back-end technologies and database structure, see Dromos-be.

Table of Contents

Technologies Used

The technology stack and design choices for Dromos were purposefully selected with a clear focus on its future public use and the necessity for continuous evolution. The adoption of TypeScript over JavaScript, ShadCN/UI instead of Bootstrap, and TailwindCSS rather than traditional vanilla CSS, were all strategic decisions made to ensure the platform’s suitability for external parties. These choices are essential for maintaining the integrity and extensibility of Dromos as it transitions from initial development and portfolio project into a public-facing offering. The technologies chosen are not only robust and scalable but also support the objective of ongoing iteration and refinement, which is crucial considering that Dromos is intended to be enhanced and expanded by different developers over time.

Used for building user interfaces with components, allowing for efficient and flexible UI development.

Used for enhancing JavaScript code with static type definitions, TypeScript offers improved maintainability, understandability, and robustness of the codebase. By introducing static typing, it helps catch errors early in the development process and provides a more scalable foundation for large projects.

Used for creating custom designs quickly with a utility-first CSS framework, enabling rapid styling directly in markup.

Used for creating modern and interactive user interfaces with a set of high-quality, customizable React components.

Used for integrating scalable vector icons as React components, enhancing UI designs with easily customizable icons.

Used for incorporating a wide array of icons into web and mobile interfaces, customizable via CSS for various design needs.

Used for schema declaration and validation, ensuring data integrity with type-safe input validation in JavaScript and TypeScript applications.

Used for managing state in React applications, providing a simple and minimalistic approach to global state management outside of the React render cycle.

Used for drawing and managing large network graphs efficiently, enabling interactive visualizations directly within web applications.

Used for efficient and fast package management, pnpm offers a unique node_modules structure that saves disk space and reduces installation time by avoiding redundancy.

Used for front-end tooling, Vite provides a fast development environment by leveraging modern web technologies. It offers hot module replacement and optimized build times, significantly improving the developer experience.

Features

Existing Features

  • Interactive Graph: Utilizes SigmaJS to render interactive node graphs, enhancing user understanding of complex data structures.
  • User Authentication: Secure login and registration system to manage user access and personalize user experiences.
  • Dynamic Graph Rendering: Harnesses the power of SigmaJS and Django back-end to provide infrastructure to implement dynamic node coloring, sizing, and labeling.
  • Customizable User Profiles: Users can customize their profiles, allowing them to add personal touches and relevant information.
  • Responsive Design: Built with TailwindCSS for a seamless experience across all devices.
  • CRUD User Accounts: Complete Create, Read, Update, and Delete (CRUD) capabilities for user accounts.
  • Feed of Graphs with Recent Activity: Displays a live feed of graphs showing recent updates and interactions.
  • View Graphs: Allows users to view details and statistics of graphs within the platform.
  • CRUD Graphs: Users can create, read, update, and delete graphs.
  • CRUD Nodes: Full CRUD functionality for managing nodes within the graphs.
  • CRUD Comments: Users can comment on graphs and nodes, with full CRUD capabilities on these comments.
  • Ability to View a Node in Quick View Using a Drawer: Quick access to view node details in a sliding drawer without leaving the current page.
  • Ability to View a Node in Full View with Comments: Detailed view of a node including associated comments, enhancing user interaction and discussion.

Planned Features

  • Ability to Open a Dropdown and Select Graph Layouts: Users can choose from various graph layouts, including directed acyclic graphs using the Dagre algorithm.
  • Dynamic Coloring of Node Cycles: Automatically highlights nodes that cycle back to parent nodes, aiding users in identifying and resolving feedback loops.
  • Ability to Fork Graphs: Similar to GitHub, allows users to fork graphs for personal modifications or experimentation.
  • Sandbox Mode: Enables users to experiment with graphs in a safe environment without altering the main graph data.
  • Advanced Analytics: Including centrality analysis, D-separation, and other complex data analysis techniques.
  • Levels of Evidence for Nodes: Allows users to assign and display levels of evidence or certainty to nodes within graphs.
  • Ability to Throttle Data Up and Down: Users can simulate changes in node input data to see how these alterations propagate through the network.
  • Governance Model for Canonical Graphs: Establishes a framework for managing and approving changes to canonical graphs.
  • Billing: Implements a billing system for users, particularly useful for service monetization and managing premium features.
  • Mobile App: Extend functionality with a native mobile application.

Components

React Components

Component Name Description
CauseSelector.tsx Manages the selection of causes in a graph.
CommentForm.tsx Handles the creation of new comments.
CommentList.tsx Displays a list of comments.
CreateAccount.tsx Form component for user account creation.
CreateGraph.tsx Interface for creating new graphs.
CreateNode.tsx Provides a form to add new nodes to a graph.
EditAccount.tsx Form component for editing user account details.
GraphRenderer.tsx Renders interactive graphs using SigmaJS.
GraphSelector.tsx Allows users to select different graphs to view.
GraphView.tsx Main component for displaying a graph and its details.
Home.tsx Serves as the landing page of the application.
LogIn.tsx Component for user login.
Navbar.tsx Navigation bar for the application.
NodeFullView.tsx Provides a detailed view of a node, including comments.
NodeQuickView.tsx Offers a quick overview of a node's basic information in a drawer.

UI Components

Component Name Description
button.tsx A reusable button component for user interactions.
card.tsx Displays content in a structured card format.
command.tsx Invokes commands within interfaces.
dialog.tsx Provides modal dialogues for user confirmations or inputs.
drawer.tsx A sliding panel used for displaying additional information without leaving the current context.
form.tsx Generic form component for handling user inputs.
input.tsx Input field for form data entry.
label.tsx Text label for UI elements, particularly form inputs.
popover.tsx Small overlay that opens on demand to show more content.
scroll-area.tsx Custom scrollable area for wrapping content.
select.tsx Dropdown selection component.
sheet.tsx Container that groups related content and actions.
switch.tsx Toggle switch for enabling or disabling a setting.
tabs.tsx Component for tabbed interfaces, allowing content organization.
textarea.tsx Text input field for multiline text.
toast.tsx Brief messages about app processes.
toaster.tsx Manages the display of toast notifications.
tooltip.tsx Small informative message that appears when hovering over an element.
use-toast.tsx Hook for triggering toast notifications.

Component and State refactoring

During development, management of both components and state became increasingly difficult, and at same point it became apparent that the entire site would benefit from refactoring two componenents, which also served as the routes, out into two routes with several many fine-grained components. Not only did this help keep the architecture of the site more organized, but it also provided more reesuability--allowing components to be used in more than one place--as well as performance, as refactoring components no longer needed to be rendered when nothing changed. However, in the process of doing this, managing state become unwieldy, with prop-drilling and passing state to and from parent and child components. Therefore, Zustand was deployed to help manage state. One such example would be updating the node store when a node is clicked, and then being able to access that node ID stored in the stated when navigating out to the full node view. Prior to the architecture, the site's rough architecture can be seen here, with the orance arrows representing passing state: image

With the refactoring, the fine-grained archecture resulting from abstrocting components out into much smaller can be seen, along with abstracting state out into centralized storage locations using Zustand: image

Testing

Note: For those features marked as future implementation, this is specificially in regards to front-end implementation. Full CRUD functionality is possible through the admin panel, and therefore the tests below relate to the public user-facing front-end.

CRUD User Accounts

Test Case Acceptance Criteria Result Issue
Create Account Given the registration page, when a user submits valid registration details, then the system creates a new user account. Passed #37
Read Account Given a logged-in user, when they navigate to their profile page, then they see their account details. Passed #46
Update Account Given a logged-in user on their profile page, when they update their information and submit, then the system updates their account details. Failed #44
Delete Account Given a logged-in user on their profile page, when they choose to delete their account and confirm the action, then the system deletes their account. Passed #45

CRUD Graphs

Test Case Acceptance Criteria Result Issue
Create Graph Given a user on the graph creation page, when they input graph details and submit, then the system creates a new graph. Passed #19
Read Graph Given a user on the platform, when they select a graph, then they are able to view its details. Passed #4
Update Graph Given a user viewing a graph they own, when they update details and submit, then the system updates the graph's details. Future implementation #20
Delete Graph Given a user viewing a graph they own, when they decide to delete the graph and confirm the action, then the system removes the graph. Future implementation. #21

CRUD Nodes

Test Case Acceptance Criteria Result Issue
Create Node Given a user editing a graph, when they add a new node and specify its details, then the system adds the node to the graph. Passed #31
Read Node Given a user viewing a graph, when they select a node, then they see the node's details. Passed #22
Update Node Given a user viewing a node they own, when they update the node's details and submit, then the system updates the node within the graph. Future implementation #10
Delete Node Given a user viewing a node they own, when they delete the node and confirm, then the system removes the node from the graph. Future implementation #32

CRUD Comments

Test Case Acceptance Criteria Result Issue
Create Comment Given a user viewing a graph or node, when they submit a comment, then the system adds the comment to the item. Passed #6
Read Comment Given a user on a graph or node page, when they view comments, then they see all posted comments. Passed #7
Update Comment Given a user viewing their comment, when they edit and submit the updated comment, then the system updates the comment on the graph or node. Failed. Not yet implemented. #9
Delete Comment Given a user viewing their comment, when they delete it and confirm, then the system removes their comment from the graph or node. Failed. Not yet implemented. #8

Permissions

Test Case Acceptance Criteria Result Issue
Non-Logged In Read Given a non-logged-in user, when they navigate the platform, then they can only read available public graphs, nodes, and comments. Passed #47

Navigation

Test Case Acceptance Criteria Result Issue
Navigation Tooltips As a user, When I when I hover over UI elements, I see a tooltip that provides additional context Passed #2
Routing Three user stories for routing, see ticket. Passed #14

Validator Testing

  • TSX: TSX was validated using eslint.org. The total count was 3417 lines of .tsx code, with the only error generated being an as keyword in an Axios call, which can be safely ignored: image

  • CSS:

image

Known Bugs

  • In node view, owner ID is being shown, when it should be username: image
  • Responsivess issues in mobile view for the graph-view persists, as managing the HTML canvas with CSS proved to be difficult: image

Deployment

Back-End (Django) Setup

  1. Cloning the Repository:

    • Clone the repository locally: git clone repository_url
    • Navigate to the project directory: cd project_directory
  2. Setting Up Django Project:

    • Install Django: pip install django
    • Create a new Django project: django-admin startproject project_name
    • Navigate to the project directory: cd project_name
    • Create a Django app: python manage.py startapp app_name
  3. Environment Variables Setup:

    • Create a .env file in the root directory.
    • Define environment variables:
      • SECRET_KEY: Django secret key for cryptographic signing.
      • DATABASE_URL: URL for connecting to the PostgreSQL database.
      • Other variables as needed (e.g., DEBUG, ALLOWED_HOSTS).
  4. Heroku Deployment:

    • Install the Heroku CLI.
    • Log in to Heroku: heroku login
    • Create a new Heroku app: heroku create app_name
    • Set up PostgreSQL addon for the database: heroku addons:create heroku-postgresql:hobby-dev
    • Set Django environment variables in Heroku: heroku config:set VARIABLE_NAME=value
    • Push code to Heroku: git push heroku main
  5. Database Migration:

    • Run database migrations: python manage.py migrate
    • Create a superuser for admin access: python manage.py createsuperuser

Database (ElephantSQL) Setup

  1. Setting Up ElephantSQL:

    • Sign up for an ElephantSQL account.
    • Create a new PostgreSQL instance.
    • Note down the database URL.
  2. Environment Variables Setup:

    • Add the ElephantSQL database URL to the .env file.

Front-End Setup

  1. Cloning the Repository:

    • Clone the repository locally: git clone repository_url
    • Navigate to the project directory: cd project_directory
  2. Heroku Deployment:

    • Ensure you have a package.json file with required dependencies.
    • Create a new Heroku app: heroku create app_name
    • Set environment variables if necessary: heroku config:set VARIABLE_NAME=value
    • Push code to Heroku: git push heroku main
  3. Installing Required Packages:

    • Decide on required packages:
      • React: npm install react
      • TypeScript: npm install typescript
      • TailwindCSS: npm install tailwindcss
      • ShadCN/UI: npm install @shadcn/ui
      • Lucide-React: npm install @lucide/react
      • Fontawesome: npm install @fortawesome/fontawesome-free
      • Zod: npm install zod
      • Zustand: npm install zustand
      • SigmaJS: npm install sigma
      • pnpm: npm install pnpm
      • Vite: npm install vite

Detailed Technologies Used

Refer to the provided list of technologies used in the Dromos project for detailed information on the tech stack employed.

UX

Nodes on design

In general, the choice keep Dromos simple is that it is a SaaS app for business purposes, and in a highly technical space. Therefore, bright colors, unneeded imagery and any otherwise distracted media and colors were not used. As well, the choice to maintain a highly minimal design was done purposefully to maintain flexibility, as there will be changes in the future.

Graph View

This was the original Balsamiq for the Graph View. One can see the difference between the mock-up and final implementation, as it became apparent that a dropdown would rather than scrollable cards would free up space for other needed functionality, such as the selected graph card and create node button. image

Navbar

Here, the actual implementation closely resembled the mock-ups of the Navbar: image

Needed improments

Some improvements would be required, including:

  • Node Quick drawer, which appears upon clicking a node
  • Comment formatting and node full view

Additional improments would include:

  • Additionaly rendering algorithms for graph
  • Arrows on graph rendering to show directionality

Credits

Content

  • All content used in project is original.

Media

dromos's People

Contributors

laskinner avatar

Watchers

 avatar

dromos's Issues

Bug: Fix toast notifications

It this to do with a button being nested inside another button. But I don't know why this is.

Here is the code, from CreateAccount.tsx:

  <SheetFooter>
    <SheetClose asChild>
      <Button
        type="submit"
        onClick={() => {
          toast({
            title: "Account created succesffully",
          });
        }}
      >
        Save changes
      </Button>
    </SheetClose>
  </SheetFooter>

Needs further investigation to understand what's going on.

Feature: Delete comments

Feature: Comment deletion

Scenario: User deletes a comment
Given I am logged in
When I delete a comment
Then the comment no longer appears in the list of comments

  1. Ensure User is Logged In

    • Navigate to the login page: /login.
    • Enter the username in the "Email" input field: [email protected].
    • Enter the password in the "Password" input field: password123.
    • Click the "Login" button.
  2. Navigate to the Comments Page

    • After logging in, go to the comments page: /comments-page.
  3. Locate the Comment to Delete

    • Find the comment you want to delete in the list of comments: .comment-item.
    • Ensure the comment contains the text: "This is a test comment".
  4. Delete the Comment

    • Click the "Delete" button next to the comment: button contains "Delete".
  5. Confirm Deletion

    • If a confirmation dialog appears, confirm the deletion.
  6. Verify Comment Deletion

    • Check that the comment no longer appears in the list: .comments-list.
    • Ensure the comment text "This is a test comment" is not present in the list of comments.

Dev: Refactor formschemas

Currently form schemas are located in the same file, but outside the form component.

This could be refactored such that the forms are in a directory called /schemas

Feature: Profile CRUD Feedback

Add toast notifications when a user creates their profile.

As a user
When I CRUD my profile
I want to see a notification confirming the results.

Feature: Routing

Feature: Home View for List of Graphs and Descriptions

As a user
I want to navigate to the home view
So that I can see a list of graphs and their descriptions

Acceptance Criteria:

The home view should display a list of graphs.
Each graph should have a title and description.
Each graph entry should be clickable to navigate to its detailed view.

Feature: Graph View to Node Graphs

As a user
I want to navigate to the graph view
So that I can see the nodes within the selected graph

Acceptance Criteria:

The graph view should display the nodes of the selected graph.
The graph view should be accessible by clicking on a graph entry from the home view.
The graph view should provide a clear representation of nodes and their relationships.

Navigation Flow

As a user
I want to easily navigate between the home view and graph view
So that I can explore different graphs and their nodes seamlessly

Acceptance Criteria:

From the home view, clicking on a graph entry should take the user to the graph view.
There should be a back button or navigation option in the graph view to return to the home view.
The navigation should be smooth and intuitive.

Feature: Permissions

Feature: Logged in user can manipulate data on Dromos

Given a non-logged-in user
When they navigate the platform
Then they can only read available public graphs, nodes, and comments.

Feature: Delete Profile

Feature: User Profile Deletion

  Scenario: Successful Profile Deletion
    Given the user is logged in
    And the user is on their profile page
    When the user clicks the Delete Profile button
    And the user confirms the deletion
    Then the user should see a message "Profile deleted successfully"
    And the user should be redirected to the homepage

  Scenario: Profile Deletion Cancellation
    Given the user is logged in
    And the user is on their profile page
    When the user clicks the Delete Profile button
    And the user cancels the deletion
    Then the user should still be on their profile page
    And the profile should not be deleted

Bug: Profile image not benig shown

For whatever reason, while the logic is there in the code, the image is not being shown, in spite of the image URL being successfully delivered to the front-end in browser logs.

It's simply not finding the userProfileImage, and then opting for the icon instead:

Image

Bug: Styling on toast notifications

The toast notifications are a bit difficult to see, which them being white on white. The color needs to be changed around:

Image

Update the toast notifications so they are black on white.

Feature: Edit Comments

Feature: Comment editing

Scenario: User edits a comment
Given I am logged in
When I edit a comment
Then the edited comment appears in the list of comments
And I see the updated content in the comment

  1. Ensure User is Logged In

    • Navigate to the login page: /login.
    • Enter the username in the "Email" input field: [email protected].
    • Enter the password in the "Password" input field: password123.
    • Click the "Login" button.
  2. Navigate to the Comments Page

    • After logging in, go to the comments page: /comments-page.
  3. Locate the Comment to Edit

    • Find the comment you want to edit in the list of comments: .comment-item.
    • Ensure the comment contains the text: "This is a test comment".
  4. Enter Edit Mode

    • Click the "Edit" button next to the comment: button contains "Edit".
  5. Edit the Comment

    • Locate the textarea: textarea[placeholder="Add comment here"].
    • Clear the existing comment text and enter new text: "This is the updated test comment".
  6. Submit the Edited Comment

    • Click the "Update" button: button[type="submit"] contains "Update".
  7. Verify Comment Update

    • Check that the updated comment appears in the list: .comments-list.
    • Ensure the updated comment text is present: .comments-list contains "This is the updated test comment".
  8. Check for Edit and Delete Buttons

    • Locate the newly updated comment item: .comment-item.
    • Within the updated comment, check for the "Edit" button: button contains "Edit".
    • Check for the "Delete" button: button contains "Delete".

Bug: Creating frist node not possible

When creating a graph, the user needs to be able to great the first node of that graph.

However, the nature of a directed acyclic graph is such that the needs should no be orphans. Therefore, this creates a problem wherein users can not create the first node, as the validation requires a causal node to be selected, which isn't possbile when there are no nodes from which to select:

Image

Feature: Feed

Feature: Feed

User Story

Title: Dynamic Feed based on Node Activity

As a user,
I want the feed to dynamically display node activities,
So that I can see the most recent updates and comments within my areas of interest or public areas when not signed in.

Acceptance Criteria

  1. The feed displays node activities, including nodes created or updated and comments created on nodes.
  2. For signed-out users, the feed only shows activities from nodes in public areas, sorted by most recent activity.
  3. For signed-in users, the feed prioritizes node activities from subscribed areas, followed by public area activities once all subscribed area activities have been viewed.

Gherkin Syntax

Feature: Feed

  Scenario: Viewing feed as a signed-out user
    Given I am not signed in to the application
    When I view the feed
    Then I see node activities from public areas only
    And the node activities are sorted by most recent activity

  Scenario: Viewing feed as a signed-in user with subscriptions
    Given I am signed in to the application
    And I have subscriptions to certain areas
    When I view the feed
    Then I see node activities from my subscribed areas first
    And node activities from public areas when no more subscribed area activities are available
    And the node activities are sorted by most recent activity within each section

  Scenario: Adding a comment to a node shows up in the feed
    Given a node exists in a public area
    When a comment is added to the node
    Then the node shows up in the feed as recent activity

  Scenario: Creating or updating a node shows up in the feed
    Given I am a user who can create or update nodes
    When I create or update a node in any area
    Then the node shows up in the feed as recent activity

Feature: Create Profile

Feature: User Profile Creation

  Scenario: Successful Profile Creation
    Given the user is on the Create Account page
    When the user enters a valid username
    And the user enters a valid email
    And the user enters a valid password
    And the user confirms the password
    And the user optionally enters a first name
    And the user optionally enters a last name
    And the user optionally enters a bio
    And the user clicks the Create Account button
    Then the user should see a message "Account created successfully"
    And the user should be logged in automatically
    And the user's profile should be created

  Scenario: Profile Creation with Missing Email
    Given the user is on the Create Account page
    When the user enters a valid username
    And the user does not enter an email
    And the user enters a valid password
    And the user confirms the password
    And the user clicks the Create Account button
    Then the user should see an error message "Email is required"

  Scenario: Profile Creation with Password Mismatch
    Given the user is on the Create Account page
    When the user enters a valid username
    And the user enters a valid email
    And the user enters a password
    And the user enters a different password in the confirm password field
    And the user clicks the Create Account button
    Then the user should see an error message "Passwords do not match"

  Scenario: Profile Creation with Short Password
    Given the user is on the Create Account page
    When the user enters a valid username
    And the user enters a valid email
    And the user enters a password shorter than 6 characters
    And the user confirms the password
    And the user clicks the Create Account button
    Then the user should see an error message "Password must be at least 6 characters long"

Feature: Navigation Tooltips

Feature: User sees tooltips when hovering

As a user
When I when I hover over UI elements
I see a tooltip that provides additional context

Install:

pnpm dlx shadcn-ui@latest add tooltip

Usage:

import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip"

Hover

Add to library

Add data fixtures

Create ability to add data directly through the back-end, through fixtures.

Feature: Edit Profile

User Story: As a user, I want to edit my profile so that I can update my personal information as needed.

Acceptance Criteria:

The user must be able to access an edit profile page.
The user must be able to update profile information.
The system must save the updated information.

Bug: Refreshing Graph View causes dropdown to be empty

Normally in graph view, the dropdown shows available graphs to select:
Image

When refreshing the page while on graph selector dropdown is cleared, and no graphs are available to select:
Image

To see the graphs, user must navigate back to Home view (feed view), and then back to graph view, at which point the dropdown selector will show available graphs again.

Image

Feature: Create a comment

Feature: Comment creation

Scenario: User creates a comment
Given I am logged in
When I create a comment
Then the comment appears in the list of comments
And I see edit and delete buttons

  1. Ensure User is Logged In

    • Navigate to the login page: /login.
    • Enter the username in the "Email" input field: [email protected].
    • Enter the password in the "Password" input field: password123.
    • Click the "Login" button.
  2. Navigate to the Comments Page

    • After logging in, go to the comments page: /comments-page.
  3. Create a Comment

    • Locate the textarea: textarea[placeholder="Add comment here"].
    • Enter the comment text: "This is a test comment".
  4. Submit the Comment

    • Click the "Submit" button: button[type="submit"].
  5. Verify Comment Creation

    • Check that the comment appears in the list: .comments-list.
    • Ensure the comment text is present: .comments-list contains "This is a test comment".
  6. Check for Edit and Delete Buttons

    • Locate the newly added comment item: .comment-item (assuming each comment is wrapped in a .comment-item class).
    • Within the newly added comment, check for the "Edit" button: button contains "Edit".
    • Check for the "Delete" button: button contains "Delete".

UI: Fix styling on NodeFullView

Currently the styling is very poor on the NodeFullView. Though improvements have already been made, some fixes need to be made. Namely, the back button:

Image

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.