2007년 12월 30일 일요일

sphinx test

sphinx.conf 파일(한글도 물론 잘된다!)

source src1
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = user
    sql_pass                = password
    sql_db                  = database
    sql_port                = 3306
    sql_sock                = /var/run/mysqld/mysqld.sock
    sql_query_pre           = SET NAMES utf8
    sql_query_range         = SELECT MIN(idx),MAX(idx) FROM test
    sql_range_step          = 1024
    sql_query   = \
    SELECT idx, type, search \
    FROM test \
    WHERE idx >= $start AND idx <= $end
    sql_attr_uint           = type
    sql_ranged_throttle     = 0
}

source src1throttled : src1
{
    sql_ranged_throttle     = 100
}

index test1
{
    source          = src1
    path            = /usr/local/sphinx/var/data/test1
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 1
    charset_type    = utf-8
    charset_table   = 
    min_prefix_len  = 0
    min_infix_len   = 2
    enable_star     = 1
    ngram_len       = 1
    html_strip      = 0
}

index test1stemmed : test1
{
    path            = /usr/local/sphinx/var/data/test1stemmed
    morphology      = stem_en
}

index dist1
{
    type                = distributed
    local               = test1
    local               = test1stemmed
    agent               = localhost:3313:remote1
    agent               = localhost:3314:remote2,remote3
    agent_connect_timeout   = 1000
    agent_query_timeout     = 3000
}

indexer
{
    mem_limit           = 256M
}

searchd
{
    address             = 127.0.0.1
    port                = 3312
    log                 = /usr/local/sphinx/var/log/searchd.log
    query_log           = /usr/local/sphinx/var/log/query.log
    read_timeout        = 5
    max_children        = 2048
    pid_file            = /usr/local/sphinx/var/log/searchd.pid
    max_matches         = 10000
    seamless_rotate     = 1
    preopen_indexes     = 0
    unlink_old          = 1
}

2007년 12월 23일 일요일

sphinxSE install

오늘 드디어 미뤄 왔던 mysql에 sphinx-engine을 패치해서 소스 컴파일을 하는 작업을 했다.(이놈의 귀차니즘...)

우선 sphinx를 압축해제 후에 mysqlse/sphinx-version.diff 에 맞는 파일을 mysql 소스 디렉토리에 복사한다.

# patch -p1 < sphinx-version.diff
# BUILD/autorun.sh
# mkdir sql/sphinx
sphinx 소스파일을 sql/sphinx로 복사
# CC=gcc
# CFLAGS="-O3 -march=i686 -fomit-frame-pointer -pipe -felide-constructors -fno-exceptions -fno-rtti"
# CXXFLAGS="-O3 -march=i686 -felide -constructors -fno-execptions -fno-rtti"
# CXXLDFLAGS=""
# ./configure --prefix=/usr/local/mysql \
--enable-assembler \
--with-extra-charsets=complex \
--enable-thread-safe-client \
--with-big-tables \
--enable-local-infile \
--with-sphinx-storage-engine \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/usr/local/mysql/data \
--with-user=mysql \
--with-charset=utf8 \
--with-extra-charsets=complex \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static

(--with-plugins=sphinx in 5.1)

# make; make install


aclocal: configure.in: 486: macro `AM_PROG_AS' not found in library
Can't execute aclocal
위와같이 build시 에러가 난다면 automake를 1.9이상으로 업데이트하고 (apt-get install automake1.9) 아래와 같이 automake를 변경한다.
update-alternatives --set automake /usr/bin/automake-1.9
yacc.sql 관련 에러가 나면 bison package를 설치하면된다. 이 package는 A parser generator that is compatible with Y 요거란다. :) sphinx/ha_sphinx.cc:273: error: extra qualification ‘CSphSEFilter::’ on member ‘CSphSEFilter’ 이 에러는 확인해본결과 0.9.7 버전에 있는 sphinx 64bit 관련된 버그란다. o.9.7 이상을 사용하던가 아니면 patch를 하면된다. (패치는 못찾았다. --; 아니 귀찮아서 안찾았다.) 이제 문제는 현재 서버에는 ubuntu package로 mysql-server가 설치되어있다. 이미 설치되어있는걸 지우지 않고 mysql server를 하나 더 사용할려고 한다. 대충 찾아본 결과 my.cnf만 실행할때 설정해주면 된다고 한다. 우선 기본적으로 행할 것은
# groupadd mysql
# useradd -g mysql -d /dev/null -s /usr/sbin/nologin mysql
# /usr/local/mysql/bin/mysql_install_db 로 databases를 생성한다.

# mkdir /var/run/mysql
# mkdir /data/mysql
# mkdir /var/log/mysql

# chgrp mysql /var/run/mysql
# chmod g+rw /var/run/mysql
# chgrp mysql /var/log/mysql
# chmod g+rw /var/log/mysql

# chown -R root .
# chown -R mysql /data/mysql
# chgrp -R mysql .
# chgrp -R mysql /data/mysql

# chown -R root /usr/local/mysql
# chown -R mysql /usr/local/mysql/data
# chgrp -R mysql /usr/local/mysql
이번에 sock 디렉토리를 /usr/local/mysql/tmp로 설정했다.
# mkdir /usr/local/mysql/tmp
# chown -R mysql.mysql /usr/local/mysql/tmp
my.cnf파일은 /usr/local/mysql/share/mysql/my-large.cnf 를 my.cnf로 복사해서 사용했다. my.cnf에 추가한 사항은
[client]
port = 3307
socket = /usr/local/mysql/tmp/mysql.sock

[mysqld]
user = mysql
port = 3307
pid-file = /usr/local/mysql/tmp/mysql.pid
socket = /usr/local/mysql/tmp/mysql.sock
default-character-set = utf8
스크립트 등록
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
라이브러리 등록
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf && ldconfig 
정도 추가했다. 기타 에러가 발생할경우 /usr/local/mysql/data/hostname.err파일을 살펴보면 된다. 실행방법은 mysql -hlocalhost -u사용자 -p -P(설정한포트)로 실행 하면된다. 현재 에러 없이 가장 잘되는 버전은 mysql-5.0.22.tar.gz와 sphinx-0.9.8-svn-r985.tar.gz 이버전 두개를 사용했을때 설치가 잘되었다. mysql-5.1 버전을 사용했을때는 innodb engine이 설치가 되지 않았었다. configure할때 옵션을 추가해야 가능하다.
mysql> show engines;
+------------+---------+----------------------------------------------------------------+
Engine Support Comment
+------------+---------+----------------------------------------------------------------+
MyISAM DEFAULT Default engine as of MySQL 3.23 with great performance
MEMORY YES Hash based, stored in memory, useful for temporary tables
InnoDB YES Supports transactions, row-level locking, and foreign keys
BerkeleyDB NO Supports transactions and page-level locking
BLACKHOLE NO /dev/null storage engine (anything you write to it disappears)
EXAMPLE NO Example storage engine
ARCHIVE NO Archive storage engine
CSV NO CSV storage engine
SPHINX YES Sphinx storage engine 0.9.8
ndbcluster NO Clustered, fault-tolerant, memory-based tables
FEDERATED NO Federated MySQL storage engine
MRG_MYISAM YES Collection of identical MyISAM tables
ISAM NO Obsolete storage engine
+------------+---------+----------------------------------------------------------------+

2007년 10월 30일 화요일

fckeditor 설정

1. 메뉴관리설정 :

fckeditor/fckconfig.js
2. 이미지 업로드 관련
- fckeditor/editor/dialog/fck_image.html
- fckeditor/editor/dialog/fck_image/fck_image.js
- fckeditor/editor/filemanager/upload/php/*

이 파일만 수정하면 사용하는데 지장이 없는거 같다.
사용방법은

Value = $content;
    # witdth, height
    $oFCKeditor->Width = 580;
    $oFCKeditor->Height = 400;
?>
위와 같은 설정파일을 만든후에 editor를 사용할 페이지에 include 시킨다.

html 파일에서는

$oFCKeditor->Create();

editor를 새로 생성한다. 위치는 보통 글쓰는 곳에 다가 하면 editor가 보인다.

자바스크립트에서는
var oEditor = FCKeditorAPI.GetInstance('FCKeditor1') ;
document.formname.content.value = oEditor.GetXHTML(true).replace(/\n/g,'');

값을 받아서 처리하는 페이지에서는

$content = stripslashes($_POST["content"]);

로 받아서 처리하면된다.

2007년 10월 9일 화요일

검색관련

mysql innodb engine을 사용하면 full-text를 사용할 수 없다. 그래서 텍스트 검색할때 많이 느린편인데 sphinx를 이용하면 빠른 검색을 할 수 있다.
search를 이용하면 전체 필드의 내용을 다 검색할 수가 있는데 searchd 데몬을 실행하고 나서 php API를 이용하면 앞의 id만 나온다. 수정이 좀 필요할거 같다.

한글 문제는 table이 utf8일때 한글 검색이 된다. 이 부분도 걸리는게 현재는 table이 euckr로 되어있다.

euckr을 utf8로 변환해서 넣는 방법은 euckr db에서 mysqldump -u -p DB table --default-character-set=euckr > dump.sql로 하고 utf8 db에다가는 mysql -u -p DB < dump.sql

참조 url : http://www.ibm.com/developerworks/kr/library/os-php-sphinxsearch/

2007년 10월 7일 일요일

mysql c program 간단한 사용법

ubuntu 에서 mysql 관련 c API를 사용할려면 libmysqlclient-dev 패캐지를 필요로 한다.
이 패키지가 없으면 /usr/include/mysql/* 관련한 header파일이 없다.
(find / -name "mysql.h" -print로 찾아보면 결과가 없다.)
libmysqlclient-dev를 설치하고 나서 간단한 프로그램을 작성해 보면
#include stdio.h 
#include stdlib.h
#include mysql/mysql.h

int main(void) {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;

    char *server = host;
    char *user = user;
    char *password = password;
    char *database = database_name;

    conn = mysql_init(NULL);

    /* Connect to database */
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }

    /* send SQL query */
    if (mysql_query(conn, "show tables")) {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    }

    res = mysql_use_result(conn);

    /* output table name */
    printf("MySQL Tables in mysql database:\n");
    while ((row = mysql_fetch_row(res)) != NULL)
        printf("%s\n", row[0]);

    /* close connection */
    mysql_free_result(res);
    mysql_close(conn);
}

compile 방법은 gcc -lmysqlclient -o ex ex.c 로 컴파일 해서 실행하면 된다.
이때 mysql library 관련해서는

$ mysql_config --libs 

$ mysql_config --cflags
로 확인해 볼수 있다.

참조 url : http://www.cyberciti.biz/tips/linux-unix-connect-mysql-c-api-program.html
http://dev.mysql.com/doc/refman/5.0/en/c.html
http://www.mysqlkorea.co.kr/

2007년 10월 1일 월요일

간단한 firewall

iptables 관련해서 script 파일을 만든다.
#!/bin/bash
# flush all chains
iptables -F
# set the default policy for each of the pre-defined chains
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# allow establishment of connections initialised by my outgoing packets
iptabels -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# drop everything else
iptables -A INPUT -i eth+ -p udp -j DROP
iptables -A INPUT -i eth+ -p tcp -m tcp --syn -j DROP
# accept anything on localhost
iptables -A INPUT -i lo -j ACCEPT

이 파일을 서버가 시작될때 자동으로 등록 할려면
#!/bin/bash
if [[ $1 == start ]] ; then
    sudo /home/firewall/firewall.script
else
    sudo iptables -F
fi

파일을 /etc/init.d/firewall로 만든후에
update-rc.d firewall start 20 2 3 4 5 . stop 99 0 1 6 .

로 등록하면 서버가 부팅될때 자동으로 firewall이 실행된다.

삭제는
update-rc.d firewall remove

로 삭제 하면된다.

2007년 9월 5일 수요일

lucene

http://lucene.apache.org/java/docs/demo2.html

설치 방법은

0) 우선 JDK 1.4 version 이상, Ant 1.6.2 version이상 설치한다
1) http://www.apache.org/dyn/closer.cgi/lucene/java/ zip, tar.gz 둘중 한개 파일을 받는다.
2) build.xml 파일 설정을 한다.
3) shell 상에서 'ant' 명령 실행(rebuild시에는 ant javacc)
4) CLASSPATH에 lucene-core-*.jar과 lucene-demos-*.jar를 등록한다.

이 부분에 대해서는 압축해제한 디렉토리에서 BUILD.txt 파일에 보면 자세히 설명이 되어있다.

테스트로 홈디렉토리에 있는 계정하나를 테스트 해봤는데 잘나오더라.

관련 : url

Lucene Home http://jakarta.apache.org/lucene/
Lucene FAQ http://lucene.sourceforge.net/cgi-bin/faq/faqmanager.cgi
Lucene Getting Started http://jakarta.apache.org/lucene/docs/gettingstarted.html
고수로 가는 지름길 Jakarta Project 가메출판사 최범균 저
QueryParser Rules http://today.java.net/pub/a/today/2003/11/07/QueryParserRules.html Give your Web site its own search engine using Lucene http://builder.com.com/5100-6389-5054799.html
Lucene Intro http://today.java.net/pub/a/today/2003/07/30/LuceneIntro.html
Parsing, indexing, and searching XML with Digester and Lucene http://www-106.ibm.com/developerworks/library/j-lucene/
Advanced Text Indexing with Lucene http://www.onjava.com/pub/a/onjava/2003/03/05/lucene.html
Introduction to Text Indexing with Apache Jakarta Lucene http://www.onjava.com/pub/a/onjava/2003/01/15/lucene.html
The Lucene search engine Powerful flexible and free http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-lucene.html

2007년 9월 2일 일요일

ubuntu java eclipse

자바는 sun-java6-* 관련한 패키지를 설치하면 된다. 현재 사용되고 있는 자바를 보려면
update-java-alternatives -l

로 확인한다.
sudo update-alternatives -s java-6-sun

명령어를 내린다.
sudo update-alternatives --config java
sudo update-alternatives --config jar

명령으로 기본적인 설정을할 수 있다.

eclipse, eclipse-jdt를 설치하고 /etc/eclipse/java_home 파일에 /usr/lib/jvm/java-6-sun을 추가하고 사용하면 된다. ;-)

2007년 7월 3일 화요일

2007년 7월 1일 일요일

pyserial

python으로 시리얼 프로그램을 할려고 한다.
검색을 해보니 pyserial을 설치하면 쉽게(?) 프로그램이 가능한거 같다.
우선 pyserial을 설치한 후
>>> import serial
ImportError: No module named win32file

이런 에러가 나온다.(한번에 되는게 없네.)
검색을 해보니 Python Extensions for Windows 인가 관련된게 설치가 안되서 그런거 같다.

http://starship.python.net/crew/mhammond/win32/Downloads.html 검색을 해보니 이 페이지에서 python win32api관련된걸 다운받아 설치를 할 수있다.

설치를 하고 나니 에러 없이 잘된다.

관련 url :
http://pyserial.sourceforge.net/ 현재 이페이지에 있는 example 페이지가 열리지 않는다. :-(

2007년 6월 20일 수요일

apache ssl 관련

ssl은 신용카드 정보, 의료 기록, 법률 문서와 전자 상거래 애플리케이션과 같은 가장 기밀을 다루는 트랜잭션(transaction)들의 전송에 이용되는 것을 허용할 수 있도록 하는 요건을 실현하기 위한 것이다. 라고 http://kldp.org/HOWTO/html/SSL-RedHat-HOWTO/ssl-redhat-howto-2.html 여기에 나온다.
우선 비밀키를 사용하려면 openssl를 설치해야한다.
간단한 명령
# openssl genrsa -des3 -out server.key 1024
# openssl rsa -in server.key -out server.key.insecure
# openssl req -new -key server.key -out server.csr
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

생성된 파일들을 apache ssl관련 디렉토리에 이동 시킨다.
apache config 파일을 설정해야 하는데 ssl 443번을 이용하기에 가상호스트로 설정을 한다.
가상 호스트 설정에서
SSLEngine ON
SSLCertificateFile   crt 파일 절대 경로명
SSLCertificateKeyFile    key파일 절대 경로명

이 상위에 나오고 그 다음에 필요한 사항들을 설정해주면 된다.
특정 디렉토리만 ssl을 사용하게 되면 편하게 사용할 수 있을 것이다.
(Directory "~/~/~/ssl")
SSLRequireSSL
(/Directory)
(Directory "~/~/~/cgi-bin)
SSLOptions +StdEnvVars
(/Directory)

StdEnvVars에 대해서는 When this option is enabled, the standard set of SSL related CGI/SSI environment variables are created. This per default is disabled for performance reasons, because the information extraction step is a rather expensive operation. So one usually enables this option for CGI and SSI requests only. 이렇다는데...

마무리로 인증서를 설정하고 나서 apache를 실행이나 재시작 하는경우 ssl관련 패스워드를 물어본다. 이 부분을 없앨려면 openssl rsa -in filename.key-out new_filename.key으로 key파일을 변경해서 사용하면 된다.

관련 url :
http://kldp.org/HOWTO/html/SSL-RedHat-HOWTO/ssl-redhat-howto-2.html

2007년 5월 31일 목요일

ubuntu oracle-xe php

oracle과 php연동을 위해서 oci8관련된걸 설치해야 한다.

우선 oracle이 정상적으로 설치되었다는 가정하에 /opt/oracle/instantclient 디렉토리를 만든후에 여기에서 client관련된 파일을 다운로드(basic과 sdk) 한다.

다운로드 받은 파일을 /opt/oracle/instnatclient 에 압축을 푼다음에
ln -s libclntsh.so.10.1 libclntsh.so
ln -s libocci.so.10.1 libocci.so 

심볼릭 링크를 건다.

그후 apt-get install 로 php-pear패키지와 php5-dev패키지를 설치한다.
oci8을 install하는데 sudo pecl install oci8을 실행시키면 경로를 입력하라고 나오는데 이때 $oracle_home을 입력한다.

/etc/php5/apache2/php.ini에 extention=oci8.so 추가후에 phpinfo(); 로 oci8관련된 항목이 있는지 확인한다.

그 후에 테스트 코드를 만들어서 확인하면 되는데 OCIEnvNlsCreate() failed 이와 같은 에러가 난다면 아파치 실행시킬때 oracle 계정과 관련된 환경변수들을 제대로 인식 못한 것이기 때문에 오라클 환경변수를 아파치 실행할때 export시켜서 실행시키면 해결할 수 있다. /usr/sbin/apache2ctl 파일에 오라클 환경변수를 추가한다.

관련 url :
http://samgerstenzang.com/blog/archives/2006/09/howto-installing-oracle-xe-on-ubuntu-with-php

oracle database xe install

http://www.oracle.com/global/kr/download/seminar/2005/dbxe/dbxe_faq_kor.pdf

이 파일을 읽어보면 중소기업이나 개인등이 무료로 이용할 수 있는 라이센스이다.
ubuntu에서 설치를 해봤는데 별 이상없이 바로 설치 되었다.
접속은 sqldeveloper로 해봤는데 접속은 바로 성공.

sources.list 에 deb http://oss.oracle.com/debian unstable main non-free 추가후에 apt-get update; apt-get install oracle-xe로 설치한다.(아주 쉽다.) 이때 에러가 난다면 wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -를 실행한다.
스왑 파티션 용량이 작으면 늘려주고 /etc/init.d/oracle-xe configure로 설정을 한다.

문제는 shell에서 sqlplus /as sysdba로 했을때 ora-12705 관련 에러가 났다.
nls_lang 문제 인거 같아 찾아 보는데 $ORACLE_HOME/bin/nls_lang.sh 파일이 있는데 이 파일은 $ORACLE_HOME/bin/oracle_evn.sh 파일이 nls_lang.sh를 실행시킨다. 이때 무슨 문제인지는 모르나 env로 확인해봤을때 NLS_LANG 값이 제대로 입력되지 않았다. 그래서 sqldeveloper로 오라클 서버로 연결한 다음에

select USERENV('LANGUAGE') FROM DUAL;

sql문을 실행시킨다음에 결과값을 NLS_LANG 값을 입력 시켰더니 해결되었다.

한글 관련해서는 ~/.bashrc 에 export NLS_LANG='KOREAN_KOREA.AL32UTF8'을 추가한 다음에 nls_lang.sh 파일에 있는 nls_lang=${nlslang}.${charset}를 .bashrc 파일에 있는것과 동일하게 맞춰주면 된다.

관련 url : http://www.oracle.com/technology/tech/linux/install/xe-on-kubuntu.html