오라클 클라이언트는 설치과정이 좀 독특한 프로그램이다.. 자바로 만들어진 설치 프로그램은 윈도우, 리눅스, 유닉스, 맥 등의 OS에서 모두 사용하기 위해 설계가 되었는가 본데, 각 운영체제에서 당연히 여겨지는 점들이 지켜지지 않아 황당한 경우가 많다..

예를들면, 윈도우 환경에서 설치경로에 공백문자와 한글을 지원한다.. 하지만, 오라클 클라이언트는 이런 경로에 설치를 하면 제대로 동작을 안한다.. 더구나 일정 경로 이상 깊이가 길어지면 (즉, 경로명 길이가 길어지면) 동작을 안하는 경우도 있다.. 온갖 삽질을 통해 경험으로 이런 내용들을 알고 있어 오라클 클라이언트를 설치할때면 무조건 디폴트 경로에 설치를 한다.. 또 무슨 일이 생길지 모르므로.. 오라클의 새 버젼이 나올때 마다 오라클 클라이언트도 새로 나오는데, 왜 아직까지 이런 문제점들을 수정되지 않는가 모르겠다.. 이런 부분을 보면 한중일 2바이트 문자에 대한 지원을 Microsoft 만큼 제대로 하는 곳도 없다.. 오픈소스 진영도 Microsoft를 따라가려면 아직도 멀었다..

하지만, 이것도 내가 잘 하면 되는 것이지만 다른 사람이 이상하게 설치를 해둔 상황에 내가 이상한 점을 발견하고 문제를 해결해야 하는 상황을 접하게 되면 피곤하게 된다.. 이번에도 그런 경우였는데, 다른 서버에서는 잘 동작하는 IIS 서버 컴포넌트가 새 서버에 세팅을 했더니 DB 접속이 안되는 것이다.. 젠장..

정말 신기한 현상은 제어판의 ODBC 세팅하는 화면에서 접속 테스트를 해보면 접속이 제대로 된다는 것이다.. ODBC 세팅창에서는 제대로 되는데, 프로그램에서 안되니 우리 프로그램 문제라 생각하고 연락을 한 것이다..


Microsoft OLE DB Provider for ODBC Drivers 오류 '80004005'
5 (Oracle in OraHome92) 시스템 오류가 발생하여 지정한 드라이버를 로드하지 못했습니다.
/OracleTest.asp, 줄 15


컴포넌트가 DB 접속이 계속 실패를 하는데 원인 찾기가 쉽지 않아, ASP로 간단한 샘플코드를 만들어 확인을 해봤다.. ASP에서도 똑같은 오류가 발생했다.. 위와 같은 오류가 발생하였는데, 원인을 찾는 것이 쉽지 않았다.. 구글을 비롯해 네이버 지식인 등 검색을 좀 해봤는데 완전 똑같은 현상은 아니지만 비슷한 현상들 겪는 사람들이 좀 있었다.. 내용을 종합해보니 C 드라이브 루트가 아닌 D 드라이브에 오라클 클라이언트를 설치하면 제대로 동작을 안하는 경우가 있다는데 힌트를 얻었다.. 확인해보니 문제의 서버에도 오라클 클라이언트가 D 드라이브에 설치되어 있었다.. 젠장, 이렇게 황당한 경우가.. 왜 D 드라이브에 설치를 하면 정상동작을 안하는 것이야? 이렇게 만들라고 해도 이렇게 만들기 힘들겠다..


http://database.ssarang.net/?inc=read&aid=1641&criteria=mssql&subcrit=qna&id=&limit=20&keyword=&page=5

http://locke.tistory.com/40

http://sqler.pe.kr/web_board/view_list.asp?id=6551&read=1718&pagec=&gotopage=24&block=2&part=myboard3

원인을 찾기가 힘들었지 해결방법은 간단했다.. 오라클 클라이언트를 언인스톨 하고, C 드라이브에 설치를 하니 해결이 되었다.. 무슨 프로그램이 C 드라이브에 설치를 했을때와 D 드라이브에 설치를 했을때 동작이 틀려질 수가 있을까? 어떻게 만들면 이렇게 동작할 수가 있을까? 정말 신기하다..
Posted by 미친병아리

댓글을 달아 주세요

  1. Favicon of http://blog.powerumc.kr BlogIcon 땡초 2008.05.11 14:54  댓글주소  수정/삭제  댓글쓰기

    정말 어떻게 하면 저렇게 만들 수 있을까요? ㅋ
    재미있어요~ ^^

  2. Favicon of http://aromi.tistory.com BlogIcon aromi 2008.05.12 01:22  댓글주소  수정/삭제  댓글쓰기

    오라클은 9버전대까지도 JVM 버전이 무척 낮지요. 덕분에 초보 자바개발자들은 오라클 설치하고 잠시 혼란을 겪습니다. 구하기도 힘든 1.2와 1.1 JVM을 PATH 맨 앞에 넣어놓거든요.
    한글문제에 대해서는 두가지 유의사항이 있는데, 하나는 설치 원본을 CD가 아닌 임의의 폴더에 복사했을때 한글 경로가 있으면 안되고, 두번째는 로그온 이름에 한글이 있을 경우 환경변수의 TEMP 디렉토리를 다른 곳으로 바꿔야 합니다.
    몇번 데인 이후 어느 버전을 쓰던 조심하게 되었는데, 이런 대형 프로그램들은 소스 안에 엄청나게 하드코딩 해놔서 고치고 싶어도 쉽게 못고치나 봅니다.

    비슷한 예로, 솔라리스를 설치할때 네트웍 설정을 물어보는데 설치 끝내고 부팅을 하면 네트웍이 안됩니다. 왜냐면 설치할때 입력한 게이트웨이 설정이 저장되지 않았거든요. 거의 10년 가까이 있었던 유서깊은 전통의 버그였는데 안타깝게도(!) 버전 10에서 고쳐졌지요.

    • Favicon of http://madchick.egloos.com BlogIcon 미친병아리 2008.06.16 15:32  댓글주소  수정/삭제

      잘 못 작성을 해서 고치기 힘든 것은 이해를 하겠는데, 그래도 명색이 글로벌 기업으로 여러나라의 언어별로 지원하는 프로그램이라면 이 정도는 어떻게든 고쳐야 하는게 아닌가 하는 생각이 듭니다.. 물론, 고치고 말고는 오라클 맘이죠.. 오라클에게 고객의 목소리는 그저 참고 자료일 뿐..

  3. Favicon of https://perversion.tistory.com BlogIcon 재미있는사이트 2010.04.06 14:21 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 초보 블로거 입니다. 아름다운 블로그에 좋은 글 잘 보고 갑니다.

    시간 나실 때 제블로그도 한번 방문해주세요.^^

    http://automobili.tistory.com/

ASP.NET 환경에서 안전한 웹 어플리케이션을 만드는데 알아두면 좋은 내용들을 다루고 있다.. 본질적인 내용은 어느 개발환경에서든 모두 고려해볼만한 내용을 담고 있지만, 예와 설명이 ASP.NET을 기준으로 설명을 하고 있어 모든 웹개발자들이 공유하고 즐기기엔 약간 아쉬운 점이 있기는 하다.. 뭐, MS 기술자들이 모이는 블로그 사이트에 올려진 글이니 당연하기 하겠지만..

3번째 이야기에서 보면 입력값 점검을 위해 정규표현식을 사용하는 예가 나오는데, 아주 좋은 방법이라 생각한다.. 올바로된 값이 입력되었는지를 점검하는데 정규표현식 만큼 간결하면서도 강력한 방법이 없는데, 자바 스크립트 뿐만 아니라 많은 프로그래밍 환경에서 지원하는 방법인데 주변의 프로그래머들은 의외로 사용을 안하는 것 같다.. 왜 그럴까 좀 궁금해진다..
First Line of Defense for Web Applications - Part 1
(http://blogs.msdn.com/hackers/archive/2007/10/12/first-line-of-defense-for-web-applications-part-1.aspx)
First Line of Defense for Web Applications - Part 2
(http://blogs.msdn.com/hackers/archive/2007/10/22/first-line-of-defense-for-web-applications-part-2.aspx)
First Line of Defense for Web Applications - Part 3
(http://blogs.msdn.com/hackers/archive/2007/10/30/first-line-of-defense-for-web-applications-part-3.aspx)
First Line of Defense for Web Applications - Part 4
(http://blogs.msdn.com/hackers/archive/2007/11/12/first-line-of-defense-for-web-applications-part-4.aspx)
First Line of Defense for Web Applications - Part 5
(http://blogs.msdn.com/hackers/archive/2007/12/16/first-line-of-defense-for-web-applications-part-5.aspx
)
First Line of Defense for Web Applications - Conclusion
(http://blogs.msdn.com/hackers/archive/2008/01/06/first-line-of-defense-for-web-applications-conclusion.aspx)
4번째 이야기에서 주로 다루는 Cross Site Scripting에 대해서는 그동안 관심을 가져보지 못했었는데, 앞으로는 이 부분에 대해서도 관심을 가져야 하겠다..

5번째 이야기에서는 SQL 인젝션에 대해 지면을 할애하고 있다..

4번째, 5번째 이야기는 사실 프로그래밍 개발환경에 상관 없이 모두에게 동일하게 적용되는 내용이니 참고해보면 좋겠다.. 물론, 이 두가지 주제에 대해서는 이 글들 말고도 다른 좋은 글들이 훨씬 더 많이 있을테니 그러한 글들을 참조해도 좋다.. 아무튼 이 두 주제는 요즘 보안에서는 기본에 해당하는 내용이므로 꼭 내용을 숙지하고 프로그래밍시 반영을 해야한다..

정 시간이 없다면 맨 마지막 글인 결론 내용이라도 꼭 읽어볼 필요가 있겠다..
Posted by 미친병아리

댓글을 달아 주세요

다음 DNA에서 C/C++에서 integer변수 swap 방법 비교 (http://dna.daum.net/technote/ccpp/CPPSwap) 라는 글을 보고 옛날 생각도 나고, 요즘 CPU 환경에서는 그냥 임시변수를 선언하여 구현하는 것이 더 빠르다는 결론이 재밌어 보여 윈도우에서도 함 해봤다.. VC++ 6.0과 VS 2008을 사용하여 2개를 비교를 해봤다..

원문에서 소개된 소스코드를 아래와 같이 조금 수정해봤다.. 윈도우즈 환경에서 실행시간 위해 약간의 코드를 추가했다.. 원본 코드는 그대로 유지했음.. 새 컴파일러가 좀 더 좋아진 점이 있는가 해서 VC++ 6.0과 VS 2008을 가지고 두번 비교를 해봄..


std::swap을 사용하는 방법
std::swap : c++에서 일반적으로 가장 널리쓰이는 안전한 방법

#include "stdafx.h"

#include <iostream>
#include <algorithm>
#include <stdio.h>

#include <windows.h>

int main(void)
{
    DWORD start = ::GetTickCount() ;

    int a = 1;
    int b = 2;
    for(int i=0;i<50000000;i++)
    {
        std::swap(a,b);
    }
   
    printf("%d %d\n\n",a, b);

    DWORD end = ::GetTickCount() ;
    printf("execution time : %1.3f m/s\n", (double)(end - start) / (double)100) ;

    int temp ;
    std::cin >> temp ;

    return 0 ;
}

VC++ 6.0 : execution time : 0.630 m/s
VS 2008 : execution time : 0.630 m/s


xor를 이용한 방법
c에서 예전에 많이 사용되던 방법 임시변수를 사용하지 않아서 좋다는 장점이 있음. 오래된 CPU에서는 이 방법이 빨랐으나 최근 CPU에서는 bit operation이 느려서 그다지 좋지 않다고 알려져있음.

#include "stdafx.h"

#include <iostream>
#include <algorithm>
#include <stdio.h>

#include <windows.h>

#define SWAP(a,b) { if (a!=b) { a^=b; b^=a; a^=b; }}

int main(void)
{
    DWORD start = ::GetTickCount() ;

    int a = 1;
    int b = 2;
    for(int i=0;i<50000000;i++)
    {
        SWAP(a,b);
    }
   
    printf("%d %d\n\n",a, b);
   
    DWORD end = ::GetTickCount() ;
    printf("execution time : %1.3f m/s\n", (double)(end - start) / (double)100) ;
   
    int temp ;
    std::cin >> temp ;
   
    return 0 ;
}

VC++ 6.0 : execution time : 0.940 m/s
VS 2008 : execution time : 0.940 m/s


임시변수를 이용한 방법
가장 기본적인 방법. 임시변수를 사용한다는 단점이 있음.

#include "stdafx.h"

#include <iostream>
#include <algorithm>
#include <stdio.h>

#include <windows.h>

#define SWAP(a,b) { int t=a; a=b; b=t; }

int main(void)
{
    DWORD start = ::GetTickCount() ;

    int a = 1;
    int b = 2;
    for(int i=0;i<50000000;i++)
    {
        SWAP(a,b);
    }
   
    printf("%d %d\n\n",a, b);
   
    DWORD end = ::GetTickCount() ;
    printf("execution time : %1.3f m/s\n", (double)(end - start) / (double)100) ;
   
    int temp ;
    std::cin >> temp ;
   
    return 0 ;
}

VC++ 6.0 : execution time : 0.470 m/s
VS 2008 : execution time : 0.630 m/s


결론
실험환경 : Intel Core2 Duo T5600 1.83GHz, 2.5GB RAM

VC++ 6.0 : execution time : 0.630 m/s
VS 2008 : execution time : 0.630 m/s

VC++ 6.0 : execution time : 0.940 m/s
VS 2008 : execution time : 0.940 m/s

VC++ 6.0 : execution time : 0.470 m/s
VS 2008 : execution time : 0.470 m/s

VC++ 6.0과 VS 2008의 차이점은 없음 (옵션 변경 없이 디폴트로 실행시켰을때..)
임시변수를 사용하는 방법이 가장 빠름.. 이상한 점은 VS 2008에서는 세번째 실험방법의 결과가 실행시마다 왔다갔다 한다는 점.. 0.470과 0.630이 실행시마다 왔다갔다 함..

새로운 환경에서는 예전의 지식은 힘을 발휘하지 못하게 되는 경우가 있다.. 임시변수를 두면 좋지 않다는 생각을 가지고 살다, 이런 결론을 얻고 보면 좀 황당하다.. std::swap 보다도 임시변수를 사용하는 것이 빠르다니.. 많이 읽고 정보를 수집하고, 직접 실습을 해보고 하여 항상 최신 지식으로 무장할 필요가 있다..

Posted by 미친병아리

댓글을 달아 주세요

  1. 한번쯤은.. 2008.11.01 14:11  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    프로그래머를 업으로 살고 있는 사람입니다.
    저도 한창 공부할때 님 처럼 많이 테스트 해보고 비교 해보고
    그것을 통해서 많은 것을 깨우치고 새로운 것을 많이 배웠답니다.

    만약 C/C++ 프로그래머시고 저보다 훨신 뛰어난 분이신지도 모르지만..
    감히 한마디 하자면..

    문득 이런 생각이 들더군요.
    위에서 비교하신 것처럼 연산 5천만번 수행하는데 겨우 최대로 0.47초 차이라면,
    과연 그게 실제 개발에 어떤 영향을 미칠까요?

    이렇게 테스트 비교하여 더 좋은 것을 습관적으로 사용하는건 분명이 좋겠지요..

    그렇지만 이런 미묘한 차이에 시간을 쓰는것 보다 원할하지 못한 전체적인 흐름을
    먼저 보는게 더 중요 하지 않을까요?

    구조 자체에 불필요한 연산이 증가한다면 거기서 오는 연산의 시간은 0.1초라도 아까운 시간이 되니까요. 거기에서 읽어버리는 시간을 잡는것이 더 중요하단 생각이 드네요..

    • 날라리 코더 2009.06.15 09:26  댓글주소  수정/삭제

      안녕하세요.
      미친병아리님 글은 6~7년전에 news.microsoft 에서 종종 읽어보곤 했었는데, 블로그에는 첨 찾아왔습니다.

      한번쯤은 님 글은 충분히 공감이 가네요.

      그런데 미친병아리님의 글은 개발의 Tip 또는 information 이라 볼 수 있고,

      한번쯤은 님의 글은 개발/개선에 임하는 자의 논리적 우선순위(또는 자세?)를 말하는 글이라 보이는데

      둘을 비교해서 무었이 더 중요하다고 말하는건 김치와 usb 메모리를 비교하는 것과 같다고 생각이 드네요.

      더 중요한것은 언제나 경우와 때에 따라 상대적인 것이죠. ^^

    • 신희운 2011.04.30 16:15  댓글주소  수정/삭제

      오만하군요.