광고는 정말 인터넷에서 빠질 수 없는 수익 요소 중 하나 입니다. 인터넷의 황제라 불리는 구글도 엄연히 말하면 광고회사라고 할 수 있을 정도로 광고를 통해 얻는 수익은 정말 무궁무진합니다. 무료앱들만 봐도 광고를 잠깐 봐주는 것으로 현금이 나가지 않게 조치를 취해주기도 합니다. 인터넷에서 무료로 정보를 얻을 수 있는 것도 광고 덕이라고 할 수 있습니다. 하지만 너무 과한 광고는 웹페이지의 레이아웃을 망치고 또 보는 사람의 눈을 찌뿌리게 할 수있습니다. 그래서 시작 된 것이 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이 되겠습니다. (다른 브라우저는 지원이 안 됩니다.)



,

렌파이에는 대사를 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가 돌아가는 동영상도 하나 올리겠습니다.

,

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


렌파이 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만 깔고 넘어가는 것이 제일 정답인 것으로 보입니다.


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


,

FTP는 상당히 오래전에 만들어진 규약입니다. 파일 배포를 위해 만들어진 규약인데 대표적으로 쓰이는 곳은 여러분이 사용하는 리눅스의 패키지 저장소가 있습니다. 


국내 유명 리눅스 저장소 중 하나인 카이스트 FTP 서버 이러한 불특정 다수에게 파일 배포하기 좋은 프로토콜 중 하나가 FTP이다




대표적인 FTP클라이언트 FileZilla 굉장히 안정적이며 모든 OS를 지원하는 등 국내의 어떤 프로그램 보다 훨씬 낫다.



파일 저장과 파일공유를 중심으로 하는 NAS를 만드시겠다면 이 FTP를 빼 먹을 수는 없겠지요. 이전의 Webmin을 사용한 웹 서버겸 NAS 구축기 (http://moordev.tistory.com/108)를 보셨다면 중간에 ProFTPD를 설치를 알게모르게 했습니다. 최근에는 VSFTP가 더 많이 쓰인다고 하지만 ProFTPD는 Apache처럼 상당히 오랜기간 사용되었던 FTP서버 프로그램 중 하나입니다. 사실 Webmin에서 기본적으로 지원하는 서버가 이거였기도 했고 저도 믿음이 있는 서버프로그램이라 이걸 사용했습니다. 보안상 문제가 있었다고 하지만 업데이트는 충실히 되고 있고 만약 정말로 문제가 크게 일어났다면 데비안 저장소에서 내렸겠지요.


저번 글이 기본적인 서버의 뼈대 구축기였다면 이번에는 그 뼈대에 FTP를 발라 기본적인 구성을 하게끔 하는 것을 목적으로 하겠습니다. 저번 글을 못 보신 분은


http://moordev.tistory.com/108


여기가서 Webmin을 서버에 설치하는 단계까지 와주시길 부탁 드립니다.

이전 글에서 우리는 마지막에 Webmin을 설치하고 Webmin이 지원되는 서버인 (Apache+PHP+MySQL),ProFTPD를 설치하는 단계까지 갔습니다. 이후에 Webmin관리 페이지에서 각 모듈을 설정할 수 있는 단계까지 왔었습니다.




이중에서 제일 신경 써야 하는 부분은 ProFTPD의 디렉토리 부분과 로그인 부분으로 보안상 굉장히 중요하며 파일 공유를 대충 하면 여러분의 서버 프로그램이 엉망이 될 수도 있습니다.


그리고 그 다음에는 MonstaFTP를 웹서버에 설치하는 단계입니다. 이건 간단하게 SSH나 터미널로 처리하도록 합시다.


MonstaFTP를 /var/www에 설치하시면(쉽게말해 웹서버의 메인 디렉토리입니다. 보통 아파치는 여기가 기본이고 나중에 바꿀 수 있지만 귀찮으니 저희도 여기에 그냥 설치해버립시다.) 웹에서 FTP접속을 해서 쓸 수 있습니다. Webmin의 자체 파일 탐색기도 있지만 Webmin자체가 관리 페이지이니 이걸 다른 사람과 공유한다는 것은 어렵겠지요. 그래서 MonstaFTP를 사용하는 겁니다.


MonstaFTP의 홈페이지 주소는 여깁니다. http://www.monstaftp.com/


SSH나 자체 터미널에서 설치하는 방법을 간단하게 긁어 드리겠습니다.


cd /var/www

sudo wget https://www.monstacdn.com/download/monsta_ftp_v1.8.5_install.zip

sudo unzip monsta_ftp_v1.8.5_install.zip

sudo service apache2 restart


끝입니다. 이제 MonstaFTP가 설치되었습니다.


http://서버IP/mftp


여기로 접속하시면 FTP에 접속 할 수 있는 페이지가 뜨는데 서버의 IP를 적으라고 합니다. 게다가 영문 인터페이스군요. 이걸 해결하도록 해봅시다. 다시 SSH를 접속해봅시다. (몰랐는데 Webmin에 SSH기능도 있다고 합니다. 그런데 느려서 별로 추천은 하기 싫습니다. 그냥 putty가 낫습니다.)



sudo nano /var/www/mftp/config.php


$ftpHost = "서버IP"

#ftpHost에 내 서버의 IP주소추가


Ctrl+O Ctrl+X를 순서대로 눌러 저장 후 탈출


sudo nano /var/www/mftp/languages/en_us.php


$file_lang_default = 0;

#1로 되어있는 것을 0으로 수정


Ctrl+O Ctrl+X를 순서대로 눌러 저장 후 탈출


sudo nano /var/www/mftp/languages/ko_ko.php


$file_lang_default = 1;

#0으로 되어있는 것을 1로 수정


Ctrl+O Ctrl+X를 순서대로 눌러 저장 후 탈출


sudo services apache2 restart


이제 들어가 보시면 한글로 되어있고 서버IP를 적는 곳이 사라진 깔끔한 화면을 볼 수 있습니다. root가 아닌 설치할 때 만든 유저계정으로 로그인하시면 파일의 업로드와 다운로드가 가능합니다. 심지어 드래그 앤 드롭도 먹힌다고 하네요. 다만 기술적인 이유로 크롬만이 폴더 업로드가 가능합니다.



다만 업로드 제한이 128MB로 상당히 작은 것을 알 수 있는데 이는 php.ini의 설정 문제로 Webmin의 PHP설정에 들어가서 MemoryLimit을 수정 함으로서 제한을 풀 수 있습니다. 대신 서버의 메모리보다 크게 잡으시면 서버가 크게 느려집니다.

,

이전에 저는 낡은 PC로 토렌트머신을 만드는 것을 하나 알려드린 적이 있습니다.

http://moordev.tistory.com/21


그런데 토렌트만 굴리기에는 PC의 성능은 매우 아깝습니다. 그럼 여기에 웹서버를 굴려서 개인NAS로 만드는 것은 어떨까요? 하지만 웹서버관리는 초보에겐 너무 어렵습니다. 하지만 GUI로 한다면 이야기는 달라지겠지요. 서버관리를 GUI(사실은 web기반)로 하게 해주는 도구가 바로 webmin입니다. (http://www.webmin.com/)일단 말이 나왔으니 한번 해보도록 합시다.


일단 준비물은


1. 오늘내일 하는 PC

2. 리눅스 배포판 아무거나 좋은 것(개인적으로 개인 서버는 Debian이 좋다고 생각합니다.)

3. 인터넷

4. 기본적인 네트워크 관련 지식(IP, http 같은 것이 뭔지는 알아야 해보던지 하지요...)


자 이제 제일 먼저 해야 할 일은 리눅스를 설치하는 일 입니다. 윈도우도 서버를 만들 수 있지만 기본적으로 윈도는 서버 성능이 영 아니라서 리눅스나 BSD같은 OS를 쓰는 것을 원칙으로 합니다. 물론 윈도 서버도 어느정도 있지만 윈도로 서버를 굴리느니 Lubuntu로 서버를 만드는 것이 100배 낫습니다.


저는 우분투를 좋아하지만 서버OS는 안정화가 매우 중요하다고 생각하기 때문에 우분투보다 더 안정적인 Debian을 선택했습니다. 어차피 우분투나 데비안이나 사용 방법은 동일해서 새로 배운다거나 그런 것은 전혀 없습니다.


일단 설치할 때 파티션을 나누는데 우분투처럼 자동 파티션, 혹은 한 파티션에 몰아넣기 보다는 수동으로 설정해서 NAS의 공유 자료가 들어갈 Data 파티션을 하나 만들어두는 것이 좋습니다. 물론 포맷은 ext4같은 저널링 기능 있는 것을 해줘야 마음이 편합니다.


자세한 내용은 https://www.debian.org/releases/jessie/amd64/index.html.ko 여기를 참고해주세요. 참고로 설치 중에 어떤 서버를 쓸 건지 선택하는 곳이 있는데 다른 것은 몰라도 SSH는 무조건 해줘야 편합니다. 서버는 보통 모니터를 떼버리고 사용하기 때문에 SSH로 원격 접속해서 작업을 합니다. 그리고 root 혹은 root에 준하는 (sudo 사용이 가능한)계정의 패스워드는 간수를 잘 해야 합니다. 해킹이란 의외로 우리 가까이에서 일어납니다.


일단 서버 OS가 설치되었다면 서버를 켜놓고 SSH로 접속하거나 직접 서버에서 키보드로 명령을 내리면서 작업을 합시다. 일단 webmin만 설치하면 이후에 명령을 따로 쓸 일은 거의 없습니다. webmin만 있으면 별도의 아파치같은 웹서버를 추가로 설치하고 각종 서드파티 플러그인을 추가해서 관리하는 등의 일련의 작업을 웹브라우저에서 할 수 있습니다.


일단 webmin을 설치하려면 데비안 기준으로(우분투도 동일)

source.list에 추가해야 합니다.


다음과 같은 명령을 써봅시다.



sudo nano /etc/apt/sources.list

그리고 아래에 다음과 같이 2줄을 추가합시다.


deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

그리고 Ctrl+O를 누르고 Ctrl+X를 누르시면 다시 명령 행으로 빠져나오는데요. 다시 다음 명령을 쳐서 PGP키를 추가합시다. 우분투는 이를 편리하게 만든 스크립트가 있었지만 webmin은 지원이 안 됩니다.


wget http://www.webmin.com/jcameron-key.asc
sudo apt-key add jcameron-key.asc

sudo apt-get update


이제 대망의 설치만 하면 됩니다.


sudo apt-get install webmin


아니면 직접 deb을 받아서 설치하셔도 됩니다.


wget http://www.webmin.com/download/deb/webmin-current.deb

sudo dpkg -i webmin-current.deb

대신 이렇게 하면 자동 업데이트가 안 되니 APT 방식을 추천합니다.


이제 webmin을 설치했으니 웹 브라우저에서 접속해봅시다.(IE는 안 되는 것으로 보입니다. edge나 Safari, chrome, Firefox에서 하세요.)


주소는 https://서버IP:10000 입니다. 인증서 관련해서 에러가 나는데 우리 서버는 인증을 받은 적이 없으니 무시하도록 합시다. SSL을 안 쓰게 해서 넘어가는 방법도 있는데 일단은 접속은 해야 하니 무시하고 넘어갑시다.



어쩔 수 없다 그냥 예외로 하자. 아니면 /etc/webmin/miniserv.conf 에서 ssl=0으로 하면 된다.



일단 예외로 처리하거나 SSL설정을 바꿨다면 로그인 창을 하나 볼 수 있습니다. 그런데 여기서 막막해집니다. 비밀번호가 뭐였더라???


보통은 아까 설치했던 리눅스의 root와 그 비밀번호가 정답입니다. 하지만 접속이 안 됩니다. 이유는 설정을 안 했으니까요.


아직 터미널 작업은 끝나지 않았습니다. 마무리 비슷한 작업이 필요합니다. 사실 이번에 알려드릴 명령은 배포판마다 다른데 저는 데비안/우분투 버전을 기준으로 설명하겠습니다.


모든 경로는 Deb으로 설치했을 때를 가정합니다. 소스 컴파일은 또 달라집니다.

cd /usr/share/webmin

sudo perl changepass.pl /etc/webmin root 비밀번호


일단 이렇게 해 놓고 다시 웹 브라우저에서 ID는 root로 비밀번호를 입력하시면 접속이 될 겁니다. 참고로 여기서 설정한 비밀번호와 진짜 root의 비밀번호는 다릅니다. 상관이 전혀 없으니 신경 끄셔도 좋습니다.



이름은 root이고 Password는 원하는대로


Webmin은 BrutalForce 공격을 막기 위해 약간의 방어 장치가 있습니다. 만약 비밀번호가 5번이상 틀리면 해당 IP를 블록 해버립니다. 근데 이 방어 장치가 오류나 실수로 주인을 막을 때가 있습니다. 그때는 SSH 클라이언트로 접속 후에 다음 명령을 쓰시면 됩니다.



sudo cp /dev/null /var/webmin/blocked


이렇게 하면 열심히 막았던 블록IP 들이 풀리기는 하지만 주인도 못 들어가는 어이없는 것보다는 낫습니다.


일단 접속 하고나면 번잡한 느낌이 듭니다. 그도 그럴것이 webmin은 상당히 오래된 프로그램으로서 쌓인 기능이 엄청납니다. 우리는 이중에서 일부만 사용할 예정입니다.



웹에서 시스템의 전반적인 것을 점검할 수 있다.


웹에서 직접 파일 조작도 가능


우리는 이를 NAS로 쓰기 위해서 apache webserver, Samba Windows File Sharing, ProFTPD를 설치할 겁니다. 물론 PHP5도 필수입니다.


webmin에서 Unused modules 항목에 가면 이것들이 있습니다. 이것을 누르면 설치하는 링크를 하나 던집니다. 만약 설치 링크를 못 찾겠다면...SSH를 다시 씁시다. 사실 이쪽이 더 편할 수도 있습니다.



sudo apt-get install apache2 php5 proftpd samba mysql


이렇게 하면 웹서버와 FTP, 삼바 설치는 완료입니다.


그리고 다시 webmin에 가시면 un-used module에 있던 것들이 Server에 들어간 것을 볼 수 있습니다. 이제 여기서 설정을 할 수 있습니다.


자세한 설정은 다음에 하기로 하고 일단 webmin을 사용한 웹기반 웹서버 관리도구를 구축했습니다. 여기서 FTP를 설치했으니 /var/www에 디렉토리 설정을 하면 바로 웹페이지를 FTP로 올릴 수 있겠지요. 이건 NAS이기도 하니 아까 빼놓았던 Data 파티션을 마운트해서 여기를 쓸 수 있게 하면 더욱 편리합니다. 



webmin의 ProFTPD 설정에서 Directory and Files설정 여기서 Directory 부분을 수정해서 FTP로 쓸 곳을 직접 적도록 하자.

마찬가지로 Samba도 Webmin에서 디렉토리 설정이 가능하므로 그냥 웹에서 뚝딱 거리면 됩니다.


문제는 웹 서버인데 Pydio나 ownCloud 같은 것을 /var/www에 올려주시면 웹에서 접속가능한 페이지가 완성됩니다. 하지만 저는 이 물건들 보다 웹용 FTP 클라이언트인 MonstaFTP를 올리고 FTP를 웹에서 하는 것을 추천 드립니다. 일단 낡을 대로 낡은 PC에서 ownCloud를 돌리기에는 너무 성능이 모자랍니다. 반대로 MonstaFTP로 FTP를 웹에서 하면 ownCloud같이 웹에서 그림을 직접보거나 PDF를 읽어내는 것은 할 수 없지만 파일 공유라는 측면에서는 더욱 충실합니다. 


MonstaFTP에 관한 내용은 다음에 하기로 하고 일단 http://서버IP로 한번 웹페이지에 접속해봅시다.


만약 Apache관련 페이지가 나왔다면 웹 서버 설치는 성공입니다.


나머지 FTP설정과 Samba는 다음에 해보기로 합시다.

,

Sunrider Academy는 스팀에서 팔고 있는 야겜*-_-*입니다.


스팀에디션과 Denpa에디션이 있는데 스팀에디션은 검열삭제를 했고 Denpa에디션은 그냥 풀버전입니다..그래서 Steam to Denpa로 만들어주는 모드도 돌아댕기고 있습니다. 뭐..이건 저한테 묻지마세요.


일단 이놈도 렌파이 기반입니다. 따라서 안드로이드 포팅이 됩니다.


Ubuntu 14.04

OpenJDK7

Python 2.7

Ren'Py 6.99.10

rpatoolhttps://github.com/Shizmob/rpatool


Android 4.0 IcecreamSandwich이상


고맙게도 Long Live The Queen때와는 다르게 rpy파일이 같이 있습니다. unrpyc같은 고생은 안 해도 됩니다.


그냥 Renpy폴더에 /.steam/steamapps/common에 있는 Sunrider Academy 폴더를 복사해서 가져옵니다.


그리고 rpatool을 Sunrider Academy/game폴더에 넣고 다음과 같이 명령을 내립시다.

python rpatool -x archive.rpa


그러고 나면 rpa아카이브가 풀리면서 CG등을 볼 수 있게 됩니다. 이 부분은 안드로이드가 rpa지원이 아직이라 rpa를 풀어주는 작업을 하는 겁니다.


그리고 렌파이를 실행하고 안드로이드 포팅을 시도하면....'


에러납니다.


렌파이 엔진은 무한루프를 막기위해 일부 기능이 작동하는데 무한루프가 아님에도 성능 문제로 이 기능이 작동해 버린겁니다. 따라서 위험하기는 하지만 일단 안드로이드 APK을 만들기 위해 해당 기능을 정지하도록 합시다.


본래 renpy.exe renpy.sh가 있는 폴더(즉 SDK)에서 renpy으로 들어가시면 execution.py가 있습니다. 여기서 한줄을 삭제합니다.


54번째 줄 raise Exceptoion~~앞에 #을 넣으시면 됩니다.


    if time.time() > il_time:
        il_time = time.time() + 100
        raise Exception("Possible infinite loop.") 

     if time.time() > il_time:
        il_time = time.time() + 100
        #raise Exception("Possible infinite loop.")

요렇게 말이지요.


이제 안드로이드 빌드를 하면 무사히 되기는 하는데 오프닝 영상에서 에러납니다. 제일 무식한 방법은 오프닝을 스킵하는 겁니다.


game/script.rpy열고 308, 310줄 앞에 #을 붙여서 오프닝 자체를 재생못하게 하면 무사히 넘어갑니다. 아니면 안드로이드에서 그냥 재생 가능한 형식으로 인코딩 하면 되는데 game/CG/opening.avi 파일을

https://www.renpy.org/doc/html/android.html

http://developer.android.com/intl/ko/guide/appendix/media-formats.html


여기를 참고하셔서 해당 형식에 맞게 인코딩 하면 되는데 귀찮으니...그냥 오프닝을 스킵하는 것으로 결정했습니다.... webm정도가 가장 적당할 것으로 보이는데....인코딩은 너무 귀찮습니다. 어차피 오프닝 잘 보지도 않으니 넘어가는 것으로...(성능문제도 있고...)


한글패치는 안드로이드 빌드 전에 ghap님 블로그(http://ghap.tistory.com/category/SUNRIDER%20ACADEMY)가서 미리 적용해주시면 끝입니다. LLTQ와 달리 그냥 덮는 방식이라 따로 사후 작업은 없습니다.


...근데 이거는.LLTQ보다 더 하기 힘들겠는데..??


2016. 5.6


하다보니 안드로이드 버전만의 버그가 있습니다. 점심시간, 방과후에 맵 선택 부분에서 버그가 있습니다.

자세히 보니 focus_mask 옵션 관련 버그입니다. 현재로써는 방법이 없는듯 해서 그냥 maps.rpy파일을 그냥 뜯어 고쳤습니다. 기존에는 마우스 선택을 기준으로 잡혀 있었는데 버튼을 클릭해야 넘어가게 했습니다. 지금 보니 코드가 원래 더러웠네요. 작은 기업이라 어쩔 수 없었겠지만 솔직히 코드가 통일성이 없습니다... 뭐 이따위로 만들었냐...


일단 maps.rpy만 왕창 수정해서 올립니다. (결국 수정해야 했잖아..)game 폴더에 덮어주세요.



maps.rpy


,

TextHooker란 프로그램들을 아시나요? 사실 대부분의 일본산 비주얼노벨 게임을 하신 분들이라면 비슷한 프로그램들을 상당히 많이 알고 계실겁니다.

제일 유명한 것이라면 TextHooker중에서 제일 대중에게(?) 퍼진 Oh! TextHooker가 있습니다. 이외에도 4chan에서 만든것으로 추정?되는 AGTH(Anime Game Text Hooker)와 중국에서 만든것으로 보이는 VNR(Visual Novel Reader) 등이 있습니다. 상당히 많은 프로그램들이 있는데 이들의 공통점은 공통적으로 쓰이는 API(대표적인 것이 TextOut())를 후킹해서 문자열을 끌어낸다음 번역기나 사용자사전을 써서 번역된 문장을 출력하는 것이 목적입니다.



각종 TextHooker의 할아버지뻘인 Oh! TextHooker 지금도 돌아가는 게임이 있다! (출처:http://ohhara.sarang.net/ohthk/scrshots.html)

 


가장 최신의 기술로 무장했고 편의성도 훌륭한 VNR의 모습. 출처 : https://namu.wiki/w/VNR


API후킹 기술은 사실 어둠의 영역에서도 자주 사용되었고 빛의 영역에서도 상당수 이용됩니다. 대표적인 어둠의 영역은 키보드의 이벤트를 후킹해서 키입력 로그를 만들어 해킹하는 곳에 사용되는 것을 말 할 수 있습니다. 하지만 대개 이런 부류는 백신에서 쉽게 잡아냅니다. 빛의 영역은 시각장애인용 TTS프로그램을 들 수 있습니다. 마우스를 움직이면 마우스 아래에 있는 문장을 읽어들여서 TTS로 읽는 것이지요. 이런 프로그램은 상당히 종류가 많습니다. 그런데 리눅스에서는 이런류의 프로그램이 사실상 없습니다. Firefox나 Chrome의 확장에서는 있는 것 같지만 인터넷 웹환경에 한해서만 작동하기 때문에 한계가 있습니다.


애초에 이런 게임들이 당연히 (일본어판) Windows전용이다보니 참 문제가 많습니다. 리눅스에서 굴린다는 것 부터가 이미 글러먹은 것이지요. 그것도 번역기를 통하려고보니 더 엉망진창이고요. Wine은 DLL injection이나 API Table같은 기술이 잘 먹히지 않습니다. 본래의 API와 외부 구조는 비슷하지만 내부 구성이 다르기 때문입니다. (내부 구성까지 같으면 Wine은 Windows의 저작권에 위배되는 프로그램이 됩니다.) 즉 VNR이나 Oh! Text Hooker는 정상적인 동작이 보증되지 않습니다.

애매한 것으로 Mort란 것이 있기는한데 이건 OCR을 쓴 것이니 넘어가도록 합시다.(이전에 제가 Mort의 기술을 써서 리눅스에서 비슷하게 굴린적이 있습니다.)


그런데 API 후킹의 원리는 API의 외부 구성을 그대로 만들고 본래의 API대신 자신이 끼어들어 이리저리 조작한 후 본래의 API를 호출하는 원리입니다. (본래의 API를 호출하지 않으면 프로그램이 정상적으로 돌지는 않을 겁니다. 문자열이 나와야 하는데 안 나온다거나...)그런데 이거 Wine이 하는 짓하고 비슷합니다. http://moordev.tistory.com/83 그래서 저는 여기서 이런 방법은 어떤지 제안을 한 적이 있습니다. 해 본 결과 폭망이었지만 (애초에 구조가 달라서 먹히지 않습니다.) 역으로 리눅스에서 Wine으로 게임을 굴리면서 후킹하는 것은 어렵지 않게 구현할 수 있었습니다. gdi.so소스를 뜯어고치면 TextOut()함수를 내 마음대로 돌아가게 하는 것은 어렵지도 않고 CreateFont()함수도 고쳐버리면 폰트도 내 마음대로 바꿀 수 있게 되는 겁니다.(이건 AppLocale의 원리와 같습니다.)


그래서 sprintf함수로 문장을 처리하는 게임을 타겟으로 삼아 Wine에서 구현한 sprintf함수 조작한 다음 sprintf 출력 문장을 디버그창에 띄우게 했더니...의외로 잘 나오네요.


......이거 잘하면 리눅스용 후커도 만들 수 있을 것 같습니다. 번역 엔진이 문제이기는 한데 그건 그냥 구글번역을 통하면 될 듯하고 Chrome하고 연동하는 방법을 쓰면 구글번역기능도 쉽게 쓸 수 있을 듯 합니다. 하지만 이건 윈도용 게임이야기이고 리눅스용 게임은.....나중에 생각하도록 합시다. 아직 리눅스용 게임은 이러한 물건은 적으니까요.



,

해당 글의 출처는 http://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_devices/ati-mobility-radeon-x1400-windows-10-driver/594df373-5b5e-4298-acf0-a6a37669b297?auth=1

여기입니다.


저에게는 그동안 쓴 우분투노트북 말고도 이전부터 쭉 써오던 노트북이 한대 더 있습니다. 이제는 서브로 밀렸지만 (10년 넘은 물건입니다. 즉 말년 예비역) 가끔 윈도우가 절실히! 필요할 떄 꺼내는 물건입니다.


이번에 기존에 있던 Windows8.1을 10으로 업그레이드를 시도했습니다. 중간에 문제가 있기는 했지만 정품인증후에(새벽에 전화인증했습니다.) 클린 설치를 다시 함으로써 해결했습니다. 한번 인증받은 컴퓨터는 클린설치후에 자동으로 인증이 되더군요. MS가 정품인증에 말이 많더니 예쁜 구석이 생겼습니다.


그런데 무슨이유에서인지 다른 드라이버는 다 되는데 그래픽 드라이버만 설치가 안 됩니다. 이전에는 강제 설치하는 옵션이 있었는데 10에서는 없어진 듯 합니다. 이야기를 들어보니 살짝 Modding을 해야 한다고 하더군요. 그래서 우분투 블로그지만 우분투를 대신하여 윈도를 서브로 쓰시는 분들을 위한 글을 적도록 하겠습니다.


ATI가 AMD에 먹히고 난 다음 드라이버개발이 중단된 칩셋이 상당히 많습니다. 이것은 윈도우 뿐만 아니라 리눅스에서도 문제가 많았던 사안입니다. 대다수 포럼에서는 그냥 바꾸라는 이야기만 나오더군요. 하지만 XP에서 8과 8.1을 거쳐 10까지 올라가고도 깔끔하게 돌아가는 이 노트북을 버릴 수는 없었습니다. 심지어 이 노트북은 리눅스 민트를 GPU가 없는 상황에서도 돌렸던 정말 대단한 물건입니다.


저는 ATI의 X1400칩셋을 사용한 노트북입니다. 해당 노트북은 Vista드라이버까지만 나온 형편입니다. 7이나 8에서는 이를 강제설치함으로써 해결했었는데 8.1이나 10은 이게 안 됩니다. 그리고 각 노트북 업체의 드라이버를 사용하는 것이 제일 좋지만 제조사도 포기한 물건이면 이야기는 달라집니다. 이럴 때는 그냥 아무 노트북 업체의 드라이버를 맞춰서 설치해야 합니다. 저 같은 경우에는 삼성제임에도 레노버사의 드라이버를 사용했습니다.


http://support.lenovo.com/kr/ko/downloads/ds004138


대신 Modding만 잘 하면 다음부터는 문제가 전혀 없으니 걱정 없습니다.

AMD에서 제공하는 legacy 드라이버도 상당히 좋지만 해상도 관련해서 약간 문제가 보여서 이는 PASS하기로 하고 제조사 지원 드라이버만 사용하기로 했습니다.(심지어 다른 회사 것이지만...)


일단 드라이버의 압축을 풀어버리면 여러가지가 쭉 나옵니다. 우리는 여기에서 Packages\Drivers\Display\LH_INF (32비트)

Packages\Drivers\Display\LH6A_INF (64비트)


여기만 이용하기로 합니다. Setup.exe 뭐 이런거 안 씁니다. 어차피 동작도 안 하는데 왜 씁니까... 특히 다른 것보다 이 안에 있는 CL_XXXXX.inf 파일을 메모장으로 열어서 수정하는 것으로 강제 설치의 준비가 완료 됩니다.



이 녀석이 나의 손에 개조 당할 녀석이다. 아 물론 64비트는 조금 다르다.(이 노트북은 워낙 구식이라 32비트를 쓴다.)



그리고 (시작메뉴에서 오른쪽 버튼을 누르면 나오는 메뉴에서) 장치관리자/디스플레이 어댑터/Microsoft 기본 디스플레이 어댑터 에서 오른쪽 버튼을 누른뒤에 속성에 들어가 봅시다.



범인은 두번째 녀석이다! 다른 놈은 됐고 두번째 것과 같은 스타일의 문장만 복사해두자

그다음 자세히 탭에서 속성을 하드웨어ID로 보게되면 값이 이것저것 나오게 됩니다.그 중 두번째것을 내용을 복사합시다. 그냥 오른쪽버튼을 누르면 복사할 수 있는 메뉴가 나옵니다.

그리고 복사를 클릭해서 복사하면 됩니다.


그리고 아까 개조를 위해 준비했던 INF파일을 메모장으로 열도록 합시다.



이를 뒤지다보면 아까 PCI\VEN_~~~~해서 있는 부분을 찾을 수 있는데 이중에서 자신의 장치 이름을 찾아서 PCI\~~부분을 아까 복사했던 내용으로 바꿔 버립시다. 다른 장치는 설치할 생각조차 없으니 무시하고 갈아버립시다.


그리고 저장하면 끝입니다. 그런데 한가지 문제가 더 있습니다. 8.1 이후에 MS는 드라이버를 강제 업데이트를 해 버리는 문제가 있습니다. 이를 막기 위해서 Windows키+R을 누른뒤에gpedit.msc를 쳐서 실행합시다.


그리고 컴퓨터구성-관리템플릿-Windows 구성요소-Windows 업데이트 순서대로 누른뒤에 자동업데이트 구성을 더블클릭합니다.



글씨가 잘 안보인다! 제길! 아무튼 꼭 할 필요는 없지만 필요하다면 저런식이라고 생각하면 된다.



그리고 자동업데이트 구성을 "2. 다운로드 및 설치 할 때 알림"으로 설정해놓습니다. 이렇게 해두고 업데이트 할 때 드라이버를 업데이트 하는지 안 하는지를 확인 할 수 있습니다. 만약 드라이버를 업데이트 하려고 하면? 해당 업데이트만 안 하면 됩니다.


그리고 이제 강제 드라이버 설치단계만 남았습니다.

8.1과 마찬가지로 약간 번거로운 단계를 거쳐야 합니다. 고급시작단계를 거쳐야 하는데요.

http://manee-mx.com/index.php/archives/2515

여기에 나온 내용과 동일합니다.


시작-설정-업데이트 및 복구-복구-고급시작 옵션-다시시작



해당 버튼을 누르면 일단 재부팅후에 메뉴를 선택하게 되어있는데요. 이 중에서 문제해결을 누르고 시작설정을 선택합니다.

그러면 또 재시작(!)을 하는데 이번에는 이전에 F8을 눌렀을 때의 추억이 되살아나는 메뉴가 나옵니다. 여기에서 7. 드라이버 서명 적용 안함을 누르고 부팅을 합니다. 이제 끝났습니다. 아까 열심히 수정했던 드라이버를 수동으로 설치하도록 합시다.


장치관리자에서 디스플레이 어댑터-드라이버 업데이트를 누릅시다. 그리고 컴퓨터에서 찾아보기 - 드라이버 목록에서 직접선택 - 디스크있음 그리고 아까 수정했던 INF파일을 선택합시다. 그러면 경고문구가 뜨는데 가뿐히 무시하고 설치를 합시다. 그러면 몇번 깜빡깜빡하더니 해상도가 올라갑니다! 혹은 3D가속이 되는 것을 볼 수 있습니다. 올레!


이로써 제 노트북은 10년동안 OS가 XP에서 8을 거쳐(업그레이드 라이센스 7만원...)10으로 업그레이드가 완료 되었습니다. 와우!

,



공돌이들의 친구 Matlab은 3대 OS를 모두 지원하는 프로그램입니다. 저도 덕분에 리눅스용을 설치해서 엄청 애용하고 있습니다.

 대다수 학교나 공공기관은 Windows용을 사용합니다만, 어차피 라이센스가 OS상관없이 호환되기 때문에 학교에서 구입한 Matlab을 리눅스에서도 별 문제없이 잘 쓰고 있습니다. 그런데 리눅스용을 쓰다보면 기존 Windows사용자들과 충돌이 가끔 벌어지는데 Windows용과 리눅스용은 단축키가 다르다는 문제가 있습니다.


원인은...Mathworks사에서는 리눅스용 Matlab을 만들때 리눅스에 기본적으로 포함된 Emacs의 단축키로 기본 세팅하기 때문이었습니다. 헌데, 리눅스 데스크탑도 Emacs단축키보다는 Windows단축키를 사용하는 것을 감안하면 뻘짓이지요.


Emacs를 쓰시는 분들이 그다지 많지 않은 관계로 대표적인 단축키가 어떤 차이가 있는지 말씀드리겠습니다.



 Emacs

Windows 

 Alt+W

Ctrl+C 

 Ctrl+Y

Ctrl+V 

 없음(!)

Ctrl+N


제가 제일 많이 쓰는 단축키 3개만 놓았는데도 이러한 차이가 나옵니다. 심지어 Windows단축키가 더 갯수가 많습니다. Emacs는 보통 본인들이 세팅해서 쓰는 스타일이니 그러려니 합니다.

어쨌거나 Windows단축키가 더 익숙해진 지금 Emacs단축키는 새로 외우기도 힘들고 심지어 어렵습니다.(Ctrl+Y는 한손으로 치기 어렵습니다... 손이 워낙 작아서...)그러면..세팅을 바꾸면 되는데 이 방법은 아주 간단합니다.


2014이전 버전에서는 File-Preference로 들어가시기 바랍니다. 이후 버전이라면...


도구상자에 있는 기본설정 버튼을 눌러주세요.



그리고 키보드-바로가기(Keyboard-Short cut)에서 Emacs 설정을 Windows Default로 바꿔주시면 됩니다.





이제 그냥 쓰던데로 쓰시면 됩니다.(!)

,

Tesseract는 구글이 만든 OCR엔진입니다. 오픈소스라 무료로 이용이 가능합니다. 다만 사용하기 애매하게 만들어졌다는 단점이 있습니다만, Python으로 이용 가능하도록 누군가가 잘 Wrapper를 만들었습니다. 동작하는거 봐서는 그냥 /tmp에다가 넣어서 뿌리는 듯 하지만요.


제가 사용한 것은 pytesseract(https://github.com/madmaze/pytesseract/)란 놈으로 그냥 시스템에 설치된 tesseract를 실행해주는 간단한 스크립트입니다. 대신 간단한 만큼 /tmp를 어마어마하게 써 댑니다. 그냥 tmpfs로 마운트해서 써야겠습니다. python-tesseract(https://code.google.com/p/python-tesseract/)를 쓰면 좀 나을 것 같기는 한데 라이브러리 방식에 고생을 할 것 같으니 일단은 넘어갑시다.


대충 아래와 같이 쓰면 되기 때문에 간단하게 OCR을 쓸 수 있습니다.

우분투에선

sudo apt-get install tesseract-ocr

위 명령어로 OCR엔진을 설치할 수 있구요.(어쨌건 해당 엔진이 설치되어 있어야 합니다.)


import pytesseract
try: import Image except ImportError: from PIL import Image
print(pytesseract.image_to_string(Image.open('test.png')))


다른것은 둘째 치고 hocr로 만들어주는 고마운 기능이 있더군요.


print image_to_string(image 객체,lang=None, boxes=False, config="o hocr") 

요런 명령을 때리면 hocr로 뽑아주는데 에러가 납니다....


알고보니 hocr기능이 들어가기 전에 프로젝트가 중단된 것인지 소스 수정이 필요하더군요.


/usr/local/lib/python2.7/dist-packages/pytesseract 여기로 쫓아가서


pytesseract.py 파일을 관리자 권한으로 열어줍시다.



    if not boxes:
        output_file_name = '%s.txt' % output_file_name_base
    else:
        output_file_name = '%s.box' % output_file_name_base

    if not boxes:
        if config=="o hocr":
            output_file_name = '%s.hocr' % output_file_name_base
        else:
            output_file_name = '%s.txt' % output_file_name_base  
    else:
        output_file_name = '%s.box' % output_file_name_base


위의 것을 아래로 수정하시면 hocr로 뽑히게 됩니다. 뽑힌 내용을 QTwebview등으로 뿌리면 OCR화 된 내용을 볼 수 있습니다. 그렇다는 것은 크롬에서 hocr파일을 열고 구글의 번역 기능을 돌려버릴 수도 있고 (구글 번역 기능은 api 사용료가 붙습니다. 하지만 크롬을 쓰면 이야기는 달라집니다.) PDF화도 가능합니다.


....사실 python보다는 bash로 처리하는 것이 훨씬 더 경제적이었다는 느낌이 드네요. 뭐하러 Python으로 만들었지?

,