Posted on 2012/11/28 14:03
Filed Under Linux/설정방법

DNS server, DNS service  

About istatd

istatd is a daemon serving statistics to your iStat iPhone application from Linux, Solaris & FreeBSD. istatd collects data such as CPU, memory, network and disk usage and keeps the history. Once connecting from the iPhone and entering the lock code this data will be sent to the iPhone and shown in fancy graphs.

What is iStat for iPhone?

iStat is a iPhone application developed by Bjango (http://www.bjango.com/). With iStat you can remotely monitor CPU, memory, disks, uptime and load averages from any Mac, Linux or Solaris computer from your iPhone. You can download iStat in iTunes App Store.

How to install

These steps assume you are logged in as root and have GNU build tools installed together with libxml2.

1) Download istatd-x.x.x.tar.gz

   # wget http://github.com/downloads/tiwilliam/istatd/istatd-0.5.8.tar.gz

2) Extract tar ball

   # tar -xvf istatd-0.5.8.tar.gz

3) Install dependencies

   istatd requires GNU build tools, libxml2 and libxml2-devel.
   Depending on your distribution these packages can be diffrently named.

   CentOS
   # yum install libxml2-devel

   Ubuntu
   # apt-get install libxml2-dev

4) Build istatd

   # cd istatd-x.x.x

   Here you can configure where you want your binary and config to end up (default /usr/local).
   # ./configure
   or
   # ./configure --prefix=/ --sysconfdir=/etc
   or
   # ./configure --prefix=/usr/local/istatd


   # make
   # make install

5) Add user and configure directories

   # useradd istat
   or
   # groupadd -g 150 istat 
   # useradd istat -d /usr/local/istatd -u 150 -g 150 -s /sbin/nologin -g istat


   # mkdir -p /var/{run,cache}/istat
   # chown istat.istat /var/{run,cache}/istat

6) Configure your config to match your needs and system

   # vim /etc/istat.conf
   or
   # vi /usr/local/istatd/etc/istat.conf

   Note: Don't forget to change your server_code.

7) Fire it up

   # /usr/bin/istatd -d
   or 
   # /usr/local/istatd/bin/istatd -d
2012/11/28 14:03 2012/11/28 14:03

Posted on 2012/09/23 01:44
Filed Under Linux/설정방법

DNS server, DNS service  

CentOS 상에 MySQL5.5.25 Source Compile 설치.
1. 해당 시스템 상에 root 계정으로 로그인

2. http://www.mysql.com 으로 부터 MySQL-5.5.25.tar.gz 소스 파일 다운로드.

3. wget cmake.org/files/v2.8/cmake-2.8.8.tar.gz 다운로드
    MySQL 5.5 버전부터는 크로스 플랫폼을 지원을 위해서 configure 대신 cmake 유틸리티로 변경되었음.

    – tar -zxvf cmake-2.8.8.tar.gz
    -  cd cmake-2.8.8
    -  ./bootstrap
    -  make
    -  make install
 
    위 설치가 완료되면, /usr/local/bin/cmake 가 생성된 것을 확인할 수 있다.

4. tar -zxvf  MySQL-5.5.25.tar.gz

5. 컴파일 실행
     cmake -DCMAKE_INSTALL_PREFIX=/MySQL/

-DWITH_EXTRA_CHARSETS=all
-DMYSQL_DATADIR=/MySQL/data/
-DENABLED_LOCAL_INFILE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all
-DMYSQL_TCP_PORT=3306

    5.1 cmake 실행 도중,

               — Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
                   CMake Error at cmake/readline.cmake:83 (MESSAGE):
                   Curses library not found.  Please install appropriate package, 와 같은 에러 발생 시,

              yum -y install ncurses-devel  실행.

6. make && make install

7. groupadd mysql && useradd -g mysql -d /MySQL -s /bin/false mysql

8. cd /MySQL

9. chown -R mysql.mysql .

10. ./scripts/mysql_install_db —user=mysql

11. chown -R root .

12. chown -R mysql data

13. install -m 755 /MySQL/support-files/my-innodb-heavy-4G.cnf /etc/my.cnf

14.
     vi /etc/my.cnf
       default-storage-engine = InnoDB
       innodb_force_recovery=0

15.
     install -m 755 /MySQL/support-files/mysql.server /etc/rc.d/init.d/mysql
     chkconfig —add mysql
     chkconfig —level 3 mysql on
     chkconfig —level 5 mysql on
   
     /etc/rc.d/init.d/mysql start

16.
     /MySQL/bin/mysql -u root -p mysql
        update user set password=password(‘12345’) where user=‘root’;
         flush privileges;
 
     /MySQL/bin/mysql -u root -p 12345 
2012/09/23 01:44 2012/09/23 01:44

Posted on 2012/08/27 01:03
Filed Under 컴퓨터 기술 및 정보/일반 팁

DNS server, DNS service  

===========================================================================================================
각종 용어 설명
===========================================================================================================

● UV(Unique Visitors)
일방문자수

● NRU(New Registered User)
신규유입자

● CCU(ConCurrent User)
동시접속자
정의 : 동일한 시간대에 게임에 접속해 있는 유저를 말한다. 흔히 로그인 서버를 기준으로 산정한다.

● ACCU(Average ConCurrent User)
평균동접

● PCCU(Peak ConCurrent User)
최고동접

● PU(Paying User)
정의 : 구매유저수

● BU(Buying User) = PU(Paying User)
구매자, 한번이라도 캐쉬 아이템을 구입한 적이 있는 유저
주로 정액제 비지니스 모델을 사용하는 게임에서 활용하는 용어
정액 비용을 결제한 유저(PU), 캐쉬 아이템을 구입한 유저(BU)

● ARPU(Average Revenue Per User)
정의 : "일정기간"의 매출액을 그 기간내의 BU로 나누어 산출한 수치
       한달을 기준으로 해서 유저가 평균적으로 결제한 금액으로 산정.
ARPU 구하는 공식 = 한달간총매출/한달간총PU
                 = (총매출/총구매건수) * (총구매건수/총PU)
                 = 구매1건당평균구매가격 * 1인당한달간평균구매건수
PU 1인당 1달 평균 구매가. 전체매출/PU, 1인당 한달간 평균매출액

● UV(Unique Visitor)
한번이라도 접속을 한 유저

● BUrate(Buying User rate)
BU/UV

● MMO UV 산출법 : PCCU * 3.935
CASUAL UV 산출법 : PCCU * 7.45

● QC(Quality Control)
품질관리
게임의 테스트, 분석 등을 통해 문제점을 파악하는 업무

● QA(Quality Assurance)
품질관리
QC의 업무 자체를 보증하는 업무

● RMT(Real Money Trading)
현거래/현질

● Postmortem
원래 의미는 부검으로 게임 개발 이후에 개발에 대한 사후 분석을 하는 행위

● LF(License Fee)
계약금

● MG(Minimum Guarantee) = AR(Advanced Royalty)
로열티를 미리 책정해 땡겨받음

● TFT(Task Force Team)
특정한 일을 해결하기 위해서 선별된 인력으로 구성된 임시조직

● CM(Commercial Launch)
상용화

● F2P(Free to Play)
부분유료화 비지니스 모델을 택한 게임

● P2P(Pay to Play)
정액제 비지니스 모델을 택한 게임

● AP(Associate Producer)
게임 기획자와 유사한 역활로 창의력이 요구되는 직책, 각종 이벤트/프로모션 기획, 아웃소싱/관리
코디네이션 업무와 일정관리 등의 업무를 수행

● 잔존율 = 재방문율
정의하기에 따라 다르지만 본인의 해석은 다음과 같음
정의 : 현재 게임의 지속성을 가늠하기 위해 활용되는 대표적인 지표로 보통 <주별 재방문율> 기준으로 4주를 기준으로 신뢰성을 가진다.

● IDC(Internet Data Center)
항온·항습·보안시설 등을 갖추고 인터넷 업체들에 서버를 빌려주거나 이들의 서버를 대신 관리해주는 곳
한마디로 서버관리 대행업체.

● CDN(Content Delivery Networks)
원활한 다운로드를 위해서 콘텐츠 제공업자(CP)의 웹 서버에 집중돼 있는 콘텐츠 중 용량이 크거나
사용자의 요구가 잦은 콘텐츠를 ISP측에 설치한 CDN 서버에 미리 저장, CDN 서버로부터 최적의 경로로
사용자에게 콘텐츠를 전달하는 기술.
(한마디로 IDC 여러개 두고 한쪽으로 트레픽이 너무 많이 밀릴때 알아서 가장 속도가 빠른 곳에서 다운로드를 해주는 rjt)

2012/08/27 01:03 2012/08/27 01:03

Posted on 2012/07/21 09:48
Filed Under Programming/PHP

DNS server, DNS service  

기본 형식

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

문자셋을 지정하기

모든 페이지가 한글로 지정이 되어있기는 하지만 다같은 한국어 사이트가 아니라는 것은 개발자들만이 아는 비밀 입니다.

컴퓨터가 맨처음에 만들어 진곳이 영어를 쓰는 나라에서 만들어져서 기본적으로 영어를 탑재를 하게 됩니다. 그러해서 만일 html을 만들때 언어셋을 지정을 안하고 한국어를 쓰시게 되시면 깨짐 현상이 일어나서 보기가 안좋아지게 됩니다.

이러한것을 방지하기 위해서 html을 만든 사람들은 나라에 언어코드를 넣어주어서 지원을 해주자고 생각을 해내게 됩니다.

우리나라에서는 크게 EUC-KR과 UTF-8로 지원이 됩니다.

이 두개의 차이점은 언어를 담는 그릇의 크기의 차이라고 보시면 됩니다.

UTF-8의 경우에는 거의 모든 문자들까지 담아두고 있고 ECU-KR은 현제 저희들이 쓰고있는 언어들만을 담고 있다고 보시면 됩니다.

그리 되게되면 사용자는 이 두개중에서 어는것을 선택해야 되냐를 질문을 하게 됩니다.

이에 대한 답은 2개를 설치를 해도 되지만 저의 생각으로는 현재 UTF-8의 서버 설정이 많아지고 있고 하여서 UFT-8로 설정을 하시면 될듯합니다.

만일 서버가 EUC-KR이게 되시면 EUC-KR로 하는것이 맞는 선택이 되겟습니다.

키워드와 요약 정보 제공하기

저희가 쓰는 네이버나 구글 그리고 다음 과 같은 포털 싸이트에서의 검색 엔진에서 웹문서를 자동 등록 할때 사용할 키워드와 문서 요약 정보도 <meta>태그가 사용됩니다.

키워드는 웹 사용자들이쓸만한 언어를 담아주시면 되고

요약정보는 그글의 핵심적인 정보를 담아주시면 됩니다.

2012/07/21 09:48 2012/07/21 09:48

Posted on 2012/06/26 14:22
Filed Under Programming/PHP

DNS server, DNS service  

원문 : http://www.sitehis.com/spb3/sboard3/read.php?db=talk&uid=167

개인적으로 perl-레귤라보다 posix-레귤라 함수를 매우 좋아하는 터라,
충격이 큰데요.
추가 자세한 정보가 있으신 분들은 댓글이나 트위터 @sitehis 로 자료 주시면 감사하겠습니다.

PHP 언어에서 POSIX 레귤러함수를
5.3 버전에 deprecated(사용하지말것을경고)하고.
6.0 버전에서는 아예 삭제하겠다는 공지가 올라왔습니다.

처음 듣고 말도 안된다고 하였지만,
소문이아니고 perl 레귤러 함수로 고쳐 써야 하는 것으로 최종 확인하였습니다.

 

  • ereg -> preg_match
  • eregi -> preg_match ( i modifier )
  • ereg_replace -> preg_replace
  • ereg_replace -> preg_replace ( i modifier)
  • split -> preg_split
  • spliti -> preg_split ( i modifier )
  • sql_regcase() -> 없음 알아서..
     
자세한 안내는 다음에서 확인하실 수 있습니다.하나씩 정검하여 봅시다.

급하니깐 E_DEPRECATED 에러메세지를 우선 안 나오게 할려면,
  • error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
  • 혹은 error_reporting(E_ALL ^E_DEPRECATED);
  • 혹은 @ini_set('display_errors', 0);
고쳐버리겠다고요?? 그러면 다음 자동으로 고쳐주는 프로그램을 이용해보세요
ereg()
  • ereg('\.([^\.]*$)', $this->file_src_name, $extension);
  • preg_match('/\.([^\.]*$)/', $this->file_src_name, $extension);
  • 레귤러 표현식에 / ... / 로 감싸는 것으로 우선 해결

eregi()

  • eregi('\.([^\.]*$)', $this->file_src_name, $extension);
  • preg_match('/\.([^\.]*$)/i', $this->file_src_name, $extension);
  • 레귤러 표현식에 / ... /i  로 감싸는 것으로 우선 해결

ereg_replace()

  • ereg_replace('[^A-Za-z0-9_]', '', $str);
  • preg_replace('/[^A-Za-z0-9_]/', '', $str);
  • 복잡한 것은 이렇게~
  • $str_new = preg_replace('/' . preg_quote($word) . '/', '', $str_old);
  • 간단하게 이런 방법도 ( / 대신에 별로 사용않하는 # 혹은 `(틸드)를 사용해서 )
  • $str_new = preg_replace("#$word#', '', $str_old);
  • $str_new = preg_replace("`$word`", '', $str_old);

eregi_replace()

  • ereg_replace('[^A-Za-z0-9_]', '', $str);
  • preg_replace('/[^A-Za-z0-9_]/i', '', $str);
  • 복잡한 것은 이렇게~
  • $str_new = preg_replace('/' . preg_quote($word) . '/i', '', $str_old);


관련 게시물(http://www.sitehis.com)

2012/06/26 14:22 2012/06/26 14:22

Posted on 2012/06/26 13:49
Filed Under Programming/PHP

DNS server, DNS service  

출처 : http://smallmir.tistory.com/201


ereg 계열 함수 사용시 오류 메시지.

ereg,eregi,ereg_replace

>>> stripos,str_ireplace,preg_replace,preg_match 등으로 대체

eregi  preg_replace 대체 가능.

eregi('123','123456');

preg_replace('/123/I','123456');

ereg계열에서는 대소문자 구분이

ereg  eregi  구분되었음.

그것을 preg_replace 에서는 /i   추가해주면 된다.

preg_match 같음.


split 함수 사용시 오류

>>> explode 함수로 대체. split  정규식을 지원했으나, explode  지원하지 않음.


session_register 삭제


 

//'eregi 함수사용을 권장하지 않는다' 라는 메세지 출력.

Deprecated: Function eregi() is deprecated in /home/nuhome/web/nux/admin/plugin.php on line 3

파일 수정을 하지 않을시 임시방편


@error_reporting(E_ALL & ~(E_NOTICE | E_DEPRECATED | E_STRICT));


함수 인자에 변수를 참조로 전달할 수 없게됨


<?
function modify($array) {
$array[] = 'zero';
}
$array = array(0, 1, 2);
modify(&$array);

?>


PHP Fatal error: Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of modify(). in test.php on line 8


global 변수를 함수의 인자로 넘길 수 없음.

function test($_REQUEST){

}


magic_quotes_gpc에 대한 이해.

http://blog.naver.com/egirl5?Redirect=Log&logNo=110012870549




register_global off 처리


http://php.net/manual/kr/function.extract.php


사용을 하더라도 보안상 아래 순서에 맞게 덮어써주는 것을 추천합니다.

http://php.net/manual/kr/ini.core.php#ini.variables-order

EGPCS (Environment, Get, Post, Cookie, and Server)

> http://php.net/manual/en/language.variables.superglobals.php


extract($_ENV);

extract($_GET);

extract($_POST);

:




extract($_GET,EXTR_PREFIX_ALL,'_GET_');

extract($_POST,EXTR_PREFIX_ALL,'_POST_');




php 5.3 주요 변경 사항

http://kr.php.net/manual/en/migration53.incompatible.php

php 5.4 주요 변경 사항

http://kr.php.net/manual/en/migration54.incompatible.php

5.4 관련 한글 정리 문서

http://crizin.net/display/dev/What's+New+in+PHP+5.4

2012/06/26 13:49 2012/06/26 13:49

Posted on 2012/03/12 14:56
Filed Under Windows/최적화 및 팁

DNS server, DNS service  

윈도우 7 64Bit, 원격 데스크탑 다수 유저 연결 하기(termsrv.dll 패치)




바로가기 : http://codism.net/entry/Win7-Termsrvdll-Patch
2012/03/12 14:56 2012/03/12 14:56

Posted on 2012/02/02 19:25
Filed Under Linux/설정방법

DNS server, DNS service  

< php 소스 파일에서 phpize를 이용하여 configure 생성 >
# cd php-x.x.x/ext/mysqli
# /usr/local/php/bin/phpize
# ./configure -?with-php-config=/usr/local/php/bin/php-config -?with-mysqli=/usr/local/mysql/bin/mysql_config
# make
< mysqli.so 모듈 복사 >
# mkdir /usr/local/php/modules
# cp modules/mysqli.so /usr/local/php/modules
< php.ini 추가/수정 >
# vi /usr/local/php/php.ini
extension_dir = "/usr/local/php/modules"     <-- 수정
extension=mysqli.so     <-- 추가
< 아파치 재실행 >
# /usr/local/apache2/bin/apachectl restart
** mysqli를 사용하는 것이 속도가 훨씬 빠릅니다.
2012/02/02 19:25 2012/02/02 19:25

Posted on 2012/02/02 16:54
Filed Under Linux/장애처리

DNS server, DNS service  


출처 : http://iprize.tistory.com/search/.gvfs
여러가지 테스트 목적으로 Fedora 13 Alpha 버전을 사용하고 있다. 하지만 언제부터인가 홈 디렉토리에서 파일 목록을 볼 때 멈춰버리는 경우가 발생하였다. 원인을 찾기 위해 며칠간 이것 저것 살펴보았지만 찾지 못하다 오늘 루트로 로긴하여 'ls -al'을 해보았더니 아래와 같은 출력을 볼 수 있었다.

 drwxr-xr-x 9 iprize iprize 4096 Apr  7 11:54 .
drwxr-xr-x 6 root   root   4096 Oct  2  2009 ..
-rw------- 1 iprize iprize  138 Apr  7 11:53 .bash_history
drwxr-xr-x 7 root   root   4096 Apr  7 11:17 Desktop
drwx------ 2 iprize iprize 4096 Apr  7 11:54 .gconf
drwx------ 2 iprize iprize 4096 Apr  7 11:54 .gconfd
d??????????  ? ?        ?             ?            ? .gvfs
drwxr-xr-x 2 iprize iprize 4096 Apr  7 11:54 .nautilus
drwx------ 2 iprize iprize 4096 Apr  7 11:54 .pulse
drwxr-xr-x 2 root   root   4096 Apr  7 11:24 .vnc

 중간에 보면 .gvfs의 디렉토리 정보가 이상하게 표시되는 현상을 볼 수 있다. 이 때문에 노틸러스로 문제의 홈디렉토리를 보려고 하면 디렉토리 내용이 뜨지 않고 빈 화면으로 표시되며 또 터미널에서 'ls -al'을 실행하면 결과값이 제대로 출력되지 않고 멈춰버리는 현상이 발생한다.

이 문제를 구글링해서 찾아본 결과 이는 Fedora 13 Alpha의 문제가 아니라 Gnome Virtual File system의 문제였다1

위 문제를 해결하는 방법은 다음과 같다.
  • vfs-fuse-daemon을 vfs-fuse-daemon.bak 등으로 파일명을 변경한다. 파일의 위치는 locate을 이용하여 찾도록 하자. 보통은 /usr/libexec/ 디렉토리에 존재한다.
  • 'touch vfs-fuse-daemon' 명령으로 새로운 파일을 생성한 후 파일 속성을 644로 변경한다.
  • 재부팅하여 'ls -al' 명령이 제대로 실행되는지 확인한다.

레드햇 버그 트래킹 시스템인 버그질라에 등록되어 있는 버그지만 아직 해결되지 않은 문제인듯 하다2


  1. http://forums.fedoraforum.org/showthread.php?t=229819 [본문으로]
  2. https://bugzilla.redhat.com/show_bug.cgi?id=540574 [본문으로]
2012/02/02 16:54 2012/02/02 16:54

Posted on 2012/02/02 09:40
Filed Under Linux/장애처리

DNS server, DNS service  


MySQL에서 사용하는 log-bin이라는 옵션은 사용된 쿼리들이 로깅되는 파일이며 innodb 혹은 replication 등에 사용된다. 하지만 이 파일의 문제점은 무한정 늘어난다는 것이다. relay-log-space-limit 이란 옵션이 있는데 이는 replication에 사용되는 용량을 제한하는 옵션이라 큰 해결은 안되다.

이를 해결하기 위한 방법으로 아래의 쿼리를 실행해본다.

 

PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)

INTERVAL 30 DAY란 30일 이전의 로깅 정보를 삭제하게 된다.

 

# root 계정으로 실행

>mysql -u root -p -e "PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)"

>비번 입력

 

# 위의 파일을 가지고 복구

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/localhost-bin.00001>backup.sql 로 일반 쿼리로 변환

 

# 특정 디비만 가지고 올 경우

-d 디비명

 

# 시간 지정

--start-datetime="2010-09-30 01:00:00" --stop-datatime="2010-10-09 01:00:00"

 

# 복원

/usr/local/mysql/bin/mysql -u 사용자 -p < backup.sql
2012/02/02 09:40 2012/02/02 09:40

Posted on 2012/02/01 17:25
Filed Under Linux/장애처리

DNS server, DNS service  




*. smtp 인증 기능은 Relay 설정 없이 계정만으로 외부에서 메일 서버를 이용하게 하는 방법이다. 기본적으로 Relay로 가능하니 필요없는 기능이나, 유동 IP대역에서 메일 서버를 활용해야 하는 경우 필요하다. (관련 설정 참조 : 클릭.)
*. SELinux가 활성화되어 있는 상태에서는 setup or system-config-securitylevel 명령을 이용하거나, iptable 설정을 직접 변경하여 외부 접속을 허용해줘야 한다.
*. SELinux가 비활성화되어 있는 경우, /etc/hosts.allow에 다음의 내용을 추가해줘야 한다.
# vi /etc/hosts.allow
sendmail : ALL : allow (보안 정책에 맞게 ALL을 수정해주길..)
2012/02/01 17:25 2012/02/01 17:25

Posted on 2012/02/01 16:40
Filed Under Linux/설정방법

DNS server, DNS service  

출처 : 리눅스 포털  : http://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=120



지금 써 내러 가는 강좌는 레드햇 9.0을 기반으로 써 내려갑니다. 물론 다른 버전과 어느정도 호환성은 가지고 있겠지만, 테스트 해보지 않고 씁니다. 앞의 설치 강좌를 보지 않았다면, 한번쯤 시간 내어 보기를 바랍니다.
 서버 설치후 메일 서버설치는 옵션이 아닌 필수가 되었습니다. E-mail 은 오래전부터 사용되었습니다. 개인적으로 메일서버는 qmail이 더 좋다고 생각합니다. 모든 면에서.. 하지만, qmail은 간단하게 설치 할 수 없고 배포판에 딸려 나오지 않았기 때문에 , 배포판 설치하면 기본적으로 설치된 sendmail을 사용하는 방법을 강좌로 써 보겠습니다.

1. 설치
  센드메일은 앞의 설치 강좌데로 설치했다면, 이미 설치되었을 것입니다.
하지만 설치가 되었는지 확인할 필요가 있습니다.  확인하는 법은 다음과 같습니다.

[root@test root]# rpm -qa | grep sendmail
sendmail-cf-8.12.8-4
sendmail-8.12.8-4

 위와같은 결과가 나왔다면 배포판과 함께 이미 설치된 것입니다.
만약 위의 2개의 패키지중 sendmail-cf-8.12.8-4 이 패키지가 설치 되지 않았다면, 걱정하실 필요 없이 다음에 설명하는 방법으로 설치하면 패치된 버전을 설치 할 수 있습니다.

2. 패치된 버전 업그래이드 설치
 sendmail은 보안에 취약하여, 항상 최신버전을 사용하라고 합니다. 하지만 소스 받고 컴파일 하기엔 너무 설치 작업이 오래 걸리기 때문에,.. 커널 처럼 패치판을 받아서 설치하도록 하겠습니다.
 항상 편하게 하기 위해서 서버에 깔려있는 wget을 사용합니다. 이 명령어는 위험하기 때문에.. 속성을
chmod 700 /usr/bin/wget 으로 해 두시기 바랍니다.^^:
2개의 패키지를 가져옵니다. 물론 간단한 wget 명령어를 사용합니다.
[root@test root]# wget http://ftp.superuser.co.kr/pub/redhat/9/update/sendmail-8.12.8-9.90.i386.rpm
--16:34:22-- http://ftp.superuser.co.kr/pub/redhat/9/update/sendmail-8.12.8-9.90.i386.rpm
           => `sendmail-8.12.8-9.90.i386.rpm'
Resolving ftp.superuser.co.kr... 완료.
Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.
HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
길이:   535,659 [audio/x-pn-realaudio-plugin]
100%[==================================================================>] 535,659      371.00K/s    ETA 00:00
16:34:24 (371.00 KB/s) - `sendmail-8.12.8-9.90.i386.rpm'가 보존되었습니다 [535659/535659]

[root@test root]# wget
 http://ftp.superuser.co.kr/pub/redhat/9/update/sendmail-cf-8.12.8-9.90.i386.rpm

--16:34:41-- http://ftp.superuser.co.kr/pub/redhat/9/update/sendmail-cf-8.12.8-9.90.i386.rpm
           => `sendmail-cf-8.12.8-9.90.i386.rpm'
Resolving ftp.superuser.co.kr... 완료.
Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.
HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
길이:   292,786 [audio/x-pn-realaudio-plugin]
100%[==================================================================>] 292,786      329.41K/s    ETA 00:00
16:34:42 (329.41 KB/s) - `sendmail-cf-8.12.8-9.90.i386.rpm'가 보존되었습니다 [292786/292786]

위와같은 방법을 사용하면 .. 간단하게 패키지를 서버로 가져올 수 있습니다.
이렇게 완벽하게 패키지 파일들을 가져 왔다면, 패키지를 설치 및 업그래이드 해야합니다.
[root@test root]# rpm -Uvh sendmail-8.12.8-9.90.i386.rpm
경고: sendmail-8.12.8-9.90.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중...                 ########################################### [100%]
   1:sendmail               경고: /etc/mail/submit.cf(이)가 /etc/mail/submit.cf.rpmnew(으)로 생성되었습니다
########################################### [100%]
[root@test root]# rpm -Uvh sendmail-cf-8.12.8-9.90.i386.rpm
경고: sendmail-cf-8.12.8-9.90.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e
준비 중...                  ########################################### [100%]
   1:sendmail-cf           ########################################### [100%]

이렇게 2 패키지를 업데이트(-Uvh) 합니다. 물론 패키지가 설치 되어 있지 않았다면, 설치 되었을 것입니다.
모든 작업은 실행후에 확인을 철저히 해야합니다.
[root@test root]# rpm -qa | grep sendmail
sendmail-cf-8.12.8-9.90
sendmail-8.12.8-9.90
 위의 결과와 같이 업데이트 또는 설치되었다는 것을 확인하실 수 있습니다.

3. /etc/mail/sendmail.mc 파일 편집
  sendmail의 환경설정 파일인 sendmail.cf파일을 직접 건드려서 설정하면 보다 더 정확하고 상세 정보를 수정하고 성능 향상에 도움이 되겠지만, 하나의 언어를 익히는 것만큼의 노력과 시간이 필요합니다. 다행히 sendmail의 환경 설정 파일은 메크로 처리그를 이용해서 어느 부분만 설정하면, 간단하게 sendmail.cf파일을 작성할 수 있습니다.
  고급 설정을 원하시는 분들은 sendmail을 공부하시는 것 보다 qmail 에 시간을 더 투자 하시는게 좋을 것 같습니다.^^

/etc/mail/sendmail.mc 파일을 편집기를 이용해서 열어야 합니다.
 44, 45번째 줄의 내용을 편집합니다. 이는 smtp 인증 기능 사용을 위해서입니다. 이 smtp 인증기능을 사용하는 이유는 smtp 프로토콜은 아주 오래전에 만들어진 것입니다. 그 때는 스팸메일을 보내는 사람들도 없었기 때문에 모두 open relay이었습니다. 하지만 시간이 지나면서 이 open relay를 이용해 스패머들이 스팸메일을 뿌리기 시작했습니다. 이를 막기위해 인가된 사용자의 메일만 relay(중계)하는 방법이 필요했고, 이 방법을 smtp 프로토콜 위에 얹은 것 정도로 보시면 됩니다. 이 smpt 인증 방법이전에는 사용자의 ip로 인증하곤 했었습니다.

dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

위의 내용에서 빨간 부분을 지우시기 바랍니다.
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
위와같이 되죠^^;

85번재 줄을 편집합니다. senmail은 언제부턴가 로컬(서버)에서 보내는 메일만 relay(전달)하였습니다. 하지만, 메일서버로 사용하기 위해서는 이 설정을 지워야 합니다.
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
아래와 같이 빨간 부분을 적어 넣어 주석 처리 합닏.
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

이렇게 하면 sendmail.mc 파일 편집은 끝납니다. 물론 많은 내용이 있습니다. 하지만 알고 싶으면 서버 설치후 시간이 많이 난다면 하나 하나 분석 해 보시는 것도 좋습니다만~~^^;

이젠 만들어진 sendmail.mc 파일로 sendmail.cf 파을을 만들어야 합니다.
[root@test mail]# pwd
/etc/mail
[root@test mail]# m4 sendmail.mc > sendmail.cf 

 위와같이 한줄로 sendmail.cf파일은 생성됩니다. 이렇게 생성 하였다면, 반드시 sendmail을 재 시작해야 합니다. sendmail은 시작할 때 환경설정파일(sendmail.cf )을 로드 하기 때문입니다.
[root@test mail]# /etc/rc.d/init.d/sendmail restart
sendmail를 종료하고 있습니다:                             [  확인  ]
sm-client을 종료하고 있습니다:                            [  확인  ]
sendmail (을)를 시작합니다:                               [  확인  ]
sm-client을 시작하고 있습니다:                            [  확인  ]

4. /etc/mail/access 파일 편집
  이 파일을 잘 사용하면 조금의 스팸 필터링을 할 수 있습니다. 하지만 기본 설정만 하도록 하겠습니다.
이 서버에서 사용할 도메인을 다음과 같이 넣어줘야 합니다. 예를 들어 도메인이 0link.co.kr 이라면,
0link.co.kr                    RELAY
이렇게 relay가 가능하게 합니다. 이 설정은 메일을 보낼 때 위 도메인으로 메일을 보내면 relay를 하겠단 설정입니다.
이렇게 설정하고 다음과같이 db를 만둘어 주어야 합니다.
[root@test mail]# makemap hash access < access
이때 주의 하시기 바랍니다. "< " 이렇게 되죠^^:

5. /etc/mail/local-host-names
  이 파일은 쉽게 설명하면 메일을 받을 도메인을 넣어두는 파일입니다.. 예를들어 도메인이 0link.co.kr이라면,
0link.co.kr
위와같이 도메인을 달랑 적어주면 됩니다. 물론 다중 도메인이면 한 도메인에 한줄씩 줄~줄~ 적으면 됩니다.
위 파일설정을 바꾼 다음엔 반드시 sendmail을 재 시작해 줘야합니다.~

6. /etc/mail/virtusertable 파일 이용한 가상 유저 셋팅
 sendmail은 기본적으로 시스템(리눅스)의 계정을 사용합니다. 그래서 도메인이 다르다고 하더라도 계정이 이름이 같으면 같은 사람으로 취급합니다. 예를 들면, 셋팅한 서버에 2개의 도메인(0link.co.kr, hyung.co.kr)이 설정되어있다고 가정합니다. 모두 홈페이지를 운영하고 있다면, webmaster@0link.co.kr 과 webmaster@hyung.co.kr 이라는 메일 주소가 존재 할 것입니다. 그렇다면 서버에서 webmaster이라는 계정을 생성한 다음 메일을 받아보면, 위 2 주소로 보낸 메일 모두 webmaster라는 계정으로 들어오게 됩니다. 이런 경우 사용하는 것이 virtusertable입니다.
  webmaster@0link.co.kr 이라는 계정으로 오는 메일은 link 라는 계정으로
  webmaster@hyung.co.kr 으로 오는 메일은 hyung 라는 계정으로 받아보게 설정하는 것입니다.

webmaster@0link.co.kr             link
webmaster@hyung.co.kr          hyung위와같이 설정하면 가능합니다.
(주의) 메일 계정과 linux 계정 사이에는 키로 띄워 주시기 바랍니다. 그렇게 하지 않으면 인식하지 못합니다.

이렇게 설정하고 다음과같이 db를 만둘어 주어야 합니다.
[root@test mail]# makemap hash virtusertable < virtusertable
이때 주의 하시기 바랍니다. "< " 이렇게 되죠^^:


7. pop3 서버 설치
 지금까지 mail 서버를 설치하였습니다. 물론 지금까지 설치로 메일서버의 기능을 할 수 있습니다. 서버내에서 mutt등 메일 클라이언트를 사용하여 메일을 보내고 받을 수 있습니다. 하지만 모두다 outlook같은 프로그램으로 pc에서 받아보길 원할 것입니다. outlook에서 메일을 받아 보기 위해서는 imap 또는 pop3 서버를 설치해야 합니다. 대 부분의 사람들이 imap 보다는 pop3 서버를 많이 사용합니다. imap은 webmail에서 많이 사용합니다. pop3 서버는 개인적으로 qpopper이 더 좋다고 생각하지만. 그 프로그램을 컴파일 하여 설치하기엔 시간이 너무 많이 걸립니다. 간단하게 rpm으로 설치할 수 있는 pop3서버를 설치 해 보도록하겠습니다. 제가 쓴 설치 강좌데로 설치 했다면 아래의 패키지가 설치 되어있을것입니다.

[root@test mail]# rpm -qa | grep imap
imap-2001a-18

위와같이 설치되어 있지 않다면 다음 방법으로 설치하시기 바랍니다.
wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/imap-2001a-18.i386.rpm
rpm -Uvh imap-2001a-18.i386.rpm
이렇게 설치 하게 되면, imap, imaps , ipop3, pop3s 이렇게 4개의 서버가 설치됩니다.
여기서 ipop3 만 사용합니다.

ntsysv
명령어를 사용하여 다른 데몬은 채크를 지워 주시기 바랍니다. 물론 ipop3는 채크가 된 상태여야 합니다.

xinetd를 재 시작해야 합니다.
[root@test mail]# /etc/rc.d/init.d/xinetd restart
xinetd 를 정지함:                                          [  확인  ]
xinetd (을)를 시작합니다:                                 [  확인  ]

모두들 아실 것이라고 믿고 outlook설정은 설명하지 않겠습니다. 단지 설정하시고,
도구 -> 계정 -> 속성 -> 서버 -> 인증필요(채크) -> 적용
위와같이 설정하시기 바랍니다.(smtp 인증법)

8. 서버 데몬 확인 및 서비스 확인
  이렇게 설치 하셨다면, 간단한 메일 서버는 셋팅은 끝입니다.  이제 서비스를 확인해야 합니다.
[root@test mail]# netstat -an | grep LISTEN
tcp        0      0 0.0.0.0:1024            0.0.0.0:*              LISTEN      
tcp        0      0 127.0.0.1:1029         0.0.0.0:*               LISTEN      
tcp        0     0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*              LISTEN      
tcp        0      0 0.0.0.0:22             0.0.0.0:*               LISTEN      
tcp       0      0 0.0.0.0:25              0.0.0.0:*               LISTEN    

현재 열려있는 포트입니다. 다른 것들은 서비스에 따라 다를 수 있으니 신경쓰지 마시구요, 110 포트(pop3),
25번 포트(smtp 그러니까 sendmail)입니다. 위와같아야 합니다.

9. 메일큐 내용 확인하기
  홈페이지 운영하다 메일링 리스트에서 메일을 보내게 되면, 정상적인 메일주소로는 메일이 가지만, 정상적인 메일주소가 아닌 경우 가지도 않고 메일큐(/var/spool/mqueue)에 쌓여서 서버의 부하를 주는 경우가 있습니다.. sendmail은 기본설치된 것이 1시간마다 메일큐를 비우게 되어 있고, 한 번 보낸 메일은 7일동안 메일을 보내려고 시도하게 됩니다.. 메일큐에 보내지 못한 메일이 많으면 서버에 부하만 늘어납니다.  이런 경우 mailq라는 명령어로 큐 내용을 확인하여 지워줘야 합니다..
[root@test root]# mailq
/var/spool/mqueue is empty
                Total requests: 0
 위와 같은 경우 메일큐가 비어있는 상태입니다.
큐를 지우는 방법은
[root@test root]# rm -rf /var/spool/mqueue/* 
이렇게 해서 메일큐를 비울 수 있습니다.. 모두 지웠다면 반드시 sendmail을 재시작 해 주기 바랍니다.

10. 도메인 셋팅 스크립트
  서버를 많이 관리하다보면 파일 하나 하나 열어서 셋팅하는 일이 귀찮고도 시간이 많이 걸립니다. 항상 스크립트를 작성해두고 설정하는 것이 실수를 줄이고, 작업 시간도 줄일 수 있습니다. 다음과 같이 간단 한 스크립트를 작성해서 저장합니다.
#!/bin/bash
echo "간단한 메일 셋팅 프로그램 by doly엣superuser.co.kr "
if [ "$1" == "" -o "$2" == "" ] ; then
        echo -e "n ############ 사용법 ############## "
        echo -e "$0 아이디 도메인 n"
        exit 0
fi

echo "webmaster@$2 으로 들어오는 메일은 $1@$2 메일계정으로 받습니다."
echo -e "$2 ttt RELAY" >> /etc/mail/access
echo "$2" >> /etc/mail/local-host-names
echo -e "webmaster@$2 ttt $1" >> /etc/mail/virtusertable
echo "1. db 생성중.."
makemap hash /etc/mail/access < /etc/mail/access
makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
echo "2. 센드메일 재 시작중 "
/etc/rc.d/init.d/sendmail restart


파일을 만들어서 위 내용을 붙여 넣은 다음에 실행 권한을 줍니다. 그리구 아래와같이 실행하면,
[root@test root]# ./mailsetup.sh
간단한 메일 셋팅 프로그램 by doly엣superuser.co.kr

 ############ 사용법 ##############
./mailsetup.sh 아이디 도메인

위와같이 실행시키면 간단한 사용법이 나옵니다.

[root@test root]# ./mailsetup.sh doly 0link.co.kr
간단하 메일 셋팅 프로그램 by doly엣superuser.co.kr
webmaster@0link.co.kr 으로 들어오는 메일은 doly@0link.co.kr 메일계정으로 받습니다.
1. db 생성중..
2. 센드메일 재 시작중
sendmail를 종료하고 있습니다:                              [ 확인  ]
sm-client을 종료하고 있습니다:                             [  확인  ]
sendmail (을)를 시작합니다:                                [  확인  ]
sm-client을 시작하고 있습니다:                            [  확인  ]

위와같이 id : doly , 0link.co.kr으로 입력하면 위와같이 자동 셋팅됩니다.
/etc/mail/access 파일, /etc/mail/local-host-names, /etc/mail/virtusertable 파일이 변경되고, db 갱신되며, sendmail 재시작 됩니다.

11. 마치며..

 메일서버는 이게 전부가 아니지만 최대한 간단하게 강좌를 쓰고 마치도록 하겠습니다. 본 강좌의 셋팅에서 여러 에러 가 나타날 수 있습니다. 설정 안되는 부분이 있으면, 아래의 메일 주소로 메일 한통 주시면 답변을 해 드리고 강좌를 수정하도록 하겠습니다.  부디 많은 도움이 되시길 바랍니다.
   혹시 본 강좌에 대한 질문 및 오타를 발견하게 되면, 메일 한통 보내주기 바란다. 메일주소는 doly 골뱅이superuser.co.kr 이다. 메일 주소를 무단 수집해서 스팸메일을 보내는 이를 막기 위해서 위와 같이 표기했으며, 골뱅이 부분은 @ 치환하면 됩니다.

  이상... 2004. 5. 24 ~ 수퍼유저 운영자 doly ...

2004.08.26 Fedora Core 2에서 smtp 인증기능 : /etc/rc.d/init.d/saslauthd 데몬을 띄워야 합니다.

2012/02/01 16:40 2012/02/01 16:40

Posted on 2012/02/01 15:49
Filed Under Linux/장애처리

DNS server, DNS service  


CentOS 4.4에 Sendmail로 송신 테스트를 하기 위해 설치 하던중
sendmail.cf를 만드는 과정에서 다음과 같은 에러가 났다.

에러:
]# m4 /etc/mail/sendmail.mc > ! /etc/mail/sendmail.cf
/etc/mail/sendmail.mc:10: m4: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory


검색해보니 sendmail-cf가 설치되어 있지 않아서 그런듯 했다.

(CentOS4.4에 기본적으로 들어있지 않는듯 하다.)




해결:
$ yum install sendmail-cf


위와 같은 방법으로 설치 해서 해결.
2012/02/01 15:49 2012/02/01 15:49

Posted on 2012/01/10 23:44
Filed Under Programming/PHP

DNS server, DNS service  

yyyy년mm월dd일 포멧의 날짜를 yyyymmdd 형식으로 바꾸는 다양한 방법들.

$date = '2010년04월20일'; // 형태는 4년2월2일

이 값에서 숫자 부분인 '20100420'만 뽑는 방법입니다.



먼저 문자열(배열 관련 함수를 많이 사용하지만) 처리 방법입니다.


▶ 문자열 처리 #1

고정 길이기 때문에 substr() 함수를 이용합니다.

────────────────────────────────────────
$date = substr($date,0,4).substr($date,6,2).substr($date,10,2);
────────────────────────────────────────

substr() : http://php.net/manual/kr/function.substr.php

참고로 .은 문자열 결합 연산자입니다.
String Operators : http://php.net/manual/kr/language.operators.string.php



▶ 문자열 처리 #2

str_replace() 함수를 이용해 년, 월, 일 문자를 제거합니다.

────────────────────────────────────────
1 $date = str_replace('년','',$date); // 201004월20일
2 $date = str_replace('월','',$date); // 20100420일
3 $date = str_replace('일','',$date); // 20100420
────────────────────────────────────────

str_replace() : http://php.net/manual/kr/function.str-replace.php

참고로 해석이 필요없는 문자열 값은 '(Single Quote)로 감싸주세요.
문자열 관련 : http://php.net/manual/en/language.types.string.php


▶ 문자열 처리 #3

strtr() 함수를 이용하면 #2 과정을 한 번에 처리할 수 있습니다.

────────────────────────────────────────
$remove['년'] = '';
$remove['월'] = '';
$remove['일'] = '';

// 또는

$remove = array('년'=>'','월'=>'','일'=>'');

// 둘 중 편한 형태로 미리 연관 배열을 할당합니다.

$date = strtr($date,$remove);

// 물론 변수에 담지 않고 바로 이용도 가능합니다.

$date = strtr($date,array('년'=>'','월'=>'','일'=>''));
────────────────────────────────────────

strtr() : http://php.net/manual/en/function.strtr.php
연관 배열 : http://php.net/manual/kr/language.types.array.php


▶ 문자열 처리 #4

explode() 함수를 이용해 년, 월, 일을 잘라줍니다.

────────────────────────────────────────
$a = explode('년',$date); // [0] => 2010 [1] => 04월20일
$b = explode('월',$a[1]); // [0] => 04 [1] => 20일
$c = explode('일',$b[1]); // [0] => 20 [1] =>
$date = $a[0].$b[0].$c[0];
────────────────────────────────────────

reset() 함수로 배열의 첫 번째 값을 쉽게 가져올 수 있습니다.
array_shift() 함수로 배열의 첫 번째 값을 뺄 수 있습니다.

explode() : http://php.net/manual/kr/function.explode.php
reset() : http://php.net/manual/kr/function.reset.php
array_shift() : http://php.net/manual/kr/function.array-shift.php


▶ 문자열 처리 #5

list() 함수를 이용하면 #4 변수 사용이 좀 더 간편해집니다.

────────────────────────────────────────
list($y,$date) = explode('년',$date); // $y=2010, $date=04월20일
list($m,$d) = explode('월',$date); // $m=04, $d=20일
list($d) = explode('일',$d); // $d=20
$date = $y.$m.$d;
────────────────────────────────────────

list() : http://php.net/manual/kr/function.list.php


▶ 문자열 처리 #6

explode()와 함께하는 implode() 함수를 이용해보겠습니다.

────────────────────────────────────────
$date = implode('',explode('년',$date));
$date = implode('',explode('월',$date));
$date = implode('',explode('일',$date));
────────────────────────────────────────

implode() : http://php.net/manual/kr/function.implode.php


▶ 문자열 처리 #7

sscanf() 함수를 이용하면 형식에 맞게 값을 뽑을 수 있습니다.
다 만, 앞에 0이 붙었으면 0을 제거해주기 때문에 조정이 필요합니다.

────────────────────────────────────────
$temp = sscanf($date,'%4d년%2d월%2d일'); // [0] => 2010 [1] => 4 [2] => 20
if ( $temp[1]<10 ) $temp[1] = '0'.$temp[1]; // 4 => 04
if ( $temp[2]<10 ) $temp[2] = '0'.$temp[2];
$date = implode('',$temp); // $date = $temp[0].$temp[1].$temp[2];
────────────────────────────────────────

sscanf() : http://php.net/manual/kr/function.sscanf.php


▶ 문자열 처리 #8

#7의 코드에 그 위에서 언급한 list() 함수를 이용해볼까요?

────────────────────────────────────────
list($y,$m,$d) = sscanf($date,'%4d년%2d월%2d일'); // $y=2010, $m=4, $d=20
if ( $m<10 ) $m = '0'.$m;
if ( $d<10 ) $d = '0'.$d;
$date = $y.$m.$d;
────────────────────────────────────────

참고로 each() 함수를 살펴보세요. list() 함수와 궁합이 좋습니다.
each() : http://php.net/manual/kr/function.each.php


▶ 문자열 처리 #9

sscanf()에서 곧바로 변수 할당도 가능합니다.
이번에는 sprintf() 함수로 형식에 맞는 문자열을 만들어보겠습니다.

────────────────────────────────────────
sscanf($date,'%4d년%2d월%2d일',$y,$m,$d); // $y=2010, $m=4, $d=20
$date = sprintf('%04d%02d%02d',$y,$m,$d);
────────────────────────────────────────

sprintf() : http://php.net/manual/kr/function.sprintf.php


▶ 문자열 처리 #10

strpos() 함수를 이용하면 지정한 문자(열)의 위치를 구할 수 있습니다.

────────────────────────────────────────
$py = strpos($date,'년'); // 4
$pm = strpos($date,'월'); // 8
$pd = strpos($date,'일'); // 12
$date = substr($date,0,$py).substr($date,$py+2,2).substr($date,$pm+2,2);
────────────────────────────────────────

strpos() : http://php.net/manual/kr/function.strpos.php


▶ 문자열 처리 #11

이번에는 고전적인 방법을 이용해보겠습니다.
문자열의 길이만큼 반복하며 1바이트씩 읽어 숫자일 때 붙여주는 것이죠.
먼저 풀어쓴 코드부터 보시죠.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ''; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    if ( is_numeric($original[$i]) ) $date.= $original[$i]; // 숫자인 경우 붙임
}
────────────────────────────────────────

for() : http://php.net/manual/kr/control-structures.for.php
strlen() : http://php.net/manual/kr/function.strlen.php
is_numeric() : http://php.net/manual/kr/function.is-numeric.php
ctype_digit() : http://php.net/manual/kr/function.ctype-digit.php

편 의상 is_numeric() 함수를 이용했습니다.
그리고 위에서 보다시피 '2010년04월20일'은 문자열 값이지만
[] 를 이용해 배열처럼 접근할 수 있습니다.


▶ 문자열 처리 #12

#11보다 더 고전적인 방법입니다. 아스키 값을 이용합니다.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ''; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    $c = $original[$i]; // 1바이트 문자
    $asc = ord($c); // 아스키 코드
    if ( $asc<48 || $asc>57 ) continue; // 숫자 범위 아니면 Skip
    $date.= $c;
}
────────────────────────────────────────

숫자 범위가 아니면 위와 같은 조건이면 됩니다.
숫자 범위로 조건을 바꾼다면? ( $asc>47 && $asc<58 )입니다.

참고로 <= 비교보다 < 비교가 빠릅니다.
그래 서 ( $asc>=48 && $asc<=57 )로 하기보다 위 조건을 권장합니다.
누누이 강조하는 부분이지만 쓰기 나름이니까 편한 대로 쓰면 됩니다.

또는 어차피 숫자 외의 문자열이라봐야 년, 월, 일이니
아 스키 값이 127 이상인 경우를 걸러주면 됩니다.

ord() : http://php.net/manual/kr/function.ord.php
ASCII Table : http://www.asciitable.com/


▶ 문자열 처리 #13

#11, #12의 for()문을 줄인 형태입니다.

────────────────────────────────────────
for($i=0,$o=$date,$date='',$l=strlen($o);$i<$l;$i++)if(is_numeric($o[$i]))$date.=$o[$i];
────────────────────────────────────────


▶ 문자열 처리 #14

#13 을 아예 for()문으로 끝내는 것도 가능합니다.

────────────────────────────────────────
for ($i=0,$l=strlen($o=$date),$date='';$i<$len;$i++,$date.=is_numeric($o[$i-1])?$o[$i-1]:'');
────────────────────────────────────────

빠질 뻔 했는데 값의 할당은 오른쪽부터 왼쪽으로 진행됩니다.
$l=strlen($o=$date)
$o에 $date가 할당되고, $o의 길이가 $l에 할당됩니다.
할당 연산자 : http://php.net/manual/kr/language.opera ··· ment.php
연산자 우선권 : http://php.net/manual/kr/language.opera ··· ence.php


▶ 문자열 처리 #15

"키=값" 형태로 가공해 parse_str() 함수를 이용하는 방법입니다.

────────────────────────────────────────
$date = 'y='.substr($date,0,-2); // y=2010년04월20
$date = str_replace('년','&m=',$date); // y=2010&m=04월20
$date = str_replace('월','&d=',$date); // y=2010&m=04&d=20
parse_str($date);
$date = $y.$m.$d;

────────────────────────────────────────

parse_str() 함수를 보면, extract() 함수가 떠오르죠.

parse_str() : http://php.net/manual/kr/function.parse-str.php
extract() : http://php.net/manual/kr/function.extract.php

두 번째 인자를 주면 그 변수에 값을 받게 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
// 위 3줄 동일
parse_str($date,$t); // 'y'=>'2010', 'm'=>'04', 'd'=>'20'
$date = implode('',$t); // $date = $t['y'].$t['m'].$t['d'];
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #16

#11 ~ #14의 코드와 비슷합니다.
[]를 이용해 문자열도 배열 형태로 접근이 가능하다고 했죠?
이번에는 문자열을 정말 배열로 만들어 처리해보겠습니다.
그리고 똑같은 코드로 하면 재미없으니 다른 코드를 부르겠습니다.

────────────────────────────────────────
$temp = str_split($date);
$date = '';
foreach ( $temp as $char )
{
    if ( ord($char)<128 ) $date.= $char;
}
────────────────────────────────────────

1바이트로 나눠 배열 끝까지 반복, 아스키 값 비교로 결과값을 구합니다.
foreach()도 참 유용한 제어 구조 중 하나입니다. 배열과 찰떡 호흡!

str_split() : http://php.net/manual/kr/function.str-split.php
foreach() : http://php.net/manual/kr/control-structures.foreach.php


‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$t=str_split($date);$date='';
foreach($t as $c)if(ord($c)<128)$date.=$c;
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #17

substr_replace()를 깜빡했군요. str_replace()와 비교해보는 재미를···.

────────────────────────────────────────
$date = substr_replace($date,'',4,2); // 201004월20일
$date = substr_replace($date,'',6,2); // 20100420일
$date = substr_replace($date,'',8,2); // 20100420
────────────────────────────────────────

substr_replace() : http://php.net/manual/en/function.substr-replace.php



정규식으로 처리하는 방법 역시 다양합니다.


■ 정규식 처리 #1

제 일 간단한 방법은 숫자 외의 문자를 제거하는 것입니다.

────────────────────────────────────────
$date = preg_replace('/\D/','',$date);
────────────────────────────────────────

10진 숫자가 아닌 임의의 문자(\D)를 ''로 치환해주는 방법이죠.

정규 표현식 상세 : http://php.net/manual/kr/regexp.reference.php
정규 표현식 : http://php.net/manual/en/reference.pcre ··· ntax.php

임의의 10진 숫자는 \d로 표현합니다. 또는 [0-9]로 표현하죠.
여기에 부정 클래스를 사용하면 반대가 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = preg_replace('/[^0-9]/','',$date);
$date = preg_replace('/[^\d]/','',$date);
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_replace() : http://php.net/manual/kr/function.preg-replace.php

참 고로 ereg_replace(), eregi_replace() 등 POSIX Regex 관련 함수들은
PHP 5.3 버전부터 중지됩니다.
POSIX Regex 관련 함수 : http://php.net/manual/kr/ref.regex.php

그러니 어서 펄 호환 정규식으로 갈아타시길···.
Regular Expressions (Perl-Compatible) : http://php.net/manual/kr/book.pcre.php


■ 정규식 처리 #2

숫자만 뽑아 묶어주는 방법입니다.

────────────────────────────────────────
preg_match_all('/\d/',$date,$matches);
$date = implode('',$matches[0]);
────────────────────────────────────────

위 와 같이 실행했을 때 $matches의 값입니다.
문자열 처리 과정에서 언급한 implode() 함수로 깔끔하게 묶어주면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 0
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 4
            [6] => 2
            [7] => 0
        )
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_match_all() : http://php.net/manual/kr/function.preg-match-all.php


■ 정규식 처리 #3

preg_split() 함수로 대놓고 년, 월, 일로 잘라줘도 됩니다.

────────────────────────────────────────
list($y,$m,$d) = preg_split('/년|월|일/',$date);
$date = $y.$m.$d;
────────────────────────────────────────

preg_split() : http://php.net/manual/kr/function.preg-split.php

차근차근 읽어본 경우라면 위 두 줄의 코드를 한 줄로 바꿀 수 있겠죠?

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode('',preg_split('/년|월|일/',$date));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #4

#1의 코드와 기본은 같고 메타 문자만 다릅니다.

────────────────────────────────────────
$date = preg_replace('/\W/','',$date);
────────────────────────────────────────

어떠한 문자나 숫자, _가 \w며, \W는 그 반대입니다.
특성이 있지만, 년, 월, 일 정도야···. ^^);;;


■ 정규식 처리 #5

preg_grep()의 활용 예를 위해 하나 더 추가합니다.
str_split() 함수와 마찬가지로 잘라주고, 숫자 부분만 가져다 묶어줍니다.

────────────────────────────────────────
$split = preg_split('//',$date,-1,PREG_SPLIT_NO_EMPTY);
$date = implode('',preg_grep('/\d/',$split));
────────────────────────────────────────

preg_grep() : http://php.net/manual/kr/function.preg-grep.php

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode('',preg_grep('/\d/',preg_split('/()/',$date,-1,PREG_SPLIT_NO_EMPTY)));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #6

#2 에서 preg_match_all()을 사용했죠? 이번에는 preg_match() 사용입니다.

────────────────────────────────────────
preg_match('/(\d+)년(\d+)월(\d+)일/',$date,$match);
$date = implode('',array_slice($match,1));
────────────────────────────────────────

$match의 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 04
    [3] => 20
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

여기서 array_slice() 함수를 이용해 두 번째 배열부터 가져와 묶어줍니다.
문자열의 substr() 함수와 사용 방법이 같습니다. 대상만 배열이죠.

preg_match() : http://php.net/manual/kr/function.preg-match.php
array_slice() : http://php.net/manual/kr/function.array-slice.php



■ 정규식 처리 #7

응용 예입니다.

────────────────────────────────────────
preg_match('/(\d+)(\W.)(\d+)(\W.)(\d+)(\W.)/',$date,$matches);
$date = $matches[1].$matches[3].$matches[5];
────────────────────────────────────────

$matches 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 년
    [3] => 04
    [4] => 월
    [5] => 20
    [6] => 일
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥



▣ 날짜 함수 이용

문자열 처리 응용, strtotime() 함수와 date() 함수가 등장합니다.
년, 월, 일을 제거하면 그것으로 끝이지만 응용 차원에서 추가했습니다.
참. 꼭 -으로 바꿀 필요는 없습니다.

────────────────────────────────────────
$date = str_replace('년','-',$date); // 2010-04월20일
$date = str_replace('월','-',$date); // 2010-04-20일
$date = str_replace('일','',$date); // 2010-04-20
$date = date('Ymd',strtotime($date));
────────────────────────────────────────

strtotime() : http://php.net/manual/en/function.strtotime.php
date() : http://php.net/manual/kr/function.date.php

한 줄로 줄이려면? 문자열 처리 #3에서 언급한 strtr()을 사용하면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
echo date('Ymd',strtotime(strtr($date,array('년'=>'/','월'=>'/','일'=> ''))));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
2012/01/10 23:44 2012/01/10 23:44

Posted on 2012/01/05 10:48
Filed Under Linux/설정방법

DNS server, DNS service  

1. 필요한 데몬

  - portmap : NFS가 RPC 기반으로 돌아 가기 때문에 rpcbind의 매핑위해 필용한 데몬

  - rpc.nfsd : NFS데몬으로 실제로 NFS로 파일 시스템을 공유 가능하게 해줌

  - rpc.mountd : 마운트를 가능하게 해주는 데몬

  * nfs 관련 패키지가 설치 되어 있지 않으면 레드햇은 RPM으로 nfs-utils 와 portmap

    을 받아서 설치 하면 됨

    (대부분의 리눅스 시스템에서는 기본적으로 설치 되어 있음)

2. 데몬 실행 (portmap 을 먼저 실행 해야 함)

  - /etc/init.d/portmap start

  - /etc/init.d/nfs start

  - 실행 확인 : rpcinfo -p

  - checkconfig 명령을 이용 해서 리부팅 할때 자동으로 실행 하게 하면 편리 함

    checkconfig --leve 3 nfs on

3. 설정 파일

  - /etc/exports 파일을 수정하고 portmap restart 명령을 내리면 됨

  - 설정 방법

    /test   192.168.0.10(rw)  --> 192.168.0.10 서버에서 리드 라우트 권한을 가짐

    /test   192.168.0.10(ro)  --> 192.168.0.10 에서 읽기 권한만 가짐

    /test   192.168.0.10(rw)

    /test/test2   192.168.0.10(noaccess)  --> 하위 디렉토리 접근 권한 없음

    /test   192.168.0.10(rw,root_squash) --> 루트로 마운트시 루트 권한이 아닌

            nfsnobody 권한으로 사용 하게 됨

            no_root_squash 로 하면 root권한으로 사용(보안적인 문제로 인하여 잘

            사용 하지는 않음)

            기본 값은 root_squash 임

    /test   192.168.0.10(rw,all_squash) --> 일반 사용자 모두  nfsnobody 로 매핑

            되어 사용 함,  각각의 계정으로 사용 하려면 no_all_squash로 설정 함

            no_all_squash 가 기본 값임

   /etc  192.168.0.19(rw,anonuid=510,anongid=510) --> 특정 계정으로 권한을 줌

   * nfsnobody 로 할 경우 UID가 지 맘대로 정해 지는 현상이 있음으로 그것에 맞게

     nfs서버에서 디렉토리 권한을 바꾸주면 됨

4. 클라이언트에서 NFS 붙이기

 - NFS 서버에 공유된 디렉토리를 확인합니다.

   showmount -e <서버 IP>

 - 공유된 디렉토리를 마운트할 로컬 디렉토리를 만들어 줍니다. 이건 mkdir로 ㅎ

 - 이제 마운트 해줍니다.

   mount -t nfs <서버 IP>:<디렉토리> <로컬 디렉토리>

   ex) mount -t nfs 192.168.0.1:/usr/local /localmount

* 자동 마운트를 할경우

클라이언트의 /etc/fatab 에 다음 항목 추가

192.168.0.10:/home/jook /data nfs defaults 0 0

2012/01/05 10:48 2012/01/05 10:48

About

by CoCo

Notice

Counter

· Total
: 846588
· Today
: 75
· Yesterday
: 70