Irfanview v4.32 업데이트

2011/12/22 00:46 | Posted by 배제군
Irfanview 가 v4.32로 업데이트 되었다.


한글 번역을 하다보니 세세한 메뉴부터 추가되는 기능까지 계속 쳐다 보게 된다는 놀라운 사실.. ㅇ_ㅇ;;

아무튼 이번에 업데이트 된 핵심(?)적인 기능중 하나는 워터마크를 추가하는 페이지가 생겼다는 건데 기존에는 텍스트만 추가 할 수 있었다. (주로 뷰어로만 활용해서 편집기능은 전혀 몰랐다능..)

두번째는 얼굴 검출(Face Detection) 기능이다.
이 기능은 v4.32 플러그인 설치시 동작하며 Irfanview의 폴더보기 기능인 "미리보기 상자" 에서 사용가능하다.
("미리보기 상자"라.. 그냥 발음 그대로 번역하는게 더 나았으려나.. 썸네일 박스.. *_*;;)

이건 좀 좋아 보이므로(?!) 잠시 설명 들어간다.

"미리보기 상자"를 누르면 탐색기처럼 좌측 폴더와 우측 사진파일이 나오는데 폴더 또는 이미지 파일을 여러개 선택했을 경우 "파일"-"선택된 파일 얼굴검출 시작" or "현재 폴더 얼굴검출 시작" 을 누르면 얼굴이 들어 있는 사진만 검색해서 목록을 만들어 주는 기능이다.

얼굴검출기능

미리보기목록에서 얼굴검출 기능을 사용하면 새창이 떠서 얼굴이 들어있는 사진만 검색해준다.


전체 목록은 72개 인데 27개의 얼굴이 들어간 사진만 골라주었다.
그리고 얻어진 목록의 사진을 더블 클릭하면 우측란에 검출된 부위를 나타내준다.


검출되고 난 다음 기능은 사진을 분류해주는 기능으로 우측 목록중 하나를 눌러보면 아래쪽에 이름을 넣을 수 있는 란이 나온다.
처음엔 Unkown 이고 이름을 입력해 놓으면 다음에 비슷한 얼굴 검출시 이름을 자동으로 입력해준다.
이름은 그렇게 정하고 검출된 얼굴과 이름이 맞으면 Yes, 아니면 no 를 선택, 이때 Yes 일경우 처음 한번 폴더를 지정하며 다음번에 그 이름이 Yes 되면 사진이 그 폴더로 저장되는 방식이다.

이름으로 지정된 폴더 목록

이름으로 지정된 폴더 목록

 
no 아래의 [...] 을 눌렀을때 팝업창이다.
위 화면을 보면 대략 이해가 될꺼다.

이 두가지가 핵심인듯 느껴지고 다른 소소한 기능까지 합하면 그래도 많은 변화 인듯 하다.

Irfanview v4.32 번역하고 올린 후 간만에 포스팅~ 끄~읕~ 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
예전 Flex 2~3버전에서 데이터를 다운받기 위해서는 ByteArray 형식을 특정 웹페이지에 데이터를 업로드 시키고 해당 웹페이지에서 파일다운로드 시키는 방식을 이용했다.
파일데이터를 웹프로그램에서 HTTP 헤더를 바이너리로 지정해야만 했기때문.
하지만 4버전부터는 Flex의 ByteArray를 웹페이지를 거치지 않고 직접 다운로드 가능하다.
이는 ByteArray를 FileReference의 save 함수의 인자로 직접넣는게 가능해졌기 때문이다.

이를 응용하면 Flex에서 작성된 데이터를 ByteArray 형식으로 변환해 다운로드 할 수 있다.
아래는 화면을 캡춰해서 PC로 바로 저장하는 화면이다. 

캡춰후 다운로드

화면캡춰&다운로드 버튼을 누르면 파일을 저장하는 화면이 나타난다.

 
위 화면처럼 화면캡춰, PDF저장, 이미지 편집, 사운드 파일등 ByteArray로 데이터처리하는 모든 것들을 즉시 파일로 저장가능하다.

public function saveAsImage(obj:UIComponent, name:String = ''):void {
FileReference fileReference = new FileReference();
var pngSource:BitmapData = new BitmapData (obj.width, obj.height);
pngSource.draw(obj);
var pngEncoder:PNGEncoder = new PNGEncoder();
var pngData:ByteArray = PNGEncoder.encode(pngSource); 
if(name=='') {
name = 'capture.png';
} else {
name += '.png';
}
fileReference.save(pngData, name); // 핵심
}

위는 내가 쓰는 화면캡춰 후 다운로드 하는 함수로 UIComponent와 파일 명을 인자로 주면 다운로드 하게 하는 함수다.
화면캡춰 후 as3corelib.swc 의 PNG라이브러리를 이용하는 것만 빼면 별달리 어려운 점이 없는 예제다.


 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

irfanview v4.30 한글팩 작업후기

2011/08/18 00:36 | Posted by 배제군
자주쓰는 무료 이미지뷰어 프로그램인 Irfanview 의 한글팩을 만들어 올렸다.

http://www.irfanview.com - languages 부분의 Korean

왜?
오래전부터 쓰던 프로그램인데 최근(6월)에 업데이트된 v4.30 버전을 다운받아 설치했지만 한글팩이 v4.28 버전밖에 없어 안타까운 마음에 '내가 만들어 볼까?'해서 작업을 했다.

준비는?
먼저 기존의 v4.28버전에 등록되어 있는 한글팩 제작자인 "다음에는 도자기가 되고픈 진흙"님께 기존소스를 받을 수 있는지 문의를 드렸다.

안되면 프로그램에 있는 내용을 참고해서 번역할려고 했는데  다행이도 소스를 주셔서 쉽게 작업을 진행 할 수 있었다. (진흙님 감사합니다. -.- _._ ) 

어떻게?
irfanview 의 한글팩은 프로그램내에 메뉴, 다이얼로그, 메세지를  VisualC++6으로 컴파일한 DLL 형태로 제공, 설정에서 사용할 DLL을 선택하는 방식이다.

편집하려고 보니 VC6의 리소스편집기로 수정하기엔 마우스 클릭 질이 너무 많아서 .rc 파일을 직접수정하기로 했다.

v4.30 영문파일의 .rc 와 v4.28 한글파일의 .rc 를 Acrodiff(Acroeditor 편집기에 포함) 를 이용해서 영문파일의 내용을 한글파일문장으로 대체하는 작업과 추가,삭제부분 적용, 추가된 영문번역까지 v4.30버전의 한글파일을 완성했다.

틀린점이?
이전 버전과 틀린점은 글꼴을 기존의 굴림 8포인트에서 굴림 9로 변경했고 그에 따른 표시부분을 리소스편집기에서 열어 영역크기를 조정한것 정도?
최대한 원작자의 내용을 보존해서 했기때문에 추가된 번역부분 말고는 날 탓하지 말라능.. *_*;;
(사실 오역이 두려웠음..ㅠㅠ) 

문제는?
프로그램적으론 문제는 없었는데 크게 많은 량은 아녔지만 오역/의역이 문제다.
ContactSheet 을 미리보기목록 이라고 의역했는데 그냥 영문그대로 두는게 나았을까? 쩝;;

느낀점
나야 예전 소스 받아 쉽게 작업해서 올렸지만 그 전 부터 고생하신 이전 제작자님이 많이 고생을 하셨겠다는 것.
Irfanview 를 지금까지 무료로 잘쓰고 있었기 때문에 기부는 못해도 도움이 되었다는 사실에 만족한다는 것! ㅎㅎ;;

추가완료 화면

플러그인을 설치하면 나타나는 한글팩 선택화면


크리에이티브 커먼즈 라이선스
Creative Commons License

EIS - Flex 개발 후기 및 팁

2011/07/08 15:26 | Posted by 배제군
이번 D사의 EIS - Flex 개발하고 느낀 후기 및 팁.

개발환경 : Flex4.1 SDK with Flash Builder4, SAP, WebService, for MDXQuery

 - 생각만큼 이벤트가 잘 먹히진 않는다 -
마우스 클릭 이벤트에서 동작하는 코드들이 제대로 돌아가지 않는다.
확인된 상황은 CPU에 부하가 많이 걸리는 상황이였고 callLater 를 걸어도 마찬가지. -0-
처리한 방식은 Timer 로 300밀리초 정도의 이벤트를 발생시켜 이벤트 처리 함수에서 동작하게 만들었다.

 - 모듈의 메모리 해제는 역시나 멍청한 짓이다 - 
각 페이지는 모듈로 만들었지만 멍청한 FLEX 는 역시나 메모리를 해제 시켜주지 않는다. Factory 클래스로 모듈을 호출하기 때문에 한번 생성한 객체는 계속 가지고 있고 재 호출시 이미 만들어진 객체를 리턴하고 addChild 시키는 방식을 사용했다. 페이지가 50페이지 정도라 그런지 2시간의 검증시간동안에도 큰 문제 없이 모든 페이지를 열어도 잘 소화해주었다.

 - 각 페이지 모듈은 Optimizer 하지 않음 -
프로젝트 관리에서 모듈을 메인 MXML에 옵티마이져를 하지 않았다. 빌드시간 너무 길어~!
뭐 상황에 따라 틀리기 때문. 참고
( http://sites.google.com/site/koreanflexdoc/4-0/usingflashbuilder/ws6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7fdd/ws6f97d7caa66ef6eb1e63e3d11b6c4cffa4-7ff1 )

 - Webservice 에 http 인증이 있을때 잘 되지 않는다. -
WSDL 접근시 Base64로 인증코드를 헤더에 넣었지만 Fillder 로 확인해도 헤더에 바로 집어 넣어주지 않았다.(버그인듯) 해결한 방법은 WSDL을 파일로 저장하고 WSDL을 읽어 서비스호출을 했다. 이때는 HTTP 인증이 아주 잘 되었다. ㅡㅡ

 - Webservice 호출시 플렉스 자체 파서는 오류를 내 뿜는다. -
* Error #1085: 요소 유형 "Tuple"은(는) 일치하는 끝 태그 "</Tuple>"(으)로 끝나야 합니다. *
플래시빌더4(3도 안됨)에서 제공하는 Webservice 호출시 나타나는 오류다. 이 오류 말고도 Caption 도 있고 여타 XML 파싱오류가 나타난다. ㅡㅡ
XML API 자체 문제기 때문에 코드를 직접 수정할 수 없어 그냥 Object 형식으로 리턴받아 SOAP로 받은 XML을 통합적으로 사용할 수 있는 ArrayCollection 으로 변환하는 함수를 만들었다.

 - Object 객체의 프로퍼티는 입력순서를 가지지 않는다. -
아래와 같은 코드를 입력하면 콘솔에 어떤 결과가 나타날까?

var obj:Object = {'e':'1', 'd':'2', 'c':'3', 'b':'4', 'a':'5' }

for (var key:String in obj) {

trace('key='+key);

}

key=a

key=b

key=c

key=d

key=e

즉, xml 로 받은 컬럼 순서를 Object 로 넣으면 다시 가져올때의 순서를 보장받을 수 없다는 것이다. 그래서 Object 를 넣을때 Array 로 컬럼에 대한 순서정보를 입력시키는 방법으로 해결했다.

 - SAP 의 SOAP 결과의 XML은 완전 패턴이 없었다. -
딱부러지는 XML 이 없이 노드(Node)속에 노드로 있는 놈과 노드속에 속성(Attribute)로 있는 놈도 있고 컬럼명의 목록이 다중행으로 나오는 놈도 있다. ㅡㅡ;; 컬럼명이 없는 놈도 있고 이중인 놈도 있고.. OTL... 해결한 방법은 컬럼명이 없는 놈은 header0~숫자 형식으로 무조건 지정받게 했다. 그리고 컬럼명이 1행이상인 것들은 언더바(_)로 구분지어 컬럼명을 바꾸었고  '합계_매출' '합계_금액' 이렇게 입력된 컬럼명은
 합계
 매출 금액 
처럼 그룹헤더 컬럼을 자동생성되게 만들었다.
그리고 컬럼명이 없어 header0과 같이 만든 컬럼의 제목열은 속성을 Object 로 받아 제목, 길이 등 컬럼속성을 추가 할 수 있게 해서 데이터와 제목열을 구분했다.
결과적으로 특이한 DataGrid가 아닌 이상은 데이터만 잘주어지면 컬럼태그를 직접쳐서 넣지 않았기 때문에 자동으로 잘 보여졌다.

 - 동기, 비동기 두가지 방식으로 구현 - 
Webservice 태그에 concurrency 를  single 로 하고 동기방식으로 처리해서 여러 질의를 순차적으로 받게 한 것과 multiple 로 지정하고 비동기방식으로 처리하는 2가지 방식으로 만들었다. 동기방식은 최초 데이터(처음 전송한 질의)가 매우 빠르게 보이기 때문에 시각상으로는 매우 빠르게 느껴지나 전체 시간으로 보면 느리고 비동기방식은 한꺼번에 전송하나 데이터 처리시점에 많은 CPU 부하가 걸려 버벅일 수 있다는 점이 있다. 최종적으로 선택한건 역시 비동기 동시질의! (한.. 1년 후에 보면.. 쩝)

 -  개념적으로 C언어에서 말하는 포인터를 알아야 데이터 가공이 용이하다. -
이미 난 XML을 공통적인 ArrayCollection 으로 받아와서 DataGrid의 DataProvider 에 넣어 사용하게 했다. 그런데 보여지는 형식을 다르게 보여달라고 하면? 프로젝트에 따라 다르겠지만 EIS에서는 보여주는 데이터가 최종이기 때문에 나의 경우 오리지널데이터를 가공했다.
예를들면 MDXQuery 에서 20110606으로 넘어 올때 2011.06.06으로 보이게 해달라고 하면 여타 아이템렌더러를 사용할 수 있지만 EIS에서는 2011.06.06이 최종이기때문에 데이터 자체를 2011.06.06으로 변경했다. 이렇게 변경할때 포인터 개념을 알면 쉽게 변경할 수 있다.

var ac:ArrayCollection = new ArrayCollection([

{'e':'1', 'd':'2', 'c':'20110606', 'b':'4', 'a':'5' },

{'e':'11', 'd':'22', 'c':'20110707', 'b':'44', 'a':'55' }

]);

for each(var obj:Object in ac) {
// obj 는 ac객체 내부 포인터이기 때문에 ac의 내부와 동일한 주소를 같는다.

obj['c'] = obj['c'].substr(0, 4)+'.'+obj['c'].substr(4, 2)+'.'+obj['c'].substr(6, 2);

}


trace('0번 c날짜='+ac[0]['c']);

trace('1번 c날짜='+ac[1]['c']);

결과
0번 c날짜=2011.06.06

1번 c날짜=2011.07.07

즉, 모든 데이터를 새로 작성할 필요 없이 루프를 돌며 데이터를 가공할 수 있다.
단, 반대로 ac객체와 별도로 Object값을 꺼낸후 사용할려면 ObjectUtil.copy 를 참고하면 포인터가 아닌 복사한 별도의 객체를 얻을 수 있다.

 - Object 에서 프로퍼티를 빼고 싶을때는 delete를 사용해라. -

var obj:Object = {'e':'1', 'd':'2', 'c':'3', 'b':'4', 'a':'5' }

delete obj['c']; ( or obj.c )
의 결과는
obj = {'e':'1', 'd':'2', 'b':'4', 'a':'5' }
가 된다.

이건 모르면 좀 골치가 아프다. ㄷㄷ;;

 - 엑셀형식, 화면캡춰, PDF 다운로드는 fileReference로 바로 다운 가능하다. -
 fileReference.save(데이터, 파일명) 으로 별도의 웹페이지에 접근할 필요없이 다운로드 가능하다. flex3 만 알던 나는 몰랐다능.. ㅡㅡ

  - 엑셀 다운로드는 DataGrid의 IViewCursor 를 사용하는 방식을 이용했다. -
IViewCursor는 DataGrid에 나오는 labelFunction 이나 DataProviderRender 와 같은 아이템렌더러까지 적용된 값을 가져오기 때문이다. 보통 공개된 HTML에서 위에 header0~숫자 형식와 '합계_금액' 형식의 colspan, rowspan의 구분도 처리 할 수 있었기 때문에 HTML 도 똑같은 머지가 되어 다운로드하게 만들었다.

 - 템플릿 컴포넌트와 싱글톤 클래스의 이용 -
판넬과 같은 창영역은 템플릿 컴포넌트로 만들고 공통으로 사용하는 서비스와 MDXQuery질의 같은 함수와 요소들은 싱글톤 클래스로 만들어 사용율을 최대화 했다.

 - 아이템런더러의 경우 공통요소가 아니면 태그내에 MXML로 만드는게 이롭다. -
공통적으로 사용하는 부분은 파일로 빼서 호출하게 하면 이해가 쉬운데 딱 하나의 DataGrid에 딱 하나의 컬럼에 쓰는 아이템 렌더러의 경우는 파일로 빼면 복잡하고 이해가 어려워 진다. 그냥 MXML 에 틀어 박았다. ㅡㅡ
 
= 총 평 =
개발하면서 느낀 건 왜 이리 생각만큼 잘 안 돌아가지? 하는 느낌이 제법 많이 들었다.
마우스 클릭, 웹서비스 인증이나 DataGrid에 1픽셀정도 아주 약간씩 어긋 나는 것, 머지시키고 스크롤 되면 어긋나는 것, 아이템렌더러에 화면 갱신 주기가 느려터지는 것... 넘 많다... ㅡㅡ;;
SAP는 첨이였지만 운영환경(Webservice, SAP GUI, MDXQuery등)적인 문제 보다는 Flex 버그수준의 저런 자잘한 문제에 부딪쳐 시간잡아 먹는게 대부분이였다. ㅡㅡ
이래서 계속 Flex 쓰겠나 싶기도 하지만 최종적으로는 사용자에게 만족할 만한 결과를 주는것 같다. 

  

 
크리에이티브 커먼즈 라이선스
Creative Commons License

○ 3DP Chip 으로 각종 드라이버 설치
 - http://www.vga.pe.kr/3dp/chip_down_kor.php

○ 빠른 실행 추가 - 작업표시줄 - 도구모음 - 새 도구 모음
 - %userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch

-제어판-

○ 키보드 속성 - 재입력 시간 - 가장 짧게

○ 작업표시줄 - 작은 아이콘 사용, 작업표시줄이 꽉 차면 단추 하나로 표시, 작업 표시줄에 항

상 모든 아이콘 및 알람표시, 시작 메뉴 사용자 지정- 실행 표시

○ 시스템
 - 원격 탭 - 원격 지원:이 컴퓨터에 대한 원격 지원 연결 허용 해제
 - 원격 데스크톱 : 모든 버젼의 원격 데스크톱을 실행 중인 컴퓨터에서 연결 허용
 - 작업 그룹 및 이름 변경

○ 폴더 - 보기 탭 - 메뉴 항상표시 선택, 보호된 운영체제 파일 숨기기 해제, 숨김 파일, 폴더 및 드라이브 표시, 알려진 파일 형식의 파일 확장명 숨기기 해제

○ 자동 실행 - 모든 미디어 및 장치에 자동 실행 사용 해제

○ 관리 센터 - 사용자 계정 컨트롤 설정변경 - 알리지 않음

-브라우저-

○ 인터넷 익스플로러
 - 항상 Private 으로 실행 : IE실행 아이콘 속성- 대상 제일 마지막줄에 -private 추가
 - 기본 검색 공급자 및 시작페이지 구글로 변경
    (http://www.iegallery.com/kr/addons/detail.aspx?id=4793)

○ 파이어폭스 : http://www.mozilla.or.kr/ko/
 - 항상 사생활 보호 모드로 실행 : Alt(상단 메뉴 나타남) - 도구 - 설정 - 개인 정보 - 방문기록 - Firefox 작업 사항 : 방문 기록 저장 안 함
  (플러그인)
  파이어버그(웹개발용) : https://addons.mozilla.org/ko/firefox/addon/firebug/
  웹디벨로퍼(웹개발용) : https://addons.mozilla.org/ko/firefox/extensions/web-development/
  파이어제스쳐(마우스제스쳐) : https://addons.mozilla.org/ko/firefox/addon/firegestures/
  다운로드뎀잇(멀티 스레드 다운로드 관리) : https://addons.mozilla.org/ko/firefox/addon/downthemall/

○ 크롬플러스(크롬에 제스쳐및 기본확장기능 제공) : http://www.chromeplus.org/
  - 항상 시크릿으로 실행 : ChromePlus 실행 아이콘 속성- 대상 제일 마지막줄에 --incognito 추가

○ FreeDownLoadManager(멀티 스레드 다운로드 관리 및 토렌트) : http://www.freedownloadmanager.org/download.htm

○ IE, 파이어폭스, 구글크롬, FreeDownloadManager 등 다운로드 기본 폴더 한곳에 지정

-백신-

○ 어베스트(백신:개인무료) : http://www.avast.com/download-thank-you.php?src=http://files.avast.com/iavs5x/setup_av_free.exe&product=FA&page=free-antivirus-download&locale=en-ww&avast=0

○ Windows Defender 종료 (기본 안티스파이웨어 종료:어베스트에 기능포함) : 제어판 - Windows Defender - 도구 - 옵션 - 관리자 - 이 프로그램 사용 해제

-기타-

○ Tortoise SVN(윈도우용 SVN툴) : http://tortoisesvn.net/downloads.html
-  .SVN 폴더 삭제 레지스트리 

○ Irfanview(이미지뷰어) : http://www.irfanview.com/main_download_engl.htm
○ 7-Zip(압축프로그램) : http://www.7-zip.org/
○ 에디트플러스(기본에디터:유료) : http://www.editplus.co.kr/kr/download.html
○ Fiddler2 : http://www.fiddler2.com/Fiddler2/version.asp
○ 파인프린터, 오피스등등..
○ 오피스 2003, 2007 호환팩 : http://www.microsoft.com/downloads/ko-kr/details.aspx?displaylang=ko&FamilyID=941B3470-3AE9-4AEE-8F43-C6BB74CD1466
크리에이티브 커먼즈 라이선스
Creative Commons License

죽이고 싶은 바로 삭제..

2010/12/02 00:45 | Posted by 배제군
오랜 기간동안 익숙해진 습관중 하나는 삭제시 Shift 키를 눌러 바로 삭제 하는 것과 삭제 후 휴지통을 무조건 비우는 건데..

그 덕분에 방금 엄청 중요한 파일을 날려 먹었다는 사실과 어떻게 작업한건지 기억도 잘 나질 않는 것.... ㅜㅡ

이건 정말 고쳐야겠다.. 요즘같은 디스크 용량이 넘쳐나는 시대에.. Shift+Del and 휴지통 비우기 신공이란.. ㅜㅡ

아후... 스타2 GSL 이나 봐야겠음.. ㅜㅡ
크리에이티브 커먼즈 라이선스
Creative Commons License
플렉스3 에서 개발된 Air 프로그램을 수정할려고 간만에 열었더니 실행이 안된다...


문제 과정.
1. 플렉스 빌더3에서 실행해도 아무런 반응이 없음
2. 플렉스 빌더3에 flex sdk 4를 설치 후 각종 코드 호환성 오류 포기
3. 플래시 빌더4를 설치 각종 코드 호환성 수정 ㅡ_ㅡ;;;
4. 그래도 위와 같이 오류가 남..
5.. 몇시간째 원인 분석..
6. 플래시 빌더4에서 Air 프로젝트 생성후 기존 소스를 첨가하니 돌아는 가지만 호환성 개판으로 레이아웃 다 깨짐 ㅡ_ㅡ;;
7. 플래시 빌더4에서 기존 소스를 열어 실행이 되는 이유를 문서비교 프로그램까지 동원해가서 하나하나 비교.
8. 결국 찾은거!!!!!!!!!!
9. 프로젝트-app.xml 에 네임스페이스 부분....... ㅜㅡㅜ


이게 기존 소스...


이렇게.. 네임스페이스의 버전을 바꾸니.. 4 sdk에서도 잘 돌아간다.......
아.... 6시간은 족히 걸린듯..ㅡㅜ
끝이면 좋겠지만 작업은 이제 시작이라는 거.. ㅜㅡㅜ

망할... 안 돌아가면 이유를 말해줘야 할꺼 아냐~!!!
크리에이티브 커먼즈 라이선스
Creative Commons License
옥션에서 구매결정시 사파리, 크롬, 파이어폭스 에서 절대 할 수 없다.

구매결정실패

크롬, 사파리, 파이어폭스에서 구매결정을 해도 실패한다. ㅡㅡ;;


도대체 알아서 고쳐줄 생각을 안해서 직접 확인하기로 했다.

확인 결과 구매결정 링크 부분의 &(앤퍼시엔드)가 웹표준을 위해 &amp; 로 변경한 걸 알 수 있었는데 코더하시는 분이 간과한 사실은 a 나 form 과 같은 링크에 사용되는 주소(uri)는 &amp; 단어가 브라우저자체에서 & 로 인식 할 수 있지만 자바스크립트의 주소는 문자로 인식된다는 점이다.

그런데 웃긴게 인터넷익스플로러는 &amp; 를 인식한다는거.. ㅡ_ㅡ;;;

망할 익스플로러는 느슨해도 너무 느슨하다.. ;;

결론은 구매결정의 팝업창 캡쳐 화면의 주소부분의 &amp; 를 & 로 변경하면 잘 된다.
(팝업 창 주소를 확인하는 방법은 각자 알아서 해결하시길~~~~ ㅎㅎㅎ)

 
크롬에서 구매결정!!

구매결정 주소의 & 를 &로 바꾸면 구매결정이 가능하다.


일단 여기까지는 넘어가지만 파이어폭스에서는 완료 버튼이 동작하지 않는다.
페이지 소스보기를 통해 확인한 결과..

100 번째 줄의 만족도 확인 자바스크립트에서 radio 버튼 폼의 접근을 대괄호"("로 해버린다....
객체 접근이 무슨 함수도 아니고.. 괄호로 처리되니 나는 오류다... 재밌는건 파이어폭스만 중단될뿐 크롬이나 사파리는 올바르게 접근된다. ㅋㅋㅋ

개발자적 시각으로 접근하면 이건 오류다.
괄호는 메소드실행에 대한 인자 전달이고 중괄호"["가 배열에 대한 접근이므로 radio 버튼에 대한 접근은 중괄호"[" 가 맞기 때문이다. ㅡㅡ;;
rfc 문서 들고 딴지 거실분들 있으시면 GG 치니깐 태클은 ㅈㅅㅈㅅ;;

 100번째 줄을 중괄호"[" 로 고치면 파이어폭스에서도 가능하겠다.

if(!(document.decision_form.satisfaction[0].checked || document.decision_form.satisfaction[1].checked || document.decision_form.satisfaction[2].checked)){
alert("만족도를 선택해주세요.");
document.decision_form.satisfaction[0].focus();
return false ;
}

아..... 귀찮어.. 술먹고 뭐하는 짓이래.. ㅜㅡ
크리에이티브 커먼즈 라이선스
Creative Commons License

Qt ShortCut 코드 삽질

2010/09/17 10:00 | Posted by 배제군
*QPushButton 에서 Shortcut 의 경우 Text 설정 후 입력되어야함

- 예1 -
QPushButton *btn = new QPushButton(this);
btn->setShortCut(Qt::Key_F1);
btn->setText("버튼");
.... 기타 connect....

↑ F1 키 작동 불가 코드

- 예2 -
QPushButton *btn = new QPushButton(this);
btn->setText("버튼");
btn->setShortCut(Qt::Key_F1);
.... 기타 connect....

↑ F1 키 작동 가능 코드

setShortCut 을 설정하더라도 setText  입력시 단축키값을 설정하기 때문
setText("&Push"); 처럼 & 다음 영문자를 Alt 키 조합으로 입력시킴 = Alt+D

어쩐지 안되더라.. *_*;;

크리에이티브 커먼즈 라이선스
Creative Commons License

Qt에서 hitButton를 이용한 클릭영역 지정

2010/09/05 23:07 | Posted by 배제군
http://korone.net/bbs/board.php?bo_table=qt_qna&wr_id=17786

Qt 커뮤니티에서 버튼의 hit영역 지정글 질문에 대해 테스트했다.

Qt API 에 QAbstractButton 클래스 메소드 중 hitButton 를 확인하면 아래와 같다.

bool QAbstractButton::hitButton ( const QPoint & pos ) const   [virtual protected]

Returns true if pos is inside the clickable button rectangle; otherwise returns false.

By default, the clickable area is the entire widget. Subclasses may reimplement this function to provide support for clickable areas of different shapes and sizes.


pos 가 클릭 가능한 버튼 사각형에 포함되면 true 아니면 false 를 리턴한다.
기본적으로 클릭가능한 영역은 완전한 widget이다. 하위클래스에서 클릭가능한 영역을 도형이나 크기로 지원가능하게 제공하면 재구현이 가능하다.

위의 내용를 참조로 간단하게 구현해봤다.

이미지는 위 질문링크에 포함된 이미지를 사용했고 포토샵에서 클릭영역을 확인 지정했다.



GUI 프로젝트를 생성하고 QPushButton 과 클릭여부를 확인할 QLineEdit 위젯을 알맞게 배치한다.
QPushButton 에 아이콘을 넣을 수 도 있지만 배경으로 넣는게 정렬이나 위치지정에 유용하기때문에 나같은 경우 자주이용한다.

그리고 기본적인 배치 및 클릭여부를 확인하고 QPushButton 을 재구현한 QPolygonPushButton 을 만들자.

project -> add New -> c++ -> c++ class 선택
Class name : QPolygonPushButton
Base class : QPushButton
Type info : inherits QWidget

생성 후 hitButton 가상함수를 구현하자.

qpolygonpushbutton.h 에서

private:
    virtual bool hitButton ( const QPoint & pos ) const;

를 선언한다.
 
그리고 qpolygonpushbutton.cpp 에서 hitButton 을 구현한다.

bool QPolygonPushButton::hitButton( const QPoint & pos ) const {
    QPolygon *f = new QPolygon(4);
    f->setPoint(0, 22, 0);
    f->setPoint(1, 100, 0);
    f->setPoint(2, 110, 26);
    f->setPoint(3, 15, 26);
    bool ok = f->containsPoint(pos, Qt::OddEvenFill);
    return ok;
}

질문에 나온 사다리꼴 좌표를 저장하기 위해 QPolygon 을 이용했다.
각 좌표를 박스 그리듯 순서대로 지정하고 containsPoint 함수를 이용해 pos 와 비교한다.
비교 결과를 ok 로 리턴하게 만들면 함수는 완성이되고 기본 프로그램을 구성했던 QPushButton 을 지금 구현한 QPolygonPushButton 클래스로 바꾸어 다시 실행해본다.



완성된QPolygonPushButton 테스트 프로그램

사다리꼴 영역은 eventCnt 가 올라가지만 이외의 영역은 클릭판정을 받지 못한다.




음표 영역을 선택해서 올바르게 작동하는지 시험해본다.

테스트한 프로젝트 압축본

짧은작성후기.
Qt가 워낙 API가 잘 나와서 그런지 충돌영역검사도 엄청 쉽게 되어 있다.
옛날이면 충돌영역을 bit 이미지로 저장해서 검사하게 했을꺼 같은데.. ㄷㄷ.. ;;
응용하면 QPolygon 을 입력받게 하거나 이미지를 계산하게도 가능하겠다.

크리에이티브 커먼즈 라이선스
Creative Commons License
이전 1 2 다음