달력

06

« 2017/06 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

'programming'에 해당되는 글 16

  1. 2015.05.20 First Class Object
  2. 2015.04.10 SublimeText
  3. 2015.04.10 Webstorm
  4. 2015.04.10 Node.js
  5. 2014.07.18 SAX split the data element problem
  6. 2014.04.23 [Tip] 이클립스 속도를 올려보자.
  7. 2013.11.19 Maven3 vol.1 기본개념
  8. 2013.11.08 javascript의 replaceAll()
  9. 2013.10.29 기본 타입과 참조 타입 & 가비지 컬렉션
  10. 2013.10.24 ibatis caching
2015.05.20 11:37

First Class Object programming/javascript/jquery2015.05.20 11:37

[First Class Object] - javascript(Function)

- 변수나 데이터 구조 안에 담을 수 있음

- 인자로 전달할 수 있음

- 반환값(return value)으로 사용할 수 있음

- 런타임에 생성할 수 있음

- 할당에 사용된 이름과 관계 없이 고유하게 식별할 수 있음

신고

'programming > javascript/jquery' 카테고리의 다른 글

First Class Object  (0) 2015.05.20
Node.js  (0) 2015.04.10
javascript의 replaceAll()  (0) 2013.11.08
기본 타입과 참조 타입 & 가비지 컬렉션  (0) 2013.10.29
Posted by insummersnow
2015.04.10 17:11

SublimeText programming/Front-End2015.04.10 17:11

SublimeText

구글의 엔지니어였던 Jon Skimmer는 2005년 12월부터 3D 가속 기능을 갖춘 텍스트 편집기를 상상해 왔다가 2007년 11월에

첫 프로토 타입을 개발함.


이후 편집기를 완성하고자 구글 엔지니어를 그만두고 개발에 몰두하여 SublimeText1을 2008년에 발표함.


Front-End 개발자들이 주로 사용.

신고

'programming > Front-End' 카테고리의 다른 글

SublimeText  (0) 2015.04.10
Webstorm  (0) 2015.04.10
Posted by insummersnow
2015.04.10 17:05

Webstorm programming/Front-End2015.04.10 17:05

Webstorm

Intellij로 유명한 JetBrains사 에서 개발한 크로스 플랫폼 프론트엔드 전용 IDE.

2009년부터 개발하여 2010년에 1.0 베타를 발표했으며 지금은 버전8(2014년 06월 기준).


Auto-complete Code trace, lint, Test-runner, Debugger등을 지원.


! 전달인자가 기대하는 타입형을 분석하여 사용자에게 Hinting해줌.

! 타입형을 추론하여 변수 대입이나 사용에 문제가 있을시 경고 메시지 출력해줌.

! 객체의 키나 배열의 원소 타입을 추론하여 자동 완성 처리해줌.

! JSLint : 자바스크립트 코드의 구문을 검사할 목적으로 만들어진 품질 검증 도구



윗 글들은 아래 slideshare의 내용을 간추린것에 불과함.

더 세부적으로 알고 싶은 분은 아래 참고.

"Front-End 진보한 개발 환경에서 품질 좋은 코드 생산" 참고 : http://www.slideshare.net/UyeongJu/ss-35073089

"WebStorm과 Node 디버깅" 참고 : http://youtu.be/nPQPzAliQyl

"Karma(Test-runner) : 작성된 테스트 코드를 자동으로 실행해 주는 Test-runner" 참고 : http://youtu.be/IsvLKNqwgV0

"WebStorm과 테스크 자동화(Grunt(Test-runner))" 참고 : http://youtu.be/Y8TxUCPaFZ0


신고

'programming > Front-End' 카테고리의 다른 글

SublimeText  (0) 2015.04.10
Webstorm  (0) 2015.04.10
Posted by insummersnow
2015.04.10 11:19

Node.js programming/javascript/jquery2015.04.10 11:19

Node.js

2009년 Ryan Dahl 이 개발한 서버 개발 환경입니다. 구글 크롬 브라우저에서 사용하는 V8 자바스크립트 엔진을 기반으로 자바스크립트로 앱을

개발할 수 있게 합니다.

- 한빛미디어 Node.js 중

신고

'programming > javascript/jquery' 카테고리의 다른 글

First Class Object  (0) 2015.05.20
Node.js  (0) 2015.04.10
javascript의 replaceAll()  (0) 2013.11.08
기본 타입과 참조 타입 & 가비지 컬렉션  (0) 2013.10.29
Posted by insummersnow
2014.07.18 12:53

SAX split the data element problem programming/java2014.07.18 12:53


SAX

Simple API for XML

xml로 된 파일 및 문자를 해석할 수 있게 해주는 응용프로그램인터페이스(API).

SAX가 어떤 녀석인지, DOM과의 차이점은 무엇인지에 대해 많겠지만 얕은 지식으로 똥냄새나는 글 싸지르는거 보단

http://en.wikipedia.org/wiki/Simple_API_for_XML

위키 참고하는게 보는 분들 정신건강에 나을듯 싶어 따로 적진 않겠음.

간단하게 DOM의 경우 문서 단위로 해석하는 반면 SAX의 경우 line단위로 해석함.


SAX의 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// node 값 인식시 발생
    public void characters (char ch[], int start, int lengththrows SAXException{
        data = escapeData(ch, start, length);
        //개행, Tab, 캐리지리턴 문자 제외
        if(data.indexOf("\\n")==0 || data.indexOf("\\t")==0 || data.indexOf("\\r")==0){
            // System.out.println("  EVENT: " + data + " Deleted.");
        }else{
            /* SAX PARSER Character Buffer Size(2048)가 max초과시 초기화 되면서
                     data element가 split되는 현상 방어로직*/
            if(beforeBufferFilledSize != 2048){
                saxTempStr="";
            }
             // log.debug(nodeName);
             /* log.debug("Buffer Start Position:["+start+"],Character Length:{"
                      +length+ "},Start+Length:("+(start+length)+"),[Character:"+data+ ",saxTempStr:"
                      +saxTempStr+"]");*/ // DEBUG TEST용
             if((start+length)==2048){
                saxTempStr = data;
            }
            if(start==0&&beforeBufferFilledSize==2048){
                fullDataStr = saxTempStr+data;
                map.put(nodeName.trim(),fullDataStr.trim());
            }else{
                if(beforeNodeName.equals(nodeName)){
                    fullDataStr = map.get(nodeName).toString()+data;
                    map.put(nodeName.trim(),fullDataStr.trim());
                }else{
                    fullDataStr = data;
                    map.put(nodeName.trim(),fullDataStr.trim());
                }
                
            }
            beforeBufferFilledSize=(start+length);
            beforeNodeName=nodeName;
        }
    }
 

위와같이 characters 메쏘드로 node안의 element를 인식하는데,

이때 SAX parser의 경우 한번에 2048byte 만큼밖에 인식하지 못함.

물론, 2048을 다 채우고 나면 버퍼를 싹 비우고 다시 0부터 채워나감.

하지만 버퍼를 비우고 새로 채워나가는 과정에서 문제가 생김.


상황

1. 새로운 element 인식시 2045부터 채워질 차례

2. 새로 채워질 element의 경우 길이가 4일경우(ex>null)

3. 남은 여유분이 2048-2045 = 3으로 가용공간은 3

4. 이에 SAX의 경우 임의로 element를 3만큼 잘라버림

5. 이때 Programmer가 예측못한 상황이 발생되어 데이터의 정합성에 문제가 생김

 

예시(Problem)

-SAMPLE XML

<variable>null</variable>

-정상 CASE

start : 1196

length : 4

nodeName : variable

data(element) : null

-비정상 CASE(MAX BUFFER SIZE 2048 PROBLEM)

start : 2045

length : 3

nodeName : variable

data(element) : nul

start : 0

length : 1

nodeName : variable

data(element) : l

 

SOLUTION

위의 예시를 살펴보면 문제 상황에서 버퍼사이즈가 2048이후 0으로 초기화.

또한, nodeName이 동일하게 리턴되는 것을 확인할 수 있음.

이에,

1. 이전 버퍼사이즈가 2048이고 버퍼 시작이 0인 경우이전 텍스트와 현재 characters 메쏘드에서 인식된 텍스트를 붙여줌.

2. 1번케이스가 아니라고 하더라도(saxParser의 경우 line by line으로 분석하지만 xml리딩이 순차적이지 않아, 문제상황이 1번케이스에 걸리지 않을 수도 있음) 이전 nodeName과 현재 nodeName이 같은 경우 문제 상황이라고 보고 1번과 같은 처리.


 


Thx for advice

http://rb-techtips.blogspot.kr/2012/08/sax-2048-byte-issue-on-java-xml-parsing.html

신고

'programming > java' 카테고리의 다른 글

SAX split the data element problem  (0) 2014.07.18
더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil)  (2) 2013.09.13
Javadoc Tutorial  (0) 2013.05.16
refactoring  (0) 2013.01.09
Posted by insummersnow

Window->Preferences->General->Editors->Text Editors->Hyperlinking and either uncheck Enable.


Disable 후 F3 이용.

신고
Posted by insummersnow
2013.11.19 10:28

Maven3 vol.1 기본개념 programming2013.11.19 10:28

신규 프로젝트 생성시 groupId : 프로젝트의 기본 패키지로 생성됨.
신규 프로젝트 생성시 artifactId : 프로젝트명.
Maven2의 중앙저장소 : repo1.maven.org/maven2/
Maven3의 중앙저장소 : (라이브러리가 저장된 위치확인)
maven build tool의 기본 설정파일 : pom.xml
maven 명령어의 형태 : mvn [options][<goal(s)>][<phase(s)>]
goal과 phase는 pom.xml이 있는곳(프로젝트의 디렉토리 안)에서 실행가능.
메이븐은 기본적으로 빌드를 실행할때 단위테스트를 진행함.
단위테스트 스킵 명령어 : mvn -Dmaven.test.skip=true (Phase)
다양한 빌드명령어의 예 :
mvn clean test 클린과 테스트 페이즈 실행.
mvn clean compiler:compile : 클린 페이즈 실행 후, 컴파일러 플러그인의 컴파일 골 실행. 

mvn package : 컴파일, 테스트완료 후 war파일로 압축까지 진행.

메이븐의 아키타입 : 웹 어플리케이션의 경우
maven-archetype-webapp
빌드툴과 관련된 설정파일 : settings.xml
MAVEN_HOME/conf 에 위치.
사용자별로 다른 설정을 원한다면 USER_HOME/.m2에 settings.xml파일을 복사하여 빌드 설정 가능.
예) c:/user/프로젝트명/.m2
메이븐은 빌드시 의존관계에 있는 플러그인과 라이브러리를 중앙저장소에서 다운로드함.
빌드 명령어 : mvn test
settings.xml안의 <localRepository>설정으로 로컬 저장소의 경로를 변경 가능.
POM.xml : Project Object Model
mvn -f mypom.xml test : 빌드시 pom.xml이 아닌 mypom.xml 설정파일을 이용.
pom.xml파일과 관련된 자세한 정보 : http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
pom.xml의 구조


프로젝트 기본정보 : 프로젝트이름, 프로젝트URL, 프로젝트에 참여하는 개발자 목록, 프로젝트 라이센스 정보.
빌드설정 : 기본 소스 디렉토리나 리소스 디렉토리에 대한 변경, 기본제공 플러그인의 설정 변경 및 새로운 플러그인을

               추가하여 빌드과정에 포함시키기 위한 설정 가능.
프로젝트 관계 설정 : 다른 라이브러리 혹은 프로젝트 사이에 상속관계를 가질 경우 각 프로젝트의 관계를 설정하는 부분. 

빌드환경 : groupId, artifactId, packaging, version 정보는 프로젝트를 배포하고, 배포한 라이브러리를 다른 프로젝트에서

               참조할 때 사용. 중앙 저장소에서 모든 라이브러리를 관리하므로 모든 프로젝트는 고유한 값을 가져야 

            함.


최상위 POM 설정파일 : 메이븐에서 기본으로 사용하는 디렉토리(소스코드,테스트 소스코드,리소스,테스트 리소스 등)구조,

                                  중앙 저장소, 플러그인 등의 셋팅 정보.


최상위 POM의 설정 정보

build : 프로젝트 빌드와 관련한 기본적인 소스 디렉토리 구조, 빌드 산출물 디렉토리 구조, 빌드시 사용할 플러그인 

          정보관리.

sourceDirectory : 실제 서비스를 담당하는 자바 소스 코드를 관리하는 디렉토리. 기본값은 src/main/java

testSourceDirectory : 테스트 소스를 관리하기 위한 디렉토리. 메이븐 빌드 툴은 서비스 소스 코드와 테스트 소스코드를 

                              분리해 관리하며, 배포시 테스트 소스코드가 같이 배포되지 않게 함. 기본값은 src/test/java

outputDirectory : sourceDirectory의 소스를 컴파일한 결과물이 위치하는 디렉토리. 기본값은 target/classes

resources : 서비스에 사용되는 자원을 관리하는 디렉토리. 기본값은 src/main/resources

testResources : 테스트시에 필요한 자원을 관리하는 디렉토리. 기본값은 src/test/resources

repositories : 빌드할 때 접근할 저장소의 위치를 관리. 메이븐 기본 저장소 URL은 http://repo1.maven.org/maven2 

                    (Maven2기준)

pluginManagement : 빌드 설정파일에서 관리하는 플러그인목록. 이 엘리먼트에 설정되어 있다고 해서 반드시 

                             사용하는 것은 아님.

tip. 최상위 POM에서 정의한 기본설정을 변경하고자 한다면 하위 설정파일에서 재정의하면 됨.

target 디렉토리 : 빌드 후 생성되는 폴더로 빌드 후 모든 산출물이 관리되는 폴더.


작성중


Getting started 문서

http://maven.apache.org/guides/getting-started/

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html


참고서적

자바 세상의 빌드를 이끄는 메이븐

저자 박재성


신고

'programming' 카테고리의 다른 글

Maven3 vol.1 기본개념  (0) 2013.11.19
Posted by insummersnow

Java String API - replace()메쏘드

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

 Stringreplace(char oldChar, char newChar) 
          Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.
 Stringreplace(CharSequence target, CharSequence replacement) 
          Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.
 StringreplaceAll(String regex, String replacement) 
          Replaces each substring of this string that matches the given regular expression with the given replacement.
 StringreplaceFirst(String regex, String replacement) 
          Replaces the first substring of this string that matches the given regular expression with the given replacement.


BUT,

javascript에서는 replaceAll() 메쏘드가 존재하지 않음.

So,

string변수.split("타겟 문자").join("새로 변환시킬 문자");


split() 메쏘드의 경우 타겟 문자를 구분자로 삼아서 String배열에 담는역할.

join() 메쏘드의 경우 새로 변환시킬 문자를 구분자로 넣어서 해당 배열을 합쳐주는 역할.


So,

위와같이 사용하게 되면 Java의 replaceAll 메쏘드와 동일한 기능으로 쓸수 있게 되는것임.

신고

'programming > javascript/jquery' 카테고리의 다른 글

First Class Object  (0) 2015.05.20
Node.js  (0) 2015.04.10
javascript의 replaceAll()  (0) 2013.11.08
기본 타입과 참조 타입 & 가비지 컬렉션  (0) 2013.10.29
Posted by insummersnow

자바스크립트에서의 기본타입 : 숫자, 불리언, 문자열, null, undefined 등

이들이 기본타입으로 취급되는 이유는 정해진 개수의 작은 바이트로 구성되어 있어 자바스크립트 인터프리터가 저수준

오퍼레이션을 통해 손쉽게 조작 할 수 있기 때문.


자바스크립트에서의 참조타입 : 객체, 배열, 함수

이들 참조 타입은 임의 개수의 프로퍼티나 원소를 포함할 수 있으므로, 크기가 고정된 기본 타입을 조작하듯 쉽게 조작할

수는 없음. 객체나 배열 값은 그 크기가 상당히 커질 수 있으므로 이들을 값에 의해 조작할 수는 없음.

이들을 값에 의해 조작하면 복사나 비교작업에 메모리를 비효율적으로 많이 사용해야 하기 때문.


가비지 컬렉션

참조되는 값은 변수에 직접 담기지 않음. 그 값은 어딘가 다른 위치에 저장되어 있고, 변수는 그저 그 위치에 대한 참조를

담고 있을 뿐임. 참조타입의 경우 이들을 담기 위한 저장소의 크기를 알수없는 상태에서 동적으로 할당되어야 함.

자바스크립트 프로그램에서 문자열이나 배열, 또는 객체 등을 생성할 때마다, 인터프리터는 해당 개체를 저장하기 위한

메모리를 할당해야함. 이렇게 동적으로 할당된 메모리는 언젠가는 반드시 해제되어 재활용될 수 있어야 함.

자바스크립트에서는 C,C++과 같은 언어와 달리 프로그래머가 수동으로 메모리를 해제하도록 강제하지 않음.

가비지 컬렉션 기술이 가비지 객체가 생성될 시 알아서 메모리 해제하여 재활용될 수 있도록 처리.

ex>

var s = "hello";

var u = s.toUpperCase();

s = u;

"hello"에 대한 참조가 없어짐.(가비지 객체 발생)

신고

'programming > javascript/jquery' 카테고리의 다른 글

First Class Object  (0) 2015.05.20
Node.js  (0) 2015.04.10
javascript의 replaceAll()  (0) 2013.11.08
기본 타입과 참조 타입 & 가비지 컬렉션  (0) 2013.10.29
Posted by insummersnow
2013.10.24 16:50

ibatis caching programming/ibatis/mybatis2013.10.24 16:50

cacheModel


1
2
3
4
5
6
7
<cacheModel id="product-cache" type="LRU" readOnly="true" serialize="false">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name="cache-size" value="1000"/>
</cacheModel>


위의 캐쉬 모델은 LRU(Least Recently Used) 방식을 사용해서 "product-cache"라는 이름의 캐쉬 인스턴스를 생성.

type속성값은 전체경로의 클래스명이거나 아래처럼 구현을 포함하는 것의 별칭.

flush요소에 기초하여 캐쉬모델 내에서 정의됨. 이 캐쉬는 24시간마다 삭제됨. interval요소내에서 hours, minutes, seconds

또는 milliseconds단위로 설정이 되어서 삭제됨. 캐쉬는 추가적으로 insertProduct, updateProduct, 또는 deleteProduct 

맵핑 statement가 수행될때마다 삭제됨. 캐쉬를 위해 "flush on execute" 요소의 숫자값이 적용될수 있음.

몇몇 캐쉬 구현물은 위에서 보여지는  'cache-size' 같은 추가적인 프로퍼티를 필요로함. LRU 캐쉬의 경우에 크기는 캐쉬내

저장되기 위한 항목의 갯수로 결정됨. 캐쉬 모델이 설정되었을때 맵핑된 statement에 의해 사용되기 위한 캐쉬모델을

정의 할 수 있음. 예를 들면

1
2
3
<statement id="getProductList" cacheModel="product-cache">
    select * from PRODUCT where PRD_CAT_ID=#value#
</statement>

- 읽기전용 & 읽기/쓰기

프레임워크는 읽기전용과 읽기/쓰기 캐쉬를 모두 지원함.

읽기전용 캐쉬는 모든 유저에 의해 공유되어서 좀 더 큰 성능향상을 보여줌. 어쨋든 읽기전용 캐쉬로부터 읽어들인 객체는

변경불가능. 대신 새로운 객체는 업데이트를 위해 데이터베이스(또는 읽기/쓰기 캐쉬)로부터 읽어야만 함.

반면에 정정(retrieval)및 변경을 위한 객체를 사용할 경우에는 읽기/쓰기 캐쉬가 추천됨.(이를테면 필수임)

읽기전용 캐쉬를 사용하기 위해서는 캐쉬모델요소에 readOnly="true"를 셋팅. 기초설정값은 읽기전용(true)임.


-직렬화 가능한 읽기/쓰기 캐쉬

당신이 동의한다면 서술된 것처럼 세션당 캐쉬는 전역 애플리케이션 성능에 이익을 줌. 읽기/쓰기 캐쉬의 다른 타입은

전체 애플리케이션이 직렬화가능한 읽기/쓰기 캐쉬라면 성능향상을 보여줌. 이 캐쉬는 각각의 세션에 캐쉬된 객체의 다른

인스턴스를 반환할 것임. 그러므로 각각의 세션은 안전하게 반환된 인스턴스를 변경할 수 있음. 여기서 의미론적인 차이점을

알아보자면 당신은 언제나 캐쉬로부터 반환된 같은 인스턴스를 기대하겠지만 캐쉬내에서 당신은 다른것을 얻게될것임.

또한 직렬화 가능한 캐쉬로부터 저장된 모든 객체는 직렬화 가능해야만 함. 이것은 직렬화 가능한 캐쉬로 조합된 늦은(lazy)

로딩기능을 사용하기에는 어려울것이라는 것을 의미함. 왜냐하면 늦은(lazy) 프록시는 직렬화 가능하지 않기 때문임.

캐쉬의 조합을 해결하는 가장 좋은 방법은 늦은(lazy)로딩과 테이블 조인을 간단히 시도하는것임.

직렬화 가능한 캐쉬를 사용하기 위해서는 기초설정 캐쉬모델이 읽기전용이고 직렬화 가능하지 않기때문에 readOnly="true" 와

serialize="true"로 셋팅하라. 읽기전용 캐쉬는 직렬화되지 않을 것임.


-캐쉬타입들

캐쉬 모델은 다른 타입의 캐쉬를 지원하기 위해서 플러그인 형태의 프레임워크를 사용한다. 그 구현은 cacheModel요소의

type 속성값내에 정의됨. 이 정의된 클래스 이름은 CacheController인터페이스의 구현이나 아래에서 논의되는 4가지 별칭중

하나가 되야만함. 게다가 설정 파라미터는 cacheModel내에 포함된 property요소를 통해 구현체로 전달될수 있음.

현재 배포판에는 4가지 구현물을 포함하고 있음.

- MEMORY (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)

- LRU (com.ibatis.db.sqlmap.cache.lru.LruCacheController)

- FIFO (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)

- OSCACHE (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)


캐쉬타입들에 대한 자세한 설명은 ibatis guide 참고.


iBATIS-SqlMaps-2_ko.pdf



- iBATIS SQL Maps 개발자 가이드 Version 2.0 발췌


신고

'programming > ibatis/mybatis' 카테고리의 다른 글

ibatis caching  (0) 2013.10.24
Posted by insummersnow


티스토리 툴바