응용프로그램2018. 9. 13. 01:08

아래 방법은 1) 불편하고 2) 부정확하다. 2018년 공주대학교 레이텍 워크숍에서 편리하고 정확한 프로그램이 공개되었으므로 그 방법을 이용하자.


프레젠테이션 및 프로그램은 해당 페이지에서 받을 수 있다. 진짜 너무나 편리함...

From HWP to LaTeX ( http://wiki.ktug.org/wiki/wiki.php/LaTeXWorkshop/2018 )






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 필유
응용프로그램2017. 4. 26. 09:00

지각을 얼마나 하건 간에, 나는 나 나름대로 내 업무 시간이나 패턴을 신경 쓰고 있다.


이직 1년 후 능률이 바닥을 치던 때, 시간 관리를 위해 매닉타임(ManicTime)을 설치했다. 사실 설치하고 나서 뭔가 극적으로 달라진 건 없지만... 뭐랄까, 자신이 어떻게 시간을 보내고 있는지 점검하는 정도의 의미는 있었던 듯하다. 곧 윈도우도 다시 설치해야 하고 해서, 이 글을 마지막으로 더는 매닉타임을 쓰지는 않을 거다.


2015년 6월 21일부터 기록을 시작해 2017년 4월 22일까지 자료를 뽑았다. 이하 평균 계산에서 사무실에 출근하지 않은 날(즉 PC를 전혀 켜지 않은 날)은 포함하지 않았다.


먼저 근무 시간. 보다시피 2015년 6월부터 10월까지는 야근을 한 날이 많았다. 그렇다고 주구장창 야근만 한 건 또 아니라서 그래프가 상당히 들쑥날쑥하다. 월별 평균 상위 세 개는 15년 8월이 10.03시간, 15년 10월이 9.99시간, 15년 7월이 9.86시간이다. 하위 세 개는 17년 4월 8.46시간, 16년 12월 8.59시간, 16년 11월 8.66시간이다. 15년 평균은 9.64시간, 16년은 9.24시간, 17년은 8.76시간으로 계속 하락 중이다. 아주 바람직하군.


매닉타임은 사용 시간, 자리 비움 시간, 세션 잠금 시간도 기록한다. 보통 자리를 비울 때 PC를 잠그는 편인데, 정말 급한 일이 있어 그냥 자리를 비우거나 잠그는 걸 잊을 때도 간혹 있어서 (그리고 PC를 잠그고 자빠져 잘 때도 있어서) 100% 정확한 데이터는 아니다. 월별 평균 상위 세 개는 16년 5월, 15년 7월, 8월로 각 6.60, 6.40, 6.39시간이었다. 야근한 날이 많았으니 PC 앞에 앉아 있는 시간도 긴 게 당연해 보인다. 하위는 16년 4월, 9월, 17년 4월로 5.39, 5.33, 5.25시간이었다. 이것도 당연하겠지.


사용 시간 / (자리 비움 시간 + 세션 잠금 시간)의 비율도 구해봤다. 아마도 근무 시간이 길어서인지 15년 6월, 7월이 2.06, 2.08로 제일 높았고 17년 3월이 2.04였다. 즉 나같이 생산성 높은(에헴) 사람조차 PC 앞에 앉아 있는 시간이 자리를 비운 시간보다 길어야 2배라는 소리다. 하위는 16년 4월, 9월, 6월로 각 1.25, 1.38, 1.50이었다. 특히 16년 4월은 PC 사용은 5.39시간인데 세션 잠금이 3.94시간이었다. 16년 9월도 PC 사용은 5.33시간에 세션 잠금은 3.59시간. 세션 잠금 중 1시간은 무조건 점심시간이지만 나머지는? 회의, 회의, 그리고 회의. 이 회사는 PC로 하지 않는 잡무는 적은 편이므로 결정적으로 회의가 문제다. 시기상 부서 차원에서 분기별로 하는 회의 준비에 시간을 많이 썼던 것 같다. 물론 잔 시간도 포함되었겠지만 맨날 자는 건 아니니까...


다음은 많이 쓴 응용프로그램. 이 회사는 구글 앱스로 일하다 보니 크롬 사용량이 가장 크다. 구글 앱스 외의 모든 웹 검색(및 딴짓)에는 파폭을 쓴다. 워드, 애크러뱃은 원고 작업이다. 나는 이 회사 와서 교정지를 출력해서 교정본 일이 거의 없으므로 워드, 애크러뱃, 파폭 쓴 시간이 곧 내 주무 시간이다. 5번 윈도우는 뭔지 잘 모르겠다. 아이들 상태를 말하는 것 같기도. 6번은 맨날 쓰는 텍스트 편집기고, 7번은 코딩할 때만 쓰는 아톰 편집기다. 8번은 엑셀, 9번은 명령 프롬프트(주로 각종 개발 환경 설정 시 사용)였다. 10번은 마감 때 외주자와 채팅용으로 쓰는 카카오톡이다. 카톡 따위, 마감 아닐 때는 켜지도 않는다.


참고로 11위~20위는 다음과 같다. 노트패드++는 회사 사이트에 미출간 원고를 HTML로 올릴 때 주로 썼다(그런데도 12시간이라니 새삼 내가 얼마나 노가다를 했는지 느껴진다). 이클립스는 자바, 스칼라 다루는 원고 만질 때 썼다. 전에도 썼듯 이 두 언어만은 아톰보다 이클립스가 편하다. 오픈 캡쳐(1.4.4)는 수년간 사용 중인 완소 캡처 도구.


다음은 응용프로그램에 상관없이 많이 쓴 문서. 예상대로 구글 문서, 지메일, 구글 검색이 상위에 있고 15번에 캘린더도 있다. 4번 트렐로는 팀에서 기획 용도로 쓰는 웹 서비스다. 5번 나무위키는... 할 말이 없습니다. 6번은 구글 시트용 스크립트 코딩에, 7번은 구글 드라이브 파일 정리에 많은 시간을 썼음을 보여준다. 정말 이 회사 처음 왔을 때는 구글 드라이브에 계층구조 따윈 없고 혼돈의 카오스 그 자체였다. 8번 스택오버플로... 이것도 좀 찔린다. 9번은 기획 활동을 위해 페이스북에서 보낸 시간으로 이해하면 되겠다. 절대 놀려고 들어간 게 아님. 어차피 친구도 몇 없다. 그 밖에 서점이나 영어 위키백과가 있고, 11번, 14번은 마감한 원고, 16번은 요즘 열심히 보고 있는 원고다. 아 이 원고를 생각하니 갑자기 마음이 무거워지네.


이상이 매닉타임 무료 버전이 제공하는 네 가지 주요 통계다. 시간 관리에 관심이 있다면 한 번쯤(3~6개월) 사용해보고 자기진단에 활용하는 것도 괜찮을 거다. 설치하면 항상 백그라운드에서 아무 알림도 없이 돌아가고, 트레이에 떠 있는 걸 클릭하면 이상과 같은 통계를 확인하고 엑셀로 내보낼 수 있다. 분석은 귀찮지만 내가 무슨 프로그램을 많이 썼고 무슨 문서를 많이 봤는지 같은 걸 보는 건 의외로 재미있다.


물론 브라우저나 텍스트 편집기를 여러 개 쓸수록 더 정확한 패턴을 알 수 있다. 회사 PC에서도 비발디랑 페일문을 쓰긴 하는데, 특정 원고 볼 때만 쓰고 방치하다 보니 통계에는 잡히지 않았다. 앞으로는 일상적인 용도를 정해서 자주 사용하는 게 좋겠다는 생각이 든다.


이걸 해당 기간에 마감한 원고와 비교해서 보면 어떤 책에 시간을 더 들였는지도 대략적으로 알 수 있겠지만, 그렇게까지 분석하기는 귀찮다. 애초에 집에서 일한 시간은 포착되지 않으니 의미가 없다.


그러니까, 내가 지각을 많이 한다고 내 업무 태도에도 관심이 없는 건 아니라고. (두 번 말했다.)


이 포스트에 사용한 엑셀 파일은 이거. 백업용.

https://www.dropbox.com/s/34z21uuzwk5xben/report.xlsx?dl=0


Posted by 필유
응용프로그램2017. 2. 1. 22:38

문장부호 중점(·)을 수식에서 내적(곱하기) 기호로 사용해도 되는가? 결론만 말하면 그렇다.


위키백과를 보면 중점(같이 생긴 부호)은 여러 가지가 있다. 일반적으로 국문 문장부호로 사용하는 게 이 중점(·)이다. 유니코드로는 00b7. 윈도우 한글 입력기에서는 ㄱ을 입력하고 한자 키를 누르면 두 번째 페이지 8번째에 있다.


이거랑 비슷한 녀석으로 불릿(•)이 있다. 더 크다. 유니코드로 2022. 주로 목록을 표시할 때 목록 앞머리에 쓴다.


위의 위키백과에 따르면 이 둘은 레이텍에서는 각각 \textperiodcentered\textbullet이다.


얘네 둘까지는 혼돈이 없는데, 수식으로 가면 복잡해진다. 위 두 가지의 수식 버전에 해당하는 점 연산자(⋅)와 불릿 연산자(∙)가 있다. 유니코드에서 각각 22c52219다. 레이텍으로 치면 각각 \cdot\bullet이다.


이런 걸 고민하는 게 나뿐만은 아니다. 텍 스택오버플로에 관련 질답이 있었다. 해당 답변을 건단히 정리한 게 이상의 내용이다.


여기부터는 내 문제. 내가 애용하는 모 레이텍 렌더링 사이트에서 \cdot을 입력하면 pdf 결과가 중점(00b7)으로 출력된다는 거다. \bullet을 입력하면 그냥 불릿(2022)으로 출력된다.


게다가 점 연산자와 불릿 연산자를 입력하면 아예 제대로 렌더링이 안 된다.



이 사이트는 레이텍의 표준 서체와도 같은 Computer/Latin Modern 서체(위키백과) 등을 사용하는데, 글리프를 직접 확인해보니 이 옛날(?) 서체들에는 22c5와 2219 글리프가 없었다(한편, 오라일리 같은 외국 출판사에서는 종종 수식에 STIX 서체(위키백과)를 사용한다. STIX 서체에는 22c5와 2219 글리프를 포함해 엄청나게 많은 글리프가 들어 있다).


결론적으로 그렇다고 한 건... 사실 점(불릿) 연산자와 중점(불릿)을 시각적으로 구분하는 것은 불가능하기 때문이다. 따라서 문단 수식을 조판하는 데에는 여전히 저 사이트를 이용해도 문제는 없어 보인다. 물론 더 정확히 하려면 뭔가 다른, 제대로 된 레이텍 렌더링 방법을 찾아야 한다. 근데 이러면 나 한 몸 편하자고 온라인으로 레이텍 렌더링하는 게 무슨 의미가 있느냐고...


*추가:

위 사이트 말고 다른 레이텍 렌더링 사이트에서는 중점과 점 연산자가 잘 구분되어 렌더링되고 pdf로 출력하면 제대로 된 글리프가 나온다. 예제 파일. 이걸 pdf로 출력하고 그 pdf에서 텍스트를 복사해서 워드 같은 데 붙여넣기해보면 글리프가 다른 걸 확인할 수 있다.


게다가 이 사이트는 컴파일러를 고를 수도 있다. 이게 왜 유용하냐면... 유니코드에는 그리스문자 델타(Δ)와 증분 기호(∆)가 별도로 들어 있는데(각각 03942206) 후자를 레이텍으로 쓰려면 unicode-math 같은 패키지가 필요하고 이 패키지는 pdflatex가 아니라 xelatex나 lualatex에서만 사용할 수 있다. 위 사이트에서는 이들 여러 컴파일러를 모두 사용할 수 있다.





Posted by 필유
응용프로그램2016. 7. 8. 11:14

옛날 글에 썼듯 크롬은 컨트롤+탭으로 최근 탭 간 이동을 할 수 없다. 크롬이 처음 나왔을 때부터 지금까지 단 한 번도 지원된 적이 없다. 이슈 리포트는 이런 문서 등을 참고. 이에 여러 확장기능이 나왔으나 Ctrl+Tab이 아니라 다른 단축키를 사용하는 꼼수밖에 없었다. 혹은 오토핫키를 쓰거나. 어쨌든 구글은 이걸 지원할 생각이 없다.


이에 최근 나온 방법이 있다. Ctrl+Tab MRU라는 확장기능을 깐다. 일단 현재는 이걸 깔면 Ctrl+Y로 최근 탭으로 이동할 수 있다(물론 구글이 언젠가 이것도 막을지 모른다). 이제 이 확장기능의 단축키를 Ctrl+Tab으로 바꾸면 된다.


물론 구글 설정에서는 단축키로 탭을 지정할 수 없다. 이에 해당 확장기능 설명 페이지에 적힌 방법은 이렇다. 윈도우 기준.

  1. 크롬을 끈다.
  2. %LOCALAPPDATA%\Google\Chrome\User Data\Default로 이동
  3. Preferences 파일을 열고 Ctrl+YCtrl+Tab으로 바꾼다(Ctrl+Shift+YCtrl+Shift+Tab으로).
  4. 파일을 저장하고 크롬을 켠다. Preferences 파일은 UTF8로 된 JSON 파일이다. 인코딩이 잘못되면 설정이 날아가버리니(경험담) 잘 모르겠으면 백업해두는 게 좋다.
  5. 크롬을 켠다.
  6. 구글 확장기능 단축키 설정에 가서 'Ctrl+탭'으로 표시되는 걸 확인한고 [확인]을 누른다.

정확하지는 않지만, 1~5번까지만 거치고 6번 과정을 생략하면 크롬 종료 시 해당 단축키가 리셋되는 듯하다. 나는 그냥 부팅할 때마다 실행되는 배치 파일에서 Preferences 파일을 수정하게 해놨다. 먼저 아무 곳에나 파워셸 파일을 하나 만든다.

(Get-Content $args[0] -Encoding UTF8) -replace "Ctrl\+Y", "Ctrl+Tab" -replace "Ctrl\+Shift\+Y", "Ctrl+Shift+Tab" | Set-Content $args[0] -Encoding UTF8


그다음 부팅할 때마다 실행되는 배치 파일에 다음과 같이 추가.

Powershell -noprofile -executionpolicy bypass -file 앞에서_만든_파워셸_파일.ps1 "%LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences"


파워셸 말고 그냥 배치 파일로도 가능할 것 같은데 뭔가 생각보다 복잡해서 그냥 포기했다.


Posted by 필유
응용프로그램2015. 12. 9. 20:00

Noto Sans라는 서체가 있다. 구글과 어도비가 만들었다. 고정폭 서체도 있다. Mono가 붙는다. 물론 CJK(한중일) 버전도 있다. CJK 안에서 각 언어별 서체가 또 따로 있다. 한글은 KR. 그래서 다 합치면 Noto Sans Mono CJK KR이 된다.

https://www.google.com/get/noto/help/cjk/

 

고정폭 서체라 관심이 컸는데, 막상 워드 같은 데서 PDF를 만들어보니 임베딩(서브세팅)이 '제대로' 안 된다. 워드 자체 기능 및 애크러뱃(디스틸러) 둘 다 결과는 조금 다르지만 어쨌든 제대로는 안 된다. 혹시나 해서 해당 서체 깃허브 저장소에 문의했는데 워드 '2010'에서는 트루타입 '기반의' 서체만 임베딩이 된다는 답변을 들었다. 해당 서체는 오픈타입. 워드 2013은 되나 모르겠는데, 없어서 모름.

https://github.com/googlei18n/noto-cjk/issues/51

 

직접적인 관련이 있는 건 아니지만, 나중에 찾아보니 오픈타입 임베딩이 가능한 PDF 버전은 1.6 이상이다(근데 워드 2010 자체 기능으로 저장한 PDF의 버전은 기본값이 1.5고 옵션으로 1.4로도 저장할 수 있다).

http://community.zmags.com/articles/Knowledgebase/Difference-between-full-embedded-fonts-and-embedded-subset-1277814749518

 

안 된다고 넘어가면 될 일이긴 한데 뭔가 열받아서, 해당 서체를 지정한 HTML 파일을 만들고 파폭 및 크롬에서 애크러뱃으로 인쇄해봤다. 우선 파폭에서는 임베딩도 안 되고 결과물이 아예 비어 있었다.

 

크롬은 자체 PDF 저장 기능이 있다. 이걸로 만든 PDF는 버전이 1.4였다. 임베딩이 되긴 되는데 타입 3의 알 수 없는 서체 몇 개로 임베딩이 되고, 텍스트를 긁으면 이상한 문자가 나온다.

 

크롬 자체 PDF 저장 기능으로 저장한 PDF 문서 속성 중 글꼴
크롬 자체 PDF 저장 기능으로 저장한 PDF 문서 속성 중 글꼴

 

다음으로, 크롬에서도 애크러뱃을 통해 만들어봤다. 임베딩은 안 되고, 텍스트는 아웃라인(!)으로 저장된다(그래도 파폭보다는 낫네).

 

그래서 도대체 이 서체 임베딩을 제대로 지원하는 윈도우용 프로그램이 있긴 한 건가 싶었지만... 인디자인 CC 2014에서 해보니 역시나 잘만 된다(PDF 1.7에서 오픈타입으로 볼드 및 레귤러 각각 서브세팅). 다른 프로그램에선 임베딩은 포기하는 게 마음 편할 듯. 일반 사용자에게는 중요한 일도 아닐 테고.

 

추가:

워드 자체 저장 기능, 즉 파일>다른 이름으로 저장>pdf 선택 말고, 애크러뱃을 깔면 같이 깔리는 오피스용 애드온인 PDFMaker를 이용하니 오픈타입은 아니지만 임베딩이 되고 텍스트도 제대로 긁히는 걸 확인했다. 레귤러 하나만 타입1(CID) 형태로 서브세팅되는데, 볼드는 '가짜 볼드'로 처리하는 게 아닐까 추측.

 

Acrobat>PDF 작성
Acrobat>PDF 작성

 

디스틸러를 두고 굳이 애드온을 써서 해야 하나 싶긴 한데 어쩔 수가 없네. 워드(오피스)에서 PDF 만들 일이 있다면 디스틸러 말고 PDFMaker를 쓰는 걸 권한다.

 

 

 

 

Posted by 필유
응용프로그램2015. 6. 3. 00:04

*2016-1-21 추가: 이 글의 방법은 안 통합니다. AWS API를 이용하는 방법밖에 없습니다. 다음 글 등을 참고.

https://ctrlq.org/code/19965-amazon-api-with-google-script



스크립트 없이 구글 스프레드시트 importxml 함수만 이용해서 아마존 상품페이지의 각종 정보를 불러오는 방법임. 현재까지 국내외에 알려진 방법은 더는 통하지 않는다. 아마존이 페이지를 계속 바꾸고 내용을 동적으로 만들기 때문이 아닐까 추측.


알다시피 아마존 상품페이지는 다음과 같이 생겼고, 우리내가 원하는 정보는 빨간 부분, 그리고 저자 및 정가다.


http://www.amazon.com/The-Witcher-Collectors-Edition-Official/dp/0804162980/http://www.amazon.com/The-Witcher-Collectors-Edition-Official/dp/0804162980/


파폭 wdt 확장기능에서 보면 저곳의 dom 경로는 html>body#dp>div#a-page>div>div#detail-bullets이다. 크롬에서는 중간이 약간 다른데, 어쨌든 저기서 우클릭>Copy XPath 하면 //*[@id="detail-bullets"]라고 나올 거다.


크롬 개발자 도구크롬 개발자 도구


그럼 이 XPath 쿼리를 바로 importxml에 넣으면 되겠네? 야 신난다~ 싶겠지만... 처음부터 말했듯 안 된다는 게 문제다. 되면 내가 이걸 쓰고 있지도 않겠지...


importxml 실험-_-importxml 실험-_-


실험 결과, 위 dom 경로에 있는 div 중 importxml로 불러오는 게 가능한 건 최상위 div인 a-page뿐이었다. 직접 보면 알겠지만, 원하지 않는 정보와 엄청난 스크립트 들로 가득 차 있다. 위 페이지의 경우 len 해보니 375,299 글자가 나온다(...). 따라서 a-page에서 원하는 정보를 텍스트로 파싱해야 한다는 거... 절망적이다.


위안이 되는 점도 하나 있다. 메타 태그에 위 정보 중 일부가 들어 있고, 메타 태그는 importxml 함수가 잘 먹힌다.


메타 태그메타 태그


보다시피 저자, 도서명, 부제, ISBN, 분야 정보가 들어 있다. 항목들이 콜론과 스페이스(: )로 잘 구분된 title 태그를 importxml한 다음 split하면 된다.


다만, 이것조차 한계가 있다. 책마다 title 태그에 들어가는 항목이 다르다. -_- 이 책은 부제가 두 개인데, 어떤 책은 부제가 없다. 또 아마존의 서지정보 미흡으로 저자가 들어 있지 않은 경우도 있다. 즉 split을 일관되게 할 수가 없다. 어쩌라고!


게다가 나머지 정보, 즉 출판사, 출간일, 정가, 랭크도 메타 태그에는 없다. 얘네는 결국 a-page를 파싱해야 한다는 거...


메타 태그 및 나머지 정보를 무식하게 파싱하는 예제는 다음과 같다. 랭크 및 분야는 빠져 있다. 나중에 추가할지도.


https://docs.google.com/spreadsheets/d/1GEufB9BxulYIYwOGKZXhAFbC6-aTRmS1uUeDBN-M-fE/ (새창, 웹에 공개)


사용법: I열에 URL을 넣으면 해당 URL의 아마존 문서에서 도서명, 출판사, 출간일, 정가, ISBN을 가져와 B~H를 채운다.


B~H열에도 지저분한 수식이 들어 있지만, J열부터는 한층 지저분한 수식과 그나마 수식을 덜 복잡하게 하려고 넣은 문자열들을 볼 수 있다. 수식에 대한 설명은... 도저히 쓸 엄두가 안 남.


참고로, 일본 아마존 문서는 아마존닷컴과는 또 다르다. div들의 id나 class는 같지만 메타 태그 구분자도 다르고, importxml 결과도 다르다(어째서!? 심지어 가끔씩 내부 오류도 난다). 회사 파일에는 일본 아마존 정보 가져오는 수식을 따로 넣었는데, 정말 거지 같다.


미괄식으로 급 정리.

  1. 구글 스프레드시트에는 웹 문서 정보를 긁어오는 importxml이라는 멋진 함수가 있다.
  2. 근데 아마존 문서(본문)만은 제대로 긁어오지 못한다. WTF!
  3. 그래서 일부 정보는 메타 태그에서 가져오고, 나머지 정보는 무식하게 파싱해야 한다.
  4. 무식하게 파싱하는 방법은 위 구글 스프레드시트를 참고.


***수정: R, S열은 셀 높이가 커 스크롤이 불편해지므로 숨겨놨다. 구글 계정이 있는 사람은 '파일>사본 만들기'로 자기 사본을 만들면 해당 열을 볼 수 있다. 친절하게 수식을 직접 적자면, R2는 =importxml(I2,O2), S2는 =regexreplace(regexreplace(R2,"<.*?>",""),"\s{2,99}"," ")이다(정규표현식 좀 예쁘게 만들어줄 사람 없나?).




Posted by 필유
응용프로그램2015. 2. 25. 23:00

윈도우 기준. 워드의 Normal.dotm 파일은 스타일 등을 저장하는 '사용자 서식 파일'이다. 나는 (다른 많은 사람과 같이) 회사와 집 사이에 드롭박스 및 구글 드라이브로 파일을 동기화해서 사용하는데, 이 파일은 위치가 %appdata%\Microsoft\Templates이다 보니 동기화하기가 좀 불편하다.



찾아본 결과 심볼릭 링크를 사용해서 드롭박스 폴더 밖에 있는 파일을 추가하는 방법(새창)이 있다. 즉 ...\Templates에 있는 '대상'에 대한 '링크'를 드롭박스 안에 만드는 것. 그러나 내 경우 회사와 집의 사용자명이 달라서(즉 %appdata%가 달라서) 이 방법은 사용할 수 없다. 혹시나 해서 대상과 링크를 바꿔서도 해봤는데, 이렇게 하면 워드에서 기본 스타일 수정 후 종료 시 Normal.dotm 파일을 저장할 수 없다는 오류가 뜨면서 실패(당연히 이건 링크니까).


그러다 또 찾은 더 좋은 방법이 이거(새창, 마소). 역시 사람들 생각하는 건 다 똑같은가 보다. 간단하게, 워드에서 사용자 서식 파일의 위치를 설정하면 된다. 먼저 워드 '옵션>고급>일반>파일 위치'에서 해당 폴더를 변경하고, 다음으로 '옵션>보안 센터>보안 센터 설정>신뢰할 수 있는 위치'에서 또 해당 폴더를 변경하면 된다. 두 번째 설정을 안 하면 매크로를 사용할 수 없다는 알림이 뜬다.



옵션>고급>일반>파일 위치옵션>고급>일반>파일 위치


옵션>보안 센터>보안 센터 설정>신뢰할 수 있는 위치옵션>보안 센터>보안 센터 설정>신뢰할 수 있는 위치


Posted by 필유

2007부터인가 엑셀은 기본값으로 다중 실행이 안 되게 바뀐 듯하다. 그래서 다중 창을 원하는 사람들이 많은 글을 올렸던데... 레지스트리 수정 혹은 애드온 설치 말고 아주 간단한 방법이 있다.


윈도우키+R → excel → 엔터


이렇게 엑셀을 실행하면 그때그때 모두 각각의 창으로 뜬다. 나는 이렇게 엑셀을 실행한 후 알트+F → R → 숫자를 눌러 자주 사용하는 문서를 여는 식으로 사용하고 있다(마우스를 적게 쓰는 게 생산성이 높다). 엑셀을 여러 개 실행한 다음 탐색기의 파일을 원하는 창에 드래그앤드롭하는 사용 패턴도 가능하겠다.


흔히 알려진 방법대로 레지스트리를 수정하면 탐색기에서 엑셀 파일을 열 때마다 새로운 엑셀이 실행되게 할 수는 있다. 그러나 이렇게 엑셀 프로세스가 여러 개 실행되면 실행될수록 PC의 자원 소모 또한 증가한다. 사양이 빵빵한 시대이긴 하지만, 그럼에도 나는 모든 파일이 아니라 원하는 파일만 새로운 엑셀 창으로 여는 방법을 선호한다.


그럼 탐색기에서 특정 파일에 대해서만 새 엑셀을 실행하는 방법은 없을까? '보내기' 메뉴를 이용하는 방법이 떠오른다.


  1. 탐색기에서 엑셀 설치된 폴더로 간다. 2010의 경우 보통 C:\Program Files\Microsoft Office\Office14
  2. EXCEL.EXE 파일을 우클릭해서 폴더 안 빈 공간에 끌어다가 놓고 '여기에 바로 가기 만들기' 선택.
  3. 그럼 'EXCEL.EXE - 바로 가기' 이런 파일이 생겼을 거다. 이 파일을 컨트롤+X.
  4. 알트+D 누른 다음 주소창에 shell:sendto 엔터(혹은 윈도우키+R 누르고 shell:sendto 엔터).
  5. 컨트롤+V.


이제 탐색기에서, 새로운 엑셀 창으로 열고 싶은 파일은 우클릭하여 '보내기>EXCEL.EXE - 바로 가기'로 열면 된다.




Posted by 필유
응용프로그램2014. 4. 13. 00:02

플래시에서 타임라인에 애니메이션을 넣은 파일이라면 쉽게 변환해주는 툴이 여럿 있을 것이다. 이런 게 아니라 순수 액션스크립트 코딩한 애니메이션을 동영상으로 만드는 방법이다. 간단히 말해 이런 순서다.


  1. 플래시에서, 이미 완성된 as 파일을 문서 클래스로 삼는 동명의 fla 파일 생성.
  2. 플래시에서 이 fla 파일을 mov로 내보내기(퀵타임 필요)
  3. Adobe Media Encoder에서 mov를 원하는 포맷의 동영상으로 변환(ogv 파일로 변환하고 싶을 경우 플러그인 설치)


하나씩 자세히 보자. 링크는 모두 새창.



1.

보통은(?) 나처럼 플래시디벨롭 같은 툴을 써서 코딩했을 테고, 그 결과로 Main.as 파일 한 개와 거기 딸린 여러 개의 as 파일을 가지고 있을 거다. Main.as와 다른 클래스 파일들이 같은 폴더에 있다고 가정한다.


플래시를 켜고 'ActionScript 3.0' 빈 문서를 하나 만든다. 그리고 Main.as가 있는 폴더에 바로 Main.fla라고 저장한다. 그다음 '문서 클래스'를 Main으로 지정하고 다시 저장한다.



문서의 클래스 외 fps, 크기 등 다른 속성은, 보통은 Main.as에서 [SWF(width=...] 이런 식으로 설정했을 것이다. 플래시에서도 이와 동일하게 설정한다. 이제 Ctrl + Enter로 잘 재생되는지 확인한다.


물론 액션스크립트 코딩 자체를 플래시에서 하는 사람이라면 이 1번 과정은 모두 필요 없다. 이미 가지고 있는 fla 파일이 있을 테니 다음 2번으로 그냥 진행하면 된다.



2.

'파일>내보내기>동영상 내보내기' 혹은 Ctrl + Alt + Shift + S를 눌러 종류는 mov 파일을 선택한다. 퀵타임이 없다면 설치하라고 나올 거다. 공식 사이트 가서 설치하고 플래시를 재시작하고 다시 시도하라. 아, 퀵타임 따위를 설치하는 날이 올 줄이야... 잠시 눈물 좀 닦고 가자.


참고로, 내보내기에서 avi, png 등을 고를 수 있지만, 그렇게 저장해봤자 안 된다! 빈 화면만 나온다. 다른 방식은 타임라인 위에 작업한 애니메이션만 저장되며, 액션으로 만든 애니메이션까지 저장할 수 있는 건 mov뿐이다.


2-1.

파일명을 고르면 퀵타임 내보내기 설정 창이 뜬다.



여기서 렌더링 폭, 높이는 플래시에서 지정한 문서 속성으로, Main.as에서 [SWF(width=...] 식으로 설정한 값이 아니다. 그래서 Main.as와 Main.fla 둘 다 동일하게 맞추라고 한 것이다.


어쨌든, 중요한 건 '다음 경과 시간 후'이다. 타임라인 프레임 단위로 작업한 게 아니므로 반드시 수동으로 끝날 시간을 정해줘야 한다. Main.as 파일에서 보통은 이런 식으로 코딩했을 거다.


stage.addEventListener(Event.ENTER_FRAME, idle);


따라서 전역변수 하나를 잡아, idle 함수 안에서 1씩 더해주게 하고 idle을 stage에서 제거하는 순간 trace하면 전체 프레임 수가 나올 거다. 그 전체 프레임 수를 문서의 fps로 나눠주면 시간을 구할 수 있다.


다만, 버그인지 모르겠는데, 결과물을 보면 의도한 것보다 짧게 저장되는 듯하다(내 경우 문서 fps는 60이었는데 동영상 fps가 62.5로 잡히면서 영상이 중간에 짤렸다). 이런 경우, 시간을 여유 있게 정해준 다음 결과물을 보고 뒤를 자르든가 하자.


2-2.

그리고 하단의 [QuickTime 설정] 버튼을 클릭하고 동영상 크기, 품질 등을 설정한다.



이건 따로 설명할 필요는 없겠지. 본인 목적에 맞게 적절히 설정.



3.

만약 mov가 원하는 포맷이었다면 2에서 끝. 그러나 mov를 누가 원하겠어...


mov를 avi 등으로 변환하는 데에는 Adobe Media Encoder를 사용하면 된다. CS에 포함된 툴로, 아마 플래시와 같은 컬렉션 제품군에 속해 있다. 플래시를 가지고 있다면 이것도 있으리라고 가정한다.


만약 없다면 무료 오픈소스 툴인 Miro Video Converter 같은 툴을 쓰면 된다. 다만 이 툴은 기능이 다소 제한적이고, 폴더명에 한글이 있을 경우 드래그앤드롭도 안 된다. 이 툴은 자세한 설정을 할 수 없어 별도의 설명도 하지 않는다.


3-1.

나처럼 변환하고픈 최종 포맷이 ogv라고 하자. Adobe Media Encoder는 기본적으로 ogv 포맷으로는 변환할 수 없다(적어도 내가 쓰는 CS5.5는 그렇다). 그러나 AdobeOgg라는 플러그인을 설치하면 가능하다. 물론 무료에 오픈소스다. 설명에는 프리미어용이라고 써 있지만, 프리미어에서 내보내기 시 호출하는 프로그램이 바로 Adobe Media Encoder이다.


플러그인을 받았으면 윈도우 기준 C:\Program Files\Adobe\Common\Plug-ins\CSx\MediaCore 폴더에 파일을 넣어준다(CSx에서 x는 자기 CS의 버전). 그다음 Adobe Media Encoder를 실행한다. 시작프로그램>Adobe xxxxxx Collection CSx 폴더에 있다. 여기서 x는... 생략).



플러그인을 설치해야만 스샷처럼 '형식'에서 Theora 포맷을 선택할 수 있다.



그 옆의 '사전 설정'을 누르면 동영상 품질, 크기, fps 등은 물론, 소스 동영상 중 원하는 범위만을 선택할 수도 있다. 위에서 말한 내 경우처럼 실제 길이보다 더 길게 mov를 생성했을 경우 뒷부분은 날리는 게 가능하다. 스샷은 7초 29짜리 소스에서 앞에서 7초 28만을 출력으로 지정한 모습.



이상 과정을 거쳐 내가 만든 swf와 ogm을 집접 임베딩하면 다음과 같다.



Posted by 필유
응용프로그램2014. 4. 10. 00:50

웬만하면 이런 글 쓰기 싫었다. 하지만 아무래도 너무하는 거 같아서.


헝그리앱이라는 사이트에서 게시판에 들어가면 스크롤을 따라다니는 플로팅 배너가 있다.



위 스샷의 경우 큐라레 광고. 보다시피 게시판 목록을 보는 걸 방해하고, 심지어 이 광고는 게시물을 클릭한 다음에도 사라지지 않고 떠 있다. 물론 우상단의 X 버튼을 누르면 사라지지만, 그것 참 거슬린다.


Adblock Plus로 차단하면 되지 않을까? 되면 이 글을 쓰지 않았을 것이다-_- 일반적인 이미지나 플래시를 차단하는 방법만으로는 불가능하다. 이미지만 차단할 경우 저 공간이 하얗게 남아 여전히 스크롤을 따라다니며 방해한다. 배경 이미지(opa.png)를 차단해도 마찬가지다. 저 '공간' 자체를 차단해야 한다.


저 부분의 소스(대충 417행)를 보면 fixed-top.banner_11라는 div를 차단해야 한다는 걸 알 수 있다.



그래서 찾아본 결과, Adblock Plus와 함께 사용하는 확장 기능이 하나 더 있었다. 이름하여 Element Hiding Helper for Adblock Plus. 애드블록 도움말 문서(새창)에서 알아냈다. 이걸 설치하면 단순 이미지 외에 div 등 스타일시트의 특정 요소를 차단하는 게 가능해진다. 이걸 설치하면(재부틸 필요 없음) 특정 요소를 찍어서 차단할 수 있다(요소 숨김 필터)..



단, 찍을 때 div가 아니라 이미지 등으로 인식하는 경우가 있어 그냥 입력하는 게 낫다. 위 스샷처럼 다음과 같은 요소 숨김 필터를 추가하면 된다.


hungryapp.co.kr##DIV.fixed-top.banner_11


추후 헝앱이 소스를 바꾼다면 클래스 명이 달라질지 모른다. 뭐, 방법만 알면 그때 가서 바꾸면 될 일. 하지만 그것보다 헝앱은 인간적으로 이 따위로 조잡하게 플로팅 광고를 노출하는 짓거리에 대해 재고하면 좋겠다. 이렇게 광고 띄워서 광고비 뭐 얼마나 많이 받는다고. 사용자들이 겪는 불편도 좀 생각해주길.






Posted by 필유