"Blog"에 해당하는 글들
페이지:«1234567...43»

ruby 2.0.0에서 iconv 사용 불가

2013-10-24   //   alexken작성   //   기술  //  1 Comment

이전에 만들어 두었던 나만을 위한 EPG가 동작을 하고 있지 않았다.

/System/Library/Frameworks/Ruby.framework/... /kernel_require.rb:45:in `require'
    : cannot load such file -- iconv (LoadError)

이유를 살펴 보니, 날마다 EPG 데이터에서 HTML페이지를 생성하는 ruby 코드 내에서 사용한 iconv 때문에 requre 문에서 부터 오류가 발생했다. 문제를 추적해 가보니, 근원은 MacOSX를 “Mavericks”로 업그레이드 해서 발생한 문제였다.

  • MacOSX 10.8(“Mountain Lion”)에 기본으로 설치된 ruby 버전은 1.8.7이었다.
  • 반면 MacOSX 10.9(“Mavericks”)에서 2.0.0으로 판올림 되었다.
  • 그 과정에서 iconv가 deprecated 되었다가 1.9.3부터는 아예 빠져 버렸다고 한다. 해결책은 iconv를 추가로 까는 방법도 있겠지만, deprecated한 취지 대로, string의 encode로 바꾸었다.

기존 iconv 사용 코드

requrie 'iconv'
conv = Iconv.new('UTF-8//IGNORE','KS_C_5601-1987')
utf8_str = conv.iconv(ksc5601_str)

string.encode로 변경한 새 코드

utf8_str = ksc5601_str.encode("UTF-8", "KS_C_5601-1987")

[長崎 여행] – 3. 나가사키

2013-10-22   //   alexken작성   //   인생  //  2 Comments

[長崎 여행] – 1. 일본속 네덜란드
[長崎 여행] – 2. 일본속 일본???
[長崎 여행] – 3. 나가사키

공자 묘/박물관

나가사키 원조 짬뽕집인 시카이로(四海楼)에 가던 중 들른 공자 묘/박물관.

하늘이가 뽑은 오미꾸지는 ‘大吉’
학운에 쓰여 있기를 “一所懸命 열심히하면 목표에 도달할 수 있다”고???
大吉 정도면 놀아도 성적은 그냥 나온다 정도여야 하는거 아닌가?

원조 나가사키 짬뽕집 – 四海楼

1899년 개장한 원조 나가사키 짬뽕집 四海楼.


아저씨 돈 많이 버셔서 건물도 높게 세우심.


창가쪽 전망이 좋네.
바로 앞이 나가사키 항.

사카에 즈시

스시집 중에 가장 평가가 좋은집(2012년 기준으로는 1등)

중화가 옆 블록에 있어 거리는 멀지않지만 주택가 골목길이여서 구글맵없으면 찾기 힘듬

6시반 쯤 전화했더니 8시반이나 가능하다고해서 2시간 기다렸다 출발
메뉴판은 따로 없고 아저씨랑 얘기하면서 하나씩 시키는 시스템

대충 먹은것만 참치, 돌돔, 농어, 오징어, 고래, 말(馬), 문어, 대하, 고등어, 갈치…

맛은 말할 필요없고 주인 아저씨를 바라보는 뺑 둘러앉은 10명의 손님들과 계속 이야기가 끊이지 않는다. 옆사람과도 금새 친해져, 먼저 나가는 손님이 있으면 전부가 인사하는 분위기. 분위기 때문에 예정보다 술을 나무 많이 마심(사케 3병+소주3컵)

거의 모든 메뉴를 다 시켰더니 22500엔 나와버렸음. 남은 먹방 여행은 삼각김밥 위주로…

처음 옆에 앉은 친구는 오사카에서 온 태국식 마사지 강사였는데 자기 제자가 思案橋에 가게를 개점해서 나가사키에 왔음. 가장 길게 얘기 했고 일본 소주는 감자로 만든 소주와 보리로 만든 소주가 있고 보리로 만든 소주 무난하며, 감자 소주는 첫 맛은 쎄지만 입안에 맴도는 향이 오래가서 좋다고 해서, 연달아 보리소주, 감자소주를 마시게 되었음.

10시 넘어서 먼저 자리를 떴고, 다음에 온 손님은 50대 이상 부부였는데 먼저 한국어로 인사했음. 민박을 운영하며 주로 삼성전자 출장자가 주 고객이여서 한국어를 공부하고 있다고 함.
이때쯤 적당히 취해있어서 계산을 부탁하니, 보유 현금 이상 나와서 컨비니에 현금 인출하러간 사이, 그동안 과묵했던 규영이랑 많은 얘기를 한 듯.

이후 호텔로 돌아와 바로 쓰러져 잠

쓰루찬

쑨원 선생의 동양히노데신문사 사옥을 물려받아 1925년 문을 연 규슈 최초의 다방
료마와도 상관이 있어 최근 료마전을 여기서 찍었고 벽장식은 온통 료마 관련 포스터

20년전 개발된 토루코라이스와 창업때부터 있던 밀크 셰이크가 유명

토루코 라이스(= 터키 라이스 = 돌궐족 밥)
필라후 위에 돈까스 얹고 사이드에 스파게티
맛은 딱 예측 가능한 그 맛(그다지…)

우리나라 터키 탕 처럼 “정체불명의 외국의” 라는 의미로 터키를 끌어오는 전통은 만국 공통인가?

나가사키 3대 카스테라

福砂屋 since 1624
松翁軒 since 1681
文明堂 since 1900


나가사키 3대 카스테라집

이밖에도 골목마다 엄청많은 카테라집이 있지만 모두 스킵
이윽고 3대 카스테라가 모두 모였기에 가족끼리 조촐한 시식회

福砂屋 : 400년 가까이 된 가장오래된 집 일부러 400년된 본점에서 구입. 가장 부드럽고 가장 달았음

松翁軒 : 福砂屋 와 마찬가지로 바닥에 굵은 설탕알갱이가 깔려있고 규영이는 이집께 젤 맛있다고 함.

文明堂 : 세집 중 고작 100년 조금 넘은 미천한 역사의 신생 카스테라 집. 세집중 경제적으로 가장 성공했는지 동네마다 체인점 엄청 많음. 달기도 적당하고 하늘이랑 나랑은 이집을 1등으로 선정.

공항에 찾아보면 3대 카스테라 다 있음
미리 짐 만들 필요 없음
면세점엔 松翁軒(쇼오켄)꺼만 있는데, 대신 소비세 50엔 안붙음.

구라바엔, 오란다 자카, 데지마 등에 대한 기록은 먹는거 아니므로 패쓰…

[長崎 여행] – 2. 일본속 일본???

2013-10-22   //   alexken작성   //   인생  //  2 Comments

[長崎 여행] – 1. 일본속 네덜란드
[長崎 여행] – 2. 일본속 일본???
[長崎 여행] – 3. 나가사키

어제까지 일본에서 일본스럽지 않고 유럽스러운 곳에 있었다면, 오늘부터는 작정하고 일본 분위기 물씬 풍기는 료칸에서…

싯뽀쿠 하마카츠

나가사키 싯뽀쿠 요리
중국 + 일본 = 퓨젼요리

비주얼은 가히 최고

얻어걸린 마츠리

싯뽀쿠 요리를 점심으로 하고 나와서 思案橋 상점가에서 우연히 얻어걸린 마츠리
궁금해서 역사적 의미를 물어보니, 상가번영회에서 재운을 맞이하기 위한 소중한 의미가 있음.

역시 돈이 최고.

해안마을 오바마

이날의 숙소는 나가사키에서 2시간 떨어진 온천지역 운젠에 있는 미야자키 료칸으로 예약해 두었고, 료칸의 무료 셔틀 서비스를 신청하면 나가사키역까지 마이크로 버스가 옴.


미국 44대 대통령 이름이랑 같아서 유명해진 해안마을 小浜

운젠으로 가는 셔틀안에서 우연히 캐치

운젠 거의 다와서 있으며, 이곳도 운젠처럼 온천 마을임.
운젠이 아직도 땅에서 김이 모락모락 나는 온천 마을이라면,
오바마는 바다+온천이 특징임.

운젠 지옥

유럽에서 일본으로
이승에서 지옥으로


(료칸 발코니 뷰)

(료칸 정원 위)

운젠 지옥은 유황온천 지역으로 료칸 정원 뒤 바위에서 아직도 수증기가 나고 있음

출입금지
지옥내는 위험합니다
환경성

운젠 미야자키 료칸

이번 여행 가장 심혈을 기울인 료칸





운젠 지옥 온천에 있는 유황온천 료칸
가족탕 예약해서 온천욕 즐기고
오늘 저녁은 당연 온천 카이세키

코스 10개 중 3개까지 나왔는데 배불러 죽겠네.

아침은 료칸에서
식사전 방으로 우메보시랑 오차를 가져다 줌
저녁은 방에서, 아침은 식당에서…



9시에 왔더니 우리가 거의 마지막 팀이었음
가족을위해 통채로 빌렸어 II

무료셔틀로 나가사키까지 갈 수 있으며, 출발 시간은 11시(하루 1번)

[長崎 여행] – 1. 일본속 네덜란드

2013-10-22   //   alexken작성   //   인생  //  2 Comments

[長崎 여행] – 1. 일본속 네덜란드
[長崎 여행] – 2. 일본속 일본???
[長崎 여행] – 3. 나가사키

4박5일간(10월2일~10월6일) 長崎 가족여행을 정리함
원래 facebook에 올렸던 것을 3덩어리로 묶어 정리하기로함(유럽, 일본, 나가사키)
가족여행을 長崎로 정한 이유는 짧은 시간에 하우스텐보스에서 유럽의 분위기와 제대로 된 전통 료칸에서 일본 분위기를 동시에 느끼고, 맛집 돌아댕기며 맛있는 음식을 먹을 수 있었기 때문

맛집 정보는 tabelog를 기준으로 하였으며, 현재 순위는 계속 바뀌므로 “몇등이다”는 의미 없고, 나가사키 현내에서 대략 20위권 이내의 순위권 집만 대상으로 했음.(지금은 순위를 보려면 유료회원이어야 하지만, 지난 순위는 조회가능함)

출발

오늘부터 5일간 나가사키의 유구한 역사와 찬란한 문화는 개뿔 그냥 먹방 여행

원조 타이틀 집, 나가사키현내 tabelog 순위 20위 이내의 맛집이 주 정복 대상

1. 나가사키 짬뽕
2. 카스테라
3. 사세보 버거
4. 싯뽀쿠 요리
5. 토루코 라이스
6. 라멘
7. 스시

햄버거 기행

8시 출발해서 10시 도착하는 직항편으로 나가사키 공항에 도착하자마자 리무진 버스로 향한 곳은 다름아닌 일본 햄버거의 고장 사세보.

1953년 개업해서 아직까지 안망하고 있는 일본 최초의 햄버거집 타이틀을 가지고 있는 “블루 스카이“.

깨끗한 마을 속에 쓰러져가는 건물 한채 그냥지날칠 뻔 했음

그런데 영업을 안한다.

옆집에 물어보니 저녁 8시에 문을 연단다.
햄버거 집이 낮에 영업을 안할꺼라고는 상상도 못했네.
비행기로 1시간 20분 + 버스로 2시간이나 왔는데.

다시 걸어서 20분
미사롯소에 왔음

타베로그 나가사키현 버거부분 서열 1위집
역근처에도 크고 번듯한 버거 집들이 많이 있는데 여기는 작고 접근성도 나쁘지만 역시 맛있음.

원래 계획은 블루스카이에서 테이크아웃해서 여기서 두개를 비교하며 한꺼번에 먹는건데
최초버거 공략실패!
최고 맛집버거만 성공!

일본속 네덜란드 – 포레스트 빌라

기차타고 네덜란드로 순간이동

오늘 숙소는 하우스텐보스포레스트 빌라

오늘은 관광이고 먹방이고 호수 딸린 빌라에서 백조 먹이나 주며 유유자적
백조는 오리만할줄 알았는데 하늘이보다 더 크네.


네덜란드식 독채 빌라 건물에 발코니앞이 바로 호수임.
1층은 거실
2층에 싱글 2개씩인 침실만 2개인데
내가 독방써야할 처지



데 아도미라루(The Admiral)

일본서 서양요리는 피할려고 했는데
하우스텐보스 내에 있기도하고
tabelog 현내 종합 순위 2위(글쓰는 지금은 1위)라 그 맛이 궁금해서 왔음.
1등 집은 규슈섬에 없고 대마도와 규슈 중간에 있는 이키섬 바닷가 횟집이라 애시당초 포기.
매번 요리가 서빙될 때마다 재료며 가공방법, 먹는방법(요거는 요기에 찍어 먹고…) 등등을 상세하게 알려 줌.


가족을 위해 고급 레스토랑을 통으로 빌렸음(사실은 메뉴판 열면서 떨었음.)

구글지도에서 위치가 잘못되어 있음. 하우스텐보스 입구쪽에 있는 것 처럼 되어 있지만, 실제로는 ‘호텔 유럽’의 1층에 있음

하우스텐보스

중앙 돔 토른 전망대에서


마지막 사진에서 앞에 건물이 데 아도미라루가 있는 ‘호텔 유럽’, 뒤에 호수가 있는 빌라가 ‘포레스트 빌라’

기타도 타고

배도 타고

하늘도 날았음.
단 35kg 안되는 하늘이는 하늘을 날진 못했다.

하우스텐보스내 일반인에게 분양되는 별장촌
최근 매물하나가 나왔고 18억 한다고함
선착순 1명(*보트는 별매)

마루타츠 라멘

2째날 하루종일 하우스텐보스에서 놀고 저녁을 먹기위해 택시를 콜해서 마루타츠 라멘으로 출발

이번 먹방 여행중 가장 기대하고 온 곳(○龍ラーメン)


라멘집 순위 1위
전체 순위에도 수위에 랭크 된 집.

문제는 애매한 주택가 가운데라 접근성이 나쁨.
600엔짜리 라멘에 택시비 2600엔 들었지만 전혀 아깝지 않음.

이번 여행에서 들른 가게 중 유일하게 구글맵에서 상호로 검색안되고 그냥 아파트로 나옴.
택시기사한테 대충 주소 갈쳐주고 라멘집이라고 하면 다 암.

들어오자 마자 한국인이냐고 물어보시고 한국어 공부 시작했다면서 한국어 교제 꺼내 보이심.

나가사키 시 야경

저녁으로 라면먹고 부랴부랴 기차타고 나가시키역에 내림
무료 셔틀은 끊겼고, 버스로 나가사키로 로프웨이 타는 곳으로 향함.

홍콩, 모나코와 더불어 세계 신 3대 야경이라고 홍보하는 나가사키 야경


도시 + 항구 + 페리 + 다리가 조합된 멋진 야경이긴 하나,
세계 최고의 야경을 위해서는 야근을 좀더 해야 쓰것네.

나가사키역 관광안내소에서 로프웨이 티켓을 20%할인해서 팔고 있으며, 나가사키 역에서 후치 진사로 가는 무료 셔틀도 있지만, 너무 늦게 도착해서 이용하지 못함. 로프웨이 내려오는 마지막 시간인 10시 로프웨이를 간싵히 타고 내려왔고, 나가사키역+주요 호텔을 도는 셔틀 버스가 기다리고 있지만, 예약없이는 못탐. 셔틀 앞에 장부를 들고 있는 할아버지한테 부탁하면, 셔틀에 여유가 있는 경우에 한해 즉석으로 셔틀 티켓을 발급해주고, 이를 셔틀 기사님께 주고 나가사키 역까지 올 수 있었음

QHY9 gain & offset 값 설정

2013-10-15   //   alexken작성   //   천문  //  1 Comment

이제 슬슬 다연장 로켓포를 설치, 가동하려고 한다.(작년 1차 발사는 실패, 올해 2차 발사 – 왠지 나로호랑 비슷한 느낌)
오랫동안 사진을 안찍으니, 다까먹고, CCD, Maxim 사용법도 가물가물 해져서, 나를 위한 매뉴얼을 하나 둘 씩 정리해 나갈 생각이다.
머리속에 지우개가 있는 건지…

Dr.QiuHY 에 의하면

Gain=0 and initial offset =125. And after you get images. you can adjust the offset to let the bias image background average value is apporx 1000. This is good for CCD’s dynamic range.

그러므로, 귀찮으면 gain=0, offset =125으로 사용하면 됨.
ASCOM 드라어버 설정을 하나도 건드리지 않으면, 기본

나와 비슷한 고민을 한 일본인의 글이 있다.

본문은 별 영양가 없고, 댓글에 좋은 글이 달려있다.

  • gain은 일반 디지털카메라의 ISO와 같은 개념이고, 과노출 시켜서 65535에서 포화되는 이미지를 얻으면, gain값은 손댈 필요가 없다.
  • offset은 bais 레벨로 SBIG은 100으로 고정되어 있다. bias를 찍어서 새까만 영상을 얻으면, 왠지 사진도 노이즈 없는 깨끗한 이미지를 얻을 것 같지만, 반대로, 어두운 대상의 영역이 0이하로 잘라먹은 경우가 된다. 기껏 어두운 곳까지 멀리가서, 비싼 냉각CCD를 이용하여, 장시간 노출을 한 노력/비용을 다 날려먹은 거다.

위의 Dr.QiuHY의 말대로, bias 배경이 1000 정도가 되게끔 offset을 설정하자.

이취임식

2013-09-13   //   alexken작성   //   기술, 인생  //  1 Comment

그동안 사용하던
메인 : iPhone 4S, 서브 : Blackberry 9900 조합에서
메인 : XPeria Z Ultra, 서브 : iPhone 4S 로 변경하게 되었다.

XPeria Z Ultra는 바다건너 홍콩에서 수요일날 도착했고, 하필 그날은 온통 iPhone 5S/5C 얘기만 하던날.
혼자서 “크고 아름다운” Z Ultra 에 하악하악.

외도는 이번 한번만.

Sony Bravia TV의 웹 EPG 만들기 (두번째)
XMLHttpRequest로 SOAP 메시지 보내기

2013-04-28   //   alexken작성   //   기술  //  No Comments

이전글에 이어서,

이전 방식(Ruby + Server)의 단점은 집에 웹서버를 운영해야 한다는 점이다.
NAS도 어엿한 웹서버이므로 크게 문제될 것은 없지만, 그냥 단말기에서 동작하도록, 즉 HTML측에서 동작하도록 javascript를 이용해 XMLHttpRequest로 soap메시지를 전달하도록 전부 재 작성하였다.

단순 웹페이지라, 브라우저만 있는 기기라면, 스마트폰/태블릿/PC 어디서나, iOS/Android/WP7.5/Windows/MacOSX 무관하게 동작할 것이나, 현재 하늘이 핸드폰인 Lumia 710(WP7.5)의 IE에서만 동작하지 않았고, 나머지 기기에서는 완벽 동작한다.
사용하기 정말 편하며, 만들어 놓고 아주 뿌듯해 하고 있다.

그럼 본문

ircc Command 목록을 조회하는 코드는 다음과 같다.
중요한 점은 “X-CERS-DEVICE-ID”라는 헤더에 TV에 페어링을 통해 등록된 Mac주소를 함께 전송해야 한다. 없으면 403을 반환한다.

var tv_ip = 'XXX.XXX.XXX.XXX';
var client_mac_addr = 'XX-XX-XX-XX-XX-XX';

function getRemoteCommandList(){
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://' + tv_ip + '/cers/api/getRemoteCommandList',true);
  xhr.setRequestHeader("X-CERS-DEVICE-ID", 'MediaRemote:' + client_mac_addr);
  xhr.onreadystatechange=function() {
    if(xhr.status == 200){
      if (xhr.readyState==4) {
        alert(xhr.responseText);
      }
    }else{
      alert(xhr.status);
    }
  }
  xhr.send(null);
}

getRemoteCommandList를 호출하면 TV는 아래와 같은 xml 형태로 리모콘 값에 해당하는 값의 Base64로 인코딩된 값을 반환한다.
전체 커맨드 목록은 이 글 맨 아래에 정리하였다.

< ?xml version="1.0"?>
<remotecommandlist>
 <command name="Confirm" type="ircc" value="AAAAAQAAAAEAAABlAw==" />
 <command name="Up" type="ircc" value="AAAAAQAAAAEAAAB0Aw==" />
 <command name="Down" type="ircc" value="AAAAAQAAAAEAAAB1Aw==" />
  ...
 <command name="OneTouchRecStop" type="ircc" value="AAAAAgAAABoAAABjAw==" />
 <command name="MuteOn" type="url" value="http://_:80/cers/command/MuteOn"/>
 <command name="MuteOff" type="url" value="http://_:80/cers/command/MuteOff"/>    
</remotecommandlist>

마지막 줄에 type이 “ircc”가 아닌 “url”인 MuteOn과 MuteOff가 있는데, 이 url 유형의 command는 soap으로 보내지 않고, 해당 url에 GET만 수행해도 동작하며, 요청 기기의 MAC주소도 확인하지 않는다.
즉 코딩할 필요 없이 웹브라우저에서 해당주소를 입력하고 Enter만 쳐도 동작한다는 얘기다.
특이점은 command는 MuteOn과 MuteOff가 있지만 MuteOff는 동작하지 않고, MuteOn만 토글 형태로 동작한다.
물리적인 리모콘 버튼에서도 [조용히] 하나만 있기 때문에 일맥상통한다.

[조용히]/[조용히 해제]에 해당하는 코드는 아래와 같다.
getRemoteCommandList함수와의 차이점은 커스텀 헤더인 “X-CERS-DEVICE-ID”는 필요치 않다.

function muteOnOff(){          
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'http://' + tv_ip + '/cers/command/MuteOn',false);
  xhr.send(null);
}

위에서 작성한 getRemoteCommandList()를 통해서 얻은 ircc code를 가지고 직접 리모콘 키를 누르는 것과 동일한 효과를 내는 함수는 다음과 같다. sendIrccCommand에 ircc 코드를 보낼때 마다 리모콘 키 하나를 누르는 행위와 일치한다.

function sendIrccCommand(ircc){
  var body =
    '< ?xml version="1.0"?>'+
    '<s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" '+
    ' s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'+
    '  <s:body>'+
    '    <u:x_sendircc xmlns:u="urn:schemas-sony-com:service:IRCC:1">'+
    '      <ircccode>' + ircc + '</ircccode>'+
    '    </u:x_sendircc>'+
    '  </s:body>'+
    '</s:envelope>';
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://' + tv_ip + '/IRCC',false);
  xhr.setRequestHeader('X-CERS-DEVICE-ID', 'MediaRemote:' + client_mac_addr);
  xhr.setRequestHeader('SOAPAction',     
                        '"urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"');
  xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
  xhr.send(body);
}

하지만 SBS를 튜닝하기 위해서는 디지털인 경우에 ‘6’, ‘.’, ‘1’과 같이 연속으로 3개의 키를 입력해야 한다.
sendIrccCommand를 좀더 추상화한 setChannel은 아래와 같고, 입력은 ‘6.1’, ‘10.1’ 과 같은 키 시퀀스에 해당하는 문자열을 입력으로 받는다.

function setChannel(ch){

  var num = [
            "AAAAAQAAAAEAAAAJAw==", //0
            "AAAAAQAAAAEAAAAAAw==", //1
            "AAAAAQAAAAEAAAABAw==", //2
            "AAAAAQAAAAEAAAACAw==", //3
            "AAAAAQAAAAEAAAADAw==", //4
            "AAAAAQAAAAEAAAAEAw==", //5
            "AAAAAQAAAAEAAAAFAw==", //6
            "AAAAAQAAAAEAAAAGAw==", //7
            "AAAAAQAAAAEAAAAHAw==", //8
            "AAAAAQAAAAEAAAAIAw=="  //9
  ];
  var dot = "AAAAAgAAAJcAAAAdAw=="  //.

  var c = ch.split("");
  for( var i in c ){
    switch(c[i]){
      case '.' :
        sendIrccCommand( dot );
        break;
      default:
        sendIrccCommand( num[ch[i]] );
        break;
    }
  }
}

더 보기 >>

Sony Bravia TV의 웹 EPG 만들기 (첫번째)
Ruby+Server 버전

2013-04-27   //   alexken작성   //   기술  //  3 Comments

집에 TV는 2년전 구입한 nx720이라는 Sony사 제품이다.
스마트폰에서 제어할 수 있도록 Media Remote라는 앱을 iOS용과 Android용으로 제공하고 있다.

그런데 Android용으로 TV SideView라는 새로운 앱을 제공하기 시작했다.
Media Remote가 리모콘의 단순 대체라면, TV SideView는 음성 컨트롤, EPG를 통한 채널 선택, 저장된 미디어 재생(PVR 모델의 경우)와 같은 새로운 UX를 제공하고, 이중에서 EPG를 통한 채널선택은 TV 사용에 있어 가장 자연스런 UX인거 같다.

그런데, 국가가 [일본/미국]인 경우에는 EPG를 보여주고 해당 채널을 선택할 수 있는 반면, 국가를 [한국]으로 설정해면 EPG 기능이 비활성화 되는 것에 광분하여 자체적으로 만들게 되었다.

조사해본 결과

Sony TV의 경우 IRCC라는 웹서비스를 제공한다.
리모콘 키의 IR 신호에 해당하는 ircc 코드를 HTTP 프로토콜로 SOAP 메시지로 전달하면 리모콘 키를 누른 것과 동일하게 동작한다.
IRCC의 경우에 범용적으로 표준화된 것은 아니고, Sony가 개발한 Sony의 Bravia 브랜드를 사용하는 TV, Blue-lay, PVR 기기에서만 활용되는, 그다지 범용적인 기술 표준은 아니었다.

적당히 EPG 정보를 대충 가져와 그냥 html로 알아서 아래와 같이 변환 후 화면을 터치하면, 해당 프로그램의 채널로 TV가 튜닝하도록 하였다.

ircc command를 soap으로 전송하는 가장 손쉬운 방법은 ruby cers_remote 라이브러리를 이용하면 되고, 웹 서버측 php에서 ruby를 통해 TV로 soap 메시지를 보내게 된다.

ircc가 동작 제한 조건으로

  • ircc의 soap 메시지 header에 TV에 기 등록된 기기의 MAC주소를 보낼 것
  • ircc 전송측과 TV가 동일 네트워크에 있을 것

이 중 MAC 주소는 기존에 Media Remote를 설치해서 TV와 패어링된 스마트폰/태블릿의 MAC 주소여야 하고,송신측이 TV와 동일 네트워크에 있어야 하려면, 웹버서를 집내에서 운영해야 한다.

#!/usr/bin/env ruby

require "cers_device"
tv_ip = "XXX.XXX.XXX.XXX"
paired_device_mac = "XX-XX-XX-XX-XX-XX"

command =
"1"=>"AAAAAQAAAAEAAAAAAw==",
"2"=>"AAAAAQAAAAEAAAABAw==",
"3"=>"AAAAAQAAAAEAAAACAw==",
"4"=>"AAAAAQAAAAEAAAADAw==",
"5"=>"AAAAAQAAAAEAAAAEAw==",
"6"=>"AAAAAQAAAAEAAAAFAw==",
"7"=>"AAAAAQAAAAEAAAAGAw==",
"8"=>"AAAAAQAAAAEAAAAHAw==",
"9"=>"AAAAAQAAAAEAAAAIAw==",
"0"=>"AAAAAQAAAAEAAAAJAw==",
"."=>"AAAAAgAAAJcAAAAdAw=="
}

device = CersDevice.new(tv_ip,paired_device_mac)

if __FILE__ == $0
  ARGV[0].split(//).each{|x|
    device.send_ircc(command[x])
    sleep 1
  }
end

위 파일을 setch 라고 저장하였다면 터미널에서

$setch 11.1

로 채널전환 가능하며, 이를 서버측에서 불러주면됨

HTML5:getUserMedia를 이용한 초간단 웹캠 뷰어를 Nexus7에서

2013-03-12   //   alexken작성   //   기술  //  3 Comments

1년전에 HTML5:getUserMedia를 이용한 초간단 웹캠 뷰어란 글을 쓴적이 있다.
그런데 모처럼 들어가 보니 동작을 하지 않는다.
이유는

  navigator.webkitGetUserMedia("video", success);
  ==>   navigator.webkitGetUserMedia({video:true}, success);

webkitGetUserMedia 첫번째 인자가, 문자열 “video” 가 아니라, JSON 객체 {video:ture}로 넘기도록 좀더 표준에 가까워 졌다.
하지만, webkitGetUserMedia와 webkitURL처럼 webkit prefix는 여전히 붙여줘야 함.

아래와 같이 코드를 수정해서 다시 동작하도록 해놓음.

< !DOCTYPE html>
<html>
  <body>
    <video id="myvideo"  autoplay></video>
    <script type="text/javascript">
      var video = document.getElementById('myvideo');
     
      if(navigator.webkitGetUserMedia){
        navigator.webkitGetUserMedia({video:true}, success, fail);
      }else{ 
        navigator.getUserMedia({video:true}, success, fail);
      }
   
      function success(stream){
        if(window.webkitURL){
          video.src = window.webkitURL.createObjectURL(stream);
        }else{
          video.src = window.URL.createObjectURL(stream);
        }
      }

      function fail(err){
        console.log("The following error occured: " + err);
      }
    </script>
  </body>
</html>

더 보기 >>

페이지:«1234567...43»