2014년 12월 25일 목요일

div 정중앙 배치

// DIV 정중앙 배치

.center{
    width: 200px;
    height: 200px;
    background-color: black;
 
    position:absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
 
    margin: auto;
}

2014년 12월 10일 수요일

HttpURLConnection

- URL 내용을 읽어오거나, URL 주소에 GET / POST로 데이터를 전달 할 때 사용함
- 웹 페이지나 서블릿에 데이터를 전달 수  있음
- URL --> openConnection() --> URLConnection  --> getInputStream --> InputStream (내용읽음)
- URL 의 OpenStream() : URL의 입력 스트림만 개설 (차이점)
- URLConnection : URL의 입력, 출력 스트림 개설

Construct 
protected URLConnection(URL) : 직접 생성 불가능 , OpenConnection으로 연결함
    
Method
addRequestProperty(String a, String b) : 키(a) 와 값(b)을 가지고 요청할 수 있는 
                               Properity 값을 미리 설정해 놓음. 특정 키값을 가지고 읽을 수 있도록 함
connect() : 연결 된 곳에 접속 할때 (connect() 호출해야 실제 통신 가능함)
getAllowUserInteraction() : 연결 된 곳에 사용자가 서버와 통신 할 수 있는 환경 확인(boolean)
                               in/output이 해당 서버 , 연결 포트로 가능한지 확인함
getContent() : content 값을 리턴 받음 (inputStream 값을 리턴 함)
getContent(Class[]) : 위 내용을 class[] 배열 값을 입력함
getContentEncoding() : 인코딩 타입을 String으로 리턴함
getContentLength() : content 길이 (-1 이면 정상적으로 값이 넘어오지 않았음)
getContentType() : content 가 http로 되어 있는지 타입 (ex: http-type )
getDate() : content의 날짜 (new Date(~~) 으로 변환해 줘야 함 / Long 리턴)
getDefaultAllowUserInteraction(): 기본적으로 User와 통신 가능한 상태인지 (boolean)
getDefaultUserCaches() : cache를 사용할 것 인지 (boolean)
getDoInput() : Server에서 온 데이터를 입력 받을 수 있는 상태인지 (본인 상태-default : true)
getDoOutput() : Server에서 온 데이터를 출력 할수 있는 상태인지
                          (Client 상태 -default : false)
getExpiration() : 유효 기간
getFileNameMap() : File Name Map
getHeaderField(int) : Head Field 값 받아옴 (http Head 값)
getHeaderFiled(String) :
getLastModified() : 마지막 수정 시간 

getInputStream() : InputStrema 값을 뽑아냄
getOutputStream() : OutputStream 값을 뽑아냄

setDoInput(boolean) : Server 통신에서 입력 가능한 상태로 만듬 
setDoOutput(boolean) : Server 통신에서 출력 가능한 상태로 만듬
 - Server와 통신을 하고자 할때는 반드시 위 두 method를 true로 해 놔야 함

----------------------------------------------------------------------------------------------------------------------------------

URL url = new URL("주소");
HttpURLConnection con = (HttpURLConnection)url.openConnection();

// 서버로부터 메세지를 받을 수 있도록 한다. 기본값은 true이다.
con.setDoInput(true); 

// 헤더값을 설정한다.
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

// 전달 방식을 설정한다. POST or GET, 기본값은 GET 이다.
con.setRequestMethod(method);

// 서버로 데이터를 전송할 수 있도록 한다. GET방식이면 사용될 일이 없으나, true로 설정하면 자동으로 POST로 설정된다. 기본값은 false이다.
con.setDoOutput(true);

// POST방식이면 서버에 별도의 파라메터값을 넘겨주어야 한다.
String paramstr = buildParameters(params);
OutputStream out = con.getOutputStream();
out.write( paramstr.getBytes("UTF-8") );
out.flush();
out.close();

// con.getResponseCode();

// 결과값을 가져온다.
InputStream in = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[4096];
try
{
    in = con.getInputStream();
    while(true)
    {
        int readlen = in.read(buf);
        if( readlen < 1 )
            break;
        bos.write(buf, 0, readlen);
    }
    String output = new String(bos.toByteArray(), "UTF-8");
    System.out.println(output);
}catch (Exception e){
    e.printStackTrace();
}finally{
    if(bos != null) try{bos.close();}catch(IOException aa){}
    if(in != null) try{bos.close();}catch(IOException aa){}
}

호출후에는 응답을 꼭 받아야한다.
con.getResponseCode();
그렇지 않으면 연결자체를 하지 않는다.

in = con.getInputStream();
in.close();
이렇게 InputStream을 가져와도 호출이 가능하다.

즉, 요청후에는 getResponseCode()를 호출하거나 InputStream()을 얻어야 정상적으로 연결이 이루어진다.

아래는 POST로 파라메터값을 보낼때 유용한 메소드입니다.
rath님의 me2day라이브러리를 참조했습니다.

private String buildParameters( Map params )  throws IOException
{
    StringBuilder sb = new StringBuilder();
    for(Iterator i= params.keySet().iterator(); i.hasNext(); )
    {
        String key = (String)i.next();
        sb.append( key );
        sb.append( "=" );
        sb.append( URLEncoder.encode((String)params.get(key), "UTF-8") );
        if( i.hasNext() )
        sb.append( "&" );
    }
    return sb.toString();
}

2014년 12월 1일 월요일

javascript 날짜차이구하기

Date 개체
Date개체는 날짜를 표현하는 개체로 1970년 1월 1일을 기준으로 Milliseconds 값으로 날짜를 표현합니다. 즉 Milliseconds값을 지정하여 Date개체를 생성할 수 도 있고, 또 두 Date를 빼면 Milliseconds 값으로 반환합니다.

자세히 말해서 Date개체는 1970년 1월 1일 전후로 285,616년(±100,000,000 Milliseconds)까지 표현합니다.

날짜의 차이 구하기
Date개체의 특성을 바탕으로 날짜의 차이는 아래와 같이 직접 계산을 통해 쉽게 구하실 수 있습니다.

var firstDate = new Date(2010, 10, 1);

var secodDate = new Date(2010, 12, 31);



var diffMilSec = firstDate - secodDate;

var diffSec = diffMilSec / 1000;

var diffMin = diffSec / 60;

var diffHour = diffMin / 60;

var diffDay = diffHour / 24;
function getDiffDays(first, second)

{
   return (second-first)/(1000*60*60*24)
}

javascript 형변환

eval()                          수식 또는 문자열(계산)  →   실수                              
Number()                    문자                            →   숫자                              
String()                       숫자                            →   문자                              
escape()                      한글                           →  16진수                            
unescape()                  16진수                        →   한글                              
parseInt(문자열, 진수)   문자열                         →   정수(원하는 진수 변환 가능)       
parseFloat()                 문자열                        →   부동소수점, 변환불가일때 NaN 반환 
isFinite()                     유한수 TRUE,   무한수  FALSE                             
isNan()                       문자    TRUE,   숫자     FALSE

2014년 11월 30일 일요일

계정 관리


계정 잠금 해제
ALTER USER "계정명" ACCOUNT UNLOCK;

계정 비밀번호 만료
ALTER USER "계정명" PASSWORD EXPIRE;

계정 비밀번호 만료해제 or 변경
ALTER USER "계정명" IDENTIFIED BY "비밀번호";

//////////////////////////////////////////////////////

oracle: the password has expired.
-오라클 계정의 비밀번호 만료일이 지남.

# su - oracle
-오라클 계정으로 접속

# export ORACLE_SID=JSITEUC
-SID를 JSITEUC로 변경.

# sqlplus /nolog
-로그인 없이 SQL실행
SQL> connect sys as sysdba
-dba 접속
# sqlplus '/as sysdba'
-로그인 없이 SQL실행

SQL> select * from dba_profiles where profile = 'DEFAULT';
-password_life_time의 값 확인. 180일것임. unlimited로 바꿔야 함.

SQL> alter profile default limit password_life_time unlimited;
-'DEFAULT' profile에서 비밀번호 만료일을 unlimited로 변경.

SQL> alter user 계정명 account unlock;
-계정 락 해제.

SQL> alter user 계정명 identified by 새비밀번호;
-만료된 비밀번호 다른 비밀번호로 변경.



2014년 11월 28일 금요일

표준단위표시

1] 국제표준 단위계
- 우리가 현재 사용하는 단위계는 SI 단위계라고 함
- 1960년 제11차 국제도량형총회에서 국제단위계란 명칭과 그 약칭으로 SI를 채택했습니다.
국제 단위계에는 7개의 기본 단위와 유도 단위로 이루어져 있으며 유도단위는 기본단위를 
   기본으로 만들어진 단위계입니다



2] 유도 단위계
- 기본단위계는 7개로 길이(m), 질량(kg), 시간(s), 전류(A), 열역학적온도(K), 몰질량(mol), 광도(cd)
- 유도 단위로는 예를 들어 면적의 단위는 기본단위인 길이의 제곱이므로 m2로 표시합니다. 
   따라서 유도단위는 무한정 만들 수 있습니다.


3] SI접두어

4] 단위계의 올바른 표현방식
- 기본 단위중 알파벳 대소문자를 혼동하는 경우가 많은데 예를 들어 길이의 단위는 반드시 소문자로
   써야 합니다.
   * 즉 m. 여기서 밀리미터(mm)인 경우 접두사 밀리(m)와 길이의 단위인 미터(m)를 헷갈리는 경우가 
      많고 간혹 미터를 대문자 M 으로 쓴 경우가 있는데 다 틀린 표현입니다.
- 일의 단위인 와트는 대문자 W로 써야 합니다. 
   * 해당 단위의 기원이 고유명사에서 기원했으면 고유명사는 첫글짜가 대문자이므로 반드시 대문자로
     써야 합니다
- 주파수 단위인 헤르츠(Hz)를 Hz, GHz 등으로 써야 합니다
- 전기 사용량은  100 kW로 써야 합니다
- 라디오  FM의 주파수는 107.7 MHz처럼 써야 합니다
SI 단위계에서 압력 단위인 파스칼도 Pa 로 써야 합니다(물리학자 파스칼의 이름에서 따와서 
   그렇고 전압과 전류의 단위인 V와 A도 모두 사람이름에서 가져온 것이므로 반드시 대문자로
    표기해야 합니다).
질량이나 길이의 단위는 고유명사에서 따온 것이 아니므로 반드시 소문자인 g 이나 m 로 써야 한다
- 시간의 단위인 초도 s 로 써야 합니다. 
   (흔히 초를 sec 라고 쓰는 경우도 있는데 SI 단위계에서는 틀린 표기법입니다)
- 무게를 표시할 때 반드시 kg이라고 소문자로 써야 하며, 속도도 100 km처럼 소문자로 써야 합니다
예외가 있는데 바로 부피를 말할 때 사용하는 리터(l)입니다. 
   (리터는 사람 이름에서 따온 단위가 아니므로 소문자 l을 사용해야 하지만 소문자 l이 숫자 1과 
    헷갈리므로 대문자 L로 써도 됩니다)
- 컴퓨터 용어는 HDD코 용량도 500 GB, 인터넷 속도는 100 Mbit/s가 맞는 표현입니다
마지막으로 숫자와 단위는 반드시 한칸을 띄어 쓰도록 하고 있습니다 
   (예외로는 평면각의 도분초와 숫자는 붙여 씁니다.)

축척계산

// 축척계산
 var theta;
 var pi;
 var startLon;
 var startLat;
 var endLon;
 var endLat;
 var res;
 var resPixel;
 var resCM;

 startLon = exLeft.lon; // 화면왼쪽하단 경도
 startLat = exLeft.lat; // 화면왼쪽하단 위도
 endLon = exRight.lon; // 화면오른쪽하단 경도
 endLat = exRight.lat; // 화면오른쪽하단 위도

 pi = 3.141592;
 theta =  startLon - endLon;
 res = Math.sin(startLat * pi / 180) * Math.sin(endLat * pi / 180)
          + Math.cos(startLat * pi / 180) * Math.cos(endLat * pi / 180) * Math.cos(theta * pi / 180);
 res = Math.acos(res); // 아크코사인 결과
 res = res* 180 / pi * 60 * 1.1515 * 1609.344;
 resPixel = res/maxWidth; // 1펙셀당 거리계산
 resCM = Math.round(resPixel*37.79); // 1cm = 37.79px

DGREE->DMS

//도분초 변환
function degToDms(lon,lat){ // 경도,위도
var dms_lon;
var dms_lat;

var dms_lon_do;
var dms_lon_min;
var dms_lon_sec;

var dms_lat_do;
var dms_lat_min;
var dms_lat_sec;

// 동경 계산 (경도)
dms_lon_do = Math.floor(lon);
dms_lon_min = replaceZero(Math.floor((lon - dms_lon_do)*60),2);
dms_lon_sec = replaceZero(Math.floor((((lon - dms_lon_do)*60) - dms_lon_min)*6000),4);

// 북위 계산 (위도)
dms_lat_do = Math.floor(lat);
dms_lat_min = replaceZero(Math.floor((lat - dms_lat_do)*60),2);
dms_lat_sec = replaceZero(Math.floor((((lat - dms_lat_do)*60) - dms_lat_min)*6000),4);

dms_lon = dms_lon_do+"."+dms_lon_min+dms_lon_sec;
dms_lat = dms_lat_do+"."+dms_lat_min+dms_lat_sec;
return "북위"+dms_lat+"/동경"+dms_lon;
// console.log("lon:"+lon);
// console.log("lat:"+lat);
//console.log("동경"+dms_lon_do+"˚"+dms_lon_min+"'"+dms_lon_sec+"\"");
// console.log("북위"+dms_lat);
// console.log("동경"+dms_lon);

}
//zero 맞추기
function replaceZero(str,len){
str = String(str); // 형변환해야함
var result = "";
if(str.length<len){
for(var i=str.length;i<len;i++){
result += "0";
}
}
result += str;
return result;
}

2014년 11월 27일 목요일

Jquery selector

BASIC SELECTOR

All Selector (“*”)
HTML DOCUMENT내의 모든 HTML요소(HEAD, BODY, SCRIPT) 등등의 모든 요소들을 선택하기 위함

Class Selector (“.class”)
요소의 정의되어 있는 클래스(class)를 구분자로 선택하기 위함  (.)
예) <div class=”jquery”></div>  ->  $(‘.jquery’);

ID Selector (“#id”)
요소의 정의되어 있는 아이디(id)를 구분자로 선택하기 위함.  (#)
예) <div id=”jquery”></div>  ->  $(‘#jquery’)

Element Selector (“element”)
일정 html 요소를 선택하기 위함 (해당 테그로 찾기 때문에 그다지 유용하진 않음). – 선택 범위가 넓기 때문
예) <div></div><span></span><div></div> ->  $(‘div’);  =  2개 반환

Multiple Selector (“selector1, selector2, selectorN”)
다중으로 일정 html 요소를 선택하기 위함
예) <div><span></span></div><form><input type=”text” /></form,>  ->  $(‘div, span, form, input’)



ATTRIBUTE SELECTOR

Attribute Contains Prefix Selector [name|=value]
이 선택자는 요소에 포함 되어 있는 속성과 속성값을 비교하여 해당 요소를 선택하기 위하여 사용 된다.
속성값이 두 단어 이상일 경우에는 아이픈(-) 으로 연결하면 선택되어 질 수 있으며 스크립트에 설정된 값은 요소에 선언된 속성값에 앞부분에 나와야 한다.
예) $(‘a[wow|=you]’);  ->  모든 a 테그를 검색하고 속성 이름이 wow 인것에 값에 you 가 들어 있는 해당 요소를 반환한다   ( <a href=”#” wow=”aa-you-wow”> x ), ( <a href=”#” wow=”you-wow”> o )

Attribute Contains Selector [name*=value]
이 선택자는 요소에 포함되어 있는 속성과 속성값을 비교하여 해당 요소를 선택하기 위하여 사용 된다.
선언되어진 필요로 하는 속성값의 문자를 요소에 있는 속성값의 내용 중 아무곳에 해당 문자가 어떠한 형태로 있던 일치 하는 부분이 있다면 해당 요소를 반환하게 된다.
예) $(‘input[name*=’wow’]’);  ->  우선 모든 input 테그를 검색하고 속성 name 중에 ‘wow’ 라는 문자열이 포함 되어 있다면 무조건 반환 하라.

Attribute Contains Word Selector [name~=value]
이 선택자는 요소에 포함 되어 잇는 속성과 속성값을 비교하여 해당 요소를 선택하기 위하여 사용 된다.
선언되어진 필요로 하는 속성값(단어) 를 요소에 있는 속성과 비교하여 해당 단어가 있다면 해당 요소를 반환한다. 하지만 기존의 셀렉터와는 틀리게 이 선택자는 해당 단어가 하이픈(-) 이라든지, 단어 중간에 끼어 있다면 반환하지 않으며, 공백으로 구분되어 있는 경우나, 해당 단어 하나만 있을 경우에는 요소를 반환한다.
예) $(‘input[name~=’wow’]’)  ->  모든 input 테그를 검색하고 속성에 ‘wow’ 라는 단어가 독립적으로 존재하면 반환한다.

Attribute Ends With Selector [name$=value]
비교 html 요소 속성값 중 해당 속성값의 가장 뒤에 필요로 하는 단어가 붙어 있다면 해당 요소를 반환한다.
예) $(‘input[name$=’wow’]’);  -> 요소 속성이 <input type=”text” name=”abcdwow” /> 로 되어야 반환

Attribute Equals Selector [name=value]
기본형태로 요소 속성값과 필요로 하는 단어가 무조건 일치하여야 해당 요소를 반환한다.
예) $(‘input[name=’wow’]’);  ->  <input type=”text” name=”wow” /> 로 되어야 반환

Attribute Not Equal Selector [name!=value]
요소 속성값과 필요로 하는 단어가 일치 하지 않는 요소들을 반환한다.
This selector is equivalent to :not([attr=value]);
예) $(‘input[name!=’wow’]’);  ->  <input type=”text” name=”wow” /> 반환안함 <,input type=”text” name=”wowya” /> 반환안함

Attribute Starts With Selector [name^=value]
요소 속성값과 필요로 하는 단어가 일치를 해야 하는데 전체가 일치할 필요는 없고, 필요로 하는 단어가 요소에 있는 속성값에 처음에 시작 하면 해당 요소를 반환한다.
예) $(‘input[name^=’wow’]’);  ->  <input type=”text” name=”wowabcd” /> 반환함, <input type=”text” name=”abcdwow” /> 반환안함

Has Attribute Selector [name]
해당 속성이 있다면 무조건 반환한다.
예) $(‘div[id]’);  ->  모든 div 를 검색하고, 해당 div 에 id 속성이 있다면 값이 있던 없던 해당 요소를 반환한다.

Multiple Attribute Selector [name=value][name2=value2]
호출 조건을 여러 가지로 설정하여 좀더 정교한 선택을 할 수 있도록 유도 한다.
예) $(‘div[id][name$=’wow’]’);  ->  모든 div 를 검색하고 그중 id 속성을 가지고 있는 요소중 name 속성이 있고 그 name 속성값에 ‘wow’ 라는 값이 가장 마지막에 있다면 해당 요소 반환
<input type=”text” id=”hey” name=”whatwow” />  반환함


FORM SELECTOR

:button Selector
버튼과 타입버튼 요소를 모두 반환함
예) $(‘:button’);  ->  <button></button> 혹은 <input type=”button” /> 을 모두 반환

:checkbox Selector
타입 체크박스 요소를 모두 반환한다.
예) $(‘:checkbox’);  ->  <input type=”checkbox” /> 을 모두 반환

:checked Selector
요소중 checked=”checked” 되어 있는 요소를 모두 반환한다.
예) $(‘:checked’);  - >  <input type=”checkbox” checked=”checked” /> 등을 반환

:disabled Selector
요소중 disabled=”disabled” 되어 있는 요소를 모두 반환한다.
예) $(‘:disabled’);  ->  <input type=”text” disabled=”disabled” /> 등을 반환

:enabled Selector
요소중 enabled 되어 있는 요소를 모두 반환한다. -> 즉 해당 요소에서 disabled 가 되지 않은 것들을 반환
예) $(‘input:enabled’);

:file Selector
요소중 input type=”file” 요소를 모두 반환한다
예) $(‘input:file’);

:image Selector
요소중 input type=”image” 요소를 모두 반환한다.
예) $(‘input:image’);

:input Selector
영역내의 모든 요소(input, textarea, select, button) 등을 모두 반환한다 ( $(‘form > *’); )
예) $(‘:input’);

:password Selector
요소중 input type=”password” 요소를 모두 반환한다
예) $(‘input:password’);

:radio Selector
요소중 input type=”radio” 요소를 모두 반환한다.
예) $(‘input:radio’);

:reset Selector
요소중 input type=”reset” 요소를 모두 반환한다.
예) $(‘input:reset’);

:selected Selector
Select 요소의 option 항목을 위한 선택자로, option 항목이 선택 되어지는 순간 해당 선택된 option 을 반환한다.
예) $(‘select’).change(function(){
       $(‘select option:selected’)………..xxxxxxxx
})

:submit Selector
요소중 input type=”sutmit” 요소를 모두 반환한다
예) $(‘input:submit’);

:text Selector
요소중 input type=”text” 요소를 모두 반환한다.
예) $(‘input:text’);




BASIC FILTER SELECTOR

:animated Selector
에니메이션 효과가 진행된 엘리먼트 요소를 반환한다.
예) $(’element’).slideToggle(‘slow’, anymethod);  =  element 에 slideToggle 에니메이션 실행  그후
   $(‘button’).click(function(){
            $(‘div:animated’).toggleClass(‘anyclass’);
    });

:eq() Selector
특정 엘리먼트의 :eq(index) ‘index’ 번째의 영역을 반환한다. Index 는 “0” 부터 시작한다.
예) $(‘div:eq(“2”)’).css(‘color’, ‘red’);  ->  모든 div중에 2 번째 div 에 값들에 컬러를 red로 규정한다.

:even Selector
특정 엘리먼트의 짝수번째 영역을 반환한다. 순서는 0 부터 시작한다.
예) $(‘tr:even’).css(‘background-color’, ‘#000000’); ->  테이블의 tr 중 0부터 짝수번째 영역의 배경색은 흑색.

:first Selector
요소 중 첫번째 나오는 요소를 반환한다. 이것은 :eq(0) 과 같으며,  :lt(1) 로 사용되어도 무방하다.
예) $(‘tr:first’).css(‘color’,’red’);  ->  tr 테그중 첫번째 나오는 영역을 반환한다.

:gt() Selector
요소중 :gt(index), index 번째 다음의 모든 요소를 반환한다. Index 는 ‘0’ 부터 시작한다. :nth-child(n) 은 n이 1부터 시작 하는 것과는 대조된다.
예) $(‘td:gt(2)’).css(‘border’,’red’);  -> 세번째 나오는 td 부터의 모든 td의 border 색상이 붉은색이다

:header Selector
Html 요소중 header 테그 h1~h6 까지의 요소들을 반환한다.
예) $(‘:header’)

:last Selector
요소 중 마지막에 나오는 하나의 요소를 반환한다.
예) $(‘tr:last’).css(‘color’,’red’);  ->  tr 테그중 마지막에 나오는 영역 내용의 컬러는 붉은색이다.

:lt() Selector
요소중 :lt(index), index 번째 이전의 모든 요소를 반환한다. Index 는 ‘0’ 부터 시작한다. :nth-child(n) 은 n이 1부터 시작 하는 것과는 대조된다. (:gt(index) 와는 지정 영역이 대비된다.)
예) $(‘td:lt(2)’).css(‘border’,’red’);  -> 세번째 나오는 td 이전의 모든 td의 border 색상이 붉은색이다

:not() Selector
특정 요소 중 주어진 조건에 맞지 않는 요소들을 반환한다.  ( :not(div a), :not(div, a) )
예) $(‘input:not(:checked)’)  ->  전체 input 테그중 checked 가 되지 않는 모든 input 을 반환한다.

:odd Selector
특정 엘리먼트의 홀수번째 영역을 반환한다. 순서는 0 부터 시작한다.
예) $(‘tr:odd’).css(‘background-color’, ‘#000000’); ->  테이블의 tr 중 0부터 홀수번째 영역의 배경색은 흑색.




CONTENTS FILTER SELECTOR

:contains() Selector
주어진 문자열이 포함 되어 있는 모든 요소를 반환한다.
예) $(‘div(:contain(“ouksoo”)’).cass(‘text-decoration’,’underline’); -> ‘ouksoo’ 문자열 포함 모든 div 영역의 속성을 아래밑줄 로 정의

:empty Selector
해당 요소내 child node 혹은 text 둘 중 아무것도 없는 요소를 반환한다. 즉 비어 있는 요소를 반환한다 이 선택자는 :parent  선택자와는 반대된다..
예) $(‘td:empty’).text(‘wow’); -> td 요소 중 비어 있는 td 를 찾고 그 요소안에 ‘wow’라는 문자를 넣는다.

:has() Selector
해당 요소 내에 일정(주어진) 요소가 포함 되어 있는 요소를 반환한다. 즉 반환 받고자 하는 요소는 주어진 일정한 요소를 포함하고 있어야 한다.
예) $(‘div:has(p)’).addClass(“text”);  ->  모든 div 요소중 p 테그를 포함하고 있는 div 에 ‘text’ 클레스를 적용

:parent Selector
해당 요소내 child node 혹은 text 둘 중 어떤 것이라도 포함하고 있는 요소를 반환한다. 즉 비어 있지 않는 요소를 반환한다 이 선택자는 :empty  선택자와는 반대된다..
예) $(‘td:parent’).text(‘wow’); -> td 요소 중 비어 있는 td 를 찾고 그 요소안에 ‘wow’라는 문자로 치환한다.


CHILD FILTER SELECTOR

:first-child Selector
해당 구역에 포함되어 있는 요소 중 가장 첫번째 요소를 반환한다.  “nth-child(1)” 와 같다고 보면 된다
예) $(‘div span:first-child’) .-> div 요소중 span 이 가장 첫번째 나올 때, 그 첫번째 span 을 반환한다.

:last-child Selector
해당 구역에 포함되어 있는 요소 중 가장 마지막 요소를 반환한다. 마지막에 선언되어진 요소가 나와야 한다.
예) $(‘div span:first-child’) .-> div 요소중 span 이 가장 마지막에 나올 때, 그 마지막 span 을 반환한다.

:nth-child Selector
:nth-child(index) 에서 index 번째의 요소를 반환한다. 기존의 :eq(index) 등은 시작점이 0부터 시작하여 카운팅을 하였으나 이 셀렉터의 index 는 1부터 시작한다는 것에 차이가 있다.
예) $(‘ul li:nth-child(2)’) -> ul 요소중 두번째 나오는 li 를 반환 / :eq(2) 일경우에는 세번째 나오는 li 를 반환.

:only-child Selector
부모영역 내에 child node 가 하나 밖에 없을 경우 해당 child 노드를 반환한다. Text node 는 여기에 child node에 포함 되지 않는다.
예) $(‘div button:only-child’). -> div 요소중 button 엘리먼트를 하나만 포함 하고 있을 때 그 button  엘리먼트를 반환한다.



HIERARCHY(계층) SELECTOR

Child Selector (“parent > child”)
부모엘리먼트에 속해 있는 자식 엘리먼트를 반환한다. (순수계층 반환, 클래스나 아이디를 이용하여 원하는 값 도출
예) $(‘ul.topclass > li’) …->  클래스명이 topclass 인 ul 에 속해 있는 li 만 반환한다. 자식중에 클래스명을 가지지 않는 ul 이 계속 포함 되어 있더라도. 조건에 부합되진 않기 때문에 그 아래 li 는 비 반환

Descendant Selector (“ancestor descendant”)
기본 계층구조로 스페이스바에 따라 구분되며, 뒤에 나올수록 앞의 엘리먼트에 부합된며, 최종조건의 엘리먼트들을 반환한다.
예) $(‘form input’)  ->  폼테그 영역에 포함 되어 있는 요소 중 input 엘리먼트는 모두 반환한다.

Next Adjacent Selector (“prev + next”)
후자(next)를 반환하는데 전자의 조건이 갖추어 져야 한다.
예) $(‘label + input’); - > input 요소를 반환하는데 그 input 요조 부모가 아닌 전에 요소가 label 요소여야 반환

Next Siblings Selector (“prev ~ siblings”)
전자 조전이 시작 하는 데부터 후자 조건까지의 모든 해당 요소를 반환한다.
예. First) $(‘#prev ~ div)  ->  요소들중 아이디가 prev 가 나온다면 거기서부터 나오는 div 요소 모두를 반환한다.
예. Second) $(‘#prev ~ div.ouksoo’)  -> 요소들중 아이디가 prev 가 나온다면 거기서부터 나오는 div 요소중 클래스가 ouksoo인 요소들을 모두 반환한다.


VISIBILITY FILTER SELECTOR

:hidden Selector
숨어 있는 요소들을 반환한다.
-       Display 가 ‘none’ 인 경우
-       Form element 의 type=”hidden’ 인 경우
-       넓이나 높이가 각각 ‘0’ 으로 세팅 되어 잇는 경우
-       조상 element 가 hidden 되어 있음 으로서 자기 자신도 보이지 않게 된 경우

예) $(‘div:hidden’)  ->  div 요소중 보이지 않는 div 요소들을 모두 반환한다. - <div></div> 여서 보이지 않는 것을 포함되지 않는다.

:visible Selector
:hidden 과는 반대로 보여지는 모든 요소들을 반환한다.



********
<!DOCTYPE html>
<html>
<head>
<style>
#div_id > p:nth-child(n+3)[class^="2"]{
    background: #ff0000;
}
</style>
</head>
<body>

<div id="div_id">
<h1>This is a heading</h1>
<p class="2">The first paragraph.</p>
<div id="div_id2">
<span class="1-1">d2The third paragraph.</span >
<span class="2-1">d3The fourth paragraph.</span >
<p class="2-1">d3The fourth paragraph.</p>
</div>
<span class="3-1">1The second paragraph.</span>
<span class="1-1">2The third paragraph.</span>
<p class="2-1">3The fourth paragraph.</p>
<div>

<p><b>Note:</b> Internet Explorer 8 and earlier versions do not support the :nth-child() selector.</p>

</body>
</html>
javascript를 사용하면서 항상 까먹는것이 있다. substr과 substring의 차이점. substr은 (시작점,갯수) substring는 (시작점, 끝나는점) 헷갈리지 말자. ^^;;; 는 의미에서 적어 놓음.. 담에 또 까먹으면 보고 해야겠다. ^^;; Colored By Color Scripter™ 1 2 3 4 5 6 7 8 9 10 [출처] javascript substr과 substring의 차이점|작성자 브라이언

JVM 메모리 구조 설명

응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요영역(Method Area, 호출스택, Heap)에 대해서 알아보도록 하자. [참고] cv는 클래스변수, lv는 지역변수, iv는 인스턴스변수를 뜻한다. 1. 메소드영역(Method Area) - 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이타)를 Method Area에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다. 2. 힙(Heap) - 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이 곳에 생성된다. 즉, 인스턴스변수(instance variable)들이 생성되는 공간이다. 3. 호출스택(Call Stack 또는 Execution Stack) 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고, 메서드가 작업을 마치게 되면, 할당되었던 메모리공간은 반환되어 비워진다. 각 메서드를 위한 메모리상의 작업공간은 서로 구별되며, 첫 번째로 호출된 메서드를 위한 작업공간이 호출스택의 맨 밑에 마련되고, 첫 번째 메서드 수행중에 다른 메서드를 호출하게 되면, 첫 번째 메서드의 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다. 이 때 첫 번째 메서드는 수행을 멈추고, 두 번째 메서드가 수행되기 시작한다. 두 번째로 호출된 메서드가 수행을 마치게 되면, 두 번째 메서드를 위해 제공되었던 호출스택의 메모리공간이 반환되며, 첫 번째 메서드는 다시 수행을 계속하게 된다. 첫 번째 메서드가 수행을 마치면, 역시 제공되었던 메모리 공간이 호출스택에서 제거되며 호출스택은 완전히 비워지게 된다. 호출스택의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기상태에 있게 된다. 따라서, 호출스택을 조사해 보면 메서드 간의 호출관계와 현재 수행중인 메서드가 어느 것인지 알 수 있다. 호출스택의 특징을 요약해보면 다음과 같다. - 언제나 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다. - 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다. 반환타입(return type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다. 대기상태에 있던 호출한 메서드(caller)는 넘겨받은 반환값으로 수행을 계속 진행하게 된다. [예제6-6] CallStackTest.java secondMethod() class CallStackTest { public static void main(String[] args) { firstMethod(); } static void firstMethod() { secondMethod(); } static void secondMethod() { System.out.println("secondMethod()"); } } [실행결과] 위의 예제를 실행시켰을 때, 프로그램이 수행되는 동안 호출스택의 변화를 그림과 함께 살펴보도록 하자 (1)~(2) 위의 예제를 컴파일한 후 실행시키면, JVM에 의해서 main메서드가 호출됨으로써 프로그램이 시작된다. 이때, 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main메서드의 코드가 수행되기 시작한다. (3) main메서드에서 firstMethod()를 호출한 상태이다. 아직 main메서드가 끝난 것은 아니므로 main메서드는 호출스택에 대기상태로 남아있고 firstMethod()의 수행이 시작된다. (4) firstMethod()에서 다시 secondMethod()를 호출했다. firstMethod()는 secondMethod()가 수행을 마칠 때까지 대기상태에 있게 된다. seoundMethod()가 수행을 마쳐야 firstMethod()의 나머지 문장들을 수행할 수 있기 때문이다. (5) secondMethod()에서 println메서드를 호출했다. 이때, println메서드에 의해서 화면에 "secondMethod()"가 출력된다. (6) println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 secondMethod()로 되돌아간다. 대기 중이던 secondMethod()는 println메서드를 호출한 이후부터 수행을 재개한다. (7) secondMethod()에 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 firstMethod()로 돌아간다. (8) firstMethod()에도 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 main메서드로 돌아간다. (9) main메서드에도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다. [예제6-7] CallStackTest2.java class CallStackTest2 { public static void main(String[] args) { System.out.println("main(String[] args)이 시작되었음."); firstMethod(); System.out.println("main(String[] args)이 끝났음."); } static void firstMethod() { System.out.println("firstMethod()이 시작되었음."); secondMethod(); System.out.println("firstMethod()이 끝났음."); } static void secondMethod() { System.out.println("secondMethod()이 시작되었음."); System.out.println("secondMethod()이 끝났음."); } } [실행결과] main(String[] args)이 시작되었음. firstMethod()이 시작되었음. secondMethod()이 시작되었음. secondMethod()이 끝났음. firstMethod()이 끝났음. main(String[] args)이 끝났음. /// 또다른 아티클.. Java Virtual Machine의 메모리 관리 전통적인 C언어나 C++언어와는 달리 자바에서는 메모리 관리는 프로그래머가 일일이 하지 않고 JVM에서 알아서 관리 해 줍니다.(물론 닷넷의 경우엔 자바와 비슷한 방법으로 하지만) 메모리 관리란 크게 보면 생성/소멸(삭제, 반납)의 과정으로 생각 할 수 있는데 우리가 자바 프로그램에서 Hello h = new Hello(“방가방가”) 라고 하든지 아님 int i=10; 이라고 할 때 메모리의 일정 부분을 할당 받게 되는 것입니다. 메모리에서 할당이 필요해지면 JVM은 변수에 대해 실제의 내용을 포인터로써 관리를 해주게 됩니다. JVM이 모든 객체의 레퍼런스를(참조) 카운트하고 관리하기 때문에 메모리 영역의 충돌이나 삭제 하지 않은 메모리 때문에 memory leak등이 발생 할 가능성이 거의 없어 졌습니다. HOT SPOT이전의 JVM(JIT기반, JDK1.3 이전)에서는 메모리에 대한 간접 참조 방식을 이용하였는데 아시는 것 처럼 간접 방식이므로 실제 내용을 찾아 가기 위해서는 두번이상의 참조가 일어나게 됩니다. 물론 조금은 느려질 소지가 있었겠지요~ 이 경우엔 오히려 Garbage Collection시에는 참조만 지우면 되므로 오히려 간단했다고 볼 수 있습니다. 간접 참조란 힙에 객체의 내용이 있다면 중간에 그곳을 가리키는 메모리 영역이 있고(핸들 메모리) 스택에 있는 변수가 핸들 메모리를 참조해서 실제 힙의 주소를 얻은 후 힙의 실제 내용을 참조하게 되는 방식 입니다. 반면 직접 참조의 경우 스택에 있는 변수가 힙메모리의 실제 주소를 가지고 있어 직접 참조 하게 되는 방식 입니다. 그러므로 자주 참조되는 변수나 객체가 있다면 직접 참조 방식이 훨씬 뛰어난 성능을 보입니다. 반면에 가비지컬렉션의 경우(메모리를 지우거나 참조값을 바꾸는 경우) 직접 참조 방식에서는 값이 없어지거나 사라져야 하는 변수에 대해 일일이 포인터를 지워줘야 합니다. 반면 간접 참조 방식의 경우 핸들 메모리만 수정을 해주면 되므로 오히려 간단해 지는 것입니다. Virtual Machine에서는 스택과 힙 메모리를 사용하며 스택에는 프로그램에서 사용하는 변수, 함수명등이 수행 순서에 맞게 적재 되어 있고 힙 메모리에는 실제 스택에 있는 변수나 함수의 내용이 적재 됩니다. 즉 스택에는 실제 값이 존재하는 곳의 포인터를 가지므로 크기가 크지 않으나 힙의 경우 사용량이 커지게 됩니다. 만약 힙 메모리를 다써버린 다면 java.lang.OutOfMemory 오류가 발생 할겁니다. 이번에는 메모리의 해제에 대해 보도록 하겠습니다. 아까 위에서 만든 객체 참조변수에 대해 h = null; 이라고 하는 경우나 어떤 메소드 안에 쓰인 변수가 메소드의 실행이 종료하게 되는 경우에 메모리에서 해제 될 것 입니다. JVM의 힙메모리에는 프로그램 실행시 생성된 여러 값들이 존재 합니다. 가비컬렉터가 하는 일은 이러한 힙 메모리중 사용하지 않는 메모리를 반환 시키는 역할을 하는 것입니다. 위의 경우 처럼 h = null; 이라고 명시적으로 지정 하는 경우 객체 헤더에 존재하는 GC(Garbage Collector) 필드가 값이 설정 됩니다. 이렇게 지정 된 객체에 대해 우선적으로 메모리에서 삭제를 하게 됩니다. 반면 스코프를 벗어나는 경우 Local 변수는 다음과 같은 조건에 따라 삭제 여부를 판단하게 됩니다. 스택 메모리에 있는 변수 중 해당 객체에 대한 참조가 있는 경우 또는 객체가 메모리에 있다는 이야기는 다음에 있을 확률이 높다는 판단(이게 LRU방식 맞나여??)을 JVM에서 해(일반적으로 프로그래밍에서 사용된 객체의 95% 이상이 생성된 후 곧 삭제된다는 가정 하에 아직까지도 있는 객체이므로 필히 중요한 것 일꺼야 하는 기술을 Generation Copying Collection이라 합니다) 가급적 가비지 컬렉션을 수행 하지 않습니다. 또는 정적 혹은 현재 스코프의 객체가 해당 객체를 참고 하고 있는 경우, JVM내부에서 사용하는 네이티브 메소드에 사용되는 객체에 해당 하는 경우 등은 가비지 컬렉션에서 제외를 하며 기타의 경우엔 메모리에서 삭제를 하게 됩니다. 대부분의 프로그래밍 언어에서 사용된 객체는 거의 금방 소멸 된다는 것 때문에 Java에서는 메모리를 두가지 영역으로 메모리를 나누는데 Young 영역과 Old 영역으로 나눕니다. Young 영역은 생긴지 얼마 안된 객체들을 저장하는 장소이고, Old영역은 생성된지 오래된 객체를 저장하는 장소 입니다. 각 영역의 성격이 다른 만큼 GC의 방법 또한 다릅니다. 또한 Perm 영역이라고 불리는 곳이 있는데 이곳에는 클래스나 메소드의 실행 코드가 저장 됩니다. 그래서 GC가 일어나는 곳은 old, new 영역이며 Perm영역은 GC가 수행 되지 않습니다.(소스 코드가 있으므로) JDK1.3 이상에서 탑재된 HOT SPOT VM의 경우(병목 현상이 일어날 확률이 높은 부분을 먼저 컴파일) 가비지 컬렉션에 따른 성능 저하를 막기 위해 Generation Copying Collection 기술을 이용하여 가비지 컬렉션 대상을 줄였으며 Incremetal Pauseless 기법을 이용하여 가비지컬렉션 대상을 여러 개의 작은 그룹으로 나누어 확실히 삭제 가능한 객체부터 지워나가는 방식을 채택 했습니다. Incremetal Pauseless 기법에서는 1차 가비지 컬렉션 대상은 객체의 헤더에 GC 필드가설정된 것이고 2차 대상은 위의 4가지 유형에 속하지 않은 것 입니다. 2차 대상의 경우 일단 CG필드를 설정 하고 다음번 가비지 컬렉션 주기에 삭제 되는 것 입니다.

JVM 메모리 구조

1. 메모리



프로그램을 실행하기 위한 데이터 및 명령어를 저장하는 공간



※ 메모리구조를 공부하는 이유
- 같은 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우됨.
- 메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김 현상 등이 일어날 수 있음.
- 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함.



2. 자바 프로그램의 실행구조



프로그램이 실행되기 위해서는 windows나 linux같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM : 주기억장치)를 제어할수 있어야 하는데, java이전의 c같은 대부분의 언어로 만들어진 프로그램은 이러한 이유때문에 OS에 종속도어 실행되게 되어 있었다.



java프로그램은 JVM(Java Virtual Machine : 자바가상머신)이라는 프로그램만 있으면 실행이 가능한데, JVM이 OS에게서 메모리 사용권한을 할당받고 JVM이 자바프로그램을 호출하여 실행하게 된다. OS한태서는 독립되었지만 JVM이라는 프로그램에 종속적이게 된다. (JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에 직접 제어받는 방식보다는  속도면에서는 느리다는 단점을 가진다)










* JVM이란?

- Java Virtual Machine
- JAVA와 OS 사이에서 중계자 역할
- JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌
- 메모리 관리 기능(Garbage Collection)



3. 자바프로그램 실행 과정과 JVM메모리 구조



프로그램이 실행되면, JVM은 OS으로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.







- JAVA Source : 사용자가 작성한 JAVA 코드
- JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜주는 기능
- Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
- Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
- Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간



4. Runtime Data Area


① Class Area









- Method Area, Code Area, Static Area 로 불리어짐

i) Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

ii) Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보

iii) Type Information : - Type의 속성이 Class인지 Interface인지의 여부 저장
- Type의 전체이름(패키지명+클래스명)
- Type의 Super Class의 전체이름
(단, Type이 Interface이거나 Object Class인 경우 제외)
- 접근 제어자 및 연관된 interface의 전체 리스트 저장

iv) 상수 풀(Constant Pool)
- Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
- 문자 상수, 타입, 필드, Method의 symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장

v) Class Variable
- Static 변수라고도 불림
- 모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능

vi) Class 사용 이전에 메모리 할당
- final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사



② Stack Area









- Last In First Out (LIFO)
- 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
- 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
- 메서드 수행이 끝나면 프레임별로 삭제



③ Heap Area








- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성가능
- Garbage Collector를 통해 메모리 반환

i) Permanent Generation
- 생성된 객체들의 정보의 주소 값이 저장된 공간

ii) New Area
- Eden : 객체들이 최초로 생성되는 공간
- Survivor : Eden에서 참조되는 객체들이 저장되는 공간

iii) Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간



④ Native method stack area


- 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간



⑤ PC Register


- Thread가 생성 될 때마다 생성되는 공간
- Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
- 현재 실행되는 부분의 명령과 주소를 저장



5. Garbage Collection


- 참조되지 않은 객체들을 탐색 후 삭제
- 삭제된 객체의 메모리를 반환
- Heap 메모리의 재사용



① Minor Garbage Collection



i) New 영역에서 일어나는 Garbage Collection
ii) Eden영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
iii) Survivor1 영역에 값 복사
iv) Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
v) Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된
객체와 Survivor1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
vi) 참조되고 있는 객체를 Survivor2 영역에 복사
vii) Surviver2 영역을 제외한 영역의 객체들을 삭제
viii) 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
ix) 반복



② Major Garbage Collection (Full Garbage Collection)



i) Old영역에 있는 모든 객체들을 검사
ii) 참조되지 않은 객체들을 한꺼번에 삭제
iii) Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지