2008-01-08

오픈소스 라이센스의 적용범위

소프트웨어진흥원 자료, KLDP 자료, IOSN자료들을 모두 살펴봤지만, 오픈소스 라이센스가 영향을 미치는 범위에 대해서 명쾌하게 설명한 자료는 찾을 수가 없어서 혼자서 다음 그림을 그려봤습니다.


오픈소스 라이센스의 적용범위를 설명하기 위해서 위 그림에서처럼 세 가지 경우로 나누었습니다.

  • 오픈소스의 일부를 수정한 파일 A,
  • 오픈소스를 수정하지는 않았지만, 오픈소스와 함께 하나의 모듈을 구성하고 있는 파일 B,
  • 오픈소스의 derivative works를 static 또는 dynamic으로 링크해서 동작하는 파일C
이 세가지 경우에 대해서 GPL, LGPL, MPL, CPL의 적용범위를 설명한 것이 위 그림의 오른쪽 표입니다.
이렇게 그려보고 나니 좀 설명하기가 쉬워진 것 같네요. 혹시 틀린 점이 있으면 코멘트 남겨주세요.

2008-01-07

PDF 논문 목록 만들기

연구업무를 하다보면 논문을 살펴볼 일이 많은 것 같습니다.
특히 초기단계에는 더 많지요.
이 때 저는 다음과 같은 과정을 통해서 조사를 합니다.

  1. 처음에 조사할 분야의 적당한 용어를 선택해서 논문 검색
  2. 다운로드 받은 논문들을 읽어보고 중요논문 선택
  3. 중요논문에서 참고한 문헌들 다시 조사
  4. 중요논문을 읽고 조사할 분야의 보다 적합한 검색 키워드 선정
  5. 새로운 키워드로 1번 부터 반복
여기서 2번 과정에서 항상 다운로드 받은 pdf 논문 파일들을 일일이 열어보는 과정을 해야하는데요. 이 과정이 은근히 귀찮아서 스크립트를 만들어봤습니다.
특정 디렉토리를 지정하면 그 디렉토리의 모든 하위 디렉토리에 있는 pdf 파일들의 파일명, 제목과 abstract의 목록을 만듭니다. 파일명에는 해당 파일로의 링크를 걸어서 보기 편하게 만들었습니다.
단점은 현재는 IEEE 2-column 형식만 지원한다는 것입니다. 그래도 대부분의 논문이 이 형식을 지원합니다.
필요하신 분들 가져다가 유용하게 쓰세요(xpdf 툴킷 중 pdftotext.exe가 아래 python 스크립트와 같은 디렉토리에 있어야 합니다).
다른 형식을 지원하게 되었거나 향상된 점은 저에게도 알려주시구요.
# -*- coding: cp949 -*-

# Usage: "python pdflist.py starting_directory_path output_filename"
# This script find the pdf files recursively from starting_directory_path and
# get the title and the abstract of the file and build the list in HTML table.
#
# Written by guldook. 2008.1.6.
# You must let me know any changes you did (guldook at gmail)

import os, string, tempfile
import sys

def get_text(filename,start=0,end=0):
try:
cmd = "pdftotext.exe -f %d -l %d -enc UTF-8 %s -" % (start, end, filename)
f = os.popen(cmd)
text = f.read()
err = f.close()
if err is not None:
print 'unable to read %s' % filename
raise IOError
except IOError:
pass
except:
raise Exception,'unable to execute pdftotext'
return text

# paper must be formatted by IEEE 8.5 x 11-inch Proceedings Manuscripts, IEEE 2-column format
# refer http://www.computer.org/portal/site/cscps/menuitem.02df7cde46985ea21618fc2e6bcd45f3/index.jsp?&pName=cscps_level1&path=cscps/cps/final&file=wi06.xml&xsl=generic.xsl&
# I need to extend to other format

def get_info(fname):

title,abstract = None, None

try:
s = get_text(fname, 0, 10)

# get the index of 'Introduction' section
idx_abstract = s.index('Abstract')

# get the index of 'Introduction' section
idx_intro = s.index('Introduction')

title = s[:s.index('\n')]
abstract = " ".join(s[idx_abstract+len('Abstract'):idx_intro].split()).replace('\n','').replace(', ',' ')
title = '"' + title + '"'
abstract = '"' + abstract + '"'

except (IOError, ValueError):
raise
finally: return title,abstract

header = "<html>\n<title>%s directory pdf file summary</title>\n<body>\n<table>\n<tr><td>Link</td><td>Title</td><td>Abstract</td>\n"
footer = "</table></body>\n</html>"

def get_pdflist(path, outfn):

numlist = 0
f = open(outfn, "w+")
f.write(header % os.path.abspath(path))

for root, dirs, files in os.walk(path):
for fname in files:
if fname.endswith('.pdf'):
try:
title, abstract = get_info(os.path.join(root, fname))
if (title and abstract):
line = "<tr><td>"
link = "".join(['<a href="file:///', os.path.join(os.path.abspath(root), fname), '">', fname, '</a>'])
line += "</td><td>".join([link, title, abstract])
line += "</td></tr>"
f.write(line+"\n")
numlist += 1
except IOError, ValueError:
## line = ", ".join([fname, "N/A", "It must be standard IEEE 2-column format"])
## f.write(line+"\n")
continue
f.write(footer)
f.close()

if __name__ == '__main__':
if len(sys.argv) == 1:
get_pdflist('./test', "./pdflist.html")
elif len(sys.argv) != 3: print "Usage: pdflist.py start_path output_filename"
else : get_pdflist(sys.argv[1], sys.argv[2])