Git Product home page Git Product logo

perfectmatching-backend's Introduction

Project - Side Project Member Matching Platform

사용자가 원하는대로 사이드 프로젝트를 함께할 팀원들을 모집할 수 있고 또는 사용자가 원하는 사이드 프로젝트에 참여하기 위해서 프로젝트를 찾을 수 있는 매칭 플랫폼 프로젝트.

개발환경

도구 버전
Framework Spring Boot 2.1.6
OS Windows 10, Ubuntu 18.04
IDE IntelliJ IDEA Ultimate
JDK JDK 1.8
DataBase MySQL Server 5.7
Build Tool Gradle 5.2.1

Modeling

  • Entity 모델링 명세 확인

  • Entity Relation Diagram 확인

개발 방법

세부정보
  • 개발과 관련된 모든 이야기는 Issues에서 진행합니다.

    • 급한 용무는 우선 순위에 따라서 카카오톡 또는 슬랙과 같은 메신저를 이용합니다.
  • API 및 모델링 명세를 주기적으로 최신화하면서 README.md를 잘 관리합니다.

  • Fork를 통한 PR을 지향합니다.

  • 아래와 같은 Git Workflow를 지향하며 지키려고 노력합니다. (참고)

실행 방법

세부정보
  • 준비사항.

    • Gradle or IntelliJ IDEA

    • JDK (>= 1.8)

    • Spring Boot (>= 2.x)

  • 저장소를 clone

    $ git clone https://github.com/perfect-matching/perfectmatching-backend.git
  • 프로젝트 내 Project-Matching\src\main\java\com\matching\config 경로에 HttpConfig.java 삭제 또는 내용 주석처리.

  • DB는 MySQL을 쓴다고 가정.

    • 다른 DB를 사용한다면, 그 DB에 맞게 설정을 해야함.
  • 프로젝트 내 Project-Matching\src\main\resources 경로에 application.yml 생성.

    • 밑의 양식대로 내용을 채운 뒤, application.yml에 삽입.

    spring:
        datasource:
            url: jdbc:mysql://localhost:3306/본인_DB?serverTimezone=UTC
            username: 본인_DB_User
            password: 본인_DB_User_Password
            driver-class-name: com.mysql.jdbc.Driver
        jpa:
            hibernate:
                ddl-auto: create
    
        data:
            web:
                pageable:
                    page-parameter: offset
        servlet:
           multipart:
                enabled: true
                max-file-size: 200MB
                max-request-size: 215MB
    
    file:
        upload-dir: ./uploads
  • IntelliJ IDEA(>= 2018.3)에서 해당 프로젝트를 Open

    • 또는 터미널을 열어서 프로젝트 경로에 진입해서 다음 명령어를 실행.

    • Windows 10

      $ gradlew bootRun
    • Ubuntu 18.04

      $ ./gradlew bootRun
      

REST API URL

세부정보
  • GET

    URI(자원) HTTP(행위) 기능(표현)
    /api/projects GET DB에 있는 Project를 가져오기 위한 api
    /api/projects?offset={num} GET offset에 따른 Project들을 가져오기 위한 api
    /api/projects?location={name} GET location에 따른 Project들을 가져오기 위한 api
    /api/projects?location={name}&offset={num} GET location과 offset에 따른 Project들을 가져오기 위한 api
    /api/projects?position={name} GET position에 따른 Project들을 가져오기 위한 api
    /api/projects?position={name}&offset={num} GET position과 offset에 따른 Project들을 가져오기 위한 api
    /api/projects?position={name}&location={name} GET position과 location에 따른 Project들을 가져오기 위한 api
    /api/projects?location={name}&position&offset={num} GET location과 postion 그리고 offset에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name} GET tag name에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&offset={num} GET tag name과 offset 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&location={name} GET tag name와 location에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&location={name}&offset={num} GET tag name과 location과 offset에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&position={name} GET tag name과 position에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&postion={name}&offset={num} GET tag name과 postion과 offset에 따른 Project들을 가져오기 위한 api
    /api/projects?tag={name}&location={name}&postion={name}&offset={num} GET tag name과 postion, location, offset에 따른 Project들을 가져오기 위한 api
    /api/project/{idx} GET idx에 따른 Project의 정보를 가져오기 위한 api
    /api/project/{idx}/comments GET Project에 따른 Comment들을 가져오기 위한 api
    /api/project/{idx}/members GET Project에 참여중인 맴버들의 정보를 가져오기 위한 api
    /api/project/{idx}/tags GET Project에 포함된 태그들의 정보를 가져오기 위한 api
    /api/profile/{idx} GET idx에 따른 User의 프로필 정보를 가져오기 위한 api
    /api/profile/{idx}/skills GET idx에 따른 User의 프로필 정보 중 스킬 정보를 가져오기 위한 api
    /api/profile/{idx}/projects GET idx에 따른 User의 진행중인 프로젝트 정보를 가져오기 위한 api
    /api/profile/{idx}/doneprojects GET idx에 따른 User의 진행했던 프로젝트 정보를 가져오기 위한 api
    /api/comment/{idx} GET idx에 따른 Comment의 정보를 가져오기 위한 api
    /api/doneproject/{idx} GET idx에 따른 DoneProject를 가져오기 위한 api
    /api/doneproject/{idx}/usedskills GET DoneProject에 포함된 태그들의 정보를 가져오기 위한 api
    /api/tag/{idx} GET idx에 따른 Tag를 가져오기 위한 api
    /api/userskill/{idx} GET idx에 따른 UserSkill을 가져오기 위한 api
    /api/usedskill/{idx} GET idx에 따른 UsedSkill을 가져오기 위한 api
    /api/tags GET DB에 등록되어 있는 Tag들을 가져오기 위한 api
    /api/userskills GET DB에 등록되어 있는 UserSkill들을 가져오기 위한 api
    /api/usedskills GET DB에 등록되어 있는 UsedSkill들을 가져오기 위한 api
    /api/image/{fileName} GET 서버에 업로드되어 있는 이미지 파일을 가져오기 위한 api
    /api/profile/{idx}/myprojects GET 유저가 개설한 프로젝트를 가져오기 위한 api
    /api/profile/{idx}/applyprojects GET 유저가 지원한 프로젝트를 가져오기 위한 api
    /api/project/{idx}/joinmembers GET 프로젝트의 지원자 목록을 가져오기 위한 api
  • POST

    URI(자원) HTTP(행위) 기능(표현)
    /api/project POST Project를 생성하기 위한 요청 api
    /api/login POST 서버에 로그인을 요청하기 위한 api
    /api/logout POST 서버에 로그아웃을 요청하기 위한 api
    /api/register POST User 생성을 위해서 회원가입을 요청하는 api
    /api/register/nickcheck POST User 생성을 위해 회원가입시 닉네임 중복 체크를 요청하는 api
    /api/register/emailcheck POST User 생성을 위해 회원가입시 이메일 중복 체크를 요청하는 api
    /api/comment POST Comment를 생성하기 위해 요청하는 api
    /api/project/apply POST 유저가 프로젝트에 지원하기 위해 요청하는 api
    /api/doneproject POST DoneProject를 생성하기 위해 요청하는 api
    /api/modify/nickcheck POST User 정보 수정시에 닉네임 중복 체크를 요청하는 api
  • PUT

    URI(자원) HTTP(행위) 기능(표현)
    /api/project/{idx} PUT Project의 idx에 따라 Project를 수정하기 위한 api
    /api/comment/{idx} PUT Comment의 idx에 따라 Comment를 수정하기 위한 api
    /api/image PUT 유저의 프로필 사진을 변경하기 위한 api
    /api/project/{idx}/status?status={name} PUT Project의 Status를 name에 따라 변경하기 위한 api
    /api/project/matching PUT Project 개설자가 지원자를 매칭 또는 거절을 요청하기 위한 api
    /api/doneproject/{idx} PUT DoneProject의 idx에 따라 DoneProject를 수정하기 위한 api
    /api/profile/{idx} PUT User의 idx에 따라 Profile을 수정하기 위한 api
  • DELETE

    URI(자원) HTTP(행위) 기능(표현)
    /api/project/{idx} DELETE Project의 idx에 따라 Projet를 삭제하기 위한 api
    /api/comment/{idx} DELETE Comment의 idx에 따라 Comment를 삭제하기 위한 api
    /api/image DELETE User의 기존 프로필 이미지를 삭제하고 기본 이미지로 변경하기 위한 api
    /api/project/cancel/{idx} DELETE Project의 Idx에 따라 지원취소를 요청하기 위한 api
    /api/doneproject/{idx} DELETE DoneProject의 idx에 따라 DoneProject를 삭제하기 위한 api

perfectmatching-backend's People

Contributors

donghl-dev avatar ssayebee avatar

Stargazers

 avatar  avatar

Watchers

 avatar

perfectmatching-backend's Issues

프로젝트 개설 로직 오류

프로젝트 개설 페이지

  • 현재 모집 인원이 0 명일 경우에도 프로젝트가 정상적으로 개설되는 버그가 있습니다.

  • 개발 직군에 기타라는 항목이 있기 때문에, 프로젝트는 최소 1명 이상일 때, 개설 되어야 합니다. 해당 문제점을 해결하고 아래에 댓글을 달아주세요!

도메인별 DTO 생성

  • 각 페이지별 데이터처리를 위한 DTO 생성

  • 기존 단일 도메인으로 처리 할 경우 순환참조 문제가 있음

Project List 데이터와 Comment List 데이터의 json객체의 데이터 포맷 변경 제안

제안

주로 리스트에 쓰이는 데이터(ex.Project ListComment List 의 데이터) 포맷이 _embaded.xxxDTOList.Array 로 날라오고 단일 데이터는 단일객체로 날라오는데, 데이터 포맷을 아래와 같은 형식으로 바꾸는 것을 제안

List 데이터 포맷

  • comment list를 예로 들어,

기존 포맷

{
    "_embedded": {
        "commentDTOList": [
            {
                "userName": "testUser_25",
                "projectTitle": "이러 이러한 Side Project 의 함께할 사람들을 찾고 있습니다. 1",
                "content": "테스트 댓글 162",
                "createdDate": "2019-08-12T21:20:55",
                "modifiedDate": null,
                "_links": {
                    "self": {
                        "href": "https://donghun-dev.kro.kr:8084/api/comment/162"
                    }
                }
            },
            {
                "userName": "testUser_22",
                "projectTitle": "이러 이러한 Side Project 의 함께할 사람들을 찾고 있습니다. 1",
                "content": "테스트 댓글 236",
                "createdDate": "2019-08-12T21:20:56",
                "modifiedDate": null,
                "_links": {
                    "self": {
                        "href": "https://donghun-dev.kro.kr:8084/api/comment/236"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "https://donghun-dev.kro.kr:8084/api/project/1/comments"
        }
    }
}

변경 포맷

{
        "datas": [
            {
                "userName": "testUser_25",
                "projectTitle": "이러 이러한 Side Project 의 함께할 사람들을 찾고 있습니다. 1",
                "content": "테스트 댓글 162",
                "createdDate": "2019-08-12T21:20:55",
                "modifiedDate": null,
                "_links": {
                    "self": {
                        "href": "https://donghun-dev.kro.kr:8084/api/comment/162"
                    }
                }
            },
            {
                "userName": "testUser_22",
                "projectTitle": "이러 이러한 Side Project 의 함께할 사람들을 찾고 있습니다. 1",
                "content": "테스트 댓글 236",
                "createdDate": "2019-08-12T21:20:56",
                "modifiedDate": null,
                "_links": {
                    "self": {
                        "href": "https://donghun-dev.kro.kr:8084/api/comment/236"
                    }
                }
            }
        ]
}
  • _embadded 프로퍼티와 최상위_links프로퍼티를 지우고, 배열 부분 commentDTOList -> datas로 프로퍼트 이름을 변경하는 것 제안
  • 관례상 리스트 데이터에서 최상위 프로퍼티 이름을datas라는 프로퍼티로 보내거나 아예 배열만 보냄

단일 객체 포맷

  • proeject detail을 예로 들어

현재 포맷

{
    "title": "이러 이러한 Side Project 의 함께할 사람들을 찾고 있습니다. 1",
    "leader": "testUser_34",
    "content": "1. 동해물과 백두산이 마르고 닳도록 \n하느님이 보우하사 우리나라 만세\n무궁화 삼천리 화려 강산\n대한 사람 대한으로 길이 보전하세\n\n2. 남산 위에 저 소나무 철갑을 두른 듯 \n바람 서리 불변함은 우리 기상일세\n무궁화 삼천리 화려 강산 \n대한 사람 대한으로 길이 보전하세\n\n3. 가을 하늘 공활한데 높고 구름 없이 \n밝은 달은 우리 가슴 일편단심일세\n무궁화 삼천리 화려 강산\n대한 사람 대한으로 길이 보전하세\n\n4. 이 기상과 이 맘으로 충성을 다하여 \n괴로우나 즐거우나 나라 사랑하세\n무궁화 삼천리 화려 강산\n대한 사람 대한으로 길이 보전하세",
    "status": "종료",
    "location": "부산",
    "createdDate": "2019-08-12T21:20:53",
    "deadline": "2019-08-12T21:20:53",
    "startDate": "2019-08-12T21:20:53",
    "endDate": "2019-08-12T21:20:53",
    "modifiedDate": null,
    "developerRecruits": 2,
    "designerRecruits": 0,
    "plannerRecruits": 0,
    "marketerRecruits": 0,
    "etcRecruits": 2,
    "currentDeveloper": 0,
    "currentDesigner": 0,
    "currentPlanner": 1,
    "currentMarketer": 0,
    "currentEtc": 1,
    "summary": "이러한 프로젝트에 참여할 인원을 모집합니다.",
    "_links": {
        "self": {
            "href": "https://donghun-dev.kro.kr:8084/api/project/1"
        },
        "Leader": {
            "href": "https://donghun-dev.kro.kr:8084/api/projects/1/leader"
        },
        "Comments": {
            "href": "https://donghun-dev.kro.kr:8084/api/project/1/comments"
        }
    }
}
  • 딱좋음ㅋ👍🏻, 이대로 유지해도 좋음

도메인 일부 수정 필요.

  • User 도메인의 password 컬럼은 객체를 반환할 때, 노출되어서는 안되기 때문에 조치가 필요.

  • 도메인의 관계성 매핑을 위한 필드 쪽에서 멀티 벨류 필드를 Set 컬렉션을 사용할 경우, 객체들을 삽입할 때, 그 객체의 내부 필드 객체가 중복 될 경우, 객체 자체의 중복으로 인지하여 hashCode() 함수를 무한 참조하는 StackOverflow 에러가 발생하므로 조치가 필요.

    • 관련 내용

      "ID-based equality" means just @EqualsAndHashCode(of="id"). It just says, two objects are equals if they have the same ID. This can be a problem with newly created objects (having no ID yet), etc. It avoids problems with objects changing their state (as the ID never changes, at least for persisted objects) and so changing their hashCode (such a change corrupts any HashMap/Set).

status column 명세와 불일치

  • status column의 명세 변경 ( 기존 varchar(30) -> varchar(10) )
  • UserProject의 status column이 명세와 불일치함 ( boolean -> varchar(10) )
  • Project의 status column 변경 필요 ( varchar(30) -> varchar(10) )
    • UserProject class 추가 생성자 필요

security config 파일 분리

  • MatchingApplication.class의 static SecurityConfiguration 파일 분리
  • matchig > config > SecurityConfiguration.class
  • config 파일은 config 패키지에 작성

User, Project, UserProject 컬럼 수정 및 추가.

  • User 도메인에 invest_time, social_url 컬럼 추가.

    • 바뀐 User 도메인에 대한 테스트 코드 작성.

  • Project 도메인에 status 컬럼 수정 및 social_url 컬럼 추가.

    • 바뀐 Project 도메인에 대한 테스트 코드 작성.

  • UserProject 조인 테이블에 status 컬럼 수정.

  • 변경된 도메인에 대한 DTO들도 필드 추가 및 수정

    • 바뀐 DTO에 대한 테스트 코드 작성.

User 생성 Post 및 Project 개설 Post 작성.

  • User 생성 Post 및 Project 생성 Post 작성시에 유효성 검증 처리도 같이 진행.

  • User를 생성할 때 UserSkill 도 같이 생성하도록 진행.

  • Project를 생성할 때 Tag와 ProjectTag 도 같이 생성하도록 작성.

  • Project 생성시에 현재 작성하는 User 기준으로 UserProject도 생성하도록 작성.

  • API 추가 생성에 대한 README.md의 REST API 명세 최신화.

필터링 기반 Page Resource 출력.

  • 필터링이 걸렸을 때 각각 원하는 데이터를 출력.

  • 필터가 지역 또는 포지션 둘 중 하나만 있는 상황에 따른 데이터 처리.

  • 필터가 지역과 포지션 둘 다 있는 상황에 따른 데이터 처리.

DoneProject 로직 작성.

  • DoneProject 생성 로직 작성.

  • DoneProject 수정 로직 작성.

  • DoneProject 삭제 로직 작성.

  • REST API 명세 작성.

Response Header에 Link 혜더와 Location 혜더를 담는 로직 변경.

  • 기존에 HttpServletResponse를 이용해서 혜더를 담아주는 로직에서 API 요청시 ResponseEntity로 반환해줄 때 Link 헤더와 Location 혜더를 담아서 보내주는 방식으로 변경.

  • 로직 변경으로 인해 프로젝트 내 모든 API 로직에 변경된 방식으로 리팩토링을 반양해야함.

도메인 추가 및 변경 사항

1. Project.class의 변경 사항

  • start_date, end_date, deadline 컬럼 삭제
  • status Enum Data 수정 (모집중, 진행중, 완료)

2. DoneProject 도메인 생성

  • 해당 도메인은 완료된 프로젝트의 정보와 외부에서 진행한 프로젝트를 커버하기 위함
  • 명세에 따른 생성

3. Tag 도메인 생성

  • 프로젝트 별 필요 기술을 태깅하고, 태깅 별 검색을 제공하기 위함
  • 프로젝트와 M:N 관계성으로 매핑됨

4. UserSkill 도메인 생성

  • 각 유저들이 보유한 스킬 정보를 담는 도메인

5. UsedrSkill 도메인 생성

  • DoneProject에 기술 될 스킬 정보를 담는 도메인

jwt 토큰에 담기는 정보에 관해서

jwt 토큰에서 로그인 유저 정보를 가져오려고 하는데,
email 뿐만아니라 idxnickname도 함께 담겨있어야 할거 같습니다.

그리고 유저 정보가 담겨있는 payload 부분의 키가 모호한데 사진과 같이 가능한지도 궁금합니다~
Screen Shot 2019-08-31 at 5 19 27 PM

join table 조합키 생성

  • UserProject 해당 테이블은 조인테이블로 table idx column 삭제
  • PK, FK (user_idx, project_idx) 로 변경해야함

REST API 명세 작성.

  • REST API URL 매핑을 위한 명세 작성.

  • 명세를 통하여 보다 명확한 API 사용을 위함.

`build.gradle` dependencies add convention

  • 내림차순 의존성 추가
  • 해당 의존성이 사용되는 목적 기술
  • 관련된 의존성은 모아서 관리
  • 현재 사용되지 않는 의존성은 따로 관리

DTO 모델 수정

  • DTO class들에 idx 필드 추가
  • DTO class들에 명세에 따른 제약추가
  • ex) @NotBlack, @Length, @Email

파일 업로드, 다운로드 구현

MultipartFile을 이용한 File Upload, Downlaod 구현

  • 파일 업로드, 다운로드 컨트롤러 구현
  • 파일 관련 도메인을 생성하는 것에 대한 논의 필요
  • 파일명 처리(중복 불가)

`ERR_ADDRESS_UNREACHABLE` 에러 발생

서버를 꺼놨거나 포트가 바꼈나요?
리스트 요청이랑 로그인 요청때 아래처럼 에러가 뜨네요

Screen Shot 2019-09-13 at 2 16 51 PM

p.s. 추석 다 보내고 고치기

각 태그들 전체를 가져올 수 있는 API 생성.

  • User의 스킬들을 전부 가져올 수 있는 /api/userskills api 생성

  • Project의 태그들을 전부 가져올 수 있는 /api/tags api 생성

  • DoneProject의 스킬들을 전부 가져올 수 있는 /api/usedskills api 생성

  • API 추가 생성에 대한 README.md의 REST API 명세 최신화.

POST 요청시 400 에러

POST 요청을 하니 400 에러가 뜨는데, 내가 보내야하는 데이터 포맷 양식 작성해줄수있나?

  const result = {
        content: "fewaf",
        designerRecruits: 1,
        developerRecruits: 0,
        etcRecruits: 2,
        location: "부산",
        marketerRecruits: 2,
        plannerRecruits: 1,
        socialUrl: "",
        summary: "awer",
        tags: [],
        title: "feafaew"
      };

이렇게 보내는중

도메인 제약 추가

  • 각 도메인별 DB 명세에 따른 제약추가

  • 예시

    @Column(length=255, nullable=false)
    private String content;

로그아웃 시 jwt 만료 방법론

현재 생성된 token에 user와 관계성을 매핑하여 DB에 저장하고 상태를 나타내는 컬럼을 이용해 해당 토큰의 유효성을 검증하는데, 굳이 모든 토큰들을 DB에 저장할 필요가 없다고 생각됨, 관련 자료를 찾아본 결과 유저가 직접 로그아웃 요청을 한 토큰들에 대해서 블랙리스트를 만들어 관리하는 방법, 엑세스 토큰과 리프레쉬 토큰 두 가지를 이용해 관리 하는 방법 등을 찾을 수 있었음. 관련자료

프로젝트 매칭 관련 로직 작성.

  • 프로젝트 지원 하기 로직 작성 POST

  • 프로젝트 지원자 관리 로직 작성 PUT

    • 대기중 -> 매칭.

    • 대기중 -> 거절.

  • 지원 취소 로직 작성. DELETE

  • REST API 명세 추가.

Tag 처리를 위한 DTO 수정

1, ProfileDTO 수정 사항

  • 각 유저가 보유하고 있는 스킬 태그 필드 추가

2. ProjectsDTO 수정 사항

  • 각 프로젝트 별 필요 기술 태그를 의미하는 태그 필드 추가

3. ProjectDTO 수정 사항

  • 상기 내용과 동일

4. DoneProjectDTO 생성

  • 완료된 프로젝트와 외부 프로젝트를 처리하는 DoneProjectDTO 생성

  • 변경된 내용들을 적용하기 위한 서비스 로직 변경 필요.

Login API 구현.

  • Login 및 Logout 기능 구현.

  • Spring Security 를 이용하여 구현.

  • JWT 형식으로 로그인 시에 클라이언트에게 유효한 토큰을 반환해줄 것.

  • 로그아웃시 토큰의 유효성을 만료시키도록 구현할 것.

  • JWT Token을 서버단에서 관리하도록 구현할 것.

memberDTO 생성

  • project_detail page에 해당 프로젝트와 관련된 인원들에 대한 데이터를 포함하도록 변경

    • ex) api/project/1/members -> 1번 프로젝트에 연관된 인원들에 대한 정보

project, doneProject 리스트에 기술 태그 부분 json 데이터

현재 리스트로 받아오는 프로젝트 데이터( project 리스트, doneProject 리스트)의 기술 태그 부분이
json 데이터에 프로퍼티로 있는게 아니라 link 태그로 한번 더 요청을 해서 가져오게 되어있는데, 한번 더 요청하게 하는게 아니라 tags: [ {idx: 1, text: 스프링}, { idx: 2, text: Node.js}, ... ] 라는 프로퍼티로 나오게 하는게 더 좋을거 같다.

단일 프로젝트에서 리소스 단위로 요청하는건 얼마 안되서 괜찮치만, 리스트로 보여주는 페이지들은
4개가 있다면 4번요청, 10개씩 불러온다면 10번 요청, 20개씩 불러온다면 20번 요청을 해야되니까 페이지는 한개인데 서버로 요청도 너무 많이가고 버그로 이어질 수 도 있을거 같아서 제안합니다

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.