매크로

조회 수 13313 추천 17 댓글 179


안녕하세요~ 바람처럼 입니다~^^


프렙 3.8 에 추가된 시간관련 기능을 이용한 강좌를 써보려고 예전부터 생각했었는데


그동안 귀차니즘으로 차일피일 미루다가 이제야 쓰게 되네요~


사실은 요즘들어 이쪽관련 질문을 하시는 분들이 많아지다 보니 쓰기로 마음먹게 된 이유도 있습니다~^^;;


이번 강좌는 그리 어렵지 않은 내용이니 편안한 마음으로 천천히 따라오시면 되겠습니다~







1. 프렙의 시간관련 환경변수 및 연산자


드디어 프렙에 시간계산과 관련된 변수 및 연산자들이 추가 되었습니다.


이 기능이 추가됨으로써 예전에 루프와 웨이트를 이용해 어렴풋이 계산하던 시간을


실시간으로 정확한 계산이 가능하게 되었습니다. 여러모로 많은 곳에 유용할듯 보입니다.


추가된 환경변수는 @start / @now 가 있고, 연산자는 .asdate / .astime 이 있습니다.



@start 는 프렙이 시작된 시각을 밀리초(ms) 단위로 리턴해 줍니다.


@now 는 현재 시각을 역시 밀리초(ms) 단위로 리턴해 줍니다.



이때의 시간 기준은 1970년 1월 1일 0시를 기점으로 그후 얼마나 시간이 흘렀는지 입니다.


이 두가지를 이용하면, 프렙이 시작한 이후 얼마의 시간이 흘렀는지


혹은, 특정 시각을 기준으로 얼마의 시간이 흘렀는지 정확히 계산할 수 있습니다


반대로 이야기 하자면, 특정 시간 이후에 이루어질 어떤 동작을 판단하는 기준이 될 수도 있습니다.


이와 더불어, 시간정보를 우리가 알아보기 쉽게 날짜와 시간으로 표현해 주는 연산자도 추가되었습니다.



.asdate 는 "yyyy/MM/dd hh:mm:ss" 형태로 변환해 줍니다. 즉, "2015/07/10 18:15:34" 처럼 되겠죠.


.astime 은 "hour:min:sec.ms" 형태로 변환해 줍니다. 즉, "321343:15:34.547" 과 같은 형태입니다.



이를 이용하여, 특정날짜 특정시간에만 수행하는 기능을 작성하는 것이 가능하게 되었습니다.


이렇게 추가된 변수와 연산자를 가지고 우리가 무엇을 할수 있는지 살펴보도록 하겠습니다.






2. 일정간격으로 구동되는 타이머

우리가 보통 프렙에서 일정한 시간간격을 두고 실행해야 하는 시퀀스를 처리하고자 할 때

기존에는 웨이트와 루프를 이용했습니다. 예를 들자면 30초 간격으로 터치를 해야하는 작업이 있다고 할때는

https://i.imgur.com/lsbYVzb.png

이런 방식으로 처리를 했었죠. 그러나 이런 방법에는 세가지 단점이 존재합니다.

첫번째는, 프렙의 웨이트는 시스템 성능에 따라 오차가 발생합니다. 즉, 정확히 30초가 아닐수도 있습니다.

짧은 시간일 경우에는 크게 상관없으나, 시간이 길어지면 길어질수록 이 오차는 점점 커지게 됩니다.

두번째는, 이런 방식으로 처리하려면 웨이트와 루프가 반드시 같은 레코드/프로시져 내에 존재해야 합니다.

따라서 여러 레코드나 프로시져에 걸쳐서 처리를 하고자 할때는 플래그를 세팅한후 

다시 이 값을 체크하는 등의 여러가지로 번거로운 방법을 사용해야만 했습니다.

마지막 세번째는, 웨이트를 이용하면 대기하는 시간동안 아무것도 못하고 무작정 기다려야 합니다.



그러나 시간관련 환경변수 @now 를 사용하면 이 모든 문제들이 쉽게 해결됩니다.

위의 예제와 같은 동작을 하지만 다르게 구현한 예제를 보시죠...

https://i.imgur.com/hSuh8qJ.png

시퀀스 별로 동작을 살펴보도록 하겠습니다.

1번에서는 현재시간을 구해서 시작시간을 뜻하는 start 에 넣어줍니다. 단위는 밀리초가 되겠죠...

그 후, 3번에서 현재시간과 시작시간의 차이를 계산한 후

4번에서 그 차이가 30000ms 즉, 30초가 지났다면 

5번에서 우리가 원하는 작업인 터치를 수행하고

6번에서 다시 현재시간을 초기화 해주는 작업을 하고 있습니다.


이렇게 하면 첫번째 예제와 완전히 동일한 작업을 수행하지만, 몇가지 차이가 있습니다.

먼저, 거의 오차가 없는 정확한 30초를 구할수 있다는 것과 

초기화 부분, 시간차이를 계산하는 부분, 실제 처리하는 부분등이 

반드시 같은 레코드/프로시져내에 위치할 필요가 없다는 점입니다.

또한, 기다리는 과정에서 대기시간이 없기때문에 그사이 다른 작업들을 얼마든지 수행할 수 있습니다.

위의 예제에서는 이해를 위해 같은 레코드 내에서 구현했지만, 실사용에 응용되는 대부분의 경우는 

이 부분이 별도의 레코드 혹은 프로시져에서 판단하고 처리하는 경우가 많을 것입니다...


프로시져를 통해 실제 사용하는 경우에 가깝게 수정하면 다음과 같이 됩니다...

https://i.imgur.com/ckO8c9t.png

프로시져 '30초 체크' 는 다음과 같이 되겠죠...

https://i.imgur.com/8ZcIgRj.png


어떻습니까? 훨씬 깔끔하고 유용해 보이죠? 

이런 식으로 일정 시간간격에 따라 구동되는 시퀀스 처리를 쉽게 구현할 수 있습니다.






3. 특정시간에 구동되는 타이머

이번에는 일정 시간간격이 아닌 특정시간에 구동되는 시퀀스의 처리를 알아 보겠습니다.

예를 들자면, 매일 오전 10시에 실행해야 하는 시퀀스가 있다고 할 때는 어떻게 하면 될까요?

위에서 보여드린 @now 환경변수와 .asdate 연산자를 이용하면 이또한 쉽게 구현할 수 있습니다.

https://i.imgur.com/yMZeVvG.png

1번 시퀀스의 내용이 핵심입니다. 하나씩 살펴보면 먼저 @now 를 통해 현재시간을 구한 후

.asdate 연산자를 이용해 ms 단위의 숫자형을 날짜포맷으로 변경합니다.

이 과정을 거치면 @now.asdate 는 "2015/11/05 10:34:45" 와 같은 값을 가지게 됩니다.

이 중, 시간부분만을 따오기 위해 sub 연산자를 이용하여 11번째 위치의 2자리를 가져오면

결과적으로 hour 변수에는 "10" 값이 들어오게 됩니다.

나머지는 간단하죠~ 우리가 원하는 오전 10시인지 판단하여 적절히 처리해 주면 됩니다.


다만, 이 방식의 단점은 오로지 두자리의 시간만을 보고 판단하기 때문에

10:00 부터 10:59 까지 모두 해당될 수 있다는 점입니다.

때로는 특정시간에 구동되어야 하지만, 그 시간을 어느정도 넘어서면 구동하지 말아야 하는 경우도 있습니다.

그래서 우리는 시작시간과 마침시간을 정해서 그 시간 안에서만 구동되게 구현할 수도 있습니다.

위의 예제를 변형해서 시간뿐만 아니라 분까지 따로 체크하여 구현할 수도 있겠습니다만

시퀀스가 길어지고 범용성이 떨어지므로, 우리는 현재시간을 모두 분단위로 환산하여 처리해 보겠습니다.

예를들어, 10:00~10:10 사이에만 구동되어야 하는 시퀀스가 있다고 할 때

https://i.imgur.com/067VWd9.png

이렇게 현재시간을 분단위로 환산하여 cur 변수에 저장한 후, 조건문에서는

https://i.imgur.com/DFSyngT.png

이런식으로 판단하면, 10:00~10:10 간격을 쉽고 빠르게 판단할 수 있습니다.

이런 방법은 쉽게 시/분/초까지 확장하거나, 다양한 시간간격을 처리할 때 응용할 수 있습니다.

마찬가지 방법으로, 특정날짜의 처리또한 쉽게 구현할 수 있습니다.







4. 특정날짜의 요일판단

프렙의 .asdate 연산자는 날짜와 시간은 알려주지만 요일은 알려주지 않습니다.

그래서 가끔 우리가 특정요일에 구동되어야 하는 시퀀스를 구현할 때 필요한

특정날짜를 통해 요일을 판단하는 부분을 알아보도록 하겠습니다.

독일의 수학자 첼러 (Julius Zeller, 1822~1899)는 년, 월, 일을 대입하면 그날의 요일을 바로 알수 있는

다음과 같은 공식을 만들었습니다.


https://i.imgur.com/4icORGj.jpg


여기서, q는 일, m은 월, K는 연도의 마지막 두자리, J는 연도의 앞 두자리를 의미합니다.

이 공식을 이용하면 우리는 쉽게 특정날짜의 요일을 판단할 수 있습니다.

위의 공식을 프로그래밍 할수있도록 수식화 하면 다음과 같이 됩니다...

w = (year+year/4-year/100+year/400+(13*month+8)/5+day) mod 7

여기서 w값은 0=일, 1=월, 2=화, 3=수, 4=목, 5=금, 6=토가 됩니다.

프렙으로도 어렵지 않게 구현할 수 있습니다만, 길이가 제법 길어지므로 

이 부분은 강좌를 보시는 분들께 숙제로 남겨 드리겠습니다~^^;;

이때 1월 2월은 지난해 13월 14월로 계산해야 합니다.

즉 month < 3 이면 year = year -1, month = month + 12 를 해준후 계산합니다.

구현하실때 주의하실 점은, 위의 연산이 모두 정수연산 이란 점입니다.

즉, 2015년이라고 할때 2015/100 의 결과값은 20.15 가 아닌 20이 되어야 합니다.

프렙의 사칙연산은 모두 실수로 처리되므로, 각각의 연산마다 정수화 하는 추가과정이 필요합니다.




이상으로 프렙을 이용하여 특정간격 혹은 특정시간에 구동되는 시퀀스의 구현법을 알아 보았습니다.

크게 어렵진 않았죠? 그러나 이런 간단한 방법으로 시간과 관련된 많은 기능들을 구현할 수 있습니다.

앞으로 프렙을 이용할때 응용해 보신다면, 상당히 지능적이고 편리한 시퀀스를 작성하실수 있을거라 생각합니다.

저는 다음번에 더 좋은 강좌로 찾아 뵙겠습니다.

감사합니다~^_^




List of Articles
제목 글쓴이 최근변경 추천
프렙으로 페이스북 복사한글 붙히기 1 kakasi78 2018.11.27 3/0
프렙에서 타이머를 써보자~! 179 바람처럼 2023.01.16 17/0
프렙에서 다이나믹 변수를 써보자~! 67 바람처럼 2023.11.14 6/0
프렙 3.8 의 새로운 기능들 104 바람처럼 2023.05.26 12/0
프렙 3.7 의 새로운 기능... 응용편 #2 (영역 & 이미지) 155 바람처럼 2023.07.20 19/0
프렙 3.7 의 새로운 기능... 응용편 #1 (루프 & 스트링) 107 바람처럼 2021.07.19 11/0
밖에서 frep이 무슨 아이템을 먹고 있나 확인을 해보자... 117 쉐브 2022.11.08 8/0
[Frep] 세나-쫄작 스퀸즈 만들기 방법(엑셀자료) 115 두환애비 2023.01.22 19/0
프렙 3.7 의 새로운 기능... 조건문(If), 로그(Error, ... 95 바람처럼 2020.12.25 16/0
프렙 3.7 의 새로운 기능... 변수(Variables) 기초편 114 바람처럼 2021.01.04 18/0
[몬길] frep 매크로 아주 간단하게 따라하며 만들기 2편 94 오렌지케이크 2024.01.04 10/0
[몬길] frep 매크로 아주 간단하게 따라하며 만들기 1편 195 오렌지케이크 2021.05.25 24/0
세나] 프렙으로 대동단결 2탄 - 프렙 강좌(1) 19 옹스컴 2023.07.27 1/0
[Frep] 쫄교체 매크로 동영상 강좌 2 76 제이먼청 2023.07.21 6/0
[Frep] 쫄교체 매크로 동영상 강좌 1 101 제이먼청 2023.01.22 15/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(3) 76 제이먼청 2020.12.24 9/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(2) 41 제이먼청 2020.12.24 8/0
간단하게 만드는 7-9쫄 기반 세븐나이츠 3쫄 교체(1) 77 제이먼청 2023.07.27 10/0
세나 프랩 간단하게..강좌 117 김부관 2020.12.24 19/0
프렙의 단순작업 도우미... 프로시져 (Procedure) 123 바람처럼 2020.12.23 20/0
Board Pagination Prev 1 2 Next
/ 2

전체 최신 인기글

전체 주간 인기글