저는 주력 OS를 우분투로 사용하고 있지만 당연히 Windows도 사용하고 있습니다. 몇몇 작업의 경우는 꼭 Windows가 필요하기도 하고 가끔 IE도 필요한 경우가 있어서 VirtualBox를 써서 가상으로 Windows를 이용하지요.


리눅스에서는 대부분 가상 머신 프로그램으로 VirtualBox를 사용하실 겁니다. VMware는 약간 배포판을 가리는 면이 있어서 간혹 에러가 나기도 하고 VirtualBox에 비해 메모리를 많이 먹는 편입니다. 대신 속도는 VMware가 이러나 저러나 훨씬 낫지요.


저는 VirtualBox를 쓸 때 설치 후에 어느정도 정리를 하고 스냅샷으로 일단 얼려둡니다. 이래야 나중에 가상머신이 병X이 되어도 그때의 스냅샷으로 돌아올 수 있으니까요. Windows내의 시스템 복원 기능이 있지만 가상머신에서는 쓰레기일 뿐입니다.


VirtualBox의 스냅샷 기능 이렇게 순차적으로 할 수도 있고 분기도 가능하다.

그런데 Windows란 녀석은 캐시 메모리를 많이 사용하는 편입니다. 2000시절에 추가된 기능이었던 Prefetch(Superfetch) 기능이 발전해서 사용자가 많이 사용하는 프로그램을 미리 메모리에 올려둔다던가 프로세스 우선순위를 자동으로 설정해 주는 등의 기능이 있습니다. 그래서 프로그램을 많이 설치하면 설치 할 수록 디스크의 공간을 예상 외로 많이 먹어버리고 메모리 사용량도 은근히 올라갑니다. 제가 스냅샷을 걸어두는 이유 중 하나가 바로 이것인데요. Windows의 Prefetch는 쓰면 쓸 수록 디스크에 각종 캐시 들을 쌓아둡니다. 프로그램의 각종 데이터나 라이브러리 등을 올려두는 것인데요. 문제는 이 기능이 일반적인 디스크에서 돌아갔다면 문제가 없었을 겁니다. 그런데 가상 머신은 가상 디스크 이미지를 만들고 이 안에 파일을 넣어두는 방식을 취합니다. 보통 디스크 이미지는 동적 할당 방식을 사용해서 200GB짜리 이미지를 만들어도 200GB를 사용하지 않습니다. 디스크의 내용이 변동 되었으면 변동 된 만큼을 그냥 추가합니다. 나중에는 썼다 지웠다를 반복하면서 200GB를 넘기기도 합니다. 이러면 정작 호스트인 우분투의 디스크 용량이 나중에는 당연히 부족해 집니다.


그래서 VirtualBox에서는 VBOXManage -compact 명령을 준비해 두었지만 완벽하지는 않습니다. 그냥 뱃속 편하게 고정 할당을 하는게 이 문제에서 벗어 날 수 있는 방법이지만 스냅샷을 걸 때마다 고정 할당량 X 스냅샷 갯수 만큼 먹어버리는 문제가 또 있습니다. (어쩌라고...)


솔직히 Prefetch는 굉장히 좋은 기능입니다. 이 기능 덕에 지금의 Windows10이 Windows7보다도 저 사양의 PC에서 더 쌩쌩하게 돌아갈 수 있는 것 입니다. 하지만 지금은 그냥 혹 덩어리 입니다. 문제아일 뿐입니다. 이것을 해결하는 가장 쉬운 방법으로 게스트 OS가 Win7이상이라면 SSD 옵션을 걸어두면 됩니다. (자동으로 Prefetch를 안 씁니다.)이러면 한방에 해결이 됩니다. 혹은 

http://www.technipages.com/windows-enable-disable-superfetch


여기에 나온 것처럼 Superfetch와 Prefetch를 꺼버리면 됩니다. 그러면 VirtualBox의 문제가 약간은 해결될 것입니다.



,

이마트에서 VR을 판다고 해서 냉큼 산지 약 한 달. 생각보다 쓸 만한 구석이 많아서 여러가지 용도로 사용하고 있습니다.

이마트에서 파는 VR 사실 구글 카드보드 기반이다.

이놈을 써본 결과 참 쓸 곳이 많다는 것이 느껴졌습니다. 우선 스마트폰을 기본적으로 사용하기 때문에 발전 가능성이 무궁무진하다는 것과 TrinusVR의 존재로 인해 PC화면을 VR로 뿌릴수 있게 되었다는 것. 그리고 무엇보다 구글의 카드보드를 기반으로 했기 때문에 카드보드 앱이 계속 나오고 있다는 것이 주요 장점이라고 할 수 있습니다.


저 검은 껌딱지에 스마트폰을 붙이면 잘 붙는다. 물론 힘줘서 떼면 떨어지기도 잘 떨어지는데 어떤 재료를 썼는지는 몰라도 흔들리지도 않는다.

머리끈은 약간 아쉬운데 그냥 본인의 머리가 큰 것을 탓해야 할 듯.

여기는 충전포트에 스마트폰을 끼우고 장착이 불가능해서 그냥 니퍼로 잘라내 만들었다.

사실 이 물건은 중국에서 만든 VR중에서 그럭저럭 괜찮은 것을 이마트에서 들여온 물건입니다. 그래서 상자를 열면 중국어로 된 설명서가 대충 나옵니다. 그런데 굳이 중국어 매뉴얼 없이 그냥 이마트 직원이 더 친절하게 알려주니 굳이 물어보실 이유는 없습니다.


지금 현재 카드보드지원 앱 중에서 가장 쓸만한 앱은 다음과 같습니다.


1. TrinusVR or KnoniVR (PC화면을 VR로 뿌리는 앱, 아쉽게도 우분투는 지원이 안 된다.)

2. Youtube  - 동영상 재생중에 VR이 지원됨

3. PPSSPP - VR 모드지원


아직 동영상 어플 중에서는 쓸 만한 것은 못 찾았습니다. VR TV Free가 그나마 괜찮다고는 하는데 코덱 문제가 있어서 MXPlayer 등을 사용하는 사람 입장에서는 그냥 쓰레기입니다.


구글 카드 보드같이 VR에 관심은 있지만 모양에 신경 쓰시는 분 들은 알리 익스프레스에서 하염없이 기다리지 마시고 이마트에서 이걸 구입하는 것도 좋은 방법이라고 생각합니다. 이참에 Tridef도 하나 구입해야겠네요.

 후후후

,

제 블로그의 유입 경로입니다.

보통의 대다수 블로그는 한국어로만 운영할 경우 네이버를 통해 유입되는 경우가 많습니다. 하지만 네이버 검색의 대다수는 Gossip, 그 날의 이슈, 정치(...)등의 재미 삼아 찾거나 새롭게 토론(혹은 콜로세움)하기 좋은 정보 위주로 검색 하는 것이 사실입니다.

그에 비해 IT/오픈소스 등의 주제로 운영하는 저는 네이버 검색으로 들어오는 경우가 별로 없습니다. 애초에 글 들이 우분투/리눅스 등으로 도배를 하고 있으니 이런 쪽으로 찾는 분들은 네이버를 잘 이용 안 합니다. 다만 이 쪽은 찾는 사람이 적어서 한 달 동안 유입 인구가 기껏해야 1000명 정도라는 것. 그 중 검색엔진 로봇을 제외하면 세자리 수로 떨어집니다.

그런데 이미 저는 예상한 바입니다. 아무리 그래도 리눅스 관련 자료를 찾는 인구는 많지 않고 제대로 된 전문가라면 이런 블로그보다는 포럼을 검색하고 있을 것이며 이제 막 리눅스에 발을 들여놓은 초보 리눅서 분들은 제 블로그가 조금 어려우실 겁니다. (제 블로그의 대다수는 삽질을 어떻게 해서 해결 했는지에 대한 내용이니까요.)

위의 스크린샷을 보시면 아시겠지만 구글 유입 인구는 이미 네이버의 유입 인구를 아득히 초과했습니다. 그도 그럴것이 네이버로 들어온 검색어는 Long live the queen, 포켓몬스터, 안드로이드 등입니다. 구글은 리눅스, 우분투, KDE 등이고요. 이 블로그의 글의 대다수는 리눅스, 우분투 관련 글입니다. 사람들의 검색엔진에 따른 관심 분야의 차이가 느껴집니다. 지금은 아직 적용을 안 했는데 구글 애널리스틱을 심어서 접속 브라우저도 한번 살펴 볼 생각입니다. 제 생각인데 이 블로그는 일반인들이 주로 사용하는 IE보다는 Chrome과 Firefox가 대부분이 아닐까라는 생각이 드네요.

제 블로그의 정체성을 위해서라도 구글 유입에 신경을 더 써야 겠습니다. 네이버는 저에게는 별로 이득이 되어주질 못하네요.

,

보통 우분투 사용자 분들은 PPA를 통해서 설치하는 것에 익숙합니다. 소스 컴파일 설치 같은 것은 정 PPA 이용이 안 될 경우나 본인만의 패치를 적용해야 할 경우(예: 3D 프린팅 프로그램 : Curahttp://moordev.tistory.com/111) 뿐이며 대부분은 누군가의 봉사로 제공되는 PPA를 적극적으로 이용하고 계실 겁니다.

2016.6월 오늘 PSP 에뮬레이터인 PPSSPP를 우분투에서 PPA를 통해 설치 중 에러가 나서 이를 해결하기 위해 한 삽질을 간단하게 적고자 합니다.


PPSSPP 공식 홈페이지에서는 리눅스용 바이너리 외에도 PPA를 따로 제공중이다.


PPSSPP 공식 홈페이지에서는 Linux 버전의 배포를 Builds 버전과 PPA를 통해 배포하고 있습니다. PPA 버전은 메뉴에 자동으로 등록되는 등 설치시에 편한 것이 많습니다.저야 당연히 PPA를 통해 설치 하였고 게임을 구동중에 ESC 키가 전혀 먹히지 않는 버그를 발견했습니다. 즉 게임 설정을 못하는 문제가 생긴 것이지요.

바로 버그 리포트를 날리려고 했는데 혹시나 하고 찾아보니 이미 누가 리포트를 한 상태였습니다. 그래서 unstable 버전으로 바꾸면 해당 패치가 적용된 버전으로 설치 되나 했더니 여전히 상태가 안 좋습니다.

그래서 살펴본 결과 이러한 내용을 알게 되었습니다.

- PPA 버전은 Dev 버전보다 늦게 올라옵니다. 즉 Dev-latest 버전을 다운로드 받아야 해당 패치가 적용되는 상황이었던 것이지요. 그래서 Linux Builds 항목에서 Dev-latest 버전을 다운로드 받아서 해보니(http://build.ppsspp.org/builds/) 버그 없이 깔끔합니다.

하지만 이렇게 써먹으면 메뉴에 등록된 PPSSPP를 못 쓰게 됩니다. 그렇다고 방법이 없는 것은 아닙니다. PPA버전을 설치하고 실행 파일을 Dev 버전으로 갈아치우면 됩니다. 

일단 PPA를 통해 PPSSPP를 설치합니다.

sudo add-apt-repository ppa:ppsspp/stable

sudo apt-get update

sudo apt-get install ppsspp-sdl


이렇게 PPA버전을 설치하고 Dev-latest버전을 다운로드 받습니다.

http://build.ppsspp.org/builds/Linux-Generic/amd64/ppssppbuildbot-org.ppsspp.ppsspp-dev-latest-linux-amd64-generic.tar.gz

(64비트)

http://build.ppsspp.org/builds/Linux-Generic/i386/ppssppbuildbot-org.ppsspp.ppsspp-dev-latest-linux-i386-generic.tar.gz

(32비트)


그리고 관리자 권한으로 탐색기 프로그램을 하나 열어둡시다.

sudo pcmanfm /usr/games

sudo nautilus /usr/games

sudo thunar /usr/games

sudo dolphin /usr/games

기타 등등... 자신의 배포판에 맞는 명령을 사용하세요.

그러면 ppsspp-sdl이란 실행파일이 있습니다. 이것을 우선 이름을 바꿔 .bak파일을 붙여줍니다.

그리고 아까 다운로드 받은 Dev버전에서 PPSSPPSDL 파일만 빼놓고 여기에 복사합니다.

/usr/games 내에 있는 ppsspp-sdl 파일을 이름을 바꿔 버리자

다른 것은 버리고 이것만 빼내면 된다.

그리고 PPSSPPSDL 이 파일의 이름을 ppsspp-sdl로 바꿔주시면 작업 끝


이제 버그 없이 게임이 돌아갑니다.

,

저는 이런저런 에디션을 넘어다니다가 Xubuntu에 정착했습니다. LXDE도 괜찮았지만 Compositing과 새로운 데스크탑 환경이 경험해보고 싶어서 그냥 점프해 버렸습니다. 그랬더니 PCmanFM대신 Thunar를 쓰더군요. 이전에 써본 적이 있었지만 PCManFM과 비교해서 그리 무겁지도 그렇다고 모자라지도 않았습니다.


그런데 Thunar는 nautilus 확장이 안 먹히는 것인지 PCManFM에서 쓰던 filename-repairer를 쓸 수 없었습니다. (여기 참조 : http://moordev.tistory.com/5그래서 thunar용으로 포팅된 것은 없나 찾아보던 도중 누군가가 작업을 하고 있다는 것을 알게 되었습니다. https://github.com/LinuxMatt/thunar-repairer-plugin


그런데 소스만 봐서는 이걸 어디에 써먹어야 할 지 감이 안 옵니다. 그래서 소스를 다운로드 받은 뒤에 이리 저리 작업한 삽질기를 적습니다.


우선 Thunar는 Xfce의 일부이므로 Xfce4-develop-tool이 있어야 합니다. 그러니까 우선 


sudo apt-get install xfce4-dev-tools libthunarx-2-dev libexo-1-dev


위 명령어로 개발 툴을 설치합니다.


그리고 Thunar-filename-repairer 소스코드를 git clone을 하셔도 되고 그냥 ZIP으로 다운로드 받으셔도 됩니다. 저는 그냥 zip으로 다운로드 받겠습니다.


https://github.com/LinuxMatt/thunar-repairer-plugin/archive/master.zip


위의 것을 다운로드 받으신 뒤 압축을 풀어버리시면 됩니다.


그리고 터미널에서 컴파일을 시도해야 하므로 터미널을 열고 압축을 풀어버린 곳으로 들어갑니다. 당연히 cd 명령을 사용하면 되겠지요.


cd thunar-repairer-plugin-master


그 다음 autogen 스크립트를 실행합니다. 이는 컴파일을 위해 사용자 환경에 맞게 끔 파일을 만들어줍니다.


정확히 make로 컴파일을 하란다. 시키는대로 하자.


여기서 컴파일을 위해 다음과 같이 명령을 내립시다. 이제는 익숙해져야하는 그 명령어


make


이제 컴파일일 다 되었다고 할 것입니다. 설치만 하면 되는데 make install을 해도 되지만 이러면 관리하기가 어려우니 시냅틱등의 패키지기반 관리로 하는 것이 좋을 것이다. 바로 그게 checkinstall 입니다..


sudo apt-get install checkinstall


우선 checkinstall을 설치하고 make가 완료된 시점에서 다음과 같이 명령을 내립니다.


sudo checkinstall


중간에 버전에서 에러가 날 수 있으니 버전을 숫자로 바꿔야 합니다. 기본으로 하면 master란 버전이 되는데 그런 것은 없습니다.

0.1정도면 될 것입니다.(alpha니까요.)


이 화면에서 3으로 들어가서 0.1내지는 숫자로 바꿔준다. 그래야 패키지 빌드가 된다.


자동으로 인스톨까지 끝내고 패키지도 같이 만들어줍니다. 필요하면 이를 배포할 수도 있습니다.


Xubuntu 16.04 amd64로 내가 빌드한 것입니다. 필요하면 이것을 이용해도 문제는 없을 것입니다.

thunar-repairer-plugin_0.1-1_amd64.deb


으음... 패키지를 만들면서 뭔가 잘못 된 것 같습니다.

다음 명령을 써서 후속 작업을 임시로 해둬야 할 것 같은데요.왜 그런지는 잘 모르겠습니다. (내가 패키지를 잘 못 다루기 때문이기도 할 것입니다.)


cd /usr/lib/x86_64-linux-gnu/thunarx-2/

sudo ln -s /usr/local/lib/thunarx-2/thunar-fnr.la
sudo ln -s /usr/local/lib/thunarx-2/thunar-fnr.so


일단 작동은 잘 되네요. 다음 스크린샷을 보시면 아시겠지만. 박살 난 한글도 잘 읽어들이고 웹코드로 뿌려진 형태도 복구해줍니다.


%20%80 등 웹용으로 뿌려진 파일명도 UTF-8로 정상적으로 복구 되고

CP949로 박살난 한글도 UTF-8로 잘 복구해준다. 정말 좋은 프로그램이다.


nautilus확장보다 설치는 조금 복잡하지만 Thunar에 파일명 복구플러그인을 쓸 수 있는 것 만으로도 좋군요.

,

광고는 정말 인터넷에서 빠질 수 없는 수익 요소 중 하나 입니다. 인터넷의 황제라 불리는 구글도 엄연히 말하면 광고회사라고 할 수 있을 정도로 광고를 통해 얻는 수익은 정말 무궁무진합니다. 무료앱들만 봐도 광고를 잠깐 봐주는 것으로 현금이 나가지 않게 조치를 취해주기도 합니다. 인터넷에서 무료로 정보를 얻을 수 있는 것도 광고 덕이라고 할 수 있습니다. 하지만 너무 과한 광고는 웹페이지의 레이아웃을 망치고 또 보는 사람의 눈을 찌뿌리게 할 수있습니다. 그래서 시작 된 것이 Easylist 프로젝트였지요. (https://easylist.github.io/)


Easylist 사이트의 모습 당연히 광고는 없다. 대신 각종 Ad blocker들을 알려주고 있다. 일종의 광고라고 할 수 있을까?



그리고 Firefox는 Ad-Block Plus 확장을 통해 Easylist의 목록에 들어간 것들을 차단하기 시작했고 Chrome 출시 이후 엄청난 속도로 점유율을 높이는 Chrome과 함께 빠르게 이 광고 차단 확장이 퍼져나가게 되었습니다. 멀리 갈 것도 없이 저의 블로그만 해도 광고가 없어지는 순간 뭔가 허전하면서도 깔끔한 화면으로 변하는 것을 볼 수 있습니다.


그런데 광고가 주 수익인 일부 사이트는 이게 굉장히 마음에 들지 않았나 봅니다. 그래서 브라우저에서 이 Ad Block Plus를 필두로 한 각종 광고 차단 플러그인이 설치되어있을 경우 이를 경고하거나 사이트 이용 자체를 차단하는 방법을 사용하기 시작했습니다. 일명 Anti-AdBlock 이라고 합니다. 즉 Ad-block이 감지되면 갑자기 사이트가 이상한 곳으로 넘어가게 웹페이지를 짜두거나 페이지에 광고차단기를 꺼달라는 호소문(?)을 띄운다던지 하는 방법으로 사용자들을 귀찮게 하는 것이었지요. 실제로 Chrome을 설치하고 ADB(Ad Block Plus)를 설치하는 사람들이 많은 관계로 생각없이 돌아다니다가 이러한 Anti-Adblock에 걸리면 그냥 광고 차단을 풀기도 했습니다.


그런데 어떤 사이트는 그냥 광고가 도배되어서 귀찮음을 뛰어넘어서 그냥 광고만 하는 사이트 처럼 보이게 만들기도 하는데 여기에 Anti-Adblock을 적용까지 하면 참 사람 성질나게 합니다.


대표적인 광고 도배 사이트 아는 사람은 안다. 내가 원하는 컨텐츠는 이 광고를 한참 지나고 나서야 보일 정도로 심각하다.

위의 사이트에서 광고를 막을 경우 Anti-AdBlock이 발동해서 사이트 이용을 막아버리기도 한다. 보는 사람 참 성질난다...


즉 광고라는 무기로 창이 등장하자 이를 막는 Ad Block이 등장했고 또 이 Ad Block을 뚫어버리는 창이 나오게 된 것입니다. 그럼 이제 방패를 강화할 때가 되었습니다. 그런데 사람들은 이 방패를 강화하는 것이 아닌 새로운 방패를 추가하는 것으로 대응했습니다. 일명 Anti-Adblock Killer. (https://reek.github.io/anti-adblock-killer/)즉 광고차단반대파 살해자(...) 대략 이렇게 해석 할 수 있습니다. 원리는 웹페이지를 UserScript를 이용해서 제어할 수 있는 GreaseMonkey(Firefox), TamperMonkey, Scriptish 등의 확장이 있는데 이를 이용해서 웹페이지를 손대는 방식입니다. 


즉 이 Anti Adblock Killer를 사용하려면 


Firefox용 수많은 광고 차단기들 특정 사이트의 광고를 차단해주는 것도 있고 광범위하게 광고를 차단하는 것도 있다.

이 쪽은 Anti-Adblock Killer를 설치하는 곳이다. 간단한 영어만 하면 솔직히 내 블로그도 필요 없다.



1. 광고차단 확장을 설치하고(Adblock Plus, Adblock, uBlock Origin, Adguard)를 설치합니다. Firefox for mobile에도 광고 차단을 할 수 있는데 모바일 특성상 uBlock Origin을 추천합니다. PC라면 다른 프로그램도 좋습니다.


2. GreaseMonkey, TamperMonkey 나 Scriptish 등의 Userscript 확장을 설치합니다. Firefox for mobile에 Ublock origin이나 Adblock 등을 설치하신 경우에는 usi 라는 확장을 설치하시면 됩니다.


3. https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer.user.js

위의 링크를 타고 들어가서 UserScript 를 설치합니다. 일단 이것 만으로 Anti Adblock이 무력화되지만 업데이트를 위해 Anti-Adblock Killer를 구독하도록 합시다.

abp:subscribe?location=https://raw.github.com/reek/anti-adblock-killer/master/anti-adblock-killer-filters.txt&title=AakList%20(Anti-Adblock%20Killer)

위의 링크를 누르시면 됩니다.


이제 Anti-Adblock 사이트로 처 들어가면 끝. 만약 Anti Adblock Killer도 막히면 이젠 뭐가 나올까요?


AdBlock Plus + Tampermoney + Anti-Adblock Killer 조합으로 박살낸 광고들 위와 같은 사이트이다.



이제 마지막으로 모바일에서 특정 사이트 광고 차단 동영상을 올립니다. 브라우저는 그 특성상 당연히 Firefox for Mobile이 되겠습니다. (다른 브라우저는 지원이 안 됩니다.)



,

어찌된 영문인지는 모르겠습니다만 MATLAB 2016a버전과 그 이하의 모든 MATLAB이 모두 Ubuntu 16.04에서 실행이 안 되는 현상이 발생하고 있습니다. 일단 MATLAB의 실행시 스플래시는 뜨지만 그 이후에 그대로 실행이 안되고 튕겨버립니다. 터미널에서 열어보면 Segmentation 오류가 나는데 그 전에도 간혹 있었던 libstdc++에러입니다.


우분투14.04~15.10까지와 libstdc++이 우분투 16.04의 libstdc++이 다른 것으로 생각됩니다. libstdc++은 시스템과 전반적으로 연관이 깊다 보니 시스템과 맞지 않을 경우 당연히 에러를 뿜게 되는 것입니다.


그럼 방법은 간단합니다. 그냥 시스템에 맞는 libstdc++을 사용하게 하면 됩니다. 기본적으로 MATLAB은 "/usr/local/MATLAB/R2016a/sys/os/glnxa64/libstdc++.so.6" 이 라이브러리를 사용하게 되어있습니다. 여기는 경로를 보시면 아시겠지만 MATLAB에서 제공하는 라이브러리입니다. 그런데 이 라이브러리가 시스템하고 안 맞는 부분이 있을 경우 에러가 나는 것입니다. 이럴 경우 우분투에서 제공하는 라이브러리를 사용하게 하면 되는 겁니다. 방법은 아주 간단하게도 MATLAB에서 제공한 라이브러리를 삭제하면 됩니다. 그러면 MATLAB은 시스템에 설치된 libstdc++파일을 사용하게 되고 시스템과 안 맞는 부분이 사라지게 되는 것이지요. 


이전에 Steam에서 우분투 16.04에 대응이 되지 않았을 때에도 써먹었던 방법인데 이게 MATLAB에서도 쓰이네요.


일단 삭제는 좀 어려울 수 있으니 파일명을 바꿔 버리는 것으로 해결합시다.


cd /usr/local/MATLAB/R2016a/sys/os/glnxa64/

sudo mv libstdc++.so.6 libstdc++.so.6.old


이렇게 해주시면 MATLAB은 해당 라이브러리가 아닌 우분투에서 사용하는 라이브러리를 사용하게 됩니다. 이제 사용하기만 하면 됩니다.깔끔하지요?

,

렌파이에는 대사를 TTS로 읽어주는 황당하지만 쓸만한 기능이 들어있습니다. (황당하지만 쓸만하다니. 무슨 소리일까요?) https://www.renpy.org/doc/html/self_voicing.html#speech-synthesis


링크를 보시면 일단 PC에 한해 해당 기능이 동작하지만 윈도우는 SAPI의 기능을 써서 사용하고 Mac은 Siri와 같은 엔진을 사용합니다. 리눅스는 기본으로 espeak을 사용하는데 특징으로는 한국 사람이 아니라 무슨 외국인이 한국어를 하는 듯한 느낌이 듭니다. 그냥 안 쓰는게 나을 듯 합니다.


Android 부분을 보시면 TTS 기능이 지원이 안 된다고 합니다. 하지만 안드로이드에는 자체적으로 TTS가 내장되어 있습니다. 솔직히 마음먹기에 따라 이걸 끌어다가 사용하면 될 것도 같은데요. 조금 더 찾아봤습니다. 


기본적으로 안드로이드 TTS를 사용하기 위해서는 자바를 써야하는데요. 렌파이의 안드로이드는 NDK로 SDL과 파이썬을 굴리며 JNI를 통해 안드로이드 앱을 만드는 방식입니다. 그러니까 지원이 되기 위해서는 JNI 부분을 건드려야 한다는 말입니다. 


찾다보니 이런 놈이 있더군요. python for android. https://github.com/kivy/python-for-android 파이썬으로 안드로이드 앱을 만들 수 있는 물건입니다. QT하고 조합도 가능한 듯 합니다. 하지만 이걸 쓰면 렌파이를 뜯어 고쳐야 합니다. 여기에 연관된 물건 중 하나가 있더군요.

pyjnius란 라이브러리 입니다. http://pyjnius.readthedocs.io/en/latest/android.html

파이썬을 JNI로 감싸서 자바에서 사용하는 물건인 듯 합니다. Jython하고 관계가 약간은 있을 겁니다. 파이썬 스크립트를 자바에서 사용하고 자바의 라이브러리를 파이썬으로 가져와서 사용하는 등 그냥 Jython의 느낌이 다분한 라이브러리 입니다.


여기를 잘 보시면 안드로이드의 TTS를 가져오는 부분이 있습니다. 제일 아래에 있습니다.

http://pyjnius.readthedocs.io/en/latest/android.html#using-texttospeech


렌파이에는 Python 코드를 그냥 실행하는 기능이 있으니 이 라이브러리를 가져와서 쓰게 하기만 하면 안드로이드 TTS를 그냥 쓸 수 있겠다는 생각이 들었습니다.


"이거 괜찮겠는데? 일단 라이브러리를 적용하는 것부터 해야겠다."


그런데...무언가 이상하더군요. pyjnius의 설명의 예시에

org.renpy.android.PythonActivity

이게 끼어있습니다. 조금 더 찾아봤습니다.


https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=27165#p328793

"Ren'Py includes pyjinus"

네...그렇습니다. 렌파이는 이미 이 라이브러리를 쓰고 있던 것이었습니다. 이쯤되니 "어째서 TTS가 지원이 안 된거지?" 라는 생각이 들더군요.


일단 제가 알아낸 것으로는 렌파이에서 PythonActivity란 클래스는 사라지고 PythonSDLActivity로 바뀌었습니다. 그런데 이것도 엄밀히 말하면 Android Activity이니 문제는 없을 겁니다. 그렇다면....renpy엔진을 뜯어 고쳐서 Say 함수가 호출 될 때 TTS가 작동되게 하면 되겠다는 생각이 들었습니다.


아 참고로 Say함수는 renpy/exports.py에 들어있습니다. renpy.say(who,what)이게 API라더군요. 그럼 이 API를 수정하면 그만이겠지요. 후후


즉, 또 삽질입니다. 마침 Sunrider Academy의 번역도 찰지고 하니 이를 이용하면 재미있을 듯 합니다. 안드로이드TTS는 삼성TTS나 구글TTS같이 찰진(?) 목소리들이 많으니 이를 이용하면 재미있을 듯 합니다. 물론 어떻게 될지는 저도 모릅니다. 일단 해봐야지요. 후후


일단 export.py의 SAY함수안에 다음 코드를 끼워넣었는데...

    if renpy.android:
        import sys
        reload(sys)
        sys.setdefaultencoding('utf-8')
        #print str(what)
        from jnius import autoclass
        Locale = autoclass('java.util.Locale')
        PythonActivity = autoclass('org.renpy.android.PythonSDLActivity')
        TextToSpeech = autoclass('android.speech.tts.TextToSpeech')
        #tts = TextToSpeech(PythonActivity.mActivity, None)

        tts = PythonActivity.mActivity.tts

        tts.setLanguage(Locale.getDefault())
        tts.speak(str(what), TextToSpeech.QUEUE_FLUSH, None) 


일단 컴파일은 됩니다만 TTS엔진 세팅이 덜 되었다고 나옵니다. 대체 뭘까요...?


아무래도 Activity쪽 문제라 생각되어서 renpy/rapt/src/org/renpy/android/PythonSDLActivity.java


여기를 수정해서 TTS엔진을 미리 끌어 오는 것으로 수정 했습니다.


일단 첫줄에

public class PythonSDLActivity extends SDLActivity {

...

}


이 부분에 TTS엔진의 인터페이스를 추가합니다.


public class PythonSDLActivity extends SDLActivity implements
        TextToSpeech.OnInitListener{

private TextToSpeech tts;

...

}


요렇게 수정합니다.


그리고 onCreate()에


tts = new TextToSpeech(this, this);


이 한 줄을 추가해서 tts객체를 하나 만듭니다. 물론 onDestroy()에도


tts.Shutdown();

을 추가해서 종료될 때 tts엔진을 같이 종료하게 만듭니다.


그리고 제일 중요한 oninit()함수


    @Override
    public void onInit(int status) {
 
        if (status == TextToSpeech.SUCCESS) {
 
            int result = tts.setLanguage(Locale.getDefault());
 
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "This Language is not supported");
            } else {
                //아무짓도 하지 않는다...
            }
 
        } else {
            Log.e("TTS", "Initilization Failed!");
        }
 
    } 


그냥 어디서 Copy 해 온 것인데 TTS가 제대로 작동 하는지에 대해 로그를 남깁니다. 일단 컴파일은 됩니다. 문제는 이게 실행이 되느냐인데...으음...?


... 좀 많이 삽질해서 성공 했습니다...뭔가 이상하기는 하지만(...)


그런고로 수정된 파일을 올리겠습니다.


PythonSDLActivity.java는 renpy 설치된 곳/rapt/src/org/renpy/android/PythonSDLActivity.java


여기에 덮으시고


export.py는 renpy 설치된 곳/renpy에 덮으시면 됩니다.


6.99.10기준입니다. 여차하면 diff파일도 하나 추가하지요.


PythonSDLActivity.java

exports.py

TTS가 돌아가는 동영상도 하나 올리겠습니다.

,

무슨 이유인지 스팀이 실행이 안된다. 14.04는 잘 되었는데...


자세히 찾아보니 Nvidia는 잘 되는데 AMD는 안 된다고 한다. 역시 망할 AMD로군.

하지만 방법은 있었다.


http://askubuntu.com/questions/635851/error-in-installing-steam-on-ubuntu-15-04

 

혹시 다음과 같은 명령을 쓰면 스팀이 실행되는지 확인해보자

LD_PRELOAD='/usr/$LIB/libstdc++.so.6 /$LIB/libgcc_s.so.1 /usr/$LIB/libxcb.so.1' DISPLAY=:0 steam


만약 실행이 된다면 드라이버 문제다. 하지만 이는 쉽게 해결이 가능하다.


터미널에서 그냥 steam이라고 명령을 쳤을 때 X관련 에러가 나온다면 거의 100%다.



그럼 스팀 실행을 위한 약간의 작업을 한 번 해보자.


터미널을 열고 다음과 같이 명령을 쳐보자.


sudo leafpad /usr/games/steam


leafpad가 아닌 gedit이나 pluma도 상관없다. nano를 써도 된다. 그냥 텍스트에디터 아무거나 쓰자.


그러면 Bash 스크립트가 나오는데 이걸 살짝 수정하는 것이다.

보이는가? 위 부분에 2줄을 추가해 넣었다. 이로써 스팀 실행이 된다.

이 Bash 스크립트에서 2번째 줄에 (그러니까 #!/usr/bin/env bash 아래에)


이 두 줄을 붙여 넣으면 된다.

export LD_PRELOAD='/usr/$LIB/libstdc++.so.6'
export DISPLAY=:0


이제 실행해보면 잘 된다.

,

..그냥 간단한 삽질 끄적임 입니다.


렌파이 6.99.10에서 안드로이드 컴파일 도중 별의별 일이 다 일어나서 이를 정리하기 위해 적은 글입니다.


1. Android SDK의 버전 업으로 인해 Google관련 패키지의 폴더 명이 바뀌었습니다.

2. Oracle JDK9을 깔았다가 낭패 봤습니다.

3. Android SDK는 JDK 1.6이상을 요구하지만 렌파이가 다운로드 받은 Ant는 기본이 JDK 1.5입니다. 이를 바꿔야 합니다.


업데이트가 되면 언젠가는 해결될 문제지만 오늘 삽질이 워낙 심각했던지라 이렇게 글을 남깁니다.


우선 렌파이에서 안드로이드를 컴파일 하기 위해서는 rapt를 다운로드 받아야 합니다. 그런데 다운로드 중에 에러가 납니다.


/android-sdk~~/extras/google/play_apk_expansion 이 없다는군요.


사실 play_apk_expansion 가 market_apk_expansion으로 바뀌었습니다. 마찬가지로 play_licensing도 market_licensing으로 바뀌었습니다. 일단은 수동으로 업데이트를 해야겠네요.


방법은 다음과 같습니다.


~/rapt/android-sdk~/tools/android.sh를 실행해봅시다.


그러면 Andoid SDK Manager가 나옵니다. 여기서 필요한 SDK와 구글 키트를 다운로드 받은 뒤에 수정해야 합니다.


Extras에서 귀찮으면 다 다운로드 받아도 되지만 그랬다가는 다운로드 속도에 미칠테니 필요한 것만 다운로드 받읍시다.


아래 스크린샷 정도로만 해주시면 됩니다.


Google Play APK Expansion library

Google Play licensing

Google Play Service

정도만 해주시면 될 듯 합니다.


아 그리고 Android 4.0 SDK도 다운로드 받아주세요. 렌파이는 Android 4.0용으로 컴파일 하니까요.



그 다음 링크를 생성해서 렌파이와 SDK간의 간극을 무마해야 합니다.


cd ~/renpy-6.99.10-sdk/rapt/android-sdk-r24.4.1/extras/google/

ln -s market_apk_expansion play_apk_expansion

ln -s market_licensing play_licensing


이렇게 해서 일단 같은 폴더를 다른 이름으로 가리키는 것을 무마합시다.


그러면 렌파이의 안드로이드 메뉴에서 Configure가 활성화 됩니다. 안되면 렌파이를 껐다가 다시 실행하세요.


그 다음 JDK문제를 해결해야 하는데요. ant에서 문제가 일어난 것이니 ant의 일부를 수정해야 합니다.


cd ~/renpy-6.99.10-sdk/rapt/android-sdk-r24.4.1/tools/ant/

build.xml 파일을 텍스트 에디터로 열어봅시다.


71번째 줄과 72번째 줄의


    <property name="java.target" value="1.6" />
    <property name="java.source" value="1.6" />


이렇게 고칩시다. 1.5는 더 이상 지원이 안되니까요.


그리고 oracle JDK 9을 설치하셨다면 JDK를 8로 낮춥시다.


어쩌면 그냥 oracle jdk 9을 지우는 것이 정답입니다...귀찮거든요.


그런데 JAVA_HOME 설정을 통해서 JDK8으로 고쳐야 하는데 이게 상당히 귀찮습니다. 그냥 Oracle JAVA를 안 깔고 그냥 OpenJDK만 깔고 넘어가는 것이 제일 정답인 것으로 보입니다.


이러면? 안드로이드 빌드가 삽질을 거쳐서 되기는 됩니다. 하기...싫다...


,