이 블로그 검색

2018년 11월 16일 금요일

Vim 정규표현식 패턴 이해하기.

패턴. (help pattern 하면 나오는 부분에 대한 해설을 할거다. )


2. The definition of a pattern 패턴의 정의.
초짜는 help usr_27.txt를 찾아보시라 :help usr_27.txt라고 하면 됨.



1. 패턴은 가지의 or 연산 결과를 합한다.
  (한국말로 여러가지패턴을 찾을 수 있다.
  사실 패턴간 연산 순서를 말하는건데 concat이니 branch니 이래서 어려움)

pattern ::= branchA \| branchB \|branchC

A를 만족하거나 B를 만족하거나 C를 만족하거나.

예 이철수 \| 김철수 \| 박철수
라고 하면 이철수 또는 김철수 또는 박철수를 말한다.

2. 접붙이기 (And연산) 이다.  (concat이 식물학에서 뭘 의미하는건가?)
이 번에는 순서가 중요하다.
  branch ::=       concat
               or  concat \& concat
               or  concat \& concat \& concat

foobeep\&...   -> 을 해석하면 foobeep이라는 글자에서 foo 글자를 말한다 .
.*Peter\&.*Bob 는 Peter와 Bob을 모두 포함하는 Line 을 가리킨다.

첫번째 검색은 줄 전체를 검색해서 모든 문자열에서 Peter로 끝나는 문자열을 가리킨다. vim help 문서내에서 테스트 해볼 수 있다.

그 다음, 그 문자열을  다시 두번째 concat으로 검색을 한다. 그러면 라인처음에서 Peter 사이에 Bob로 끝나는 문자열을 내뱉는다.

   sjdklfjaslkj Peter klsjdlkfjs Bob kjdsklfjskdljfkl Peter    -- Matched
   lkjdslfkjsdlkjflk Peter lksdjflkjs Bob sdjflksjdlf klsdjflksj -- Not matched

상당히 요상하다.  Peter와 Bob가 모두 포함된 라인은 다음처럼 검색하면 된다.   .*Peter.*\&.*Bob.*
 Peter가 포함된 줄의 Bob만 찾는 다면 .*Peter.*\&Bob이다.

이 패턴이 찾기에 사용될 때는 커서의 위치가 패턴의 시작으로 가므로 중요할 수 있고,  찾아바꾸기에 사용될 때는 패턴의 끝도 중요해진다.

3. concat은 여러 조각으로 이루어진다.
 이미 쓰고 있었다. foo는 f다음에 o가 오고 또 o가 오는 문자열을 말한다.
  f[0-9]b 이 것은 f다음에 0-9중 하나가 오고 b가 오는 문자열 패턴이다.

4. 조각은 한개의 atom 또는 atom의 시퀀스를 말한다.


 piece   ::=      atom
               or  atom  multi
 예)   a*    "" a aa aaa aaa aaaa 등등

5. atom은 한 문자 또는 패턴이다. (??)
  여기서 부터 재귀라는 것을 알 수 있다. 패턴을 정의하는데 패턴을 알아야하니까 사실 그냥 다 패턴이고, 패턴간 연산순서로 기억하자.  그냥 국어적 의미도 필요없고 각자가 생각하는 패턴이 왠만하면 잘 맞으니까 무시하자. 

그냥 글자를 ordinary-atom이라고 부른다고 한다. 뭐 유니코드 같은건 수바이트가 한개의 atom이니까 ascii문자를 의미하는건 아니니까 오해하지 말자.

\(pattern\) 괄호로 묶으면, 온전한 한개의 패턴이 atom이 된다.
v\(abc\)*z 는  vz -> vabcz -> vabcabcz 뭐 이런 것이 되겠지.

저 atom 과 multi를 정의하는거는 쉽게 공부할 수 있다.



3. Magic

  문자열 내에 문자가 문자그대로가 특수한 역할을 맡을 때가 있다 그것을 Magic이라고 한다.  문자열을 최대한 자연스럽게 표현할 것이냐, 아니면 패턴을 최대한 쉽게 타이핑할 것이냐를 어떻게 설정할 것인지 vim에서는 조절할 수 있다.

after:    \v       \m       \M       \V         matches                'magic' 'nomagic'          $        $        $        \$         matches end-of-line          .        .        \.       \.         matches any character
         *        *        \*       \*         any number of the previous atom
         ~        ~        \~       \~         latest substitute string
         ()       \(\)     \(\)     \(\)       grouping into an atom
         |        \|       \|       \|         separating alternatives
         \a       \a       \a       \a         alphabetic character          \\       \\       \\       \\         literal backslash          \.       \.       .        .          literal dot          \{       {        {        {          literal '{'          a        a        a        a          literal 'a'
설정을 해도 딱히 몇개 바뀌지는 않는다. magic을 어떻게 하는지가 패턴을 많이 쓰는 vim하고 perl이 좀 달라서 혼동스러운데, 그럴때는 그냥 명시적으로 해결해라. perl에도 magic 설정이 가능한지는 모르겠다.



          multi     'magic' 'nomagic'  matches of the preceding atom /star   *       \*      0 or more       as many as possible
/\+     \+      \+      1 or more       as many as possible (*)
/\=     \=      \=      0 or 1          as many as possible (*)
/\?     \?      \?      0 or 1          as many as possible (*)
정규표현식은 cmd 창에서 쓰는 ?*하고는 다르다. 그러나 훨씬 다양한 패턴이 가능하므로 숙지하자. 여기가 가장 기본이다. \+도 사실 잘 안쓰인다. 그냥 글자를 한번더 찍어서 표현하자 . a\+ -> aa* 어차피 타이핑수도 동일하다.
/\{     \{n,m}  \{n,m}  n to m          as many as possible (*)        \{n}    \{n}    n               exactly (*)
       \{n,}   \{n,}   at least n      as many as possible (*)        \{,m}   \{,m}   0 to m          as many as possible (*)        \{}     \{}     0 or more       as many as possible (same as *) (*)
  기억하기 어렵지않다. 요거는 보통 dvc10003.jpg 같이 이미지 파일의 자리수와 관련된 일을 할 때 많이 쓴다.
/\{-    \{-n,m} \{-n,m} n to m          as few as possible (*)        \{-n}   \{-n}   n               exactly (*)
       \{-n,}  \{-n,}  at least n      as few as possible (*)        \{-,m}  \{-,m}  0 to m          as few as possible (*)        \{-}    \{-}    0 or more       as few as possible (*)
   요거 중요하다. 그리고 유용하다. 위에 있는 친구들은 전부다 as many as possible이라서 
 아까 있던 Peter.*Bob이라는 글자 지우려다가 한줄 전체를 날리는 경우가 허다하다. 그럴 때는 u를 누르고 요거를 쓰면 된다. 
  정규표현식 지원해주는 프로그램중에 as few as possible 안되는 친구들도 있다. 구리다. 
                                                       E59

/\@>    \@>     \@>     1, like matching a whole pattern (*)
/\@=    \@=     \@=     nothing, requires a match /zero-width (*)
/\@!    \@!     \@!     nothing, requires NO match /zero-width (*)
/\@<=   \@<=    \@<=    nothing, requires a match behind /zero-width (*)
/\@<!   \@<!    \@<!    nothing, requires NO match behind /zero-width (*)
 이거 좀 재미있다.  \@>는 아직 잘 모르지만, 
\(a*\)ab를 검색하면, 저 그룹에 b앞에 a가 포함되도록 하는것인데, 패턴의 중복을 막는 방법이고, 일상적으로 볼 일이 없다. 

이 zero width는 검색은 하되 패턴에는 포함이 되지 않는 것을 말하는데, 찾아바꾸기나, syntax highlighting에 중요하다. 난 김철수를 박철수를 바꾸고 싶다. 뭐 이런 상황에 사용된다. 찾아바꾸기야 통째로 김철수를 찾아 박철수로 바꾸면 되지만 김씨인 철수만 글자를 밝게 처리한다거나는 어려우니 이런기능이 필요하다. 

이 친구들은 위치가 중요한게 아니라 저거 앞에 있는 atom을 수식해주는 것이라 위치를 잘 파악하자.  김철수에 김을 수식할 때는, 김\(철수\)\@= 로 써야해서 좀 해깔릴 수 있으나 그냥 * 같은거라고 생각해야한다.

      ordinary atom      magic   nomagic   matches /^      ^       ^       start-of-line (at start of pattern) /zero-width /\^     \^      \^      literal '^'
/\_^    \_^     \_^     start-of-line (used anywhere) /zero-width /$      $       $       end-of-line (at end of pattern) /zero-width /\$     \$      \$      literal '$'
/\_$    \_$     \_$     end-of-line (used anywhere) /zero-width /.      .       \.      any single character (not an end-of-line)
/\_.    \_.     \_.     any single character or end-of-line
/\<     \<      \<      beginning of a word /zero-width /\>     \>      \>      end of a word /zero-width /\zs    \zs     \zs     anything, sets start of match
/\ze    \ze     \ze     anything, sets end of match
/\%^    \%^     \%^     beginning of file /zero-width           E71 /\%$    \%$     \%$     end of file /zero-width /\%V    \%V     \%V     inside Visual area /zero-width /\%#    \%#     \%#     cursor position /zero-width /\%'m   \%'m    \%'m    mark m position /zero-width /\%l    \%23l   \%23l   in line 23 /zero-width /\%c    \%23c   \%23c   in column 23 /zero-width /\%v    \%23v   \%23v   in virtual column 23 /zero-width
underbar는 잘 써본적이 없고, 보통 줄의 시작과 줄의 끝을 많이 사용한다. 그리고 c언어 등에서 value이름을 바꿀 때 \< \>를 많이 사용한다. 중복되는 부분들이 많아서 이거 생각없이 쓰면 100%에러가 난다. 
int x; 어쩌고 저쪼고 를 복사해서 int y 에 대해서 똑같이 하고 싶다고 복사한다음에 x를 y로 바꾸면 와장창 에러가 뜬다. \로 쓰면 된다.


Character classes {not in Vi}:                          /character-classes      magic   nomagic   matches /\i     \i      \i      identifier character (see 'isident' option) /\I     \I      \I      like "\i", but excluding digits
/\k     \k      \k      keyword character (see 'iskeyword' option)
/\K     \K      \K      like "\k", but excluding digits
/\f     \f      \f      file name character (see 'isfname' option)
/\F     \F      \F      like "\f", but excluding digits
/\p     \p      \p      printable character (see 'isprint' option)
/\P     \P      \P      like "\p", but excluding digits
/\s     \s      \s      whitespace character: and
/\S     \S      \S      non-whitespace character; opposite of \s
/\d     \d      \d      digit:                          [0-9] /\D     \D      \D      non-digit:                      [^0-9] /\x     \x      \x      hex digit:                      [0-9A-Fa-f] /\X     \X      \X      non-hex digit:                  [^0-9A-Fa-f] /\o     \o      \o      octal digit:                    [0-7] /\O     \O      \O      non-octal digit:                [^0-7] /\w     \w      \w      word character:                 [0-9A-Za-z_] /\W     \W      \W      non-word character:             [^0-9A-Za-z_] /\h     \h      \h      head of word character:         [A-Za-z_] /\H     \H      \H      non-head of word character:     [^A-Za-z_] /\a     \a      \a      alphabetic character:           [A-Za-z] /\A     \A      \A      non-alphabetic character:       [^A-Za-z] /\l     \l      \l      lowercase character:            [a-z] /\L     \L      \L      non-lowercase character:        [^a-z] /\u     \u      \u      uppercase character:            [A-Z] /\U     \U      \U      non-uppercase character         [^A-Z] /\_     \_x     \_x     where x is any of the characters above: character
                       class with end-of-line included


\s를 많이 쓰고 의외로 아래 digit류는 기억이 잘 안나서 오른쪽에 대괄호 형식으로, 풀어서 많이 쓰게 된다. 딱봐도 소문자랑 숫자 섞인것 같은거는 정의 안 되어 있다. 


      magic   nomagic   matches /\e     \e      \e       /\t     \t      \t       /\r     \r      \r       /\b     \b      \b       /\n     \n      \n      end-of-line
/~      ~       \~      last given substitute string
/\1     \1      \1      same string as matched by first \(\) {not in Vi} /\2     \2      \2      Like "\1", but uses second \(\)           ...
/\9     \9      \9      Like "\1", but uses ninth \(\)                                                                E68 /\z1    \z1     \z1     only for syntax highlighting, see :syn-ext-match           ...
/\z1    \z9     \z9     only for syntax highlighting, see :syn-ext-match
       x       x       a character with no special meaning matches itself

/[]     []      \[]     any character specified inside the []
/\%[]   \%[]    \%[]    a sequence of optionally matched atoms

/\c     \c      \c      ignore case, do not use the 'ignorecase' option
/\C     \C      \C      match case, do not use the 'ignorecase' option
/\Z     \Z      \Z      ignore differences in Unicode "combining characters".
                       Useful when searching voweled Hebrew or Arabic text.

\e는 고급사용자면 많이 쓸거다. \1 \9는 a-b를 b-a로 바꾼다거나 할 때 많이 쓴다.  vi에는 \( \) 없다고 한다, 얼마나 힘들겠는가... 그런데 vi에 메뉴얼의 패턴은 정의가 재귀적으로는 되어 있지 않겠다. 

\c는 최근에 쓰기 시작했다. grep은 -i 옵션 find -iname 으로 쓰니까 같이 알아두자. 


2018년 11월 15일 목요일

미디) 신디사이저 용, ts또는 trs 커넥터를 사용하는 페달에 대해 알아보자.



  신디사이저나 마스터키보드 후면에 보면 페달을 꽂을 수 있는 폰잭 암놈 커넥터가 있다.


교회에서 많이 쓴다고 알려진, SP4-8의 경우,  'CC', 'Sustain' 이라고 이름 붙여진 암놈커넥터가 달려 있다.

그리고 진짜 싸구려 제품이나, 미니키보드를 제외하고서는 마스터 키보드의 후면에도 'Sustain'이라 이름 붙여진 포트가 존재한다.



  1. Sustain


여기서 가장 간단한 장치는 'Sustain'이라 이름 붙여진 페달이다. 이 페달은 그랜드피아노는 페달 설명을 들어도 잘 모르겠고, 업라이트 피아노의 맨 오른쪽 페달의 역할을 한다.  밟고 있는 동안, 연주한 건반 모두, 소리가 오래 지속되도록 하는 역할을 맡고 있다. 그렇다 보니, 이 페달은 아주 간단한 형태를 가진다.

그냥 스위치의 역할이다. 밟으면 1, 때면 0 또는 그 반대로 작동할 수 있다. 이건 회사 마다 다르다. 딱히 표준은 없는 듯 하다. 하지만 일단 큰 회사 두개를 따라가고 있다. 그래서 딥스위치로 두 회사의 모드를 다 지원하는 페달을 만들고는 한다.

요즘 악기들은 마이크로프로세서가 좋아진 관계로 여력이 있는지, 기계가 부팅될 때를 밟지 않은 상태로 인식하고 있다.

그렇다보니, 그냥 스위치처럼 input, output 딱 두개의 극만 있으면 된다. 전기공학을 검색하면 이런 간단한 스위치도 종류에 따라 다 이름이 있지만 난 전공자가 아니니 대충 글을 쓴다.
  input으로 정해진(3V) 전위로 연결되고, output쪽이 스위치의 상태에 따라 input과 같은 전위 또는 단락 상태가 되니까 나름 간단한 아날로그 회로이다.

2극이면 되니까 TS 폰잭을 사용한다.


2. CC Pedal(Expression or Volume)

다음은 CC 페달이다. 악기에 따라 Expression 페달이나 Volume 페달이라고 불리기도 한다. 전기기타가 사용하는 Expression, Volume 페달과는 회로가 조금 다르다. 다만 세부적으로만 다르다.

CC 페달은 기본적으로는 가변저항 회로이다.  얼마나 밟았는지에 따라, 가변저항값이 바뀌면서, input1, input2 두개의 입력전압의 사이값으로 신호가 output으로 나가게 된다. 한개는 딱히 Sustain에서 들어오던거랑 다를 이유가 없고, 다른 하나는 ground가 아닐 이유가 없어서, 역시 간단한 아날로그 회로이다.


회로는 간단하나 사람의 발로 연주하는 장치이다보니 밟는 정도를 가변저항노브를 돌리는 것으로 변환하는 기계적인 부분에서 단가가 올라간다.

이것도 밟는 것을 땐 상태 어느쪽을 input1쪽으로 할지를 결정해야 하므로 조금 복잡하다. 하지만 거대 악기 기업들을 대부분 따라가므로 걱정하지말자.

이 장치는 input1(input) input2(ground) output 세개의 극이 필요하다. 그래서 TRS 커넥터를 사용한다.

추가로 가변저항에 종류에 따라 페달의 형태 이외로도 존재할 수 있다.
(센서라고 불리는 친구들이 대부분 가변저항이다.  )

3. Half sustain pedal (Half Damper )

  사실 이 장치 때문에 이 글을 쓰고 있다. 이게 어디에 쓰이는지도 잘 모르기 때문에, 이름은 익히 알았지만, 무시했다. 

  요번에 Half damper 커넥터가 TRS라는 것을 알게되어, 도대체 Volume pedal이랑 무엇이 다를까? 그 둘이 혼용이 가능한가에 대해 관심을 가지게 되어 이리저리 검색을 했다. 일단 한국 사이트들은 내 검색이 문제인건지 관심사가 없는 건지 관련 정보를 찾을 수 없었고, 외국 사이트를 검색해서 답을 얻었다. 

답은 간단하다. 그냥 스테레오선으로 이해하면 된다. left, right 두개의 신호가 오는 것처럼, 이 장치도 두개의 병렬 스위치 신호가 들어온다. 회로도만 볼 때는, 두개의 sustain pedal이 있는 것과 같다.  단지 이유를 알 수 없는 트랜지스터가 포함이 되어 있는데 그것은 이해가 더 필요할 듯 하다. 

그렇다면 페달이 하나밖에 없는데, 어떻게 두개의 스위치를 작동을 시킬것인가? 

이전에 이야기한 Sustain 페달 두 종류를 혼용하면 가능하다. 

밟지 않을 때, 1인 회로가 있다. 페달을 밟는 순간 회로가 단락되어 0인 신호로 바뀔 것인다. 그다음 밟았을 때 '1'인 회로가 있다. 꾹 밟았을 때, 회로가 연결되어 '1'인 신호가 나오게 될 것이다. 

하프댐퍼를 알기전에는 두 종의 서스테인 페달이 연주상의 차이가 있을 것이라 생각지 못했다. 하나는 살짝 밟아도 신호가 변하지만 하나는 꾹 밟아야 신호가 바뀐다. 동일한 발동작으로도 다른 연주가 될 것이다. 클러치를 밟는 것처럼 브레이크를 밟으면 사고가 난다. 다른 페달이란 것은 그런 것이다. 

자 그렇다면 이제 중간만 밟는 신호라는 것이 만들어진다. 완전히 땐 상태는 (1,0)신호가 나가고 있고, 반만 밟은 상태에서는 (0,0)의 신호가 나가고 있으며, 완전히 밟은 상태에서는 (0,1) 신호가 나온다. 그 다음은 기계에 들어가서 알아서 잘 해석이 되어, 세가지 상태를 처리하는 것일 거다. 


장비들을 보면, 가끔 한개의 잭으로 두개의 페달을 작동시키는 물건들도 있고, 디지털피아노로 나무로 잘 씌어서 파는 물건들이 있는데, (페달3개) 이러한 물건들은  이 회로 자체를 병렬로 두개의 페달에 연결하는 제품이다.  그리고 3개짜리는 젝을 하나더 연결함으로서 완성이 된다. 


4. 총론 

  정리하면 간단하다.  서스테인 페달은 2극 커넥터가 필요한,1비트 디지털 신호를 만드는 회로이다. 하프 서스테인(댐퍼)페달은 이 서스테인 페달 회로의 병렬회로이며, 3극 커넥터가 필요한  2비트 신호의 디지털 신호이다.   CC페달은  3극 커넥터가 필요한, 가변저항을 이용한 아날로그 회로이다. CC페달이라고 불리기 때문에, 기계에 들어가서는 보통 7bit신호로 0-127의 값을 가진다. (14bit신호도 가능하다. 아날로그로도 처리될 수 있으나 그럴때는 CC페달이라고 부르지 말자 )
  아날로그 신호를 디지털 신호로 바꿀 때는 선형일지 어떨지는 내부적으로 정해진다.(타블렛 펜 신호등처럼) 

  손연주도 안되는 사람들은 여기까지 이 글을 읽었다면 정말 대단하지만 반성하도록 하자. 
나는 더 반성하겠다. 

  
  그림을 넣어야 사람들이 많이 보는 글이 되겠지만 귀찮다. 

2018년 11월 11일 일요일

HOMM3) 베이스 데미지는 어떻게 선택될까?

http://heroescommunity.com/viewthread.php3?TID=20955
의 글을 참조하였으며, 위글 작성자의 실험의 의한 결과이다.
이 글은 폰으로 작성했다.


히어로즈에서 데미지 계산과 관련된 것은 중요한 이 슈 중 하나다 그 계산법에는 베이스 데미지라는 것이 들어가는데 그 계산은 기본적으로 한스택의 유닛이 가지고 있는 최저 데미지에서 최대데미지 곱하기 유닛의 수로 정해진다고 알려져있다.


그렇다면 도끼 창병 100마리 일 경우 최저 데미지 최대 대미지 그리고 그 숫자를 포함하여 계산해 보면 200--300에 데미지 값을 가질 것이다. 그렇다면 200에서 300 사이 모든 정수가 동등한 확률로 선택 될 것인가 아니면 그 사이에 있는 실수가 선택이 될 것인가 어떻게 선택될 것인가는 중요할 것이다.

   다만 실험의 결과로 계산을 해 볼 시 선택되는 데미지는 일정한 간격을 가지는 것을 확인할 수 있다 그 결과는 다음과 같다 스타 계수가 열기 이하일 경우는 경우는 그 숫자만큼 각각의 대해서 정수 난수 발생기를 통해서 동등하게 골라지도록 고른다.

 그리고 그 값을 더 한다.  쉽게 생각하면 열기의  유닛이 각각 한 대씩 때렸을때 데미지를 생각하면 된다 만약 스택이 열기가 넘을 경우는 여기까지 계산을 하고 유닛에 숫자 n 나누기 10을 곧 방값을 베이스 데미지로 선택한다.

 이 결과가 얘기하는 반은 간단하다 숫자가 많던 적던 평균 데미지는 동일하게 정해지고 그 분포는 10기까지는 다르게 정해 쉬다가 그 이후로는 분포가 고정 된다 이런 식으로 계산한 이유는 이상적ㅇ.로야 각 유닛이 한대씩 때리니까 각각 난수를 돌리면 되지만 천기가 넘아가게 되면 난수 발생기를 돌리는 행위도 컴퓨팅파워를 많이 먹어 충분한 부담이 되기 때문일 것이다.

거기다가 숫자가 커지면 커질수록 편차값이 줄어들어(sqrt(N)이지만 한마리당은 1/sqrt(N)) 져 최대데미지가 선택될 확률이 점점 줄어들게되기 때문이다.

뭐 어떻게 하던간에 기대값은 동일하다.

다만 분포가 달라지고 베이스 데미지가 가질 수 있는 값은 각 유닛의 데미지 범위 내 정수 의 10제곱 값중에 한 값이 정해지는갓은 확실하다.


실습을 좀 해보도록하자

일단 마스터 그렘인 4기가 누군가를 공격한다면 베이스 데미지는 다음과 같다.
 1-2 1-2 1-2 1-2 4번 돌려서 정한다.
최소 데미지가 나올 확률은 (1/2)^4 = 1/16이다.
최대도 그러하다.
그리고 모두 고려하면
데미지 4     5        6               7    8
         1/16  4/16   6/16    4/16 1/16
이다. 이런식으로 10기까지만  계산하고 그 이상은 그냥 곱한다. 그렇기에 10기 이상의 마스터 그렘린의 최대(최소) 데미지가 선택될 확률은 1/1024로 동일해진다.

드레드 나이트의 경우는 10기 이상일 경우 나가여왕이랑 동일한 데미지가 선택되려면 15-30 총 16개 중에 선택되므로, 1/2^40 즉 하드디스크 계산법을 쓰면(근사지만 많이 날라감 10^3 simeq 2^10) 대략, 1조번 때리시면 한번정도 선택되겠다.

마리당 30의 데미지를 주고 싶으면 그냥 나가여왕 쓰자....

일단 가짓수만 1테라다. 이거 표로만드는 것도 쉽지 않다.

음 이게 시사하는 바는 간단하다. sod에서는 하단에 최저에서 최대 데미지가 뜨고 HotA에서는 죽일 수 있는 유닛의 수가 뜬다. 최대만 보고 다죽을거 생각해서 전투하면 심히 골룸하다. 데미지가 이지선다형인 그렘린도 4기일때 최대 데미지 잘 안나온다.

불확실성에 기대지 말고 축복을 걸자.


그냥 모든유닛의 데미지는 평균값으로 고정됐다고 생각하고, 사는게 편하다. 

도마뱀전사는 3.5이고, 그랜드엘프은 4x2인 것이다. 마스크맨은 3x2인 것이다.

두대 때리는 친구들은 한스탁당 한번 공격소비으로 난수를 20개까지 돌린다. 최대값은 더 안 나온다.


난수를 많이 쓰는갓을 싫어하고, 정수 난수만 쓰는거보면 고르곤도 적당히 계산하다가. 말 것 같은데 이건 문서를 찾아보던가 직접 실험하서 분포를 그려보도록 하자.


2018년 11월 2일 금요일

HOMM3>석갑 스킬의 쓸모에 관한 글

1. 석갑과 관련된 각종 마법들을 먼저 서술하자. 

  • Lv1 Earth. 석갑 초급 방어력 +3, 중급이상 +6  
  • Lv1 Earth 방패 초급 근접데미지 감소 15%, 중급이상 30% (0.85, 0.7) 
  • Lv3 Air 공기방패 초급 원거리데미지 감소 25%, 중급이상 50% 
  • Lv2 Water 약화. 적의 공격력 -3, 중급이상 -6
여기서 석갑과 방패는 각종 자원이 들지 않고 시청트리에 들어가는 마법길드 Lv1에서 등장하는데다가 흙마법이기 때문에 비교를 많이 당한다. 그렇다면 어떤 마법을 사용하는 것이 좋을 것인지 수치로 비교를 해보자 
2. 석갑에 효율 계산을 위해서 HOMM3의 기본 계산기를 가지고 와서 계산하도록 하겠다.  

이 계산에는 많은 것들이 생략되어 있다. 다만 방어술, 원거리 페널티, 성벽페널티 등은 복리연산이므로 별로 중요하지 않다는걸 말하도록 한다. 공격술, 증오, 행운 등은 계산 방식이 유사하므로 공격술  그래프를 참조하면 된다.

기본 계산은 다음과 같다. 기준은 내가 석갑 사용자일 때를 가지고 하도록 한다. <여러가지 모든 계산을 거치고 복리계산에도 한계점이 있지만 무시하자.>

기본 계산식은 기본데미지 =(공)[minDMG,maxDMG]*숫자 * A1*R1*R2

if ( (RDEF=방어력 - 상대공격력) > 0 )
       then
          A1= 1
          R1= MIN(1-0.025*RDEF, 0.3)
        else
                RATT=-RDEF
                A1 = MAX(1+ 0.05*RATT,4)
                R1 = 1
endif.

로 정해진다.
 
쉴드의 계산은 흙마법 중급이상일때 R2=0.7, 초급이하는 R2=0.85로 한다.


석갑의 계산은 중급기준 {A1*R1}(RDEF+3 or 6)/{A1*R1}으로 석갑마법이 걸리기 전과 비교해서 상대적으로 얼마만큼의 데미지가 감소될 것인지에 대해 계산한 양이다. 

이 계산식을 가지고 libreoffice calc를 통해 표를 만들고 차트를 그려보았다.
요 프로그램은 차트를 예쁘게 그리는 방법을 모르므로, 나중에 다시 gnuplot으로 예쁘게 그리도록 하고, 일단 올려보면 
  빨간색 선은 초급 석갑일 때의 그래프이다. 내 상대방어력이 20보다 크기 시작할 때, 초급 쉴드보다 효과가 좋은 것을 알 수 있다. 다만 상대방어력이 20보다 크기는 쉽지 않다. 대천사나, 대사탄으로 양학할 때는 쉴드보다 좋다.
 
노란색 선은 중급이상 석갑일 때 그래프이고, 같이 움직이는 검정선은 상대방이 공격술 고급일 때의 그래프이다. 행운, 중오 등도 동일한 형태로 살짝 이동한 형태로 그려진다.  상대방어력이 -19로 매우 낮은 상태일 때부터 초급 방패보다는 효과가 크게 그려진다. 다만 쉴드도 흙마법이기 때문에 큰 의미는 없다. 

  상대방어력이 0보다 클때는 검정선과 같이 움직이므로 상대방 능력은 석갑의 효율과 별 상관이 없다. 다만 상대방어력의 한계점 근처이다보니 계산식이  미분불가능한 영역이 있다.  상대방어력이 21,22일 때만 쉴드보다 강력한 기능을 발휘 한다.

재미로 Air shield를 포함했다. 가중치가 굉장히 크다보니, 상대방 궁수에게 계속 얻어맞는 상황이라면 어떤 마법보다 강력하다. 고급 공기마법은 근처에 가기도 힘들다.

중급 흙마법이 있고, 초급이하의 공기마법이 있다면 내 상대방어력이 16보다 큰 순간부터 공기방패보다 좋은 가치를 지닌다.

3. 결론. 
 히어로즈에서 궁수를 상대하는 기본 전술은 상대방에게 근접유닛을 붙이는데서 시작한다. 속도가 빠른 유닛이 없어서 화살공격을 맞아야 하거나, 하는 순간이 아니라면, 방패마법이 대부분 효율이 좋다.
(그리고 조금만 넘어가면 효율이 사라지므로(한계점이라) 그냥 방패쓰자)

  몸이 돌이 되지만, 몸으로 맞는거보다, 방패로 막는게 더 좋다. 다만 이미 돌처럼 단단한 자에게는 돌이 철이 되는 기적이 보여진다. 

  다만 보통 일반적인 상황에서 고급석갑 마법은 초급 방패마법 이상의 능력을 보이므로,(복리) 내파나, 연속번개, 메테오 같은 마법이 없다면 고급 석갑을 이어서 또 써주도록 하자. 
  고급 방어술이 15% 감소이므로 무시할만한 양은 아니다.

4. 번외. - 약화 등등 
상대방이 블러드 러스트가 걸렸을 때는 어떤 것이 효율이 좋은가. 
  그래프가 복잡하므로 여기에는 고급만 넣어서 보도록 하자. HoTA에 오우거 세트가 생겼으니 가끔 블러드 러스트를 겪을 수 있다. (??? 정말 가끔)

  약화는 석갑과 마찬가지로 상대방어력으로 계산하는 양이고 값도 동일하다 다만 흙마법이아닌 물마법이다. 요건 X축을 좀 줄였다. (X축이 부호가 이상하네.)
  고급 스톤스킨은 대부분의  고급방어술에 능력치 이상의 능력을 발휘했다.  블러드러스트 마법은 고급 공격술 정도의 가치를 가진다.

일상적인 상황에서 고급 방패보다. 효과가 있으려면 고급석갑과 고급약화가 동시에 필요하다. 그래서 방패 방패 하는 것이다. 하지만 두턴이나 필요하다는 사실을 기억하자. 방패가 없어도 지나가는 드래곤 플라이를 잡아다가 던져주는 방식을 쓰면 방패보다 강력할 수 있다.
  인챈터가 부대에 있어서 석갑이나, 약화를 사용한다면 냉큼 쉴드를 사용하자. 피해감소율이 마법쓰기 전과 비교했을때, 거의 절반에 육박한다.
  마법의 대지가 있다면, 지니 부대를 최대한 분배하자. 약화나 석갑만 나와도 매우 감사하다.
  한턴만에 데미지를 절반으로 감소할 수 있는 것은 쉽지 않다. 공격술과 방어술과 달리 이건 내 선택에 의해서 전투중 변화하는 부분이다. 

진 초록색 그래프는 블러드 러스트가 걸린 적에게 약화마법으로 상쇄시켰을 때의 데미지 변화이다. 
  상대방이 블러드러스트가 걸렸을 때 내가 어떤 마법을 쓸지를 비교하려면, 쉴드와 Blood>Weak를 비교해야 한다. 뭐 대략 일반적인 상황해서 방패보다. 매우 막강하다는 사실을 알 수 있으나 이런 일은 거의 없다. 블러드러스트 마법자체가 똥이다. 그래도 오우거 메이지가 사이클롭스 옆에 붙어 있는 상태로 다른 녀석에게 블러드러스트를 건다면, 냉큼 드래곤플라이 고기방패를 보내자. 

  Blood+Shield는 그냥 데미지가 어느정도 되는지 보기위해 넣었지 내가 방패를 쓸지 말지를 결정하는데는 큰 의미는 없다.

내가 약화 마법이 걸릴일은 없겠지만, 혹시 걸린다면 즉각 블러드러스트로 상쇄를 시켜주자. 저 그래프의 휘황찬란함을 보라. 마법쓰기전에 유닛위에 올려놓을 때 나오는 데미지 계산 범위가 단숨에 뻥튀기가 된다.

헤이스트나 슬로우는 워낙 중요한 마법이니까, 쓰는거지 적이 상쇄하면서 긍적적인 효과를 주는 마법은 HOMM3에서는 최대한 피해야 하는 마법이다.

  저주마법과 축복마법, 블러드러스트와 약화마법, 헤이스트와 슬로우는 상쇄가 되니 조심해서 써야하고,  헤이스트와 슬로우의 관계는 더 효과가 크다.
  이쪽은 그렇게 무섭다는 땅마법과 공기마법이다.



4. 사족. 내가 포트리스 유저라면, 드래곤 플라이를 아끼지 말아야 한다. 남는 칸은 드래곤플라이 1로 채워넣자. 그리고 반드시 가운데 칸은 드래곤플라이로 채워야 한다. 다른 녀석들은  두자리를 차지한다. 이 유닛을 소모해서 다른 유닛을 모으는게 포트리스 전략의 핵심이다. 적당히 줄여놔야, 성전투일 때도, 성이 쏘는 화살을 이 친구가 맞아준다. 





2018년 10월 24일 수요일

외교술이 게임 프로그램 내부에서 어떻게 작동하는가? (for HoMM III 3.2 & 4.0)

이 글은 http://heroescommunity.com/viewthread.php3?TID=28341 의 글을 구글번역기로 번역한 후 한국인이 읽기 쉽도록 수정한 글입니다.
일단 해당 글도 비판을 받은 부분이 있으니 잘 보시기를 바랍니다.

외교술이 어떻게 작동하는가? (for HoMM III 3.2 & 4.0)

(변수가 많아서 변수를 설명하고 있다. )

1. [Hero_Power]

영웅의 1차스킬 전투능력이 중요하다.
Hero_Power = sqrt ((1 + 0.05 * Attack) * (1 + 0.05 * Defense)); 

2. [Total_Army_Power]

영웅 군대의 총 힘은 영웅과 군대의 힘을 곱한 후 소수점을 버림으로 이루어진다. 
같은 수준의 군대라도 마력영웅이 조금 더 불리하다. 
Total_Army_Power = floor (Hero_Power * Army_Power); 

Army_Power는 아래 링크에서 Fight Value와 유닛의 숫자를 곱한 후 합한 값을 생각하자. 
http://heroes.thelazy.net/wiki/AI_value
점수만 보고 생각할 때, 피닉스가 주당 4기에서 2+1기로 HoTA에서 패치 되었는데, 
피닉스가 아니라 고스트드래곤에게 그런 기회가 와야한다고 생각한다. 아니면 해골변환기에서 좀비를 해골용 뼈 부속으로라도 변환이라도 좀 시켜줬으면... 


3. [k]

k = Total_Army_Power / Neutrals_Power;
 k 값은 서로의 군대의 전투능력의 비를 나타낸다.

4. [Power_Factor] (fixed)

Power_Factor = 11 if k >= 7;
Power_Factor = floor(2*(k - 1)) if 1 <=;= k < 7;
Power_Factor = -1 if 0.5 < k < 1;
Power_Factor = -2 if 0.333 < k <= 0.5; 
Power_Factor = -3 if k <= 0.333;

주의: 0.333은 333/1000을 의미하지 , 1/3을 의미하지 않는다. 
Now I am sure.(확신하단다)

 5. 동정이라고 번역되지만 동질감이 좀 더 해석이 용이 하겠다. [Sympathy]

영웅의 군대에 중립유닛과  같은 종류의 유닛이 존재하는가가 핵심이다. 0과 1사이가 굉장히 크기때문에 멍청한 컴퓨터의성을 점령한 후 주위에 남아있는 고위 유닛은 한마리라도 어디서 보충을 해서 공격하자.

Sympathy = 0 ;영웅의 군대에 중립유닛과 같은 유닛이 존재하지 않을 때.

Sympathy = 1 ;적어도 한종류의 유닛이 중립유닛과 같은 종류일 때, 같은 종류라는 것은 업그레이드, 다운그레이드 관계에 있는 유닛을 말한다. 
Sympathy = 2 ; 같은 종류인 영웅의 유닛이 다른 유닛의 비해 압도적으로 많을 때 포트리스 군대이지만 놀이 압도적으로 많다면 중립 놀군대는 좀 더 영웅의 군대에 합류하고 싶어진다.  그 압도적인을 어떻게 수적 표현으로 나타낼지는 모른다. 
if total number of creatures (or their upgrades/downgrades) of the same kind as neutrals in hero's army are strictly bigger than number of all the other beings in the army;
주의 다음은 합류계산에만 작용한다. 
  길에 있는 중립유닛들 중에 모든 정령류가 들어갈 수 있는 유닛이 있는가 보다. 합류계산에 있어서 공기의 정령을 업그레이드 해서 계산할 때는 땅, 물, 불 정령은 할 수 없다.  그리고 폭풍의 정령을 다운그레이드해서 계산할 때도, 마그마, 얼음, 에너지 정령은 그렇게 하지 못한다. 2레벨 유닛이 숫자가 가장 많으니  컨플럭스를 만들면서 페널티를 준듯하다. 


6. [카리스마 (Ch)]  

Ch = Power_Factor + Diplomacy_Level + Sympathy;


7. [공격성 (X)] (작을 수록 합류)

X = -4 (always)  완전 중립
X = 10 (always) 야만적 중립 
X in [1,7] for 친근한 중립 
X in [1,10] for 공격적 중립;
X in [4..10] for 적대적 중립;
 정수일 것으로 생각된다. 이 값은 새로운 게임을 시작할 때, 저 값 사이의 값으로 난수발생기로 정해진다. 


이제 부터 계산에 들어간다. 

8. 카리스마가 공격성보다 약하면 싸운다.  (Ch

9. 카리스마가 공격성보다 크거나 같다면 다양한 선택지가 생긴다. (Ch>=X)

  • Sympathy + Diplomacy_Level + 1 >= X 이면 중립유닛이 공짜로 합류한다. (같은 수준의 전투력인 군대가 카리스마가 있다고 가정한다. 중요한 것은 이과 정은 9번과정을 거치고 나서를 말한다. 일단 군대로 겁박하는 것이 중요함.
  • 9-1이 아닐 경우 Sympathy + 2*Diplomacy_Level + 1 >= X, 외교술 레벨에 2를 곱한 후, 돈으로 합류를 요구한다. 여기에는 이 중립유닛을 사는데 필요한 총 gold를 말한다. 자원은 요구하지 않는다. 
  • 합류를 거절 했을 때,  Ch>X일 경우는, 중립유닛을 내쫓거나, 공격할 수 있다. 
  • 합류를 거절 했을 때, Ch=X일 경우는 공격당한다. 연립해서 구할 수 있다.  외교술 없이 비슷한 수준의 군대인데, 공짜로 합류한다는 경우나, 군대가 많이 약하지만 외교술로 어거지로 돈으로 구매해서 살 수 있는 경우, 거절하면 항복하거나 죽어야 한다는 것을 명심하자.
쉬움 난이도에서는 모든 영웅은 숨겨진 외교술 기술을 가지고 있다. 기술 없을 때 1, Basic일때 2, advance 및 Expert는 3으로 여전히 최대 3이다.  쉬움 난이도가 아닐 때는, 외교술이 없는 영웅은 계산식을 볼 때, 돈으로 중립유닛을 살 수 없다. 

그외 답변에서 알 수 있는 정보들, X값인 10일 때는 절 대 합류 할 수 없다.
동질감 (2) + 2*3(외교술 전문가) +1  = 9 < 10. 퇴각은 시킬 수 있다. 

2018년 9월 13일 목요일

구글은 android에 외장 메모리 모드 좀 다시 만들어 주면 안되냐...



윈도우는 어떤 형편인지 모르겠다만,

리눅스에서 v30으로 usb 3.0모드로는 mtp나 ptp모드가 작동을 안한다.


뭐 번들케이블이 usb 2.0 type c to usb 2.0 type a인것을 보고 그럴꺼라 생각은 했다만,


수많은 시도를 했지만 안되는 것으로 결론이 났다.


뭐 양쪽 칩셋이 3.0지원하는 칩셋이라 2.0으로도 초속 30MB/s가 나오는 상황이라 큰 불편은 없지만,

그래도 엄청난 속도를 기대하고 케이블을 샀음에도 사용하지 못하는 마음을 좀 알아달라...



LG는 ptp 모드에서 video capture나 image capture를 지원하도록 해봐라...
이런거는 보안 문제 때문에, 제조사가 아니면 못하는 부분인것 같은데,

애플은 quick time player로 이거 가능하다고 알고 있다. 

가능하면 LG gram하고만 그게 가능하게 해주던가...

스마트폰 카메라가 정말 좋은 상황이지만, 방송은 PC로 하는게 관리에 있어서 좋으니까 좀 같이 사용할 수 있게좀 해달라...

뉴스 홈페이지 댓글 관련 플러그인인 LiveRe는 광고 차단하면 작동하지 않습니다.


쿠키를 차단하면 로그인이 되지 않습니다.


광고를 차단하면 댓글을 작성해서 보내기를 누르면 내가 쓴글이 날라가고,
로그인이 안되어 있다고 하거나(로그인 되어 있으나)

그냥 버튼이 먹통이 됩니다.



그냥 이 사이트에서 일시중지 눌러서 글 쓰면 됩니다.

에드블록 말고도 광고차단 플러그인이 있을 수 있으니 신중하게 찾아보세요.

가장 많이 본 글