티스토리 툴바


괜찮은 컨퍼런스 행사가 서울에서 열려서 관심이 가네요. 저는 스마트워크 국제 컨퍼런스 참석하고 싶습니다.

제레미 리프킨의 소유의 종말 이라는 책은 2002년에 추천도서로 읽어 봤었는데 그 내용이 이제 현실이 되었네요. 그 저자가 지금 어떤 얘기를 할지 궁금합니다.



Posted by 오일석 ONESTONE

Expression Encoder 3 SDK를 사용하면 윈도우 환경에서 쉽게 동영상 인코딩과 썸네일 추출을 할 수 있습니다. Expression Encoder를 설치하면 SDK도 동시에 설치가 됩니다. SDK가 설치된 폴더를 보면 도움말과 함께 관련 어셈블리 그리고 샘플을 제공합니다. 샘플을 분석해보면 어렵지 않다는 걸 알수 있습니다.

하지만 배포할 때 두가지 오류가 나더군요. 해결하는데 조금 시간이 걸렸는데 이 삽질을 공유합니다.

1. 64bit 서버 환경에서 발생하는 오류

{"파일이나 어셈블리 'Microsoft.Expression.Encoder, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 지정된 파일을 찾을 수 없습니다.":"Microsoft.Expression.Encoder, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"}

에러는 'Microsoft.Expression.Encoder.dll'을 찾을 수 없다는 얘기입니다. 하지만 해당 어셈블리는 잘 원래 위치에 잘 있죠. 설치할때 글로벌 어셈블리 캐쉬에도 넣어보고 했지만 같은 에러가 발생합니다. 

 Expression Encoder는 64bit 버전이 없습니다. 32bit 버전 뿐이죠. 그렇다고 64bit OS가 설치되어 돌아가는 환경에서 사용할 수 없는 것은 아닙니다. 다만 실행될때 32bit 로 실행하라는 설정만 해주면 됩니다. 아래와 그림과 같이 빌드 Configuration Manager를 열어서 x86으로 고정시켜주고 빌드해서 실행하면 위의 에러를 해결할 수 있습니다.


2. 권한 문제로 발생하는 오류

ErrorSystem.TypeInitializationException: 'Microsoft.Expression.Encoder.SkuManager'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.Security.Principal.IdentityNotMappedException: ID 참조의 일부 또는 전부를 변환할 수 없습니다.
   위치: System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess)
   위치: System.Security.Principal.NTAccount.Translate(Type targetType)
   위치: System.Security.AccessControl.CommonObjectSecurity.ModifyAccess



위의 에러는 좀 처럼 감을 잡을 수 없습니다. SkuManager를 직접적으로 쓴적도 없고 ID를 본적도 없습니다. 한참을 고생한 결과 권한 문제라는 걸 알았습니다. 저는 Windows Service로 개발을 해서 서비스로 설치를 했기 때문에 아래와 같이 서비스를 실행하는 사용자를 권한이 높은 사용자로 변경해서 해결 했습니다.


ASP.NET에 Expression Encoder SDK를 붙여서 사용하시는 개발자들이 많은데요. 그럴 때는 IIS의 Application Pool의 사용권한과 관련이 있습니다. 이건 제가 직접 해보지는 못했는데 아래 그림처럼 Default Application Pool의 사용자 권한이 Network Service로 되어 있습니다. 이 권한과 Expression Encoder SDK를 사용하는 권한를 잘 따져 보면 답이 나오지 않을까 합니다.




Posted by 오일석 ONESTONE

트위터, 페이스북과 같은 SNS가 유행하면서 제한된 문자수를 극복하기 위해 또는 너무 길어서 지지분해 보이는 URL을 짧고 간결하게 표시하기 위한 짧은 URL(Short URL Service) 서비스가 필수가 되었습니다. 

tinyurl.com, shorl.com, goo.gl 등 짧은 URL 서비스를 제공하는 사이트가 많은데요. 그중에 많이들 쓰시는 bit.ly 서비스를 프로그래밍을 통해서 짧은 URL을 만들어 쓸 수 있습니다. OAuth, REST API, QR Code 등 몇 가지 방법을 제공하는데 그중에 가장 간단한 REST API 를 통해서 짧은 URL을 만드는 방법을 알아보겠습니다. 

준비
1) 먼저 bit.ly 사이트에 접속하셔서 계정을 만듭니다. http://bit.ly/a/sign_up
2) API Key를 받습니다.  http://bit.ly/a/your_api_key 
3) API 문서는 여기에 있어요. http://code.google.com/p/bitly-api/wiki/ApiDocumentation

요청/응답
1) HTTP GET으로 요청 URL을 만듭니다. 

요청 URL : http://api.bit.ly/v3/shorten 

http://api.bit.ly/v3/shorten?login=아이디&apiKey=API_KEY
&longUrl=긴URL&format=txt

요청 파라미터
 format  json, xml, txt를 지원합니다. 
 longUrl  원본 URL. 긴 URL (URL 인코딩 필요)
 domain   (옵션) bit.ly (기본값)를 쓸것인지? j.mp를 쓸 것인지?
 x_login  (옵션) 계정 만들때 사용한 아이디
 x_apiKey  (옵션) 준비단계에서 받은 API Key 

예)
http://api.bit.ly/v3/shorten?login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07
&longUrl=http%3A%2F%2Fbetaworks.com%2F&format=json

예제 요청URL처럼 longUrl은 URL인코딩이 필요합니다. 

인증도 없고 HTTP GET으로 요청을 하니 매우 간단하네요. 

2) 응답받기

응답은 3가지 포멧으로 가능합니다. json (jsonp), xml, txt. 필요에 따라서 선택을 하면됩니다. 

JSON응답
{
   
"status_code": 200,
   
"data": {
       
"url": "http://bit.ly/cmeH01",
       
"hash": "cmeH01",
       
"global_hash": "1YKMfY",
       
"long_url": "http://betaworks.com/",
       
"new_hash": 0
   
},
   
"status_txt": "OK"
}

XML 응답
<?xml version="1.0" encoding="UTF-8"?>
<response>
   
<status_code>200</status_code>
   
<status_txt>OK</status_txt>
   
<data>
       
<url>http://bit.ly/cmeH01</url>
       
<hash>cmeH01</hash>
       
<global_hash>1YKMfY</global_hash>
       
<long_url>http://betaworks.com/</long_url>
     
<new_hash>0</new_hash>
   
</data>
</response>
 
txt 응답 
http://bit.ly/cmeH01

샘플코드 (C#)

             private string MakeShorURL(string longurl)

        {

            StringBuilder sb = new StringBuilder();

            //base

            sb.Append(@"http://api.bit.ly/v3/shorten?login=userid&

apiKey=R_xxxxx&format=txt&longUrl=");

            //server page

            sb.Append(Server.UrlEncode(longurl));

 

            // Make Short URL

            WebClient client = new WebClient();

            string shorturl = client.DownloadString(new Uri(sb.ToString()));

 

            return shorturl;

        }


메서드 하나로 짧은 URL을 얻었습니다. 

예제 코드에서는 txt 포멧으로 짧은 URL만 받아서 리턴을 했습니다. 에러처리가 없네요. txt 포멧일 때 에러는 HTTP 상태 코드인 403, 500, 503으로 떨어집니다. WebClient 에러처리 방법으로 하면 되겠습니다.


Posted by 오일석 ONESTONE