Pegjs: ๋ช…๋ น ์ค„์—์„œ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 06์›” 06์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pegjs/pegjs

๊ฒ€์ฆํ•˜๋Š” .peg ํŒŒ์ผ (์˜จ๋ผ์ธ)์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ์ค„์—์„œ ์ง‘์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Ubuntu 16.04 repos์—์„œ pegjs๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. pegjs tldr.peg ํ–ˆ๊ณ  tldr.js ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น ์ค„์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์•„ ๋ณด์ธ๋‹ค! ๋” ์™„์ „ํ•œ ์˜ˆ์ œ @jodevsa๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฐ€ JavaScript๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ๋žŒ๋“ค์€ JavaScript๋ฅผ ์ „ํ˜€ ๋ชฐ๋ผ๋„ PEG.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ๋ฒ•๊ณผ ์ž…๋ ฅ ํŒŒ์ผ์„ ์ฝ๊ณ  ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ถœ๋ ฅ ํ•  ์ˆ˜์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  24 ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ ์ƒ์„ฑ ํ•œ .peg๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น ์ค„ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ช…๋ น ์ค„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ผ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งž์•„?

์˜ˆ :
validate_file ~/file.blah

@ pepa65

@jodevsa ๊ทธ๊ฒŒ ์ œ๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ..!

์ƒ์„ฑ ๋œ tldr.js๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ํ•จ์ˆ˜์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

1- ํŒŒ์ผ ์ฝ๊ธฐ
2- tldr ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํŒŒ์ผ ๋‚ด์šฉ ๋ณด๋‚ด๊ธฐ
3- ์ถœ๋ ฅ ๊ฒฐ๊ณผ?

PEG.js ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜ ์ •์˜ :

var parser=require('./tldr').parse;

์›ํ•˜๋Š” ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  parser (fileContent)!

Node๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์€๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

#!/usr/bin/env node

'use strict';

//
// echo "2 + 3" | node compile.js arithmetics.pegjs
// echo "2 + 3" | node compile.js javascript.pegjs
//

let fs = require('fs');
let peg = require('../lib/peg');

let grammar = fs.readFileSync(process.argv[2]).toString();
let parser = peg.generate(grammar);
let input = [];

compile(process.stdin);

function compile(stdin) {
  stdin.resume();
  stdin.setEncoding('utf8');

  stdin.on('data', (data) => input.push(data));

  stdin.on('end', () => {
    let output = parser.parse(input.join('').trim());

    console.log(JSON.stringify(output, null, 2));
  });
}

๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์•ฑ์ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mikeaustin ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ๊ทธ๊ฐ€ ๋‹น์‹ ์ด ํ•œ ์ผ์„ ์ดํ•ดํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.
@ pepa65 ์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค :

#!/usr/bin/env node
'use strict';

const fs = require('fs');
const parser = require('./tldr.js').parse;

function main() {
    const args = require('process').argv;
    if (args.length != 3) {
        console.error("Enter file Path as argument.")
        return 1;
    }
    let filename = args[2];
    fs.readFile(filename, {encoding: 'utf8'},function(err, data) {
        if (err) {
            console.log("error while reading the file!");
            console.error(err);
            return 1;
        }

        try {
            let output = parser(data);
            console.log(output)

        } catch (e) {
            console.error(e.message);

        }


    });

}

main();

  • tldr.js์™€ ํ•จ๊ป˜ ํด๋”์— ๋„ฃ์œผ์‹ญ์‹œ์˜ค. check_file์ด๋ผ๊ณ  ์ด๋ฆ„์ง€์—ˆ์Šต๋‹ˆ๋‹ค.

  • chmod + x check_file

  • ~ / .bashrc์˜ $ path์— ํด๋” ์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ„ฐ๋ฏธ๋„์„ ์žฌ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

  • ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. check_file ~ / file.txt

@mikeaustin node-pegjs (๋ฐ peg)๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด๋„ ../lib/peg ์ด (๊ฐ€)์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋’ค ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ์ผ๋ฐ˜ํ™” ๋œ ๋…ธ๋“œ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. peg-check tldr.pegjs file-to-be-checked ์—ฌ๊ธฐ์„œ tldr.pegjs๋Š” pegjs tldr.peg tldr.pegjs ์˜ ์ถœ๋ ฅ์ด๊ณ  file-to-be-checked ์—๋Š” ๊ฒ€์‚ฌ์ค‘์ธ ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋˜๋Š” pegjs๊ฐ€ tldr.pegjs ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ pegjs tldr.peg -s tldr-check ๊ฐ€ tldr-check file-to-be-checked ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด pegjs์˜ ์œ ์šฉ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์ดˆ์‹ฌ์ž์—๊ฒŒ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ..!

@jodevsa ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‚˜๋Š” ์–ป์—ˆ๋‹ค

let output = parser(data);
            ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

๊ทธ๋ž˜์„œ 'use strict'; ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ๋‹ค์Œ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

const arguments = require('process').argv;
          ^^^^^^^^^

SyntaxError: Unexpected eval or arguments in strict mode

๋‚ด javascript-fu๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

@ pepa65 ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
๋‚ด ์ž˜๋ชป์ด์•ผ :(

@ pepa65 ๋…ธ๋“œ v 8.0.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ "let"๋ฐ "const"๋ฅผ var๋กœ

๋ฟก๋ฟก
NVM, ์‹œ๋„ํ•ด๋ณด์‹ญ์‹œ์˜ค

#!/usr/bin/env node

  'use strict';

  var fs = require('fs');
  var parser = require('./tldr.js').parse;

  function main() {
      var args = require('process').argv;
      if (args.length != 3) {
          console.error("Enter file Path as argument.")
          return 1;
      }
      var filename = args[2];
      fs.readFile(filename, {encoding: 'utf8'},function(err, data) {
          if (err) {
              console.log("error while reading the file!");
              console.error(err);
              return 1;
          }

          try {
              var output = parser(data);
              console.log(output)

          } catch (e) {
              console.error(e.message);

          }


      });

  }

  main();

const ์—ฌ๊ธฐ์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งž์€ ์œ ์ผํ•œ ๊ฑธ๋ฆผ๋Œ์€ tldr.js์— printf๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (console.log๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค).
๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด undefined ์ถœ๋ ฅ์„ ๋๋‚ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋Š” "printf"ํ•จ์ˆ˜๋„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๋„
๋ฌธ๋ฒ•์„ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด ์ œ๊ฐ€ ๋„์™€ ๋“œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง๋š์„ ๊ฒ€ํ† ํ•˜๋‹ค๊ฐ€ { printf("OK");} ์ž˜๋ชป ์ถ”๊ฐ€ ํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜์—ฌ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ๋ฒ• :

page = header description examples eof { console.log("OK");}
header = command nl underline nl nl
description = (descriptor nolowercase any dot nl)+
examples = example (nl example)*
example = example_description nl example_command
example_description = nolowercase any colon nl
example_command = fourspace any nl
command = [a-zA-Z0-9_][-a-zA-Z0-9_ ]*
underline = '='+
any = [a-z ()-,-.={}/_0-9A-Z]*
nolowercase = [^a-z]
descriptor = '> '
fourspace = '    '
dot = .
colon = ':'
nl = [\n]
eof = !.

@ pepa65 ๊ทธ์˜ @jodevsa ๋‹น์‹ ์„ ์ค€ ์‹คํ–‰์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ง๋š ๋ฌธ๋ฒ• ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์—; ์ตœ์ƒ์œ„ page ๊ทœ์น™์ด console.log ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— PEG๋Š” ์‹คํ–‰์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์— undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

console.log(OK) ๋ฅผ return "OK"; ํ•˜๊ฑฐ๋‚˜ ์ธ์‡„ ๋œ undefined ์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ console.log(output) ์ค„์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@hawkrives : +1 :

๋งž์•„, ๋‚˜ ๋ฐ”๋ณด. ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค! ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ตœ์ข… ๋‹ต์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ grammar-check .

#!/usr/bin/env node
'use strict';

const fs = require('fs');
const parser = require('./grammar.js').parse;

function main() {
  const args = require('process').argv;
  if (args.length != 3) {
    console.error("Only 1 argument needed: file-path")
    return 1;
  }
  const filename = args[2];
  fs.readFile(filename, {encoding: 'utf8'}, function(err, data) {
    if (err) {
      console.log("Error reading file", filename);
      console.error(err);
      return 1;
    }
    try {
      let output = parser(data);
      console.log(output);
    }
    catch (e) {
      console.error(e.message);
    }
  });
}

main();

chmod +x grammar-check ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ๋ฒ•์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค : pegjs your-grammar.peg grammar.js ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ›„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : grammar-check filename (ํŒŒ์ผ ์ด๋ฆ„์€ ํ™•์ธํ•  ํŒŒ์ผ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค).

์ข‹์•„ ๋ณด์ธ๋‹ค! ๋” ์™„์ „ํ•œ ์˜ˆ์ œ @jodevsa๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฐ€ JavaScript๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์‚ฌ๋žŒ๋“ค์€ JavaScript๋ฅผ ์ „ํ˜€ ๋ชฐ๋ผ๋„ PEG.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ๋ฒ•๊ณผ ์ž…๋ ฅ ํŒŒ์ผ์„ ์ฝ๊ณ  ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ถœ๋ ฅ ํ•  ์ˆ˜์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ๋ฒ•๊ณผ ์ž…๋ ฅ ํŒŒ์ผ์„ ์ฝ๊ณ  ํŒŒ์ผ์ด๋‚˜ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ถœ๋ ฅ ํ•  ์ˆ˜์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ฒˆ ํ˜ธ๋ฅผ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๊นŒ?

@mikeaustin @waldyrious ์•„๋งˆ๋„ ๋ณ„๋„์˜ "ํ”„๋กœ๊ทธ๋žจ"์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹ -์ด๊ฒƒ์€ readme์—์„œ ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด.

์œ„์˜ ์ž‘์—… ์˜ˆ์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ

์•„๋งˆ๋„ ๋ณ„๋„์˜ "ํ”„๋กœ๊ทธ๋žจ"์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹ -์ด๊ฒƒ์€ readme์—์„œ ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mikeaustin ์˜ ์˜๊ฒฌ์€ ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ์˜ ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๋ฉฐ ์ด์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@waldyrious ์ด ๋ฌธ์ œ๋Š” ์งˆ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ ์Šต๋‹ˆ๋‹ค. 0.11์— ๋Œ€ํ•ด ๊ตฌํ˜„ ๋œ ๊ธฐ๋Šฅ (๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ฐ„๋‹จํ•œ ์ถ”๊ฐ€ ์ธ ๊ฒฝ์šฐ)์„ ํ™•์ธํ•ด์•ผํ•˜์ง€๋งŒ 1.0 ( ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋ถ„๋ฅ˜ํ•˜๋„๋ก ํ‘ธ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค). ๋ช…๋ น ์ค„ ๋„๊ตฌ ์žฌ ์ž‘์„ฑ์„ ๋งˆ์นœ ํ›„์—๋Š” ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ๋‹ต์žฅํ•˜์ง€ ์•Š์€ @ pepa65 ์—๊ฒŒ ์ฃ„์†กํ•˜์ง€๋งŒ ์†”์งํžˆ ๋ง์”€ ๋“œ๋ฆฌ๋ฉด @waldyrious ๊ฐ€ ์˜ค๋Š˜ ๊ทธ์˜ ๋Œ“๊ธ€์„ ๊ฒŒ์‹œ ํ•  ๋•Œ๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€์กฐ์ฐจ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค ๐Ÿ˜†

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰