[박기영의 굿모닝 레이디] 과연 사랑할 준비가 됐는가

나깐깐 양은 신중남 씨로부터 받은 답장 메일을 그대로 '전달'해서 내게 보냈다. 메일 제목은 '시 한 수'.

'캬!' 하고 탄성이 절로 나왔다. '이들이야말로 진정 로맨틱한 커플이로세!' 이들의 손발이 오그라드는 편지를 그간 쭉 봐왔건만 이번 건은 심히 옛스럽다. 21세기 첨단을 달리는 이 도시 커플의 시계는 아마도 1,000년 전쯤 되는 모양이다.

어쨌든 메일을 열어 나깐깐양이 세 시간 넘게 구구절절 썼다는 메일의 답장을 확인한 순간, 입이 쩍 벌어지면서 심하게 한 대 얻어맞은 듯 머리가 띵한 것을 느꼈다. 신중남씨는 그 어떤 설명도 없이 정말 시 한 수를 옮겨 놓았다.

사랑하다가 죽어버려라 -정호승-

사람들은 사랑을 모른다. 자기 마음대로 사랑하고 사랑한다고 말한다.

너는 어찌되든지 나만 사랑하고 사랑한다고 말한다 .너는 무엇을 원하는지 너는 무엇이 되고 싶은지 물어 보지도 않는다. 그저 내가 원하는 것만 내 마음대로 네가 되는 것을 사랑이라고 말한다.

사랑하다가 죽어야 하는데 너를 사랑하기 위해 내가 죽어야 하는 것이 사랑인 것을 알지 못한다.

나를 살리는 것은 사랑이 아닌 것을 알지 못한다. 너를 살리는 것이 사랑인 것을 알지 못한다.

그러므로 사랑하다가 죽어버려라.

내 스스로에게 묻는다. 지금까지 단 한 번이라도 누군가의 삶이나 무엇을 부러워한 적이 있었나? 없다. 하지만 지금 이 순간만큼 나깐깐양이 심하게 부럽다. 나는 그녀에게 전화를 걸어야만 했다.

"깐깐아! 이 복 터진 것아! 이제 그만 앵앵대고 바짝 엎드려라. 네 서방 되실 분은 너보다 단수가 10단은 높다. 그러니까 그냥 사랑하다가 확 죽어! 알았냐?"

그렇다. 우리는 얼마나 '사랑'이라는 이름 하에 '나'를 내세우는가? 나는 이런데 나는 이렇게 하는데.나는 어떻고 어때서 생긴 이 '사랑'이라는 이름의 가면을 쓴 '전쟁'을 이제는 끝내야만 한다.

사랑은 내가 죽는 것이다. 사랑은 '나'를 위해서가 아닌 사랑하는 '대상'을 위한 것이다. 우리는 과연 얼마나 사랑하고 있을까? 과연 사랑이라는 걸 하고 있기는 한 걸까? 나는 사랑할 준비가 됐는가?

끊임없는 질문을 스스로에게 퍼붓게 되는 밤이다.

그러므로 사랑하다가 죽어버리자!

글쓴이 박기영은 1998년 데뷔한 싱어송라이터로 <시작><나비><동행><마지막 사랑> 등의 히트곡을 발표했다. 지난해 <박기영씨, 산티아고에는 왜 가셨어요?>를 출간한 여행작가다.

by 검은날개천사 | 2009/12/17 09:27 | 끝나지 않을 전쟁 : 여 vs 남 | 트랙백

Refectoring

리펙토링의 리듬

: 테스트 --> 조금수정 --> 테스트 --> 조금수정 ...

 

- 리펙토링 : 소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의변화 없이 내부 구조를 변경하는 것

 

- 개발자의 문제점 : 프로그램을 만들 때, 나중의 개발자에 대해 생각하지 않는다는 것이다. 코드를 더 쉽게 이해할 수 있도록 변경하기 위해서는 리듬의 변화가 필요하다.

 

- 나는 매우 게으른 프로그래머다. 나는 내가 작성한 코드도 기억을 못할 정도로 게으르다. 실은, 머리가 꽉 차버리는 것이 두려워, 찾아볼 수 있는 것은 일부러 기억하려 하지 않는다. 나는 나중에 기억할 필요가 없도록, 기억해야 할 모든것을 코드에 넣는다. 이런 방법으로 오래된 기억이 내 뇌세포를 죽이는 것에 대한 걱정을 덜 수 있다.

 

- "나는 훌륭한 프로그래머는 아니다. 그냥 훌륭한 습관을 가지고 있는 좋은 프로그래머다"

 

- 소프트웨어를 빨리 개발하는 데에는 좋은 디자인이 가장 중요하다고 강력하게 믿는다.

 

* 리펙토링이 작동하는 이유

- 읽기 어려운 프로그램은 수정하기 어렵다

- 중복된 로직을 가지고 있는 프로그램 수정하기 어렵다.

- 실행중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램은 수정하기 어렵다.

- 복잡한 조건문이 포함된 프로그램은 수정하기 어렵다.

따라서, 우리는 읽기 쉽고, 모든 로직은 중복되지 않도록 한곳에서만 존재하고, 기존 동작을 위험에 빠뜨릴 변경을 허용하지 않으며, 조건 로직은 가능한 단순하게 표현되는 프로그램을 원한다.

by 검은날개천사 | 2009/12/16 15:33 | Computer Technic | 트랙백

일반 유니코드(Unicode)와 'UTF-8 유니코드'의 차이점

(1) 보통의 한국어 텍스트 문서: 이것은 아스키 문서이며 유니코드가 아닙니다. 영문/숫자/기호는 1바이트. 한글과 한자는 2바이트로 표현됩니다. euc-kr 또는 ksc_c_5601-1987 로 불리는 인코딩이며 웹페이지 작성에 사용할 수 있습니다. 특수한 외국어 문자나 일본식/중국식 한자는 표현할 수 없습니다.

다음의 2개가 유니코드입니다:

(2) 일반 유니코드(Unicode): 모든 글자를 2바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 인터넷에 HTML 파일로 올릴 수 없습니다. 즉 웹페이지 작성에 쓸 수 없습니다.

(3) UTF-8 유니코드: 영문/숫자/기호는 1바이트로, 한글과 한자 등은 3바이트로 표현합니다. 전세계 모든 글자들을 한꺼번에 표현할 수 있습니다. 웹페이지 작성에 쓸 수 있습니다. (저의 mwultong.blogspot.com 이 블로그도 UTF-8 로 되어 있습니다)



MS윈도우2000/XP 이상에서는, 외부적으로는 '일반 아스키 인코딩(1번)'을 사용하고, 내부적으로는 '일반 유니코드(2번)'를 사용합니다.

유닉스/리눅스/오픈소스 진영에서는 (1)번 또는 'UTF-8 유니코드(3번)'를 기본으로 사용합니다.

그렇지만 윈도 메모장에서도 UTF-8 유니코드 문서를 읽고 저장할 수는 있습니다.

by 검은날개천사 | 2009/12/16 00:55 | Computer Technic | 트랙백

cURL Library

cURL (Client URL Library Functions)

  • 제작자 Daniel Stenberg 의 설명을 그대로 변역하면
    curl is a comand line tool for transferring files with URL syntax
    커맨드라인에서 URL 문법을 사용하여 파일을 전송 프로그램
  • 내가 원하는 주소의 페이지에서 내가 임의의 값을 넣고 그 넣은 값으로 페이지에서 리턴되는 값을 받아오는 역할을 한다.
  • PHP에서 cURL을 사용하려는 사람들 대부분이 아마도 HTTPS 접속 때문일 것이다.
    소켓 또는 그 외 여러가지 접속방법이 있는데 굳이 cURL을 사용하는 건 속도면에서도 빠르고 HTTPS도 쉽게 접속할 수 있기 때문이다.
  • cURL 모듈을 서버에 설치해야 합니다.(리눅스 - curl.so, 윈도우 - php_curl.dll 확장모듈 필요)

 

cURL로 가능한 일

  • HTTPS certificates
  • HTTP POST
  • HTTP PUT
  • FTP upload
  • HTTP Form
  • cookie
  • authentication

 

cURL, Client URL Library Functions

  1. curl_init : 세션 초기화, 핸들값 리턴
  2. curl_setopt : 옵션 세팅
  3. curl_exec : curl을 실행
  4. curl_errno : 에러번호를 가져온다.
  5. curl_error : 에러 메시지를 가져온다.
  6. curl_getinfo : 상태 정보를 리턴한다.
  7. curl_close : curl 세션을 닫는다

 

[예제1 : POST방식으로 데이터 전송(simple)]

<?
$post_data = array(
      "name"   => "홍길동",
      "birthday"   => "1980-08-20"
      );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, http://www.example.com);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_exec($ch);
?>

 

[예제2: POST방식으로 데이터 전송(function)]

<?
function fetch_page($url,$param,$cookies,$referer_url){
    if(strlen(trim($referer_url)) == 0) $referer_url= $url; 
    $curlsession = curl_init ();
    curl_setopt ($curlsession, CURLOPT_URL, \"$url\");
    curl_setopt ($curlsession, CURLOPT_POST, 1);
    curl_setopt ($curlsession, CURLOPT_POSTFIELDS, \"$param\");
    curl_setopt ($curlsession, CURLOPT_POSTFIELDSIZE, 0);
    curl_setopt ($curlsession, CURLOPT_TIMEOUT, 60);
    if($cookies && $cookies!=\"\"){
        curl_setopt ($curlsession, CURLOPT_COOKIE, \"$cookies\");
    }
    curl_setopt ($curlsession, CURLOPT_HEADER, 1); //헤더값을 가져오기위해 사용합니다. 쿠키를 가져오려고요.
    curl_setopt ($curlsession, CURLOPT_USERAGENT, \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\");
    curl_setopt ($curlsession, CURLOPT_REFERER, \"$referer_url\"); 
    ob_start();
    $res = curl_exec ($curlsession);
    $buffer = ob_get_contents();
    ob_end_clean();
    if (!$buffer) {
        $returnVal = \"Curl Fetch Error : \".curl_error($curlsession);
    }else{
        $returnVal = $buffer;
    } 
    curl_close($curlsession); 
    return $returnVal;

?>

 

[예제3 : 파일 전송]

<?
$post_data['data[0]'] = "@image/img_01.jpg";
$post_data['data[0]'] = "@image/img_02.jpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, http://www.example.com/upload.php);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$postResult = curl_exec($ch);
?>

[예제4 : https 접속]

<?
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,"https://www.test.com"); //접속할 URL 주소
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 인증서 체크같은데 true 시 안되는 경우가 많다.
// default 값이 true 이기때문에 이부분을 조심 (https 접속시에 필요)
curl_setopt ($ch, CURLOPT_SSLVERSION,3); // SSL 버젼 (https 접속시에 필요)
curl_setopt ($ch, CURLOPT_HEADER, 0); // 헤더 출력 여부
curl_setopt ($ch, CURLOPT_POST, 1); // Post Get 접속 여부
curl_setopt ($ch, CURLOPT_POSTFIELDS, "var1=str1&var2=str2"); // Post 값  Get 방식처럼적는다.
curl_setopt ($ch, CURLOPT_TIMEOUT, 30); // TimeOut 값
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // 결과값을 받을것인지
$result = curl_exec ($ch);
curl_close ($ch);
echo $result;
?>

 

[예제5 : curl을 이용한 Gmail 로그인]

$src = "https://".$gmailId.":".$gmailPw."@mail.google.com/mail/feed/atom";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, 'My Agent Name');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$res = curl_exec($ch);
curl_close($ch);
/** 결과는 Atom xml 형식이다. DOM 또는 xml 파싱 function을 이용해서 파싱하면 됩니다. **/
echo $res;
?>

 

[예제6 : cURL을 이용한 웹페이지 가져오기]

<?php
function get_content($url) {
    $agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)';
    $curlsession = curl_init ();
    curl_setopt ($curlsession, CURLOPT_URL,             $url);
    curl_setopt ($curlsession, CURLOPT_HEADER,          0);
    curl_setopt ($curlsession, CURLOPT_RETURNTRANSFER,  1);
    curl_setopt ($curlsession, CURLOPT_POST,            0);
    curl_setopt ($curlsession, CURLOPT_USERAGENT,       $agent);
    curl_setopt ($curlsession, CURLOPT_REFERER,         "");
    curl_setopt ($curlsession, CURLOPT_TIMEOUT,         3);
    $buffer = curl_exec ($curlsession);
    $cinfo = curl_getinfo($curlsession);
    curl_close($curlsession);
    if ($cinfo['http_code'] != 200)
    {
        return "";
    }
    return $buffer;
}
?>

by 검은날개천사 | 2009/12/15 17:19 | C/C++ 프로그래밍 | 트랙백

◀ 이전 페이지          다음 페이지 ▶