native 코드에서 블루프린터에 함수를 호출 하고 싶을때 사용하는 플래그.


사용방법은


UFUNCTION(BlueprintImplementableEvent)

Func() 설정



으로 사용하면 되는데 주의점이 있다.


함수 반환형이 void일때는 블루프린트의 이벤

트 그래프에 바로 사용이 가능하며 설정이 customevent형식으로 노출된다.


함수형을 void Test()로 설정하면 이벤트 그래프에 다음과 같이 보인다.



그러나 함수에 반환값이 있으면 이벤트 그래프에 생성되지 않으며


함수를 오버라이드 해줘야 된다.


bool Test()라고 했을 경우에 이벤트 그래프에서 보이지 않는다.



왜 나눠놨는지는 모르겠슴....


추가적으로 매개변수를 어떻게 넣느냐에 따라 블루프린터의 함수 형태가 바뀐다.


ex) void Test(int arg1);




ex) void Test(const int arg1);




'프로그래밍 > Unreal' 카테고리의 다른 글

RunTime에 StreamingLevel 생성하기  (0) 2018.03.30

기본적으로 UE4의 레벨 시스템은 퍼시스턴트 레벨에서 Volume처리를 해서 해당 영역에 들어오면 SubLevel을 나눠서 Streaming처리를 하여 메모리에 Load/Unload 하는 방식으로 되어 있는데...

SubLevel이 너무 많으면 퍼시스턴트 레벨에 모두 포함 시켜서 관리를 하면 관리에 용이하지 않고 힘들지 않을까 해서 RunTime시에 Streaming Level을 이용하여 퍼시스턴트레벨에 붙이는 방법이 없을까라는 미션이 발생하였는데 결과부터 말하면 가능하다.




관건은 ULevelStreaming을 받아서 패키지 명을 셋팅해주는건데 ULevelStreaming옵션이 UCLASS(abstract, editinlinenew,MinimalAPI,BlueprintType, Within=World) 로 되어 있어서 그냥 사용하면 Debug모드에서 깔끔하게 터트려준다. 

새롭게 본인의 입맛에 맞는 Custom Class로 만들던가 아니면 Kismet을 사용하면 된다.


문제는 LevelTransform인데.... 이게 해당 Location으로 이동이 가능한데 이게 내부적으로는 해당 Level에 배치되어 있는 Actor들을 죄다 접근해서 일일이 Offset 적용을 해주기 때문에 부하가 있어 보인다.


방법은 게임 첫 진입시에 필요한 부분을 죄다 로딩하 하는 식으로 하거나 다른 방법을 사용하면 되지 않을까 싶다.


핵심은 저렇게 사용하여 Runtime시에 SubLevel을 조합하여 원하는 Level을 조립할 수 있는것이다.

'프로그래밍 > Unreal' 카테고리의 다른 글

BlueprintImplementableEvent  (0) 2018.08.02

벡터의 내적 정의는 [프로그래밍/3D Programming] - [3D수학] 벡터의 내적 참고 해주세요.


벡터의 내적에 값을 이제 좀 더 편하게 할 수 있는 방법을 찾아 보도록 하겠습니다.


백터 내적의 공식은 다음과 같습니다.



그러나 프로그래밍에서 삼각함수를 사용하는건 프로그램의 성능을 저하 시킬 수 있기 때문에


좀 더 편한 방식을 알아보도록 하겠습니다.


벡터의 내적은 좌표값의 각 성분을 곱해서 더하면 됩니다. 과연 위에 공식이랑 똑같은 값이 나오는지 한번 확인 해보겠습니다.


벡터A와 벡터B의 내적은 각 성분을 곱해서 더하면 된다고 했는데요 


계산해보면 ( 4 X 6 ) + ( 3 X 0 ) = 24가 나오는 것을 알 수 있습니다.


그럼 위의 값이 우리가 만든 공식에 부합되는지도 알아볼려면


cos값을 알아야 되는데요 일단 위에 나온 값을 대입해서 증명 해보도록 하겠습니다.




벡터a의 절대값 곱하기 벡터b의 절대값에 cos값을 곱한 결과가 24입니다.



따라서 cos값은 


cos값은 대충 이런식으로 처리 됩니다.



원하는 값이 없네요.... 계산기로 두들겨 보니 가장 근사치의 값이.... cos36이네요



근데 이런 방식으로 구할려니 그냥 대충 때려 넣는 느낌이라 다른 방법으로 한번 찾아보겠습니다.


두점을 가진 벡터가 있고 그 사잇각( 사이각? ) 을 구하는 공식은 다음과 같습니다. 굳이 외울 필요는 없습니다



엄청 복잡해 보이지만 간단합니다.


벡터 v1 즉 a벡터의 크기는 5이고 v2 벡터 즉 b벡터의 크기는 6입니다 그리고 각 좌표의 값을 계산하면 저렇게 되구요


즉 사이의 각도는 입니다. 또 계산기를 두들겨 보면 다음과 같이 나옵니다.


애매하긴 합니다만 밑에 소수점은 버리기로 하였기 때문에 36도라고 하겠습니다.


그럼 위에 저희가 가정했던 각도가 일치 하는것을 볼수 있습니다.


그러므로 벡터의 내적은 각 성분을 곱해서 더하면 된다는 것을 알 수 있습니다.


프로그래밍에서는 각 성분을 곱해서 더하는 것으로 내적을 쉽게 구하는것이 성능에도 좋고 계산하기도 편합니다.


게임에서는 거의 대부분은 좌표값을 가지고 있기 때문에 내적은 저런식으로 표현해준다고 생각하시면 될 것 같습니다.


내적을 다른 방법으로 구하는 방법은 이제 보셨습니다 이제 게임에서 어떻게 활용하는지 알아 보도록 하겠습니다.


현재 주인공 케릭터의 위치에서 적이 있는 위치가 내 앞에 있는지 혹은 뒤에 있는지 계산하는 방법을 알아보도록 하겠습니다.


다음 그림에서 



주인공의 위치를 편의상 원점이라고 했을 경우에 적A와 적B의 위치는 주인공 앞인지 뒤인지 보면 그림으로 봤을 경우에는

적A는 주인공의 앞쪽 적B는 주인공케릭터의 뒷쪽인걸 알 수 있습니다. 

이걸 내적을 사용해서 알아보도록 하겠습니다.


내적은 각 성분의 곱이라고 말씀 드렸기 때문에

계산 과정은 생략하고 


적A와 주인공의 내적에 코사인값은 0.6 이고 적B와 주인공의 내적에 코사인값은 -0.6이 됩니다.

일반적으로 방향벡터는 단위벡터로 만들어줘서 계산을 좀 더 빠르게 할 수 있도록 합니다.


따라서 내적시에 값이 0보다 크면 앞쪽에, 0보다 작으면 뒷쪽에 있는것으로 판별 합니다.


간단하게 벡터의 내적의 활용의 예를 알아봤습니다.


이외에도 내적은 적이 주인공의 시야각안에 들어와 있는지 아닌지 확인하고, 선이 평면과 접하는 접점을 구할때도 사용되고

게임에 사용되는 곳이 많으므로 개념을 이해하고 있으시면 프로그래밍하는데 많은 도움이 됩니다.























'프로그래밍 > 3D Programming' 카테고리의 다른 글

[3D수학] 벡터의 내적  (1) 2017.11.24
[3D수학] 벡터의 덧셈과 뺄셈  (0) 2017.11.09
쉐이더란 무엇인가.  (0) 2016.11.21
< Culling의 종류 >  (0) 2016.11.21

벡터의 덧셈과 뺄셈을 정리 했으니 이제 슬슬 곱셈에 대한 개념이 나올때가 된것 같습니다.


벡터의 곱셈의 개념으로 벡터의 내적과 외적이 있습니다.


일단 이번 포스팅에는 내적을 다루겠지만 두가지 개념의 차이점만 짚고 넘어 가자면,


외적 ---> 결과값이 벡터

내적 ---> 결과값이 스칼라값. ( 실수 )


표현을 해줄때는 내적은 . (점) 표시

                      외적은 X 표시


입니다.


내적( dot product, inner product )에 대한 정의는 다음과 같습니다.

위에 그림에서 

로 정의하고   로 정의를 하겠습니다.  세타의 값은 일 때  내적의 정의는 다음과 같습니다.



벡터의 내적의 특징은 다음과 같습니다.



1번식은 딱히 설명 드릴께 없을 것 같습니다.

2번식은 동일 한 벡터가 있을 경우에는 두 벡터가 이루는 각은 0도이므로 cos0 = 1 입니다. ( 이부분은 나중에 삼각함수때 또 정리를 하도록 하겠습니다. ) 그러므로 벡터a의 절대값 ( 길이 )의 제곱이 되는것을 알 수 있습니다.


다음으로 두 벡터의 내적이 가지는 기하학적인 의미 를 얘기해보겠습니다. 머 기하학이라고 해서 어려운 얘기는 아닙니다.

  


다음과 같은 교환이 성립되는 이유는 a벡터의 크기는 실수, b벡터의 크기도 실수, cos 값도 실수기 때문에 교환 법칙이 성립됩니다.

a벡터의 크기 즉 벡터의 길이 X cos 값은 점A에서 수선의 발을 내린점이 H라고 했을때 즉 선분 OH의 길이가 됩니다.

그리고 벡터b의 값은 그림에서 보시는 바와 같이 선분 OB의 길이가 됩니다. 

따라서 선분 OB의 길이와 선분 OH의 곱은 a벡터와 b벡터의 내적과 같다라는 도출이 됩니다.

노란색의 빛이 비추었을 경우에 벡터a의 그림자 OH와 벡터의 길이의 곱이 됩니다.


정리하자면 두 벡터의 내적이 가지는 기하학적 의미는 한 벡터를 다른 벡터위로 정사영 시킨 길이와 그 다른 벡터의 길이의 곱셈이다.

위의 그림에서는 선분 OH와 선분 OB의 길이의 곱이 됩니다.


개념적인 부분은 이쯤에서 마무리 하고 다음 포스팅에서 벡터의 내적을 어떻게 게임에 활용하여 사용하는지 

확인 해보도록 하겠습니다.


'프로그래밍 > 3D Programming' 카테고리의 다른 글

[3D수학] 백터 내적의 활용  (0) 2017.12.04
[3D수학] 벡터의 덧셈과 뺄셈  (0) 2017.11.09
쉐이더란 무엇인가.  (0) 2016.11.21
< Culling의 종류 >  (0) 2016.11.21

세 자릿수마다 쉼표를 찍는 숫자와 일치하는 정규식을 만드시오.

정규식은 다음과 일치 해야 됩니다.

  • '42'
  • '1,234'
  • '6,368,745'
다음과는 일치 하면 안됩니다.
  • '12,34,567'
  • '1234'

mo = regex.search('42')
if mo:
    print(mo.group())

mo = regex.search('1,234')
if mo:
    print(mo.group())

mo = regex.search('6,368,745')
if mo:
    print(mo.group())

mo = regex.search('12,34,567')
if mo:
    print(mo.group())

mo = regex.search('1234')
if mo:
    print(mo.group())
_M#]



성이 Sayonara인 어떤 사람의 전체 이름과 일치하는 정규식을 만드시오.

정규식은 다음과 일치해야 됩니다.

  • 'Satoshi Sayonara'
  • 'Alice Sayonara'
  • 'RoboCop Sayonara'
다음과는 일치 하면 안됩니다.
  • 'satoshi Sayonara'     (이름의 첫 글자가 대문자가 아니기 때문에)
  • 'Mr. Sayonara'           (앞에 있는 단어에 문자가 아닌 기호가 있기 때문에)
  • 'Sayonara'                 (이름이 없기 때문에)
  • 'Satoshi sayonara'     (sayonara의 첫 글자가 대문자가 아니기 때문에)


첫 번째 단어는 Alice, Bob, Carol이며, 두 번째 단어는 eats, pets, throws이고, 세 번째 단어는 apples, cats, baseballs이어야 한다. 또한 문장은 마침표로 끝나야 한다. 이정규식은 대소문자를 구분하지 않는다.

일치해야 되는 문장.
  • 'Alice eats apples.'
  • 'Bob pets cats.'
  • 'Carol throws baseballs.'
  • 'Alice throws Apples.'
  • 'BOB EATS CATS.'
일치 해서 안되는 문장.
  • 'RoboCop eats apples.'
  • 'ALICE THROWS FOOTBALLS.'
  • 'Carol eats 7 cats.'


전달 받은 암호 문자열이 보안 면에서 강력한지는 확인하기 위해서 정규표현식을 사용해보도록 합시다.
강력한 암호의 기준은 최소 8글자에서 15글자이고, 대소문자와 소문자를 모두 포함하며, 적어도 하나의 숫자를 가지고 있는 것을 기준으로 합니다.



마지막으로 참고자료로 사용하기 좋은 사이트를 소개한다. ( 사실 이분이 더 정리를 잘 하셔서 포스팅한 의미가 퇴색되고 있다 )

http://sweeper.egloos.com/3064293

http://sweeper.egloos.com/3064431

http://sweeper.egloos.com/3064464

http://sweeper.egloos.com/3064600

http://egloos.zum.com/sweeper/v/3064687

http://sweeper.egloos.com/3064730

http://sweeper.egloos.com/3064808


예제 참고용.

http://gocoding.tistory.com/93

'프로그래밍 > Python' 카테고리의 다른 글

정규표현식 예제  (0) 2017.11.21
정규 표현식  (0) 2017.11.20

정규 표현식의 예제들을 풀어가면서 보도록 하겠습니다. ( 모든 예제는 python3에서 테스트 하였습니다. )


import re

Regularexpression = re.compile(r'\d+\s\w+')


print(Regularexpression.findall('1 일, 2 이, 3 삼, 4 사, 5 오, 11 십일')


결과값

['1 일', '2 이', '3 삼', '4 사', '5 오', '11 십일']

해당 정규 표현식은 하나 또는 그 보다 많은 숫자 글자 (\d+), 그 다음에 공백 문자 (\s), 그다음에는 하나 또는 그보다 많은 문자,숫자,밑줄 글자(w+)를 가진 텍스트를 찾습니다.



import re

regex = re.compile(r'[낭만코더]')

print(regex.findall('낭만 만두 코딩 더럽다 부대찌개 지지'))


결과값

['낭', '만', '만', '코', '더']

다음 정규식은 사용자 정의 정규식으로 [] (대괄호) 안에 문자를 정의하면 각각의 모음과 일치한다. 예문에서는 한글로 되어 있기 때문에 한글의 한글자와 매칭하는 글들을 찾아 주기 때문에 결과값이 저런식으로 호출 되는 것을 알 수 있습니다. 영문으로 되는건 직접 해보시기 바랍니다.



import re

regex = re.compile(r'[^낭만코더]')

print(regex.findall('낭만 만두 코딩 더럽다 부대찌개 지지'))


결과값

[' ', '두', ' ', '딩', ' ', '럽', '다', ' ', '부', '대', '찌', '개', ' ', '지', '지']

사용자 정규식 한에 캐럿문자(^)를 두면 부정형 문자 클래스. 즉, 해당하는 반대의 ( 문자 클래스에 없는 모든 문자와 ) 모든 문자와 일치 하기 때문에 공백 문자도 포함됩니다. 따라서 해당 결과값이 발생합니다.



import re

regex = re.compile(r'^낭만')

print(regex.findall('낭만코더, 코더낭만, 만낭만낭, 테테테테낭만')


결과값

['낭만']

위 정규 표현식은 검색 텍스트의 시작 부분에서 일치하는 텍스트를 나타내는 것이다. "낭만"이라는 단어로 시작되는 텍스트에서 낭만만 뽑아내기 때문에 결과값이 저렇게 나왔습니다. 반대로 문자열이 정규식 패턴으로 끝나야 한다는 것을 하기 위해서는 $ 기호를 붙이면 됩니다. 그 부분은 직접 해보시길 바랍니다.


추가적으로 낭만 이라는 글자만 결과값에 출력되지 않고 한 문장 예를들면 낭만으로 시작되는 정규 표현식에 결과값은 "낭만코더" 이런식으로 검색되게 하기 위해서는 어떻게 해야 될지, 또 낭만이라는 글자가 끝에 오는 단어들은 어떻게 출력 시킬 수 있을지는 고민해 보시길 바랍니다.



정규식에서 .글자(점)는 와일드카드라고 하며 줄바꿈을 제외한 모든 문자와 일치합니다.

import re

regex = re.compile(r'.만')

print(regex.findall('낭만코더, 두만, 원만, 천만, 태만, 포만')


결과값

['낭만', '두만', '원만', '천만', '태만', '포만']


모든 것을 일치 시킬 필요가 있는 경우도 있습니다.

import re

regex = re.compile(r'First Name: (.*) Last Name: (.*)')

mo = regex.search('First Name: 낭만 Last Name: 코더')

print(mo.group(1))

print(mo.group(2))


결과값

낭만

코더



정규식은 그냥 많이 써보면서 삽질 해보는게 가장 많이 늘 것 같네요....

'프로그래밍 > Python' 카테고리의 다른 글

정규표현식 예제2  (0) 2017.11.22
정규 표현식  (0) 2017.11.20
  • "정규 표현식"의 정의

위키백과에 적혀 있는 정의로는 다음과 같습니다.

-> '정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex, rational expression) 또는 정규식(正規式) 특정한 규칙을 가진 문자열의 집합을 표현하는 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl 언어 자체에 강력한 정규 표현식을 구현하고 있다.'


많은 분들이 간과 하고 있습니다만 ( 저도 사실 몰랐음...;;; ) MS Word 또는 OpenOffice와 같은 현대의 텍스트 편집기와 워드프로세스의 찾기 및 찾아 바꾸기 기능에서도 정규표현식 기반으로 검색을 할 수 있다고 합니다. ( 사용은 안해봤네요.... 이글 정리한 다음 부터는 자주 사용해봐야 겠습니다 )


일단 정규 표현식 패턴의 종류들을 정리하고 파이썬에서 사용은 어떤식으로 하는지 예제를 보여주는 방식으로 정리를 해볼까 합니다.


문자열 안에서 전화번호를 찾고 싶다고 가정해봅시다. 보통은 3개의 숫자 - 3개 혹은 4개의 숫자 - 4개의 숫자 ( 000-000-0000 or  000-0000-0000 ) 으로 보통 되어 있습니다. 이러한 패턴과 일치하는 여부를 확인하는 파이썬 함수를 한번 만들어 보겠습니다.

( 여기에서 실행되는 소스는 Python3 기준으로 작성되어 있습니다. )


def isPhoneNumber(text):

    if len(text) != 12 and len(text) != 13:

        return False

    for i in range(0, 3):

        if not text[i].isdecimal():

            return False

    if text[3] != '-':

        return False

    if len(text) == 12:

        for i in range(4, 7):

            if not text[i].isdecimal():

                return False

        if text[7] != '-':

            return False

        for i in range(8, 12):

            if not text[i].isdecimal():

                return False

    else:

        for i in range(4, 8):

            if not text[i].isdecimal():

                return False

        if text[8] != '-':

            return False

        for i in range(9, 13):

            if not text[i].isdecimal():

                return False

    return True


message = 'Call me at 011-555-1011 tomorrow. 070-8888-8888 is my office.'


for i in range(len(message)):        

    chunk = message[i:i+12]       << message 로 부터 12글자씩 나눠서 chunk변수에 할당 시킨다.

    chunk1 = message[i:i+13]      << message 로 부터 13글자씩 나눠서 chunk1변수에 할당 시킨다.

    if isPhoneNumber(chunk):                     << 12글자를 담아서 전화번호의 패턴에 맞는지 확인한다. 맞으면 그 글자를 출력.

        print('Phone Number found:' + chunk)

    if isPhoneNumber(chunk1):                    << 13글자를 담아서 전호번호의 패턴에 맞는지 확인한다. 맞으면 그 글자를 출력.

        print('Phone Number found:' + chunk1)

print('Done')



2가지의 경우만 나눴을 뿐인데 소스가 굉장히 지저분해집니다. 그리고 여기에 기준점이 또 추가 되거나 했을 경우에 더욱 코드가 많아 질 것 같습니다.


만약에 message 글자가 수백만 글자 길이 일수도 있고, 새로운 패턴이 있을 경우에 프로그램은 점점 더 무거워 질수 밖에 없습니다.

이러한 불편을 해결하기 위해서 정규표현식을 쓰면 코드를 더욱 간결하게 만들 수 있습니다.


일단 정규 표현식을 사용하기 위해서는 re모듈을 import 해주셔야 됩니다.

 import re


정규표현식을 나타내는 문자열 값을 re.complie()에 전달하면 Regex객체를 돌려받습니다.

phoneNumRegex = re.complie(r'\d\d\d-\d\d\d-\d\d\d\d) <<< (r'문자열') 을 원시 문자열이라 함. 원시 문자열로 하지 않게 되면 re.complie('\\d\\d\\d-\\d\\d\...') 설정.


해당 부분을 찾을 때는 다음과 같이 해주면 된다.

import re

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

mo = phoneNumRegex.search('My number is 415-555-5555.')

print('Phone Number found:' + mo.group())


결과값 : Phone Number found: 415-555-5555


소스코드가 매우 간단해졌습니다. 물론 4자리 관련된 부분은 생략되어 있지만 해당 작업은 추후에 다시 설명하도록 하겠습니다.


전화번호에서 지역번호를 분리하고 싶다고 했을 경우에 괄호를 추가하면 정규표현식에서 그룹이 만들어집니다. 모든 그룹을 한 번에 가져오려면 groups() 메소드를 사용하면 됩니다.

import re

phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')

mo = phoneNumRegex.search('My number is 415-555-5555.')

print(mo.group(1))

print(mo.group(2))

print(mo.group(0))

print(mo.group())

print(mo.groups())


areaCode, MainNumber = mo.groups()

print(areaCode)

print(MainNumber)


결과값


415

555-5555

415-555-5555

415-555-5555

('415', '555-5555')

415

555-5555


이때까지 3자리에 대한 부분만 살펴 보았습니다. 3자리와 4자리를 동시에 대조하려고 하면 어떻게 할 수 있을까요? 아주 간단합니다. '|' 기호만 사용하면 됩니다.


phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d|\d\d\d-\d\d\d\d-\d\d\d\d')

mo = phoneNumRegex.search('My number is 415-555-5555, 000-1111-2222.')

print(mo.group())


결과값

415-555-5555


얼레? 이상합니다. 분명히 '|' 기호를 사용하면 된다고 했는데 왜 3자리 숫자만 나오는 걸까요? 그 이유는 search() 메소드가 패턴들 중에 처음으로 일치하는 결과값을 return해주기 때문입니다. 해결 방법은 다음과 같습니다.


phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d|\d\d\d-\d\d\d\d-\d\d\d\d')

resultStr = phoneNumRegex.search('My number is 415-555-5555, 000-1111-2222.')

resultStr1 = phoneNumRegex.findall('My number is 415-555-5555, 000-1111-2222.')


print(resultStr.group())

print(resultStr1)


결과값

415-555-5555

['415-555-5555', '000-1111-2222']


이처럼 정규표현식을 사용하게 되면 복잡한 코드를 깔끔하게 정리 할 수 있게 됩니다. 다만 정규표현식을 모르면.... 


정규표현식에는 어떤 기능들이 더 있는지 살펴 보도록 하겠습니다.


<물음표(?)의 기능 >

지금까지 저희는 파이프('|')를 사용하여 문자 매칭을 하였습니다. 지금 사용하고 있는 정규 표현식을 좀 더 간단하게 하는 방법이 있습니다.

바로 '?' 기호인데요. ? 글자는 그 앞에 있는 그룹이 패턴의 선택적인 부분이라는 것을 뜻합니다. 무슨 소린지 잘 모르겠으니 다시 또 코드로 가겠습니다.


phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d?-\d\d\d\d')

resultStr = phoneNumRegex.findall('My number is 415-555-5555, 000-1111-2222.')


for result in resultStr:

print(result)


결과값

415-555-5555

000-1111-2222


보시는 바와 같이 정상적으로 잘 나옵니다. ?의 뜻은 위의 정규표현식은 마지막에 숫자가 없거나 한번 나타나는 텍스트와 일치 되는것입니다. 그러므로 저희가 위에서 사용한 파이프('|')를 사용한 정규표현식과 동일한 표현식이고 좀 더 코드가 간결해지겠군요.


<별표(*)의 기능>

* 표시는 "0개 또는 그이상과 일치"를 뜻합니다. 위에 정규 표현식을 또 줄일 수 있을 것 같습니다. 다음과 같이 말이죠.


phoneNumRegex = re.compile(r'\d\d\d-\d*-\d\d\d\d')

resultStr = phoneNumRegex.findall('My number is 415-555-5555, 000-1111-2222.')


for result in resultStr:

print(result)


결과값

415-555-5555

000-1111-2222


사실 정규 표현식을 re.compile(r'\d*-\d*-\d*') 라고 해도 됩니다. 그렇게 되면 이제 "숫자-숫자-숫자"의 모든 형식이 매칭 되겠죠  예를 들면 111111-2222222-3333333 또한 매칭이 됩니다. 상황에 맞게 조합을 해서 사용하면 좀 더 편하게 사용하실수 있겠네요.


<더하기기호(+)의 기능>

+ 기호는 "하나 이상과 일치"를 뜻합니다. 위의 코드 예제에서 * 대신에 +를 하게 되면 어떻게 될까요? 


phoneNumRegex = re.compile(r'\d\d\d-\d+-\d\d\d\d')


하나 이상과 일치 되는 현상이기 때문에 두개의 번호가 전부 매칭이 됩니다.

다만 다음과 같이 하게 되면 어떻게 되는지는 고민해보시기 바랍니다.


phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d+-\d\d\d\d')


<중괄호({})의 기능>

특정한 횟수동안 반복되는 그룹이 있다면 정규식 안에 그 그룹뒤에 중괄호와 함께 횟수를 쓴다. 예를 들어 정규식 (Python){3}은 'PythonPythonPython' 문자열과는 일치 하지만 'PythonPython'과는 일치 하지 않습니다. (Python){3,5} 정규식은 'PythonPythonPython', 'PythonPythonPythonPython', 'PythonPythonPythonPythonPython'과 일치 합니다. 주의하실점은 파이썬의 정규표현식은 기본적으로 최대 일치입니다. 즉 모호한 상황에서는 가장 긴 문자열과 일치 시킵니다.  

최소 일치를 원하실 경우에는 '(Python){3,5}?'를 입력하시면 됩니다. '?'는 정규표현식에서 두가지 의미를 지닙니다. 최소값의 일치를 의미할 수도 있고 위에서 사용한 선택적 그룹을 뜻할 수 도 있습니다. 문맥에 맞게 해석 하시면 됩니다.


<정규표현식의 문법>

문자

기능

.

개행 문자를 제외한 1자를 나타냄

re.DOTALL이 설정되어 있으면개행을 포함한 문자1자를 나타냄

^

문자열의 시작을 나타냄

re.MULTILINE이 설정되어 있으면 매 라인마다 매치됨

$

문자열의 종료를 나타냄

re.MULTILINE이 설정되어 있으면 매 라인마다 매치됨

[]

문자의 집합을 나타냄예를 들어

[abcd]의 경우 'a', 'b', 'c', 'd'중 한 문자와 매치됨

또한 문자의 집합을 [a-d]로도 나타낼수있음

또한 [^5]와 같이 '^' []안에서 쓰이는 경우에는 5를 제외한 모든 문자를 나타냄

또한 [$]와 같이 '$' []안에서 쓰이는 경우는 순수하게 '$'문자를 나타냄

|

'A|B'와 같은 경우 'A' 혹은 'B'를 나타냄(OR연산)

()

괄호 안의 정규식을 구릅으로 만듬.

직접 '(', ')'(괄호)를 매칭시키기 위하여 '\(', '\)' '[(]', '[)]'로 나타냄

*

문자가 0회 이상 반복됨을 나타냄

+

문자가 1회 이상 반복됨을 나타냄

?

문자가 0회 혹은 1회 반복됨을 나타냄

{m}

문자가 m회 반복됨을 나타냄 

{m,n}

문자가 m회부터 n회까지 반복되는 모든 경우를 나타냄

{m,}

문자가 m회부터 무한 반복되는 모든 경우를 나타냄


<널리 쓰이는 짧은 버전의 문자 클래스>


짧은 문자

의미

\w

문자, 숫자 글자, 또는 밑줄 글자.

\W

문자, 숫자 글자, 또는 밑줄 글자가 아닌 모든 글자.

\d

0에서 9까지의 임의의 숫자 글자

\D

0에서 9까지의 숫자 글자가 아닌 모든 글자

\s

빈칸, 탭(Tab), 또는 줄바꿈 문자.

\S

빈칸, 탭(Tab), 또는 줄바꿈 문자가 아닌 모든 글자

\b

단어의 시작과 끝의 빈공백

\B

단어의 시작과 끝이 아닌 빈공백

\\

역슬래시(\) 문자 자체를 의미 (문자열로 사용하지 못하는 문자의 경우 \? 이런식으로 해서 사용이 가능함.)

\[숫자]

지정된 숫자만큼 일치하는 문자열을 의미

\A

문자열의 시작

\Z

문자열의 끝


'프로그래밍 > Python' 카테고리의 다른 글

정규표현식 예제2  (0) 2017.11.22
정규표현식 예제  (0) 2017.11.21

맥북으로 Python코딩이나 Shell Script작업을 하다보니 vim을 자주 사용하게 됩니다.


사용하다보니 vim에 indent-guide plugin이 없으니 많이 불편함을 느껴서 plugin을 찾아보니


Vundle라는것이 있습니다만 검색을 해보니


https://nolboo.kim/blog/2016/09/20/vim-plugin-manager-vundle/


여기에 댓글에 junegunn/vim-plug 라는것이 있다고 말씀하시더라구요


그래서 한번 사용해보기로 했습니다.( 한국분이 만드셔서 사용합니다. ) 


Vundle은 검색해보면 많이 나와 있으니 검색해서 찾아보시면 될듯 합니다.


https://github.com/junegunn/vim-plug   사이트는 여길 참고 하시면 됩니다.


저는 다른게 필요한게 아니고 


  탭과 스페이스 분류만 해주면 좀 더 편하게 vim을 사용할 수 있을 꺼 같네요.


먼저 터미널에서 junegunn/vim-plug을 설치 해줍니다.

다음 명령어를 입력하셔서 설치 해주세요.


curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

다음 vim 설정 파일을 열어주세요

sudo vim ~/.vimrc


vim 설정 파일에 대한 자세한 내용은 여길 참고 해주시면 됩니다.


설정 파일에서 다음과 같은 정보를 입력해주세요.

" Plugins will be downloaded under the specified directory. call plug#begin('~/.vim/plugged') " Declare the list of plugins. Plug 'tpope/vim-sensible' << vim에 필요한 설정을 자동으로 셋팅해주는 plugin입니다. Plug 'junegunn/seoul256.vim' << 이 부분은 필요하시면 입력하셔도 됩니다. ( 저는 머 필요없어서 삭제 했습니다. )

Plug 'thaerkh/vim-indentguides' << 이게 저희가 필요한 indentguides plugin 입니다. 설치해주세요.

" List ends here. Plugins become visible to Vim after this call. call plug#end()


:w 명령어를 입력하여 저장하시고

:q 명령어로 quit해주세요.


다음 명령어로 vim 을 열어줍니다.

sudo vim << sudo 명령어를 사용해주는 이유는 설치할때 permission error가 발생하지 않게 하기 위함입니다.

다음 명령어로 vim 설정 파일을 다시 읽기 하거나 터미널을 종료했다가 다시 열어주시기 바랍니다.

:source ~/.vimrc

다음 명령어를 사용하면 환경설정에서 나열한 plugin 파일들이 자동 설치 됩니다.

:PlugInstall

vimrc 설정 파일에 indent에 대한 옵션을 지정할 수 있습니다.


let g:indentguides_ignorelist = ['text']   << IndentGuild를 원치 않는 파일이 있으면, 'text'목록에 파일 경로를 입력하면 됩니다.
let g:indentguides_spacechar = '┆'   << space를 표시하는 문자를 다르게 지정 해줄 수 있습니다.
let g:indentguides_tabchar = '|'     << tab을 표시하는 문자를 다르게 지정 해줄 수 있습니다.


이제 vim을 열어 사용하시면 indentguide가 정상적으로 나오는 것을 확인 할수 있으며,

다음 명령어로 IndentGuide를 Toggle해줄 수 있습니다.

:IndentGuidesToggle


'프로그래밍 > mac' 카테고리의 다른 글

[펌] vim 설정  (0) 2017.11.11

[펌] https://medium.com/sunhyoups-story/vim-에디터-이쁘게-사용하기-5b6b8d546017


.vimrc 파일은 vim 에디터의 설정을 바꿀 수 있는 파일입니다. 별도의 플러그인을 설치하지 않아도 vim 에디터를 .vimrc 파일을 수정함으로써 멋지게 바꿀 수 있습니다.

아무 설정도 하지 않은 vim 에디터의 모습

위 사진을 봅시다. 아무 설정도 하지 않은 vim 에디터의 모습은 비주얼 스튜디오, 이클립스 등을 사용해오던 우리에게는 정말 어색한 모습입니다.
먼저 코딩을 돕기위해 최소한 어떤 기능이 필요할까요?

1. 문법 강조 (Syntax Highlighting)
2. 자동 인덴트
3. 줄번호

.vimrc 수정을 통해 위 작업을 모두 해낼 수 있습니다. 지금부터 .vimrc를 수정해서 vim 에디터를 변신시켜 봅시다.


첫 번째로 .vimrc파일을 만들어야 합니다. 자신의 홈 디렉토리 최상위에 .vimrc 파일을 작성해주세요.

$ vi ~/.vimrc

먼저 Syntax Highlighting을 해봅시다. 코딩을 할 때 없어서는 안될 중요한 작업입니다.

" Syntax Highlighting
if has(“syntax”)
syntax on
endif

위 구문에서 `“`는 .vimrc에서 주석을 의미합니다.
프로그래밍을 조금 아시는 분들은 아래 구문을 쉽게 이해하실 수 있을겁니다. 만약 syntax를 가진 파일이라면 syntax기능을 켜는 구문입니다.

성공적으로 작동하네요!

파일을 수정하고 나서 저장한 뒤 vim 에디터를 실행하니 위 사진과 같이 Syntax Highlighting이 정상 작동합니다.

코딩할 때 자동 인덴트가 안된다면 상당히 불편하죠?
하지만 .vimrc를 수정해서 자동 인덴트가 되도록 설정할 수 있습니다.
두 번째로 자동 인덴트 설정을 해봅시다.

set autoindent
set cindent

두 줄만 입력하면 자동으로 됩니다! 직접 해봐야 알 수 있는거라 이 감동을 사진으로 보여드리기는 힘드네요 ㅋㅋ

마지막으로 줄 번호를 표시해봅시다. 굳이 없어도 되는 기능이라 생각 할 수도 있지만 문법 에러를 수정해야 할 때 없으면 상당히 곤란합니다. 하지만 줄 번호를 표시하는 것은 어렵지 않습니다. 한 줄만 수정해도 줄 번호를 표시할 수 있습니다.

set nu
정말 쉽네요 그렇죠?

다음과 같은 의견이 있을 수 있습니다.

1. 그래도 너무 안 예뻐요..
2. 인덴트 너비가 너무 넓네요
3. 다시 열 때 현재 어디를 수정하고 있는지 알 수 없나요?
4. 현재 커서 위치가 어디인지 알 수는 없을까요?

사실 제가 봐도 기본으로 제공하는 Syntax Highlighting이 좋아보이지 않습니다.
저런 색상을 바꾸기 위해서 vim에서는 colorscheme를 제공합니다.

먼저 자기 취향에 딱 맞는 colorscheme를 찾아봅시다. 구글에 ‘vim colorscheme’라고 검색하면 정말 많이나와요.
저는 jellybeans라는 colorscheme이 마음에 들어서 이걸 사용하고 있습니다.

jellybeans: http://www.vim.org/scripts/script.php?script_id=2555

보통 vim이 설치된 폴더안에 colors폴더에 colorscheme파일을 넣으시면 됩니다.

이제 적용을 해봅시다 먼저 .vimrc파일을 여신 후에 다음과 같이 입력하시면 됩니다.

colorscheme 'colorscheme 이름'

저는 저 ‘colorscheme 이름’에 jellybeans를 입력했습니다. 그랬더니 다음과같이 깔끔하게 출력이되네요

제 눈에는는 아까보다 훨씬 괜찮아요!

이제 인덴트 너비를 좁혀봅시다. 보통은 스페이스 바 4번 누른 것과 같은 인덴트 너비를 사용하고 있습니다.

set ts=4 " Tab 너비
set shiftwidth=4 " 자동 인덴트할 때 너비

숫자의 기준은 스페이스 바 한 칸 입니다.

더 보기 좋아졌습니다.

이제 마지막에 수정한 곳에서 다시 시작할 수 있도록 편의성을 높여봅시다.

" 마지막으로 수정된 곳에 커서를 위치함
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif

위 구문을 사용하면 작업하던 곳에서 다시 시작합니다.

이제 현재 커서 위치를 알아야겠죠? vim에서는 현재 커서 위치를 좌표로 나타낼 수 있습니다.

set laststatus=2 " 상태바 표시를 항상한다
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\

위 두 줄을 .vimrc에 적으면 좌측 하단에 좌표값으로 표시해줍니다.
표시 방법을 수정하고 싶으시면 ‘set statusline’부분을 수정해주시면 됩니다.

좌표 값이 나와요

vim 에디터를 이쁘게 쓰기위한 작업은 여기서 끝났습니다.
다음은 제가 현재 사용하고 있는 .vimrc 내용입니다.

set hlsearch " 검색어 하이라이팅
set nu " 줄번호
set autoindent " 자동 들여쓰기
set scrolloff=2
set wildmode=longest,list
set ts=4 "tag select
set sts=4 "st select
set sw=1 " 스크롤바 너비
set autowrite " 다른 파일로 넘어갈 때 자동 저장
set autoread " 작업 중인 파일 외부에서 변경됬을 경우 자동으로 불러옴
set cindent " C언어 자동 들여쓰기
set bs=eol,start,indent
set history=256
set laststatus=2 " 상태바 표시 항상
"set paste " 붙여넣기 계단현상 없애기
set shiftwidth=4 " 자동 들여쓰기 너비 설정
set showmatch " 일치하는 괄호 하이라이팅
set smartcase " 검색시 대소문자 구별
set smarttab
set smartindent
set softtabstop=4
set tabstop=4
set ruler " 현재 커서 위치 표시
set incsearch
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\
" 마지막으로 수정된 곳에 커서를 위치함
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif
" 파일 인코딩을 한국어로
if $LANG[0]=='k' && $LANG[1]=='o'
set fileencoding=korea
endif
" 구문 강조 사용
if has("syntax")
syntax on
endif
" 컬러 스킴 사용
colorscheme jellybeans



'프로그래밍 > mac' 카테고리의 다른 글

vim Plugin 설정.  (0) 2017.11.11

3D 게임 프로그래밍을 하다보면 3D 관련 수학에 대한 갈증이 생겨나기 마련입니다.


3D 수학을 알고 있느냐 모르고 있느냐에 따라서 관련 작업의 소스파악도 훨씬 쉬워지기 때문에


관련 내용을 한번 정리 해보도록 하겠습니다.


3D 수학의 가장 기초라고 할 수 있는 벡터에 대해서 알아보고 가장 기본이 되는 연산 덧셈과 뺄셈에 대해서 알아보도록 합시다.


  • 벡터란 무엇인가?

 -> 크기와 방향을 동시에 나타내는 물리량을 말한다. 

     크기와 방향을 표시하는 좋은 방법이 화살표입니다. 그래서 보통 수학에서 벡터를 화살표로 표시 해줍니다.



위 그림에서 길이는 크기를 나타내고 화살표의 방향이 그래도 방향을 나타내서 보통 저런식으로 표현해줍니다.


 벡터의 표현은 이런식으로 해줍니다.


 이렇게 표현하면 벡터의 크기를 나타내주는 기호입니다. ( 절대값 표현 )



  일때 이 벡터를 "단위 벡터" 라고 합니다. 단위벡터는 보통 방향을 표현할때 많이 쓰고 3D 프로그래밍에서도 많이 사용합니다.


  • 두 벡터가 서로 같을 조건
위치에 상관 없이 크기와 방향이 동일하면 두 벡터는 같다라고 정의합니다.

  • 역벡터

 의 벡터를 편의상 벡터라고 하면 역벡터는 라고 표현하고 크기는 동일하지만 방향이 정반대인 벡터일 경우에 역벡터라고 정의합니다.


  • 벡터의 덧셈


두벡터 a와 b의 덧셈은 어떻게 표현하는지 알아보겠습니다. 보통 시작점이 같은 경우에는 쉽게 하는 방법이 있지만 일단은 그림을 보시면 벡터 b를 이동해줍니다. 왜냐하면 벡터는 크기와 방향이 동일하면 같은 벡터이기 때문에 밑에 그림처럼 이동해도 벡터의 합은 동일하게 됩니다.




따라서 해당 벡터 a와 벡터b의 덧셈은 최종적으로 다음과 같이 됩니다.



매번 이런식으로 덧셈을 하기 어렵기 때문에 시작점이 같은 경우에는 평형사변형 점섬을 그어줘서 이런식으로 덧셈을 처리하는게 조금 편합니다.




  • 벡터의 뺄셈

벡터의 뺄셈은 벡터a와 벡터b가 다음과 같이 있다고 가정했을 경우에



벡터a와 벡터b의 뺄셈은 

다음과 같이 벡터b의 역벡터를 더해주는것과 동일합니다. 


따라서 벡터의 덧셈을 진행하게 되면다음 그림과 같이 됩니다.



벡터는 크기와 방향이 동일하면 같은 벡터이기 때문에 다음 그림과 같이 벡터의 뺄셈이 나옵니다.



같은 방법으로 벡터b - 벡터a 를 진행하게 되면 다음과 같이 진행됩니다.




이처럼 벡터의 뺄셈은 

특정 위치에서 다른 위치를 향하는 벡터를 구할 때 벡터의 뺄셈을 사용한다면 

아주 쉽게 해당 벡터를 구할 수 있습니다. 
실제로도 3d 프로그래밍에서 자주 사용되고 있습니다.





'프로그래밍 > 3D Programming' 카테고리의 다른 글

[3D수학] 백터 내적의 활용  (0) 2017.12.04
[3D수학] 벡터의 내적  (1) 2017.11.24
쉐이더란 무엇인가.  (0) 2016.11.21
< Culling의 종류 >  (0) 2016.11.21

+ Recent posts