폼 디자이너 갖구 놀기
탐구생활/Delphi델파이의 폼디자이너를 흉내내보았던 작업.
무려 17년 전 골동품이라 생소한 코딩과 풋풋한 코멘트가 어색하네.
마치 오래 전 일기장을 꺼내 읽는듯한 아스라한 느낌이 재미있다.
델파이 5로 만들어졌으며 최신버전에서 빌드되는지 여부는 체크해보지 않았다.
김현수님이 델파이 최신버전(10.2 도쿄)에서 동작한다고 확인해주심. (캄솨~ 압도적 캄솨~~)
델파이의 폼디자이너를 흉내내보았던 작업.
무려 17년 전 골동품이라 생소한 코딩과 풋풋한 코멘트가 어색하네.
마치 오래 전 일기장을 꺼내 읽는듯한 아스라한 느낌이 재미있다.
델파이 5로 만들어졌으며 최신버전에서 빌드되는지 여부는 체크해보지 않았다.
김현수님이 델파이 최신버전(10.2 도쿄)에서 동작한다고 확인해주심. (캄솨~ 압도적 캄솨~~)
상황은 이렇다.
델파이로 만든 XMLRPC 클라이언트에서 "시간값"을 인자로 PHP로 만든 XMLRPC 서버의 함수를 실행하고
이 값을 MySQL의 타임스탬프 필드에 저장하자.
xml-rpc 의 시간표시는 iso 8601 에 따라 다음과 같이 표시된다.
xmlrpc.inc 에는 이 형식과 유닉스 타임스탬프 사이의 변환을 위해 iso8601_encode, iso8601_decode 함수가 정의되어있다.
이렇게 변환한 유닉스 타임스탬프값을 MySQL에 집어넣기 위해 MySQL 내장함수인 FROM_UNIXTIME() 을 사용해 봤는데
클라에서 전송한 시간보다 +9 시간 더 나오는 문제가 발생. iso8681_decode의 두번째 인자에 1을 주어 UTC로 풀어도 마찬가지.
RPC 테스트중인 윈도의 PHP는 현재시간이 UTC로 설정되어있다. 그런데 시스템시간은 한국. 그래서 생기는 문제인 듯.
실제로 다음과 같은 코드로 타임존을 설정하면 제대로 처리된다.
date_default_timezone_set("Asia/Seoul");
NAS, 또는 우분투의 PHP에서 echo date_default_timezone_get(); 을 찍어보면 Asia/Seoul 이 잘 출력되는 것을 보아 윈도용 WAMP의 PHP에서 시스템의 설정을 읽지 못하는 문제로 보인다. 그렇다고 코드에 저걸 무조건 박아넣기도 골룸.
date로 문자열 꾸미기도 시도해 봄.
하지만 iso8601_decode 내부에서 gmmkttime, 또는 mktime 을 실행시키면서 타임존 문제가 생김.
뭐가 어쨌건 시스템의 날짜 설정과 무관하게 델파이에서 전송한 시간값을 MySQL에 입력하기만 하면 되므로...
iso8601_decode 의 앞부분을 흉내내 이렇게 만들어 봄.
요는, php의 시간변환 함수를 사용하지 말자는 것.
비슷한 요령으로 역변환도 만들어 둠.
이제 델파이에서 의도한 시간값이 PHP를 거쳐 MySQL로 제대로 꽂힌다. .
여담으로, date('Z') 로 얻어낸 값에는 현재 설정된 타임존과 UTC 사이의 분단위 시간차이가 들어있다.
GetTimeZoneInformation() 으로 얻어낸 TimeZhoeBias 값과 동일. 그냥 까먹을까봐 적어둠.
맥북에어를 데려왔다. 가볍고 빠르다. 좋다.
윈도를 올려봤다. 응? 한영키가 없네? 어차피 키보드 타입 3를 쓰니까 패스!
터보델파이를 깔았다. 컨트롤+스페이스가 안먹는다. 우측 컨트롤키가 없으니 좌컨트롤+우컨트롤+스페이스 신공도 안통한다.
영문 입력기를 추가하고 알트+쉬프트를 며칠 써보니... 익숙치 않은 키입력 때문에 손가락이 꼬이는 느낌이다.
타입 3 키보드에서 컨트롤+스페이스는 한자변환키이다.
가만히 생각해보니 IME모드가 영문일 때 이 키는 별로 필요가 없다.
그렇다면? 입력 포커스를 가진 윈도가 한글입력 상태가 아닐 때 이 한자변환키를 무력화하고
좌컨트롤+우컨트롤+스페이스 키스트로크를 조립해주면 되겠군.
그래서 탄생한 물건이 이 놈.
한글 IME 에서 영문모드일 때 컨트롤+스페이스 입력을 좌컨트롤+우컨트롤+스페이스 로 변환해준다.
한 번 실행시키면 동작하고 다시 실행시키면 정지한다.
이제 좀 살만하네~~
------------
터보델파이로 만든 32비트 어플이지만, DLL을 침투시키지 않기 때문에 64비트 프로세스에서도 잘 돌아간다.
64비트 윈도7에 띄운 64비트 라자루스에서도 동작함.
DLL 만들기 귀찮아서 게으름을 피웠는데... 의도하지 않은 "사이드 이펙트"... 훗~!
귀차니즘은 역시 프로그래머의 가장 큰 미덕이다.
관리자모드로 실행시킨 어플에서도 동작하게 하려면, 이 유틸리티도 관리자모드로 띄울 것.
PHPer 님의 의견대로, 아무 파라미터나 지정되면 메시지박스를 띄우지 않도록 수정.
새로 받으세요~~
차일피일 미루다 이제야 github에 등록함.