반응형

1. 소개

Prettier란 무엇인가?

Prettier는 코드 포맷터로, 코드를 일관성 있게 정리해 줍니다. JavaScript, TypeScript, CSS, HTML 등 다양한 언어를 지원합니다. 코드 스타일을 강제하여 코드의 가독성을 높이고, 팀원 간의 코드 스타일 충돌을 줄입니다.

Prettier의 필요성 및 장점

  • 일관된 코드 스타일: 팀원 간의 코드 스타일 차이를 줄여줍니다.
  • 자동화된 포맷팅: 코드 작성에 집중할 수 있도록 도와줍니다.
  • 쉬운 코드 리뷰: 포맷팅 이슈 없이 코드 로직에만 집중할 수 있습니다.

2. Prettier 설치

프로젝트 초기 설정

프로젝트를 새로 생성하거나 기존 프로젝트의 루트 디렉터리에서 다음 명령어를 실행합니다.

npm을 통한 Prettier 설치

npm install --save-dev prettier

yarn을 통한 Prettier 설치

yarn add --dev prettier

3. Prettier 설정 방법

설정 파일 형식

Prettier는 다양한 설정 파일 형식을 지원합니다. 설정 파일을 프로젝트 루트에 생성할 수 있습니다.

  • prettier.config.js 또는 .prettierrc.js: JavaScript 파일로 설정
    • module.exports = { printWidth: 80, tabWidth: 2, useTabs: false, semi: true, singleQuote: true, trailingComma: 'es5', bracketSpacing: true, jsxBracketSameLine: false, arrowParens: 'always', };
  • .prettierrc 또는.prettierrc.json: JSON 형식의 파일로 설정
    • { "printWidth": 80, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "es5", "bracketSpacing": true, "jsxBracketSameLine": false, "arrowParens": "always" }
  • .prettierrc.yml 또는 .prettierrc.yaml: YAML 형식의 설정 파일
    • printWidth: 80 tabWidth: 2 useTabs: false semi: true singleQuote: true trailingComma: es5 bracketSpacing: true jsxBracketSameLine: false arrowParens: always
  • package.json: package.json 파일 내에 설정
    • { "name": "your-project", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "prettier": "^2.3.2" }, "prettier": { "printWidth": 80, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "es5", "bracketSpacing": true, "jsxBracketSameLine": false, "arrowParens": "always" } }

일반적인 설정 옵션 설명

  • printWidth: 줄 바꿈을 할 최대 줄 길이 (default: 80)한 줄의 최대 길이가 80자로 설정됩니다.
    {
      "printWidth": 80
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)printWidth: 100설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)printWidth: 120설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
  • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
  • { "printWidth": 120 }
  • 한 줄의 최대 길이가 120자로 설정됩니다.
  • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
  • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
  • { "printWidth": 100 }
  • 한 줄의 최대 길이가 100자로 설정됩니다.
  • const exampleFunction = () => { console.log( 'This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.' ); };
  • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
  • 설정 파일 예시
  • printWidth: 80
  • tabWidth: 탭 한 칸의 공백 수 (default: 2)탭 한 칸의 공백 수가 2로 설정됩니다.
    {
      "tabWidth": 2
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)tabWidth: 4설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)tabWidth: 8설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • function example() { if (true) { console.log("Hello, world!"); } }
  • function example() { if (true) { console.log("Hello, world!"); } }
  • { "tabWidth": 8 }
  • 탭 한 칸의 공백 수가 8로 설정됩니다.
  • function example() { if (true) { console.log("Hello, world!"); } }
  • function example() { if (true) { console.log("Hello, world!"); } }
  • { "tabWidth": 4 }
  • 탭 한 칸의 공백 수가 4로 설정됩니다.
  • function example() { if (true) { console.log("Hello, world!"); } }
  • function example() { if (true) { console.log("Hello, world!"); } }
  • 설정 파일 예시
  • tabWidth: 2
  • useTabs: 탭을 사용할지 여부 (default: false)공백을 사용하여 들여쓰기를 합니다.
    {
      "useTabs": false,
      "tabWidth": 2
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)useTabs: true설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • function example() { console.log('Hello, world!'); }
  • function example() { console.log('Hello, world!'); }
  • { "useTabs": true, "tabWidth": 2 }
  • 탭을 사용하여 들여쓰기를 합니다.
  • function example() { console.log('Hello, world!'); }
  • function example() { console.log('Hello, world!'); }
  • 설정 파일 예시
  • useTabs: false
  • semi: 세미콜론을 사용할지 여부 (default: true)문장의 끝에 세미콜론을 추가합니다.
    {
      "semi": true
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)semi: false설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const message = 'Hello, world' function example() { console.log(message) }
  • const message = 'Hello, world'; function example() { console.log(message); }
  • { "semi": false }
  • 문장의 끝에 세미콜론을 추가하지 않습니다.
  • const message = 'Hello, world'; function example() { console.log(message); }
  • const message = 'Hello, world' function example() { console.log(message) }
  • 설정 파일 예시
  • semi: true
  • singleQuote: 작은 따옴표를 사용할지 여부 (default: false)문자열을 작은 따옴표로 감쌉니다.
    {
      "singleQuote": true
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)singleQuote: false설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const message = "Hello, world!"; function example() { console.log("Hello, world!"); }
  • const message = 'Hello, world!'; function example() { console.log('Hello, world!'); }
  • { "singleQuote": false }
  • 문자열을 큰 따옴표로 감쌉니다.
  • const message = 'Hello, world!'; function example() { console.log('Hello, world!'); }
  • const message = "Hello, world!"; function example() { console.log("Hello, world!"); }
  • 설정 파일 예시
  • singleQuote: true
  • trailingComma: 후행 콤마 사용 설정 (default: es5) (options : none, es5, all)후행 콤마를 사용하지 않습니다.
    {
      "trailingComma": "none"
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)trailingComma: "es5"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)trailingComma: "all"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c,) { console.log(a, b, c); }
  • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
  • { "trailingComma": "all" }
  • 모든 가능한 위치에 후행 콤마를 사용합니다. 이는 객체, 배열, 함수 매개변수 등에 적용됩니다.
  • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c) { console.log(a, b, c); }
  • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
  • { "trailingComma": "es5" }
  • ES5에서 유효한 후행 콤마를 사용합니다. 이는 객체, 배열 등에 후행 콤마를 사용하지만, 함수 매개변수에서는 사용하지 않습니다.
  • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
  • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c,) { console.log(a, b, c); }
  • 설정 파일 예시
  • trailingComma: "none"
  • bracketSpacing: 객체 리터럴에서 괄호 사이에 공백을 넣을지 여부 (default: true)
    {
      "bracketSpacing": true
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const obj = { foo: 'bar', baz: 'qux' };
  • const obj = {foo: 'bar',baz: 'qux'};
  • 설정 파일 예시
  • jsxBracketSameLine: JSX의 마지막 **>**를 같은 줄에 둘지 여부 (default: false)JSX의 마지막 **>**를 다음 줄에 둡니다.
    {
      "jsxBracketSameLine": false
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)jsxBracketSameLine: true설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const element = ( <div className="container"> <h1>Hello, world!</h1> </div> );
  • const element = ( <div className="container" > <h1>Hello, world!</h1> </div> );
  • { "jsxBracketSameLine": true }
  • JSX의 마지막 **>**를 같은 줄에 둡니다.
  • const element = ( <div className="container" > <h1>Hello, world!</h1> </div> );
  • const element = ( <div className="container"> <h1>Hello, world!</h1> </div> );
  • 설정 파일 예시
  • jsxBracketSameLine: false
  • arrowParens: 화살표 함수의 매개변수에 괄호를 사용할지 여부 (default: always) (options: always, avoid)항상 화살표 함수의 매개변수를 괄호로 감쌉니다.
    {
      "arrowParens": "always"
    }
    
    코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)arrowParens: "avoid"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
  • const add = x => x + 1; const greet = name => `Hello, ${name}!`;
  • const add = (x) => x + 1; const greet = (name) => `Hello, ${name}!`;
  • { "arrowParens": "avoid" }
  • 가능한 경우 화살표 함수의 매개변수를 괄호로 감싸지 않습니다.
  • const add = (x) => x + 1; const greet = (name) => `Hello, ${name}!`;
  • const add = x => x + 1; const greet = name => `Hello, ${name}!`;
  • 설정 파일 예시
  • arrowParens: "always"

.prettierignore 파일 사용법

포맷팅에서 제외할 파일이나 디렉터리를 지정합니다.

node_modules/
build/
dist/

4. Prettier와 ESLint 통합

ESLint와 Prettier의 차이점

ESLint는 코드 품질과 스타일을 체크하며, Prettier는 코드 포맷팅에 중점을 둡니다.

ESLint와 Prettier를 함께 사용해야 하는 이유

둘을 함께 사용하면 코드 품질과 스타일을 모두 관리할 수 있습니다.

eslint-config-prettier 및 eslint-plugin-prettier 설치 및 설정

$ npm install --save-dev eslint-config-prettier eslint-plugin-prettier

ESLint 설정 파일 (.eslintrc.json 또는 .eslintrc.js)에 다음을 추가합니다.

{
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}

5. Prettier 사용 방법

CLI를 통한 사용

$ npx prettier --write .

IntelliJ IDEA에서 사용

  1. Prettier 플러그인 설치: IntelliJ IDEA에서 File -> Settings -> **Plugins**로 이동하여 Prettier 플러그인을 설치합니다.
  1. Prettier 설정: File -> Settings -> Languages & Frameworks -> JavaScript -> **Prettier**로 이동하여 Prettier가 설치된 경로를 설정합니다.

Git Hook을 통한 자동 포맷팅 설정 (Husky 및 lint-staged 사용)

npm install --save-dev husky lint-staged

**package.json**에 다음을 추가합니다.

"husky": {
  "hooks": {
    "pre-commit": "lint-staged"
  }
},
"lint-staged": {
  "*.js": ["prettier --write", "git add"]
}

6. 프로젝트에 Prettier 적용

기존 코드베이스에 Prettier 적용

기존 코드에 Prettier를 적용하려면 CLI 명령어를 실행합니다.

$ npx prettier --write .

커밋 전에 코드 포맷팅 검증

위에서 설정한 Husky와 lint-staged를 통해 커밋 전에 코드가 포맷팅되었는지 확인합니다.

7. CI/CD 파이프라인에서 Prettier 사용

Prettier를 CI 파이프라인에 포함시키기

CI 도구의 설정 파일에 Prettier 검사를 추가합니다. 예를 들어, GitHub Actions의 경우:

name: CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'
    - run: npm install
    - run: npx prettier --check .

8. 자주 발생하는 문제 및 해결 방법

일반적인 오류와 해결 방법

  • 포맷팅 충돌: Prettier와 ESLint 설정이 충돌할 때는 **eslint-config-prettier**를 사용해 해결합니다.
  • 적용되지 않는 포맷팅: 설정 파일이나 ignore 파일의 위치를 확인합니다.

Prettier와 ESLint 간의 충돌 해결

ESLint 설정에서 Prettier와 관련된 규칙을 비활성화합니다.

9. 최고의 활용 방법

팀 협업 시 Prettier 설정 공유

프로젝트 루트에 .prettierrc 파일을 포함하여 모든 팀원이 동일한 설정을 사용하게 합니다.

코드 리뷰 시 Prettier 사용 권장 사항

코드 리뷰 과정에서 포맷팅 이슈가 없도록 미리 Prettier를 실행합니다.

10. 결론

Prettier를 사용하여 얻을 수 있는 장점 요약

  • 코드 일관성 유지
  • 코드 리뷰 간소화
  • 개발 효율성 증대1. 소개Prettier는 코드 포맷터로, 코드를 일관성 있게 정리해 줍니다. JavaScript, TypeScript, CSS, HTML 등 다양한 언어를 지원합니다. 코드 스타일을 강제하여 코드의 가독성을 높이고, 팀원 간의 코드 스타일 충돌을 줄입니다.
    • 일관된 코드 스타일: 팀원 간의 코드 스타일 차이를 줄여줍니다.
    • 자동화된 포맷팅: 코드 작성에 집중할 수 있도록 도와줍니다.
    • 쉬운 코드 리뷰: 포맷팅 이슈 없이 코드 로직에만 집중할 수 있습니다.
    2. Prettier 설치프로젝트를 새로 생성하거나 기존 프로젝트의 루트 디렉터리에서 다음 명령어를 실행합니다.
    npm install --save-dev prettier
    
    yarn을 통한 Prettier 설치3. Prettier 설정 방법Prettier는 다양한 설정 파일 형식을 지원합니다. 설정 파일을 프로젝트 루트에 생성할 수 있습니다.
    • prettier.config.js 또는 .prettierrc.js: JavaScript 파일로 설정
    • module.exports = { printWidth: 80, tabWidth: 2, useTabs: false, semi: true, singleQuote: true, trailingComma: 'es5', bracketSpacing: true, jsxBracketSameLine: false, arrowParens: 'always', };
    • .prettierrc 또는.prettierrc.json: JSON 형식의 파일로 설정
    • { "printWidth": 80, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "es5", "bracketSpacing": true, "jsxBracketSameLine": false, "arrowParens": "always" }
    • .prettierrc.yml 또는 .prettierrc.yaml: YAML 형식의 설정 파일
    • printWidth: 80 tabWidth: 2 useTabs: false semi: true singleQuote: true trailingComma: es5 bracketSpacing: true jsxBracketSameLine: false arrowParens: always
    • package.json: package.json 파일 내에 설정
    • { "name": "your-project", "version": "1.0.0", "main": "index.js", "license": "MIT", "devDependencies": { "prettier": "^2.3.2" }, "prettier": { "printWidth": 80, "tabWidth": 2, "useTabs": false, "semi": true, "singleQuote": true, "trailingComma": "es5", "bracketSpacing": true, "jsxBracketSameLine": false, "arrowParens": "always" } }
    일반적인 설정 옵션 설명
    • printWidth: 줄 바꿈을 할 최대 줄 길이 (default: 80)한 줄의 최대 길이가 80자로 설정됩니다.
      {
        "printWidth": 80
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)printWidth: 100설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)printWidth: 120설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • javascript코드 복사 const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
    • javascript코드 복사 const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
    • json코드 복사 { "printWidth": 120 }
    • 한 줄의 최대 길이가 120자로 설정됩니다.
    • javascript코드 복사 const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
    • javascript코드 복사 const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
    • json코드 복사 { "printWidth": 100 }
    • 한 줄의 최대 길이가 100자로 설정됩니다.
    • const exampleFunction = () => { console.log( 'This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.' ); };
    • const exampleFunction = () => { console.log('This is a very long line that will exceed the print width and should be wrapped into multiple lines by Prettier.'); };
    • 설정 파일 예시
    • printWidth: 80
    • tabWidth: 탭 한 칸의 공백 수 (default: 2)탭 한 칸의 공백 수가 2로 설정됩니다.
      {
        "tabWidth": 2
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)tabWidth: 4설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)tabWidth: 8설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • function example() { if (true) { console.log("Hello, world!"); } }
    • function example() { if (true) { console.log("Hello, world!"); } }
    • { "tabWidth": 8 }
    • 탭 한 칸의 공백 수가 8로 설정됩니다.
    • function example() { if (true) { console.log("Hello, world!"); } }
    • function example() { if (true) { console.log("Hello, world!"); } }
    • { "tabWidth": 4 }
    • 탭 한 칸의 공백 수가 4로 설정됩니다.
    • function example() { if (true) { console.log("Hello, world!"); } }
    • function example() { if (true) { console.log("Hello, world!"); } }
    • 설정 파일 예시
    • tabWidth: 2
    • useTabs: 탭을 사용할지 여부 (default: false)공백을 사용하여 들여쓰기를 합니다.
      {
        "useTabs": false,
        "tabWidth": 2
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)useTabs: true설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • function example() { console.log('Hello, world!'); }
    • function example() { console.log('Hello, world!'); }
    • { "useTabs": true, "tabWidth": 2 }
    • 탭을 사용하여 들여쓰기를 합니다.
    • function example() { console.log('Hello, world!'); }
    • function example() { console.log('Hello, world!'); }
    • 설정 파일 예시
    • useTabs: false
    • semi: 세미콜론을 사용할지 여부 (default: true)문장의 끝에 세미콜론을 추가합니다.
      {
        "semi": true
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)semi: false설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const message = 'Hello, world' function example() { console.log(message) }
    • const message = 'Hello, world'; function example() { console.log(message); }
    • { "semi": false }
    • 문장의 끝에 세미콜론을 추가하지 않습니다.
    • const message = 'Hello, world'; function example() { console.log(message); }
    • const message = 'Hello, world' function example() { console.log(message) }
    • 설정 파일 예시
    • semi: true
    • singleQuote: 작은 따옴표를 사용할지 여부 (default: false)문자열을 작은 따옴표로 감쌉니다.
      {
        "singleQuote": true
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)singleQuote: false설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const message = "Hello, world!"; function example() { console.log("Hello, world!"); }
    • const message = 'Hello, world!'; function example() { console.log('Hello, world!'); }
    • { "singleQuote": false }
    • 문자열을 큰 따옴표로 감쌉니다.
    • const message = 'Hello, world!'; function example() { console.log('Hello, world!'); }
    • const message = "Hello, world!"; function example() { console.log("Hello, world!"); }
    • 설정 파일 예시
    • singleQuote: true
    • trailingComma: 후행 콤마 사용 설정 (default: es5) (options : none, es5, all)후행 콤마를 사용하지 않습니다.
      {
        "trailingComma": "none"
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)trailingComma: "es5"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)trailingComma: "all"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c,) { console.log(a, b, c); }
    • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
    • { "trailingComma": "all" }
    • 모든 가능한 위치에 후행 콤마를 사용합니다. 이는 객체, 배열, 함수 매개변수 등에 적용됩니다.
    • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c) { console.log(a, b, c); }
    • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
    • { "trailingComma": "es5" }
    • ES5에서 유효한 후행 콤마를 사용합니다. 이는 객체, 배열 등에 후행 콤마를 사용하지만, 함수 매개변수에서는 사용하지 않습니다.
    • const obj = { foo: 'bar', baz: 'qux' }; const arr = [ 'one', 'two', 'three' ]; function example(a, b, c) { console.log(a, b, c); }
    • const obj = { foo: 'bar', baz: 'qux', }; const arr = [ 'one', 'two', 'three', ]; function example(a, b, c,) { console.log(a, b, c); }
    • 설정 파일 예시
    • trailingComma: "none"
    • bracketSpacing: 객체 리터럴에서 괄호 사이에 공백을 넣을지 여부 (default: true)
      {
        "bracketSpacing": true
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const obj = { foo: 'bar', baz: 'qux' };
    • const obj = {foo: 'bar',baz: 'qux'};
    • 설정 파일 예시
    • jsxBracketSameLine: JSX의 마지막 **>**를 같은 줄에 둘지 여부 (default: false)JSX의 마지막 **>**를 다음 줄에 둡니다.
      {
        "jsxBracketSameLine": false
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)jsxBracketSameLine: true설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const element = ( <div className="container"> <h1>Hello, world!</h1> </div> );
    • const element = ( <div className="container" > <h1>Hello, world!</h1> </div> );
    • { "jsxBracketSameLine": true }
    • JSX의 마지막 **>**를 같은 줄에 둡니다.
    • const element = ( <div className="container" > <h1>Hello, world!</h1> </div> );
    • const element = ( <div className="container"> <h1>Hello, world!</h1> </div> );
    • 설정 파일 예시
    • jsxBracketSameLine: false
    • arrowParens: 화살표 함수의 매개변수에 괄호를 사용할지 여부 (default: always) (options: always, avoid)항상 화살표 함수의 매개변수를 괄호로 감쌉니다.
      {
        "arrowParens": "always"
      }
      
      코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)arrowParens: "avoid"설정 파일 예시코드 예시 (포맷팅 전)코드 예시 (포맷팅 후)
    • const add = x => x + 1; const greet = name => `Hello, ${name}!`;
    • const add = (x) => x + 1; const greet = (name) => `Hello, ${name}!`;
    • { "arrowParens": "avoid" }
    • 가능한 경우 화살표 함수의 매개변수를 괄호로 감싸지 않습니다.
    • const add = (x) => x + 1; const greet = (name) => `Hello, ${name}!`;
    • const add = x => x + 1; const greet = name => `Hello, ${name}!`;
    • 설정 파일 예시
    • arrowParens: "always"
    .prettierignore 파일 사용법
    node_modules/
    build/
    dist/
    
    4. Prettier와 ESLint 통합ESLint는 코드 품질과 스타일을 체크하며, Prettier는 코드 포맷팅에 중점을 둡니다.둘을 함께 사용하면 코드 품질과 스타일을 모두 관리할 수 있습니다.
    $ npm install --save-dev eslint-config-prettier eslint-plugin-prettier
    
    ESLint 설정 파일 (.eslintrc.json 또는 .eslintrc.js)에 다음을 추가합니다.5. Prettier 사용 방법
    $ npx prettier --write .
    
    IntelliJ IDEA에서 사용
    1. Prettier 플러그인 설치: IntelliJ IDEA에서 File -> Settings -> **Plugins**로 이동하여 Prettier 플러그인을 설치합니다.
    1. Prettier 설정: File -> Settings -> Languages & Frameworks -> JavaScript -> **Prettier**로 이동하여 Prettier가 설치된 경로를 설정합니다.
    **package.json**에 다음을 추가합니다.6. 프로젝트에 Prettier 적용기존 코드에 Prettier를 적용하려면 CLI 명령어를 실행합니다.커밋 전에 코드 포맷팅 검증7. CI/CD 파이프라인에서 Prettier 사용CI 도구의 설정 파일에 Prettier 검사를 추가합니다. 예를 들어, GitHub Actions의 경우:8. 자주 발생하는 문제 및 해결 방법
    • 포맷팅 충돌: Prettier와 ESLint 설정이 충돌할 때는 **eslint-config-prettier**를 사용해 해결합니다.
    • 적용되지 않는 포맷팅: 설정 파일이나 ignore 파일의 위치를 확인합니다.
    Prettier와 ESLint 간의 충돌 해결9. 최고의 활용 방법프로젝트 루트에 .prettierrc 파일을 포함하여 모든 팀원이 동일한 설정을 사용하게 합니다.코드 리뷰 과정에서 포맷팅 이슈가 없도록 미리 Prettier를 실행합니다.Prettier를 사용하여 얻을 수 있는 장점 요약
    • 코드 일관성 유지
    • 코드 리뷰 간소화
    • 개발 효율성 증대
  • 10. 결론
  • 코드 리뷰 시 Prettier 사용 권장 사항
  • 팀 협업 시 Prettier 설정 공유
  • ESLint 설정에서 Prettier와 관련된 규칙을 비활성화합니다.
  • 일반적인 오류와 해결 방법
  • name: CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Node.js uses: actions/setup-node@v2 with: node-version: '14' - run: npm install - run: npx prettier --check .
  • Prettier를 CI 파이프라인에 포함시키기
  • 위에서 설정한 Husky와 lint-staged를 통해 커밋 전에 코드가 포맷팅되었는지 확인합니다.
  • $ npx prettier --write .
  • 기존 코드베이스에 Prettier 적용
  • "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "*.js": ["prettier --write", "git add"] }
  • npm install --save-dev husky lint-staged
  • Git Hook을 통한 자동 포맷팅 설정 (Husky 및 lint-staged 사용)
  • CLI를 통한 사용
  • { "extends": [ "eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended", "prettier" ], "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
  • eslint-config-prettier 및 eslint-plugin-prettier 설치 및 설정
  • ESLint와 Prettier를 함께 사용해야 하는 이유
  • ESLint와 Prettier의 차이점
  • 포맷팅에서 제외할 파일이나 디렉터리를 지정합니다.
  • 설정 파일 형식
  • yarn add --dev prettier
  • npm을 통한 Prettier 설치
  • 프로젝트 초기 설정
  • Prettier의 필요성 및 장점
  • Prettier란 무엇인가?
반응형

선언

CString str;

time_t Itime;

struct tm *cur;

time(&Itime);

cur = localtime(&Itime);  // 현재시간을 얻음


사용

str.Format(_T("[%04d/%02d/%02d %02d:%02d:%02d]"),

                     cur->tm_year+1900, cur->tm_mon + 1, cur->tm_mday, cur->tm_hour, cur->tm_min, cur->tm_sec);

                  


출력

2017/04/21 06:21:33

'Study Note > Programming' 카테고리의 다른 글

[MFC] 정적인 그래프 그리기.  (0) 2017.02.07
[OpenCV]OpenCV를 이용해 영상 출력  (2) 2017.01.09
[OpenCV] 이미지 출력하기.  (0) 2017.01.06
[OpenCV] 설치 및 설정 (VS)  (0) 2017.01.06
[MFC] assert() 함수  (1) 2016.11.22
반응형

서버 컴퓨터를 따로두고 쿼리박스를 이용해 접속하고자 하니


"'192.168.0.*' is not allowed to connect to this MySQL server ~ " 와 같은 에러가 발생 했다.


처음엔 방화벽 혹은 단순 네트워크 문제라 생각했지만 구글링해보니 문제는 간단하였다.


계정에 IP 권한을 막는 기능이 존재 한다고 한다.


아래와 같은 쿼리를 해당 서버컴에 날려주면 쉽게 해결된다.


mysql> GRANT ALL PRIVILEGES ON *.* TO 'username' @'%' identified by 'passwd';



'Study Note > Database' 카테고리의 다른 글

Oracle 11g Release 2 installation on Windows  (0) 2016.03.01
Log Miner 활용과 Redo log 장애  (0) 2016.02.26
Offline 백업 본을 이용한 DB 복구  (0) 2016.02.26
Control File 장애 복구  (0) 2016.02.26
Hot Backup  (0) 2016.02.26
반응형

네이버 자율주행차 '진짜 도로' 달려요

국내 IT업계 최초 시험주행
내달 서울모터쇼2017도 참가

네이버 자율주행차 '진짜 도로' 달려요

네이버가 국내 정보기술(IT) 업계에서는 처음으로 일반 도로에서 자율주행차 시험 주행에 나선다.

네이버는 네이버랩스가 국토부가 부여하는 자율 주행차 임시운행 허가를 받았다고 20일 밝혔다. 네이버랩스는 지난달 네이버에서 별도 법인으로 독립한 자회사다.

현재까지 네이버랩스를 포함해 일부 자동차 관련 업체와 대학 및 연구소 등 8개 기관·기업에서만 허가를 받았다. 

업계에서는 이번 임시 운행으로 국내 IT업계의 기술이 자율주행차에 접목돼 관련 산업 발전을 가속화할 것으로 기대하고 있다. 

현재 네이버랩스는 모빌리티(Mobility) 팀을 구성해 미래 이동성 개선과 도로 환경의 정보화를 목표로 자율 주행과 첨단운전자지원시스템(ADAS)과 관련된 다양한 기술 분야를 연구하고 있으며, 내달 열리는 ‘서울모터쇼 2017’ 에도 참가해 자사의 자율 주행 기술을 선보일 예정이다.

송창현 네이버랩스 대표는 “지난해 개발자 컨퍼런스 데뷰(Deview) 2016를 통해 공개했던 네이버랩스의 자율 주행 기술이 실제 도로 상에서 시험이 가능한 수준임을 인정받은 것”이라며 “실제 도로 주행을 통해 자율 주행 기술 개발에 가속이 붙을 것으로 예상한다”고 말했다. 


(URL : http://www.sedaily.com/NewsView/1OC6HRPBWE)


통신사에서 제일빠르게 나올 줄 알았던 자율주행차 네이버에서 제일먼저 나왔는데 이에 대한 행보가 궁금하네요~

반응형

정적 그래프를 처음해보기때문에 차근차근 진행해보도록 하겠다.


직접그려볼까 객체들을 찾아보다가 인터넷에 제공되는 API를 발견하였다.


 http://blog.tcltk.co.kr/?p=962 사이트에서

Chart Director를 알게되었다.


ChartDirector 홈페이지

  http://www.advsofteng.com/index.html


해당 홈페이지로 접속하셔서 Chart Demo 및 문서를 다운 받을 수 있다.

32bit 자료를 다운 받았다.


다운 받은 파일을 압축해제하면 아래와 같이 폴더 구성을 하고 있다.

 [cppdemo] : c++로 제작 된 chart 예제

 [doc] : 라이브러리 사용법이 들어있는 설명서

 [include] : Chart를 사용하기 위한 라이브러리 소스코드

 [lib] : 컴파일을 하기 위한 lib 파일과 실행을 위한 chartdir60.dll 파일이 포함되어 있습니다.

 [mfcdemo] : mfc로 제작 된 chart 예제

 [qtdemo] :  qt로 제작 된 chart 예제


여기서 사용하기위한 [include] 와 [lib] 폴더를 사용할 프로젝트 폴더에 복사한다.

또 mfcdemo/mfcdemo/폴더에 있는 ChartViewer의 .cpp .h 파일도 프로젝트 폴더에 복사한다.


[프로젝트 속성] - C/C++ 에서 라이브러리 폴더를 추가해주고

Link 탭에서 chairtdir60.lib 를 추가해준다.


PicControl을 추가해주고 type을 Bitmap으로 변경해 준다.

이후 변수 추가는 CChartViewer m_ChartView로 추가 해주었다.


dlg.h 에 ChartViewer.h를 Include해주고

dlg.cpp 에 아래 코드를 추가 해준다.

//OnInitDialog() 에 추가해야할 소스코드

// TODO: Add extra initialization here

// 차트에 필요한 데이터

    double data0[] = {42, 49, 33, 38, 51, 46, 29, 41, 44, 57, 59, 52, 37, 34, 51, 56,

        56, 60, 70, 76, 63, 67, 75, 64, 51};

    double data1[] = {50, 55, 47, 34, 42, 49, 63, 62, 73, 59, 56, 50, 64, 60, 67, 67,

        58, 59, 73, 77, 84, 82, 80, 84, 89};

    double data2[] = {87, 89, 85, 66, 53, 39, 24, 21, 37, 56, 37, 22, 21, 33, 13, 17,

        4, 23, 16, 25, 9, 10, 5, 7, 6};

    const char *labels[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",

        "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23",

        "24"};


    // Create a XYChart object of size 350 x 230 pixels

    XYChart *c = new XYChart(350, 230); //차트의 전체 크기를 정한다


    // Set the plotarea at (50, 30) and of size 250 x 150 pixels.

    c->setPlotArea(50, 30, 250, 150); //차트위 위치와 높이 넓이를 정한다.


    // Add a legend box at (55, 0) (top of the chart) using 8 pts Arial Font. Set

    // background and border to Transparent.

    c->addLegend(55, 0, false, "", 8)->setBackground(Chart::Transparent);


    // Add a title to the x axis

    c->xAxis()->setTitle("Network Load for Jun 12");


    // Add a title to the y axis

    c->yAxis()->setTitle("MBytes");


    // Set the labels on the x axis.

    c->xAxis()->setLabels(StringArray(labels, (int)(sizeof(labels) / sizeof(labels[0]))));


    // Display 1 out of 2 labels on the x-axis. Show minor ticks for remaining

    // labels.

    c->xAxis()->setLabelStep(2, 1);


    // Add three area layers, each representing one data set. The areas are drawn in

    // semi-transparent colors.

    c->addAreaLayer(DoubleArray(data2, (int)(sizeof(data2) / sizeof(data2[0]))),

        0x808080ff, "Server #1", 3);

    c->addAreaLayer(DoubleArray(data0, (int)(sizeof(data0) / sizeof(data0[0]))),

        0x80ff0000, "Server #2", 3);

    c->addAreaLayer(DoubleArray(data1, (int)(sizeof(data1) / sizeof(data1[0]))),

        0x8000ff00, "Server #3", 3);

m_chartView.setChart(c);  //m_chartView에 Chart를 보여주기 위한 코드



하... vs2013에 버그가 존재한다. 

Visual Studio 2013 버그 - error RC2108: expected numerical dialog constant ) 구글링을 해보니

 

첫 번째로, 임시 조치 방법으로는 아래와 같이 수동으로 코드를 바꿀 수 있습니다.

 

변경 전 (오류 발생)

 CONTROL IDB_BITMAP1,IDC_STATIC,2,2,89,82,NOT WS_GROUP

변경 후

CONTROL IDB_BITMAP1, IDC_STATIC, "Static", SS_BITMAP, 2, 2, 89, 82, NOT WS_GROUP

 

두 번째로, Visual Studio 2013 Update 버전을 설치하면 됩니다.

라고 한다. 번거롭다.. 다시 이런 버그를 만나지 않기위해 차 후 업데이트를 해야겠다.



결과적으로


성공할 수 있다.


'Study Note > Programming' 카테고리의 다른 글

[C++] time함수와 tm구조체 사용법  (0) 2017.04.21
[OpenCV]OpenCV를 이용해 영상 출력  (2) 2017.01.09
[OpenCV] 이미지 출력하기.  (0) 2017.01.06
[OpenCV] 설치 및 설정 (VS)  (0) 2017.01.06
[MFC] assert() 함수  (1) 2016.11.22
반응형

OpenCV를 이용하여 동영상 파일 출력하기.

작업환경 – OS : window8.1K , Tool : VisualStudio 2010 , OpenCV Ver : 2.4.11 )

 

(앞서 했던 설정을 기본으로한다.)

 

테스트에 앞서 프로젝트 폴더 내 테스트할 영상을 이동시켜둔다.

 

영상 출력이라고해서 어려워보이지만 OpenCV에서 기본 함수를 제공하므로 비교적 간단하다.

이미지 출력과 차이점은 이미지는 한장의 사진이라면 동영상은 여러장의 사진을 연속적으로 출력하는 것이라 볼 수 있다.

 

#include <opencv\highgui.h>

 

int main()

{

        IplImage *frame;

        CvCapture *capture = cvCaptureFromAVI("test.MOV"); // 영상파일을 로드

        cvNamedWindow("Test",0); // Window창을 생성

 

        while(capture) { // capture 영상이 로드 되었다면 출력

               frame = cvQueryFrame(capture); // 영상을 프레임에 넣음  

               cvShowImage("Test",frame);     // 영상을 띄움

 

               if(cvWaitKey(1)==27){          // ESC(27)  누르면 탈출

                       cvReleaseCapture(&capture);

                       break;

               }

        }

        cvDestroyWindow("Test");

        return 0;

}

 

 

 

CvCapture형식의 capture에 영상을 저장한다.

동영상 파일을 불러올 때는

cvCaptureFromFile() 이나

cvCreateFileCapture() 또는  

cvCaptureFromAVI()중 하나를 선택하여 사용한다.

(인자로는 파일이름파일형식을 넣어준다).

파일 형식은 avi, wmv, mp4, 3gp, mkv, mov 등등이 사용 가능하다.


* PC에 달린 캠 영상을 출력하기위해서는

- cvCreateFromCAM(int index) 를 사용하면 된다.

Index 값으론 사용할 카메라를 지정한다. 카메라가 1개인 경우 혹은 여러 개 중에서 특정한 카메라를 지정하지 않을 경우는 -1을 사용한다. 만약 2개인 경우 index값이 0이면 카메라를 선택할 수 있는 창이 나타난다.


 

cvQueryFrame()함수는 동영상 혹은 카메라로부터 프레임을 읽고 반환하는 함수이다.

 IplImage* cvQueryFrame( CvCaptuer* capture );

 

결과


사진으로 보이지만 영상파일이고 제대로 동작함을 확인할 수 있다.

'Study Note > Programming' 카테고리의 다른 글

[C++] time함수와 tm구조체 사용법  (0) 2017.04.21
[MFC] 정적인 그래프 그리기.  (0) 2017.02.07
[OpenCV] 이미지 출력하기.  (0) 2017.01.06
[OpenCV] 설치 및 설정 (VS)  (0) 2017.01.06
[MFC] assert() 함수  (1) 2016.11.22
반응형

(환경 - OS : Window8.1K, Tool : Visual Studio 2010, OpenCV ver : 2.4.11)


OpenCV를 이용하여 이미지 출력하기.

앞서 했던 설정을 기본으로한다.

 

먼저 이미지를 준비한 뒤, 저장하고 프로젝트 폴더로 이동시킨다.

 

아래와 같은 코드를 작성을 하면

#include <opencv2\core\core.hpp>

#include <opencv2\highgui\highgui.hpp>

using namespace cv;

 

void main() {

 

        Mat image = imread("Lenna.png"); // disk에서 그림을 불러온다

        if(!image.data) exit(1); // 이미지가 있는지 확인하고 없으면 종료

 

        imshow("Lenna",image); // 이미지를 보여주는 함수. Par(1) 이름

       

        waitKey(0); //Wait for keystroke

}

 

아래와 같은 결과물이 도출된다.




* OpenCV 함수를 참고하여 만들어 보았다.

#include <opencv\highgui.h>


int main() {

IplImage *capture = cvLoadImage("Lenna.png");

cvNamedWindow("Lenna",1);

cvShowImage("Lenna",capture);

cvWaitKey(0);


// cvReleaseImage(&capture);

// cvDestroyWindow("Lenna");


return 0;

}

 


cvLoadImage()함수는 영상 데이터의 구조체 포인터를 반환한다. 인자 값으로 파일명과 형식을 넣어준다.

구조체의 이름은 IplImage이며, 단일 채널, 다중 채널, 정수형, 실수형 등 모든 형태의 영상 데이터를 IplImage로 표현할 수 있다. 또한 BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF 등의 영상 포맷을 지원한다.

*출력할 영상은 프로젝트 폴더내에 존재하여야 한다.


cvNamedWindow()는 영상을 표시할 윈도우를 하나 만드는 일을 한다.

- 첫 번째 인자는 윈도우의 이름으로 등록된다.

- 두 번째 인자는 윈도우의 속성을 지정한다. 여기에는 0(기본값) 또는 1이 들어갈 수가 있다.

인자값이 0으로 지정되면 불러오는 영상의 크기에 상관없이 윈도우 크기는 일정하게 고정이 되고, 영상이 윈도우의 크기에 맞게 확대 또는 축소되어 나타난다. 만약 1(CV_WINDOW_AUTOSIZE)이면 불러오는 영상의 실제 크기에 맞게 윈도우의 크기가 자동으로 조절된다.


cvShowImage()함수는 IplImage* 타입으로 생성된 영상을 해당 제목을 갖은 윈도우에 영상을 출력한다.

- 첫번째 인자는 윈도우의 이름이고,

- 두번째 인자는 IplImage이다.


cvWaitKey()함수는 프로그램의 동작을 잠시 멈추고 사용자로부터 키 입력을 기다린다.

양의 정수일 경우 밀리초(millisecond) 단위로 지정한 시간동안 대기한다.

인자값이 0이나 음수일 경우 키가 눌려질 때 까지 무한정 기다린다.


cvReleaseImage()함수는 할당된 메모리 공간을 해제한다. 

인자로 IplImage*의 주소값을 전달해준다. 이 함수가 실행된 후 해당 IplImage는 NULL로 설정된다.


cvDestroyWindow()함수는 윈도우를 닫고, 윈도우를 위해 동적할당된 메모리 공간을 모두 해제한다. 


cvDestroyAllWindows()함수를 이용하여 한번에 모든 창을 닫을 수도 있다.


***** 간단한 프로그램의 경우 프로그램이 종료할 때 운영체제에 의해 할당된 모든 리소스들이 자동으로 반환되지만 cvReleaseImage()함수와 cvDestroyWindow()함수를 직접 호출하여 리소스를 반환하는것이 좋다.



'Study Note > Programming' 카테고리의 다른 글

[MFC] 정적인 그래프 그리기.  (0) 2017.02.07
[OpenCV]OpenCV를 이용해 영상 출력  (2) 2017.01.09
[OpenCV] 설치 및 설정 (VS)  (0) 2017.01.06
[MFC] assert() 함수  (1) 2016.11.22
메모리 관리 문제  (1) 2016.11.22
반응형

(환경 - OS : Window 8.1K , Tool : Visual Studio 2010, OpenCV Ver : 2.4.11)


OpenCV 입문

 

1. OpenCV 설치

- OpenCV 홈페이지(http://opencv.org/download.html)에서 OpenCV 최신 버전을 다운로드한다.

 

- 제어판 - 시스템(윈도우키 + Pause)에서 환경변수 설정을 한다. 시스템 변수에서 새로 만들기를 클릭한다.


 


 

2. Visual Studio 설정

l  C/C++ 목록이 없다면 아무거나 컴파일 하면 생성됨





 

솔루션 플랫폼을 x64로 변경해주는데 없다면 구성관리자 탭에 들어간 후,


새로만들기로 추가해주면 된다.


opencv_calib3d2411d.lib

opencv_contrib2411d.lib

opencv_core2411d.lib

opencv_features2d2411d.lib

opencv_flann2411d.lib

opencv_gpu2411d.lib

opencv_highgui2411d.lib

opencv_imgproc2411d.lib

opencv_legacy2411d.lib

opencv_ml2411d.lib

opencv_nonfree2411d.lib

opencv_objdetect2411d.lib

opencv_ocl2411d.lib

opencv_photo2411d.lib

opencv_stitching2411d.lib

opencv_superres2411d.lib

opencv_ts2411d.lib

opencv_video2411d.lib

opencv_videostab2411d.lib



프로젝트 폴더 안에 jpg파일을 넣고 실행하면

#include <opencv\cv.h>

#include <opencv\highgui.h>

 

int main()

{

        IplImage *image = cvLoadImage("opencv.jpg");

        cvShowImage("Test Image", image);

        cvWaitKey(0);

        cvReleaseImage(&image);

        return 0;

}

 

 

 

이와 같은 결과를 얻을 수 있다.

'Study Note > Programming' 카테고리의 다른 글

[OpenCV]OpenCV를 이용해 영상 출력  (2) 2017.01.09
[OpenCV] 이미지 출력하기.  (0) 2017.01.06
[MFC] assert() 함수  (1) 2016.11.22
메모리 관리 문제  (1) 2016.11.22
[MFC] 대화상자 Domodal, Modaless  (0) 2016.11.19
반응형

아래 방화벽문제는 아닌거 같아서 우분투를 다시 설치 하고 해보았다.

(설정 또한 안바꿔도됨)

역시 예상대로 패키지 설치만하니까 간단히 연결되었다 .

================================================

Ubuntu 설치를 할때 기본 설치로 진행하였다.


별 다른 설정을 하지 않았기에 기본 상태로 깔린거 같다.


평소와 같이 Xshell이나 putty로 원격으로 붙으려하니 붙지를 않아 방화벽 문제일거라 생각하여


$ sudo ufw disable  // 방화벽 해제

을 해줬다.


결과는 Fail.


22번포트를 열어주어야하나싶어


$ sudo ufw allow 22 // 22번 포트 허용

결과는 역시 fail


맨땅에 헤딩하기가 이렇게 힘들던가...

결국 다른 블로거의 힘을 빌리기로 했다.


/etc/network/interfaces 의 내용을 수정하라고한다


auto lo

iface lo ..... 이런식으로 작성되어있는데


lo -> eth0 으로 수정하였다.


그리고


# sudo apt-get install openssh-server


이 패키지가 안깔려있는데 이놈이 큰 문제였던거 같다. (물론 방화벽 문제도 있었겠지만)


네트워크를 재시작 해주어야한다.

# sudo /etc/init.d/ssh restart

혹은

# service restart

혹은

# service ssh restart 



성공이다.


앞으로 이런 문제는 가볍게 넘기도록해야겠다.

반응형

RasberryPiTerabee 사용

 

( 환경 : Raspbian(Linux환경) , RasberryPi 2 B+ )

 

 

모형


구성

                             

                        TOF Sensor                                                                                             USB Adopter




면적

핀 구성

PIN

Function

1

+5V out

(use only to provide voltage levels to programming devices, max. 10mA!)

2

+5V out

(use only to provide voltage levels to programming devices, max. 10mA!)

3

SCLK (for SPI or flashing)

4

MISO

5

MOSI

6

Reset in

(pull to GND to reset)

7

Arduino compatible reset in

(to DTR)

8

User I/O 2

9

User I/O 1

10

SCL

11

SDA

12

RX(5V Lev)

13

TX(5V Lev)

14

Vcc(10V-20V)

15

GND



드라이버 구성



윈도우에서 사용 할 때는 드라이버를 직접 깔아서 사용했지만 Ubuntu 기반인 라즈비안은 인식되어있다.

보통은 /dev/ttyUSB0 혹은 1,2 .... 로 되어있다.



screen 명령어를 통해서 Access하게 되면



이런식으로 결과 값이 주르륵 나온다.

무슨소릴까... Binary 모드이기 때문이다.

모드를 바꿔봐야겠다.



사용 Mode

(Shift + Key)

Key

Mode

Function

P

정밀모드

정확한 값을 내기위해 내부 파라미터를 적용한다.

이 기능은 반복율과 반응속도를 줄여준다

F

속도모드

빠른 반복율과 반응속도가 보장되지만 판독의 정확성이 줄어든다.

B

바이너리 모드

출력상태를 Binary형태로 출력

T

텍스트 모드

출력상태를 Text형태로 출력

 


Shift + T (Text 모드로 변경해보면...)

우리가 원하든 mm 단위로 출력된다!


 

+ Recent posts