Home avatar

Deokgon Kim

맥북 프로 사용 소감( 2013. 03. ~ 현재 )

13인치 맥북 프로(Late 2012) 사용자입니다.

OS는 linux, mac osx, windows 정도 사용하지만, 개인 취향으로 linux, mac osx의 unix 쉘이 편합니다.

하드웨어 부분.

재질에서 무게를 느낍니다. 기존에 사용하던 ibm r시리즈 보다는 가볍습니다. (아이폰도 삼성폰보다는 크기에 비해 무겁다고 느낍니다.)

배터리는 아직 1년 이내라 확실하지는 않은데, 예전에는 항상 전원을 넣어서 사용하다 보니 방전이 빨리 되어버렸고, 현재 맥북은 방전 충전 신경 쓰며 사용중입니다. 어느 정도 오래 간다고 생각합니다.(오래가주길 바랍니다.) (thinkpad r시리즈는 지하철이나 버스 등 외부에서 꺼내서 사용할 물건은 아니지요.)

비밀번호의 진화

비밀번호의 진화과정을 한번 정리해 봅니다.

비밀번호를 시스템에 저장하는 형태의 변천을 알아봅니다.

근래에도 아직 소규모 조직에서는 사용하는 방법입니다. RDBMS에 아이디, 비밀번호 컬럼을 두거나, 일반 텍스트 파일에 아이디, 비밀번호를 저장하는 형태입니다.

이 경우는 보안 대책으로는 해당 DB나 비밀번호 파일에 대한 접근 권한을 제어하는 정도로만 관리하였습니다.

오래된 버전의 UNIX에서는 현재도 볼 수 있습니다. UNIX에서는 기본적으로 crypt라는 비밀번호 암호화 함수를 제공하였습니다. 참고 Crypt_(UNIX) crypt함수는 비밀번호의 길이가 8자리로 제한이 있으며, passwd파일에 저장된 경우, 파일이 유출되면 쉽게 패스워드를 찾아낼 수 있습니다. 물론, passwd파일은 OS에서 일반 사용자가 내용을 볼 수 있게 되어 있습니다. ( 추후, shadow파일로 비밀번호를 따로 저장하는 강화 방법이 나왔습니다. ) 간단히, a-z0-9{8}조합으로 짧은 시간에 알아낼 수 있겠습니다. 참고 brute force 공격 물론, 영대소문자, 특수문자를 조합하면 조금 더 걸리긴 하겠지만, 8자리 이하에서는 요즘 시스템으로 얼마 안걸립니다.

vim 간략 노트 base64 파일 다루기편

메일에서 많이 사용되는 인코딩 방식으로 base64가 있습니다.

base64인코딩을 openssl과 같이 사용하면서 발생했던 문제에 대하여 vim을 통해 간단히 작업한 내용을 메모해 둡니다.

메일을 받아보면 아래와 같은 base64 인코딩 영역이 있습니다.

Content-Type: text/html; charset=euc-kr
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i
dGV4dC9odG1sOyBjaGFyc2V0PWV1Yy1rciI+DQo8dGl0bGU+vsiz58fPvLy/5C4gvcXH0cSrteXA
1LTPtNkuPC90aXRsZT4NCjwvaGVhZD4NCiANCjxib2R5Pg0KPCEtLUhlYWRlciBTdGFydCAtLT4N
Cjx0YWJsZSB3aWR0aD0iNzAwIiBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5n
PSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9ImJhY2tncm91bmQ6dXJsKGh0dHA6Ly9jYXJkaW1h
Z2Uuc2hpbmhhbmNhcmQuY29tL2ltZy9lbWFpbC9jb21tb24vMjAxMTExL2JnX0hlYWRlcl9iYXNp

위 내용은 줄바꿈문자를 있는 그대로 붙여 넣은 것입니다.

gcc로 몇가지 연습 -c -S -E

gcc로 c언어 컴파일을 몇 가지 실습해 보았습니다.

gcc 명령에 -c 옵션을 주면, .c파일을 컴파일만하고 링크를 하지 않습니다. 결과물로는 .o 파일이 생성됩니다.

test.c 파일

int test(int a, int b) {
    return a + b;
}

int main(int argc, char* argv[]) {
    test(3,4);
    return 0;
}
[dgkim@dgkim asm]$ ls -al
합계 12
drwxr-xr-x   2 dgkim users 4096 2013-01-03 19:37 .
drwxrwxrwt. 18 root  root  4096 2013-01-03 19:34 ..
-rw-r--r--   1 dgkim users  112 2013-01-03 18:12 test.c
[dgkim@dgkim asm]$ gcc -c test.c
[dgkim@dgkim asm]$ ls -l
합계 8
-rw-r--r-- 1 dgkim users  112 2013-01-03 18:12 test.c
-rw-r--r-- 1 dgkim users 1464 2013-01-03 19:37 test.o
[dgkim@dgkim asm]$

-c 옵션으로 생성된 .o 파일을 gcc를 통해 링크하려면 아래와 같이 할 수 있습니다. 여러 개의 .c 파일을 가지는 프로그램 및 링크 과정 및 순서에 따라, -c 옵션으로 컴파일만하고, 마지막에 .o 파일들을 묶는 일은 자주 있을 것입니다.

파이어폭스에서 드래그앤드롭으로 파일업로드 구현하기

파이어폭스에서는 파일업로드를 드래그앤드롭으로 할 수 있습니다.

3.6 버전에서부터 지원했던 것 같습니다.

자바스크립트와 Spring 프레임워크를 사용해서 간단하게 파일 업로드 프로그램을 작성해 보았습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>파일업로드</title>
</head>
<body>
    <form name="form0" action="file/upload" method="POST" enctype="multipart/form-data">
        <ul>
            <li>파일 하나 업로드 : <input id="file1" type="file" name="file" /></li>
            <li>여러 파일 업로드 : <input id="file2" type="file" name="multifile" multiple /></li>
            <li>파일을 선택하고 '전송' 눌러 업로드하시거나, 탐색기에서 파일을 드래그앤드롭하여 업로드할  있습니다. 드래그앤드롭은 '전송' 누르는 것이 아니라 드롭시점에 바로 업로드됩니다.</li>
        </ul>
        <input type="submit" value="전송"/>
    </form>
    <script type="text/javascript">
    var dropzone1 = document.getElementById('file1');
    var dropzone2 = document.getElementById('file2');
    setDnDhandler(dropzone1);
    setDnDhandler(dropzone2);
    
    function setDnDhandler(obj) {
        obj.addEventListener("dragover", function(event) {
            event.preventDefault();
        }, true);
        obj.addEventListener("drop", function(event) {
            event.preventDefault();
            var allTheFiles = event.dataTransfer.files;
            for (var i=0; i<allTheFiles.length; i++) {
                var element = document.createElement('div');
                element.id = 'f' + i;
                document.body.appendChild(element);
                sendFile(allTheFiles[i], element.id);
            }
        }, true);
    }
    function sendFile(file, fileId) {
        var xhr = new XMLHttpRequest();
        
        xhr.upload.addEventListener("progress", function(e) {
                if (e.lengthComputable) {
                    var percentage = Math.round((e.loaded * 100) / e.total);
                    document.getElementById(fileId).innerHTML = file.name + ' - ' + percentage + '%';
                }
            }, false);
        xhr.onreadystatechange = function() {  
            if (xhr.readyState == 4 && xhr.status == 200) {
                alert(xhr.responseText);
            }
        };
        xhr.upload.addEventListener("load", function(e){
                document.getElementById(fileId).innerHTML = file.name + ' - uploaded';
            }, false);
        xhr.open("POST", "file/upload");
        var fd = new FormData();
        fd.append("file", file);
        xhr.send(fd);
    }
    </script>
</body>
</html>

드래그앤드롭을 사용할 때, 드롭될 영역의 경우는 input형이 아니라도 가능하지만, 일반 HTML전송도 가능하게 예제를 작성하고자 input을 사용하였습니다.

Tomcat 고가용성 구성 테스트 노트

Tomcat 6.0을 가지고 고가용성, 즉 클러스터링을 따라해 보았습니다.

시나리오.

  1. tomcat 인스턴스는 weblogic, oc4j와 비슷하게 제품 바이너리와 인스턴스를 분리해 본다.
  2. cluster 구성으로 생성한다.
  3. 애플리케이션 배포 시나리오를 생각해 본다.
  4. 테스트 애플리케이션 준비
  5. Apache mod_proxy_jk 세팅

톰캣 바이너리는 app/apache/apache-tomcat-6.0.32 경로에 있습니다. 인스턴스 경로는 아래와 같은 구성을 시도해봅니다.

app/apache/user_projects - 톰캣 인스턴스묶음용? 경로
app/apache/user_projects/cluster_domain - 톰캣이 만들어질 도메인?
app/apache/user_projects/cluster_domain/bin - 도메인용 스크립트 디렉토리 ( startup.sh, shutdown.sh 존재 )
app/apache/user_projects/cluster_domain/servers - 톰캣 인스턴스용 디렉토리
app/apache/user_projects/cluster_domain/servers/tomcat1 - 'tomcat1'이란 이름의 톰캣 인스턴스
app/apache/user_projects/cluster_domain/servers/tomcat1/bin,conf,logs,temp,webapps,work - 'tomcat1'인스턴스 구성요소
app/apache/user_projects/cluster_domain/servers/tomcat2 - 'tomcat2'이란 이름의 톰캣 인스턴스
app/apache/user_projects/cluster_domain/servers/tomcat2/bin,conf,logs,temp,webapps,work - 'tomcat2'인스턴스 구성요소
app/apache/user_projects/cluster_domain/webapps - 이 도메인에서 사용할 애플리케이션 준비 디렉토리

인스턴스 구성. bin 경로와 conf 경로를 준비합니다.