코딩을 해보자 08

in #kr8 years ago

레퍼런스


이른바 참고서인데 F1을 해당 명령어에 대고 누르면 잘 나온다
하지만 영어라는 무시무시한 문제가 있다
꾸역꾸역 해석하면 어떻게 되겠지만 것보다 더 간단한 방법이 있다
하나는 번역기이다 근데 오히려 원문보다 외계어로 번역하는 경우가 많아서
사실 잘 안쓴다. 그마나 일본어 레퍼런스 사이트를 찾았다면 일어는 문법이 비슷해서
영어랑은 상대가 안될정도로 번역이 잘된다

또 하나의 방법은 해당 언어가 한국에도 인기가 많으면 누군가는
사이트에 어느정도 번역해서 올려놓는다

아래에 소개하는 것이 바로 그것들이다
http://autohotkeykr.sourceforge.net/docs/commands/ImageSearch.htm
http://ahkplant.tistory.com/206

둘다 번역기를 돌려서 나온 결과를 올려놓은 사이트지만
특히 아래쪽의 경우는
https://sites.google.com/site/autohotkeyjp/reference/commands/ImageSearch
여기 일본 레퍼런스에서 번역기를 돌렸기에 상당히 알아보기 쉽다
여기들을 북마크해두고 모르는 명령어들을 찾아보면 한결 수월하게 할 수 있을 것이다

단, 번역기의 한계가 있기때문에 어색한 것도 좀 있고 최악의 경우 반대로 번역된것도
봤기에 어느정도 주의는 해야한다

내장 변수


들어가기 앞서 이전 강의를 한번 더 봐두면 좋다
https://steemit.com/kr/@twinbraid/07

변수들은 이름 붙여둬서 알아보기 쉽게 만든 상자에 필요한 값들을 저장시키는 것이라
했다. 이러한 것의 응용으로
https://steemit.com/kr/@twinbraid/4yxdkx-03
여기서처럼 알아보기 힘든 추상적인 것들.. 예를들면 이런 급식체.. ㅇㄱㄹㅇ
이거리얼 := ㅇㄱㄹㅇ
를 요렇게 변수상자에 넣어두면 뭔지 단박에 알 수 있다

이렇게 자기만의 상자를 즉석에서 생성해서 사용하는게 보통인데
미리 언어자체에 내장된 변수들이 존재한다
이유는 쉬우라고..

예를들어 현재 모니터의 화면크기를 구한다고 생각해보자
여러명령어들을 다시 공부해서 다시 뭘 설정하고 등등 어렵다
이러한 것을 할 필요없이 해당언어가 미리 전부 어려운 작업으로 다 구해놓고
딱 결과만 저장해둔 상자들이 잔뜩있다

이러한 것들을 내장변수라고 한다

##A_
내장변수들은 이것들이 공식임을 확실하게 알아보기 쉽게 이름들이
A_ 로 시작한다. 위에서 말한 화면크기의 경우
A_ScreenWidth 로 가로 A_ScreenHeight에 세로 크기를
이미 AutoHotkey 스스로 알아내서 집어넣어놨다.

http://www.mediafire.com/file/aes95px6qf4vonf/ahk_Utils.zip
여기의 Tools 폴더안의 A_Variables.ahk 를 실행시켜보면

이와 같이 현재 내장변수들 이름과 안에 무슨 값이 들어가 있는지 볼 수 있다
단지 A_ScriptDir의 값 같은건 의미가 현재 실행한 스크립트가 있는 경로를
말하는 것이기 때문에 A_Variables.ahk가 실행된 경로이다. 즉 내 스크립트를 다른데서
실행하면 저거랑 다른 값이 나오니 이런 것은 유연하게 생각하기 바란다
그리고 이 툴을 사용하기 쉽게 현재 에디터랑 연결시키는 것은 다음번에 다룰것이다

마지막으로 굳이 A_ 변수들이 뭐가 있나 외울필요는 없다
우리가 메모장을 쓴다면 외우거나 레퍼런스를 찾아야겠지만
우린 이미 전용에디터를 사용하고 있으니 A_ 만 치면

드롭다운창으로 주루룩 다 나온다. 그리고 이름보면 대충 어떤건지도 알 수 있다
그래서 변수에서 이름이 정말 중요한 것이다

ErrorLevel

내장변수들은 거의 A_ 로 시작하지만 예외가 있는데
바로 이 ErrorLevel 이다. 요거 하나만 외워놓자.
이건 굉장히 다양한 곳에 사용되는데 어떠한 명령어들이 실행되었을때
명령어가 성공했는지 실패했는지에 대한 정보가 필요할 때가 있다
그럴때 명령어의 실행완료후 자동으로 그 정보가 들어가 있는 곳이 바로 ErrorLevel 이다
보통 에러가 나면 1이고 에러가 없으면 0 인데
반드시 그런 것은 아니니 각 명령어마다 실행후 어떤 정보를 보내는지 확인해봐야한다

ImageSearch

변수, 함수, if, 그리고 loop 정도만 있으면 이제 왠만큼 뭔가를 만들 준비가 갖춰진 것이다
사실 위의 개념은 이미 스크래치를 하면서 다 배웠다
스크래치를 배워보자 02
스크래치를 배워보자 03


이건 if 문이고


이건 반복하는거니까 loop 문이다


그리고 이건 변수

블록으로하느냐 글로 적느냐의 차이일뿐이다

그럼 한번 직접 이용해서 뭔가 만들어보자
지금부터 만들것은 ImageSearch라는 명령어를 이용할 것인데
이건 이름 그대로 이미지를 찾는다. 검색어로? 그런게 아니라 사람의 입장에서
똑같은 그림 찾기랑 같은 방식으로 찾는다

먼저 어떤식으로 작동하게 할건지 미리 보자

보다시피 자신이 voting 하지 않은 곳을 찾아 커서를 자동으로 옮기게 만드는
프로그램이다. 여기서 만약 클릭기능도 넣게 되면 자동투표가 되는 것이다

이 명령어의 문법은 아래 사이트에 나와있다
http://ahkplant.tistory.com/206

ImageSearch, 찾은x좌표넣을곳, 찾은y좌표넣을곳, 시작x, 시작y, 끝x, 끝y, 이미지파일

일단 필요한 것은 검색할 이미지다. 스크린샷 찍어서 그림판이든 뭐든 잘라서

찾아야할 이미지를 만들자. 당연하지만 색깔이나 이런 틀려지면 안된다
이미지 이름은 vote.png로 하고 스크립트랑 같은 폴더에 넣는다
사용할 변수는 각각 x좌표, y좌표 라 이름짓고 시작 (x,y)는 그냥 화면 처음부터
그리고 마지막은 화면 크기만큼 모조리 검색하도록 하자
이때 화면 크기를 우리는 앞서 내장변수에서 가져올 수 있다

그러므로 이렇게 만들 수 있다

ImageSearch가 좌표를 찾는 것은 좋은데 찾았는지 안찾았는지에 대해 알수가 없다
이럴때 바로 ErrorLevel 변수가 필요한 것이다

if 만약 ErrorLevel 이 0 이라면 다음 대괄호{ } 안의 것들을 실행하라
라는 의미가

if ( ErrorLevel == 0)
{
}

이다 == 는 처음보는 것일텐데 변수를 집어넣을때 우린 A := 1 이런식으로 등식을
썼다. 이외에도 전통적 방식이라고 A = 1 이런 방식이 있다
이때 이것이 같다는 것인지 아니면 넣는다는 뜻인지를 헷갈리므로
'같다' 라는 말은 달리 쓰자 라고 해서 나온것이 바로 == 이다

else  if (조건)

의 경우는 앞에것이 불발이 났을때 다시 다른 조건으로 비교할때 쓰인다

자 다시 정리하면

q를 눌렀을때 ImageSearch가 시작좌표부터 화면끝까지 vote.png랑 똑같이 생긴
이미지가 있는가 찾아서 만약 찾았으면 ErrorLevel에 0을 넣고 못찾으면 1을 넣고
처음부터 이미지 이름을 잘못넣었거나 폴더가 다르거나한 오류일땐 2가 들어간다
그리고 각각의 조건을 만족하는 { } 안에것만 실행시킨다
가 된다

이전에도 말한적이 있는데 윈도우상의 좌표계는 보통 아래와 같다

(0,0)은 화면 좌측상단을 뜻한다.
그리고 좌표를 두개 설정하면 사각형을 기준으로 생각한다.
만약 (0,0)이 시작좌표고 (3,3)이 끝 좌표면


요렇게 점두개로 사각형을 형성하고 그 안의 파란영역을 조사하게 된다

한데 일단 찾았어도 { } 안에 아무것도 안해놨으니 아무반응도 없을 것이다
그러므로 찾았을 경우 못찾았을 경우에 맞게 코드를 짜보자

위의 코드는 에러가 났을 경우 거기에 맞게 메세지를 띄우고 찾았을 경우
자동으로 투표를 하는 코드이다. 자신의 스팀파워가 500을 넘어갈 경우 투표를 누르면
투표에 할당할 파워를 한번 더 묻기에 한번 클릭후 다시 클릭한 것이다
sleep은 잠깐 텀을 두는 것으로 밀리세컨드 단위이다
1500이면 1.5초를 뜻한다. 만약 저런 텀을 두지 않으면 컴터의 처리속도가 엄청 빠르므로
투표파워 확인을 묻기도 전에 초고속으로 두번 클릭해버린다.

수많은 프로그램들은 한번으로 끝내는 경우가 거의 없다
예를들어 버튼한번 클릭으로 못쓰게 되면 누가 쓰겠나

여기서도 한번만 찾는게 아니라 지속적으로 찾는다

그렇게 똑같은 코드를 여러번 실행하게 하는 반복명령문이 바로

Loop 횟수
{ 내용 } 

이다. 역시 if 문처럼 안에 어디서 어디까지의 명령을 반복할지를 확실히 하기 위해서
{ } 대괄호로 감싸놓았다. (딱 한줄뿐이면 감싸지 않아도 된다)

이제 반복까지 넣어서 완성된 코드를 보자

하나씩 설명하면

 next_x := 0, next_Y :=0

변수상자를 채울때 여러줄로해도 되고 저렇게 쉼표로 구분해서 한줄로 해도 된다
게다가 한줄씩 읽는 오토핫키의 특성상 저러면 성능이 35% 빨라진다

 loop, 100

백번 돌리라는 말이다. 참고로

loop 100

으로 쉼표를 생략해도 되는데 오토핫키의 명령어들은 첫번째 옵션에 한해서는
쉼표를 생략해도 되게 해놨다.

msgbox 안뇽
msgbox, 안뇽

저런식으로 말이다

imageSearch 에 못보던게 하나 붙었다. *60 vote.png 인데 여기서 *숫자는 널널함을
나타낸다. 없을경우 픽셀한개라도 틀리면 다른 것으로 간주하고 넘어가버린다
헌데 그런식으로 하면 얼룩이 조금만 있어도 다른게 되기에 분명히 있는데 통과해버리는
일이 생긴다. 그래서 저렇게 어느정도 틀려도 같은거라고 넘어가주게 하는게 저 숫자다
단 너무 크게 넣으면 이번엔 조금만 비슷해도 같다고 해버리니까
실행해보면 적절히 설정해주자

break는 loop 안에서 탈출하게 해주는 명령어이고
마지막으로

next_x := x좌표-200, next_y := y좌표+50

을 해석하면 처음에 한개를 찾았는데 또 다시 처음부터 화면전체를 검색하면
다시 찾은걸 또 찾게 된다. 다음껄 찾으러 갈수가 없는 것이다
그러므로 하나를 찾았으면 찾은 곳의 좌표에서부터 검색을 시도해야한다
이때 앞서 x좌표를 10증가 시킨 것은 투표버튼을 누르기 위해 약간 커서를 투표이미지
중간쪽으로 움직여야했기 때문이다. 그 곳에서부터 검색할경우

(0,0) 이아니라 (1.0)에서 검색하면 사각형 영역이 전진하므로 투표버튼이 있는 곳이
제외되어 버린다. 그러므로 일단 x 좌표는 어느정도 다시 뒤로 물릴 필요가 있다
그리고 Y좌표는 아래로 전진시켜서 방금 검색된 버튼은 사각형 영역 밖이 되게 한다
그럼으로써 이제 다음 것이 검색이 되게 되는 것이다

마치며

허미 이렇게 길어질 줄이야..OTL..
여튼 사실상 스스로 할 수 있는 영역에 도달했다고도 볼 수 있다
이제는 자신이 만들고 싶은 기능..
예를들어 파워포인트를 쓰는데 단축키로 선택한 폰트들의 크기를 원하는데
변경한다던지 하는 것들을 오토핫키로 할 수 있을 기본을 다진 것이다
물론 기본을 다진것이지 지금 배운걸론 못한다. 그 기본을 바탕으로 해서
검색해서 명령어와 변수, 제어문들을 잘 배치해야한다
하지만 그말은 검색해서 명령문만 찾으면 이제 만들 수 있다는 말이다

아주 간단한 거라도 좋으니 이제 한번 응용을 해보길 바란다

Coin Marketplace

STEEM 0.17
TRX 0.13
JST 0.027
BTC 61152.47
ETH 2665.18
USDT 1.00
SBD 2.55