관리하는 쇼핑몰에서 보안서버구축 공문을 받아 작업할때 나타난 작은 에러의 해결법입니다.
서버는 Window2003+APM 입니다.
먼저 Apache에 mod_ssl 을 추가한 후 ssl.conf 파일을 호출하도록 적용하였습니다.
다음 윈도우용 Openssl 에서 [Win32 OpenSSL v0.9.8e Light] 를 설치하였습니다.
보안서버는 가장 저렴한 업체인 comodossl.co.kr 에서 인증서를 구입하였습니다.
다음 comodossl 에 나와있는 구축설명서 대로 key 파일과 csr 을 생성, 주문하여 인증서를 받았습니다.

하지만 Apache 에 SSL 을 적용후 재시작하는 과정에 에러가 나와 error.log 파일 확인결과 아래와 같은 에러나타났습니다.

[error] Init: SSLPassPhraseDialog builtin is not supported on Win32 (...

인증서 주문시 서버 선택이 있는데 iis 로 주문한것(클라이언트가 주문)이 잘못되었나 싶어 apache 로 바꾸어 재요청여 인증서를 다시 받았으나 위와 같은 오류가 계속 납니다.

원인을 해결하기 위해 구글링 한 결과 다음과 같은 내용을 찾을 수 있었습니다.

Error: Init: SSLPassPhraseDialog builtin is not supported on Win32
Unfortunately Apache on Windows does not support encrypted private keys. To resolve this you will need to remove the private key password.

It is possible to create an unencrypted copy of the key using this command: openssl rsa -in file1.key -out file2.key

file2.key will contain your unencrypted key.

If you now point your server at this key file, it will not prompt you for a pass phrase.

즉, 키를 만들때 [암호화를 하면 Window 용 Apache 에서는 동작할 수 없다]는 내용입니다.

그렇게 하여 comodossl 의 개인키 생성시 사용한 옵션 중 -des3 라는 구문을 사용하지 않고 만들었습니다.

"openssl>genrsa -des3 -out domain.key 1024 "를
"openssl>genrsa -out domain.key 1024 " 로 key 로 생성

그리고 comodossl 에 찾은 내용을 메일로 보내고 다시 인증서를 받아 설치하고 Apache를 재시작 하니 올바르게 시작되었습니다.
다만 암호화를 하지 않은 키파일이기 때문에 사용시에 암호를 확인하지 않으니 복사에  신중을 기해야합니다.

사실.. 단순히 보안인증서버를 위한것이기 때문에 누군가 받아간다고 해도 걱정할 필요는 전혀 없습니다. ㅡ_ㅡ;;

다른 분들은 삽질하지 마시길.. ㅠㅡㅠ

'공부 해 Boa요. > Windows Server' 카테고리의 다른 글

IIS에서 PHP설치하기  (0) 2008.07.15

[Error Message]
 MYSQL ERROR : 1194 - Table 'tableName' is marked as crashed and should be repaired


[Command]
mysql> repair table tableName; //"tableName"는 오류가 생긴 테이블 입니다.
mysql>analyze table tableName;를 실행하면 테이블에 대한 보고서가 작성됩니다.
mysql>repair table tableName;를 실행하면 복원이 됩니다.


* 만약 repair 명령으로 복구가 안되면
myisamchk로 복구 처리할 것


-o, -r 옵션으로 복구 할 것
(Mysql서버 끄고 할 것)

1. 인증서 저장

EX) C:\SSL

2. httpd.conf(1.3.x.x) or ssl.conf(2.0.x.x) or /conf/extra/httpd-ssl.conf(2.2.x.x) 수정

EX) C:\Program Files\Apache Software Foundation\Apache\conf

## SSL Virtual Host Context

<VirtualHost _default_:443> → 이름기반(name based) SSL 가상호스트 설정

DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
server www.ucert.co.kr → 인증받은 도메인 주소 입력
serveradmin ucert@ucert.co.kr
ErrorLog logs/error_log
TransferLog logs/access_log

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on

# Server Certificate:
SSLCertificateFile "C:\SSL\www_ucert_co_kr.crt" → 웹서버 인증서 경로 설정

# Server Private Key:
SSLCertificateKeyFile "C:\SSL\www_ucert_co_kr.key" → 개인키 경로 설정

# Server Certificate Chain:
SSLCertificateChainFile "C:\SSL\www_ucert_co_kr.ca-bundle" →CA번들 경로 설정


※ Apache Server 2.2.x.x 에서 설정해야할것들

① [Apache HTTP Server 2.2] > [Configure Apache Server] > [Edit Apache Httpd.conf]

② 주석을 풀어 줍니다.
...
LoadModule ssl_module modules/mod_ssl.so
...
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
...

3. Apache SSL Restart

4. 인증서백업하기

인증서는 개인키와 함께 꼭 백업을 해두셔야 하며, 백업을 하지 않아 인증서를 재발급 받는 경우 인증서의 서비스 특징에 따라 비용이 추가될 수 있습니다.


인증서 발급 : http://www.sstrust.net/

<?php

/* ----------------------------------------------
 GET HTTP PAGE...
 2006.02.17 copied by Leah. from php.net
---------------------------------------------- */

class HTTPRequest
{
   var $_fp;        // HTTP socket
   var $_url;        // full URL
   var $_host;        // HTTP host
   var $_protocol;    // protocol (HTTP/HTTPS)
   var $_uri;        // request URI
   var $_port;        // port
  
   // scan url
   function _scan_url()
   {
       $req = $this->_url;
      
       $pos = strpos($req, '://');
       $this->_protocol = strtolower(substr($req, 0, $pos));
      
       $req = substr($req, $pos+3);
       $pos = strpos($req, '/');
       if($pos === false)
           $pos = strlen($req);
       $host = substr($req, 0, $pos);
      
       if(strpos($host, ':') !== false)
       {
           list($this->_host, $this->_port) = explode(':', $host);
       }
       else
       {
           $this->_host = $host;
           $this->_port = ($this->_protocol == 'https') ? 443 : 80;
       }
      
       $this->_uri = substr($req, $pos);
       if($this->_uri == '')
           $this->_uri = '/';
   }
  
   // constructor
   function HTTPRequest($url)
   {
       $this->_url = $url;
       $this->_scan_url();
   }
  
   // download URL to string
   function DownloadToString()
   {
       $crlf = "\r\n";
      
       // generate request
       $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
           .    'Host: ' . $this->_host . $crlf
           .    $crlf;
      
       // fetch
       $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port);
       fwrite($this->_fp, $req);
       while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
           $response .= fread($this->_fp, 1024);
       fclose($this->_fp);
      
       // split header and body
       $pos = strpos($response, $crlf . $crlf);
       if($pos === false)
           return($response);
       $header = substr($response, 0, $pos);
       $body = substr($response, $pos + 2 * strlen($crlf));
      
       // parse headers
       $headers = array();
       $lines = explode($crlf, $header);
       foreach($lines as $line)
           if(($pos = strpos($line, ':')) !== false)
               $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1));
      
       // redirection?
       if(isset($headers['location']))
       {
           $http = new HTTPRequest($headers['location']);
           return($http->DownloadToString($http));
       }
       else
       {
           return($body);
       }
   }
}

// Example
//$r = new HTTPRequest('가져올 사이트 주소');
//echo $r->DownloadToString();

?>

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

날짜의 요일 구하기  (0) 2010.11.24
php에 mssql을 사용하기  (0) 2010.02.12
빠른 PHP 속도를 유지 하기 위한 것.  (0) 2009.10.06
PHP로 소켓 서버 작성하기  (1) 2009.10.06
PHP 함수정리  (0) 2009.10.06

SELECT * INTO 생성될 테이블명 FROM 원본 테이블 명

예)    SELECT * INTO target FROM source

단 ) 제약조건이나, Identity 정보는 복사되지 않는다.


MS-SQL 쿼리분석기에서 테이블구조만 복사

Select * into (만들고싶은 테이블) From (소스테이블) Where 0=1


MS-SQL 동일 테이블에서 특정 필드값만 변경해서 복사 하는 방법

INSERT INTO AA

(

    필드1, 필드2, 필드3, 필드4, 필드5

)

SELECT

    '2007', 필드2, 필드3, 필드4, 필드5

FROM AA

WHERE 필드1='2006'


서버에서 테이블 복사하는 법은?

간단하게

BACKUP DATABASE 디비명 TO DISK='경로' WITH INIT
restore database 디비명 from disk ='경로'


위의 두가지 방법으로 하셔도 되는데..

또 다른 방법이 있다면..

1. 테스트 서버에 접속한다.

select * from sysfiles 을 실행..
-> 물리적 파일 위치를 확인한다.

2. 테스트 서버의 기동을 정지시킨다.

3. 탐색기를 연후 1번에서 확인한 파일을 복사한다.(CTRL+C)

4. 원본 서버로 이동시킨다.(CTRL+V)

5. 원본 DB로 접속한다.
sp_attach_db [ @dbname = ] 'dbname' ,
[ @filename1 = ] 'filename_n' [ ,...16 ]
DB를 붙인다.

-> 예) 붙일 DB명이 pubs이고 파일이 아래와 같은때
EXEC sp_attach_db @dbname = N'pubs',
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'

6. use @dbname (해당 DB로 이동한다)

7. 데이터를 확인한다.


* 경로가 틀리면 에러가 납니다. 또는 객체의 소유자가 의도 하지 않았던 것으로
바뀔수 있는데 이는 다시 수정하주면 됩니다.
* 설정하신 인덱스, 사용자, 사용자 정의 함수, 사용자 정의 SP까지 모두 옮겨지게
됩니다.


서버에 있는 테이블을 다른 서버로 옮길 수 있나요?

작업방법은 3 가지 정도가 있을 수 있습니다.

1. 데이터베이스 백업 / 복원

집에 있는 데이터베이스를 백업 받으셨다가 다른 컴퓨터에서 복원하는 방법입니다.

백업방법과 복원방법은 필요하시면 추가 질문 부탁합니다.

2. 데이터베이스 분리/연결

집에 있는 데이터베이스를 잠간 분리했다가 파일을 복사하여 사본을 만들고, 그 사본을 다른 서버로 옮긴다음, 해당 서버에서 다시 연결하면 됩니다.

분리 및 복원방법은 필요하시면 추가 질문 부탁합니다.

3. 데이터 가져오기 및 내보내기

집에 있는 데이터베이스와 옮기고자 하는 서버에 네트워크로 동시에 연결이 가능한 경우라면, 데이터 가져오기 및 내보내기 데이터 가져오기 및 내보내기 유틸리티를 사용하여 데이터와 스키마를 옮길 수 있습니다.

 mdf,ldf 파일을 직접 이동 하는 방법  (추천)

1) A 서버의 서비스를 내린다.

2) A 서버의 mdf, ldf 파일을 카피하여  B 서버로 이동 한다.

  -   디폴트로 SQL   서버를 설치하셨다면 C:\Program Files\Microsoft SQL Server\MSSQL\Data 에 파일가 있을 것임

3) B 서버에서 쿼리 분석기를 실행한다.

4) sp_attach_db 를 이용하여 mdf,ldf 파일을 B 서버에 첨부한다

예) pubs 데이터베이스를 첨부하는 예재

EXEC sp_attach_db @dbname = N'pubs'
   
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'
,
   
@filename2 =
N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'  

sp_attach_db

서버에 데이터베이스를 첨부합니다.

구문

sp_attach_db [ @dbname = ] 'dbname' ,
   
[ @filename1 = ] 'filename_n' [ ,...16 ]

인수

[@dbname =] 'dbname'

서버에 첨부될 데이터베이스의 이름입니다. 이 이름은 고유해야 합니다. dbnamesysname이며 기본값은 NULL입니다.

[@filename1 =] 'filename_n'

데이터베이스 파일 경로를 포함한 물리적 이름입니다. filename_nnvarchar(260)이며 기본값은 NULL입니다. 16개까지 파일 이름을 지정할 수 있습니다. 매개 변수 이름은 @filename1에서 시작하여 @filename16까지 증가합니다. 파일 이름 목록은 데이터베이스의 다른 파일을 지정하는 시스템 테이블이 들어 있는 주 파일을 적어도 하나 이상 포함해야 합니다. 또한 목록은 데이터베이스가 분리된 다음 이동된 모든 파일을 포함해야 합니다.

반환 코드 값

0(성공) 또는 1(실패)

결과 집합

없음

비고

 명시적 sp_detach_db 작업을 사용하여 서버에서 이전에 분리된 데이터베이스만이 sp_attach_db를 사용할 수 있습니다.17개 이상의 파일을 지정해야 하는 경우에는 FOR ATTACH 절이 있는 CREATE DATABASE를 사용하십시오.

데이터베이스가 분리된 서버 외의 서버에 데이터베이스를 첨부한 경우 및 분리한 데이터베이스를 복제할 수 있는 경우, sp_removedbreplication을 실행하여 데이터베이스에서 복제본을 제거해야 합니다.

사용 권한

sysadmin 고정 서버 역할의 구성원만이 이 프로시저를 실행할 수 있습니다.

방법) SELECT * INTO 생성될 테이블명 FROM 복사할 테이블 명

예제) SELECT * INTO locker20091026bak FROM locker

단 ) 제약조건이나, Identity 정보는 복사되지 않는다.

오랜만에 다시 잡은 카메라...
요즘 한참 서울시내에서 이슈가 되고 있는 그곳... " 서울 디자인 올림픽 2009 "
그곳의 디자인 세상속으로 가보았다...

2008년도 "무한도전" 때문에 알게된 "디자인올림픽"...
이번에도 부푼 기대를 이끌고... 잠실 종합운동장으로 발걸음을 향하였다.

사용자 삽입 이미지

2호선의 수 많은 사람들의 지하철을 뚫고 역사를 빠져 나오려는데...
오전에 그렇게 먹구름과 새벽엔 억수 같은 비가 내리더니...

어떻게 내가 사진을 찍으려 가려니... 하늘도 도움을 주려는지...
저렇게 파란 하늘이 보이도록 구름들을 몽땅~ 치워 놓았더라구요~

사용자 삽입 이미지

예전 2008년도 보다 뭔가 조금은 썰렁한 분위기랄까...?
무엇이든 해가 지나면 더욱더 멋찌고 구성이 탄탄해 지는데...

이번엔 작년보다 못한 느낌을 받앗다... 입구 부터 말이지... ㅎㅎ
그래도 왔으니... 밖 보단 안쪽에 잘~ 해놓았을꺼란 생각에... 일단 계속 사진을 찍으러~

고고싱~ ㅎㅎ

사용자 삽입 이미지

덥수룩 하던 하늘의 먹구름이...
점점 저 멀리~ 도망가고 있어요~

도망가다가... 저렇게 나무에 살짝쿵~ 걸려 있기둥 하구요~ ㅎㅎ

사용자 삽입 이미지

어느덧~ 뭉개 뭉개~ 구름은 어디론가 사라지고~
뜨거운 태양님이~ 반짝~ 뜨셔서~ 나무숲 사이로 빛을 내려주고 있네용~ ㅎㅎ

바람이 불어 살짝~ 썰렁 했는데~ 햇님이 뜨니~ 따따 하더라구용...( +_+ )

사용자 삽입 이미지

이번 "서울 디자인 올림픽 2009"는 서울의 상징인 "해치"를 주제로한 작품들이 많이 있더라구요.
입구에서 제일 처음 반겨주는 "해치"...
멀리서 봐도 한눈에 알아 볼듯한... 빈 폐트병으로 만들어진...

재활용된 "해치"더라구요~ ㅎㅎ
역시 디자인 이란건 상상 그이상의 세상인듯해요~ ㅎㅎ
"해치"를 재활용 할 쭐이야~~~

사용자 삽입 이미지

그다음 반겨준 "해치"는 마스코트 복장의 탈을 쓴 인형(?) 이라고 해야 하나요...? ㅎㅎ
열심히 기다려려서 사람 없을때 찍엇는데...ㅡ,.ㅜ

찍고 보니... 어느새 저 여성분이 같이 모델을 하고 계시네용~ㅡㅡ;;
일단 뉘신지 모르나... 제 포토스토리에 주인공이 되셨네요~ ㅎㅎ
( 추후에 본인이 보신다면 지워드릴 의향도 있찌용~ ㅎㅎ )

사용자 삽입 이미지

입구를 들어 서면 다산콜센터에서 준비한 부스가 있는데...
포스트잇이 잔~~~~뜩~~~~~~ 붙어 있더라구요~ ㅎ

죽~~~ 훑어보다가 재미난 문구를 발견해서 한장~ 착칵!! ㅎㅎ
" 너 진짜~ 나한테 왜 그러냐...? "

제가 자주하던 말인데... 누군가 똑같이 적어 놓고 간걸 보니...
오죽히도~ 속을 썩이는 사람이 있나 봅니당... ㅎㅎ

사용자 삽입 이미지

잠실 종합운동장의 하늘엔 나름 디자인이라고 하는데...
글쎄요~

전 뭐 그냥 지저분....? 너저분 하게 널어 놓은 돌돌 말린 휴지를 풀어 놓은듯한...
그런 기분이랄까요...ㅜ,.ㅡ

제가 어찌 저 심도 있는 느낌의 디자인을 알겠습니까...ㅜ,.ㅡ
누가 왜~ 저런 짓을 해놓았는지... 저~ 디자인에 대하여 설명을 해쥬실분~~~~~>0<

사용자 삽입 이미지

어느 순간인지... " LOVE "라는 단어를 보면...
" 이젠 그래... " 라고 한다고 해야할까요...? 그 전엔 사랑이라고 하면 단어만 들어도 설래이고 아름 다운 상상이 되곤 했는데...

사랑이라는 단어의 느낌보다... 그냥 글씨로만 전해지는 LOVE라는 단어...
( 언젠간 다시 그럴 날이 오겠죠 뭐~ ㅎㅎ 않 와도 상관 없구용~ ㅎㅎ )

사용자 삽입 이미지

작은 운동장 쪽으로도 행사가 열리고 있다는...
"안전요원"님의 말을 듣고... 냉큼 달려간 곳엔... 정말 "헉!!!!!!!!!!!!!!!!!!!!!!!!!!" 할 만한
디자인 조형물들이 많더라구요~

저건 누가 만들어 놓았는지...ㅜ,ㅠ 정말~ "야만인" 적입니다...
아이들도 많이 오는 곳 인데... 기린의 목을 가르고 그위에... 꽃을 올려 놓다니...
아무리 디자인이라고 하지만... 너무 했어요~ㅜ,.ㅠ ( 불쌍한 기린... )

사용자 삽입 이미지

작은 운동장에서 너무 충격적인 디자인들을 보고...
되돌아 나오는 길에...

벤치에 나란히 올려져 있는 노오란~~~~~~~~~~~~~~ 국화들...
이쁘게 봐달라고~ 줄을 섰어요~+_+

사용자 삽입 이미지

어디선가... 어디선가... 어디선가 많이 보던 거라 생각했는데...
소주병이더라구요...ㅡ,.ㅜ;;;

"딸랑~ 딸랑~" 바람에 살랑 살랑... 나름 운율이 있게...
반겨 주듯이 노래를 불러 주더라구요~ ㅎㅎ

사용자 삽입 이미지

자자~ 학생 여러분~ 차렷! 여기보세요~~~~~ ㅎㅎㅎ
저기 사이에 같이 앉아서 사진을 찍고 싶었으나...

혼자 사진을 찍으러 돌아 다니다보니...
삼각대도 없어... 쟤네들이랑 꼭~ 찍어 보고 싶었는데... 하는 아쉬움이 남아용~ ㅋㅋ

사용자 삽입 이미지

이루어 질수 없는 사이...
하지만 이젠 하나로 이루어진 사이...

사용자 삽입 이미지

어느덧... 하루를 마감 할 시간이 다가오네요~
노을이 살포시 지고~

하늘엔... 조용히 저 높이 떠 있는 비행기...
누가 따라오는지... 얼른 도망가네요~

사용자 삽입 이미지
하루 해가 지고...
바쁜 일상을 마친 사람들과 같이...

또 다시 내일의 하루를 위해 집으로 고고씽~

작년의 서울디자인올림픽 보다는 못 하지만...
또 다른 새로운 상상의 생각을 만들어 볼수 있는 하루가 아니였나 싶네요~


<!--

// 최상위 체크 로직(chars로 넘긴 값이 있다면 true)

    function containsCharsOnly(input,chars) {

        for (var inx = 0; inx < input.value.length; inx++) {

            if (chars.indexOf(input.value.charAt(inx)) == -1)

                return false;

        }

        return true;

    }

 

 

// 최상위 체크 로직(chars로 넘긴 값이 있다면 false)

 function containsChars(input,chars) {

     for (var inx = 0; inx < input.value.length; inx++) {

        if (chars.indexOf(input.value.charAt(inx)) != -1)

            return true;

     }

     return false;

 }

 

 

 

// 숫자 체크

    function isNum(input) {

        var chars = "0123456789";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 이름체크

 function nameCheck(input){

  var chars = '0123456789~!@#$%^&*()_-+=|{}[]<>,./?';

        return containsChars(input,chars);

 }

 

 

 

// 전화 번호 Check

    function isPhoneCheck(input) {

     var chars = "0123456789( ).-,<>{}[]_~";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 영문 판별

    function isPhoneCheck(input) {

     var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 영숫자 판별

    function isPhoneCheck(input) {

     var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        return containsCharsOnly(input,chars);

    }

 

 

 

 // 입력값이 숫자,대시(-)로 되어있는지 체크

 function isNumDash(input) {

     var chars = "-0123456789";

     return containsCharsOnly(input,chars);

 }

 

 

 

 // 입력값이 숫자,콤마(,)로 되어있는지 체크

 function isNumComma(input) {

     var chars = ",0123456789";

     return containsCharsOnly(input,chars);

 }

 

 

 

 // 입력값이 사용자가 정의한 포맷 형식인지 체크

 // 자세한 format 형식은 자바스크립트의 ''regular expression''을 참조

 function isValidFormat(input,format) {

     if (input.value.search(format) != -1) {

         return true; file://올바른 포맷 형식

     }

     return false;

 }

 

 

 

 /**

  * 입력값이 이메일 형식인지 체크

  * ex) if (!isValidEmail(form.email)) {

  *         alert("올바른 이메일 주소가 아닙니다.");

  *     }

  */

 function isValidEmail(input) {

 //    var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/;

     var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;

     return isValidFormat(input,format);

 }

 

 

 

 /**

  * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크

  */

 function isValidPhone(input) {

     var format = /^(\d+)-(\d+)-(\d+)$/;

     return isValidFormat(input,format);

 }

 

 

 

 // 콤마 없애기

 function removeComma(input) {

     return input.value.replace(/,/gi,"");

 }

 

 

 

 // 문자 변환 함수

    function alterString(str,before,after) {

     var returnStr = "";

     for(i = 0; i < str.length; i++) {

      value = str.charAt(i);

      index = before.indexOf(value);

      if(index >= 0) value = after.charAt(index);

      returnStr += value;

     }

     return returnStr;

    }

 

 

 

// --> 대문자 변환 함수

    function ToUpper(arg) {

     var str1 = "abcdefghijklmnopqrstuvwxyz";

     var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     return alterString(arg,str1,str2);

    }

 

 

 

// --> 소문자 변환 함수

    function ToLower(arg){

     var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     var str2 = "abcdefghijklmnopqrstuvwxyz";

     return alterString(arg,str1,str2);

    }

 

 

 

// 반각 문자를 전각문자로

    function convert2ByteChar(x_char) {

        var x_2byteChar = ""; //컨버트된 문자

        var c = x_char.charCodeAt(0);

        if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위

            if(c == 32) { //스페이스인경우 ascii 코드 32

                x_2byteChar = unescape("%uFFFC");

            } else {

                x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));

            }

        }

        return  x_2byteChar;

    }

 

 

 

// 10진수를 16진수로

    function gf_DecToHex(x_dec) {

        var x_Hex = new Array();

        var x_serial = 0;

        var x_over16 = x_dec;

        var x_tempNum = 0;

        while(x_dec > 15) {

            var x_h = x_dec % 16;          //나머지

            x_dec = parseInt(x_dec/16); //

            x_Hex[x_serial++] = (x_h > 9 ? String.fromCharCode(x_h + 55) : x_h); //16진수코드변환

        }

 

 

 

    //마지막은 몫의 값을 가짐

        x_Hex[x_serial++] = (x_dec > 9 ? String.fromCharCode(x_dec + 55) : x_dec); //16진수코드변환

  

    //,나머지,나머지,.....

        var retValue = "";

        for(var i=x_Hex.length ; i>0 ;i--) {

            retValue += x_Hex[i-1];

        }

        return retValue;

    }

 

 

 

// input box space, &nbsp;등 만으로 넣고 장난 칠때 이들 문자 뺀 길이를 통해 유효성 체크한다...

    function CheckStr(strOriginal, strFind, strChange){

        var position, strOri_Length;

        position = strOriginal.indexOf(strFind); 

        while (position != -1){

            strOriginal = strOriginal.replace(strFind, strChange);

            position = strOriginal.indexOf(strFind);

        }

        strOri_Length = strOriginal.length;

        return strOri_Length;

    }

 

 

 

// 체크 박스에 체크가 되어 있으면 true

 function checkValidator(str) {

  if(str.checked) return true;

  else return false;

 }

 

 

 

 // 비밀번호는 4자 등 최대 최소 길이를 파람으로 주고 처리...

    function checkLength(str,minLng,maxLng){

        var ckstr = str.value.length;

        if (parseInt(ckstr) < parseInt(minLng) || parseInt(ckstr) > parseInt(maxLng)) return false;

        return true;

    }

 

 

 

// 숫자만 받아서 아니면 메세지 보여 주는

    function onlyNumber(objEv) {

        if(!isNum(objEv)){

            alert("숫자만 입력가능합니다.");

            objEv.value = "";

            objEv.focus();

            return;

        }

    }

 

 

 

// 숫자를 체크하다가 6자 등 원하는 만큼 이동후 다음 input 박스로 이동 시키는...

    function goJump(fname, len, goname){

        onlyNumber(fname);

        if (document.all[fname].value.length == len) document.all[goname].focus();

    }

 

 

 

// 주민등록번호 체크 로직

    function check_ResidentNO(str_f_num,str_l_num){ 

        var i3=0

        for (var i=0;i<str_f_num.length;i++){

         var ch1 = str_f_num.substring(i,i+1);

            if (ch1<'0' || ch1>'9') i3=i3+1;

        }

        if ((str_f_num == '') || ( i3 != 0 )) return false;

        var i4=0;

        for (var i=0;i<str_l_num.length;i++){

            var ch1 = str_l_num.substring(i,i+1);

            if (ch1<'0' || ch1>'9') i4=i4+1;

        }

        if ((str_l_num == '') || ( i4 != 0 )) return false;

        if(str_f_num.substring(0,1) < 4) return false;

        if(str_l_num.substring(0,1) > 2) return false;

        if((str_f_num.length > 7) || (str_l_num.length > 8)) return false;

        if ((str_f_num == '72') || ( str_l_num == '18'))  return false;

               

        var f1=str_f_num.substring(0,1)

        var f2=str_f_num.substring(1,2)

        var f3=str_f_num.substring(2,3)

        var f4=str_f_num.substring(3,4)

        var f5=str_f_num.substring(4,5)

        var f6=str_f_num.substring(5,6)

        var hap=f1*2+f2*3+f3*4+f4*5+f5*6+f6*7

        var l1=str_l_num.substring(0,1)

        var l2=str_l_num.substring(1,2)

        var l3=str_l_num.substring(2,3)

        var l4=str_l_num.substring(3,4)

        var l5=str_l_num.substring(4,5)

        var l6=str_l_num.substring(5,6)

        var l7=str_l_num.substring(6,7)

        hap=hap+l1*8+l2*9+l3*2+l4*3+l5*4+l6*5

        hap=hap%11

        hap=11-hap

        hap=hap%10

        if (hap != l7) return false;

        return true;

    }

 

 

 

// 바이트 구하기

    function getByteLen(str){

        return(str.length+(escape(str)+"%u").match(/%u/g).length-1);

    }

 

 

 

 // url 가져오기

    function getUrlAddress(){

        var pageUrl = document.location;

     pageUrl  = new String(pageUrl);

      return pageUrl.substring(0,pageUrl.lastIndexOf("/"));

    }

 

 

 

// 오른마우스 금지, 나중에 해당 주석 풀고 사용

    function rightbutton(e){

        if (navigator.appName == 'Netscape' &&  (e.which == 3 || e.which == 2))

            return false;

        else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3))

        {

            alert("죄송합니다!! 정보무단복제를 막기 위하여 오른쪽 마우스 사용을 허용하지 않습니다.");

            return false;

        }

        return true;

    }

 

 

 

//document.onmousedown=rightbutton;

 

// 컨트롤 키 금지, 나중에 해당 주석 풀고 사용

    function checkCtl(){

        if (document.all){

            if(event.keyCode==17) {

                alert("죄송합니다!! 컨트롤키 사용을 허용하지 않습니다.");

                return false;

            }

        }

    }

 

 

 

//document.onkeydown = checkCtl;

 

 function setCookie(name,value) {

     document.cookie = name+"="+escape(value)+";path=/;domain=.kkaok.pe.kr;";

 }

 

 function setCookie(name,value, expires) {

     document.cookie = name + "=" + escape(value) +

     "; path=/; expires=" + expires.toGMTString();

 }

 

 function getCookie(Name) {

     var search = Name + "="

     if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면

         offset = document.cookie.indexOf(search)

         if (offset != -1) { // 쿠키가 존재하면

             offset += search.length

         // set index of beginning of value

             end = document.cookie.indexOf(";", offset)

         // 쿠키 값의 마지막 위치 인덱스 번호 설정

             if (end == -1)

                 end = document.cookie.length

             return unescape(document.cookie.substring(offset, end));

         }

     }

 }

 

 

 

    String.prototype.trim = function(){

        return this.replace(/(^\s*)|(\s*$)/gi, "");

    }

 

//문자 바꾸기, 사용법 var str = 문자열.replaceAll("a", "1"); 

    String.prototype.replaceAll = function(str1, str2) {

        var temp_str = "";

        if (this.trim() != "" && str1 != str2) {

            temp_str = this.trim();

            while (temp_str.indexOf(str1) > -1){

                temp_str = temp_str.replace(str1, str2);

            }

        }

        return temp_str;

    }

 

//-->

안녕하세요...^^*
그 동안 DSLR카메라를 잡고 사진을 찍은지... 3년이 되어 가네요...

생각에 잘~ 찍었다는 사진들을 골라 골라 보니... 무려 300 장이 넘더라구요~
거기서 또 추리고 추려서 195장을 인터넷 프링팅 요청을 했습니다.

장단 89월 이더라구요... ( 그래도 200장 가까우니깐 돈이....ㅜ,.ㅡ )

사용자 삽입 이미지

예전부터 찍은 사진들을 프린트해서 벽에 걸어 놓고 싶었는데...
이제야 소원을 풀었습니다.

사진을 받자마자 작업을 해서 침대 주변으로 사진 설치(?) 작업을 했지만...
아직 어색 해서 그런지.. ㅎㅎ
고건 나중 좀더 이쁘게 해서 찍어 올릴께요...^^;;

사용자 삽입 이미지

사진을 골라골라... 벽에 걸고 남은 사진들중 일부에요...
195장중 벽에 걸린 사진은 50여장 정도 되려나요...? ㅎㅎ

이제 이 100장은 무얼하죠...ㅡㅡ? ㅎ

오랜만에 집안이 화사 해 지는 기분이네요~
내가 찍은 이쁜 사진을 내방을 꾸미는 용으로... ㅎㅎ

이 속도 테스트 보다 더 중요한 것이 PHP보안 입니다. 보안이 가장 중요함당 !!!

PHP로 코딩 함에 있어서 알아야 할 속도 테스트 입니다.
조금더 빠른 PHP 속도를 유지 하기 위한 것이죠 ^^

작은 것이 모여서, 대따 오랜 시간이 걸릴 수 가 있는 것 입니다. !!
되도록이면 속도가 빠른 것을 사용하시는 것이 좋습니다.

물론 함수 마다 기능 마다 장단이 있지만요....^^

다른 비교가 있으면 알려주셍 ^^ 답변 달아 주세용 ^^
계속 적으로 업글 됩니다.

★ mysql 총 게시물 수 세기
<?php     $numresults=mysql_query("select code from $board");     $numrows=mysql_num_rows($numresults);     //2초 이상 ...게시물 10만개 ?> VS <?php     $numresults=mysql_query("select count(code) as code from $board");     $row_num=mysql_fetch_array($numresults);     $numrows=$row_num[code]; // 0.2  ...게시물 10만개 ?> 아래것이 훠얼씬 빠름다.. 도대체 mysql_num_row() 는 왜 만들어 놓은 것일까용???  


★ mysql_fetch_row  > mysql_fetch_array >>> mysql_result 입니다.

row 가 array 보다 약간 빠르고, result 보다는 훠얼씬 빠름당 ^^ row 는 불편한게 숫자로 칼럼을 불러와서 불편합니다. array 가 약간 느리지만, 문자 칼럼을 불러 올 수 있으니 array 쓰는 것도 양호 ^^ 아직도 mysql_result() 를 사용하시나요?  

★print , echo ,printf 함수 속도 비교
HTML 출력 >> echo > print >> printf print 와 printf 함수는 복잡한곳에 적격이고, 약간 느리다. echo 는 단순한곳에 적격이고...빠르다. printf 는 형식화된 출력을 해주므로 그래도 좋죠 ^^  

★  인라인

a.php <?php     $aa="sdsdsdsd";     echo ("       <table>       <td> $aa </td>       </table>       "); ?> 위 랑.. b.php <?php $aa="sdsdsdsd"; ?> <table> <td><?=$aa;?></td> </table> 랑 도대체 어케 코딩 하느냐죠 ? 솔직히 코딩은 a.php 가 편합니다. <?php ?> 를 한번 만 쓰니까 효율적일 수 있습니당.. 그러나 아무리 아무리 PHP가 빠르다고 해도 HTML 이 더 빠릅니당.. !!! 쿠쿠쿠 b.php 처럼 코딩 하는 습관을 가지세용 ^^ 변수가 많아 질 경우 b.php 파일이 느립니다. 그러나 소스 코드 분리 측면에서는 b.php 파일 형태가 좋습니다. 이 부분은 여러분들이나 저나 각종소스를 가지고 연구해 봐야만 할검당 ^^  


★ zend cache , APC ,Bware 캐쉬 비교
Zend cache > APC > Bware zend cache 는 캐쉬 입니다. 울나라에서 포탈에서도 몇군데 사용하죠. PHP 프로그램 변환 없이 속도를 빠르게 해 줍니다. ^^ zend cache 를 살 돈이 없으시다구용? 그러면 APC 나 zend optimizer 를 반드쉬 설치 하세용 !! ■ 그런디 Zend Cache 만한 무료 캐쉬가 나왔다고 합니당...^^ http://www.php-accelerator.co.uk/index.php 도대체 캐쉬의 작동 원리는 어케 되는가? 캐쉬는 여러가지로 작동 할 수 있습니다. 가장 많이 아는 것이 메모리에 페이지를 띄워 놓고 읽어 오는 것입니다. 하드에서 읽는 것 보다 빠르기 때문이죠. 그리고 HTML 로 만드는 것도 캐쉬 입니다.조금 더 빠르다면 캐쉬 라고 할 수 있습니다. 게시판 목록 보기 페이지는 디비 연결이 많습니다. 쓰기 보다 , 읽기가 20배 정도 많습니다. 게시판을 마니 운영해 봤다면 아시겟죠 ^^? 그래서 게시판 목록을 HTML 로 저장 시키고, 쓰기, 삭제 가 있을때 마다 HTML 로 만들어 주는 것 입니다. 그러면 디비 부하는 상당히 줄어 듭니다. 또는 코딩을 할때 enter 이나 tab 키를 많이 사용해서 합니다. 저번에 본 캐쉬는 enter 이나 tab 키를 없에 주는 캐쉬 였습니다. enter 이나 tab 를 없엘 경우 최대 1-2k 정도 절약이 되죵 ^^  


★ ereg_replace <<<  preg_replace 정규표현식
ereg_replace () 가 장난 아니게 느림다. 40개 정도 변환 하는데 1초나 걸려요.preg_replace 는 0.3초 정도요. 되도록이면 preg_replace() 를 사용하세요 !!! www.php.net/preg_replace tood.net preg_replace 강좌 http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=907  


★ foreach , list 함수 속도 차이 35%
foreach($string as $a);  >>>  while(list(,$a) = each($string)); foreach() 를 사용하는 것이 35% 정도 빠릅니다...!!  

★ explode() Vs split() Vs preg_split
explode() 와  split() 와 preg_split 는 문자열을 자르는 함수 입니다. 테스뚜 해보시면 아시겟지만 explode() 가 훨 빠릅니당..!!! 70% 정도 빠릅니다.  



★mysql_connect Vs mysql_pconnect
서로 장단이 있다 합니다. mysql_pconnect 가 더 빠르다고 합니다. persistant 메뉴얼에 영구적인 이렇게 되어 있으니까요.. 일정시간 동안 mysql 을 열어 놓기 때문에, 다시 열 필요가 없어서 빠르다고 합니다. 단점은 계속 열기 때문에 메모리를 많이 잡아 먹슴당...^^ mysql_pconnect 경우는 최소 메모리가 1G 이상 되어야 사용하시는 것이 좋습니다.  


★ 큰따옴표(") , 작은 따옴표(')
큰따옴표는 PHP가 파싱을 합니다. 그러나 작은 따옴표는 파싱을 하지 않습니다. 작은 따옴표를 사용하시는 것이 빠릅니다. 코딩시 echo ' test '.$aaa.' tood '; 요런식으로 하시는 게 가장 빠름당 !!  


★ mysql 데이터 저장 공간 크기 ?
id int(11) unsigned NOT NULL auto_increment,    bbs smallint(5) unsigned NOT NULL,    lens mediumint(8) unsigned NOT NULL,    int 도 무자게 많슴당.. 각각의 크기에 맞게 하는 것이 속도가 빨라 집니당 ^^ not null 를 주는 것도 속도가 빨라 집니당.. 작은 사이트 조회수 경우 1만을 넘기도 힘듭니다. 그럴 경우 smallint 를 사용하시면 됩니다.  


★ where 절에 모든 것은 인덱스를 걸어라 !!!
mysql 에서 쿼리시에 where 절에 사용되는 비교의 칼럼은 반드쉬 인덱스를 거세용 !!! mysql 인덱스 가 여러 분들의 게시판 속도를 업 시켜 줍니당 !!  


★메인페이지에서 속도를 빠르게 하려면, .htm 으로 만드는 것이 좋습니다.
그러니까..제 사이트 페이지 오른쪽 에는 모두 최신 게시물로 디비를 불러오는 부분 입니다. 디비 연결은 부하를 줄 수 있습니다. 그러니까..이예는 사이트가 상당히 활성화된 사이트일 경우 입니다. 하루에 2번 정도 .htm 으로 만들어 페이지를 업시키는 것이 좋습니다. 아무리 PHP가 빨라도 HTML 보다는 빠르지 않습니다.. !!! HTML 로 만드는 것은 생각 할것이 게시판 목록수 만큼 파일이 생성이 됩니다. 1만개 게시물이면 1만개 HTML 이 생기죠. 그런데 조회수가 보통 1000-3000 을 넘는 게시판 경우는 효율성이 중대 됩니다. 그러나 조회수가 100 비스므리 하다면...생각해봐야 합니다. 그러기 위해서는 ★cron 를 알아야 합니다 PHP강좌 게시판에서 cron 으로 검색하세용 !! 윈도우 사용자는 멀 쓰는지 잘 모르겠슴당...아시면 답글 부탁  ^^  


★ 초보자 Vs 전문가
www.zend.com 에서 제가 2000년 5월에 퍼온건데용 ^^   함 주석을 붙일까 해서용^^ Beginner vs Experienced    Author:  Boaz Yahav    Date  23/05/2000    Beginner : echo "$var";   Experienced : echo $var;   Beginner:echo "<a href=\"http://www.php.net\">PHP</a>";  ;; Experienced : ?><a href="http://www.php.net">PHP</a>; color="#0000CC"><?  ... ?>   ◆ "(따옴표) 가 굉장히 중요한것이라는 한 대목이죵 ^^ 전 보통의 경우 php 변수 값이 들어갈 경우는 초보자 처럼 쓰구요 ^^ 안들어 갈 경우 는 전문가 처럼 씀다. Beginner : $a[0]=1; $a[1]=2; $a[2]=3;   Experienced : $a = array(1,2,3, 1);   둘다 사용하는 데요. 전문가 쪽이 편함다. ^^ Beginner : if($a>1) { $b=2; } else { $b=3; }   Experienced : $b = ($a>1) ? 2:3;   요건 완존히 소스 어렵게 짜는 넘이 최고 라는 소리 같네용 ^^ 전문가 쪽것은 C 언어 에서 배웠는데도 역시 전 if 씀다. ^^ Beginner : $result=mysql_query(...);   Experienced: $result=mysql_query(...) OR die            (mysql_error());   요즘 들어 새삼 전문가 쪽으로 씀다.^^ 보통의 경우 <?php $result=mysql_query(...)   if (!$result) {      echo error()."<P>";      echo errno(); } ?> 이렇게 사용함다. ^^ or 이 설명이고 no 가 에러 번호 일 검다. ^^  


★MySQL,ADODB,PHPLib,PEAR 벤치마킹  
ADODB > PHPlib > PEAR MySQL     1.14      - ADODB     1.45     27% PHPLib    1.60     40% PEAR     2.87     152% (fetchInto) MySQL,ADODB,PHPLib,PEAR  는 모두 데이터베이스 인가요? 당근 아닙니다. MySQL만 데이터베이스 구요. ADODB,PHPLib,PEAR 는 PHP 프로그램 입니다. 3개 다 MySQL연결을 편하게 하는 클래스 프로그램 입니다. 그런디 벤치 마킹 결과 MySQL 에서 직접 쿼리하는 것 다음으로 ADODB 가 뽑혔슴당 ^^ PEAR 가 굉장히 늦군요. PEAR DB 나 ADODB 를 사용해 보았는데, 움..역시나 ADODB 가 좋군요. 오라클, mysql , ms sql 연결시 1개의 API 만 사용할 수 있는 프로그램 들 이 PEAR 과 ADODB 입니당 ^^  

★ 페이지 네비게이션- 페이지 분활
페이지 분활도 속도 차이가 납니다. 각각의 페이지 분활을 테스트 해보시면 아시겟지만, 10만개,20만개의 데이터를 넣어 보세요. 빠른것은 0.03초 정도, 느린것은 3초나 걸립니다. 인덱스를 걸어서 빨리 뜨는데, 머가 늦는 걸까 했는데, 페이지 네비게이션 알고리즘이 문제더군요. ^^  

★ 속도 테스트는 어케 하는가 ? microtime() 사용하면 됩니다.
<?php function pageTime($page) {  $mstart = explode(" ", $m);  $mend = explode(" ", microtime());  $mtime = ($mend[1] - $mstart[1]) + ($mend[0] - $mstart[0]);  echo " $m[1]  $mend[1]<P>";  echo " $m[0]  $mend[0]<P>";  print("tood.net 페이지 로딩 시간 : " . $mtime . " microseconds"); } pageTime(basename($PHP_SELF)); ?>    

조금 더 빠른 쿼리
$sql = "SELECT table.column FROM table WHERE criteria LIKE $myrow[variable]"; 아래 처럼 하면 파싱 되지 않기 때문에 아주 아주 쪼금 빨라 짐다..0.0000x 초; $sql = "SELECT table.column FROM table WHERE criteria LIKE " . $myrow['variable'];  

최적화 컴파일 옵션 사용 !
PHP counfigure 시에 최적화 방법 입니다. http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070   

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

php에 mssql을 사용하기  (0) 2010.02.12
PHP에서 "HTTP / HTTPS" Request하기  (0) 2009.11.18
PHP로 소켓 서버 작성하기  (1) 2009.10.06
PHP 함수정리  (0) 2009.10.06
무조건 알아야 할 PHP 속도 테스트 14 가지  (0) 2009.10.06
PHP로 소켓 서버 작성하기


대상 독자
요구사항
1 개요 - 소켓 서버란 무엇인가?
1.1 소켓의 형태
2 PHP 소켓 함수
2.1 PHP에서 소켓 만들기
2.2 실용 서버 만들기
2.3 실용적인 예
2.4 보안
가능한 기능 추가와 확장
저자에 관해

알아두기

이 자료는 http://www.zend.com/zend/tut/tutorial-staub3.php/에 있는
Writing Socket Servers in PHP를 제가 허접번역 및 내용을 추가 및 생략한 것입니다.
이미 다 아시는 내용 이시겠지만, 이해해 주시면 감사하겠습니다.
질문이나 번역을 바라는 주제가 있으시면,
이메일 또는 코멘트를 이용해 주세요. 참고로 전 영어, PHP 둘다 왕초보^^;.

대상 독자
인터넷 소켓 서버를 만들기 위해 PHP 소켓 함수 사용에 관심있는 분들..

미리 준비할 것
       
        * PHP 소켓 라이브러리. 이것은 컴파일 할 때 -enable-sockets 설정 옵션을 주시면 됩니다.
        * PHP의 CLI (Command Line Interface) 버전. 이것은 소켓서버가 커멘드 라인에서 실행하기 때문입니다.
        * 리눅스 운영체제
비록 리눅스를 사용한 따라하기이지만, 윈도우나 유닉스환경에서도 됩니다.
윈도우에서, PHP 소켓은 php.ini에서 externsion=php_sockets.dll부분의 주석을 제거해야
사용할 수 있습니다.

1 개요 - 소켓 서버란 무엇인가?

소켓 서버는 소켓 서버에 들어오는 요청과 응답을 대기하고있는 특정 포트에 할당하는 서비스입니다.
이메일 서비스(POP3, SMTP)와 웹서버는 소켓 서버의 좋은 예입니다.
HTTP(Web)서버는 들어오는 요청에 대해 포트 80에서 대기하고,
서버 안에 있는 HTML과 다른 파일(이미지, 동영상,문서)을 클라이언트 사용자에게 서비스 합니다.

소켓 서버는 주로 서비스나 데몬으로 끊임없이 실행됩니다.

쉽게 설명하자면, 우리가 네트워크 프로그래밍을 한다는 의미는 소켓이 제공하는 함수를 이용하여 프로그래밍을 한다는 의미입니다.
일상적으로, 소켓 프로그래밍과 네트워크 프로그래밍은 거의 같은 의미로 사용되고 있습니다.

1.1 소켓의 종류

정보가 인터넷으로 보내질 때, 그것은 주로 패킷으로 나누어집니다.  
왜냐하면 큰 용량을 패킷이라는 작은 단위로 쪼갠후에 보내야 하기 때문입니다.

패킷으로 정보를 쪼갤 때 두가지 다른 프로토콜이 있는데, 정보 형태에 대해 전송 필요조건에 의존하기 때문입니다.        
        * TCP(Transmmission Control Protocol) - 전송 패킷은 다른 끝에서 번호가 붙여지고 끝에가서 조립된다. 그들은전체 메시지를 형성하기 위해 조립된다 .
        TCP는 데이터의 손실이 없습니다.(만약 패킷을 잃어버리면, 재전송합니다.), 이메일처럼 완전한 받아야 하는 파일을 보낼때 적합합니다.
         * UDP(User Datagram Protocol) - 이것은 비연결 프로토콜입니다.
        TCP처럼 IP 프로토콜 위에서 실행됩니다.
그 차이는 UDP는 약간의 에러 복구 서비스를 제공하고 신뢰성이 없습니다.
UDP는 특별히 음악, 동영상 스트리밍처럼 스트리밍 데이타에 적합합니다.

2. PHP 소켓  함수

PHP 는 저 수준에서 소켓을 처리할 수 있습니다.
PHP3에서, PHP는 fsockopen()과 관련 함수로 처리하는 소켓을 도입하였습니다.
(네트워크 부분은 PHP공식 매뉴얼 http://php.net/network를 보세요).
PHP4에서는, PHP의 소켓은  BSD 스타일 소켓에 저수준 연결의 도입으로 멋지게 확장되었습니다.

참고: PHP에서 소켓 함수는 여전히 실험적이지만, 다음 버전에서 더욱 강화될 것입니다.
PHP 소켓함수는 잘만 작성하면 쓸만하다는 것을 테스트는 보여줍니다.

2.1. PHP로 소켓 만들기

PHP에서 저수준 소켓을 만드는 것은 C와 유닉스 소켓 프로그래밍에서 소켓 함수를 사용한것과 매우 비슷합니다.

간단한 예제로 시작해봅시다. 9000 포트에서 연결을 대기하는 소켓 서버는 입력으로 문자열을 받아들이고, 모든 공백 문자는 제거하고, 반환한다.


#!/usr/local/bin/php -q

<?
// 무한정 실행하기 위해 시간한계를 0으로 설정한다.
set_time_limit (0);

// 대기할 IP 주소와 포트번호를 설정한다
$address = '192.168.0.100';
$port = 9000;

// TCP 소켓을 만든다.
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// IP 주소와 포트번호를 소켓에 결합
socket_bind($sock, $address, $port) or die('Could not bind to address');
// 접속을 위해 대기를 시작한다
socket_listen($sock);

/* 들어오는 요청을 받아들이고 자식 프로세스로 그들을 처리한다 */
$client = socket_accept($sock);

// 클라이언트가 입력한 1024 바이트를 읽는다.
$input = socket_read($client, 1024);

// 입력받은 문자열에서 공백을 제거한다.
$output = ereg_replace("[ \t\n\r]","",$input).chr(0);

// 클라이언드에 출력을 보낸다.
socket_write($client, $output);

// 자식 프로세스를 닫는다
socket_close($client);

// 주 소켓을 닫는다
socket_close($sock);
?>

이 프로그램을 실행하려면, 첫 줄 #!/usr/local/bin/php -q 가 PHP CLI(or CGI) binary의 위치에 있어야 합니다.
여러분은 소스파일의 실행모드를 바꾸는 것이 필요합니다.
(chmod 755 socket_server.php)
실행하려면,  커멘드 라인에서 ./socket_server.php치고 엔터.
외관상 이 프로그램은 아무일도 않합니다.

그럼 각각의 라인을 자세히 살펴봅시다.

        * #!/usr/local/bin/php -q
        PHP CLI 실행파일을 실행합니다. -q 옵션을 쓰면 HTTP 헤더를 출력하지 않습니다.

        * $sock =sock_create(AF_INET, SOCK_STREAM, 0)
        '주인' 소켓을 만듭니다. 이 소켓은  들어오는 요청을 위해 대기할 것이고, 클라이언트를 위해 새로운 소켓을 생성할것입니다.

PHP manual에 보면 (http://www.php.net/socket_create): AF_INET는 IPV4 프로토콜의 도메인 타입입니다.
참고: 만약 UDP 소켓을 열기위해서는, SOCK_STREAM을 지우고 SOCK_DGRAM을 쓰십시오.

        * socket_bind($sock, $address, $port) or die('Could not bind to address')
        소켓을 입력된 주소와 포트에 결합합니다.

        * socket_listen($sock)
        저장된 포트번호에서, 들어오는 연결을 대기합니다. 만약 연결되면, 자식 소켓을 생성할 것이다.

        * $cliend = socket_accept($sock)
        마스터 소켓에서 접속을 받아들인다.

        * $input = socket_read($client, 1024)
        받아들인 소켓에서 1024 바이트를 읽는다,
       
        * $output = ereg_replace("[\t\n\r]","",$input).chr(0)
        정규식을 사용하여 모든 공백 문자를 제거한다.
       
        *socket_write($client, $output)
        스트림 소켓으로 테이터를 전송한다.
       

2.2 실제 서버 제작하기

지금 여러분은 소켓을 설정하고 대기하기 위해 필요한 기본 절차를 배웠습니다.
여러분은 쓸모있는 서버를 만들 준비가 되어있습니다.

위에 있는 소스코드를 보면, 이 프로그램은 단 한번 실행되고 종료됩니다.
그것은 소켓서버를 생성하기위해 요구되는 단계를 설명하기에는 좋습니다.
그러나 그것은 현실 상황에서는 적합하지 않다.
여러분의 프로그램이 실행 되고, 들어오는 요청에 응답하자마다. 프로그램이 종료되기를 원치않을 것입니다.
다시말하면, 계속 실행되야만 한다.

우리는 그러므로 프로그램은 계속 실행하기 위한 방법이 필요합니다.

우리가 명확히 exit 문을 명령할때까지, 우리는 while(true) { /* 놀지말고 일 좀 해라 */ } 이렇게 반복문을 계속적으로 사용할수 있습니다.
우리는 위의 예를 다음과 같은 기능을 추가하여 확장할 것입니다.

        *  끝없이 프로그램을 실행하게한다.
        * 종료 기능을 만든다.
        * 여러명이 접속해도 처리할수 있도록 한다.

#!/usr/local/bin/php -q
<?

// 끝없이 실행하기 위해 시간 한계를 0으로 설정한다
set_time_limit (0);

// 서버가 대기할 ip 주소와 port 번호를 설정한다.
$address = '192.168.0.100';
$port = 9000;
// 동시에 접속할 수 있는 사용자를 10명으로 한정한다.
$max_clients = 10;

// 클라이언드 정보를 얻을 배열
// 다시 말하자면, 사용자가 10명을 동시에 받아들이겠다면,
// 배열 크기를 10개로 잡아야 합니다.
$clients = Array();

// TCP 스트림 소켓 생성
$sock = socket_create(AF_INET, SOCK_STREAM, 0);

// 소켓을 아이피주소/포트에 결합
socket_bind($sock, $address, $port) or die('주소 지정에 실패했습니다.');

// 연결을 대기를 시작한다.
socket_listen($sock);

// 무한 루프 실행
while (true) {
    // 읽기위해 클라이언트 대기 소켓을 설정한다
    $read[0] = $sock;
    for ($i = 0; $i < $max_clients; $i++)
    {
        if ($client[$i]['sock']  != null)
            $read[$i + 1] = $client[$i]['sock'] ;
    }
    // socket_select()에 블럭킹 호출을 설정한다.
    $ready = socket_select($read,null,null,null);

    /* 만약 새로운 접속이 되면, 그것을 클라이언트 배열에 추가한다 */
    if (in_array($sock, $read)) {
        for ($i = 0; $i < $max_clients; $i++)
        {
            if ($client[$i]['sock'] == null) {
                $client[$i]['sock'] = socket_accept($sock);
                break;
            }
            elseif ($i == $max_clients - 1)
                print ("너무 많은 사용자")
        }
        if (--$ready <= 0)
            continue;
    } // 조건문 if in_array의 끝
    
    // 만약 클라이언트가 쓰기를 시도하면, 바로 그것을 처리한다
    for ($i = 0; $i < $max_clients; $i++) // for each client
    {
        if (in_array($client[$i]['sock'] , $read))
        { // 사용자로부터 입력을 받아서..
            $input = socket_read($client[$i]['sock'] , 1024);
        // 만약 입력이 없으면...
            if ($input == null) {
                // Zero length string meaning disconnected
                unset($client[$i]);
            }
            $n = trim($input);
        // 만약 클라이언트가 'exit'를 입력하면,
            if ($input == 'exit') {
             // 요청에 따라 연결을 종료한다
                socket_close($client[$i]['sock']);
                                // 만약 아니면...
            } elseif ($input) {
             // 공백문자를 제거하고,
                $output = ereg_replace("[ \t\n\r]","",$input).chr(0);
                // 사용에게 소켓 스트림을 통하여 문자열을 보낸다.
                socket_write($client[$i]['sock'],$output);
            }
        } else {
            // 소켓 종료
            socket_close($client[$i]['sock']);
            unset($client[$i]);
        }
    }
} // while문 끝
// 주인 소켓 종료
socket_close($sock);
?>

기본 기능은 처음 예제와 같다. 다만 추가된 특징은 사용자가 문자열 'exit'를 프로그램에 보내면,
프로그램은 연결을 끝낼것이다.

이 프로그램은 반복문을 제외하고, 처음 프로그램과 매우 비슷하다.
소스는 4개의  기본 블럭이 있다.

        1 읽기위해 소켓 설정
        2 새로운 클라이언트를 대기하고 $client 배열로 그것을 설정한다.
         3 클라이언트 대기하고 입력을 기록한다.
        4 클라이언트 입력을 처리한다.

이 예에서, 새 함수는 socket_select($read, null, null, null)입니다.
이 함수는 소켓 배열에서 select() 시스템 호출을 실행하고 상태가 바뀔때까지 기다립니다.
이것은 그 상태가 바뀔때까지 막고 있다가, 누군가 접속하여 그 상태가 바뀌면 그것을 처리합니다.

마지막 요점으로, 여러분은 연결된 다른 클라이언드에 정보를 뿌리고 싶을때(예를 들면 다-대-다 채팅 환경을 말한다)를 알아낼 수있습니다.
이것은 다음과 같은 코드로 저장될수 있다.
<PRE>
$output = '이것은 제가 여러명에게 보내고 싶은 메시지입니다'.chr(0);
for ($j = 0; $j < MAX_CLIENTS; $j++) // 각각의 클라이언트
{
    if ($client[$j]['sock']) {
        socket_write($client[$j]['sock'], $output);
    }
}

원문에서 broadcast라는 말이 나오는데 우리 말로는 '방송'으로 번역하고, &nbsp;
여기서는 한번에 여러명에게 정보를 보내는 것을 애기합니다. 다르게 애기하면 '대량 살포' 이런 의미입니다.

socket_select()함수 역시 중요한데. 부가 설명을 하자면,
select라는 말처럼 기다리고 있다가, 튀는 놈, 예를 들면 사용자가 접속하면, 그 놈을 선택(select)하여
넘겨주면 그걸 처리해주는 것입니다.

2.3 실용적인 사용

지금 우리는 소켓 서버 생성의 기초를 배웠다. 만약 한계가 있다면, 우리의 상상력입니다.

        *  채팅 서버(텍스트 또는 그래픽 기반). 이것은 재미있으면서 진짜 어플리케이션이 될 수 있습니다.
        *  실시간 정보 스트리밍 (뉴스, 주식..기타등등)
        *  스트리밍 멀티미디어 (이미지, 동영상과 사운드)
        *  인증 서버
        *  간단한 웹, POP3, SMTP 그리고 FTP 서버.

좀더 자세하게 말하자면, 소켓 라이브러리는 서버와 마찬가지로 클라이언트 프로그램을 만들 수 있다.

2.4 보안

보안은 접근 가능한 온라인 프로그램 생성할때 고려되어야 한다.
이것은  계속 실행되는 서버 소켓과같이 일반적인 PHP 스크립트에도 해당됩니다.

여러분이 보안 정책을 계획할때, 고려하는 많은 사실이 있다. 여기 몇가지 나열하겠다.


        * 파일 접근 - 여러분은 파일 접근을 제한해야한다. 만약 웹서버같은 것이 파일 접근을 허락하면
        , 여러분은 특정 폴더에서 파일에 접근하게 해야한다. 다른 좋은 개념은
       
        * 인증 - 보안에 약한 서버를 위해, 여러분은 인증을 사용하기를 추천한다. 여러분이
        플래시나, 비주얼 베이직으로 사용자 프론트-엔드를 만들더라도, 그것은 신뢰성이 없습니다.
        누군가 네트워크 접속과 "sniff"할수 없을 것이다.

인증을 하기 위한 한가지 좋은 방법으로, 사용자가 성공적으로 스스로 인증하기 전까지 어떤 시도도 허락하지 않는 것이다.
(위에서 예를 들면 인증 하자마자, $client[$i]['authenticated'] = true )
       
        * 암호화 - 암호화는 중요한 정보를 막기위한 대단히 좋은 방법입니다. 암호화는 특히 위에 애기한 인증과 함께 사용하면
대단히  유용합니다. 운이 좋게도 PHP는 뛰어난 암호화 라이브러리를 제공합니다.
자세한 내용은 (http://www.php.net/mcrypt)

3. 가능한 기능 추가와 확장
        * PCNTL을 사용하여 프로세스 제어와 쓰레드를 추가한다.
         * 프론트-앤드 인터페이스(다시 말해 GUI 화면)는 C++, VB, Flash (XMLSockets를 사용), 자바 또는 TCP/IP 또는 UDP 소켓을 지원하는 모든 소프트 웨어를 사용하려 작성할 수 있다.
        * 만약 서버가  시험삼아 돌아가게되면, 당신은 모니터에 에러 메시지에 출력하는 대신 텍스트 화일이나 데이터 베이스 기록되는 사용자 에러 핸들링 함수를 생성을 원할것이다.

글쓴 이에 대해
집에서 놀고 있는 백수.
PHP 함수정리

1. 날짜 및 시간 관련함수

*time()
-용도: 현재 시각을 timestamp값으로 구한다.
-방법: time()

*date()
-용도: 사용자가 지정한 형태로 시간을 표시. 특정시간의 날짜와 요일등을 배열로 리턴한다.
-방법: date("표시할 시간의 포맷형태","특정한 timestamp값")

*mktime()
-용도: 지정된 날짜를 timestamp값으로 변환한다.
-방법: mktime(시,분,초,월,일,년)

*checkdate()
-용도: 날짜와 시간이 올바른 범위 안에 있는지 검사한다.
-방법: checkdate(월,일,년)

*getdate()
-용도: 특정timestamp값으로 시간,요일,날짜정보를 배열로 반환한다.
-방법: getdate(timestamp값) 또는 getdate()

*gettimeofday()
-용도: 현재 시스템의 현재 시간 정보를 배열로 리턴한다.
-방법: gettimeofday()

*gmmktime()
-용도: 그리니치표준 시간으로 지정한 날짜의 timestamp값을 리턴한다.
-방법: gmmktime(시,분,초,월,일,년)

*strftime()
-용도: 특정한 포맷으로 날짜 정보를 출력하는데 언어를 지정할수 있다.
-방법: strftime("표시할 시간의 포맷형태","특정시간의 timestamp값")

*microtime()
-용도: 현재시간의 마이크로타임 값과 timestamp값을 표시한다.
-방법: microtime()

*localtime()
-용도: 현재 서버의 로컬 타임을 표시
-방법: localtime() 또는 localtime("timestamp값")

2. 문자열 처리함수

*addslashes()
-용도: 작은따옴표 큰따옴표와 같은 특정문자 앞에 역슬래시 문자를 붙인다.
-방법: addslashes()

*stripslashes()
-용도: allslashes로 역슬래시 처리된 문자를 원상태로 되돌린다.
-방법: stripslashes()

*htmlspecialchars()
-용도: HTML코드를 소스 그대로 출력해준다.
-방법: htmlspecialchars()

*nl2br()
-용도: 문자열에 포함된 개행 문자를 <br>태그로 모두 바꿔준다.
-방법: nl2br()

*echo()
-용도: 문자열 출력
-방법: echo("변수명" 또는 "문자열")

*sprintf()
-용도: 포맷 문자열을 통해 지정해 준 포맷으로 문자열을 표시한다.
-방법: sprintf("포맷","변수명")

*printf()
-용도: 지정할 수 있는 포맷에 따라 문자열을 출력한다.
-방법: printf("포맷","변수명")

*explode()
-용도: 문자열을 지정해준 구분자로 분리하여 배열에 저장한다.
-방법: explode("구분자","문자열인수")

*implode()
-용도: 구분자로 나누어 배열에 담은 문자열을 다시 지정해준 구분자로 연결하여 전체 문자열을 반환한다.
-방법: implode("구분자",배열변수명)

*join()
-용도: implode()와 동일한 기능을 수행한다.
-방법: join("/", "배열변수명")

*split()
-용도: 주어진 문자열을 정규표현식의 패턴에 따라 분리하여 배열에 저장한다.
-방법: implode("정규표현식","문자열")

*strcmp()
-용도: 두개의 문자열을 비교하여 참이면1, 거짓이면 0을 반환한다.
-방법: strcmp("문자열","문자열") 또는 strcmp("문자열","변수명") 또는 strcmp(변수명, 변수명)

*substr()
-용도: 문자열에서 특정시작 문자부터 길이만큼의 문자열을 추출하여 반환한다.
-방법: substr("문자열", 시작문자번호, 문자열의 길이)

*strchr()
-용도: 문자열이 처음으로 나타나는 위치부터 끝까지 반환
-방법: strchr("문자열","찾을 문자열")

*strstr()
-용도:strchr()함수와 동일한 수행을 한다.
-방법: strstr("문자열","찾을 문자열")

*strrchr()
-용도: 문자열이 마지막으로 나타나는 위치부터 끝까지 반환한다.
-방법: strrchr("문자열","찾을문자열")

*strpos()
-용도: 문자열 대신 처음으로 나타나는 위치를 숫자로 반환, 이때 숫자는 0부터 시작.
-방법: strpos("문자열","찾을 문자열")

*strrpos()
-용도: 찾고자 하는 문자열에서 마지막으로 나타나는 위치를 반환한다.
-방법: strrpos("문자열", "찾을 문자열")

*strlen()
-용도: 문자열의 길이를 반환한다.
-방법: strlen($변수명) 또는 strlen("문자열")

*strtolower()
-용도: 알파벳 대문자를 모두 소문자로 바꾸어 반환한다.
-방법: strtolower("문자열")

*strtoupper()
-용도: 알파벳 대문자를 소문자로 바꾸어 반환한다.
-방법: strtoupper("문자열")

*ucfirst()
-용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다.
-방법: unfirst("문자열")

*ucwords()
-용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다.
-방법: ucwords("문자열")

*strrev()
-용도: 인자로 전달한 문자열의 순서를 역전시킨다.
-방법: strrev("문자열")

*strtr()
-용도: 문자열에서 변경하고자 하는 문자열을 변경할문자열로 1:1 변경해준다.
-방법: strtr("문자열","변경하고자하는 문자열","변경할 문자열")

*str_replace
-용도: 문자열 중에 변경하고자 하는 문자열을 찾아 변환한다.
-방법: str_replace("찾을 문자열","변경할 문자열","문자열 원본")

*chop()
-용도: 문자열의 뒷부분의 공백 문자를 제거한 후 반환한다.
-방법: chop("문자열")

*trim()
-용도: 문자열의 앞과 뒤에 있는 공백을 제거한 후 문자열을 반환한다.
-방법: trim("문자열")

*quotemeta()
-용도: 메타문자 앞에 역슬래시를 붙인다.
-방법: quotemeta()

*ord/chr()
-용도: ord()함수는 문자열에서 첫번째 문자에 아스키코드값을 반환하고 chr()함수는 아스키함수에 해당하는 문자를 반환한다.
-방법: ord("문자열"), chr("아스키값")

*parse_str()
-용도: get방식과 같은 형태의 변수형을 변수와 값으로 받을 수 있게 해준다.
-방법: parse_str(변수명)

3.파일관련함수

*fopen()
-용도: 로컬경로의 파일이나 url경로의 파일을 읽기 모드나 쓰기 모드로 열어준다.
-방법: fopen("절대경로명/파일", "모드")또는 fopen("url주소", "모드")

*fclose()
-용도: fopen으로 열린 파일을 닫는다.
-방법: fclose($fp)

*fread()
-용도: 파일포인터가 가리키는 파일의 내용을 지정한 크기만큼 읽어 들인다.
-방법:fread($fp,"읽어들일 바이트")

*feof()
-용도: 현재 파일 포인터가 파일의 끝인지를 알려주는 함수
-방법: feof($fp)

*fgets()
-용도: 파일을 읽어올때 한줄씩 읽어온다.
-방법: fgets($fp,"읽어들일 바이트")

*fputs()
-용도: 파일을 a 또는 w 모드로 열어 문자열을 파일에 기록한다.
-방법: fputs($fp, "문자열")

*fwirte()
-용도: 파일을 기록한다.
-방법: fwrite($fp, "문자열")

*fpassthru()
-용도: 파일포인터의 현재 위치에서 파일의 끝까지 읽어 들이도록 한다.
-방법: fpassthru($fp)

*readfile()
-용도: fpassthru와 비슷하지만 fopen()없이 직접 바로 파일을 읽어들일 수 있다. 읽어들인 파일의 절대경로를 포함한다.
-방법: readfile("파일의 절대경로 또는 상대경로/파일명")

*fgetc()
-용도: 파일로부터 한문자를 읽어들인다.
-방법: fgetc($fp)

*filesize()
-용도: 파일의 크기를 바이트수로 반환한다.
-방법: filesize("파일경로/파일명")

*file_exists()
-용도: 파일이름으로 지정한 파일이 존재하는지 검사한다.
-방법: file_exists("파일경로/파일명")

*is_file()
-용도: 파일이름으로 지정한 이름이 파일면 true를 반환한다.
-방법: is_file("파일경로/파일명")

*is_dir()
-용도: 파일이름으로 지정한 이름이 디렉토리일경우 true를 반환한다.
-방법: is_dir("파일경로/파일명")

*is_link()
-용도: 파일이름으로 지정한 이름이 심볼릭 링크일경우 true를 반환한다.
-방법: is_link("파일경로/파일명")

*is_escutable()
-용도: 파일이름으로 지정한 파일이 실행 가능한 파일이면 true를 반환한다.
-방법: is_excutable("파일경로/파일명")

*is_readable()
-용도: 파일이름으로 지정한 파일이나 디렉토리가 읽기 가능한경우 true를 반환한다
-방법: is_readable("파일경로/파일명 또는 디렉토리명")

*is_writeable()
-용도: 파일이름으로 지정한 파일이나 디렉토리가 쓰기 가능한 경우 true를 반환한다
-방법: is_writeable("파일경로/파일명 또는 디렉토리명")

*copy()
-용도: 파일을 복사하고 제대로 수행이 되면 true를 반환한다.
-방법: copy("파일경로/복사할 파일명", "파일경로/복사된 파일명")

*rename()
-용도: 파일을 이름을 바꾼다. 제대로 수행이 되면 true를 반환한다.
-방법: rename("파일경로/변경할 파일명", "파일경로/변경후 파일명")

*unlink()
-용도: 파일을 삭제한다. 제대로 수행될 경우 true를 반환한다.
-방법: unlink("파일경로/삭제할 파일명")

*mkdir()
-용도: 디렉토리를 생상하고 동시에 권한도 함께 지정할 수 있다.
-방법: mkdir("경로/디렉토리명")

*rmdir()
-용도: 디렉토리 삭제
-방법: rmdir("경로/디렉토리명")

*basename()
-용도: 경로명과 파일명을 받아 파일명만을 반환한다.
-방법: basename("파일경로/파일명")

*dirname()
-용도: 경로명과 파일명을 받아 경로명만을 반환한다.
-방법: dirname("파일경로/파일명")

*file()
-용도: 줄단위로 읽어서 각 줄으 문자열을 배열로 하여 반환한다.
-방법: dirname("파일경로/파일명")

4.디렉토리 관련함수

*opendir()
-용도: 지정한 디렉토리에 대한 핸들을 얻는다.
-방법: opendir("디렉토리 경로")

*closedir()
-용도: opendir()함수 호출로 열어둔 디렉토리에 대한 핸들을 닫는다.
-방법: closedir($od)

*readdir()
-용도: 디렉토리에 있는 모든 디렉토리 및 파일들의 이름을 읽어 배열의 형태로 반환
-방법: readdir($od)

*rewinddir()
-용도: 디렉토리 핸들의 포인터 위치를 제일 처음으로 되돌린다.
-방법: rewinddir($od)

*chdir()
-용도: 지저한 디렉토리로 바꾼다.
-방법: chdir("경로명/디렉토리명")

*dir()
-용도: 디렉토리 관련 함수를 사용할 수 있는 클래스
-방법: dir("경로/디렉토리명")

5. URL관련함수

*parse_url()
-용도: url을 입력하면 해당 url에 대한 정보를 연관 배열로 저장하여 반환
-방법: parse_url("URL주소")

*urlencode()
-용도: 데이터를 url인코딩해준다.
-방법: urlencode("문자열")

*urldecode()
-용도: url을 통해 넘어온 값 중 인코딩된 문자열을 디코딩한다.
-방법: urldecode("문자열")

6.변수 및 수학 관련함수

*gettype()
-용도: 변수형을 반환한다.
-방법: gettype("변수명")

*settype()
-용도: 변수형을 변환한다.
-방법: settype("변수명", "변수타입")

*intval()
-용도: 변수값을 정수형 값으로 변환
-방법: intval("변수값")

*doubleval()
-용도: 변수값을 실수형 값으로 변환한다.
-방법: doubleval("변수값")

*strval()
-용도: 변수를 문자형 값으로 변환한다.
-방법: strval("변수값")

*isset()
-용도: 변수가 존재하는지 확인한다.
-방법: isset("변수명")

*unset()
-용도: 변수를 삭제한다.
-방법: unset("변수명")

*empty()
-용도: 변수에 값이 존재하는지 확인하여 없으면 true를 있으면 false를 반환한다.
-방법: empty("변수명")

*is_array()
-용도: 변수의 형이 배열인지 확인한다.
-방법: is_array("변수명")

*is_double
-용도: 변수의 형이 더블형인지 확인한다.
-방법: is_double("변수명")

*abs()
-용도: 변수의 절대값을 반환
-방법: abs("변수명")

*round()
-용도: 변수의 반올림한 값을 구한다.
-방법: round("변수명")

*ceil()
-용도: 변수 값의 무조건 올림 값을 구한다.
-방법: ceil("변수명")

*floor()
-용도: 변수값의 무조건 내림 값을 구한다.
-방법: floor("변수명")

*pow()
-용도: 인자 값만큼 제곱승 한 값을 구한다.
-방법: pow("변수명", "제곱할 횟수")

*max & min()
-용도: 최대값과 최소값을 구한다.
-방법: max("숫자값", "숫자값",...) min("숫자값", "숫자값",...)

7.기타 알아두어야 할 함수

*count()/sizeof()
-용도: 배열의 크기를 구한다.
-방법: count("변수명") sizeof("변수명")

*each()/list()
-용도: 배열의 내용을 출력할때 사용한다.
-방법: each("배열변수명"), list("배열의 인자를 받을 변수명", "배열의 인자를 받을 변수명"...)

*end()/next()/reset()
-용도: 현재 배열의 포인터를 끝이나 다음으로 이동시킨다. reset은 배열포인터를 다시 처음으로 되돌린다.
-방법: end("배열변수명") next("배열변수명")

*exec()
-용도: 리눅스 서버의 내부 명령어를 사용하게 한다.
-방법: exec("리눅스명령어", "결과를 저장할 변수명" ,"에러발생시 저장할 변수명")

*number_format()
-용도: 천단위마다 ","를 붙여준다.
-방법: number_format("변수명", "소수점자리수", "소수점 표시마크변경", "천단위 표시 마크변경")

*show_source() / highlight_string()
-용도: php파일의 소스를 보여준다.
-방법: show_source("경로명/파일명") highlight_string("변수명")

*uniqid()
-용도: 유일한 아이디 값을 만들어준다
-방법: uniqid()
★ 무조건 알아야 할 PHP 속도 테스트 14 가지 ◆◇◆◇◆◇      


PHP로 코딩 함에 있어서 알아야 할 속도 테스트 입니다.
조금더 빠른 PHP 속도를 유지 하기 위한 것이죠 ^^

작은 것이 모여서, 대따 오랜 시간이 걸릴 수 가 있는 것 입니다. !!
되도록이면 속도가 빠른 것을 사용하시는 것이 좋습니다.

물론 함수 마다 기능 마다 장단이 있지만요....^^


다른 비교가 있으면 알려주셍 ^^ 답변 달아 주세용 ^^

계속 적으로 업글 됩니다. 현재 14가지 !!!!


==========================================================================
★ mysql 총 게시물 수 세기

$numresults=mysql_query("select code from $board");
$numrows=mysql_num_rows($numresults);
2초 이상 ...게시물 10만개

VS

$numresults=mysql_query("select count(code) as code from $board");
$row_num=mysql_fetch_array($numresults);
$numrows=$row_num[code];
0.2  ...게시물 10만개

아래것이 훠얼씬 빠름다..
도대체 mysql_num_row() 는 왜 만들어 놓은 것일까용???


==========================================================================
★ mysql_fetch_row  > mysql_fetch_array >>> mysql_result


입니다.

row 가 array 보다 약간 빠르고, result 보다는 훠얼씬 빠름당 ^^

row 는 불편한게 숫자로 칼럼을 불러와서 불편합니다.
array 가 약간 느리지만, 문자 칼럼을 불러 올 수 있으니 array 쓰는 것도 양호 ^^

아직도 mysql_result() 를 사용하시나요?

==========================================================================
★print , echo ,printf 함수 속도 비교
HTML 출력 >> echo > print >> printf


print 와 printf 함수는 복잡한곳에 적격이고, 약간 느리다.

echo 는 단순한곳에 적격이고...빠르다.
printf 는 형식화된 출력을 해주므로 그래도 좋죠 ^^

==========================================================================
★  인라인

 a.php
<?
$aa="sdsdsdsd";
echo ("<table>
 <td> $aa </td>
</table>");
?>

 위 랑..

 b.php
<? $aa="sdsdsdsd"; ?>
<table>
<td><? echo $aa; ?></td>
</table>

 랑 도대체 어케 코딩 하느냐죠 ?

솔직히 코딩은 a.php 가 편합니다.
<? ?> 를 한번 만 쓰니까 효율적일 수 있습니당..

그러나 아무리 아무리 PHP가 빠르다고 해도 HTML 이 더 빠릅니당.. !!!

쿠쿠쿠

b.php 처럼 코딩 하는 습관을 가지세용 ^^

==========================================================================
★ zend cache , APC ,Bware 캐쉬 비교
Zend cache > APC > Bware

zend cache 는 캐쉬 입니다. 울나라에서 포탈에서도 몇군데 사용하죠.
PHP 프로그램 변환 없이 속도를 빠르게 해 줍니다. ^^

zend cache 를 살 돈이 없으시다구용?
그러면 APC 나 zend optimizer 를 반드쉬 설치 하세용 !!

■ 그런디 Zend Cache 만한 무료 캐쉬가 나왔다고 합니당...^^
http://www.php -accelerator.co.uk/index.php ;


==========================================================================
★ ereg_replace , preg_replace 정규표현식
ereg_replace () 가 장난 아니게 느림다.
40개 정도 변환 하는데 1초나 걸려요.preg_replace 는 0.3초 정도요.

되도록이면 preg_replace() 를 사용하세요 !!!

www.php.net/preg_replace


==========================================================================
★ foreach , list 함수 속도 차이 35%

foreach($string as $a);  >>>  while(list(,$a) = each($string));

foreach() 를 사용하는 것이 35% 정도 빠릅니다...!!


==========================================================================
★mysql_connect Vs mysql_pconnect

서로 장단이 있다 합니다.

mysql_pconnect 가 더 빠르다고 합니다.
persistant

메뉴얼에 영구적인 이렇게 되어 있으니까요..
일정시간 동안 mysql 을 열어 놓기 때문에, 다시 열 필요가 없어서 빠르다고 합니다.

단점은 계속 열기 때문에 메모리를 많이 잡아 먹슴당...^^
mysql_pconnect 경우는 최소 메모리가 1G 이상 되어야 사용하시는 것이 좋습니다.

==========================================================================
★ 큰따옴표(") , 작은 따옴표(')

큰따옴표는 PHP가 파싱을 합니다. 그러나 작은 따옴표는 파싱을 하지 않습니다.
작은 따옴표를 사용하시는 것이 빠릅니다.

코딩시 echo ' test '.$aaa.' tood ';
요런식으로 하시는 게 가장 빠름당 !!

==========================================================================
★ mysql 데이터 저장 공간 크기 ?


id int(11) unsigned NOT NULL auto_increment,
   bbs smallint(5) unsigned NOT NULL,
   lens mediumint(8) unsigned NOT NULL,
 

int 도 무자게 많슴당..
각각의 크기에 맞게 하는 것이 속도가 빨라 집니당 ^^

not null 를 주는 것도 속도가 빨라 집니당..

작은 사이트 조회수 경우 1만을 넘기도 힘듭니다. 그럴 경우 smallint 를 사용하시면 됩니다.

==========================================================================
★ where 절에 모든 것은 인덱스를 걸어라 !!!
mysql 에서 쿼리시에 where 절에 사용되는 비교의 칼럼은 반드쉬 인덱스를 거세용 !!!

mysql 인덱스 가 여러 분들의 게시판 속도를 업 시켜 줍니당 !!


==========================================================================
★메인페이지에서 속도를 빠르게 하려면, .htm 으로 만드는 것이 좋습니다.

그러니까..제 사이트 페이지 오른쪽 에는 모두 최신 게시물로 디비를 불러오는 부분
입니다.

디비 연결은 부하를 줄 수 있습니다.

그러니까..이예는 사이트가 상당히 활성화된 사이트일 경우 입니다.

하루에 2번 정도 .htm 으로 만들어 페이지를 업시키는 것이 좋습니다.
아무리 PHP가 빨라도 HTML 보다는 빠르지 않습니다.. !!!

그러기 위해서는 ★cron 를 알아야 합니다 PHP강좌 게시판에서 cron 으로 검색하세용 !!
윈도우 사용자는 멀 쓰는지 잘 모르겠슴당...아시면 답글 부탁  ^^


==========================================================================
★ 초보자 Vs 전문가

www.zend.com 에서 제가 2000년 5월에 퍼온건데용 ^^  
함 주석을 붙일까 해서용^^


Beginner vs Experienced  
Author:  Boaz Yahav  
Date  23/05/2000  

Beginner : echo "$var";  
Experienced : echo $var;  


Beginner:echo "<a href=\" http://www.php.net\">PHP</a>";  ;
Experienced : ?><a href=" http://www.php.net">PHP</a><?  ... ?>  ;

◆ "(따옴표) 가 굉장히 중요한것이라는 한 대목이죵 ^^
전 보통의 경우 php 변수 값이 들어갈 경우는 초보자 처럼 쓰구요 ^^ 안들어 갈 경우 는 전문가 처럼 씀다.

Beginner : $a[0]=1; $a[1]=2; $a[2]=3;  
Experienced : $a = array(1,2,3, 1);  
둘다 사용하는 데요. 전문가 쪽이 편함다. ^^

Beginner : if($a>1) { $b=2; } else { $b=3; } 
Experienced : $b = ($a>1) ? 2:3;  
요건 완존히 소스 어렵게 짜는 넘이 최고 라는 소리 같네용 ^^
전문가 쪽것은 C 언어 에서 배웠는데도 역시 전 if 씀다. ^^

Beginner : $result=mysql_query(...);  
Experienced: $result=mysql_query(...) OR die  
        (mysql_error());  

요즘 들어 새삼 전문가 쪽으로 씀다.^^
보통의 경우

$result=mysql_query(...)  
if (!$result)
{
 echo error()."<P>";
 echo errno();
}
이렇게 사용함다. ^^

or 이 설명이고 no 가 에러 번호 일 검다. ^^

==========================================================================
★MySQL,ADODB,PHPLib,PEAR 벤치마킹  

ADODB > PHPlib > PEAR
 
MySQL     1.14      -
ADODB     1.45     27%
PHPLib    1.60     40%
PEAR     2.87     152% (fetchInto)

MySQL,ADODB,PHPLib,PEAR  는 모두 데이터베이스 인가요? 당근 아닙니다.
MySQL만 데이터베이스 구요.
ADODB,PHPLib,PEAR 는 PHP 프로그램 입니다.

3개 다 MySQL연결을 편하게 하는 클래스 프로그램 입니다.
그런디 벤치 마킹 결과 MySQL 에서 직접 쿼리하는 것 다음으로 ADODB 가 뽑혔슴당 ^^

PEAR 가 굉장히 늦군요. PEAR DB 나 ADODB 를 사용해 보았는데, 움..역시나 ADODB 가 좋군요.
오라클, mysql , ms sql 연결시 1개의 API 만 사용할 수 있는 프로그램 들 이 PEAR 과 ADODB 입니당 ^^
==========================================================================
★ 속도 테스트는 어케 하는가 ? microtime() 사용하면 됩니다.


<?

function pageTime($page) {
 $mstart = explode(" ", $m);
 $mend = explode(" ", microtime());
 $mtime = ($mend[1] - $mstart[1]) + ($mend[0] - $mstart[0]);

 echo " $m[1]  $mend[1]<P>";
 echo " $m[0]  $mend[0]<P>";

 print("tood.net 페이지 로딩 시간 : " . $mtime . " microseconds");
}
pageTime(basename($PHP_SELF));
?>
 


==========================================================================


==========================================================================

참고 사이트
http://www.tood.net
http://www.zend.com
http://www.php.net
http://www.php.lt/benchmark/phpbench.php
http://www.phpbuilder.com
http://www.phpbuilder.com/columns/piergiorgio20010321.php3?print_mode=1
<?
  /*
    ** 추상 클래스 **

    상위 클래스에서 메소드(껍데기)만 구현하고, 하위 클래스에서 그 메소드를
    구현해야 한다.

    CSpeak 클래스에서 speak()라는 추상 메소드를 구현 했으며, 하위 클래스의
    CKor, CEng에서 각각 실제 기능이 있는 speak() 메소드를 구현 하였다.
  */
  abstract class CSpeak
  {
    abstract public function speak();
   
    public function write()
    {
      $this->speak();
    }
    public function __set($name, $value) { $this->{$name}=$value; }
    public function __get($name) { return $this->{$name}; }
  }

  class CKor extends CSpeak
  {
    public function speak()
    {
      echo "한국어를 하다.<br>";
    }
  }

  class CEng extends CSpeak
  {
    public function speak()
    {
      echo "영어를 하다.<br>";
    }
  }
  /*
  class CJpn extends CSpeak
  {
    // 추상 메소드를 구현하지 않았기 때문에 에러가 난다.
  }
  */


  $kor = new CKor();
  $eng = new CEng();

  $kor->write();
  $eng->write();
?>

결과 :
한국어를 하다.
영어를 하다.

HTML에서 벗어나기

PHP 파일을 해석할때 PHP코드로 해석하라고 하는 특별한 코드와 만나지 않는다면 단순히 파일의 텍스트를 넘겨줄 뿐이다. 해석기(parser) PHP 닫기 태그가 있는곳까지 발견된 코드 모두를 수행한다. PHP 닫기 태그 만나면 다시 텍스트를 그냥 넘겨주기 시작하는것이다. 이런 메카니즘은 HTML안에 PHP코드를 내장시킬수 있게 해준다: PHP 태그 밖의 모든것은 완전히 단독으로 존재하는것이고, 반면에 PHP 태그 안쪽은 코드로서 해석이 된다.

PHP 코드 블록은 네가지의 태그형태로 표시할수 있다. 중에서 두가지 (<?php. . .?> <script language="php">. . .</script>) 항상 유효한 형태이다. 반면에 다른 형태는 php.ini 설정 파일에서 켜거나 있다. 짧은형(short-form)태그와 ASP스타일(ASP-style) 태그는 편하겠지만, 형태 태그만큼 이식성이 뛰어나진 못하다. XML이나 XHTML안에 PHP코드를 내장시키려면 XML 호환될수 있도록 <?php. . .?>형을 써야한다.


PHP 에서 MSSQL 접속하는 방법 (셋팅방법, 윈도우 XP)
기본적으로 윈도우에 APM 설치및 사용이 가능하다는 전제로 설명하겠습니다.

참고로 제 컴퓨터 사양은 아래와 같습니다.

윈도우 XP 프로페셔널 SP3
아파치, MySQL, PHP (Ver 5.x)

PHP 에서만 셋팅을 해주면 MSSQL 접속이 가능합니다.
php.ini 파일에서 'mssql' 이라고 검색해보시면 아래와 같은 부분이 나옵니다.

;extension=php_msql.dll
;extension=php_mssql.dll
extension=php_mysql.dll

위에서 mssql 부분의 ; 표시를 지워버립니다. 아래처럼요

;extension=php_msql.dll
extension=php_mssql.dll
extension=php_mysql.dll

그리고 PHP 설치한 폴더 안에 보시면 ntwdblib.dll 파일이 있는데 이 파일을 윈도우 하위 폴더인 system32 에 넣습니다.
c:\windows\system32
여기가 되겠죠..

그럼 셋팅은 끝났습니다.
이제 아파치를 다시 재시동 하고 테스트에 들어갑니다.

<?
$myServer = "MSSQL 서버주소";
$myUser = "유저아이디";
$myPass = "유저비번";
$myDB = "DB이름";

$db = mssql_connect($myServer, $myUser, $myPass) or die ("서버 연결 실패");
mssql_select_db($myDB,$db) or die ("DB 연결 실패");
?>

위의 테스트에서 에러가 발생하지 않았다면 성공한겁니다.

참고로 MSSQL 서버 포트가 별도로 지정된 경우 쉽게 생각하는건 서버주소:포트번호 라고 생각하지만 MSSQL 서버는 다릅니다.

서버주소:포트번호 X
서버주소,포트번호 O

쉼표로 해줘야 되요.. ^^

사용자 삽입 이미지

<?

 /***************************************************
   그림에 텍스트 입력하기
 ***************************************************/

 $fontname = "MALGUN.TTF"; // php 파일과 같은 디렉토리거나, 경로까지 설정해야함
    $width = "500";
    $height = "500";

 function euckr2utf8($text) {
  return stripslashes(iconv("EUC-KR","UTF-8",$text));
 }

    $im1 = imagecreatefromjpeg("jj.jpg");
    $im2 = imagecreatefromjpeg("kim.jpg"); // GIF 파일 로드 : imagecreatefromgif()

    $white = ImageColorAllocate ($im1, 255, 255, 255);// 사용할 색상 설정 
    $black = ImageColorAllocate($im1,0,0,0);  // 사용할 색상 설정

 // 2개의 그림을 합친다.
 ImageCopyMerge ($im1, $im2, 0, 0, 0, 0, imageSX($im2), imageSY($im2), 70);

    ImageTTFText($im1, 20, 0, 5, 128, $black, $fontname, chr((rand() % 26)+65));

 header ("Content-type: image/png");  // 브라우저로 출력할 파일 타입 지정
    ImagePNG($im1); // 브라우저로 출력시킴

  //  ImagePNG($im1, "c:/1.png"); // jpg파일로 출력시킴
    ImageJpeg ($im1,"c:/1.jpg");  // png 파일로 출력시킴

    ImageDestroy($im1); // 이미지에 사용한 메모리 제거
    ImageDestroy($im2);

?>

출처 : http://sugame.tistory.com/234

다들 즐거운 명절 추석은 잘~ 보내 셨는지요...?

전 지방이 고향이라 고향가는 길이 어찌나 길고 멀던지...^^;;
매년 느끼는 것 이지만...
이넘의 고속도로를 12차선으로 뻥튀가 되었으면 하는 바램이 있습니다..ㅡㅡ;;

명절이 시작되기전에 사진 포스팅을 해야지... 하던 생각은 즐거운 명절(?)로인하여
이제야 포스팅을하게 되었네요.

이번에 소개할 곳은 "인천대공원"입니당..^^*
조금은 늦은 시간에 도착해서 많이 둘러 볼수는 없었지만 나름 아름다운 장면을 담을수 있어서 좋았네용...^^;;
 
사용자 삽입 이미지

약간은 늦은 시간에 도착한 인천대공원 해가 저멀리 넘어 가기 대략 2시간쯤 전에 도착해서 느즈막히 대공원으로 입성 했습니다.

뒤를 돌아 하늘을 보니 구름에 살포시~ 가려 져있는 햇님~ 발견~+_+

사용자 삽입 이미지

인천대공원 입구에 도착하니 황소(?) 파란소 한마리가 쿤~ 뿔을 자랑하며 약간은 무섭게 절 노려 보고 있어서 일단 찍기는했는데용~

금방이라도 뛰어 올꺼 같기두 하구요. 정말 생동감 있게 만들어져 있더라구요~

사용자 삽입 이미지

뒤늦게 동면 준비에 바쁜 꿀벌들과 마지막 아름다움을 뽑내는 꽃...
시간이 흐르면 이 꿀벌도 일을 잠쉬 쉴 것이고, 꽃도 시들겠죠...?

시간은 계속 흐른답니다~^^;; 헤헤헤~

사용자 삽입 이미지

이게 아마도 국화꽃이던가요...? ㅎ
맞나 몰라요~ ㅋ 비슷하긴 한건 같은데...

꽃찍는거~ 무지무지 좋아라 하는데~ 항상 찍어 놓고 꽃이름을 까먹으니...ㅡㅡ;;
이런 난감할 때가 있남용...+_+;;

사용자 삽입 이미지

위에 뼈다귀만 있는 소한마리 말고 위로 쪼금더 올라오면 살이 포동포동 찐 황소(?) 두마리가 힘겨루기 하고 있네요~

아싸~ 이기는 소 내편~♡^0^♡

사용자 삽입 이미지

저~ 멀리 햇님이 원두막 처마 밑에...
이제야 구름 사이에 가려 있던 햇님의 얼굴을 볼수 있네요~ 비록 남은 시간이 짧지만 말이죠...

사용자 삽입 이미지

하루의 마지막 힘을내어 비추는 태양이 저~ 멀리 넘어가다가 나무에 살짝~ 걸려있어요~

사용자 삽입 이미지

인천대공원의 석양빛이 가득한 호수.

사용자 삽입 이미지

마지막힘을 다해 빛을 비추는 태양...
부끄러운지 숲속 저~ 멀리 뒤로 숲으로고 하네요~

사용자 삽입 이미지

조각품 사이에 걸린 햇님과 그옆으로 넓게 퍼진 노을...


사용자 삽입 이미지

저~ 멀리 산뒤로 서서히 모습을 감추는 햇님...

사용자 삽입 이미지


조금은 늦은 시간에 갔엇던 인천대공원...
대략 2시간동안 짧막하게 넓디 넒은 공원을 둘러 보고, 서서히 넘어 가는 햇님과 노을...

이번엔 정말 찍고 싶언 노을 사진을 잔득 찍지 않았나 싶네요...^^;;
필터도 사용하지 않고... 포토샵 보정도 없는... 정말 오리지널 노을 사진...+_+

비록 많은 사진과 다양한 장면을 담지는 못했지만, 가장 맘에 드는 사진은 몇장 소장 할수 있게되어~ 너무 기쁜 하루 였네요...^^*

보통 낮에 가는 공원 보다 노을지는 공원이 구경하면서 볼수있는 시간은 짧지만 뭔가 새로운 모습의 아름다운 풍경을 구경할 수 있어서 좋네요...^^*

다음번엔 다른 공원을 노을질쯤에 가봐야겠어요~
가을이라 그런지 하늘도 맑고 노을 마저 이쁘네요...+_+

흐린 날씨에 가을 햇살이 살짝살짝 비춰주던 아침 햇살은 어느세 구름뒤로 가려지고
맑은 날씨를 바랬지만 많은 구름으로 인하여 살짝~ 흐린 상태에서 사진을 찍게 되었네요.

이번에 카메라와 함께 했던 곳은 저번에도 한번 사진과 함께 이야기 했던 "월드컵경기장"의
노을공원과 메타세콰이어길 부근 이랍니다.^^*

이제 가을이라고들 하지만 아직은 더운 날씨로 땀이 비오듯 오더라구요~
카메라 장비무게도 있지만 날씨가 더우니... 무척이나 힘들더라구요~ ㅎ

이번 출사는 무려 8Km나 걸었네요~ ㅎㅎ
지금 부터 약간은 힘들었지만 재미난 사진이야기를 풀어 볼까 합니당...^^;;

사용자 삽입 이미지

대나무 사이로 살짝히 빛을 비추는 햇살님...


사용자 삽입 이미지

따사로운 햇살에 밖으로 나와 광합을 즐겨주시는 거미님...
알록달록~ 눈으로 보면 징그럽지만 사진으로 보면 이렇게 아름다울 수가 없다죠...?
( 저만 그런지 몰라동... ㅎㅎ )

사용자 삽입 이미지

여긴 음...
남이섬에서 볼수 있다는 "메타세콰이어길"이랍니다...^^* ㅎ
그렇다고 남이섬은 아니구요~ 하늘공원으로 올라가지 않고 오른쪽길로 따라 가다보면,
비포장길이 시작되는 부분에서 이 "메타세콰이어길"이 시작된답니다... ㅎㅎ

사용자 삽입 이미지

요게~ 무슨 꽃일까요...?
항상 꽃을 찍는데... 그 밑에 안내 표말은 찍어야지... 적어둬야지 하면서...ㅡㅡ;;
이렇게 또 후기 쓸땐 뭐지...? 요로고 있습니다. ㅎㅎ

사용자 삽입 이미지

또 이러지요~
이 꽃은 무슨... ( ㅋㅋㅋ ) 꽃일가요...? ㅎㅎ
이름을 아시는 분~ ( 흐 흐 흐 흐 )

수줍게 고개를 떨어 뜨긴 꽃... 아직 피지 않은 꽃도 있고, 이제 피어나는 꽃도 있구요...

사용자 삽입 이미지

어둑어둑한 구름뒤에 숨어 계신 구름님...
아침에 반짝하시더니 수줍으신지 아직도 숨어서 나올 생각을 안하고 구름뒤 오로라를 만들어 주셧네요~ ㅎ


사용자 삽입 이미지

그디어 노을공원에 올라 왔습니다.

작년 말에 개장(?) 오픈을 해서 그런가요...? 아직 많은 사람들이 알지 않아서 그런지...
사람도 하늘공원보단 적고 노을공원이전의 모습은 골프장이였다네요...?
그래서 그런지 잔디도 다른 공원들 보다 훨신 좋고 잘 가꾸어져 있네요...^^;


사용자 삽입 이미지

노을공원의 넓은 잔디 광장을 거닐다보니 이렇게 어느길로 가야 할지 망설임을 주기도 하였지요.
구도가 좋아서 직어 보긴 했는데요~ ㅎ

딱! 햇볓 만 조금더 있었더라면... 하는 아쉬움이 조금 남네요~ ㅎ
뭐그래도 좋아요~ 나름 좋은 그림 담았다고 생각 하니깐뇽~ +_+ ㅎㅎ

사용자 삽입 이미지
 
노을공원에는 이렇게 혼자 서서 외로움을 즐기는 나무가 많더라구요~
( 저 처럼 말이죠~ )

바람에 하늘하늘... 나무 가지와 잎이 하늘하늘...
왠지 계속 보고 있으니 갑자기 쓸쓸해 진다고 해야할까요...??

하늘공원에는 가족단위의 인파가 않다면...
노을공원에는 주로 커플들이 옹기종기 구석구석 앉아 있어서... 그런지도 모를 일이지요~^^;;

사용자 삽입 이미지

이젠 완전히 해가 지고 구름과 구름 사이로 작으마한 노을만 보이네요~
약간은 어스름 하지만 간얇게 보이는 노을과 함께 오늘의 힘들었던 하루를  굿바잉~( *^_^* )

이번에 사진을 많이 찍었는데요. 너무 오랜만에 카메라를 잡고 찍어서 그런저...
마음같이 사진이 찍히지 않네요~ ㅎㅎ

아직 더 배울까 많나봐요~ ㅎㅎ
끝까지 읽어 주셔서 감사합니다..^^*

앞으로도 더 멋찌고 이쁜 사진을 위해 아자아자! 아지뵹~ ( +_+ )

뜨거운 여름의 햇살을피해 한동안 카메라를 방구석 한귀퉁이에 모셔 놓았다가...
카메라를 잡은지 2개월만에...

오랜만에 운동겸 등산출사를 하게 되었네요.
이번에 제가 소개 할 곳은 서대문구에 있는 안산 이랍니다.

경기도 안산시 가 아니라...
서대문구청 바로뒤에 있는 안산공원이 있는 안산 이랍니다...^^;;

사용자 삽입 이미지

그리 높지 않을 것이라는 생각에 무턱대고 올랐다가...
가파른 언덕과 산길에... "헉~@_@"

뭐 그래도 산 중간쯤 오르니 사진처럼 나무가 곧게 자란 공원겸 주민들이 산림욕을 할수 있는 장소가 마련되어 시원한 바람에 땀을 식히며 잠쉬 쉬었다가 갈수 있었네요.

사용자 삽입 이미지

무성한 나무들 사이로 쨍한 햇살을 받으면서 자라고 있는 풀들도 볼수 있었구요...
왠지 저도 생글생글 해지는 기분 이랄까요...+_+ ㅎㅎ^^;;

( 나이는 얼마 안되지만 말이죠~ ㅎㅎ 좀더 젊어 지는 느낌이랄까..? ㅋㅋ 풉~ )

사용자 삽입 이미지

제가 가야 할 곳은 전망대~ 앞으로 450M남앗네요~

이 거리가 얼마나 힘들던지... ㅎㅎ
오랜만에 등산 출사라서 그런지... 앞으로는 등산좀 자주 해야 겠어요~ ㅎㅎ

사용자 삽입 이미지


전망대를 향해 올라가던길에 약수터 앞에 나무 사이에 떨어 지다가 걸린 나무가지가 걸려 나무에서 떨어지기 싫은지 꼬~옥~ 붙어 있어서...^^;;

한방 찍어 봤드렜습니당... ㅎㅎ

사용자 삽입 이미지

전망대에서도 봉화대를 보려면 250M인가...?? 더 올라 가야 한다 더라구요~
올라가던길에 아슬아슬 높게 쌓여 있는 돌탑두 보았구요~

사용자 삽입 이미지

열심히 가을 준비를 하는 벌님...★
한껏 가을의 정취를 만끽하고 있는 꽃님...☆

사용자 삽입 이미지

저기~ 멀리 남산타워가 한눈에 보이고, 그아래 서울 시내가 시원하게 보이더군요.
힘들게 올라와서 그런지 약간의 스모그로 인하여 탁~ 트인 시야는 아니지만 넓은 서을 전경을 볼수 있는 하루여서 좋았습니다. ㅎ  

사용자 삽입 이미지

문득~ 산 아랫쪽을 보니 아직 한번도 가보지 못한 서대문 형무소가 있더군요...
언제 한번 사진찍으로 저길 가봐야겠습니다... ㅎㅎ
 

사용자 삽입 이미지

초가을의 햇살이 하루의 마지막 뜨거운 태양의 빛을 비추며 하루를 마김할 준비를 하고 있네요.
저도 얼른 해가 떨어 지기 전에 내려가야 할 텐데 말이죠... ㅎㅎ

사용자 삽입 이미지

어느덧 뜨거운 태양은 사라지고,
붉은 노을만이 남앗네요. 노을과 함께 햇살이 없어지면서 안산의 봉화대 정상은 추위와 모기습격이 시작되었다죠... ㅎㅎ

사용자 삽입 이미지

저~기 멀리 63빌딩도 보이죠~
노을 빛에 물들어 수많은 빌딩들 중에 꼭 합성해 놓은 듯이 빛나고 있네요~

초등학교때 쯤인가요...? 그때 한번 가보고 아직 한번도 못 가본 그곳...
아직 서울 시내에는 제가 못 가본곳과 가봐야 할 곳이 천지에 널려있네요...^^;;

사용자 삽입 이미지

하늘에 구름이 서로서로 누가 빨리 가나 달리기를 하고 있다죠....?? ㅎㅎ
처음엔 세로로 달리더니... 어느 순간 가로로 달리기를 하더라구요... ㅎ

파란하늘에 하얀 구름 4줄...

사용자 삽입 이미지


마지막으로 완전히 넘어간 햇님과 드넓게 펼쳐진 노을을 마지막으로 서대문구 안산 봉화대에서 바라본 하루를 마감 하렵니다...^^;; ㅎ

빨리 빨리 후기를 썼어야 하는데...
너무 오랜만에 쓰기에 머리가 굳어서 그런지..ㅋㅋ
사진에 적당한 이야기꺼리가 생각이 나지 않아... 고생 좀 했습니다.. ㅎㅎ

 
[ 사진 저작권 관련 안내 ]


어느덧 제 블로그가 정보관련 블로그에서 사진 블로그로 함께 운영이 되어 블로그에 올라온 사진의 갯수가 작지 않네요.

이에 사진 사용에 관련하여 메일이나 전화 문의를 하시는 분들이 계시는군요.
( 얼렁뚱땅 찍은 사진을 사용해주신다니 감사합니다...^^* )

뭐 제가 사진을 잘 찍는 것도 아닌데 이렇게 저작권을 운운한다는 자체가 조금은 민망하기도 하지만, 저작권법이 강화 되어 다들 블로그에 이미지 하나, 사진 하나를 사용하는데 있어서 망설임을 줄이고자 알려드립니다.



=========================================================================

1. 모든 사진은 영업및 판매, 이익을 목적으로는 사용할 수 없습니다.

2. 워터마크 변형 없이 위 1번 항목을 제외하고,
    어느 곳이나 사용이 가능합니다.

3. 사진 원형을 변경하여 워터마크를 선명히 알아 볼수 없을 경우,
    블로그의 주소를 "출처"로 표시하면
    위 1번 항목을 제외하고 어느 곳이나 가능합니다.

4. 사진의 원본은 제공하지 않습니다.
 

5. 영업및 판매, 이익을 목적으로는 사진이 필요 하신 경우
    별도 문의를 해주시기 바랍니다.

=========================================================================



이익을 목적으로 사진이 필요할 경우 별도의 협이가 필요하며,
블로그 운영자와 협의가 되어야 사용이 가능합니다.



※ 이상 본 블로그의 사진 저작권 안내 입니다.



================================================================



[ 저작권 문의 ]

전화 : 010 - 9000 - 8533

전화 :
070 - 8246 - 8533

메일 : ezk33 @ paran . com



참으로 오랜만에 블로그에서 키보드를 잡아 보는 것 같습니다.
맨날 꾸준히 포스팅 해야지~ 해야지~ 하면서 마음먹은 것 처럼 쉬운일인 아니네요.

사용자 삽입 이미지

그디어 뜨겁던 날씨 마저도 선선하게...
새벽엔 창문 열어 놓고 자다가 추워서 이블덥고... 그래도 취워서 뒹굴뒹굴... 구석에 웅크리고 자고... 하하하~

결국 추워서 잠도 제대로 못 잤다죠~ ㅎㅎ

이제 날씨도 선선해 졌으니...
다시 사진을 찍으러 돌아 다닐까봐요~ ㅎㅎ

아차! 일단 가을도 되었으니... 이사를 해야 해요~ ㅎㅎ

지금은 "서울사람"이지만... 다음주 부터는 경기도 부천으로 간다죠...
교통 여건도 좋아지고 방도 크고, 싸고...ㅋㅋㅋ ( 싸서 가는거랍니다...ㅡㅡ;; )
( 갑자기 이사 이야기는 왜~ 나온겨~ )

사용자 삽입 이미지

암튼! 이제 가을이네요~
초가을에 접어 들거 가는건지... 아참과 낮 그리고 밤의 기온차이가 많이나요~

이럴때 건강 잘~ 챙겨야 한다죠...?
요즘 "신종플루"때문에 더 신경이 쓰여요~ ㅎㅎ

대중교통이나 사람이 모인곳에서 누군가 기침을 심하게 하면 스리슬쩍~~~
자리를 피하게 되고~ 눈치주게되고...ㅡ.,ㅡ;;

암튼암튼!!
오랜만에 블로그에서 키보드 잡고 주저리주저리...
이상한 이야기만 했네요~

음~

결국 결론은! " 모두모두~ 건강하세요.^^* " 히힛~ ( *_* )
아~ 무런 조건 없습니다.
신청만 하세요. 그냥 보내드립니다.

티스토리를 사용해보고 싶으신 분들...
아직 블로그 세계에 빠져보지 못 하신분들...

사용자 삽입 이미지

지금도 늦지 않았습니다...
신청하세요.

단, 초대장 받으시고 2일 이내 블로그만 개설 하세요.
묻지도 따지지도 않고 신청만 하시면 초대장 보내드립니다.

저도 티스토리를 가입해서 사용하고 있진 하지만요...
테터툴즈 설치형을 쓰다가 서비스형으로 넘어 가려니 영 어색해서... ㅎ

일단 이것저것 기능만 테스트 하는중이네요...ㅡㅡ;

초대장 배포하면서 조건을 주저리주저리 다는 사람들이 많은데요...
전 없습니다.

초대장 보낼 메일주소만 있으면 확인 하는데로 보내드립니다. ㅎ
저도 오늘 포스팅으로 받은 내용을 보다가 한국형 "트윈터(Twitter)"서비스가 이번에 새롭게 나왔다고 하여 이렇게 포스팅을 시작해봅니다...

사용자 삽입 이미지

참으로 희안한 일 입니다.
기본 디자인 부터 UI까지 기존의 "트위터(Twitter)"와 별반 다를게 없는데...
단지 다른건 한국어로 서비스를 한다는 것...

문제는 "트위터(Twitter)"서비스가 현재는 영문만 제공하지만,
한국어를 지원하기 시작한다면...

"야그(Yagg)"서비스는 어떻게 되는 걸가요...?

뭐 일단 한국어로 서비스를 하지 처음 접근하기엔 거부감이 없어서 좋긴 하네요.
아! 좋은 장점 하나가 또 있네요...

"트위터(Twitter)"서비스에 가입을 했다면 "야그(Yagg)"서비스와 연동이 된다는거...

특히나 "야그(Yagg)"서비스에서는 SMS으로 글을 올리면 "야그(Yagg)"에도 올라가고,
"트위터(Twitter)"에도 올라단다는 것 입니다...

일단 한국에서 처음 선보이는 한국형 SNS서비스이니...
일단 가입을 하고 사용을 해보는데...

정말 "트위터(Twitter)"랑 같네요..ㅡㅡ; 그냥 한국어 번역본 서비스 같다는 생각이...^^;;
앞으로 좀더 사용하다보면 뭔가 다른 점이 있겠죠... ㅎㅎ

지금은 베타기간이라 추천 가입만 된다네요...?
http://yagg.kr/i/Ej25V166me0Fjby
가입을 위에 주소로 들어 가시면 가입이 되네요... ㅎ
변화 하는 믹시(mixsh)...

사용자 삽입 이미지

처음 시작할때부터 꾸준히 지캬 봐 왔지만...( ?? )
( 나름 새로운 서비스라구 열심히 봤어요... ㅎ )

이번에 업데이트 되면서 변화가 가장 큰 것 같은 느낌이 드네요...ㅎ
이번에 믹시(mixsh)에서 '마이믹시' 라는 위젯이 나와서 냉큼 달아 봤습니다.

원래는 이런거 잘~ 안달거든요...ㅡㅡ;
저~ 번에 파란의 접속통계 위젯이던가요...?
그거 한번 달앗다가 홈페이지 완전 느려지고... 막 그래서요... ㅎ

위젯이라면 일단! 워워워~ 부터 했는데요... ㅎ
세상과 그리고 수많은 블로거 들과의 소통을 위해 달아 봤습니다.

꼭 트위터같은 느낌도 들고, 이거뭐 쫌더 자세히 살펴 봐야 겟지만...
블로그에서 블로그 소통으로 통하는 지름길 같아서... ㅎㅎ

여러분도 냉큼~ 달아보세요. '마이믹시' 위젯 입니다... ㅎ
완전~ 오랜만에 블로그에 포스팅을 하는 기분이네요...
요즘 회사일이... 여름 휴가에...

또 급박하게 이사 준비를 하느라...
블로그에 신경을 쓸 시간이 없엇는데...

이제 쪼금 여유가 생겼는지..ㅎㅎ
블로그 생각이 문득나서 남의 블로그인 것 같은 제 블로그에 접속을해서...
이렇게 끄적여 봅니다...

몇일전 트위터에 가입을 해봤습니다...
어떻게 쓰는지도 모르겠구요...
이걸 왜~ 쓰는지도 모르는체... 일단 가입을 해뒀습니다... ㅎㅎ

사용자 삽입 이미지

일단 도메인이라고 해야할까요...?
저의 고유 아이디 선점을 위해 가입을 하기는 했어요...
http://twitter.com/skystory

위에 주소가 제 트위터 주소에요.

요즘 미투데이나 트위터에 연예인들이 몰리면서 급 알려지기 시작했는데요.
글세요.

이게 그렇게 좋은지는 전 조금더 두고 봐야할까봐요.
일단 전 부정적으로만 보이네요...ㅡㅡ;

비 동기식 메신저라고해야할까요...?
어느 블로그 소개에서도 불평아닌 불평 예로 싸이월드 방명록과 같은...
글을 남기면 그 글을 확인하고 답변 하고...

결국 싸이월드의 방명록과 별다를께 없다는거라네요.
다만...
방명록은 1:1이 되지만 트위터는 1:N이라는 점과 검색 엔진과 함께 엮여 있다는 강점 정도...?

암튼! 일단 가입은 했으니...
몇일...? 아니 몇 주는 사용해보고 다시 그 사용기를 올려야겠어요... ㅎ

오랜만에 블로그에 포스팅을 하려니...
이거참...
제 블로그 같지도 않고...ㅡ,.ㅡ 영~ 어색한게... ㅎㅎ

이것도 습관이 되어야 하는데 말이죠... ㅎㅎ

남이섬에 다녀온지는 거의 1달이 다되어 가는데요... ㅎ
이제야 정신을 차리고 남이섬이야기를 풀어 볼까 해요..

주말에 남이섬에 들어갔는데요.
그렇게 사람이 많지 않아서...

다행이엿던 하루 였죠... ㅎ
푸르름이 가득햇던 어느 여름날 남이섬의 이야기를 풀어 보겠습니다...

사용자 삽입 이미지

두번째 찾은 남이섬이네요... ㅎ
처음에 갔던 방향의 반대로 남이섬을 구경해봤습니다...ㅎ

저~ 나무가 자일리톨나오는 나무던가요..ㅡㅡ? ㅎ
꼭메타세콰이어길 같이 만들어 놔서...
여름에 태양을 피해 걷기엔 딱! 좋은데...

단한가지 단점은!!
저 길로 전기자동차, 자전거, 모든 이동수다이 쌩쌩~ 다닌다는거..ㅡㅡ;;
그냥 분위기 좋게 걸어 다니면 안될까요...ㅡㅡ;;

꼭 이런데 까지와서 뭔가를 타고 빠르게 구경을 해야하는건지...

사용자 삽입 이미지

길을 가던 중간에...
나무가 옆으로 누워있는데...
처음엔 죽는 나무인줄 알앗거든요....?

근데 나무에 잎도있구요... 살아 있던 나무더라구요...
거기위에 올라가서 뛰고 그랬는데...

너무한테 미안하네요...ㅡㅡ;

사용자 삽입 이미지

보이시나요...?
푸르름이 가득한 길...^^;;

정말 속 시원해지는 기분이에요... ㅎ

사용자 삽입 이미지

푸른 나무잎이 가득한 남이섬...

사용자 삽입 이미지

소나무길...
너무 많은 사람들이 다녀서 그럴까요...?

소나무 뿌리 부분이 흙위로 올라와있거나, 매말라 죽어가는 소나무가 보이더군요.

사용자 삽입 이미지

저~ 멀리 넓게보이는 잔디밭...

사용자 삽입 이미지

시원하게...
뛰어놀면 딱!! 좋은 넓디 넓은 남이섬...

사용자 삽입 이미지

매말라 죽은 것 같지만...
아직도 살아 있는 고령 나무...

사용자 삽입 이미지

하얗게 말라버린 나무 옆에 새롭게 피어나는 나무 한그루...

사용자 삽입 이미지

넓은 잔디밭 중간...
이렇게 나무가 심어져 태양을 피할 수 있도록 해주네요.

사용자 삽입 이미지

여기는 그~ 유명한 메타세콰이어길...
사람이 너무 많아서 하늘보고 찍엇더니... 별루네요..ㅜ,.ㅠ

사용자 삽입 이미지

자~ 이번엔 땅을보고...
제일 사람 없을때 찍은 사진 이랍니다...
정말 사람 없는 사진을 찍고 싶으면...

남이섬 안에서 자고 아침일찍 일어나서 찍는 수 밖에 없다네요...ㅡㅡ?

사용자 삽입 이미지

메타세콰이어길...

사용자 삽입 이미지

썩는 나무 속에서 새롭게 자라라는 생명...

사용자 삽입 이미지

언제나 푸르름을 가지고 있는 넓은 숲.

사용자 삽입 이미지

이 사진은 그냥...
찍어 봤드랬습니다... ㅎ

자 이렇게 남이섬 이야기를 다 했는듯 하네요... ㅎ

원래는 사진찍고 바로 올려야 할 이야기가 많은데요...
이건 너무 오랜 시간이 지나가는 바람에...

사진 별로 의미 부여도 그렇고...
이야기를 구성하는게... 참...^^;;

무려 1개월이 지나고 나니... 사진을 왜 찍었는지... 어떤 느낌으로 찍었었는지...
까마득 하네요... ㅎ

다름번엔 쫌더 빠른 후기를 올려드리도록 노력 하겠습니당...^^* ㅎ


장마 기간에 맑은 날을 틈타...
낼름... 다녀온 곳이 있습니다... ㅎㅎ

바로바로 그토록 가고 싶었던... "아침고요수목원" 그리고 다시 찾은 "남이섬"...
아침일찍 새벽 6시에 출발해서 갔더니...
도착이 8시...

완전 일찍이라서 그런지 사람이 없어 수목원 구경하기에 좋더라구요...ㅎㅎ
가실분은 아침일찍!! 가세요^^*

사용자 삽입 이미지

최근 많은 비로 인하여 시원하게 폭포가 떨어지고 있더군요...
아침이라 시원했는데...
폭포를 가까이서 보니... 춥더라구요... ㅎ

사용자 삽입 이미지

이게 무슨 꽃이더라...ㅡㅡ;;
제가 갔던 날인 이 꽃축제 하는 날이더라구요~

파란색이 이쁘더라구요...ㅎㅎ

사용자 삽입 이미지

여기가 "미인폭포"던가..."선여폭포"던가...ㅡㅡ;;
예전에 처음 갔을땐 못 가본 곳이 였는데...

이제서야 제대로 둘러 보는군요...ㅎㅎ

사용자 삽입 이미지

폭포를 보고 이 계단을 따라서...
올라 왔습니다...

난간 옆으로... 푸르름이... 한가득...+_+

사용자 삽입 이미지

그렇게 열심히 계단을 올라오니...
다람쥐 한마리가 반겨주더군요...

냉큼 도망가기전에 찍어 봤는데요...ㅎ
정말 귀여워요...+_+

사용자 삽입 이미지

원 없이 꽃만 찍엇던 하루가 아니였나 싶네요...^*^ ㅎㅎ

사용자 삽입 이미지

점점 꽃만 보이죠...? ㅎㅎ
완전 이른 아침이라... 저~~ 멀리 커플도 하나 보이지 않더군요...

커플이 보였으면 그 커플을 몰래라도 찍어봤을 텐데요...^^;; ㅋㅋ

사용자 삽입 이미지

꼭 국화 꽃 같은 꽃입니다...
이름은 따로 있는데...

왜~ 이름은 같이 찍지 않고 꽃만 찍고 왔을까요...?
이름을 다~~ 외울 수 있다는 너무 무한 자심감이였나봐요...ㅡㅡ;;

사용자 삽입 이미지

꽃찍고 있는데... 얻어 걸린... 나비 한마리~
검은 나비인데요~

무지 크더라구요~
사진엔 이쁜뎅... 어쩜 옆에 날아 다니면 징그러운지...^^;; 아하하하하

사용자 삽입 이미지

꽃이 많아서 그런지...
나비도 많이 있더라구요...

꽃만 찍는데 심심했었는데... 잘 됬죠뭐~ ㅎㅎ

사용자 삽입 이미지

길 옆에... 둥굴게 모여있는 꽃들...

사용자 삽입 이미지

이 길을 따라가면... 어디로 갈까요...??
구불구불...

꼭 제가 살아가는 삶의 길과 같은듯해요...
구불구불...

직선으로 갔더라면... ㅎㅎ

사용자 삽입 이미지

어느정도 찍다보니...
시간이 벌써 점심 시간을 향해 가고...

태양도 뜨겁게 절 내려 쬐더라구요...
그래서 잠시 옆에 개울가로 고고싱 했답니다...

물에 비친 햇님!!

사용자 삽입 이미지

정말이지... 꽃은 원없이 찍었어요... ㅋㅋ
이젠 꽃사진 하나 만큼은 잘찍을 사진있다는거..ㅋㅋㅋ

사용자 삽입 이미지

아직 떨어지지 않은 아침이슬이...
잎에 몽울몽울... ㅎㅎ

사용자 삽입 이미지

뜨거운 태양속에..
잠자리도 지쳤는지...

사진을 찍으려고 카메라를 가져가도 날아가지 않더라구요...

사용자 삽입 이미지

정말 쉬고 싶엇던 오두막...!!
시간이 없어서... 패스 했습니다...

정말 수박 한 조각이 생각나는 장면이네요...ㅡㅡ;;

사용자 삽입 이미지

멀리~ 전망대에서 잡아본 "아침고요소목원"입니다... ㅎ
아침일찍 수목원 개장시간에 마춰 움직였더니...

사람이 많이 있지 않은시간에 모든 곳을 마음 것 둘러 볼수 있는 시간이여서 좋았던 것 같습니다.

특별한 태마의 구성같은건 없지만...
지루한 주말...

갑갑한 서울시내...
도시를 떠나 나드리 가시면 어떻가 싶네요...^^;;

사용자 삽입 이미지

원래는 max-width를 써서

img {
     max-width: 600px;
}

이나

img {
     max-width: 80%;
}

이렇게 해주면 되지만 익스플로러를 위해 한줄 더 추가하면

img {
     max-width: 600px;
     width:expression(this.width > 600 ? "600px" : this.width);
}

파이어폭스, 익스플로러 모두 제대로 적용됨.

내리는 폭우를 뚫고 전라남도 보성으로 향했습니다...
정말 비가 무섭게 내리더군요...+_+;;

차를 직접 운전해서 가는지라...
빗길 이기도하고 그래서... 도로 이동 경로는 하나도 파일로 못 담았네요...
비만 오지 않았어도 조금씩은 길을 찍으면서... 이동했을텐데...^^;; ㅎㅎ

금요일 오후 9시에 서울에서 출발 했습니다...
중간중간 휴게소 들리고... 자동차도 쉬고...

그렇게 열심히 운전해서 도착한 보성...
새벽 3시 40분쯤에 도착해서 간신히 숙소에 들어가서 잠을 청한 시간이....
4시쯤... 완전 빗길에 운전에... 밤길 고속도로 운전...

자동차를 운전하면서 이렇게 강행군 운전은 처음 해본 기억이 될것 같네요... ㅎㅎ
담번엔 시간좀 넉넉하게 잡고 즐기면서 이동해야겠어요... ㅎㅎ

이제부터 제가 담은 사진들을 공개할까해요...^^*
잘~ 찍은것은 아니지만... 그냥 함 구경정도만으로 봐쥬세요...( >'0'< )

사용자 삽입 이미지


보성에 새벽에 도착해서 잠을 청하고,
아침은 보성다원 주차장 입구에 있는 휴게소(?)에서 라면한그릇 땡기고...
걸어 올라가는 길...

꼭 첫느낌은 녹차밭에 가는길이 아니라...
수목원이나 살림욕을 하러 가는 기분이 들더군요... ㅎㅎ

사용자 삽입 이미지


그렇게 열심히 올라 가는길에... 전날 비가와서 그런지...
나무와 언덕 사이에 작은 물길이 생겨서 흐르고 있더라구요...

사용자 삽입 이미지


아직 녹차밭에 정식적으로 도착한건 아니지만...
입구에 들어가기전에...
맛보기 식으로 이렇게 작은 녹차밭이 있더라구요...?

녹차밭 처음본건데... ㅎ
뭔가 새로운 것 같기도 하고... 휑하기도 하구요... ㅎㅎ

사용자 삽입 이미지


아직 100M나 남은 녹차밭...
대략 주차장에서 200M나 올라온거 같은데...
아직도 한참을 더 가야 한다니... ㅎㅎ

그래도 이거 보러 여기까지 왔으니... 가야겠죠...^^*?

사용자 삽입 이미지


녹차밭 입구 바로 오르막길 전에 옆에 있는 나무길...
왠지 저쪽으로 가보고 싶엇는데...+_+

주 목적이 녹차밭이라... 일단 패스하고...
녹차 밭으로 고고씽~

사용자 삽입 이미지


녹차밭이라는 것을 처음봤는데...
이젠 너무 상품화가 되어 버린건지... 관광지로 거듭나는 건지...

생각보다~ 느낌이랄까...?
제 머리속에 그리고 있던 그림과는 많이 다른 풍경을 자랑하더라구요...+_+

사용자 삽입 이미지


녹차밭 중간중간엔 이렇게 나무 한그루가 꼭 있더라구요...?
처음엔... 미관상... 조경상 일부러 심어 놓은듯 그런가보다~~
그렇게 생각을 하고 있었는데요...

그게 아니더라구요~
녹차잎을 따던 인부들이 태양을피해 잠쉬 쉴수 있는 공간을 마련해둔것이라고 하더군요...

사용자 삽입 이미지


사람이 많이 오는곳이라 그런지...
중간중간 이런 대리석 의자들이 있더군요...

이 사진을 보면 왠지 느낌이 외롭다고 할까요...?
갑자기 저도 모르게 뭉쿨해 지는 이 마음이...^^;;

사용자 삽입 이미지


녹차밭을 뒤로하고 점식을 먹으로 담양으로...
담양에서 점식을 먹고, 부여로 가려더중...
담양의 명물(?) 메타세콰이어 길에 잠시 들렸습니다.

처음엔 별도로 길이 있는줄 알았는데요....
농노나 오솔길 같이... 말이죠...

그런데... 그냥 일반 도로 양옆에 이렇게 구성되어...
담양에서 외각으로 빠져나가는 길이 모두 이렇게 되어있다라구 하더군요...

뭔가를 찾고자 하고 찾다보면
" 아~ 그냥 나무길이네~? " 하고 지나가기 좋은 것 같더라구요..ㅎㅎ

사용자 삽입 이미지


메타세콰이어길에서 사진을 찍고 발걸음을 돌리던중...
만난 잠자리 한마리...
살랑살랑 부는 바람사이에 살며시 앉아 여유를 부리는 잠자리...

사용자 삽입 이미지


조금은 허무하지만... 아쉬운 메타세콰이어길을 뒤로하고...
부여 궁남지로 왔습니다...
궁남지에 도착하니 비가 내릴려하는지... 하늘에 먹구름이 가득 가득...+_+

그래도 사진은 찍어야하니...ㅎㅎ

궁남지엔 연꽃축제(?)가 있더군요...
뭐 이미 꽃들은 많이 지고 그랬지만... 넓게 펼쳐진 연을 본 순간 마음이 뻥~~
뚫리는 그런 느낌을 받앗어요.. ㅎㅎ

먹구름과 함께 몰려온 바람때문인지...
바람에 이기지 못한 연꽃잎이 떨어져 연꽃의 아쉬움을 남겨 주더군요...

사용자 삽입 이미지


아직 바람에 마써 저를 반겨주던...
연꽃도 잇더라구요...

왠지 저를 향해 하트 "뿅뿅"을 해주는 것 같이...
꽃잎 두장이...
하트 모양으로 인사를 하더라구요...+_+;;

사용자 삽입 이미지


바람과 먹구름이 급격히 몰려오는 바람에 찍던 사진을 몸추고 이제 출발 하려고 가던중...
연잎에 동글동글 모여 있는 물방울이 이뻐서 담아 봤어요...+_+

24시간동안 다닌거리가 800KM정도 되니...+_+

정말 엄청난 초강력 체력출사 였는듯 싶네요... ㅎ
그래도 서울 밖을 나가 또다른 모습을 보고 느낄수 있는 시간이 여서...
좋았던 시간이 였습니다...

가끔은 이렇게 멀지만 서울밖, 수도권 밖으로 바람도 쏘이고 지겨운 일상도 버릴겸 나가보는것도 좋을 것 같아요...

출사를 다녀 온지 24시간이 지났는데도...
아직도 몸이 피곤하네요... ㅎㅎ

+ Recent posts