'프로그래밍'에 해당되는 글 20건

  1. 2009/06/06 PHP 시간 관련 함수를 써서 시간 차이 계산하기, DATEDIFF (1)
  2. 2009/01/26 PHP 또는 자바스크립트로 달력 만들기 소스 코드 (5)
  3. 2009/01/20 스핑크스 검색엔진으로 내 블로그 검색 성능을 높이자.
  4. 2009/01/18 웹 기반의 WYSIWYG 에디터, FCKeditor를 사용해보자.
  5. 2009/01/17 엑셀 문서 파일을 데이타베이스에 업로드 하는 PHP 소스 코드 (1)
  6. 2008/12/16 이미지 썸네일을 생성하는 PHP 함수 소스 코드 (2)
  7. 2008/12/06 내 블로그 검색에 오픈 소스 검색엔진을 붙여보자! (1)
  8. 2008/09/27 클립보드 복사 기능 구현을 위한 소스 코드 (1)
  9. 2008/09/16 홈페이지 동시접속자수 구현을 위한 PHP 소스 코드 (3)
  10. 2008/06/26 미리보기 이미지 썸네일 만들기 함수 PHP 소스 코드 (1)
  11. 2008/05/20 공개보드 게시물을 텍스트큐브 또는 태터툴즈로 복사하기. (1)
  12. 2008/05/16 PHP로 첨부파일이 있는 이메일 보내기 샘플 소스 코드 (1)
  13. 2008/05/15 삽질할 수 있는 PHP로 이메일 보내기 샘플 소스 코드
  14. 2007/12/18 MYSQL 데이타베이스 백업과 복사, PHP소스
  15. 2007/12/13 현재 디렉토리(폴더) 파일 목록 보기, PHP소스
  16. 2007/06/18 오늘부터 AJAX 사내교육을 맡게 되다. (3)
  17. 2007/04/19 내가 즐겨 쓰는 개발언어 PHP, 플래시 액션스크립트... (9)
  18. 2007/04/11 [테터툴즈] 불편했던 디폴트 리퍼러 로그에 시간 보여주기 (4)
  19. 2007/04/10 초간단 php소스로 이쁜 블로그 만들기. (14)
  20. 2007/03/30 PHP 함수는 몇개나 될까? (4)

시간 차이를 계산하고 이를 출력하는 함수를 만들어 보고 이를 통해 시간 관련 함수 date, strtotime 사용법을 알아보도록 합시다. 아래 PHP 소스 코드는 사용자 정의 함수 datetimediff 를 호출해서 현재 시간 또는 특정 시간을 기준으로 참조 시간과의 시간차를 계산하고 출력합니다.

[시간 차이 계산 실행 결과]

2009-06-06 12:02:28
2009-06-06 09:11:04
2009-06-06 13:15:03
2시간 전
2시간 51분 24초 전
4시간 3분 59초 전

[시간 차이 계산 PHP 소스 코드]
<?

$ctime = date('Y-m-d H:i:s');
//$rtime = "1942-01-01 00:00:01";
//$rtime = "1941-05-19 09:00:00";
//$rtime = "20090606";
//$rtime = "20090606093924";
//$rtime = "2009-06-06 09:39:24";
$rtime = date('Y-m-d H:i:s', strtotime("-2 hours -51 minutes -24 seconds"));
$xtime = date('Y-m-d H:i:s', strtotime("+1 hours 12 minutes 35 seconds"));

echo
"$ctime<br>\n";
echo "$rtime<br>\n";
echo "$xtime<br>\n";

echo datetimediff($rtime) . "<br>\n";
echo datetimediff($rtime, null, "ALL") . "<br>\n";
echo datetimediff($rtime, $xtime, "ALL") . "<br>\n";

function datetimediff($rtime, $ctime = null, $option = null){
      if ($ctime) $cur_time = strtotime($ctime);
      else $cur_time = time();
      $ref_time = strtotime($rtime);

      $cur_date = floor($cur_time / 86400);
      $ref_date = floor($ref_time / 86400);

      $datetimediff = $cur_time - $ref_time;
      $datedist = $cur_date - $ref_date;
      $datediff = floor($datetimediff / 86400);
      $weekdiff = floor($datediff / 7);
      $timediff = $datetimediff % 86400;

      $hour = floor($timediff / 3600);
      $min = floor($timediff % 3600 / 60);
      $sec = floor($timediff % 3600 % 60);

      $result = "";
      if ($datedist>34) {
            $result = date("Y년 n월 j일", $ref_time);
      } else if ($weekdiff>0) {
            $result = $weekdiff . "주 전";
      } else {
            if ($datediff>0) {
                  $result = $datedist . "일 전";
            } else if ($timediff<=0) {
                  $result = "1초 전";
            } else {
                  if ($hour) $result = $hour . "시간";
                  else if ($min) $result = $min . "분";
                  else $result = $sec . "초";
                  if ($result) $result .= " 전";
            }
      }
      if ($option=='ALL') {
            $result = "";
            if ($datediff) $result .= ($result?" ":"") . $datediff."일";
            if ($hour) $result .= ($result?" ":"") . $hour."시간";
            if ($min) $result .= ($result?" ":"") . $min ."분";
            if ($sec) $result .= ($result?" ":"") . $sec . "초";
            $result .= " 전";
      }
      return $result;
}

?>

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/576
2009/06/06 12:05 2009/06/06 12:05

댓글을 달아 주세요

  1. 늘처음 2009/11/22 10:41  댓글주소  수정/삭제  댓글쓰기

    좋은 내용 잘 보고 담아갑니다(네이버에서 퍼갔습니다.)

아래 소개하고 있는 소스 코드는 스크립트 언어 PHP 또는 자바스크립트를 이용해 달력을 출력하는 비교적 간단한 웹프로그램입니다. 두가지 소스중 하나를 실행 시키면 아래와 같은 이미지 처럼 출력이 됩니다. 달력을 만들기 위해서는 그 달의 첫 날짜와 마지막 날짜를 계산해야 하며 요일에 따라 글자의 색을 변화 시켜 줘야 합니다. 이해를 돕기 위해 되도록 소스 코드를 단순화 시켰으므로 코드를 차근 차근 살펴보면 이해가 되리라 생각됩니다. 달력이 투박해 보인다면 좀더 세련되게 업그레이드 해보세요.^^

사용자 삽입 이미지

[PHP로 달력 만들기 소스 코드]
<?php
function calendar(){
    $year = date("Y");
    $month = date("n");
    $day = date("d");
    $day_max = date("t",mktime(0,0,0,$month,1,$year));
    $week_start = date("w",mktime(0,0,0,$month,1,$year));
    $i = 0;
    $j = 0;
    $html = "<div class='calendar_box'><div class='calendar_title B'>".sprintf("%d-%02d-%02d",$year,$month,$day)."</div>";
    while ($j<$day_max){
        if ($i<$week_start) {
            $html .= "<div class='calendar_text'>·</div>";
        } else {
            if ($i%7==0) $font_color = " RED";
            else if ($i%7==6) $font_color = " BLUE";
            else $font_color = "";
            if ($day == ($j+1)) $font_weight = " B"; else $font_weight = "";
            $html .= "<div class='calendar_text$font_color$font_weight'>" . ($j+1) . "</div>";
            $j ++;
        }
        $i ++;
    }
    while ($i%7!==0){
        $html .= "<div class='calendar_text'>·</div>";
        $i ++;
    }
    $html .= "<div class='calendar_tail'></div></div>";
    return $html;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
body {font-family: Verdana, Dotum; line-height:20px;}
.B {font-weight:bold}
.box {width:185px; text-align:center; border:1px solid #dddddd}
.calendar_box {width:175px; padding:5px}
.calendar_text {width:25px; float:left; text-align:center; font-size:12px}
.RED {color:red}
.BLUE {color:blue}
.calendar_title {margin:0px; text-align:center; font-size:12px; background-color:#999999; color:#ffffff}
.calendar_tail {clear:both;}
</style>
<title>PHP로 달력 만들기</title>
</head>
<body>
<div class="box">
<?=calendar();?>
</div>
</body>
</html>

[자바스크립트로 달력 만들기 소스 코드]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>자바스크립트로 달력 만들기</title>
<style>
body {font-family: Verdana, Dotum; line-height:20px;}
.B {font-weight:bold}
.box {width:185px; text-align:center; border:1px solid #dddddd}
.calendar_box {width:175px; padding:5px}
.calendar_text {width:25px; float:left; text-align:center; font-size:12px}
.RED {color:red}
.BLUE {color:blue}
.calendar_title {margin:0px; text-align:center; font-size:12px; background-color:#999999; color:#ffffff}
.calendar_tail {clear:both;}
</style>
<script>
function calendar(){
    var today = new Date();
    var year = today.getFullYear();
    var month = today.getMonth() + 1;
    var day = today.getDate();
    var week_start = new Date(year,month-1,1).getDay();
    var day_max = get_day_max(year,month-1);
    var i = 0;
    var j = 0;
    var html = "<div class='calendar_box'><div class='calendar_title B'>" + year + "-" + get_number_str(month) + "-" + get_number_str(day) + "</div>";
    while (j < day_max){
        if (i < week_start) {
            html += "<div class='calendar_text'>·</div>";
        } else {
            if (i%7==0) font_color = " RED";
            else if (i%7==6) font_color = " BLUE";
            else font_color = "";
            if (day == (j+1)) font_weight = " B"; else font_weight = "";
            html += "<div class='calendar_text" + font_color + font_weight + "'>" + (j+1) + "</div>";
            j ++;
        }
        i ++;
    }
    while (i%7!==0){
        html += "<div class='calendar_text'>·</div>";
        i ++;
    }
    html += "<div class='calendar_tail'></div></div>";
    return html;
}
function get_day_max(year,month){
    var i = 29, cday;
    while(i<32){
        cday = new Date(year,month,i);
        if (cday.getFullYear()!=year || cday.getMonth()!=month) break;
        i++;
    }
    return i-1;
}
function get_number_str(num){
    if (num<10) num = '0' + num;
    return num;
}
</script>
</head>
<body>
<div class="box">
<script>
document.write(calendar());
</script>
</div>
</body>
</html>

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/565
2009/01/26 15:08 2009/01/26 15:08

댓글을 달아 주세요

  1. 비밀방문자 2009/06/04 10:37  댓글주소  수정/삭제  댓글쓰기

    관리자만 볼 수 있는 댓글입니다.

  2. 뽀글 2009/04/09 18:16  댓글주소  수정/삭제  댓글쓰기

    소스 복사해서 붙여넣기 하고 보는데, 일주일이 6일로 표시가 되어버리네요.
    어느 부분을 고쳐야 할 지 모르겠어요.

  3. 나야나 2009/04/01 09:05  댓글주소  수정/삭제  댓글쓰기

    여기 코드를 상업적으로 이용해도 무방한건가요?

  4. 복돌이 2009/03/18 09:58  댓글주소  수정/삭제  댓글쓰기

    아주 유용한 정보 감사합니다.^^

    행복한 하루 되세요^^
    (좋은정보 가져가면서 감사해서 파란글씨좀 클릭했어요)

  5. 화군 2009/01/26 16:17  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다 ^^

PHP 스크립트 API를 지원하는 스핑크스(Sphinx) Full-Text 검색엔진으로 텍스트큐브 블로그 검색을 구현하는 샘플 소스 코드입니다. 예제를 테스트 해보면 알 수 있지만 MySQL과 같은 데이타베이스만으로 구현한 검색 보다 검색 속도가 빨라지고 검색 속도 걱정 없이 복수 검색어 키워드(Keyword)를 사용할 수 있고 다양한 검색 옵션을 적용할 수 있습니다. 그러나 검색 데몬을 띄울 수 있어야 하므로 개인 서버를 가지고 있어야 운영이 가능하며 포스트를 추가할 때마다 레코드 추가에 따른 주기적인 인덱싱(Indexing)을 하거나 증분에 대한 인덱싱을 별도로 해줘야 합니다.
아래 예제 소스와 관련 문서를 참고하고 오픈 소스 검색엔진 스핑크스를 활용해 블로그와 홈페이지 검색의 성능을 높이고 더불어 검색 쿼리 요청으로 발행하는 데이타베이스 서버의 부담을 줄여보세요.

[블로그 검색 테스트]
http://www.hompydesign.com/blog/find/

[스핑크스 검색 엔진 참고 문서]
http://www.sphinxsearch.com/docs/current.html

[blog_search.php]
<?php
header("Content-Type: text/html; charset=UTF-8");
require("sphinxapi.php");
$conn = mysql_connect("192.168.0.11", "blog", "password");
if ($conn) {
    mysql_select_db("blog", $conn);
    mysql_query("set names utf8", $conn);
}

$host = "192.168.0.41";
$port = 3312;
$index = "blog_search";

$q = $_POST[q];
$limit = 10;
$sortby = "@id DESC";
$mode = SPH_MATCH_ANY; //$mode = SPH_MATCH_ALL; //$mode = SPH_MATCH_PHRASE;
$ranker = SPH_RANK_PROXIMITY_BM25;

$cl = new SphinxClient ();
$cl->SetServer ( $host, $port );
$cl->SetConnectTimeout ( 1 );
$cl->SetMatchMode ( $mode );
if ( $sortby ) $cl->SetSortMode ( SPH_SORT_EXTENDED, $sortby );
if ( $limit ) $cl->SetLimits ( 0, $limit, ( $limit>1000 ) ? $limit : 1000 );
$cl->SetArrayResult ( true );
$res = $cl->Query ( $q, $index );
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>검색 테스트</title>
<style>
body {font-size:12px;}
form {margin:0px;}
</style>
</head>
<body>
<form method=post>
<input type=text name="q" value="<?=$q;?>" style="width:400px">
<input type="submit" value="검색"><br>
</form>
<?
if ( $res===false ){
    print "질의 실패: " . $cl->GetLastError() . ".<br />\n";
    exit;
}
if ( $cl->GetLastWarning() ) print "경고: " . $cl->GetLastWarning() . "<br />\n<br />\n";
print "'$q' 검색 결과 $res[total] 건 / $res[total_found] 건, 검색 시간 $res[time] 초.<br />\n";
print "<br />\n";
if ( is_array($res["matches"]) ){
    $n = 1;
    foreach ( $res["matches"] as $doc => $docinfo ) {
        $idz[] = $docinfo[id]; $n++;
    }
    $query = "select * from tt_Entries where id in(". implode(',', $idz) .")";
    $result = mysql_query($query);
    if ($result)
    while ($row = mysql_fetch_array($result)) {
        echo "{$row[id]} : {$row[title]}<br>";
        echo mb_substr(strip_tags($row[content]),0,512,"UTF-8");
        echo "<br><br>";
    }
}
?>
</body>
</html>

[/usr/local/etc/sphinx.conf]
source blog_search
{
    type = mysql

    sql_host = 192.168.0.11
    sql_user = blog
    sql_pass = password
    sql_db     = blog
    sql_port = 3306 # optional, default is 3306

    sql_query_pre = SET NAMES utf8
    sql_query_pre = SET CHARACTER SET UTF8


    sql_query_range = SELECT MIN(id),MAX(id) FROM tt_Entries
    sql_range_step = 128

    sql_query = \
    SELECT id, title, content, slogan, comments, published, created, modified FROM tt_Entries \
    WHERE blogid=1 AND userid=1 AND draft=0 AND visibility AND id>=$start AND id<=$end

    sql_attr_uint = comments
    sql_attr_timestamp = published
    sql_attr_timestamp = created
    sql_attr_timestamp = modified
    sql_attr_str2ordinal = slogan

    sql_query_info = SELECT * FROM tt_Entries WHERE id=$id
}

index blog_search
{
    source = blog_search
    path = /home/blog/sphinx/blog_search
    docinfo = extern

    mlock = 0
    morphology = none
    min_word_len = 1
    charset_type = utf-8
    min_prefix_len = 0
    min_infix_len = 2
    enable_star = 1
    ngram_len = 0
    html_strip = 0

    charset_table = \
U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, \
U+F900->U+8C48, U+F901->U+66F4, U+F902->U+8ECA, U+F903->U+8CC8, U+F904->U+6ED1, \
U+F905->U+4E32, U+F906->U+53E5, U+F907->U+9F9C, U+F908->U+9F9C, U+F909->U+5951, \
U+F90A->U+91D1, U+F90B->U+5587, U+F90C->U+5948, U+F90D->U+61F6, U+F90E->U+7669, \
U+F90F->U+7F85, U+F910->U+863F, U+F911->U+87BA, U+F912->U+88F8, U+F913->U+908F, \
U+F914->U+6A02, U+F915->U+6D1B, U+F916->U+70D9, U+F917->U+73DE, U+F918->U+843D, \
U+F919->U+916A, U+F91A->U+99F1, U+F91B->U+4E82, U+F91C->U+5375, U+F91D->U+6B04, \
U+F91E->U+721B, U+F91F->U+862D, U+F920->U+9E1E, U+F921->U+5D50, U+F922->U+6FEB, \
U+F923->U+85CD, U+F924->U+8964, U+F925->U+62C9, U+F926->U+81D8, U+F927->U+881F, \
U+F928->U+5ECA, U+F929->U+6717, U+F92A->U+6D6A, U+F92B->U+72FC, U+F92C->U+90CE, \
U+F92D->U+4F86, U+F92E->U+51B7, U+F92F->U+52DE, U+F930->U+64C4, U+F931->U+6AD3, \
U+F932->U+7210, U+F933->U+76E7, U+F934->U+8001, U+F935->U+8606, U+F936->U+865C, \
U+F937->U+8DEF, U+F938->U+9732, U+F939->U+9B6F, U+F93A->U+9DFA, U+F93B->U+788C, \
U+F93C->U+797F, U+F93D->U+7DA0, U+F93E->U+83C9, U+F93F->U+9304, U+F940->U+9E7F, \
U+F941->U+8AD6, U+F942->U+58DF, U+F943->U+5F04, U+F944->U+7C60, U+F945->U+807E, \
U+F946->U+7262, U+F947->U+78CA, U+F948->U+8CC2, U+F949->U+96F7, U+F94A->U+58D8, \
U+F94B->U+5C62, U+F94C->U+6A13, U+F94D->U+6DDA, U+F94E->U+6F0F, U+F94F->U+7D2F, \
U+F950->U+7E37, U+F951->U+964B, U+F952->U+52D2, U+F953->U+808B, U+F954->U+51DC, \
U+F955->U+51CC, U+F956->U+7A1C, U+F957->U+7DBE, U+F958->U+83F1, U+F959->U+9675, \
U+F95A->U+8B80, U+F95B->U+62CF, U+F95C->U+6A02, U+F95D->U+8AFE, U+F95E->U+4E39, \
U+F95F->U+5BE7, U+F960->U+6012, U+F961->U+7387, U+F962->U+7570, U+F963->U+5317, \
U+F964->U+78FB, U+F965->U+4FBF, U+F966->U+5FA9, U+F967->U+4E0D, U+F968->U+6CCC, \
U+F969->U+6578, U+F96A->U+7D22, U+F96B->U+53C3, U+F96C->U+585E, U+F96D->U+7701, \
U+F96E->U+8449, U+F96F->U+8AAA, U+F970->U+6BBA, U+F971->U+8FB0, U+F972->U+6C88, \
U+F973->U+62FE, U+F974->U+82E5, U+F975->U+63A0, U+F976->U+7565, U+F977->U+4EAE, \
U+F978->U+5169, U+F979->U+51C9, U+F97A->U+6881, U+F97B->U+7CE7, U+F97C->U+826F, \
U+F97D->U+8AD2, U+F97E->U+91CF, U+F97F->U+52F5, U+F980->U+5442, U+F981->U+5973, \
U+F982->U+5EEC, U+F983->U+65C5, U+F984->U+6FFE, U+F985->U+792A, U+F986->U+95AD, \
U+F987->U+9A6A, U+F988->U+9E97, U+F989->U+9ECE, U+F98A->U+529B, U+F98B->U+66C6, \
U+F98C->U+6B77, U+F98D->U+8F62, U+F98E->U+5E74, U+F98F->U+6190, U+F990->U+6200, \
U+F991->U+649A, U+F992->U+6F23, U+F993->U+7149, U+F994->U+7489, U+F995->U+79CA, \
U+F996->U+7DF4, U+F997->U+806F, U+F998->U+8F26, U+F999->U+84EE, U+F99A->U+9023, \
U+F99B->U+934A, U+F99C->U+5217, U+F99D->U+52A3, U+F99E->U+54BD, U+F99F->U+70C8, \
U+F9A0->U+88C2, U+F9A1->U+8AAA, U+F9A2->U+5EC9, U+F9A3->U+5FF5, U+F9A4->U+637B, \
U+F9A5->U+6BAE, U+F9A6->U+7C3E, U+F9A7->U+7375, U+F9A8->U+4EE4, U+F9A9->U+56F9, \
U+F9AA->U+5BE7, U+F9AB->U+5DBA, U+F9AC->U+601C, U+F9AD->U+73B2, U+F9AE->U+7469, \
U+F9AF->U+7F9A, U+F9B0->U+8046, U+F9B1->U+9234, U+F9B2->U+96F6, U+F9B3->U+9748, \
U+F9B4->U+9818, U+F9B5->U+4F8B, U+F9B6->U+79AE, U+F9B7->U+91B4, U+F9B8->U+96B8, \
U+F9B9->U+60E1, U+F9BA->U+4E86, U+F9BB->U+50DA, U+F9BC->U+5BEE, U+F9BD->U+5C3F, \
U+F9BE->U+6599, U+F9BF->U+6A02, U+F9C0->U+71CE, U+F9C1->U+7642, U+F9C2->U+84FC, \
U+F9C3->U+907C, U+F9C4->U+9F8D, U+F9C5->U+6688, U+F9C6->U+962E, U+F9C7->U+5289, \
U+F9C8->U+677B, U+F9C9->U+67F3, U+F9CA->U+6D41, U+F9CB->U+6E9C, U+F9CC->U+7409, \
U+F9CD->U+7559, U+F9CE->U+786B, U+F9CF->U+7D10, U+F9D0->U+985E, U+F9D1->U+516D, \
U+F9D2->U+622E, U+F9D3->U+9678, U+F9D4->U+502B, U+F9D5->U+5D19, U+F9D6->U+6DEA, \
U+F9D7->U+8F2A, U+F9D8->U+5F8B, U+F9D9->U+6144, U+F9DA->U+6817, U+F9DB->U+7387, \
U+F9DC->U+9686, U+F9DD->U+5229, U+F9DE->U+540F, U+F9DF->U+5C65, U+F9E0->U+6613, \
U+F9E1->U+674E, U+F9E2->U+68A8, U+F9E3->U+6CE5, U+F9E4->U+7406, U+F9E5->U+75E2, \
U+F9E6->U+7F79, U+F9E7->U+88CF, U+F9E8->U+88E1, U+F9E9->U+91CC, U+F9EA->U+96E2, \
U+F9EB->U+533F, U+F9EC->U+6EBA, U+F9ED->U+541D, U+F9EE->U+71D0, U+F9EF->U+7498, \
U+F9F0->U+85FA, U+F9F1->U+96A3, U+F9F2->U+9C57, U+F9F3->U+9E9F, U+F9F4->U+6797, \
U+F9F5->U+6DCB, U+F9F6->U+81E8, U+F9F7->U+7ACB, U+F9F8->U+7B20, U+F9F9->U+7C92, \
U+F9FA->U+72C0, U+F9FB->U+7099, U+F9FC->U+8B58, U+F9FD->U+4EC0, U+F9FE->U+8336, \
U+F9FF->U+523A, U+FA00->U+5207, U+FA01->U+5EA6, U+FA02->U+62D3, U+FA03->U+7CD6, \
U+FA04->U+5B85, U+FA05->U+6D1E, U+FA06->U+66B4, U+FA07->U+8F3B, U+FA08->U+884C, \
U+FA09->U+964D, U+FA0A->U+898B, U+FA0B->U+5ED3, U+FA0C->U+5140, U+FA0D->U+55C0, \
U+FA10->U+585A, U+FA12->U+6674, U+FA15->U+51DE, U+FA16->U+732A, U+FA17->U+76CA, \
U+FA18->U+793C, U+FA19->U+795E, U+FA1A->U+7965, U+FA1B->U+798F, U+FA1C->U+9756, \
U+FA1D->U+7CBE, U+FA1E->U+7FBD, U+FA20->U+8612, U+FA22->U+8AF8, U+FA25->U+9038, \
U+FA26->U+90FD, U+FA2A->U+98EF, U+FA2B->U+98FC, U+FA2C->U+9928, U+FA2D->U+9DB4, \
U+FA30->U+4FAE, U+FA31->U+50E7, U+FA32->U+514D, U+FA33->U+52C9, U+FA34->U+52E4, \
U+FA35->U+5351, U+FA36->U+559D, U+FA37->U+5606, U+FA38->U+5668, U+FA39->U+5840, \
U+FA3A->U+58A8, U+FA3B->U+5C64, U+FA3C->U+5C6E, U+FA3D->U+6094, U+FA3E->U+6168, \
U+FA3F->U+618E, U+FA40->U+61F2, U+FA41->U+654F, U+FA42->U+65E2, U+FA43->U+6691, \
U+FA44->U+6885, U+FA45->U+6D77, U+FA46->U+6E1A, U+FA47->U+6F22, U+FA48->U+716E, \
U+FA49->U+722B, U+FA4A->U+7422, U+FA4B->U+7891, U+FA4C->U+793E, U+FA4D->U+7949, \
U+FA4E->U+7948, U+FA4F->U+7950, U+FA50->U+7956, U+FA51->U+795D, U+FA52->U+798D, \
U+FA53->U+798E, U+FA54->U+7A40, U+FA55->U+7A81, U+FA56->U+7BC0, U+FA57->U+7DF4, \
U+FA58->U+7E09, U+FA59->U+7E41, U+FA5A->U+7F72, U+FA5B->U+8005, U+FA5C->U+81ED, \
U+FA5D->U+8279, U+FA5E->U+8279, U+FA5F->U+8457, U+FA60->U+8910, U+FA61->U+8996, \
U+FA62->U+8B01, U+FA63->U+8B39, U+FA64->U+8CD3, U+FA65->U+8D08, U+FA66->U+8FB6, \
U+FA67->U+9038, U+FA68->U+96E3, U+FA69->U+97FF, U+FA6A->U+983B, U+FA70->U+4E26, \
U+FA71->U+51B5, U+FA72->U+5168, U+FA73->U+4F80, U+FA74->U+5145, U+FA75->U+5180, \
U+FA76->U+52C7, U+FA77->U+52FA, U+FA78->U+559D, U+FA79->U+5555, U+FA7A->U+5599, \
U+FA7B->U+55E2, U+FA7C->U+585A, U+FA7D->U+58B3, U+FA7E->U+5944, U+FA7F->U+5954, \
U+FA80->U+5A62, U+FA81->U+5B28, U+FA82->U+5ED2, U+FA83->U+5ED9, U+FA84->U+5F69, \
U+FA85->U+5FAD, U+FA86->U+60D8, U+FA87->U+614E, U+FA88->U+6108, U+FA89->U+618E, \
U+FA8A->U+6160, U+FA8B->U+61F2, U+FA8C->U+6234, U+FA8D->U+63C4, U+FA8E->U+641C, \
U+FA8F->U+6452, U+FA90->U+6556, U+FA91->U+6674, U+FA92->U+6717, U+FA93->U+671B, \
U+FA94->U+6756, U+FA95->U+6B79, U+FA96->U+6BBA, U+FA97->U+6D41, U+FA98->U+6EDB, \
U+FA99->U+6ECB, U+FA9A->U+6F22, U+FA9B->U+701E, U+FA9C->U+716E, U+FA9D->U+77A7, \
U+FA9E->U+7235, U+FA9F->U+72AF, U+FAA0->U+732A, U+FAA1->U+7471, U+FAA2->U+7506, \
U+FAA3->U+753B, U+FAA4->U+761D, U+FAA5->U+761F, U+FAA6->U+76CA, U+FAA7->U+76DB, \
U+FAA8->U+76F4, U+FAA9->U+774A, U+FAAA->U+7740, U+FAAB->U+78CC, U+FAAC->U+7AB1, \
U+FAAD->U+7BC0, U+FAAE->U+7C7B, U+FAAF->U+7D5B, U+FAB0->U+7DF4, U+FAB1->U+7F3E, \
U+FAB2->U+8005, U+FAB3->U+8352, U+FAB4->U+83EF, U+FAB5->U+8779, U+FAB6->U+8941, \
U+FAB7->U+8986, U+FAB8->U+8996, U+FAB9->U+8ABF, U+FABA->U+8AF8, U+FABB->U+8ACB, \
U+FABC->U+8B01, U+FABD->U+8AFE, U+FABE->U+8AED, U+FABF->U+8B39, U+FAC0->U+8B8A, \
U+FAC1->U+8D08, U+FAC2->U+8F38, U+FAC3->U+9072, U+FAC4->U+9199, U+FAC5->U+9276, \
U+FAC6->U+967C, U+FAC7->U+96E3, U+FAC8->U+9756, U+FAC9->U+97DB, U+FACA->U+97FF, \
U+FACB->U+980B, U+FACC->U+983B, U+FACD->U+9B12, U+FACE->U+9F9C, U+FACF->U+2284A, \
U+FAD0->U+22844, U+FAD1->U+233D5, U+FAD2->U+3B9D, U+FAD3->U+4018, U+FAD4->U+4039, \
U+FAD5->U+25249, U+FAD6->U+25CD0, U+FAD7->U+27ED3, U+FAD8->U+9F43, U+FAD9->U+9F8E, \
U+2F800->U+4E3D, U+2F801->U+4E38, U+2F802->U+4E41, U+2F803->U+20122, U+2F804->U+4F60, \
U+2F805->U+4FAE, U+2F806->U+4FBB, U+2F807->U+5002, U+2F808->U+507A, U+2F809->U+5099, \
U+2F80A->U+50E7, U+2F80B->U+50CF, U+2F80C->U+349E, U+2F80D->U+2063A, U+2F80E->U+514D, \
U+2F80F->U+5154, U+2F810->U+5164, U+2F811->U+5177, U+2F812->U+2051C, U+2F813->U+34B9, \
U+2F814->U+5167, U+2F815->U+518D, U+2F816->U+2054B, U+2F817->U+5197, U+2F818->U+51A4, \
U+2F819->U+4ECC, U+2F81A->U+51AC, U+2F81B->U+51B5, U+2F81C->U+291DF, U+2F81D->U+51F5, \
U+2F81E->U+5203, U+2F81F->U+34DF, U+2F820->U+523B, U+2F821->U+5246, U+2F822->U+5272, \
U+2F823->U+5277, U+2F824->U+3515, U+2F825->U+52C7, U+2F826->U+52C9, U+2F827->U+52E4, \
U+2F828->U+52FA, U+2F829->U+5305, U+2F82A->U+5306, U+2F82B->U+5317, U+2F82C->U+5349, \
U+2F82D->U+5351, U+2F82E->U+535A, U+2F82F->U+5373, U+2F830->U+537D, U+2F831->U+537F, \
U+2F832->U+537F, U+2F833->U+537F, U+2F834->U+20A2C, U+2F835->U+7070, U+2F836->U+53CA, \
U+2F837->U+53DF, U+2F838->U+20B63, U+2F839->U+53EB, U+2F83A->U+53F1, U+2F83B->U+5406, \
U+2F83C->U+549E, U+2F83D->U+5438, U+2F83E->U+5448, U+2F83F->U+5468, U+2F840->U+54A2, \
U+2F841->U+54F6, U+2F842->U+5510, U+2F843->U+5553, U+2F844->U+5563, U+2F845->U+5584, \
U+2F846->U+5584, U+2F847->U+5599, U+2F848->U+55AB, U+2F849->U+55B3, U+2F84A->U+55C2, \
U+2F84B->U+5716, U+2F84C->U+5606, U+2F84D->U+5717, U+2F84E->U+5651, U+2F84F->U+5674, \
U+2F850->U+5207, U+2F851->U+58EE, U+2F852->U+57CE, U+2F853->U+57F4, U+2F854->U+580D, \
U+2F855->U+578B, U+2F856->U+5832, U+2F857->U+5831, U+2F858->U+58AC, U+2F859->U+214E4, \
U+2F85A->U+58F2, U+2F85B->U+58F7, U+2F85C->U+5906, U+2F85D->U+591A, U+2F85E->U+5922, \
U+2F85F->U+5962, U+2F860->U+216A8, U+2F861->U+216EA, U+2F862->U+59EC, U+2F863->U+5A1B, \
U+2F864->U+5A27, U+2F865->U+59D8, U+2F866->U+5A66, U+2F867->U+36EE, U+2F868->U+36FC, \
U+2F869->U+5B08, U+2F86A->U+5B3E, U+2F86B->U+5B3E, U+2F86C->U+219C8, U+2F86D->U+5BC3, \
U+2F86E->U+5BD8, U+2F86F->U+5BE7, U+2F870->U+5BF3, U+2F871->U+21B18, U+2F872->U+5BFF, \
U+2F873->U+5C06, U+2F874->U+5F53, U+2F875->U+5C22, U+2F876->U+3781, U+2F877->U+5C60, \
U+2F878->U+5C6E, U+2F879->U+5CC0, U+2F87A->U+5C8D, U+2F87B->U+21DE4, U+2F87C->U+5D43, \
U+2F87D->U+21DE6, U+2F87E->U+5D6E, U+2F87F->U+5D6B, U+2F880->U+5D7C, U+2F881->U+5DE1, \
U+2F882->U+5DE2, U+2F883->U+382F, U+2F884->U+5DFD, U+2F885->U+5E28, U+2F886->U+5E3D, \
U+2F887->U+5E69, U+2F888->U+3862, U+2F889->U+22183, U+2F88A->U+387C, U+2F88B->U+5EB0, \
U+2F88C->U+5EB3, U+2F88D->U+5EB6, U+2F88E->U+5ECA, U+2F88F->U+2A392, U+2F890->U+5EFE, \
U+2F891->U+22331, U+2F892->U+22331, U+2F893->U+8201, U+2F894->U+5F22, U+2F895->U+5F22, \
U+2F896->U+38C7, U+2F897->U+232B8, U+2F898->U+261DA, U+2F899->U+5F62, U+2F89A->U+5F6B, \
U+2F89B->U+38E3, U+2F89C->U+5F9A, U+2F89D->U+5FCD, U+2F89E->U+5FD7, U+2F89F->U+5FF9, \
U+2F8A0->U+6081, U+2F8A1->U+393A, U+2F8A2->U+391C, U+2F8A3->U+6094, U+2F8A4->U+226D4, \
U+2F8A5->U+60C7, U+2F8A6->U+6148, U+2F8A7->U+614C, U+2F8A8->U+614E, U+2F8A9->U+614C, \
U+2F8AA->U+617A, U+2F8AB->U+618E, U+2F8AC->U+61B2, U+2F8AD->U+61A4, U+2F8AE->U+61AF, \
U+2F8AF->U+61DE, U+2F8B0->U+61F2, U+2F8B1->U+61F6, U+2F8B2->U+6210, U+2F8B3->U+621B, \
U+2F8B4->U+625D, U+2F8B5->U+62B1, U+2F8B6->U+62D4, U+2F8B7->U+6350, U+2F8B8->U+22B0C, \
U+2F8B9->U+633D, U+2F8BA->U+62FC, U+2F8BB->U+6368, U+2F8BC->U+6383, U+2F8BD->U+63E4, \
U+2F8BE->U+22BF1, U+2F8BF->U+6422, U+2F8C0->U+63C5, U+2F8C1->U+63A9, U+2F8C2->U+3A2E, \
U+2F8C3->U+6469, U+2F8C4->U+647E, U+2F8C5->U+649D, U+2F8C6->U+6477, U+2F8C7->U+3A6C, \
U+2F8C8->U+654F, U+2F8C9->U+656C, U+2F8CA->U+2300A, U+2F8CB->U+65E3, U+2F8CC->U+66F8, \
U+2F8CD->U+6649, U+2F8CE->U+3B19, U+2F8CF->U+6691, U+2F8D0->U+3B08, U+2F8D1->U+3AE4, \
U+2F8D2->U+5192, U+2F8D3->U+5195, U+2F8D4->U+6700, U+2F8D5->U+669C, U+2F8D6->U+80AD, \
U+2F8D7->U+43D9, U+2F8D8->U+6717, U+2F8D9->U+671B, U+2F8DA->U+6721, U+2F8DB->U+675E, \
U+2F8DC->U+6753, U+2F8DD->U+233C3, U+2F8DE->U+3B49, U+2F8DF->U+67FA, U+2F8E0->U+6785, \
U+2F8E1->U+6852, U+2F8E2->U+6885, U+2F8E3->U+2346D, U+2F8E4->U+688E, U+2F8E5->U+681F, \
U+2F8E6->U+6914, U+2F8E7->U+3B9D, U+2F8E8->U+6942, U+2F8E9->U+69A3, U+2F8EA->U+69EA, \
U+2F8EB->U+6AA8, U+2F8EC->U+236A3, U+2F8ED->U+6ADB, U+2F8EE->U+3C18, U+2F8EF->U+6B21, \
U+2F8F0->U+238A7, U+2F8F1->U+6B54, U+2F8F2->U+3C4E, U+2F8F3->U+6B72, U+2F8F4->U+6B9F, \
U+2F8F5->U+6BBA, U+2F8F6->U+6BBB, U+2F8F7->U+23A8D, U+2F8F8->U+21D0B, U+2F8F9->U+23AFA, \
U+2F8FA->U+6C4E, U+2F8FB->U+23CBC, U+2F8FC->U+6CBF, U+2F8FD->U+6CCD, U+2F8FE->U+6C67, \
U+2F8FF->U+6D16, U+2F900->U+6D3E, U+2F901->U+6D77, U+2F902->U+6D41, U+2F903->U+6D69, \
U+2F904->U+6D78, U+2F905->U+6D85, U+2F906->U+23D1E, U+2F907->U+6D34, U+2F908->U+6E2F, \
U+2F909->U+6E6E, U+2F90A->U+3D33, U+2F90B->U+6ECB, U+2F90C->U+6EC7, U+2F90D->U+23ED1, \
U+2F90E->U+6DF9, U+2F90F->U+6F6E, U+2F910->U+23F5E, U+2F911->U+23F8E, U+2F912->U+6FC6, \
U+2F913->U+7039, U+2F914->U+701E, U+2F915->U+701B, U+2F916->U+3D96, U+2F917->U+704A, \
U+2F918->U+707D, U+2F919->U+7077, U+2F91A->U+70AD, U+2F91B->U+20525, U+2F91C->U+7145, \
U+2F91D->U+24263, U+2F91E->U+719C, U+2F91F->U+243AB, U+2F920->U+7228, U+2F921->U+7235, \
U+2F922->U+7250, U+2F923->U+24608, U+2F924->U+7280, U+2F925->U+7295, U+2F926->U+24735, \
U+2F927->U+24814, U+2F928->U+737A, U+2F929->U+738B, U+2F92A->U+3EAC, U+2F92B->U+73A5, \
U+2F92C->U+3EB8, U+2F92D->U+3EB8, U+2F92E->U+7447, U+2F92F->U+745C, U+2F930->U+7471, \
U+2F931->U+7485, U+2F932->U+74CA, U+2F933->U+3F1B, U+2F934->U+7524, U+2F935->U+24C36, \
U+2F936->U+753E, U+2F937->U+24C92, U+2F938->U+7570, U+2F939->U+2219F, U+2F93A->U+7610, \
U+2F93B->U+24FA1, U+2F93C->U+24FB8, U+2F93D->U+25044, U+2F93E->U+3FFC, U+2F93F->U+4008, \
U+2F940->U+76F4, U+2F941->U+250F3, U+2F942->U+250F2, U+2F943->U+25119, U+2F944->U+25133, \
U+2F945->U+771E, U+2F946->U+771F, U+2F947->U+771F, U+2F948->U+774A, U+2F949->U+4039, \
U+2F94A->U+778B, U+2F94B->U+4046, U+2F94C->U+4096, U+2F94D->U+2541D, U+2F94E->U+784E, \
U+2F94F->U+788C, U+2F950->U+78CC, U+2F951->U+40E3, U+2F952->U+25626, U+2F953->U+7956, \
U+2F954->U+2569A, U+2F955->U+256C5, U+2F956->U+798F, U+2F957->U+79EB, U+2F958->U+412F, \
U+2F959->U+7A40, U+2F95A->U+7A4A, U+2F95B->U+7A4F, U+2F95C->U+2597C, U+2F95D->U+25AA7, \
U+2F95E->U+25AA7, U+2F95F->U+7AEE, U+2F960->U+4202, U+2F961->U+25BAB, U+2F962->U+7BC6, \
U+2F963->U+7BC9, U+2F964->U+4227, U+2F965->U+25C80, U+2F966->U+7CD2, U+2F967->U+42A0, \
U+2F968->U+7CE8, U+2F969->U+7CE3, U+2F96A->U+7D00, U+2F96B->U+25F86, U+2F96C->U+7D63, \
U+2F96D->U+4301, U+2F96E->U+7DC7, U+2F96F->U+7E02, U+2F970->U+7E45, U+2F971->U+4334, \
U+2F972->U+26228, U+2F973->U+26247, U+2F974->U+4359, U+2F975->U+262D9, U+2F976->U+7F7A, \
U+2F977->U+2633E, U+2F978->U+7F95, U+2F979->U+7FFA, U+2F97A->U+8005, U+2F97B->U+264DA, \
U+2F97C->U+26523, U+2F97D->U+8060, U+2F97E->U+265A8, U+2F97F->U+8070, U+2F980->U+2335F, \
U+2F981->U+43D5, U+2F982->U+80B2, U+2F983->U+8103, U+2F984->U+440B, U+2F985->U+813E, \
U+2F986->U+5AB5, U+2F987->U+267A7, U+2F988->U+267B5, U+2F989->U+23393, U+2F98A->U+2339C, \
U+2F98B->U+8201, U+2F98C->U+8204, U+2F98D->U+8F9E, U+2F98E->U+446B, U+2F98F->U+8291, \
U+2F990->U+828B, U+2F991->U+829D, U+2F992->U+52B3, U+2F993->U+82B1, U+2F994->U+82B3, \
U+2F995->U+82BD, U+2F996->U+82E6, U+2F997->U+26B3C, U+2F998->U+82E5, U+2F999->U+831D, \
U+2F99A->U+8363, U+2F99B->U+83AD, U+2F99C->U+8323, U+2F99D->U+83BD, U+2F99E->U+83E7, \
U+2F99F->U+8457, U+2F9A0->U+8353, U+2F9A1->U+83CA, U+2F9A2->U+83CC, U+2F9A3->U+83DC, \
U+2F9A4->U+26C36, U+2F9A5->U+26D6B, U+2F9A6->U+26CD5, U+2F9A7->U+452B, U+2F9A8->U+84F1, \
U+2F9A9->U+84F3, U+2F9AA->U+8516, U+2F9AB->U+273CA, U+2F9AC->U+8564, U+2F9AD->U+26F2C, \
U+2F9AE->U+455D, U+2F9AF->U+4561, U+2F9B0->U+26FB1, U+2F9B1->U+270D2, U+2F9B2->U+456B, \
U+2F9B3->U+8650, U+2F9B4->U+865C, U+2F9B5->U+8667, U+2F9B6->U+8669, U+2F9B7->U+86A9, \
U+2F9B8->U+8688, U+2F9B9->U+870E, U+2F9BA->U+86E2, U+2F9BB->U+8779, U+2F9BC->U+8728, \
U+2F9BD->U+876B, U+2F9BE->U+8786, U+2F9BF->U+45D7, U+2F9C0->U+87E1, U+2F9C1->U+8801, \
U+2F9C2->U+45F9, U+2F9C3->U+8860, U+2F9C4->U+8863, U+2F9C5->U+27667, U+2F9C6->U+88D7, \
U+2F9C7->U+88DE, U+2F9C8->U+4635, U+2F9C9->U+88FA, U+2F9CA->U+34BB, U+2F9CB->U+278AE, \
U+2F9CC->U+27966, U+2F9CD->U+46BE, U+2F9CE->U+46C7, U+2F9CF->U+8AA0, U+2F9D0->U+8AED, \
U+2F9D1->U+8B8A, U+2F9D2->U+8C55, U+2F9D3->U+27CA8, U+2F9D4->U+8CAB, U+2F9D5->U+8CC1, \
U+2F9D6->U+8D1B, U+2F9D7->U+8D77, U+2F9D8->U+27F2F, U+2F9D9->U+20804, U+2F9DA->U+8DCB, \
U+2F9DB->U+8DBC, U+2F9DC->U+8DF0, U+2F9DD->U+208DE, U+2F9DE->U+8ED4, U+2F9DF->U+8F38, \
U+2F9E0->U+285D2, U+2F9E1->U+285ED, U+2F9E2->U+9094, U+2F9E3->U+90F1, U+2F9E4->U+9111, \
U+2F9E5->U+2872E, U+2F9E6->U+911B, U+2F9E7->U+9238, U+2F9E8->U+92D7, U+2F9E9->U+92D8, \
U+2F9EA->U+927C, U+2F9EB->U+93F9, U+2F9EC->U+9415, U+2F9ED->U+28BFA, U+2F9EE->U+958B, \
U+2F9EF->U+4995, U+2F9F0->U+95B7, U+2F9F1->U+28D77, U+2F9F2->U+49E6, U+2F9F3->U+96C3, \
U+2F9F4->U+5DB2, U+2F9F5->U+9723, U+2F9F6->U+29145, U+2F9F7->U+2921A, U+2F9F8->U+4A6E, \
U+2F9F9->U+4A76, U+2F9FA->U+97E0, U+2F9FB->U+2940A, U+2F9FC->U+4AB2, U+2F9FD->U+29496, \
U+2F9FE->U+980B, U+2F9FF->U+980B, U+2FA00->U+9829, U+2FA01->U+295B6, U+2FA02->U+98E2, \
U+2FA03->U+4B33, U+2FA04->U+9929, U+2FA05->U+99A7, U+2FA06->U+99C2, U+2FA07->U+99FE, \
U+2FA08->U+4BCE, U+2FA09->U+29B30, U+2FA0A->U+9B12, U+2FA0B->U+9C40, U+2FA0C->U+9CFD, \
U+2FA0D->U+4CCE, U+2FA0E->U+4CED, U+2FA0F->U+9D67, U+2FA10->U+2A0CE, U+2FA11->U+4CF8, \
U+2FA12->U+2A105, U+2FA13->U+2A20E, U+2FA14->U+2A291, U+2FA15->U+9EBB, U+2FA16->U+4D56, \
U+2FA17->U+9EF9, U+2FA18->U+9EFE, U+2FA19->U+9F05, U+2FA1A->U+9F0F, U+2FA1B->U+9F16, \
U+2FA1C->U+9F3B, U+2FA1D->U+2A600, U+2F00->U+4E00, U+2F01->U+4E28, U+2F02->U+4E36, \
U+2F03->U+4E3F, U+2F04->U+4E59, U+2F05->U+4E85, U+2F06->U+4E8C, U+2F07->U+4EA0, \
U+2F08->U+4EBA, U+2F09->U+513F, U+2F0A->U+5165, U+2F0B->U+516B, U+2F0C->U+5182, \
U+2F0D->U+5196, U+2F0E->U+51AB, U+2F0F->U+51E0, U+2F10->U+51F5, U+2F11->U+5200, \
U+2F12->U+529B, U+2F13->U+52F9, U+2F14->U+5315, U+2F15->U+531A, U+2F16->U+5338, \
U+2F17->U+5341, U+2F18->U+535C, U+2F19->U+5369, U+2F1A->U+5382, U+2F1B->U+53B6, \
U+2F1C->U+53C8, U+2F1D->U+53E3, U+2F1E->U+56D7, U+2F1F->U+571F, U+2F20->U+58EB, \
U+2F21->U+5902, U+2F22->U+590A, U+2F23->U+5915, U+2F24->U+5927, U+2F25->U+5973, \
U+2F26->U+5B50, U+2F27->U+5B80, U+2F28->U+5BF8, U+2F29->U+5C0F, U+2F2A->U+5C22, \
U+2F2B->U+5C38, U+2F2C->U+5C6E, U+2F2D->U+5C71, U+2F2E->U+5DDB, U+2F2F->U+5DE5, \
U+2F30->U+5DF1, U+2F31->U+5DFE, U+2F32->U+5E72, U+2F33->U+5E7A, U+2F34->U+5E7F, \
U+2F35->U+5EF4, U+2F36->U+5EFE, U+2F37->U+5F0B, U+2F38->U+5F13, U+2F39->U+5F50, \
U+2F3A->U+5F61, U+2F3B->U+5F73, U+2F3C->U+5FC3, U+2F3D->U+6208, U+2F3E->U+6236, \
U+2F3F->U+624B, U+2F40->U+652F, U+2F41->U+6534, U+2F42->U+6587, U+2F43->U+6597, \
U+2F44->U+65A4, U+2F45->U+65B9, U+2F46->U+65E0, U+2F47->U+65E5, U+2F48->U+66F0, \
U+2F49->U+6708, U+2F4A->U+6728, U+2F4B->U+6B20, U+2F4C->U+6B62, U+2F4D->U+6B79, \
U+2F4E->U+6BB3, U+2F4F->U+6BCB, U+2F50->U+6BD4, U+2F51->U+6BDB, U+2F52->U+6C0F, \
U+2F53->U+6C14, U+2F54->U+6C34, U+2F55->U+706B, U+2F56->U+722A, U+2F57->U+7236, \
U+2F58->U+723B, U+2F59->U+723F, U+2F5A->U+7247, U+2F5B->U+7259, U+2F5C->U+725B, \
U+2F5D->U+72AC, U+2F5E->U+7384, U+2F5F->U+7389, U+2F60->U+74DC, U+2F61->U+74E6, \
U+2F62->U+7518, U+2F63->U+751F, U+2F64->U+7528, U+2F65->U+7530, U+2F66->U+758B, \
U+2F67->U+7592, U+2F68->U+7676, U+2F69->U+767D, U+2F6A->U+76AE, U+2F6B->U+76BF, \
U+2F6C->U+76EE, U+2F6D->U+77DB, U+2F6E->U+77E2, U+2F6F->U+77F3, U+2F70->U+793A, \
U+2F71->U+79B8, U+2F72->U+79BE, U+2F73->U+7A74, U+2F74->U+7ACB, U+2F75->U+7AF9, \
U+2F76->U+7C73, U+2F77->U+7CF8, U+2F78->U+7F36, U+2F79->U+7F51, U+2F7A->U+7F8A, \
U+2F7B->U+7FBD, U+2F7C->U+8001, U+2F7D->U+800C, U+2F7E->U+8012, U+2F7F->U+8033, \
U+2F80->U+807F, U+2F81->U+8089, U+2F82->U+81E3, U+2F83->U+81EA, U+2F84->U+81F3, \
U+2F85->U+81FC, U+2F86->U+820C, U+2F87->U+821B, U+2F88->U+821F, U+2F89->U+826E, \
U+2F8A->U+8272, U+2F8B->U+8278, U+2F8C->U+864D, U+2F8D->U+866B, U+2F8E->U+8840, \
U+2F8F->U+884C, U+2F90->U+8863, U+2F91->U+897E, U+2F92->U+898B, U+2F93->U+89D2, \
U+2F94->U+8A00, U+2F95->U+8C37, U+2F96->U+8C46, U+2F97->U+8C55, U+2F98->U+8C78, \
U+2F99->U+8C9D, U+2F9A->U+8D64, U+2F9B->U+8D70, U+2F9C->U+8DB3, U+2F9D->U+8EAB, \
U+2F9E->U+8ECA, U+2F9F->U+8F9B, U+2FA0->U+8FB0, U+2FA1->U+8FB5, U+2FA2->U+9091, \
U+2FA3->U+9149, U+2FA4->U+91C6, U+2FA5->U+91CC, U+2FA6->U+91D1, U+2FA7->U+9577, \
U+2FA8->U+9580, U+2FA9->U+961C, U+2FAA->U+96B6, U+2FAB->U+96B9, U+2FAC->U+96E8, \
U+2FAD->U+9751, U+2FAE->U+975E, U+2FAF->U+9762, U+2FB0->U+9769, U+2FB1->U+97CB, \
U+2FB2->U+97ED, U+2FB3->U+97F3, U+2FB4->U+9801, U+2FB5->U+98A8, U+2FB6->U+98DB, \
U+2FB7->U+98DF, U+2FB8->U+9996, U+2FB9->U+9999, U+2FBA->U+99AC, U+2FBB->U+9AA8, \
U+2FBC->U+9AD8, U+2FBD->U+9ADF, U+2FBE->U+9B25, U+2FBF->U+9B2F, U+2FC0->U+9B32, \
U+2FC1->U+9B3C, U+2FC2->U+9B5A, U+2FC3->U+9CE5, U+2FC4->U+9E75, U+2FC5->U+9E7F, \
U+2FC6->U+9EA5, U+2FC7->U+9EBB, U+2FC8->U+9EC3, U+2FC9->U+9ECD, U+2FCA->U+9ED1, \
U+2FCB->U+9EF9, U+2FCC->U+9EFD, U+2FCD->U+9F0E, U+2FCE->U+9F13, U+2FCF->U+9F20, \
U+2FD0->U+9F3B, U+2FD1->U+9F4A, U+2FD2->U+9F52, U+2FD3->U+9F8D, U+2FD4->U+9F9C, \
U+2FD5->U+9FA0, U+3042->U+3041, U+3044->U+3043, U+3046->U+3045, U+3048->U+3047, \
U+304A->U+3049, U+304C->U+304B, U+304E->U+304D, U+3050->U+304F, U+3052->U+3051, \
U+3054->U+3053, U+3056->U+3055, U+3058->U+3057, U+305A->U+3059, U+305C->U+305B, \
U+305E->U+305D, U+3060->U+305F, U+3062->U+3061, U+3064->U+3063, U+3065->U+3063, \
U+3067->U+3066, U+3069->U+3068, U+3070->U+306F, U+3071->U+306F, U+3073->U+3072, \
U+3074->U+3072, U+3076->U+3075, U+3077->U+3075, U+3079->U+3078, U+307A->U+3078, \
U+307C->U+307B, U+307D->U+307B, U+3084->U+3083, U+3086->U+3085, U+3088->U+3087, \
U+308F->U+308E, U+3094->U+3046, U+3095->U+304B, U+3096->U+3051, U+30A2->U+30A1, \
U+30A4->U+30A3, U+30A6->U+30A5, U+30A8->U+30A7, U+30AA->U+30A9, U+30AC->U+30AB, \
U+30AE->U+30AD, U+30B0->U+30AF, U+30B2->U+30B1, U+30B4->U+30B3, U+30B6->U+30B5, \
U+30B8->U+30B7, U+30BA->U+30B9, U+30BC->U+30BB, U+30BE->U+30BD, U+30C0->U+30BF, \
U+30C2->U+30C1, U+30C5->U+30C4, U+30C7->U+30C6, U+30C9->U+30C8, U+30D0->U+30CF, \
U+30D1->U+30CF, U+30D3->U+30D2, U+30D4->U+30D2, U+30D6->U+30D5, U+30D7->U+30D5, \
U+30D9->U+30D8, U+30DA->U+30D8, U+30DC->U+30DB, U+30DD->U+30DB, U+30E4->U+30E3, \
U+30E6->U+30E5, U+30E8->U+30E7, U+30EF->U+30EE, U+30F4->U+30A6, U+30AB->U+30F5, \
U+30B1->U+30F6, U+30F7->U+30EF, U+30F8->U+30F0, U+30F9->U+30F1, U+30FA->U+30F2, \
U+30AF->U+31F0, U+30B7->U+31F1, U+30B9->U+31F2, U+30C8->U+31F3, U+30CC->U+31F4, \
U+30CF->U+31F5, U+30D2->U+31F6, U+30D5->U+31F7, U+30D8->U+31F8, U+30DB->U+31F9, \
U+30E0->U+31FA, U+30E9->U+31FB, U+30EA->U+31FC, U+30EB->U+31FD, U+30EC->U+31FE, \
U+30ED->U+31FF, U+FF66->U+30F2, U+FF67->U+30A1, U+FF68->U+30A3, U+FF69->U+30A5, \
U+FF6A->U+30A7, U+FF6B->U+30A9, U+FF6C->U+30E3, U+FF6D->U+30E5, U+FF6E->U+30E7, \
U+FF6F->U+30C3, U+FF71->U+30A1, U+FF72->U+30A3, U+FF73->U+30A5, U+FF74->U+30A7, \
U+FF75->U+30A9, U+FF76->U+30AB, U+FF77->U+30AD, U+FF78->U+30AF, U+FF79->U+30B1, \
U+FF7A->U+30B3, U+FF7B->U+30B5, U+FF7C->U+30B7, U+FF7D->U+30B9, U+FF7E->U+30BB, \
U+FF7F->U+30BD, U+FF80->U+30BF, U+FF81->U+30C1, U+FF82->U+30C3, U+FF83->U+30C6, \
U+FF84->U+30C8, U+FF85->U+30CA, U+FF86->U+30CB, U+FF87->U+30CC, U+FF88->U+30CD, \
U+FF89->U+30CE, U+FF8A->U+30CF, U+FF8B->U+30D2, U+FF8C->U+30D5, U+FF8D->U+30D8, \
U+FF8E->U+30DB, U+FF8F->U+30DE, U+FF90->U+30DF, U+FF91->U+30E0, U+FF92->U+30E1, \
U+FF93->U+30E2, U+FF94->U+30E3, U+FF95->U+30E5, U+FF96->U+30E7, U+FF97->U+30E9, \
U+FF98->U+30EA, U+FF99->U+30EB, U+FF9A->U+30EC, U+FF9B->U+30ED, U+FF9C->U+30EF, \
U+FF9D->U+30F3, U+FFA0->U+3164, U+FFA1->U+3131, U+FFA2->U+3132, U+FFA3->U+3133, \
U+FFA4->U+3134, U+FFA5->U+3135, U+FFA6->U+3136, U+FFA7->U+3137, U+FFA8->U+3138, \
U+FFA9->U+3139, U+FFAA->U+313A, U+FFAB->U+313B, U+FFAC->U+313C, U+FFAD->U+313D, \
U+FFAE->U+313E, U+FFAF->U+313F, U+FFB0->U+3140, U+FFB1->U+3141, U+FFB2->U+3142, \
U+FFB3->U+3143, U+FFB4->U+3144, U+FFB5->U+3145, U+FFB6->U+3146, U+FFB7->U+3147, \
U+FFB8->U+3148, U+FFB9->U+3149, U+FFBA->U+314A, U+FFBB->U+314B, U+FFBC->U+314C, \
U+FFBD->U+314D, U+FFBE->U+314E, U+FFC2->U+314F, U+FFC3->U+3150, U+FFC4->U+3151, \
U+FFC5->U+3152, U+FFC6->U+3153, U+FFC7->U+3154, U+FFCA->U+3155, U+FFCB->U+3156, \
U+FFCC->U+3157, U+FFCD->U+3158, U+FFCE->U+3159, U+FFCF->U+315A, U+FFD2->U+315B, \
U+FFD3->U+315C, U+FFD4->U+315D, U+FFD5->U+315E, U+FFD6->U+315F, U+FFD7->U+3160, \
U+FFDA->U+3161, U+FFDB->U+3162, U+FFDC->U+3163, U+3131->U+1100, U+3132->U+1101, \
U+3133->U+11AA, U+3134->U+1102, U+3135->U+11AC, U+3136->U+11AD, U+3137->U+1103, \
U+3138->U+1104, U+3139->U+1105, U+313A->U+11B0, U+313B->U+11B1, U+313C->U+11B2, \
U+313D->U+11B3, U+313E->U+11B4, U+313F->U+11B5, U+3140->U+111A, U+3141->U+1106, \
U+3142->U+1107, U+3143->U+1108, U+3144->U+1121, U+3145->U+1109, U+3146->U+110A, \
U+3147->U+110B, U+3148->U+110C, U+3149->U+110D, U+314A->U+110E, U+314B->U+110F, \
U+314C->U+1110, U+314D->U+1111, U+314E->U+1112, U+314F->U+1161, U+3150->U+1162, \
U+3151->U+1163, U+3152->U+1164, U+3153->U+1165, U+3154->U+1166, U+3155->U+1167, \
U+3156->U+1168, U+3157->U+1169, U+3158->U+116A, U+3159->U+116B, U+315A->U+116C, \
U+315B->U+116D, U+315C->U+116E, U+315D->U+116F, U+315E->U+1170, U+315F->U+1171, \
U+3160->U+1172, U+3161->U+1173, U+3162->U+1174, U+3163->U+1175, U+3165->U+1114, \
U+3166->U+1115, U+3167->U+11C7, U+3168->U+11C8, U+3169->U+11CC, U+316A->U+11CE, \
U+316B->U+11D3, U+316C->U+11D7, U+316D->U+11D9, U+316E->U+111C, U+316F->U+11DD, \
U+3170->U+11DF, U+3171->U+111D, U+3172->U+111E, U+3173->U+1120, U+3174->U+1122, \
U+3175->U+1123, U+3176->U+1127, U+3177->U+1129, U+3178->U+112B, U+3179->U+112C, \
U+317A->U+112D, U+317B->U+112E, U+317C->U+112F, U+317D->U+1132, U+317E->U+1136, \
U+317F->U+1140, U+3180->U+1147, U+3181->U+114C, U+3182->U+11F1, U+3183->U+11F2, \
U+3184->U+1157, U+3185->U+1158, U+3186->U+1159, U+3187->U+1184, U+3188->U+1185, \
U+3189->U+1188, U+318A->U+1191, U+318B->U+1192, U+318C->U+1194, U+318D->U+119E, \
U+318E->U+11A1, U+A490->U+A408, U+A491->U+A1B9, U+4E00..U+9FBB, U+3400..U+4DB5, \
U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, \
U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C, U+31A0..U+31B7, U+3041, U+3043, \
U+3045, U+3047, U+3049, U+304B, U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, \
U+3059, U+305B, U+305D, U+305F, U+3061, U+3063, U+3066, U+3068, U+306A..U+306F, \
U+3072, U+3075, U+3078, U+307B, U+307E..U+3083, U+3085, U+3087, U+3089..U+308E, \
U+3090..U+3093, U+30A1, U+30A3, U+30A5, U+30A7, U+30A9, U+30AD, U+30AF, U+30B3, \
U+30B5, U+30BB, U+30BD, U+30BF, U+30C1, U+30C3, U+30C4, U+30C6, U+30CA, U+30CB, \
U+30CD, U+30CE, U+30DE, U+30DF, U+30E1, U+30E2, U+30E3, U+30E5, U+30E7, U+30EE, \
U+30F0..U+30F3, U+30F5, U+30F6, U+31F0, U+31F1, U+31F2, U+31F3, U+31F4, U+31F5, \
U+31F6, U+31F7, U+31F8, U+31F9, U+31FA, U+31FB, U+31FC, U+31FD, U+31FE, U+31FF, \
U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9, U+A000..U+A48C, \
U+A492..U+A4C6
}

indexer
{
    mem_limit = 256M
}

searchd
{
    port = 3312
    log = /var/log/searchd.log
    query_log = /var/log/query.log
    read_timeout = 5
    max_children = 30
    pid_file = /var/log/searchd.pid
    max_matches = 1000
    seamless_rotate = 1
    preopen_indexes = 0
    unlink_old = 1
}

[sphinxapi.php]
<?php

//
// $Id: sphinxapi.php 1418 2008-08-28 15:30:05Z shodan $
//

//
// Copyright (c) 2001-2008, Andrew Aksyonoff. All rights reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License. You should have
// received a copy of the GPL license along with this program; if you
// did not, you can find it at http://www.gnu.org/
//

/////////////////////////////////////////////////////////////////////////////
// PHP version of Sphinx searchd client (PHP API)
/////////////////////////////////////////////////////////////////////////////

/// known searchd commands
define ( "SEARCHD_COMMAND_SEARCH",     0 );
define ( "SEARCHD_COMMAND_EXCERPT",     1 );
define ( "SEARCHD_COMMAND_UPDATE",     2 );
define ( "SEARCHD_COMMAND_KEYWORDS",3 );

/// current client-side command implementation versions
define ( "VER_COMMAND_SEARCH",         0x113 );
define ( "VER_COMMAND_EXCERPT",         0x100 );
define ( "VER_COMMAND_UPDATE",         0x101 );
define ( "VER_COMMAND_KEYWORDS",     0x100 );

/// known searchd status codes
define ( "SEARCHD_OK",                 0 );
define ( "SEARCHD_ERROR",             1 );
define ( "SEARCHD_RETRY",             2 );
define ( "SEARCHD_WARNING",             3 );

/// known match modes
define ( "SPH_MATCH_ALL",             0 );
define ( "SPH_MATCH_ANY",             1 );
define ( "SPH_MATCH_PHRASE",         2 );
define ( "SPH_MATCH_BOOLEAN",         3 );
define ( "SPH_MATCH_EXTENDED",         4 );
define ( "SPH_MATCH_FULLSCAN",         5 );
define ( "SPH_MATCH_EXTENDED2",         6 );     // extended engine V2 (TEMPORARY, WILL BE REMOVED)

/// known ranking modes (ext2 only)
define ( "SPH_RANK_PROXIMITY_BM25",     0 );     ///< default mode, phrase proximity major factor and BM25 minor one
define ( "SPH_RANK_BM25",             1 );     ///< statistical mode, BM25 ranking only (faster but worse quality)
define ( "SPH_RANK_NONE",             2 );     ///< no ranking, all matches get a weight of 1
define ( "SPH_RANK_WORDCOUNT",         3 );     ///< simple word-count weighting, rank is a weighted sum of per-field keyword occurence counts

/// known sort modes
define ( "SPH_SORT_RELEVANCE",         0 );
define ( "SPH_SORT_ATTR_DESC",         1 );
define ( "SPH_SORT_ATTR_ASC",         2 );
define ( "SPH_SORT_TIME_SEGMENTS",     3 );
define ( "SPH_SORT_EXTENDED",         4 );
define ( "SPH_SORT_EXPR",             5 );

/// known filter types
define ( "SPH_FILTER_VALUES",         0 );
define ( "SPH_FILTER_RANGE",         1 );
define ( "SPH_FILTER_FLOATRANGE",     2 );

/// known attribute types
define ( "SPH_ATTR_INTEGER",         1 );
define ( "SPH_ATTR_TIMESTAMP",         2 );
define ( "SPH_ATTR_ORDINAL",         3 );
define ( "SPH_ATTR_BOOL",             4 );
define ( "SPH_ATTR_FLOAT",             5 );
define ( "SPH_ATTR_MULTI",             0x40000000 );

/// known grouping functions
define ( "SPH_GROUPBY_DAY",             0 );
define ( "SPH_GROUPBY_WEEK",         1 );
define ( "SPH_GROUPBY_MONTH",         2 );
define ( "SPH_GROUPBY_YEAR",         3 );
define ( "SPH_GROUPBY_ATTR",         4 );
define ( "SPH_GROUPBY_ATTRPAIR",     5 );


/// portably pack numeric to 64 unsigned bits, network order
function sphPack64 ( $v )
{
    assert ( is_numeric($v) );

    // x64 route
    if ( PHP_INT_SIZE>=8 )
    {
        $i = (int)$v;
        return pack ( "NN", $i>>32, $i&((1<<32)-1) );
    }

    // x32 route, bcmath
    $x = "4294967296";
    if ( function_exists("bcmul") )
    {
        $h = bcdiv ( $v, $x, 0 );
        $l = bcmod ( $v, $x );
        return pack ( "NN", (float)$h, (float)$l ); // conversion to float is intentional; int would lose 31st bit
    }

    // x32 route, 15 or less decimal digits
    // we can use float, because its actually double and has 52 precision bits
    if ( strlen($v)<=15 )
    {
        $f = (float)$v;
        $h = (int)($f/$x);
        $l = (int)($f-$x*$h);
        return pack ( "NN", $h, $l );
    }

    // x32 route, 16 or more decimal digits
    // well, let me know if you *really* need this
    die ( "INTERNAL ERROR: packing more than 15-digit numeric on 32-bit PHP is not implemented yet (contact support)" );
}


/// portably unpack 64 unsigned bits, network order to numeric
function sphUnpack64 ( $v )
{
    list($h,$l) = array_values ( unpack ( "N*N*", $v ) );

    // x64 route
    if ( PHP_INT_SIZE>=8 )
    {
        if ( $h<0 ) $h += (1<<32); // because php 5.2.2 to 5.2.5 is totally fucked up again
        if ( $l<0 ) $l += (1<<32);
        return ($h<<32) + $l;
    }

    // x32 route
    $h = sprintf ( "%u", $h );
    $l = sprintf ( "%u", $l );
    $x = "4294967296";

    // bcmath
    if ( function_exists("bcmul") )
        return bcadd ( $l, bcmul ( $x, $h ) );

    // no bcmath, 15 or less decimal digits
    // we can use float, because its actually double and has 52 precision bits
    if ( $h<1048576 )
    {
        $f = ((float)$h)*$x + (float)$l;
        return sprintf ( "%.0f", $f ); // builtin conversion is only about 39-40 bits precise!
    }

    // x32 route, 16 or more decimal digits
    // well, let me know if you *really* need this
    die ( "INTERNAL ERROR: unpacking more than 15-digit numeric on 32-bit PHP is not implemented yet (contact support)" );
}


/// sphinx searchd client class
class SphinxClient
{
    var $_host;             ///< searchd host (default is "localhost")
    var $_port;             ///< searchd port (default is 3312)
    var $_offset;         ///< how many records to seek from result-set start (default is 0)
    var $_limit;         ///< how many records to return from result-set starting at offset (default is 20)
    var $_mode;             ///< query matching mode (default is SPH_MATCH_ALL)
    var $_weights;         ///< per-field weights (default is 1 for all fields)
    var $_sort;             ///< match sorting mode (default is SPH_SORT_RELEVANCE)
    var $_sortby;         ///< attribute to sort by (defualt is "")
    var $_min_id;         ///< min ID to match (default is 0, which means no limit)
    var $_max_id;         ///< max ID to match (default is 0, which means no limit)
    var $_filters;         ///< search filters
    var $_groupby;         ///< group-by attribute name
    var $_groupfunc;     ///< group-by function (to pre-process group-by attribute value with)
    var $_groupsort;     ///< group-by sorting clause (to sort groups in result set with)
    var $_groupdistinct;///< group-by count-distinct attribute
    var $_maxmatches;     ///< max matches to retrieve
    var $_cutoff;         ///< cutoff to stop searching at (default is 0)
    var $_retrycount;     ///< distributed retries count
    var $_retrydelay;     ///< distributed retries delay
    var $_anchor;         ///< geographical anchor point
    var $_indexweights;     ///< per-index weights
    var $_ranker;         ///< ranking mode (default is SPH_RANK_PROXIMITY_BM25)
    var $_maxquerytime;     ///< max query time, milliseconds (default is 0, do not limit)
    var $_fieldweights;     ///< per-field-name weights

    var $_error;         ///< last error message
    var $_warning;         ///< last warning message

    var $_reqs;             ///< requests array for multi-query
    var $_mbenc;         ///< stored mbstring encoding
    var $_arrayresult;     ///< whether $result["matches"] should be a hash or an array
    var $_timeout;         ///< connect timeout

    /////////////////////////////////////////////////////////////////////////////
    // common stuff
    /////////////////////////////////////////////////////////////////////////////

    /// create a new client object and fill defaults
    function SphinxClient ()
    {
        // per-client-object settings
        $this->_host         = "localhost";
        $this->_port         = 3312;

        // per-query settings
        $this->_offset         = 0;
        $this->_limit         = 20;
        $this->_mode         = SPH_MATCH_ALL;
        $this->_weights         = array ();
        $this->_sort         = SPH_SORT_RELEVANCE;
        $this->_sortby         = "";
        $this->_min_id         = 0;
        $this->_max_id         = 0;
        $this->_filters         = array ();
        $this->_groupby         = "";
        $this->_groupfunc     = SPH_GROUPBY_DAY;
        $this->_groupsort     = "@group desc";
        $this->_groupdistinct= "";
        $this->_maxmatches     = 1000;
        $this->_cutoff         = 0;
        $this->_retrycount     = 0;
        $this->_retrydelay     = 0;
        $this->_anchor         = array ();
        $this->_indexweights= array ();
        $this->_ranker         = SPH_RANK_PROXIMITY_BM25;
        $this->_maxquerytime= 0;
        $this->_fieldweights= array();

        $this->_error         = ""; // per-reply fields (for single-query case)
        $this->_warning         = "";
        $this->_reqs         = array ();     // requests storage (for multi-query case)
        $this->_mbenc         = "";
        $this->_arrayresult     = false;
        $this->_timeout         = 0;
    }

    /// get last error message (string)
    function GetLastError ()
    {
        return $this->_error;
    }

    /// get last warning message (string)
    function GetLastWarning ()
    {
        return $this->_warning;
    }

    /// set searchd host name (string) and port (integer)
    function SetServer ( $host, $port )
    {
        assert ( is_string($host) );
        assert ( is_int($port) );
        $this->_host = $host;
        $this->_port = $port;
    }

    /// set server connection timeout (0 to remove)
    function SetConnectTimeout ( $timeout )
    {
        assert ( is_numeric($timeout) );
        $this->_timeout = $timeout;
    }

    /////////////////////////////////////////////////////////////////////////////

    /// enter mbstring workaround mode
    function _MBPush ()
    {
        $this->_mbenc = "";
        if ( ini_get ( "mbstring.func_overload" ) & 2 )
        {
            $this->_mbenc = mb_internal_encoding();
            mb_internal_encoding ( "latin1" );
        }
}

    /// leave mbstring workaround mode
    function _MBPop ()
    {
        if ( $this->_mbenc )
            mb_internal_encoding ( $this->_mbenc );
    }

    /// connect to searchd server
    function _Connect ()
    {
        $errno = 0;
        $errstr = "";
        if ( $this->_timeout<=0 )
            $fp = @fsockopen ( $this->_host, $this->_port, $errno, $errstr );
        else
            $fp = @fsockopen ( $this->_host, $this->_port, $errno, $errstr, $this->_timeout );

        if ( !$fp )
        {
            $errstr = trim ( $errstr );
            $this->_error = "connection to {$this->_host}:{$this->_port} failed (errno=$errno, msg=$errstr)";
            return false;
        }

        // check version
        list(,$v) = unpack ( "N*", fread ( $fp, 4 ) );
        $v = (int)$v;
        if ( $v<1 )
        {
            fclose ( $fp );
            $this->_error = "expected searchd protocol version 1+, got version '$v'";
            return false;
        }

        // all ok, send my version
        fwrite ( $fp, pack ( "N", 1 ) );
        return $fp;
    }

    /// get and check response packet from searchd server
    function _GetResponse ( $fp, $client_ver )
    {
        $response = "";
        $len = 0;

        $header = fread ( $fp, 8 );
        if ( strlen($header)==8 )
        {
            list ( $status, $ver, $len ) = array_values ( unpack ( "n2a/Nb", $header ) );
            $left = $len;
            while ( $left>0 && !feof($fp) )
            {
                $chunk = fread ( $fp, $left );
                if ( $chunk )
                {
                    $response .= $chunk;
                    $left -= strlen($chunk);
                }
            }
        }
        fclose ( $fp );

        // check response
        $read = strlen ( $response );
        if ( !$response || $read!=$len )
        {
            $this->_error = $len
                ? "failed to read searchd response (status=$status, ver=$ver, len=$len, read=$read)"
                : "received zero-sized searchd response";
            return false;
        }

        // check status
        if ( $status==SEARCHD_WARNING )
        {
            list(,$wlen) = unpack ( "N*", substr ( $response, 0, 4 ) );
            $this->_warning = substr ( $response, 4, $wlen );
            return substr ( $response, 4+$wlen );
        }
        if ( $status==SEARCHD_ERROR )
        {
            $this->_error = "searchd error: " . substr ( $response, 4 );
            return false;
        }
        if ( $status==SEARCHD_RETRY )
        {
            $this->_error = "temporary searchd error: " . substr ( $response, 4 );
            return false;
        }
        if ( $status!=SEARCHD_OK )
        {
            $this->_error = "unknown status code '$status'";
            return false;
        }

        // check version
        if ( $ver<$client_ver )
        {
            $this->_warning = sprintf ( "searchd command v.%d.%d older than client's v.%d.%d, some options might not work",
                $ver>>8, $ver&0xff, $client_ver>>8, $client_ver&0xff );
        }

        return $response;
    }

    /////////////////////////////////////////////////////////////////////////////
    // searching
    /////////////////////////////////////////////////////////////////////////////

    /// set offset and count into result set,
    /// and optionally set max-matches and cutoff limits
    function SetLimits ( $offset, $limit, $max=0, $cutoff=0 )
    {
        assert ( is_int($offset) );
        assert ( is_int($limit) );
        assert ( $offset>=0 );
        assert ( $limit>0 );
        assert ( $max>=0 );
        $this->_offset = $offset;
        $this->_limit = $limit;
        if ( $max>0 )
            $this->_maxmatches = $max;
        if ( $cutoff>0 )
            $this->_cutoff = $cutoff;
    }

    /// set maximum query time, in milliseconds, per-index
    /// integer, 0 means "do not limit"
    function SetMaxQueryTime ( $max )
    {
        assert ( is_int($max) );
        assert ( $max>=0 );
        $this->_maxquerytime = $max;
    }

    /// set matching mode
    function SetMatchMode ( $mode )
    {
        assert ( $mode==SPH_MATCH_ALL
            || $mode==SPH_MATCH_ANY
            || $mode==SPH_MATCH_PHRASE
            || $mode==SPH_MATCH_BOOLEAN
            || $mode==SPH_MATCH_EXTENDED
            || $mode==SPH_MATCH_FULLSCAN
            || $mode==SPH_MATCH_EXTENDED2 );
        $this->_mode = $mode;
    }

    /// set ranking mode
    function SetRankingMode ( $ranker )
    {
        assert ( $ranker==SPH_RANK_PROXIMITY_BM25
            || $ranker==SPH_RANK_BM25
            || $ranker==SPH_RANK_NONE
            || $ranker==SPH_RANK_WORDCOUNT );
        $this->_ranker = $ranker;
    }

    /// set matches sorting mode
    function SetSortMode ( $mode, $sortby="" )
    {
        assert (
            $mode==SPH_SORT_RELEVANCE ||
            $mode==SPH_SORT_ATTR_DESC ||
            $mode==SPH_SORT_ATTR_ASC ||
            $mode==SPH_SORT_TIME_SEGMENTS ||
            $mode==SPH_SORT_EXTENDED ||
            $mode==SPH_SORT_EXPR );
        assert ( is_string($sortby) );
        assert ( $mode==SPH_SORT_RELEVANCE || strlen($sortby)>0 );

        $this->_sort = $mode;
        $this->_sortby = $sortby;
    }

    /// bind per-field weights by order
    /// DEPRECATED; use SetFieldWeights() instead
    function SetWeights ( $weights )
    {
        assert ( is_array($weights) );
        foreach ( $weights as $weight )
            assert ( is_int($weight) );

        $this->_weights = $weights;
    }

    /// bind per-field weights by name
    function SetFieldWeights ( $weights )
    {
        assert ( is_array($weights) );
        foreach ( $weights as $name=>$weight )
        {
            assert ( is_string($name) );
            assert ( is_int($weight) );
        }
        $this->_fieldweights = $weights;
    }

    /// bind per-index weights by name
    function SetIndexWeights ( $weights )
    {
        assert ( is_array($weights) );
        foreach ( $weights as $index=>$weight )
        {
            assert ( is_string($index) );
            assert ( is_int($weight) );
        }
        $this->_indexweights = $weights;
    }

    /// set IDs range to match
    /// only match records if document ID is beetwen $min and $max (inclusive)
    function SetIDRange ( $min, $max )
    {
        assert ( is_numeric($min) );
        assert ( is_numeric($max) );
        assert ( $min<=$max );
        $this->_min_id = $min;
        $this->_max_id = $max;
    }

    /// set values set filter
    /// only match records where $attribute value is in given set
    function SetFilter ( $attribute, $values, $exclude=false )
    {
        assert ( is_string($attribute) );
        assert ( is_array($values) );
        assert ( count($values) );

        if ( is_array($values) && count($values) )
        {
            foreach ( $values as $value )
                assert ( is_numeric($value) );

            $this->_filters[] = array ( "type"=>SPH_FILTER_VALUES, "attr"=>$attribute, "exclude"=>$exclude, "values"=>$values );
        }
    }

    /// set range filter
    /// only match records if $attribute value is beetwen $min and $max (inclusive)
    function SetFilterRange ( $attribute, $min, $max, $exclude=false )
    {
        assert ( is_string($attribute) );
        assert ( is_int($min) );
        assert ( is_int($max) );
        assert ( $min<=$max );

        $this->_filters[] = array ( "type"=>SPH_FILTER_RANGE, "attr"=>$attribute, "exclude"=>$exclude, "min"=>$min, "max"=>$max );
    }

    /// set float range filter
    /// only match records if $attribute value is beetwen $min and $max (inclusive)
    function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )
    {
        assert ( is_string($attribute) );
        assert ( is_float($min) );
        assert ( is_float($max) );
        assert ( $min<=$max );

        $this->_filters[] = array ( "type"=>SPH_FILTER_FLOATRANGE, "attr"=>$attribute, "exclude"=>$exclude, "min"=>$min, "max"=>$max );
    }

    /// setup anchor point for geosphere distance calculations
    /// required to use @geodist in filters and sorting
    /// latitude and longitude must be in radians
    function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )
    {
        assert ( is_string($attrlat) );
        assert ( is_string($attrlong) );
        assert ( is_float($lat) );
        assert ( is_float($long) );

        $this->_anchor = array ( "attrlat"=>$attrlat, "attrlong"=>$attrlong, "lat"=>$lat, "long"=>$long );
    }

    /// set grouping attribute and function
    function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )
    {
        assert ( is_string($attribute) );
        assert ( is_string($groupsort) );
        assert ( $func==SPH_GROUPBY_DAY
            || $func==SPH_GROUPBY_WEEK
            || $func==SPH_GROUPBY_MONTH
            || $func==SPH_GROUPBY_YEAR
            || $func==SPH_GROUPBY_ATTR
            || $func==SPH_GROUPBY_ATTRPAIR );

        $this->_groupby = $attribute;
        $this->_groupfunc = $func;
        $this->_groupsort = $groupsort;
    }

    /// set count-distinct attribute for group-by queries
    function SetGroupDistinct ( $attribute )
    {
        assert ( is_string($attribute) );
        $this->_groupdistinct = $attribute;
    }

    /// set distributed retries count and delay
    function SetRetries ( $count, $delay=0 )
    {
        assert ( is_int($count) && $count>=0 );
        assert ( is_int($delay) && $delay>=0 );
        $this->_retrycount = $count;
        $this->_retrydelay = $delay;
    }

    /// set result set format (hash or array; hash by default)
    /// PHP specific; needed for group-by-MVA result sets that may contain duplicate IDs
    function SetArrayResult ( $arrayresult )
    {
        assert ( is_bool($arrayresult) );
        $this->_arrayresult = $arrayresult;
    }

    //////////////////////////////////////////////////////////////////////////////

    /// clear all filters (for multi-queries)
    function ResetFilters ()
    {
        $this->_filters = array();
        $this->_anchor = array();
    }

    /// clear groupby settings (for multi-queries)
    function ResetGroupBy ()
    {
        $this->_groupby         = "";
        $this->_groupfunc     = SPH_GROUPBY_DAY;
        $this->_groupsort     = "@group desc";
        $this->_groupdistinct= "";
    }

    //////////////////////////////////////////////////////////////////////////////

    /// connect to searchd server, run given search query through given indexes,
    /// and return the search results
    function Query ( $query, $index="*", $comment="" )
    {
        assert ( empty($this->_reqs) );

        $this->AddQuery ( $query, $index, $comment );
        $results = $this->RunQueries ();
        $this->_reqs = array (); // just in case it failed too early

        if ( !is_array($results) )
            return false; // probably network error; error message should be already filled

        $this->_error = $results[0]["error"];
        $this->_warning = $results[0]["warning"];
        if ( $results[0]["status"]==SEARCHD_ERROR )
            return false;
        else
            return $results[0];
    }

    /// helper to pack floats in network byte order
    function _PackFloat ( $f )
    {
        $t1 = pack ( "f", $f ); // machine order
        list(,$t2) = unpack ( "L*", $t1 ); // int in machine order
        return pack ( "N", $t2 );
    }

    /// add query to multi-query batch
    /// returns index into results array from RunQueries() call
    function AddQuery ( $query, $index="*", $comment="" )
    {
        // mbstring workaround
        $this->_MBPush ();

        // build request
        $req = pack ( "NNNNN", $this->_offset, $this->_limit, $this->_mode, $this->_ranker, $this->_sort ); // mode and limits
        $req .= pack ( "N", strlen($this->_sortby) ) . $this->_sortby;
        $req .= pack ( "N", strlen($query) ) . $query; // query itself
        $req .= pack ( "N", count($this->_weights) ); // weights
        foreach ( $this->_weights as $weight )
            $req .= pack ( "N", (int)$weight );
        $req .= pack ( "N", strlen($index) ) . $index; // indexes
        $req .= pack ( "N", 1 ); // id64 range marker
        $req .= sphPack64 ( $this->_min_id ) . sphPack64 ( $this->_max_id ); // id64 range

        // filters
        $req .= pack ( "N", count($this->_filters) );
        foreach ( $this->_filters as $filter )
        {
            $req .= pack ( "N", strlen($filter["attr"]) ) . $filter["attr"];
            $req .= pack ( "N", $filter["type"] );
            switch ( $filter["type"] )
            {
                case SPH_FILTER_VALUES:
                    $req .= pack ( "N", count($filter["values"]) );
                    foreach ( $filter["values"] as $value )
                        $req .= pack ( "N", floatval($value) ); // this uberhack is to workaround 32bit signed int limit on x32 platforms
                    break;

                case SPH_FILTER_RANGE:
                    $req .= pack ( "NN", $filter["min"], $filter["max"] );
                    break;

                case SPH_FILTER_FLOATRANGE:
                    $req .= $this->_PackFloat ( $filter["min"] ) . $this->_PackFloat ( $filter["max"] );
                    break;

                default:
                    assert ( 0 && "internal error: unhandled filter type" );
            }
            $req .= pack ( "N", $filter["exclude"] );
        }

        // group-by clause, max-matches count, group-sort clause, cutoff count
        $req .= pack ( "NN", $this->_groupfunc, strlen($this->_groupby) ) . $this->_groupby;
        $req .= pack ( "N", $this->_maxmatches );
        $req .= pack ( "N", strlen($this->_groupsort) ) . $this->_groupsort;
        $req .= pack ( "NNN", $this->_cutoff, $this->_retrycount, $this->_retrydelay );
        $req .= pack ( "N", strlen($this->_groupdistinct) ) . $this->_groupdistinct;

        // anchor point
        if ( empty($this->_anchor) )
        {
            $req .= pack ( "N", 0 );
        } else
        {
            $a =& $this->_anchor;
            $req .= pack ( "N", 1 );
            $req .= pack ( "N", strlen($a["attrlat"]) ) . $a["attrlat"];
            $req .= pack ( "N", strlen($a["attrlong"]) ) . $a["attrlong"];
            $req .= $this->_PackFloat ( $a["lat"] ) . $this->_PackFloat ( $a["long"] );
        }

        // per-index weights
        $req .= pack ( "N", count($this->_indexweights) );
        foreach ( $this->_indexweights as $idx=>$weight )
            $req .= pack ( "N", strlen($idx) ) . $idx . pack ( "N", $weight );

        // max query time
        $req .= pack ( "N", $this->_maxquerytime );

        // per-field weights
        $req .= pack ( "N", count($this->_fieldweights) );
        foreach ( $this->_fieldweights as $field=>$weight )
            $req .= pack ( "N", strlen($field) ) . $field . pack ( "N", $weight );

        // comment
        $req .= pack ( "N", strlen($comment) ) . $comment;

        // mbstring workaround
        $this->_MBPop ();

        // store request to requests array
        $this->_reqs[] = $req;
        return count($this->_reqs)-1;
    }

    /// connect to searchd, run queries batch, and return an array of result sets
    function RunQueries ()
    {
        if ( empty($this->_reqs) )
        {
            $this->_error = "no queries defined, issue AddQuery() first";
            return false;
        }

        // mbstring workaround
        $this->_MBPush ();

        if (!( $fp = $this->_Connect() ))
        {
            $this->_MBPop ();
            return false;
        }

        ////////////////////////////
        // send query, get response
        ////////////////////////////

        $nreqs = count($this->_reqs);
        $req = join ( "", $this->_reqs );
        $len = 4+strlen($req);
        $req = pack ( "nnNN", SEARCHD_COMMAND_SEARCH, VER_COMMAND_SEARCH, $len, $nreqs ) . $req; // add header

        fwrite ( $fp, $req, $len+8 );
        if (!( $response = $this->_GetResponse ( $fp, VER_COMMAND_SEARCH ) ))
        {
            $this->_MBPop ();
            return false;
        }

        $this->_reqs = array ();

        //////////////////
        // parse response
        //////////////////

        $p = 0; // current position
        $max = strlen($response); // max position for checks, to protect against broken responses

        $results = array ();
        for ( $ires=0; $ires<$nreqs && $p<$max; $ires++ )
        {
            $results[] = array();
            $result =& $results[$ires];

            $result["error"] = "";
            $result["warning"] = "";

            // extract status
            list(,$status) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
            $result["status"] = $status;
            if ( $status!=SEARCHD_OK )
            {
                list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                $message = substr ( $response, $p, $len ); $p += $len;

                if ( $status==SEARCHD_WARNING )
                {
                    $result["warning"] = $message;
                } else
                {
                    $result["error"] = $message;
                    continue;
                }
            }

            // read schema
            $fields = array ();
            $attrs = array ();

            list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
            while ( $nfields-->0 && $p<$max )
            {
                list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                $fields[] = substr ( $response, $p, $len ); $p += $len;
            }
            $result["fields"] = $fields;

            list(,$nattrs) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
            while ( $nattrs-->0 && $p<$max )
            {
                list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                $attr = substr ( $response, $p, $len ); $p += $len;
                list(,$type) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                $attrs[$attr] = $type;
            }
            $result["attrs"] = $attrs;

            // read match count
            list(,$count) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
            list(,$id64) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

            // read matches
            $idx = -1;
            while ( $count-->0 && $p<$max )
            {
                // index into result array
                $idx++;

                // parse document id and weight
                if ( $id64 )
                {
                    $doc = sphUnpack64 ( substr ( $response, $p, 8 ) ); $p += 8;
                    list(,$weight) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                } else
                {
                    list ( $doc, $weight ) = array_values ( unpack ( "N*N*",
                        substr ( $response, $p, 8 ) ) );
                    $p += 8;

                    if ( PHP_INT_SIZE>=8 )
                    {
                        // x64 route, workaround broken unpack() in 5.2.2+
                        if ( $doc<0 ) $doc += (1<<32);
                    } else
                    {
                        // x32 route, workaround php signed/unsigned braindamage
                        $doc = sprintf ( "%u", $doc );
                    }
                }
                $weight = sprintf ( "%u", $weight );

                // create match entry
                if ( $this->_arrayresult )
                    $result["matches"][$idx] = array ( "id"=>$doc, "weight"=>$weight );
                else
                    $result["matches"][$doc]["weight"] = $weight;

                // parse and create attributes
                $attrvals = array ();
                foreach ( $attrs as $attr=>$type )
                {
                    // handle floats
                    if ( $type==SPH_ATTR_FLOAT )
                    {
                        list(,$uval) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                        list(,$fval) = unpack ( "f*", pack ( "L", $uval ) );
                        $attrvals[$attr] = $fval;
                        continue;
                    }

                    // handle everything else as unsigned ints
                    list(,$val) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                    if ( $type & SPH_ATTR_MULTI )
                    {
                        $attrvals[$attr] = array ();
                        $nvalues = $val;
                        while ( $nvalues-->0 && $p<$max )
                        {
                            list(,$val) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                            $attrvals[$attr][] = sprintf ( "%u", $val );
                        }
                    } else
                    {
                        $attrvals[$attr] = sprintf ( "%u", $val );
                    }
                }

                if ( $this->_arrayresult )
                    $result["matches"][$idx]["attrs"] = $attrvals;
                else
                    $result["matches"][$doc]["attrs"] = $attrvals;
            }

            list ( $total, $total_found, $msecs, $words ) =
                array_values ( unpack ( "N*N*N*N*", substr ( $response, $p, 16 ) ) );
            $result["total"] = sprintf ( "%u", $total );
            $result["total_found"] = sprintf ( "%u", $total_found );
            $result["time"] = sprintf ( "%.3f", $msecs/1000 );
            $p += 16;

            while ( $words-->0 && $p<$max )
            {
                list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
                $word = substr ( $response, $p, $len ); $p += $len;
                list ( $docs, $hits ) = array_values ( unpack ( "N*N*", substr ( $response, $p, 8 ) ) ); $p += 8;
                $result["words"][$word] = array (
                    "docs"=>sprintf ( "%u", $docs ),
                    "hits"=>sprintf ( "%u", $hits ) );
            }
        }

        $this->_MBPop ();
        return $results;
    }

    /////////////////////////////////////////////////////////////////////////////
    // excerpts generation
    /////////////////////////////////////////////////////////////////////////////

    /// connect to searchd server, and generate exceprts (snippets)
    /// of given documents for given query. returns false on failure,
    /// an array of snippets on success
    function BuildExcerpts ( $docs, $index, $words, $opts=array() )
    {
        assert ( is_array($docs) );
        assert ( is_string($index) );
        assert ( is_string($words) );
        assert ( is_array($opts) );

        $this->_MBPush ();

        if (!( $fp = $this->_Connect() ))
        {
            $this->_MBPop();
            return false;
        }

        /////////////////
        // fixup options
        /////////////////

        if ( !isset($opts["before_match"]) )         $opts["before_match"] = "<b>";
        if ( !isset($opts["after_match"]) )             $opts["after_match"] = "</b>";
        if ( !isset($opts["chunk_separator"]) )         $opts["chunk_separator"] = " ... ";
        if ( !isset($opts["limit"]) )                 $opts["limit"] = 256;
        if ( !isset($opts["around"]) )                 $opts["around"] = 5;
        if ( !isset($opts["exact_phrase"]) )         $opts["exact_phrase"] = false;
        if ( !isset($opts["single_passage"]) )         $opts["single_passage"] = false;
        if ( !isset($opts["use_boundaries"]) )         $opts["use_boundaries"] = false;
        if ( !isset($opts["weight_order"]) )         $opts["weight_order"] = false;

        /////////////////
        // build request
        /////////////////

        // v.1.0 req
        $flags = 1; // remove spaces
        if ( $opts["exact_phrase"] )     $flags |= 2;
        if ( $opts["single_passage"] )     $flags |= 4;
        if ( $opts["use_boundaries"] )     $flags |= 8;
        if ( $opts["weight_order"] )     $flags |= 16;
        $req = pack ( "NN", 0, $flags ); // mode=0, flags=$flags
        $req .= pack ( "N", strlen($index) ) . $index; // req index
        $req .= pack ( "N", strlen($words) ) . $words; // req words

        // options
        $req .= pack ( "N", strlen($opts["before_match"]) ) . $opts["before_match"];
        $req .= pack ( "N", strlen($opts["after_match"]) ) . $opts["after_match"];
        $req .= pack ( "N", strlen($opts["chunk_separator"]) ) . $opts["chunk_separator"];
        $req .= pack ( "N", (int)$opts["limit"] );
        $req .= pack ( "N", (int)$opts["around"] );

        // documents
        $req .= pack ( "N", count($docs) );
        foreach ( $docs as $doc )
        {
            assert ( is_string($doc) );
            $req .= pack ( "N", strlen($doc) ) . $doc;
        }

        ////////////////////////////
        // send query, get response
        ////////////////////////////

        $len = strlen($req);
        $req = pack ( "nnN", SEARCHD_COMMAND_EXCERPT, VER_COMMAND_EXCERPT, $len ) . $req; // add header
        $wrote = fwrite ( $fp, $req, $len+8 );
        if (!( $response = $this->_GetResponse ( $fp, VER_COMMAND_EXCERPT ) ))
        {
            $this->_MBPop ();
            return false;
        }

        //////////////////
        // parse response
        //////////////////

        $pos = 0;
        $res = array ();
        $rlen = strlen($response);
        for ( $i=0; $i<count($docs); $i++ )
        {
            list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) );
            $pos += 4;

            if ( $pos+$len > $rlen )
            {
                $this->_error = "incomplete reply";
                $this->_MBPop ();
                return false;
            }
            $res[] = $len ? substr ( $response, $pos, $len ) : "";
            $pos += $len;
        }

        $this->_MBPop ();
        return $res;
    }


    /////////////////////////////////////////////////////////////////////////////
    // keyword generation
    /////////////////////////////////////////////////////////////////////////////

    /// connect to searchd server, and generate keyword list for a given query
    /// returns false on failure,
    /// an array of words on success
    function BuildKeywords ( $query, $index, $hits )
    {
        assert ( is_string($query) );
        assert ( is_string($index) );
        assert ( is_bool($hits) );

        $this->_MBPush ();

        if (!( $fp = $this->_Connect() ))
        {
            $this->_MBPop();
            return false;
        }

        /////////////////
        // build request
        /////////////////

        // v.1.0 req
        $req = pack ( "N", strlen($query) ) . $query; // req query
        $req .= pack ( "N", strlen($index) ) . $index; // req index
        $req .= pack ( "N", (int)$hits );

        ////////////////////////////
        // send query, get response
        ////////////////////////////

        $len = strlen($req);
        $req = pack ( "nnN", SEARCHD_COMMAND_KEYWORDS, VER_COMMAND_KEYWORDS, $len ) . $req; // add header
        $wrote = fwrite ( $fp, $req, $len+8 );
        if (!( $response = $this->_GetResponse ( $fp, VER_COMMAND_KEYWORDS ) ))
        {
            $this->_MBPop ();
            return false;
        }

        //////////////////
        // parse response
        //////////////////

        $pos = 0;
        $res = array ();
        $rlen = strlen($response);
        list(,$nwords) = unpack ( "N*", substr ( $response, $pos, 4 ) );
        $pos += 4;
        for ( $i=0; $i<$nwords; $i++ )
        {
            list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) );     $pos += 4;
            $tokenized = $len ? substr ( $response, $pos, $len ) : "";
            $pos += $len;

            list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) );     $pos += 4;
            $normalized = $len ? substr ( $response, $pos, $len ) : "";
            $pos += $len;

            $res[] = array ( "tokenized"=>$tokenized, "normalized"=>$normalized );

            if ( $hits )
            {
                list($ndocs,$nhits) = array_values ( unpack ( "N*N*", substr ( $response, $pos, 8 ) ) );
                $pos += 8;
                $res [$i]["docs"] = $ndocs;
                $res [$i]["hits"] = $nhits;
            }

            if ( $pos > $rlen )
            {
                $this->_error = "incomplete reply";
                $this->_MBPop ();
                return false;
            }
        }

        $this->_MBPop ();
        return $res;
    }

    function EscapeString ( $string )
    {
        $from = array ( '(',')','|','-','!','@','~','"','&', '/' );
        $to = array ( '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/' );

        return str_replace ( $from, $to, $string );
    }

    /////////////////////////////////////////////////////////////////////////////
    // attribute updates
    /////////////////////////////////////////////////////////////////////////////

    /// update given attribute values on given documents in given indexes
    /// returns amount of updated documents (0 or more) on success, or -1 on failure
    function UpdateAttributes ( $index, $attrs, $values )
    {
        // verify everything
        assert ( is_string($index) );

        assert ( is_array($attrs) );
        foreach ( $attrs as $attr )
            assert ( is_string($attr) );

        assert ( is_array($values) );
        foreach ( $values as $id=>$entry )
        {
            assert ( is_numeric($id) );
            assert ( is_array($entry) );
            assert ( count($entry)==count($attrs) );
            foreach ( $entry as $v )
                assert ( is_int($v) );
        }

        // build request
        $req = pack ( "N", strlen($index) ) . $index;

        $req .= pack ( "N", count($attrs) );
        foreach ( $attrs as $attr )
            $req .= pack ( "N", strlen($attr) ) . $attr;

        $req .= pack ( "N", count($values) );
        foreach ( $values as $id=>$entry )
        {
            $req .= sphPack64 ( $id );
            foreach ( $entry as $v )
                $req .= pack ( "N", $v );
        }

        // mbstring workaround
        $this->_MBPush ();

        // connect, send query, get response
        if (!( $fp = $this->_Connect() ))
        {
            $this->_MBPop ();
            return -1;
        }

        $len = strlen($req);
        $req = pack ( "nnN", SEARCHD_COMMAND_UPDATE, VER_COMMAND_UPDATE, $len ) . $req; // add header
        fwrite ( $fp, $req, $len+8 );

        if (!( $response = $this->_GetResponse ( $fp, VER_COMMAND_UPDATE ) ))
        {
            $this->_MBPop ();
            return -1;
        }

        // parse response
        list(,$updated) = unpack ( "N*", substr ( $response, 0, 4 ) );
        $this->_MBPop ();
        return $updated;
    }
}

//
// $Id: sphinxapi.php 1418 2008-08-28 15:30:05Z shodan $
//

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/563
2009/01/20 08:50 2009/01/20 08:50

댓글을 달아 주세요

아래 소개된 소스는 웹 기반의 WYSIWYG 에디터 중에서 많이 언급되고 있는 FCKeditor를 간단하게 웹게시판의 입력폼으로 구성한 예제 소스 코드입니다. FCKeditor는 스킨을 손쉽게 교체할 수 있도록 설계 되어 있으며 예제에서는 MS오피스20003 스타일로 스킨을 바꿔서 사용하고 있습니다. 이런 류의 웹에디터는 국내에서도 네이버가 스마트 에디터를 얼마 전부터 오픈 소스로 공개하고 있다고 하니 참고하세요.

[샘플 소스 실행 화면]

[editor/demo.php]
<?php
include("fckeditor/fckeditor.php");
$editor_path = "/fckeditor/";
$editor = new FCKeditor('my_content');
$editor->BasePath     = $editor_path;
$editor->Config['SkinPath']     = $editor_path . "editor/skins/office2003/";
//$editor->ToolbarSet = "Basic";
$editor->Value         = $_POST[my_content];
$editor->Width         = 580;
$editor->Height         = 300;
?>
<HTML>
<HEAD>
<TITLE>FCKeditor Demo</TITLE>
<STYLE>TD,INPUT {font-size:12px;}</STYLE>
</HEAD>
<BODY>
<FORM method="POST" action="?" name="my_form" >
<INPUT type="HIDDEN" name="my_seq" value="<?=$_POST[my_seq];?>" />
<TABLE cellpadding=0 cellspacing=1 border=0>
<TR>
    <TD width=40>제목</TD>
    <TD>
        <INPUT type="TEXT" name="my_title" size="80" value="<?=$_POST[my_title];?>" class="" />
        <INPUT type="SUBMIT" value="문서저장">
    </TD>
</TR>
<TR><TD colspan=2><? $editor->Create(); ?></TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>

[FCKeditor 데모 실행]
http://www.fckeditor.net/demo/

[editor/fckeditor/fckeditor_php5.php]
<?php
/*
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
*/

class FCKeditor
{
    /**
    * Name of the FCKeditor instance.
    *
    * @access protected
    * @var string
    */
    public $InstanceName ;
    /**
    * Path to FCKeditor relative to the document root.
    *
    * @var string
    */
    public $BasePath ;
    /**
    * Width of the FCKeditor.
    * Examples: 100%, 600
    *
    * @var mixed
    */
    public $Width ;
    /**
    * Height of the FCKeditor.
    * Examples: 400, 50%
    *
    * @var mixed
    */
    public $Height ;
    /**
    * Name of the toolbar to load.
    *
    * @var string
    */
    public $ToolbarSet ;
    /**
    * Initial value.
    *
    * @var string
    */
    public $Value ;
    /**
    * This is where additional configuration can be passed.
    * Example:
    * $oFCKeditor->Config['EnterMode'] = 'br';
    *
    * @var array
    */
    public $Config ;

    /**
    * Main Constructor.
    * Refer to the _samples/php directory for examples.
    *
    * @param string $instanceName
    */
    public function __construct( $instanceName )
    {
        $this->InstanceName     = $instanceName ;
        $this->BasePath         = '/fckeditor/' ;
        $this->Width         = '100%' ;
        $this->Height         = '200' ;
        $this->ToolbarSet     = 'Default' ;
        $this->Value         = '' ;

        $this->Config         = array() ;
    }

    /**
    * Display FCKeditor.
    *
    */
    public function Create()
    {
        echo $this->CreateHtml() ;
    }

    /**
    * Return the HTML code required to run FCKeditor.
    *
    * @return string
    */
    public function CreateHtml()
    {
        $HtmlValue = htmlspecialchars( $this->Value ) ;

        $Html = '' ;

        if ( $this->IsCompatible() )
        {
            if ( isset( $_GET['fcksource'] ) && $_GET['fcksource'] == "true" )
                $File = 'fckeditor.original.html' ;
            else
                $File = 'fckeditor.html' ;

            $Link = "{$this->BasePath}editor/{$File}?InstanceName={$this->InstanceName}" ;

            if ( $this->ToolbarSet != '' )
                $Link .= "&amp;Toolbar={$this->ToolbarSet}" ;

            // Render the linked hidden field.
            $Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}\" name=\"{$this->InstanceName}\" value=\"{$HtmlValue}\" style=\"display:none\" />" ;

            // Render the configurations hidden field.
            $Html .= "<input type=\"hidden\" id=\"{$this->InstanceName}___Config\" value=\"" . $this->GetConfigFieldString() . "\" style=\"display:none\" />" ;

            // Render the editor IFRAME.
            $Html .= "<iframe id=\"{$this->InstanceName}___Frame\" src=\"{$Link}\" width=\"{$this->Width}\" height=\"{$this->Height}\" frameborder=\"0\" scrolling=\"no\"></iframe>" ;
        }
        else
        {
            if ( strpos( $this->Width, '%' ) === false )
                $WidthCSS = $this->Width . 'px' ;
            else
                $WidthCSS = $this->Width ;

            if ( strpos( $this->Height, '%' ) === false )
                $HeightCSS = $this->Height . 'px' ;
            else
                $HeightCSS = $this->Height ;

            $Html .= "<textarea name=\"{$this->InstanceName}\" rows=\"4\" cols=\"40\" style=\"width: {$WidthCSS}; height: {$HeightCSS}\">{$HtmlValue}</textarea>" ;
        }

        return $Html ;
    }

    /**
    * Returns true if browser is compatible with FCKeditor.
    *
    * @return boolean
    */
    public function IsCompatible()
    {
        return FCKeditor_IsCompatibleBrowser() ;
    }

    /**
    * Get settings from Config array as a single string.
    *
    * @access protected
    * @return string
    */
    public function GetConfigFieldString()
    {
        $sParams = '' ;
        $bFirst = true ;

        foreach ( $this->Config as $sKey => $sValue )
        {
            if ( $bFirst == false )
                $sParams .= '&amp;' ;
            else
                $bFirst = false ;

            if ( $sValue === true )
                $sParams .= $this->EncodeConfig( $sKey ) . '=true' ;
            else if ( $sValue === false )
                $sParams .= $this->EncodeConfig( $sKey ) . '=false' ;
            else
                $sParams .= $this->EncodeConfig( $sKey ) . '=' . $this->EncodeConfig( $sValue ) ;
        }

        return $sParams ;
    }

    /**
    * Encode characters that may break the configuration string
    * generated by GetConfigFieldString().
    *
    * @access protected
    * @param string $valueToEncode
    * @return string
    */
    public function EncodeConfig( $valueToEncode )
    {
        $chars = array(
            '&' => '%26',
            '=' => '%3D',
            '"' => '%22' ) ;

        return strtr( $valueToEncode, $chars ) ;
    }
}

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/562
2009/01/18 17:00 2009/01/18 17:00

댓글을 달아 주세요

엑셀 2003 통합 포멧 문서 파일(.xls)을 읽어올 수 있도록 공개된 오픈 소스 라이브러리를 이용해서 엑셀 문서 첫번째 Sheet 에 있는 각 Cell의 Text 데이타들을 MySQL 데이타베이스에 등록하는 소스 코드입니다. 서비스를 운영하다 보면 대량의 데이터를 일괄 등록해야 할 때가 있는데 엑셀 업로드를 응용하면 유용하므로 대량의 데이터를 다룰 때 활용하면 좋을 것입니다.
참고로 후반부에 두가지 예제는 Excel.Application 을 활용해서 엑셀 문서를 제어하는 예제입니다. 윈도우즈 환경에서 PHP 를 사용하는 경우가 드물기 때문에 잘 활용되지 않을 수 있습니다.

[excel2db.php]
<?php
$DB = array();
$DB["host"] = "192.168.10.10";
$DB["user"] = "excel";
$DB["pass"] = "password";
$DB["name"] = "excel";
$DB["conn"] = mysql_connect($DB["host"], $DB["user"], $DB["pass"]) or die("ERROR");
mysql_select_db($DB["name"], $DB["conn"]) or die("ERROR");
mysql_query('SET NAMES utf8',$DB["conn"]);
require_once "Excel/reader.php";
$data = new Spreadsheet_Excel_Reader();
$data->read("sample.xls");
$data->setOutputEncoding("UTF-8//IGNORE");
for ($i = 1; $i <= $data->sheets[0]["numRows"]; $i++){
    $my_name = $data->sheets[0]["cells"][$i][1];
    $my_email = $data->sheets[0]["cells"][$i][2];
    $query = "insert into my_user set my_name='{$my_name}', my_email='{$my_email}'";
    $DB["result"] = mysql_query($query, $DB["conn"]);
}
mysql_close($DB["conn"]);
?>

[Excel/reader.php]
http://sourceforge.net/projects/phpexcelreader
<?php

//require_once 'PEAR.php';
require_once 'Excel/oleread.inc';

//define('Spreadsheet_Excel_Reader_HAVE_ICONV', function_exists('iconv'));
//define('Spreadsheet_Excel_Reader_HAVE_MB', function_exists('mb_convert_encoding'));

define('Spreadsheet_Excel_Reader_BIFF8', 0x600);
define('Spreadsheet_Excel_Reader_BIFF7', 0x500);
define('Spreadsheet_Excel_Reader_WorkbookGlobals', 0x5);
define('Spreadsheet_Excel_Reader_Worksheet', 0x10);

define('Spreadsheet_Excel_Reader_Type_BOF', 0x809);
define('Spreadsheet_Excel_Reader_Type_EOF', 0x0a);
define('Spreadsheet_Excel_Reader_Type_BOUNDSHEET', 0x85);
define('Spreadsheet_Excel_Reader_Type_DIMENSION', 0x200);
define('Spreadsheet_Excel_Reader_Type_ROW', 0x208);
define('Spreadsheet_Excel_Reader_Type_DBCELL', 0xd7);
define('Spreadsheet_Excel_Reader_Type_FILEPASS', 0x2f);
define('Spreadsheet_Excel_Reader_Type_NOTE', 0x1c);
define('Spreadsheet_Excel_Reader_Type_TXO', 0x1b6);
define('Spreadsheet_Excel_Reader_Type_RK', 0x7e);
define('Spreadsheet_Excel_Reader_Type_RK2', 0x27e);
define('Spreadsheet_Excel_Reader_Type_MULRK', 0xbd);
define('Spreadsheet_Excel_Reader_Type_MULBLANK', 0xbe);
define('Spreadsheet_Excel_Reader_Type_INDEX', 0x20b);
define('Spreadsheet_Excel_Reader_Type_SST', 0xfc);
define('Spreadsheet_Excel_Reader_Type_EXTSST', 0xff);
define('Spreadsheet_Excel_Reader_Type_CONTINUE', 0x3c);
define('Spreadsheet_Excel_Reader_Type_LABEL', 0x204);
define('Spreadsheet_Excel_Reader_Type_LABELSST', 0xfd);
define('Spreadsheet_Excel_Reader_Type_NUMBER', 0x203);
define('Spreadsheet_Excel_Reader_Type_NAME', 0x18);
define('Spreadsheet_Excel_Reader_Type_ARRAY', 0x221);
define('Spreadsheet_Excel_Reader_Type_STRING', 0x207);
define('Spreadsheet_Excel_Reader_Type_FORMULA', 0x406);
define('Spreadsheet_Excel_Reader_Type_FORMULA2', 0x6);
define('Spreadsheet_Excel_Reader_Type_FORMAT', 0x41e);
define('Spreadsheet_Excel_Reader_Type_XF', 0xe0);
define('Spreadsheet_Excel_Reader_Type_BOOLERR', 0x205);
define('Spreadsheet_Excel_Reader_Type_UNKNOWN', 0xffff);
define('Spreadsheet_Excel_Reader_Type_NINETEENFOUR', 0x22);
define('Spreadsheet_Excel_Reader_Type_MERGEDCELLS', 0xE5);

define('Spreadsheet_Excel_Reader_utcOffsetDays' , 25569);
define('Spreadsheet_Excel_Reader_utcOffsetDays1904', 24107);
define('Spreadsheet_Excel_Reader_msInADay', 24 * 60 * 60);

//define('Spreadsheet_Excel_Reader_DEF_NUM_FORMAT', "%.2f");
define('Spreadsheet_Excel_Reader_DEF_NUM_FORMAT', "%s");

// function file_get_contents for PHP < 4.3.0
// Thanks Marian Steinbach for this function
if (!function_exists('file_get_contents')) {
    function file_get_contents($filename, $use_include_path = 0) {
        $data = '';
        $file = @fopen($filename, "rb", $use_include_path);
        if ($file) {
            while (!feof($file)) $data .= fread($file, 1024);
            fclose($file);
        } else {
            // There was a problem opening the file
            $data = FALSE;
        }
        return $data;
    }
}


//class Spreadsheet_Excel_Reader extends PEAR {
class Spreadsheet_Excel_Reader {

    var $boundsheets = array();
    var $formatRecords = array();
    var $sst = array();
    var $sheets = array();
    var $data;
    var $pos;
    var $_ole;
    var $_defaultEncoding;
    var $_defaultFormat = Spreadsheet_Excel_Reader_DEF_NUM_FORMAT;
    var $_columnsFormat = array();
    var $_rowoffset = 1;
    var $_coloffset = 1;
   
    var $dateFormats = array (
        0xe => "d/m/Y",
        0xf => "d-M-Y",
        0x10 => "d-M",
        0x11 => "M-Y",
        0x12 => "h:i a",
        0x13 => "h:i:s a",
        0x14 => "H:i",
        0x15 => "H:i:s",
        0x16 => "d/m/Y H:i",
        0x2d => "i:s",
        0x2e => "H:i:s",
        0x2f => "i:s.S");

    var $numberFormats = array(
        0x1 => "%1.0f", // "0"
        0x2 => "%1.2f", // "0.00",
        0x3 => "%1.0f", //"#,##0",
        0x4 => "%1.2f", //"#,##0.00",
        0x5 => "%1.0f", /*"$#,##0;($#,##0)",*/
        0x6 => '$%1.0f', /*"$#,##0;($#,##0)",*/
        0x7 => '$%1.2f', //"$#,##0.00;($#,##0.00)",
        0x8 => '$%1.2f', //"$#,##0.00;($#,##0.00)",
        0x9 => '%1.0f%%', // "0%"
        0xa => '%1.2f%%', // "0.00%"
        0xb => '%1.2f', // 0.00E00",
        0x25 => '%1.0f', // "#,##0;(#,##0)",
        0x26 => '%1.0f', //"#,##0;(#,##0)",
        0x27 => '%1.2f', //"#,##0.00;(#,##0.00)",
        0x28 => '%1.2f', //"#,##0.00;(#,##0.00)",
        0x29 => '%1.0f', //"#,##0;(#,##0)",
        0x2a => '$%1.0f', //"$#,##0;($#,##0)",
        0x2b => '%1.2f', //"#,##0.00;(#,##0.00)",
        0x2c => '$%1.2f', //"$#,##0.00;($#,##0.00)",
        0x30 => '%1.0f'); //"##0.0E0";

    function Spreadsheet_Excel_Reader(){
        $this->_ole =& new OLERead();
        $this->setUTFEncoder('iconv');

    }

    function setOutputEncoding($Encoding){
        $this->_defaultEncoding = $Encoding;
    }

    /**
    * $encoder = 'iconv' or 'mb'
    * set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding
    * set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding
    */
    function setUTFEncoder($encoder = 'iconv'){
        $this->_encoderFunction = '';
        if ($encoder == 'iconv'){
            $this->_encoderFunction = function_exists('iconv') ? 'iconv' : '';
        }elseif ($encoder == 'mb') {
            $this->_encoderFunction = function_exists('mb_convert_encoding') ? 'mb_convert_encoding' : '';
        }
    }

    function setRowColOffset($iOffset){
        $this->_rowoffset = $iOffset;
        $this->_coloffset = $iOffset;
    }

    function setDefaultFormat($sFormat){
        $this->_defaultFormat = $sFormat;
    }

    function setColumnFormat($column, $sFormat){
        $this->_columnsFormat[$column] = $sFormat;
    }


    function read($sFileName) {
        $errlevel = error_reporting();
        error_reporting($errlevel ^ E_NOTICE);
        $res = $this->_ole->read($sFileName);
       
        // oops, something goes wrong (Darko Miljanovic)
        if($res === false) {
            // check error code
            if($this->_ole->error == 1) {
            // bad file
                die('The filename ' . $sFileName . ' is not readable');    
            }
            // check other error codes here (eg bad fileformat, etc...)
        }

        $this->data = $this->_ole->getWorkBook();

       
        /*
        $res = $this->_ole->read($sFileName);

        if ($this->isError($res)) {
//         var_dump($res);        
            return $this->raiseError($res);
        }

        $total = $this->_ole->ppsTotal();
        for ($i = 0; $i < $total; $i++) {
            if ($this->_ole->isFile($i)) {
                $type = unpack("v", $this->_ole->getData($i, 0, 2));
                if ($type[''] == 0x0809) { // check if it's a BIFF stream
                    $this->_index = $i;
                    $this->data = $this->_ole->getData($i, 0, $this->_ole->getDataLength($i));
                    break;
                }
            }
        }

        if ($this->_index === null) {
            return $this->raiseError("$file doesn't seem to be an Excel file");
        }
       
        */
       
        //var_dump($this->data);
    //echo "data =".$this->data;    
        $this->pos = 0;
        //$this->readRecords();
        $this->_parse();
        error_reporting($errlevel);

    }

    function _parse(){
        $pos = 0;

        $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8;
        $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8;

        $version = ord($this->data[$pos + 4]) | ord($this->data[$pos + 5])<<8;
        $substreamType = ord($this->data[$pos + 6]) | ord($this->data[$pos + 7])<<8;
        //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n";

        if (($version != Spreadsheet_Excel_Reader_BIFF8) && ($version != Spreadsheet_Excel_Reader_BIFF7)) {
            return false;
        }

        if ($substreamType != Spreadsheet_Excel_Reader_WorkbookGlobals){
            return false;
        }

        //print_r($rec);
        $pos += $length + 4;

        $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8;
        $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8;

        while ($code != Spreadsheet_Excel_Reader_Type_EOF){
            switch ($code) {
                case Spreadsheet_Excel_Reader_Type_SST:
                    //echo "Type_SST\n";
                    $spos = $pos + 4;
                    $limitpos = $spos + $length;
                    $uniqueStrings = $this->_GetInt4d($this->data, $spos+4);
                                                $spos += 8;
                                    for ($i = 0; $i < $uniqueStrings; $i++) {
        // Read in the number of characters
                                                if ($spos == $limitpos) {
                                                $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                                                $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                                                        if ($opcode != 0x3c) {
                                                                return -1;
                                                        }
                                                $spos += 4;
                                                $limitpos = $spos + $conlength;
                                                }
                                                $numChars = @ord($this->data[$spos]) | (@ord($this->data[$spos+1]) << 8);
                                                //echo "i = $i pos = $pos numChars = $numChars ";
                                                $spos += 2;
                                                $optionFlags = @ord($this->data[$spos]);
                                                $spos++;
                                        $asciiEncoding = (($optionFlags & 0x01) == 0) ;
                                                $extendedString = ( ($optionFlags & 0x04) != 0);

                                                // See if string contains formatting information
                                                $richString = ( ($optionFlags & 0x08) != 0);

                                                if ($richString) {
                                        // Read in the crun
                                                        $formattingRuns = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8);
                                                        $spos += 2;
                                                }

                                                if ($extendedString) {
                                                // Read in cchExtRst
                                                $extendedRunLength = $this->_GetInt4d($this->data, $spos);
                                                $spos += 4;
                                                }

                                                $len = ($asciiEncoding)? $numChars : $numChars*2;
                                                if ($spos + $len < $limitpos) {
                                                                $retstr = substr($this->data, $spos, $len);
                                                                $spos += $len;
                                                }else{
                                                        // found countinue
                                                        $retstr = substr($this->data, $spos, $limitpos - $spos);
                                                        $bytesRead = $limitpos - $spos;
                                                        $charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2));
                                                        $spos = $limitpos;

                                                        while ($charsLeft > 0){
                                                                $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                                                                $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                                                                        if ($opcode != 0x3c) {
                                                                                return -1;
                                                                        }
                                                                $spos += 4;
                                                                $limitpos = $spos + $conlength;
                                                                $option = ord($this->data[$spos]);
                                                                $spos += 1;
                                                                if ($asciiEncoding && ($option == 0)) {
                                                                                $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
                                                                    $retstr .= substr($this->data, $spos, $len);
                                                                    $charsLeft -= $len;
                                                                    $asciiEncoding = true;
                                                                }elseif (!$asciiEncoding && ($option != 0)){
                                                                                $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
                                                                    $retstr .= substr($this->data, $spos, $len);
                                                                    $charsLeft -= $len/2;
                                                                    $asciiEncoding = false;
                                                                }elseif (!$asciiEncoding && ($option == 0)) {
                                                                // Bummer - the string starts off as Unicode, but after the
                                                                // continuation it is in straightforward ASCII encoding
                                                                                $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
                                                                        for ($j = 0; $j < $len; $j++) {
                                                                $retstr .= $this->data[$spos + $j].chr(0);
                                                                }
                                                            $charsLeft -= $len;
                                                                $asciiEncoding = false;
                                                                }else{
                                                            $newstr = '';
                                                                    for ($j = 0; $j < strlen($retstr); $j++) {
                                                                    $newstr = $retstr[$j].chr(0);
                                                                    }
                                                                    $retstr = $newstr;
                                                                                $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
                                                                    $retstr .= substr($this->data, $spos, $len);
                                                                    $charsLeft -= $len/2;
                                                                    $asciiEncoding = false;
                                                                        //echo "Izavrat\n";
                                                                }
                                                        $spos += $len;

                                                        }
                                                }
                                                $retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);
//                                             echo "Str $i = $retstr\n";
                                        if ($richString){
                                                $spos += 4 * $formattingRuns;
                                                }

                                                // For extended strings, skip over the extended string data
                                                if ($extendedString) {
                                                $spos += $extendedRunLength;
                                                }
                                                        //if ($retstr == 'Derby'){
                                                        //     echo "bb\n";
                                                        //}
                                                $this->sst[]=$retstr;
                                    }
                    /*$continueRecords = array();
                    while ($this->getNextCode() == Type_CONTINUE) {
                        $continueRecords[] = &$this->nextRecord();
                    }
                    //echo " 1 Type_SST\n";
                    $this->shareStrings = new SSTRecord($r, $continueRecords);
                    //print_r($this->shareStrings->strings);
                    */
                    // echo 'SST read: '.($time_end-$time_start)."\n";
                    break;

                case Spreadsheet_Excel_Reader_Type_FILEPASS:
                    return false;
                    break;
                case Spreadsheet_Excel_Reader_Type_NAME:
                    //echo "Type_NAME\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_FORMAT:
                        $indexCode = ord($this->data[$pos+4]) | ord($this->data[$pos+5]) << 8;

                        if ($version == Spreadsheet_Excel_Reader_BIFF8) {
                            $numchars = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8;
                            if (ord($this->data[$pos+8]) == 0){
                                $formatString = substr($this->data, $pos+9, $numchars);
                            } else {
                                $formatString = substr($this->data, $pos+9, $numchars*2);
                            }
                        } else {
                            $numchars = ord($this->data[$pos+6]);
                            $formatString = substr($this->data, $pos+7, $numchars*2);
                        }

                    $this->formatRecords[$indexCode] = $formatString;
                // echo "Type.FORMAT\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_XF:
                        //global $dateFormats, $numberFormats;
                        $indexCode = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8;
                        //echo "\nType.XF ".count($this->formatRecords['xfrecords'])." $indexCode ";
                        if (array_key_exists($indexCode, $this->dateFormats)) {
                            //echo "isdate ".$dateFormats[$indexCode];
                            $this->formatRecords['xfrecords'][] = array(
                                    'type' => 'date',
                                    'format' => $this->dateFormats[$indexCode]
                                    );
                        }elseif (array_key_exists($indexCode, $this->numberFormats)) {
                        //echo "isnumber ".$this->numberFormats[$indexCode];
                            $this->formatRecords['xfrecords'][] = array(
                                    'type' => 'number',
                                    'format' => $this->numberFormats[$indexCode]
                                    );
                        }else{
                            $isdate = FALSE;
                            if ($indexCode > 0){
                                if (isset($this->formatRecords[$indexCode]))
                                    $formatstr = $this->formatRecords[$indexCode];
                                //echo '.other.';
                                //echo "\ndate-time=$formatstr=\n";
                                if ($formatstr)
                                if (preg_match("/[^hmsday\/\-:\s]/i", $formatstr) == 0) { // found day and time format
                                    $isdate = TRUE;
                                    $formatstr = str_replace('mm', 'i', $formatstr);
                                    $formatstr = str_replace('h', 'H', $formatstr);
                                    //echo "\ndate-time $formatstr \n";
                                }
                            }

                            if ($isdate){
                                $this->formatRecords['xfrecords'][] = array(
                                        'type' => 'date',
                                        'format' => $formatstr,
                                        );
                            }else{
                                $this->formatRecords['xfrecords'][] = array(
                                        'type' => 'other',
                                        'format' => '',
                                        'code' => $indexCode
                                        );
                            }
                        }
                        //echo "\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_NINETEENFOUR:
                    //echo "Type.NINETEENFOUR\n";
                    $this->nineteenFour = (ord($this->data[$pos+4]) == 1);
                    break;
                case Spreadsheet_Excel_Reader_Type_BOUNDSHEET:
                    //echo "Type.BOUNDSHEET\n";
                        $rec_offset = $this->_GetInt4d($this->data, $pos+4);
                        $rec_typeFlag = ord($this->data[$pos+8]);
                        $rec_visibilityFlag = ord($this->data[$pos+9]);
                        $rec_length = ord($this->data[$pos+10]);

                        if ($version == Spreadsheet_Excel_Reader_BIFF8){
                            $chartype = ord($this->data[$pos+11]);
                            if ($chartype == 0){
                                $rec_name     = substr($this->data, $pos+12, $rec_length);
                            } else {
                                $rec_name     = $this->_encodeUTF16(substr($this->data, $pos+12, $rec_length*2));
                            }
                        }elseif ($version == Spreadsheet_Excel_Reader_BIFF7){
                                $rec_name     = substr($this->data, $pos+11, $rec_length);
                        }
                    $this->boundsheets[] = array('name'=>$rec_name,
                                                'offset'=>$rec_offset);

                    break;

            }

            //echo "Code = ".base_convert($r['code'],10,16)."\n";
            $pos += $length + 4;
            $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8;
            $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8;

            //$r = &$this->nextRecord();
            //echo "1 Code = ".base_convert($r['code'],10,16)."\n";
        }

        foreach ($this->boundsheets as $key=>$val){
            $this->sn = $key;
            $this->_parsesheet($val['offset']);
        }
        return true;

    }

    function _parsesheet($spos){
        $cont = true;
        // read BOF
        $code = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
        $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;

        $version = ord($this->data[$spos + 4]) | ord($this->data[$spos + 5])<<8;
        $substreamType = ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8;

        if (($version != Spreadsheet_Excel_Reader_BIFF8) && ($version != Spreadsheet_Excel_Reader_BIFF7)) {
            return -1;
        }

        if ($substreamType != Spreadsheet_Excel_Reader_Worksheet){
            return -2;
        }
        //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n";
        $spos += $length + 4;
        //var_dump($this->formatRecords);
    //echo "code $code $length";
        while($cont) {
            //echo "mem= ".memory_get_usage()."\n";
//             $r = &$this->file->nextRecord();
            $lowcode = ord($this->data[$spos]);
            if ($lowcode == Spreadsheet_Excel_Reader_Type_EOF) break;
            $code = $lowcode | ord($this->data[$spos+1])<<8;
            $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
            $spos += 4;
            $this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1;
            $this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1;
            //echo "Code=".base_convert($code,10,16)." $code\n";
            unset($this->rectype);
            $this->multiplier = 1; // need for format with %
            switch ($code) {
                case Spreadsheet_Excel_Reader_Type_DIMENSION:
                    //echo 'Type_DIMENSION ';
                    if (!isset($this->numRows)) {
                        if (($length == 10) || ($version == Spreadsheet_Excel_Reader_BIFF7)){
                            $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+2]) | ord($this->data[$spos+3]) << 8;
                            $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+6]) | ord($this->data[$spos+7]) << 8;
                        } else {
                            $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;
                            $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+10]) | ord($this->data[$spos+11]) << 8;
                        }
                    }
                    //echo 'numRows '.$this->numRows.' '.$this->numCols."\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_MERGEDCELLS:
                    $cellRanges = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    for ($i = 0; $i < $cellRanges; $i++) {
                        $fr = ord($this->data[$spos + 8*$i + 2]) | ord($this->data[$spos + 8*$i + 3])<<8;
                        $lr = ord($this->data[$spos + 8*$i + 4]) | ord($this->data[$spos + 8*$i + 5])<<8;
                        $fc = ord($this->data[$spos + 8*$i + 6]) | ord($this->data[$spos + 8*$i + 7])<<8;
                        $lc = ord($this->data[$spos + 8*$i + 8]) | ord($this->data[$spos + 8*$i + 9])<<8;
                        //$this->sheets[$this->sn]['mergedCells'][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1);
                        if ($lr - $fr > 0) {
                            $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1;
                        }
                        if ($lc - $fc > 0) {
                            $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1;
                        }
                    }
                    //echo "Merged Cells $cellRanges $lr $fr $lc $fc\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_RK:
                case Spreadsheet_Excel_Reader_Type_RK2:
                    //echo 'Spreadsheet_Excel_Reader_Type_RK'."\n";
                    $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    $rknum = $this->_GetInt4d($this->data, $spos + 6);
                    $numValue = $this->_GetIEEE754($rknum);
                    //echo $numValue." ";
                    if ($this->isDate($spos)) {
                        list($string, $raw) = $this->createDate($numValue);
                    }else{
                        $raw = $numValue;
                        if (isset($this->_columnsFormat[$column + 1])){
                                $this->curformat = $this->_columnsFormat[$column + 1];
                        }
                        $string = sprintf($this->curformat, $numValue * $this->multiplier);
                        //$this->addcell(RKRecord($r));
                    }
                    $this->addcell($row, $column, $string, $raw);
                    //echo "Type_RK $row $column $string $raw {$this->curformat}\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_LABELSST:
                        $row         = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                        $column     = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                        $xfindex     = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8;
                        $index = $this->_GetInt4d($this->data, $spos + 6);
            //var_dump($this->sst);
                        $this->addcell($row, $column, $this->sst[$index]);
                        //echo "LabelSST $row $column $string\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_MULRK:
                    $row         = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $colFirst = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    $colLast     = ord($this->data[$spos + $length - 2]) | ord($this->data[$spos + $length - 1])<<8;
                    $columns     = $colLast - $colFirst + 1;
                    $tmppos = $spos+4;
                    for ($i = 0; $i < $columns; $i++) {
                        $numValue = $this->_GetIEEE754($this->_GetInt4d($this->data, $tmppos + 2));
                        if ($this->isDate($tmppos-4)) {
                            list($string, $raw) = $this->createDate($numValue);
                        }else{
                            $raw = $numValue;
                            if (isset($this->_columnsFormat[$colFirst + $i + 1])){
                                        $this->curformat = $this->_columnsFormat[$colFirst + $i + 1];
                                }
                            $string = sprintf($this->curformat, $numValue * $this->multiplier);
                        }
                    //$rec['rknumbers'][$i]['xfindex'] = ord($rec['data'][$pos]) | ord($rec['data'][$pos+1]) << 8;
                    $tmppos += 6;
                    $this->addcell($row, $colFirst + $i, $string, $raw);
                    //echo "MULRK $row ".($colFirst + $i)." $string\n";
                    }
                    //MulRKRecord($r);
                    // Get the individual cell records from the multiple record
                    //$num = ;

                    break;
                case Spreadsheet_Excel_Reader_Type_NUMBER:
                    $row     = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent
                    if ($this->isDate($spos)) {
                        list($string, $raw) = $this->createDate($tmp['double']);
                    // $this->addcell(DateRecord($r, 1));
                    }else{
                        //$raw = $tmp[''];
                        if (isset($this->_columnsFormat[$column + 1])){
                                $this->curformat = $this->_columnsFormat[$column + 1];
                        }
                        $raw = $this->createNumber($spos);
                        $string = sprintf($this->curformat, $raw * $this->multiplier);

                    // $this->addcell(NumberRecord($r));
                    }
                    $this->addcell($row, $column, $string, $raw);
                    //echo "Number $row $column $string\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_FORMULA:
                case Spreadsheet_Excel_Reader_Type_FORMULA2:
                    $row     = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    if ((ord($this->data[$spos+6])==0) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) {
                        //String formula. Result follows in a STRING record
                        //echo "FORMULA $row $column Formula with a string<br>\n";
                    } elseif ((ord($this->data[$spos+6])==1) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) {
                        //Boolean formula. Result is in +2; 0=false,1=true
                    } elseif ((ord($this->data[$spos+6])==2) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) {
                        //Error formula. Error code is in +2;
                    } elseif ((ord($this->data[$spos+6])==3) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) {
                        //Formula result is a null string.
                    } else {
                        // result is a number, so first 14 bytes are just like a _NUMBER record
                        $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent
                        if ($this->isDate($spos)) {
                            list($string, $raw) = $this->createDate($tmp['double']);
                        // $this->addcell(DateRecord($r, 1));
                        }else{
                            //$raw = $tmp[''];
                            if (isset($this->_columnsFormat[$column + 1])){
                                    $this->curformat = $this->_columnsFormat[$column + 1];
                            }
                            $raw = $this->createNumber($spos);
                            $string = sprintf($this->curformat, $raw * $this->multiplier);
   
                        // $this->addcell(NumberRecord($r));
                        }
                        $this->addcell($row, $column, $string, $raw);
                        //echo "Number $row $column $string\n";
                    }
                    break;                    
                case Spreadsheet_Excel_Reader_Type_BOOLERR:
                    $row     = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    $string = ord($this->data[$spos+6]);
                    $this->addcell($row, $column, $string);
                    //echo 'Type_BOOLERR '."\n";
                    break;
                case Spreadsheet_Excel_Reader_Type_ROW:
                case Spreadsheet_Excel_Reader_Type_DBCELL:
                case Spreadsheet_Excel_Reader_Type_MULBLANK:
                    break;
                case Spreadsheet_Excel_Reader_Type_LABEL:
                    $row     = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
                    $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
                    $this->addcell($row, $column, substr($this->data, $spos + 8, ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8));

                // $this->addcell(LabelRecord($r));
                    break;

                case Spreadsheet_Excel_Reader_Type_EOF:
                    $cont = false;
                    break;
                default:
                    //echo ' unknown :'.base_convert($r['code'],10,16)."\n";
                    break;

            }
            $spos += $length;
        }

        if (!isset($this->sheets[$this->sn]['numRows']))
            $this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow'];
        if (!isset($this->sheets[$this->sn]['numCols']))
            $this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol'];

    }

    function isDate($spos){
        //$xfindex = GetInt2d(, 4);
        $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;
        //echo 'check is date '.$xfindex.' '.$this->formatRecords['xfrecords'][$xfindex]['type']."\n";
        //var_dump($this->formatRecords['xfrecords'][$xfindex]);
        if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'date') {
            $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format'];
            $this->rectype = 'date';
            return true;
        } else {
            if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'number') {
                $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format'];
                $this->rectype = 'number';
                if (($xfindex == 0x9) || ($xfindex == 0xa)){
                    $this->multiplier = 100;
                }
            }else{
                $this->curformat = $this->_defaultFormat;
                $this->rectype = 'unknown';
            }
            return false;
        }
    }

    function createDate($numValue){
        if ($numValue > 1){
            $utcDays = $numValue - ($this->nineteenFour ? Spreadsheet_Excel_Reader_utcOffsetDays1904 : Spreadsheet_Excel_Reader_utcOffsetDays);
            $utcValue = round($utcDays * Spreadsheet_Excel_Reader_msInADay);
            $string = date ($this->curformat, $utcValue);
            $raw = $utcValue;
        }else{
            $raw = $numValue;
            $hours = floor($numValue * 24);
            $mins = floor($numValue * 24 * 60) - $hours * 60;
            $secs = floor($numValue * Spreadsheet_Excel_Reader_msInADay) - $hours * 60 * 60 - $mins * 60;
            $string = date ($this->curformat, mktime($hours, $mins, $secs));
        }
        return array($string, $raw);
    }

    function createNumber($spos){
        $rknumhigh = $this->_GetInt4d($this->data, $spos + 10);
        $rknumlow = $this->_GetInt4d($this->data, $spos + 6);
        //for ($i=0; $i<8; $i++) { echo ord($this->data[$i+$spos+6]) . " "; } echo "<br>";
        $sign = ($rknumhigh & 0x80000000) >> 31;
        $exp = ($rknumhigh & 0x7ff00000) >> 20;
        $mantissa = (0x100000 | ($rknumhigh & 0x000fffff));
        $mantissalow1 = ($rknumlow & 0x80000000) >> 31;
        $mantissalow2 = ($rknumlow & 0x7fffffff);
        $value = $mantissa / pow( 2 , (20- ($exp - 1023)));
        if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023)));
        $value += $mantissalow2 / pow (2 , (52 - ($exp - 1023)));
        //echo "Sign = $sign, Exp = $exp, mantissahighx = $mantissa, mantissalow1 = $mantissalow1, mantissalow2 = $mantissalow2<br>\n";
        if ($sign) {$value = -1 * $value;}
        return $value;
    }

    function addcell($row, $col, $string, $raw = ''){
        //echo "ADD cel $row-$col $string\n";
        $this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset);
        $this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset);
        $this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string;
        if ($raw)
            $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['raw'] = $raw;
        if (isset($this->rectype))
            $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['type'] = $this->rectype;

    }


    function _GetIEEE754($rknum){
        if (($rknum & 0x02) != 0) {
                $value = $rknum >> 2;
        } else {
//mmp
// first comment out the previously existing 7 lines of code here
//                 $tmp = unpack("d", pack("VV", 0, ($rknum & 0xfffffffc)));
//                 //$value = $tmp[''];
//                 if (array_key_exists(1, $tmp)) {
//                     $value = $tmp[1];
//                 } else {
//                     $value = $tmp[''];
//                 }
// I got my info on IEEE754 encoding from
// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
// The RK format calls for using only the most significant 30 bits of the
// 64 bit floating point value. The other 34 bits are assumed to be 0
// So, we use the upper 30 bits of $rknum as follows...
        $sign = ($rknum & 0x80000000) >> 31;
        $exp = ($rknum & 0x7ff00000) >> 20;
        $mantissa = (0x100000 | ($rknum & 0x000ffffc));
        $value = $mantissa / pow( 2 , (20- ($exp - 1023)));
        if ($sign) {$value = -1 * $value;}
//end of changes by mmp        

        }

        if (($rknum & 0x01) != 0) {
            $value /= 100;
        }
        return $value;
    }

    function _encodeUTF16($string){
        $result = $string;
        if ($this->_defaultEncoding){
            switch ($this->_encoderFunction){
                case 'iconv' :
                    //$result = iconv('UTF-16LE', 'UTF-16LE//IGNORE', $string);
                    $result = @iconv('UTF-16LE', $this->_defaultEncoding, $string);
                    break;
                case 'mb_convert_encoding' :    
                    $result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' );
                    break;
            }
        }
        return $result;
    }

    function _GetInt4d($data, $pos) {
        return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
    }

}

?>

[Excel/oleread.inc]
<?php
define('NUM_BIG_BLOCK_DEPOT_BLOCKS_POS', 0x2c);
define('SMALL_BLOCK_DEPOT_BLOCK_POS', 0x3c);
define('ROOT_START_BLOCK_POS', 0x30);
define('BIG_BLOCK_SIZE', 0x200);
define('SMALL_BLOCK_SIZE', 0x40);
define('EXTENSION_BLOCK_POS', 0x44);
define('NUM_EXTENSION_BLOCK_POS', 0x48);
define('PROPERTY_STORAGE_BLOCK_SIZE', 0x80);
define('BIG_BLOCK_DEPOT_BLOCKS_POS', 0x4c);
define('SMALL_BLOCK_THRESHOLD', 0x1000);
// property storage offsets
define('SIZE_OF_NAME_POS', 0x40);
define('TYPE_POS', 0x42);
define('START_BLOCK_POS', 0x74);
define('SIZE_POS', 0x78);
define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1));

//echo 'ROOT_START_BLOCK_POS = '.ROOT_START_BLOCK_POS."\n";

//echo bin2hex($data[ROOT_START_BLOCK_POS])."\n";
//echo "a=";
//echo $data[ROOT_START_BLOCK_POS];
//function log

function GetInt4d($data, $pos) {
        return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
}


class OLERead {
    var $data = '';
   
   
    function OLERead(){
       
       
    }
   
    function read($sFileName){
       
        // check if file exist and is readable (Darko Miljanovic)
        if(!is_readable($sFileName)) {
            $this->error = 1;
            return false;
        }
       
        $this->data = @file_get_contents($sFileName);
        if (!$this->data) {
            $this->error = 1;
            return false;
            }
            //echo IDENTIFIER_OLE;
            //echo 'start';
            if (substr($this->data, 0, 8) != IDENTIFIER_OLE) {
            $this->error = 1;
            return false;
            }
        $this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS);
        $this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS);
        $this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS);
        $this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS);
        $this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS);
       
    /*
        echo $this->numBigBlockDepotBlocks." ";
        echo $this->sbdStartBlock." ";
        echo $this->rootStartBlock." ";
        echo $this->extensionBlock." ";
        echo $this->numExtensionBlocks." ";
        */
        //echo "sbdStartBlock = $this->sbdStartBlock\n";
        $bigBlockDepotBlocks = array();
        $pos = BIG_BLOCK_DEPOT_BLOCKS_POS;
    // echo "pos = $pos";
    $bbdBlocks = $this->numBigBlockDepotBlocks;
       
            if ($this->numExtensionBlocks != 0) {
                $bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4;
            }
       
        for ($i = 0; $i < $bbdBlocks; $i++) {
            $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
            $pos += 4;
        }
       
       
        for ($j = 0; $j < $this->numExtensionBlocks; $j++) {
            $pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE;
            $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1);

            for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) {
                $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
                $pos += 4;
            }

            $bbdBlocks += $blocksToRead;
            if ($bbdBlocks < $this->numBigBlockDepotBlocks) {
                $this->extensionBlock = GetInt4d($this->data, $pos);
            }
        }

    // var_dump($bigBlockDepotBlocks);
       
        // readBigBlockDepot
        $pos = 0;
        $index = 0;
        $this->bigBlockChain = array();
       
        for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) {
            $pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE;
            //echo "pos = $pos";    
            for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) {
                $this->bigBlockChain[$index] = GetInt4d($this->data, $pos);
                $pos += 4 ;
                $index++;
            }
        }

    //var_dump($this->bigBlockChain);
        //echo '=====2';
        // readSmallBlockDepot();
        $pos = 0;
        $index = 0;
        $sbdBlock = $this->sbdStartBlock;
        $this->smallBlockChain = array();
   
        while ($sbdBlock != -2) {
   
        $pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE;
   
        for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) {
            $this->smallBlockChain[$index] = GetInt4d($this->data, $pos);
            $pos += 4;
            $index++;
        }
   
        $sbdBlock = $this->bigBlockChain[$sbdBlock];
        }

       
        // readData(rootStartBlock)
        $block = $this->rootStartBlock;
        $pos = 0;
        $this->entry = $this->__readData($block);
       
        /*
        while ($block != -2) {
            $pos = ($block + 1) * BIG_BLOCK_SIZE;
            $this->entry = $this->entry.substr($this->data, $pos, BIG_BLOCK_SIZE);
            $block = $this->bigBlockChain[$block];
        }
        */
        //echo '==='.$this->entry."===";
        $this->__readPropertySets();

    }
   
    function __readData($bl) {
        $block = $bl;
        $pos = 0;
        $data = '';
       
        while ($block != -2) {
            $pos = ($block + 1) * BIG_BLOCK_SIZE;
            $data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE);
            //echo "pos = $pos data=$data\n";    
        $block = $this->bigBlockChain[$block];
        }
        return $data;
    }
       
    function __readPropertySets(){
        $offset = 0;
        //var_dump($this->entry);
        while ($offset < strlen($this->entry)) {
            $d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE);
           
            $nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8);
           
            $type = ord($d[TYPE_POS]);
            //$maxBlock = strlen($d) / BIG_BLOCK_SIZE - 1;
       
            $startBlock = GetInt4d($d, START_BLOCK_POS);
            $size = GetInt4d($d, SIZE_POS);
       
            $name = '';
            for ($i = 0; $i < $nameSize ; $i++) {
            $name .= $d[$i];
            }
           
            $name = str_replace("\x00", "", $name);
           
            $this->props[] = array (
                'name' => $name,
                'type' => $type,
                'startBlock' => $startBlock,
                'size' => $size);

            if (($name == "Workbook") || ($name == "Book")) {
                $this->wrkbook = count($this->props) - 1;
            }

            if ($name == "Root Entry") {
                $this->rootentry = count($this->props) - 1;
            }
           
            //echo "name ==$name=\n";

           
            $offset += PROPERTY_STORAGE_BLOCK_SIZE;
        }
       
    }
   
   
    function getWorkBook(){
        if ($this->props[$this->wrkbook]['size'] < SMALL_BLOCK_THRESHOLD){
//         getSmallBlockStream(PropertyStorage ps)

            $rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']);
           
            $streamData = '';
            $block = $this->props[$this->wrkbook]['startBlock'];
            //$count = 0;
            $pos = 0;
            while ($block != -2) {
                $pos = $block * SMALL_BLOCK_SIZE;
                $streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE);

                $block = $this->smallBlockChain[$block];
            }
           
            return $streamData;
           

        }else{
       
            $numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE;
            if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) {
                $numBlocks++;
            }
           
            if ($numBlocks == 0) return '';
           
            //echo "numBlocks = $numBlocks\n";
        //byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE];
            //print_r($this->wrkbook);
            $streamData = '';
            $block = $this->props[$this->wrkbook]['startBlock'];
            //$count = 0;
            $pos = 0;
            //echo "block = $block";
            while ($block != -2) {
            $pos = ($block + 1) * BIG_BLOCK_SIZE;
            $streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE);
            $block = $this->bigBlockChain[$block];
            }
            //echo 'stream'.$streamData;
            return $streamData;
        }
    }
   
}
?>

[Excel.Application.test1.php]
<?php
$excel_app = new COM("Excel.application") or Die ("Error");
$Workbook = $excel_app->Workbooks->Open("C:\Documents and Settings\Master\Excel\test.xls") or Die("Error");
$Worksheet = $Workbook->Worksheets("sheet1");
$Worksheet->activate;
$excel_cell = $Worksheet->Range("D3");
$excel_cell->activate;
echo $excel_cell->value;
$Workbook->Save();
$Workbook->Saved = true;
$Workbook->Close;
unset($Worksheet);
unset($Workbook);
$excel_app->Workbooks->Close();
$excel_app->Quit();
unset($excel_app);
?>

[Excel.Application.test2.php]
<?php
$excel = new COM("Excel.Application") or die("Error");
$excel->Visible = 0;
$excel->DisplayAlerts = 0;
$excel->Workbooks->Open("C:\Documents and Settings\Master\Excel\test.xls") or Die("Error");
$book = $excel->Workbooks(1);
$sheet = $book->Worksheets(1);
$name = "New Sheet";
$sheets2 = $book->Worksheets->add();
$sheets2->activate;
$sheets2->name = $name;
$file_name = "C:\Documents and Settings\Master\Excel\sample.xls";
if (file_exists($file_name)) unlink($file_name);
$excel->Workbooks[1]->SaveAs($file_name);
$excel->Quit();
$excel->Release();
$excel = null;
?>

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info/561
2009/01/17 12:14 2009/01/17 12:14

댓글을 달아 주세요

  1. 사리동 2009/02/02 11:47  댓글주소  수정/삭제  댓글쓰기

    한글을 사용하려면, 인코딩으로 뭘줘야할까요?
    웬만한 인코딩은 넣어봤는데 안되어서 댓글남겨봅니다.
    감사합니다.

아래 소개된 코드는 PHP 웹개발 스크립트 언어로 이미지를 다루는 방법에 대해 파악해 볼 수 있는 썸네일(thumbnail)을 생성하는 PHP 함수 소스 코드 입니다. 허용하는 이미지 포멧은 GIF, JPEG, PNG, BMP 포멧이며 파라메터로 넘기는 가로, 세로 값에 의해 생성되는 섬네일의 크기를 결정합니다. 섬네일로 생성할 파일명을 마지막 파라메터로 넘겨줄 경우 넘겨준 파일명으로 섬네일을 생성하며 파라메터가 없는 경우 바로 출력 합니다. 프로그래밍 스타일에 따라 아래 코드를 수정해 보거나 좀더 세련되게 업그레이드 해보면 학습에 도움이 될 것입니다.

<?
make_thumbnail(
"http://hompy.info/attach/1/1166220204.jpg", 100, 80, "");
function make_thumbnail($source_file, $_width, $_height, $object_file){
    list($img_width,$img_height, $type) = getimagesize($source_file);
    if ($type==1) $img_sour = imagecreatefromgif($source_file);
    else if ($type==2 ) $img_sour = imagecreatefromjpeg($source_file);
    else if ($type==3 ) $img_sour = imagecreatefrompng($source_file);
    else if ($type==15) $img_sour = imagecreatefromwbmp($source_file);
    else return false;
    if ($img_width > $img_height) {
        $width = round($_height*$img_width/$img_height);
        $height = $_height;
    } else {
        $width = $_width;
        $height = round($_width*$img_height/$img_width);
    }
    if ($width < $_width) {
        $width = round(($height + $_width - $width)*$img_width/$img_height);
        $height = round(($width + $_width - $width)*$img_height/$img_width);
    } else if ($height < $_height) {
        $height = round(($width + $_height - $height)*$img_height/$img_width);
        $width = round(($height + $_height - $height)*$img_width/$img_height);
    }
    $x_last = round(($width-$_width)/2);
    $y_last = round(($height-$_height)/2);
    if ($img_width < $_width || $img_height < $_height) {
        $img_last = imagecreatetruecolor($_width, $_height);
        $x_last = round(($_width - $img_width)/2);
        $y_last = round(($_height - $img_height)/2);

        imagecopy($img_last,$img_sour,$x_last,$y_last,0,0,$width,$height);
        imagedestroy($img_sour);
        $white = imagecolorallocate($img_last,255,255,255);
        imagefill($img_last, 0, 0, $white);
    } else {
        $img_dest = imagecreatetruecolor($width,$height);
        imagecopyresampled($img_dest, $img_sour,0,0,0,0,$width,$height,$img_width,$img_height);
        $img_last = imagecreatetruecolor($_width,$_height);
        imagecopy($img_last,$img_dest,0,0,$x_last,$y_last,$width,$height);
        imagedestroy($img_dest);
    }
    if ($object_file) {
        if ($type==1) imagegif($img_last, $object_file, 100);
        else if ($type==2 ) imagejpeg($img_last, $object_file, 100);
        else if ($type==3 ) imagepng($img_last, $object_file, 100);
        else if ($type==15) imagebmp($img_last, $object_file, 100);
    } else {
        if ($type==1) imagegif($img_last);
        else if ($type==2 ) imagejpeg($img_last);
        else if ($type==3 ) imagepng($img_last);
        else if ($type==15) imagebmp($img_last);
    }
    imagedestroy($img_last);
    return true;
}
?>
[생성된 섬네일]
사용자 삽입 이미지
[원본 이미지]

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
2008/12/16 08:42 2008/12/16 08:42

댓글을 달아 주세요

  1. 지돌스타 2009/03/17 15:17  댓글주소  수정/삭제  댓글쓰기

    썸네일 소스보다 저 사진에 눈이 가는것은 왜일까요? ^^

내 블로그나 홈페이지에 검색엔진을 장착해 보고 싶다면 엔진으로 스핑크스(Sphinx)를 선택해보는 것도 좋을 것 같습니다. 오픈 소스이고 PHP, Perl, C/C++, 등의 프로그래밍 언어 API 를 제공하고 있으므로 PHP 로 개발된 텍스트큐브와 같은 설치형 블로그에 검색을 붙이려면 PHP 용 API 를 이용하며 될 것입니다. 이미 텍스트큐브에도 검색이 있지만 레코드수가 많아서 검색해야할 항목이 많아질 경우 검색 시간이 많이 소요되고 복잡한 조건의 검색을 할 수 없는 문제가 있습니다. 개발언어를 다룰 수 있다는 조건 하에 스핑크스 검색엔진을 사용해볼 것을 권해봅니다.
스핑크스 검색엔진이 어떤 것인지 체험 해보려면 간단히 아래에 설명하는 방법으로 설치하고 테스트 해보면 됩니다. 참고로 리눅스 CetOS 5.x 에서 테스트 되었습니다. 물론 소스 코드가 공개 되어 있으므로 윈도우즈와 다른 리눅스, 유닉스 계열 OS 를 사용할 수 있습니다.

[root@sphinx ~]# yum -y install mysql-devel
[root@sphinx ~]# cd /usr/local/src
[root@sphinx src]# wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
[root@sphinx src]# tar xvzf sphinx-0.9.8.1.tar.gz
[root@sphinx src]# cd sphinx-0.9.8.1
[root@sphinx sphinx-0.9.8.1]# ./configure
[root@sphinx sphinx-0.9.8.1]# make
[root@sphinx sphinx-0.9.8.1]# make install

위와 같이 설치하면 아래와 같은 스핑크스 관련 파일들이 기본 폴더(/usr/local/bin)에 설치됩니다.

  /usr/local/bin/indexer
  /usr/local/bin/searchd
  /usr/local/bin/search
  /usr/local/bin/spelldump

또한 아래와 같은 설정 파일 샘플과 MySQL 용 SQL 샘플이 설치됩니다.

 /usr/local/etc/sphinx.conf.dist
 /usr/local/etc/sphinx-min.conf.dist
 /usr/local/etc/example.sql

MySQL 에 접속해서 테스트용 데이타베이스(test) 를 만들고 user 와 password 를 만들고 이 데이타베이스(test)에 권한을 부여 합니다. test로 데이타베이스를 정할 경우 이미 생성되 있으므로 권한 부여만 합니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 116
Server version: 5.0.45 Source distribution
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql> grant all privileges on test.* to user@"localhost" identified by "password";
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
mysql> exit
Bye
[root@sphinx sphinx-0.9.8.1]#

데이타베이스 설정이 완료 되었으면 스핑크스 셋팅 파일을 만들어줍니다.

[root@sphinx sphinx-0.9.8.1]# vi /usr/local/etc/sphinx-min.conf.dist
[root@sphinx sphinx-0.9.8.1]# cp /usr/local/etc/sphinx-min.conf.dist /usr/local/etc/sphinx.conf
[root@sphinx sphinx-0.9.8.1]# cat /usr/local/etc/sphinx.conf
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
source src1
{
        type                                    = mysql
 
        sql_host                                = localhost
        sql_user                                = user
        sql_pass                               = password
        sql_db                                  = test
        sql_port                                = 3306  # optional, default is 3306
 
        sql_query                               = \
                SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
                FROM documents
 
        sql_attr_uint                   = group_id
        sql_attr_timestamp              = date_added
 
        sql_query_info                  = SELECT * FROM documents WHERE id=$id
}
index test1
{
        source                                  = src1
        path                                    = /var/data/test1
        docinfo                                 = extern
        charset_type                    = sbcs
}
indexer
{
        mem_limit                               = 32M
}
searchd
{
        port                                    = 3312
        log                                             = /var/log/searchd.log
        query_log                               = /var/log/query.log
        read_timeout                    = 5
        max_children                    = 30
        pid_file                                = /var/log/searchd.pid
        max_matches                             = 1000
        seamless_rotate                 = 1
        preopen_indexes                 = 0
        unlink_old                              = 1
}
[root@sphinx sphinx-0.9.8.1]#

나의 데이타베이스 설정에 맞게 위와 같이 설정이 완료되면 아래와 같이 스핑크스에서 제공하는 샘플 테이블을 MySQL 에 만들어줍니다. 그리고 커멘드라인 프로그램 indexer 를 실행해서 검색을 위한 인덱스를 생성합니다. 인덱싱이 완료 되면 커멘드라인 프로그램 search 를 실행해서 검색을 할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p test < /usr/local/etc/example.sql
Enter password: ********
[root@sphinx sphinx-0.9.8.1]# mkdir /var/data
[root@sphinx sphinx-0.9.8.1]# indexer test1
[root@sphinx sphinx-0.9.8.1]# search number
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
index 'test1': query 'number ': returned 3 matches of 3 total in 0.000 sec
 
displaying matches:
1. document=1, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=1
        group_id=1
        group_id2=5
        date_added=2008-12-06 11:42:12
        title=test one
        content=this is my test document number one. also checking search within phrases.
2. document=2, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=2
        group_id=1
        group_id2=6
        date_added=2008-12-06 11:42:12
        title=test two
        content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Sat Dec  6 11:42:12 2008
        id=4
        group_id=2
        group_id2=8
        date_added=2008-12-06 11:42:12
        title=doc number four
        content=this is to test groups
 
words:
1. 'number': 3 documents, 3 hits
 
[root@sphinx sphinx-0.9.8.1]#

위와 같이 인덱싱이 완료되고 search 커멘드라인 명령어를 이용해 "number" 라는 검색어(키워드)로 검색하면 검색결과 3개의 문서가 검색되었다고 알려줍니다.
PHP 로 검색엔진을 제어하기 위해 아래와 같이 검색 데몬(searchd)을 띄우고 PHP 용 API 를 이용해서 검색할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# /usr/local/bin/searchd
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
creating server socket on 0.0.0.0:3312
[root@sphinx sphinx-0.9.8.1]# cd api
[root@sphinx api]# php test.php number
Query 'number ' retrieved 3 of 3 matches in 0.000 sec.
Query stats:
    'number' found 3 times in 3 documents
 
Matches:
1. doc_id=4, weight=100, group_id=2, date_added=2008-12-06 11:42:12
2. doc_id=1, weight=1, group_id=1, date_added=2008-12-06 11:42:12
3. doc_id=2, weight=1, group_id=1, date_added=2008-12-06 11:42:12
[root@sphinx api]#

위와 같이 검색 데몬 searchd 를 띄우고 샘플 PHP 소스 파일 test.php 를 실행하면 검색 결과를 확인할 수 있습니다. 샘플 소스 상단을 보면 sphinxapi.php 라는 파일을 Include 합니다. 이것이 PHP 용 API 입니다.

간단하게 스핑크스를 설치하고 테스트도 해봤습니다. 이제 내 블로그 데이터를 인덱싱하고 이를 검색할 수 있도록 검색 페이지를 만드는 일만 남았습니다.

오픈 소스 검색 엔진 스핑크스(Sphinx) 홈페이지
    - http://www.sphinxsearch.com/
스핑크스(Sphinx)로 PHP로 커스텀 검색 엔진 구현하기
    - http://www.ibm.com/developerworks/kr/library/os-php-sphinxsearch/index.html

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
2008/12/06 12:02 2008/12/06 12:02

댓글을 달아 주세요

  1. heyjae 2009/03/03 10:11  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다. :)
    그런데 이 검색엔진, 한글은 어떤가요?
    오픈소스들의 가장 큰 난제가 한글 검색이 원활하게 되느냐일텐데...

텍스트큐브에서 트랙백 주소 복사 기능에 사용하고 있는 클립보드 복사 기능 구현을 위한 소스 코드입니다. 관련된 소스 코드만 추려낸 것으로 플래시 액션 스크립트 clipboardPoter.as 와 자바스크립트 copy2clipboard.js 그리고 실제 홈페이지에 적용가능한 예제 웹문서 copy2clipboard.html 으로 구성하였습니다.
웹문서에서 자바스크립트 메소드를 이용해서 클립보드 복사가 가능하지만 보안창이 뜨기 때문에 사용자 입장에서 불편함이 있으므로 이를 우회하기 위해 요즘 보편적으로 깔려있는 플래시 환경을 이용하고 있습니다. 플래시 액션스크립트에서 System.setClipboard 메소드를 이용해서 클립보드 복사 기능을 구현하고 있고 플래시 환경이 아닐경우 기존 자바스크립트 복사 메소드 window.clipboardData.setData 를 이용하고 있습니다. 그리고 플래시와 자바스크립트 사이의 통신을 위해 addCallback 메소드를 사용하고 있습니다.
구현 원리에 대해 이해가 되셨으면 아래 소스 코드를 찬찬히 살펴보시고 실무에 적용해보실 수 있습니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info

[clipboardPoter.as]

function setClipBoard(str) {
        System.setClipboard(str);
        flash.external.ExternalInterface.call(callback, true);
}
System.security.allowDomain("*");
var methodName = "setClipBoard";
var instance = null;
var method = setClipBoard;
var wasSuccessful = flash.external.ExternalInterface.addCallback(methodName, instance, method);


[copy2clipboard.js]

function document_write(s){
    document.write(document.getElementById(s).value);
}
var sUserAgent = navigator.userAgent;
var isOpera = sUserAgent.indexOf("Opera") > -1;
var isIE = sUserAgent.indexOf("compatible") > -1
        && sUserAgent.indexOf("MSIE") > -1
        && !isOpera;
function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
    return document.getElementById(movieName);
    }
    else {
    return document[movieName];
    }
}
function copyUrl(url) {
    try {
        thisMovie('clipboardPoter').setClipBoard(url);
    } catch(e) {
        if(isIE) {
            window.clipboardData.setData('Text',url);
            window.alert("주소가 복사되었습니다.");
        }
    }
}
function onClipBorad(result) {
    alert(result ? "주소가 복사되었습니다." : "주소 복사를 실패했습니다.");
}


[copy2clipboard.html]

<script type='text/javascript'>
window.clipboardPoter = document.getElementById("clipboardPoter");
</script>

<span onclick="copyUrl('http://hompy.info/504')" style="cursor:pointer">http://hompy.info/504</span>

<div style="position:absolute;top:0;left:0; background-color:transparent;background-image:none">
<textarea id="flash_copy_to_clipboard" style="display:none;" rows="0" cols="0">
<OBJECT id="clipboardPoter" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="1" height="1"><param name="src" value="/swf/clipboardPoter.swf"/><param name="movie" value="/swf/clipboardPoter.swf"/><param name="wmode" value="transparent"><param name="allowscriptaccess" value="always"><param name="flashvars" value="callback=onClipBorad"><EMBED name="clipboardPoter" pluginspage="http://www.macromedia.com/go/getflashplayer" src="/swf/clipboardPoter.swf" width="1" height="1" type="application/x-shockwave-flash" quality="high" wmode="transparent" FlashVars="callback=onClipBorad" allowscriptaccess="always"></EMBED></OBJECT></textarea><script type='text/javascript'>document_write('flash_copy_to_clipboard');</script>
</div>

[참고자료]
Flash 8에서 ExternalInterface 사용하기 http://cafe.naver.com/q69/115048
2008/09/27 12:37 2008/09/27 12:37

댓글을 달아 주세요

  1. 김지선 2010/04/04 22:56  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다~~

내 홈페이지의 동시 접속자수는 몇명이나 될지 궁금할 때가 있습니다. 이런 필요로 동시 접속자수를 알려주는 위젯도 있고 제 블로그에서도 플래시 위젯으로 동시 접속자수를 알려주는 위젯을 제공하고 있기도 합니다. 그러나 직접 만들어서 동시접속자를 알려주는 것이 좀더 매력적이라고 생각하는 분들이 있다면 아래 소스 코드를 참고 하세요.^^
웹서비스의 특성상 완벽한 동시접속자를 알아 낼 수 없으므로 약간의 편법이 필요합니다. 웹서비스는 요청한 웹페이지를 내보내주고 접속을 끊으므로 같은 사용자라는 것을 알려주는 세션(session)을 발행합니다. 세션이 같으면 같은 사용자라고 볼 수 있습니다. 이 세션을 구분하는 ID 와 카운트 하고 있는 페이지(page) URL 그리고 시간(ctime)을 기록하고 현재 시간을 기준으로 적당한 시간(30초 ~ 60초) 이내에 있는 기록만 남기고 삭제 합니다. 그러면 남아 있는 레코드의 갯수가 동시 접속자수가 됩니다. 이런 작업을 하기 위해 데이타베이스에 아래와 같은 테이블을 만들고 세션 ID(session)는 주키로 시간(ctime)을 인덱스로 만듭니다.

CREATE TABLE abc_siteon (
    session varchar(64) NOT NULL default '',
    page varchar(255) default '',
    ctime datetime default NULL,
    PRIMARY KEY (session),
    KEY ctime (ctime)
)

그리고 아래와 같은 페이지(siteon_counter.php)를 만들고 원하는 홈페이지에 보이지 않는 이미지로 출력합니다. 또는 해당 홈페이지의 로고(images/siteon.gif)를 출력하거나 GD 라이브러리를 사용할 수 있는 분들은 아래 소스 마지막 라인에 이미지 출력 대신 레코드의 갯수를 숫자 이미지로 출력해주는 코드를 입력하실 수 있습니다.

<?
session_start();
$connect = @mysql_connect("localhost", "user", "password") or die("");
@mysql_select_db("database") or die("");
@mysql_query("set names utf8");
//mysql_query("set names latin1");
//mysql_query("set names euckr");
$table_name = 'abc_siteon';
$session_id = session_id();
$page = $_SERVER['HTTP_REFERER'];
if (strlen($page)<1) $page="direct";
$query = "insert into $table_name set session='$session_id'";
@mysql_query($query);
$query = "update $table_name set page='$page', ctime=now() where session='$session_id'";
@mysql_query($query);
$query = "delete from $table_name where ctime < DATE_SUB(NOW(), INTERVAL 60 SECOND)";
@mysql_query($query);
@readfile("images/siteon.gif");
?>

<img
src="/siteon_counter.php" width="1" height="1">


아래의 소스 코드(siteon.php)를 이용해 노출하고 싶은 홈페이지의 적당한 위치에 동시 접속자수를 표시해주면 동접자 구현이 완료됩니다.

<?
$connect = @mysql_connect("localhost", "user", "password") or die("");
@mysql_select_db("database") or die("");
@mysql_query("set names utf8");
$table_name = 'abc_siteon';
$query = "select count(*) total from $table_name";
$result = mysql_query($query);
$total = 0;
if ($result) {
    $row = mysql_fetch_row($result);
    if ($row) {
        $total = intval($row[0]);
    }
}
echo "동접 ".$total."명";
?>

관리자 페이지에 현재 레코드 현황을 확인할 수 있는 페이지를 만들고 페이지별 동접자수를 확인할 수 있도록 하는 것도 유용합니다. 그리고 리눅스/유닉스용 스캐쥴러인 크론(cron)을 이용해서 1분마다 동접자수를 기록하고 이를 그래프화 하면 홈페이지 트래픽을 보기좋게 파악할 수 있는 유용한 홈페이지 관리 도구가 됩니다. PHP 초급자도 파악할 수 있는 수준으로 소스 코드가 작성되었으므로 차근 차근 소스 코드를 살펴보시면 이해가 될 것이라 생각합니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
2008/09/16 08:06 2008/09/16 08:06

댓글을 달아 주세요

  1. 지나가다가 2008/10/03 10:14  댓글주소  수정/삭제  댓글쓰기

    동접자수를 구하는데 있어서 Windows 가 아닌 Linux, Unix 환경에서는 구지 CRON, DB 까지 사용하지 않아도 PHP 에서 제공하는 세션함수만으로 구현이 가능합니다.

  2. 초보개발자 2008/09/26 17:13  댓글주소  수정/삭제  댓글쓰기

    오늘 검색하다가 처음 알게되었습니다. 바로 즐찾했습니다.
    미칠듯한 방대한 자료. 많이 얻어가겠습니다.

  3. 활의노래 2008/09/16 12:23  댓글주소  수정/삭제  댓글쓰기

    아쉽게도 티스토리에선 써먹기가 힘든 방법이네요. 그래도 잘 보고 갑니다. ^^

PHP에서 GD 라이브러리를 활용해서 썸네일을 만들어주는 함수의 소스 코드입니다. 홈페이지를 만들다 보면 사진첩과 같이 이미지를 다수 노출해야 되는 페이지를 구성할 때 필요한 것이 썸네일이며 이를 이용하면 페이지의 로딩 속도를 향상시켜 주며 원본 이미지를 작게 보여줄 때 좀더 선명하게 표현해줄 수 있습니다. 자신의 필요에 맞게 함수를 구성할 수 있는 분이 아니라면 복사해서 활용해보시면 되겠습니다. 함수 파라메터 끝에는 썸네일을 저장할 파일 경로를 입력하시면 되고 경로를 입력하지 않으면 바로 출력됩니다.

make_thumbnail("원본이미지파일경로", 83, 100, "저장할썸네일파일경로");

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
<?
make_thumbnail("http://hompy.info/attach/1/1196323499.jpg", 83, 100, "");

function make_thumbnail($source_path, $width, $height, $thumbnail_path){
    list($img_width,$img_height, $type) = getimagesize($source_path);
    if ($type!=1 && $type!=2 && $type!=3 && $type!=15) return;
    if ($type==1) $img_sour = imagecreatefromgif($source_path);
    else if ($type==2 ) $img_sour = imagecreatefromjpeg($source_path);
    else if ($type==3 ) $img_sour = imagecreatefrompng($source_path);
    else if ($type==15) $img_sour = imagecreatefromwbmp($source_path);
    if ($img_width > $img_height) {
        $w = round($height*$img_width/$img_height);
        $h = $height;
        $x_last = round(($w-$width)/2);
        $y_last = 0;
    } else {
        $w = $width;
        $h = round($width*$img_height/$img_width);
        $x_last = 0;
        $y_last = round(($h-$height)/2);
    }
    if ($img_width < $width && $img_height < $height) {
        $img_last = imagecreatetruecolor($width, $height);
        $x_last = round(($width - $img_width)/2);
        $y_last = round(($height - $img_height)/2);

        imagecopy($img_last,$img_sour,$x_last,$y_last,0,0,$w,$h);
        imagedestroy($img_sour);
        $white = imagecolorallocate($img_last,255,255,255);
        imagefill($img_last, 0, 0, $white);
    } else {
        $img_dest = imagecreatetruecolor($w,$h);
        imagecopyresampled($img_dest, $img_sour,0,0,0,0,$w,$h,$img_width,$img_height);
        $img_last = imagecreatetruecolor($width,$height);
        imagecopy($img_last,$img_dest,0,0,$x_last,$y_last,$w,$h);
        imagedestroy($img_dest);
    }
    if ($thumbnail_path) {
        if ($type==1) imagegif($img_last, $thumbnail_path, 100);
        else if ($type==2 ) imagejpeg($img_last, $thumbnail_path, 100);
        else if ($type==3 ) imagepng($img_last, $thumbnail_path, 100);
        else if ($type==15) imagebmp($img_last, $thumbnail_path, 100);
    } else {
        if ($type==1) imagegif($img_last);
        else if ($type==2 ) imagejpeg($img_last);
        else if ($type==3 ) imagepng($img_last);
        else if ($type==15) imagebmp($img_last);
    }
    imagedestroy($img_last);
}
?>
2008/06/26 19:50 2008/06/26 19:50

댓글을 달아 주세요

  1. 다니엘SEO 2009/12/31 00:09  댓글주소  수정/삭제  댓글쓰기

    글 작성시에 만들어 주는 용으로는 어떨지 모르겠지만...
    리스트 화면이나 메인에서 바로 변환해서 출력하는 용으로는 무리가 있습니다.
    이렇게 하면 상당히 느립니다.

공개보드 게시물을 설치형 블로그인 텍스트큐브나 태터툴즈로 복사하는 샘플 소스 코드입니다. 소스를 조금 수정해서 스케쥴링을 하면 주기적으로 게시판에 있는 글을 블로그에 포스팅할 수 있게 됩니다. 실시간으로 블로그에 글을 올려야 한다면 공개보드 스킨으로 수정해서 써도 되겠습니다. 이 소스는 그누보드를 샘플로 사용했으나 필요에 따라 제로보드 같은 다른 공개보드 또는 자신의 보드에 맞게 수정해서 사용할 수 있습니다. 그리고 RSS를 찍어준다던가 첨부파일을 추가하는 등의 기능 보완이 필요합니다. 또한 캐릭터셋이 서로 다를 경우 iconv 를 이용해서 인코딩을 해서 맞춰줄 필요가 있습니다. 이 소스와 다른 방법으로 블로그API(BlogAPI)를 이용할 수도 있습니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info

<?
/*board2blog.php */

include "global_variable.php";
include "mysql.php";

$dbsour = new mysql_class($db_info_mud4u);
$tbsour = "g4_write_news";
$dbdest = new mysql_class($db_info_blog);
$tbdest = "tc_Entries";

$b_blogid = 1;
$b_userid = 1;
$b_draft = 0;
$b_visibility = 3;
$b_contentFormatter = 'ttml';
$b_contentEditor = 'modern';
$b_location = '/';
$b_acceptComment = 1;
$b_acceptTrackback = 1;
$b_comments = 0;
$b_trackbacks = 0;

$query = "select *,UNIX_TIMESTAMP(wr_datetime) wr_unixtime,UNIX_TIMESTAMP(wr_last) wr_lasttime from $tbsour where wr_is_comment=0 order by wr_id asc";
if ($dbsour->query($query))
while ($row = $dbsour->fetch()) {
      extract($row);
      echo $wr_id . ":" . $wr_subject . "\n";

      switch($ca_name){
            case '공지사항':       $wr_category_id = 1; break;
            case '자유게시판':       $wr_category_id = 2; break;
            default: $wr_category_id = 3; break;
      }

      $b_id = 1;
      $query = "select max(id) as max from $tbdest";
      if ($dbdest->query($query))
      if ($row2 = $dbdest->fetch()) {
            $b_id = intval($row2[max]) + 1;
      }
      $b_category = $wr_category_id;
      $b_title = mysql_escape_string($wr_subject);
      $b_slogan = getSlogan($wr_subject) . "--" . $wr_id;
      $b_content = mysql_escape_string($wr_content);
      $b_password = generatePassword();
      $b_published = $wr_unixtime;
      $b_created = $wr_unixtime;
      $b_modified = $wr_lasttime;

      $query = "INSERT INTO $tbdest SET blogid='$b_blogid', userid='$b_userid', id='$b_id', draft='$b_draft', visibility='$b_visibility', category='$b_category', title='$b_title', slogan='$b_slogan', content='$b_content', contentFormatter='$b_contentFormatter', contentEditor='$b_contentEditor', location='$b_location', password='$b_password', acceptComment='$b_acceptComment', acceptTrackback='$b_acceptTrackback', published='$b_published', created='$b_created', modified='$b_modified', comments='$b_comments', trackbacks='$b_trackbacks'";
      $dbdest->query($query);
}
echo "\n";

function getSlogan($slogan) {
      $slogan = preg_replace('/-+/', ' ', $slogan);
      $slogan = preg_replace('@[!-/:-\@\[-\^`{-~]+@', '', $slogan);
      $slogan = preg_replace('/\s+/', '-', $slogan);
      $slogan = trim($slogan, '-');
      return strlen($slogan) > 0 ? $slogan : 'XFile';
}

function generatePassword() {
      return strtolower(substr(base64_encode(rand(0x10000000, 0x70000000)), 3, 8));
}
?>

<?
/* mysql.php */

class mysql_class {
      var $user_id = "";
      function __construct($db_info) {
            $this->db_info = $db_info;
            $this->ip = $db_info['host'];
            $this->db = $db_info['db'];
            $this->id = $db_info['user'];
            $this->pw = $db_info['password'];
            $this->ch = $db_info['char'];
            $this->sess = mysql_connect($this->ip, $this->id, $this->pw) or die("SQL서버에 접속할 수 없습니다.");
            mysql_select_db($this->db, $this->sess) or die("데이터베이스와의 접속에 실패하였습니다.");
            mysql_query("set names $this->ch", $this->sess);
      }
      function __destruct() {
            mysql_close($this->sess);
      }
      public function query($query){
            $this->result = mysql_query($query,$this->sess);
            return $this->result;
      }

      public function query_one($query){
            $this->result = mysql_query($query,$this->sess);
            if ($this->result) {
                  $board = mysql_fetch_array($this->result);
                  if ($board)      return $board[0];
            }
            return null;
      }

      public function fetch(){
            if ($this->result) {
                  $board = mysql_fetch_array($this->result, MYSQL_ASSOC);
                  return $board;
            }
            return null;
      }
}
?>

<?
/* global_variable.php */

$db_info_mud4u['host'] = "localhost";
$db_info_mud4u['db'] = "board";
$db_info_mud4u['user'] = "board";
$db_info_mud4u['password'] = "boardpw";
$db_info_mud4u['char'] = "utf8";

$db_info_blog['host'] = "localhost";
$db_info_blog['db'] = "blog";
$db_info_blog['user'] = "blog";
$db_info_blog['password'] = "blogpw";
$db_info_blog['char'] = "utf8";
?>

2008/05/20 08:33 2008/05/20 08:33

댓글을 달아 주세요

  1. 원반 2009/04/23 12:00  댓글주소  수정/삭제  댓글쓰기

    그누보드 게시물을 텍스트큐브로 옮기는 방법을 검색해보니 이방법밖에 없는데...
    어떻게 실행해야하는지 좀 설명부탁드리면 안될까요~? 초보자라서

몇년 전에 첨부파일이 있는 이메일을 보내기 위해 쓰던 함수입니다. 이에 대해 관심 있는 분은 2% 부족할 수 있으므로 자신의 구미에 맞게 수정해서 사용하셔야겠습니다. PHP 에 대해 아직 잘 모르거나 입문하시는 분들은 uniqid, chunk_split, base64_encode, mail 등의 함수가 무슨 기능을 하는지 레퍼런스 가이드를 참고해야겠지요. 또한 MIME(Multipurpose Internet Message Extension)에 대한 이해 또한 필요하겠습니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info

<?
function send_mail_with_file($from_email,$from_name,$to_email,$subject,$body,$file){
    if (strlen($to_email)==0) return 0;
    $mailheaders .= "From: $from_name<$from_email> \r\n";
    $mailheaders .= "Reply-To: $from_name<$from_email>\r\n";
    $mailheaders .= "Return-Path: $from_name<$from_email>\r\n";
    if ($file[size]>0) {
        $boundary = uniqid("part");
        if (strlen($file[type])==0) $file[type] = "application/octet-stream";

        $mailheaders .= "MIME-Version: 1.0\r\n";
        $mailheaders .= "Content-Type: Multipart/mixed; boundary = \"".$boundary."\"";

        $bodytext = "This is a multi-part message in MIME format.\r\n\r\n";
        $bodytext .= "--".$boundary."\r\n";
        $bodytext .= "Content-Type: text/html; charset=\"ks_c_5601-1987\"\r\n";
        $bodytext .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $bodytext .= chunk_split(base64_encode($body))."\r\n\r\n";

        $bodytext .= "--".$boundary."\r\n";
        $bodytext .= "Content-Type: ".$file[type]."; name=\"".$file[name]."\"\r\n";
        $bodytext .= "Content-Transfer-Encoding: base64\r\n";
        $bodytext .= "Content-Disposition: attachment; filename=\"".$file[name]."\"\r\n\r\n";
        $bodytext .= chunk_split(base64_encode($file[data]))."\r\n\r\n";

        $bodytext .= "--".$boundary."--";
    } else {
        $mailheaders .= "Content-Type: text/html \r\n\r\n";
        $bodytext = $body . "\r\n\r\n";
    }
    if (!mail($to_email,$subject,$bodytext,$mailheaders)) {return 0;}
    return 1;
}
?>

* 삽질할 수 있는 PHP로 이메일 보내기 샘플 소스 코드 도 참고하세요.
2008/05/16 08:59 2008/05/16 08:59

댓글을 달아 주세요

  1. 김동훈 2008/07/31 10:56  댓글주소  수정/삭제  댓글쓰기

    $file 파라메터를 어떤식으로 넘겨줘야 하는지 궁금합니다.
    그리고 제 경우에는 input type="file" 태그로 첨부하는 것이 아니라, 서버에 있는 파일을 소스안에서 지정해서 보내고 싶은데 어떻게 해야 하나요?
    답변 부탁드립니다~ ^^

홈페이지를 운영하다 보면 회원들에게 상태를 알리는 메일이나 안내 메일을 보낼 필요가 있습니다. 관리하는 홈페이지에서 이메일 전송이 제대로 안되는 문제가 발생해서 이것 저것 테스트 하기 위해 만들어본 샘플 소스 코드입니다. 이 PHP 소스를 이용해 포털 이메일 계정으로 메일을 보내 보니 대체적으로 잘 전송이 되었습니다. 그런데 엠파스나 야후 메일 같은 경우 조금 늦게 도착하는 것 같더군요. 이메일 루틴 관련해서 노하우를 가지고 계신 분이 있다면 관심 있는 분들을 위해 살짝 노출해주시길 바랍니다. UTF-8 기준으로 작성된 테스트 소스이므로 캐릭터셋이 다를 경우 수정이 필요합니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info

<?
$charset = "UTF-8";
$boundary = uniqid(rand(),true);

$mail_array[to_name] = "웹디자이너";
$mail_array[to_email] = "design@hompydesign.com";

$mail_array[from_name] = "웹프로그래머";
$mail_array[from_email] = "program@hompy.info";

$mail_array[title] = "[소식] 홈페이지 정보 블로그" . date("YmdHi");

$mail_array[content] = <<<MSG
<html>
<head>
<title>홈페이지 정보 블로그</title>
</head>
<body>
<a href='http://hompy.info/471' target='_blank'>홈페이지 정보 블로그</a><br>
<a href='http://hompy.info/471' target='_blank'>"http://hompy.info/471"</a><br>
</body>
</html>
MSG;

$mail_array[title] = '=?utf-8?b?'.base64_encode($mail_array[title]).'?=';
$mail_array[from_name] = '=?utf-8?b?'.base64_encode($mail_array[from_name]).'?=';
$mail_array[to_name] = '=?utf-8?b?'.base64_encode($mail_array[to_name]).'?=';
$recipient = $mail_array[to_name] . " <". $mail_array[to_email] . ">";

$headers =
"From: ". $mail_array[from_name] . " <".$mail_array[from_email] . ">\n" .
"Return-Path: ".$mail_array[to_name] . " <" . $mail_array[from_email] . ">\n" .
"Subject: ".$mail_array[title] . "\n" .
"MIME-Version: 1.0\n" .
"Content-Type: multipart/alternative; boundary=\"" . $boundary . "\"";

$body =
"--" . $boundary . "\n".
"Content-Type: text/plain; charset=" . $charset . "; format=flowed\n" .
"Content-Transfer-Encoding: base64\n" .
"Content-Disposition: inline\n\n" .
chunk_split(base64_encode(strip_tags($mail_array[content]))) . "\n\n" .
"--" . $boundary . "\n" .
"Content-Type: text/html; charset=" . $charset . "\n" .
"Content-Transfer-Encoding: base64\n" .
"Content-Disposition: inline\n\n" .
chunk_split(base64_encode($mail_array[content]))."\n\n" .
"--" . $boundary . "--\n";

mail($recipient , $mail_array[title], $body, $headers);
?>

2008/05/15 20:24 2008/05/15 20:24

댓글을 달아 주세요

원격지 서버 MYSQL 데이타베이스를 테이블 단위로 로컬 데이타베이스 서버로 백업과 복사를 해주는 PHP 스크립트 소스 코드입니다. 테이블명이 "tc_"로 시작하는 테이블만 복사하도록 조건문이 붙어 있습니다. 불필요하면 "tc_" 를 ""로 수정하시거나 해당 줄을 주석처리하면 되고 mysql 과 mysqldump 의 경로가 다를 수 있으므로 확인하고 다르면 수정해야합니다.
아래 소스 코드를 실행할 때, 로컬 서버 최신 데이타를 덮어버릴 수 있으므로 주의깊게 다루어야 합니다.

<?php
$check_prefix = "tc_";

$db_info['host']     = "192.168.0.10";
$db_info['db']       = "blog";
$db_info['user']     = "root";
$db_info['password'] = "password";

$db_info['date'] = date("Ymd");
if (!file_exists($db_info['date'])) mkdir($db_info['date'],0700);
$db_info['session'] = mysql_connect($db_info['host'], $db_info['user'], $db_info['password']) or die("SQL서버에 접속할 수 없습니다.");

$query = "show databases";
$out1 = mysql_query($query);
if ($out1)
while ($row1 = mysql_fetch_row($out1)) {
 echo $row1[0];
 $db_info['db'] = $row1[0];
 $db_info['outdir'] = $db_info['date'] . "/" . $row1[0];
 if (!file_exists($db_info['outdir'])) mkdir($db_info['outdir'],0700);
 $query = "show tables";
 if (mysql_select_db($row1[0])) {
  echo " +\n";
  $out2 = mysql_query($query);
  if ($out2)
  while ($row2 = mysql_fetch_row($out2)) {
   $db_info['table'] = $row2[0];
   if (strlen($check_prefix)){
    if (substr($db_info['table'],0,strlen($check_prefix))!=$check_prefix) continue;
   }
   $db_info['outfile'] = $row2[0] . ".sql";
   $db_info['outpath'] = $db_info['outdir'] . "/" . $db_info['outfile'];
   echo "\t".$row2[0]."\n";

   $str = "/usr/bin/mysqldump -h".$db_info['host']." -u".$db_info['user']." -p".$db_info['password']." ".$db_info['db']." ".$db_info['table']." > ".$db_info['outpath'];
   passthru($str);
   $str = "/usr/bin/mysql -hlocalhost -u".$db_info['user']." -p".$db_info['password']." ".$db_info['db']." < ".$db_info['outpath'];
   passthru($str);
  }
 } else {
  echo " -\n";
 }
}
?>

웹프로그래머의 홈페이지정보 블로그 http://hompy.info
2007/12/18 08:38 2007/12/18 08:38

댓글을 달아 주세요

현재 디렉토리(폴더)에 있는 파일들 목록을 보여주고 링크를 달아주는 작은 PHP+JAVASCRIPT 코드입니다. 보여줄 파일 확장자를 제한할 수 있고 선택적으로 보여줄 수 있도록 되어 있습니다. PHP 로 디렉토리와 파일들을 어떻게 다룰 수 있는 지 알 수 있는 소스코드이며 적당히 가공해서 실무에도 사용할 수도 있겠습니다.

<html>
<head>
<title>현재 폴더 페이지 목록</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<style type="text/css">
A:link {color:#3366CC; text-decoration:none;}
A:active {color:#1F3174; text-decoration:none;}
A:visited {color:#999999; text-decoration:none;}
A:hover {color:#FF9966; text-decoration:underline;}
IMG { border: 0; }
body {margin:0px; padding:0px}
span {color:#7C9CA7; font:11px 돋움; line-height:19px;}
</style>

<body leftmargin="0" topmargin="0">
<table border=0 cellpadding=0 cellspacing=0><tr>
<td width=10></td>
<?
$start_page = "page_list.php";
$ext_array = array("php", "html", "htm", "gif", "jpg", "png");
$ext_max = count($ext_array);
$path = "./";

for ($n=0;$n<$ext_max;$n++) {
 echo "<td><input type='checkbox' name='add_" . $ext_array[$n] . "' checked onclick='redisplay_page()'></td><td width=30><span>" . $ext_array[$n] . "</span></td>";
}
?>
</tr></table>

<script>
var files = Array();
<?

if ($dir = opendir($path)) {
 while ($file = readdir($dir)){
  if (is_dir($path.$file)) {
   if ($file != '.' && $file != '..') {
     if (file_exists("$file/$start_page")) {
      echo "files[files.length]='$file/$start_page';\n";
     }
   } else {
   }
  } else {
   if ($file!=$start_page){
    $name_array = pathinfo($file);
    $ext = $name_array['extension'];
    if (strlen(str_replace($ext_array,"",$ext))==0) echo "files[files.length]='$file';\n";
   }
  }
 }
 closedir($dir);
}
?>


var stagex=10,stagey=20,x,y,n,z,cellw=220,cellh=20,obj,n;

function display_page() {
 files.sort();
 var i = 0, pass;
 for (n=0;n<files.length;n++){
  temp_arr = (files[n].replace(/ /gi,"%20").replace(/\\/gi,"/")).split(".");
  temp_ext = temp_arr[temp_arr.length-1];
  pass = 0;
  switch (temp_ext){
   <?
   for ($n=0;$n<$ext_max;$n++) {
    echo "case '".$ext_array[$n]."': if (!document.getElementsByName('add_".$ext_array[$n]."')[0].checked) pass = 1; break;\n";
   }
   ?>
   default : pass=1; break;
  }
  if (pass) continue;
  //x = stagex + 1+(n % 4)*cellw;
  //y = stagey + 1+ Math.floor(n/4) * cellh;
  x = stagex + 1+ Math.floor(i/30) * cellw;
  y = stagey + 1+ (i % 30) * cellh;
  document.write('<div id="block_'+n+'" style="position:absolute; background-color:#efefef; z-index:'+z+'; left:'+x+'px; top:'+y+'px; width:'+(cellw-1)+'px; height:'+(cellh-1)+'px; padding-left:5px; display:block"><span>'+(10001+i).toString().substring(1)+': <a href="'+files[n]+'">'+files[n].replace('<?=$start_page;?>','')+'</a> <a href="'+files[n]+'" target=_blank>▲</a></span></div>');
  i++;
 }
}

function redisplay_page() {
 var i = 0, pass, obj;
 for (n=0;n<files.length;n++){
  temp_arr = (files[n].replace(/ /gi,"%20").replace(/\\/gi,"/")).split(".");
  temp_ext = temp_arr[temp_arr.length-1];
  pass = 1;
  switch (temp_ext){
   <?
   for ($n=0;$n<$ext_max;$n++) {
    echo "case '".$ext_array[$n]."': if (!document.getElementsByName('add_".$ext_array[$n]."')[0].checked) pass = 0; break;\n";
   }
   ?>
   default : pass=1; break;
  }
  if (pass) {
   //x = stagex + 1+(n % 4)*cellw;
   //y = stagey + 1+ Math.floor(n/4) * cellh;
   x = stagex + 1+ Math.floor(i/30) * cellw;
   y = stagey + 1+ (i % 30) * cellh;
   obj = document.getElementById('block_'+n);
   obj.style.display='block';
   obj.style.left = x;
   obj.style.top = y;
   i++;
  } else {
   document.getElementById('block_'+n).style.display='none';
  }
 }
}

display_page();

</script>
</body>
</html>

웹프로그래머의 홈페이지정보 블로그 http://hompy.info
2007/12/13 09:03 2007/12/13 09:03

댓글을 달아 주세요

오늘부터 AJAX 사내교육을 맡게 되어 인터넷 서핑과 블로깅을 해서 전문 용어를 정리하고 필요한 자료를 추려보는 중이다. AJAX 하면 웹2.0을 연상하게 한다. 왜냐하면 AJAX 는 플렛폼 독립적이면서 응용프로그램과 같은 UI 를 구현할 수 있고 이는 웹2.0을 구현하는데 적합하기 때문이다. 그러나 나는 플래시(flash)를 선호하는 관계로 RIA, FLEX 나 AIR 또는 아폴로를 생각한다. AJAX 는 자바스크립트(javascript)의 비동기 통신 객체를 이용해 서버와 HTTP 통신하며 XML 타입의 데이터를 주고 받으며 인터랙티브한(interactive:대화식) 웹환경을 만들 수 있게 해주는 퓨젼 기술이라고 할 수 있다. 한마디로 표현 하면 웹표준을 준수하면서 대화실 웹어플레이게이션을 만들 수 있게 해주는 응용기술이라고 할 수 있겠다. 어째꺼나 IT 관련해서 날이 가면 갈수록 새로운 지식과 전문용어들 그리고 약자가 넘쳐나 머리가 찌끈거릴 때가 있다.
웹2.0에 부합하는 새로운 비지니스 모델과 서비스 모델들이 등장하면서 편리하고 유익한 웹환경으로 사용자들을 기쁘게 해주고 있다. 웹2.0 서비스 모델들에 대해 열거해보면...
Folksonomy, 소셜 북마킹, 소셜 네트워킹, 블로그, 메타블로그, microformats, RSS FEED READER, MASH UP, Creative Commons, 위젯, 지식 공유, 동영상 공유, 사진 공유, 개인화 포털, 퍼머링크, CMS, 위키, ...
와 같은 것들이 있고 응용하고 조합하여 또 다른 퓨전 모델이 등장하고 있다.
AJAX 와 웹2.0에 관련하여 매일 퇴근 전 1시간을 할당 받아 교육을 해야 한다. 교육을 받는 사람보다 교육을 하는 사람이 몇배 몇십배는 더 고민하고 연구하고 정리한 뒤에 교육을 해야 최소한 욕을 안 먹는 일인데, 준비하느라고 업무는 제대로 진행할 수 있을지 의문도 생긴다. 오늘은 가볍게 블로그와 블로그 메타사이트에 대해 같이 알아보고 우편번호 자동검색기를 AJAX 스타일로 만들어보는 정도로 교육해야겠다.
AJAX 에 대해 쓸만한 자료가 있는 분들은 흔적 남겨준다면 우리 뿐만 아니라 이 메시지를 보는 분들도 유용하게 이용할 것이다.^^

[용어 참고]
* 블로깅(blogging)
블로깅이란 다른 사람의 블로그에 방문하여 글을 보거나, 스크랩하여 자료를 모으는 것으로 모든 블로그 활동을 하는 것을 뜻하는 말로 사용된다.
* 메타사이트(metasite)
다른 검색 사이트를 검색하는 웹 검색 사이트 야후와 같이 다른 웹 사이트의 디렉터리 역할을 하는 웹 사이트를 말하기도 한다.

웹프로그래머의 홈페이지정보 블로그 http://hompy.info

2007/06/18 16:19 2007/06/18 16:19

댓글을 달아 주세요

  1. 궁굼이 2008/12/13 11:18  댓글주소  수정/삭제  댓글쓰기

    네이버엔 프로그래밍 할때 사용하는 변수등...네이밍 가이드 라인이 없나요.
    NHN Web Standardization Guide에서 보면 CSS는 있는데...프로그래머들이 사용하는거 보고싶은데요..어디서 볼수 없나요..

  2. 우키러브 2007/07/30 11:25  댓글주소  수정/삭제  댓글쓰기

    웹 2.0에 관심이 많아서 위키피디아와 함께.. 일본에 여행갔을때 가져온 워크북을 활용해서 발표를 한적이 있습니다. 확실히 일본의 워크북들이 예제가 많아서 좋더군요.. 그렇지만 일본어가.. 안습이로고..

  3. eruhkim 2007/06/18 17:09  댓글주소  수정/삭제  댓글쓰기

    Ajax에 대해서 한 시간짜리의 짧은 발표를 한 적이 있긴 한데, 주로 위키피디아의 자료를 옮겨 넣어서 개념 설명을 하고, 간단한 예제를 보여주는 것으로 끝냈습니다.

아주 오래전 중학교 졸업선물로 애플(APPLE II) 라는 컴퓨터를 졸업선물로 받았다. 경쟁기종으로는 아마도 MSX와 SPC라는 것이 있었던 것 같다. 그때부터 BASIC 이란 언어를 컴퓨터 학원에서 1달정도 배우게 되었다. 혼자서도 배울만 했고 그 후론 컴퓨터 학원을 다니지 않았다. 그때부터 개발이라는 것을 알게 되고 전공을 하게 되었고 개발자가 되었다. 대학 1학년 시절 상반기에는 베이직(GWBASIC)으로 하반기에는 파스칼(TURBO PASCAL)로 게임과 관리프로그램을 만들었고 교내 경진대회에도 나가 1등도 했었고 전산과 연합회 전시회도 출품을 했었다. 대학 2학년 시절 C 라는 언어를 알게 되었고 재미도 있었다. 그림 그리는 툴이나 관리 프로그램 같은 것을 만들었다. 그후로 리눅스라는 것에 취했고 PC통신 에뮬레이터와 BBS 호스트 프로그램이라는 것을 만들었다.
현재는 PHP와 플래시 액션스크립트를 즐겨 쓴다. 아마도 PHP는 C 언어와 스타일이 비슷해서 좋아하고 액션스크립트는 생동감 있는 장난감을 만들 수 있어 취미로 즐긴다. 가끔은 ASP 로 개발을 할때도 있지만, ASP 라는 언어는 여러가지 이유로 맘에 안든다. 파스칼이나 C언어를 쓸때는 보다 기계어에 가까운 하드코어한 부분까지 제어하는 것이 개발이라고 생각했지만 요즘은 얼마나 빨리 내가 생각하는 객체를 개발할 것인가를 중요하게 생각한다. 그런면에서 PHP와 액션스크립트는 장점이 있다.
PHP가 돈 안되는 언어라고 생각하는 사람들도 있지만, 개발언어는 도구일 뿐이다. 뭘로 개발했느냐 보다는 뭘 개발했느냐가 중요하고 뭘 어떻게 운영하고 홍보할 것인가가 더 중요하다. 프로그래머가 3D 업종이라고 한탄하지 말고 '프로그래밍은 컴퓨터를 살아 숨쉬게 하는 창조적인 작업'이라고 생각하고 컴퓨터의 생명력은 우리 프로그래머에게 달려 있다고 생각하자!
세상을 움질일 수 있는 힘이 프로그래머에게도 있다. 당신의 프로그래밍으로 PHP나 플래시 액션스크립트가 그런 일을 하게 만들 수 있지 않을까?

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
2007/04/19 09:13 2007/04/19 09:13

댓글을 달아 주세요

  1. 차가운도시남 2009/07/28 09:17  댓글주소  수정/삭제  댓글쓰기

    입사 두달차 신입 php 프로그래머 입니다.

    '프로그래밍은 컴퓨터를 살아 숨쉬게 하는 창조적인 작업'이란 문구가

    너무 인상에 깊어 이렇게 글을 남기고 갑니다

    앞으로 자주 들러서 배워가겠습니다 ^^

  2. Harry 2007/06/28 04:57  댓글주소  수정/삭제  댓글쓰기

    이런 저런 경로로 자주 들릅니다..^^;
    저도 주로 C로 개발하다가 이제 PHP 개발에 맛들렸는데 확실히 빠르게 생각을 현실화해 볼 수 있다는 것이 큰 장점이더군요. 많은 것 배워가겠습니다~

    • 웹프로그래머 2007/06/28 07:57  댓글주소  수정/삭제

      저랑 취향이 비슷하신가 보군요. 앞으로 자주 왕래하게 되길 바랍니다.

  3. 학주니 2007/04/19 13:08  댓글주소  수정/삭제  댓글쓰기

    Apple II 라는 컴퓨터를 보고 반가워서 왔습니다. ^^;
    저도 꽤 오래전에 Apple II+를 사용했거든요(83년이던가요).
    PHP. 꽤 괜찮은 웹스크립트 언어라고 생각합니다.
    일단 빠르잖아요. ^^;
    APM(Apache + PMP + MySQL)을 제대로 쓸 줄 알면 어지간한 웹페이지는 다 만들 수 있을듯 하고요. ^^;

    • 웹프로그래머 2007/06/28 07:58  댓글주소  수정/삭제

      학주니님도 컴퓨터 파워유져시군요. 개발언어도 아시는 걸 보니 직업이 프로그래머인듯 보이네요.^^

  4. 백쉰 2007/04/19 12:23  댓글주소  수정/삭제  댓글쓰기

    잘보구갑니다. php는 아는게 없어서 자주 들려 좋은 글 많이 읽고 가야겠네용^^

  5. 키포스 2007/04/19 10:04  댓글주소  수정/삭제  댓글쓰기

    힘네세요~!

[테터툴즈] 불편했던 디폴트 리퍼러 로그에 시간 보여주기

테터툴즈 입문자를 위한 간단한 팁입니다.
디폴트로 설치된 리퍼러 로그에는 날짜만 표시되어 몇시에 발생한 로그인지 알수 없습니다. 아래 알려드리는 소스 부분을 수정하면 날짜와 시간을 보여줍니다. 사용된 함수는 문자열을 잘라주는 substr 함수와 날짜/시간 함수인 date 를 사용했습니다. 각 함수에 대해 궁금하시면 php 함수 사전이나 래퍼런스 페이지를 참조하세요.
php 학습도 할겸 자신에 맞게 수정해보시면 어떨까요?

[/tt/plugins/PN_Referer_Default/index.php]

<!--[변경전]-->
<td class="date"><?php echo Timestamp::formatDate($record['referred']);?></td>
<!--[변경후]-->
<td class="date"><?php echo substr(date("d h:ia",$record['referred']),0,9);?></td>

2007/04/11 09:18 2007/04/11 09:18

댓글을 달아 주세요

  1. SaRaM_ida 2007/06/09 13:33  댓글주소  수정/삭제  댓글쓰기

    좋은것 배워갑니다~

  2. 배째 2007/05/19 22:45  댓글주소  수정/삭제  댓글쓰기

    꼭 필요했던 기능인데 좋은 정보 감사드립니다
    제 블로그에 옮겨 담을께요 (http://jhbae.net/83)
    문제가 되신다면 삭제하겠습니다

    좋은 하루 보내세요~

  3. 노란북 2007/04/11 11:05  댓글주소  수정/삭제  댓글쓰기

    좋은 정보네요...

초간단 php소스로 이쁜 블로그 만들기.

항상 같은 사진, 같은 스킨이 지루할 경우에 응용하시면, 짧지만 막강한(?)한 위력을 발휘할 수 있는 소스입니다. [blog_image.php] 를 생성하시고, /blogimages 라고 지정한 폴더에 skin1.jpg, skin2.jpg, skin3.jpg ... 와 같은 식으로 파일을 만드신 후 <IMG> 태그의 SRC 주소로 쓰시면, 페이지를 열때마다 이미지가 바뀌는 것을 확인할 수 있습니다. 이런 이미지를 만들어서 스킨 편집으로 블로그 이미지나 타이틀 이미지 등으로 지정하시면, 매번 바뀌면서 지루하지 않은 블로그를 만들 수 있습니다.
몇년전 리플달면 바뀌는 게시물, 댓글 많이 붙는 게시물로 도깨비 뉴스에도 올라갈 만큼  유명(?)했습니다. 단점은 외부에 스크랩이 많이 되면 될수록 트래픽만 올라간다는 사실... 한때는 제 서버에 너무 많은 트래픽이 발생하여 IDC 센터에서 연락까지 왔었죠.

[blog_image.php]
<?
$max = 100;
$pos = rand(1,$max);
$url = "skin{$pos}.jpg";
Header("Content-type: image/jpg");
$imagepath = $_SERVER['DOCUMENT_ROOT']."/blogimages/$url";
@readfile($imagepath);
?>

주의)
$max 값은 이미지 파일의 갯수 만큼 지정하셔야합니다.
이미지 파일 이름은 (1 부터 $max 까지)순차적으로 만드셔야합니다.
디렉토리(폴더)의 읽기 권한이 있어야 합니다.
이미지 파일 경로를 정확히 하셔야 합니다.

[이미지 예제]
<img src='/blog_image.php' width=190>



p.s. 매일 바뀌는 사진, 요일별로 바뀌는 이미지, 접속자 수에 따라 바뀌는 이미지 등을 만들어보세요. 숙제입니다.

웹프로그래머의 홈페이지 정보 블로그 http://hompy.info
2007/04/10 11:14 2007/04/10 11:14

댓글을 달아 주세요

  1. 독고폐인 2009/03/17 19:06  댓글주소  수정/삭제  댓글쓰기

    오 대단하네요 ㅇㅂㅇ!!
    이걸로 바탕화면 자동변경 을 한번 만들어봐야겠어요

  2. 권준혁 2007/08/21 18:21  댓글주소  수정/삭제  댓글쓰기

    플래시 다운받았는데 앞이 컴컴 첨부터 뭘 해야되는지 ㅠㅠㅠㅠ

  3. GoodLife 2007/04/10 19:16  댓글주소  수정/삭제  댓글쓰기

    한번 시도해 봐야겠습니다. 좋은 팁 감사드립니다. 살짝 퍼 갑니다.

  4. vicarbiz 2007/04/10 14:53  댓글주소  수정/삭제  댓글쓰기

    thanks for good information

  5. 노란북 2007/04/10 12:51  댓글주소  수정/삭제  댓글쓰기

    이렇게 좋은 정보가 잘 참조하겠습니다.^^

  6. 순디자인 2007/04/10 11:56  댓글주소  수정/삭제  댓글쓰기

    제가 알고 있는 아래의 스크립트도 랜덤이미지를 뿌려주는데 차이점이 뭔가요?

    <SCRIPT>
    <!--
    {gfx=new Array()
    //이미지의 경로와 파일명을 적어 주세요.
    gfx[0]="soondesign1.gif"
    gfx[1]="soondesign2.gif"
    gfx[2]="soondesign3.gif"

    today2=new Date()
    len=3
    today=today2.getTime()/10
    rnd=today % len
    document.writeln('<IMG SRC="'+gfx[rnd]+'">')}
    //-->
    </SCRIPT>

    • 웹프로그래머 2007/04/10 12:46  댓글주소  수정/삭제

      쉽게 설명 드리면, 제 팁은 포털 게시판에 올려보시면 문제 없이 랜덤하게 볼 수 있지만, 말씀하시는 자바스크립트는 차단되서 이미지를 볼수 없지요. 이유는 이미지 주소만 있으면 동작하기 때문이죠. 일단 만들어 놓으시면 간편하게 이미지를 쓸 수 있습니다.

    • 순디자인 2007/04/10 18:20  댓글주소  수정/삭제

      아! 그렇군요.
      친절한 답변 감사합니다.

      얼릉 테스트해봐야겠습니다.

    • 웹프로그래머 2007/04/10 22:14  댓글주소  수정/삭제

      별말씀을... 블로그에 가보니 셋팅 되셨더군요.^^

  7. 아르 2007/04/10 11:31  댓글주소  수정/삭제  댓글쓰기

    jpg가 아니라 swf파일같은 다른 확장자로도 가능한가요?

    • 웹프로그래머 2007/04/10 11:33  댓글주소  수정/삭제

      swf 를 랜덤하게 뿌려 주고 싶다면, 마찬가지 입니다. 플래시 같은 경우는 로더 플래시를 만들어 랜덤하게 로딩하게 해주는 방법도 좋을 것 같습니다만...

TAG ,
PHP 함수는 몇개나 될까?
abs acos acosh addcslashes addslashes aggregate aggregate_info aggregate_methods aggregate_methods_by_list aggregate_methods_by_regexp aggregate_properties aggregate_properties_by_list aggregate_properties_by_regexp aggregation_info apache_child_terminate apache_getenv apache_get_modules apache_get_version apache_lookup_uri apache_note apache_request_headers apache_reset_timeout apache_response_headers apache_setenv apc_cache_info apc_clear_cache apc_define_constants apc_delete apc_fetch apc_load_constants apc_sma_info apc_store apd_breakpoint apd_callstack apd_clunk apd_continue apd_croak apd_dump_function_table apd_dump_persistent_resources apd_dump_regular_resources apd_echo apd_get_active_symbols apd_set_pprof_trace apd_set_session apd_set_session_trace apd_set_socket_session_trace array arrayiterator_current arrayiterator_key arrayiterator_next arrayiterator_rewind arrayiterator_seek arrayiterator_valid arrayobject_append arrayobject_construct arrayobject_count arrayobject_getiterator arrayobject_offsetexists arrayobject_offsetget arrayobject_offsetset arrayobject_offsetunset array_change_key_case array_chunk array_combine array_count_values array_diff array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill array_filter array_flip array_intersect array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_keys array_key_exists array_map array_merge array_merge_recursive array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_reverse array_search array_shift array_slice array_splice array_sum array_udiff array_udiff_assoc array_udiff_uassoc array_uintersect array_uintersect_assoc array_uintersect_uassoc array_unique array_unshift array_values array_walk array_walk_recursive arsort ascii2ebcdic asin asinh asort aspell_check aspell_check_raw aspell_new aspell_suggest assert assert_options atan atan2 atanh base64_decode base64_encode basename base_convert bcadd bccomp bcdiv bcmod bcmul bcompiler_load bcompiler_load_exe bcompiler_parse_class bcompiler_read bcompiler_write_class bcompiler_write_constant bcompiler_write_exe_footer bcompiler_write_file bcompiler_write_footer bcompiler_write_function bcompiler_write_functions_from_file bcompiler_write_header bcpow bcpowmod bcscale bcsqrt bcsub bin2hex bindec bindtextdomain bind_textdomain_codeset bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite cachingiterator_hasnext cachingiterator_next cachingiterator_rewind cachingiterator_tostring cachingiterator_valid cachingrecursiveiterator_getchildren cachingrecursiveiterator_haschildren call_user_func call_user_func_array call_user_method call_user_method_array cal_days_in_month cal_from_jd cal_info cal_to_jd ccvs_add ccvs_auth ccvs_command ccvs_count ccvs_delete ccvs_done ccvs_init ccvs_lookup ccvs_new ccvs_report ccvs_return ccvs_reverse ccvs_sale ccvs_status ccvs_textvalue ccvs_void ceil chdir checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split classkit_import classkit_method_add classkit_method_copy classkit_method_redefine classkit_method_remove classkit_method_rename class_exists class_implements class_parents clearstatcache closedir closelog com compact com_addref com_create_guid com_event_sink com_get com_get_active_object com_invoke com_isenum com_load com_load_typelib com_message_pump com_print_typeinfo com_propget com_propput com_propset com_release com_set connection_aborted connection_status connection_timeout constant convert_cyr_string convert_uudecode convert_uuencode copy cos cosh count count_chars cpdf_add_annotation cpdf_add_outline cpdf_arc cpdf_begin_text cpdf_circle cpdf_clip cpdf_close cpdf_closepath cpdf_closepath_fill_stroke cpdf_closepath_stroke cpdf_continue_text cpdf_curveto cpdf_end_text cpdf_fill cpdf_fill_stroke cpdf_finalize cpdf_finalize_page cpdf_global_set_document_limits cpdf_import_jpeg cpdf_lineto cpdf_moveto cpdf_newpath cpdf_open cpdf_output_buffer cpdf_page_init cpdf_place_inline_image cpdf_rect cpdf_restore cpdf_rlineto cpdf_rmoveto cpdf_rotate cpdf_rotate_text cpdf_save cpdf_save_to_file cpdf_scale cpdf_setdash cpdf_setflat cpdf_setgray cpdf_setgray_fill cpdf_setgray_stroke cpdf_setlinecap cpdf_setlinejoin cpdf_setlinewidth cpdf_setmiterlimit cpdf_setrgbcolor cpdf_setrgbcolor_fill cpdf_setrgbcolor_stroke cpdf_set_action_url cpdf_set_char_spacing cpdf_set_creator cpdf_set_current_page cpdf_set_font cpdf_set_font_directories cpdf_set_font_map_file cpdf_set_horiz_scaling cpdf_set_keywords cpdf_set_leading cpdf_set_page_animation cpdf_set_subject cpdf_set_text_matrix cpdf_set_text_pos cpdf_set_text_rendering cpdf_set_text_rise cpdf_set_title cpdf_set_viewer_preferences cpdf_set_word_spacing cpdf_show cpdf_show_xy cpdf_stringwidth cpdf_stroke cpdf_text cpdf_translate crack_check crack_closedict crack_getlastmessage crack_opendict crc32 create_function crypt ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit curl_close curl_copy_handle curl_errno curl_error curl_exec curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_setopt curl_setopt_array curl_version current cybercash_base64_decode cybercash_base64_encode cybercash_decr cybercash_encr cybermut_creerformulairecm cybermut_creerreponsecm cybermut_testmac cyrus_authenticate cyrus_bind cyrus_close cyrus_connect cyrus_query cyrus_unbind date date_default_timezone_get date_default_timezone_set date_sunrise date_sunset db2_autocommit db2_bind_param db2_client_info db2_close db2_columns db2_column_privileges db2_commit db2_connect db2_conn_error db2_conn_errormsg db2_cursor_type db2_exec db2_execute db2_fetch_array db2_fetch_assoc db2_fetch_both db2_fetch_object db2_fetch_row db2_field_display_size db2_field_name db2_field_num db2_field_precision db2_field_scale db2_field_type db2_field_width db2_foreign_keys db2_free_result db2_free_stmt db2_next_result db2_num_fields db2_num_rows db2_pconnect db2_prepare db2_primary_keys db2_procedures db2_procedure_columns db2_result db2_rollback db2_server_info db2_special_columns db2_statistics db2_stmt_error db2_stmt_errormsg db2_tables db2_table_privileges dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record dbase_get_record_with_names dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync dblist dbmclose dbmdelete dbmexists dbmfetch dbmfirstkey dbminsert dbmnextkey dbmopen dbmreplace dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel dbx_close dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fetch_row dbx_query dbx_sort dcgettext dcngettext deaggregate debugger_off debugger_on debug_backtrace debug_print_backtrace debug_zval_dump decbin dechex decoct define defined define_syslog_variables deg2rad delete dgettext die dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write dir directoryiterator_construct directoryiterator_current directoryiterator_getatime directoryiterator_getchildren directoryiterator_getctime directoryiterator_getfilename directoryiterator_getgroup directoryiterator_getinode directoryiterator_getmtime directoryiterator_getowner directoryiterator_getpath directoryiterator_getpathname directoryiterator_getperms directoryiterator_getsize directoryiterator_gettype directoryiterator_isdir directoryiterator_isdot directoryiterator_isexecutable directoryiterator_isfile directoryiterator_islink directoryiterator_isreadable directoryiterator_iswritable directoryiterator_key directoryiterator_next directoryiterator_rewind directoryiterator_valid dirname diskfreespace disk_free_space disk_total_space dl dngettext dns_check_record dns_get_mx dns_get_record domattribute_name domattribute_set_value domattribute_specified domattribute_value domdocumenttype_entities domdocumenttype_internal_subset domdocumenttype_name domdocumenttype_notations domdocumenttype_public_id domdocumenttype_system_id domdocument_add_root domdocument_create_attribute domdocument_create_cdata_section domdocument_create_comment domdocument_create_element domdocument_create_element_ns domdocument_create_entity_reference domdocument_create_processing_instruction domdocument_create_text_node domdocument_doctype domdocument_document_element domdocument_dump_file domdocument_dump_mem domdocument_get_elements_by_tagname domdocument_get_element_by_id domdocument_html_dump_mem domdocument_xinclude domelement_get_attribute domelement_get_attribute_node domelement_get_elements_by_tagname domelement_has_attribute domelement_remove_attribute domelement_set_attribute domelement_set_attribute_node domelement_tagname domnode_add_namespace domnode_append_child domnode_append_sibling domnode_attributes domnode_child_nodes domnode_clone_node domnode_dump_node domnode_first_child domnode_get_content domnode_has_attributes domnode_has_child_nodes domnode_insert_before domnode_is_blank_node domnode_last_child domnode_next_sibling domnode_node_name domnode_node_type domnode_node_value domnode_owner_document domnode_parent_node domnode_prefix domnode_previous_sibling domnode_remove_child domnode_replace_child domnode_replace_node domnode_set_content domnode_set_name domnode_set_namespace domnode_unlink_node domprocessinginstruction_data domprocessinginstruction_target domxml_new_doc domxml_open_file domxml_open_mem domxml_version domxml_xmltree domxml_xslt_stylesheet domxml_xslt_stylesheet_doc domxml_xslt_stylesheet_file domxml_xslt_version domxsltstylesheet_process domxsltstylesheet_result_dump_file domxsltstylesheet_result_dump_mem dom_domattr_construct dom_domattr_isid dom_domcharacterdata_appenddata dom_domcharacterdata_deletedata dom_domcharacterdata_insertdata dom_domcharacterdata_replacedata dom_domcharacterdata_substringdata dom_domcomment_construct dom_domdocumentfragment.appendxml dom_domdocument_construct dom_domdocument_createattribute dom_domdocument_createattributens dom_domdocument_createcdatasection dom_domdocument_createcomment dom_domdocument_createdocumentfragment dom_domdocument_createelement dom_domdocument_createelementns dom_domdocument_createentityreference dom_domdocument_createprocessinginstruction dom_domdocument_createtextnode dom_domdocument_getelementbyid dom_domdocument_getelementsbytagname dom_domdocument_getelementsbytagnamens dom_domdocument_importnode dom_domdocument_load dom_domdocument_loadhtml dom_domdocument_loadhtmlfile dom_domdocument_loadxml dom_domdocument_normalize dom_domdocument_relaxngvalidate dom_domdocument_relaxngvalidatesource dom_domdocument_save dom_domdocument_savehtml dom_domdocument_savehtmlfile dom_domdocument_savexml dom_domdocument_schemavalidate dom_domdocument_schemavalidatesource dom_domdocument_validate dom_domdocument_xinclude dom_domelement_construct dom_domelement_getattribute dom_domelement_getattributenode dom_domelement_getattributenodens dom_domelement_getattributens dom_domelement_getelementsbytagname dom_domelement_getelementsbytagnamens dom_domelement_hasattribute dom_domelement_hasattributens dom_domelement_removeattribute dom_domelement_removeattributenode dom_domelement_removeattributens dom_domelement_setattribute dom_domelement_setattributenode dom_domelement_setattributenodens dom_domelement_setattributens dom_domentityreference_construct dom_domimplementation_construct dom_domimplementation_createdocument dom_domimplementation_createdocumenttype dom_domimplementation_hasfeature dom_domnamednodemap_getnameditem dom_domnamednodemap_getnameditemns dom_domnamednodemap_item dom_domnodelist_item dom_domnode_appendchild dom_domnode_clonenode dom_domnode_hasattributes dom_domnode_haschildnodes dom_domnode_insertbefore dom_domnode_issamenode dom_domnode_issupported dom_domnode_lookupnamespaceuri dom_domnode_lookupprefix dom_domnode_normalize dom_domnode_removechild dom_domnode_replacechild dom_domprocessinginstruction_construct dom_domtext_construct dom_domtext_iswhitespaceinelementcontent dom_domtext_splittext dom_domxpath_construct dom_domxpath_evaluate dom_domxpath_query dom_domxpath_registernamespace dom_import_simplexml dotnet dotnet_load doubleval each easter_date easter_days ebcdic2ascii echo empty end ereg eregi eregi_replace ereg_replace error_log error_reporting escapeshellarg escapeshellcmd eval exec exif_imagetype exif_read_data exif_tagname exif_thumbnail exit exp expect_expectl expect_popen explode expm1 extension_loaded extract ezmlm_hash fam_cancel_monitor fam_close fam_monitor_collection fam_monitor_directory fam_monitor_file fam_next_event fam_open fam_pending fam_resume_monitor fam_suspend_monitor fbsql_affected_rows fbsql_autocommit fbsql_blob_size fbsql_change_user fbsql_clob_size fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_database fbsql_database_password fbsql_data_seek fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_next_result fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_select_db fbsql_set_lob_mode fbsql_set_password fbsql_set_transaction fbsql_start_db fbsql_stop_db fbsql_tablename fbsql_username fbsql_warnings fclose fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open fdf_open_string fdf_remove_item fdf_save fdf_save_string fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_on_import_javascript fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version feof fflush fgetc fgetcsv fgets fgetss file fileatime filectime filegroup fileinode filemtime fileowner fileperms filepro filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filesize filetype file_exists file_get_contents file_put_contents filteriterator_current filteriterator_getinneriterator filteriterator_key filteriterator_next filteriterator_rewind filteriterator_valid filter_data finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread frenchtojd fribidi_log2vis fscanf fseek fsockopen fstat ftell ftok ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get ftp_get_option ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype ftruncate function_exists func_get_arg func_get_args func_num_args fwrite gd_info getallheaders getcwd getdate getenv gethostbyaddr gethostbyname gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext gettimeofday gettype get_browser get_cfg_var get_class get_class_methods get_class_vars get_current_user get_declared_classes get_declared_interfaces get_defined_constants get_defined_functions get_defined_vars get_extension_funcs get_headers get_html_translation_table get_included_files get_include_path get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_meta_tags get_object_vars get_parent_class get_required_files get_resource_type glob gmdate gmmktime gmp_abs gmp_add gmp_and gmp_clrbit gmp_cmp gmp_com gmp_div gmp_divexact gmp_div_q gmp_div_qr gmp_div_r gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_mod gmp_mul gmp_neg gmp_nextprime gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_strval gmp_sub gmp_xor gmstrftime gnupg_adddecryptkey gnupg_addencryptkey gnupg_addsignkey gnupg_cleardecryptkeys gnupg_clearencryptkeys gnupg_clearsignkeys gnupg_decrypt gnupg_decryptverify gnupg_encrypt gnupg_encryptsign gnupg_export gnupg_geterror gnupg_getprotocol gnupg_import gnupg_keyinfo gnupg_setarmor gnupg_seterrormode gnupg_setsignmode gnupg_sign gnupg_verify gopher_parsedir gregoriantojd gzclose gzcompress gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite halt_compiler hash hash_algos hash_file hash_final hash_hmac hash_hmac_file hash_init hash_update hash_update_file hash_update_stream header headers_list headers_sent hebrev hebrevc hexdec highlight_file highlight_string htmlentities htmlspecialchars htmlspecialchars_decode html_entity_decode http_build_query hwapi_attribute hwapi_attribute_key hwapi_attribute_langdepvalue hwapi_attribute_value hwapi_attribute_values hwapi_checkin hwapi_checkout hwapi_children hwapi_content hwapi_content_mimetype hwapi_content_read hwapi_copy hwapi_dbstat hwapi_dcstat hwapi_dstanchors hwapi_dstofsrcanchor hwapi_error_count hwapi_error_reason hwapi_find hwapi_ftstat hwapi_hgcsp hwapi_hwstat hwapi_identify hwapi_info hwapi_insert hwapi_insertanchor hwapi_insertcollection hwapi_insertdocument hwapi_link hwapi_lock hwapi_move hwapi_new_content hwapi_object hwapi_objectbyanchor hwapi_object_assign hwapi_object_attreditable hwapi_object_count hwapi_object_insert hwapi_object_new hwapi_object_remove hwapi_object_title hwapi_object_value hwapi_parents hwapi_reason_description hwapi_reason_type hwapi_remove hwapi_replace hwapi_setcommittedversion hwapi_srcanchors hwapi_srcsofdst hwapi_unlock hwapi_user hwapi_userlist hw_array2objrec hw_changeobject hw_children hw_childrenobj hw_close hw_connect hw_connection_info hw_cp hw_deleteobject hw_docbyanchor hw_docbyanchorobj hw_document_attributes hw_document_bodytag hw_document_content hw_document_setcontent hw_document_size hw_dummy hw_edittext hw_error hw_errormsg hw_free_document hw_getanchors hw_getanchorsobj hw_getandlock hw_getchildcoll hw_getchildcollobj hw_getchilddoccoll hw_getchilddoccollobj hw_getobject hw_getobjectbyquery hw_getobjectbyquerycoll hw_getobjectbyquerycollobj hw_getobjectbyqueryobj hw_getparents hw_getparentsobj hw_getrellink hw_getremote hw_getremotechildren hw_getsrcbydestobj hw_gettext hw_getusername hw_identify hw_incollections hw_info hw_inscoll hw_insdoc hw_insertanchors hw_insertdocument hw_insertobject hw_mapid hw_modifyobject hw_mv hw_new_document hw_objrec2array hw_output_document hw_pconnect hw_pipedocument hw_root hw_setlinkroot hw_stat hw_unlock hw_who hypot i18n_loc_get_default i18n_loc_set_default ibase_add_user ibase_affected_rows ibase_backup ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import ibase_blob_info ibase_blob_open ibase_close ibase_commit ibase_commit_ret ibase_connect ibase_db_info ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_assoc ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_maintain_db ibase_modify_user ibase_name_result ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_query ibase_restore ibase_rollback ibase_rollback_ret ibase_server_info ibase_service_attach ibase_service_detach ibase_set_event_handler ibase_timefmt ibase_trans ibase_wait_event icap_close icap_create_calendar icap_delete_calendar icap_delete_event icap_fetch_event icap_list_alarms icap_list_events icap_open icap_rename_calendar icap_reopen icap_snooze icap_store_event iconv iconv_get_encoding iconv_mime_decode iconv_mime_decode_headers iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr id3_get_frame_long_name id3_get_frame_short_name id3_get_genre_id id3_get_genre_list id3_get_genre_name id3_get_tag id3_get_version id3_remove_tag id3_set_tag idate ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_getsqlca ifx_get_blob ifx_get_char ifx_htmltbl_result ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_textasvarchar ifx_update_blob ifx_update_char ignore_user_abort iis_add_server iis_get_dir_security iis_get_script_map iis_get_server_by_comment iis_get_server_by_path iis_get_server_rights iis_get_service_state iis_remove_server iis_set_app_settings iis_set_dir_security iis_set_script_map iis_set_server_rights iis_start_server iis_start_service iis_stop_server iis_stop_service image2wbmp imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd imagegd2 imagegif imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepng imagepolygon imagepsbbox imagepscopyfont imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagesetbrush imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp imagexbm image_type_to_extension image_type_to_mime_type imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetchbody imap_fetchheader imap_fetchstructure imap_fetch_overview imap_getacl imap_getmailboxes imap_getsubscribed imap_get_quota imap_get_quotaroot imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail imap_mailboxmsginfo imap_mail_compose imap_mail_copy imap_mail_move imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_scanmailbox imap_search imap_setacl imap_setflag_full imap_set_quota imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 implode import_request_variables include include_once inet_ntop inet_pton ingres_autocommit ingres_close ingres_commit ingres_connect ingres_cursor ingres_errno ingres_error ingres_errsqlstate ingres_fetch_array ingres_fetch_object ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_num_fields ingres_num_rows ingres_pconnect ingres_query ingres_rollback ini_alter ini_get ini_get_all ini_restore ini_set input_filters_list input_get input_has_variable input_name_to_filter interface_exists intval in_array ip2long iptcembed iptcparse ircg_channel_mode ircg_disconnect ircg_eval_ecmascript_params ircg_fetch_error_msg ircg_get_username ircg_html_encode ircg_ignore_add ircg_ignore_del ircg_invite ircg_is_conn_alive ircg_join ircg_kick ircg_list ircg_lookup_format_messages ircg_lusers ircg_msg ircg_names ircg_nick ircg_nickname_escape ircg_nickname_unescape ircg_notice ircg_oper ircg_part ircg_pconnect ircg_register_format_messages ircg_set_current ircg_set_file ircg_set_on_die ircg_topic ircg_who ircg_whois isset is_a is_array is_bool is_callable is_dir is_double is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault is_string is_subclass_of is_uploaded_file is_writable is_writeable iterator_count iterator_to_array java_last_exception_clear java_last_exception_get jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd join jpeg2wbmp juliantojd kadm5_chpass_principal kadm5_create_principal kadm5_delete_principal kadm5_destroy kadm5_flush kadm5_get_policies kadm5_get_principal kadm5_get_principals kadm5_init_with_password kadm5_modify_principal key krsort ksort lcg_value lchgrp lchown ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values ldap_get_values_len ldap_list ldap_modify ldap_mod_add ldap_mod_del ldap_mod_replace ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_sasl_bind ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind levenshtein libxml_clear_errors libxml_get_errors libxml_get_last_error libxml_set_streams_context libxml_use_internal_errors limititerator_getposition limititerator_next limititerator_rewind limititerator_seek limititerator_valid link linkinfo list localeconv localtime log log10 log1p long2ip lstat ltrim lzf_compress lzf_decompress lzf_optimized_for mail mailparse_determine_best_xfer_encoding mailparse_msg_create mailparse_msg_extract_part mailparse_msg_extract_part_file mailparse_msg_free mailparse_msg_get_part mailparse_msg_get_part_data mailparse_msg_get_structure mailparse_msg_parse mailparse_msg_parse_file mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all main max maxdb_affected_rows maxdb_autocommit maxdb_bind_param maxdb_bind_result maxdb_change_user maxdb_character_set_name maxdb_client_encoding maxdb_close maxdb_close_long_data maxdb_commit maxdb_connect maxdb_connect_errno maxdb_connect_error maxdb_data_seek maxdb_debug maxdb_disable_reads_from_master maxdb_disable_rpl_parse maxdb_dump_debug_info maxdb_embedded_connect maxdb_enable_reads_from_master maxdb_enable_rpl_parse maxdb_errno maxdb_error maxdb_escape_string maxdb_execute maxdb_fetch maxdb_fetch_array maxdb_fetch_assoc maxdb_fetch_field maxdb_fetch_fields maxdb_fetch_field_direct maxdb_fetch_lengths maxdb_fetch_object maxdb_fetch_row maxdb_field_count maxdb_field_seek maxdb_field_tell maxdb_free_result maxdb_get_client_info maxdb_get_client_version maxdb_get_host_info maxdb_get_metadata maxdb_get_proto_info maxdb_get_server_info maxdb_get_server_version maxdb_info maxdb_init maxdb_insert_id maxdb_kill maxdb_master_query maxdb_more_results maxdb_multi_query maxdb_next_result maxdb_num_fields maxdb_num_rows maxdb_options maxdb_param_count maxdb_ping maxdb_prepare maxdb_query maxdb_real_connect maxdb_real_escape_string maxdb_real_query maxdb_report maxdb_rollback maxdb_rpl_parse_enabled maxdb_rpl_probe maxdb_rpl_query_type maxdb_select_db maxdb_send_long_data maxdb_send_query maxdb_server_end maxdb_server_init maxdb_set_opt maxdb_sqlstate maxdb_ssl_set maxdb_stat maxdb_stmt_affected_rows maxdb_stmt_bind_param maxdb_stmt_bind_result maxdb_stmt_close maxdb_stmt_close_long_data maxdb_stmt_data_seek maxdb_stmt_errno maxdb_stmt_error maxdb_stmt_execute maxdb_stmt_fetch maxdb_stmt_free_result maxdb_stmt_init maxdb_stmt_num_rows maxdb_stmt_param_count maxdb_stmt_prepare maxdb_stmt_reset maxdb_stmt_result_metadata maxdb_stmt_send_long_data maxdb_stmt_sqlstate maxdb_stmt_store_result maxdb_store_result maxdb_thread_id maxdb_thread_safe maxdb_use_result maxdb_warning_count mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_ereg mb_eregi mb_eregi_replace mb_ereg_match mb_ereg_replace mb_ereg_search mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_list_encodings mb_output_handler mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_strlen mb_strpos mb_strrpos mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr mb_substr_count mcal_append_event mcal_close mcal_create_calendar mcal_date_compare mcal_date_valid mcal_days_in_month mcal_day_of_week mcal_day_of_year mcal_delete_calendar mcal_delete_event mcal_event_add_attribute mcal_event_init mcal_event_set_alarm mcal_event_set_category mcal_event_set_class mcal_event_set_description mcal_event_set_end mcal_event_set_recur_daily mcal_event_set_recur_monthly_mday mcal_event_set_recur_monthly_wday mcal_event_set_recur_none mcal_event_set_recur_weekly mcal_event_set_recur_yearly mcal_event_set_start mcal_event_set_title mcal_expunge mcal_fetch_current_stream_event mcal_fetch_event mcal_is_leap_year mcal_list_alarms mcal_list_events mcal_next_recurrence mcal_open mcal_popen mcal_rename_calendar mcal_reopen mcal_snooze mcal_store_event mcal_time_valid mcal_week_of_year mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_encrypt mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_generic mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb md5 md5_file mdecrypt_generic memcache_add memcache_addserver memcache_close memcache_connect memcache_debug memcache_decrement memcache_delete memcache_flush memcache_get memcache_getextendedstats memcache_getstats memcache_getversion memcache_increment memcache_pconnect memcache_replace memcache_set memcache_setcompressthreshold memory_get_usage metaphone method_exists mhash mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k microtime mime_content_type min ming_keypress ming_setcubicthreshold ming_setscale ming_useconstants ming_useswfversion mkdir mktime money_format move_uploaded_file msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get msession_get_array msession_get_data msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set msession_set_array msession_set_data msession_timeout msession_uniq msession_unlock msg_get_queue msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue msql msql_affected_rows msql_close msql_connect msql_createdb msql_create_db msql_data_seek msql_dbname msql_db_query msql_drop_db msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_field_flags msql_field_len msql_field_name msql_field_seek msql_field_table msql_field_type msql_free_result msql_list_dbs msql_list_fields msql_list_tables msql_numfields msql_numrows msql_num_fields msql_num_rows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_tablename mssql_bind mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db mt_getrandmax mt_rand mt_srand muscat_close muscat_get muscat_give muscat_setup muscat_setup_net mysqli_affected_rows mysqli_autocommit mysqli_bind_param mysqli_bind_result mysqli_change_user mysqli_character_set_name mysqli_client_encoding mysqli_close mysqli_commit mysqli_connect mysqli_connect_errno mysqli_connect_error mysqli_data_seek mysqli_debug mysqli_disable_reads_from_master mysqli_disable_rpl_parse mysqli_dump_debug_info mysqli_embedded_connect mysqli_enable_reads_from_master mysqli_enable_rpl_parse mysqli_errno mysqli_error mysqli_escape_string mysqli_execute mysqli_fetch mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_field_direct mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_client_info mysqli_get_client_version mysqli_get_host_info mysqli_get_metadata mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_master_query mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_param_count mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_report mysqli_rollback mysqli_rpl_parse_enabled mysqli_rpl_probe mysqli_rpl_query_type mysqli_select_db mysqli_send_long_data mysqli_send_query mysqli_server_end mysqli_server_init mysqli_set_charset mysqli_set_opt mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_affected_rows mysqli_stmt_bind_param mysqli_stmt_bind_result mysqli_stmt_close mysqli_stmt_data_seek mysqli_stmt_errno mysqli_stmt_error mysqli_stmt_execute mysqli_stmt_fetch mysqli_stmt_free_result mysqli_stmt_init mysqli_stmt_num_rows mysqli_stmt_param_count mysqli_stmt_prepare mysqli_stmt_reset mysqli_stmt_result_metadata mysqli_stmt_send_long_data mysqli_stmt_sqlstate mysqli_stmt_store_result mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count mysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query m_checkstatus m_completeauthorizations m_connect m_connectionerror m_deletetrans m_destroyconn m_destroyengine m_getcell m_getcellbynum m_getcommadelimited m_getheader m_initconn m_initengine m_iscommadelimited m_maxconntimeout m_monitor m_numcolumns m_numrows m_parsecommadelimited m_responsekeys m_responseparam m_returnstatus m_setblocking m_setdropfile m_setip m_setssl m_setssl_cafile m_setssl_files m_settimeout m_sslcert_gen_hash m_transactionssent m_transinqueue m_transkeyval m_transnew m_transsend m_uwait m_validateidentifier m_verifyconnection m_verifysslcert natcasesort natsort ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_content ncurses_color_set ncurses_curs_set ncurses_define_key ncurses_def_prog_mode ncurses_def_shell_mode ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_del_panel ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init ncurses_init_color ncurses_init_pair ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouseinterval ncurses_mousemask ncurses_mouse_trafo ncurses_move ncurses_move_panel ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_newpad ncurses_newwin ncurses_new_panel ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_resetty ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_savetty ncurses_scrl ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline newt_bell newt_button newt_button_bar newt_centered_window newt_checkbox newt_checkbox_get_value newt_checkbox_set_flags newt_checkbox_set_value newt_checkbox_tree newt_checkbox_tree_add_item newt_checkbox_tree_find_item newt_checkbox_tree_get_current newt_checkbox_tree_get_entry_value newt_checkbox_tree_get_multi_selection newt_checkbox_tree_get_selection newt_checkbox_tree_multi newt_checkbox_tree_set_current newt_checkbox_tree_set_entry newt_checkbox_tree_set_entry_value newt_checkbox_tree_set_width newt_clear_key_buffer newt_cls newt_compact_button newt_component_add_callback newt_component_takes_focus newt_create_grid newt_cursor_off newt_cursor_on newt_delay newt_draw_form newt_draw_root_text newt_entry newt_entry_get_value newt_entry_set newt_entry_set_filter newt_entry_set_flags newt_finished newt_form newt_form_add_component newt_form_add_components newt_form_add_host_key newt_form_destroy newt_form_get_current newt_form_run newt_form_set_background newt_form_set_height newt_form_set_size newt_form_set_timer newt_form_set_width newt_form_watch_fd newt_get_screen_size newt_grid_add_components_to_form newt_grid_basic_window newt_grid_free newt_grid_get_size newt_grid_h_close_stacked newt_grid_h_stacked newt_grid_place newt_grid_set_field newt_grid_simple_window newt_grid_v_close_stacked newt_grid_v_stacked newt_grid_wrapped_window newt_grid_wrapped_window_at newt_init newt_label newt_label_set_text newt_listbox newt_listbox_append_entry newt_listbox_clear newt_listbox_clear_selection newt_listbox_delete_entry newt_listbox_get_current newt_listbox_get_selection newt_listbox_insert_entry newt_listbox_item_count newt_listbox_select_item newt_listbox_set_current newt_listbox_set_current_by_key newt_listbox_set_data newt_listbox_set_entry newt_listbox_set_width newt_listitem newt_listitem_get_data newt_listitem_set newt_open_window newt_pop_help_line newt_pop_window newt_push_help_line newt_radiobutton newt_radio_get_current newt_redraw_help_line newt_reflow_text newt_refresh newt_resize_screen newt_resume newt_run_form newt_scale newt_scale_set newt_scrollbar_set newt_set_help_callback newt_set_suspend_callback newt_suspend newt_texbox_set_text newt_textbox newt_textbox_get_num_lines newt_textbox_reflowed newt_textbox_set_height newt_vertical_scrollbar newt_wait_for_key newt_win_choice newt_win_entries newt_win_menu newt_win_message newt_win_messagev newt_win_ternary next ngettext nl2br nl_langinfo notes_body notes_copy_db notes_create_db notes_create_note notes_drop_db notes_find_note notes_header_info notes_list_msgs notes_mark_read notes_mark_unread notes_nav_create notes_search notes_unread notes_version nsapi_request_headers nsapi_response_headers nsapi_virtual number_format ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_iconv_handler ob_implicit_flush ob_list_handlers ob_start ob_tidyhandler ocibindbyname ocicancel ocicloselob ocicollappend ocicollassign ocicollassignelem ocicollgetelem ocicollmax ocicollsize ocicolltrim ocicolumnisnull ocicolumnname ocicolumnprecision ocicolumnscale ocicolumnsize ocicolumntype ocicolumntyperaw ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreecollection ocifreecursor ocifreedesc ocifreestatement ociinternaldebug ociloadlob ocilogoff ocilogon ocinewcollection ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ocisavelob ocisavelobfile ociserverversion ocisetprefetch ocistatementtype ociwritelobtofile ociwritetemporarylob oci_bind_array_by_name oci_bind_by_name oci_cancel oci_close oci_collection_append oci_collection_assign oci_collection_element_assign oci_collection_element_get oci_collection_free oci_collection_max oci_collection_size oci_collection_trim oci_commit oci_connect oci_define_by_name oci_error oci_execute oci_fetch oci_fetch_all oci_fetch_array oci_fetch_assoc oci_fetch_object oci_fetch_row oci_field_is_null oci_field_name oci_field_precision oci_field_scale oci_field_size oci_field_type oci_field_type_raw oci_free_statement oci_internal_debug oci_lob_append oci_lob_close oci_lob_copy oci_lob_eof oci_lob_erase oci_lob_export oci_lob_flush oci_lob_free oci_lob_getbuffering oci_lob_import oci_lob_is_equal oci_lob_load oci_lob_read oci_lob_rewind oci_lob_save oci_lob_savefile oci_lob_seek oci_lob_setbuffering oci_lob_size oci_lob_tell oci_lob_truncate oci_lob_write oci_lob_writetemporary oci_lob_writetofile oci_new_collection oci_new_connect oci_new_cursor oci_new_descriptor oci_num_fields oci_num_rows oci_parse oci_password_change oci_pconnect oci_result oci_rollback oci_server_version oci_set_prefetch oci_statement_type octdec odbc_autocommit odbc_binmode odbc_close odbc_close_all odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result odbc_result_all odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables openal_buffer_create openal_buffer_data openal_buffer_destroy openal_buffer_get openal_buffer_loadwav openal_context_create openal_context_current openal_context_destroy openal_context_process openal_context_suspend openal_device_close openal_device_open openal_listener_get openal_listener_set openal_source_create openal_source_destroy openal_source_get openal_source_pause openal_source_play openal_source_rewind openal_source_set openal_source_stop openal_stream opendir openlog openssl_csr_export openssl_csr_export_to_file openssl_csr_new openssl_csr_sign openssl_error_string openssl_free_key openssl_get_privatekey openssl_get_publickey openssl_open openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export openssl_pkey_export_to_file openssl_pkey_free openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_seal openssl_sign openssl_verify openssl_x509_checkpurpose openssl_x509_check_private_key openssl_x509_export openssl_x509_export_to_file openssl_x509_free openssl_x509_parse openssl_x509_read ora_bind ora_close ora_columnname ora_columnsize ora_columntype ora_commit ora_commitoff ora_commiton ora_do ora_error ora_errorcode ora_exec ora_fetch ora_fetch_into ora_getcolumn ora_logoff ora_logon ora_numcols ora_numrows ora_open ora_parse ora_plogon ora_rollback orbitenum orbitobject orbitstruct ord output_add_rewrite_var output_reset_rewrite_vars overload override_function ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result ovrimos_result_all ovrimos_rollback pack parentiterator_getchildren parentiterator_haschildren parentiterator_next parentiterator_rewind parsekit_compile_file parsekit_compile_string parsekit_func_arginfo parse_ini_file parse_str parse_url passthru pathinfo pclose pcntl_alarm pcntl_exec pcntl_fork pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig pdf_activate_item pdf_add_annotation pdf_add_bookmark pdf_add_launchlink pdf_add_locallink pdf_add_nameddest pdf_add_note pdf_add_outline pdf_add_pdflink pdf_add_thumbnail pdf_add_weblink pdf_arc pdf_arcn pdf_attach_file pdf_begin_document pdf_begin_font pdf_begin_glyph pdf_begin_item pdf_begin_layer pdf_begin_page pdf_begin_page_ext pdf_begin_pattern pdf_begin_template pdf_circle pdf_clip pdf_close pdf_closepath pdf_closepath_fill_stroke pdf_closepath_stroke pdf_close_image pdf_close_pdi pdf_close_pdi_page pdf_concat pdf_continue_text pdf_create_action pdf_create_annotation pdf_create_bookmark pdf_create_field pdf_create_fieldgroup pdf_create_gstate pdf_create_pvf pdf_create_textflow pdf_curveto pdf_define_layer pdf_delete pdf_delete_pvf pdf_delete_textflow pdf_encoding_set_char pdf_endpath pdf_end_document pdf_end_font pdf_end_glyph pdf_end_item pdf_end_layer pdf_end_page pdf_end_page_ext pdf_end_pattern pdf_end_template pdf_fill pdf_fill_imageblock pdf_fill_pdfblock pdf_fill_stroke pdf_fill_textblock pdf_findfont pdf_fit_image pdf_fit_pdi_page pdf_fit_textflow pdf_fit_textline pdf_get_apiname pdf_get_buffer pdf_get_errmsg pdf_get_errnum pdf_get_font pdf_get_fontname pdf_get_fontsize pdf_get_image_height pdf_get_image_width pdf_get_majorversion pdf_get_minorversion pdf_get_parameter pdf_get_pdi_parameter pdf_get_pdi_value pdf_get_value pdf_info_textflow pdf_initgraphics pdf_lineto pdf_load_font pdf_load_iccprofile pdf_load_image pdf_makespotcolor pdf_moveto pdf_new pdf_open_ccitt pdf_open_file pdf_open_gif pdf_open_image pdf_open_image_file pdf_open_jpeg pdf_open_memory_image pdf_open_pdi pdf_open_pdi_page pdf_open_tiff pdf_place_image pdf_place_pdi_page pdf_process_pdi pdf_rect pdf_restore pdf_resume_page pdf_rotate pdf_save pdf_scale pdf_setcolor pdf_setdash pdf_setdashpattern pdf_setflat pdf_setfont pdf_setgray pdf_setgray_fill pdf_setgray_stroke pdf_setlinecap pdf_setlinejoin pdf_setlinewidth pdf_setmatrix pdf_setmiterlimit pdf_setpolydash pdf_setrgbcolor pdf_setrgbcolor_fill pdf_setrgbcolor_stroke pdf_set_border_color pdf_set_border_dash pdf_set_border_style pdf_set_char_spacing pdf_set_duration pdf_set_gstate pdf_set_horiz_scaling pdf_set_info pdf_set_info_author pdf_set_info_creator pdf_set_info_keywords pdf_set_info_subject pdf_set_info_title pdf_set_layer_dependency pdf_set_leading pdf_set_parameter pdf_set_text_matrix pdf_set_text_pos pdf_set_text_rendering pdf_set_text_rise pdf_set_value pdf_set_word_spacing pdf_shading pdf_shading_pattern pdf_shfill pdf_show pdf_show_boxed pdf_show_xy pdf_skew pdf_stringwidth pdf_stroke pdf_suspend_page pdf_translate pdf_utf16_to_utf8 pdf_utf8_to_utf16 pdostatement_bindcolumn pdostatement_bindparam pdostatement_bindvalue pdostatement_closecursor pdostatement_columncount pdostatement_errorcode pdostatement_errorinfo pdostatement_execute pdostatement_fetch pdostatement_fetchall pdostatement_fetchcolumn pdostatement_fetchobject pdostatement_getattribute pdostatement_getcolumnmeta pdostatement_nextrowset pdostatement_rowcount pdostatement_setattribute pdostatement_setfetchmode pdo_begintransaction pdo_commit pdo_construct pdo_errorcode pdo_errorinfo pdo_exec pdo_getattribute pdo_getavailabledrivers pdo_lastinsertid pdo_pgsqllobcreate pdo_pgsqllobopen pdo_pgsqllobunlink pdo_prepare pdo_query pdo_quote pdo_rollback pdo_setattribute pdo_sqlitecreateaggregate pdo_sqlitecreatefunction pfpro_cleanup pfpro_init pfpro_process pfpro_process_raw pfpro_version pfsockopen pg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_string pg_execute pg_fetch_all pg_fetch_all_columns pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_table pg_field_type pg_field_type_oid pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read pg_lo_read_all pg_lo_seek pg_lo_tell pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_parameter_status pg_pconnect pg_ping pg_port pg_prepare pg_put_line pg_query pg_query_params pg_result_error pg_result_error_field pg_result_seek pg_result_status pg_select pg_send_execute pg_send_prepare pg_send_query pg_send_query_params pg_set_client_encoding pg_set_error_verbosity pg_trace pg_transaction_status pg_tty pg_unescape_bytea pg_untrace pg_update pg_version phpcredits phpinfo phpversion php_check_syntax php_get_tmpdir php_ini_scanned_files php_logo_guid php_sapi_name php_strip_whitespace php_uname pi png2wbmp popen pos posix_access posix_ctermid posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_get_last_error posix_isatty posix_kill posix_mkfifo posix_mknod posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname pow preg_grep preg_match preg_match_all preg_quote preg_replace preg_replace_callback preg_split prev print printer_abort printer_close printer_create_brush printer_create_dc printer_create_font printer_create_pen printer_delete_brush printer_delete_dc printer_delete_font printer_delete_pen printer_draw_bmp printer_draw_chord printer_draw_elipse printer_draw_line printer_draw_pie printer_draw_rectangle printer_draw_roundrect printer_draw_text printer_end_doc printer_end_page printer_get_option printer_list printer_logical_fontheight printer_open printer_select_brush printer_select_font printer_select_pen printer_set_option printer_start_doc printer_start_page printer_write printf print_r proc_close proc_get_status proc_nice proc_open proc_terminate property_exists pspell_add_to_personal pspell_add_to_session pspell_check pspell_clear_session pspell_config_create pspell_config_data_dir pspell_config_dict_dir pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_new pspell_new_config pspell_new_personal pspell_save_wordlist pspell_store_replacement pspell_suggest ps_add_bookmark ps_add_launchlink ps_add_locallink ps_add_note ps_add_pdflink ps_add_weblink ps_arc ps_arcn ps_begin_page ps_begin_pattern ps_begin_template ps_circle ps_clip ps_close ps_closepath ps_closepath_stroke ps_close_image ps_continue_text ps_curveto ps_delete ps_end_page ps_end_pattern ps_end_template ps_fill ps_fill_stroke ps_findfont ps_get_buffer ps_get_parameter ps_get_value ps_hyphenate ps_lineto ps_makespotcolor ps_moveto ps_new ps_open_file ps_open_image ps_open_image_file ps_place_image ps_rect ps_restore ps_rotate ps_save ps_scale ps_setcolor ps_setdash ps_setflat ps_setfont ps_setgray ps_setlinecap ps_setlinejoin ps_setlinewidth ps_setmiterlimit ps_setpolydash ps_set_border_color ps_set_border_dash ps_set_border_style ps_set_info ps_set_parameter ps_set_text_pos ps_set_value ps_shading ps_shading_pattern ps_shfill ps_show ps_show_boxed ps_show_xy ps_stringwidth ps_string_geometry ps_stroke ps_symbol ps_symbol_name ps_symbol_width ps_translate putenv px_close px_create_fp px_date2string px_delete px_delete_record px_get_field px_get_info px_get_parameter px_get_record px_get_schema px_get_value px_insert_record px_new px_numfields px_numrecords px_open_fp px_put_record px_retrieve_record px_set_blob_file px_set_parameter px_set_tablename px_set_targetencoding px_set_value px_timestamp2string px_update_record qdom_error qdom_tree quoted_printable_decode quotemeta rad2deg radius_acct_open radius_add_server radius_auth_open radius_close radius_config radius_create_request radius_cvt_addr radius_cvt_int radius_cvt_string radius_demangle radius_demangle_mppe_key radius_get_attr radius_get_vendor_attr radius_put_addr radius_put_attr radius_put_int radius_put_string radius_put_vendor_addr radius_put_vendor_attr radius_put_vendor_int radius_put_vendor_string radius_request_authenticator radius_send_request radius_server_secret radius_strerror rand range rar_close rar_entry_get rar_extract rar_getattr rar_getcrc rar_getfiletime rar_gethostos rar_getmethod rar_getname rar_getpackedsize rar_getunpackedsize rar_getversion rar_list rar_open rawurldecode rawurlencode readdir readfile readgzfile readline readline_add_history readline_callback_handler_install readline_callback_handler_remove readline_callback_read_char readline_clear_history readline_completion_function readline_info readline_list_history readline_on_new_line readline_read_history readline_redisplay readline_write_history readlink read_exif_data realpath recode recode_file recode_string recursivedirectoryiterator_getchildren recursivedirectoryiterator_haschildren recursivedirectoryiterator_key recursivedirectoryiterator_next recursivedirectoryiterator_rewind recursiveiteratoriterator_current recursiveiteratoriterator_getdepth recursiveiteratoriterator_getsubiterator recursiveiteratoriterator_key recursiveiteratoriterator_next recursiveiteratoriterator_rewind recursiveiteratoriterator_valid register_shutdown_function register_tick_function rename rename_function require require_once reset restore_error_handler restore_exception_handler restore_include_path return rewind rewinddir rmdir round rpm_close rpm_get_tag rpm_is_valid rpm_open rpm_version rsort rtrim runkit_class_adopt runkit_class_emancipate runkit_constant_add runkit_constant_redefine runkit_constant_remove runkit_function_add runkit_function_copy runkit_function_redefine runkit_function_remove runkit_function_rename runkit_import runkit_lint runkit_lint_file runkit_method_add runkit_method_copy runkit_method_redefine runkit_method_remove runkit_method_rename runkit_return_value_used runkit_sandbox_output_handler runkit_superglobals satellite_caught_exception satellite_exception_id satellite_exception_value satellite_get_repository_id satellite_load_idl satellite_object_to_string scandir sdo_das_changesummary_beginlogging sdo_das_changesummary_endlogging sdo_das_changesummary_getchangeddataobjects sdo_das_changesummary_getchangetype sdo_das_changesummary_getoldcontainer sdo_das_changesummary_getoldvalues sdo_das_changesummary_islogging sdo_das_datafactory_addpropertytotype sdo_das_datafactory_addtype sdo_das_datafactory_getdatafactory sdo_das_dataobject_getchangesummary sdo_das_relational_applychanges sdo_das_relational_construct sdo_das_relational_createrootdataobject sdo_das_relational_executepreparedquery sdo_das_relational_executequery sdo_das_setting_getlistindex sdo_das_setting_getpropertyindex sdo_das_setting_getpropertyname sdo_das_setting_getvalue sdo_das_setting_isset sdo_das_xml_addtypes sdo_das_xml_create sdo_das_xml_createdataobject sdo_das_xml_createdocument sdo_das_xml_document_getrootdataobject sdo_das_xml_document_getrootelementname sdo_das_xml_document_getrootelementuri sdo_das_xml_document_setencoding sdo_das_xml_document_setxmldeclaration sdo_das_xml_document_setxmlversion sdo_das_xml_loadfile sdo_das_xml_loadstring sdo_das_xml_savefile sdo_das_xml_savestring sdo_datafactory_create sdo_dataobject_clear sdo_dataobject_createdataobject sdo_dataobject_getcontainer sdo_dataobject_getsequence sdo_dataobject_gettypename sdo_dataobject_gettypenamespaceuri sdo_exception_getcause sdo_list_insert sdo_model_property_getcontainingtype sdo_model_property_getdefault sdo_model_property_getname sdo_model_property_gettype sdo_model_property_iscontainment sdo_model_property_ismany sdo_model_reflectiondataobject_construct sdo_model_reflectiondataobject_export sdo_model_reflectiondataobject_getcontainmentprope sdo_model_reflectiondataobject_getinstanceproperti sdo_model_reflectiondataobject_gettype sdo_model_type_getbasetype sdo_model_type_getname sdo_model_type_getnamespaceuri sdo_model_type_getproperties sdo_model_type_getproperty sdo_model_type_isabstracttype sdo_model_type_isdatatype sdo_model_type_isinstance sdo_model_type_isopentype sdo_model_type_issequencedtype sdo_sequence_getproperty sdo_sequence_insert sdo_sequence_move sem_acquire sem_get sem_release sem_remove serialize sesam_affected_rows sesam_commit sesam_connect sesam_diagnostic sesam_disconnect sesam_errormsg sesam_execimm sesam_fetch_array sesam_fetch_result sesam_fetch_row sesam_field_array sesam_field_name sesam_free_result sesam_num_fields sesam_query sesam_rollback sesam_seek_row sesam_settransaction session_cache_expire session_cache_limiter session_commit session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_pgsql_add_error session_pgsql_get_error session_pgsql_get_field session_pgsql_reset session_pgsql_set_field session_pgsql_status session_regenerate_id session_register session_save_path session_set_cookie_params session_set_save_handler session_start session_unregister session_unset session_write_close setcookie setlocale setrawcookie settype set_error_handler set_exception_handler set_file_buffer set_include_path set_magic_quotes_runtime set_time_limit sha1 sha1_file shell_exec shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write shm_attach shm_detach shm_get_var shm_put_var shm_remove shm_remove_var show_source shuffle similar_text simplexmliterator_current simplexmliterator_getchildren simplexmliterator_haschildren simplexmliterator_key simplexmliterator_next simplexmliterator_rewind simplexmliterator_valid simplexml_element_asxml simplexml_element_attributes simplexml_element_children simplexml_element_xpath simplexml_import_dom simplexml_load_file simplexml_load_string sin sinh sizeof sleep snmpget snmpgetnext snmprealwalk snmpset snmpwalk snmpwalkoid snmp_get_quick_print snmp_get_valueretrieval snmp_read_mib snmp_set_enum_print snmp_set_oid_numeric_print snmp_set_quick_print snmp_set_valueretrieval soap_soapclient_call soap_soapclient_construct soap_soapclient_dorequest soap_soapclient_getfunctions soap_soapclient_getlastrequest soap_soapclient_getlastrequestheaders soap_soapclient_getlastresponse soap_soapclient_getlastresponseheaders soap_soapclient_gettypes soap_soapclient_setcookie soap_soapclient_soapcall soap_soapfault_construct soap_soapheader_construct soap_soapparam_construct soap_soapserver_addfunction soap_soapserver_construct soap_soapserver_fault soap_soapserver_getfunctions soap_soapserver_handle soap_soapserver_setclass soap_soapserver_setpersistence soap_soapvar_construct socket_accept socket_bind socket_clear_error socket_close socket_connect socket_create socket_create_listen socket_create_pair socket_getpeername socket_getsockname socket_get_option socket_get_status socket_last_error socket_listen socket_read socket_recv socket_recvfrom socket_select socket_send socket_sendto socket_set_block socket_set_blocking socket_set_nonblock socket_set_option socket_set_timeout socket_shutdown socket_strerror socket_write sort soundex split spliti spl_classes sprintf sqlite_array_query sqlite_busy_timeout sqlite_changes sqlite_close sqlite_column sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_error_string sqlite_escape_string sqlite_exec sqlite_factory sqlite_fetch_all sqlite_fetch_array sqlite_fetch_column_types sqlite_fetch_object sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_has_more sqlite_has_prev sqlite_key sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_next sqlite_num_fields sqlite_num_rows sqlite_open sqlite_popen sqlite_prev sqlite_query sqlite_rewind sqlite_seek sqlite_single_query sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query sqlite_valid sql_regcase sqrt srand sscanf ssh2_auth_hostbased_file ssh2_auth_none ssh2_auth_password ssh2_auth_pubkey_file ssh2_connect ssh2_exec ssh2_fetch_stream ssh2_fingerprint ssh2_methods_negotiated ssh2_publickey_add ssh2_publickey_init ssh2_publickey_list ssh2_publickey_remove ssh2_scp_recv ssh2_scp_send ssh2_sftp ssh2_sftp_lstat ssh2_sftp_mkdir ssh2_sftp_readlink ssh2_sftp_realpath ssh2_sftp_rename ssh2_sftp_rmdir ssh2_sftp_stat ssh2_sftp_symlink ssh2_sftp_unlink ssh2_shell ssh2_tunnel stat stats_absolute_deviation stats_cdf_beta stats_cdf_binomial stats_cdf_cauchy stats_cdf_chisquare stats_cdf_exponential stats_cdf_f stats_cdf_gamma stats_cdf_laplace stats_cdf_logistic stats_cdf_negative_binomial stats_cdf_noncentral_chisquare stats_cdf_noncentral_f stats_cdf_poisson stats_cdf_t stats_cdf_uniform stats_cdf_weibull stats_covariance stats_dens_beta stats_dens_cauchy stats_dens_chisquare stats_dens_exponential stats_dens_f stats_dens_gamma stats_dens_laplace stats_dens_logistic stats_dens_negative_binomial stats_dens_normal stats_dens_pmf_binomial stats_dens_pmf_hypergeometric stats_dens_pmf_poisson stats_dens_t stats_dens_weibull stats_den_uniform stats_harmonic_mean stats_kurtosis stats_rand_gen_beta stats_rand_gen_chisquare stats_rand_gen_exponential stats_rand_gen_f stats_rand_gen_funiform stats_rand_gen_gamma stats_rand_gen_ibinomial stats_rand_gen_ibinomial_negative stats_rand_gen_int stats_rand_gen_ipoisson stats_rand_gen_iuniform stats_rand_gen_noncenral_chisquare stats_rand_gen_noncentral_f stats_rand_gen_noncentral_t stats_rand_gen_normal stats_rand_gen_t stats_rand_get_seeds stats_rand_phrase_to_seeds stats_rand_ranf stats_rand_setall stats_skew stats_standard_deviation stats_stat_binomial_coef stats_stat_correlation stats_stat_gennch stats_stat_independent_t stats_stat_innerproduct stats_stat_noncentral_t stats_stat_paired_t stats_stat_percentile stats_stat_powersum stats_variance strcasecmp strchr strcmp strcoll strcspn stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_context_create stream_context_get_default stream_context_get_options stream_context_set_option stream_context_set_params stream_copy_to_stream stream_filter_append stream_filter_prepend stream_filter_register stream_filter_remove stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_register_wrapper stream_select stream_set_blocking stream_set_timeout stream_set_write_buffer stream_socket_accept stream_socket_client stream_socket_enable_crypto stream_socket_get_name stream_socket_pair stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_wrapper_register stream_wrapper_restore stream_wrapper_unregister strftime stripcslashes stripos stripslashes strip_tags stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime strtoupper strtr strval str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count substr substr_compare substr_count substr_replace swfaction swfbitmap swfbitmap.getheight swfbitmap.getwidth swfbutton swfbutton.addaction swfbutton.addasound swfbutton.addshape swfbutton.setaction swfbutton.setdown swfbutton.sethit swfbutton.setmenu swfbutton.setover swfbutton.setup swfdisplayitem.addaction swfdisplayitem.addcolor swfdisplayitem.endmask swfdisplayitem.getrot swfdisplayitem.getx swfdisplayitem.getxscale swfdisplayitem.getxskew swfdisplayitem.gety swfdisplayitem.getyscale swfdisplayitem.getyskew swfdisplayitem.move swfdisplayitem.moveto swfdisplayitem.multcolor swfdisplayitem.remove swfdisplayitem.rotate swfdisplayitem.rotateto swfdisplayitem.scale swfdisplayitem.scaleto swfdisplayitem.setdepth swfdisplayitem.setmasklevel swfdisplayitem.setmatrix swfdisplayitem.setname swfdisplayitem.setratio swfdisplayitem.skewx swfdisplayitem.skewxto swfdisplayitem.skewy swfdisplayitem.skewyto swffill swffill.moveto swffill.rotateto swffill.scaleto swffill.skewxto swffill.skewyto swffont swffont.getascent swffont.getdescent swffont.getleading swffont.getshape swffont.getutf8width swffont.getwidth swffontchar.addchars swffontchar.addutf8chars swfgradient swfgradient.addentry swfmorph swfmorph.getshape1 swfmorph.getshape2 swfmovie swfmovie.add swfmovie.addexport swfmovie.addfont swfmovie.importchar swfmovie.importfont swfmovie.labelframe swfmovie.nextframe swfmovie.output swfmovie.remove swfmovie.save swfmovie.savetofile swfmovie.setbackground swfmovie.setdimension swfmovie.setframes swfmovie.setrate swfmovie.startsound swfmovie.stopsound swfmovie.streammp3 swfmovie.writeexports swfprebuiltclip swfshape swfshape.addfill swfshape.drawarc swfshape.drawcircle swfshape.drawcubic swfshape.drawcubicto swfshape.drawcurve swfshape.drawcurveto swfshape.drawglyph swfshape.drawline swfshape.drawlineto swfshape.movepen swfshape.movepento swfshape.setleftfill swfshape.setline swfshape.setrightfill swfsound swfsoundinstance.loopcount swfsoundinstance.loopinpoint swfsoundinstance.loopoutpoint swfsoundinstance.nomultiple swfsprite swfsprite.add swfsprite.labelframe swfsprite.nextframe swfsprite.remove swfsprite.setframes swfsprite.startsound swfsprite.stopsound swftext swftext.addstring swftext.addutf8string swftext.getascent swftext.getdescent swftext.getleading swftext.getutf8width swftext.getwidth swftext.moveto swftext.setcolor swftext.setfont swftext.setheight swftext.setspacing swftextfield swftextfield.addchars swftextfield.addstring swftextfield.align swftextfield.setbounds swftextfield.setcolor swftextfield.setfont swftextfield.setheight swftextfield.setindentation swftextfield.setleftmargin swftextfield.setlinespacing swftextfield.setmargins swftextfield.setname swftextfield.setpadding swftextfield.setrightmargin swfvideostream swfvideostream.getnumframes swfvideostream.setdimension swf_actiongeturl swf_actiongotoframe swf_actiongotolabel swf_actionnextframe swf_actionplay swf_actionprevframe swf_actionsettarget swf_actionstop swf_actiontogglequality swf_actionwaitforframe swf_addbuttonrecord swf_addcolor swf_closefile swf_definebitmap swf_definefont swf_defineline swf_definepoly swf_definerect swf_definetext swf_endbutton swf_enddoaction swf_endshape swf_endsymbol swf_fontsize swf_fontslant swf_fonttracking swf_getbitmapinfo swf_getfontinfo swf_getframe swf_labelframe swf_lookat swf_modifyobject swf_mulcolor swf_nextid swf_oncondition swf_openfile swf_ortho swf_ortho2 swf_perspective swf_placeobject swf_polarview swf_popmatrix swf_posround swf_pushmatrix swf_removeobject swf_rotate swf_scale swf_setfont swf_setframe swf_shapearc swf_shapecurveto swf_shapecurveto3 swf_shapefillbitmapclip swf_shapefillbitmaptile swf_shapefilloff swf_shapefillsolid swf_shapelinesolid swf_shapelineto swf_shapemoveto swf_showframe swf_startbutton swf_startdoaction swf_startshape swf_startsymbol swf_textwidth swf_translate swf_viewport sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query symlink syslog system sys_getloadavg tan tanh tcpwrap_check tempnam textdomain tidynode_haschildren tidynode_hassiblings tidynode_isasp tidynode_iscomment tidynode_ishtml tidynode_isjste tidynode_isphp tidynode_istext tidy_access_count tidy_clean_repair tidy_config_count tidy_construct tidy_diagnose tidy_error_count tidy_getopt tidy_get_body tidy_get_config tidy_get_error_buffer tidy_get_head tidy_get_html tidy_get_html_ver tidy_get_opt_doc tidy_get_output tidy_get_release tidy_get_root tidy_get_status tidy_is_xhtml tidy_is_xml tidy_load_config tidy_node_get_attr tidy_node_get_nodes tidy_node_next tidy_node_prev tidy_parse_file tidy_parse_string tidy_repair_file tidy_repair_string tidy_reset_config tidy_save_config tidy_setopt tidy_set_encoding tidy_warning_count time time_nanosleep time_sleep_until tmpfile token_get_all token_name touch trigger_error trim uasort ucfirst ucwords udm_add_search_limit udm_alloc_agent udm_alloc_agent_array udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_check_stored udm_clear_search_limits udm_close_stored udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_hash32 udm_load_ispell_data udm_open_stored udm_set_agent_param uksort umask unicode_encode unicode_semantics uniqid unixtojd unlink unpack unregister_tick_function unserialize unset urldecode urlencode user_error use_soap_error_handler usleep usort utf8_decode utf8_encode variant variant_abs variant_add variant_and variant_cast variant_cat variant_cmp variant_date_from_timestamp variant_date_to_timestamp variant_div variant_eqv variant_fix variant_get_type variant_idiv variant_imp variant_int variant_mod variant_mul variant_neg variant_not variant_or variant_pow variant_round variant_set variant_set_type variant_sub variant_xor var_dump var_export version_compare vfprintf virtual vpopmail_add_alias_domain vpopmail_add_alias_domain_ex vpopmail_add_domain vpopmail_add_domain_ex vpopmail_add_user vpopmail_alias_add vpopmail_alias_del vpopmail_alias_del_domain vpopmail_alias_get vpopmail_alias_get_all vpopmail_auth_user vpopmail_del_domain vpopmail_del_domain_ex vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota vprintf vsprintf w32api_deftype w32api_init_dtype w32api_invoke_function w32api_register_function w32api_set_call_method wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars wddx_unserialize win32_create_service win32_delete_service win32_get_last_control_message win32_ps_list_procs win32_ps_stat_mem win32_ps_stat_proc win32_query_service_status win32_set_service_status win32_start_service win32_start_service_ctrl_dispatcher win32_stop_service wordwrap xattr_get xattr_list xattr_remove xattr_set xattr_supported xdiff_file_diff xdiff_file_diff_binary xdiff_file_merge3 xdiff_file_patch xdiff_file_patch_binary xdiff_string_diff xdiff_string_diff_binary xdiff_string_merge3 xdiff_string_patch xdiff_string_patch_binary xmlreader_close xmlreader_expand xmlreader_getattribute xmlreader_getattributeno xmlreader_getattributens xmlreader_getparserproperty xmlreader_isvalid xmlreader_lookupnamespace xmlreader_movetoattribute xmlreader_movetoattributeno xmlreader_movetoattributens xmlreader_movetoelement xmlreader_movetofirstattribute xmlreader_movetonextattribute xmlreader_next xmlreader_open xmlreader_read xmlreader_setparserproperty xmlreader_setrelaxngschema xmlreader_setrelaxngschemasource xmlreader_xml xmlrpc_decode xmlrpc_decode_request xmlrpc_encode xmlrpc_encode_request xmlrpc_get_type xmlrpc_is_fault xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type xmlwriter_end_attribute xmlwriter_end_cdata xmlwriter_end_comment xmlwriter_end_document xmlwriter_end_dtd xmlwriter_end_dtd_attlist xmlwriter_end_dtd_element xmlwriter_end_dtd_entity xmlwriter_end_element xmlwriter_end_pi xmlwriter_flush xmlwriter_full_end_element xmlwriter_open_memory xmlwriter_open_uri xmlwriter_output_memory xmlwriter_set_indent xmlwriter_set_indent_string xmlwriter_start_attribute xmlwriter_start_attribute_ns xmlwriter_start_cdata xmlwriter_start_comment xmlwriter_start_document xmlwriter_start_dtd xmlwriter_start_dtd_attlist xmlwriter_start_dtd_element xmlwriter_start_dtd_entity xmlwriter_start_element xmlwriter_start_element_ns xmlwriter_start_pi xmlwriter_text xmlwriter_write_attribute xmlwriter_write_attribute_ns xmlwriter_write_cdata xmlwriter_write_comment xmlwriter_write_dtd xmlwriter_write_dtd_attlist xmlwriter_write_dtd_element xmlwriter_write_dtd_entity xmlwriter_write_element xmlwriter_write_element_ns xmlwriter_write_pi xmlwriter_write_raw xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse xml_parser_create xml_parser_create_ns xml_parser_free xml_parser_get_option xml_parser_set_option xml_parse_into_struct xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler xpath_eval xpath_eval_expression xpath_new_context xpath_register_ns xpath_register_ns_auto xptr_eval xptr_new_context xslt_backend_info xslt_backend_name xslt_backend_version xslt_create xslt_errno xslt_error xslt_free xslt_getopt xslt_process xslt_setopt xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_object xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers xsl_xsltprocessor_construct xsl_xsltprocessor_get_parameter xsl_xsltprocessor_has_exslt_support xsl_xsltprocessor_import_stylesheet xsl_xsltprocessor_register_php_functions xsl_xsltprocessor_remove_parameter xsl_xsltprocessor_set_parameter xsl_xsltprocessor_transform_to_doc xsl_xsltprocessor_transform_to_uri xsl_xsltprocessor_transform_to_xml yaz_addinfo yaz_ccl_conf yaz_ccl_parse yaz_close yaz_connect yaz_database yaz_element yaz_errno yaz_error yaz_es yaz_es_result yaz_get_option yaz_hits yaz_itemorder yaz_present yaz_range yaz_record yaz_scan yaz_scan_result yaz_schema yaz_search yaz_set_option yaz_sort yaz_syntax yaz_wait yp_all yp_cat yp_errno yp_err_string yp_first yp_get_default_domain yp_master yp_match yp_next yp_order zend_logo_guid zend_version zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read zlib_get_coding_type
2007/03/30 18:25 2007/03/30 18:25

댓글을 달아 주세요

  1. @@ 2009/12/16 12:17  댓글주소  수정/삭제  댓글쓰기

    눈알이 빙빙도네요 ㅋㅋ

  2. 구름을벗어 2008/07/10 17:11  댓글주소  수정/삭제  댓글쓰기

    헉 많다 --; 그걸 다나열 팀장님 변태...

  3. ERIS 2007/04/11 10:06  댓글주소  수정/삭제  댓글쓰기

    여느 프로그래밍도 API없이는 고급 플밍이 어렵죠;;

  4. Spring 2007/03/30 19:01  댓글주소  수정/삭제  댓글쓰기

    헐~ 걍 API를.. ㅡㅡ;
    java 프로그래밍을 하는 사람들은 자주 쓰는거 아닌거 쓸때는 문서나 api를 끼고 살아야 하는 ㅡㅡ;