전통적인 웹 애플리케이션 방법에서는‘역삼1동’을 입력하고‘찾기’버튼을 클릭했을 때 한번만 수행 하면 되지만, Ajax 방법은‘역’, ‘삼’, ‘1’, ‘동’을 입력할 때마다 서버에서 우편번호와 주소 데이터를 가져와서 웹 페이지에 출력하는 일련의 과정을 수행하게 된다. 즉, 네 번을 수행하는 것이다. 예를들어, 웹 사이트 접속자가 10,000명이라고 하면 40,000번을 수행하게 되는 것이다. 물론, 반드시 이와 같은 수치가 성립되는 것은 아니지만, 실행 횟수가 많아지는 것은 사실이다.


서제스트 제공은 반드시 서버에 부하를 준다고 할 수는 없지만 부하를 줄 가능성이 매우 높다. 하지만, 웹 서버에서 HTML을 해석하지 않고 데이터만 송수신하게 되므로 전통적인 방법보다 서버의 부하를 줄이는 면도 있다. 따라서 반드시 4배의 부하를 주는 것은 아니다. 또한, 비동기 통신 방법으로 사용자가 시스템을 사용하는 동안 서버에서 데이터를 가져올 수 있으므로 사용하는 입장에서 보면 4배의 속도가 걸리는 것은 아니다.


이 시점에서 개발자가 반드시 짚고 넘어갈 사항이 있다. 사용자의 편리성과 시스템의 부하 라는 양면성 이다. 두 마리 토끼를 모두 잡을 수 없으므로 한 쪽을 선택해야 하는데, 시스템은 사용자를 위한 것이므로 사용자의 편리성을 선택해야 한다는 것이다. 시스템이 부하가 걸린다고 해서 사용자의 편리성을 포기할 수는 없다.

출처 : Tong - dozob님의 etc.통

Prototype과 Rico를 이용한 드래그... 코드없음...

 from PhpSchool : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=ajax&wr_id=248

개발 사이트 : http://ajax.fixmedia.net/

자바스크립트 프로토타입 출처

*  Prototype JavaScript framework, version 1.4.0
 *  (c) 2005 Sam Stephenson <
sam@conio.net>
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site:
http://prototype.conio.net/

드래그 엔 드랍 프레임워크
Rico
/**
  *
  *  Copyright 2005 Sabre Airline Solutions
  *
  *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
  *  file except in compliance with the License. You may obtain a copy of the License at
  *
  *       
http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software distributed under the
  *  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
  *  either express or implied. See the License for the specific language governing permissions
  *  and limitations under the License.
  **/

AJAX 기술의 독특함과 그 막강한 효과를 내내 들어오던 찰나,
구글의 한 페이지(
http://google.co.kr/ig)를 만난 이후 그 화면이 머릿속에서 지워지질
않아 드래그 앤 드랍 프레임워크를 뒤적뒤적이던 중 이 곳 스쿨 아래 글의 Rico 소스를
통해 입맛대로 커스터마이징 해보았습니다.

이것 저것 해보다보니 드래그 앤 드랍의 원리를 대충 이해할 수 있었던 것 같네요.

우선 작업하면서 재낀 부분들 몇가지를 들자면,
드래그 가능한 블럭이 있어야 하며, 그 블럭이 있었던 자리에 복귀하기 위해
"Temp Area"를 구성해주어야 했습니다.
블럭과 블럭간의 이동을 꾀하기 위해 드랍존을 구성하는 방식은 획기적인 것 같습니다.

구성 페이지 :
http://ajax.fixmedia.net

AJAX

Ajax는 자바스크립트를 통하여 비동기적으로 외부 데이터를 처리하기 위한 기법입니다.
(※ 더 자세한 정보가 필요하면 다음 링크 문서를 참조해 보시길... )

HTML, XML, Javascript 등에 대한 기초지식과 자바 JSP/Servlet을 탑재한 WebServer가 있다면,
다음 예제를 직접 실행해 보는 것이 위의 정의를 이해하는 가장 빠른 방법입니다.

예제는 두 개의 파일로 구성되어 있습니다.

(1) 클라이언트측의 DynamicUpdate.html 파일은 일정한 시간간격으로 서버측에 서비스를 요청하고,
받은 문자열을 페이지의 지정한 영역에 추가합니다. 이 때 전체페이지를 refresh 하지 않고 지정영역만을 갱신합니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Ajax Dynamic Update</title>

<script type="text/javascript">
 var xmlHttp;
 var urlServer = "/your/path/DynamicUpdateServlet.jsp";
 function createXMLHttpRequest() {
   if (window.ActiveXObject) {
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
   }
   else if (window.XMLHttpRequest) {
     xmlHttp = new XMLHttpRequest();  
   }
 }
 
 function doStart() {
   createXMLHttpRequest();
   var url = urlServer + "?task=reset";
   xmlHttp.open("GET", url, true);
   xmlHttp.onreadystatechange = startCallback;
   xmlHttp.send(null);
 }

 function startCallback() {
   if (xmlHttp.readyState == 4) {
     if (xmlHttp.status == 200) {
       setTimeout("pollServer()", 5000);
       refreshTime();
     }
   }
 }
 
 function pollServer() {
   createXMLHttpRequest();
   var url = urlServer + "?task=hoot";
   xmlHttp.open("GET", url, true);
   xmlHttp.onreadystatechange = pollCallback;
   xmlHttp.send(null);
 }
 
 function refreshTime(){
   var time_span = document.getElementById("time");
   var time_val = time_span.innerHTML;

   var int_val = parseInt(time_val);
   var new_int_val = int_val - 1;
  
   if (new_int_val > -1) {
     setTimeout("refreshTime()", 1000);
     time_span.innerHTML = new_int_val;  
   } else {
     time_span.innerHTML = 5;
   }
 }
 
 function pollCallback() {
   if (xmlHttp.readyState == 4) {
     if (xmlHttp.status == 200) {  
       var message = xmlHttp.responseXML.getElementsByTagName("message")[0].firstChild.data;
       if (message != "done") {
         var new_row = createRow(message);
         var table = document.getElementById("dynamicUpdateArea");
         var table_body = table.getElementsByTagName("tbody").item(0);
         var first_row = table_body.getElementsByTagName("tr").item(1);
         table_body.insertBefore(new_row, first_row); 
         setTimeout("pollServer()", 5000);
         refreshTime();
       }
     }
   }
 }
 
 function createRow(message) {
   var row = document.createElement("tr");
   var cell = document.createElement("td");
   var cell_data = document.createTextNode(message);
   cell.appendChild(cell_data);
   row.appendChild(cell);
   return row;
 }
</script>
</head>
<body>

<h1>Ajax를 이용한 페이지 자동 갱신 예제</h1>
버튼을 누르면 이 페이지의 자동 갱신을 시작합니다:
<input type="button" value="시~작!!" id="go" onclick="doStart();"/>
<p>
페이지는 <span id="time" style="color:blue; text-weight:bold">?</span> 초 후에 바뀝니다.
<p>
<table id="dynamicUpdateArea" align="left">
  <tbody>
   <tr id="row0">
     <td></td>
   </tr>
  </tbody>
</table>

</body>
</html>

(2) 서버측 DynamicUpdateServlet.jsp는 클라이언트의 요청에 대해 단순히, 순차적으로 하나의 문자열을 xml 형식으로 던져줍니다.

<%@ page contentType="text/html; charset=euc-kr" %>

<%!
/**
 * @(#) DynamicUpdateServlet.jsp
 *
 * Copyright ⓒ 1999-2000 by (c) CheckersLab.com
 * All rights reserved.
 *
 * NOTICE : Refer our copy and redistribution policy guide.
 *
 * @author  Hoyal Kim, hoyal.kim@gmail.com
 *
 */
%>

<%@ page import="java.io.*" %>
<%@ page import="java.net.*" %>

<%!
 private int counter = 1;
%>
<%
     String res = "";
     String task = request.getParameter("task");
     String message = ""; 
     if (task.equals("reset")) {
     counter = 1;
     } else {
     switch (counter) {
      case 1: message = "그대 나의 사랑아"; break;
      case 2: message = "아 웃고 있어도 눈물이 난다"; break;
      case 3: message = "뜨거운 이름 가슴에 두면 왜 한숨이 나는 걸까"; break;
      case 4: message = "아름다운 죄 사랑때문에 홀로지샌 긴 밤이여"; break;
      case 5: message = "마른 꽃 걸린 창가에 앉아 외로움을 마셔요"; break;
      case 6: message = "바람속으로 걸어갔어요. 이른 아침의 그 찻집"; break;
      case 7: message = "그 겨울의 찻집"; break;
      case 8: message = "done"; break;
     }
     counter++;
     }
     res = "<message>" + message + "</message>";
     response.setContentType("text/xml; charset=utf-8");
     response.setHeader("Cache-Control", "no-cache");
     out.println("<response>");
     out.println(res);
     out.println("</response>");
%>


%% 드리프트의 openAPI v 0.000001 %%

1) BaloonToolTip v0.8 - 자바스크립트 모듈화 하라고 해서 자바 메서드처럼 표현해 봤음
    친절하게도 사용하실 수 있는 말풍선 이미지도 첨부함 - -ㅋ 포토샵으로 직접 이뿌게 그렸삼

void checkLength(Object, int limit, String messageHead){
   ~~~ examine validation & printout to that document & so on... Blah Blah ~~~
}

퍼갈때는 댓글을 남겨주셈

사용자 삽입 이미지

1. CSS단

#ssnMessage{
 z-index:0;
 position : absolute;
 float: left;
 padding: 4px 8px 0px; 
 width:190px;
 height:43px;
 font-weight:bold;
 color: #ff0000;
 text-align: center;
 background: url(../images/login/baloon.gif) no-repeat;
}


2. 헤드의 자바스크립트 단

function checkLength(obj,charLength,msg){   // 매개인자 : 1.해당 폼(text) 객체, 2. 유효문자 길이, 3. 출력 메세지 '목적어' 혹은 '주어'
 
 var x1 = event.screenX;
 var x2 = event.offsetX;
    var x3 = x1-x2-70;
   
    var y1 = event.screenY;
    var y2 = event.offsetY;
    var y3 = y1-y2-280;
   
 var messageArea = document.getElementById("ssnMessage");
  messageArea.style.left = x3;
  messageArea.style.top = y3;
 
    if(obj.value==''){
     var newMsg;
     var msgLength = msg.length;
     var lastChar = msg.substr(msg.length-1,1);
    
     if(lastChar=='은'){
      newMsg = msg.replaceAll( "은", "을" );
     }else{
     newMsg = msg.replaceAll( "는", "를" );
    }
    messageArea.style.display = "block";
     messageArea.innerHTML = newMsg+" 입력하세요 !"; 
   
     return;
 }else if(obj.value.length<charLength){
  messageArea.style.display = "block";
     messageArea.innerHTML = msg+" "+charLength+"자 이상입니다 !"; 
     return;
 }else{
  messageArea.style.display = "none";
  messageArea.innerHTML = "";
 }
}

3. BODY 단 (실제 사용)

 <th>* 아이디(ID)</th>
                <td class="con""> ※ 3~15자의 영문소문자, 숫자만 가능 합니다.<br>
                 <html:text property="memberInfo.userId" style="width:170px;ime-mode:disabled" styleClass="type-text-c" onblur="ajaxValidID(this);checkLength(this,3,'아이디는');" maxlength="15" tabindex="1"/>

이직을 한 직장인 가운데 절반이 회사를 옮길 때마다 연봉이 상승했다고 밝혔다.

19일 취업포털 커리어에 따르면 이직 경험이 있는 1년차 이상 직장인 812명을 대상으로 조사한 결과 이직자 중 50%가 '이직으로 연봉이 높아졌다'고 답했다.

이들은 또한 한 번 이직할 때마다 연봉이 평균 281만원 올랐다고 밝혔다. 이직 횟수는 평균 3.2회로 집계됐다. 이는 평생직장 개념이 사라지며 열심히 자기계발을 해온 직장인들이 기회가 올 때 이직하며 몸값을 높이기 때문으로 풀이된다.

반면 직장인 28.8%는 '전 직장과 연봉이 동일하다', 21.2%는 '오히려 더 낮아졌다'고 답했다.

회사를 옮기는 횟수는 세 번 옮겼다는 응답자가 가장 많았으며(24.9%), 이직 이유에 대해서는 복수응답을 허용해 조사한 결과 '현 직장이 비전이 없다고 생각해서'(50.1%)라고 답한 사람이 많았다.

이 밖에도 '업무 스트레스가 심해서'(29.2%), '회사 경영난이 악화돼서'(28.6%), '맡은 업무가 생각과 달라서'(18.2%), '상사ㆍ동료와 마찰 때문에'(18.1%) 옮겼다는 사람도 있었다.

김기태 커리어 대표는 "신입사원들이 회사 내규에 따라 고정급을 받는 것과 달리 경력직은 연봉협상을 통해 급여를 결정하는 사례가 대부분"이라고 말했다.

그는 이어 "연봉은 현재 자기 능력을 대변할 뿐 아니라 직장생활을 하는 데 매우 중요한 동기부여 요소가 되기 때문에 신중하게 판단해서 기대치와 잘 절충시켜서 결정해야 한다"고 덧붙였다.

자바스크립트 이벤트 .....................................................


아주 중요한 이벤트!!!
이벤트란 모든 행위를 말하는 것으로 프로그램에서는 미리 사용자의 행위를 예측하여 미리 사용할 수 있도록 이벤트를 많이 준비해 놓고 있다.


예를 들어 사용자가 마우스를 클릭할 것이다.... 이건 click 이벤트로 준비!
이게 없다면 우리는 사용자가 마우스를 클릭했는지 부터 알아내야 다음 일을 할 수 있을 것이다. 고맙게도 click이 일어났다는 걸 자동으로 알 수 있으니 얼마나 고마운 일인가...


(Click, MouseOver, MouseOut, Submit...)

이벤트 핸들러란 ?

이러한 이벤트와 우리가 준비한 프로그램을 연결해 주는 구실을 한다

(onClick,onMouseOver,onMouseOut, onSubmit...)

* 그래서 우리가 할일은 이벤트가 일어났을 때 할 일을 준비하고
이벤트 핸들러에게 그 일을 하도록 연결해 두면 되는 것이다~~~

* 익스플로러와 네비게이트 사이에 약간의 차이가 있어 익스플로러 기준으로 !!!



■ 이벤트의 종류와 의미 (이벤트핸들러는 이벤트에 on을 붙여 준다)


blur
포커스를 다른곳으로 옮길 경우
click 링크나 폼의 구성원을 클릭할 때
change 선택값을 바꿀 경우
focus 포커스가 위치할 경우
mouseover 마우스가 올라올 경우
mouseout 마우스가 떠날 경우
mousedown 마우스를 누를 경우
mousemove 마우스를 움직일 경우
mouseup 마우스를 눌렀다 놓을 경우
select 입력양식의 하나가 선택될 때
submit 폼을 전송하는 경우
load 페이지,윈도우가 브라우져로 읽혀질 때
unload 현재의 브라우저,윈도우를 떠날 때
error 문서나 이미지에서 에러를 만났을 때
reset 리셋 버튼이 눌렸을 때
dbclick 더블클릭시
dragdrop 마우스 누르고 움직일 경우
keydown 키 입력시
keypress 키 누를 때
keyup 키를 누르고 놓았을 때
move 윈도우나 프레임을 움직일 때
resize 윈도우나 프레임 사이즈를 움직일 때



■ 메서드


blur()
입력 포커스를 다른 곳으로 이동시킴
click() 마우스 버튼이 눌러진 것처럼 해줌
focus() 입력 포커스를 준 것처럼 해줌
submit() 폼의 submit 버튼을 누른 것처럼 해줌
select() 메소드 폼의 특정 입력 필드를 선택함



■ 속성


event.keyCode 누른 키의 ASCII 정수 값
event.x
문서 기준 누른 좌표의 left
event.y 문서 기준 누른 좌표의 top
event.clientX 문서 기준 누른 좌표의 left
event.clientY 문서 기준 누른 좌표의 top
event.screenX 콘테이너 기준 누른 좌표의 left
event.screenY 콘테이너 기준 누른 좌표의 top



■ 브라우저 객체별 이벤트 핸들러


선택 목록(SELECT)
onBlur, onChange, onFocus
문자 필드(TEXT) onBlur, onChange, onFocus, onSelect
문자 영역(TEXTAREA) onBlur, onChange, onFocus, onSelect
버튼(BUTTON) onClick
체크박스(CHECKBOX) onClick
라디오 버튼(RADID) onClick
링크 onClick, onMouseover
RESET 버튼(RESET) onClick
SUBMIT 버튼(BUTTON) onClick
DOCUMENT onLoad, onUnload
WINDOW onLoad, onUnload
폼(FORM) onSubmit
<script language="javascript">
function TEST(){
alert("페이지 로딩시 자동 호출!")
}
</script>

<body onLoad="TEST()">


<script language="javascript">
function TEST(){
alert("Click 했군요!")
}
</script>

<font onClick="TEST()"> Click! </ font>


<script language="javascript">
function TEST(){
alert("마우스를 올리지 마세욤!")
}
</script>

<font onMouseOver="TEST()"> MouseOver</ font>


<script language="javascript">
function TEST(){
alert("현재 좌표는 " + event.x + "/" + event.y)
}
</script>

<font onClick="TEST()"> Click 좌표 </ font>

* 브라우저 객체(window,document,form,image,layer,...)와 함께 사용되기 때문에 여기서는 간단하게 종류와 의미만 살펴보고!!!

'Web(웹) Study > Java Script' 카테고리의 다른 글

시간 간격으로 Response  (0) 2007.12.21
유효성 검사 툴팁 (innerHTML)  (0) 2007.12.21
작성완료시에만 전송시키기  (0) 2007.12.19
IFrame 크기 자동 조절 스크립트  (0) 2007.12.19
영타를 한글로 ^^  (0) 2007.12.19

<HTML>
<HEAD>
<TITLE>작성완료시에만 전송시키기</TITLE>
<script language="javascript">
 function check()
 {
  var f = document.frm
  com = new Array(f.title, f.writer, f.pass, f.email, f.content);
  msg = new Array("제목을", "작성자를", "비밀번호를", "이메일을", "내용을");
  for(i=0;i<com.length;i++)
  {
   if (com[i].value == "")
   {
    alert(msg[i] + " 작성해주세요");
    com[i].focus();
    return false;
   }
  }
  f.submit();
 }

</script>
</HEAD>
<BODY>
<center>
<table border=1>
<form method="post" name="frm" action="board.asp" onreset="this.title.focus()">
 <tr>
  <td>제목</td>
  <td><input type="text" name="title"></td>
 </tr>
 <tr>
  <td>작성자</td>
  <td><input type="text" name="writer"></td>
 </tr>
 <tr>
  <td>비밀번호</td>
  <td><input type="password" name="pass"></td>
 </tr>
 <tr>
  <td>이메일</td>
  <td><input type="text" name="email"></td>
 </tr>
 <tr>
  <td>내용</td>
  <td><textarea cols=50 rows=10 name="content"></textarea></td>
 </tr>
 <tr>
  <td colspan=2 align="center"><input type="button" value="전 송" onClick="check()">
  <input type="reset" value="다시작성"></td>
 </tr>
</form>
</table>
</center>
</BODY>
</HTML>

'Web(웹) Study > Java Script' 카테고리의 다른 글

유효성 검사 툴팁 (innerHTML)  (0) 2007.12.21
자바스크립트 이벤트  (0) 2007.12.19
IFrame 크기 자동 조절 스크립트  (0) 2007.12.19
영타를 한글로 ^^  (0) 2007.12.19
입력 문자 한글 체크  (0) 2007.12.19

iframe이 로딩될때 현재프레임의 스크롤바값을 가져와서 창크기로 변환한다.

(테이블안에 iframe삽입시 스크롤바 생성안되게 할때 유용)

ex)

<script language='javascript'>

function resizeIframe(fr) {
fr.setExpression('height',inFrame//프레임ID.document.body.scrollHeight);
fr.setExpression('width',inFrame.document.body.scrollWidth);
}

</script>

..

..

<body>

 <iframe id=inFrame//프레임ID설정 src=memberRegistPersonal.html name=main_in marginwidth='0' marginheight='0' topmargin='0' scrolling='no' frameborder='0'  ALLOWTRANSPARENCY="true" onload='resizeIframe(this);' >
 </iframe> 

</body>

</html>

<HTML>
<HEAD>
<TITLE>영어 -> 한글</TITLE>
</HEAD>
<SCRIPT>
/**
  * 주기적 함수 실행
  * 영어를 한글로 바꿔주는 englishToKorean() 함수를
  * 100/1 초 간격으로 재실행
  */
function intervalExcute()
{
        setInterval( "englishToKorean()", 10 );
}

/**
  * 영어를 한글로...
  */
function englishToKorean()
{
        form.korean.value = "";

        // 입력한 영문 텍스트 추출
        var text = form.english.value;

        // 변수 초기화
        var initialCode = 0;
        var medialCode  = 0;
        var finalCode   = 0;

        // 입력한 문자열 길이 추출
        var textLength = text.length;

        for( var idx = 0; idx < textLength; idx++ )
        {

                // 초성 코드 추출
                initialCode = getCode( 'initial', text.substring( idx, idx + 1 ) );
                idx++; // 다음 문자로.

                /**
                  * 현재 문자와 다음 문자를 합한 문자열의 중성 코드 추출
                  * ㅞ ( np ) 또는 ㄼ ( fq ) 같은 두개의 문자가 들어가는 것을 체크하기 위함
                  */
                tempMedialCode = getCode( 'medial', text.substring( idx, idx + 2 ) );

                // 코드 값이 있을 경우
                if( tempMedialCode != -1 )
                {
                        // 코드 값을 저장하고 인덱스가 다다음 문자열을 가르키게 한다.
                        medialCode = tempMedialCode;
                        idx += 2;
                }
                else // 코드값이 없을 경우 하나의 문자에 대한 중성 코드 추출
                {
                        medialCode = getCode( 'medial', text.substring( idx, idx + 1 ) );
                        idx++;
                }

                // 현재 문자와 다음 문자를 합한 문자열의 종성 코드 추출
                tempFinalCode = getCode( 'final', text.substring( idx, idx + 2 ) );

                // 코드 값이 있을 경우
                if( tempFinalCode != -1 )
                {
                        // 코드 값을 저장한다.
                        finalCode = tempFinalCode;

                        // 그 다음의 중성 문자에 대한 코드를 추출한다.
                        tempMedialCode = getCode( 'medial', text.substring( idx + 2, idx + 3 ) );

                        // 코드 값이 있을 경우
                        if( tempMedialCode != -1 )
                        {
                                // 종성 코드 값을 저장한다.
                                finalCode = getCode( 'final', text.substring( idx, idx + 1 ) );
                        }
                        else
                        {
                                idx++;
                        }
                }
                else // 코드 값이 없을 경우
                {
                        // 그 다음의 중성 문자에 대한 코드 추출
                        tempMedialCode = getCode( 'medial', text.substring( idx + 1, idx + 2 ) );

                        // 그 다음에 중성 문자가 존재할 경우
                        if( tempMedialCode != -1 )
                        {
                                // 종성 문자는 없음.
                                finalCode = 0;
                                idx--;
                        }
                        else
                        {
                                // 종성 문자 추출
                                finalCode = getCode( 'final', text.substring( idx, idx + 1 ) );

                                if( finalCode == -1 ) finalCode = 0;
                        }
                }

                // 추출한 초성 문자 코드, 중성 문자 코드, 종성 문자 코드를 합한 후 변환하여 출력
                result = String.fromCharCode( 0xAC00 + initialCode + medialCode + finalCode );
                form.korean.value += result;
        }
}

/**
  * 해당 문자에 따른 코드를 추출한다.
  * @param type 초성 : chosung, 중성 : jungsung, 종성 : jongsung 구분
  * @param char 해당 문자
  */
function getCode( type, char )
{
        // 초성
        var initial = "rRseEfaqQtTdwWczxvg";
       
        // 중성
        var medial = new Array( 'k', 'o', 'i', 'O', 'j', 'p', 'u', 'P', 'h', 'hk', 'ho', 'hl', 'y', 'n', 'nj', 'np', 'nl', 'b', 'm', 'ml', 'l' );

        // 종성
        var final = new Array( 'r', 'R', 'rt', 's', 'sw', 'sg', 'e', 'f', 'fr', 'fa', 'fq', 'ft', 'fx', 'fv', 'fg', 'a', 'q', 'qt', 't', 'T', 'd', 'w', 'c', 'z', 'x', 'v', 'g' );

        var returnCode; // 리턴 코드 저장 변수

        var isFind = false; // 문자를 찾았는지 체크 변수

        if( type == 'initial' )
        {
                returnCode = initial.indexOf( char ) * 21 * 28;
                isFind = true;
        }
        else if( type == 'medial' )
        {
                for( var i = 0; i < medial.length; i++ )
                {
                        if( medial[i] == char )
                        {
                                returnCode = i * 28;
                                isFind = true;
                                break;
                        }
                }
        }
        else if( type == 'final' )
        {
                for( var i = 0; i < final.length; i++ )
                {
                        if( final[i] == char )
                        {
                                returnCode = i + 1;
                                isFind = true;
                                break;
                        }
                }
        }
        else
        {
                alert("잘못된 타입입니다.");
        }

        if( isFind == false ) returnCode = -1; // 값을 찾지 못했을 경우 -1 리턴

        return returnCode;
}
</SCRIPT>
<BODY onLoad = "intervalExcute();form.english.focus()">
<FORM name = "form">
<TABLE>
<TR>
        <TD>영어 : </TD>
        <TD><TEXTAREA rows = "4" cols = "30" name = "english"></TEXTAREA></TD>
</TR>
<TR>
        <TD>한글 : </TD>
        <TD><TEXTAREA rows = "4" cols = "30" name = "korean"></TEXTAREA></TD>
<TR>
</TABLE>
</FORM>
</BODY>
</HTML>

function koreanCheck(str) {
    var i;
    var ch;
   
    for (i=0;i<str.length;i++) {
        ch = escape(str.charAt(i));        //ISO-Latin-1 문자셋으로 변경

        if (strCharByte(ch) != 2) { //한글이 아닐 경우
            return;
        }
    }
}

function strCharByte(chStr) {
    if (chStr.substring(0, 2) == '%u') {
        if (chStr.substring(2,4) == '00')
            return 1;
        else
            return 2;        //한글
    } else if (chStr.substring(0,1) == '%') {
        if (parseInt(chStr.substring(1,3), 16) > 127)
            return 2;        //한글
        else
            return 1;
    } else {
            return 1;
    }
}

KBS와 MBC가 공동으로 실시한 2007년 대통령 선거 출구조사에서 이명박 후보가 과반수의 득표를 할 것으로 예상됐다.

17일 오후 6시 투표마감 직후 발표한 예측 득표율에서 이 후보는 50.3%를 얻어 26.0%를 기록한 2위 정동영 후보를 크게 따돌릴 것으로 예상된다. 3위 이회창 후보는 13.5%, 문국현 후보는 6.1%를 득표할 것으로 예상된다.

권영길 후보는 2.9%가 예상된다.

SBS가 실시한 출구조사에서도 이명박 후보 예비 득표율 51.8%, 정동영 후보 25%, 이회창 후보 13.8%를 각각 획득한 것으로 나타났다. 6번 창조한국당 문국현 후보가 5.8%로 4위를 차지했다. 이같은 예측 결과가 맞아떨어진다면 이명박 후보의 대통령 당선이 확정적이다.

이날 KBS와 MBC는 전국 1만3000여 선거장소인 투표소 가운데 250개 투표소를 추출, 유권자 7만명을 대상으로 출구조사를 실시했다. KBS는 미디어리서치와 MBC는 코리아리서치와 공동 진행했다.


MBC 출구조사 예상득표율 이명박후보 50.3% 1위

사용자 삽입 이미지
MBC 출구조사 예상득표율 이명박후보 50.3% 1위
19일 실시한 제17대 대통령선거의 방송3사 출구조사 결과 이명박 후보가 일제히 1위를 기록한 것으로 발표됐다.

KBS·MBC 조사결과에서는 이명박 후보가 1위로 50.3%의 득표율을 기록할 것으로 예측됐다. 2위는 정동영 후보로 26.0%의 득표율을 기록할 것으로 예측됐다.

SBS 조사결과에서는 이명박 후보가 1위로 51.3%의 득표율을 기록할 것으로 예측됐다. 2위는 정동영 후보로 25.0%의 득표율을 기록할 것으로 예측됐다.

YTN 조사결과에서는 이명박 후보가 1위로 49%의 득표율을 기록할 것으로 예측됐다. 2위는 정동영 후보로 25.3%의 득표율을 기록할 것으로 예측됐다.

이번 대통령선거에서는 KBS와 MBC가 공동출구조사를 실시했고 SBS와 YTN은 단독으로 출구조사를 실시한 바 있다.

이날 KBS와 MBC는 전국 1만3000여 투표소 중 250개 투표소를 선정, 유권자 7만명을 대상으로 출구조사를 벌였다.


노종빈(기자) untie@newspim.com
▶ 이명박 후보 당선 확실시
KBS, MBC, SBS 등 방송 3사의 출구조사 결과, 한나라당 이명박 후보가 50% 이상을 얻어, 대통합민주신당 정동영 후보를 24.3∼26.3% 포인트 차이로 누르고 압승할 것으로 예측됐습니다.

▶ 대선 잠정투표율 62.9%...사상최저
제17대 대통령 선거의 잠정 투표율이 62.9%로 나타나 직접선거로 치러진 11차례의 대선 가운데 가장 낮은 투표율을 기록할 것으로 보입니다.


사용자 삽입 이미지


▶ 한나라 "10년 한 풀었다" 환호
한나라당은 200여명이 넘는 지지자들이 모여서 10년의 한을 풀었다며 만세삼창과 함께 승리의 기쁨을 나누고 있습니다.

▶ 신당 "지켜보자"..이회창측 '침울'
대통합민주신당은 출구조사 결과에 당혹하면서도 끝까지 지켜보자는 분위기입니다. 이회창 후보 캠프도 득표율이 예상에 못미치자 침울한 분위기가 감돌고 있습니다.
제 17대 대통령의 선거가 끝났다...

방송 3사에서는 투표가 끝나는 시점에 마춰 투표 출구 조사를 발표했다...
모두 50%의 엄청난(?) 정도의 이명박 후보가 1위로 대통령이 될것이라는 출구 조사가 된것이다.

과연 이명박이 정말 대통령에 자질이 있을까...?

출구조사 결과 대로라면 10년만에 정권이 민주당에서 한나라당으로 바뀌게 되었다고 볼 수 있다...
과연 구시대적인 생각을 가진 사람들이 모여 앞으로 더 분발해도 모자를 것 같은 우리나라를...

더욱 더 뒤로 되돌려 놓는건 아니지...

사용자 삽입 이미지

노무현 대통령 임기 기간의 5년은 국민들이 다시 한번 전 김대중대통령의 정권을 믿고 준 기회이나,
현 정권의 노무현 대통령은 국민의 기대에 미치지 못할 만큼 국민의 마음을 찟어 놓앗다고 봐야 할 것 같다.

출구 조사 결과대로 진행 된다면 10년만에 정권이 바뀌지만,
그렇게 기쁘다고 할 수도 없다.

과연 새로운 정권이 집권을 해서 지금 이 어려운 현실을 다시 밝게 만들어 줄수 있는 그럴만한 능력을 가진것일까...? 그렇다고 정동영후보나 이회장 후보등의 능력이 무능력 하다는것은 아니다.

지난 5년동안 노무현대통령을 믿엇다가, 믿는 도끼에 발등을 찍힌 만큼 국민들은 더욱 신중해 졌지만,
이번 대선활동에서 보여진 추잡(?) 스러운 후보들간의 깍아 내리는 발언들은...

다시 한번 저 후보들이 당선이 되서 정말 잘 할수 있을까...? 우리를 잘이끌어 갈수 있는 대표자가 될수 있을까 하는 생각을 하게 된다.
‘군소후보’인 기호 8번 허경영 후보의 이색공약과 이색CF가 네티즌의 눈길을 끌고 있다.

17대 대통령 선거일인 19일 오전 11시 현재 허경영 후보의 미니홈피 방문객은 1만 2000여명으로 ‘빅3’ 후보인 한나라당 이명박(1만 1000여명), 무소속 이회창(8700여명), 대통합민주신당 정동영(5400여명) 후보를 오히려 앞서는 것으로 나타났다.

네티즌들은 올 대선판도가 네거티브 선전으로 얼룩지며 정책과 이슈가 실종된 상황에서 허 후보가 그나마 유권자들을 웃게 만들며 넷심을 자극한다고 설명한다.

다른 후보들의 공약은 기억 안 나도 ‘8번 찍으면 팔자 핍니다’라는 슬로건과 ▲ UN본부를 판문점으로 ▲ 결혼지원금 남녀 각 5000만원 ▲ 출산장려금 3천만원 등 일견 황당무계해 보이는 허 후보의 공약은 선명하게 각인되는 현상이 나타나는 것이다.

특히 허 후보는 13일 열린 군소후보 토론회에서 자신을 IQ 430의 천재라고 소개하며 ▲ 국회의원 100명으로 축소 ▲ 모든 세금을 소비세 한 가지로 통합 등의 공약을 내세워 관심을 모았다.

이에 더해 새마을 운동 노래 가사를 자신의 공약으로 개사해 만든 CF 동영상은 출연배우들의 유머러스한 댄스와 어우러지며 상승작용을 일으키고 있다.

다음의 한 블로거는 “TV에서 허 후보의 대선광고를 보고 너무 재미있어 뒤집어지는 줄 알았다”며 자신의 블로그에 이 동영상을 게시했다.

네티즌들은 허 후보에게 ‘본좌’의 호칭을 부여하며, 1997년 대선 당시 허 후보가 등장했던 군소후보 토론회 동영상을 찾아내 여기저기 퍼나르고 있다.

이같은 ‘허경영 신드롬’에 대해 회사원 김준우(28)씨는 “날카로운 정책대결도 없고, 특별한 이슈도 없다보니 그나마 재밌는 공약에 눈길이 가는 것 같다”며 네거티브 공세로 일관했던 올 대선 분위기를 꼬집었다.

직장인 이모(30)씨는 “택시를 타고 기사와 대선 이야기를 나누다 보면 허 후보에 대한 이야기는 꼭 나온다”며 “2002년에 비해 지루했지만 그나마 그가 있어 즐거웠던 대선이었다”고 말했다.
저자: 스콧 오크스, 역 이호재
 
보안을 고려하는 것은 자바 플랫폼의 디자인에 많은 영향을 미친다. 이러한 예로는 전자 서명을 위한 클래스를 포함한 보안 메니저와 J2SE(자바 2 표준 버전)가 있다. 또한 자바 2 1.3 버전에는 세 가지 중요한 보안 확장이 있다. 더군다나 보안은 자바의 클래스 로더의 디자인과 배열 경계 체크 등의 많은 언어 규칙과 java.lang.String 클래스와 같은 많은 클래스의 구현에 영향을 미친다.
 
자 어디서부터 시작해야 할까? 『Java Security, 2nd Edition』(『자바 시큐리티 프로그래밍』, 한빛미디어, 2001)에서는 자바 보안 구조의 개관부터 시작해서, 중요한 자바 보안 도구를 이용하는 방법과 로드하는 클래스의 추가적인 퍼미션을 위해 URL 클래스 로더를 사용하는 것, 그리고 P와 Q라는 특별한 매개변수(DSA 키를 계산하는데 사용되는 매개변수)를 통해 DSA 키를 생성하는 것까지 자바 보안과 관련된 모든 것을 다룬다. 이 기사에서는 여러분들이 어디서부터 시작해야 할지를 알려주는 가장 중요한 팁들을 간추려 놓았다. 그러면 지금부터 자바 보안 구조를 이용하기 위한 10가지 팁을 살펴보도록 하자.
 

자바 시큐리티 프로그래밍
 
1. 모든 것은 보안 관리자와 함께 실행시켜라.
 
가장 잘 알려진 자바 보안 구조의 양상은 애플릿이 특정 옵션을 수행함에 있어 제한적이라는 점이다. 이 제한은 보안 관리자에 의해 강제로 통제된다.
 
그렇지만 보안 메니저는 단지 애플릿을 위한 것이 아니라는 점을 알아두어야 한다. RMI 서버와 같은 애플리케이션도 올바르게 작동되기 위해서는 보안 관리자를 설치해야 한다. 물론 모든 애플리케이션은 보안 관리자로부터 이득을 얻을 수 있다. Acme 소프트웨어로부터 자바 애플리케이션을 방금 다운받았다고 가정해보자. Acme는 믿을만한 소프트웨어 회사이기 때문에 그 소프트웨어에 바이러스를 심어놓지는 않았을 것이다. 하지만 우연하게 소프트웨어에 바이러스가 포함될 수는 있으며 심지어 아주 유명한 소프트웨어 회사도 자신들도 모르는 사이에 바이러스에 감염된 소프트웨어를 배포한 사실이 있다.
 
Acme에서 제작한 소프트웨어가 C++로 작성되었다면 발송하기 전에 소프트웨어가 바이러스에 감염되지 않았기를 바라는 것 이외에는 할 수 있는 게 별로 없다. 하지만 소프트웨어가 자바로 제작되었다면 이야기는 달라진다. 여러분은 그 소프트웨어를 보안 관리자의 보호 아래 실행 할 수 있기 때문이다. 따라서 소프트웨어가 중요한 시스템 파일이나 기타 다른 중요한 문서에 접근하거나 삭제할 수 없게 방지할 수 있다.
 
보안 관리자를 사용하는 것은 모든 자바 프로그램에 있어서 선택사항이다. 애플릿을 실행하는 컨테이너(애플릿뷰어나 자바 사용 가능한 브라우저 등)의 경우 자동으로 보안 관리자를 설치한다. 그렇지 않으면, 보안메니저를 설치하는 것은 여러분에게 달려있다. 만약 여러분이 애플리케이션을 만든다면 이것은 프로그램 절차에 따라 실행될 수도 있지만 자바를 시작할 때 -Djava.security.manager라는 플래그를 포함하여 명령 라인에서 보안 관리자의 사용을 명세해 주는 것이 훨씬 더 쉽다.
 
자바 초창기에는 자바 보안 모델의 '심각한 결점'(명령행에서 실행하는 애플리케이션이 파일을 읽을 수 있거나 네트워크 연결을 할 수 있다는 점 등등)에 대해 사람들이 말하는 것을 종종 들을 수 있었다. 그렇지만 지금은 대부분의 사람들이 이러한 관점에서 애플리케이션과 애플릿의 차이는 구분해 낸다. 그리고 그들 중 아주 소수만이 보안 관리자와 함께 애플리케이션을 실행해야 함을 깨닫고 다음 단계로 더 발전해 나간다
 
2. 인증서의 사용을 고려하라.
 
자바 보안 인프라의 특징 중 대다수가 디지털 인증서(정확히는 X509 인증서)에 기초하고 있다. 여러분은 .jar 파일 안에 들어있는 코드에 더 많은 퍼미션을 주기 위해 .jar 파일에 디지털 인증서로 서명을 한다. 또한 SSL(Secure Socket Layer)을 사용하는 서버를 설치하기 위해 디지털 인증서를 사용하며, 암호화를 위해 디지털 인증서를 사용할 수도 있다.
 
100% 완벽한 세상에서는 우리 모두가 디지털 인증서를 가지고 있기 때문에 그것을 아주 간단하게 사용할 수 있다. 하지만 실제 세계는 100% 완벽이라는 말과는 거리가 멀다. 디지털 인증서는 다루기가 어려우며, 자바에 들어있는 도구들은 기업은 말할 것도 없고 워크그룹을 위한 디지털 인증서 집합을 다루기에도 적합하지 않다. 설상가상으로 자바 애플리케이션과 다른 애플리케이션 간의 디지털 인증서를 공유하는 것은 어렵다.
 
하지만 다행스럽게도 디지털 인증서를 위한 인프라가 최근 몇 년 동안 급격히 발전했다. 사실 디지탈 인증서를 얻는 일이 이보다 더 쉬운 때는 없었던 것 같다. 단순히 Thawte 웹사이트를 방문한 다음 '개인 인증서'를 클릭하면 되기 때문이다. 일단 웹사이트의 개인 인증서 프로그램에 등록했다면 여러분은 모든 자바 애플리케이션에서 사용할 수 있는 여러분만의 인증서를 갖게 된 것이다. 이것은 무료일 뿐만 아니라 획득하기도 쉽다.
 
하지만 자바의 가장 중요한 보안 기능을 이용하기 위해 반드시 인증서가 필요한 것은 아니라는 점을 기억하고 있는 것이 좋다. 특히 추가적인 퍼미션을 갖기 위해서 코드를 서명할 필요는 없다는 뜻이다. 자바가 작업을 수행하는 퍼미션은 코드가 로드되는 위치와 코드를 서명한 사람의 조합에 기초하여 결정된다. 이 조합의 두 부분은 모두 선택적이다. 만약 oreilly.com에 있는 코드가 시스템에 있는 파일들을 읽을 수 있는 퍼미션을 갖게 하려면, 단순히 java.policy 파일에 다음과 같은 항목만 만들면 된다.
 
grant codebase "http://www.oreilly.com/" {
    permission java.io.FilePermission "<<ALL FILES>>", "read";
};
 
만약 인터넷과 같이 네임 서버를 신뢰할 수 없는 네트워크상에 있다면 위와 같이 오직 URL에만 의존한 퍼미션은 실행하기에 위험한 일이다. 하지만 만약 안전한 네트워크상에 있거나 클래스를 파일 시스템으로부터 로딩하고 있다면 이것은 실행하기에도 안전하다고 말할 수 있다. 만약 당신이 작성한 자바 애플리케이션을 배포하려 한다면 사용자로 하여금 애플리케이션을 https 상에서 다운받게 하고 애플리케이션 .jar 파일을 로컬에 설치하게 하고 적절한 파일에 근거한 URLs 적절한 퍼미션을 부여하게 하는 것이 좋다.
 
3. 자바 플러그인과 RSA 인증서를 사용하라.
 
만약 인터넷상에서 애플리케이션을 실행하고 그것에 추가적인 퍼미션을 할당하기를 원한다면 애플리케이션을 포함하고 있는 .jar 파일에 서명을 하고 사용자에게 서명한 .jar 파일에게 추가적인 퍼미션을 허용하도록 요구하는 방법밖에 없다.
 
극소수의 브라우저만이 자바 2 보안 모델을 지원한다(넷스케이프 6과 오페라 브라우저만이 자바 2 보안 모델을 지원함). 인터넷 익스플로러나 이전 버전의 넷스케이프를 포함한 다른 브라우저들은 자바 플러그인을 통해서만 자바 2 보안 모델을 지원할 수 있다. 즉 이러한 브라우저에 내장된 자바 가상 머신은 자바 2 보안 모델을 지원하지 않는다(자바 2의 고분고분한 요구에도 불구하고).
 
이 경우 여러분이 할 수 있는 최선의 방법은 자바 플러그인을 사용하는 것이다(넷스케이프 6 및 오페라는 자동적으로 자바 플러그인을 사용하도록 되어있음). 그리고 자바 플러그인을 사용함으로써 얻을 수 있는 추가적인 이익이 있다. 대개 사용자들은 policytool을 실행하거나 특정 지역에서 로딩된 코드를 위해 명시적으로 퍼미션을 나열하거나 특정 조직에 의해 서명된 하나 또는 그 이상의 java.policy 파일을 편집함으로써 퍼미션을 부여한다. 하지만 만약 애플릿을 RSA 인증서를 통해 서명하고 자바 플러그인 1.3 버전 이상을 통해 실행한다면 사용자는 정책 파일을 수정할 필요가지는 없다(물론 정책 파일이 무엇인지 알고 있을지라도 수정할 필요가 없다). 자바 플러그인이 RSA 인증서에 의해 서명된 애플릿을 만나면 자바 플러그인은 그 애플릿이 보안 관리자가 애플릿에게 부여하는 모든 제약들을 무시해도 되는지를 물어보게 된다. 사용자는 그 애플릿이 현재 세션에 있는 모든 제약을 풀어주도록 허용할 수 있다. 현재 세션뿐만 아니라 항상 그러한 권한을 줄 수도 있고, 아예 안 줄 수도 있다.
 
특별한 정책 파일도 없을 뿐만 아니라 특별한 퍼미션도 필요 없다. 사용자가 조작할 수 있는 간단한 대화상자만이 필요할 뿐이다.
 
4. 보안 확장 모듈을 설치하라
 
자바 보안 구조를 위한 3가지 중요한 확장 모듈이 있다. 첫번째로 JCE(Java Cryptography Extension)는 다양한 알고리즘을 사용하는 강력한 암호화 모듈로 이를 이용해 코드를 개발할 수 있게 해준다(추가로 보안키 교환 같은 작업도 가능). 두 번째로 JSSE(Java Secure Sockets Extension)은 SSL 자바 인터페이스를 제공한다. 마지막으로 JAAS(Java Authentication and Authorization Service)는 프로그램을 실행시키는 엔드유저의 신분을 확인하고, 특정 엔드유저만이 특정 작업을 수행하도록 인증한다.
 
현재는 자바 2 플랫폼 1.3 버전을 위한 확장 모듈이 있다. 즉 이 모듈들을 각각 다운받아야 하며 번들되거나 번들되지 않은 확장 모듈로 사용해야 함을 의미한다. 이것들은 번들된 확장 모듈로 사용하는 것이 훨씬 쉽다. 이 경우 .jar 파일을 $JAVAHOME/lib/ext에 설치하면 세팅이 끝난 것이기 때문이다. 그러나 번들되지 않은 확장 모듈의 경우 애플리케이션을 위해 .jar 파일을 classpath에 포함시켜야 하는 수고를 더 들여야만 한다.
 
위에서 언급한 확장 모듈을 어떻게 설치하든 간에 이러한 확장 모듈에 대해 알아둘 필요는 있다. 개발자들에게 있어 확장 모듈은 자바와 함께 아주 유용한 보안 API를 제공한다. 핵심 플랫폼 API는 메시지 개요나 전자 서명을 만들 수 있기는 하지만 개발자들은 데이터를 암호화하고 사용자를 인증하는데 더 많은 흥미를 보이고 있다.
 
이 확장 모듈들은 자바 1.4의 핵심 릴리즈에 포함될 예정이다. 바로 이런 이유로 인해 이 확장 모듈은 번들된 확장 모듈로 취급되고 있으며 자바 1.4로 업그레이드 될 때 사용하게 될 방법으로 자리잡을 것이다.
 
현재 JCE와 JSSE는 확장 모듈로서 사용 가능하다. 그리고 모듈은 더 이상 미정부 수출 금지 품목에 포함되어 있지 않다. 이전 버전의 확장 모듈들은 미국과 캐나다 내에서만 사용될 수 있었으며 이것은 이 확장 모듈을 사용하는 프로그램들도 인터넷에서 사용할 수 없음을 의미했다. 미정부의 정책 변화로 썬 마이크로시스템즈는 이 확장 모듈을 전 세계로 배포할 수 있게 됐다. 물론 일부 나라는 이 패키지 수입을 여전히 제한하고 있기 때문에 몇몇 나라에서는 이 모듈을 사용할 수 없다. 더 자세한 사항을 알고 싶다면 Java Secure Socket Extension(JSSE) 1.0.2를 보기 바란다.
 
5. SSL 서버 이름을 검증하라.
 
JSSE는 SSL을 사용하기 위해 API를 제공한다. SSL은 소켓 프로토콜이기 때문에 API는 자바의 표준 소켓 의미 규칙을 따르는 클래스를 제공한다. 예를 들어 SSLSocket 클래스는 Socket 클래스를 상속받으며, SSLServerSocket 클래스는 ServerSocket 클래스를 상속받는다. 이는 그냥 소켓과 SSL 소켓이 상호 변환 할 수 있게 해준다. 사실상 JSSE는 이러한 추상화를 위해 소켓 생성기를 제공한다.
 
하지만 이 모든 것에는 다음과 같은 한 가지 복잡한 사항이 있다. SSL 소켓과 보통 소켓은 호스트와 포트의 연결을 통해 생성되는데 이는 소켓 생성기가 제공하는 인터페이스이다. 하지만, 극도의 안전을 위해서라면 SSL 소켓은 추가적인 초기화 작업이 반드시 필요하다.
 
SSL 클라이언트가 SSL 서버에 접속할 때 내부적으로는 많은 일들이 일어난다. 서버는 클라이언트에게 자신의 인증서를 전송하고, 클라이언트는 인증서를 검증하는데, 이때 클라이언트와 서버는 사용할 암호화 알고리즘 등을 결정한다. SSLSocket 객체가 생성되면 이와 같은 모든 초기화 작업은 끝나게 된다. 그러나 이때 클라이언트는 서버가 제공한 인증서의 유효성을 검증하였지만 서버의 신원을 확인하지는 못했다. 이 시점에서 모든 클라이언트들은 서버가 클라이언트가 신뢰하는 인증서 발급 기간에서 발급된 유효한 인증서를 소유하고 있다는 것을 알고 있다.
 
애플리케이션이 올바른 서버에 접속되어 있는 것을 보증하고 더 발전된 단계로 나아가는 것은 애플리케이션 개발자들이 책임져야 할 의무이다. 이 작업은 보통 인증서 내에 포함되어 있는 이름을 검색함으로써 수행된다. 인증서의 이름은 인증서를 소유하고 있는 사이트의 이름과 일치해야 한다. 그래서 만약 www.sun.com의 SSL server에 접속한다면 인증서 내의 이름이 여러분을 www.sun.com으로 전송시켜 줄 것이다. 따라서 애플리케이션 개발자는 인증서 내에 있는 이름을 검색하는 코드를 제공해야 하며 애플리케이션이 접속하고자 하는 호스트의 이름과 인증서의 이름이 일치하는지도 검사해야 한다.
 
종종 여러 가지 사정으로 이름이 일치하지 않을 때도 있다. 애플리케이션이 호스트 이름을 사용하지 않고 IP 주소를 지정했을 때 또는 어떤 사이트가 잘못된 이름으로 된 인증서를 갖고 있을 때 등이 이런 경우의 적절한 예가 될 것이다. 따라서 인증은 철저해야 한다. IP 주소를 받아서 다른 것들과 비교해 보아야 하며 만약 서로 뜻이 통한다면 애플리케이션은 사용자에게 이름이 서로 맞지 않을 경우 인증서를 수락할 것인지 아닌지를 물어볼 수 있다.
 
그러므로 인증을 어떻게 다룰 것인지는 애플리케이션에 종속적일 수 밖에 없다. 그러나 소켓 API의 프로토콜 독립적인 특징들로 인해 여러분이 이와 같은 중요한 단계를 수행하지 못하게 하지는 말아라.
 
6. 여러분의 기업환경에 맞는 구현을 계획하라.
 
자바의 핵심 보안 구현은 단일 플랫폼 상의 단일 유저에게는 안정맞춤이다. 그렇지만 다른 해결책을 원할 경우 어떻게 해야 할까? 인증서는 keytool이 관리하는 파일 안에 있다. 이 파일은 로컬 워크그룹 내에 공유할 수 있다. 그러나 도쿄와 오사카처럼 서로 멀리 떨어진 사무실에서 공유하고자 한다면 어떻게 해야 할까? 다양한 java.policy 파일의 항목에 있는 엔트리에 근거하여 코드에 퍼미션이 부여되는데 이것을 집중된 한 장소에 저장하고자 한다면 어떻게 해야 할까? JAAS는 JAAS를 인증한 사용자에게 퍼미션을 주도록 설치되어 있다. 하지만 이러한 퍼미션이 사용자의 이름과 같은 임시변통적인 원칙에 따라 정의되길 원한다면 어떻게 해야 할까?
 
여기서 언급한 것 이외에도 더 많을 수도 있지만 이러한 모든 일들은 고유의 몇몇 키 및 자바 클래스(핵심 자바 클래스) 구현을 제공함으로서 이룰 수 있다. 자바의 보안 구조는 기본값이 설정되는 방식으로 정의되는데 이러한 클래스의 포컬 사용자 기반의 구현은 여러분이 처한 환경에 적합하게 조정된 구현에 의해 쉽게 대체될 수 있을 수 있다. 각 클래스에 부여되는 퍼미션을 결정하는 Policy 클래스의 기본값 구현을 바꾸는 것이 극단적인 일처럼 보일 수 있지만 사실은 그렇지 않다. 이는 많은 환경에서 매우 당연한 일이며 보안 API에 의해 정의된 기본 작동이기 때문이다.
 
자바의 기본 보안 클래스를 이러한 방법으로 확장 가능하게 하는 서드 파티 패키지들이 점점 늘고 있다. 더 다양한 솔루션이 필요하다면 솔루션 시장을 검사해보길 바란다.
 
7. 올바른 암호화 매개변수를 사용하라.
 
JCE는 DES, DESede(또는 triple DES), Blowfish 등 다양한 알고리즘을 사용해서 암호화를 수행하는 API를 제공한다. 알고리즘이 작동할 모드는 사용할 알고리즘을 선택하는 것만큼 중요한 것이다. 따라서 암호화하고자 하는 데이터 종류에 따라 모드를 선택해야 한다.
 
암호화의 기본 모드는 ECB(Electronic CookBook)이다. 이 모드는 한번에 데이터를 한 블록(8바이트)씩 암호화 한다. 암호화된 텍스트가 재정렬 된다 하더라도 암호화된 텍스트는 여전히 성공적으로 해독될 수 있을 것이다(물론 결과물로 나온 암호화 이전의 텍스트는 그 순서가 바뀌게 되겠지만…). ECB 모드는 패턴을 검색함으로서 성공적으로 공격 당할 수 있다. 이러한 이유로 텍스트 데이터를 암호화하는 것은 적절하지 못하다. 즉, 이는 바이너리 데이터를 위해서만 사용되어야 한다.
 
어떤 종류의 텍스트는 CBC(Cipher Block Chaining) 모드를 사용해 암호화는 것이 적당하다. email 헤더에서처럼 이 모드는 텍스트의 첫 부분에 패턴이 발생하지 않는 한 텍스트 데이터 내의 패턴을 숨길 수 있다. 이 모드는 키 교환 기술에 사용되는 PBEwithMD5AndDes 등과 같이 특별한 알고리즘을 위해 가장 잘 사용된다.
 
텍스트는 OFB(output FeedBack) 모드나 CFB(Cipher Feedback) 모드를 사용해 더 잘 암호화 된다. 이 모드는 텍스트의 모든 패턴을 숨길 수 있다. OFB는 모뎀과 같이 전송 중 노이즈가 발생할 수 있는 라인에서 사용하기 위해 고안되었다. 다른 모드로 암호화된 데이터에서 한 비트의 데이터가 바뀌면, 8바이트짜리 블록 전체를 잃어버리게 되며 OFB모드에서는 오직 1비트만을 잃어버리게 된다. 만약 자동적으로 데이터를 해독, 암호화하는 입출력 스트림을 사용하고자 한다면 숫자 8로 확장된 모드 중 하나를 사용해야 한다(예: CFB8). 이는 데이터가 8비트짜리 블록으로 처리되기 때문이다. 그렇지 않으면 스트림은 데이터를 처리하기 전에 64비트 데이터를 버퍼링 할 것이다.
 
8. 외부 환경을 이해하라.
 
필자는 최근에 필자와 필자의 친구가 일 때문에 종종 접근하는 웹사이트의 사용을 자동화하는 프로그램을 만들었다. 이 웹사이트는 사용자 이름과 패스워드를 요구하고, 사용자가 데이터를 다 입력하고 나면 다시 문서로 되돌아 가게 되어있다. 즉 자동화 프로그램을 이용하여 문서를 불러오는 스크립트를 간단히 실행만 하면 된다.
 
우리는 패스워드를 어떻게 다룰까에 대해서 고민하였다. 스크립트가 임의의 시간에 자동으로 실행할 수 있기를 원했기 때문에 실행할 때마다 패스워드를 입력할 수 없었기 때문이다. 그리고 내 동료 중 몇몇은 스크립트에 보호 받지 못하는 패스워드를 남겨 놓는 것에 대해 걱정스럽게 생각했다. 따라서 패스워드가 스크립트 내에 저장되기 위해서는 암호화할 필요성이 있다.
 
내가 행한 정정 작업은 물론 JCE의 강력한 암호화 API를 사용한 것이다. 이상적으로 그것은 모든 사람의 개인 인증서에 기초하여 작업할 수 있지만 그렇게까지 하지는 않았다. 필자는 필자의 동료도 몇 시간 내에 알아낼 수 있는 취약한 암호를 구현하였다(그는 한 번에 그 사실을 발견하였음).
 
필자는 필자가 꽤 게으른 프로그래머라는 것과 가장 간편한 방법을 찾아 구현한 암호화였음을 시인한다. 하지만 다른 관점(우리가 접속하는 웹사이트가 https를 사용하지 않는다는 점)에서 보면 이치에 맞다. 따라서 필자의 패스워드에 관심이 있는 사람은 필자의 스크립트를 찾아내 암호화 기술을 깨뜨림으로써 패스워드를 훔칠 수 있을 것이다. 그러나 굳이 그렇게 복잡한 방법 대신 암호화 되지 않은 패스워드가 웹 서버로 전달 될 때 필자의 네트워크를 스누핑함으로써 훨씬 간단하게 패스워드를 얻을 수 있다.
 
보안은 자바를 둘러싼 것들 중에 있어 애매모호한 것 중의 하나이고 결과적으로 자바에서 보안에 관련된 것들은 다른 환경적 요인들보다 훨씬 더 정밀한 주제에 속한다. 그러나 자바가 얼마나 안전한지 또는 자바 애플리케이션에 어떤 보안 요소들을 추가할 수 있는지는 중요하지 않다. 나머지 환경이 안전하지 않을 경우 이러한 자바의 장점들은 별로 도움이 되지 않기 때문이다.
 
(그렇다고 해서 이것을 변명하는데 사용하지는 말아라. 언젠가 필자와 필자의 친구가 사용하는 웹사이트가 이러한 방법의 어리석음을 깨닫고 https를 사용하기 시작할 수 있다. 이때는 필자의 프로그램을 수정할 수 밖에 없을 것이다. 시작할 때부터 올바르게 하는 것이 더 좋은 방법이다.)
 
9. 사용자를 그들 자신으로부터 보호하라.
 
자바의 보안 구조는 6번 팁에서 언급했듯이 아주 유연하다. 이는 그들 자신이 무엇을 하는지를 이해하는 사람들에게 있어서는 안성맞춤 이기는 하지만 때때로 사용자들이 그들 자신들로부터 보호 받길 원하는 환경에 있을 수 있다. 참고로 내가 그러한 오만한 시스템 관리자라는 것은 아니다.
 
사용자들이 빠지기 쉬운 가장 큰 위험은 신뢰할 수 없는 코드가 허용되어서는 안되는 작업을 수행하게 하는 엔트리가 정책 파일에 있는 것이다. 기본값으로 각 사용자는 그러한 퍼미션을 부여하는 $HOME/.java.policy 파일을 가지고 있다. 또한 이러한 퍼미션은 사용자가 -Djava.policy 인자를 명령 라인에서 지정하는 것 뿐만 아니라 $JAVAHOME/lib/security/java.policy 파일에 나열되어 있는 것에 추가할 수도 있다.
 
여러분은 $JAVAHOME/lib/security/java.security 파일을 아래와 같이 수정함으로써 보안 구조의 이러한 성질을 해제할 수 있다.
 
   아래와 같이 쓰여 있는 라인을 삭제하라.
   policy.url.2=file:${user.home}/.java.policy
 
   아래와 같이 쓰여있는 것을 주석 처리하라.
   policy.allowSystemProperty=true
 
이와 같이 수정한 후, 자바 애플리케이션을 실행할 때 오직 $JAVAHOME/lib/security/java.policy에 나열되어 있는 퍼미션만이 유효할 것이다. 사용자는 어떠한 자바 클래스에 추가적인 퍼미션을 부여할 수 없을 것이다.
 
물론 이것을 완벽하게 효과적으로 사용하기 위해서는 최종 사용자가 $JAVAHOME/lib/security 디렉토리에 있는 파일을 수정할 수 없게 해야 한다.
 
10. 최근의 일에 귀를 기울여라.
 
만약 당신이 정말로 자바의 보안에 대해 지대한 관심을 갖고 있다면 자바 세계에서 일어나는 최근의 일에 귀를 기울여야 한다. 특히 java.snu.com를 방문해보면 자바 보안 구조와 관련된 모든 사이트들과 링크가 잘 되어있다. 자바 보안 모델의 구현에 있어서 버그가 발견된다면 물론 버그 관련사항도 이 사이트에 포스팅이 된다.
 
스콧 오크스는 1987년부터 썬 마이크로시스템즈에서 근무한 자바 기술자이다. 그곳에서 기술자로 근무하면서 그는 SunOS 커널에서 네트워크 프로그래밍과 RPC 등에 이르는 일관적인 기술들을 전문적으로 개발하였다. 1995년 이후로 자바관련 사업을 주로하고 있으며 자바 기술을 엔드유저에게 소개하고 있다.
최근 USB 메모리 스틱과 같은 휴대용 저장 매체를 대상으로 공격하는 autorun 웜이 기승을 부리고 있습니다. 이 웜은 CD-ROM 드라이브에 CD를 삽입하거나 메모리 스틱을 USB 포트에 끼우는 순간 자동으로 실행되는 기능 즉 자동 실행 기능을 이용하고 있습니다.

autorun 웜에 감염된 경우에는 메모리 스틱을 컴퓨터에 부착해 놓는 경우에는 웜을 삭제(또는 치료, 안전지대로 이동)한 후에도 재부팅을 하면 다시 생기는 놀라울만한 생명력을 보여 주고 있습니다.

국가 정보원에서는 이러한 문제점을 해결하는 원천적인 방법으로 '자동 실행'기능을 끄는 프로그램을 배포하고 있어 이를 소개합니다.




컴퓨터를 옮기게 되어서 로컬에 저장되어 있는 메일을 옮길 일이 생겼다.
메일 클라이언트로 썬더버드를 사용하고 있는데, 어떻게 백업을 하는지 몰라 구글에게 부탁했다.
검색 한 방으로 profile 및 메일 백업하는 방법이 나왔다.
윈도우즈에서 썬더버드를 사용한다면 MozBackup(http://mozbackup.jasnapaka.com/)이라는 프로그램을 이용하면 손쉽게 백업과 복구를 할 수 있다.
방법은 http://kb.mozillazine.org/MozBackup 에 나와 있는데, 간단히 말하면

1. 백업하고자 하는 PC에서 MozBackup을 설치하고 Backup a profile 메뉴를 통해 백업을 한다.
어떠한 내용을 백업할 지 선택하라고 나오는데 디폴트를 이용하면 관련된 것들을 다 백업한다.

사용자 삽입 이미지

2. 복구는 (당연한 얘기겠지만) 복구하려는 PC에서 Restore a profile 명령을 통해 복구하면 된다.


썬더버드에 관한 기타 여러 내용을 FAQ에서 볼 수 있다.

Thunderbird FAQs
http://kb.mozillazine.org/Thunderbird_:_FAQs




#1: 보유 기능 목록을 제일 앞에 올리라
고용 담당자는 회사가 찾고 있는 기능을 보유하고 있는지 알고 싶어 한다. 물론 "경력" 란에 구직자의 보유 경력이 잘 나오겠지만, 이력서 상단에 "보유 기능" 란을 넣으면 자연스럽게 그 부분을 제일 먼저 보게 된다.

당연히 그런 이력서를 고르기가 더 쉽다. 동시에 그렇게 하지 않았다면 고용 담당자들이 놓쳐버렸을 수 있는 기능에 관심을 가지게 한다는 장점도 있다. 최소한 고용 담당자는 그 보유 기능 목록을 보게는 된다.

#2: 눈길을 끄는 방식으로 경력을 소개하라
일자리를 구하는 대부분의 개발자들은 데이터 중심형 웹 사이트나 데스크톱 애플리케이션을 만든 적이 있다. 따라서 이력서에 그런 일반적인 예를 잔뜩 써 넣는 것은 별로 눈길을 끌지 못한다. 장래의 고용주가 관심을 가지는 것은 독특한 무언가가 있는 경력, 즉 단순히 기본적인 수준의 프로그래밍 작업을 한 것이 아님을 보여주는 경력이다.

독특한 제약 조건이 적용되는 작업을 했거나 트랜잭션이 많이 발생하거나 무장애 실행을 요구하는 환경에서 일한 경력은 이력서를 보는 사람에게 아주 좋은 인상을 준다. 즉, 자신의 경력이 남과 다르다는 것을 보여주어야 다른 사람이 그를 남다른 사람으로 보게 된다.

#3: 문법, 철자 및 기타 일반적인 실수를 샅샅이 찾아내어 고치라
고용 업무를 담당하는 동안 필자는 이력서에서 온갖 종류의 문법 오류나 철자 오류를 보았다. 가장 황당했던 경우 중 하나는 자기가 졸업한 대학교의 철자를 잘못 쓴 경우였다.

이력서에는 몇 가지 독특한 문법적인 규칙이 관련되며, 특히 소프트웨어 개발 작업에는 약어나 철자가 특이한 단어들이 관련되는 경우가 많다. 하지만 어떤 경우에도 변명의 여지가 없다. 철자나 문법상으로 실수가 없는지 확인해야 한다. 이 점은 필자가 읽어 본 모든 이력서 관련 지침에 빠지지 않고 나오며, 분명히 강조할 가치가 있다.

#4: 학력은 고려 대상이지만 중요하지는 않다
프로그래밍 구직 시장에 이제 막 발을 들여 놓은 사람이나 아주 전문적인 자리를 얻기 위해 이력서를 쓰는 것이 아닌 한 학력은 별로 중요하지 않다. 물론, 이력서에 학력이 빠질 수는 없지만 제일 마지막에 넣는 것이 좋다.

학력에 대해 알아야 하거나 알 필요가 있는 고용 담당자라면 학력 부분까지 읽을 것이고, 그 외의 사람들은 학력을 보느라 시간을 허비할 필요가 없다. 프로그래밍 계통은 변화가 너무 심하기 때문에 7년쯤 뒤에는 (수학이나 "순수" 컴퓨터 공학과 같은 "원론적인" 과목 이외에는) 대부분의 학과목과 자격증은 현재의 실제 업무와 거의 관계가 없다.

#5: 빨리 본론으로 들어가라
전통적인 이력서 형식에는 개발 담당자가 볼 때 필요하지 않은 정보가 많이 포함되어 있다. 예를 들면 요약 부분이 그런 정보이며 아마도 목표 부분도 그렇게 볼 수 있을 것이다.

사실 이력서보다 더 간단한 내용으로 프로그래밍 경력을 표현하는 요약을 쓸 수 있는 방법은 없다. 대부분의 요약 항목이 아무 쓸모없는 정보로 보이는 이유가 바로 그것이다. 예를 들어 주요 기능을 기록한 부분 앞에 붙어 있는 "10년 개발 경력의 노련한 프로그래머"라는 표현이 무슨 의미가 있겠는가? 고맙지만, 없으면 더 고맙겠다.

목표는 (항상은 아니지만) 쓸모 없는 경우가 많다. 전직하려는 경우라면 목표는 고용 담당자가 당신의 보유 기능과 경력을 기준으로 당신을 분류하지 못하게 하는 좋은 방법이 될 수 있다.

하지만 선임 개발자 자리로 옮기려고 하는 중급 프로그래머는 목표를 생략해도 무방하다. 소프트웨어 아키텍트나 DBA가 되려고 하는 선임 프로그래머는 목표를 밝혀야 한다. 따라서 요약 부분은 어떻게든 빼고 쓸모 있는 목표만 포함시켜 이력서를 보는 사람이 당신의 보유 기능을 가능한 한 빨리 볼 수 있게 하라.

#6: 서식을 주의 깊게 고려하라
이력서 서식은 중요하다. 고급 용지에 이력서를 인쇄하여 발송하던 시절은 오래 전에 지나갔지만 컴퓨터 화면으로 보든 종이로 된 문서이든 간에 이력서는 서식이 있어야 한다. 어쨌든 이력서를 쓰려면 상당한 균형 감각을 가져야 한다. 지금은 자신의 피카소 같은 감각을 과시하는 시대가 아니다.

원하는 자리가 시각적인 예술 감각과 관련이 있는 것이 아닌 한 그렇다. 지금은 가독성을 높여야 하는 시대이다. 가독성을 높이려면 더 큰 글꼴(10~12포인트)를 사용해야 하며 (문서 포맷에 글꼴이 내장되지 않는 한) 모든 컴퓨터에서 사용하는 글꼴이어야 함을 의미한다. 한 마디로 화면으로 보든 인쇄해서 보든 간에 보기 좋아야 한다.

추천할 만한 영문 글꼴은 Verdana, Arial, Tahoma, Calibri, Helvetica 등이다.

문서가 너무 빽빽해 보이지 않도록 여백을 충분히 두어야 한다. 그래야 보는 사람이 질리지 않는다. 반대로, 겨우 200단어를 여덟 페이지로 만들 정도로 공간을 낭비하지 말라.

물론, 파일 자체의 포맷은 중요하다. 필자의 경험으로는 사원 모집 담당자들의 99.9%는 접수된 이력서가 다른 포맷으로 되어 있으면 MS 워드 포맷의 이력서를 요구한다. 따라서 표준 .doc 포맷으로 문서를 만들어야 한다.

이력서가 자신을 상품으로 소개하는 주요 도구라는 사실을 항상 염두에 두어야 한다. 이력서를 보는 사람이 이력서에 담긴 정보를 이해하는 데 어려움이 있다면 그것이 기술적인 문제이든 가독성 문제이든 간에 그들은 즉시 다음 이력서로 넘어간다.

#7: 길이에 주의하라
문서 포맷에 관계 없이 아주 특별한 상황이 아닌 한 분량을 2~4페이지 정도로 제한하라. 단기 계약직으로 일하는 데 많은 시간을 보내는 사람들이라면 이력서가 비교적 길 것이며 막 구직 시장에 뛰어든 사람이라면 이력서가 짧을 것이다.

전반적으로 기존의 1페이지 분량의 이력서 서식 안에 자신의 기술적인 보유 기능과 하나 이상의 직장 경력을 적절하게 부각시키기는 어렵다. 2페이지는 중급 개발자나 선임 개발자를 기준으로 한 것이다.

하지만 4페이지 이상이면 이력서를 보는 사람의 눈이 침침해진다. 학력과 마찬가지로 7~8년 전에 가졌던 경력은 별 관계가 없지만, 고용 담당자는 담당한 책임이나 프로젝트 수준이 점점 높아지는 과정을 보고 싶어한다.

#8: 경력을 적절하게 정리하라
프로그래밍은 취업 경력 면에서 대부분의 분야와 차이가 있다. 우선, 많은 프로그래머들은 계약직이기 때문에 취업 경력은 줄줄이 이어지는 형태가 되기 마련이다. 뿐만 아니라 닷컴 불황이 지난 지 그렇게 오래 되지 않았으며, IT는 항상 파산, 인수, 합병이 많이 이루어지는 산업계였다.

문제는 고용 담당자는 단기직 경력이 길게 나열된 이력서를 좋아하지 않는다는 점이다. 이력서에 직책이 점점 높아지는 취업 경력이 쭉 이어지고 있다면 충성심이 없는 사람으로 보일 수 있다. 반면에 직무가 기본적으로 동일(하거나 점점 낮아)지는 것처럼 보인다면 실직자라는 느낌을 준다.

계속 단기직으로 일한 정당한 이유가 있다면 반드시 그 이유를 명확하게 밝히라. 예를 들어 계약직/컨설팅 직은 명확하게 표시하라.

#9: 이력서를 보는 사람에게 법적인 부담을 주지 마라
어떤 고용 담당자도 고용 과정에서 편파적이거나 차별 대우를 했다고 고발 당하는 것을 좋아하지 않는다. 그런 행동은 비윤리적일 뿐만 아니라 불법이다. 따라서 직무를 올바르게 수행하려고 애쓰고 있는 고용 담당자는 신청인에게 해서는 안되는 질문을 잘 알고 있다.

바꿔 말하면, 이력서를 내는 사람은 그런 내용을 이력서에 포함시켜서는 안된다. 고용 담당자가 알 필요가 없는 그 외의 개인적인 정보도 많다. 관련이 없는 내용을 이력서에 자세히 밝히면 고용 담당자는 겁을 먹고 수동적이 된다. 그런 구체적인 내용은 밝히지 말기 바란다.

#10: "튀는 사람이군!"
고등학교에서 튀는 행동으로 왕따를 당하는 것을 좋아하는 사람은 없다. 하지만 지금은 프로그래머로 일자리를 찾고 있는 중이다. 고용 담당자들은 "튀는 사람"을 "돈덩어리"로 본다. 따라서 그들에게 자신이 총명하며 프로그래밍을 사랑하고 끊임없이 성장하면서 새로운 아이디어를 배우고 탐구하는 사람임을 보여줄 수 있는 방법을 찾으라.

오픈소스 프로젝트에 참여하고 있거나 동네 아이들에게 프로그램을 가르치는 자원 봉사 활동을 하고 있다면 그런 취미 활동에 대해 이야기하라. 그런 정보를 통해 고용 담당자들은 당신이 퇴근 후에도 프로그래밍이나 컴퓨터를 다룰 만큼 그런 것을 좋아한다는 것을 알게 된다.

고용 담당자들이 이 문제를 보는 논리는 정말 단순하다. 현재 두 명의 후보자들이 거의 비슷한 수준이라면 내일은 열정이 있는 후보자가 업무를 "단순한 직업"으로 취급하는 후보자보다 훨씬 더 발전해 있기 마련이라는 것이다. @

onClick

onClick은 객체를 클릭했을때 이벤트를 발생합니다.

즉, onClick를 사용한곳에 마우스로 클릭을 해야만 이벤트가 실행되고


onmouseup

이것은 클릭 이벤트와는 조금 다릅니다.

객체를 마우스로 눌렀다가 놓을때 이벤트가 발생하는데

클릭이벤트와 유사하지만 객체에 포커스가

있는 상태에서 마우스 오른쪽 왼쪽 구분이없이 눌렀다 놓으면 이벤트가 발생합니다.


onmousedown

마우스로 누르는 순간 이벤트가 발생합니다.

즉, onmouseup은 마우스를 눌렀나 놓을때이고 onmousedown은 마우스를 누를때 발생합니다.

이것 또한 마우스 오른쪽 왼쪽 구분없이 객체에 포커스가 있는 상태에서 마우스를

누르면 양쪽 모두에서 이벤트 발생합니다.


onkeydown  /onKeyUp

키보드를 조작하므로써 이벤트를 발생하는데요

onkeydown은 키보드의 키를 누를때 이벤트를 발생시킵니다.


즉, 키를 눌렀다 놓을때가 아닌 키를 눌렀을때 이벤트를 발생하느데 바로

그 순간에만 이벤트를 처리하고(키를 누르고 있더라도 한번만 발생)

onkeyup은 키보드의 키를 뗄때 이벤트를 발생시킵니다.



onkeypress

는 위에 onkeydown과 비슷하지만 키를 누르고 있더라도 한번만 이벤트를 발생하는 것이

아니라 누르고 있는 순간에도 계속해서 이벤트를 반복 수행 합니다.

예를 들어 텍스트 박스에 글을 쓸때 동일키를 계속해서 눌러야할경우가 있을때

onkeypress를 사용했다면 키를 누르고 있는동안 이벤트가 반복되어 짜증이 나겠지요!!

<!------ 아래의 코드를 HEAD 부분에 복사해 넣으세요 -------------->

<script>
function clearText(y){
if (y.defaultValue==y.value)
y.value = ""
}
</script>



<!------ 아래의 방식으로 BODY 부분에  붙여 넣으세요 ------------->

<B>텍스트 상자에 마우스를 클릭하면 초기문자열이 없어집니다</B>

<form>
<input type="text" value="아이디를 입력 해 주세요" onFocus="clearText(this)">
<input type=submit>
</form>
아주 간단한 팁입니다..
아무리 찾아봐도 나오질 않아 처음으로 팁을 올려보네요..
직거래 게시판으로 쓰면 여러 형태로 가격을 입력하는데 특정문자를 제한하고 숫자만 입력 받아
자동으로 1,000 과 같이 천단위로  ,(콤마) 표시를 해줍니다.


사용자 삽입 이미지

1) 가격 천단위 , 표시하기

현재 애견호텔 서비스 스킨에 적용된 가격 변수에 아래와 같이 number_format() 함수를
적용하면 숫자 입력시 자동으로 , 가 표시 됩니다.
view.php list_main 등에 적용하면 되겠죠?

$price1= number_format($subject6);


2) 특수문자 입력 제한

하지만 사용자가 임의로 1,000  콤마를 추가하여 입력하면 가격표시가 1로 나타나게 되기 때문에
숫자 입력만을 요구 해야합니다.

따라서 write.php 에 아래와 같이 함수를 추가해 주고  

<script>
<!--
function price_check() {
       var i
       var price_reg = '<>?/\\+=-_)(*&^%$#@!.,;:\{\}[]\"\'\`\~\|'
       regstr = price_reg
          var regid = write.subject6
               if (regstr.length > 1) {
               for(i=0;i<regid.value.length;i++) {
                       if(regstr.indexOf(regid.value.substring(i,i+1)) >=0) {
                               alert('가격은 숫자만 입력하세요!');
                               regid.value = ''
                               regid.focus();
                               return false;
                       }
               }
       }
             
}
// -->
</script>

해당 input 입력창에 아래와 같이 onBlur="price_check();" 를 추가해주면 됩니다..

<input type=text name=subject6 value="<?=$subject6?>" <?=size(30)?> maxlength='10' style=width:100  class=input onBlur="price_check();"> 원 </td>

----------------------------------------------------------------------------------
숫자만 들어가게 하는 또 다른 방법...

function onlynum(e) {
if (e.keyCode == 13) {
return;
}
if (e.keyCode < 48 || e.keyCode > 57)
e.returnValue = false;
}

위 함수를 적절한곳에 넣어 주시고,

input 폼 안에 아래 항목을 추가해주세요.

onkeypress="onlynum(event)" style="ime-mode:disabled"

<script type="text/JavaScript">
// Internet Explorer에서 셀렉트박스와 레이어가 겹칠시 레이어가 셀렉트 박스 뒤로 숨는 현상을 해결하는 함수
// 레이어가 셀렉트 박스를 침범하면 셀렉트 박스를 hidden 시킴
// 사용법 :
// <div id=LayerID style="display:none; " onpropertychange="selectbox_hidden('LayerID')">
function selectbox_hidden(layer_id)
{
  var ly = eval(layer_id);

  // 레이어 좌표
  var ly_left  = ly.offsetLeft;
  var ly_top    = ly.offsetTop;
  var ly_right  = ly.offsetLeft + ly.offsetWidth;
  var ly_bottom = ly.offsetTop + ly.offsetHeight;

  // 셀렉트박스의 좌표
  var el;
  for (i=0; i<document.forms.length; i++) {
    for (k=0; k<document.forms[i].length; k++) {
      el = document.forms[i].elements[k];
      if (el.type == "select-one") {
        var el_left = el_top = 0;
        var obj = el;
        if (obj.offsetParent) {
            while (obj.offsetParent) {
              el_left += obj.offsetLeft;
              el_top  += obj.offsetTop;
              obj = obj.offsetParent;
            }
        }
        el_left += el.clientLeft;
        el_top += el.clientTop;
        el_right = el_left + el.clientWidth;
        el_bottom = el_top + el.clientHeight;

        // 좌표를 따져 레이어가 셀렉트 박스를 침범했으면 셀렉트 박스를 hidden 시킴
        if ( (el_left >= ly_left && el_top >= ly_top && el_left <= ly_right && el_top <= ly_bottom) ||
            (el_right >= ly_left && el_right <= ly_right && el_top >= ly_top && el_top <= ly_bottom) ||
            (el_left >= ly_left && el_bottom >= ly_top && el_right <= ly_right && el_bottom <= ly_bottom) ||
            (el_left >= ly_left && el_left <= ly_right && el_bottom >= ly_top && el_bottom <= ly_bottom) )
            el.style.visibility = 'hidden';
      }
    }
  }
}

// 감추어진 셀렉트 박스를 모두 보이게 함
function selectbox_visible()
{
  for (i=0; i<document.forms.length; i++) {
    for (k=0; k<document.forms[i].length; k++) {
      el = document.forms[i].elements[k];
      if (el.type == "select-one" && el.style.visibility == 'hidden')
          el.style.visibility = 'visible';
    }
  }
}

function partAction(arg)
{
  if (arg == "") {
    document.all['poll'].style.display = "none";
  }
  else {
    document.all['poll'].style.display = "block";
  }
}
</script>

<body onLoad="selectbox_hidden('poll')">
<form>
<div id="poll" style="display:block;">
....
</div>
<select>
<option>아파트</option>
</select>
</form>
</body>

devedit (아주 다양항 기능. 상당히 괜찮은......)
홈페이지 http://www.interspire.com/devedit/
데모 http://www.interspire.com/devedit/demo.php

CHEditor (쓸만한데 설치 하는데 좀 막히는 부분이 있다.)
홈페이지 http://www.chcode.com
데모 http://www.chcode.com/cheditor/demo.html

WebEditor V 1.53 Build 41 (마우스 오른쪽으로 테이블, 이미지등 편집 가능. 쓸만하다.)
홈페이지 http://mytnt.co.kr/
데모 http://mytnt.dnip.net:8080/develop/?p=preview (늦게 뜨면 아래 링크 사용)
데모 http://web.gso.co.kr/~sea88/bbs/WebEditor/example.html

basic (쓸만함 HTMLarea와 비슷하다.)
홈페이지 http://www.basic.pe.kr/
데모 http://www.basic.pe.kr/bbs/zboard.php?id=basic_board (자게 글쓰기 클릭)
데모 http://web.gso.co.kr/~sea88/bbs/zboard.php?id=community (우리집 게시판중에 수정해서 쓰고있음. 글쓰기 클릭)

FCKeditor (걍 그저 그렇습니다. 근데 글자 색은 바꿀수 없는거야?)
홈페이지 http://sourceforge.net/projects/fckeditor
데모 : http://www.fredck.com/FCKeditor/Demo/

HTMLarea (가장 많이 쓰는것 같습니다. 쓸만함. htmlarea 3.0 버전은 모질라에서도 익스랑 똑같이 작동 한답니다.)
홈페이지 http://sourceforge.net/projects/itools-htmlarea
데모 : http://www.interactivetools.com/products/htmlarea/index.html#demo

SPAW (보기는 좋지만...엄청 늦게 떠서 탈....약간 비추.)
홈페이지 http://sourceforge.net/projects/spaw/
데모 : http://www.solmetra.com/spaw/demo/demo.php

hypertextare (버튼이 묵직한것이...아마고쳐 써야 할듯...에러의 압박. 비추비추)
홈페이지 http://sourceforge.net/projects/hypertextarea
데모 : http://www.muckum.de/ht

RichText-editor (그저 그렇다. 비추비추비추)
홈페니지 http://sourceforge.net/projects/richtext
데모 : http://richtext.sourceforge.net

aynHTML (소스 보기 하니 컬러로 나옵띠다. ;; 따운 받는데가 어딘지...)
홈페이지 http://sourceforge.net/projects/aynhtml
데모 : http://www.aine.be/aynhtml

web-based WYSIWYG HTML editor (아직 안써봤는데 스샷으로 대신...)
스샷,다운 http://www.unica.edu/uicfreesoft/wysiwyg_web_edit/info_wysiwyg_web_edit_eng.html

RichTextBox™ v2.0
홈페이지 http://richtextbox.com/Default.aspx
데모 http://richtextbox.com/richtextbox/demos/0/

XsDhtmlEdito (이건 안써봐서 모름)
홈페이지 http://sourceforge.net/projects/xsdheditor
데모 없음

bpEditor (이것도 안써봤는데....)
홈페이지 http://sourceforge.net/projects/bpeditor

긴박한 상황에서의 유머

한광일 한국웃음센터 원장

마르크스의 공상의 나라에서 대통령이 되었다. 그때 인접 국가와 전쟁이 일어났다. 일선에서는 참호를 파는 등 전투 준비에 여념이 없었다.
우선 어떻게 참호를 만들어야 할 것인가 하고 대통령의 지시를 기다렸는데, 그 부분부터 마르크스 형제의 개그다움을 엿볼 수 있다.
“잘 만들어진 참호를 사다가 설치하라!”
탱크나 대포라면 몰라도 구멍과 같은 공간을 사오라고 하는 발상 자체부터가 매우 우습기 짝이 없다.
그러자 부하도 어지간한 사람이었는지 또다시 묻는다.
“어떤 형태의 참호가 좋겠습니까?”
그 말을 듣고 잠시 생각하던 대통령이 무릎을 탁 치며,
“사람의 목 높이 정도 되는 것으로 하라. 그렇게 되면 총이 없어도 되잖나.”
하고 말하자 모든 사람들이 어리둥절했다.
그러자 대통령은 또 자랑스럽게 새로운 아이디어를 내놓는다.
“머리까지 쑥 들어가는 참호면 더욱 좋아. 그러면 병사가 필요 없으니까!”
이런 엉뚱한 발상에서 나타나는 재미라고나 할까. 구멍 속에 들어가면 총이나 사람이 적에게 보이지 않으므로 차라리 필요가 없다고 하는 것이다.
아무튼 있는 것처럼 보이게 하고도 생략하는 경우가 허다하다.
우리가 웃는 사람에 우리들 마음속에 도사리고 있는 어떤 불순한 생각을 들킨 것 같은 쑥스러움마저 느끼게 하는 개그다.

직장에서 웃음을 유발하는 방법

한광일 한국웃음센터 원장

의도적이라도 아침에 만나면 악수, 포옹, 하이파이브, 등쳐주기, 안마하기, 어깨 주물러주기 등의 적당한 스킨십과 덕담 한 마디, 직원 회의시간에 개인기, 퀴즈, 유머 한 마디씩 의무적으로 하는 것도 웃음을 연출하는 방법이 될 수 있다.
크게 웃으면 상체는 물론 위장, 가슴, 근육, 심장까지 움직이게 만들어 상당한 운동효과가 있다. 따라서 웃을 때는 배꼽을 잡고 크게 웃는 게 좋다.

직장에서는 웃음 운동을 생활화해 보자.

월요일은 월래부터 웃고, 화요일에는 화사하게 화가 나도 웃고 화장실에서도 웃고, 수요일은 수수하게 웃고, 목요일은 목터져라 목숨 걸고 목젖이 보이도록 웃고, 금요일은 금방 웃고 또 웃고, 토요일은 토하도록 토실토실 웃고, 일요일은 일 없이 웃고 일찍 일어나서 웃어보라.

▣ 미스 미스터 엉덩이

준비물 - 동전 2개
- 각 팀 1명씩 앞으로 나오게 하여 1대 1로 서로의 발꿈치를 바짝붙여 등지어 서 있게 한다. 그리고 양 선수의 발앞에 동전 1개씩 놓아 리더의 구령소리와 함께 잽싸게 엎드려 집도록 한다.
- 먼저 집는 사람이 승리하게 되지만 서로가 동작을 취하다 보면 동전은 잡히지 않고 엉덩이끼리 부딪쳐 앞으로 밀리게 되는데 보는 사람들이 더 즐거워한다.
* 동성은 물론 이성끼리 시합을 해보는 것도 재미있다.  

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 불러라  (0) 2007.12.02
▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 불러라

준비물 - 기타
- 각 팀별로 '노래 불러라'의 노래에 맞추어 게임을 하는 것으로 리더가 임의의 술래 A팀을 정하여 '울어라' 라고 한다.
- 그러면 이때 A팀을 제외한 모든 팀들은 '불러라'의 노래를 '울어라'로 가사를 바꾸어 불러준다. 즉 '울어라 울어라 엉엉울어라.........'라고 노래를  불러주고 A팀은 실제로 우는 표정과 몸짓을 해야 한다.
- '울어라'의 노래가 끝나면 A팀의 팀장은 다른 팀을 손짓으로 '울어라', '돌아라', '맞아라', '양말 벗어라' 등의 말을 하나씩만 만들어 지적하면 된다.
- 계속 이와 같은 식으로 지적 당한 팀이 제스츄어를 하고 또 다른 팀을 지적하는 방법으로 하면 된다

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 미스 미스터 엉덩이  (0) 2007.12.02
▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 개미떼 풍선터트리기

준비물 - 풍선 50개, 실,분필
- 각 팀에서 5명씩 출전하여 전체 선수들이 리더가 미리 그려 놓은 원안에서 자기 왼쪽발목에 풍선을 실로 묶고 다른 팀의 풍선을 발로 밟아 터트리는 게임이다.
- 게임도중에 자기풍선이 터지면 탈락이고 마지막까지 남은 사람의 수가 가장 많은 팀이 승리하는 것이다.

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 미스 미스터 엉덩이  (0) 2007.12.02
▣ 불러라  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 촛불들고 달리기

준비물 - 양초 10개, 성냥
- 각 팀별로 1명식 출발선상에 나와 불붙은 양초를 들고 목표물을 빨리돌아오는 게임으로 계속 자기 팀에게 양초를 릴레이하여 가장 빨리 끝난 팀이 승리하게 된다.
- 만약 촛불이 꺼지면 다시 출발선상으로 와서 불을 붙이고 출발한다. 촛불이 꺼지지 않게 하기 위해서 손바닥으로 가려도 된다.

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 불러라  (0) 2007.12.02
▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 우리팀의 I Q  (0) 2007.12.02

+ Recent posts