어찌된 영문인지는 모르겠습니다만 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만 깔고 넘어가는 것이 제일 정답인 것으로 보입니다.


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


,


리눅스를 쓴다면 가장 흔하게 보게 될 Bash의 모습. 그 위상은 Windows의 cmd와 비슷하다.


리눅스를 쓰신다면 명령 창, 터미널에 익숙해져야 한다는 것을 많이 들어보셨을 겁니다. 과거의 DOS를 쓰셨던 분들이라면 이러한 명령에 익숙하겠지만 GUI로 컴퓨터를 처음 쓰셨던 분들은 막막하기만 하지요. 하지만 Power User라면 Windows든 Unix든 이러한 CLI에 익숙해져야 난데없는 일이 일어났을 때 그나마 복구 할 수 있는 여력이 생깁니다.


그 중 쉘(Shell)이라는 표현을 들어 보셨을텐데요. CLI나 GUI나 이 쉘이 곧 UI의 역할을 해줍니다. Windows는 GUI 쉘로 Explorer를 Linux/Unix는 Gnome, KDE, Xfce, LXDE 등등...이 있는 셈이고(wayland용은 별개로 합시다.) CLI용 쉘로는 Windows는 cmd, Linux는 bash(가장 많이 쓰임), tsh, zsh 등이 있습니다. 흔히 bash가 일반적입니다.


과거의 Dos는 command.com 이 커널이자 쉘의 역할을 해 주었습니다. Linux/Unix/OSX는 보통 Bash를 CLI로 사용하고 있고 bash를 기본으로 스크립트를 사용합니다. bash가 나쁘지는 않지만 zsh가 더 편리한 기능이 더 많고 알아보기가 편합니다.


대표적인 것이 Tab 키의 기능인데 우분투는 각종 스크립트로 bash에 이와 비슷한 기능을 넣었지만 zsh에 비할 바는 못 됩니다.




bash의 경우 Tab을 누르면 현재 파일 리스트 중에서 찾아주지만(심지어 두 번 눌러야 하지요)zsh는 명령어 중에서 해당 명령어로 시작되는 것들을 바로 리스트로 뽑아내 줍니다.


그 외에도 vi와 vim의 관계처럼 약간의 색상을 통한 강조 비슷한 효과도 부여합니다.


그러면 한번 zsh를 사용해봅시다.


그러면 zsh를 설치해봐야겠지요?

sudo apt-get install zsh


그러면 아래와 같은 것이 나오는데 2번을 추천하므로 (추천하는 .zshrc 파일을 만들어서 관리 및 설정) 2번을 누르도록 합시다.



솔직히 설정하기 귀찮으니까 2번을 누르자. 0번을 누르면 뭘 잔뜩 물어본다고...


그리고 임시로 zsh 명령을 쳐서 zsh로 


chsh -s `which zsh`


chsh는 쉘 선택 명령어이고 which zsh는 zsh가 설치된 위치, /usr/bin/zsh를 말합니다. 이제 로그아웃 했다가 다시 로그온 하면 터미널의 쉘이 zsh로 변했을 겁니다.


하지만 oh-my-zsh!를 사용하면 이 강력한 zsh를 더 편리하게 만들어 줍니다. Firefox의 확장같이 zsh를 확장해주는 것이지요.

우선 curl을 설치하고 oh-my-zsh를 설치하는 스크립트를 사용하면 됩니다.


sudo apt-get install curl

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh


위 명령어를 사용하면 아래와 같이 나오는데요. 이제 zsh의 확장인 Oh my zsh!도 설치되었습니다. 여기서 몇 가지 기능을 사용하면 되는데요. 일단 쉘의 확장이기 때문에 로그아웃 했다가 다시 로그온 해주셔야 합니다.



Oh my zsh가 설치되었습니다! 짝짝짝


대표적인 것이 테마 기능인데요. 커맨드창에 무슨 테마냐 하시는 분들은

https://github.com/robbyrussell/oh-my-zsh/wiki/Themes


여기에서 나름 필요한 것이 있다는 것을 알게 될 겁니다. 시간이 뜨는 것은 유용할 것 같습니다.


일단 디폴트 테마는 robbyrusshell입니다.



굉장히 심플합니다. 하지만 저는 이게 별로 마음에 안 들더군요. 그래서 찾던 중에 agnosterzak이란 테마가 마음에 들어서 이를 설치했습니다.


http://raw.github.com/zakaziko99/agnosterzak-ohmyzsh-theme/master/agnosterzak.zsh-theme


위의 파일을 다운로드 받으신 다음에 ~/.oh-my-zsh/themes/ 에 복사해 넣으세요. 아니면


cd ~/.oh-my-zsh/themes/

wget http://raw.github.com/zakaziko99/agnosterzak-ohmyzsh-theme/master/agnosterzak.zsh-theme


위 명령어를 쓰시면 일단 테마가 추가됩니다. 그리고 ~/.zshrc 파일을 텍스트 에디터로 열고


ZSH_THEME="agnosterzak"


이렇게 바꿔주시면 그냥 터미널에서 배터리 잔량이나 시간 확인이 가능한 무시무시한 능력을 얻게 됩니다. 일단 스크린샷을 보시면 알게 될 겁니다.



...실수로 내 개인파일 리스트가 떠 있어서 지웠다.....

폰트 문제로 약간 문제가 있군요. 하지만 CLI 치고는 나름 예쁩니다. 저 깨지는 부분만 없애도 예쁠 것 같은데 어떻게 없애는 지는 모르겠네요.


~/.oh-my-zsh/themes/agnosterzak.zsh-theme


파일을 수정하면 될 듯한데 일단

SEGMENT_SEPARATOR=$'\ue0b0' # 


여기에서 e0b0을 25b6으로 수정해보겠습니다.


 기호를 ▶ 로 바꾸는 겁니다. 나름 괜찮겠지요.


..그럭저럭...그래도 이 정도면 뭐..


그럭저럭 볼 만은 하네요. 일단 여기서 그만둬야 할 것 같습니다. 저 날짜 순서도 마음에 안드는데 더 건드렸다가는 끝이 없을 것 같습니다. 일단 298번째 줄


  prompt_segment blue white "$fg_bold[white]%D{%a %e %b - %H:%M}$fg_no_bold[white]"


여기를 이렇게 바꾸면 될 것 같은데...


  prompt_segment blue white "$fg_bold[white]%D{%b %e %a - %H:%M}$fg_no_bold[white]"


이렇게는 한도 끝도 없을 것 같네요. 우선 저의 잠을 위해...


이상 zsh와 oh-my-zsh였습니다.

,

아시다시피 리눅스는 굴림체를 쓰지 않습니다. 당연하게도 굴림체는 Microsoft의 물건이기 때문입니다. 하지만 굴림체가 워낙에 흔하기 때문에 쓸데없이 굴림체를 사용하는 사람들이 적지 않습니다. 여기서 끝나면 다행인데 한글 폰트는 Bold폰트를 따로 가지고 있지 않아서 겹쳐서 굵은 것처럼 표현하는 일명 FakeBold 기술을 사용하는데 FakeBold의 기능이 Windows의 것과 FreeType(리눅스와 기타 등등의 OS에서 사용하는 라이브러리)의 것이 좀 많이 다릅니다.


덕분에 다음과 같은 일이 일어나곤 합니다.


이렇게 보면 모르겠지만 실제로 보면 참 글씨가 더럽다.


그림에서 잘은 안 보이시겠지만 네이버 메인화면에서 Bold 처리된 글씨의 가독성이 현저히 떨어집니다. 사실 네이버만 그런 것이 아니라 다른 사이트들이 다 이 모양입니다. 아무래도 백묵 폰트처럼 힌팅이 없는 폰트로 설정이 된 것 같은데 이를 쉽게 해결하는 방법을 이야기 해 보겠습니다.


우선 미리 이야기 하자면 우리가 원하는 것은 아래와 같은 화면입니다.


그나마 깔끔해진 외관. 나눔고딕 특유의 힌팅이 적용되어 미려해진 느낌이다


위의 이미지와 비교해보시면 글씨의 가독성이 좋아졌음을 알 수 있습니다. 사실 이건 아주 간단한 확장 하나로 처리하는 겁니다. 이름은 직설적으로 Font Changer 입니다.



여기까지 알려줬는데도 못 찾는 사람들이 있다. 그럴 때는 그림을 보도록!



크롬 웹스토어 http://chrome.google.com/webstore/ 에서 "Font Changer"라고 검색만 해도 쉽게 찾을 수 있습니다. 구글의 웹 폰트를 이용하지만 원하는 폰트를 추가가 가능합니다. 물론 너무 무거운 폰트는 사용 불가능합니다. 저는 가볍고 Bold폰트가 이미 들어가 있어서 FakeBold에 따른 문제가 전혀 없는 나눔 고딕을 사용하기로 했습니다. 나눔 고딕은 우분투에서 /usr/share/fonts/truetype/nanum/ 여기에 있으니 여기서 복사해서 미리 빼놓으시는 것이 편합니다. (단순히 복사해서 두는 것이기 떄문에 관리자 권한 없어도 됩니다.)



나눔고딕이 요기잉네?


설치 이후에 주소 줄 옆에 FC라는 아이콘이 추가 되는데 이를 클릭하면 폰트를 선택할 수 있게 됩니다.



 

일단 모든 사이트에서 같은 폰트로 뜨게 하는 것이 좋으니 Use Global Settings로 맞춰 놓고 Edit Custom Fonts를 누릅시다.




그 다음 나오는 페이지에서 파일 선택을 눌러 아까 빼 놓았던 나눔고딕.TTF 파일을 선택합시다. 그리고 Save Font를 클릭해주시면 ABeeZee 폰트 대신 나눔고딕을 선택할 수 있게 됩니다. 같은 방법으로 다른 폰트를 쓸 수 있는데 크기가 너무 큰 폰트는 인터넷 서핑을 힘들게 하기 때문에 별로 추천하지 않습니다. 나눔고딕이 약 2.4MB 정도입니다. 대략 이 정도면 괜찮다고 생각해주시면 됩니다.


사이트마다 다른 폰트를 적용 가능하니 이럴 때 애용해주시면 굴림체 같이 애매한 글씨체보다 더 쓸 만한 한글 글꼴로 인터넷이 가능해집니다. Firefox는 이런 것이 없는지 찾아봐도 안 나오네요. 물론 크롬보다 글씨체가 꽤 정돈되어 있어서 굳이 이 작업을 할 필요는 없습니다.

,