천객만래 [千客萬來] (It has an interminable succession of visitors)

PC 고유번호, 컴퓨터 고유번호 찾기



랜카드의 맥어드레스로 고유번호를 찾는 경우에는

랜카드의 변경, 무선랜카드의 변경 등으로 쉽게 바뀔 수가 있다.

그래서, 메인보드의 고유번호인 serialnumber를 확인하는게 더 확실하다.




메인보드 serialnumber



> wmic baseboard get manufacturer, product, model, serialnumber



랜카드 mac address



wmic nicconfig get caption, ipaddress, macaddress

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[개발/이론] 악성코드 스파이웨어 분류



http://labs.no-ad.co.kr/net/SpywareDB.aspx

 

• 트래킹쿠키
2개 이상의 다른 사이트에서 공유하는 쿠키입니다. 쿠키는 사이트마다 생성하여 접속 정보를 저장하는 파일인데, 여러 사이트에서 쿠키를 공유하게 되면 사용자의 정보가 유출될 우려가 있습니다. 
• 광고 표시
프로그램 실행 중에 프로그램의 화면 내부 혹은 팝업으로 광고를 노출합니다 
• 로봇
시스템 외부에서 사용자 허락 없이 시스템을 조작할 수 있도록 하는 프로그램입니다. 
• 수집기
개인 정보 혹은 관련된 파일을 수집하는 프로그램입니다. 
• 사기
사용자의 시스템에 대하여 의도적으로 잘못된 정보를 표시하는 프로그램입니다. 
• 제거방해
해당 프로그램을 삭제할 때 불편한 과정을 거쳐야 하거나 제거할 수 없게 하는 프로그램입니다. 
• 비정상적 설치경로
프로그램 제작사의 공식 홈페이지나 포털사이트의 공개자료실 및 패키지형태가 아닌 개인 홈페이지, 동호회 등의 게시판에서 ActiveX등의 형식으로 설치되는 프로그램입니다. 
• 실행방해
다른 정상적인 프로그램의 실행을 방해하는 프로그램입니다. 
• 백도어
외부에서 시스템 내부로 접근할 수 있는 통로를 생성하는 프로그램입니다. 이 통로를 통하여 사용자의 파일을 유출하거나 시스템의 권한을 획득할 가능성이 있습니다. 
• BHO
인터넷 익스플로러의 기능을 추가/확장하는데 사용되는 기술인 Browser Helper Objects의 약자입니다. 하지만 이 기능은 원치 않는 광고를 노출하는 등의 목적으로 이용되기도 합니다. 
• 번들러
다른 프로그램을 포함하여 배포되는 프로그램입니다. 포함되는 프로그램은 설치과정에서 함께 설치되거나, 프로그램 운용중에 설치됩니다. 
• 시스템 설정 변경
윈도우의 시스템 설정을 변경하는 프로그램입니다. 
• IE 설정 변경
인터넷 익스플로러의 설정을 변경하는 프로그램입니다. 
• 다이얼러
인터넷 ISP 혹은 사설 BBS등에 사용자 확인 없이 접속하는 프로그램입니다. 
• 다운로더
다른 프로그램을 네트워크를 통해 다운로드/설치하는 프로그램입니다. 
• 드로퍼
실행 파일 내부에 보관된 악성프로그램을 파일 실행 시 특정한 다른 곳에 복사하는 프로그램입니다. 
• 가로채기
시스템의 설정을 변경하여 사용자의 요청을 가로채어 자신의 목적대로 수행하도록 유도하는 프로그램입니다. 대표적인 예로 강제적인 사이트 포워딩 행위가 있습니다. 
• 후킹
다른 프로그램의 수행을 가로채는(후킹하는) 특성을 가진 프로그램입니다. 
• 설치
설치 기능을 가진 모든 프로그램을 지칭합니다. 
• 키로거
설치 기능을 가진 모든 프로그램을 지칭합니다. 
• 키워드 변경
검색 키워드를 초기화하거나 변경하는 프로그램입니다. 
• 메일러
메일 전송을 가진 프로그램입니다. 
• 루트킷
관리자 권한이나 기타 특수한 접근 권한을 획득하는데 사용되는 프로그램입니다. 
• 툴바
인터넷 익스플로러의 추가기능으로 설치되는 도구모음 프로그램입니다. 
• 트로이 목마
정상적인 프로그램으로 가장하여 정보 수집 등의 기능을 수행하는 프로그램입니다. 
• 바이러스
정상적인 파일 안에 자신을 숨겨 파일이 실행될 때 시스템의 데이터를 변조, 파괴하며 다른 정상적인 파일에 자신을 복제해 넣는 프로그램입니다. 
• 웜
네트워크를 통해 스스로 확산되는 프로그램입니다. 바이러스와 달리 숙주가 되는 파일이 필요하지 않으며, 스스로 실행됩니다. 
• 팝업 표시
사용자에게 불편을 초래할 수 있는 별도의 창을 띄우는 프로그램입니다. 
• 시작페이지 변경
인터넷 익스플로러의 시작 페이지를 초기화하거나 변경하는 프로그램입니다. 
• 시작프로그램 변경
윈도우의 시작 프로그램 항목을 변경하거나 추가하는 프로그램입니다. 
• 로컬 코드 실행
로컬 코드를 실행하는 프로그램입니다. 
• 스파이웨어 제거
스파이웨어 제거 프로그램입니다. 
• 변장 프로그램
다른 프로그램으로 가장하여 특수한 목적을 수행하는 프로그램입니다. Trojan과 비교하여 악의적인 목적을 가지지는 않으나 사용자에게 불편을 초래할 가능성이 있는 프로그램입니다. 
• 즐겨찾기 변경
웹브라우저에 즐겨찾기를 추가하거나 변경하는 프로그램입니다. 
• 바로가기 생성
바탕화면에 바로가기를 생성하는 프로그램입니다. 
• 해킹툴
시스템의 정보를 유출하거나 변조/파괴하기 위해 사용하는 프로그램이며 일반적으로 시스템의 보안 취약점을 이용합니다. 




반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

그레이웨어 분류기준 

 
http://labs.no-ad.co.kr/net/GraywareCriteria.aspx
 
1 개요
 
이 문서는 그레이웨어에 대한 (주)노애드의 자체 정의 및 기준을 기술하고 있습니다.
이 문서에 기술된 정의 및 기준은 노애드 및 노애드2+에 내장된 검사/치료 데이터베이스의 기반이 됩니다.
 
 
 
2 정의
 
그레이웨어는 악성프로그램과는 다르게 사용자의 동의를 얻어 설치되며 사용자의 컴퓨터에 위협적인 행동을 하지는 않지만 사용자에게 불편을 야기할 수 있는 프로그램입니다.
다음 절에서 기술한 행위를 수행하는 프로그램은 그레이웨어로 인정할 수 있습니다.

그레이웨어로 분류된 프로그램의 제작사는 해당 프로그램이 아래에 기술된 행위를 더 이상 수행하지 않는다는 증거자료를 첨부하여 ㈜노애드에 이의를 제기할 수 있으며 ㈜노애드에서는 해당 프로그램에 대해 3~6개월 동안 해당 행위가 반복되지 않음을 확인한 후에 노애드 및 노애드2+의 그레이웨어 데이터베이스에서 해당 프로그램을 삭제합니다.
 
 
 
3 인정 기준
 
프로그램의 이름을 명확하게 알리지 않거나 프로그램의 기능에 대하여 프로그램 배포 사이트 혹은 설치관리자를 통하여 사용자에게 명확하게 주지시키지 않는 행위
웹브라우저 주소표시줄의 기능을 변경하는 행위.

사용자가 쉽게 구분할 수 없는 웹브라우저의 기본 주소표시줄과 유사한 형태의 주소표시줄을 설치하는 행위

프로그램 실행 중에 해당 프로그램창 내부가 아닌 곳에 광고를 노출하는 행위.

사용자 동의 없이 바탕화면에 바로가기, 즐겨찾기를 추가하는 행위.

사용자가 의도하지 않은 물품을 구매하거나, 의도하지 않은 판매자에게 구매하도록 유도하는 행위.

사용자에게 웹사이트 이용에 반드시 필요하지 않은 해당 프로그램의 설치를 요구하는 행위.

프로그램 실행 중에 프로그램의 실행여부를 확인할 수 없게 하는 행위(작업표시줄, 트레이아이콘, 프로그램창 등).

프로그램 제거 과정에서 프로그램 제거를 취소하도록 유도하거나 협박하는 행위.

사용자의 승인 없이 시스템 시작과 동시에 실행되는 프로그램 목록(레지시트리, 시작프로그램, 기타 모든 목록)에 해당 프로그램을 등록시키는 행위 
 
 

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

Rad Studio XE 버전별 멀티디바이스 지원 정보




안드로이드, iOS, Android, 아이오에스, RAD Studio, DELPHI, 모바일,

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[javascript] 남녀 표준체중알아보기


20070327




<SCRIPT LANGUAGE="JAVASCRIPT">
function Man_Weight(h)
{
     c=(h-100)*0.9
     return c;
}
function Woman_Weight(h)
{
    c=(h-100)*0.85
    return c;
}
function calculate_Weight(w, c)
{
    d=w/c*100
    return d;
}    
function error(form)
{
       if (form.w.value==null||form.w.value.length==0 || form.h.value==null||form.h.value.length==0)
       {
          alert("측정할 정보를 입력하지 않았습니다.");
          return false;
       }
          return true;
}
function ResultCal(form)
{
var sexis=form.type.value;//폼에서 type 항목의 값으로 성별 구분

      if (error(form))
      {
       if(sexis==1)
       {
          c=Math.round(Man_Weight(form.h.value));
       }
       else if(sexis==2)
       {
          c=Math.round(Woman_Weight(form.h.value));
        }
        form.c.value=c;
        fat=Math.round(calculate_Weight(form.w.value, c));
         if(fat>=120)
         {
           form.doctor.value="비만이십니다. 시간나실때 마다 운동을 즐거운 맘으로 하세요";        
         }
         else if(fat>=90 && fat<120)
        {    
          form.doctor.value="건강한 표준 체중이십니다. 건강은 건강할때 지켜야 합니다.";
        }
         else if(fat>0 && fat<90)
        {
          form.doctor.value="표준체중에 미달입니다. 가벼운 운동과 함께 맛있는 음식많이 섭취하세요";
       }
       }
      return;
}
function re(form)
{
    form.w.value = "";
    form.h.value = "";
    form.c.value = "";
    form.doctor.value = "";
}
</SCRIPT>
<!--여기까지의 스크립트를 <head>와 </head>태그 사이에 넣으세요-->
<FORM NAME="test" method=get>  
남성일 경우는 1을  여성일 경우는 2 를 입력하세요<br>
<INPUT TYPE="text" NAME="type" VALUE="1" size="1">
신장<input type=TEXT name=h  size=5 >cm
몸무게<input type=TEXT name=w  size=5 >kg
<input type="BUTTON"  value="측정결과"  onClick="ResultCal(this.form)" name="BUTTON">
<input type="BUTTON"  value="다시입력"  onClick="re(this.form)" name="BUTTON"><br>
귀하의 이상적인 평균체중은
<input type=TEXT name=c size=5>kg
<br>
*처방
<br>
<textarea name="doctor" cols=50 rows=5 wrap=on>
반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[기사] 실시간 영상 워터마킹



20030901

http://news.dreamwiz.com/BIN/viewnews.cgi?cm=2&id=20030901&se=10&ki=dt&fn=200309010250100250090.html

정부의 10대 성장동력 중 하나로 선정된 디지털콘텐츠 시장을 활성화하기 위해서는 무엇보다 복사,배포가 쉬운 디지털콘텐츠의 저작권을 보호하는 기술을 확보하는 것이다.

암호화 기반의 디지털저작권관리(DRM)시스템은 안전한 콘텐츠 유통을 위한 하나의 수단이 될 수 있지만 사용이 허가된 사람에게는 콘텐츠를 보여줄 수 밖에 없고 이는 해킹의 시작이 된다는 점에서 2차적인 저작권보호책이 필요하다.

워터마킹기술은 콘텐츠내에 다양한 정보를 삽입해 이를 제거하려는 시도로부터 안전하고, 삽입된 정보로 인해 원래의 콘텐츠를 손상시키지 않도록 설계돼야한다.

한국전자통신연구원(ETRI)이 개발한 블라이드 영상 워터마킹 기술은 회전,축소,확대,이동,절삭 등 기하학적 공격에 강하도록 설계됐고, 복합적인 공격후에도 워터마크가 검출될 수 있을 정도로 강력하다.

이 방식은 삽입과 추출에 걸리는 계산량이 적어 소프트웨어나 하드웨어 구현이 용이하다.영상의 크기가 커질수록 삽입과 추출에 소요되는 계산량이 급증하는 일반 워터마킹 방식에 비해 유리하다.

SD급 및 HD급과 같은 고품질 영상에서도 실시간 워터마킹이 가능하다.프레임 단위로 워터마킹을 삽입하는 비디오 워터마킹으로도 쉽게 쓸 수 있다.

ETRI는 영상 워터마킹 외에도 텍스트,오디오,비디오 데이터에 대한 연구도 병행하고 있다.

디지털타임스 09/01 02:50






반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[기사] ETRI, 디지털 영상 워터마킹 기술 개발



http://news.inews24.com/php/news_view.php?g_serial=78201&g_menu=021000&pay_news=0&list_page=1


대전=최병관기자 venture@inews24.com
2002년 11 월 19일  
  
최근 콘텐츠가 디지털형태로 제작, 보존, 유통됨에 따라 콘텐츠의 무분별한 불법 복제 및 콘텐츠의 위조, 변조를 방지할 수 있는 디지털영상 워터마킹기술이 개발됐다.

최근 콘텐츠가 디지털형태로 제작, 보존, 유통됨에 따라 콘텐츠의 무분별한 불법 복제 및 콘텐츠의 위조, 변조를 방지할 수 있는 디지털영상 워터마킹기술이 개발됐다. 

한국전자통신연구원(ETRI) 디지털저작권관리연구팀(주상현박사)은 디지털 콘텐츠의 제작자와 저작권자 보호를 위한 디지털 영상 워터마킹 기술을 개발했다고 19일 발표했다. 

ETRI는 이번 기술을 오는 21일 오후2시 정보통신연구진흥원 기술이전센터 교육장에서 열리는 기술이전설명회를 통해 중소기업에 이전할 계획이다. 

현재 국내·외에서 서비스되고 있는 워터마크(저작권 관련 정보)의 정보량은 대부분 워터마크의 존재유무를 판별하는 1비트 정보이거나 수 비트 정보에 지나지 않아 주로 소유권을 주장하는데 그치고 있다. 

그러나 이번에 ETRI가 개발한 기술은 디지털영상 콘텐츠 내에 저작권 관련 정보를 삽입하는 기술로 삽입하는 정보량을 128비트까지 지원가능토록 설계됐다. 

또 지원하는 정보량은 소유권 주장 뿐만 아니라 디지털영상을 구현하는 소프트웨어 및 하드웨어의 재생 제어를 포함한 다양한 정보를 삽입할 수 있으며 압축과 회전, 확대 등과 같은 워터마크를 변형, 제거하려는 행위에도 견고하도록 설계된 것이 특징이다. 

워터마킹기술 개발은 영상 뿐만 아니라 오디오, 비디오, 텍스트, 3D데이터에 대한 기술 개발도 병행하여 진행되고 있다. 내년에는 모두 기술이전이 가능할 것으로 ETRI는 전망했다. 

개발 책임자 주상현 박사는 "워터마킹 분야는 디지털콘텐츠의 수요가 급증하면서 새로 파생돼 나온 분야로 국내기술력은 선진국에 비해 뒤지지 않는다"며 "디지털 콘텐츠 저작권 보호를 위한 워터마킹 분야는 해외시장에서 경쟁력을 가질 수 있다"고 말했다. 

한편 ETRI는 IDC의 자료를 인용, 디지털 콘텐츠시장은 연평균 40% 이상의 증가율을 보이고 있어 지난 95년 130억달러에 불과했지만 2003년에는 1천650억달러로 성장할 것으로 전망된다고 설명했다. 

이같은 콘텐츠시장의 10%인 165억달러가 저작권 관련비용이며 이중 30%인 49억5천만달러가 워터마킹 비용으로 추산된다고 덧붙였다. 



반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[기사] 음악파일 불법 복사 막아




2003년 05월 08일 (목) 16:21

고속 인터넷 발달은 급속한 전자상거래의 발전을 가져왔다.
전자상거래 가운데 음악파일 유통은 양적으로 많이 성장했다고는 하 지만 불법적인 음악 복사 및 배포가 해결해야 할 과제로 남아 있는 상황이다.

특히 인터넷을 이용해 음악연주를 들을 수 있고, 그 음악을 온라인상 에서 받아볼 수 있는 기술로 인터넷상에서 음악을 파는 서비스가 증 가하고 있지만 판매된 음악이 다시 불법으로 배포되는 것은 방지할 수 없다는 것이 문제가 되고 있다.

단국대 멀티미디어통신망연구실 박인정 교수팀은 인터넷상에서 음악 파일이 불법으로 복사되는 것을 사전에 방지할 수 있는 '오디오저작 권 고속마킹 장치'를 개발중이다.

박 교수는 "이 기술을 통해 인터넷을 통한 불법적인 음향의 배포를 방지하고 저작권을 보호할 수 있다"고 설명했다.

박 교수팀의 기술은 정보전달 재료로 사용되는 '워터마크(watermark) '의 활용을 다양화하는 대안으로 스펙트로그램화된 음향에 대입시키 는 방법을 제공한다.

워터마킹을 삽입하는 과정에 있어서 음향을 2차원 영상으로 변환한 후에 각 주파수 영역에 워터마크를 삽입하거나 또는 영상을 직접 워 터마킹할 수 있는 스펙트로그램을 이용하는 것이 기술의 특징이라고 연구팀은 설명했다.

이는 종래 무작위 변수를 이용해 워터마크로 이용하던 것을 심벌화된 워터마크를 이용해 콘텐츠 업자마다 고유한 워터마크를 확보할 수 있 도록 한 것이다.

또 잡음으로 삽입되는 워터마크 밀도를 낮춤으로써 전체적인 원음향 품질을 보존할 수 있게 했다.

단국대 연구팀은 이 연구를 위해 벤처기업인 테크노하우스와 공동연 구도 진행하고 있다.

연구실에서는 이 외에 디지털 키보드, 네트워크 모니터, 디지털 웹 T V, 스마트홈 등에 대해 연구 개발중이다.

<김태근 기자>
* 소백님에 의해서 게시물 복사되었습니다 (2006-08-14 16:02)


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

해상도 종류




반응형
Posted by 사용자 SB패밀리
TAG 해상도

댓글을 달아 주세요

XE fies 폴더 안에 있는 cache 폴더 삭제 하기



아래 설명은 호스팅 관리자 권한이 있을 때 telnet 모드로 접속해서 처리하는 방식이다.

이 방법이 안되면


chmod707.php 파일을 생성해서 707 실행 권한을 주고 웹에서 이 파일 경로로 접속하면

xe/files/cache 경로가 모두 삭제 가능한 모드로 변경한다.


그러면, telnet 모드로 접속하여 원하는 캐쉬 파일이나 디렉토리를 삭제하면 된다.


그런 후, 관리자 모드로 접속하여 캐쉬 재생성하기 또는 정리하기를 해주면 된다.


<chmod707.php>

<? 


$cmd = `chmod -R 777 files/cache/`; 


echo "$cmd"; 


echo "ok"; 


?>  




FTP나 SSH로 접속하여 xe 폴더 > files 폴더 안에 있는 cache 폴더를 삭제 하는 방법은

 

cd 명령어로 files 폴더 가까지 이동한 후 tm -rf cache 라고 입력하면 된다.

 

만역 권한 문제로 폴더 삭제가 되지 않는다면 첨부에 있는 파일을 다운로드 하여 xe 폴더 안에 넣고 실행한다.

 

실행후 OK 표시가 뜨면 FTP 에서 cache  가 삭제 될것이다.

 

규모가 튼 사이트의 경우 FTP 에서 cache 폴더를 삭제한느 것은 많은 시간이 소요될수 있으므로

 

SSH 로 접속하여 xe > files 폴더롤 이동하후  fm -rf cache 를 입력하면 빨리 삭제 할수 있다.

 

file 폴더의 권한을 707 혹은 777 로 변겅해 준다

 

관리자 모드에서 캐쉬재생성  해주면 된다.

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

영상처리 이미지 모음


256x256x256 grayscale


lenna


artifield



butterfly

 


camera



cat



dish



house



lady



pascal



pattern



512x512

peppers



512x512

goldhill



brooboo




반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[asp.net] The compiler failed with error code 128



Server Error in '/net' Application.
--------------------------------------------------------------------------------

Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: The compiler failed with error code 128.

Show Detailed Compiler Output:

C:\WINNT\system32> "C:\WINNT\Microsoft.NET\Framework\v2.0.50727\csc.exe" /t:library /utf8output /R:"C:\WINNT\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System.Web.Services\2.0.0.0__b03f5f7f11d50a3a\System.Web.Services.dll" /R:"C:\WINNT\assembly\GAC_32\System.Web\2.0.0.0__b03f5f7f11d50a3a\System.Web.dll" /R:"C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\net\25abbb5f\59ac6f1f\assembly\dl3\d9f2321a\8c67f30e_f8a3c601\App_Web_sl75aj7z.DLL" /R:"C:\WINNT\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System.Xml\2.0.0.0__b77a5c561934e089\System.Xml.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" /R:"C:\WINNT\assembly\GAC_MSIL\System.Web.Mobile\2.0.0.0__b03f5f7f11d50a3a\System.Web.Mobile.dll" /R:"C:\WINNT\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll" /out:"C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\net\25abbb5f\59ac6f1f\App_Web_default.aspx.cdcab7d2.d9t21czt.dll" /D:DEBUG /debug+ /optimize- /w:4 /nowarn:1659;1699  "C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\net\25abbb5f\59ac6f1f\App_Web_default.aspx.cdcab7d2.d9t21czt.0.cs" "C:\WINNT\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\net\25abbb5f\59ac6f1f\App_Web_default.aspx.cdcab7d2.d9t21czt.1.cs"



-------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.42 

CAUSE
This problem occurs when a third-party component is running in the W3wp.exe process that has attached a console to the process. The Vbc.exe compiler process and the Csc.exe compiler process then inherit this console. If the console uses a windowstation that does not contain a desktop named DEFAULT, this may cause the compiler processes, or any other process that is spawned from the W3wp.exe process that depends on the User32.dll file, not to start. 

RESOLUTION
To resolve this problem, apply the hotfix in the following Microsoft Knowledge Base article:
839229  Multiple Web-based programs or Component Object Model-based programs stop responding on a computer that is running Windows Server 2003 or Windows 2000 
Note This hotfix is also included in Microsoft Windows Server 2003 Service Pack 1 (SP1).

CAUSE
This problem occurs because the worker process that tries to start the Microsoft ASP.NET compiler process is running under the Network Service identity or under an account that is not in the Administrators group. When the ASP.NET compiler process tries to start Vbc.exe or Csc.exe, the process initialization routine fails. This failure occurs because a dependent DLL fails during its initialization routine. If any of the DLLs for a process return a failure in their initialization routine, the operating system stops the process startup and returns an error code of 128 (ERROR_WAIT_NO_CHILDREN).

RESOLUTION
To resolve this problem, use either of the following methods. Use the method that fits your situation the best. 

Method 1: Prevent the World Wide Web Publishing Service from interacting with the desktop
You can prevent the World Wide Web Publishing Service from interacting with the desktop. This is the preferred method. 

Note By default, the World Wide Web Publishing Service is not configured to interact with the desktop. 

To do this, follow these steps: 
1. Click Start, click Run, type cmd, and then click OK. 
2. At the command prompt, type control admintools, and then press ENTER. 
3. Double-click Services. 
4. In the Services pane, locate World Wide Web Publishing Service. 
5. Right-click World Wide Web Publishing Service, and then click Properties. 
6. Click the Log On tab. 
7. Click to clear the Allow service to interact with desktop check box. 
8. Click OK. 

Method 2: Change the application pool identity to the Local System identity
Warning This workaround may make your computer or your network more vulnerable to attack by malicious users or by malicious software such as viruses. We do not recommend this workaround but are providing this information so that you can implement this workaround at your own discretion. Use this workaround at your own risk.

You can change the application pool identity to the Local System identity. 

Important You should only use this method if the following conditions are true: 
• The ASP.NET Web application must interact with the desktop. 
• You understand the security implications of changing the application pool identity to the Local System identity. For more information about the Local System account and the Network Service account, see the "Applications as NT Services" section at the following Microsoft Developer Network (MSDN) Web site: 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnentsrv/html/netenterpriseandcomplus.asp
To do this, follow these steps: 
1. Click Start, click Run, type cmd, and then click OK. 
2. At the command prompt, type control admintools, and then press ENTER. 
3. Double-click Internet Information Services (IIS) Manager. 
4. Expand the computer name, expand Application Pools, right-click the name of the application pool that you want to modify, and then click Properties. 
5. Click the Identity tab. 
6. Click Predefined, and then click Local System. 
7. Click OK. 

Method3:ran the the aspnet_regiis.exe and it solved my problem

C:\WINNT\Microsoft.NET\Framework\version\aspnet_regiis.exe -i 


MORE INFORMATION
ASP.NET does not try to compile a page after an error is encountered during the compilation process. The error is cached until the process is recycled, or until the page or one of its dependencies is modified. When the worker process is tied to the console windowstation (Winsta0), the World Wide Web Publishing Service adds the security identifier (SID) for the IIS_WPG group to the access control list (ACL) for the Winsta0 object. Then, the World Wide Web Publishing Service starts the W3wp.exe process.

When a user logs on to or off a console session, the Winlogon process rebuilds the ACL for the Winsta0 object and removes the IIS_WPG SID from the ACL. Any child processes that are started by the worker process (W3wp.exe) may not start. These processes include the Csc.exe and Vbc.exe processes. 

When a service is not configured to interact with the desktop, the process uses a non-interactive windowstation that is unaffected by a user logging on to the console.

Note You can log on to the console in Windows Server 2003 by any one of the following methods: 
• Log on to the computer interactively. 
• Use the Remote Desktop client application. For example, type mstsc.exe /console at a command prompt.  
• Use a third-party application that accesses the console session.


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[개발] 프로그램 진척도 보고 방법



http://blog.empas.com/eosao1973/18198761

프로젝트 진척도 측정에 있어 가장 믿지 못할 수치가 몇 %완료라는 것이다. 개발자들이나 기획자 혹은 디자이너들이 보통 몇 %를 완료했다고 보고하는데, 측정 기준이 없어 과연 그 수치가 어떤 의미를 가지는지 알지 못할 때가 많다. 

필자는 다음과 같은 측정 기준을 제시하고 주간보고서 및 월간보고서에 업무 단위 당 진척율을 기록하게 한다. 본 기준은 웹 프로젝트를 기준으로 함을 밝혀 둔다.

 

1. 문서 

 40%: 문서 작성 완료 

 60%: 프로젝트 팀 리뷰 후 

 80%: 고객 리뷰 후 

 100%: 고객의 승인 후 

 2. 디자인 

 60%: 디자인 완료 

 80%: HTML 코딩 완료 

 100%: 프로그램과 페이지 연결 완료 



3. 프로그램 진척도 보고 방법

 

 20%: 내부 클래스 및 클래스 구조 완료

 40%: 코딩 완료 (컴파일 완료)

 60%: 모듈 테스트 완료 (실행 완료)

 80%: HTML과 연동 완료 (뷰 완료)

 100%: 시스템 테스팅 완료 (검수완료)

 

위의 기준으로 10% 혹은 39%와 같은 애매한 진척도는 없고, 무조건 위의 기준으로만 진척율을 표시하게 한다. 그러나 전체적인 진척도를 측정하기 위해서는 프로그램 혹은 디자인 전체를 대상으로 진척도를 측정해야 하는데 이는 다음과 같이 측정한다. 

 예) 개발되어야 할 모듈이 10개이고, 이중 4개가 코딩이 완료되었고 6개가 모듈 테이트가 완료되었으면 ((4개 X 40%)+(2개 X 60%))/10= 28%의 전체 진도율을 보인다. 
  
 물론 프로젝트 전체 진도율을 측정하기 위해서는 WBS에 나타나는 모든 업무 단위를 위와 같은 측정 기준으로 작성하여 합한 것이 전체 진도율을 나타내게 된다. 




반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

Visual Studio 2005 IDE 팁과 트릭



James Lau
Microsoft 프로그램 관리자

2007년 2월

적용 대상: Microsoft Visual Studio 2005

요약: 개발자 도구 중에 가장 인기 있는 Visual Studio 2005를 더욱 효과적으로 활용할 수 있는 몇 가지 팁과 트릭을 소개하고자 합니다. 어떤 도구든 최대한 활용하려면 익숙해지는 것이 중요한데, 개발 도구와 IDE 역시 다르지 않습니다. 그러나 C# 2.0, ASP .NET 2.0, Windows Workflow Foundation, Windows Presentation Foundation, Windows Communication Foundation과 같은 신기술이 쏟아져 나오므로 정작 Visual Studio를 익힐 시간을 내기가 어렵습니다. 10분 정도만 시간을 내어 이 기사를 읽고 Visual Studio를 보다 즐겁고 생산적으로 사용할 수 있는 유용한 정보를 얻기 바랍니다.

목차


유용한 바로 가기 키

필자가 자주 사용하는 바로 가기 키

Visual Studio에서 프로그램을 개발할 때 키보드만 사용하면 더 편할 거라고 생각한 적이 있으십니까? 고급 사용자라면 분명히 키보드 바로 가기 키를 자주 사용하여 여러 가지 작업을 보다 빠르게 수행할 것입니다. 독자들도 대부분 Debug.Start를 실행하는 F5 키, Debug.StepOver를 실행하는 F10 키, View.Properties를 실행하는 F4 키 등에는 이미 익숙할 것이라 생각합니다. 그러나 그 밖에도 잘 알려져 있지 않았지만 유용한 바로 가기 키가 몇 가지 있습니다. 아래 표에는 필자가 자주 사용하는 몇 가지 바로 가기 키가 나와 있습니다.

바로 가기 키설명
F7디자인 보기와 코드 보기 사이를 전환합니다.
F9중단점을 설정하거나 해제합니다.
F12변수, 개체 또는 함수의 정의로 이동합니다.
Ctrl+Shift+7

Ctrl+Shift+8

정의로 이동 스택에서 앞/뒤로 빠르게 이동합니다.
Shift+F12함수나 변수의 참조를 모두 찾습니다.
Ctrl+MCtrl+M편집기에서 코드 개요를 확장하거나 축소합니다.
Ctrl+KCtrl+C

Ctrl+KCtrl+U

코드 줄에 주석을 추가하거나 제거합니다.
Shift+Alt+Enter전체 화면 모드와 표준 모드 사이를 전환합니다.
Ctrl+I증분 검색을 실행합니다.



바로 가기 키 참조표 만들기

대부분의 사람들이 모르고 있지만 사실 Visual Studio에는 450개가 넘는 기본 바로 가기 키가 있습니다. 그러나 Visual Studio의 모든 바로 가기 키를 손쉽게 찾을 수 있는 방법은 없습니다. 모든 바로 가기 키를 열거하는 간단한 매크로를 작성하면 기본 바로 가기 키를 모두 찾아볼 수 있습니다. 다음(코드 1)은 이러한 기능을 수행하는 코드입니다.

Public Module Module1

    Public Sub ListShortcutsInHTML()

        'Declare a StreamWriter
        Dim sw As System.IO.StreamWriter
        sw = New StreamWriter("c:\\demo\\Shortcuts.html")

        'Write the beginning HTML
        WriteHTMLStart(sw)

        ' Add a row for each keyboard shortcut
        For Each c As Command In DTE.Commands
            If c.Name <> "" Then
                Dim bindings As System.Array
                bindings = CType(c.Bindings, System.Array)
                For i As Integer = 0 To bindings.Length - 1
                    sw.WriteLine("<tr>")
                    sw.WriteLine("<td>" + c.Name + "</td>")
                    sw.WriteLine("<td>" + bindings(i) + "</td>")
                    sw.WriteLine("</tr>")
                Next

            End If
        Next

        'Write the end HTML
        WriteHTMLEnd(sw)

        'Flush and close the stream
        sw.Flush()
        sw.Close()
    End Sub
Public Sub WriteHTMLStart(ByVal sw As System.IO.StreamWriter)
        sw.WriteLine("<html>")
        sw.WriteLine("<head>")
        sw.WriteLine("<title>")

        sw.WriteLine("Visual Studio Keyboard Shortcuts")
        sw.WriteLine("</title>")
        sw.WriteLine("</head>")

        sw.WriteLine("<body>")
        sw.WriteLine("<h1>Visual Studio 2005 Keyboard Shortcuts</h1>")
        sw.WriteLine("<font size=""2"" face=""Verdana"">")
        sw.WriteLine("<table border=""1"">")
        sw.WriteLine("<tr BGCOLOR=""#018FFF""><td 
align=""center""><b>Command</b></td><td 
align=""center""><b>Shortcut</b></td></tr>")


    End Sub

    Public Sub WriteHTMLEnd(ByVal sw As System.IO.StreamWriter)
        sw.WriteLine("</table>")
        sw.WriteLine("</font>")
        sw.WriteLine("</body>")
        sw.WriteLine("</html>")
    End Sub

End Module

코드 1. HTML로 바로 가기 키를 생성하는 매크로

이 매크로를 사용하려면 도구에서 매크로를 선택한 다음 매크로 IDE. . .를 선택하여 매크로 IDE를 실행합니다. MyMacros 프로젝트, MyMacros 네임스페이스를 차례로 확장한 다음 Module1을 두 번 클릭합니다. 코드 1을 매크로 IDE에 복사하고 매크로를 실행하기만 하면 됩니다. 매크로를 실행하고 나면 Visual Studio에 사용할 바로 가기 키 참조가 생성됩니다. 결과물인 C:\demo\Shortcuts.html을 열어 보십시오. 그림 1은 이 페이지의 일부입니다. 페이지를 인쇄하여 컴퓨터 옆에 붙여 두고 바로 가기 키를 익혀 보십시오.


그림 1. Visual Studio 2005 바로 가기 키 목록의 일부


바로 가기 키 사용자 지정

기본적으로 매핑되어 있지 않은 바로 가기 키도 언제든지도구 > 옵션... > 환경 > 키보드 메뉴를 통해 사용자 지정할 수 있습니다(그림 2 참조). 그러나 많은 수의 바로 가기 키를 추가하는 경우에는 자동 저장 설정 파일을 직접 편집하는 방법으로 추가하는 편이 더 쉽습니다. 이 방법을 사용하려면 다음 단계를 수행하십시오.


그림 2. 옵션 대화 상자 - 바로 가기 키 사용자 지정

1단계: 현재 바로 가기 키를 내보냅니다. 도구 > 설정 가져오기 및 내보내기. . .로 이동하여 가져오기/내보내기 설정 마법사를 시작합니다. "선택한 환경 설정 내보내기"를 선택하고 다음을 클릭합니다. "모든 설정"을 클릭하여 모든 확인란의 선택을 취소한 다음 옵션, 환경 노드를 차례로 확장하여 "키보드" 확인란을 선택합니다(그림 3). 다음을 클릭하여 마법사의 마지막 페이지로 이동합니다. 새 설정 파일의 이름을 "MyKeyboardShorcuts.vssettings"로 지정하고 경로는 기본 디렉터리로 둡니다(그림 4). 마침을 클릭합니다..


그림 3. 내보낼 키보드 설정 범주만 선택



그림 4. 설정 파일 이름을 MyKeyboardShortcuts.vssettings로 변경

2단계: 설정 파일을 열어 편집합니다. 이 파일은 My Documents\Visual Studio 2005\Settings\MyKeyboardShortcuts.vssettings에 있습니다. Visual Studio 설정 파일은 XML 파일이므로 아무 텍스트 편집기에서나 열 수 있습니다. 하지만 구문 색 지정 기능과 문서 서식 지정 기능을 사용할 수 있도록 Visual Studio 자체에서 이 파일을 여는 것이 좋습니다. 파일을 연 후에는 "Ctrl+K, Ctrl+D"를 눌러 Visual Studio가 서식을 자동으로 지정하도록 합니다. 그런 다음 <UserShortcuts> 태그를 찾습니다. 이 XML 요소에 자신만의 바로 가기 목록을 추가할 수 있습니다. 아래 코드 2에서 예를 볼 수 있습니다.

...
<UserShortcuts>
   <Shortcut Command="View.CommandWindow" Scope="Global">
Ctrl+W, Ctrl+C
</Shortcut>
   <Shortcut Command="View.SolutionExplorer" Scope="Global">
Ctrl+W, Ctrl+S
</Shortcut>
   <Shortcut Command="View.ErrorList" Scope="Global">
Ctrl+W, Ctrl+E
</Shortcut>
   <Shortcut Command="View.TaskList" Scope="Global">
Ctrl+W, Ctrl+T
</Shortcut>
   <Shortcut Command="View.Output" Scope="Global">
Ctrl+W, Ctrl+O
</Shortcut>
</UserShortcuts>
...

코드 2. 설정 파일에 바로 가기 직접 추가

이 예의 XML은 이해하기 쉽습니다. 추가하려는 각 바로 가기에 대한 <Shortcut> 요소가 있을 뿐입니다. 바로 가기 자체를 이 요소의 내용으로 지정하고 ShiftCtrlAlt 등의 한정자 키를 "+" 문자로 연결하여 함께 사용할 수 있습니다(예: Ctrl+Alt+J). Command 특성에는 바로 가기에 바인딩할 명령의 정식 명령 이름을 지정합니다. Scope 특성은 거의 항상 Global로 사용되므로 이에 대해서는 자세히 다루지 않겠습니다. 이 과정에서 가장 어려운 부분은 아마도 특정 명령의 정식 이름을 알아내는 부분일 것입니다. 명령의 정식 이름은 최상위 메뉴 이름과 "." 문자, 그리고 공백 없이 대/소문자가 섞인 명령 이름이 연결된 형식입니다.

바로 가기를 모두 추가한 후 파일을 저장합니다.

3단계: 설정 파일을 가져옵니다. 설정 파일에 바로 가기를 추가했으므로 이제 사용 환경으로 다시 가져올 수 있습니다. 물론 설정 파일을 다른 사람과 공유할 수도 있습니다. 설정 가져오기 및 내보내기 마법사를 다시 시작하되, 이번에는 "선택한 환경 설정 가져오기"를 선택하고 다음을 클릭합니다. "아니요, 새 설정을 가져와 현재 설정을 덮어씁니다."를 선택하고 다음을 클릭합니다. "My Settings" 폴더에서 "MyKeyboardShortcuts.vssettings"를 선택하고 다음을 클릭합니다. 기본 선택 항목을 그대로 두고 마침을 클릭합니다.


도구 설명에 바로 가기 표시

도구 모음의 명령 위로 마우스를 이동할 때 도구 설명에 바로 가기가 표시되도록 환경을 설정할 수 있습니다. 도구 > 사용자 지정. . .에서 스크린 팁에 바로 가기 키 표시 옵션이 선택되어 있는지 확인합니다.


그림 5. 도구 설명에 바로 가기 키 표시 옵션 설정


창 레이아웃 선택기

Visual Studio는 여러 가지 작업과 용도에 사용되는 다양한 도구 창을 제공하는 강력한 환경입니다. 특히 VS 2005에서 새로 제공되는 Team System 기능이 이러한 측면을 잘 보여 줍니다. 많은 사용자들이 현재 수행 중인 작업에 맞게 여러 창 레이아웃 사이를 신속하게 전환할 수 있는 기능이 있으면 좋겠다는 의견을 전해 왔는데, 사실 VS 2005에서 직접 이 기능을 구현할 수 있지만 이를 위해서는 다음과 같은 단계를 수행해야 합니다.

1단계. 설정 파일을 만듭니다. Visual Studio 2005에는 사용자가 환경 설정을 가져오거나 내보낼 수 있는 새로운 기능이 있습니다. 환경에서 사용자 지정할 수 있는 항목은 거의 모두 파일로 내보내 다른 사람과 공유하거나 다른 컴퓨터로 가져오거나 백업 파일로 저장할 수 있습니다. 가져오거나 내보낼 수 있는 설정에는 창 레이아웃, 바로 가기 키, 메뉴 사용자 지정, 글꼴 및 색, 그리고 옵션 대화 상자(도구 > 옵션. . . )의 설정 대부분이 포함됩니다. 또한 언제든지 필요에 따라 환경 설정을 모두 내보내거나 일부만 내보낼 수 있습니다.

창 선택기를 만드는 첫 단계는 사용하려는 각 창 레이아웃마다 별도의 설정 파일을 만드는 것입니다. 이 예제에서는 사용할 3개의 창 레이아웃에 해당하는 CodeWriting, CodeBrowsing 및 FormsDesign이라는 3개의 설정 파일을 만듭니다.

먼저 코드를 작성할 때 선호하는 형태로 창 레이아웃을 배치합니다. 필자의 경우 도구 창을 모두 자동 숨김 모드로 설정하여 코딩 공간을 최대한 확보한 상태로 작업할 때가 많습니다. 그림 6은 필자가 이러한 창 레이아웃에 맞게 도구 창을 어떻게 배치했는지 보여 줍니다. 각자 선호하는 방식대로 수정하여 사용하면 됩니다. 다음으로 도구 > 설정 가져오기 및 내보내기로 이동하여 설정 가져오기 및 내보내기 마법사를 시작합니다. 선택한 환경 설정 내보내기를 선택하고 다음을 클릭합니다. 창 레이아웃 확인란만 선택하고 다음을 클릭합니다. 설정 이름을CodeWritingWinLayout.vssettings로 지정하고 마침을 클릭합니다. 필요한 세 가지 설정 파일 중 첫 번째 파일을 만들었습니다. 위 단계를 반복하여 나머지 두 가지 설정 파일을 만듭니다. 물론 창 레이아웃을 변경하고 파일 이름을 서로 다르게 지정해야 합니다. 필자의 경우CodeBrowsingWinLayout.vssettings와 FormsDesignWinLayout.vssettings로 지정했습니다.


그림 6. 코딩 작업에 적합한 창 레이아웃(큰 이미지를 보려면 클릭하십시오.) 

2단계. 설정 파일을 가져오는 매크로를 만듭니다. 설정 파일을 만든 후에는 각 설정 파일을 가져오는 매크로를 3개 만들어야 합니다. 아래 코드 3을 보면 이 코드가 얼마나 간단한지 알 수 있습니다.

Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.IO

Public Module Module1

  Public Sub ImportWinLayoutCodeWriting()
    DTE.ExecuteCommand("Tools.ImportandExportSettings",
    "-import:c:\demo\settings\CodeWritingWinLayout.vssettings")
  End Sub

  Public Sub ImportWinLayoutCodeBrowsing()
    DTE.ExecuteCommand("Tools.ImportandExportSettings",
    "-import:c:\demo\settings\CodeBrowsingWinLayout.vssettings")
  End Sub

  Public Sub ImportWinLayoutFormsDesign()
    DTE.ExecuteCommand("Tools.ImportandExportSettings",
    "-import:c:\demo\settings\FormsDesignWinLayout.vssettings")
End Sub

End Module

코드 3. 설정 파일을 가져오는 매크로 코드

3단계. 도구 모음에 단추를 추가합니다. 이제 창 레이아웃을 변경하는 실제 단추를 만들어야 합니다. 도구 > 사용자 지정. . .을 차례로 클릭하고 명령 탭을 클릭합니다. 범주 목록 상자에서 매크로를 선택한 다음 목록을 아래로 스크롤하여 방금 작성한 세 가지 매크로를 찾습니다. 이 세 개의 매크로는 각각 MyMacros.Module1.ImportWinLayoutCodeWritingMyMacros.Module1.ImportWinLayoutCodeBrowsing MyMacros.Module1.ImportWinLayoutFormsDesign으로 표시됩니다(그림 7 참조). 각 명령을 클릭하여 Visual Studio 도구 모음으로 끌어 놓습니다. 이제 도구 모음에 새로 추가한 명령을 마우스 오른쪽 단추로 클릭하고 명령의 이름을 좀 더 간단하게 바꿉니다.


그림 7. 사용자 지정 대화 상자를 사용하여 도구 모음에 매크로 추가

사용자 지정 대화 상자를 닫아 사용자 지정 내용을 저장합니다. 이제 여러분만의 창 레이아웃 선택기가 완성되었습니다. 도구 모음에서 새 단추를 클릭하여 사용해 보십시오. 도구 > 옵션. . . > 환경 > 키보드 페이지로 이동하여 이 명령에 바로 가기 키를 할당할 수도 있습니다..


코드 조각

코드 조각은 Visual Studio 2005에 새로 추가된 생산성을 크게 향상시키는 기능 중 하나로, 이를 통해 for 루프 입력과 같은 지루한 입력 작업 없이 코드 조각을 빠르게 추가할 수 있습니다. 또한 이 기능은 네트워크로 데이터를 전송하는 등의 특정 작업을 수행하는 방법을 보여 주는 템플릿을 제공합니다. 기본 제공 C# 조각은 대부분 반복적인 입력 작업을 최소화하는 데 도움이 되는 첫 번째 유형이고, 기본 제공 VB 조각은 대부분 특정 작업에 대한 코드를 보다 쉽게 작성할 수 있게 해 주는 두 번째 유형입니다.

코드 조각은 두 가지 방법으로 삽입할 수 있습니다. 코드 편집기에 코드 조각의 별칭을 입력하고 Tab 키를 두 번(VB의 경우 한 번) 누르면 코드 조각을 바로 삽입할 수 있습니다. 코드 조각을 삽입한 후에는 Tab 키와 Shift+Tab을 눌러 코드 조각의 여러 필드로 이동할 수 있습니다. 이 기능을 사용하면 수정이 필요한 코드 부분을 신속하게 변경할 수 있습니다. C#의 코드 조각 별칭에는 IntelliSense도 지원됩니다. IntelliSense 목록에서는 코드 조각 아이콘을 통해 코드 조각 항목을 구별할 수 있습니다.


그림 8. 코드 조각을 완벽하게 지원하는 IntelliSense

코드 조각을 삽입할 때 코드 조각의 별칭이 기억나지 않는 경우에는 코드 편집기에서 "Ctrl+KCtrl+X"를 누르거나 마우스 오른쪽 단추를 누르고 코드 조각 삽입...을 선택하면 됩니다. 그러면 코드 조각 선택기가 표시되며, 여기에서 현재 프로그래밍 언어에 사용할 수 있는 모든 코드 조각을 탐색하고 삽입할 코드 조각을 선택할 수 있습니다. 이 코드 조각 삽입 방법은 C#과 Visual Basic에서 모두 사용할 수 있습니다. Visual Basic 사용자는 이 방법 외에도 코드 조각 별칭의 앞부분 몇 글자와 "?"를 입력한 다음 Tab 키를 눌러 코드 조각을 삽입할 수도 있습니다. 그러면 모든 코드 조각 별칭이 사전순으로 나열된 목록이 표시되며 입력 항목과 가장 근접한 코드 조각 별칭이 강조 표시됩니다. 이 기능은 Visual Basic 사용자에게만 제공됩니다.


그림 9. C#에서 코드 조각 삽입(큰 이미지를 보려면 클릭하십시오.) 

필자는 코드 조각 기능에서 가장 흥미로운 부분은 자신만의 코드 조각을 만들어 개인적으로 사용하거나 커뮤니티와 공유할 수 있는 점이라고 생각합니다. 물론 다른 개발자가 만든 코드 조각을 다운로드할 수도 있습니다.

Visual Studio에서 손쉽게 자신만의 코드 조각을 만들 수 있습니다. 자세한 방법은 예제를 통해 살펴보도록 하겠습니다. 필자는 작업에 도움이 될 만한 간단한 유틸리티를 자주 작성합니다. 이러한 유틸리티 중 상당수는 파일을 열고 몇 가지 처리 작업을 수행한 후 파일을 닫는 공통적인 패턴을 가집니다. 필자가 코드 조각을 만드는 방법은 다음과 같습니다.

1단계: XML 파일을 만듭니다. 각 코드 조각은 XML 파일에 들어 있습니다. Visual Studio에서 파일 > 새로 만들기. . . > 파일. . .로 이동한 다음 XML 파일 형식을 선택합니다.


그림 10. 새 XML 파일 만들기

2단계: 코드 조각을 정의합니다. 흥미롭게도 코드 조각을 만들기 위한 코드 조각도 있습니다. 파일의 둘째 줄에서 Ctrl+KCtrl+X를 누르고 Snippet 코드 조각을 선택하면 코드 조각 파일의 템플릿이 자동으로 삽입됩니다.


그림 11. XML 코드 조각을 사용하여 다른 코드 조각 만들기(큰 이미지를 보려면 클릭하십시오.) 

제목, 만든 이, 바로 가기 및 설명 필드는 이름만으로도 쉽게 이해할 수 있으므로 자세히 설명하지 않겠습니다. <Snippet> 태그 내의 내용에 대해서는 설명이 필요한데, 아래 예제를 살펴보는 편이 가장 이해가 빠를 것입니다.

기본적으로 </Code> 태그 내에 있는 <![CDATA[...]]> 태그에 모든 코드를 삽입하게 됩니다. 사용자가 쉽게 필드를 바꿀 수 있도록 하려면 해당 필드를 "$" 문자 한 쌍으로 감싸면 됩니다. 아래의 예제에서는 코드 조각 사용자가 StrmReaderFilePathLine의 세 가지 리터럴을 쉽게 바꿀 수 있도록 했습니다. 이 세 가지 리터럴은 CDATA 섹션 내에서 "$" 문자 쌍과 함께 사용되었습니다. 또한 이 세 개의 리터럴은 <Declarations> 요소 내에 각각 정의해야 합니다. 각 리터럴에는 ID와 기본값(옵션)을 지정합니다.

예리한 독자는 코드 조각에 $end$라는 정의되지 않은 리터럴이 있다는 점을 알아차렸을 것입니다. 이 리터럴은 사용자가 코드 조각 필드를 모두 채운 후에 Enter 키를 눌렀을 때 커서의 위치를 지정하는 특수 리터럴입니다. 예제에는 나와 있지 않지만 $selected$라는 특수 리터럴도 있습니다. $selected$ 리터럴은 코드 조각이 SurroundsWith 유형인 경우에만 의미가 있으며 코드 감싸기...를 사용하여 이러한 유형의 코드 조각을 삽입했을 때 선택한 코드 조각이 들어갈 위치를 정의합니다.

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>File Processing</Title>
    <Author>James Lau</Author>
    <Shortcut>fp</Shortcut>
    <Description>Opens a file, does some processing, and then closes the file.</Description>
    <SnippetTypes>
      <SnippetType>SurroundsWith</SnippetType>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>StrmReader</ID>
        <Default>strmReader</Default>
      </Literal>
      <Literal>
        <ID>FilePath</ID>
        <Default>fPath</Default>
      </Literal>
      <Literal>
        <ID>Line</ID>
        <Default>strLine</Default>
      </Literal>
    </Declarations>
    <Code Language="CSharp">
      <![CDATA[         
   StreamReader $StrmReader$ = null;
   try
   {
      $StrmReader$ = new StreamReader($FilePath$);
      string $Line$;
      while (($Line$ = $StrmReader$.ReadLine()) != null)
      {
         // Perform some processing
         $selected$
         $end$
      }
   }
   catch (IOException ioex)
   {
      // Handle exception
   }
   finally
   {
      $StrmReader$.Close();
   }
    ]]>
    </Code>
  </Snippet>
</CodeSnippet>

코드 4. 샘플 코드 조각 내용


Visual Studio 시작 페이지 사용자 지정

Visual Studio 2005의 새로운 시작 페이지에는 MSDN 뉴스의 최신 정보를 제공하는 라이브 RSS 피드 외에 다른 기능도 포함되어 있습니다. 시작 페이지에서 다른 RSS 피드를 읽으려는 경우 도구를 선택하고 옵션. . ., 환경을 차례로 선택한 다음 시작 페이지를 선택하여 시작 페이지 뉴스 채널에서 URL을 편집하는 방법으로 RSS 뉴스 채널을 사용자 지정할 수 있습니다. Visual Studio를 실행할 때마다 자동으로 시작 페이지가 표시되지 않도록 하려면 같은 옵션 페이지의 시작 시에서 빈 환경 표시를 선택하여 이 동작을 변경하면 됩니다.


팀 설정

Visual Studio 2005에는 팀 설정이라는 잘 알려지지 않은 새로운 기능이 있습니다. 대부분의 개발자는 팀 환경에서 작업하는데, 이 경우 팀 설정 기능을 사용하면 보다 빠르게 팀 코딩 규칙을 적용하거나 Visual Studio를 설정할 수 있습니다.

팀 내에 코드 서식에 대한 기본 규칙 집합을 적용하려는 경우를 가정해 봅시다. 규칙을 지정하고 각 팀원이 해당 규칙에 맞게 IDE 옵션을 사용자 지정하도록 하는 대신 설정 파일을 만든 다음 팀원이 이 파일을 가리키도록 하면 간단히 해결됩니다. 팀 설정 파일이 업데이트되면 사용자가 다음 번 Visual Studio를 시작할 때 설정 파일이 자동으로 기존 설정을 덮어 씁니다. 이 기능을 활용하는 방법은 다음과 같습니다.

1단계: 설정 파일을 만듭니다. 팀 설정을 사용하여 원하는 모든 IDE 사용자 지정 내용을 적용할 수 있습니다. 개발자가 팀 설정 기능을 사용하는 가장 일반적인 설정은 코드 서식 지정 설정이겠지만 글꼴 및 색, SourceSafe 설정, 바로 가기 키, 메뉴 사용자 지정 등 내보낼 수 있는 모든 Visual Studio 설정에 이 기능을 사용할 수 있습니다. Visual Studio에서 원하는 설정을 사용자 지정한 다음 도구 > 설정 가져오기 및 내보내기. . .를 사용하여 알려진 위치로 내보내면 됩니다. 이때 다른 팀원과 공유하려는 설정 집합만 내보내는 것이 중요합니다.

2단계: UNC 경로에 설정 파일을 넣습니다. 팀원이 액세스할 수 있는 네트워크 경로에 1단계에서 내보낸 설정 파일을 복사합니다. 필자의 경우 \\jameslau\public\teamsettings.settings에서 팀 설정 파일을 공유했습니다.

3단계: 팀 설정 경로를 변경합니다. 팀원이 팀 설정 경로를 변경하여 팀 설정 파일을 가리키도록 합니다. 이 작업은 도구 > 옵션. . . > 환경 > 설정 가져오기 및 내보내기에서 수행할 수 있습니다. 팀 설정 파일 사용 확인란을 선택하고 팀 설정 파일의 경로를 지정하면 됩니다.


그림 12. 팀 설정 경로를 변경할 수 있는 옵션 대화 상자


/resetuserdata 스위치

필자가 소개할 마지막 팁은 /resetuserdata 스위치와 관련이 있습니다. 이 스위치는 Visual Studio가 복구할 수 없는 상태로 손상되었을 때 Visual Studio를 기본 상태로 재설정하는 데 사용됩니다. 이러한 문제의 예로는 창 레이아웃 파일 손상, 메뉴 사용자 지정 파일 손상 또는 바로 가기 키 파일 손상 등이 있습니다. 책임의 부인: 이 스위치를 사용하면 모든 환경 설정 및 사용자 지정이 손실됩니다. 따라서 이 스위치는 공식적으로 지원되지 않으며 Microsoft에서도 이 스위치를 공개적으로 알리지 않습니다. 즉, 명령 프롬프트에서 devenv.exe /?를 입력하더라도 이 스위치는 표시되지 않습니다. 이 스위치는 환경 문제가 발생한 경우 최후의 수단으로만 사용해야 하며, 스위치를 사용하는 경우 먼저 환경 설정을 내보내 백업해야 합니다.

이 스위치를 사용하려면 다음을 수행합니다.

  1. Visual Studio 2005의 인스턴스를 모두 종료합니다.
  2. 시작을 클릭하고 실행...을 선택합니다.
  3. "devenv.exe /resetuserdata"를 입력합니다.

이 명령을 사용하면 몇 분 동안 Visual Studio가 정리되고 처음 상태로 설정됩니다. 이때 작업 관리자를 열어 devenv.exe 프로세스가 실행 중인지 여부를 확인할 수 있습니다. 실행이 종료되면 Visual Studio를 다시 시작할 수 있습니다. 그러면 컴퓨터에서 Visual Studio를 처음으로 실행할 때처럼 처음 실행 대화 상자가 다시 표시됩니다.


결론

Microsoft는 Visual Studio에서 유용한 생산성 기능을 제공하기 위해 끊임없이 노력하고 있습니다. 여기에서 소개한 팁을 유용하게 사용하여 Visual Studio 고급 사용자가 될 수 있기를 바랍니다. Visual Studio IDE에 대한 의견이나 피드백 또는 제안 사항이 있는 경우 언제라도jameslau@microsoft.com으로 연락하시기 바랍니다.


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[mysql] mysql root암호를 잃어버린 경우



root 암호를 잊어버린 경우
- MySQL 데몬의 실행을 중지
- 권한에 대한 검사를 하지 않고 데몬을 실행 : safe_mysql -Sg &
- mysql을 사용하여 암호를 제거
- mysqladmin reload를 이용해서 변경된 권한을 적용하고, 데몬을 다시 수행 
암호의 저장
- 암호가 설정된 경우 모든 명령을 사용하기 위해서는 -p 옵션을 붙여야 하고, 암호를 입력하여야 함
- 암호 입력을 생략하려면 홈디렉토리에 .my.cnf 파일을 다음과 같이 만들어야 함. % cat > .my.cnf
[client]
password=암호
^D
% chmod 600 .my.cnf => 다른 사람이 보지 못하도록 파일 접근 권한을 설정
%

-----------------------------------------------------
다른 방법
-----------------------------------------------------
root 패스워드를 분실하셨을 경우에 


mysql을 하다가 실수로 root 패스워드를 분실하셨을 경우


# killall mysqld  

# safe_mysqld --skip-grant & 

# mysql 

mysql>UPDATE user SET password=PASSWORD('newpasswd') where user='root'; 

mysql> FLUSH PRIVILEGES 

위와 같이 하시면 다시 패스워드를 바꾸실수 있음


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[mysql] mysqldump 복구시 오류날때 처리



MySQL 복구 및 백업

 


백업 명령  mysqldump -u root -p aaa > aaa.sql 
복구 명령  mysql -u root -p aaa < aaa.sql

 

 

 

 

질문//

서버이전때문에 4.12버전의 디비데이터를 덤프시켜서 
3.23으로 복구할려는데 에러가 생겼어요 

에러 메시지는 아래와 같이 납니다. 
ERROR 1064 at line 11: You have an error in your SQL syntax near 'ENGINE=MyISAM DEFAULT CHARSET=latin1' 

하위 버전에서 복구할 방법은 없나요? 
덤프할때 --compatible=mysql323 옵션을 사용해봐도 옵션이 먹지가 않더라구요. 

이전할 서버에 mysql버전을 업그레이드하면 제일 간단하겠지만 그럴 치지도 못되어서 .. 
새버전 업그레이드 하는 것 말고는 방법이 없을까요?

 

 

답변//

 

shell> mysqldump --skip-opt --compatible=mysql323 DB명 > 파일.sql -p

 

제 경우는 mysqldump --create-options --compatible=mysql40 으로 잘되었습니다. 
mysqldump --create-options --compatible=mysql323 으로 될것 같습니다. 



mysql 4.1 버전부터는 mysqldump를 그냥 실행하면 utf-8 코드로 백업 받습니다.

- 따라서 mysqldump를 할때 --default-character-set=euckr 옵셥을 주면 euckr 코드로 덤프 받습니다. 
- 4.1버전의 경우 latin1 으로 기본세팅이 되므로 euckr 대신 latin1으로 해야할 수도 있습니다. 
- 인서트문이 한줄씩 나오지 않을때는 --extended-insert=FALSE 를 추가합니다.


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

익스트림 프로그래밍 (XP)의 '명암'(2) 
[출처 : 아이비즈투데이(ibiztoday.com) : 2002년 05월 03일] 
--------------------------------------------------------------------------------

XP가 몰고 온 또 다른 문화적 변화는 소프트웨어 코드의 어떤 부분도 소유하는 개발진은 한 사람도 없다는 점이다. 지식은 모든 엔지니어간에 공유되며 이 '단체 정신'이 코드 소유 욕구와 긍지를 대신한다. 

XP 기술팀은 매일 회동하고 수시로 프로젝트를 논의한다. 산타 클라라 카운티를 대신해 소프트웨어를 개발 중인 5인팀의 일부인 파브리니와 투세인트는 "협업이 더 좋은 코드를 만드는 데 유리하다"고 강조했다. 

미니애폴리스에 있는 카리브 레이크 소프트웨어 (Caribou Lake Software) 카운티팀 설계자인 테드 영 (Ted Young)은 "큐비클에 앉아 소프트웨어 코드를 쓰면 다른 사람이 하는 일은 일체 모르게 된다"며 "모든 사람이 모든 면을 알아야 더 좋은 제품을 만들 수 있다"고 지적했다. 

이 같이 두명이 짝이 되어하는 프로그래밍을 아주 어렵게 생각하는 이가 의외로 많다. 샌프란시스코에 있는 에반트 (Evant)의 에드워드 히트 (Edward Hiett) 프로그래머같은 XP의 열렬한 지지자도 다른 사람이 어깨 너머로 보는 가운데 프로그램을 작성하는 일은 당황스럽게 느낀다. 

에반트는 모든 프로그래머가 짝을 지어 작업하는 회사다. 그는 "프로그래밍은 아주 창조적인 일로 대단한 집중력이 필요한 작업이어서 혼자 떨어져 작업하는 게 자연스럽다"며 "짝을 지으면 통제는 포기해야만 한다"고 밝혔다. 

많은 여성들은 이 XP의 공동작업에 찬동하고 고맙게 여긴다. 

샌프란시스코의 프리랜서 개발자인 로라 웨이트 (Laura Waite)는 "XP가 여성이 싫어하는 일인 혼자서 큐비클에서 일하는 문제를 해결했다"며 "이 때문에 XP를 좋아하는 여성이 아주 많다"고 밝혔다. 

혼자 프로그래밍하는 것과 견줘 페어 프로그래밍이 더 생산적이고 집중력이 높아진다는 것은 이미 지배적인 견해다. 

버클리 인터스트리얼 로직 (Industrial Logic) XP 코치인 조수와 케리브스키 (Joshua Kerievsky)는 "XP 방식의 개발팀은 밤 늦게까지 일하거나 불가능한 일을 하면서 스스로 녹초가 되지 않게 된다"고 자평했다. 

XP는 고객을 현장에 두어 고객과 개발진간 단절을 없애기도 한다. 

카리브 레이크 소프트웨어의 산타 클라라 카운티 프로젝트를 위해서 현재 3명의 카운티 직원이 개발진과 협력하기 위해 파견돼 일하고 있다. 카운티 연락관인 자넬 자누쉬 (Janel Jannusch)는 끊임없는 업데이트가 신뢰를 굳히는 데 도움이 된다고 밝혔다. 

하지만 모든 고객이 반드시 누군가에게 시간을 전부 할애해주기를 원하는 것은 아니다. 

마운틴 뷰 (Mountain View)에 있는 알파블록스 (Alphablox) 줄리오 산토스 (Julio Santos) 개발진은 "온사이트 고객은 XP의 가장 약한 고리가 될 지 모른다"며 "우리는 전문가가 우리와 같이 앉아 있기를 원한다"고 밝혔다. 

XP는 현재 여러가지 난점을 극복하고 뿌리를 내려가고 있다. HP 애플리케이션스 개발부 책임자인 러셀 다니엘스 (Russell Daniels)는 "XP 방식을 이용해 소프트웨어를 개발하는 팀이 여럿 있다"며 "XP가 대부분 소프트웨어 개발진이 사용해온 관행을 통합시켰다"고 전했다. 

XP 지지자들은 XP가 더 좋은 코드를 생산할 뿐만 아니라 '하이테크광 자신을 재프로그램한다'고 입을 모은다. 샌프란시스코 에반트의 히트 프로그래머는 "XP 때문에 스스로 여러가지 면에서 변했다"며 "인내심을 기르고 의사 소통이 더 원활해지고 개방적이 됐다"고 털어놓았다. - (mark@ibiztoday.com) 

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

익스트림 프로그래밍 (XP)의 '명암'(1) 
[출처 : 아이비즈투데이(ibiztoday.com) : 2002년 05월 03일] 
--------------------------------------------------------------------------------

남자 두명이 노란색 포스트잇 (Post-it) 쪽지가 널려있는 회의실에서 랩탑 컴퓨터 스크린을 응시하고 있다. 

두 사람사이 대화는 키보드 소리를 사이에 두고 이어졌다. 

조 투세인트 (Joe Toussaint)가 파트너인 앤디 파브리니 (Andy Fabbrini)에게 불쑥 한마디했다. 

"그건 한 필요가 없어" 

"그래?" 

투세인트는 컴퓨터 스크린을 가리키며 "이 곳을 돋보이게만 해"라고 말했다. 

"그래 좋아" 

두 프로그래머는 소프트웨어 개발 혁명의 새 물결인 '익스트림 프로그래밍 (XP : Extreme Programming)'중이다. 

이처럼 혼자서 밤 늦게까지 큐비클 (칸막이 사무공간)에서 작업하는 방식 대신에 오전 9시에서 오후 5시까지 낮시간에 다른 프로그래머와 의견을 주고받으며 공동 협력해 고객의 요구에 가장 잘 맞는 소프트웨어를 만드는 방식이 익스트림 프로그래밍이다. 이 새 운동의 이름 익스트림 프로그래밍은 랩탑을 들고 번지 점프하는 하이테크 광의 이미지를 내포하는 것으로 그 혁신적 개념을 상징하는 말이다. 

XP 선두업체인 샌프란시스코 피보털 컴퓨터 시스템스 (Pivotal Computer Systems) 롭 미 (Rob Mee) 최고경영자 (CEO)는 "실리콘 밸리에서는 새벽 2시까지 큐비클에 처박혀 일하며 졸트 (Jolt) 콜라를 마시고 피자를 먹지 않으면 인정해주지 않는 문화가 존재한다"며 "XP는 이런 문화를 바꿔 프로그래머가 더 건전한 생활을 하고 사회성을 키우도록 만들어 준다"고 설명했다. 

새 소프트웨어 개발 방법의 핵심은 바로 두 사람이 함께 프로그래밍을 하는 '페어 프로그래밍 (pair programming)'이다. 소프트웨어 개발진은 컴퓨터 1대로 공동 작업하며 키보드를 당겼다 물렸다하면서 같이 쓴다. 페어 프로그래밍은 때로는 논쟁도 벌어지지만 협동 작업으로 생산성이 높아지고 더 좋은 소프트웨어를 만들 수 있다는 믿음을 그 바탕에 깔고 있다. 

페어 프로그래밍의 개념은 지난 99년 소프트웨어의 '락 스타'같은 존재인 켄트 베크 ( Kent Beck)의 저서 '익스트림 프로그래밍 해설 (Extreme Programming Explained)'에서 정립된 뒤 휴렛 팩커드 (HP : Hewlett-Packard)와 퀘스트 커뮤니케이션스 (Qwest Communications) 같은 대형 중견업체는 물론 신생업체간에 인기를 끌면서 도입되기 시작했다. 

현재 30개 이상의 웹사이트가 익스트림 프로그래밍을 지지하거나 반대하든 이를 취급하고 있고 베이 지역 XP (Bay Area XP) 등 관련 단체는 XP와 관련된 전자메일을 교환하고 오프라인에서 회의까지 열고 있다. 베이지역 (Bay Area - 샌프란시스코만 주변의 실리콘 밸리)에는 XP 방식을 이용하는 소프트웨어 엔지니어만도 수천명이나 되는 것으로 추산된다. 여기서 XP는 마이크로소프트 (Microsoft)의 윈도 (Windows) XP 운영체제와는 관련이 없다. 

XP가 미국 소프트웨어 개발진이 가장 많이 몰려있는 실리콘 밸리에 발판을 마련한다면 XP의 명성이 세계로 퍼져나가는데 도움이 될 것이다. XP 원칙은 세계 각국의 하이테크 센터에서 채택하고 있으나 아직 소프트웨어 개발방식의 주류로는 자리잡지 못한 상태다. 

지난 90년대 중반부터 베크와 함께 XP를 이용한 롭 미 피보털 컴퓨터 시스템스 CEO는 "실리콘 밸리는 프로그래밍 세계를 선도하고 있다"고 밝혔다. 

XP는 소프트웨어 암호를 더 융통성있게 만들기 위한 애자일 프로그래밍 (Agile Programming) 개발 방법 중 하나다. 

XP 지지자들은 XP가 적응성이 아주 뛰어난 것을 높이 평가한다. XP는 전통적인 소프트웨어 개발의 복잡하고 세련된 코드보다는 고객이 지시하는 단순성과 소프트웨어를 더 중시한다. 

XP는 비판하는 이들은 XP가 개발진이 만들 내용을 미리 문서화하지 않는 약식 소프트웨어 개발 방법이라고 이를 평가절하한다. 

XP 비판 사이트 운영자인 영국 소프트웨어 개발진 매트 스티븐스 (Matt Stephens)는 "선행 설계는 미리 생각하는 것과 같다"며 "XP는 소프트웨어 개발에서 아주 중요한 이 점을 무시해 스스로 근시안적 개발 방식으로 전락했다"고 비판했다. 

스티븐스와 일부 열렬한 XP 이용자마저 프로그래머가 항상 공동 작업을 하게 되면 생산성이 저해될 것이라고 본다. 

XP를 이용하는 샌프란시스코 카본 파이브 (Carbon Five) 아론 새런트 (Alon Salant)는 "특히 새로운 작업이 아니면 모든 일에 두명의 프로그래머가 필요하지 않다"며 "페어 프로그래밍은 가장 경험많은 프로그래머의 생산성은 줄이고 가장 경험이 적은 프로그래머의 생산성은 높인다"고 해석했다. - (mark@ibiztoday.com) 

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

그리스 문자 및 발음 표기




반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

[php] PHP 성능 튜닝 관련 글



며칠 전에 "PHP에서 성능 개선을 위한 팁"이라는 글을 읽고 몇 가지 테스트를 해보았다.
그러면서 몇가지 잘못 알려진 부분과 새로 알게된 사실이 있어서 공유하고자 글을 남긴다.

참고. 테스터 코드 소스는 제일 밑에 붙여놓았다.

테스트 환경은 다음과 같다.


PHP 5.1.2 (cli)
eAccelerator 0.9.5
Linux




1. 최대한 쌍따옴표 대신 일반따옴표를 사용하라고?


<?php
  function string1() {
       for ($i=0; $i<1000000; $i++)
           $str = "This is a message.";
  }
  function string2() {
       for ($i=0; $i<1000000; $i++)
           $str = 'This is a message.';
  }
?>

결과
:!php tester.php 1 string1
Elasped Time: TOTAL 347.93 msec, USR 347.95 msec (100.0%), SYS 0.00 msec (0.0%)

:!php tester.php 1 string2
Elasped Time: TOTAL 359.78 msec, USR 357.95 msec (99.5%), SYS 2.00 msec (0.6%)

위에서 보다시피 쌍따옴표와 일반따옴표는 속도 차이가 거의 없다.
그래서 이번에는 문자열 사이에 변수가 들어가는 경우를 테스트 해보았다.


<?php
  function string5() {
       $title = 'message';

       for ($i=0; $i<1000000; $i++)
           $str = "This is a {$title}.";
  }

  function string6() {
       $title = 'message';

       for ($i=0; $i<1000000; $i++)
           $str = "This is a ".$title.".";
  }

  function string7() {
       $title = 'message';

       for ($i=0; $i<1000000; $i++)
           $str = 'This is a '.$title.'.';
?>

결과
:!php tester.php 1 string5
Elasped Time: TOTAL 1,756.88 msec, USR 1,755.73 msec (99.9%), SYS 0.00 msec (0.0%)

:!php tester.php 1 string6
Elasped Time: TOTAL 649.77 msec, USR 648.90 msec (99.9%), SYS 0.00 msec (0.0%)

:!php tester.php 1 string7
Elasped Time: TOTAL 634.70 msec, USR 634.90 msec (100.0%), SYS 0.00 msec (0.0%)

"...{$var}..." 형식을 쓴 string5() 함수가 시간이 상당히 많이 걸린 것을 볼 수 있었다.
하지만, 그것은 쌍따옴표 안에서 {} 를 이용하여 변수를 넣었을 때에 해당되는 것이고,
string6() 과 string7() 에서 보듯이 쌍따옴표와 일반따옴표의 차이는 없었다.
결국, 성능은 쌍따옴표를 쓰냐 안 쓰냐가 아니라 문자열 중간에 변수를 어떻게 처리하는지에 문제인 것이다.

오히려 일반따옴표에서는 \n 처리가 애매하기 때문에 대신 PHP_EOL 을 사용했었는데,
"\n" 와 PHP_EOL 의 속도를 비교해보면 "\n" 가 더 빨랐다.



2. 레퍼런스 파라미터의 함정

PHP5 에서부터는 객체를 함수의 파라미터로 전달할 때 인스턴스의 주소를 넘기도록 수정되었다.(PHP4 에서는 객체를 복사해서 넘김) 하지만, 배열은 PHP4 와 마찬가지로 복사해서 넘긴다.
그럼 다음의 코드 중에 어떤 코드가 더 빠를 것이라고 생각하는가?

<?php
  function ref1() {
       $arr = array_pad(array(), 1000, 1);
       for ($i=0; $i<5000; $i++)
           $cnt = ref1_count($arr);
  }

  function ref1_count(&$arr) {
       return count($arr);
  }

  function ref2() {
       $arr = array_pad(array(), 1000, 1);
       for ($i=0; $i<5000; $i++)
           $cnt = ref2_count($arr);
  }

  function ref2_count($arr) {
       return count($arr);
  }
?>

결과
:!php tester.php 1 ref1
Elasped Time: TOTAL 920.32 msec, USR 918.86 msec (99.8%), SYS 0.00 msec (0.0%)

:!php tester.php 1 ref2
Elasped Time: TOTAL 8.45 msec, USR 8.00 msec (94.7%), SYS 1.00 msec (11.8%)

ref1() 함수에서는 $arr 변수를 레퍼런스로 넘기고, ref2() 함수에서는 $arr 변수를 VALUE로 넘긴다.
ref2() 에서는 VALUE 로 전달하기 때문에 ref2() 가 시간이 더 걸릴 것 같지만 실제로는 반대로 ref1() 함수가 훨씬 더 많은 시간이 걸린다.

그 원인을 분석하기 위하여 추가로 다음과 같은 테스트를 더 해보았다.


<?php
  function ref3() {
       global $arr2;

       for ($i=0; $i<5000; $i++)
           $cnt = ref2_count($arr2);
  }

  function ref4() {
       $arr =& $GLOBALS['arr2'];

       for ($i=0; $i<5000; $i++)
           $cnt = ref2_count($arr);
  }
?>

결과
:!php tester.php 1 ref3
Elasped Time: TOTAL 1,013.52 msec, USR 1,012.85 msec (99.9%), SYS 1.00 msec (0.1%)

:!php tester.php 1 ref4
Elasped Time: TOTAL 964.66 msec, USR 964.85 msec (100.0%), SYS 0.00 msec (0.0%)

이번에는 ref2() 함수에서 사용한 ref2_count() 를 사용했음에도 불구하고 ref3() 와 ref4() 는 ref1() 결과와 거의 유사하다. ref1() 과 ref3(), ref4() 의 공통점은 모두 넘기는 변수인 $arr과 $arr2 가 레퍼런스로 전달한다는 것이다.

그럼 이런 차이가 생기는가? 이는 PHP Zend 엔진을 이해해야 한다. ref2() 에서 $arr 를 ref2_count() 함수에 VALUE 로 전달하나 실제 변수의 복사가 이루어지는 시점은 그 변수를 수정할 때이다. 다시 말해, PHP Zend 엔진에서는 VALUE 로 값을 전달받았다고 하더라도 굳이 복사가 필요없는 경우(함수 내부에서 파라미터를 수정하지 않는 경우)에는 값을 복사하지 않는다. 대신 파라미터 값이 바뀌는 시점에 복사를 시작하게 된다.

하지만, 레퍼런스 변수를 다시 다른 함수에 전달하게 되면 값의 수정이 필요하든 없든 상관없이 그 순간에 복사가 이루어진다. 위의 코드에서는 "count($arr)" 부분에서 복사가 이루어지게 된다. 위에서 ref_countX() 함수들은 단순히 변수값을 참조하기만 하기 때문에 복사가 필요없지만 쓸데없이 복사가 이루어지느라 많은 시간이 걸리게 되는 것이다.

결론. 레퍼런스 파라미터는 함수내에서 수정이 필요한 경우에만 사용하는 것이 좋다.




3. 비교문의 성능과 올바른 습관

이번에는 IF 문에서 문자열 비교 구문을 테스트 해보았다.


<?php
  function ifstring1() {
       $a = "abcd";

       for ($i=0; $i<1000000; $i++)
           if (!$a);
  }

  function ifstring2() {
       $a = "abcd";

       for ($i=0; $i<1000000; $i++)
           if ($a === "");
  }

  function ifstring3() {
       $a = "abcd";

       for ($i=0; $i<1000000; $i++)
           if ($a == "");
  }

  function ifstring4() {
       $a = "abcd";

       for ($i=0; $i<1000000; $i++)
           if (strlen($a) <= 0);
  }
?>

결과
:!php tester.php 1 ifstring1
Elasped Time: TOTAL 242.82 msec, USR 242.96 msec (100.1%), SYS 0.00 msec (0.0%)

:!php tester.php 1 ifstring2
Elasped Time: TOTAL 240.84 msec, USR 240.96 msec (100.1%), SYS 0.00 msec (0.0%)

:!php tester.php 1 ifstring3
Elasped Time: TOTAL 425.76 msec, USR 422.94 msec (99.3%), SYS 0.00 msec (0.0%)

:!php tester.php 1 ifstring4
Elasped Time: TOTAL 610.61 msec, USR 610.91 msec (100.0%), SYS 0.00 msec (0.0%)

ifstring4() 의 경우에는 함수에 대한 시간 손실 때문에 제일 많은 시간이 걸렸다.
ifstring3() 의 경우에는 변수 Type Conversion 때문에 시간 손실이 발생한다.
성능상 제일 좋은 방법은 ifstring1() 과 ifstring2() 의 경우이다.

여기서 내가 추천하는 방법은 ifstring2() 이다. ifstring1() 의 경우에는 다음과 같은 경우가 버그가 생길 수 있다.

<?php
  $a = "0";
  if ($a) echo "Success"; else "Failed";
?>
위의 코드에서 어떤 값이 출력될 것 같은가? 정답은 "Failed" 이다. $a 가 자동으로 integer 로 변환되고, 숫자 0 이 자동으로 FALSE 로 변환되기 때문이다.

결론. 가능한한 "===" 연산자를 사용하여 비교하는 것이 좋다.



4. switch 와 if

가끔 switch 와 if 중에 뭘 쓸까 고민할 때가 있다. 예전에 PHP.net 에서 switch 가 더 빠르다는 글을 읽고 지금까지 주로 switch 를 사용했는데 이번에 테스트해보았다.


<?php
  function switch1() {
       $a = "delete";

       for ($i=0; $i<1000000; $i++) {
           switch ($a) {
               case "insert":
                   break;
               case "update":
                   break;
               case "delete":
                   break;
               case "select":
                   break;
               default:
                   break;
           }
       }
  }

  function switch2() {
       $a = "delete";

       for ($i=0; $i<1000000; $i++) {
           if ($a === "insert") {
           }
           else if ($a === "update") {
           }
           else if ($a === "delete") {
           }
           else if ($a === "select") {
           }
           else {
           }
       }
  }
?>

결과
:!php tester.php 1 switch1
Elasped Time: TOTAL 975.25 msec, USR 970.85 msec (99.5%), SYS 0.00 msec (0.0%)

:!php tester.php 1 switch2
Elasped Time: TOTAL 547.84 msec, USR 544.92 msec (99.5%), SYS 0.00 msec (0.0%)

이 결과는 IF 문에서 "==" 을 사용할 것인가 "===" 사용할 것인가와 같은 문제이다. switch 에서는 기본적으로 "==" 을 사용하는 것으로 보인다. 따라서 위와 같은 결과가 나왔다.

결론. switch 와 if 문 중에서는 if 문이 더 좋다. 단, === 연산자를 사용한다는 전제하에...



5. 테스터 코드

<?php
  require_once "func.inc.php";

  if (isset($_SERVER['argv'][1]))
       $try = $_SERVER['argv'][1];
  else
       $try = 1;

  if (isset($_SERVER['argv'][2]))
       $funcname = $_SERVER['argv'][2];
  else
       exit;

  init();

  for ($n=0; $n<$try; $n++) {
       $dblTotTime1  = microtime(TRUE);
       $dictResUsage = getrusage();
       $dblUsrTime1  = $dictResUsage['ru_utime.tv_sec'] + $dictResUsage['ru_utime.tv_usec'] / 1000000;
       $dblSysTime1  = $dictResUsage['ru_stime.tv_sec'] + $dictResUsage['ru_stime.tv_usec'] / 1000000;

       $funcname();

       $dblTotTime2  = microtime(TRUE);
       $dictResUsage = getrusage();
       $dblUsrTime2  = $dictResUsage['ru_utime.tv_sec'] + $dictResUsage['ru_utime.tv_usec'] / 1000000;
       $dblSysTime2  = $dictResUsage['ru_stime.tv_sec'] + $dictResUsage['ru_stime.tv_usec'] / 1000000;

       $dblTotTime   = $dblTotTime2 - $dblTotTime1;
       $dblUsrTime   = $dblUsrTime2 - $dblUsrTime1;
       $dblSysTime   = $dblSysTime2 - $dblSysTime1;

       $strTotTime   = number_format($dblTotTime * 1000, 2);
       $strUsrTime   = number_format($dblUsrTime * 1000, 2);
       $strSysTime   = number_format($dblSysTime * 1000, 2);

       $strUsrPer    = number_format(($dblUsrTime / $dblTotTime) * 100, 1);
       $strSysPer    = number_format(($dblSysTime / $dblTotTime) * 100, 1);

       echo 'Elasped Time: TOTAL '.$strTotTime.' msec, USR '.$strUsrTime.' msec ('.$strUsrPer.'%), SYS '.$strSysTime.' msec ('.$strSysPer.'%)'.PHP_EOL;
  }
?>




http://teeroz.egloos.com/2703307


반응형

'IT-개발,DB' 카테고리의 다른 글

익스트림 프로그래밍 (XP)의 '명암'(1)  (0) 2016.10.27
그리스 문자 및 발음 표기  (0) 2016.10.24
[php] PHP 성능 튜닝 관련 글  (0) 2016.10.08
[PHP]] 연산자  (0) 2016.10.05
[javascript] 금액에 콤마붙이기  (0) 2016.10.03
SOA란 무엇인가  (0) 2016.10.03
Posted by 사용자 SB패밀리

댓글을 달아 주세요