응용프로그램2018.09.13 01:08
hml-equation-parser에 대한 소개는 다음 기사 참고.
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20161229092520

윈도우가 아니라면 다음 글을 참고.
https://jomno.github.io/hwp-%EC%88%98%EC%8B%9D%EC%9D%84-LaTex%EB%A1%9C(hml-equation-parser)/

다음은 윈도우 파이썬 3.6 기준.

0. 추출할 hwp 파일을 한글에서 hml로 저장한다(다른 이름으로 저장). 편의상 파일명은 test.hml로 바꾼다.

1. hml-equation-parser를 설치한다. pip로 하면 됨. 당연한 얘기지만 virtualenv를 사용하면 더 좋다. 그건 알아서.
    pip install hml-equation-parser

2. python 실행
    python

3. 파서 샘플 코드는 다음과 같다.
    import hml_equation_parser as hp
    doc = hp.parseHmlSample("test.hml")

    doc = hp.convertEquationSample(doc)
    string = hp.extract2HtmlStrSample(doc)

    import codecs
    f = codecs.open("test.html", "w", "utf8")
    f.write(string)
    f.close()


4. 근데 한국어(cp949) 윈도우에서 이걸 실행하면 2행에서 악명 높은 UnicodeDecodeError가 날 거다. 따라서 다음 코드를 먼저 실행하고 샘플 코드를 실행. 출처는 https://stackoverflow.com/a/34345136/6153990
    import _locale
    _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])


5. 이제 test.html 파일이 생겼다. 보니까 100% 완벽한 건 아니지만(\가 생략되는 등) 뭐 어쩔 수 없지.

6. 파서에서 html에 기본적으로 MathJax를 심어놓았으므로 해당 span들만 추출하면 된다. 해당 html 파일을 브라우저로 열고 개발자 도구(F12)에서 다음 코드 실행.
    (() => {
      const els = [...document.body.querySelectorAll('script[id^="MathJax-Element-"')];
      const eqs = els.map(el => '$$' + el.textContent + '$$');
 
      let doc = window.open('', '어흥', 'width=512, height=1024').document;
      let pre = doc.createElement('pre');
      pre.textContent = eqs.join('\n');
      doc.body.appendChild(pre);
    })();


7. 팝업 차단을 해제하면 새 창이 하나 뜰 거다. 이제 그걸 전체 선택하고 텍스트 파일에 복붙하면 끝.

8. https://www.mathjax.org/#demo 혹은 http://www.codecogs.com/eqnedit.php 요런 곳에 가서 실험해보면 된다.

9. 매스타입 등에 쓰려면 MathML으로 추출하는 게 편할 텐데 그러면 6번 코드 2~3행을 다음과 같이 변경. 근데 변환 결과가 완벽하지 않아서 더 불편할 것 같음...
      const els = [...document.body.querySelectorAll('span[id^="MathJax-Element-"')];
      const eqs = els.map(el => el.getAttribute('data-mathml'));



Posted by 필유
프로그래밍2016.07.06 14:04

1. 여러 블로그에 있듯, 먼저 Docker toolbox for Windows를 설치한다. 이런 문서 등을 참고.


2. 그다음 %DOCKER_TOOLBOX_INSTALL_PATH%에 가서 다음과 같이 start.sh를 실행하고

"%ProgramFiles%\Git\bin\bash.exe" --login -i start.sh

3. 한참 기다리고(첫 실행 시) 고래 그림이 뜨면 끝. cmd를 열고 도커용 환경변수를 설정한다. 물론 배치 파일 내에서 실행할 경우 %i는 %%i로 바꿔야 한다.

FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO %i


4. 이제 도커로 다음과 같이 텐서플로 이미지를 실행하고, 브라우저에서 주피터로 실습을 하면 된다.

docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-devel



단, 구글이 제공하는 도커 이미지는 텐서플로 0.8과 파이썬 2.7용만 있는 듯하다. 이건 그렇다 쳐도 pandas나 seaborn 같은 파이썬 라이브러리가 들어 있지 않아 매번 새로 설치하기가 번거로웠다. 따라서 도커로 새로 자신만의 이미지를 만들고 쓰는 게 나을 듯. 예를 들어 Dockerfile.을 다음과 같은 식으로 작성한다.

FROM gcr.io/tensorflow/tensorflow:latest-devel
RUN pip install seaborn
RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
RUN git clone https://github.com/rickiepark/tfk-notebooks.git
CMD jupyter notebook

pandas는 seaborn의 디펜던시이므로 seaborn 설치 시 같이 설치된다. 위에 예로 쓴 깃허브 노트북은 텐서플로 코리아 블로그 운영자의 저장소이다. 위에서는 텐서플로 0.9+파이썬 2.7 바이너리 패키지를 골랐다. 다른 패키지는 텐서플로 설치 문서를 참고.


이제 이 Dockerfile.을 어디 빈 폴더에 넣고 새로운 이미지로 빌드한다.

docker build -t merong .

merong은 새 이미지의 이름(태그)이다. 빌드 후에는 위의 4단계에서 실행할 이미지를 새 이미지 이름으로 바꾼다.

docker run -it -p 8888:8888 merong



추가: 물론 변경한 파일 내용을 계속 기록하고 싶다면 도커 컨테이너를 계속해서 갱신해야 한다. 가령 컨테이너 이름을 dev로 정해서 쓴다고 하면 다음과 같은 식으로. 사실 도커를 처음 쓰다 보니 다른 사람들은 어떻게 쓰는지 모르겠다(...).

docker run -it -p 8888:8888 --name=dev merong:dev
docker commit dev merong:dev
docker rm dev


사족으로, 이 환경에서 virtualenv를 설치하고 파이썬 3 환경으로 바꾸는 시도를 했으나, matplotlib였던가 pandas였던가가 설치되지 않았다. 포기하고 2.7 기준으로 쓰기로 함.



Posted by 필유