프로그래밍 319

잘동작하던 ActiveX가 기능 추가후, 먹통이 되어 버린 경험.

서론 기존에 잘 사용하던 ActiveX에 몇 가지 속성 및 기능을 추가할 일이 있어서 관련 작업을 하던 중에 좀 황당한 사건을 겪었습니다. 속성 및 기능 추가를 위하여 기존 프로젝트에 몇몇 새로운 유닛을 추가하고, 새로운 기능을 구현한 직후 테스트에서 잘 동작을 하였었습니다. 그러나 버그 수정을 위하여 몇번 빌드를 하고 테스트를 하던 과정중에 이상한 현상을 경험하게 되었습니다. 정말 특이하게도 그런대로 동작하던 ActiveX가 점차 꼬여 가더니, 결국에는 Type Library에서 속성을 수정하거나, 심지어 수정된 소스를 저장하려고만 하여도 델파이 IDE가 아무런 응답을 하지 않게 되버리는 문제가 발생하기 시작하였습니다. 더군다나 델파이를 재시작하고, 재부팅을 하여 겨우 ocx 빌드를 성공하여 테스트를 ..

TShockwaveFlash 크기 조정(Resize)

서론 TShockwaveFlash 컴포넌트를 이용하여 델파이 폼 내부에서 동적으로 플래쉬를 표시하고자 할 때, 동적으로 생성된 플래쉬 컴포넌트내에서 전체 플래쉬 영역에 그려지지 않고, 일부 영역에서만 그려지는 문제가 발견되었습니다. 마우스로 플래쉬 컨트롤 영역을 선택해 주면 플래쉬 영역 전체에 맞게 확대되어 올바로 표시가 되었습니다. 또한, 창의 크기를 조정하면 플래쉬 창의 크기도 변경되도록 하였으나, 플래쉬 컨트롤에서 표시되는 swf 에는 영향을 미치지 않는 문제가 있었습니다. 본 글에서는 이러한 플래쉬가 제대로 전체 플래쉬 창 영역에 그려지지 않는 문제점을 해결하는 방법에 대해서 알아보도록 하겠습니다. 해결 방법 아래 Resize TShockwaveFlash control in Delphi 자료를 참..

2010에서 Zeos 7.0 설치 및 MySQL 5.1.4와 테스트기

SourceForge에서 Zeos 7.0 Beta 버전을 받아서 설치하는데, Bpl 파일을 못찾는 오류가 계속 나서 왜그런가 봤더니, 프로젝트 옵션의 output directory가 각 패키지마다 달라서 발생한 문제였습니다. 모두 Build 디렉토리로 맞추거나, 아니면 모두 기본 디렉토리로 생성되도록 하면 됩니다. 오랫만에 Zeos로 MySQL DB 연동을 하는터라 좀 헤맸네요. 간단하게 ZConnection을 두고 테스트용 MySQL 정보를 입력하고, ZQuery로 간단한 SELECT 쿼리를 수행하는데 자꾸 한글이 깨지는 것이었습니다. 삽입 및 갱신도 한글이 깨지는 현상이 발생하였습니다. MySQL쪽 문자셋(charset)을 확인해 봤더니, 운영 시스템만 "UTF-8"이고 모든 DB 및 클라이언트 연결..

특정 작업 동안 기다리기 페이지 구현하기.

PHP 작업 중에 결과 처리하는데 시간이 좀 걸리는 검색 페이지를 구현하는데 있어서, 검색 결과를 구하는 동안 페이지를 그냥 두면 검색 결과가 나올 때까지 화면에서 아무런 것도 표시되지 않아 사용자들은 답답하게 됩니다. 그리고 사용자가 검색 중임에도 결과가 너무 오래 걸려서 다시 검색을 하거나 하게 되면 검색 서버에 부하를 가중시켜 서버의 성능에 악 영향을 미치게 됩니다. 이를 방지하기 위하여 검색을 시작하면 바로 페이지에서 검색 중임을 알려주는 진행 표시를 하고, 검색이 완료되면 진행 표지 부분을 없애고 검색결과를 표시합니다. DIV 태그를 이용하여 간단하게 구현이 가능합니다. 검색 대기 중일 때 표시할 내용을 DIV 태그 내에 작성하고, 페이지가 바로 표시되도록 한 이후에, 로딩 작업이 완료되면 자바..

Wininet Component Suite에서 User Agent를 바꾸어 통신하기.

서론 Wininet Component Suite의 TInetHttp 컴포넌트를 그대로 사용하여 웹서버와 통신을 하게되면 웹 서버의 User Agent 부분에 "WinInetComponentSuite"로 남게 됩니다. 물론 TIdHTTP를 사용하면 "Indy"라고 User Agent가 남게 됩니다. Indy에서는 User Agent가 변경이 가능하지만, TInetHttp는 직접적으로 변경할 수 있는 속성을 제공하지 않습니다. User Agent 변경하기 TInetHttp에서는 직접적으로 User Agent를 변경할 수 있는 속성을 제공하지 않기 때문에, 다음과 같이 AddRequestHeader 메소드를 이용하여 User Agent를 변경할 수 있습니다. with INetHttp do try INetUrl..

Wininet Component Suite에서 https로 통신하기

서론 앞서 "" 글에서 Wininet Component Suite를 사용하는 방법을 간단하게 살펴보았습니다. 일반적인 HTTP를 통한 통신(GET / POST)이 잘 동작합니다. 본 글에서는 HTTPS를 이용하여 암호화된 안전한 통신 방법에 대해서 살펴 보겠습니다. 암호화를 위한 HTTPS 사용하기 HTTPS 암호화 통신을 위해서 일반적인 HTTP 방식으로 호출하는 것과 거의 동일합니다. 단지 여기에 포트와 암호화 플래그만 더 설정하면 HTTPS 암호화를 통하여 좀더 안전한 통신이 가능합니다. with INetHttp do try INetUrl.Url := EditUrl.Text; ServerName := INetUrl.HostName; Port := INetUrl.Port; // 포트 할당 if ('h..

FTP Upload시 "Unable to listen, too many pending PASV requests from same client IP." 발생 문제

간단한 파일 업로드 프로그램이었는데, 패시브(Passive) 모드로 여러 파일들을 올려 주어야하는 프로그램이었습니다. 다 완성한 이후에 테스트하는 도중 "Unable to listen, too many pending PASV requests from same client IP." 오류가 발생하며 파일이 정상적으로 올려지지(Upload)가 않았습니다. "netstat -na"로 포트 상태를 알아보니, TIME_WAIT가 엄청나게 있어서 문제인 것으로 파악되었습니다(FTP Passive Mode에서 클라이언트에서 사용하는 포트 대역이 1025~ 5000 사이의 값이라 한번에 이론적으로 4000개 이상을 업로드할 수가 없는 셈입니다). 작은 이미지 수천개의 파일을 한꺼번에 올리는 어떻게 보면 단순 무식한 프로..

프로그래밍 2010.02.10

ASP에서 서버의 디렉토리를 재귀적으로 자동생성하는 함수

Scripting.FileSystemObject 객체를 이용하여 서버의 파일 및 폴더를 마음대로 주무를 수 있습니다. 특정 경로를 새로 만들때는 FSO의 CreateFolder 프로시저를 이용하게 되는데, 문제는 이 메소드가 하나의 폴더만 만들 수만 있다는 점입니다. 예를 들면, "C:\Temp\Web\Upload\2010\02\10" 식의 디렉토리에 임시 폴더를 생성하려 한다면, CreateFolder 메소드로는 바로 오류가 발생하게 됩니다. 차례 차례 경로를 들어가면서 해당 디렉토리가 없으면 하나씩 생성해 주어야 되죠. 이를 테면 다음과 같이 만들어야 겠죠. If not objFSO.FolderExists("C:\Temp") then Call objFSO.CreateFolder(("C:\Temp") ..

Graphics32 델파이 2010에 설치하기

델파이에서 이미지를 자주 다룬다면 Graphics32 패키지를 대부분 사용하고 있을 겁니다. 하지만, 2007년 3월 이후 더 이상의 버전 업그레이드가 없어 BDS 2010을 제대로 지원하지 않고 있습니다. 2010에 완벽하게 포팅된 버전을 기다리며 일단은 현재까지 나온 1.8.3 패키지를 약간 수정하여 2010에서 사용하는 방법에 대하여 설명하고자 합니다. 1.8.3 버전에서 BDS 2006 설치까지는 패키지 파일이 지원되어 바로 GR32 컴포넌트들의 등록이 가능합니다. 2010에서 사용하기 위해서는 약간의 정이 필요한데 수정이 필요한 부분은 아래와 같습니다. 먼저 GR32_BDS2006.dpk 파일을 복사하여 GR32_BDS2010.dpk 파일을 하나 만듭니다. 그리고 아래 부분을 수정합니다. GR3..

성능비교(Round, Trunc, Floor, MulDiv, 정수연산)

화면에 표시하거나, 프린터에 인쇄를 할 경우 해상도에 따른 좌표 계산을 자주하게 됩니다. 좌표 계산을 위하여 위 정수연산을 하거나, Round, Trunc, Floor, MulDiv 등의 함수를 사용하게 됩니다. 그럼 이 방법들 중에서 가장 성능이 뛰어난 것은 무엇인지 갑자기 궁금하여 다음과 같이 간단한 소스로 성능을 실험해 보았습니다. var i, nX, nOldX: integer; dwStart, dwEnd: DWORD; begin nOldX := 50; dwStart := GetTickCount; for i := 0 to 10000000 do nX := Trunc(nOldX * 72. / 25.4); dwEnd := GetTickCount; Memo2.Lines.Add('Trunc(nOldX * 7..

728x90