CMS(Content Management System)이란,
웹사이트 구축에 필요한 웹기획자, 개발자, 디자이너의 3가지 역할 중
개발자와 디자이너의 영역을 처리해주는 SW분류를 의미합니다.
따라서 웹기획자가 의도한대로 유연하게 조정할 수 있는지, 손쉬운 관리가 가능한지 등이 중요한 검토항목이 됩니다.

CMS 주요 검토항목
네비게이션(메뉴) 관리 - 어느정도 depth의 네비게이션을 관리할 수 있는가, 관리기능은 세밀한 조정이 가능한가
콘텐츠 관리 - 작성가능한 콘텐츠의 종류는 다양한가, 모듈(컴포넌트)는 다양하게 존재하는가
스킨(테마) 관리 - 다양한 스킨이 제공되는가, 스킨은 손쉬운 편집이 가능한가
인증 - 컨텐츠 권한, 사용자 권한에 대한 세밀한 조정이 가능한가
사용자 정의 필드 - 개발자없이 원하는 필드를 추가, 삭제 할 수 있는가
사용자 정의 콘텐츠 - 개발자 없이 콘텐츠의 새로운 유형을 생성할 수 있는가
관리자 인터페이스 - 관리자에게 쉬운 인터페이스를 제공하는가

개발자라면 누구나 한번쯤 떠올려보는 SW지만, 쉬운관리와 세밀한 조정을 동시에 제공하기란 쉬운 일이 아닙니다.
CMS는 국내에서 Xe가 활발하게 사용되고 있으며, 해외에서 Drupal, Joomla 등이 활발하게 사용되고 있습니다.
이번시간에는 drupal 을 사용해서 웹사이트를 구축하는 방법을 진행해 보겠습니다.


제가 설치하는 시점에서는 6.17버전이 안정화 버전이라서 그걸 다운로드 받았습니다.
다운받은 파일을 설치할 경로에 압축해제 하시고,
http://설치도메인/install.php 를 브라우저로 호출하시면 설치단계가 시작됩니다.

저희 서버에는 modsecurity가 적용되어 있어서, 설치과정에 오류가 나네요~
구글링 해보니, Modsecurity 적용된 환경에서 Drupal 설치를 하려면
modsecurity 룰셋을 변경해 주어야 정상적으로 설치됩니다.
(Drupal 6.x, ModSecurity2 환경)

vi /etc/httpd/modsecurity.d/modsecurity_localrules.conf

# drupal setting
<LocationMatch "/">
SecRuleRemoveById 960010
SecRuleRemoveById 960015
SecRuleRemoveById 960032
SecRuleRemoveById 950107
</LocationMatch>

# drupal setting
<LocationMatch "/install.php">
  SecRuleRemoveById 970003
  SecRuleRemoveById 960010
</LocationMatch>
추가사항
드루팔의 관리자화면을 정상사용 하기 위해서
vi /etc/httpd/modsecurity.d/base_rules/modsecurity_crs_41_phpids_filters.conf
66번줄의 content 를 제거해 주었다.

다른 SW를 위한 modsecurity 설정은 아래를 참고하세요.

vi /etc/httpd/modsecurity.d/modsecurity_localrules.conf

설치과정에서 오류를 만나신다면, 드루팔 퀵 설치 가이드( http://drupal.org/node/570116)를 보시면서 진행해 보시기 바랍니다.

Drupal 설치 전 설정을 저장할 파일과 디렉토리 권한을 조정해 줍니다
[hckim@www html]$ cp sites/default/default.settings.php sites/default/settings.php
[hckim@www html]$ chmod a+w sites/default/settings.php
[hckim@www html]$ chmod a+w sites/default

Drupal 설치 후 조정했던 권한을 변경해서 보안상 취약점을 제거합니다.
[hckim@www html]$ chmod a-w sites/default
[hckim@www html]$ chmod a-w sites/default/settings.php

기본 설치는 여기에서 끝났습니다.
설치 화면을 보시고 뭔가 마음에 안드시겠죠. 영어로된 화면하며, 복잡한 기능들..
차근차근 입맛에 맞게 설정해 가시다 보면, drupal의 유연한 기능에 놀라시게 될겁니다.

한글화

영어로 된 인터페이스를 우선 한글화 해 보겠습니다.
http://drupal.kldp.net/download/latest_ko_language_package
위 주소에서 한글화파일(6.15  - drupal-6.15-ko.20100222po.po)를 다운로드 받습니다.

한글로 drupal을 사용하시기 위해서는 locale 모듈을 활성화하시고, 다운로드 받은 po파일을 Korean이란 항목에 import하시면 됩니다.

추가 모듈 설치
http://drupal.org/project/Modules
원하는 모듈을 다운로드해서 압축을 해제한 후 "drupal설치된 경로/modules" 안에 업로드 하세요

추가 테마 설치
http://drupal.org/project/Themes
원하는 테마를 다운로드해서 압축을 해제한 후 "drupal설치된 경로/theme" 안에 업로드 하세요

위지윅 편집기로 콘텐츠 작성을 위한 추가설치
rupal에서 사용가능한 WysiWyg 편집기는 종류가 매우 많습니다.
(htmlarea, fckeditor, ckeditor, yui editor 등)
설치하는 방법은 모듈로 설치하는 법과, wysiwyg 모듈안의 에디터코어를 추가하는 방법이 있는데
저는 모듈로 ckeditor를 설치하는 방법을 선택했습니다.

파일업로드를 위해서는 ckfinder도 추가로 설치해야 합니다.
그중 ckeditor를 적용하는 방법에 대한 아래 글을 참고해서 적용했습니다.
http://www.brightwebsitedesign.com/how-to-install-ckeditor-and-ckfinder
http://yadadrop.com/drupal-video/ckfinder-file-browser-ckeditor-drupal


php 어플리케이션의 로깅을 위해서 사용 가능한 공개sW


http://logging.apache.org/log4php/

이름에서 느껴지는 것처럼 lo4j와 유사한 사용법이므로 직관적인 사용이 가능하다.

기본출력에 보이도록 설정하는 경우 - log4php.properties
#### 기본출력 stdout
log4php.appender.default = LoggerAppenderEcho
log4php.appender.default.layout = LoggerLayoutSimple

#DEBUG < INFO < WARN < ERROR < FATAL.
log4php.rootLogger = WARN, default

log4php.logger.mylogger = INFO, default
log4php.additivity.mylogger = "false"

파일에 남기도록 설정하는 경우 - log4php.properties
#### 파일에 남기는 경우

log4php.rootLogger=debug, stdout, R

log4php.appender.stdout=LoggerAppenderConsole
log4php.appender.stdout.layout=LoggerLayoutPattern

# Pattern to output the caller's file name and line number.
log4php.appender.stdout.layout.ConversionPattern=%5p %t %F:%L - %m%n

log4php.appender.R=LoggerAppenderRollingFile
log4php.appender.R.File=C:/xampp/htdocs/log4php/viralphp.log

log4php.appender.R.MaxFileSize=100KB
# Keep one backup file
log4php.appender.R.MaxBackupIndex=1

log4php.appender.R.layout=LoggerLayoutPattern
log4php.appender.R.layout.ConversionPattern=%p %d{Y-m-d H:i:s.u} %t [%c] [%F:%L] - %m%n



php 에러로 나타나도록 설정하는 경우 - log4php.properties
### Log events using the php function: trigger_error
log4php.appender.default = LoggerAppenderPhp
log4php.appender.default.layout = LoggerLayoutPattern
log4php.appender.default.layout.conversionPattern = "%d{Y-m-d H:i:s.u} %-5p [%t] %c: %m%n"
log4php.rootLogger = DEBUG, default


syslog를 사용하도록 설정하는 경우 - log4php.properties
### Syslog 사용
log4php.appender.default = LoggerAppenderSyslog
log4php.appender.default.layout = LoggerLayoutSimple
log4php.appender.default.ident = log4php-test
log4php.appender.default.facility = LOG_LOCAL0
log4php.rootLogger = DEBUG, default

그외 db에 저장하는 pdo 사용법, 네트워크로 전송하는 소켓사용법등이 있으니
상세한 내용은 매뉴얼을 참고하자.


사용법

/**
 * log4php setting
 *
 * 웹서버 루트의 log4php/viralphp.log 파일에 로그 남기기
 *
 * @package    ViralMarketing
 * @author     Kim Hyeong Chae <hckim@abydos.co.kr>
 * @filesource
 * @todo       pdo를 이용한 변경 테스트
 *
 */

require_once $_SERVER["DOCUMENT_ROOT"]."/log4php/src/main/php/Logger.php";
Logger::configure($_SERVER["DOCUMENT_ROOT"] . '/log4php/log4php.properties');
$logger = Logger::getLogger("main");

/**
 * 접속자 아이피 로그파일에 남기기
 */
$logger->debug("접속자 아이피: " . $_SERVER["REMOTE_ADDR"]);


로그파일 내용

DEBUG 2010-06-29 13:39:18.216 4064 [main] [C:\xampp\htdocs\index.html:28] - 접속자 아이피: 127.0.0.1



'오픈소스SW' 카테고리의 다른 글

firefox 확장기능 Wired-Marker  (0) 2010.06.30
yui-compressor  (0) 2010.06.29
phpDocument 를 이용한 문서생성  (0) 2010.06.25
php 속도 증가를 위한 eAccelerator 설치  (0) 2010.06.24
오픈소스는 무료인가  (0) 2010.06.24

문서생성을 위한 문법
http://manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#basics.starting

설치
pear install PhpDocumentor


사용

Windows
-------
You need the cli version of PHP (php-cli.exe or cli/php.exe in 4.3.0+).
Either run phpDocumentor from the directory that PHP resides in, or put
php.exe in your DOS PATH enviroment variable.  The simplest usage of phpDocumentor is:

C:\>php.exe "C:\Path\To\phpdoc" -t targetdir -o HTML:default:default -d parsedir


Unix
----
Make sure that the cgi/cli version of PHP is in your path.  The simplest usage
of phpDocumentor is:

phpdoc -t targetdir -o HTML:default:default -d parsedir


웹UI제공

phpDocumentor Tags
 * @abstract
 * @access       public or private
 * @author       author name <author@email>
 * @copyright    name date
 * @deprecated   description
 * @deprec       alias for deprecated
 * @example      /path/to/example
 * @exception    Javadoc-compatible, use as needed
 * @global       type $globalvarname or
 * @global       type description of global variable usage in a function
 * @ignore
 * @internal     private information for advanced developers only
 * @param        type [$varname] description
 * @return       type description
 * @link         URL
 * @name         procpagealias or
 * @name         $globalvaralias
 * @magic        phpdoc.de compatibility
 * @package      package name
 * @see          name of another element that can be documented,
 *                produces a link to it in the documentation
 * @since        a version or a date
 * @static
 * @staticvar    type description of static variable usage in a function
 * @subpackage    sub package name, groupings inside of a project
 * @throws       Javadoc-compatible, use as needed
 * @todo         phpdoc.de compatibility
 * @var        type    a data type for a class variable
 * @version    version



들여쓰기와 줄 길이
공백 4개의 들여쓰기를 사용하되 탭은 사용하지 않습니다.
탭 대신 공백을 사용해야 글씨체에 상관없이 일정하게 보입니다.
(개인이 같은 에디터 툴, 폰트를 사용한다면 탭을 사용해도 상관 없습니다만 소스 코드 공유, 호환을 위해 공백을 사용하는 것을 권장합니다.)


제 어 구조

제어 구조에는 if, for, while, switch 등이 있습니다. 아래는 if 예제입니다.
<?php
if ((condition1) || (condition2)) {
    action1;
} elseif ((condition3) && (condition4)) {
    action2;
} else {
    defaultaction;
}
?>

제어 구조에서는 함수 호출과 구별하기 위해서 키워드와 ( 사이에 공백을 1개 둡니다.
블록을 감싸는 { 는 끝에 입력합니다. 또한 아래와 같이 블록 내용이 한줄이라도 { 로 감싸는 것이 좋습니다.
if(condition)
    action1;
이 아닌
if(condition) {
    action1;
}
으로 입력합니다.


switch 문장의 경우는 다음과 같이 합니다.
<?php
switch (condition) {
case 1:
    action1;
    break;

case 2:
    action2;
    break;

default:
    defaultaction;
    break;
}
?>

함수 호출
함수명과 (및 최초의 파라미터 각각의 사이에는 공백을 두지 않고, ,(쉼표)와 파라미터 사이에는 공백을 두며, 마지막 파라미터와 ); 사이에는 공백을 두지 않습니다.
<?php
$var = foo($bar, $baz, $quux);
?>

위와 같이 함수의 리턴 값을 변수에 대입할 때에 사용하는 =(등호)의 좌우에는 공백을 1개씩 둡니다. 아래와 같이 관련된 문장은 가독성을 향상시키기 위해 여러 공백을 두면 좋습니다.
<?php
$short             = foo($bar);
$long_variable = foo($baz);
?>


함 수 정의
함수 정의는 아래와 같이 "one true brace" 로 불리는 표기에 따릅니다.
<?php
function fooFunction($arg1, $arg2 = '')
{
    if (condition) {
        statement;
    }
    return $val;
}
?>

기 본값을 가지는 인수는 목록의 마지막에 둡니다. 특별한 경우를 제외하고는 함수가 리턴값을 돌려주도록 합니다. 아래 예제를 봅시다.
<?php
function connect(&$dsn, $persistent = false)
{
    if (is_array($dsn)) {
        $dsninfo = &$dsn;
    } else {
        $dsninfo = DB::parseDSN($dsn);
    }
    if (!$dsninfo || !$dsninfo['phptype']) {
        return $this->raiseError();
    }

    return true;
}
?>


주석
주석 기호는 C언어 형식의 /**/ 와 표준 C++ 주석인 //를 사용합니다.
Perl 형식의 #는 사용하지 않습니다.
<?php
/* comment */

/**
* comment
*
* comment
*
* comment
* comment
*/


// comment
?>


코드 연결
어디든지 클래스 파일을 무제한으로 연결을 하려면 require_once를 사용합니다.
팩토리 메소드등의 클래스 파일을 제한적으로 연결하려면 include_once를 사용합니다.
어디든 클래스 파일을 오직 한번만 연결하게 될 것입니다. 같은 파일을 공유하므로 중복될까봐 걱정하지 않아도 됩니다. require_once로 연결된 파일은 include_once에 의해 다시 연결되지 않을 것입니다.


PHP 코드 태그
PHP 코드 범위는 항상 <?php ?>을 사용합니다. <? ?>같 은 짧은 태그는 안됩니다.
그 래야 다른 운영체제와 환경에서도 PHP 코드를 옮겨 사용할 수 있습니다.


헤더 주석 블록
주 석의 자세한 설명은 생략


명명
클래스에는 내용을 이해할 수 있는 이름을 지정해야 합니다. 단축어의 사용은 가능한 한 피합니다. 클래스명은 항상 대문자로 시작해야 합니다. 상위 클래스의 확장 클래스는 _(언더 스코어)로 연결 합니다. 아래는 클래스 명의 예제입니다.
Log
Net_Finger
HTML_Upload_Error


함수와 메소드
함 수와 메소드는 "studly caps" 형식을 사용해 이름을 붙여야 합니다. 함수는 패키지 이름의 충돌을 피하기 위해서 접두사로 패키지명을 추가해야 합니다. 이름의 첫글자는 소문자로, 새로운 단어를 시작할 때의 각 첫글자는 대문자로 합니다. 아래 예제가 있습니다.
connect()
getData()
buildSomeWidget()
XML_RPC_serializeData()

내부에서 사용되는 클래스 멤버는 _(언 더 스코어) 1개를 앞에 붙입니다. 아래 예제가 있습니다.
_sort()
_initTree()
$this->_status


상수
상 수는 항상 모두 대문자로 단어의 끝에는 _(언더 스코어)를 사용해야 합니다. 예를 들면 DB:: 패키지로 사용하는 상수는 모두 DB_ 로 시작합니다.
주의: true, falsenull 은 예외로, 항상 소문자여야 합니다.
상수 정의 예제
define('ROOT_DIR', './');


전역 변수

패 키지에서 전역 변수를 정의할 필요가 있는 경우, 그 이름은 _(언 더 스코어)를 앞뒤에 붙인 패키지명으로 시작해야 합니다. 예를 들면, PEAR 패키지는 $_PEAR_destructor_object_list 이라는 이름 의 전역 변수를 사용합니다.
정의되어 있는 전역 변수 예제
$_COOKIE
$_SERVER
$_REQUEST

파일 형식
아스키 텍스트로 저장 합니다.
ISO-8859-1 문자 인코딩을 사용합니다.
PHP 태그를 닫는 ?> 아래에 1개의 줄이 있어야 합니다.


에러 처리
PHP를 실행하면 예기치 않은 에러가 발생할 수 있습니다. 어떤 에러가 왜 발생했는지 알기 위해 에러 처리 코드를 삽입합니다. 아래는 오류발생시 메시지를 보여주는 예제입니다.
<?php
function connectDB($dsn) {
    $this->db =& DB::connect($dsn);
    if (DB::isError($this->db)) {
        throw new Example_Datasource_Exception(
                "$dsn에 연결할 수 없습니다:" . $this->db->getMessage()
        );
    }
}
?>

원문: http://pear.php.net/manual/en/
번 역: © simulz

'개발도 하냐?' 카테고리의 다른 글

RAD(Rapid Application Development)  (0) 2010.07.08
디자이너에게 배우다.  (1) 2010.07.07
mod_security AND fckeditor  (0) 2010.06.21
Prototype URL encode, decode  (0) 2010.06.19
정규표현식(regular expressions)  (0) 2010.06.16

eAccelerator is a free open-source PHP accelerator & optimizer.

홈페이지 : http://www.eaccelerator.net/http://www.eaccelerator.net/

다운로드 : http://bart.eaccelerator.net/source/0.9.6.1/


checksum
c95e87229a6e674b4994d4fc13278e516ea314f9 eaccelerator-0.9.6.1.tar.bz2
0ef91fb7579c3bf5c0e94d5ec2521c389de91ba8 eaccelerator-0.9.6.1.zip 


설치

소스 압축풀고 디렉토리로 이동해서

phpize
./configure
make
make install


php.ini 설정 추가(eaccelerator.so 파일의 경로가 맞도록)

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

캐쉬 디렉토리 생성 및 권한부여

mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator

웹서버 재시작 후 확인

php -v 또는 페이지로 phpinfo 찍어본다.

확인

ab -n1000 http://mydomain.com/


다른 종류의 PHP Accelerator 소개 : http://www.ducea.com/2006/10/30/php-accelerators/

드루팔 환경의 속도비교 : http://2bits.com/articles/benchmarking-apc-vs-eaccelerator-using-drupal.html






프로파일링이 왜 필요할까
[원문보기] [한글]

소프트웨어를 설계하고 코딩을 하다보면 프로그램을 최적화할 때가 있다.
대부분의 프로그램은 80:20 법칙을 따른다. 전체 코드의 20%가 전체 시간의 80%를 차지한다.

그래서 프로그래머가 해당 컴퓨터 아키텍쳐의 세세한 부분보다는 논리에 집중하여 프로그래밍 시간을 줄여주는
자바나 C#같은 언어가 인기를 얻었다.
프로그램의 실행시간은 길어지지만, 프로그래머의 시간은 절약된다.

그러나 프로그램을 더 빨리 실행하기위한 최적화가 필요하지 않다는 말은 아니다.
많은 컴파일러는 알아서 최적화를 한다.
예를 들어, GCC 컴파일러는 (대문자 주의) -O 옵션으로 최적화 수준을 지정한다.

프로파일링(profiling)은 프로그램의 성능을 높이기위해 최적화할 코드및 함수의 위치를 발견하도록 도와준다.
프로그램에서 10번만 호출하는 함수보다 1000번 호출하는 함수를 최적화하는게 당연하다고 생각하지 않는가.
프로그램을 프로파일링하면 코드의 어떤 부분을 자주 사용하고 어떤 함수가 CPU 시간을 많이 잡아먹는지 알 수 있다.
이 두 정보는 최적화할 대상을 정하는데 유용하다.
실제 프로그램을 실행하면서 정보를 모으기때문에 감춰진 버그를 찾는데도 유용하다.
실행중에 예기치않게 어떤 함수를 1000번 호출한다면 설계상 문제이거나 버그일 수 있다.
또, 크고 복잡한 프로젝트에서 코드를 살펴볼때도 유용하다.

프로파일링 정보에는 두가지 종류가 있다 :-

    * Flat Profile
      함수별로 사용하는 CPU 시간과 호출 횟수를 보여준다. 수집한 전체 프로파일링 정보의 간단한 요약이다. 성능을 높이기위해 어떤 함수를 다시 작성하거나 수정할지 알려준다.

    * Call Graph
      모든 함수에 대해 자신을 포함하여 다른 함수가 호출한 횟수를 보여준다. 그래서 어떤 함수 호출을 없애거나 다른 효율적인 함수로 대체할지 제안한다. 이 정보는 함수들간의 관계를 드러내고, 감춰진 버그를 알려주기도 한다. 호출그래프를 본 후에 특정 코드 경로를 최적화하고 싶을 것이다.



Xdebug 설치하기
http://www.xdebug.org/docs/install
- xampp 패키지로 개발환경을 구축했다면 xdebug가 포함되어 있으므로 별도로 디버거를 설치할 필요없이 php.ini의 설정만 변경해주면 된다.

Xdebug 프로파일링을 통해 얻어진 파일의포멧은 cachegrind 의 포멧을 따르고 있다.
Xdebug에서 프로파일링된 파일을 생성하도록 설정해 주었다면 아래의 도구들 중 하나를 골라서 분석 가능하다.

Xdebug 프로파일링을 위한 웹기반 분석도구 webgrind
http://code.google.com/p/webgrind/downloads/list

Xdebug 프로파일링을 위한 설치형 분석도구 WinCacheGrind
http://sourceforge.net/projects/wincachegrind/

리눅스용 분석도구
kcachegrind
http://kcachegrind.sourceforge.net/html/Home.html


Xdebug 설정 관련한 참고문서
http://www.ibm.com/developerworks/opensource/library/os-php-xdebug/


php.ini 설정
; xdebug
zend_extension = C:\xampp\php\ext\php_xdebug-2.1.0RC1-5.3-vc6.dll
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6

xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT,SCRIPT_NAME

xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

;모든 파일에 대하여 자동으로 프로파일링할때
;xdebug.profiler_enable = 1
; 특정파일만 프로파일링 하고 싶을때 XDEBUG_PROFILE 을 get으로 실행한다.
; ex : http://example.com/sample.php?XDEBUG_PROFILE
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir ="C:\xampp\tmp"
;cachegrind 포멧으로 설정
xdebug.profiler_output_name = cachegrind.out.%t.%p


http://localhost/test.php?XDEBUG_PROFILE 처럼 호출하면 프로파일링이 시작되고, 설정한 디렉토리에 파일이 생성된다.

분석결과를 webgrind 로 본 화면


분석결과를 WinCacheGrid로 본 화면



서버의 보안점검을 실시한 결과 php 패키지를 업데이트하라고 권고해서
업데이트하기로 결정.

To upgrade to PHP 5.2.x on CentOS/RHEL/Fedora:
http://www.atomicorp.com/wiki/index.php/PHP

yum update를 해보니..업데이트할패키지가 거의 1G정도..

업데이트가 끝나면 php.ini 와 php.conf 파일을 복구해주자.

mv /etc/php.ini.rpmnew /etc/php.ini
mv /etc/httpd/conf.d/php.conf.rpmnew /etc/httpd/conf.d/php.conf

이전에 사용하던 설정들이 있다면 *.rpmsave 에서 다시 확인해서 수정해준다.

웹서비스 재시작
service httpd restart



업데이트 전
[root@ns ~]# cat /etc/redhat-release
CentOS release 5.2 (Final)

업데이트 후
[root@ns ~]# cat /etc/redhat-release
CentOS release 5.5 (Final)
[root@ns ~]# php --version
PHP 5.2.5 (cli) (built: Sep 22 2008 14:55:04)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.0, Copyright (c) 1998-2007, by Zend Technologies
[root@ns ~]#


Inline Translator가 로드되지 못했습니다. 다시 시도시려면 새로고침해주세요.
Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.

'오픈소스SW' 카테고리의 다른 글

보안서버 구축에 사용되는 무료인증서 StartSSL  (0) 2010.06.13
iptable rule  (0) 2010.06.10
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
php 문자열처리 관련 function  (0) 2010.06.05

MVC 기반의 PHP Framework CakePHP 홈페이지 : http://cakephp.org/

매뉴얼 : http://book.cakephp.org/

한글 매뉴얼 :http://manual.cakephp.co.kr/


CakePHP의 장점

  • 스키마를 만들면 자동으로 HTML 폼(뷰, 수정, 삭제, 업데이트)을 생성 :  [스케폴딩]
  • HTML 폼의 벨리데이션을 할 경우, 폼 이름과 규칙을 선언만 하고 나머지 귀찮은 일들을 알아서 해 준다 : [벨리데이션과 헬퍼]
  • 기존의 많은 URL들을 통합하고 관리할 수 있다 : [라우터]
  • 비즈니스 로직에서 회원과 관련된 부분을 더 이상 신경 쓰지 않아도 된다 : [ACL]
  • 관리자 페이지를 따로 만들 필요가 없고, RSS와 같은, 말하자면 콘텐츠는 같지만 뷰만 다른 부분을 간단히 구현할 수 있다 : [렌더]
  • 소스를 체계적으로 관리할 수 있다 : [콤포넌트와 벤더, 그리고 플러그인]


INSTALL

최신 버전을 다운로드 받아서 cake 라는 폴더에 모두 풀었다.

http://자신의도메인/cake 로 접속해보면 해야할 일들이 표시된다.

(charset 관련 메세지와 simpletest를 이용한 테스트를 구동하기 위해서 php.ini  설정을 변경해야 했다.)

#php.ini File의 변경내용

memory_limit = 64M 

default_charset = "UTF-8"

시키는대로 진행하고 예제를 따라해보면 쉽게 이해가능하다.


참고 URL

Cake PHP API Document
- http://api13.cakephp.org/classes

Cake PHP 소개
-http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&keywords=%C0%D0%C0%BB%B0%C5%B8%AE%3B%C6%AF%C1%FD&page=4&wr_id=32017

Cake PHP Google Groups
- http://groups.google.com/group/cake-php

CakePHP와 Template_
- http://coolengineer.com/409
- http://www.xtac.net/


Demo : http://db.garada.co.cc/cake/


'개발도 하냐?' 카테고리의 다른 글

정규표현식(regular expressions)  (0) 2010.06.16
HTTP 응답코드  (0) 2010.06.13
editplus setting  (0) 2010.06.06
hidden frame  (0) 2009.12.27
SI프로젝트 산출물  (0) 2009.12.14
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() 함수를 이용해 년, 월, 일 문자를 제거합니다.

────────────────────────────────────────
$date = str_replace('년','',$date); // 201004월20일
$date = str_replace('월','',$date); // 20100420일
$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('년'=>'/','월'=>'/','일'=> ''))));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

'오픈소스SW' 카테고리의 다른 글

Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
JavaScript Tree Menu  (0) 2010.05.24
jqGrid 3.6.5 PHP CRUD  (2) 2010.05.23
fckeditor에서 이미지경로를 위한 Tip  (0) 2010.05.13


php 버전업에 따른 배포용 게시판 업데이트
============================================
Program : FOSSBORARD ver 1.0
Version : 1.0.0 (2010.05.10)
Developer : chaeya@gmail.com
Site : http://sysinfo.kldp.net/

OS : Linux
Language : PHP 5.2.5 (cli) (built: Sep 22 2008 14:55:04)
=============================================
라이센스 : GPL

주의: wiswig 스킨의 사용을 위해서는 fckeditor 첨부파일도 같이 설치해야 한다.


KLDP에 예전 저장소를 업데이트하려고 했지만, cvs인 관계로 그냥 여기등록.

'오픈소스SW' 카테고리의 다른 글

jqGrid 3.6.5 PHP CRUD  (2) 2010.05.23
fckeditor에서 이미지경로를 위한 Tip  (0) 2010.05.13
Automating Linux Unix  (0) 2009.08.11
CentOs 5.2 vsftpd 설치  (0) 2009.08.10
CentOS 5.2 Final + BIND 9.3.4  (0) 2009.08.02

+ Recent posts