BLOG main image
분류 전체보기 (117)
Hidden (1)
five senses (0)
safe system (77)
code (35)
database (1)
Link (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'분류 전체보기'에 해당되는 글 117건
2009. 2. 6. 05:00
google talk 영문버전
방화벽 뒤에서 네이트온도 못하고, 구글토크만은 방화벽을 뚫고 얘기를 할 수 있지^^

한글 버전을 받아서 사용했는데, 방화벽 뒤에서 접속 시간이 영문판보다 늦는것 같아서
영문 버전을 애용해 주기로 했다. 배포되는 파일 크기에서 확연한 차이가 있던걸.


2009. 1. 25. 05:00


                                                                                                                                                           

CISA(Certified Information Systems Auditor)

 

 


                                                                                                                                                           

CISSP 란 ?  

 

 

CISSP(Certified Information Systems Security Professional)는 국제공인정보시스템 보안전문가의 약칭으로, 정보보호전문가 개발에 관심있는 국제 조직들이 1989년에 컨소시엄을 형성하여 설립한 (ISC)² (International Information Systems Security Certification Consortium)가 발급, 관리하는 국제정보 시스템 보안 전문가 자격증이다. 현재 국제적으로 공인되는 정보보호에 관한 자격증으로는 CISA(Certified Information Systems Auditor)와 CISSP(Certified Information Systems Security Professional)가 있으며 CISA는 1987년도에 우리나라에 도입되었으나 CISSP는 2000년도에 국내에 처음으로 도입된 자격증으로써 현재는 전세계적으로 널리 확산되고 있는 자격증이다.  

CISSP 의 진로및 장점 

▧ 국내 정보통신기반보호법에 의거 CISA 등과 함께 IT 3大 고급자격증  
 - 국가사회의 중요한 정보시스템과 정보자산 보호를 위한 전문가로서 오늘날 어느 분야에서나 필요로 함.
 - 날이 갈수록 지능화, 악성화, 국제화 되고 있는 사이버 범죄 억제와 IT 및 정보 보호의 전문성을 갖춘 사회적, 국가적 공인으로써의 역할 

▧ 호주 독립이민법상
      - CISA, 변호사, 공인회계사와 함께 직업점수에서 매우 유리

▧ 국내에서 취업률 1위(인쿠르트 조사)
- 국가의 경쟁력 확보를 위한 국제 공인정보보호 전문가로써 자격증 취득자의 폭넓은 직업 선택과 승진 등의 기회가 주어짐.

▧ 지식정보사회의 중요정보 거래에 대한 품질보증 전문가

▧ CISSP의 진로
  - IT 관련 업체
  - 정보 보안 관련 연구소
 - 국방부, 정통부 등 각종 정부기관 및 공기업
  - 정보 보안 컨설팅 회사
  - 일반 기업체 및 금융기관의 전산 부서 

응시자격 및 Certificate 취득

 ▧ 아래 정보 보호 분야 등 관련 업무 경력 4년 이상 필요
     (즉, 아래 10개 도메인중 최소 1개 이상의 도메인에 포함되면 응시 가능) 

CBK
1  접근제어시스템 및 방법론(Access Control Systems & Methodology)
2  통신망 및 네트웍 보안(Telecommunications & Network Security)
3  보안관리(Security Management Practices) 
응용프로그램 및 시스템 개발(Application & Systems Development)
5  암호학(Cryptography)
6  보안 아키텍쳐 및 모델(Security Architecture & Models)
7  컴퓨터 운용 보안(Operations Security)
8  사업연속계획 및 비상복구계획(Business Continuity & Disaster Recovery Planning)
9  법, 수사 및 윤리(Law, Investigations & Ethics)
10  물리적 보안(Physical Security) 

▧ 업무 범위
    - 관리자, 지도자, 경영자, 리더, 감독, 분석가, 설계자, 프로그래머, 암호학자, 암호전문가, 암호분석가,구조전문가,엔지니어,강사,교수,조사자, 컨설턴트, 세일즈맨, 대표 등 광범위함.

▧ 단, 학사 학위자의 경우 3년 이상 근무 경력 필요

▧ 경력이 없거나 부족한 분은 다음과 같은 세 가지 요건을 만족할 경우 응시가 가능함
    (단, 별도의 프로세스를 통해 응시하므로 상담요망)
    ① (ISC)2에 이 사실을 통보할 것
    ② 합격 후 5년 내에 경력요건을 충족할 것
    ③ 합격 후 경력요건을 충족할 때까지 매년 지연금($35)을 지불할 것

▧ 경력 증빙 및 CISSP 직업윤리강령(Code of Ethics) 준수의 확인

▧ 보증 서류 제출(Endorsement Form을 작성하여 발송)
    - 다른 CISSP 또는 정보시스템 관련 전문가의 추천 

응시과목 및 문제형식

▧ 응시과목

▧ 문제형식
문제형식은 사지선다형 객관식으로서, 250문제를 6시간 안에 풀어야 한다. 시험언어는 한글, 영문, 일본어 중 하나를 선택할 수 있다. 

응시일정 및 시험시간

▧ 응시일정
 - 국내에서 응시 가능하며, 매년 수차레 정기적으로 시행
 - 2006년도 국내 시험 일정
구분 시험일정 시험장소
1차 2006년 3월 18일 (토) 동국대학교
2차 2006년 6월 17일 (토) 동국대학교
3차 2006년 9월 16일 (토) 동국대학교
4차 2006년 12월 2일 (토) 동국대학교 

▧ 응시료
  - 1차 마감 -  시험 16일 전까지 US $499
  - 2차 마감 -  1차 마감 이후 부터 시험 전일까지 US $599
  - 연기/취소 수수료 : 응시일 21일전까지 연기/취소 가능 - US $100
  - 단, 응시일 21일 전부터 5일 전까지는 연기만 가능 - US $200

▧ 시험시간
  - 오전 09:00 ~ 15:00 (총 6시간)

응시관련 절차사항
수강생의 경우 최초 응시원서 접수를 위한 각종 안내 메뉴얼을 배부하며,
최초 접수 이후부터는 오류 업무를 Lyzeum이 대행한다. 

▧ 응시 절차
     응시원서를 작성하고 서명한 다음에 등록비와 함께 제출한다.
     (응시료 카드결제인 경우 카드정보 필요등) 
     응시접수는 응시원서를 직접 작성하여 온라인, 우편 또는 Fax로 접수한다. 

▧ 성적 발표
     시험일로부터 업무일수 2주-4주 후 시험결과가 통보되며, 합격하면 합격증이 배송되고,
      불합격하면 도메인별 점수가 기재된 성적표가 배송된다. 

합격기준
      - CISSP 시험의 70%이상 득점 : 조정Point 1000 Point 중 700 Point 이상이면 합격.

 


                                                                                                                                                           

2009. 1. 16. 05:00
부팅해서 패스워드 묻지않고 바로 로그인



2009. 1. 12. 05:00

vi를 즐겨쓰는 사람들을 위한 이클립스를 위한 플러그인 - 나는 대만족^^ㅋ
등록하면 viplugin.license 가 생길텐데..아직 등록을 안해서..ㅡㅡ;
그래도 만족^^ㅋ
http://www.satokar.com/viplugin/


2009. 1. 11. 05:00
fish 를 사용하기로 했다.

http://www.3fishes.co.kr/fishintro

rss 피드를 pdf로 변환해주는 사이트 : http://www.tabbloid.com/


2009. 1. 11. 05:00
uTorrent 사용 팁 : http://www.torrent.co.kr


다운로드 : http://www.utorrent.com/


토렌토 파일 검색 : http://bitcorea.org/
http://www.speckly.com/

http://www.mybittorrent.com/info/723077/files/

Mininova|http://www.mininova.org/search/?utorrent&search=
ThePirateBay|http://thepiratebay.org/search.php?q=
TorrentSpy|http://torrentspy.com/search.asp?query=
myBittorrent|http://www.mybittorrent.com/?do=search&keywords=
IsoHunt|http://isohunt.com/torrents.php?ext=&op=and&ihq=
PointBlank|http://bt.point-blank.cc/?search=
BTBot|http://www.btbot.com/search.bt?q=
BTJunkie|http://btjunkie.org/search?query=
MadTorrent|http://www.madtorrent.com/search.php?q=
Meganova|http://www.meganova.org/search.html?search=
NewTorrents|http://www.newtorrents.info/?q=
SnarfIt|http://snarf-it.org/?snarf=search&keywords=
TorrentBox|http://torrentbox.com/torrents-search.php?search=
TorrentReactor|http://torrentreactor.net/search.php?search=&words=
Yotoshi|http://search.yotoshi.net/search.php?q=

BitTorrent|http://search.bittorrent.com/search.jsp?Submit2=Search&query=
Google|http://google.com/search?q=





2009. 1. 5. 05:00

IBM Secure Data Disposal - Normal Image

흔적없이 하드를 지운다.

Secure Data Disposal (SDD)은 하드 디스크 드라이브의 안전한 데이터 폐기를 위해 SDD 시동 플로피 디스켓을 만드는 윈도우 도구입니다. 이 패키지는 Microsoft Windows 2000, XP 또는 2003 서버를 위해 업데이트된 버전의 Secure Data Disposal 드라이버를 제공합니다.


2008. 12. 30. 05:00
http://mail.google.com/support/bin/answer.py?answer=76147

Gmail에서 Outlook Express 클라이언트를 사용하도록 설정하려면 다음 단계를 따르세요.

    1. Gmail 계정에서 POP를 활성화합니다. 활성화한 후에는 반드시 변경사항 저장을 클릭해야 합니다.
    2. Outlook 또는 Outlook Express를 엽니다.
    3. 도구 메뉴를 클릭하고 계정...을 선택합니다.
    4. 추가를 클릭한 후 메일...을 클릭합니다.
    5. 표시 이름: 입력란에 자신의 이름을 입력한 후 다음을 클릭합니다.
    6. 전자 메일 주소: 입력란에 전체 Gmail 주소(사용자 이름@gmail.com)를 입력한 후 다음을 클릭합니다.
    7. 받는 메일(POP3, IMAP 또는 HTTP) 서버: 입력란에 pop.gmail.com을 입력합니다. 보내는 메일 서버(SMTP): 입력란에 smtp.gmail.com을 입력합니다.
    8. 다음을 클릭합니다.
    9. 계정 이름: 입력란에 Gmail 사용자 이름('@gmail.com' 포함)을 입력합니다. 암호: 입력란에 Gmail 비밀번호를 입력한 후 다음을 클릭합니다.
    10. 마침을 클릭합니다.
    11. 계정에서 pop.gmail.com을 강조표시하고 속성을 클릭합니다.
    12. 고급 탭을 클릭합니다.
    13. 다음 정보를 입력하세요.*
      • 보내는 메일(SMTP)에서 보안 연결(SSL) 필요 옆의 확인란을 선택합니다.
      • 보내는 메일(SMTP): 입력란에 465를 입력합니다.
      • 보내는 메일(SMTP)에서 보안 연결(SSL) 필요 옆의 확인란을 선택합니다.
      • 받는 메일(POP3)에서 보안 연결(SSL) 필요 옆의 확인란을 선택합니다. 포트 번호가 995로 변경됩니다.

      *보내는 메일 서버와 받는 메일 서버 입력란의 순서는 버전에 따라 다릅니다. 각 입력란에 정확한 정보를 입력하세요.

    14. 서버 탭으로 돌아가서 인증 필요 옆의 확인란을 선택합니다.
    15. 확인을 클릭합니다.

    축하합니다. Gmail 메일을 보내고 검색하는 데 필요한 클라이언트 구성을 모두 마쳤습니다.

    Outlook에서 POP를 사용하는데 문제가 있는 경우, 일반적인 오류 또는 문제해결 탭을 확인하세요.

2008. 12. 23. 05:00
사용법: shutdown -s -t 시간(초)

shutdown -s -t 3600       => 60분 뒤에 자동 종료
2008. 12. 18. 05:00


부팅시 ThinkPad,thinkVantage버튼 눌러도 복구영역 혹은 RNR 안될때 해결법
http://www.thinkmania.com/zb40/zboard.php?id=ibmuserlecture&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=rnr&select_arrange=headnum&desc=asc&no=1958
약 1주일간의 삽질끝에 알아낸 방법입니다.
아 물론 고수님들은 상관이 없겠지만 잘 모르시는 분들을 위해....

이미지를 링크할 수 없어서 글로 대신합니다.


파티션 분할,변경작업이나 비스타,XP를 설치하는 경우 복구영역에 접근할 수 없는 경우가 생깁니다.
부팅시 ThinkPad버튼이나 ThinkVantage버튼을 눌러도 반응이 없고 걍 부팅되죠
이럴 경우 미리 복구미디어를 작성하신 분들은 상관이 없겠지만
복구 미디어가 없으신 분들은 당황하실겁니다.

이럴 경우 복구미디어를 새로 작성을 할 수도 없죠.(복구영역에 접근할수 없으니깐요)

부팅시 ThinkPad버튼이나 thinkVantage버튼으로 복구영역에 다시 접근하게 할 수 있는 방법입니다.

[전제조건]
1.이 방법을 적용하기 이전에 설치되어 있는 rnr(Rescue and Recovery프로그램)을 반드시 삭제해주셔야 합니다.
2.만일 현재 OS가 비스타라면 XP컴퓨터가 필요할 수 있습니다.
  만일 XP컴이 없다면 글 하단의 [참조 1]을 봐주세요,
  만일 자신이 비스타이고 FDD도 없다면 [참조 1],[참조 2]를 순서대로 보세요.
3.반드시 플로피디스크(FDD)가 필요합니다. 하지만 최신컴은 FDD가 없죠 [참조2]를 봐주세요.
4.최신버젼의 VirtualFDD가 필요합니다. --> 핵심!!!!

[주의점]
1. 가끔 공장초기화를 하려고 하면 이 기능이 제거되었다는 메세지 혹은 비슷한 메세지가 나오는 컴이 있습니다.
   이런 메세지가 나오는 원인은 다음과 같습니다.
   [원인] : 복구영역의 공장초기화시 설치되는 OS와 현재 사용중인 OS가 다른경우.
            예) 복구영역은 비스타인데 현재 사용중인 OS는 XP인 경우
   [해결법] : 현재 OS를 밀고 복구영역에 있는 OS와 동일한 버젼의 OS로 설치한다. ㅡ.ㅡ....

[순서]

0.하시고자 하시는 작업을 먼저 반드시 해주세요(OS설치 혹은 파티션 변경작업)

1. 먼저 아래 링크로 가주세요
http://www-06.ibm.com/jp/domino04/pc/support/beginner.nsf/document/MIGR-54483-KR

http://www-307.ibm.com/pc/support/site.wss/product.do?subcategoryind=0&familyind=165729&brandind=17&doccategoryind=0&modelind=0&doctypeind=9&validate=true&partnumberind=0&sitestyle=lenovo&template=%2Fproductpage%2Flandingpages%2FproductPageLandingPage.vm&operatingsystemind=49986&machineind=0

2. 가시면 여러가지 항목이 보이실겁니다.
여기서 필요한게 2가지 있는데 하나는 해당 시스템에 맞는 rnr이고요 하나는 Rescue and Recovery - Recovery repair diskette 입니다.
vista : rnr40_rrd

xp : rnr31_rrd

복구영역안에 비스타가 들어있으면 비스타용 아니면 XP용을 받으시면 됩니다.
만일 모르시겠다면 노트북 키보드 아래 윈도우 스티카거 비스타라면 비스타용, XP라면 XP용을 받으시면 됩니다.
단 rnr은 최신버젼을 받으셔도 무방할겁니다.(책임못짐 -.-)

3. 다운받으신 Recovery repair diskette을 보시면 무슨 EXE파일로 되어있을 겁니다.
   이걸 더블클릭 하면 처음에 까만 화면에 뭐라 나옵니다. 여기서 엔터를 치시다가 보면 마지막에 플로피A드라이브에 디스켓 넣으라고 합니다. 플로피 디스켓이 없으면 [참조2]를 보세요
디스켓 넣고 엔터치시면 됩니다. 그러면 해당 이미지가 A드라이브에 압축이 풀립니다. 이때 100% 끝까지 풀렸는지 확인하세요.

4. 그런다음 플로피로 부팅을 합니다.
5. 그러면 부팅하자 마자 뭐가 뜹니다. 쉬운 영어니깐 한번 읽어보시면 됩니다.
   여기서 시키는대로 복구할래를 선택하면 순간 뭐가 화면이 바뀌면서 성공했다고 나옵니다.
   그리고 리부팅하려면 뭘 해라 라고 나옵니다.
6. 시키는 대로 합니다. 다만 리부팅이 안되는 경우는 컴을 다시 껏따가 켜세요.
7. 아직 끝난거 아닙니다. 이 단계에서 ThinkPad,thinkVantage버튼 암만 눌러봐야 복구영역에 못들어 갑니다.
   걍 윈도우로 부팅합니다. 혹시 부팅중에 복구영역에 들어갈려면 F11을 눌러라 라는 말이 나오는데 f11눌러도 복구영역 안나옵니다.

8. 이제 윈도우로 부팅 후에 해당 OS에 맞는 rnr을 설치하고 재부팅합니다.
   이때 설치 마치고 rnr을 실행할거냐고 물을수도 있는데 맘대로 하셔도 됩니다.
9. 윈도우 재부팅 후 다시 컴을 껐다가 켜보십시요.
   지금부터는 ThinkPad,thinkVantage버튼으로 복구영역에 접근 가능합니다.

10. 이제부터는 공장초기화도 가능합니다. 다만 공장초기화가 안되시는 분들은 위에 [주의점]을 보세요.

[요약]
부팅시 ThinkPad,thinkVantage버튼 안되면
1. 먼저 rnr지우고
2.Recovery repair diskette으로 작업 마친후
3.rnr을 다시 깔아라.

사실 부팅시 ThinkPad,thinkVantage버튼누르면 rnr이 뜹니다. 그리고 이 rnr은 레노버 웹싸이트에 올라와 았는 rnr과 동일한 겁니다. 윈도우 깔면서 rnr깔면 복구영역에서 작동하는 rnr도 같이 깔리는 거죠. 하지만 rnr설치시 복구영역에 접근할 수 없는 상황이라면 rnr이 윈도우에는 깔리지만 복구영역에는 안깔립니다. 당연히 복구영역도 접근불가죠.

그럼 rnr을 먼저 깔고 복구디스켓을 사용하는 경우는 어떻게 되나?????
rnr설치시 복구영역에 접근불가이므로 복구디스켓을 사용해서 복구를 한 후 rnr의 재설치가 필요하다.

[참조1] 복구이미지를 FDD에 기록을 하려면 해당 EXE파일을 더블클릭을 해서 해당 프로그램을 실행한 다음 진행이 가능합니다. 하지만 저같은 경우는 비스타에서 하려고 하면 올바른 Win32플그램이 아니다는 메세지를 보여주더군요.
이럴 경우 XP를 사용하는 컴에서 작업을 해주시면 됩니다, 다만 주위에 그런 컴이 없을 경우는 아래와 같은 작업을 해주시면 됩니다.
    1. MS VirtualPC2007을 다운받으세요 --> 공짜 입니다. MS에서 무상배포.
    2. 여기에다 XP를 설치 후 복구FDD만드는 작업을 진행하시면 됩니다.
       VirtualPC에 윈도 XP를 설치합니다. --> 자세한 사용법은 네이버에서 검색...
       XP설치 후 [참조2]를 보세요.


[참조2]해당 복구 FDD를 만들때 보면 다들 당황하시는게 내 컴은 FDD가 없는데 어쩌나 입니다.
반드시 물리적인 FDD가 필요한 것은 아닙니다. 가상으로 FDD를 만들 수 있죠,
FDD가 없으신 분들은 아래 2개의 프로그램이 필요하실겁니다.


   1. 복구 디스크 생성시 --> 가상 FDD사용.
(해당 플그램 사용법은 http://blog.naver.com/floss?Redirect=Log&logNo=10017641645 참조)
      ---> 윈도우에서 가상CD만들듯이 가상FDD를 만듭니다.
           여기에 있는 내용을 아래 VirtualFDD쪽에 전부 복사해주시면 됩니다.
           다만 복사하실때 유의하실 점은 숨겨진 파일이 몇게 있으니 이것도 복사해주시고요
           다만 절대 복사해서는 안될 파일이 있습니다.( Command.com, Config.sys 2개)
   2. 생성한 복구디스크를 이용한 복구영역복구. --> VirtualFDD(유저강좌나 FAQ에 사용법 있으니 꼭꼭 참조하세요.)
           부팅 디스크 생성 후에 위 가상FDD의 파일들을 복사 하신 후 재부팅하시고 복구작업에 들어가시면 됩니다.

2008. 12. 16. 05:00


Using XML, XPath, and XSLT with JavaScript

There are several JavaScript XML libraries available to try to provide a cross-browser XML library. I've previously cited zXML in my Inline SVG article, there's also Sarissa and XML for <Script> and I'm sure others.

However, when I started using them I discovered various problems and limitations with them for what I needed to do. So, I decided to write my own cross-browser XML routines. I wanted an XML library that was as lightweight as possible, doing just what I needed and utilizing as much of the built in browser capabilities as possible.

In this article, I will first present a simple XML class which just holds the XML DOM object returned from an AJAX request and provides functions to get and change node values based on XPaths. Secondly, I will give a simple XSLT class to preform XSL Transformations.

The complete code for the XML and XSL library is available here

XML


First off is the constructor which determined if we will be using IE (ActiveX) functions or W3C standard functions for XML manipulation and either stores the XML DOM returned as the responseXML from an XMLHttpRequest(XHR) or creates an empty DOM object for later manipulation.
//
// XML
//
function XML(xmlDom) {
this.isIE = window.ActiveXObject;
if (xmlDom != null) {
this.xmlDom = xmlDom;
} else {
// create an empty document
if (this.isIE) {
Try.these (
function() { axDom = new ActiveXObject("MSXML2.DOMDocument.5.0"); },
function() { axDom = new ActiveXObject("MSXML2.DOMDocument.4.0"); },
function() { axDom = new ActiveXObject("MSXML2.DOMDocument.3.0"); },
function() { axDom = new ActiveXObject("MSXML2.DOMDocument"); },
function() { axDom = new ActiveXObject("Microsoft.XmlDom"); }
);
this.xmlDom = axDom;
} else {
this.xmlDom = document.implementation.createDocument("", "", null);
}
}
};

In case you're not getting the XML data from an XHR response, I also provided a load function to load an XML file from an URL.
// load
//
// Loads an XML file from an URL
XML.prototype.load = function(url) {
this.xmlDom.async = false;
this.xmlDom.load(url);
};

Next, I want to be able to find a single node in the XML DOM based on an XPath. The getNode function will do that for me.
// getNode
//
// get a single node from the XML DOM using the XPath
XML.prototype.getNode = function(xpath) {
if (this.isIE) {
var result = this.xmlDom.selectSingleNode(xpath);
} else {
var evaluator = new XPathEvaluator();
var result = evaluator.evaluate(xpath, this.xmlDom, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
}
return result;
};

More often, I don't need the actual DOM node object, but the value of that node, so I provide the getNodeValue a function to get the value of a node.
// getNodeValue
//
// get the value of a the element specified by the XPath in the XML DOM
XML.prototype.getNodeValue = function(xpath) {
var value = null;
try {
var node = this.getNode(xpath);

if (this.isIE &&amp; node) {
value = node.text;
} else if (!this.isIE && node.singleNodeValue) {
value = node.singleNodeValue.textContent;
}
} catch (e) {}

return value;
};

If you're just looking for a particular node/value, the previous functions are fine, but more often you need a group of node or node values (ex. all the book titles). So, the full JavaScript file also contains corresponding functions to get multiple nodes (getNodes) and node values as an array (getNodeValues).

At some point, you'll probably want to access this XML DOM as XML data (string), so we need a function to serialize the XML from the DOM to a String. The getNodeAsXml function will do that for you. If you pass in the root XPath ("/") it will serialize the complete XML file. Also, the included prettyPrintXml function can be used to escape the HTML characters.
// getNodeAsXml
//
// get the XML contents of a node specified by the XPath
XML.prototype.getNodeAsXml = function(xpath) {
var str = null;
var aNode = this.getNode(xpath);
try {
if (this.isIE) {
str = aNode.xml;
} else {
var serializer = new XMLSerializer();
str = serializer.serializeToString(aNode.singleNodeValue);
}
} catch (e) {
str = "ERROR: No such node in XML";
}
return str;
};


So far, we've only read the XML data we received. But we may also want to change the contents of the XML. So, here are the functions necessary to change existing node values (updateNodeValue), add new nodes/values (insertNode), and delete existing nodes (removeNode).

Note: the XPaths used for node insertions cannot be overly complex as I wanted to keep this library simple.
// updateNodeValue
//
// update a specific element value in the XML DOM
XML.prototype.updateNodeValue = function(xpath, newvalue) {
var node = this.getNode(xpath);
var changeMade = false;
newvalue = newvalue.trim();

if (this.isIE &&amp; node) {
if (node.text != newvalue) {
node.text = newvalue;
changeMade = true;
}
} else if (!this.isIE && node.singleNodeValue) {
if (node.singleNodeValue.textContent != newvalue) {
node.singleNodeValue.textContent = newvalue;
changeMade = true;
}
} else {
if (newvalue.length > 0) {
this.insertNode(xpath);
changeMade = this.updateNodeValue(xpath, newvalue);
}
}

return changeMade;
};

// insertNode
//
// insert a new element (node) into the XML document based on the XPath
XML.prototype.insertNode = function(xpath) {
var xpathComponents = xpath.split("/");
var newChildName = xpathComponents.last();
var parentPath = xpath.substr(0, xpath.length - newChildName.length - 1);
var qualifierLoc = newChildName.indexOf("[");
// remove qualifier for node being added
if (qualifierLoc != -1) {
newChildName = newChildName.substr(0, qualifierLoc);
}
var node = this.getNode(parentPath);
var newChild = null;
if (this.isIE && node) {
newChild = this.xmlDom.createElement(newChildName);
node.appendChild(newChild);
} else if ((!this.isIE) && node.singleNodeValue) {
newChild = this.xmlDom.createElement(newChildName);
node.singleNodeValue.appendChild(newChild);
} else {
// add the parent, then re-try to add this child
var parentNode = this.insertNode(parentPath);
newChild = this.xmlDom.createElement(newChildName);
parentNode.appendChild(newChild);
}
return newChild;
};

// removeNode
//
// remove an element (node) from the XML document based on the xpath
XML.prototype.removeNode = function(xpath) {
var node = this.getNode(xpath);
var changed = false;
if (this.isIE &&amp; node) {
node.parentNode.removeChild(node);
changed = true;
} else if ((!this.isIE) && node.singleNodeValue) {
node.singleNodeValue.parentNode.removeChild(node.singleNodeValue);
changed = true;
}
return changed;
};


You should now be able to fully read and manipulate XML using XPaths.

For any significant reformatting or processing of the XML, you'll probably want to utilize XSLT. So, next I'll provide a simple XSLT class. It will preload (into a DOM object) an XSL file in its constructor. This provides rapid transformations of new XML data passed in to it's transform function (including parameters).

First, the constructor which requires an URL pointing to the XSL file to be used for transformations. It does not accept a DOM object like the XML class did as it is assumed that the XSL (layout information) is more-or-less static and stored in a file whereas the XML data would most likely be dynamic and received via an XHR request.
//
// XSLT Processor
//
function XSLT(xslUrl) {
this.isIE = window.ActiveXObject;
if (this.isIE) {
var xslDom = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
xslDom.async = false;
xslDom.load(xslUrl);
if (xslDom.parseError.errorCode != 0) {
var strErrMsg = "Problem Parsing Style Sheet:\n" +
" Error #: " + xslDom.parseError.errorCode + "\n" +
" Description: " + xslDom.parseError.reason + "\n" +
" In file: " + xslDom.parseError.url + "\n" +
" Line #: " + xslDom.parseError.line + "\n" +
" Character # in line: " + xslDom.parseError.linepos + "\n" +
" Character # in file: " + xslDom.parseError.filepos + "\n" +
" Source line: " + xslDom.parseError.srcText;
alert(strErrMsg);
return false;
}
var xslTemplate = new ActiveXObject("MSXML2.XSLTemplate");
xslTemplate.stylesheet = xslDom;
this.xslProcessor = xslTemplate.createProcessor();
} else {
var xslDom = document.implementation.createDocument("", "", null);
xslDom.async = false;
xslDom.load(xslUrl);
this.xslProcessor = new XSLTProcessor();
this.xslProcessor.importStylesheet(xslDom);
}
};

Finally, the transform function will preform the XSL transformation and return the result. It accepts parameters to be passed to the XSL as an associative array of parameter name and value pairs.
// transform
//
// Transform an XML document
XSLT.prototype.transform = function(xml, params) {
// set stylesheet parameters
for (var param in params) {
if (typeof params[param] != 'function') {
if (this.isIE) {
this.xslProcessor.addParameter(param, params[param]);
} else {
this.xslProcessor.setParameter(null, param, params[param]);
}
}
}

if (this.isIE) {
this.xslProcessor.input = xml.xmlDom;
this.xslProcessor.transform();
var output = this.xslProcessor.output;
} else {
var resultDOM = this.xslProcessor.transformToDocument(xml.xmlDom);
var serializer = new XMLSerializer();
var output = serializer.serializeToString(resultDOM);
}
return output;
};


You should now be able to easily utilize XML and XSL on your web pages. An example usage of this XML/XSLT library would be to first build an XSLT object during the page initialization (onload).

xslProcessor = new XSLT(xslUrl);

Then, when XML responses are received from an AJAX request, process them. For example,
// get the XML data
try {
var xmlData = new XML(request.responseXML);
} catch (e) {
alert(request.responseText);
}

// get the username out of the XML
var userName = xmlData.getNodeValue('//userName');

// transform the XML to some HTML content
var newData = xslProcessor.transform(xmlData, {'param':'value'});
document.getElementById('someDiv').innerHTML = newData;


Update (February 27, 2007): I previously had a function in my XML class to generate valid HTML for the XML, but I've now modified it to use Oliver Becker's XML to HTML Verbatim Formatter with Syntax Highlighting stylesheet to format the XML. If that is not available, it will default to simply serialize the XML and convert the special characters. The code for this looks like:

/ Define a class variable which can be used to apply a style sheet to
// the XML for format it to HTML
XML.htmlFormatter = new XSLT("xsl/xmlverbatim.xsl");

// toHTML
//
// Transform the XML into formatted HTML
//
XML.prototype.toHTML = function() {
var html = null;
if (XML.htmlFormatter) {
html = XML.htmlFormatter.transform(this);
} else {
html = this.getNodeAsXml('/');
if (html != null) {
html = html.replace(/&/g, "&");
html = html.replace(/</g, "&lt;");
html = html.replace(/>/g, "&gt;<br/>");
}
}
return html;
}


As before, the complete package is available to download

Update (March 7, 2007): I have updated this package to utilize Google's AJAXSLT XSL-T implementation when a native JavaScript XSLT function is not available. I need to test it more before releasing it however.

http://blog.pothoven.net/2006/11/using-xml-xpath-and-xslt-with.html
2008. 12. 15. 05:00
CPU-Z           http://www.cpuid.com/

하드웨어 정보 확인 유틸리티



2008. 12. 14. 05:00

1.                                                       
IBM RNR 복구영역 백업하기

2.                                                       
IBM Hidden Protected Area .pdf




3.                                                       

RRPC 보다 진보된 복구방식인 first ware (FW)유틸중

FWBACKUP.exe; FW 복구영역을 백업 이미지로 만들 때
eg> FWBACKUP size=640 file=c:\imgset

fwrestor.exe; FW 복구영역의 이미지를 하드의 FAT32 파티션으로 백업할 때 (NTFS로는 안됨)
eg> fwrestor c:\imgset

fwdelete.exe; FW 파티션을 삭제할 때
eg> 40기가 하드가 37기가로 나올 때 ; FW 가 3기가 차지해서임
        fwdelete /all
       로 40기가 모두 확보가능, 단 모든 데이타 삭제되므로 필히 백업!!!

fwdir.exe; fw 내용을 확인할 때 (dir)

혹시 안된다면 처음 부팅시 F1 버튼을 눌러서 BIOS 셋팅으로 들어간뒤
security 에서 predesktop area 를  선택하시고
normal/secure 에서 disabled 로 바꿔보시기 바랍니다.

                                                       

                                                       

2008. 12. 9. 05:00


보통 호출 방법
// 플래시 내부 함수 호출
function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}

// 플래시에 내부에 있는 setSafecardMark 함수를 호출
thisMovie("safecard").setSafecardMark(index,length);

그러나 위의 방법들이 안된다.. 그러면 아래와 같이 한다.

1. Dom을 이용해 플래쉬에 접근하는 경우 E에서는 Object의 ID를 FF에서는 Embed의 ID를 사용하게 된다. 즉 아래와 같다.

     <object id="id1"><embed src="test.swf" id="id1" /></object>

위와 같이 설정하고

      document.getElementById('id1')

라고 하면 IE에서는 정상동작하겠지만 FF에서는 Object를 참조하기 때문에 오동작하게된다.

2. <form></form> 안에서 사용하면 안된다.
<form>
       form으로 둘러싸인 플래쉬 무비에서 ExternalInterface를 addCall 하면 해당 플래쉬의 ID를 찾을 수 없다는 에러를 발생시킨다.
</form>

이 문제는 아래의 코드를 사용해 해결할 수 있다. ExternalInterface를 사용하는 페이지에 아래의 로직을 인클루드시킨다.

<script type="javascript/text">
function ExternalInterfaceManager() {
   this.registerMovie = function(movieName) {


   if(!window.fakeMovies) window.fakeMovies = new Array();
      window.fakeMovies[window.fakeMovies.length] = movieName;
   }


   this.initialize = function() {
      if(document.all) {
         if(window.fakeMovies) {
            for(i=0;i<window.fakeMovies.length;i++) {
               window[window.fakeMovies[i]] = new Object();
            }

 

            window.onload = initializeExternalInterface;
         }
      }
   }
}


function initializeExternalInterface() {
   for(i=0;i<window.fakeMovies.length;i++) {
      var movieName = window.fakeMovies[i];
      var fakeMovie = window[movieName];
      var realMovie = document.getElementById(movieName);


      for(var method in fakeMovie) {
         realMovie[method] = function() {
            flashFunction = "<invoke name=\"" + method.toString() + "\" returntype=\"javascript\">" +       __flash__argumentsToXML(arguments, 0) + "</invoke>";this.CallFunction(flashFunction);
         }
      }


      window[movieName] = realMovie;
   }
}


</script>
   플래쉬를 표시하기 전 아래의 자바스크립트를 실행한다.
<script type="text/javascript">
//<![CDATA[var eim = new ExternalInterfaceManager();

eim.registerMovie("flashID");

eim.initialize();
//]]>
</script>

 

위의 방법보다 간단한 방법이라 소개된 자료
 function Flash(id, url, width, height)
{
     var str;
     str = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="' + width + '" height="' + height + '" id="' + id + '" align="middle">';
     str += '<param name="allowScriptAccess" value="sameDomain" />';
     str += '<param name="movie" value="' + url + '" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />';
     str += '<embed src="' + url + '" quality="high" bgcolor="#ffffff" width="' + width + '" height="' + height + '" id="'+ id +'" name="' + id + '" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
     str += '</object>';
 
     document.write(str);
 
     //Flash의 ExternalInterface가 Form Tag내에서 오류나는 버그를 해결하는 코드
     eval("window." + id + " = document.getElementById('" + id + "');");
}


2008. 12. 3. 05:00
Web에서 자바스크립트의 사용은 웹을 유용하게 한다. 웹에서 사용하는 자바스크립트 이벤트는 다양하지만, 가장 많이 사용하는 것이 onClick 이벤트가 아닌가 한다. 사용자가 마우스로 클릭을 했을 때, 어떤 자바스크립트 함수를 호출하도록 하는 것이 onClick 이벤트이다.

특히 a(anchor) 태그와 함께 사용할 때, onClick 이벤트를 자주 사용하는데, 이 이유는 크게 세 가지가 있다.
  1. 이동되는 경로(URL)을 사용자에게 숨기기 위해서
  2. form 방식으로 페이지를 이동하여, 새로운 페이지에 값을 넘겨주기 쉽게 하기 위해서
  3. 페이지를 이동하기 전에 자바스크립트 함수를 호출하여, 메시지를 보여주거나 입력값을 체크하기 위해서

결국, a 태그가 페이지를 이동하는 역할을 함에도 불구하고 onClick를 사용하는 이유는 위에서 설명했다. 그러면 a 태그의 href를 무시하고 onClick 이벤트가 참조하는 자바스크립트 함수를 호출하는 방법은 여러가지가 있다. 먼저 자주 사용되는 것부터 확인해보자.

 1. <a href="javascript:alert('naver');"> Naver </a>
 2. <a href="#" onClick="alert('daum');"> Daum </a>
 3. <a href="javascript:void(0);"  onClick="alert('nate');"> Nate </a>

1번은 href의 값에 URL 대신 javascript 함수를 호출하도록 하였다. 클릭하면 바로 경고창이 뜨게 된다. 이 방법은 브라우저 하단의 회색의 상태바에 javascript:alert('naver');가 보인다.
2번은 자바스크립트가 호출하는 함수를 숨기기 위해 #을 사용했다. 하지만 이것은 함수에서 페이지가 이동하지 않으면, 브라우저가 이동할 곳을 잃어버리고 페이지의 상단으로 이동해버린다는 단점이 있다.
3번은 이것을 해결하기 위해 자바스크립트에서 Null과 마찬가지인 void(0)을 사용했다. 처음에는 이것의 문제를 몰랐는데, Internet Explorer 6 을 사용하는 사용자가 페이지가 이동하지 않는다고 이야기하여 이것의 문제를 알게 되었다. IE 7 이나 FireFox에서는 이상없이 처리되었다.

이 문제를 해결하기 위해 여러 곳을 찾아보다가 다음과 같은 해결책을 찾게 되었다.

 4. <a href="#" onClick="alert('dooji'); return false;"> dooji.com </a>
 5. <a href="javascript:void(0);"  onClick="alert('tistory'); return false;"> dooji.tistory.com </a>

바로 return false; 를 호출하는 함수 뒤에 추가하는 것이다. 이것은 href에 #을 사용해도 페이지 위로 이동하지 않는다. href의 값은 자신이 좋아하는 취향에 따라 적용하면 될 것 같다. 왜 이런 현상이 일어나는 지에 대해서는 좀 더 알아본 후에 적도록 하겠다.

2008. 12. 2. 05:00

어떤 프로세스가 xxywt.dll 파일을 사용하고 있기 때문에 v3가  이를 삭제하지 못하는 겁니다. 

보다 정확하게는 악성코드가 자신의 존재를 숨기기 위해 윈도우 정상 프로세스 등에 자신을 강제로 주입시켜 그 프로세스가 실행될 때 함께 실행되도록 합니다.(dll injection) 

예를 들어 winlogon.exe 프로세스에 악성코드가 주입된 경우에는 안전모드로 부팅해도 winlogon.exe 프로세스는 실행이되기에 이와 함께 주입된 악성 dll 파일도 실행이되어 이를 삭제하기가 어럽게 됩니다. 백신등이 악성 dll 파일을 삭제하지 못하는 경우는 대부분 dll injection 때문입니다. 

 < 프로세스에서 dll 파일을 탈락(unload)시키기 >
dll unload 기능이 있는 프로그램으로 실행중인 프로세스상의 dll 파일을 탈락시킨 후 dll 파일을 찾아 삭제하는 방법입니다. 

    1).아래에서 IceSword 1.22를 다운받아 압축을 푸세요.
           


            http://www.antirootkit.com/software/IceSword.htm

    2).xxywt.dll 를 사용하는 프로세스를 찾아 탈락시키기       

        IceSword.exe 실행 - Process 탭 클릭 - 각각의 프로세스 우클릭 - Module 
        Infomation 클릭 - xxywt.dll을 찾아 클릭(이때 파일경로 확인) - Unload 클릭 

        #.xxywt.dll 파일을 사용하는 프로세스는 하나일 수도 있고 전부일 수도 있으니
        모든 프로세스에서 xxywt.dll 파일을 찾아야 합니다.

        #.<IsHelp.exe를 이용해 spop.dll 파일을 사용하는 프로세스 찾기>

         IceSword.exe의 보조 프로그램인 IsHelp.exe을 이용하는 방법입니다.
         (이와 유사한 방법으로 process explorer로도 가능)

          a).IsHelp.exe를 실행한 후 실행중인 프로세스를 클릭하면 아래창에
             그 프로세스가 사용하는 dll파일목록을 확인할 수 있습니다. 

          b).IsHelp.exe를 실행 - ??模?클릭 - 창에 xxywt.dll 를 적고 搜索 클릭하면  
             xxywt.dll 파일을 사용하는 프로세스의 PID를 확인할 수 있습니다.  

    3).xxywt.dll 삭제하기
         IceSword의 File 탭에서 경로를 따라 xxywt.dll 찾아 우클릭 - Delete 클릭

2008. 10. 29. 05:00

여기도 가볼 것. - http://mm.sookmyung.ac.kr/~sblim/lec/xml-int02/javascript/js02-02.htm
자바스크립트 이벤트 .....................................................


아주 중요한 이벤트!!!
이벤트란 모든 행위를 말하는 것으로 프로그램에서는 미리 사용자의 행위를 예측하여 미리 사용할 수 있도록 이벤트를 많이 준비해 놓고 있다.

예를 들어 사용자가 마우스를 클릭할 것이다.... 이건 click 이벤트로 준비!
이게 없다면 우리는 사용자가 마우스를 클릭했는지 부터 알아내야 다음 일을 할 수 있을 것이다. 고맙게도 click이 일어났다는 걸 자동으로 알 수 있으니 얼마나 고마운 일인가...

(Click, MouseOver, MouseOut, Submit...)

이벤트 핸들러란 ?

이러한 이벤트와 우리가 준비한 프로그램을 연결해 주는 구실을 한다

(onClick,onMouseOver,onMouseOut, onSubmit...)

* 그래서 우리가 할일은 이벤트가 일어났을 때 할 일을 준비하고
이벤트 핸들러에게 그 일을 하도록 연결해 두면 되는 것이다~~~


■ 이벤트의 종류와 의미 (이벤트핸들러는 이벤트에 on을 붙여 준다)

blur
포커스를 다른곳으로 옮길 경우
click 링크나 폼의 구성원을 클릭할 때
change 선택값을 바꿀 경우
focus 포커스가 위치할 경우
mouseover 마우스가 올라올 경우
mouseout 마우스가 떠날 경우
mousedown 마우스를 누를 경우
mousemove 마우스를 움직일 경우
mouseup 마우스를 눌렀다 놓을 경우
select 입력양식의 하나가 선택될 때
submit 폼을 전송하는 경우
load 페이지,윈도우가 브라우져로 읽혀질 때
unload 현재의 브라우저,윈도우를 떠날 때
error 문서나 이미지에서 에러를 만났을 때
reset 리셋 버튼이 눌렸을 때
dbclick 더블클릭시
dragdrop 마우스 누르고 움직일 경우
keydown 키 입력시
keypress 키 누를 때
keyup 키를 누르고 놓았을 때
move 윈도우나 프레임을 움직일 때
resize 윈도우나 프레임 사이즈를 움직일 때


■ 메서드

blur()
입력 포커스를 다른 곳으로 이동시킴
click() 마우스 버튼이 눌러진 것처럼 해줌
focus() 입력 포커스를 준 것처럼 해줌
submit() 폼의 submit 버튼을 누른 것처럼 해줌
select() 메소드 폼의 특정 입력 필드를 선택함


■ 속성

event.keyCode 누른 키의 ASCII 정수 값
event.x
문서 기준 누른 좌표의 left
event.y 문서 기준 누른 좌표의 top
event.clientX 문서 기준 누른 좌표의 left
event.clientY 문서 기준 누른 좌표의 top
event.screenX 콘테이너 기준 누른 좌표의 left
event.screenY 콘테이너 기준 누른 좌표의 top


■ 브라우저 객체별 이벤트 핸들러

선택 목록(SELECT)
onBlur, onChange, onFocus
문자 필드(TEXT) onBlur, onChange, onFocus, onSelect
문자 영역(TEXTAREA) onBlur, onChange, onFocus, onSelect
버튼(BUTTON) onClick
체크박스(CHECKBOX) onClick
라디오 버튼(RADID) onClick
링크 onClick, onMouseover
RESET 버튼(RESET) onClick
SUBMIT 버튼(BUTTON) onClick
DOCUMENT onLoad, onUnload
WINDOW onLoad, onUnload
폼(FORM) onSubmit

2008. 10. 29. 05:00

Attribute definitions - http://www.w3.org/TR/REC-html40/interact/scripts.html
onload = script [CT]
The onload event occurs when the user agent finishes loading a window or all frames within a FRAMESET. This attribute may be used with BODY and FRAMESET elements.
onunload = script [CT]
The onunload event occurs when the user agent removes a document from a window or frame. This attribute may be used with BODY and FRAMESET elements.
onclick = script [CT]
The onclick event occurs when the pointing device button is clicked over an element. This attribute may be used with most elements.
ondblclick = script [CT]
The ondblclick event occurs when the pointing device button is double clicked over an element. This attribute may be used with most elements.
onmousedown = script [CT]
The onmousedown event occurs when the pointing device button is pressed over an element. This attribute may be used with most elements.
onmouseup = script [CT]
The onmouseup event occurs when the pointing device button is released over an element. This attribute may be used with most elements.
onmouseover = script [CT]
The onmouseover event occurs when the pointing device is moved onto an element. This attribute may be used with most elements.
onmousemove = script [CT]
The onmousemove event occurs when the pointing device is moved while it is over an element. This attribute may be used with most elements.
onmouseout = script [CT]
The onmouseout event occurs when the pointing device is moved away from an element. This attribute may be used with most elements.
onfocus = script [CT]
The onfocus event occurs when an element receives focus either by the pointing device or by tabbing navigation. This attribute may be used with the following elements: A, AREA, LABEL, INPUT, SELECT, TEXTAREA, and BUTTON.
onblur = script [CT]
The onblur event occurs when an element loses focus either by the pointing device or by tabbing navigation. It may be used with the same elements as onfocus.
onkeypress = script [CT]
The onkeypress event occurs when a key is pressed and released over an element. This attribute may be used with most elements.
onkeydown = script [CT]
The onkeydown event occurs when a key is pressed down over an element. This attribute may be used with most elements.
onkeyup = script [CT]
The onkeyup event occurs when a key is released over an element. This attribute may be used with most elements.
onsubmit = script [CT]
The onsubmit event occurs when a form is submitted. It only applies to the FORM element.
onreset = script [CT]
The onreset event occurs when a form is reset. It only applies to the FORM element.
onselect = script [CT]
The onselect event occurs when a user selects some text in a text field. This attribute may be used with the INPUT and TEXTAREA elements.
onchange = script [CT]
The onchange event occurs when a control loses the input focus and its value has been modified since gaining focus. This attribute applies to the following elements: INPUT, SELECT, and TEXTAREA.


- onUnload이벤트에서 새로고침과 창닫기 구분 - 
자동 로그아웃 등에 사용되는 onUnload 이벤트는 창을 닫는 것만이 아니라 새로고침에서도 발생한다.
이것을 구분하는 스크립트
function unload() {
    if( self.screenTop > 9000 ) {
           // 브라우저 닫힘
    } else {
        if( document.readyState == "complete" ) {
           // 새로고침
        } else  if( document.readyState == "loading" ) {
           // 다른 사이트로 이동
        }
    }
}

<body onUnload="javascript:unload();">
</body>




window.onload 이벤트를 등록하면 이미지나 css 파일이 다 로드된 후에 이벤트가 발생한다.
가끔 웹 서버 문제로 이미지 하나가 로딩이 늦어 질 경우 이벤트 발생 시점이 의도한 바와 차이가 생기게 된다.

이를 해결하기 위한 방법이 아래의 URL 에서 확인 가능하다.

The window.onload Problem - Solved!
* http://dean.edwards.name/weblog/2005/09/busted

window.onload (again)
* http://dean.edwards.name/weblog/2006/06/again/

위의 방법에 따라 onload 이벤트를 등록하게 될 경우 내부적으로 이벤트를 Push 하는 방법을 적용하고,
onunload 이벤트에 하나가 아닌 다수의 이벤트를 등록할 때 이를 관리하기 위한 부분도 추가하여
기존에 사용하던 이벤트 관리 스크립트를 업데이트 했다.

아래는 이벤트 관리 스크립트 소스.

/**
 * Class :: Event add, remove, registed event unload
 * File :: Event.js
 *
 * @classDescription    브라우저에 따른 이벤트 등록, 해제, 등록된 이벤트 모두 해제
 */
var EventManager = function() {
    constructor = this.__construct();
}

/**
 * window 객체에 load 이벤트 등록시 펑션 리스트를 등록
 */
var _OnLoadList = [];
/**
 * window 객체에 unload 이벤트 등록시 펑션 리스트를 등록
 */
 
var _UnLoadList = [];
/**
 * prototype of EventHandler class
 *  __construct
 * 
 *  _EventList
 * 
 *  add
 *  remove
 *  unload
 */
EventManager.prototype = {
    /**
     * window의 unload 이벤트에 EventHandler.unload 메소드를 등록
     *
     * @see #unload
     * @constructor
     */
    __construct: function() {
        var oThisObject = this;
       
        /* for Mozilla */
        if (window.addEventListener) {
            window.addEventListener("DOMContentLoaded", oThisObject.baseRun, false);
           
        /* for Safari */
        } else if (/WebKit/i.test(navigator.userAgent)) { // sniff
            var _timer = setInterval(function() {
                if (/loaded|complete/.test(document.readyState)) {
                    oThisObject.baseRun();
                }
            }, 10);
           
        /* for Internet Explorer */
        } else {
            var bInit = false;
           
            /*@cc_on @*/
            /*@if (@_win32)
                document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
               
                var oScriptLoad = document.getElementById("__ie_onload");
               
                oScriptLoad.onreadystatechange = function() {
                    if (this.readyState == "complete") {
                        oThisObject.baseRun();
                    }
                };
               
                bInit = true;
            /*@end @*/
           
        /* for Other */
            if (bInit == false) {
                window.onload = oThisObject.baseRun;
            }
        }
       
        this.add( window, 'unload_event', EventManager.prototype.unload );
    },
   
    /**
     * 페이지 종료시 등록된 이벤트를 해제하기 위하여 추가된 Event 목록
     *
     * @type {Array}        add 에서 데이터 추가
     */
    _EventList: [],
   
    /**
     * event 를 addEventListener 와 attachEvent 를 사용하여 등록 <br />
     * _EventList 에 등록된 이벤트를 배열로 저장
     *
     * @param {Object} setElement       HTML Object
     * @param {String} eventName        event name - on 을 접두어로 붙이지 않음
     * @param {Function} funcName       Exist function name
     */
    add: function( setElement, eventName, funcName ) {
        if ((setElement == window) && (eventName == 'load')) {
            _OnLoadList.push(funcName);
        } else if ((setElement == window) && (eventName == 'unload')) {
            _UnLoadList.push(funcName);
        } else {
            if ((setElement == window) && (eventName == 'unload_event')) {
                eventName = 'unload';
            }
           
            if ( window.addEventListener ) {
                setElement.addEventListener( eventName, funcName, false );
            } else {
                setElement.attachEvent( 'on' + eventName, funcName );
            }
           
            this._EventList.push({
                object: setElement,
                event:  eventName,
                func:   funcName
            })
        }
    },
   
    /**
     * event 를 removeEventListener 와 detachEvent 를 사용하여 해제
     *
     * @param {Object} setElement   HTML Object
     * @param {String} eventName    event name - on 을 접두어로 붙이지 않음
     * @param {String} funcName     Exist function name
     */
    remove: function( setElement, eventName, funcName ) {
        if ( window.removeEventListener ) {
            setElement.removeEventListener( eventName, funcName, false );
        } else {
            setElement.detachEvent( 'on' + eventName, funcName );
        }
    },
    /**
     * window.unload 이벤트시 _EventList 에 등록된 모든 이벤트를 해제
     */
    unload: function() {
        var sFunction = '';
       
        for ( var oEventData in _UnLoadList ) {
            sFunction = _UnLoadList[oEventData];
           
            if (sFunction == '______array') {
                continue;
            }
           
            sFunction.call();
        }
       
        _UnLoadList = []
       
        for ( var oEventData in this._EventList ) {
            this.remove( oEventData.object, oEventData.event, oEventData.func );
        }
    },
    /**
     * window.onload 에 등록한 function 을 모두 실행시킨다.
     */
    baseRun: function() {
        var sFunction = '';
       
        for ( var oEventData in _OnLoadList ) {
            sFunction = _OnLoadList[oEventData];
           
            if (sFunction == '______array') {
                continue;
            }
           
            sFunction.call();
        }
    }
}
var oEvent = new EventManager();
var Event = function() {
    return oEvent;
}

2008. 10. 24. 00:38
2008. 9. 1. 05:00
D'Accord Easy Tuner
사용자 삽입 이미지

D'Accord Easy Tuner는 사용자가 가지고 있는 기타및 현악기의 음을 정확하게 튜닝해주는 프로그램입니다.
단순하게 컴퓨터에서 나오는 소리와 사용자의 기타 소리를 비교해서 튜닝해주는 프로그램이 아니라 마이크로폰을 통해 사운드 카드로 입력된 소리와 실제 정확하게 맞아야할 소리를 비교해서 사용자가 해당키를 얼마만큼 조절해야하는지를 이미지로 쉽게 보여주기 때문에 쉽게 튜닝이 가능합니다.
마법사 기능을 이용해서 최적의 상태로 쉽게 튜닝을 할수 있으며, 일반 기타, 전자 기타(일반), 전자 기타(Drop D), Small 기타(일반), Small 기타(타입 2), 베이스 기타 (6 Strings), 베이스 기타 (5 Strings), 베이스 기타 (4 Strings), 만도린, Banjo(타입 2), Banjo(타입 3), Banjo(타입 4), Banjo(타입 5), Pipa, 우클레레(일반), 우클레레(타입 2), 우클레레(타입 3), 우클레레(타입 4), 보우조우키, 바이올린, 첼로등 다양한 현악기의 튜닝이 가능하게 해줍니다.