달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

27일 코엑스몰에서 한컴 그룹에서 출시한 '한컴오피스 NEO' 신제품 발표회가 있었습니다.

 

우리나라의 대표 문서편집기 답게 많은 분들이 참여했습니다만...발표회의 운영과 그 내용에 많은 아쉬움을 가지게 하는 자리 였습니다

 

 

발표회는 25일까지 사전접수를 받고 12시 30분부터 현장에서 바코드를 네임택으로 변경한다고 안내가 되었지만,

"선착순 1000명 한컴오피스 무료제공"이라는 항목 때문인지 몰라도 12시 이전에 많은 참석자가 몰려들게 됩니다.

 

결국 줄이 계속 길어지더니 사전의 안내와 다르게 현장 접수를 30분 일찍 시작하게 되는데요. 원칙으로 방문하신 분들은 "오피스 소프트웨어를"를 수령하지 못할 수 있는 상황이 벌어질 수 있는 부분이죠.

 

결국엔 오피스를 수령하지 못하신 분들은 불만을 가지게 되지 않았을까 합니다. 온라인사전접수마감을 제대로 하지 않아 잡음도 있었다는 군요   (  http://blog.naver.com/soladio/220609635335   )

 

 

 

행사 참석 고객과 참석자의 불편함을 먼저 생각 & 배려 했다면, 평가판 CD를 충분히 만들어서 무료 배포하고, 나중에 참석여부 확인 및 라이센스 증서를 메일로 보내주는 방법이 더 현명하지 않았을까 생각 됩니다.

 

 

 

 

그래서 행사 시작하기 전 .. 참여가 많아서 즐거운 행사가 아니라,  선착순이라는 접수의 굴레에 끼여서 지치게 몸을 지치게 만들었습니다    ( 접수 시작 시간이 식사 시간이라는 상황은 비밀아닌   )

 

 

 

 

 

또한 행사 내용은 시작부터 끝날때 까지... 자화자찬의 연속(~.~!!) 그리고 발표자들도 대부분 덜덜 떨면서 버벅대고...  요즘은 애국 마케팅은 신뢰를 받고 있지 못하고 있는 분위기인데, 제품의 마케팅 포인트가 애국 이더군요.

 

그리고 나머지 강조 포인트는 세계 오피스시장의 5%를 점유하도록 노력하겠다 라는 건데.. 그러기엔 제품이 한없이 약해 보였습니다

 

 

 

사용자들은 한셀에서 엑셀로 작업된 파일을 열어서 단, 1번이라도 작업중 오류가 나면, 다시는 쓰지 않게 되지요. (소비자는 냉정합니다 )

 

제 주변과 앞으로 나아가서 회사(학교) 주변에서의  한셀(초창기는 넥셀), 한쇼 사용하시는 분들 없잖아요?  오피스제품군인데 "멀쩡한 프로그램은 한글 뿐"인 이름만 오피스인 한컴오피스... 느낌은 MS오피스제품을 계속 따라하는 따라쟁이 느낌이 나는건 어쩔 수 없는 것 같습니다

 

애국심 마케팅보다, 호환성을 확보 & 에러없도록 무한 지원과 한글만의 특장점, 그리고 새로운 기능 포커스를 두는 것이 현명해 보입니다.

 

 

(  네오의 한셀 소개 페이지에서도 별다른 기능은 딱히  ....  http://www.hancom.com/office/product01_03.jsp  )

 

 

 

물론 이번에 새로 추가된 한워드 라는 새로운 호환성 확보에 대해서는 좋아 보입니다만, 실제로 사용을 해봐야 호환성이 정말로 확보 되었는지 결과를 알겠죠?..... 개인적으로 (넥셀의 안좋은 추억...)으로 한셀 한쇼는 아직까지 사용할 생각이 없습니다.  그... 안좋은 호환성 때문에요..

 

 

 

 

 

글을 쓰다보니  약간 횡설수설 했지만  딱 잘라서 거두절미하고, 네오 신제품 발표의 잘한점과 잘못한 점을 표로 명료하게 정리해 보겠습니다.

 

 잘한점 

 VVIP용 한컴오피스 패키지 제공

 (단, CD보단 USB가 좋았을 듯..)

 아쉬운점 

 사전 등록의 효과가 없어서, 30분동안 접수시에 줄서야 했던 점..........!!

 (평가판CD를 뿌리고 참석자들에게 라이센스 증서를 온라인 발급했으면 ㅠ.ㅠ)

  위 한컴오피스 VVIP 패키지외 사은품이 짜다는(?) 느낌... 

 (마우스패드, 스펨플러로 찍은 조그마한 메모지같은 공책, 연필 .....

  이건 주나마나한 사은품..  차라리 기념로고 박힌 USB 메모리를 주는게 현명...)

 고쳐야할 점

  애국심 마케팅 및 특별한 마케팅 포인트의 부재

 ( 빡빡하고 재미없는 내용으로만 이루어지고 무한 반복되는 동일한 내용들...

   발표자들의 경험부재로인한 답답함( 오히려 발표자 중에서 학생이 재미있고 즐거움 )

 

 

박람회에 관한 글은 여기까지 적었구요. 

후에 집으로 복귀 후, 컴퓨터에 한컴오피스 네오 프로그램을 설치해본 결과는~~~~

 

 

네오라는 오피스 프로그램을 한글 2002이상의 기존버전 사용자들이 네오라는 프로그램의 유료 업데이트의 필요성을 느낄까? 라는 것이다.  네오(2016출시) 버전에서는  2014VP(2015출시)의 기능에 비해 아래의 차이점 이외에 변화된 기능들을 찾지 못했거든요. 혹여나 제가 모르는 부분이 있다면 댓글로 알려 주세요!~ 

 

 한글 2014와

     네오의 차이점

 

1. 문서 서식을 유지한 언어번역 기능

    (그나마  원문의 언어가 자동으로 선택되는 기능없음, 번역을 하려면 작업창을 띄워야 함.  특징이 있는 기능이라면 블럭처리후-> 오른쪽 마우스에 번역하기  라는 메뉴 정도는 있어야... )

 

2. MS워드와의 호환성 확보 (미검증)

    PDF  변환 및 편집 기능

     (한글2014VP 소개브로셔 PDF파일로 테스트 했는데 반응없음..

      프로그램이 죽어 버렸네요 ㅠ.ㅠ)

 

3. 폰트의  FSL(Font Simulation Library) 기능

 

 

추가로 가격은  VP홈에디션과 네오를 기준으로, 판매가격이 3만 ->6만원 으로 2배 비싸졌습니다.

 

 

 

또한 한글 워드 프로그램의 오래된 버전들의 특징을

       https://ko.wikipedia.org/wiki/%ED%95%9C%EC%BB%B4%EC%98%A4%ED%94%BC%EC%8A%A4%EC%9D%98_%EB%B2%84%EC%A0%84 의 자료에 의거하여  표로 정리해 봤더니

 

 

 2002 SE

 넥스소프트 넥셀 (Nexsoft Nexel)(한셀) 추가

 2004

 한컴슬라이드(한쇼) 추가

 2005

 문서찾기 추가 

 2007

 개인사용자용인 홈에디션 출시 

 2010

 넥셀->한셀, 한컴슬라이드->한쇼로 이름 변경,

 리본 UI 변경, 한초롬체, 표준문서포멧, 블로그 API 지원

 2010 SE

 개인정보탐색기 추가 

 2014

 함초롱외 3개글꼴 추가, 문서공동편집기능(잘 안씀), 클라우드저장(넷피스), 악성코드 체크, 도움말 사전검색 온라인연동

 2014 VP

 유튜브 동영상링크

 네오

※상단  비교표 참조

 

저보고 네오로 업데이트 하고싶니? 라고 여쭤 보신다면, 딱히 네오를 구매할만한 마음이 없다고 말씀 드릴수 있을거 같습니다.  제가 원하는 기본적인 기능은  한글 2002SE에서도 충분 하거든요!!  여러분의 생각 어떠세요? 

 

 

 

 

 

 

어쩌다보니 신제품 발표회에서  한컴오피스의 단점을 나열하는 포스팅을 쓰게 되었네요..  한글 자체는 상당히 잘 만든 워드 프로그램에는 틀림없습니다만,  프로그램 마케팅 포인트의 부재(이제 애국 마케팅은 그만!!)와  장점을 살린업데이트가 없어서 아쉽네요.

 

애국 마케팅에 집중하지 마시고  "기본부터 시작하는" 오피스 제품이 되었으면 좋겠습니다.

 

 

참고로 그리스어로 NEO 라는 뜻은 "새로운, 부활의" 이라는 의미를 가진다고 합니다.  한컴오피스 네오는 그러한 의미에 부합하기에는 많이 부족하네요. ^^a

 

 

Posted by 새로운시작
|

V3 9.0 업데이트 오류 오류코드 : 0 (V3 제거를 중지 ....

 

첨부파일을 실행해서   윈도우업데이트 일부를 제거합니다.

 

 

KB2949927_제거.bat

 

 

 

update2 Slient.bat

 

 

업데이트 진행시 반응이 없거나, 프로그램 삭제 중 3381f502 오류가 발생하는 경우

 

 

 

 

v3is_es_hotfix_~.zip

 

 

 

 

 

V3 제품에서 업데이트 진행시 아무 반응이 없거나 삭제 과정에서 "3381f502" 오류가 발생하는 경우, Microsoft Windows 업데이트 항목 중 KB2949927, KB3004394, KB3033929 파일과 충돌이 발생하는 문제로 확인됩니다.

 

문제 해결을 위해서 사용하시는 제품별 조치 방법을 확인해 주시기 바랍니다.

 

 

[공통 확인 사항]

1. PC 운영체제(OS)가 Windows 7, Winows Server 2008 R2인 경우

2. [제어판]-[프로그램 및 기능]-[설치된 업데이트 보기] 목록에서 KB2949927, KB3004394, KB3033929 항목이 존재하는 경우

 

 

1. V3 Internet Security 9.0/V3 Endpoint Security 9.0/V3 Net for Windows Server 9.0 제품 사용 고객

 

1) 제품 빌드 버전을 확인합니다.

    [V3 제품 실행]-> 오른쪽 상단의 물음표 기호(도움말) 클릭-> [제품정보]-> 제품 버전에서 확인

 

2) 제품 빌드 버전이 502 이상인 경우라면 아래의 순서로 진행합니다.

   * 빌드 버전이 510 이상인 경우 해당 사항이 없습니다.

 

3) 시스템을 재부팅 합니다.

 

4) 아래 링크를 클릭하여 파일을 다운로드한 뒤, 압축을 해제하여 마우스 우클릭- "관리자 권한으로 실행"을 선택합니다.

(해당 핫픽스는 실행 알림창이 별도로 발생하지 않음을 참고 부탁드립니다.)

 

        [파일 다운로드 링크](클릭)

 

5) 시스템을 다시 한 번 재부팅 합니다.

 

 

 

2. V3 MSS/V3 365 클리닉/V3 Lite 제품 사용 고객

1) 시스템을 재부팅 합니다.

2) 아래 링크를 클릭하여 파일을 다운로드한 뒤, 압축을 해제하여 마우스 우클릭- "관리자 권한으로 실행"을 선택합니다.

(해당 핫픽스는 실행 알림창이 별도로 발생하지 않음을 참고 부탁드립니다.)

 

     * V3 MSS 제품 사용 고객

       [파일 다운로드 링크](클릭)

 

     * V3 365 Clinic 사용 고객

       [파일 다운로드 링크](클릭)

 

    * V3 Lite 3.0 사용 고객

       [파일 다운로드 링크](클릭)

 

3) 시스템을 다시 한 번 재부팅 진행합니다.

Posted by 새로운시작
|

http://forum.xda-developers.com/showpost.php?p=17612559&postcount=110

방문해서, 하단의 TrevE_Logging_TestApp_v7.apk 파일을 받아서 설치하세요. 또는 첨부파일 다운로드.
제거하려면, 라이센스(유료) 버전이 있어야 한다고 합니다.

Logging Test App v7

Posted by 새로운시작
|

프로그래머와 일할 때 알아야 할 것

26 10

IT 관련 산업이 팽창하면서 프로그래머 혹은 개발자라고 불리는 직종의 사람들이 사회 각분야에서 활약하고 있다. 나 또한 그들과 하루하루를 호흡하는 사람으로써, 오늘은 이들이 어떤 생각을 갖고 있는 이들이며 이들을 대할 때는 어떤 부분을 생각해야 하는지 짚어보겠다.

새로운 것을 만드는 것에 열정을 가진 이들이다.

프로그래머들은 새로운 것을 창조하는 이들이다. 그들은 자신들이 하는 일이 세상을 변화시킬 수 있는 놀랄만한 작업이란 것을 대체로 잘 알고 있다. 그들은 자신의 창조물에 대해서 큰 자부심을 갖고 있고, 그들이 만든 그 창조물에 의해서 사람들이 만족할 때 더 큰 자부심을 갖는다. 따라서 단순 반복적인 일은 당신이 직접하거나 프로그래머가 아닌 이들과 나누고, 창의성을 자극하는 일들을 프로그래머에게 맡기는 것이 좋다.

개성이 넘치는 이들이 많다.

프로그래머들은 대다수가 개성있는 취미를 갖고 있다. 그뿐 아니라 자신을 나타내는데 소극적이지 않고 멋을 아는 사람들이다. 창의적인 취미를 많이들 갖고 있으며, 오랜시간 자리에 앉아 있어야 하는 직업적 특성상 운동의 중요성도 자각하고 있는 이들이 많다. 그래서 취미로 MTB, 권투, 피트니스 등 신체적인 활동이 많이 요구되는 취미를 갖고 있는 프로그래머들을 많이 봐왔다. 그리고 (대체로 운동을 좋아하는 사람들이 그러하듯) 신체가 건강한 만큼 정신도 건강한 이들을 많이 보아왔다. 그래서 프로그래머들과 함께 일을 하게 될 때는 그들과 공유할 만한 취미 하나 정도는 갖고 있는 것이 좋다.

합리적이고 이성적인 사고를 한다.

당연히 프로그래머여서 그럴수도 있지만 대단히 이성적인 사람들이 많다. 그리고 역지사지라는 사자성어처럼 상대방의 입장에서 생각하는 습관이 몸에 밴 사람이 많다. 프로그래밍의 궁극적 목표가 ‘결과물을 다른 사람이 편리하게 사용하는 것’이기 때문이라고 판단된다. 또한 그들은 시간을 합리적이고 효율성있게 활용하는 것을 대단히 중요하게 여긴다. 프로그램이라는 것이 결국은 사람들이 원하는 작업을 하는데 소요되는 시간을 줄여주고 그 시간에 더 가치있는 일을 할 수 있도록 도와주는 것이기 때문에, 그 프로그램을 만드는 이들도 시간을 낭비없이 활용하는 것을 중요시 여긴다. 그렇기 때문에 불필요하게 프로그래머의 시간을 낭비시키거나 당신도 할 수 있는 잡일을 그들에게 시키는 것은 그들에게 엄청난 결례이다.

일에 대해서 헌신적이다.

그들은 자신들의 일에 혼신을 다하는 장인들이다. 그리고 항상 결과물로 말한다. 최고의 결과물을 내기 위해서 밤을 새는 것도 마다하지 않는다. 우리 의사들이 자신이 하는 일에 사람의 생명이 걸려있어 성공적인 치료결과를 위해서 다른 많은 것을 희생하듯, 프로그래머도 최고의 결과물을 위해서라면 자신의 불편함은 기꺼이 감수한다. 따라서 프로그래머들을 대할 때는 그들이 일에 집중하고 있을 때 분심이 생기지 않도록 하는 것이 대단히 중요하다.

돈보다 더 중요한 가치를 추구한다.

가장 앞에서 이야기했듯 프로그래머들은 스스로가 세상을 바꿀 정도로 큰 잠재력이 있는 일을 하고 있다는 것을 대체로 잘 알고 있기 때문에, 눈 앞의 돈 몇푼에 크게 흔들리지 않는 사람들이 많다. 그 순수성이야말로 그들의 가장 큰 장점이고, 결과적으로 보았을 때 돈을 쫒는 이들보다 훨씬 큰 보상을 받을 수 있는 저력이 된다. (그와 반면에, 내가 업계를 돌아보면 상당히 많은 수의 경영자들이 그러한 프로그래머들의 순수성을 악용하여 제대로 대우하지 않고 있다는 것을 알고 있다. 또한 그런 경영자들은 거의 전부가 오래가지 못한다.) 따라서 프로그래머들과 함께 일하게 된다면 그들이 일하느라 신경을 쓰지 못하더라도 그들이 마땅히 가져가야 할 몫에 대해서 당신이 나서서 먼저 챙겨주는 배려가 반드시 필요하다.

신뢰를 중요시 여기는 사람들이다.

그들은 신뢰를 중요시 여긴다. 신뢰가 생명인 사업가들보다도 더 신뢰의 중요성을 이해하고 있는 듯 하다. 그래서 나는 본인을 사업가라고 소개하는 사람들은 일단 경계를 하더라도, 자신을 프로그래머나 개발자라고 소개하는 이들에게는 항상 마음을 열고 다가간다. 그들은 항상 내가 그들에게 보여준 믿음에 대해 실망보다는 보람을 안겨주었다. 이러한 그들의 신뢰에 대한 집착은 아마도 그들이 만든 프로그램이 약속대로 돌아게끔 해야하는 직업적 사명감 때문에 형성된 것일지도 모르겠다. 하지만 그들의 신뢰를 악용하고자 당신이 잔머리를 굴린다면 그것은 보통 사람들 이상의 역풍을 맞게 될 수도 있다. 신뢰의 깊이가 그만큼 크기 때문이다. 그렇기 때문에 항상 서로가 신뢰를 잃지 않도록 매사에 투명한 것이 프로그래머들과 일할 때 특히 중요하다고 하겠다.

나는 무엇보다도 프로그래머를 ‘도구’로 생각하는 이들을 볼 때 엄청난 분노를 느낀다. 절대 당신이 대우받고 싶지 않는 방식으로 남을 대우하지 말라. 또한, 프로그래머들은 그렇잖아도 많은 스트레스에 직면한 사람들이다. 항상 젊고 빠릿빠릿한 프로그래머들이 치고 올라오기 때문에 일반적인 직장인보다도 본업으로 승부를 볼 기간이 길지 않은 경우가 많다. 그렇지만 프로그래머 한사람 한사람을 들여다보면 대다수가 엄청난 잠재력을 지니고 있기 때문에 그들이 그들의 능력을 시간을 두고 축적해가며 지속적으로 발휘하지 못하게 되는 것은 사회 전체로 보았을 때도 큰 재앙이다. 우리가 그들과 한 사회를 이루고 살아가며, 그들에게 많은 혜택을 입고 사는 이상 이제는 우리도 그들의 목소리에 귀를 기울일 때가 되었다고 생각한다. 그래서 이 글을 쓴다.

원문 : http://clinicforum.com/2011/10/26/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%99%80-%EC%9D%BC%ED%95%A0-%EB%95%8C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EA%B2%83/

Posted by 새로운시작
|


노동부에 신고된 체불액 1조 3438억원.

체불 근로자 수 30만명.
그 문제를 파헤치고 대처법을 이야기하는 
사회생활 시뮬레이션.


출처 : http://hondoom.com/zbxe/?document_srl=327763



Posted by 새로운시작
|

안드로이드 SHOW(KT)용 APN 툴

http://newpds.tistory.com/attachment/cfile5.uf@141B85564D8804C108A49E.apk

인터넷에 많이 돌아다니는 툴이지만, 링크가 깨지거나 로그인을 요구하는 사이트가 너무 많아서
로그인 및 트래픽 걱정이 없는 블로그에 올려봅니다.
Posted by 새로운시작
|


Over a year ago I walked through an example of creating the basic foundation for a modal window using jQuery.  The goal was simplicity, minimalism, and flexibility to add-on functionality as needed.

As stated at the outset, this post was meant to illustrate a bare bones and simple example of a modal window. If you wanted to extend the functionality for example, it would be quite simple to [...] suit needs.

Last Year’s A Simple Modal Post

The example was well received in feedback from readers, and there was some constructive criticism as well. Equal to the amount of people that appreciated the minimalistic approach were requests from readers to support IE6, forms, and a host of other odds and ends.  Some readers had some useful feedback for features and additions that I purposefully did not include in an effort to keep things basic.

Therefore, I thought there was a nice opportunity to revisit the basic modal window script and make it a bit more comprehensive in an effort to suit the needs and requests of the aforementioned readers.  So before we get into the code, lets outline some things that have changed:

  • Converted for use as a jQuery plugin.
  • Added IE6 compatibility
  • Added Opera compatibility
  • Added ability to fade in and out
  • Added multiple ways of setting parameters
  • Added multiple content types (‘image’ and ‘iframe’)


출처 : http://deseloper.org/read/2009/10/jquery-simple-modal-window/

Posted by 새로운시작
|




 
"부족한 점의 수정 또는 사용자가 기능을 업데이트 할 경우 공개를 의무화" 한다는 조건 하 에 소스를 공개 합니다. 

  

본 소스는 원본에서 출력 부분만 한글화 되었습니다.

 

  

apc.php 소스는 아래와 같습니다.

 

<?php
/*
  +----------------------------------------------------------------------+
  | APC                                                                  |
  +----------------------------------------------------------------------+
  | Copyright (c) 2006 The PHP Group                                     |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.php.net/license/3_01.txt                                  |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Authors: Ralf Becker <beckerr@php.net>                               |
  |          Rasmus Lerdorf <rasmus@php.net>                             |
  |          Ilia Alshanetsky <ilia@prohost.org>                         |
  +----------------------------------------------------------------------+
  | Korean:  Newpds - Jeong An-Ryeol <http://www.sdisk.net>              |
  +----------------------------------------------------------------------+

   All other licensing and usage conditions are those of the PHP Group.

 */

$VERSION='$Id: apc.php,v 3.68 2007/07/22 00:25:48 gopalv Exp $';

////////// READ OPTIONAL CONFIGURATION FILE ////////////
//if (file_exists("apc.conf.php")) include("apc.conf.php");
////////////////////////////////////////////////////////

////////// BEGIN OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////

defaults('USE_AUTHENTICATION',1);            // Use (internal) authentication - best choice if 
                                            // no other authentication is available
                                            // If set to 0:
                                            //  There will be no further authentication. You 
                                            //  will have to handle this by yourself!
                                            // If set to 1:
                                            //  You need to change ADMIN_PASSWORD to make
                                            //  this work!
defaults('ADMIN_USERNAME','root');             // Admin Username
defaults('ADMIN_PASSWORD','');      // Admin Password - CHANGE THIS TO ENABLE!!!

// (beckerr) I'm using a clear text password here, because I've no good idea how to let 
//           users generate a md5 or crypt password in a easy way to fill it in above

//defaults('DATE_FORMAT', "d.m.Y H:i:s");    // German
defaults('DATE_FORMAT''Y/m/d H:i:s');     // US

defaults('GRAPH_SIZE',160);                    // Image size

////////// END OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////////


// "define if not defined"
function defaults($d,$v) {
    if (!
defined($d)) define($d,$v); // or just @define(...)
}

// rewrite $PHP_SELF to block XSS attacks
//
$PHP_SELF= isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],''), ENT_QUOTES) : '';
$time time();
$host getenv('HOSTNAME');
if(
$host) { $host '('.$host.')'; }

// operation constants
define('OB_HOST_STATS',1);
define('OB_SYS_CACHE',2);
define('OB_USER_CACHE',3);
define('OB_SYS_CACHE_DIR',4);
define('OB_VERSION_CHECK',9);

// check validity of input variables
$vardom=array(
    
'OB'    => '/^\d+$/',            // operational mode switch
    
'CC'    => '/^[01]$/',            // clear cache requested
    
'DU'    => '/^.*$/',            // Delete User Key
    
'SH'    => '/^[a-z0-9]+$/',        // shared object description

    
'IMG'    => '/^[123]$/',            // image to generate
    
'LO'    => '/^1$/',                // login requested

    
'COUNT'    => '/^\d+$/',            // number of line displayed in list
    
'SCOPE'    => '/^[AD]$/',            // list view scope
    
'SORT1'    => '/^[AHSMCDTZ]$/',    // first sort key
    
'SORT2'    => '/^[DA]$/',            // second sort key
    
'AGGR'    => '/^\d+$/',            // aggregation by dir level
    
'SEARCH'    => '~^[a-zA-Z0-1/_.-]*$~'            // aggregation by dir level
);

// default cache mode
$cache_mode='opcode';

// cache scope
$scope_list=array(
    
'A' => 'cache_list',
    
'D' => 'deleted_list'
);

// handle POST and GET requests
if (empty($_REQUEST)) {
    if (!empty(
$_GET) && !empty($_POST)) {
        
$_REQUEST array_merge($_GET$_POST);
    } else if (!empty(
$_GET)) {
        
$_REQUEST $_GET;
    } else if (!empty(
$_POST)) {
        
$_REQUEST $_POST;
    } else {
        
$_REQUEST = array();
    }
}

// check parameter syntax
foreach($vardom as $var => $dom) {
    if (!isset(
$_REQUEST[$var])) {
        
$MYREQUEST[$var]=NULL;
    } else if (!
is_array($_REQUEST[$var]) && preg_match($dom.'D',$_REQUEST[$var])) {
        
$MYREQUEST[$var]=$_REQUEST[$var];
    } else {
        
$MYREQUEST[$var]=$_REQUEST[$var]=NULL;
    }
}

// check parameter sematics
if (empty($MYREQUEST['SCOPE'])) $MYREQUEST['SCOPE']="A";
if (empty(
$MYREQUEST['SORT1'])) $MYREQUEST['SORT1']="H";
if (empty(
$MYREQUEST['SORT2'])) $MYREQUEST['SORT2']="D";
if (empty(
$MYREQUEST['OB']))    $MYREQUEST['OB']=OB_HOST_STATS;
if (!isset(
$MYREQUEST['COUNT'])) $MYREQUEST['COUNT']=20;
if (!isset(
$scope_list[$MYREQUEST['SCOPE']])) $MYREQUEST['SCOPE']='A';

$MY_SELF=
    
"$PHP_SELF".
    
"?SCOPE=".$MYREQUEST['SCOPE'].
    
"&SORT1=".$MYREQUEST['SORT1'].
    
"&SORT2=".$MYREQUEST['SORT2'].
    
"&COUNT=".$MYREQUEST['COUNT'];
$MY_SELF_WO_SORT=
    
"$PHP_SELF".
    
"?SCOPE=".$MYREQUEST['SCOPE'].
    
"&COUNT=".$MYREQUEST['COUNT'];

// authentication needed?
//
if (!USE_AUTHENTICATION) {
    
$AUTHENTICATED=1;
} else {
    
$AUTHENTICATED=0;
    if (
ADMIN_PASSWORD!='password' && ($MYREQUEST['LO'] == || isset($_SERVER['PHP_AUTH_USER']))) {

        if (!isset(
$_SERVER['PHP_AUTH_USER']) ||
            !isset(
$_SERVER['PHP_AUTH_PW']) ||
            
$_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||
            
$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
            
Header("WWW-Authenticate: Basic realm=\"APC 로그인\"");
            
Header("HTTP/1.0 401 Unauthorized");

            echo <<<EOB
                <html><body>
                <h1>인증 실패!</h1>
                <big>올바르지 않는 사용자 이름 또는 패스워드!</big><br/>&nbsp;<br/>&nbsp;
                <big><a href='$PHP_SELF?OB=
{$MYREQUEST['OB']}'>계속하기...</a></big>
                </body></html>
EOB;
            exit;
            
        } else {
            
$AUTHENTICATED=1;
        }
    }
}
    
// select cache mode
if ($AUTHENTICATED && $MYREQUEST['OB'] == OB_USER_CACHE) {
    
$cache_mode='user';
}
// clear cache
if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) {
    
apc_clear_cache($cache_mode);
}

if (
$AUTHENTICATED && !empty($MYREQUEST['DU'])) {
    
apc_delete($MYREQUEST['DU']);
}

if(!
function_exists('apc_cache_info') || !($cache=@apc_cache_info($cache_mode))) {
    echo 
"표시할 수 있는 캐시 정보가 없습니다. APC 모듈이 동작하지 않는 것으로 보입니다.";
  exit;
}

$cache_user apc_cache_info('user'1);  
$mem=apc_sma_info();
if(!
$cache['num_hits']) { $cache['num_hits']=1$time++; }  // Avoid division by 0 errors on a cache clear

// don't cache this page
//
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");                                    // HTTP/1.0

function duration($ts) {
    global 
$time;
    
$years = (int)((($time $ts)/(7*86400))/52.177457);
    
$rem = (int)(($time-$ts)-($years 52.177457 86400));
    
$weeks = (int)(($rem)/(7*86400));
    
$days = (int)(($rem)/86400) - $weeks*7;
    
$hours = (int)(($rem)/3600) - $days*24 $weeks*7*24;
    
$mins = (int)(($rem)/60) - $hours*60 $days*24*60 $weeks*7*24*60;
    
$str '';
    if(
$years==1$str .= "$years 년, ";
    if(
$years>1$str .= "$years 년 이상, ";
    if(
$weeks==1$str .= "$weeks 주, ";
    if(
$weeks>1$str .= "$weeks 주 이상, ";
    if(
$days==1$str .= "$days 일,";
    if(
$days>1$str .= "$days 일 이상,";
    if(
$hours == 1$str .= " $hours 시간 그리고";
    if(
$hours>1$str .= " $hours 시간 이상 그리고";
    if(
$mins == 1$str .= " 1 분";
    else 
$str .= " $mins 분 이상";
    return 
$str;
}

// create graphics
//
function graphics_avail() {
    return 
extension_loaded('gd');
}
if (isset(
$MYREQUEST['IMG']))
{
    if (!
graphics_avail()) {
        exit(
0);
    }

    function 
fill_arc($im$centerX$centerY$diameter$start$end$color1,$color2,$text='',$placeindex=0) {
        
$r=$diameter/2;
        
$w=deg2rad((360+$start+($end-$start)/2)%360);

        
        if (
function_exists("imagefilledarc")) {
            
// exists only if GD 2.0.1 is avaliable
            
imagefilledarc($im$centerX+1$centerY+1$diameter$diameter$start$end$color1IMG_ARC_PIE);
            
imagefilledarc($im$centerX$centerY$diameter$diameter$start$end$color2IMG_ARC_PIE);
            
imagefilledarc($im$centerX$centerY$diameter$diameter$start$end$color1IMG_ARC_NOFILL|IMG_ARC_EDGED);
        } else {
            
imagearc($im$centerX$centerY$diameter$diameter$start$end$color2);
            
imageline($im$centerX$centerY$centerX cos(deg2rad($start)) * $r$centerY sin(deg2rad($start)) * $r$color2);
            
imageline($im$centerX$centerY$centerX cos(deg2rad($start+1)) * $r$centerY sin(deg2rad($start)) * $r$color2);
            
imageline($im$centerX$centerY$centerX cos(deg2rad($end-1))   * $r$centerY sin(deg2rad($end))   * $r$color2);
            
imageline($im$centerX$centerY$centerX cos(deg2rad($end))   * $r$centerY sin(deg2rad($end))   * $r$color2);
            
imagefill($im,$centerX $r*cos($w)/2$centerY $r*sin($w)/2$color2);
        }
        if (
$text) {
            if (
$placeindex>0) {
                
imageline($im,$centerX $r*cos($w)/2$centerY $r*sin($w)/2,$diameter$placeindex*12,$color1);
                
imagestring($im,4,$diameter$placeindex*12,$text,$color1);    
                
            } else {
                
imagestring($im,4,$centerX $r*cos($w)/2$centerY $r*sin($w)/2,$text,$color1);
            }
        }
    } 

    function 
text_arc($im$centerX$centerY$diameter$start$end$color1,$text,$placeindex=0) {
        
$r=$diameter/2;
        
$w=deg2rad((360+$start+($end-$start)/2)%360);

        if (
$placeindex>0) {
            
imageline($im,$centerX $r*cos($w)/2$centerY $r*sin($w)/2,$diameter$placeindex*12,$color1);
            
imagestring($im,4,$diameter$placeindex*12,$text,$color1);    
                
        } else {
            
imagestring($im,4,$centerX $r*cos($w)/2$centerY $r*sin($w)/2,$text,$color1);
        }
    } 
    
    function 
fill_box($im$x$y$w$h$color1$color2,$text='',$placeindex='') {
        global 
$col_black;
        
$x1=$x+$w-1;
        
$y1=$y+$h-1;

        
imagerectangle($im$x$y1$x1+1$y+1$col_black);
        if(
$y1>$yimagefilledrectangle($im$x$y$x1$y1$color2);
        else 
imagefilledrectangle($im$x$y1$x1$y$color2);
        
imagerectangle($im$x$y1$x1$y$color1);
        if (
$text) {
            if (
$placeindex>0) {
            
                if (
$placeindex<16)
                {
                    
$px=5;
                    
$py=$placeindex*12+6;
                    
imagefilledrectangle($im$px+90$py+3$px+90-4$py-3$color2);
                    
imageline($im,$x,$y+$h/2,$px+90,$py,$color2);
                    
imagestring($im,2,$px,$py-6,$text,$color1);    
                    
                } else {
                    if (
$placeindex<31) {
                        
$px=$x+40*2;
                        
$py=($placeindex-15)*12+6;
                    } else {
                        
$px=$x+40*2+100*intval(($placeindex-15)/15);
                        
$py=($placeindex%15)*12+6;
                    }
                    
imagefilledrectangle($im$px$py+3$px-4$py-3$color2);
                    
imageline($im,$x+$w,$y+$h/2,$px,$py,$color2);
                    
imagestring($im,2,$px+2,$py-6,$text,$color1);    
                }
            } else {
                
imagestring($im,4,$x+5,$y1-16,$text,$color1);
            }
        }
    }


    
$size GRAPH_SIZE// image size
    
if ($MYREQUEST['IMG']==3)
        
$image imagecreate(2*$size+150$size+10);
    else
        
$image imagecreate($size+50$size+10);

    
$col_white imagecolorallocate($image0xFF0xFF0xFF);
    
$col_red   imagecolorallocate($image0xD00x60,  0x30);
    
$col_green imagecolorallocate($image0x600xF00x60);
    
$col_black imagecolorallocate($image,   0,   0,   0);
    
imagecolortransparent($image,$col_white);

    switch (
$MYREQUEST['IMG']) {
    
    case 
1:
        
$s=$mem['num_seg']*$mem['seg_size'];
        
$a=$mem['avail_mem'];
        
$x=$y=$size/2;
        
$fuzz 0.000001;

        
// This block of code creates the pie chart.  It is a lot more complex than you
        // would expect because we try to visualize any memory fragmentation as well.
        
$angle_from 0;
        
$string_placement=array();
        for(
$i=0$i<$mem['num_seg']; $i++) {    
            
$ptr 0;
            
$free $mem['block_lists'][$i];
            foreach(
$free as $block) {
                if(
$block['offset']!=$ptr) {       // Used block
                    
$angle_to $angle_from+($block['offset']-$ptr)/$s;
                    if((
$angle_to+$fuzz)>1$angle_to 1;
                    
fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red);
                    if ((
$angle_to-$angle_from)>0.05) {
                        
array_push($string_placement, array($angle_from,$angle_to));
                    }
                    
$angle_from $angle_to;
                }
                
$angle_to $angle_from+($block['size'])/$s;
                if((
$angle_to+$fuzz)>1$angle_to 1;
                
fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_green);
                if ((
$angle_to-$angle_from)>0.05) {
                    
array_push($string_placement, array($angle_from,$angle_to));
                }
                
$angle_from $angle_to;
                
$ptr $block['offset']+$block['size'];
            }
            if (
$ptr $mem['seg_size']) { // memory at the end 
                
$angle_to $angle_from + ($mem['seg_size'] - $ptr)/$s;
                if((
$angle_to+$fuzz)>1$angle_to 1;
                
fill_arc($image,$x,$y,$size,$angle_from*360,$angle_to*360,$col_black,$col_red);
                if ((
$angle_to-$angle_from)>0.05) {
                    
array_push($string_placement, array($angle_from,$angle_to));
                }
            }
        }
        foreach (
$string_placement as $angle) {
            
text_arc($image,$x,$y,$size,$angle[0]*360,$angle[1]*360,$col_black,bsize($s*($angle[1]-$angle[0])));
        }
        break;
        
    case 
2
        
$s=$cache['num_hits']+$cache['num_misses'];
        
$a=$cache['num_hits'];
        
        
fill_box($image30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s));
        
fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s));
        break;
        
    case 
3:
        
$s=$mem['num_seg']*$mem['seg_size'];
        
$a=$mem['avail_mem'];
        
$x=130;
        
$y=1;
        
$j=1;

        
// This block of code creates the bar chart.  It is a lot more complex than you
        // would expect because we try to visualize any memory fragmentation as well.
        
for($i=0$i<$mem['num_seg']; $i++) {    
            
$ptr 0;
            
$free $mem['block_lists'][$i];
            foreach(
$free as $block) {
                if(
$block['offset']!=$ptr) {       // Used block
                    
$h=(GRAPH_SIZE-5)*($block['offset']-$ptr)/$s;
                    if (
$h>0) {
                                                
$j++;
                        if(
$j<75fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($block['offset']-$ptr),$j);
                                                else 
fill_box($image,$x,$y,50,$h,$col_black,$col_red);
                                        }
                    
$y+=$h;
                }
                
$h=(GRAPH_SIZE-5)*($block['size'])/$s;
                if (
$h>0) {
                                        
$j++;
                    if(
$j<75fill_box($image,$x,$y,50,$h,$col_black,$col_green,bsize($block['size']),$j);
                    else 
fill_box($image,$x,$y,50,$h,$col_black,$col_green);
                                }
                
$y+=$h;
                
$ptr $block['offset']+$block['size'];
            }
            if (
$ptr $mem['seg_size']) { // memory at the end 
                
$h = (GRAPH_SIZE-5) * ($mem['seg_size'] - $ptr) / $s;
                if (
$h 0) {
                    
fill_box($image,$x,$y,50,$h,$col_black,$col_red,bsize($mem['seg_size']-$ptr),$j++);
                }
            }
        }
        break;
    case 
4
        
$s=$cache['num_hits']+$cache['num_misses'];
        
$a=$cache['num_hits'];
                
        
fill_box($image30,$size,50,-$a*($size-21)/$s,$col_black,$col_green,sprintf("%.1f%%",$cache['num_hits']*100/$s));
        
fill_box($image,130,$size,50,-max(4,($s-$a)*($size-21)/$s),$col_black,$col_red,sprintf("%.1f%%",$cache['num_misses']*100/$s));
        break;
    
    }
    
header("Content-type: image/png");
    
imagepng($image);
    exit;
}

// pretty printer for byte values
//
function bsize($s) {
    foreach (array(
'','K','M','G') as $i => $k) {
        if (
$s 1024) break;
        
$s/=1024;
    }
    return 
sprintf("%5.1f %sBytes",$s,$k);
}

// sortable table header in "scripts for this host" view
function sortheader($key,$name,$extra='') {
    global 
$MYREQUEST$MY_SELF_WO_SORT;
    
    if (
$MYREQUEST['SORT1']==$key) {
        
$MYREQUEST['SORT2'] = $MYREQUEST['SORT2']=='A' 'D' 'A';
    }
    return 
"<a class=sortable href=\"$MY_SELF_WO_SORT$extra&SORT1=$key&SORT2=".$MYREQUEST['SORT2']."\">$name</a>";

}

// create menu entry 
function menu_entry($ob,$title) {
    global 
$MYREQUEST,$MY_SELF;
    if (
$MYREQUEST['OB']!=$ob) {
        return 
"<li><a href=\"$MY_SELF&OB=$ob\">$title</a></li>";
    } else if (empty(
$MYREQUEST['SH'])) {
        return 
"<li><span class=active>$title</span></li>";
    } else {
        return 
"<li><a class=\"child_active\" href=\"$MY_SELF&OB=$ob\">$title</a></li>";    
    }
}

function 
put_login_link($s="로그인")
{
    global 
$MY_SELF,$MYREQUEST,$AUTHENTICATED;
    
// needs ADMIN_PASSWORD to be changed!
    //
    
if (!USE_AUTHENTICATION) {
        return;
    } else if (
ADMIN_PASSWORD=='password')
    {
        print <<<EOB
            <a href="#" onClick="javascript:alert('apc.php 를 사용하기 위해서는 사용자 인증이 필요 합니다!');return false";>$s</a>
EOB;
    } else if (
$AUTHENTICATED) {
        print <<<EOB
            {$_SERVER['PHP_AUTH_USER']} 로그인!
EOB;
    } else{
        print <<<EOB
            <a href="$MY_SELF&LO=1&OB={$MYREQUEST['OB']}">$s</a>
EOB;
    }
}


?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>APC 정보 <?php echo $host ?></title>
<style><!--
body { background:white; font-size:100.01%; margin:0; padding:0; }
body,p,td,th,input,submit { font-size:0.9em;font-family:돋움; }
* html body   {font-size:0.9em}
* html p      {font-size:0.8em}
* html td     {font-size:0.8em}
* html th     {font-size:0.8em}
* html input  {font-size:0.9em}
* html submit {font-size:0.9em}
//td { vertical-align:top }
td { vertical-align:center }
a { color:black; font-weight:none; text-decoration:none; }
a:hover { text-decoration:underline; }
//div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; }
div.content { padding:1em 1em 1em 1em; position:absolute; z-index:100; }


div.head div.login {
    position:absolute;
    right: 1em;
    top: 1.2em;
    color:white;
    width:6em;
    }
div.head div.login a {
    position:absolute;
    right: 0em;
    background:rgb(119,123,180);
    border:solid rgb(102,102,153) 2px;
    color:white;
    font-weight:bold;
    padding:0.1em 0.5em 0.1em 0.5em;
    text-decoration:none;
    }
div.head div.login a:hover {
    background:rgb(193,193,244);
    }

h1.apc { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; }
* html h1.apc { margin-bottom:-7px; }
h1.apc a:hover { text-decoration:none; color:rgb(90,90,90); }
h1.apc div.logo span.logo {
    background:rgb(119,123,180);
    color:black;
    border-right: solid black 1px;
    border-bottom: solid black 1px;
    font-style:italic;
    font-size:1em;
    padding-left:1.2em;
    padding-right:1.2em;
    text-align:right;
    }
h1.apc div.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; }
h1.apc div.nameinfo { color:white; display:inline; font-size:0.4em; margin-left: 3em; }
h1.apc div.copy { color:black; font-size:0.4em; position:absolute; right:1em; }
hr.apc {
    background:white;
    border-bottom:solid rgb(102,102,153) 1px;
    border-style:none;
    border-top:solid rgb(102,102,153) 10px;
    height:12px;
    margin:0;
    margin-top:1px;
    padding:0;
}

ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;}
ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%}
ol.menu a {
    background:rgb(153,153,204);
    border:solid rgb(102,102,153) 2px;
    color:white;
    font-weight:bold;
    margin-right:0em;
    padding:0.1em 0.5em 0.1em 0.5em;
    text-decoration:none;
    margin-left: 5px;
    }
ol.menu a.child_active {
    background:rgb(153,153,204);
    border:solid rgb(102,102,153) 2px;
    color:white;
    font-weight:bold;
    margin-right:0em;
    padding:0.1em 0.5em 0.1em 0.5em;
    text-decoration:none;
    border-left: solid black 5px;
    margin-left: 0px;
    }
ol.menu span.active {
    background:rgb(153,153,204);
    border:solid rgb(102,102,153) 2px;
    color:black;
    font-weight:bold;
    margin-right:0em;
    padding:0.1em 0.5em 0.1em 0.5em;
    text-decoration:none;
    border-left: solid black 5px;
    }
ol.menu span.inactive {
    background:rgb(193,193,244);
    border:solid rgb(182,182,233) 2px;
    color:white;
    font-weight:bold;
    margin-right:0em;
    padding:0.1em 0.5em 0.1em 0.5em;
    text-decoration:none;
    margin-left: 5px;
    }
ol.menu a:hover {
    background:rgb(193,193,244);
    text-decoration:none;
    }
    
    
div.info {
    background:rgb(204,204,204);
    border:solid rgb(204,204,204) 1px;
    margin-bottom:1em;
    }
div.info h2 {
    background:rgb(204,204,204);
    color:black;
    font-size:1em;
    margin:0;
    padding:0.1em 1em 0.1em 1em;
    }
div.info table {
    border:solid rgb(204,204,204) 1px;
    border-spacing:0;
    width:100%;
    }
div.info table th {
    background:rgb(204,204,204);
    color:white;
    margin:0;
    padding:0.1em 1em 0.1em 1em;
    }
div.info table th a.sortable { color:black; }
div.info table tr.tr-0 { background:rgb(238,238,238); }
div.info table tr.tr-1 { background:rgb(221,221,221); }
div.info table td { padding:0.3em 1em 0.3em 1em; }
div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; }
div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; }
div.info table td h3 {
    color:black;
    font-size:1.1em;
    margin-left:-0.3em;
    }

div.graph { margin-bottom:1em }
div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; }
div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; }
div.graph table td.td-0 { background:rgb(238,238,238); }
div.graph table td.td-1 { background:rgb(221,221,221); }
div.graph table td { padding:0.2em 1em 0.4em 1em; }

div.div1,div.div2 { margin-bottom:1em; width:35em; }
//div.div3 { position:absolute; left:40em; top:1em; width:580px; }
div.div3 { position:absolute; left:37em; top:1em; width:500px; }

div.sorting { margin:1.5em 0em 1.5em 2em }
.center { text-align:center }
.aright { position:absolute;right:1em }
.right { text-align:right }
.ok { color:rgb(0,200,0); font-weight:bold}
.failed { color:rgb(200,0,0); font-weight:bold}

span.box {
    border: black solid 1px;
    border-right:solid black 2px;
    border-bottom:solid black 2px;
    padding:0 0.5em 0 0.5em;
    margin-right:1em;
}
span.green { background:#60F060; padding:0 0.5em 0 0.5em}
span.red { background:#D06030; padding:0 0.5em 0 0.5em }

div.authneeded {
    background:rgb(238,238,238);
    border:solid rgb(204,204,204) 1px;
    color:rgb(200,0,0);
    font-size:1.2em;
    font-weight:bold;
    padding:2em;
    text-align:center;
    }
    
input {
    background:rgb(153,153,204);
    border:solid rgb(102,102,153) 2px;
    color:white;
    font-weight:bold;
    margin-right:1em;
    padding:0.1em 0.5em 0.1em 0.5em;
    }
//-->
</style>
</head>
<body>
<div class="head">
    <h1 class="apc">
        <div class="logo"><span class="logo">APC</span></div>
        <div class="nameinfo">Opcode 캐시</div>
    </h1>
    <div class="login">
    <?php put_login_link(); ?>
    </div>
    <hr class="apc">
</div>
<?php


// Display main Menu
echo <<<EOB
    <ol class=menu>
    <li><a href="$MY_SELF&OB=
{$MYREQUEST['OB']}&SH={$MYREQUEST['SH']}">정보 새로 고침</a></li>
EOB;
echo
    
menu_entry(1,'호스트 통계'),
    
menu_entry(2,'시스템 캐시');
if (
$AUTHENTICATED) {
    echo 
menu_entry(4,'부모 디렉토리');
}
echo
    
menu_entry(3,'사용자 캐시'),
    
menu_entry(9,'APC 버전');
    
if (
$AUTHENTICATED) {
    echo <<<EOB
        <li><a class="aright" href="$MY_SELF&CC=1&OB={$MYREQUEST['OB']}" onClick="javascipt:return confirm('정말로 캐시를 정리 하시겠습니까?');">$cache_mode 캐시 정리</a></li>
EOB;
}
echo <<<EOB
    </ol>
EOB;


// CONTENT
echo <<<EOB
    <div class=content>
EOB;

// MAIN SWITCH STATEMENT 

switch ($MYREQUEST['OB']) {





// -----------------------------------------------
// Host Stats
// -----------------------------------------------
case OB_HOST_STATS:
    
$mem_size $mem['num_seg']*$mem['seg_size'];
    
$mem_avail$mem['avail_mem'];
    
$mem_used $mem_size-$mem_avail;
    
$seg_size bsize($mem['seg_size']);
    
$req_rate sprintf("%.2f",($cache['num_hits']+$cache['num_misses'])/($time-$cache['start_time']));
    
$hit_rate sprintf("%.2f",($cache['num_hits'])/($time-$cache['start_time']));
    
$miss_rate sprintf("%.2f",($cache['num_misses'])/($time-$cache['start_time']));
    
$insert_rate sprintf("%.2f",($cache['num_inserts'])/($time-$cache['start_time']));
    
$req_rate_user sprintf("%.2f",($cache_user['num_hits']+$cache_user['num_misses'])/($time-$cache_user['start_time']));
    
$hit_rate_user sprintf("%.2f",($cache_user['num_hits'])/($time-$cache_user['start_time']));
    
$miss_rate_user sprintf("%.2f",($cache_user['num_misses'])/($time-$cache_user['start_time']));
    
$insert_rate_user sprintf("%.2f",($cache_user['num_inserts'])/($time-$cache_user['start_time']));
    
$apcversion phpversion('apc');
    
$phpversion phpversion();
    
$number_files $cache['num_entries']; 
    
$size_files bsize($cache['mem_size']);
    
$number_vars $cache_user['num_entries'];
    
$size_vars bsize($cache_user['mem_size']);
    
$i=0;
    echo <<< EOB
        <div class="info div1"><h2>일반 캐시</h2>
        <table cellspacing=0><tbody>
        <tr class=tr-0><td class=td-0>APC 버전</td><td>$apcversion</td></tr>
        <tr class=tr-1><td class=td-0>PHP 버전</td><td>$phpversion</td></tr>
EOB;

    if(!empty(
$_SERVER['SERVER_NAME']))
        echo 
"<tr class=tr-0><td class=td-0>APC 호스트</td><td>{$_SERVER['SERVER_NAME']} $host</td></tr>\n";
    if(!empty(
$_SERVER['SERVER_SOFTWARE']))
        echo 
"<tr class=tr-1><td class=td-0>서버 소프트웨어</td><td>{$_SERVER['SERVER_SOFTWARE']}</td></tr>\n";

    echo <<<EOB
        <tr class=tr-0><td class=td-0>공유 메모리</td><td> 전체 {$mem['num_seg']} 개, 용량 {$seg_size}
    <br/> ( 메모리 타입: 
{$cache['memory_type']} , 락 타입: {$cache['locking_type']} )
    </td></tr>
EOB;
    echo   
'<tr class=tr-1><td class=td-0>시작 시간</td><td>',date(DATE_FORMAT,$cache['start_time']),'</td></tr>';
    echo   
'<tr class=tr-0><td class=td-0>기동 시간</td><td>',duration($cache['start_time']),'</td></tr>';
    echo   
'<tr class=tr-1><td class=td-0>파일 업로드 지원</td><td>',$cache['file_upload_progress'],'</td></tr>';
    echo <<<EOB
        </tbody></table>
        </div>

        <div class="info div1"><h2>파일 캐시</h2>
        <table cellspacing=0><tbody>
        <tr class=tr-0><td class=td-0>캐시된 파일</td><td>$number_files ($size_files)</td></tr>
        <tr class=tr-1><td class=td-0>적용된 수</td><td>
{$cache['num_hits']}</td></tr>
        <tr class=tr-0><td class=td-0>적용되지 않은 수</td><td>
{$cache['num_misses']}</td></tr>
        <tr class=tr-1><td class=td-0>적용된 /적용되지 않은 비율의 합</td><td>$req_rate (요청된 캐시/초)</td></tr>
        <tr class=tr-0><td class=td-0>적용된 비율</td><td>$hit_rate (요청된 캐시/초)</td></tr>
        <tr class=tr-1><td class=td-0>적용되지 않은 비율</td><td>$miss_rate (요청된 캐시/초)</td></tr>
        <tr class=tr-0><td class=td-0>삽입 비율</td><td>$insert_rate (요청된 캐시/초)</td></tr>
        <tr class=tr-1><td class=td-0>전체 캐시 수</td><td>
{$cache['expunges']}</td></tr>
        </tbody></table>
        </div>

        <div class="info div1"><h2>사용자 캐시</h2>
        <table cellspacing=0><tbody>
    <tr class=tr-0><td class=td-0>캐시된 파일</td><td>$number_vars ($size_vars)</td></tr>
        <tr class=tr-1><td class=td-0>적용된 수</td><td>
{$cache_user['num_hits']}</td></tr>
        <tr class=tr-0><td class=td-0>적용되지 않은 수</td><td>
{$cache_user['num_misses']}</td></tr>
        <tr class=tr-1><td class=td-0>적용된 /적용되지 않은 비율의 합</td><td>$req_rate_user (요청된 캐시/초)</td></tr>
        <tr class=tr-0><td class=td-0>적용된 비율</td><td>$hit_rate_user (요청된 캐시/초)</td></tr>
        <tr class=tr-1><td class=td-0>적용되지 않은 비율</td><td>$miss_rate_user (요청된 캐시/초)</td></tr>
        <tr class=tr-0><td class=td-0>삽입 비율</td><td>$insert_rate_user (요청된 캐시/초)</td></tr>
        <tr class=tr-1><td class=td-0>전체 캐시 수</td><td>
{$cache_user['expunges']}</td></tr>

        </tbody></table>
        </div>

        <div class="info div2"><h2>동작 설정</h2><table cellspacing=0><tbody>
EOB;

    
$j 0;
    foreach (
ini_get_all('apc') as $k => $v) {
        
//newpds
        //echo "<tr class=tr-$j><td class=td-0>",$k,"</td><td>",str_replace(',',',<br />',$v['local_value']),"</td></tr>\n";
        
echo "<tr class=tr-$j><td class=td-0>",$k,"</td><td>";
        if (
$AUTHENTICATED) { 
            echo 
str_replace(',',',<br />',$v['local_value']);
        }
        else
        {
            echo 
"<i>&lt;표시하지 않음&gt;</i>";
        }
        echo 
"</td></tr>\n";
        
        
$j $j;
    }


    if(
$mem['num_seg']>|| $mem['num_seg']==&& count($mem['block_lists'][0])>1)
        
$mem_note "메모리 사용<br />( 단편화 조각 표시 )";
    else
        
$mem_note "메모리 사용";

    echo <<< EOB
        </tbody></table>
        </div>

        <div class="graph div3"><h2>호스트 통계 표시</h2>
        <table cellspacing=0><tbody>
EOB;
    
$size='width='.(GRAPH_SIZE+50).' height='.(GRAPH_SIZE+10);
    echo <<<EOB
        <tr>
        <td class=td-0>$mem_note</td>
        <td class=td-1>적용된 수 &amp; 적용되지 않은 수의 비율</td>
        </tr>
EOB;

    echo
        
graphics_avail() ? 
              
'<tr>'.
              
"<td class=td-0><img alt=\"\" $size src=\"$PHP_SELF?IMG=1&$time\"></td>".
              
"<td class=td-1><img alt=\"\" $size src=\"$PHP_SELF?IMG=2&$time\"></td></tr>\n"
            
"",
        
'<tr>',
        
'<td class=td-0><span class="green box">&nbsp;</span>여유 공간: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size),"</td>\n",
        
'<td class=td-1><span class="green box">&nbsp;</span>적용된 수: ',$cache['num_hits'].sprintf(" (%.1f%%)",$cache['num_hits']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n",
        
'</tr>',
        
'<tr>',
        
'<td class=td-0><span class="red box">&nbsp;</span>사용 공간: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size),"</td>\n",
        
'<td class=td-1><span class="red box">&nbsp;</span>적용되지 않은 수: ',$cache['num_misses'].sprintf(" (%.1f%%)",$cache['num_misses']*100/($cache['num_hits']+$cache['num_misses'])),"</td>\n";
    echo <<< EOB
        </tr>
        </tbody></table>

        <br/>
        <h2>상세한 메모리 사용률 및 조각 비율</h2>
        <table cellspacing=0><tbody>
        <tr>
        <td class=td-0 colspan=2><br/>
EOB;

    
// Fragementation: (freeseg - 1) / total_seg
    
$nseg $freeseg $fragsize $freetotal 0;
    for(
$i=0$i<$mem['num_seg']; $i++) {
        
$ptr 0;
        foreach(
$mem['block_lists'][$i] as $block) {
            if (
$block['offset'] != $ptr) {
                ++
$nseg;
            }
            
$ptr $block['offset'] + $block['size'];
                        
/* Only consider blocks <5M for the fragmentation % */
                        
if($block['size']<(5*1024*1024)) $fragsize+=$block['size'];
                        
$freetotal+=$block['size'];
        }
        
$freeseg += count($mem['block_lists'][$i]);
    }
    
    if (
$freeseg 1) {
        
//38.28% (6.0 MBytes out of 15.7 MBytes in 6 fragments) 
        
$frag sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize/$freetotal)*100,bsize($fragsize),bsize($freetotal),$freeseg);
        
$frag sprintf("%.2f%% (%s 중 %s 를 %d 개로 조각)", ($fragsize/$freetotal)*100,bsize($freetotal),bsize($fragsize),$freeseg);

    } else {
        
$frag "0%";
    }

    if (
graphics_avail()) {
        
$size='width='.(2*GRAPH_SIZE+150).' height='.(GRAPH_SIZE+10);
        echo <<<EOB
            <img alt="" $size src="$PHP_SELF?IMG=3&$time">
EOB;
    }
    echo <<<EOB
        </br>조각 비율: $frag
        </td>
        </tr>
EOB;
        if(isset(
$mem['adist'])) {
          foreach(
$mem['adist'] as $i=>$v) {
            
$cur pow(2,$i); $nxt pow(2,$i+1)-1;
            if(
$i==0$range "1";
            else 
$range "$cur - $nxt";
            echo 
"<tr><th align=right>$range</th><td align=right>$v</td></tr>\n";
          }
        }
        echo <<<EOB
        </tbody></table>
        </div>
EOB;
        
    break;


// -----------------------------------------------
// User Cache Entries
// -----------------------------------------------
case OB_USER_CACHE:
    if (!
$AUTHENTICATED) {
        echo 
'<div class="authneeded">사용자 캐시 정보를 보기 위해서 로그인이 필요 합니다!<br/>&nbsp;<br/>';
        
put_login_link("로그인 하기!");
        echo 
'</div>';
        break;
    }
    
$fieldname='info';
    
$fieldheading='User Entry Label';
    
$fieldkey='info';

// -----------------------------------------------
// System Cache Entries        
// -----------------------------------------------
case OB_SYS_CACHE:    
    if (!isset(
$fieldname))
    {
        
$fieldname='filename';
        
$fieldheading='스크립트 파일명';
        if(
ini_get("apc.stat")) $fieldkey='inode';
        else 
$fieldkey='filename'
    }
    if (!empty(
$MYREQUEST['SH']))
    {
        echo <<< EOB
            <div class="info"><table cellspacing=0 style="width:1010px;"><tbody>
            <tr><th>속성</th><th>값</th></tr>
EOB;

        
$m=0;
        foreach(
$scope_list as $j => $list) {
            foreach(
$cache[$list] as $i => $entry) {
                if (
md5($entry[$fieldkey])!=$MYREQUEST['SH']) continue;
                foreach(
$entry as $k => $value) {
                    if (!
$AUTHENTICATED) {
                        
// hide all path entries if not logged in
                        
$value=preg_replace('/^.*(\\/|\\\\)/','<i>&lt;표시하지 않음&gt;</i>/',$value);
                        if(
$k == "filename")    $value="<i>&lt;표시하지 않음&gt;</i>";    //newpds
                    
}

                    if (
$k == "num_hits") {
                        
$value=sprintf("%s (%.2f%%)",$value,$value*100/$cache['num_hits']);
                    }
                    if (
$k == 'deletion_time') {
                        if(!
$entry['deletion_time']) $value "None";
                    }
                    echo
                        
"<tr class=tr-$m>",
                        
"<td class=td-0>",ucwords(preg_replace("/_/"," ",$k)),"</td>",
                        
"<td class=td-last>",(preg_match("/time/",$k) && $value!='None') ? date(DATE_FORMAT,$value) : $value,"</td>",
                        
"</tr>";
                    
$m=1-$m;
                }
                if(
$fieldkey=='info') {
                    echo 
"<tr class=tr-$m><td class=td-0>저장된 값</td><td class=td-last><pre>";
                    
$output var_export(apc_fetch($entry[$fieldkey]),true);
                    echo 
htmlspecialchars($output);
                    echo 
"</pre></td></tr>\n";
                }
                break;
            }
        }

        echo <<<EOB
            </tbody></table>
            </div>
EOB;
        break;
    }

    
$cols=6;
    echo <<<EOB
        <div class=sorting><form>범위:
        <input type=hidden name=OB value=
{$MYREQUEST['OB']}>
        <select name=SCOPE>
EOB;
    echo 
        
"<option value=A",$MYREQUEST['SCOPE']=='A' " selected":"",">활동</option>",
        
"<option value=D",$MYREQUEST['SCOPE']=='D' " selected":"",">활동 안함</option>",
        
"</select>",
        
", 정렬 기준:<select name=SORT1>",
        
"<option value=H",$MYREQUEST['SORT1']=='H' " selected":"",">전체 방문자 수</option>",
        
"<option value=Z",$MYREQUEST['SORT1']=='Z' " selected":"",">용량</option>",
        
"<option value=S",$MYREQUEST['SORT1']=='S' " selected":"",">$fieldheading</option>",
        
"<option value=A",$MYREQUEST['SORT1']=='A' " selected":"",">마지막 접속</option>",
        
"<option value=M",$MYREQUEST['SORT1']=='M' " selected":"",">마지막 수정</option>",
        
"<option value=C",$MYREQUEST['SORT1']=='C' " selected":"",">생성 날짜</option>",
        
"<option value=D",$MYREQUEST['SORT1']=='D' " selected":"",">삭제 날짜</option>";
    if(
$fieldname=='info') echo
        
"<option value=D",$MYREQUEST['SORT1']=='T' " selected":"",">시간 종료</option>";
    echo 
        
'</select>',
        
'<select name=SORT2>',
        
'<option value=D',$MYREQUEST['SORT2']=='D' ' selected':'','>내림 차순</option>',
        
'<option value=A',$MYREQUEST['SORT2']=='A' ' selected':'','>오름 차순</option>',
        
'</select>',
        
'<select name=COUNT onChange="form.submit()">',
        
'<option value=10 ',$MYREQUEST['COUNT']=='10' ' selected':'','>전체 10위</option>',
        
'<option value=20 ',$MYREQUEST['COUNT']=='20' ' selected':'','>전체 20위</option>',
        
'<option value=50 ',$MYREQUEST['COUNT']=='50' ' selected':'','>전체 50위</option>',
        
'<option value=100',$MYREQUEST['COUNT']=='100'' selected':'','>전체 100위</option>',
        
'<option value=150',$MYREQUEST['COUNT']=='150'' selected':'','>전체 150위</option>',
        
'<option value=200',$MYREQUEST['COUNT']=='200'' selected':'','>전체 200위</option>',
        
'<option value=500',$MYREQUEST['COUNT']=='500'' selected':'','>전체 500위</option>',
        
'<option value=0  ',$MYREQUEST['COUNT']=='0'  ' selected':'','>모두</option>',
        
'</select>',
    
'&nbsp; 검색: <input name=SEARCH value="',$MYREQUEST['SEARCH'],'" type=text size=25/>',
        
'&nbsp;<input type=submit value="진행!">',
        
'</form></div>',

        
'<div class="info"><table cellspacing=0 style="width:1010px;"><tbody>',
        
'<tr>',
        
'<th>',sortheader('S',$fieldheading,  "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('H','Hits',         "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('Z','Size',         "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('A','Last accessed',"&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('M','Last modified',"&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('C','Created at',   "&OB=".$MYREQUEST['OB']),'</th>';

    if(
$fieldname=='info') {
        
$cols+=2;
         echo 
'<th>',sortheader('T','Timeout',"&OB=".$MYREQUEST['OB']),'</th>';
    }
    echo 
'<th>',sortheader('D','Deleted at',"&OB=".$MYREQUEST['OB']),'</th></tr>';

    
// builds list with alpha numeric sortable keys
    //
    
$list = array();
    foreach(
$cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) {
        switch(
$MYREQUEST['SORT1']) {
            case 
'A'$k=sprintf('%015d-',$entry['access_time']);     break;
            case 
'H'$k=sprintf('%015d-',$entry['num_hits']);         break;
            case 
'Z'$k=sprintf('%015d-',$entry['mem_size']);         break;
            case 
'M'$k=sprintf('%015d-',$entry['mtime']);            break;
            case 
'C'$k=sprintf('%015d-',$entry['creation_time']);    break;
            case 
'T'$k=sprintf('%015d-',$entry['ttl']);            break;
            case 
'D'$k=sprintf('%015d-',$entry['deletion_time']);    break;
            case 
'S'$k='';                                        break;
        }
        if (!
$AUTHENTICATED) {
            
// hide all path entries if not logged in
            
$list[$k.$entry[$fieldname]]=preg_replace('/^.*(\\/|\\\\)/','<i>&lt;표시하지 않음&gt;</i>/',$entry);
        } else {
            
$list[$k.$entry[$fieldname]]=$entry;
        }
    }

    if (
$list) {
        
        
// sort list
        //
        
switch ($MYREQUEST['SORT2']) {
            case 
"A":    krsort($list);    break;
            case 
"D":    ksort($list);    break;
        }
        
        
// output list
        
$i=0;
        foreach(
$list as $k => $entry) {
      if(!
$MYREQUEST['SEARCH'] || preg_match('/'.$MYREQUEST['SEARCH'].'/i'$entry[$fieldname]) != 0) {  
        if (!
$AUTHENTICATED)    $entry['filename']="<i>&lt;표시하지 않음&gt;</i>";    //newpds
        
echo
          
'<tr class=tr-',$i%2,'>',
          
"<td class=td-0 style='width:350px;word-break:break-all;'><a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&SH=",md5($entry[$fieldkey]),"\">",$entry[$fieldname],'</a></td>',
          
'<td class="td-n center">',$entry['num_hits'],'</td>',
          
'<td class="td-n right">',$entry['mem_size'],'</td>',
          
'<td class="td-n center">',date(DATE_FORMAT,$entry['access_time']),'</td>',
          
'<td class="td-n center">',date(DATE_FORMAT,$entry['mtime']),'</td>',
          
'<td class="td-n center">',date(DATE_FORMAT,$entry['creation_time']),'</td>';    //newpds

        
if($fieldname=='info') {
          if(
$entry['ttl'])
            echo 
'<td class="td-n center">'.$entry['ttl'].' 초</td>';
          else
            echo 
'<td class="td-n center">정보 없음</td>';
        }
        if (
$entry['deletion_time']) {

          echo 
'<td class="td-last center">'date(DATE_FORMAT,$entry['deletion_time']), '</td>';
        } else if (
$MYREQUEST['OB'] == OB_USER_CACHE) {

          echo 
'<td class="td-last center">';
          echo 
'[<a href="'$MY_SELF'&OB='$MYREQUEST['OB'], '&DU='urlencode($entry[$fieldkey]), '">삭제</a>]';
          echo 
'</td>';
        } else {
          echo 
'<td class="td-last center"> &nbsp; </td>';
        }
        echo 
'</tr>';
        
$i++;
        if (
$i == $MYREQUEST['COUNT'])
          break;
      }
        }
        
    } else {
        echo 
'<tr class=tr-0><td class="center" colspan=',$cols,'><i>데이터 없음</i></td></tr>';
    }
    echo <<< EOB
        </tbody></table>
EOB;

    if (
$list && $i count($list)) {
        echo 
"<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>자세한 정보 표시 ( 나머지: ",count($list)-$i,'개 ) ...</i></a>';
    }

    echo <<< EOB
        </div>
EOB;
    break;


// -----------------------------------------------
// Per-Directory System Cache Entries
// -----------------------------------------------
case OB_SYS_CACHE_DIR:    
    if (!
$AUTHENTICATED) {
        break;
    }

    echo <<<EOB
        <div class=sorting><form>범위:
        <input type=hidden name=OB value=
{$MYREQUEST['OB']}>
        <select name=SCOPE>
EOB;
    echo 
        
"<option value=A",$MYREQUEST['SCOPE']=='A' " selected":"",">활동</option>",
        
"<option value=D",$MYREQUEST['SCOPE']=='D' " selected":"",">활동 안함</option>",
        
"</select>",
        
", 정렬 기준:<select name=SORT1>",
        
"<option value=H",$MYREQUEST['SORT1']=='H' " selected":"",">전체 방문자 수</option>",
        
"<option value=Z",$MYREQUEST['SORT1']=='Z' " selected":"",">전체 용량</option>",
        
"<option value=T",$MYREQUEST['SORT1']=='T' " selected":"",">파일(들) 갯수</option>",
        
"<option value=S",$MYREQUEST['SORT1']=='S' " selected":"",">디렉토리 이름</option>",
        
"<option value=A",$MYREQUEST['SORT1']=='A' " selected":"",">(평균) 용량</option>",
        
"<option value=C",$MYREQUEST['SORT1']=='C' " selected":"",">(평균) 방문자 수</option>",
        
'</select>',
        
'<select name=SORT2>',
        
'<option value=D',$MYREQUEST['SORT2']=='D' ' selected':'','>내림 차순</option>',
        
'<option value=A',$MYREQUEST['SORT2']=='A' ' selected':'','>오름 차순</option>',
        
'</select>',
        
'<select name=COUNT onChange="form.submit()">',
        
'<option value=10 ',$MYREQUEST['COUNT']=='10' ' selected':'','>전체 10위</option>',
        
'<option value=20 ',$MYREQUEST['COUNT']=='20' ' selected':'','>전체 20위</option>',
        
'<option value=50 ',$MYREQUEST['COUNT']=='50' ' selected':'','>전체 50위</option>',
        
'<option value=100',$MYREQUEST['COUNT']=='100'' selected':'','>전체 100위</option>',
        
'<option value=150',$MYREQUEST['COUNT']=='150'' selected':'','>전체 150위</option>',
        
'<option value=200',$MYREQUEST['COUNT']=='200'' selected':'','>전체 200위</option>',
        
'<option value=500',$MYREQUEST['COUNT']=='500'' selected':'','>전체 500위</option>',
        
'<option value=0  ',$MYREQUEST['COUNT']=='0'  ' selected':'','>모두</option>',
        
'</select>',
        
", 디렉토리 그룹:<select name=AGGR>",
        
"<option value='' selected>없음</option>";
        for (
$i 1$i 10$i++)
            echo 
"<option value=$i",$MYREQUEST['AGGR']==$i " selected":"",">$i 레벨</option>";
        echo 
'</select>',
        
'&nbsp;<input type=submit value="진행!">',
        
'</form></div>',

        
'<div class="info"><table cellspacing=0 style="width:1010px;"><tbody>',
        
'<tr>',
        
'<th>',sortheader('S','디렉토리 이름',    "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('T','Number of Files',"&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('H','Total Hits',    "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('Z','Total Size',    "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('C','Avg. Hits',    "&OB=".$MYREQUEST['OB']),'</th>',
        
'<th>',sortheader('A','Avg. Size',    "&OB=".$MYREQUEST['OB']),'</th>',
        
'</tr>';

    
// builds list with alpha numeric sortable keys
    //
    
$tmp $list = array();
    foreach(
$cache[$scope_list[$MYREQUEST['SCOPE']]] as $entry) {
        
$n dirname($entry['filename']);
        if (
$MYREQUEST['AGGR'] > 0) {
            
$n preg_replace("!^(/?(?:[^/\\\\]+[/\\\\]){".($MYREQUEST['AGGR']-1)."}[^/\\\\]*).*!""$1"$n);
        }
        if (!isset(
$tmp[$n])) {
            
$tmp[$n] = array('hits'=>0,'size'=>0,'ents'=>0);
        }
        
$tmp[$n]['hits'] += $entry['num_hits'];
        
$tmp[$n]['size'] += $entry['mem_size'];
        ++
$tmp[$n]['ents'];
    }

    foreach (
$tmp as $k => $v) {
        switch(
$MYREQUEST['SORT1']) {
            case 
'A'$kn=sprintf('%015d-',$v['size'] / $v['ents']);break;
            case 
'T'$kn=sprintf('%015d-',$v['ents']);        break;
            case 
'H'$kn=sprintf('%015d-',$v['hits']);        break;
            case 
'Z'$kn=sprintf('%015d-',$v['size']);        break;
            case 
'C'$kn=sprintf('%015d-',$v['hits'] / $v['ents']);break;
            case 
'S'$kn $k;                    break;
        }
        
$list[$kn.$k] = array($k$v['ents'], $v['hits'], $v['size']);
    }

    if (
$list) {
        
        
// sort list
        //
        
switch ($MYREQUEST['SORT2']) {
            case 
"A":    krsort($list);    break;
            case 
"D":    ksort($list);    break;
        }
        
        
// output list
        
$i 0;
        foreach(
$list as $entry) {
            echo
                
'<tr class=tr-',$i%2,'>',
                
"<td class=td-0>",$entry[0],'</a></td>',
                
'<td class="td-n center">',$entry[1],'</td>',
                
'<td class="td-n center">',$entry[2],'</td>',
                
'<td class="td-n center">',$entry[3],'</td>',
                
'<td class="td-n center">',round($entry[2] / $entry[1]),'</td>',
                
'<td class="td-n center">',round($entry[3] / $entry[1]),'</td>',
                
'</tr>';

            if (++
$i == $MYREQUEST['COUNT']) break;
        }
        
    } else {
        echo 
'<tr class=tr-0><td class="center" colspan=6><i>데이터 없음</i></td></tr>';
    }
    echo <<< EOB
        </tbody></table>
EOB;

    if (
$list && $i count($list)) {
        echo 
"<a href=\"$MY_SELF&OB=",$MYREQUEST['OB'],"&COUNT=0\"><i>자세한 정보 표시 ( 나머지: ",count($list)-$i,'개 ) ...</i></a>';
    }

    echo <<< EOB
        </div>
EOB;
    break;

// -----------------------------------------------
// Version check
// -----------------------------------------------
case OB_VERSION_CHECK:
    if (!
$AUTHENTICATED) {
        echo 
'<div class="authneeded">APC 버전 정보를 보기 위해서 로그인이 필요 합니다!<br/>&nbsp;<br/>';
        
put_login_link("로그인 하기!");
        echo 
'</div>';
        break;
    }
//newpds
    
echo <<<EOB
        <div class="info"><h2>APC 버전 정보</h2>
        <table cellspacing=0 style="width:1010px;"><tbody>
        <tr>
        <th></th>
        </tr>
EOB;

    
$rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apc.rss");
    if (!
$rss) {
        echo 
'<tr class="td-last center"><td>APC 버전 정보를 가져올 수 없습니다.</td></tr>';
    } else {
        
$apcversion phpversion('apc');

        
preg_match('!<title>APC ([0-9.]+)</title>!'$rss$match);
        echo 
'<tr class="tr-0 center"><td>';
        if (
version_compare($apcversion$match[1], '>=')) {
            echo 
'<div class="ok">최신 버전의 APC 를 사용하고 있습니다. ( 사용 버전: '.$apcversion.' )</div>';
            
$i 3;
        } else {
            echo 
'<div class="failed">오래된 버전의 APC 를 사용하고 있습니다. ( 사용 버전: '.$apcversion.' ), 
                <a href="http://pecl.php.net/package/APC/'
.$match[1].'">여기
                http://pecl.php.net/package/APC/'
.$match[1].'</a> 에서 ( 최신 버전: '.$match[1].' ) 을 업그레이드 하실 수 있습니다.
                </div>'
;
            
$i = -1;
        }
        echo 
'</td></tr>';
        echo 
'<tr class="tr-0"><td><h3>변경 사항:</h3><br/>';

        
preg_match_all('!<(title|description)>([^<]+)</\\1>!'$rss$match);
        
next($match[2]); next($match[2]);

        while (list(,
$v) = each($match[2])) {
            list(,
$ver) = explode(' '$v2);
            if (
$i && version_compare($apcversion$ver'>=')) {
                break;
            } else if (!
$i--) {
                break;
            }
            echo 
"<b><a href=\"http://pecl.php.net/package/APC/$ver\">".htmlspecialchars($v)."</a></b><br><blockquote>";
            echo 
nl2br(htmlspecialchars(current($match[2])))."</blockquote>";
            
next($match[2]);
        }
        echo 
'</td></tr>';
    }
    echo <<< EOB
        </tbody></table>
        </div>
EOB;
    break;

}

echo <<< EOB
    </div>
EOB;

?>

<!-- <?php echo "\nBased on APCGUI By R.Becker\n$VERSION\n"?> -->
</body>
</html>

 

 

 

 

Posted by 새로운시작
|



在使用PHP过程中发现,自己编写的php代码因为都是源代码方式放在服务器上的所以很容易就被别人拿走随便修改(变成自己开发的)使用了。
为了保住自己的劳动成果,我一直寻找一种可以加密php代码的软件。
最著名的就是Zend公司的Zendencoder了,但是不是开源软件(要价很高,也没有找到破解版)。
既然收费的用不起,我们就用开源的。我找到了php_screw这个开源软件,目前最新版本是1.3
网址
http://sourceforge.net/projects/php-screw/
我的安装环境
系统:Slackware 10
软件:Apache 1.3.31
PHP 4.3.7
以上环境全部是slackware 10默认安装后自带的。具体的Apache+php+mysql安装方法参照如下
支持php的Apache环境安装
获得软件
下载php_screw-1.3 (
http://prdownloads.sourceforge.net/php-screw/php_screw-1.3.tgz?download)

安装
1.将获得的php_screw-1.3.tgz文件放到/usr/local目录下,然后用tar解压缩
tar zxvf php_screw-1.3.tgz

2.进入/usr/local/php_screw-1.3目录开始安装
cd /usr/local/php_screw-1.3
phpize
./confiugre

3.设置自己用来加密的密码
vi my_screw.h

    -- Please change the encryption SEED key (pm9screw_mycryptkey) into the
      values according to what you like.
      The encryption will be harder to break, if you add more values to the
      encryption SEED array. However, the size of the SEED is unrelated to
      the time of the decrypt processing.

    * If you can read and understand the source code, to modify an original
      encryption logic will be possible. But in general, this should not
      be necessary.

    OPTIONAL: Encrypted scripts get a stamp added to the beginning of the
          file. If you like, you may change this stamp defined by
          PM9SCREW and PM9SCREW_LEN in php_screw.h. PM9SCREW_LEN must
          be less than or equal to the size of PM9SCREW.

4.编译
make

5.拷贝modules目录下的php_screw.so文件到/usr/lib/php/extension目录下
cp modules/php_screw.so /usr/lib/php/extension/

6.编辑php.ini文件
在php.ini文件里,加入如下语句
extension=php_screw.so

7.重新启动Apache
/etc/rc.d/rc.httpd restart

8.编译加密工具
cd tools
make

9.将tools目录下加密用的工具screw拷贝到适当目录
cp screw /usr/bin/

经过以上的10步,就已经把php_screw-1.3全部安装完成了。并且现在的php也已经支持解释加密过的php文件了
使用
1.现写一个要加密的php文件。
我写了如下的一个用来测试php速度的compute.php文件
<?
$a=0;
$t=time();
for($i=0;$i<5000000;$i++)
  {$a=$a*$i;}
$t1=time();
echo "<p>";
echo "It used:";
echo $t1-$t;
echo "seconds";
?>

将上面的compute.php文件放到/var/www/htdocs目录下。通过浏览器访问,将显示出php在大量计算时的速度(只能粗略估计一下)
2.将我们写的php文件加密
cd /var/www/htdocs/
screw compute.php

我们加密后,现在目录下的compute.php文件就是我们已经加密的了。而源文件被改名为compute.php.screw存放了。
我们现在再测试一下compute.php,看看能否正常使用?速度如何?
我比较了一下,加密前后的速度大概一样,基本没有太多的损失。

http://www.unixtech.cn/read.php?tid=463


1. DownLoad
<A class=con_link href="http://prdownloads.sourceforge.net/php-screw/" target=_blank>http://prdownloads.sourceforge.net/php-screw/</A>
2. 사전준비
- PHP4.X 이상
- PHP with zlib ( 컴파일시 --with-zlib )
으로 확인
- UNIX system OS (LINUX, FreeBSD, etc. are included)
3. 설치
% tar xvfz php_screw-XXX.tgz
% phpize
% ./configure
% vi my_screw.h
SEED KEY을 개인적으로 변경하여 사용하십시요.
% make
% cp modules/php_screw.so /usr/local/lib/php/extensions/php_screw.so
php_screw.so 를 적당한 디렉토리에 복사
% vi php.ini
를 통하여 php.ini의 위치를 확인후 해당 php.ini의 설정을 변경한다.
zend_extension="/usr/local/lib/php/extension/php_screw.so"
% /usr/local/apache/bin/apachectl restart
% cd tools
% make // 암호화툴을 컴파일 한다.
% cp screw /usr/bin
암호화툴을 적당한 디렉토리에 복사한다. PATH가 잡혀 있는 디렉토리 추천
4. 사용법
% cat test.php
% screw test.php
Success Crypting(test.php)
% ls -al
-rw-r--r-- 1 root root 38 May 23 00:56 test.php
-rw-r--r-- 1 root root 20 May 23 00:56 test.php.screw
* 영문 README 파일보기
내용출처 : [기타] 인터넷 : <A class=con_link href="http://www.ihelpers.co.kr" target=_blank>http://www.ihelpers.co.kr</A>




 

Posted by 새로운시작
|