잊지 않겠습니다.

http://www.okjsp.pe.kr/seq/140133

jQuery의 경우 내가 이번년도에 본 내용중에서 가장 쇼킹한 녀석이였는데...
강의마저 나를 쇼킹하게 만들고 있다. -_-
Posted by Y2K
,

 



6 블록 이상의 테이블에 적용하라.
  오라클 데이터베이스에서 1개의 블록크기는 init<SID>.ora 파일에 정의되어 있는 DB_BLOCK_SIZE 파라메터의 값에 의해 결정됩니다. 만약 이 파라메터의 값이 8K (8192 byte)라면 9152 BYTE (8k X 6 블록) 이상 되는 크기의 테이블일 때 인덱스를 사용하는 것이 좋습니다. 다시 말하면, 테이블의 크기가 작은 경우라면 인덱스를 사용하지 않는 것이 더 효과적인 방법입니다. 

이유는 "PARALLEL OPTION"에서 소개된 것 처럼 전체 테이블 스캔인 경우 빠른 검색을 위해 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터가 제공되고 이 파라메터에 의해 한 번에 읽을 수 있는 데이터 블록의 크기가 결정되기 때문에 테이블의 크기가 작은 경우에는 테이블 전체 스캔이 더 유리할 수 있습니다.

다른 예를 한가지 들어 보겠습니다. 만약, 2페이지 밖에 되지 않는 한 권의 책이 있다고 가정해 보겠습니다. 인덱스라는 타이틀이 설명되어 있는 페이지를 찾으려고 합니다.

첫 번째 방법은 먼저 목차를 검색하여 원하는 페이지를 찾은 다음 해당 페이지로 이동하는 방법입니다. 두 번째 방법은 직접 2 페이지를 검색하여 찾는 방법입니다. 한 권의 책을 테이블이라고 생각해 봅시다. 테이블의 크기가 작은 경우에는 인덱스를 찾고 해당 페이지를 검색하는 것이 직접 페이지를 검색하는 것 보다 빠르지 않을 수도 있습니다. 즉, 테이블의 크기가 6블록 이하(크기가 작음)인 경우에는 테이블 전체스캔이 더 빠를 수 있습니다.

컬럼의 분포도가 10 ~ 15% 이내인 경우
  분포도란 WHERE 조건절을 만족하는 행수가 테이블의 전체 행수에서 차지하는 비율을 의미합니다. 다음 공식을 참조하십시오.

 
  분포도 = ( 조건을 만족하는 행수 / 전체행수 ) X 100
   
  즉, 테이블에 100개의 행이 있고 WHERE 조건절을 만족하는 행수가 10개일 때 분포도는 10%가 됩니다. 인덱스를 통해 데이터를 빠르게 검색하는 메커니즘은 10 ~ 15% 의 분포도가 좋은 컬럼에 보다 빠르게 데이터를 찾아줍니다.

분포가 범위 이내라고 하더라도 절대량이 많은 경우에는 해쉬 클러스트를 검토하라.
  데이터를 검색하는 방법 중에 인덱스를 통한 검색방법으로 좋은 성능이 기대되지 않을 때 사용되는 검색기법이 클러스트를 이용한 방법입니다. 인덱스의 구조적 문제로 인해 더 이상의 성능향상이 기대되지 못한다면 클러스트 기법을 고려해야 합니다.

분포도가 범위이상 이더라도 부분범위의 검색이 가능하다면 인덱스를 사용하라.
  테이블의 데이터 분포를 살펴보면 매우 다양합니다. 컬럼의 값들이 골고루 좋은 분포를 보이는 테이블, 컬럼의 어떤 값은 좋은 분포도를 보이지만 어떤 값은 분포도가 너무 나쁜 경우의 테이블 등 매우 다양합니다. 모든 조건이 좋은 경우에는 별 문제가 없겠지만, 좋은 조건과 나쁜 조건이 같이 저장되어 있는 경우에는 분포도는 나쁘더라도 인덱스를 사용하는 것이 유리합니다. 

이런 경우에는, 분포도가 좋은 컬럼은 인덱스를 통해 검색하게 하고, 분포도가 나쁜 컬럼은 테이블 전체 스캔방법으로 검색하게 하는 실행계획을 결정하면 됩니다.

 
SQL > CREATE INDEX i_big_emp_deptno ON big_emp (deptno)
SQL > SET AUTOTRACE ON
SQL > SELECT empno, ename FROM big_emp
WHERE deptno = 80;    분포도가 좋은 컬럼은 인텍스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > SELECT /*+FULL(big_emp)*/
 

empno, ename

  FROM big_emp
  WHERE deptno = 10;     분포도가 나쁜 컬럼은 전체 인덱스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP'

인덱스 만을 검색할 수 있다면 분포도가 나쁘더라도 인덱스를 생성하라.
  인덱스를 통해 데이터를 검색하는 방법에는 2가지가 있습니다. 첫 번째 방법은 인덱스를 먼저 검색한 후 테이블로부터 조건을 만족하는 행을 검색하는 방법입니다. 다음 예제를 보십시오.

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
Select절에 열거된 컬럼들을 index에 존재하지 않기 때문에 인덱스 검색후 테이블로부터 해당 컬럼을 검색해야 함니다.
 
이번 예제도 인덱스를 통해 검색하는 방법입니다. 하지만 조금전에 실행된 SQL문과 차이점은 개발자가 실행한 SQL문의 SELECT절에 정의된 컬럼이 검색하려는 인덱스에 존재하기 때문에 인덱스만 검색하면 조건을 만족하는 행을 모두 찾게 되는 경우입니다. 
이러한 검색 방법을 빠른 인덱스 스캔(Fast Index Scan) 이라고 합니다. 

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > DROP INDEX i_big_emp_depton;

https://www.dbguide.net/dbqa/oracle_tune/common/detail1-2.html 에서 무단으로 긁어오기..
언제나 느끼는 것이지만.. 아는 것이 없다. 난. -_-
Posted by Y2K
,
Using Powershell, You cannot use get-credential without some type of user-prompt. 

But! 
I found the method without user-prompt window!!

Here is my code
function Get-PSCredential
{
    param($userName, $password)    
    $secured_password = ConvertTo-SecureString $password -AsPlainText -Force
    New-object Management.Automation.PSCredential($userName, $secured_password)    
}

$cred = Get-PSCredential -userName "Administrator" -password "abcdefghijk"


Posted by Y2K
,
회사에서 난생처음 linux에서의 web 작업을 하는 도중에 php를 사용하면 더 편할 것 같은 예감이 들어서, php로 뚝딱뚝딱. 

linux의 언어설정은 unicode로 되어있고, php의 언어설정은 되어있지 않아서, 한글이 깨지는 문제가 계속해서 발생해서 조금 고생한 듯. 기종간 최고의 문제는 역시 언어설정인것을 다시 한번 느끼게 되었다. 

#메일 보내기
<?
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}

function customer_sendmail($email_str, $userName, $subject, $message)
{
    mb_internal_encoding('EUC-KR'); 

    $from_name = $userName;
    $from_name = encode_2047(iconv("UTF-8","EUC-KR",$from_name));

    $subject = iconv("UTF-8","EUC-KR",$subject);
    $message = iconv("UTF-8","EUC-KR",$message);

    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'X-Mailer: PHP' . "\r\n";
    $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
    $headers .= 'From: '.$from_name.' < test@smtp.co.kr >'. "\r\n";

    // 메일 보내기
    $result = mb_send_mail($email_str, $subject, $message, $headers) ;
    return $result; 
}

// 멋진 코드. Post로 보내진 모든 데이터를 $Name 형태로 모두 만들어준다. 
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

$to = "to@smpt.co.kr";
$subject = "[코로케이션] 시스템 무료 점검 신청_" . $companyName;

$body="
====================================
* 회사 이름 : $companyName
* 사용자 이름 : $userName
* 연락처 : $phoneNumber1-$phoneNumber2-$phoneNumber3
* 운영체제(os) 버젼 : $osVersion
* DB 버젼 : $dbVersion
* 서버 용도 : $useService
* 기타 점검 요청 사항 : $etc   
=====================================
";
customer_sendmail($to, $userName, $subject,$body);
?>


#메일 & 첨부파일 보내기
<?php
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

if($_SERVER['REQUEST_METHOD']=="POST"){
mb_internal_encoding('EUC-KR'); 
  $to = "to@smtp.co.kr";
  $subject=encode_2047(iconv("UTF-8","EUC-KR","[코로케이션]시스템 무료 점검 사전정보_".$companyName));
$from = iconv("UTF-8","EUC-KR",$companyName);
  $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
  // 파일 이름 얻어오기. 넘기는 페이지의 input="file"의 name 속성으로 넘엉
  $tmp_name = $_FILES['filename']['tmp_name'];
  $type = $_FILES['filename']['type'];
  $name = $_FILES['filename']['name'];
  $size = $_FILES['filename']['size'];

  $headers = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'X-Mailer: PHP' . "\r\n";
  $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
  $headers .= 'From: '.$from."<test@smtp.co.kr>\r\n";
$engineer = "아니오";
if($rdEngineer == "true") {
$engineer = "예";
}
$protect = "아니오";
if($rdProtect == "true") {
$protect = "예";
}
$duplication = "아니오";
if($rdDuplication == "true") {
$duplication = "예";
}
$backup = "아니오";
if($rdBackup == "true") {
$backup = "예";
}
$message = "";
if($rdEngineer == "true") {
 $message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
else {
$message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
- 서버 관리 : $noEngineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
$message = iconv("UTF-8","EUC-KR",$message);
if (file_exists($tmp_name)){
if(is_uploaded_file($tmp_name)){
$file = fopen($tmp_name,'rb');
$data = fread($file,filesize($tmp_name));
fclose($file);
$data = chunk_split(base64_encode($data));
    }
$headers = "From: $from\r\n" .
         "MIME-Version: 1.0\r\n" .
         "Content-Type: multipart/mixed;\r\n" .
         " boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" .
         "--{$mime_boundary}\n" .
         "Content-Type: text/html; charset='ks_c_5601-1987'\n\n" .
         $message . "\n\n";
$message .= "--{$mime_boundary}\n" .
         "Content-Type: {$type};\n" .
         " name=\"{$name}\"\n" .
         //"Content-Disposition: attachment;\n" .
         //" filename=\"{$fileatt_name}\"\n" .
         "Content-Transfer-Encoding: base64\n\n" .
         $data . "\n\n" .
         "--{$mime_boundary}--\n";
}
mail($to, $subject, $message, $headers);
}
?>

php를 사용하건, ruby를 사용하건, 어떤 언어를 사용하더라도...
가장 중요한 것은 일단 해보자라는 용기?? ^^


Posted by Y2K
,
http://www.neuroticweb.com/recursos/css-rounded-box/index.php?color=A9B8CF&fondo=e4ecec

http://www.ajaxload.info/ 에 이은 source 및 gif generator 소스가 잘 되어있는 사이트.
이런 멋진 컨셉으로 만들 수 있는 날은 언제쯤 도달할 수 있을지.;

개발자의 길은 멀고도 험하다. 정말. -_-;;
Posted by Y2K
,
Kent Beck의 두개의 모자.
개발하기 위해 리팩토링을 사용할 때, 두가지 구별된 작업(기능 추가와 리팩토링)을 위해 시간을 나눠야지 된다. 기능을 추가할 때는 기존 코드를 건드려서는 안되고 단지 새로운 기능을 추가해야지 된다. 테스트를 추가하고, 테스트가 잘 동작하는지를 확인함으로써 진행상황을 알수 있다. 리팩토링을 할 때는 기능을 추가해서는 안되고, 단지 코드의 구조에만 신경 써야 한다. 그리고 어떤 테스트도 추가하지 않는다. 단지 인터페이스가 변하여 작업을 계속하기 위해서 어쩔 수 없는 경우에만 테스트를 수정 한다. 작업을 할때.. 자신이 어떤 모자를 쓰고 있는지를 알고 있어야지 된다. 


가장 어려운 이야기인듯.; 
기능을 추가하다보면, 이 기능이 추가될때, 구조를 변경시켜야지 될 때가 있을때.. 계속해서 모자를 바꿔쓰면서 나중에는 어떤 모자를 쓰고 있는지를 헛갈릴때가 많은 것 같은데...

좀더 어떤 일을 하고 있는지에 대한 자신에게 명확히 하는 것이 좋을듯. 쉬워보이는 말이지만 매우매우 어려운 이야기.
Posted by Y2K
,
소스보면서 역시 긁적긁적.

<!DOCTYPE html>
<html>
<head>
  <link type="text/css" href="http://jqueryui.com/latest/themes/base/ui.all.css" rel="stylesheet" />
  <script type="text/javascript" src="http://jqueryui.com/latest/jquery-1.3.2.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.draggable.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.resizable.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.dialog.js"></script>
  <script type="text/javascript">
  /*
  $(document).ready(function(){
    $("#dialog1").dialog({
        modal:true,
        open:function() {
            $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").remove();           
        }
    });   
  }); 
  */
  $(function() {
      $("#clickMe").click(
          function(){
          $("#dialog1").dialog({modal:true,
              open:function() {
                $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").hide();// .remove();           
              },
              width:300
          });
          });   
  });
 
 
 
  </script>
</head>
<body style="font-size:62.5%;">

<div id="button">
    <a href="#" id="clickMe">Click Me</a>
</div>

<div id="dialog1" title="SYNCmail" style="display:none;text-align:center">   
    <img src="ajax-loader.gif"/><br/>
    잠시만 기다려주세요.
</div>

</body>
</html>

신기한 내용이 너무나 많음.;
Posted by Y2K
,
회사에서 디자이너분이 필요하다고 해서 예제 간단히 뚝딱뚝딱.

<html>
<head>
<script src="jquery-1.2.6.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" language="javascript">
$(function(){
$('#clickMe1').click(function(){
$('#info').load('load.html #movie', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).attr("src", 'images\\00buy_05.gif');
$('#clickMe2').attr("src", "images\\00buy_19.gif");
});
$('#clickMe2').click(function() {
$('#info').load('load.html #music', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).attr("src", 'images\\00buy_21.gif');
$('#clickMe1').attr("src", "images\\00buy_03.gif");
});
$('#clickMe3').click(function(){
$('#info').load('load.html #poem', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).html("Changed Text");
});
});
</script>
<script type="text/javascript" language="javascript">
function show_alert(){
alert('show');
}
</script>
</head>

<body>
<img id="clickMe1" src="images\00buy_03.gif" onclick="javascript:show_alert();"/>
<img id="clickMe2" src="images\00buy_19.gif"/>
<a href="#" id="clickMe3">Click Me3</a>
<div id="info">
<div id="context">
</div>
</div>
</body>
</html>

재미있기도 하고, 너무나 동작하는 것이 신기한 jquery. ^^
Posted by Y2K
,
DBCC DBREINDEX('Table이름');

을 이용해서 Index를 Rebuild 시키면 된다. 

DB를 Off-line 또는 사용하지 않는 상태에서 하는 것이 원활하며, 많은 시간을 잡아먹게 된다. (DB의 Index의 조각화가 심할 경우에..)
Posted by Y2K
,
web 표준에 대한 관심이 많아지고 있는 때이기도 하고, 무엇보다도 jquery 등 표준화된 Framework를 사용할 때에 기존의 table code의 경우에는 사용에 많은 제약 사항을 가지게 된다. 

무엇보다도 table의 <tr>, <td>로 묶여있는 안에서 <div> 등으로 다시 묶어주는 그야말로 엉망인 일을 해야지 되기 때문에 좀더 정형화되고 표준화된 web code의 필요성은 절대적으로 필요하게 된다. 

불행히도... 디자이너들중에서 css나 웹표준을 사용해서 디자인을 하시는 분들이 아직까지 많지 않은 현실에서 개발자가 요구사항을 충족하기 위해서 css를 공부해서 변경을 시켜야지 되는 일이 빈번하게 이루어지고 있다. -_-;; (나도 그중 하나. -_-)

공부도 할겸, 기존의 코드보다 뛰어나다는 것을 증명하고 싶어서 아직 디자인중인 코드를 정말로 몸으로 부딛혀서 만들어봤다. 조금 아는 것은 margin, padding, float 정도밖에 없는 상태에서 수많은 삽질과 삽질을 하면서. --;;

1. table에서의 cellspacing, cellpadding의 변경
table에서 옆의 table과 정확한 수평을 유지하고 원하는 디자인을 만들기위해서 cellspacing과 cellpading을 사용한다. 이 부분의 경우에는 간단하게 padding과 margin의 속성을 설정해주는 것으로 해결할 수 있다. 

2. 모든 browser를 다 맞추기에는 힘들다.
IE, FIrefox, crome 3개의 browser에서 모두 테스트를 하면서 맞추어보고 있었는데.. 
솔찍히 IE에서 너무나 안맞는다. -_-;
그나마 괜찮다는 IE 7에서조차 이런데. 다른 사람들이 저주하는 IE 6에서는 도대체 어떤 일들이 벌어지고 있는지 감조차 오지 않는다. 

이럴때 주로 사용하게 되는 것이 CSS Hack. 
표준을 어기게 되는 코드이지만, 어쩔수없는 선택으로 사용하게 되는 것 같다. 

<!--[if IE]>
<style type="text/css" rel="stylesheet">
.header_left_menu img
{
    border:0px none;
    margin:0px;
    margin-top:-1px;
}
</style>
<![endif]-->

3. 먼저 page에 대한 그림을 그리자.
무턱대로 코드부터 시작하는 것이 아닌, page의 layout이 어떤 모양으로 되어있는지 그림을 그려보고, div로 묶는 것을 그림으로부터 시작하는 것이 빠르다. 그리고, 큰 그림에서 시작해서 작은 그림으로 넘어가게 되면 은근히 간단하게 바뀌게 된다. 


4. 검증을 확실히 하자.
웹표준에 맞추기 위해서 코딩을 바꾸는것은 좋지만, 자신이 보는 브라우져에서만 보게 되면 십중 팔구 큰 문제가 생기게 된다. 모든 브라우져에서 한번 보면서 문제가 어느곳에서 생긴것인지를 찾는 노력이 필요하다. 


Posted by Y2K
,