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

[기사] 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패밀리

2016년도 적용 SW기술자 평균임금 공표

출처: 한국소프트웨어산업협회(KOSA)






Posted by SB패밀리

영상처리용 이미지 레나 (1084 x 2318 x 24b)



영상처리 자료 영상으로 많이 사용됨.

나 또한 영상처리, 영상 저작권 관련 데이터 이미지로 사용했었음.


원래 직업이 창녀였다고함.

어쩌다 이렇게 유명해졌는지...


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패밀리

[링크] 볼랜드 관련 정보나 자료 링크 모음



제다이 JEDI
http://www.delphi-jedi.org



About.com 델파이
http://delphi.about.com



닥터밥 : 델파이, C++빌더, Kylix, C#Builder, Delphi for .NET
http://www.drbob42.com



소스포지 : 오픈소스 개발 웹사이트
http://www.sourceforge.net



코드기어 : 델파이,C++빌더,C#빌더,InterBase,JBuilder,Turbo,PHP
http://www.codegear.com/

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패밀리

201가지 소프트웨어 개발원칙



201가지 소프트웨어 개발원칙


일반원칙
1. 품질이 제일이다.
2. 품질의 정의는 보는 사람에 따라 다르다,
3. 생산성과 품질은 불가분의 관계이다.
4. 고품질의 소프트웨어를 개발할 수 있다.
5. 사후에 품질을 만들어 넣으려 하지 말라.
6. 성능보다 신뢰성이 더 중요하다.
7. 시제품을 고객에게 빨리 보여준다.
8. 고객이나 사용자와 충분히 협의한다.
9. 개발자와 고객에게 적합한 보상기준을 마련한다.
10. 처음 시도하는 것은 폐기할 작정으로 개발한다.
11. 적절한 유형의 시제품을 개발한다.
12. 적절한 기능을 시제품화 한다.
13. 일회용 시제품은 빨리 개발한다.
14. 시스템을 점증적으로 개발한다.
15. 보면 볼수록 더 많은 것을 원한다.
16. 개발중의 변경은 피할 수 없다.
17. 가능하면 개발하기 보다는 구매한다.
18. 사용자 매뉴얼이 간단하게 되도록 소프트웨어를 개발한다.
19. 아무리 복잡한 문제라도 해결책은 있다.
20. 가정한 것이 있으면 이를 기록한다.
21. 다른 단계에는 다른 언어를 사용한다.
22. 도구를 사용하기 전에 기법을 배운다.
23. 도구는 현실적으로 사용한다.
24. 소프트웨어 도구는 우수한 개발자에게만 제공한다.
25. CASE도구는 고가이다.
26. "Know-How"만큼 "Know-When"도 중요하다.
27. 목적을 달성하면 중단한다.
28. 정형적 방법을 알아야 한다.
29. 조직의 평판을 중시한다.
30. 대세를 따를 때는 주의해야 한다.
31. 기술을 무시하면 안된다.
32. 문서 표준을 사용한다.
33. 모든 문서에는 용어정의를 한다.
34. 모든 문서에는 색인을 부여한다.
35. 같은 개념에는 같은 명칭을 사용한다.
36. 연구결과의 기술이전은 즉시 되지 않는다.
37. 책임을 질 줄 알아야 한다.

요구공학 원칙
38. 요구사항이 불명확할수록 비용예측은 어렵다.
39. 요구사항을 기록하기 전에 문제를 확실하게 결정한다.
40. 지금 요구사항을 결정한다.
41. 요구명세상의 오류는 즉시 수정해야 한다.
42. 시제품으로 사용자 인터페이스 선정의 위험을 줄인다.
43. 요구사항 항목의 선정근거를 기록한다.
44. 최소 요구사항을 식별한다.
45. 요구사항을 검토한다.
46. 요구분석단계에서 설계하지 않는다.
47. 올바른 기법을 사용한다.
48. 여러 관점으로 요구사항을 분석한다.
49. 요구사항을 현명하게 조직화한다.
50. 요구사항의 우선순위를 정한다.
51. 간결하게 기록한다.
52. 모든 요구사항에 유일한 식별번호를 부여한다.
53. 요구사항의 모호성을 줄인다.
54. 자연어는 정형모델로 보완만 하고 대체하지는 말라.
55. 먼저 자연어로 기록하고 정형모델을 작성하라.
56. 요구명세서는 읽기 쉬워야 한다.
57. 신뢰성에 대하여 구체적으로 명시한다.
58. "수용 불가능한" 환경조건을 명시한다.
59. 미결정항목은 각주와 함께 작성한다.
60. 요구명세서를 데이터베이스에 저장한다.

설계 원칙
61. 요구사항에서 설계로의 전환은 어렵다.
62. 설계산출물에서 요구사항을 추적한다.
63. 대안을 평가한다.
64. 문서가 없는 설계는 설계가 아니다.
65. 캡슐화 한다.
66. 가능하면 재사용한다.
67. 단순하게 개발한다.
68. 특수한 경우를 많이 만들지 않는다.
69. 지적인 거리를 최소화 한다.
70. 설계를 지적 통제하에 둔다.
71. 개념적 무결성을 유지한다.
72. 개념적 오류는 문법적 오류보다 심각하다.
73. 결합도는 낮추고 응집도는 높인다.
74. 변경이 쉽게 설계한다.
75. 유지보수를 고려하여 설계한다.
76. 오류수정이 쉽게 설계한다.
77. 일반성을 띄게 소프트웨어를 개발한다.
78. 유연성 있게 소프트웨어를 개발한다.
79. 효율적인 알고리즘을 사용한다.
80. 사용자가 필요로 하는 모든 정보는 모듈명세서에 있다.
81. 설계는 다차원적이다.
82. 뛰어난 설계는 뛰어난 설계자가 한다.
83. 어플리케이션에 대해서 숙지한다.
84. 큰 투자 없이도 재사용할 수 있다.
85. 무효한 값을 입력하면 적절한 오류 메세지를 출력하도록 한다.
86. 소프트웨어 신뢰성은 중복성을 통해 얻을 수 있다.

코딩원칙
87. 트릭을 사용하지 않는다.
88. 광역변수를 사용하지 않는다.
89. 하향식으로 읽을 수 있도록 작성한다.
90. 부작용을 제거한다.
91. 의미 있는 명칭을 사용한다.
92. 사람을 위한 프로그램을 작성한다.
93. 최적의 자료구조를 사용한다.
94. 빨리 하기 보다는 올바르게 한다.
95. 코드를 완성하기 전에 주석을 작성한다.
96. 코딩을 시작하기 전에 문서화한다.
97. 모든 구성요소를 책상 위에서 실행시켜 본다.
98. 코드 검사를 실시한다.
99. 비구조적 언어도 사용할 수 있다.
100. 구조화된 코드가 반드시 좋은 코드는 아니다.
101. 너무 깊이 중첩 시키지 않는다.
102. 적절한 언어를 사용한다.
103. 프로그래밍 언어를 핑계 삼아서는 안된다.
104. 언어에 대한 지식은 중요하지 않다.
105. 프로그램의 체계를 정비한다.
106. 코딩을 너무 빨리 시작하지 말아라.

시험원칙
107. 시험에서 요구사항을 추적한다.
108. 시험하기 훨씬 이전에 시험을 계획한다.
109. 자신이 개발한 소프트웨어를 자신이 시험하지 않는다.
110. 자신이 개발한 소프트웨어의 시험계획은 남이 세운다.
111. 시험은 결함을 드러나게 할 뿐이다.
112. 오류의 많고 적음과 소프트웨어의 가치는 무관하다.
113. 오류를 찾아야 성공적인 시험이다.
114. 15% 모듈에서 50%의 오류가 발견된다.
115. 블랙박스시험과 화이트박스시험을 실시한다.
116. 시험사례에는 예상결과를 포함시킨다.
117. 무효한 값으로 시험한다.
118. 항상 스트레스 시험을 한다.
119. 빅뱅설을 적용하면 안된다.
120. McCabe의 복잡도 척도를 사용한다.
121. 효과적인 시험종료 척도를 사용한다.
122. 시험 적용범위를 효과적으로 활용한다.
123. 단위시험이 끝나기 전에 통합하지 않는다.
124. 소프트웨어에 특정한 시험용 코드를 내장시킨다.
125. 오류의 원인을 분석한다.
126. 오류를 개인적인 차원으로 생각하지 않는다.

관리원칙
127. 뛰어난 관리는 뛰어난 기술보다 중요하다.
128. 적절한 해결책을 이용한다.
129. 읽은 것을 모두 믿지 않는다.
130. 고객의 우선순위를 알아야 한다.
131. 사람이 성공의 열쇠이다.
132. 많은 사람보다는 소수정예요원이 더 낫다.
133. 부하 직원의 말을 경청한다.
134. 부하 직원을 신뢰해야 한다.
135. 항상 기대치를 높이 가진다.
136. 능숙한 의사소통 기술은 필수적이다.
137. 진심으로 부하직원을 위해준다.
138. 사람은 의외의 것으로 동기부여 받는다.
139. 사무실 분위기를 조용히 유지한다.
140. 인력과 시간은 대체할 수 없다.
141. 소프트웨어 개발자의 능력차이는 크다.
142. 원하는 목표로 최적화 할 수 있다.
143. 자료수집을 강요하면 안된다.
144. 코드 1줄 당 비용은 무시한다.
145. 완벽한 생산성 측정방법은 없다.
146. 비용산정 모델을 조정한다.
147. 일정은 현실적으로 계획한다.
148. 불가능한 것은 피한다.
149. 측정하기 전에 무엇을 측정할 지 알아야 한다.
150. 생산성 자료를 수집한다.
151. 팀의 생산성을 잊지 않는다.
152. 인월 당 행수(LOC/PM)은 언어와 관계없다.
153. 일정을 믿는다.
154. 정확하게 산정한 비용견적이라도 완전히 맞지는 않는다.
155. 일정을 정기적으로 재조정한다.
156. 약간 적은 견적을 항상 나쁘다고 할 수는 없다.
157. 자원을 적절히 할당한다.
158. 프로젝트를 치밀하게 계획한다.
159. 계획을 최신 버전으로 유지한다.
160. 잦은 계획변경의 파급효과에 주의한다.
161. 최상위 10개의 위험항목을 알아야 한다.
162. 직면한 위험을 이해한다.
163. 적절한 프로세스 모델을 사용한다.
164. 방법론이 당신을 구해주지는 못한다.
165. 기적적인 생산성 향상 비법은 없다.
166. 진척도의 의미를 정확히 알아야 한다.
167. 계획과의 차이만 관리한다.
168. 하드웨어에 과중한 부하를 주지 않는다.
169. 하드웨어의 발전에는 낙천적으로 대응한다.
170. 소프트웨어의 발전에는 비관적으로 대응한다.
171. 예상치 못한 사고로 인해 대혼란이 자주 초래된다.
172. 프로젝트의 사후 검토회를 실시한다.

제품보증 원칙
173. 제품보증 수준은 프로젝트에 맞게 조정한다.
174. 형상관리 절차를 조기에 확립한다.
175. 소프트웨어 프로세스에 SCM을 적용한다.
176. SCM은 프로젝트 관리에 독립적으로 조직화한다.
177. 개발과 제품보증업무 사이를 순환보직화 한다.
178. 모든 중간산출물에 명칭과 버전 번호를 부여한다.
179. 기준선을 통제한다.
180. 모든 것을 보존한다.
181. 모든 변경을 계속 추적한다.
182. 변경관리를 해야 한다.
183. 변경요청에 우선순위를 부여하고 일정계획을 세운다.
184. 대규모 개발에는 검증과 확인(V&V)을 적용한다.

진화원칙
185. 소프트웨어는 계속 변화한다.
186. 소프트웨어의 엔트로피는 증가한다.
187. 고장나지 않았으면 고치지 않는다.
188. 증상이 아닌 근본적인 문제를 수정한다.
189. 요구사항을 먼저 변경한다.
190. 릴리즈 전의 오류는 릴리즈 후의 오류의 원인이 된다.
191. 프로그램은 오래되면 될수록 유지보수하기 어려워진다.
192. 언어는 유지보수성에 영향을 미친다.
193. 때로는 처음부터 수정하는 방법이 좋다.
194. 최악의 구성요소는 처음부터 다시 개발한다.
195. 유지보수는 개발보다 많은 오류를 발생시킨다.
196. 변경한 후에는 반드시 회기 시험을 실시한다.
197. 변경사항이 간단하다고 방심하면 잘못 변경하게 된다.
198. 비구조적인 코드는 구조화해도 개선되지 않는다.
199. 최적화하기 전에 프로파일러를 사용한다.
200. 시스템에 친밀감을 갖는다.
201. 시스템은 환경변화에 따라 계속 변화한다.


출처 : '201가지 소프트웨어 개발원칙' 목차


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패밀리

[delphi] 캡션없는 폼 드래그로 이동하기



폼의 캡션을 사용하지 않거나 캡션이 없는 폼을 이동하는 방법입니다.

폼에 WMNCHitTest 윈도우 메시지 핸들러를 오버라이딩 해서 처리합니다.


TForm1 = class(TForm)
  ...
  procedure WMNCHitTest( Var M: TWMNCHitTest );
      message WM_NCHITTEST;
...
end;

implementation
...
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin

  inherited;                    // call the inherited message handler
  if  M.Result = htClient then  // is the click in the client area?
  M.Result := htcaption;      // if so, make Windows think it's
                              // on the caption bar.
end;


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


Posted by SB패밀리

[PHP]] 연산자

IT - 개발 2016.10.05 03:40

[PHP]] 연산자



PHP에서도 C언어에서 사용하는 연산자와 유사한 형식의 연산자들을 사용할수 있다. 

산술 연산자,문자열 연산자,대입 연산자, 비트 연산자, 논리 연산자, 비교 연산자 



♣사술 연산자♣



$a + $b 덧셈(Addition) $a - $b 뺄셈(Subtraction) $a * $b 곱셈(Multiplication) $a / $b 나눗셈(Division) $a % $b 나머지(Modulus) 



♣문자열 연산자♣ 



문자열 연산은 '.'마침표 하나 만있다 문자열 연산은 문자열과 문자열을 연결해줍니다. 

$a = "안녕하세요 "; $b = $a."방갑습니다."; $b의 값은 '안녕하세요 방갑습니다.'가 됩니다. 



♣대입 연산자♣



대입 연산자는 '='입니다. 

이 연사자는 "같다"라는 의미가 아닌 오른쪽의 표현식을 계산하여 그 값을 왼쪽에 있는 피연산자의 값으로 설정한다는 의미입니다. 

연산자의 값의 왼쪽으로 대입된 값입니다. 

$a=($b=4)+5; //$a값은 9 $b의 값은 4가 됩니다. 

위의 표현은 아래의 표현을 줄인 형태 입니다. 

$b = 4; $a = $b + 5; 



♣비트 연산자♣



비트 단위 연산자는 정수의 개별 비트의 값을 on,off할 수 있습니다. 

$a & $b AND -> $a와 $b가 보두 1인 비트만 1이 됩니다. 

$a | $b Or -> $a와 $b 중 하나라도 1인 비트만 1이 됩니다. 

$a ^ $b Xor -> $a와 $b 중 하나는 1이고, 다른 하나는 0인비트만 1이 되고, 나머지는 0이됩니다. 

~ $a Not -> $a에서 1인 비트는 0으로, 0인 비트는 1로 됩니다. 

$a << $b shift Left ->a 의 비트들을 $b step만큼 왼쪽으로 shift합니. 

(한 step은 2를 한번 곱하는 만큼의 효과가 있습니다.) 

$a >> $b Shift right ->$a의 비트들을 $b step만큼 오른쪽으로 shift합니다.

(한 step은 2를 한번 나누는 만큼의 효과가 있습니다.) 



♣논리연산자♣ 



$a And $b AND -> $a와 $b가 모두 true이면 true $a Or $b Or -> $a와 $b 중 하나라도 true이면 true $a Xor $b Xor -> $a와 $b 중 하나만 true이어야 true ! $a Not -> $a가 true 가 아니면 true $a && $b AND -> $a와 $b가 모두 true이면 true $a || $b Or -> $a와 $b 중 하나라도 true이면 true. 'and'와'or'연산자가 두 가지의 다른 현태를 가지고 있는 이유는 이 연산자들이 서로 다른 우선 순위를 가지고 있기 때문입니다. 



♣비교 연산자♣ 



$a == $b 같다 $a != $b 다르다 $a < $b 보다 작다. $a > $b 보다 크다. $a <= $b 작거나 같다. $a >= $b 크거나 같다. 



♣조건연산자♣ 



C언어의 비교 연산자와 빗스한 '?:'연산자가 있습니. 

이 연산자를 사용하면 if 조건문을 간략하게 표현할 수 있습니다. 

형식 - (조건) ? (처리1):(처리2) 설명 - 조건의 결과가 참이면 처리1을 반환하고 거짓이면 처리2를 반환합니다. 

$a=4; $b=7; echo ($a > $b) ? "$a값이 $b값 보다 크다.":"$a은 $b값 보다 작다."; 결과 값은 "$a값이 $b값 보다 작다."입니다.


Posted by SB패밀리