Code Monkey home page Code Monkey logo

devnote's Introduction

개발자 노트(Devnote)

travis-ci

분산형 문서작성 환경: 개발자노트(DEVNOTE)

Distributed simple document writing environment

개발자노트?

SW개발에 있어서 문서(메뉴얼, 노트, 이미지, 리소스 파일 등등)는 매우 중요합니다. 특히 협업 개발이 강조되는 오픈소스 SW개발에서는 SPEC/MANUAL 등을 얼마나 체계적으로 잘 작성하느냐가 프로젝트의 진행에 큰 영향을 미치기도 합니다. 하지만 아이러니하게도 기술이나 제품이 강조되는 것에 비해 이런 부분은 종종 간과되거나 체계적으로 관리되지 않습니다.

여기에는 근본적인 몇 가지 이유가 있습니다

  • 여러프로젝트에 사용 할 만한 공통적인 개발 문서 표준이 없음
  • 개발자는 MS WORD/HWP등의 복잡한 서식을 요구하는 문서 작성에 익숙하지 않음
  • 단순 문자 저장방식(plain text)의 문서는 서식이 존재하지 않아서 보기가 불편함 (제목, 문단, 강조 등등)
  • 파일 기반 ( .hwp 파일이나 .docx .pptx 등의 파일)은 공동 작업을 수행하거나, 관리 보관이 쉽지 않음
  • 문서는 또한 버전이 관리가 되어야 하는데 파일이름에 기반한 방식(xx-1.0.doc, xx-1.1.doc, xx-1.1.140515.doc와 같은 방식)은 불편하고 유실의 위험이 있습니다.
  • 온라인에 저장(위키나 게시판을 이용)하는 방식은 자료를 이전하거나 분리, 혹은 타인이나 타팀의 자료와 합치기가 어려우며 오프라인 환경에서는 매우 취약함
  • 특히 기존의 위키 방식들은 각각의 위키에 맞는 문법을 배워야 하는 불편함과 비 개발인력(디자이너/기획자)등의 접근어려움이 있습니다.

따라서 익숙한 인터페이스로 쉽게 작성가능하면서도 온라인과 오프라인을 함께 지원하고 인력이나 팀의 분할/병합에 따라 그 때 그 때 컨텐츠 분리와 합침이 자유로운 분산환경 기반 문서 관리 시스템이 꼭 필요합니다.

그걸 목표로 분산형 문서작성 환경인 개발자노트(DEVNOTE) 프로젝트가 시작되었습니다.

실행 화면

실행방법

node.js 최신버전을 다운로드 받아 설치

쉘에서 아래의 명령을 실행하여 devnote 설치

git clone https://github.com/nforge/devnote.git
cd devnote
npm install --production

쉘에서 아래의 명령을 실행하여 devnote 실행

npm start --production

개발 참여를 위한 준비

C++ 컴파일러 설치

Python 설치

쉘에서 아래 명령을 실행하여 개발 및 테스트에 필요한 npm 모듈 설치

npm install --production=false

테스트 실행해보기

npm test

특징

  1. Server-side/Front-end 모두 자바스크립트로만 작성되어 있습니다.
    • 프로젝트 빌드에서 테스트, Template, i18n에 이르기까지 제품코드는 모두 javascript로 만들었습니다.
    • 하단의 설계도 그림을 보시면 좀 더 이해가 빠르실겁니다.
  2. 동일한 코드를 Server-side/Front-end 양쪽에서 사용합니다.
    • 이를테면 markdown 렌더링을 클라이언트에서 하고 있다가, 필요에 따라서는 서버에서 해서 보내거나, 그 반대로 하는 것이 가능합니다.
    • 이를 통해 능동적인 부하분산/클라이언트 환경에 따른 적절한 대응이 가능합니다.
  3. Data Store로 DB를 사용하지 않고 git과 command level에서 호환되는 파일구조로 문서(컨텐츠, 첨부파일 등등)를 저장하도록 만들었습니다.
    • 따라서 온라인에서만 문서를 작성하는 것이 아니라 git을 사용해서 게시물의 내용을 로컬로 내려받고 수정해서 다시 올리는 것도 가능합니다.
    • 표준 문서 포맷으로 markdown을 사용합니다.
    • 개발자들이 최소한의 구조화된 문서를 작성하는데에 훌륭한 구조입니다. (github 기본 문서포맷 중 하나) (하단부의 'GIT compatible storage 실습' 참조)
  4. ** 문서를 작성할 때 마크다운 문법 강조기능과 미리보기 기능을 제공합니다.**
    • 새노트 작성시 우측의 접기 버튼을 누르면 preview를 볼 수 있습니다.
  5. ** 동시 편집시 충돌을 실시간으로 표시**
    • 동일한 제목의 글을 2명 이상이 동시에 작성하려고 하면 어떤 사용자가 현재 편집을 하려고 하는 중인지를 실시간으로 알려줍니다.
  6. Mobile 지원
    • 근래에는 당연한 이야기지만 responsive design이 적용되어 있어 모바일에서도 불편없이 사용가능합니다.
    • 모바일에서 어떤 식으로 보이는지 보려면 브라우저의 가로폭을 줄여보세요. :)

GIT compatible storage 실습

아래 URL로 접속해 사용자를 추가합니다.

http://서버ip:3000/wikis/note/users/new

웹 페이지에 접근해서 새 노트(MyPage) 작성합니다. git clone으로 노트를 내려 받습니다.

git clone devnote@서버ip:{notes/note.git의 경로}

note 폴더내의 방금 작성한 노트제목의 파일을 열어서 내용 수정 수정된 페이지를 서버로 다시 올립니다.

git add MyPage

git commit -m "push test"

git push

웹 페이지로 접근해서 해당 내용 수정여부 확인합니다.

주의사항

  • 글의 갯수가 충분히 많이 늘어나면 느려지는 현상이 있습니다.
  • IE 10이상과 크롬/파이어폭스 사용을 권장합니다.

ROAD MAP

  • UI/UX 개선
  • TOC(Table of contents, 목차) 자동 작성 기능
  • PDF 등으로 출판(PUBLISHING)기능 지원
  • OPEN API 제공
  • 파일 저장 ENGINE 분리
  • 속도 개선

Architecture

Devnote Architecture

License

The MIT License

Copyright (c) 2012 NAVER & AUTHORS & CONTRIBUTORS

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.

devnote's People

Contributors

doortts avatar eungjun-yi avatar flyme avatar helols avatar k16wire avatar outsideris avatar

Stargazers

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

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

devnote's Issues

node node_modules/coffee-script/bin/coffee app.coffee 시 오류 발생

node version : v0.8.19
npm version : 1.1.71
CoffeeScript version 1.4.0

위 버전에서는 정상 동작

node version : v0.8.22
npm version : 1.2.14
CoffeeScript version 1.6.1

해당 버전에서는 아래와 같은 에러 발생

Error: In /tmp/devnote/wikiApp.coffee, Parse error on line 71: Unexpected 'INDENT'
at Object.parseError (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/parser.js:483:11)
at Object.parse (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/parser.js:535:22)
at exports.compile.compile (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/coffee-script.js:54:27)
at Object.loadFile (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/coffee-script.js:24:28)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object. (/tmp/devnote/app.coffee:22:13)
at Object. (/tmp/devnote/app.coffee:221:4)
at Module._compile (module.js:449:26)
at Object.exports.run (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/coffee-script.js:124:25)
at compileScript (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/command.js:166:29)
at fs.stat.notSources.(anonymous function) (/tmp/devnote/node_modules/coffee-script/lib/coffee-script/command.js:141:18)
at fs.readFile (fs.js:176:14)
at Object.oncomplete (fs.js:297:15)

관리 메뉴 링크 추가

사용자 관리 및 메일 설정 메뉴가 현재는 보안없이 숨겨져 있는 상황입니다.
보안 처리가 안 되어 있는 상태에서 숨겨있는 것은 큰 의미 없다고 생각되어
"관리" 메뉴를 추가하였습니다.

jake build

를 실행하여야 locale 파일(ko.js)이 public 폴더로 이동되고 한글도 정상 표시됩니다.
아니면 영문으로만 메뉴가 나옵니다.

첫 접속 후 사용자 추가 버튼 클릭시 500 에러

증상 발생한 순서는 아래와 같습니다.

  • 홈 접속 -> 상단 '관리' 메뉴 -> 왼쪽 '사용자 추가' 클릭시 500 에러 발생
  • 사용자 목록 -> 상단의 '새 사용자 등록' 버튼도 같은 증상

에러 내용

Express
500 TypeError: /Users/ultrakain/Documents/workspace_node/devnote/views/admin/adduser.jade:24 22| label(for="email").control-label= __('Email') 23| div.controls > 24| input(type="text", name="email", id="email", required) 25| 26| div.control-group 27| label(for="timezone").control-label= __('Timezone') Cannot read property 'timezone' of undefined
22| label(for="email").control-label= __('Email')
23| div.controls

24| input(type="text", name="email", id="email", required)
25|
26| div.control-group
27| label(for="timezone").control-label= __('Timezone')
Cannot read property 'timezone' of undefined
at eval (eval at (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/jade/lib/jade.js:176:8))
at exports.compile (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/jade/lib/jade.js:181:12)
at Object.exports.render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/jade/lib/jade.js:216:14)
at View.exports.renderFile as engine
at View.render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/view.js:75:8)
at Function.app.render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/application.js:504:10)
at render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/response.js:623:9)
at res.render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/response.js:643:22)
at Array.exports.locals.locals.use as 0
at ServerResponse.res.render (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/response.js:634:19)

Installation problem on OS X 10.8

nvm으로 node.js v0.8.7을 설치했습니다. 소스코드 clone한 후에 npm install을 했는데 잘 진행되다 마지막이 이런 오류가 나옵니다.

> [email protected] postinstall /Users/bs0048/Projects/devnote
> node node_modules/jake/bin/cli.js build


module.js:340
    throw err;
          ^
Error: Cannot find module 'utilities'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/Users/bs0048/Projects/devnote/node_modules/jake/lib/jake.js:23:13)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:362:17)
npm ERR! [email protected] postinstall: `node node_modules/jake/bin/cli.js build`
npm ERR! `sh "-c" "node node_modules/jake/bin/cli.js build"` failed with 1
npm ERR! 
npm ERR! Failed at the [email protected] postinstall script.
npm ERR! This is most likely a problem with the n4wiki package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node node_modules/jake/bin/cli.js build
npm ERR! You can get their info via:
npm ERR!     npm owner ls n4wiki
npm ERR! There is likely additional logging output above.

npm ERR! System Darwin 12.0.0
npm ERR! command "/Users/bs0048/.nvm/v0.8.7/bin/node" "/Users/bs0048/.nvm/v0.8.7/bin/npm" "install"
npm ERR! cwd /Users/bs0048/Projects/devnote
npm ERR! node -v v0.8.7
npm ERR! npm -v 1.1.49
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/bs0048/Projects/devnote/npm-debug.log
npm ERR! not ok code 0

node를 잘 몰라 어디부터 손대야 할지 모르겠네요. 여기에 도움을 구해도 되는지 모르겠지만 조언 부탁드립니다.

계정 정보 수정화면에서 "현재 비밀번호", "새 비밀번호"를 넣지않고 수정시 500 에러 발생

계정 정보를 수정하는 화면 (사용자 설정 변경)에서 "현재 비밀번호", "새 비밀번호"를 넣지않고 "저장하기"를 누르면 500 에러 발생하는 증상입니다.

에러 내용은 아래와 같습니다.

500 Error: Too short password!
at _encodePassword (/Users/ultrakain/Documents/workspace_node/devnote/lib/users.js:68:13)
at Object.changePassword (/Users/ultrakain/Documents/workspace_node/devnote/lib/users.js:79:31)
at exports.postId (/Users/ultrakain/Documents/workspace_node/devnote/userApp.coffee:101:20)
at callbacks (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:171:11)
at param (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:145:11)
at param (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:142:11)
at pass (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:152:5)
at Router._dispatch (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:179:5)
at Object.router (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/lib/router/index.js:39:10)
at next (/Users/ultrakain/Documents/workspace_node/devnote/node_modules/express/node_modules/connect/lib/proto.js:190:15)

'npm install' invokes tests

사소한 것으로 이슈트래커를 채우는 것 같아 부담스럽지만^^ 설치를 마치고 http://localhost:3000/wikis/note/users 를 열어보니 racoon이라는 유저가 기본적으로 등록되어 있었습니다. 확인해보니 npm install이 postinstall에서 Jakefile을 실행하는데, build task가 test task도 같이 실행하게 되어있었습니다. 이것이 개발팀이 의도하신 동작인지 궁금합니다.

저는 node.js에는 문외한에 가깝습니다만^^ npm install은 packages.json에 적힌 모듈들을 설치하는 명령으로 알고 있습니다. 그런데 이 명령을 실행할 때마다 자동으로 테스트가 수행되면 매번 데이터가 초기화되는데, 의도하지 않게 데이터를 날리는 경우가 생기지 않을까요? 왜냐하면 packages.json에 모듈을 한두개 추가한 다음에도 실행할 수 있는 명령이니까요.

그리고 테스트 실행 후에 유저가 한 명 등록되게 되는데, 저는 제가 등록하지 않은 유저가 있어서 깜짝 놀랐었습니다^^ 그리고 공개된 서버에 설치하는 경우에는 위험할 수도 있다는 생각도 듭니다.

혹시 제가 잘못 생각한 부분이 있다면 가차없이 알려주세요.

한글 파일을 업로드시 반응 없음

파일명에 한글이 들어갈 경우 파일 업로드 기능이 동작하지 않음

서버측 에러

debug - set heartbeat interval for client aMa64SsmXcl337yXQSuJ
uncaughtException occurred! ------> ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어'
{ [Error: ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어']
  errno: 34,
  code: 'ENOENT',
  path: '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어' }
uncaughtException occurred! ------> ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어'
{ [Error: ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어']
  errno: 34,
  code: 'ENOENT',
  path: '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어' }
uncaughtException occurred! ------> ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어'
{ [Error: ENOENT, mkdir '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어']
  errno: 34,
  code: 'ENOENT',
  path: '/Users/ultrakain/Documents/workspace_node/devnote/public/attachment/[Android/iOS] 알림음 스토어' }
   debug - emitting heartbeat for client aMa64SsmXcl337yXQSuJ
   debug - websocket writing 2::
   debug - set heartbeat timeout for client aMa64SsmXcl337yXQSuJ
   debug - got heartbeat packet
   debug - cleared heartbeat timeout for client aMa64SsmXcl337yXQSuJ
   debug - set heartbeat interval for client aMa64SsmXcl337yXQSuJ
   info  - transport end (undefined)
   debug - set close timeout for client aMa64SsmXcl337yXQSuJ
   debug - cleared close timeout for client aMa64SsmXcl337yXQSuJ
   debug - cleared heartbeat interval for client aMa64SsmXcl337yXQSuJ
   debug - discarding transport
wiki.writePage: Cancel commit because of no changes.

문서 편집 > 저장 > 편집시 "Cannot GET..." 에러 발생

  1. 문서를 선택
  2. 편집 모드
  3. 저장
  4. 다시 편집 모드시 아래의 에러 발생
GET /font/NanumGothic.woff 404 0ms
GET /wikis/note/pages/%5BAndroid/iOS%5D%20%EC%95%8C%EB%A6%BC%EC%9D%8C%20%EC%8A%A4%ED%86%A0%EC%96%B4?action=edit 404 1ms
GET /font/NanumGothic.woff 404 0ms
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized P08UkzOJ5IqdOFu9QSuK
GET /font/NanumGothic.woff 404 1ms
   debug - setting request GET /socket.io/1/websocket/P08UkzOJ5IqdOFu9QSuK
   debug - set heartbeat interval for client P08UkzOJ5IqdOFu9QSuK
   debug - client authorized for 
   debug - websocket writing 1::
   debug - websocket writing 5:::{"name":"connected","args":["P08UkzOJ5IqdOFu9QSuK"]}
   info  - transport end (undefined)
   debug - set close timeout for client P08UkzOJ5IqdOFu9QSuK
   debug - cleared close timeout for client P08UkzOJ5IqdOFu9QSuK
   debug - cleared heartbeat interval for client P08UkzOJ5IqdOFu9QSuK
   debug - discarding transport
wiki.writePage: Cancel commit because of no changes.
GET /font/NanumGothic.woff 404 1ms
GET /wikis/note/pages/%5BAndroid/iOS%5D%20%EC%95%8C%EB%A6%BC%EC%9D%8C%20%EC%8A%A4%ED%86%A0%EC%96%B4?action=edit 404 0ms

설치 후 실행 시 highlight-c.js 이슈

우분투에서 git clone하고 설치 후 실행 시, 아래와 같이 나옵니다.

Error: Cannot find module '../public/scripts/highlight-c.js'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object. (/usr/local/devnote/lib/renderer.js:2:1)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)

파일을 뒤져보니 저 파일은 public/scripts가 아니라 lib 폴더에 있네요.

글쓰기때 브라우저 임시 저장되고 있는 상황을 보여주기

현재 새 글을 쓸 때, 불의의 사고에 대비해 브라우저 로컬저장소에 내용을 임시 저장하고 있습니다.

하지만 저장 여부 및 상태가 표시되지 않아,
알지 못하거나 불안해 하는 경우가 있습니다.

아이콘이나 메시지로 현재 저장상태를 알려주는 기능이 필요합니다.

히스토리 > 차이점 보기 버튼 누를 경우 404 에러

이슈

개별 노트의 히스토리에서 "차이점 보기" 버튼을 누르면 아래와 같이 오류가 발생합니다.

에러 내용

GET /wikis/note/pages/[Android/iOS]%20%EC%95%8C%EB%A6%BC%EC%9D%8C%20%EC%8A%A4%ED%86%A0%EC%96%B4?diffA=%255BAndroid%252FiOS%255D%2520%25EC%2595%258C%25EB%25A6%25BC%25EC%259D%258C%2520%25EC%258A%25A4%25ED%2586%25A0%25EC%2596%25B4%2Cc9c1772d7dc2a40ce5e7987ac4bb5d881fc75fdd&diffB=%255BAndroid%252FiOS%255D%2520%25EC%2595%258C%25EB%25A6%25BC%25EC%259D%258C%2520%25EC%258A%25A4%25ED%2586%25A0%25EC%2596%25B4%2Cc9c1772d7dc2a40ce5e7987ac4bb5d881fc75fdd&action=diff 404 0ms

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.