IT정보뉴스

오픈소스 라이센스 정리(GPL, LGPL, BSD, Apache, MIT, MPL, Eclipse)

요즘 대세는 오픈소스 소프트웨어이다. 그러나 이를 활용하여 무언가를 해보려 할 때, 이놈의 저작권 때문에 쉽사리 이용하기가 꺼려진다.그러나 이 라이센스들은 결국 허용하는 범위 내에서 최대한의 자유를 보장하는 것으로 알아두고 충분히 활용하는 것이 유리하다.아래는 GPL, LGPL, BSD, Apache, MIT, MPL, Eclipse 라이센스의 내용들을 간단히 요약한 것으로 좀더 자세한 내용을 원한다면 링크를 참조하자.사진 업로드 시 글씨가 잘 안보일 것을 대비해 pdf파일을 첨부한다.OpenSource License 정리.pdf각 라이선스들에 대해 간단히 설명을 하자면 다음과 같다.GNU GPL License: 자유소프트웨어 재단(FSF)에서 제정. GPL라이선스를 이용하여 개발 시 개인적, 내부적 이용에 한해서는 소스코드를 공개하지 않아도 되나, 외부 배포 시 해당 소프트웨어의 전체 소스코드를 공개해야 함. (3.0버전은 아파치 라이선스와 같이 사용 가능) ex) 파이어폭스(2.0), 리눅스 커널, 깃, 마리아DB 등LGPL License: 기존 GPL의 높은 제약을 완화시키기 위해 탄생. LGPL로 작성된 소스코드를 라이브러리(정적, 동적)로만 사용하는 경우엔 소스코드를 공개하지 않아도 됨. 그 이외 사항은 GPL과 동일. ex) 파이어폭스(2.1)BSD License: 버클리 캘리포니아 대학에서 제정. BSD 자체가 공공공기관에 만든 것이므로 공공환원의 의도가 강해서 저작권 및 라이선스 명시 이외엔 아무 제약이 없이 사용 가능한 자유로운 라이선스 ex) OpenCVApache License: 아파치 소프트웨어 재단에서 제정. 소스코드 공개 의무 없음. 단, 아파치 라이선스 사용을 밝혀야 함. BSD보다 좀더 완화된 내용. ex) 안드로이드, 하둡 등MIT License: BSD 라이선스를 기초로 MIT 대학에서 제정. MIT 라이선스를 따르는 소프트웨어 사용하여 개발 시, 만든 개발품을 꼭 오픈소스로 해야 할 필요는 없음. 물론 소스코드 공개 의무도 없음. ex) X 윈도 시스템, JsoupMPL License: 1.0 버전은 넷스케이프 변호사였던 미첼 베이커가 작성, 1.1과 2.0버전은 모질라 재단에서 제정. 소스코드와 실행파일의 저작권 분리가 특징. MPL라이선스의 소스코드를 사용하여 개발했을 시, 수정한 소스코드는 MPL로 공개하고 원저작자에게 수정한 부분에 대해 알려야 하지만, 실행파일은 독점 라이선스로 배포 가능. 또한 MPL와 무관하게 작성된 소스코드는 공개할 필요 없음. ex) 파이어폭스(1.1) Eclipse License: 이클립스 재단에서 제정. CPL을 대체하며, GPL보다 약한 수준으로 기업 친화적인 특징.ex) Eclipse글을 작성하며 참고한 링크들에 정말 정리가 잘 된 내용들이 많으므로 한번씩 들어가 살펴보는 것을 권장한다.참고: http://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide#s-3.2.4http://www.bloter.net/archives/209318http://wizardee.tistory.com/m/157https://www.olis.or.kr/ossw/license/license/list.dohttp://darkpgmr.tistory.com/m/89

최근 등록된 자바스크립트 소스

사진 설명
사진

Javascript WYSIWYG HTML editor http://naver.github.io/smarteditor2/

SmartEditor2OverviewSmartEdtitor™ 는 JavaScript로 구현된 웹 기반의 WYSIWYG 편집기입니다.WYSIWYG 모드 및 HTML 편집 모드와 TEXT 모드를 제공하고, 자유로운 폰트 크기 설정 기능, 줄 간격 설정 기능, 단어 찾기/바꾸기 기능 등 편집에 필요한 다양한 기능을 제공하므로 사용자들은 SmartEdtitor™를 사용하여 쉽고 편리하게 원하는 형태의 글을 작성할 수 있습니다.또한, SmartEdtitor™의 구조는 기능을 쉽게 추가할 수 있는 플러그인 구조로 되어 있어 정해진 규칙에 따라 플러그인을 만들기만 하면 됩니다.User Guide사용자 가이드에서는 SmartEditor2 의 특징과 기능을 소개합니다.또한, 설치 방법과 기능의 추가/삭제 방법도 알 수 있습니다.사용자 가이드Demo아래 데모페이지 에서는 SmartEditor2.0 이 제공하는 다양한 기능을 바로 체험해 볼 수 있습니다.SmartEditor2 Demo 바로가기Supported BrowsersInternet Explorer 8.x 이상Firefox 3.5 이상Chrome 4.0 이상Safari 4.0 이상LicenseSmartEditor2 is released under the LGPL v2.1.LGPL v2.1 (한국어)Third-party librariesThe following third-party libraries are used :Jindo - https://github.com/naver/jindojs-jindo: for DOM/Event Handling, OOP style codeJindo Component - https://github.com/naver/jindojs-jc: for UI Control (DragArea, LayerManager, LazyLoading)Read MoreCHANGELOGTODO List설치시 발생하는 버그 또는 질문은 "이슈" 게시판을 이용해주세요.SmartEditorBasic 0.3.X 버전이 궁금하시다면...구 SmartEditorBasic 0.3.X 버전 도움말 보기

사진

[JSP] 스마트에디터(smarteditor)의 싱글/멀티 이미지업로드하기

참고] 관련포스트 [jsp] 네이버의 스마트에디터(SmartEditor) 적용하기 스마트에디터에서 사진을 업로드 해보자. 각 브라우저별로 사진 버튼 클릭시 업로드 기능에 대한 유형이 조금식 틀려진다.IE11 미만 버전에서는  싱글 멀티파트 업로드화면을 출력시키고IE11, 크롬, 사파리 등에서는 드래그앤드롭기능으로 멀티파일 업로드(드래그앤드롭) 폼을 출력시킨다.싱글업로드 화면: 멀티플업로드 화면(드래그앤드롭이용)JSP 환경에서 파일 처리를 위해 다음 라이브러리를 WebContent\WEB-INF\lib\ 폴더에 넣자.  (첨부파일 참고)commons-fileupload-1.2.2.jarcommons-io-1.4.jar WebContent/SE2/photo_uploader/popup 디렉토리 내에 있는 파일을 다음과 같이 수정해주자.※ 스마트에디터 가이드 참고 : http://jindo.dev.naver.com/smarteditor/user_guide/photo_uploader.html: 사진 퀵 업로더에서 사용하는 HTML 팝업 페이지다음 그림과 같이 form의 action속성을 제거 attach_photo.js : photo_uploader.html 파일에서 사용하는 JavaScript 파일. 사진 퀵 업로더를 설치할 때 코드를 반드시 수정해야 한다.변경함수 : callFileUploader(), html5Upload()callFileUploader() : 싱글파일 업로드 , HTML5를 지원하지 않는 브라우저에서 사용html5Upload() : 멀티플 업로드, HTML5를 지원하는 브라우저에서 사용먼저 callFileUploader() 함수에서 다음 속성을 현재 자신의 환경에 맞게 수정하자sUrl : 사진을 업로드할 서버의 경로 sCallback : 업로드 이후에 iframe이 redirect될 콜백페이지의 주소 다음으로 html5Upload() 함수에서 sUploadURL을 변경하자. 필요한 JSP파일을 다음과 같이 생성하자.file_uploader.jspfile_uploader_html5.jsp[file_uploader.jsp] <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@page import="java.io.FileOutputStream"%><%@page import="java.io.OutputStream"%><%@page import="java.io.InputStream"%><%@page import="java.util.UUID"%><%@page import="java.text.SimpleDateFormat"%><%@page import="java.io.File"%><%@page import="org.apache.commons.fileupload.FileItem"%><%@page import="java.util.List"%><%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%><%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%> <%String return1="";String return2="";String return3="";String name = ""; if (ServletFileUpload.isMultipartContent(request)){    ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory());    uploadHandler.setHeaderEncoding("UTF-8");    List<FileItem> items = uploadHandler.parseRequest(request);    for (FileItem item : items) {        if(item.getFieldName().equals("callback")) {            return1 = item.getString("UTF-8");        } else if(item.getFieldName().equals("callback_func")) {            return2 = "?callback_func="+item.getString("UTF-8");        } else if(item.getFieldName().equals("Filedata")) {            if(item.getSize() > 0) {                      name = item.getName().substring(item.getName().lastIndexOf(File.separator)+1);                String filename_ext = name.substring(name.lastIndexOf(".")+1);                filename_ext = filename_ext.toLowerCase();                String[] allow_file = {"jpg","png","bmp","gif"};                int cnt = 0;                for(int i=0; i<allow_file.length; i++) {                    if(filename_ext.equals(allow_file[i])){                        cnt++;                    }                }                if(cnt == 0) {                    return3 = "&errstr="+name;                } else {                                         //파일 기본경로                    String dftFilePath = request.getSession().getServletContext().getRealPath("/");                    //파일 기본경로 _ 상세경로                    String filePath = dftFilePath + "SE2" + File.separator +"upload" + File.separator;                                         File file = null;                    file = new File(filePath);                    if(!file.exists()) {                        file.mkdirs();                    }                                         String realFileNm = "";                    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");                    String today= formatter.format(new java.util.Date());                    realFileNm = today+UUID.randomUUID().toString() + name.substring(name.lastIndexOf("."));                                         String rlFileNm = filePath + realFileNm;                    ///////////////// 서버에 파일쓰기 /////////////////                     InputStream is = item.getInputStream();                    OutputStream os=new FileOutputStream(rlFileNm);                    int numRead;                    byte b[] = new byte[(int)item.getSize()];                    while((numRead = is.read(b,0,b.length)) != -1){                        os.write(b,0,numRead);                    }                    if(is != null) {                        is.close();                    }                    os.flush();                    os.close();                    ///////////////// 서버에 파일쓰기 /////////////////                                         return3 += "&bNewLine=true";                                // img 태그의 title 옵션에 들어갈 원본파일명                    return3 += "&sFileName="+ name;                    return3 += "&sFileURL=/smarteditorSample/SE2/upload/"+realFileNm;                }            }else {                  return3 += "&errstr=error";            }        }    }}response.sendRedirect(return1+return2+return3); %>Colored by Color Scriptercs[file_uploader_html5.jsp] <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <%@page import="java.io.*"%><%@page import="java.util.UUID"%><%@page import="java.text.SimpleDateFormat"%> <%    //파일정보    String sFileInfo = "";    //파일명을 받는다 - 일반 원본파일명    String filename = request.getHeader("file-name");    //파일 확장자    String filename_ext = filename.substring(filename.lastIndexOf(".") + 1);    //확장자를소문자로 변경    filename_ext = filename_ext.toLowerCase();     //이미지 검증 배열변수    String[] allow_file = { "jpg", "png", "bmp", "gif" };     //돌리면서 확장자가 이미지인지     int cnt = 0;    for (int i = 0; i < allow_file.length; i++) {        if (filename_ext.equals(allow_file[i])) {            cnt++;        }    }     //이미지가 아님    if (cnt == 0) {        out.println("NOTALLOW_" + filename);    } else {        //이미지이므로 신규 파일로 디렉토리 설정 및 업로드           //파일 기본경로        String dftFilePath = request.getSession().getServletContext().getRealPath("/");        //파일 기본경로 _ 상세경로        String filePath = dftFilePath + "SE2" + File.separator + "multiupload" + File.separator;        File file = new File(filePath);        if (!file.exists()) {            file.mkdirs();        }        String realFileNm = "";        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");        String today = formatter.format(new java.util.Date());        realFileNm = today + UUID.randomUUID().toString() + filename.substring(filename.lastIndexOf("."));        String rlFileNm = filePath + realFileNm;        ///////////////// 서버에 파일쓰기 /////////////////         InputStream is = request.getInputStream();        OutputStream os = new FileOutputStream(rlFileNm);        int numRead;        byte b[] = new byte[Integer.parseInt(request.getHeader("file-size"))];        while ((numRead = is.read(b, 0, b.length)) != -1) {            os.write(b, 0, numRead);        }        if (is != null) {            is.close();        }        os.flush();        os.close();        ///////////////// 서버에 파일쓰기 /////////////////         // 정보 출력        sFileInfo += "&bNewLine=true";            sFileInfo += "&sFileName=" + filename;            sFileInfo += "&sFileURL=/smarteditorSample/SE2/multiupload/"+realFileNm;        out.println(sFileInfo);    }%>Colored by Color Scriptercs단일파일 업로드 테스트 : 멀티파일 업로드 테스트 : [출처] [JSP] 스마트에디터(smarteditor)의 싱글/멀티 이미지업로드하기 |작성자 자바킹

사진

[JSP] naver SmartEditor2 이미지 첨부 기능 (수정 보완)

https://zero-gravity.tistory.com/171정말 불친절한 네이버가이드 때문에 이걸 하느라고 얼마나 고생했는지 모른다. 전부 php로 되어 있어서 이걸 jsp로 바꾸고 해야 하는데, 다른 사람들이 블로그에 올려놓은 것들을 보니 저마다 조각조각이라 어찌할 방도가 없었다. 결국 회사 선배의 도움으로 해결..   혹시라도 나같이 jsp 스마트에디터 이미지 첨부를 미친듯이 구글링하고 있을 불쌍한 중생들을 위해 아래 파일과 간단한 방법을 올린다. se2.zip   먼저 첨부한 파일을 다운로드 받아서 폴더째 서버에 복사 붙여넣기 한다.   그리고 cos.jar파일을 lib에 추가해준다. 이 글 참조 → http://zero-gravity.tistory.com/168    (MultipartRequest와 DefaultFileRenamePolicy를 사용하기 때문..)   나머지는 다른 환경에서 작동하도록 첨부한 파일들에서 몇몇 설정만 변경해주면 된다.se2 > photo_uploader > popup > file_uploader.jsppath를 각자의 "서버 안에 있는 폴더"로 경로를 변경해준다.에를 들어, 프로젝트의 WebContent 안에 있는 uploadFolder를 경로로 설정하고 싶다면,아래와 같이 변경해줘야 한다. 각자 경로에 맞춰서.(무슨 말인지 알 거다.)String path = "D:/folder/workspace/projectName/WebContent/uploadFolder";path는 스마트에디터로 이미지를 첨부했을 시에 업로드 될 경로다.참고: 만약 path를 request.getSession().getServletContext().getRealPath("/") + File.separator + "저장될 폴더" 이런 식으로 써주면 폴더를 새로고침 하지 않아도 이미지를 즉각적으로 확인할 수 있다. 이 때 이미지가 저장되는 곳은 metadata쪽이다.   그리고나서,,?1234567891011121314151617181920212223242526272829303132333435363738<!-- Smart Editor --><script type="text/javascript" src="<%=request.getContextPath()%>/se2폴더를 붙여넣기 한 곳의 경로/se2/js/HuskyEZCreator.js" charset="utf-8"></script><script type="text/javascript" src="<%=request.getContextPath()%>/se2폴더를 붙여넣기 한 곳의 경로/se2/photo_uploader/plugin/hp_SE2M_AttachQuickPhoto.js" charset="utf-8"></script>  <!-- Smart Editor --><script type="text/javascript"> var oEditors = [];nhn.husky.EZCreator.createInIFrame({    oAppRef: oEditors,    elPlaceHolder: "textAreaContent",    sSkinURI: "<%=request.getContextPath()%>/se2폴더를 붙여넣기 한 곳의 경로/se2/SmartEditor2Skin.html",    fCreator: "createSEditor2"}); //‘저장’ 버튼을 누르는 등 저장을 위한 액션을 했을 때 submitContents가 호출된다고 가정한다.function submitContents(elClickedObj) {    // 에디터의 내용이 textarea에 적용된다.    oEditors.getById["textAreaContent"].exec("UPDATE_CONTENTS_FIELD", [ ]);     // 에디터의 내용에 대한 값 검증은 이곳에서    // document.getElementById("textAreaContent").value를 이용해서 처리한다.      try {        elClickedObj.form.submit();    } catch(e) {         }} // textArea에 이미지 첨부function pasteHTML(filepath){    var sHTML = '<img src="<%=request.getContextPath()%>/path에서 설정했던 경로/'+filepath+'">';    oEditors.getById["textAreaContent"].exec("PASTE_HTML", [sHTML]);} </script>   스마트에디터를 사용할 jsp페이지에 위와 같이 자바스크립트를 삽입한다.   textarea 태그의 id 값을 자바스크립트에 넣었던 id와 같게 해주는 것도 잊지 말자.?1<textarea style="width: 100%" rows="10" name="content" id="textAreaContent" cols="80"></textarea>   다음은 설정을 모두 끝내고 스마트에디터를 실행했을 시의 화면이다.우측 상단에 있는 "사진"을 클릭.사진 첨부하기 창이 뜰 것이다.이미지를 첨부하고 확인.그럼 이렇게 이미지가 X박스 표시되어 나온다.정상적이다. 왜냐하면 이클립스에서 새로고침을 하지 않았기 때문이다.실제로 본 서버에 올리면 잘 돌아간다.그럼 이미지가 올라갔는지 어떻게 확인하나?일단 이클립스에서 이미지가 올라간 폴더에 새로고침을 해주고(이때 올렸던 이미지가 추가됐다면 성공한 거다),스마트에디터의 HTML로 가서 내용을 복사한다.스마트에디터를 다시 실행하고, HTML로 가서 복사한 내용을 붙여넣기한다.Editor로 돌아오면 짠~!   글쓰기를 완료하지 않아도 이미지 파일 자체는 서버에 업로드 된다.   글쓰기를 완료할 경우, DB에는 이미지 파일 자체가 올라가는 게 아니라 아까 HTML영역에서 복사했던 그 내용이 올라간다.   이런 데에 시간을 허비하는 건 너무 아깝지 않은가.   어짜피 오픈소스 갖다 쓰는 건데,, 그냥 대충 어떻게 돌아가겠구나 정도만 알면 된다고 본다.   이게 뭐라고.. 혼자만 알려고 꼭꼭 숨기는 사람들 보면 참....   물론 고생 더럽게 해서 알려주기 아깝겠지만, 그런 사람은 더럽게 이기적인 사람이라고 생각한다. ㅡ.ㅡ..;   인류가 이렇게 발전할 수 있었던 데에는 지식의 전달과 축적이 있었기에 가능했던 것 아닌가.    공유하는 세상이 아름다운 세상이다. 크~