반응형

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
반응형

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


직접그려볼까 객체들을 찾아보다가 인터넷에 제공되는 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 단위로 출력된다!


 

반응형

리눅스에서 콘솔 프로그램을 백그라운드로 실행해야 할 경우 screen 명령어가 굉장히 유용하다.

원격 작업하다보면 여러창을 보고 싶을때도 있어 보통 터미널을 여러개 띄워 사용한다. 하지만 왔다갔다하기 귀찮아 많이 이용한다.

간단히 nohup으로 사용할수 있지만 screen명령어가 더 강력하고 유연하므로 많이 사용된다.


우선 사용하기 위해 screen 명령어를 써보니 라즈비안에선 깔려 있지 않다.


라즈비안은 Ubuntu 기반이므로

sudo apt-get install screen 명령어로 손쉽게 깔 수 있다.


CentOS

yum install screen 으로 설치하면 된다.



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

screen 명령어의 메뉴얼로는


1. 쉘모드 명령어
  screen
   : screen 을 시작 하는 기본 명령입니다.
   : 기본 세션명으로 시작합니다.
  screen -S 세션명
   : -S 다음에 주는 세션명으로 시작합니다.
  screen -list
   : -list 옵션을 주고 실행하면 이전에 작업했었던 screen 리스트가 있으면 세션명과 함께 리스트를 보여줍니다.
  screen -R 세션명
   : 이전에 세션이 있을 경우 -R 다음에 오는 세션명으로 이전 작업을 불러옵니다.
   : -R 다음에 세션명을 주지 않았을 경우에는 이전 세션이 한개만 있을 경우 그 작업을 불러옵니다.
   : 이전 작업이 여러개 있을 경우에는 이전 작업 리스트를 보여줍니다.
   : 이 경우에는 원하는 세션명을 주고 시작 하면 되겠죠. ^__^
   
2. screen 실행후 명령어
  screen 실행후의 명령어는 Ctrl-a로 시작합니다:

Ctrl-a, c       : (create) 새로운 쉘이 생기면서 그 쉘로 이동
Ctrl-a, a       : 바로 전 창으로 이동
Ctrl-a, n       : (next) 다음 창으로 이동
Ctrl-a, p       : (previous) 이전 창으로 이동
Ctrl-a, 숫자    : 숫자에 해당하는 창으로 이동
Ctrl-a, '       : 창번호 또는 창이름으로 이동 ( ' => 싱글 쿼테이션 )
Ctrl-a, "       : 창번호를 보여준다. ( " => 더블 쿼테이션 )
Ctrl-a, A       : 현재 창의 title을 수정
Ctrl-a, w       : 창 리스트 보여주기
Ctrl-a, esc     : Copy 모드로 전환. Copy 모드에서는 vi의 이동키로 이동을 할 수 있다.
Crtl-a, [         커서 이동을 할 수 있고 특정 블럭을 복사하는 기능으로 사용한다.
                 먼저 시작 위치에서 space 바를 누르고 끝 위치에서 space 바를 누르면 해당 부분이 buffer로 복사된다.
Ctrl-a, ]       : buffer의 내용을 stdin으로 쏟아 넣는다.
                 이 기능은 vi의 입력모드에서 사용하면 유용하다.
Ctrl-a, :(콜론) : 명령행 모드로 전환
Ctrl-a, d       : (detach) 현재 작업을 유지하면서 screen 세션에서 빠져나옴
                 세션이 종료 되지 않습니다.
Ctrl-a, x       : lock screen

아래 부분은 창을 나눠서 사용하는 명령입니다.

Ctrl-a, S       : (split) 창을 나눔 (region)
Ctrl-a, Tab     : 다른 region으로 이동
Ctrl-a, Q       : 현재 region을 제외한 나머지 숨기기


그리고 마지막 명령으로 세션을 완전히 빠져 나오는 명령입니다.

exit : screen 의 쉘상에서 exit 를 치고 엔터를 하면 세션이 완전히 종료 됩니다.


이상 위의 명령어 들만 알고 있으면 screen 사용시 불편하지 않게 screen 을 사용 할 수 있을 겁니다.

참 고
다른 사용자 분들의 의견을 보면 screen 화면을 2, 3 개정도 띄우고 사용하는게 가장 적당하다고 합니다.
4개 이상 띄우고 사용하다보면 불편하다고 하네요.
여러분들은 어느정도가 적당한지 한번 사용해보시고 판단 하시기 바랍니다.


기타 더욱 자세한 내용을 아시고 싶으시면 man 페이지나 /usr/doc/screen 을 참고하시기 바랍니다. 


참고 : KLTP( http://kltp.kldp.org/ )
      리눅스 사랑넷 ( http://linux-sarang.net )

      [펌] http://blog.naver.com/xinfra/80007388674


+ Recent posts