라벨이 프로그래밍인 게시물 표시

윈도우에서 오라클19c 설치 중 ins-35180 오류 발생 시 조치 방법

근래에 개발용으로 사용하던 가상 머신을 잘못 건드리는 바람에 포맷을 했습니다. 단위테스트에 필요해서 오라클19c를 설치하는데, 전에는 겪어보지 못했던 "ins-35180" 오류가 발생했습니다.   메모리가 부족하다고 해서 가상 머신의 메모리를 올려봤는데도 해결되지 않았습니다. 구글링하며 이것 저것 해보다가 이 글에서 컴퓨터 이름과 관련이 있다는 내용을 발견했습니다. https://forums.oracle.com/ords/apexds/post/i-m-getting-ins-35180-unable-to-check-for-available-memory-8921 제 컴퓨터 이름에 한글이 있었는데, 그것 때문에 안 되는 것 같아서 컴퓨터 이름을 영문자+숫자로만 구성되도록 변경했더니, 더는 오류가 발생하지 않고 정상적으로 설치되었습니다.   잘 해결되어서 감사하네요!

숫자 연산 시 주의사항

 자바에서 이미지 관련 알고리즘(Floyd-Steinberg 디더링)을 구현했는데 결과가 이상하게 나왔습니다. 도무지 원인을 몰라서 한참 삽질을 하다가 이대로는 안 되겠어서 하루자고 머리좀 식힌 후 다시해보니 양자화 오류값을 주위 픽셀에 덧셈할 때 항상 0을 더하더군요.. 코드는 다음과 같았습니다. image[y][x] += 7/16 * 양자화오류값 도대체 왜그러나하고 생각해보니.. 7/16이 정수형이라서 결과값이 0이 되었습니다. 7/16 = 0 0 * 양자화오류값 = 0 다음과 같이 고친 후에야 알고리즘이 정상화되었습니다. image[y][x] += 7f/16 * 양자화오류값 잘못된 것을 깨달을 수 있는 지혜를 주신 하나님께 감사드립니다.

Active X에서 SetTimer를 해도 안 되거나 PostMessage가 처리되지 않는 경우..

MFC로 만든 Active X 프로그램을 유지보수하는데, 주기적으로 실행할 작업이 있어서 SetTimer를 이용했습니다. 그런데... 웹화면에서 메뉴를 이동하고 나면 어째서인지 SetTimer로 지정한 작업이 실행되지 않았습니다. 원인을 찾지 못해서 결국 스레드로 처리하게 만들었습니다. 그리고 스레드에서 UI에 접근할 일이 있어서 PostMessage를 이용했습니다. 그런데.. 이상하게도 PostMessage로 메시지는 보내는데, 이것도 처리되지 않았습니다.. (메시지는 보내지는 것 같은데 실행이 안 되는 것 같았습니다.)

Oracle DBMS 정규표현식 뒤에서부터 찾기

정규표현식으로 원하는 문자열을 찾고 싶은데, 문자열에서 가장 마지막으로 찾은 값을 가져오고 싶을 때에는 어떻게 하면 좋을까요? 일반적인 프로그램에서는 해당 언어/라이브러리에서 제공하는 기능을 이용해서 가장 마지막으로 찾은 값을 가져올 수 있겠지만, Oracle DBMS에서는 지원하지 않았습니다. 찾으려는 문자열은 다음과 같았습니다. 유형1: '|aaa|bbb|ccc' 유형2: '|aaa||ccc' 유형3: '|aaa|bbb|' 유형4: '|aaa||' 유형5: '||bbb|ccc' 일종의 배열인데, "|"를 구분자로 사용한 것입니다. 각 유형 별로 가장 마지막의 데이터를 찾는 것이 목적이었습니다. 예를 들면.. 유형1: ccc 유형2: ccc 유형3: bbb 유형4: aaa 유형5: ccc 이렇게 찾아야 하는 것이죠.

CL : fatal error C1083: 컴파일러 중간 파일 파일을 열 수 없습니다.

VisualStudio 2010에서 C++ 솔루션을 빌드하려고 하면 계속 다음과 같은 오류가 발생했습니다. CL : fatal error C1083: 컴파일러 중간 파일 파일을 열 수 없습니다. 'C:\윈도 TEMP 경로\_CL_렌덤문자' : No such file or directory 

Visual Studio 디버깅 시 멈춰있는 문제

어느날부터 비주얼 스튜디오(2010)에서 디버깅을 시작하면 프로그램이 실행되지 않고 그냥 멈춰있는 증상이 발생했습니다. 원인이 뭔가하고 한참 해맸는데, 가만히보니 아래쪽에 이런 메시지가 표시되고 있었습니다. "C:\Windows\System32\rasapi32.dll에 대한 기호를 로드하고 있습니다"

파이썬에서 ShellExecuteEx로 인쇄하는 법

최근에 ShellExecute로 인쇄하는 방법에 대해 소개해드렸습니다. 이번에는 ShellExecuteEx로 인쇄하는 방법에 대해 소개해드립니다. (기본 프린터로 인쇄됩니다.) import win32event import win32process from win32com.shell.shell import ShellExecuteEx from win32com.shell import shellcon rc = ShellExecuteEx(lpVerb = 'print', lpFile = 'c\\파일경로\\파일.pdf', fMask = shellcon.SEE_MASK_NOCLOSEPROCESS | shellcon.SEE_MASK_DOENVSUBST # NOCLOSEPROCESS: 프로세스 핸들을 반환하도록 합니다. # DOENVSUBST: lpFile에 포함된 환경 변수를 실제 값으로 바꿔주도록 합니다. ) hproc = rc['hProcess'] win32event.WaitForSingleObject(hproc, win32event.INFINITE) exit_code = win32process.GetExitCodeProcess(hproc) 참고 자료 nullege https://sourceforge.net/projects/pywin32/ 관련 글: 파이썬에서 ShellExecute로 인쇄하는 법   파이썬에서 pywin32를 이용한 기본 프린터 변경법

파이썬에서 UUID 생성법

파이썬 2.5 이상부터 다음과 같이 간편하게 UUID를 생성할 수 있습니다. import uuid # uuid1()도 사용할 수 있습니다. # 단, uuid1은 컴퓨터의 정보를 기반으로 만든다는 점을 주의하시기 바랍니다. t = uuid.uuid4() print(t) # => UUID('d464b812-f57a-480e-9a58-1ab5795fd586') t = str(t) print(t) # => 'd464b812-f57a-480e-9a58-1ab5795fd586' t = t.replace('-', '') print(t) # => 'd464b812f57a480e9a581ab5795fd586' 참고 자료: "UUID objects according to RFC 4122": https://docs.python.org/2/library/uuid.html http://stackoverflow.com/questions/534839/how-to-create-a-guid-uuid-in-python

파이썬에서 멀티 프로세싱으로 생산자-소비자 문제 구현

파이썬에서 멀티 프로세싱을 구현해보았습니다. 생산자 함수와 소비자 함수는 각각 별도의 프로세스에서 실행되며, 메인 프로세스는 일정 시간이 지난 후 각 프로세스를 종료 시킵니다.

파이썬에서 pywin32를 이용한 기본 프린터 변경법

파이썬 라이브러리 중 pywin32 라는 것이 있습니다. win32 api들을 파이썬에서 쉽게 사용할 수 있도록 해주는 라이브러리입니다. 이 라이브러리를 이용해서 기본 프린터를 변경하는 방법은 다음과 같습니다.

특정 시점부터 ::GetDC(NULL)가 NULL을 반환하는 문제의 원인.

윈도 OS에서 프로그램 실행 중 어느 시점부터 갑자기 이미지 처리 함수가 제대로 동작하지 않는 문제가 발견되었습니다. DC를 이용해서 특정 텍스트를 출력하는 함수인데 프로그램 실행 초기에는 잘되다가 어느 정도 시간이 지나면 안되더군요.. 로그를 찍어서 분석해보니 해당 함수 내에 ::GetDC(NULL)를 이용해서 DC를 가져오는 부분이 있는데, 이상하게도 일정 시간이 지나면 항상 ::GetDC(NULL)가 NULL을 반환했습니다. 즉, 텍스트가 출력되지 않는 것은 DC를 가져오지 못했기 때문이었습니다. 그렇다면 왜 ::GetDC(NULL)이 NULL을 반환했을까요? 여러 원인이 있을 수 있겠지만 제 경우에는 DC 객체 자원 누수 때문이었습니다. 해당 프로그램에서 사용하는 DLL 중 하나에서 ::GetDC()를 한 후 ::ReleaseDC()를 하지 않는 버그가 있었고, 이 때문에 서서히 DC 객체 자원이 누수되어 이런 문제가 발생한 것이었습니다. 예시... [원래 코드(잘못된 코드)] int nTmp = GetDeviceCaps( ::GetDC(NULL) , LOGPIXELSY); [수정된 코드] CDC* pDC = ::GetDC(NULL); int nTmp = GetDeviceCaps( pdc , LOGPIXELSY); ::ReleaseDC(NULL, pdc); pdc = NULL; - 2017. 7. 28 : 잘못된 내용 수정 및 예제 코드 추가.

파이썬에서 ShellExecute로 인쇄하는 법

파이썬 라이브러리 중 pywin32 라는 것이 있습니다. win32 api들을 파이썬에서 쉽게 사용할 수 있도록 해주는 라이브러리입니다. 이 라이브러리를 이용해서 ShellExecute로 인쇄하는 방법은 다음과 같습니다. (기본 프린터로 인쇄됩니다.)

C++ URL 인코딩 (== 퍼센트 인코딩)

 소스 코드는 아래와 같습니다. /** * 주어진 문자열을 URL 인코딩하여 반환함. * * 주요 코드 출처: http://codepad.org/lCypTglt * * @param s utf-8로 인코딩된 멀티바이트 문자열. * (utf-8이 아니면 웹에서 제대로 인식하지 못할 수 있습니다.) * @return URL 인코딩된 문자열 */ std::string UrlEncode(const std::string &s) { //RFC 3986 section 2.3 Unreserved Characters (January 2005) // 참고: http://ko.wikipedia.org/wiki/퍼센트_인코딩 const std::string unreserved = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.~"; std::string escaped=""; for(size_t i=0; i<s.length(); i++) { if (unreserved.find_first_of(s[i]) != std::string::npos) { escaped.push_back(s[i]); } else { escaped.append("%"); char buf[3]; /* char를 unsigned char로 바꿔주어야 합니다. * (그렇지 않으면 한글 등의 문자를 제대로 변환하지 못합니다.) */ sprintf(buf, "%.2X", (unsigned char) s[i]); escaped.append(...

RapidXml에서 문자열 파싱하기 및 주의사항

C++에서 XML 파싱에 사용하는 라이브러리 중 RapidXml이 있습니다. 속도가 빠르고, 헤더 파일로만 되어 있어서 단순히 파일을 복사하는 정도만으로 쉽게 사용할 수 있다는 장점이 있습니다. 더군다나 MIT 라이선스로 사용 가능하므로 상업용 프로그램에도 유용하게 사용할 수 있습니다. 공식 사이트: http://rapidxml.sourceforge.net 그런데 주의사항이 있습니다. 우선 아래를 봐주시기 바랍니다. string strXml = "<?xml version="1.0" encoding="utf-8"?><books> ... (중략) ... </books>"; xml_document<> doc; doc.parse<0>( (char*)strXml.c_str() ); xml_node<>* root = doc.first_node(); printf("root 노드 이름: %s\n", root->name()); 위와 같이 하면 std::string으로부터 XML을 파싱할 수 있습니다. 여기서 빨간색 부분을 보시면 const char*를 char*로 변환하는데요, 해보시면 별 문제 없이 잘되는 것 같아 보입니다. 하지만 parse()가 문자열을 변경하지 않는다는 보장이 없습니다.만약 변경해버린다면 예상치 못한 문제가 발생할 것이고, 정말 찾기 힘든 버그가 될 것입니다. 별 문제가 없더라도 아래와 같이 문자열을 복사해서 사용하는 방법을 권장해드립니다. string strXml = "<?xml version="1.0" encoding="utf-8"?><books> ... (중략) ... </books>"; char* sz = new char[strXml.size() + 1]; strcpy(sz, strXm...

프로세스 강제 종료 불가 시.

특정 프로세스를 강제 종료 하려는데... "실행 중인 작업 인스턴스가 없습니다." 이런 메시지가 나타나면서 종료가 안되는 문제가 있었습니다. 작업 관리자에서 "프로세스 종료", "프로세스 트리 종료" 해봐도 안되고, cmd에서 taskkill 해봐도 안되고... 그런데 이게 부모 프로세스를 종료하면 자동으로 종료가 되네요.. (제 경우에는 Visual Studio가 부모 프로세스였습니다. ㅋ) 참고: DEVPIA http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=917792&ref=917791

XE v1.7에서 음성 파일 재생 불가 문제 해결법.

   XE 1.7을 사용하고 있는 사이트에서 문제가 발생했습니다.   게시판에서 음성 파일을 첨부한 후, 게시물에 삽입하면, 다른 웹 브라우저에서는 음성 파일이 잘 재생되나, IE8(혹은 그 이하)에서는 음성 파일이 재생되지 않는 문제였습니다.   아마도 XE가 업데이트되면서 음성 파일 처리에 HTML5 태그인 audio 태그를 쓰도록 수정된 것 같습니다. 하지만, 다행히도 audio 태그를 플래시 플레이어로 변환시켜 주는 애드온이 있었습니다. 그 애드온의 이름은 "HTML5 AUDIO to FLASH"입니다.[1] 이 애드온 덕분에 문제를 잘 해결할 수 있었습니다. ... 이걸로 끝이면 좋았겠지만, 적용해놓고 보니, 정작 중요한 IE8에서는 플레이어가 나타나지 않는 것이었습니다. (산 넘어 산...)   이상한 것은 해당 애드온의 바탕이된 자바스크립트를 개발한 사이트[2]에 가서 데모를 구동해봤는데, IE8에서 플레이어도 잘 보이고, 재생도 잘 되었습니다. 그래서 저는 애드온을 의심하고,코드를 낱낱이 살펴보았습니다. 하지만 특별한 문제점은 없었습니다.. 다음으로는 jQuery나, html5.js와의 충돌을 의심했으나, 모두 아니었습니다.   그러다가 놀라운 글을 발견했습니다.[3] 결론부터 말씀드리자면, p 태그 안에 audio 태그가 있으면, 그런 오류가 발생한다는 것입니다. 그리고 실제로, 게시물에서 p태그를 제거하자 음성 파일이 잘 재생되었습니다.   몇 가지 연구 끝에 IE8[4]에서는 node.outerHTML, innerHTML 함수가 태그에 따라서 안먹히는 경우가 있기 때문에, 이런 문제가 발생했다는 것을 알게 되었습니다. 그렇다면 게시글에서 p 태그만 지우면 되는데, 중요한 문제는 게시판의 WYSIWYG 편집기가 자동으로 p 태그를 입력해버린다는 것이었습니다. 그래서 audio.js (애드온이 사용하는 라이브러리)에서 outerHTML, innerHTML을 사용하지 ...

c++ 변환생성자

c++ 코딩하다가 매우 당혹스러운 일을 겪었습니다. 함수 파라미터에 특정 객체가 들어가야 하는데, 그만 실수로 문자열을 넣었습니다. 보통은 컴파일 에러가 발생했겠지만, 이번에는 그렇지 않았습니다. 심지어 정상동작했습니다. 혹시나 해서 이름이 같은 다른 함수가 있는지 확인해보았지만 아니었습니다. 너무 이상해서 디버깅을 해보니, 파라미터로 문자열을 넘기는 순간, 그 문자열을 가지고 해당 객체를 생성하는 것이 아니겠어요?   네, 변환생성자 때문에 발생한 소동이었습니다. 사실 해당 객체의 클래스에는 문자열을 파라미터로 받는 생성자가 있었고, 이에 컴파일러가 알아서 객체를 생성한 것이었습니다. 생성자 선언에 explicit 키워드를 추가하면 이와 같은 문제를 예방할 수 있습니다. (예: explicit MyClass(CString csText);) 참고 변환시리즈 정리(변환생성자, 변환함수) MSDN - explicit (C++)

XE 용량 초과로 문제 발생 시 조치법.

XE를 사용 중인 웹사이트에서 용량이 꽉 차버려 사이트가 제대로 동작하지 않는 문제가 발생했습니다. 특히 첨부파일 삭제 기능도 동작하지 않고, 관리자 페이지에 접근하려고 해도 다음의 에러 메시지가 나타나면서 접근이 불가능했습니다. Fatal error: Call to a member function getAction() on a non-object in ...(중략)... DB.class.php ... (생략) 용량 문제는 첨부 파일의 경로를 찾아, 직접 지워서 해결 했는데, 저 오류는 사용 가능 용량이 생겼다고 해서 해결되지 않았습니다. 저는 다음의 방법으로 문제를 해결했습니다. XE 루트/files/cache 폴더의 이름을 변경합니다. (예: cache_bak) XE 관리자 페이지로 접근합니다. (http://웹사이트 주소/xe/?module=admin   또는 http://웹사이트 주소/xe/?module=admin&act=dispAdminConfig) 관리자 페이지에서 캐쉬 재생성 작업을 진행합니다. (※ 관리자 페이지가 제대로 나타나지 않는다면 다른 문제이므로 cache 폴더를 복원하고 다른 방법을 찾아봅니다.) 참고: http://www.xpressengine.com/qna/20701795 - 문제 해결 힌트를 얻은 곳. http://www.xeschool.com/xe/step1_52 - 캐쉬파일 재생성 방법 참고. http://www.xpressengine.com/qna/19689609 - 첨부파일을 직접 삭제할 때 참고.

Visual Studio 2010 pdb 파일을 이용해서 디버깅 하는 방법

Visual Studio 2010에서 빌드하면서 exe 파일과 함께 pdb 파일이 생겼습니다. 디버그에 사용된다는 것 외에는 잘 모르고 있었는데, 현재 실행 중인 프로그램을 디버그 할 일이 생겨서 사용법을 찾아보았습니다. 복잡한 내용은 잘 모르겠지만, 다음과 같은 방법으로 디버깅을 시작할 수 있었습니다. 빌드하면서 생성된 exe 파일과 pdb 파일을 잘 보관합니다. (두 파일은 짝을 이룹니다.) 디버그할 exe 파일을 실행합니다. exe 파일과 같은 위치에 "1."의 pdb 파일을 복사해둡니다. Visual Studio 2010을 실행하고, 해당 프로그램의 솔루션을 엽니다. "Windows 작업 관리자"를 실행합니다. 현재 실행 중인 exe 파일의 프로세스를 찾습니다. 찾았으면, 우클릭해서 "디버그"를 선택합니다. 디버거를 연결하겠냐는 확인 창에서 "디버거 연결"을 선택합니다. 그러면 연결할 디버거를 선택하는 화면이 나타나는데, "4."에서 솔루션을 열어둔 인스턴스(Visual Studio 2010 프로그램)를 선택합니다.  ※ 만약 exe 파일과 pdb 파일이 서로 다른 빌드 때 생성된 것이라면 디버깅할 수 없습니다. 참고 Visual Studio 로 디버깅하는 방법 Debugging With Minidump

CRect와 &CRect와 LPCRECT

MFC 프로그래밍 중에 무척 황당한 경험을 했습니다. void CTestCRect::OnDraw(CDC* pDC) { CRect rect(50, 50, 300, 300); pDC->DrawText(_T("Test!!"), &rect, DT_WORDBREAK | DT_EDITCONTROL); rect.MoveToX(200); pDC->DrawText(_T("Test!!"), rect, DT_WORDBREAK | DT_EDITCONTROL); } 보통은 이와 같이 사용합니다. 그런데 뭔가 좀 이상하지 않나요? 네, DrawText()를 호출할 때 처음에는 rect의 주소를, 다음에는 그냥 rect를 전달합니다. 전혀 컴파일에 오류도 없고... 둘다 정상 작동합니다. 함수 원형을 살펴보면 CRect를 받는 자리에 LPRECT가 적혀 있는데, LPRECT는 (RECT 구조체의) 포인터입니다.(CRect와 RECT는 호환됩니다.) 그러니까 함수 원형만 놓고 보면 &rect로 전달하는 것이 맞습니다. 그런데 왜 rect로 전달해도 될까요? 그것은 CRect에 LPRECT에 대한 케스팅 연산자가 재정의 되어 있기 때문입니다. 그래서 LPRECT 자리에 CRect를 넣으면 CRect에 정의된 케스팅 연산자가 알아서 CRect의 주소를 반환합니다. 참고: MSDN - CRect::operator LPRECT() 클레스등에서 타입캐스트연산자 오버로딩