음성인식 스마트 거울 만들기

일전에 본인이 스마트거울을 만든 적[1]이 있는데, 재주 많은 사람들이 이 기능을 넘어서 음성인식이 되는 스마트 거울을 만든 걸 몇 개[2,3] 봤다. 헐! 이걸 보니 나도 한 번 만들어 보고 싶어 좀이 좀 쑤셨다-_- 근데 정말 짧은 지식으로 이걸 구현하려니 알아야 할 게 너무 많고, 시행착오도 무지하게 많이 했다. ㅋㅋㅋ

[2]에 설치과정에 대한 매우 친절한 설명이 있으나 결국 실패했다. 설명을 쭉 봤는데, 중간에 구글 개발자 등록을 해서 음성 api를 개설해야 하는 과정이 있어서 좀 걸렸다. 그리고 따라하다보니 뭔가 컴파일 에러인지 생기는데, 이걸 해결할 재주가 본인에게는 없어 포기…-_-

여하간 본인이 구현한 음성인식 스마트 거울은 크게 세 부분으로 구성되는데,

  1. 사람이 발화하면 이것을 텍스트로 변환 (speech to text; stt)
  2. 각 텍스트에 맞는 처리 (javascript와 perl 사용)
  3. 처리 결과를 음성으로 출력 (text to speech; tts)

그래서 ‘거울아~’ 하고 부르면 ‘네 주인님’ 하고 대답을 하는 거울을 만들고 싶어졌다. ㅋㅋ 참고로 Snow White에서 Evil Queen이 Magic Mirror를 부르는 대사가 뭘까 검색해 봤는데, ‘Mirror, mirror, on the wall’ 인 듯… ㅋ

원래 본인의 계획으로, tts 부분은 안면이 있는 여고생-_-한테 부탁해서 지정된 대사를 녹음한 뒤, mp3파일을 출력하는 방식을 검토하고 있었다. (엄밀히 말하면 tts는 아니지만…) ㅋㅋㅋ 그런데 responsive voice라는 사이트[4]에서 자바스크립트로 tts를 구현할 수 있도록 제공하는 라이브러리를 제공하는데, 음성합성 성능이 대단하다! 비상업적인 개인 사용에 한해 무료이고 자바스크립트만으로 전부 다루는게 가능하므로 사용이 매우 간단하다. 그래서 tts는 쉽게 해결할 수 있었다.

문제는 stt부분인데, 웬만하면 한국어로 구현하고 싶었기 때문에 이게 매우 간단치 않은 문제였다. jasper, voice command 등등 여러 방법이 있다고 하는데, 이 모두 본인의 지식 부족으로 전혀 다룰 수가 없었다-_- 다행히 개중에 annyang[5]이라는 자바스크립트 라이브러리가 자바스크립트 만으로만 작동하고, 한국어 인식 부분에서 꽤 괜찮은 성능을 가지고 있어서 이를 중심으로 여러가지로 고려해 봤다. 헌데 마이크 입력을 웹브라우저가 직접받아야 했는데, 이게 크롬/크로미움 브라우저만 가능했다. 그건 그렇다 치더라도 라즈베리 파이에서 크롬을 작동시킬 수 없기 때문에, 필연적으로 크로미움을 사용해야 했는데, 크로미움에서는 https 사이트가 아니면 마이크 퍼미션을 정상적으로 얻지 못하는 문제가 있었다. 이 부분을 해결하지 못하여 결국 라즈베리 파이로 구현하는 것을 포기하고 말았다.

검색해보니 어떤 일본사람이 raspberry pi + ubuntu mate + electron + annyang 으로 일본어 음성인식을 구현하는 것[6]을 봤는데, 이걸 따라 해 보고 싶었다. 참고로 electron[7]은 웹 언어만으로 크로스 플랫폼 데스크탑 앱을 구현하는 툴이라고 한다. 근데 electron을 어떻게 다루는지 매뉴얼을 봐도 도저히 이해가 안 돼서 이 방법도 포기…-_-

결국 좀 어이없게도 최후의 방법으로 예전에 사놓고 안 쓰고 있던 8인치 크기의 윈도우8 태블릿(도시바 encore)에 micro hdmi 케이블을 물려서 디스플레이를 구현하고, 여기에 구글 크롬 브라우저를 풀스크린 모드로 실행하는 방법을 썼다-_- 대신, 웹사이트는 내부 네트워크 안에서 raspberry pi 2에 아파치2 서버로 구동시키고, 옥션에서 파는 만원짜리 스마트폰용 마이크를 태블릿에 달아서 음성인식률을 좋게 만들었다.

그 결과….

유튜브에 여러 음성인식 시연 영상이 있는데, 하나같이 그다지 실용적으로 보이지 않았다. 아무 음성이나 반응하지 않고 지정된 시기에 음성인식을 시작할 수 있도록 모션인식이나 hot word를 지정하는 것이 보통이다. (ok google이나 alexa같은…) 처음에는 ‘거울아’로 지정하고 만들었는데, 이런거 실제로 쓰려면 꽤 귀찮다. 실제로 만들어보니 기기가 소리에 그닥 민감하지 않은 듯 하여, 본인은 hot word를 아예 없앴다-_- 걍 아무때나 일하다가 거울쪽으로 ‘뉴스’라고 외치면 뉴스를 읽어주는 편이 본인에게는 더 실용적이었다.

어떤 메뉴가 실용적일지 궁리를 많이 했는데, 가끔 계산기 누르기 귀찮아서 곱셈과 덧셈을 외치면 (예를 들어 ‘십이 곱하기 십삼’) 계산해 주는게 실용적일 듯 하다. 근데 숫자 인식 성공률이 은근 낮아서…-_-

 


2016.11.6
드디어 아무 상장된 회사 이름을 외치면 그 회사의 주가와 전일 등락을 말해주는 기능을 만들었다. ㅋㅋㅋㅋ 코드 짜느라 무지 힘들었다. ㅋㅋㅋ 회사 이름 인식률이 생각 이상으로 상당히 정확하다. 거의 틀리지 않는다. annyang 이거 대단하구만!

 


2016.11.9
크롬 브라우저를 매번 실행할 때마다 f11키를 누르기가 번거로운데, 상당히 유용한 팁이 있다.

크롬경로/chrome.exe --kiosk url주소

라고 써 주면 실행즉시 풀스크린이 된다.
참고로 자바스크립트 만으로는 보안 문제 때문에 브라우저 실행 즉시 풀스크린이 안 된다는 사실.

또 웹페이지 css 안에
html { cursor: none; color: #2299aa; background-color: #000000; }
라고 써 주면, 배경은 검게되고 자동으로 커서가 보이지 않아 마우스를 굳이 조작할 필요가 없다.

 


2016.11.18
‘중국어’라고 외치면 동아일보에서 제공하는 일일 중국어[8]를 보여주는 기능을 만들었음. ㅋㅋㅋ

참고로 css 안에
img { -webkit-filter: invert(1); filter: invert(1); }
라고 쓰면 이미지 색상이 반전되어 나오므로 외부 이미지를 거울에 맞춰 변형할 필요가 없게 된다. 물론 기존의 이미지들을 전부 반전시켜 놔야 한다. ㅋ

 


2017.4.9
오늘 테스트해보니 크로미움에서 annyang이 정상작동하지 않는 현상이 수정된 것 같다. 이제 라즈베리 파이에서 작동되는 스마트 거울을 만들 수 있을 듯. ㅎㅎㅎ

 


[1] 내 백과사전 스마트 거울 만들기 2016년 1월 30일
[2] https://docs.smart-mirror.io
[3] http://jeongchul.tistory.com/423
[4] http://responsivevoice.org/
[5] https://www.talater.com/annyang/
[6] Raspberry Pi と Electron で自立型の音声アシスタント by ポンダッド
[7] http://electron.atom.io/
[8] http://news.donga.com/DailyLanguage?g=3

Advertisements

스기하라의 원기둥 착시

위키피디아의 Best Illusion of the Year Contest 항목에 따르면 Neural Correlate Society에서 해마다 착시 대회를 여는 모양인데, 위키피디아에 나온 연도별 수상 목록을 보니, 지원자가 별로 없는지는 몰라도 해마다 수상하던 사람이 계속 수상하는 듯-_-

올해 2016년 준우승 작품으로 스기하라 코이치라는 사람이 출품한 원기둥 착시인데, 이거 꽤 신기방기하다. 함 보시라.

처음 봤을 때는 그 원리를 눈꼽만큼도 짐작을 못해서 무척 흥분했었다-_- 원리를 짐작할 수 있으신지?

Dickinson 대학의 수학교수인 Dave Richeson 선생의 블로그 Division by Zero에서 그 원리를 간단히 설명하는 포스팅[1]을 하고 있으니 함 보시라.
xyzpic
이 그림 하나가 전부 설명하고 있다고 할 수 있다. 좌표공간에서 xy평면 위에 원과 정사각형을 깔았을 때, 두 시점을 통과하는 직선이 같은 평면에서 만나는 교점을 매개변수로 표현하면 된다. 뭐 계산은 귀찮으니 각자 해 보시라-_-

원리를 응용하면 보이는 도형과 거울에 비치는 도형을 나타내는 공간 곡선을 매개변수로 표현하는 계산을 만들 수 있는데, Richeson 선생이 이와 관련하여 실제로 만들어보는 포스팅[2,3]을 했으니 재미로 읽어볼만하다. 원리를 모를 때는 흥분했는데, 원리를 다 알고 나니 귀찮아서 만들고 싶지는 않아진다-_-

 


[1] Sugihara’s Circle/Square Optical Illusion in Division by Zero
[2] Make a Sugihara Circle/Square Optical Illusion Out of Paper in Division by Zero
[3] Two More Impossible Cylinders in Division by Zero

대형스크린에서 러브라이브 실행하기(?)

지난 2월말에 JR 아카하바라 역에서 러브라이브 체험 이벤트를 했는데, 거기에서 대형스크린으로 게임을 할 수 있다고 하는 소식을 들었다. 뭐 가보고 싶긴 했지만 갈 수는 없고, 내가 직접 대형 터치스크린을 만들어서 게임을 해보자는 생각이 들었다. 아.. 이게 고난의 시작이 될 줄이야…-_-

일단 대형 터치스크린이 필요한데, 일반적인 소형 터치스크린은 주로 감압식과 정전식이 있다. 감압식은 아이폰 이전에 많이 쓰던 방식인데, 잡스 형님의 혜안 덕분에 이제는 거의 자취를 감춘 듯. ㅋㅋㅋ 정전식은 희토류인 인듐을 사용하므로 디스플레이 면적이 넓어지면 단가가 급격히 올라가는 단점이 있다. 그러므로 대형 터치스크린으로는 두 방식과는 또 다른 적외선 방식이 단가가 많이 싸다. 대신 분해능이 떨어져서 1센치 미만의 근접된 두 개의 터치는 하나로 인식한다는 단점이 있다. 본인이 가지고 있는 27인치 엘지 모니터의 크기에 완전 딱맞는 적외선 터치스크린 중고제품을 20만원정도 주고 옥션에서 하나 구입했다.

27인치 대형 터치스크린을 모니터에 붙여봤는데, 잘 작동한다. 와 사이즈가 크니까 똑같은 작동이라도 느낌이 다르다. 완전 재미있구만 ㅋㅋㅋㅋ 터치스크린이 유리같아서 빛반사가 좀 있는데, 한 번 붙이면 떼기 어렵기 때문에 신중히 결정해야 한다.

이제 안드로이드 앱 러브라이브!를 실행하여 비디오를 모니터에 출력하고 터치 입력으로 usb 적외선 터치스크린 입력을 받아야 했는데, 이게 쉽지 않은 작업이었다.

1차시도 :
노트북에 android-x86을 설치했는데 UEFI때문인지는 몰라도 아무리 해도 grub가 설치 안되는 것이었다. 아 진짜 이것 때문에 sata 소켓을 몇 번 빼고 부팅하고 했는지 모르겠다.

2차시도 :
옛날에 사 놓은 windpad에 android-x86을 설치 시도했다. 다 잘 되는데 아무리해도 외부 hdmi 비디오 출력이 안되는 것이었다. 아놔.

3차시도 :
이번에 좀 더 머리를 써서 노트북에 android-x86이 설치된 usb 스틱으로 부팅을 시도했다. android-x86의 부팅 실패 및 프리징 현상이 일어나서 관뒀다. 좀 더 검색하면 될 듯도 하지만 이미 엄청난 시간을 써서 포기.

4차시도 :
예전에 사 놓은 mk802ii 스틱형 안드로이드에 설치를 시도했다. 사양이 낮아서 좀 느리긴 했지만 터치스크린을 잘 인식했다. 근데 디스크 용량부족으로 게임이 실행 안된다. 게임이 차지하는 용량이 1G를 넘어서는줄 몰랐다-_- 젠장

5차시도 :
옥션을 뒤져서 크라이저 ultracube u4x+ 안드로이드 머신을 구입했다. 터치스크린도 인식되고 다 좋았는데, 게임이 기기를 루팅된 기기로 인식하여 앱이 아예 실행이 안 되었다. 루팅도 안 했는데 왜??? 인터넷을 뒤져서 존재하는 모든 루팅 우회법을 싹다 시도해 봤으나 모조리 실패-_- 열받아서 제조사에 전화를 걸어 문의 시도했으나 도움을 줄 수 없다는 답변만… 다른 모바일 게임을 설치해보니 잘만 실행되는게, 완전 초대형 태블릿인데 안타깝다.

6차시도 :
한 번 더 옥션을 뒤져서 mk802iv 스틱형 안드로이드 머신을 샀다. 근데 다 잘되다가 usb 터치스크린을 인식 못하는게 아닌가! ii도 되는데 왜 iv가 안 되는 건가?? 안드로이드용 터치스크린 드라이버를 찾아서 내가 컴파일을 할까 생각해봤는데, 와 이건 너무 능력 부족이라 포기했다ㅠㅠ 여기에 커스텀 펌웨어를 설치해서 시도해보려 했는데, 하도 많이 커스텀 펌웨어를 깔아봤더니만 벽돌-_- 됐다.

7차 시도 :
windpad에 루분투를 설치하여 android-x86이 설치된 파티션을 마운트하여 grub을 편집하면 hdmi 모니터로 외부 비디오 출력이 가능하기 때문에, 루분투를 설치했다. 뭐 루분투는 골백번도 더 설치해본거라서 쉽사리 됐는데, 본인이 windpad를 하도 많이 마개조를 해놔서ㅋㅋㅋ 그런지는 몰라도 갑자기 m-pci에 꽂힌 무선 랜카드가 먹통이 되는게 아닌가?! 와 이것 때문에 또 시간 엄청 잡아먹었다. 여하간 android-x86의 hdmi 비디오를 출력하게 만드는데 성공했는데 supersu 앱이 설치가 안 되는 것이었다. 이게 설치 돼야 루팅을 감출 수 있었기 때문에 필수적이었는데, 아무리 용을 써도 안된다… 아..

8차 시도 :
중고 넥서스 플레이어를 하나 구입했다. 별로 인기가 없는건지 꽤 싸다. 혹시나 싶어서 이걸 usb 터치스크린에 연결해봤는데, 터치를 인식하지 못했다. 뭐 거실 TV용 기기다보니 터치스크린 드라이버를 제거하는 것이 당연한 것이긴 하지만, 꽤 실망했다. 그래서 바로 언락하고 루팅해서 그냥 안드로이드 처럼 보이는 커스텀 펌웨어를 깔고 다시 시도해봤는데, 역시나 커스텀 펌웨어에서도 터치스크린이 작동하지 않았다. 와 절망적이다.

그래서 결국 포기… ㅠㅠ

 


여담이지만, 넥서스 플레이어 이거 완전 계륵이다. 게임을 할 수 있는 것 처럼 선전은 하고 있는데, 컨텐츠는 절대 부족이다. 다만 유튜브 보는 것은 꽤 편하다. 음성인식은 좀 신기방기하다. 크롬 캐스트 기능도 겸하고 있어서 이 부분은 편하다. ㅋㅋ 유튜브 많이 보는 사람이나 크롬 캐스트 많이 쓰는 사람 외에는 그닥 쓸만하지 않을 법 하다. ㅋ 언락해서 넥플용 CyanogenMod 커펌을 깔아봤는데, 걍 정식 펌웨어와 인터페이스는 거의 똑같고 활용면에서 별반 차이가 없다.

스마트 거울 만드는 법

일전에 스마트 거울 만들기 이야기를 한 적이 있는데, 어떻게 만드는지 문의하는 사람이 있어서 별도의 포스트를 작성한다. 사실 원 글에 만드는 과정이 거의 다 설명이 돼 있는데, 일기처럼 써 놓아서 아무도 읽지 않는 듯 하다.ㅋ 사실 본인의 시행착오 과정을 따라할 필요가 없으니, 요약해서 설명하는 글을 하나 작성해 보았다.

caveat : 순서대로 끝까지 읽어보고 한 부분이라도 무슨 말인지 이해가 안 되면 포기하시오. 이 포스트 만드는 데도 시간 꽤 걸렸는데, 더 자세한 설명은 안할 거임. ㅋ

  1. 설치하려는 장소는 wifi 신호가 닿는 장소이어야 한다.

    사실 유선으로도 설치가 가능하긴 한데, 거울에 연결된 선이 많으면 미관상 별로니까 이 글에서는 무선으로 인터넷을 연결할 것이라고 가정한다. 집에서 무선 공유기를 안 쓰는 사람은 걍 포기하시오 ㅋ

  2. hdmi 입력이 가능하고, 벽에 걸 수 있을 만한 무게의 모니터를 준비한다.

    뭐 벽에 걸지 않고 쓰려는 사람은 더 큰 것을 준비해도 된다. 근데 모니터가 너무 두껍거나 무거우면 벽에 걸기 좀 힘들어 질 듯 하다. 본인은 가능한 가장 얇고 가벼운 것을 선호했으므로 on-lap 2501c를 이용하였다. 근데 이거 좀 비싸다-_-

    만약 모니터의 hdmi 또는 dvi 연결부위가 모니터 뒤쪽으로 돌출된 형태라면 케이블을 연결한 후 벽에 붙이기 난감한 상황이 된다. 꺾어지는 젠더를 알아서 구입하시라.

  3. 반사율 60%~70% 정도의 모니터보다 넓은 크기의 반투명 거울을 준비한다.

    A3 사이즈면 적당할 듯. 본인은 http://www.atostore.com/ 에서 구매하였다. 자기가 쓰고 싶은 사이즈로 잘라서 보내달라고 하면 보내줄 것 같다.

  4. 라즈베리 파이를 준비한다.

    기종은 아무거나 괜찮음. 어차피 x윈도우 띄우면 걍 계속 켜놓기만 할 거라서, 성능은 중요하지 않다.

    1. 라즈베리 파이3가 아닌 사람은 usb 타입의 무선 랜카드를 구매한다.

      왜냐하면 파이3는 내장된 무선 랜카드가 있어서 필요없는데, 옛날 기종은 없으므로 인터넷에 연결하려면 필요하다.

    2. 파이에 부팅할 때 쓸 sd 카드를 준비한다.

      제일 오래된 기종인 파이A 또는 파이B는 그냥 sd 카드를 이용하고, 파이2와 파이3는 마이크로 sd 카드가 필요하다. 용량은 4기가 바이트 이상이 필요하다. 근데 4기가도 살짝 빡빡하니까 8기가 이상을 구입하는 것을 권함.

    3. usb 타입의 키보드와 마우스를 준비한다.

      이거 없는 사람은 없겠지-_-

  5. 검은 종이를 구입한다.

    반투명 거울이 모니터보다 크면 나머지 부분을 가려야 거울처럼 보인다. 모니터 사이즈랑 거울 사이즈랑 똑같으면 안 사도 됨.

  6. 거울 크기의 액자를 구입한다.

    daum 지도로 자기 동네 주변의 표구사를 검색한다. 그리고 모니터와 거울을 들고 가서 이걸 둘러 싸는 프레임 액자를 하나 짜 달라고 주문하면 된다. 본인은 3만원 줬음-_- ㅋ

준비물은 여기까지고, 인제 리눅스에 대한 지식이 약간 필요하다. ㅋ 뭐 본인도 리눅스에 대해 잘 알아서 한게 아니고 다 검색해서 알아낸 것이므로 막히면 검색을 잘 활용하자.

  1. sd 카드에 raspbian jessie를 설치한다.

    라이트 버전을 설치하면 안된다. x윈도우가 들어있지 않으므로 웹브라우저 (콘솔용 텍스트 웹브라우저 같은 걸로 딴지 걸지 맙시다 ㅋ)를 띄울 수가 없다. 좌측의 풀버전을 설치하시라. 설치 방법은 Win32 Disk Imager 같은 걸로 디스크 이미지를 통째로 쑤셔 넣기만 하면 되는데, 자세한 방법은 검색하면 무지하게 나온다. 디폴트 계정은 pi, 패스워드는 raspberry 이다.

  2. 화면 회전법

    가로로 써도 상관없긴 한데 ㅋㅋㅋ 가로로 긴 거울을 쓰는 사람은 별로 없으니 화면을 회전시켜야 한다.
    /boot/config.txt
    를 열어 맨 마지막 줄에 display_rotate=1를 추가하고 재부팅한다. 참고로 2는 180도 회전, 3은 270도 회전이다. 필요하면 3을 써도 된다.

  3. 미도리 설치

    웹브라우저를 전체화면으로 만드는 단축키는 F11인데, 이건 거의 모든 브라우저에서 통한다. 기본으로 내장된 에피파니 브라우저는 풀스크린으로 만들면 화면 테두리에 흰 라인이 추가되어 보기가 좋지 않다. 그래서 미도리 브라우저를 설치한다. 설치방법은 콘솔창을 띄워서 다음을 입력한다.
    sudo apt-get install midori
    뭐 선호하는 브라우저가 있으면 그걸 써도 무방하다.

    그리고 매번 부팅할 때마다 미도리를 실행하기가 귀찮을 수 있으므로 /home/pi/.config/autostart 에다가 단축아이콘을 넣어둔다.

  4. 아파치2 설치

    라즈베리 파이를 웹서버로 만들면 된다. 개인적으로 쓰는 웹서버가 있으면 그걸 걍 써도 되는데, 인터넷 접속이 원활하지 못하면 가끔 404 에러가 나서 불편하다. 웬만하면 아파치를 설치하는 게 좋다. 설치법은 콘솔창에 다음을 입력
    sudo apt-get install apache2

  5. 아파치2 루트 디렉토리 수정과 cgi 허용

    먼저 웹서버의 루트 디렉토리와 cgi 디렉토리를 만들어 둔다.
    /etc/apache2/sites-available/000-default.conf 파일을 열면 루트 디렉토리 값이 보인다.
    DocumentRoot /var/www/html
    를 다른 경로로 변경하고 그 아래쪽에 다음을 추가한다.

    <Directory 변경된 경로>
    Order allow,deny
    Allow from all
    Require all granted
    </Directory>

    ScriptAlias /cgi-bin/ 변경된cgi경로
    <Directory “변경된cgi경로”>
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
    </Directory>

    그냥 ctrl-c로 카피하면 따옴표가 이상한 캐릭터로 바꾸니까 카피해서 수정 필요함.

    그리고 ls /etc/apache2/mods-enabled/ | grep cgi
    라고 해서 cgid.load가 걸리지 않으면
    ln -s /etc/apache2/mods-available/cgid.load /etc/apache2/mods-enabled/
    ln -s /etc/apache2/mods-available/cgid.conf /etc/apache2/mods-enabled/
    라고 입력한다.

  6. 모니터 절전모드 해제

    스마트 거울이 절전모드로 꺼지는 경우를 방지한다.
    /etc/kbd/config 를 열어
    BLANK_TIME=0 (디폴트 30)
    POWERDOWN_TIME=0 (디폴트 15)
    으로 수정 후
    sudo service kbd restart
    하면 된다.

  7. LWP::Simple 설치

    콘솔창을 열어
    perl -MCPAN -e’install “LWP::Simple”‘
    라고 입력하고 한참 기다리면 된다-_- 설치 초 오래 걸리니까 유선랜을 연결해서 하는 것을 추천함.

  8. 한글 폰트 설치

    스마트 거울에 한글이 나올 필요가 없는 사람은 이 과정을 패스해도 된다. 콘솔 창에 다음을 입력
    sudo apt-get install ttf-unfonts-core ibus ibus-hangul

  9. 마우스 포인터 사라지게 하기

    라즈비안을 최초 부팅하면 마우스 포인터가 중앙에 위치한다. 뭐 마우스를 움직여서 구석으로 몰면 되긴 하지만, 부팅할 때마다 마우스 조작을 하는게 은근 귀찮다. unclutter를 설치하면 일정시간 이상 움직임이 없는 마우스 포인터는 안 보이게 되므로 편리하다.
    sudo apt-get install unclutter
    으로 설치한 다음
    /etc/rc.local
    파일을 열어 맨 마지막 행에 unclutter 라고 추가하면 부팅할 때마다 실행된다.

  10. 날씨 아이콘 준비

    검색해보면 날씨 아이콘들은 많은데, 대부분 배경이 흰색임을 가정하고 있기 때문에 스마트 거울에 맞지 않다. 본인이 대충 편집해서 쓰고 있는 아이콘들을 업로드해 둔다.

  11. clouded half_snow little_cloud rainy snow sunny thick_cloud

  12. perl 코드 입력

    cgi 경로에 파일을 하나 만들어서 다음 perl 코드를 입력한다.

#!/usr/bin/perl

use LWP::Simple;
use Encode;

print <<HTMLA;
Content-type: text/html


<html><head>
<title>smart mirror</title>
<meta charset="utf-8">
</head>
<script type="text/javascript">
<!--
setTimeout("history.go(0);", 300000); //300초마다 리프레시

setInterval("dpTime()",1000);

function dpTime(){
  var now = new Date();

  years = now.getYear();
  years = years + 1900;
  months = now.getMonth();
  months = months + 1;
  dates = now.getDate();
  days = now.getDay();
  hours = now.getHours();
  minutes = now.getMinutes();
  seconds = now.getSeconds();

  var names = ["일", "월", "화", "수", "목", "금", "토"];
  if (hours > 12){
    hours -= 12;
    ampm = "오후";
  }else{
    ampm = "오전";
  }
  if (hours < 10){
    hours = "0" + hours;
  }
  if (minutes < 10){
    minutes = "0" + minutes;
  }
  if (seconds < 10){
    seconds = "0" + seconds;
  }
  document.getElementById("dpTime0").innerHTML = years + "년 " + months + "월 " + dates + "일 " + names[days] + "요일";
  document.getElementById("dpTime1").innerHTML = ampm;
  document.getElementById("dpTime2").innerHTML = hours + ":" + minutes + ":" + seconds;
}
//-->
</script>
<body bgcolor="#000000" text="#2299aa" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0">
<table border=0 cellspacing=5 cellpadding=5 width="100%" height="100%"><tr><td valign="top">
<font size=+2>

HTMLA

##################### 네이버 증권
$html = get( "http://finance.naver.com/sise/sise_index.nhn?code=KOSPI" );
unless ( $html ) {
print "404 not found";
}

@all=split("\n", $html);
$num=@all;

print <<END;
<span id="dpTime0" style="font-size:30px"></span>
<br><span id="dpTime1" style="font-size:30px"></span>
<span id="dpTime2" style="font-size:50px"></span>
<br>코스피 현재 :<span style="font-size:50px">
END

for($i=0;$i<$num;$i++) {
 if($all[$i] =~ m/<em id=\"now_value\">/) {
  $all[$i] =~ s/<em id=\"now_value\">//;
  print "$all[$i]</span>";
 }
 if($all[$i] =~ m/id=\"change_value_and_rate/) {
  $all[$i] =~ s/<span class=\"blind\">(.*)<\/span>//;
  print $all[$i];
 }
}

print "</span><br>--------------------\n<br>";

#####################  날씨

$html = get( "http://www.kma.go.kr/mobile/for_02_view.jsp?s1=11&s2=11170&s3=1117052000" );
# 자기가 사는 동네로 수정

unless ( $html ) {
print "404 not found";
}

$html = encode("UTF-8", $html ); #한글 검색을 위해 필요

@all=split("\n", $html);
$num=@all;
$temp=0;
$temp2=0;

for($i=3;$i<$num;$i++) {
 if($all[$i] =~ m/시각 /) {
  $temp++;
 }
 if($all[$i] =~ m/\[오늘\]/) {
  $temp2++;
 }

 if(($temp > 0  && $temp <4) && $temp2 <2) {    #항상 날씨 세 개만 출력
  $all[$i] =~ s/구름 많음/<img src="http:\/\/localhost\/image\/thick_cloud.png">/;
  $all[$i] =~ s/구름 조금/<img src="http:\/\/localhost\/image\/little_cloud.png">/;
  $all[$i] =~ s/맑음/<img src="http:\/\/localhost\/image\/sunny.png">/;
  $all[$i] =~ s/흐림/<img src="http:\/\/localhost\/image\/clouded.png">/;
  $all[$i] =~ s/비/<img src="http:\/\/localhost\/image\/rainy.png">/;
  print "$all[$i]\n";
 }
}

print <<END;
</p>
</td></tr>
<tr><td align="right" valign="bottom" style="padding:0 20 50 0">
<span style="font-size:50px">You Look Nice!</span>
</td></tr></table></table>
</html>
END

귀찮아서 114번째 줄 부터 날씨 아이콘 부분의 코드가 덜 완성되었는데, 텍스트를 이미지로 바꾸는 것 뿐이므로 알아서 수정하면 된다.

자세한 내용은 다음 두 글을 참고하삼.
http://michaelteeuw.nl/post/ … e-end-result-of-the-magic
http://blog.dylanjpierce.com/raspberrypi/ … gic-mirror.html

스마트 거울 만들기

웹서핑을 하다 보니 거울 뒤쪽에 오늘의 날씨나 시간이 나오는 신박한 거울을 만든 사람들 이야기를 봤다. 이를테면 이런 글들[1,2]이다.

완전 신기방기 하다. 위 두 블로그에서 만드는 방법을 상당히 상세히 설명하고 있어서, 나도 만들고 싶어서 좀이 쑤시기 시작했다. ㅋㅋㅋㅋ

원리는 간단한데, 컴퓨터 모니터 위에 반투명 거울을 붙이면 된다. 반투명 거울이 신박한 물건인데 ㅋㅋ 취조실 같은데서 한쪽으로는 거울로 보이고 반대편에서는 투명한 유리 처럼 보이는 것이다.

일단 네이버 중고나라에서 대충 싼 가격에 중고 모니터를 하나 구했다. 크기는 18.5인치 짜리 싸구려 모니터이다. 그런데 반투명 거울을 어디서 구할지 막막했는데, 이리저리 검색해보니 ATO스토어 라는 웹사이트[3]에서 반투명 거울을 팔고 있었다. 인터넷으로 주문하면 된다.

주문하기 전에 전화로 물어보니 사이즈를 미리 알려주면 거기에 맞는 견적을 내서 잘라서 배송해 준다고 한다. 모니터를 분해해서 안쪽 LCD 패널의 치수를 정확히 잰 후에, 주문하니 진짜 딱 맞춰서 잘라 배송해 줬다. 본인이 주문한 크기는 A3 사이즈와 비슷해서 A3 가격을 내고 샀다.

반투명 거울 이거 완전 신기방기 하다. 환한데서 보면 걍 유리판 같은데, 건너편이 어두우면 딱 거울 같다. ㅋㅋㅋㅋ

위 사이트에서는 반사율 60%를 팔고 있었는데, 판매하시는 분의 말을 빌면 실제로는 61%~65% 정도라고 한다. 검색해보니 60%보다 반사율 70%가 더 낫다고 얘기하는 사람도 있다. 근데 본인이 위 사이트에서 구입한 것을 써보니 완전 거울처럼 보여서 그럭저럭 괜찮은 듯 하다. 모니터 밝기를 일단 최대로 올려봤는데, 조금 낮추거나 적절히 보정하면 괜찮을 듯.

모니터에 띄울 컨텐츠가 문제인데, 본인이 가진 라즈베리 파이 B[4]를 활용하기로 했다. 라즈베리 파이 이거 은근히 활용도가 높은 듯 ㅋㅋㅋ 근데 라즈베리 파이의 sd카드에 배드섹터가 있는 건지 부팅 실패가 너무 잦다. 젠장 완전 사람 삽질하게 만든네…

여하간 본인이 할 줄 아는게 perl 뿐이라, 일전에 산 파이2[5]를 개인 웹서버로 돌리고 있는데, 거기다가 이리저리 컨텐츠를 띄우는 페이지를 만들어서 파이B에 x window를 실행해서 영상에 송출하는 방식을 고려하고 있다. 아직 안 만들었는데, 좀 삽질해야 할 듯-_- 나도 스마트 거울 하나 가지고 싶다!!!

 


2016.2.2
스마트 거울 만들었는데, 정작 벽에 걸 수 없어서 세워 두고 있다-_- 라즈비안에 기본 내장된 에피파니 브라우저로 풀스크린을 만들면 테두리에 흰 색 라인이 생겨서 야간에 보기 좋지 않다. 미도리를 설치하면 그런 현상이 없어진다.
sudo apt-get install midori

 


2016.2.29
기존에 쓰던 모니터는 너무 무거워서 좀 가벼운 모니터가 없을까 검색해보니 위메프에서 휴대용 모니터 on-lap 2501c를 5%할인해서 팔길래 잽싸게 주문했다. 크기는 15인치인데, 거울보다 작기 때문에 구석에 몰아서 붙이고 뒤쪽에 검은 색 종이를 사서 나머지 부분을 메웠다.

동네 표구사에 가서 거울 사이즈에 딱 맞는 액자를 주문했는데, 뒤쪽에 라즈베리 파이가 들어가야 되기 때문에 공간을 만들어야만 했다. 라즈베리 파이를 가게 아주머니에게 설명할 필요가 없었기 때문에, 전자부품이 들어간다고 말했는데, 갑자기 그런 복잡한 것은 안 만들겠다고 거부하는게 아닌가!? 그냥 공간만 있으면 된다고 해도 한사코 손사래를 치는 걸 겨우 설득해서 주문했다-_-

그래서 완성!
IMG_20160229_192802
아래쪽에 보이는 것은 물론 Tick2[6]다. ㅋㅋㅋㅋ

 


2016.3.13
모니터의 발열이 은근 심한 듯 하여 일전에 산 와트드림[7]을 이용하여 내가 깨어 있는 시간 동안만 모니터가 켜 지도록 해 놓았다. 와트드림 두 개 사길 잘했군 ㅋ

 


2016.3.27
웹페이지 자체에 리프레시 코드를 넣어두면, 가끔 인터넷 접속이 원활하지 않을 때 404 에러가 난 이후로는 수작업으로 재접속을 해야하는 불편함이 있다. 미도리 자체에 리프레시를 하는 기능을 쓰면 이런 불편함이 없다. 커맨드 라인에 다음을 입력한다.
midori -i 리프레시시간(초) -e Fullscreen -a 웹사이트주소
다만 위쪽 네비게이션 바를 없애고 싶은데 방법이 없는 듯.

 


2016.4.8
가끔씩 접속이 원활하지 않아 404 에러가 나는데, 이걸 처리할 방법이 없나 싶어서 검색[8]을 좀 해봤다.
ssh로 로그인해서
export DISPLAY=:0;
라고 치면 ssh로 로긴한 계정에서 원격으로 xwindows 프로그램이 실행된다.
여기서 midori 라고 치면 웹브라우저가 실행되는데, 로그아웃하면 웹브라우저가 종료되어버린다. 그러므로 tmux를 설치한다.
sudo apt-get install tmux
tmux를 실행하여 그 안에서 midori를 실행시킨 후에 ctrl-z를 눌러 백그라운드 프로세스로 만든 후 tmux를 빠져 나온다. 나오는 방법은 ctrl-b를 누르고 d를 누르면 된다. 이후에 로그아웃하면 미도리가 여전히 실행된다.

세션을 다시 불러오려면
tmux attach-session -t 세션번호

근데 이 방법을 쓰니 브라우저의 자바스크립트가 정상적으로 작동하지 않아서, 시계가 움직이지 않는다-_- 젠장….

 


2016.4.21
404 문제는 결국 localhost에 아파치 서버를 깔아서 해결했다-_-

날씨를 표현하는 방법이 그냥 텍스트라서 멀리서 보면 분간이 안 되는 문제가 있다. 인터넷에 떠도는 날씨 아이콘을 스마트 미러에 맞게 편집(단색화 및 invert color)해서 표현하니 훨 낫군 ㅋ

 


2017.9.14
웹사이트에 iframe 태그를 만든 후에 이 프레임을 5분 간격으로 리프레시 하면, localhost에 아파치 서버를 깔지 않고도 404 에러를 해결할 수 있다.

 


[1] http://michaelteeuw.nl/post/840262 … ult-of-the-magic
[2] http://blog.dylanjpierce.com/raspberrypi/magicm … ic-mirror.html
[3] http://www.atostore.com
[4] 내 백과사전 Raspberry Pi Model B를 구입하다 2012년 12월 27일
[5] 내 백과사전 Raspberry Pi 2를 구입하다 2015년 3월 14일
[6] 내 백과사전 Tick2(박수소리 스위치)를 구입하다 2015년 11월 9일
[7] 내 백과사전 와트드림을 구입하다 2015년 6월 26일
[8] Linux: Prevent a background process from being stopped after closing SSH client in StackOverflow

Tick2(박수소리 스위치)를 구입하다

밤에 누워서 책 읽다가 자려면 일어나서 형광등을 꺼야 하는데, 일어나서 벽면의 스위치 끄기가 귀찮아서 미치겠다-_- 그래서 블루투스로 형광등을 끌 수 없을까하고 검색하다 보니, 박수 소리를 인식해서 형광등을 끄는 Tick2라는 스위치를 옥션에서 판매하고 있었다. 실패나 고장을 대비하여 두 개를 주문했다. 나같은 귀차니스트에게는 참으로 필수적인 물건이 아닐 수 없다. ㅋㅋ

한쪽 선만 잡으면 전류가 흐르지 않으므로 (전기줄 위의 새처럼) 감전되지 않는다는 건 이론적으로 알고 있다. 검색해보니 차단기를 내리지 않고 작업한 사람도 있었다. 그러나 전기에 완전 무지한 본인은 감전이 무서워서 집안의 전원 차단기를 내리고 작업을 시작했다. ㅋㅋㅋ

벽면의 스위치를 뜯었는데, 옥션의 판매자 설명과는 다르게 세 가닥의 선이 있는 순간부터 혼란에 빠지기 시작했다. 그래서 다시 차단기를 올리고 이리저리 추론해보니 한 가닥의 선은 아래쪽의 콘센트와 연결되어 있다는 걸 발견했다. 어쨌든 다양한 시행착오의 과정을 생략하자면 결국에는 설치에 성공했다. 크하하하하하

박수를 두 번 치면 형광등이 켜지거나 꺼진다. 두 번의 박수를 너무 빨리 치면 안 되고, 약간 간격을 두고(시계를 보면서 박수를 쳐 보니 0.7초 정도?) 리듬감있게 두 번 치면 된다. 연습하면 쉽게 된다. 물론 소음을 잘못 인식하는 오작동의 가능성이 있다. 소음이 많은 거실이나 사람이 많은 곳 보다는 개인적인 방에 적합할 것 같다. 여태까지는 오작동이 일어나는 것을 보지 못했다.

두 개의 스위치가 있는데 위쪽 스위치는 박수 소리에 동작하고 아래쪽 스위치는 일반 스위치다. 그런데 박수로 위쪽을 끄면 아래쪽도 꺼졌다. 이건 의도한 것인지 오작동인지는 모르겠는데, 여하간 본인은 스위치를 하나만 쓰면 되므로 상관없긴 하다.

검색해보니 이걸 사용하는 다른 사람의 후기도 있던데, 본인의 의견도 그 후기들과 거의 동일하다. 전원을 꺼도 전원이 미세하게 흘러서 형광등이 껌뻑이는데, 동봉된 콘덴서를 병렬로 연결하면 그런 현상이 사라진다. 천장의 형광등을 뜯어서 선이 노출된 부위에 콘덴서를 대충 감으면 된다.

제조사가 망했다고 하던데, 홈페이지를 검색해보니 열리지 않는 걸 보면 사실인 듯 하다. 나름 편리한 물건인데 무슨 이유인지는 몰라도 망했다고 생각하니 좀 아쉽다.

 


2015.11.14
이 스위치가 가까이에서는 Click consonant에 반응한다-_- 혀를 입천장에 밀착시킨 후 딱 튕기는 그 무성음.

구글 cardboard VR 만들기

일전에 오큘러스 리프트 개발자킷1을 산 이야기[1]를 했었는데, 뭐 지금은 팔아버리고 없다. 요즘은 개발자킷 2를 판매하는 모양이다. ㅎㅎ

여하간 구글에서 오큘러스 리프트를 엿먹이려고-_- 만들었다는 카드보드 VR 키트[2]가 나왔다는 건 알고 있었는데, 가장 결정적으로 적절한 렌즈가 없어서 시도해보지 못하고 있었다. 근데 어떤 사람이 렌즈 파는데를 찾아서 실제로 만든 블로그 글[3]을 보니 이거 재밌겠다 싶었다.

오오… 렌즈를 이렇게 쉽게 구할 수 있다니! 그래서 온라인으로 렌즈파는 사이트[4]에서 본인도 똑같은 주문을 해서 렌즈를 구입했다. 만일의 사태에 대비해 4개 주문했다. 사이트에는 초점거리가 49mm라고 돼 있는데, 실제로 배송된 것은 45mm였다. 근데 원래 45mm짜리가 필요한 것이므로 더 잘됐다. ㅋㅋ

자석은 옥션이나 지마켓 같은데 검색하면 비슷한 사이즈를 쉽게 구할 수 있다. 왜 하나는 네오디뮴 자석이어야 하고 다른 하나는 페라이트 자석이어야 하는지는 모르겠고, 게다가 네오디뮴 자석에 왜 구멍이 필요한지는 모르겠지만, 어쨌건 대충 사이즈가 맞는 걸 사면 된다.

그래서 짜잔! 완성
IMG_20140709_193845
대충 잘라도 되는데 제작시 주의할 점은 다음과 같다.

  1. 본인이 소지한 폰의 크기에 따라 좀 다르겠지만, 넥서스 5의 경우는 B4 용지에 출력하면 대충 맞다.
  2. 선을 따라 잘랐더니만 렌즈가 약간 작아서 구멍 크기랑 좀 안 맞아서 잘 빠진다. 렌즈에 맞춰서 구멍을 내야 한다.
  3. 자석은 직경 20mm 두께 5mm 근처로 대충 맞는 걸 사면 되는데, 폰이 감지를 할 정도로 자력이 강해야 할 듯.

본인은 오큘러스 리프트도 이용해봤으니 비교하자면, 오큘러스 리프트 DK1은 픽셀밀도가 낮아서 실제로 보면 방충망 너머로 화면을 보는 느낌이 든다. 아마 DK2는 픽셀밀도가 더 올라가서 괜찮지 않을까 싶은데 사용해 본 적은 없다. 물론 가지고 있는 폰에 따라 다르겠지만 넥서스5의 경우 밀도가 높아서 상당히 볼만하다.

오큘러스는 헤드트레킹과 시각적 정보만을 주는 장비이고, 실제 입출력 컨트롤은 pc를 통해서 해야 하므로 pc를 떠나지 못하는 좀 번거로운 면이 있다. (케이블도 걸리적 거린다.) 그런데 카드보드 VR은 폰을 이용하니까 상당히 자유롭다.

카드보드 앱[5]을 사용하면 여러가지를 볼 수 있는데, 인터페이스를 무척 잘 만들었다는 느낌이 든다. 제자리에서 회전하면 메뉴 목록을 볼 수 있고, 자석을 움직이면 클릭에 해당되어 메뉴를 선택할 수 있다. 고개를 우측으로 90도 기울이면 홈화면으로 돌아온다. 유튜브를 볼 수 있는데, 구면에 영상들이 박혀있고 시선을 움직여서 영상을 선택할 수 있는게, 마치 SF영화의 한 장면을 보는 듯 해서 감동이다. ㅎㅎ

VR을 이렇게 쉽게 구현할 수 있다면 향후 VR 장비의 가격은 더 빠르게 떨어질 것 같다. 그리고 VR이 더 활성화되는 쪽으로 발전하지 않을까 싶다.

여하간 킹왕짱 재밌으니 함 시도해보시라. ㅋ

 


2014.8.3
cnet Five more apps that work with Google Cardboard July 17, 2014 1:45 PM PDT
여기서 소개된 다섯 개 앱을 전부 실행해 봤다. 재미있기는 하지만 다 데모다 보니까 하나같이 2% 부족한 느낌 ㅋㅋ 블루투스 키보드가 있어야 하는 것들이 있다. 이동은 wsdf 키로 하면 됨.

 


[1] 내 백과사전 오큘러스 리프트 개발자키트를 주문하다 2013년 4월 17일
[2] https://developers.google.com/cardboard/
[3] 구글 카드보드( Google Cardboard ). 제가 한번 만들어 보겠습니다! by 이원제
[4] http://www.iloupe.kr/
[5] https://play.google.com/store/apps/details?id=com.google.samples.apps.cardboarddemo

넥서스 7의 안드로이드-우분투 듀얼부팅 설치법

요 며칠간 근래 구입한 넥서스 7에 안드로이드-우분투 13.04 듀얼부팅을 설치해보려고 삽질에 삽질에 삽질을 거듭했다-_- 걍 다음에 안 헷갈리려고 기록해둔다.

하도 삽질을 많이해서 순서가 정확히 생각안 나는데, 일단 기억나는 대로 설명해본다.

대략적인 설치순서는 다음과 같다. : 기기언락- 리커버리(컴퓨터의 CMOS 비슷한 거임) 변경 – 멀티 os 로더 설치 – 우분투 설치

  1. 이걸 따라하다 망하면 모든 것은 각자 책임이다. 나에게 뭐라하지 말기를 바란다. 언락하는 순간 안드로이드의 모든 설정은 공장초기화 된다는 사실도 명심하시라. 앱 받은거 다 날라간다.
  2. Multirom과 Modified TWRP Recovery를 파일을 다운받는다. Multirom의 현재 가장 최근 버전은 v7이고, TWRP의 가장 최근 버전은 20130202인 것 같다. 여기서 받을 수 있다. kexec patch도 받아둔다. 가장 최근 버전은 현재 4.2인 듯. 여기에서 받을 수 있다. Fastboot는 안드로이드 SDK에 들어 있다. 그리고 설치에 필요한 최신 우분투 이미지 파일도 다운받는다. 우분투 이미지를 다운받는데 꽤 오래 걸리니 미리미리 받아두자.
  3. 넥서스 7과 컴퓨터 사이에 파일전송이 가능해야 한다. windows 사용자는 MTP 연결이 가능해야 한다. 이 연결 프로토콜이 MS에서 만든거라서 리눅스 사용자는 여기서 약간 더 삽질해야 할 듯. MTP 연결이 안되면 TWRP recovery에서 OTG 케이블로 인식가능한 USB 메모리를 가지고 있어도 된다. usb메모리가 되는게 있고 안 되는게 있던데 무슨 차이가 있는지 잘 모르겠다. 처음 복구모드로 부팅하기 전에 OTG케이블로 usb 메모리를 꽂아두면 외장 디스크로 인식한다. 파일을 넥서스에 전송할 필요가 없어서 이거 꽤 편리하다.
  4. 컴퓨터와 넥서스 7을 연결하여 멀티롬 압축 파일과 kexec patch파일을 그대로 넥서스 또는 usb메모리에 집어넣는다. 즉, multirom_v7_n7-signed.zip과 kernel_kexec_42.zip을 넣는다.
  5. 그 다음 ‘설정- 태블릿 정보 – 빌드번호’를 계속 터치하면 갑자기 개발자 모드가 된다. 그러면 설정에 ‘개발자 옵션’이라는 메뉴가 새로 생기는데, 여기서 ‘usb 디버깅’을 체크한다.
  6. 그러면 컴퓨터에서 띠링~ 하면서 MTP라는 기기가 연결되었으니 드라이버를 찾아라고 뜨는데, 무시한다.
  7. 넥서스 기기를 종료하고 언락모드로 들어간다. 방법은 종료한 상태에서 전원버튼과 볼륨다운 버튼을 동시에 한참 누르면 된다. 그러면 안드로이드 인형이 배째고-_- 기다리고 있는 장면이 나온다. 만약 컴퓨터에 adb (Android Debug Bridge) 드라이버가 깔려 있다면, 콘솔에 adb.exe 파일이 있는 디렉토리에서 adb reboot bootloader 라고 쳐도 된다. 콘솔로 리부팅 하는거 은근 편하다. ㅋ
  8. 그 다음 fastboot라는 프로그램으로 언락한다. 콘솔 창에 fastboot.exe 가 있는 디렉토리에서 fastboot oem unlock 라고 친다. 리눅스라면 sudo로 해야 한다고 한다. 그러면 아래쪽에 빨간 글씨로 unlocked 라고 바뀐다.
  9. 그 다음 TWRP Recovery 파일을 리커버리 영역에 밀어 넣는다. 즉, 콘솔창에 fastboot flash recovery TWRP_multirom_n7_20130202.img 라고 친다. 설치시간은 대략 1초 남짓. 검색해보니 TWRP 말고 ClockworkMod 라는 이미지를 쓰는 방법도 있다는데, 그건 안해봐서 패스.
  10. 그러면 이제 컴퓨터와 연결된 선을 빼고 볼륨키를 움직여서 리커버리 모드를 작동시킨다. 그러면 방금 리커버리 영역에 밀어넣은 이미지파일이 실행된다.
  11. 메뉴가 쭉 있는데 install 을 터치하여, 4단계에서 넣은 멀티롬 압축파일과 kexec patch를 찾는다. 바로 보일 것이다. 그 놈들을 설치한다.
  12. 이제 우측 아래쪽에 리부트를 터치하여 시스템 리부팅해보자. 그러면 멀티os가 설치된 컴퓨터처럼, 부팅에 앞서 기기에 설치된 OS들의 모든 목록이 뜬다!! 뭐 근데 맨 처음에는 Internal (초기 설치된 안드로이드를 가리킴) 밖에 없을 것이다. 여기에 각자 깔고 싶은 롬이 있으면 찾아서 깔만큼 깔면 된다.
  13. 다시 안드로이드로 부팅한 상태에서 컴퓨터랑 연결한 후 usb 디버깅을 해제하면 MTP 디스크로 인식한다. 이번에는 우분투 이미지 파일을 넥서스에 그대로 카피해서 넣자. 만약 넥서스의 용량이 넉넉치 않은 사람이라면 우분투 이미지 파일을 usb 메모리에 넣고 OTG 케이블로 연결해서 설치가능하다. 근데 그래도 아마 2G 이상의 빈 공간은 필요할 듯. 정확히 얼마나 필요한지는 본인도 모르겠다. ㅋ
  14. 캐노니컬에서 정식으로 제공하는 이미지 파일은 안타깝게도 8G 용만 제공해서 16G에 깔아도 6G 정도밖에 사용하지 못한다. 캐노니컬에서 16g 용도 제공하는지는 모르겠다. 본인은 용량이 아쉬워서 여기서 비공식 이미지를 깔았다.
  15. 이미지 파일을 넥서스에 카피해 넣고 (아니면 usb에 넣고) 컴퓨터랑 분리한 다음 다시 언락모드로 들어간다. 여기서 리커버리 모드로 들어가면 또 TWRP 가 실행된다.
  16. Advanced – MultiROM – Add ROM 항목에서 우분투를 선택하고 우분투 이미지 파일을 선택하면 설치가 시작된다. 한참 기다리면 (10분?) 다음 부팅에서 OS 목록에 ubuntu가 뜬다. 처음 부팅할 때는 또 한참 걸린다.

참고로 우분투 디폴트 패스워드는 ubuntu 이다.

 


2013.3.6
삼성 갤럭시 노트에 데비안과 안드로이드 듀얼부팅 설치하기
Turning the Samsung Galaxy Note 10.1 into a proper Linux box in Hack a day

 


2013.11.17
우분투에서 더 이상 넥서스용 우분투 프로젝트를 하지 않는다고 한다. 이 프로젝트는 폐기된지 좀 된듯. 위 방법 따라하다가는 망하는 수가 있다. ㅋ