요근래 Windows7 64bit 에서 MS Office 2010 을 사용중에 갑자기 언어팩을 설치할 수 없다는 경고와 함께 무한 리부팅이 되는 사태가 발생 했었다.


 재부팅이 무한정 되는 문제는 윈도우즈가 부팅되자마자 작업관리자의 프로세스에서 Microsoft Office 가 수행중인 프로제스를 강제 종료하여 임시로 해결이 되었다. 하지만 이후 Microsoft Office Uninstall 만 수행하면 위의 재부팅 문제가 발생하였다.


 윈도우익스플러에서 강제로 Office 관련된 부분을 지우고 새로 Office 를 설치하려고 하니 이번엔 다음과 같은 경고창이 뜨면서 이도저도 못하는 상황이 발생되었다.


"이전 Groove 또는 Microsoft Groove Server 소프트웨어가 이 시스템에 설치되어 있습니다. Microsoft Sharepoint Workspace를 설치 또는 업그레이드하기 전에 이전 Groove 및 Microsoft Groove Server 소프트웨어를 모두 제거해야 합니다. 자세한 내용은 Microsoft Shearepoint Workspace 관리자에게 문의하십시오."


 위의 문제를 해결하고 MS Office 를 새로 설치하려면 다음과 같은 방법이 있다.

  1. 제어판의 프로그램 추가제거에서 office 를 제거하는 방법(이방법이 잘되면 여기에 블로깅을 하지도 않았다.) 
  2. Fix It 라는 Uninstall 프로그램을 수행하여 office 를 제거하는 방법
  3. 위의 1,2번으로 해결이 안되면 수동으로 office 관련 파일들과 레지스트리를 삭제해줘야 한다.


Posted by leechwin
,

Web Site 나 Web App 등의  Cross Browser Testing 을 지원하는 Browserling 이라는 서비스를 소개한다.

Browserling 사이트에 접속하면 다음과 같이 캐리커쳐같은 분위기의 사이트가 나타난다.



 URL 란에 자신이 테스트하고 싶은 URL 을 입력하고, Test 하고싶은 Browser 와 버전을 선택하고 Run 을 수행하면 다음과 같이 선택한 Browser 위에 URL 이 랜더링되어 나타난다.

 정확히는 자신의 Browser 의 Canvas 위에 Browserling 에서 생성한 VM 과 Browser 가 나타난 것이다.

 우측의 브라우져모양을 클릭하면 현재 상태에서 Browser 와 버전을 바꿀수가 있다.


 해상도가 쓰여진 버튼을 누르면 현재 상태에서 해상도를 바꿀수가 있다.



보기에는 장난스러운 이 서비스도 나름 유료라서 무료로는 3분의 세션시간을 제공한다. 또한 ssh tunnels 등도 이용할 수 없다.



 자동화 테스트를 위한 testling-ci 도 제공을 하고 있어서 갖출것은 다 갖추고 있다.



Cross Browser Testing 로는 기본에 충실한 Service 로 보인다.


'Web' 카테고리의 다른 글

[Browser] Bookmarklet  (0) 2014.08.23
Browser Object Model  (0) 2014.02.03
[Brackets] Open source code editor for the web  (2) 2013.12.10
Web Dev Tools Review  (0) 2013.12.10
[jsFiddle] Online 웹개발 및 공유 서비스  (1) 2013.03.14
Posted by leechwin
,

 Brackets 라는 Web 기술로 구현된 Code Editor 를 소개하려고 한다.


Brackets 은 Adobe 에서 관리하고 있는 Opensource 프로젝트이다.

Download site 에서 인스톨러를 다운받아 자신의 PC 에서 Code Editor 로 쓸 수도 있고, Web Page 에서 Editor 로 사용 할 수도 있다.


Code Editor 에서는 HTML, CSS, JavaScript 언어를 지원한다.



구성

  Brackets 은 전체적으로 다음과 같은 구성으로 분류된다.

  • Menu
  • Sidebar
  • Editor
  • Preview

Menu

  기본으로 File, Edit, View, Navigate, Debug, Help 메뉴로 나뉘며, Extensions 플러그인을 설치하면 추가로 메뉴가 추가될 수도 있다.

  • File
  •  
    • New File: 새로운 파일을 생성한다. 단 확장자까지도 입력해야한다.
      • html, javascript, css 파일에 대한 템플릿은 따로 존재하지 않지만, Extenstion 설치를 통하여 템플릿으로 부터 새로운 파일 생성이 가능하다.
    • Live Preview: 현재 프로젝트에 대한 Preview 를 크롬을 통해 보여준다.
    • Live Highlight: Editor 에서 커서가 위치되어있는 Tag를 Live Preview 에서 해당 태그 위치를 표시
    • Project Settings...: Live Preview Base URL 을 변경
    • Install Extension: 외부 Extenstion을 설치 할 수 있다.
  • Edit
  • View
  • Navigate
  • Debug
    • Show Developer Tools: 현재 Brackets 에 대한 Remote Inspector 를 실행한다.    
    • Reload Brackets: 현재 실행중인 Brackets 을 다시 실행한다.
    • New Brackets Windows: 새로운 창으로 Brackets 을 하나 더 실행한다.
    • Switch Languages: 다국어 지원
    • Show Performance Data: 현재 수행중인 프로젝트에 대한 퍼포먼스 수치를 보여준다.
    • Enable Node Debugger: Node 디버깅을 위한 옵션
    • Log Node State to Console: Node 현재 상태를 Browser 의 console 에 출력한다.
    • Restart Node: Node 를 재시작
  • Help


Sidebar

 Sidebar 는 Recent Files, Project Configuration, Resources Control 등에 따라 Contenxt Menu 가  나뉜다.

  • Recent Files
  • Project Configuration: 한번에 하나의 프로젝트만 열 수 있다.
  • Resources Control: Delete, Add, Import 등의 기능은 없어서 프로젝트 폴더에 원하는 Resource 를 Delete, Add 한 후 Brackets 를  F5 로 Sync 를 맞추어야 한다.


Editor

 Editor 에서는 HTML, CSS, Javascript 를 지원한다.

  • Code hint
    • HTML, CSS, Javascript 에 대해서 Code Asssit 와 같은 기능을 제공한다. 단축키는 Ctrl+Space 이다.
    • HTML: tags, attribute names and values
      •  
    • CSS: property names and values
    • Javascript: property names
  • Validation
    • Javascript Validator 로 JSLint 가 적용되어있으나, Extension 을 통해서, CSS, HTML Validator 를 추가가 가능하다.
  • Quick Edit
    • HTML Tag 에 대한 스타일이 CSS 파일에 정의되어 있으면, 해당 Tag 에서 단축키(Ctrl+E)로 HTML Editor 내에 CSS 파일의 해당 내용이 보여지며 수정도 가능하다.
    • JavaScript 에서는 해당 구현부분이 보여지며 수정도 가능하다.
    • CSS 에서는 Color 값에 대해서는 Color Picker 가 제공된다.
    • Image Preview 와 Pixel Guides 를 제공하여 CSS Sprite 등에 유용하게 픽셀을 계산할 수 있다.
  • Live highlight
  • HTML Editor 에서 Tag 를 클릭하면 해당 부분이 Live Preview 상에서 박스로 표현이 된다.
  • Live Preview
    • Editor 에 대한 실시간 Preview 로 Chrome Base 이다.
    • Brackets 의 우측 상단에 번개마크를 클릭하여서도 실행이 가능하다.
    • CSS 는 수정시 바로 Preview 에 반영되고, HTML, Javascript 는 Save 시에만 Preview 에 반영이 된다.

Extension

 Extension 은 외부의 플러그인을 추가 설치가능한 옵션으로 다음 URL 에 70여가지 이상의 많은 Extension 들이 구현되어 있다.

 - https://github.com/adobe/brackets/wiki/Brackets-Extensions

 

  • Menu > File > Install Extension > 에 해당 Extension 에 대한 URL 을 기술하고 Install 버튼을 누르면 된다.
  • Extension 으로 추가가능한 주요 항목들은 다음과 같다.
    • Snippets
    • Prefixr
    • Quick Markup
    • HTML Tempaltes
    • Auto-match pairs
    • Auto Formatter
    • TabToSpace
    • Beaufiy
    • Minifier
    • CSSLint
    • JSHint
    • W3CValidator
    • Annotate
    • Themes
    • Code folding
    • Hover Preview
    • Markdown Preview
    • etc..


Slideshare: http://www.slideshare.net/ChanghyunLee4/brackets-review



'Web' 카테고리의 다른 글

Browser Object Model  (0) 2014.02.03
[Browserling] Cross Browser Testing Service  (0) 2013.12.10
Web Dev Tools Review  (0) 2013.12.10
[jsFiddle] Online 웹개발 및 공유 서비스  (1) 2013.03.14
[Browser] 사용중인 Web Browser 알아내기  (2) 2013.03.14
Posted by leechwin
,

Web Dev Tools Review

Web 2013. 12. 10. 11:19
  • Outline
    • Command-line
    • Terminal
    • Quick Start
    • Recorder
    • Editor
    • Chrome DevTools
    • Integration tools
    • Synchronized
    • Visual regression testing
    • Simulate real-network conditions
    • Live testing and Screenshots
    • Mobile Web


Posted by leechwin
,

Java 에서 XML 파일 Validation 수행시 기반이 되는 XSD 파일이 여러개이고 XSD 파일관의 관계가 import, include 등으로 복잡할 경우 SchemaFactory.newSchema(Source schema) 호출 Error 가 발생하는 경우가 있다.


다음의 예제로 XSD 파일 Resolve 방법에 대해 알아보자.


다음과 같이 3개의 XSD 파일이 있고 "main.xsd" 파일이 Root 가 되는 XSD 파일로 a.xsd 와 b.xsd 파일을 import 혹은 include 하고 있다.

  • a.xsd
  • b.xsd
  • main.xsd

위와 같은 구조일 경우 일반적으로 다음과 같이 Schema 를 구현한다.

// read the xsd files
FileInputStream mainStream = new FileInputStream("main.xsd");
FileInputStream aStream = new FileInputStream("a.xsd");
FileInputStream bStream = new FileInputStream("b.xsd");
Source[] sources= new Source[] { new StreamSource(mainStream), new StreamSource(aStream), new StreamSource(bStream) }

// create schema
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(sources);

// read xml file for validation
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
documentFactory.setNamespaceAware(true);
DocumentBuilder builder = documentFactory.newDocumentBuilder();
Document doc = builder.parse(new StringInputStream(xml)); // parse the XML into a document object

// validation
Validator validator = schema.newValidator();
validator.validate(new DOMSource(doc));
위의 코드로 수행할 경우 main.xsd 내에서 xsd 파일의 참조순서가 a.xsd, b.xsd 순서가 아니라면 9라인의 factory.newSchema(sources) 에서 에러가 발생하게 된다.


위와 같이 xsd 가 여러파일과의 관계를 맺으며 복잡하게 참조관계를 갖을 경우 org.w3c.dom.ls.LSResourceResolver 인터페이스를 구현한 클래스를 SchemaFactory.setResourceResolver 함수로 등록하면 복잡한 참조관계라도 필요한 파일들을 알아서 로딩 할 수 있게 된다.

// create schema
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// set resource resolver
factory.setResourceResolver(new ResourceResolver());
Schema schema = factory.newSchema(new StreamSource(new File("main.xsd"));

// read xml file for validation
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
documentFactory.setNamespaceAware(true);
DocumentBuilder builder = documentFactory.newDocumentBuilder();
Document doc = builder.parse(new StringInputStream(xml)); // parse the XML into a document object

// validation
Validator validator = schema.newValidator();
validator.validate(new DOMSource(doc));

class ResourceResolver implements LSResourceResolver {
    private Setresoures = new HashSet();
    @Override
    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
         if ( resoures.contains( systemId ) ) {
                return null;
        }
        resoures.add(systemId);
        File file = new File(systemId);
        if ( file.exists() ) {
            LSInput input = new Input();
            try {
                input.setByteStream( new FileInputStream( file ) );
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return input;
        }
        return null;
    }
}

위의 코드와 같이 LSResourceResolver 인터페이스를 구현한 ResourceResolver 에서 main.xsd 의 참조와 관련한 a.xsd, b.xsd 파일에 대한 정보요청정보를 resolveResource() 함수에서 설정이 가능하다.


 resolveResource() 함수내에서 필요한 a.xsd, b.xsd 파일의 내용이나 위치등을 설정하여 리턴하여주면 main.xsd 내의 참조관계에 따라 필요한 파일정보를 자동으로 요청하여 얻어가게 된다.


Reference: http://stackoverflow.com/questions/3499476/in-java-validate-xml-against-multiple-schemas-located-difference-server-loc

'Java' 카테고리의 다른 글

[Java] Java 플랫폼 종류 요약  (0) 2014.10.15
[JSP] Scriptlet  (0) 2014.08.26
UTF-8 인코딩시 BOM(Byte Order Mark) 문제  (2) 2013.10.30
[Java] Invalid Thread Access Error with Java SWT  (0) 2013.10.02
[Java] Web Resource Compressor Framework  (0) 2013.05.12
Posted by leechwin
,

 앞선 포스팅에서는 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음의 첫번째 방법을 포스팅 하였는데, 이번 포스팅에서는 두번째 방법에 대해 자세히 알아 보도록 한다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 두번째 방법은 SWT Browser(org.eclipse.swt.browser.Browser)에서 Javascript Function Callback 을 등록하고, Browser 에서 등록된 Javascript Function 이 호출될경우 리턴값을 Java 에서 계속 핸들링 할 수 있는 방법이다.


 main.js 파일에 Java 에서 Callback 으로 사용될 함수 javaFunction 함수를 선언해둔다. 이함수는 Javascript 에서 Java 를 호출하는 함수로 Argument 와 함께 호출 할 수 있다.


 Main.Java 파일에서는 SWT Browser 의 callback 으로 사용될 클래스를 구현해야하는데 org.eclipse.swt.browser.BrowserFunction 클래스를 상속받아야한다.

 BrowserFunction 클래스를 상속받아 구현할때 function 함수에서는 arguments 로 Javascript 에서 전달한 Argument 가 전달되어 오고, 비지니스로직 수행후 Javascript 로 다시 return 값을 전달 할 수 있다.

 BrowserFunction 확장 클래스를 구현후 다음과 같이 SWT Browser 와 Javascript Callbck 을 등록해줘야한다.

new CustomFunction (browser, "javaFunction");


// main.js
function sendToJava() {
    var result;
    try {
        result = javaFunction("javascript argument");
    } catch (e) {
        return;
    }
    for (var i = 0; i < result.length; i++) {
         alert( result[i] );
    }
}


// Main.java

final Browser browser = new Browser(parent, SWT.NONE);
browser.setText( "...skip..." ); // skip html content

final BrowserFunction function = new CustomFunction (browser, "javaFunction");

static class CustomFunction extends BrowserFunction {
    CustomFunction (Browser browser, String name) {
        super (browser, name);
    }
    public Object function (Object[] arguments) {
        Object returnValue = new Object[] {
                "Java Argument",
        };
        return returnValue;
    }
}


이와 같이 수행하면 SWTBrowser 에서 Push to invoke Java 버튼을 누를경우 Javascript 의 SendToJava() 함수가 호출되고 내부에서

Java 의 javaFunction 함수가 "javascript argument" 인자와 함께 호출되어 "Java Argument" 라는 리턴값을 Javascript 로 다시넘겨주게된다.




참고


Posted by leechwin
,

SWT Browser(org.eclipse.swt.browser.Browser)에서 Runtime 에 해당 Browser 상에서 Javascript 의 수행결과를 얻고 싶을 경우가 있다.

 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음과 같이 2가지 방법이 있다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 여기에서는 Browser 의 evaluate 함수를 이용하여 Javascript 수행 값을 얻는 방법을 알아 보도록 한다.

 evaluate 함수는 Javascript 의 eval 함수와 비슷하다고 생각하면 되는데, 이용 방법은 간단하다.

 다음과 같이 Browser 의 evaluate 함수에 Runtime 에 수행할 Javascript Code 를 넣어주면 된다.

final Browser browser = new Browser(parent, SWT.NONE);
browser.setJavascriptEnabled(true);    	
browser.addProgressListener(new ProgressAdapter() {
    public void completed(ProgressEvent event) {
        String bodyHTML = (String) browser.evaluate("return document.body;");
        // TODO:
    }
});

evaluate 함수는 다음과 같이 5개의 type 을 리턴한다.

  • javascript null or undefined -> null
  • javascript number -> java.lang.Double
  • javascript string -> java.lang.String
  • javascript boolean -> java.lang.Boolean
  • javascript array whose elements are all of supported types -> java.lang.Object[]


evaluate 함수를 사용할때 주의 할 점은 Browser 객체와 같은 Thread 에서 수행하면 evaluate 함수가 Async 하게 동작하므로 제대로 된 값을 리턴받지 못하는 경우가 발생 할 수 있다. 따라서 다른 Thread 혹은 ProgressListener 등에서 수행되도록 작성하여야 한다.

Posted by leechwin
,

 Java 에서 SWT Combo 박스에 Item 추가 작업을 하다가 Linux 환경에서는 text 가 제대로 나오는데 Windows 에서는 text 앞부분에 이상한문자가 붙어서 나오는 현상을 경험하게 되었다.


Windows 에서 다음과 같이 "ar-ae" 앞에 이상한 문자가 껴있었다.


디버깅을 해도 전혀 이상한 점이 없어서 삽질을 하던중 구글링을 통해 UTF-8 인코딩시 BOM(Byte Order Mark) 라는 것을 알게 되었다.

 BOM 은 UTF-8 로 인코딩되었다는 일종의 마킹인데, 윈도우즈에서 일부 프로그램에서는 BOM 을 강제로 삽입하는 경우가 있다고 한다. -_-;

 참고: http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem


 따라서 이를 제거해야 하는데, Edit Plus 와 같은 툴을 이용하는 등의 방법이 있다.

 본인은 해당 파일을 Edit Plus 에서 UTF-8 BOM 이 추가안되도록 설정한 상태에서 해당 문자를 지우고 다시 타이핑하였더니 해당 문제가 사라졌다.

 Gerrit 에서 봐도 사람이 봐서는 알 수 가 없다.


 하지만 hex viewer 로 보면 다음과 같이 EF BB BF 라는 문자가 삽입되어 있다.


 문자열이 알 수 없는 문제로 말썽을 일으킬때 한번 살펴보아야 할 부분인것 같다.


 리눅스에서 텍스트 파일 인코딩을 변경하려면 iconv uconv 명령을 사용하여 인코딩을 변경 할 수 있다.


Posted by leechwin
,

 Eclipse Plug-in 의 내부 resource 들은 Plug-in 과 함께 jar 로 묶여 Eclipse 에 포함되게 된다.

 예를들어 jar 내에 "resources/index.html" 이라는 파일이 있다면 이를 접근하기 위해 다음과 같은 함수가 사용된다.

URL url = Activator.class.getClassLoader().getResource("resources/index.html"); InputStream stream = Activator.class.getClassLoader().getResourceAsStream("resources/index.html");

 이때 URL 의 경우, 해당 resource 가 포함된 plug-in 의 feature 설정이 unpack 설정이 되어 있지 않으면 Eclipse 에 jar 로 묶이기 때문에 Local File URL 을 얻을 수 가 없다.


 쉽게 말하면, jar 로 묶여있는 상태의 plug-in 혹은 라이브러리에 포함된 resource 파일들에 대한 Runtime 시의 절대경로를 얻을 수 없다는 뜻이다.


 절대경로를 얻을수 없는 resource 들은 Browser.setURL() 같은 함수에서 쓰일수 없는 유효하지 않은 URL 값을 가지게 된다.


 위와 같은 문제를 Eclipse 에서는 jar 의 일부 리소스들을 다음폴더에 압축해제시켜놓고 사용한다.

  • workspace/configuration/org.eclipse.osgi/bundles/..

 위의 디렉토리는 Runtime 에 jar 안의 resource 들에 대한 절대경로로 해당 resource 에 대한 절대경로를 얻으려면 다음 API 를 사용하면 된다.

Platform.asLocalURL(URL) - Deprecated FileLocator.toFileURL(URL) //example Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); URL url= bundle.getEntry("resources/index.html"); // bundleresource://547.fwk25421790:1/resources/index.html URL localurl = FileLocator.toFileURL(url); // file:/home/leechwin/eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/Indigo.product/org.eclipse.osgi/bundles/547/1/.cp/resources/index.html

 

 참고로 Eclipse 는 Resource 에 Access 가 되는 파일들만 미리 bundles 밑에 폴더에 압축을 풀어놓고 Access 가 되지 않는 파일들은 압축을 풀어놓지 않아, html 과 같은 파일만 Access 하게 되면, 해당 html 에 연관된 css, javascript 등은 압축이 해제되어있지않아 원하는 결과를 얻지 못할 수 있다.

 이럴경우 해당 파일의 Parent 경로(파일의 디렉토리)를 인자로 주면 해당 폴더의 내용들이 모두 압축이 풀리게 된다.


참고: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fmisc%2Fmulti_user_installs.html

Posted by leechwin
,

 Eclipse 의 extension point 를 extension 한경우 그값으로 IConfigurationElement  를 얻어 올 수 있다.

 extension 을 한 해당 plugin 에 대한 Bundle 을 얻고 싶은 경우가 있는데 다음과 같이 수행하면 해당 Bundle 을 얻어 올 수 있다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );


해당 번들에서 어떠한 리소스들 찾고 싶다면 다음과 같이 수행하면된다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );
URL url = bundle.getResource( filepath );
URL resolvedURL = FileLocator.resolve( url );

참고로 번들에서 Resource 를 얻어오면 "bundleresource://" 등의 prefix 가 붙는 경우가 있는데,

이런때에는 org.eclipse.core.runtime.FileLocator.resolve(URL url) 함수를 사용하면 된다.


참고: http://www.eclipsezone.com/eclipse/forums/t82616.html

참고: http://stackoverflow.com/questions/9030830/file-and-bundleresource-urls

Posted by leechwin
,