윈도우즈 환경에서 연동하기란 쉽지 않아 보입니다. 그런데 쉽게 설치가능한 실행파일이 있습니다

1. 바이너리로 컴파일된 버전 사이트 --- 퍼옴 ( 추천 )

On Jan 9, 8:19*pm, Stefan Behnel <stefan...@behnel.de> wrote:
> Note that lxml currently lacks binary Windows builds for its latest
> releases. There are eggs for the original 2.3 release, though.


Christoph Gohlke provides a fairly up-to-date set of Python packaged
binaries for Windows 32- & 64-bit.

There are lxml packages for Python 2.6 to 3.2, and 2.5 for 32-bit
only.

http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

This is a fantastic resource that more Windows-based Python devs
should know about.


2. lxml 소스로 바이너리 생성해서  설치하기

error : Unable to find vcvarsall.bat 라는 메시지가 뜨면 컴파일러가 없어서 발생하는 메시지 입니다. 

컴파일러 미설치시 설치해 줘야 합니다.

MinGw 를 다운로하고 bin 폴더를 Path 로 지정해 줍니다.

python setup.py install build --compiler=mingw32


3. 튜토리얼 사이트

http://lxml.de/tutorial.html

간단하게 엘리먼트는 무엇이고 xml 파일을 가져오고 분석하고 저장하는 방법을 알 수 있는 사이트 입니다.



블로그 이미지

희망잡이

,




이번 블로그에서는 DocBook xml 파일을 epub 파일로 변환하는 작업과 변환작업을 자동화하는 것을 보여줄 것입니다.

1. DocBook xml 파일을 epub 파일로 변환하는 작업

개발자들이 장편의 기술적인 문서를 유지할 필요가 있을때 선호하는 도구가 DocBook 입니다.

전통적인 워드파일과는 다르게 텍스트베이스의 버전관리시스템에서 DocBook 출력물이 관리할수 있는 장점이 있습니다.

DocBook 은 xml 이기 때문에 다양한 출력 양식으로 변환할 수 있고, 또한 출력양식으로 epub도  지원하고 있습니다.

docbook-xsl-1.77.1 압축파일을 인터넷에서 다운로드합니다.

이 패키지내에 EPUB 생성을 위한 XSL 파일이 있습니다.  docbook.xsl

$ xsltproc /path/to/docbook-xsl-1.74.0/epub/docbook.xsl docbook.xml
Writing OEBPS/bk01-toc.html for book
Writing OEBPS/pr01.html for preface(preface)
Writing OEBPS/ch01.html for chapter(chapter1)
Writing OEBPS/ch02.html for chapter(end-notes)
Writing OEBPS/index.html for book
Writing OEBPS/toc.ncx
Writing OEBPS/content.opf
Writing META-INF/container.xml

$ echo "application/epub+zip" > mimetype
$ zip -0Xq  my-book.epub mimetype
$ zip -Xr9D my-book.epub *
$ java -jar epubcheck.jar my-book.epub 
No errors or warnings detected

2. Python 과 Lxml을 이용하여 docbook 을 epub 로 자동으로 변환하기

python 모듈로 위의 과정을 함수로 만들어서 자동으로 파일을 생성하고 취합하도록 할수 있습니다.

import os.path
from lxml import etree

def convert_docbook(docbook_file):
    docbook_xsl = os.path.abspath('docbook-xsl/epub/docbook.xsl')
    # Give the XSLT processor the ability to create new directories
    xslt_ac = etree.XSLTAccessControl(read_file=True, 
                                      write_file=True, 
                                      create_dir=True, 
                                      read_network=True, 
                                      write_network=False)
    transform = etree.XSLT(etree.parse(docbook_xsl), access_control=xslt_ac)
    transform(etree.parse(docbook_file))

이모듈을 실행하면 epub 파일이 만들어 집니다.

Adobe Digital Edition 프로그램을 열어서 확인할 수 있습니다.

지금까지는 정상적으로 수행되었는데 컨텐츠를 한글로 하면 깨져서 보입니다.

docbook.xsl 로 생성된 html 파일이 한글을 지원하지 않는 것 같습니다. 임시해결책은 아래와 같습니다.

생성 태그 : <html xmlns="http://www.w3.org/1999/xhtml">

수정 태그 : <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko">

해결책을 찾아 봐야 할듯 합니다.


블로그 이미지

희망잡이

,



앞으로 모든 문서는 전자문서로 보관되고 유통될 것이고 기술적으로 어떻게 만들어지는지 알 필요가 있을 것입니다.

epub 북을 만들고자 할때 필요한 파일과 구성요소를 배울수 있습니다. 그리고 DocBook xml로 부터 epub 로 변환하는 방법을 배우고 python 을 이용해서 이작업을 자동화 해보고자 합니다.

epub 가 무엇인지, 누가 그것을 책택해서 사용하고 있는지를 알아보고, epub bundle의 구조를 살펴보고자 합니다.

epub 란 International Digital Publishing Forum( IDPF )에서 표준화한 화면크기별로 글자수 조정이 가능한(reflowable) 디지탈 책 이나 출판을 위한 XML 형식 입니다.

epub 는 pdf 와 어떻게 다른가?

pdf 는 프린트를 편할게 할수 있는 형식으로 전자문서로 가장 많이 사용하고 있는 것입니다.

다만 개발자가 접근하기가 어렵고  화면크기별로 글자수 조정이 안되는 단점이 있습니다.

epub 는 세개의 IDPF 설계안으로 구성되어 있습니다. 

1. Open eBook Publication Structure Container Format (OCF) : epub의 압축형식(zip) 과 디렉토리 트리 구조를 지정한다.

2. Open Publication Structure (OPS) : 책 컨텐츠를 위해 사용할 수 있는 포맷을 지정( 예를 들면 xhtml, css )

3. Open Package Format (OPF) : epub내의 추가적인 메타데이타를 지정

중요한 점 두가지는  epub 메타데이타는 xml 이고 epub 컨텐트는 xhtml 이라는 것입니다.

첫번째 epub 책을 만들어 볼려고 합니다.

epub 번들이 기능을 유지하기 위해서는 최소 필요조건으로 필요한 파일들이 있어야 합니다. epub 압축파일안에서 파일들의 형식, 내용, 위치에 대한 엄격한 기준이 제시됩니다.

epub 번들 압축파일의 구조

mimetype
META-INF/
   container.xml
OEBPS/
  content.opf
  title.html
  content.html
  stylesheet.css
  toc.ncx
  images/
     cover.png

mimetype 파일 생성

application/epub+zip 이 내용이 있는 파일을 생성합니다. 이 내용외에 뉴라인이나 캐리지 리턴문자가 있으면 안됩니다.

container.xml 파일 생성

<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf"
     media-type="application/oebps-package+xml" />
  </rootfiles>
</container>

full path에 들어가는 디렉토리는 epub 파일의  루트와 관련되어서 디렉토리가 지정되어져야 합니다.

OEBPS : Open eBook Publication Structure

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            unique-identifier="bookid" version="2.0">
  <metadata>
    <dc:title>Hello World: My First EPUB</dc:title>
    <dc:creator>My Name</dc:creator>
    <dc:identifier
id="bookid">urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658</dc:identifier>
    <dc:language>en-US</dc:language>
    <meta name="cover" content="cover-image" />
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="cover" href="title.html" media-type="application/xhtml+xml"/>
    <item id="content" href="content.html"
media-type="application/xhtml+xml"/>
    <item id="cover-image" href="images/cover.png" media-type="image/png"/>
    <item id="css" href="stylesheet.css" media-type="text/css"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="cover" linear="no"/>
    <itemref idref="content"/>
  </spine>
  <guide>
    <reference href="title.html" type="cover" title="Cover"/>
  </guide>
</package>

Open Packaging Format 메타데이타 파일 생성하기

content.opf 는 책의 모든내용에 대한 위치를 지정합니다. 또한 메타데이타 파일 Navigation Center eXtended(NCX) 를 지정합니다.

OPF 다큐먼트 자체는 http://www.idpf.org/2007/opf 네임스페이스를 사용하지만  메타데이타는 Dublin Core Metadata Initiative (DCMI) namespace, http://purl.org/dc/elements/1.1/

spine 태그는 컨텐츠의 순서를 지정하는 것으로 idref 속성의 값은 manifest에 지정되어 있어야 합니다.

다른 디지탈 책표준에서 빌려온 NCX table of contents 에 대해서 알아보겠습니다.

epub 는 DAISY's NCX DTD  의 형식을 빌려 왔습니다. 

DAISY : Digital Accessible Information SYstem 의 약자로서 전통적인 책을 사용할수 없는 독자들을 위해서 개발되어진 협력체.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
                 "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
  <head>
    <meta name="dtb:uid"
content="urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <docTitle>
    <text>Hello World: My First EPUB</text>
  </docTitle>
  <navMap>
    <navPoint id="navpoint-1" playOrder="1">
      <navLabel>
        <text>Book cover</text>
      </navLabel>
      <content src="title.html"/>
    </navPoint>
    <navPoint id="navpoint-2" playOrder="2">
      <navLabel>
        <text>Contents</text>
      </navLabel>
      <content src="content.html"/>
    </navPoint>
  </navMap>
</ncx>

Zip 압축으로 epub 파일 생성하기

zip for windows(http://gnuwin32.sourceforge.net/packages/zip.htm) 를 다운 받아서 설치하고 , 해당폴더를 패스로 지정합니다.

1. zip -0Xq  my-book.epub mimetype

이 명령어는 mimetype 파일은 압축하지 않은 상태에서 추가하고 my-book.epub 파일을 생성하라는 명령어 입니다.

2. zip -Xr9Dq my-book.epub *

이 명령어는 남아 있는 요소를 추가하는 작업입니다. D, X는 zip파일에 관련없는 정보는 최소화하라는 의미이고 r 은 반복적으로 META-INF 폴더와 OEBPS 폴더의 내용을 포함하라는 의미입니다.

3. EpubCheck package 를 통한 epub 파일을 유효성을 검증합니다.

http://code.google.com/p/epubcheck/ 사이트에서 epub 패키지를 다운받아서 압축을 특정폴더에 풉니다.

java -jar D:\J2EE\JAVA\epubcheck-3.0b5\epubcheck-3.0b5.jar my-book.epub 처럼 경로를 지정해서 검증한다.

그리고 epub 파일을 보기위한 viewer 를 설치합니다.

Adobe Digital Editions ( http://www.adobe.com/products/digitaleditions/ ) 를 다운받아서 설치합니다.


Build a digital book with EPUB

http://www.ibm.com/developerworks/xml/tutorials/x-epubtut/index.html

Create rich-layout publications in EPUB 3 with HTML5, CSS3, and MathML

http://www.ibm.com/developerworks/web/library/x-richlayoutepub/index.html




블로그 이미지

희망잡이

,




스마트폰 어플리케이션 구조는  한개의 화면당 하나의 액티비티(Activity) 로 구성됩니다.

하나의 액티비티에는 하나의 화면 레이아웃이 존재하고 버튼, 라벨 등 화면에 어떻게 보여야 하는지에  대한 정보를 가지고 있습니다.

액티비티는 자신의 라이프사이클이 존재합니다. 생성되고 시작되고 중지되고 종료되고 폐기되는 순서로 가는데 중지되었을때 재기동하기도 하고 종료되었을때 다시시작하기도 합니다.

 ( onCreate(), onStart(), onStop(), onDestroy(), onResume(), onReStart() )

라이프사이클별로 화면처리시에 필요한 이벤트나 프로시져를 작성합니다.

다른 화면이 생성되면 즉 다른 액티비티가 호출되면 기존 액티비티는 중지되거나 종료된다. 이때 기존 액티비티의 상태정보는

저장되어 있다가( savedInstanceState 변수 ) 재기동, 재시작될때 그 정보를 가져와서 다시 보여줍니다.

다른 액티비티를 생성할때 필요한 컴포넌트가 인텐트(Intent) 이다. 메시지를 전달하는 도구라고 생각하면 될듯 합니다.

명시적 인덴트는 특정 액티비티를 호출할때 사용합니다.

암시적 인덴트는 필요한 기능을 정의하여 그 기준에 합당한 액티비티를 호출할때 사용합니다.

인덴트는 데이타를 액티비티간에서 받을수 있습니다.

( startActivityForResult() 함수 호출하고 onActivityResult() 함수에 받은 데이타 처리로직을 넣어주면 됩니다. )

액티비티에서 데이타를 저장하여 돌려줄수도 있습니다.

( 전달된 인덴트 getIntent() 에  키, 값형태로 putExtra(키,값) 함수를 사용하여 저장 됩니다. 

그리고 setResult(RESULT_OK,intent) 로 마무리 하면 됩니다 )

스마트폰에서 취소버튼을 클릭하여 이전화면으로 이동하는 경우가 있습니다.

이때는 task 라는 액티비티 스택(Activity Stack) 이라고도 하는데 이 공간에 Root Activity 를 기준으로 해서 

호출된 액티비티가 쌓이다가 취소 버튼을 클릭하면 이전 액티비티로 넘어가도록 되어 있습니다.


앱 어플리케이션을 작성순서

1. 프로젝트명 과 액티비티( Root Activity ) 이름, 패키지명( 보통 도메인 네임을 사용하여 유일성을 보장 )을 정합니다.

2. 필요한 화면을 구성합니다. 화면수 만큼 액티비티를 만들 필요가 있습니다.

3. 액티비티별로 화면 레이아웃을 XML파일로 작성합니다.

4. AndroidManifest.xml 파일에 작성된 액티비티 명을 등록해서 연결시켜 줍니다.

5. 각 액티비티의 라이프사이클 이벤트별로 필요한 기능을 작성하면 됩니다.


블로그 이미지

희망잡이

,




구글사에서 세상보기 앱에서 볼수 있는 컨텐츠를 편집하고 제작하기 위한 도구를 제공하고 있습니다.

유투브에 올린 동영상 플레이리스트를 지정하여 새로운 동영상도 확인하고 볼수 있습니다.

옆에 있는 사진은 제가 제작한 컨텐츠를 기반으로 Producer를 이용해서 제작한 화면 입니다. 아래 내용대로 따라하시면 여러분의 앱에서 확인할 수 있어요

세상보기 앱을 설치하시고

라이브러리 추가로 들어가서 검색화면에서 motiveflow 로 찾으시면 됩니다.

라이브러리에 추가된 것을 확인할수 있을겁니다.

화면 구성은 제가 관리하고 있는 블로그, 유투브에서 관리하는 글로스연주회 동영상 리스트, 기타 동영상 으로 구성하였습니다.

구글사에서 제공하는 무료 도구를 활용해서 여러분의 지식과 끼를 발산해 보시기 바랍니다.

글은 쓰면 쓸수록 빛이 난다고 합니다.^^


블로그 이미지

희망잡이

,




Blog은 무료로 작성할수 있는 사이트가 많습니다. 저는 티스토리 블로그를 이용하고 있습니다


1. 블로그를 개설하고 글을 작성하면 개인출판이 시작됩니다

사람들이 블로그에 들어와서 글을 읽고 공감했을때 새로운 글이 등록될때 마다 보고 싶을것입니다

이처럼 블로그의 새글을 구독하고 싶을때 필요한 것이 RSS 입니다

RSS( Really Simple Syndication or Rich Site Summary ) 라는 것은 

개인이 올린 블로그 정보를 특정공간( 구글 리더 등 )에 가져와서 볼 수 있도록  기능을 제공합니다

RSS 기능이 부여된 다큐먼트를 FEED, WEB FEED, CHANNEL 이라고 부릅니다

그리고 RSS FEED 를 읽을수 있는 소프트웨어를 RSS READER, FEED READER 라고 합니다

구글이 FEEDBURNER 사를 인수해서 개인에게 무료로 이용할 수 있도록 한것이 FEEDBURNER 입니다


2. FEEDBURNER 에 가입해서 본인의 BLOG에 RSS FEED 기능을 부여합니다

사람들이 블로그를 자신이 선호하는 RSS 리더에 등록하기를 원할 것입니다

이때 해당 블로그에 RSS FEED 아이콘을 배치하여 쉽게 등록할수 있도록 할수 있습니다

Tip : FEEDBURNER 사이트에 자신이 등록한 블로그정보에서 publicize tab 으로 이동합니다

       왼쪽 메뉴에 있는 chicklet chooser 를 클릭합니다

       원하는 아이콘을 선택해서 그 아이콘에 해당하는 코드를 복사합니다

       자신의 블로그의 html 코드편집기로 들어가서 적당한 위치에 해당 코드를 붙여놓습니다

여기까지 작업을 끝냈으면 자신이 선호하는 RSS READER에서 해당 블로그의 RSS FEED 를 가져올수 있습니다


3. 구글리더 (GOOGLE READER)

RSS FEED 사이트를 등록할 수 있고 등록한 블로그의 내용을 조회할 수 있습니다


4. 세상보기 (GOOGLE CURRENTS )

구글리더에 등록된 사이트나 다른 RSS FEED 기능이 제공되는 사이트를 등록가능하고 내용을 조회할수 있습니다


5. 구글프로듀서( Google Currents producer )

아이폰, 안드로이드, 아이패드 화면 크기에 맞게 화면을 꾸며서 세상보기에 등록이 가능합니다

스마트폰 별로 화면 미리보기 기능이 제공되어서 화면구성을 어떻게 해야 될지 쉽게 파악할수 있어요.

블로그 피드, 동영상 피드, 소셜 네트워크 피드, 이것을 연계한 테이블 레이아웃 등

사용자는 컨텐츠만 만들고 세상보기는 보여주는 창구역할을 함으로써 시너지효과를 낼수 있으리라 봅니다.




블로그 이미지

희망잡이

,



파워빌더 소스(PBL)을 GitHub와 연계하니깐 Binary 파일로 인식하여 소스내용을 볼수 가 없습니다.

그래서 파워빌도 소스(PBL) 을 텍스트 소스파일(srd,srw 등)로 변환하고 변환된 파일을 GitHub에 업로드 하는걸로

프로세스를 잡았습니다.

매번 소스를 변경할때 소스파일로 변환하는 번거로움이 있어서 한번에 소스파일로 변환해주는 툴을 찾아보았는데

pbldump 라는 도구가 있더라고요.

보통 소스를 여러개 폴더로 나누어서 관리하기때문에 일괄적으로 변환하기 위해서는 Ant 자동화도구를 사용해야

할것 같아서 연계하기로 하였습니다.

여기서 고민이 생겼는데요? 1. Ant로 변경프로세스를 코딩할건지 2. 자바로 코딩하여 Ant에서 실행할건지...

자바로 코딩하고 Ant로 실행을  구현해 보고자 한다.

1. 자바 실행파일 작성

파일필터(FileFilter) 클래스를 상속받아서 특정 확장자를 가진 파일만 가져올 수 있는 클래스를 작성한다.

작성된 파일필터 클래스를 생성자의 인자로 하여 특정폴더 및 하위폴더에서 파일리스트를 가져오는 클래스를 만든다.

가져온 파일중에 isDirectory() 로 디렉토를 체크하여 recursive 루틴을 타도록 코딩하고

파일을 경우에 RegExp 패턴을 사용한 Validator 클래스를 작성하여 원하는 파일인지를 체크한다.

IMAGE_PATTERN =  "([^\\s]+(\\.(?i)(pbl|png))$)";

pbldump.exe파일을 호출하도록 command 배열을 작성한다.

Process oProcess = new ProcessBuilder(commands).start();

위 두 클래스를 이용하여 Ant에서 호출하여 실행할수 있는 클래스를 작성한다.

public class GeneratePbldump extends Task {

public void execute() {

2. Ant 배치작업 파일에서 xml 파일을 작성하여 실행한다.

<taskdef name="pbldump" 문장을 추가하여 target 기입한다.


블로그 이미지

희망잡이

,



html5 문서의 시작은 동일하다. !DOCTYPE HTML, html, head 태그를 기입한다.

이 예제는 head 태그내에 style 과 script 를 기입한다.

style type="text/css"

#div1, #div2

{float:left; width:100px; height:35px; margin:10px;padding:10px;border:1px solid #aaaaaa;}

스타일시트 를 지정하는데 스타일을 적용할 영역을 선택해주고( div1, div2 ) 속성을 지정한다.

요소를 Drag할수 있도록 만들기 위해서는 draggable 속성을 true 로 설정해야 한다.

그 다음으로 요소가 드래그되어질때 무슨일이 일어나야 하는지를 정해야 한다.

요소의 ondragstart 속성이 drag(event) 함수를 호출하는데 이 함수는 어떤 요소가 드래그 되어지는지를 지정한다.

드래그되어진 데이타가 드랍되어 지는 곳에 ondragover 이벤트가 호출되어 있어야 한다.

기본적으로 요소나 데이타는 다른 요소에 드랍되어 질수 없다. 드랍될수 있도록 하기 위해서는 요소의 기본적인 흐름을 차단해야 한다. ondragover 이벤트를 위한 event.preventDefault() 메소드를 호출함으로써 만들수 있다.

드래그된 데이타가 놓여 질때 drop(event) 이벤트가 발생한다.

드랍되어지는 요소의 ondrop 속성에서 drop 이벤트를 호출한다.


script type="text/javascript"

function allowDrop(ev)

{

ev.preventDefault();

}

function drag(ev)

{

ev.dataTransfer.setData("Text",ev.target.id); //이벤트가 발생하는 객체의 파라미터명을 텍스트로 해서 해당객체의 id값을 부여

}

function drop(ev)

{

var data=ev.dataTransfer.getData("Text"); // 드래그된 데이타를 얻어온다.

ev.target.appendChild(document.getElementById(data)); // 드래그된 데이타의 ID 값을 얻어서 드래그되어진 요소에 추가한다.

ev.preventDefault(); // 브라우저의 기본적인 데이타처리를 막기위해 호출한다.

}

body 태그를 기입한다.

div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"

// 요소를 Drag할수 있도록 만들기 위해서는 draggable 속성을 true 로 설정해야 한다.

<img src="img_w3slogo.gif" draggable="true" ondragstart="drag(event)" id="drag1" width="88" height="31" />

div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"


블로그 이미지

희망잡이

,