어느 순간 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 김모작자

댓글을 달아 주세요

Oracle 클라이언트로 많이 사용하는

SQL Developer (4.x 기준) 에서는 기본적으로 'DATE' 데이터형을 YYYY-MM-DD 등 날짜 부분만 표시한다. 그러나 Oracle 는 날짜, 시간을 Date 형식으로 표현하기에 HH:MM:SS 등을 표시해야 한다


날짜 부분을 표시하기 위해

도구 -> 환경설정 메뉴에 들어가

[데이터 베이스] 의 [NLS] 페이지에 들어가서

날짜 형식에 YYYY/MM/DD HH24:MI:SS 등 입력해 두면

시간을 볼수 있다.




Posted by 김모작자

댓글을 달아 주세요