Java 에 Open Source 프로젝트를 쓰다보면 늘상격는 예상치 못한 에러..
no java compiler available 
뭐냐 이건..
JDK 경로 지정해줘도 안되고.. 답답 ㅠㅠ

구글링 하다보니
- 런타임을 JDK 로 하면 된다거나
- 뜬금없이 ant 추가하면 된다거나
- ecj 를 추가하면 된다거나.. (다행이 난 이걸로 해결)

마음 같아선 자바 없어졌으면 ...

http://www.mkyong.com/spring-boot/spring-boot-web-jsp-no-java-compiler-available/


Posted by 김모작자

댓글을 달아 주세요

어느 순간 Windows 7 + Internet explorer 에서 Youtube 시청시 FullHD 해상도가 안나오더라...

Chrome 등에서는 잘 나오고..

 

구글 도움말로 봐서는 Windows 7, Windows 8 (8.1 아님) 에서 IE 사용시에 동일 문제가 있을 것 같음..

 

결론은 html5 브라우저 전환 때문에 발생하는걸로 보이며

 

임시 해결을 위해

- 크롬을 사용하거나

- URL 뒤에 &nohtml5=1 를 붙여서 Flash Player 버전으로 보거나

- Windows 8.1 이상으로 업글하거나..

해야 될듯...

 

Windows 10 + Internet explorer/Edge 에서는 잘 돌아감..

 

Posted by 김모작자

댓글을 달아 주세요

C# 에서 GDI+ 사용하여 생성한 이미지를 저장하려니 


System.Runtime.InteropServices.ExternalException (0x80004005): GDI+에서 일반 오류가 발생했습니다.

   위치: System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)

   위치: [xxxxxxx].[xxxx](Entry entry)


위와 같이 80004005 에러가 생기기도 하고, 


메인 쓰레드에 잘 쓰던 기능을 내가 만든 다른 타 쓰레드에서 호출, File 접근, 기록 할 때 마다 Access Denied (= Win32 에 5번 코드)  가 발생했다면 ...


ACL 권한 때문에 분명 Impersonate 시켜서 시작했는데....

분명 메인 쓰레드(=시작 쓰레드)에서는 별 문제 없던 코드였는데

자식 스레드에서 위 에러가 발생한다면

해당 쓰레드가 Impersonate 되지 않았기 때문이다..


그 문제가 되는 쓰레드 생성할 때 원래 쓰레드의 정보를 넘겨주면 해결된다는 거..

즉, Impersonation 은 쓰레드간 (자동으로) 공유되지 않는다는 점.


아래 func 함수에서 쓰레드 생성하는것처럼 Impersonation 정보를 주고 받고 해야함..

자식 쓰레드)

void ThreadProc(object obj){


var identity = (WindowsIdentity) obj;


using(var impersonation = identity.Impersonate()){


// 원래 코드


}

}


부모 쓰레드)


void func(){


Thread thread = new Thread(new ParameterizedThreadProc(WindowsIdentity.GetCurrent() ));


// .....

}


예제라서 WindowsIdentity 이고,, 상황에 따라 적절한 Identity 를 사용하면 될듯...


Posted by 김모작자

댓글을 달아 주세요

과거에는 Oracle ODP.net 을 사용하려면 Instant Client 가 필요했었다.

Instant Client 는 C 로 빌드된것으로 아키텍쳐에 따라 구분해서 사용했는데

이번에 다른 프로젝트를 만들다보니 새 버전이 나왔더라..

완전히 .net 으로 코딩된 새버전!



일단 아래 처럼 흔하디 흔한 시작 문자열을 가지고 시작했는데


using Oracle.ManagedDataAccess.Client;

....

....

        public OracleConnector(CONNECT_INFO info)
        {
            string src = string.Format("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={3}))(CONNECT_DATA=(SERVICE_NAME={4})));User Id={1};Password={2};", info.IP, info.LoginID, info.LoginPWD, info.PORT, info.ServiceID);
            con = new OracleConnection();
            con.ConnectionString = src;
            con.Open();
        }



자꾸

Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Oracle 통신: 서버에 접속하는 데 실패했거나 접속 문자열을 구문 분석하는 데 실패했습니다. ---> OracleInternal.Network.NetworkException (0x80004005): Oracle 통신: 서버에 접속하는 데 실패했거나 접속 문자열을 구문 분석하는 데 실패했습니다. ---> System.Security.Authentication.AuthenticationException: SSPI를 호출하지 못했습니다. 내부 예외를 참조하십시오. ---> System.ComponentModel.Win32Exception: 보안 패키지에 사용할 수 있는 인증서가 없습니다


에러가 나더라..

실제로 위와 같은 상황에서는 sqlplus 로 하면

ORA-12638: 신용 검색에 실패했습니다



주로 해당 PC 에 오라클이 기본 상태로 설치된 경우에 발생하는것 같다..


-------------------------

해결 방법 --->


1. 독립적인 환경 구성을 위해 TNS 관리자 경로를 자기 자신으로 설정한다

   app.config 또는 web.config 에 ManagedDataAccess 모듈을 nuget 으로 설치했다면 자동으로 생성됐을거임.. 아래처럼 경로만 추가로 써주면 된다

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <!--<dataSource alias="ExtOracle" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xxxxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=eeee))) "/> -->
      </dataSources>
      <settings>
        <setting name="TNS_ADMIN" value="." />
      </settings>
    </version>
  </oracle.manageddataaccess.client>


2. sqlnet.ora 파일 생성


sqlnet.authentication_services=(none)
NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)

SSPI 관련 문제는 위에줄에 있는 내용으로 커버가 되며, 아래 내용으로 EzConnect 형태로 접속 문자열을 사용할 수 있음. 이미 오라클 설치중이라면 admin 폴더에 찾아가서 변경하면 된다

참고로 이 파일을 만든 후 파일 속성(Properties, Alt+F4)에 가서 "Overwrite if newer" 또는 "Copy Always" 를 선택해서 빌드된 경로로 복사되도록 한다

Posted by 김모작자

댓글을 달아 주세요

PPAS (PostgreSQL Advanced Server)에서

select - update 또는 select - delete 하는 경우 아래와 같이 트랜젝션이 겹칠 수 있다



보통 MySQL 등에선 Isolation Level 을 Serializable 로 설정 후 Select 한 대상을 Update 해서

우의 상황을 해결하는데

PPAS 에서 위와 같이 Transaction 을 처리하는 경우

could not serialize access due to concurrent update

예외가 발생할 수 있다.

 

보통 MySQL 등에서는 Serializable 상태에서 Select 하면 해당 테이블에 잠금이 생기지만

PPAS 에서는 Update 하면서 잠기기 때문인데,

1) Update 한게 다른 쓰레드(진입)에서 Select 에서 blocking 되지 않고

2) Update 된 걸 다시 Update 한 꼴이 되면서

3) 에러가 발생된다

 

PPAS 에서는 그래서

--> Isolation 설정 없이, Select ~ for update 로 데이터 추출 후, Update 를 하면 된다

--> 단 서비스의 @Transactional 이 붙은 함수 내에서 모든 처리가 끝나야 한다.

--> 단일 트랜젝션간에만 update 잠금이 발생하기 때문

 

 

추가로

PPAS 에서도 Select 에 Limit 을 사용할 수 있는데

Select * from src limit 1;

위의 경우 MySQL 에서는 src 의 clustered index, 특정 index 에 의해 일관된 순서대로 추출되지만

PPAS 에서는 order by 없이 limit 사용시 임의의 순서대로 추출된다

==> 일관된 순서가 필요시 order by 를 추가해서 사용하도록 한다

==>  order by 없을 시 랜덤하게 나오는건 버그라 아니라고 PPAS 문서에 명시돼 있음 (PPAS 뿐만 아니라 PostgreSQL 특성인듯)

 

Posted by 김모작자

댓글을 달아 주세요