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

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

[javascript] 금액에 콤마붙이기



//금액에 콤마 붙이기
function setComma(v) {
var rV="";//리턴할 값
var vS=new String(v), leng=vS.length;

var remnant = leng%3;
if(remnant==0) remnant=3;

while( leng>3 ) {
  rV += vS.substr(0,remnant)+",";
  vS = vS.substr(remnant);

  leng = vS.length;
  remnant=3;
}
rV += vS;

return rV;
}


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

[php] PHP 성능 튜닝 관련 글  (0) 2016.10.08
[PHP]] 연산자  (0) 2016.10.05
[javascript] 금액에 콤마붙이기  (0) 2016.10.03
[Delphi] 작업관리자에 내 프로세서 감추기  (0) 2016.10.03
SOA란 무엇인가  (0) 2016.10.03
[하드웨어] 메모리 용량 단위  (0) 2016.10.01
Posted by SB패밀리

[Delphi] 작업관리자에 내 프로세서 감추기


출처: 델마당 - 질문과 답변 
[답변] 작업관리자에 내 프로세써 감추기 (델파이5 프로 구함)  
98 시절 여러 해킹 프로그램이 이 함수를 이용하여 나쁜짓을 했었는데,
2000 이상급에서는 없어진줄로 압니다.

아마 보안 땜시...


뷰티 wrote:
> 98 에서는 다음과 같이 RegisterServiceProcess 를 호출해서 프로세스를 숨길수 
> 있습니다, 그런데 이 함수가 win2000 에서는 동작이 안되고 '시작점을 찾을 수 없다는'
> 에러가 나옵니다

> function RegisterServiceProcess(dwProcessID, dwType: Integer): 
> Integer; stdcall; external 'KERNEL32.DLL';

> Fvalue := False;
> IF Fvalue then  
>    RegisterServiceProcess(GetCurrentProcessID, 1);


> 혹시 Windows 9x/nt/xp 에서 사용이 가능한가요?

> 검색하다보니 

> 민성기님이 답글 달아 놓은 링크가 있었는데

> 너무 오래되서 그런지... File not Found -_-



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

[PHP]] 연산자  (0) 2016.10.05
[javascript] 금액에 콤마붙이기  (0) 2016.10.03
[Delphi] 작업관리자에 내 프로세서 감추기  (0) 2016.10.03
SOA란 무엇인가  (0) 2016.10.03
[하드웨어] 메모리 용량 단위  (0) 2016.10.01
[php] getdate() 함수  (0) 2016.09.22
Posted by SB패밀리

SOA란 무엇인가

IT - 개발 2016.10.03 13:56

SOA란 무엇인가


도대체 SOA란 무엇인가? 

SOA는 서비스들이 중심인데, 여기서 서비스란 비즈니스 프로세스(예를 들면, 신용카드 거래를 인증하거나 구매 주문을 처리하는 일)를 수행하는 일련의 소프트웨어 컴포넌트들을 말한다. 가장 단순한 형태의 SOA는 네트웍 상에서 서로 통신을 하는 일련의 서비스들을 들 수 있다. 그 서비스들은 느슨하게 연결되어 있고(다시 말해 한 애플리케이션이 다른 애플리케이션과 대화하기 위해 그 애플리케이션의 기술적 세부사항을 알 필요는 없다는 의미), 잘 정의된 플랫폼 독립적 인터페이스들을 갖고 있으며, 재사용이 가능하다. SOA는 애플리케이션 개발 과정에서 더 높은 층을 의미하며[굵은 입도(coarse granularity)로도 불림], 비즈니스 프로세스에 초점을 맞추고 표준 인터페이스를 사용함으로써, IT 환경이 가진 근본적인 기술적 복잡성을 덮어준다. 이것은 고등학교 과학 교과서를 유치원 아이들에 맞게 번역하는 것과 같다. 다시 말해 심장의 승모판과 폐정맥을 다루지 않고도 심장이 피를 보내는 일에 대해 아이들에게 설명할 수 있는 것과 같다.



SOA는 코바에 새 옷을 입힌 것이 아닌가?

아니다. SOA는 기존의 밀접하게 결합된 애플리케이션 연결[코바(Corba: common object request broker architecture)]에서 느슨하게 결합된 애플리케이션 연결[웹서비스(Web services) 같은 것]로 진화한 것이다. 밀결합될 경우, 애플리케이션들은 변화하는 비즈니스 요구에 적응하기가 힘들어지는데, 하나의 애플리케이션을 손보면 이 애플리케이션에 결합된 다른 애플리케이션들도 모두 손봐야만 하기 때문이다. 또한 코바 같은 객체 중심(object-oriented) 개발방식은 가는 입도(finer level of granularity)를 사용하기 때문에, 객체들은 직원이나 고객 주문 수준에서 정의될 필요가 있다. 반면 SOA의 경우, 서비스는 더 추상적인 수준(예를 들면, 전화고지서를 찍어내는 등의 비즈니스 프로세스 수준)에서 정의된다.



SOA 용어정리 

엔터프라이즈 서비스 버스(Enterprise service bus): 소프트웨어 인프라로, 표준 인터페이스와 메시징을 사용해 애플리케이션들을 통합한다. SOA를 구현하는 한 가지 방법(주: 가트너의 보고서에 나온 이 용어는 비교적 새로운 것이다.)

느슨한 연결(Loosely coupled): 잘 정의된 인터페이스들을 사용해 서비스들을 연결하는 것. SOA는 느슨하게 연결된 접근법을 사용해 구축되는데, 이 방법을 사용하면 1개 서비스를 손보더라도 이 서비스에 연결된 다른 서비스들을 손볼 필요가 없어진다. 

메시지 중심 미들웨어(MOM: Message -oriented middleware): 때때로 메시지 중심 아키텍처(message-oriented architecture)로도 불리는 MOM은 여러 애플리케이션들, 심지어 이기종 플랫폼들의 애플리케이션들을 연결하기 위한 메커니즘을 제공한다. 데이터는 메시지 대기열(queues)에 위치하게 되며, 따라서 애플리케이션들은 데이터를 보내는 애플리케이션들에 대한 직접적인 연결선을 만들지 않고도 데이터를 검색할 수 있다.

출판-가입(Publish-subscribe): 한 서비스가 요청하면(또는 ‘가입하면’) 다른 서비스가 올리는(또는 ‘출판하는’) 시스템. 출판된 정보가 변경되면, 가입한 서비스들은 자동으로 업데이트된 데이터를 수신한다.

서비스 중심 아키텍처(SOA: Service-oriented architecture): 잘 정의된 인터페이스들을 가진, 재사용이 가능한 일련의 컴포넌트들로 구축되는 기술건축방식.



SOA 도입에 따른 이익은? 

SOA는 대부분의 기업에서 발견되는 ‘모든 것을 갖고 있는’ IT 환경을 통합하는 일을 더 쉽게 해 준다. “이것이 SOA가 제시하는 가장 큰 가치 가운데 하나다. 다시 말해 SOA는 이기종 환경에서 아주 잘 작동한다.”고 웹서비스 컨설팅 회사인 잽씽크 사의 선임분석가 제이슨 브룸버그는 말한다. SOA를 통하면, 개발자들은 애플리케이션들을 연결하는 새로운 코드를 작성하기 위해 과도한 시간을 낭비할 필요가 없어진다. 대신 개발자들은 웹서비스 같은 표준 프로토콜을 사용할 수 있다. 그리고 SOA 코드의 상당 부분은 재사용이 가능하기 때문에 개발 비용도 줄어든다. SOA는 CIO가 기존에 리거시에 투자했던 것(SAP, 시벨, 오라클 등)을 한데 묶어 더 잘(그리고 저렴하게) 활용할 수 있게 해 준다.

“SOA가 좋은 점은 기존의 포트폴리오를 활용할 수 있게 해 준다는 것이다.”라고 IT 컨설팅 회사인 실크로드 사의 사장 팀 바스는 말한다. CIO는 기존 시스템을 제거하고 새로운 시스템으로 대체할 필요가 없어진다. 기존 시스템의 기능들을 파악한 후 그것들을 활용함으로서, CIO는 위험을 최소화하면서 기존 IT 투자의 가치를 극대화할 수 있다고 바스는 말한다. 또 서비스[예를 들면, 단순객체접근프로토콜(SOAP: simple object access protocol)과 웹서비스기술언어(WSDL: Web services description language) 등을 사용하는 서비스]를 구축하면, 내부 프로세스가 부드러워질 뿐만 아니라, 고객과 비즈니스 파트너들과는 회사의 방화벽을 넘어서 더 쉽게 정보를 공유할 수 있게 된다.

SOA의 또 다른 이익은, SOA가 IT 스탭들로 하여금 기술 아키텍처가 아니라 비즈니스 아키텍처 측면에서 생각하도록 강요하기 때문에, CIO와 비즈니스 중역들 사이의 대화를 더 매끄럽게 해 줄 수 있다는 것이다. 예를 들어, 만약 비즈니스 측이 개선된 재고관리 시스템을 구축하고자 한다면, 비즈니스 측의 실무진은 비즈니스 흐름에 기반해 그것을 설계하는 최고의 방법과 비즈니스의 요구를 만족시키는 최선의 방안에 대해 IT 설계사들과 이야기할 수 있다. 그리고 그 디자인을 실제로 구현하는 일도(이 일은 종종 대규모의 통합 작업이 수반되는데) 훨씬 쉬워진다.

이런 대화가 유용성을 가지려면, 비즈니스 측도 그들의 비즈니스를 운영하는 최선의 방법에 대해 생각해야만 한다. 예를 들면, 고객을 최대로 수용하기 위해 구축할 필요가 있는 프로세스들은? 고객 서비스 수준을 높일 수 있는 방법은? 등이다. 기존의 사일로화된 애플리케이션들을 넘어서 정보를 전달하고 공유함으로써, 기업은 실시간으로 더 많은 비즈니스 성과 데이터를 추출할 수 있어 비즈니스 지능을 높일 수 있다. 또 공통의 아키텍처를 통할 경우, 기업의 반응 수준은 획기적으로 높아진다고 양키 그룹의 선임분석가 다나 가드너는 말한다. “미동부해안에서 허리케인이 발생할 경우, 그 결과로 미국의 다른 지역에서 합판을 옮겨야 할 필요성이 크게 높아질 것이다. 이에 대해 기업은 실시간으로 반응할 수 있다.”고 그는 말한다. “기업은 비즈니스에서 일어나고 있는 일에 대한 정보(이전에는 갖지 못했던 정보)를 갖게 된다.” SOA가 완벽하게 구축된다면, 변화하는 비즈니스 요구와 매순간 바뀌는 시장 조건들에 대한 기업의 적응력은 크게 높아질 것이다.

마지막으로 통합이 쉬워지고 민첩성이 높아짐으로써 ROI가 높아진다는 부수적 이익도 맛볼 수 있다. 부스카드는 SOA 투자에 대해 200%의 ROI를 달성했다고 말한다. AXA 파이낸셜의 가장 인기있는 SOA 기반 서비스 가운데 하나는 겟클라이언트(Get Client)로, 이를 통해 고객대면의 전방처리 애플리케이션은 모두 명령어를 발행할 수 있는데, 그러면 그 명령어는 리거시 시스템들을 모두 훑어본 후 특정 고객의 투자에 대한 완벽한 그림을 창출해 낸다. 겟클라이언트 사례는 AXA가 ROI를 달성하는 방법 가운데 하나라고 부스카드는 말한다. 다시 말해 개발자들은 모든 종류의 전방처리 시스템들과 작동하기에 충분할 만큼의 일반적인 형태의 서비스를 디자인할 수 있으며, 이로 인해 개발시간이 단축되고 개발자들은 비즈니스 솔루션에 더 많은 시간을 쏟을 수 있게 된다. 여기에 IT 스탭들은 새 기술을 SOA에 쉽게 결합할 수 있어, 위험과 비용을 줄이면서 새 애플리케이션의 개발 속도를 높일 수 있다.



웹서비스가 SOA에서 하는 역할은?

우선 SOA는 웹서비스를 반드시 필요로 하는 것이 아니라는 점, 그리고 웹서비스도 SOA 없이 배포될 수 있다는 점을 주목할 필요가 있다. 그러나 웹서비스를 이용해 SOA를 구축하는 것이 가장 이상적인 방법이라고 생각하는 사람도 있다. 가트너의 톰슨이 이런 사람 가운데 하나다. 그러나 그는 SOA를 구축하려면 먼저 웹서비스를 제대로 구현해야만 한다고 경고한다. 만약 정확하게 구현되어 있다면, 그 웹서비스는 SOAP와 WSDL을 사용하는 SOA와 다름이 없다.

이에 반해 부스카드는 웹서비스 없이 SOA를 구축했는데, 이 시점에서 회사 내외부 고객 가운데 어느 누구도 그것을 요청하고 있지 않기 때문이다.(하지만 그는 나중에 그런 요청이 들어올 경우를 대비해 항상 촉각을 곤두세우고 있다.) 대신 그는 아이비엠의 웹스피어 MQ를 메시징 및 통합층으로 사용해 리거시 시스템들을 전방처리 애플리케이션들과 결합하고 있다. 동시에 그는 캔들 사의 패스와이(PathWAI) 수트를 함께 사용하고 있는데, 이 제품은 웹스피어 MQ의 성능을 모니터함으로써 웹스피어 MQ의 최적화를 도와준다.

노스롭 그룸만 미션 시스템의 수석엔지니어 존 존슨도 웹서비스 없이 출판-가입 시스템에 기반한 SOA를 구축했다.<’SOA 용어정리’ 박스 참조> 그는 웹 서버와 애플리케이션 서버의 최상부에 메시징 계층으로서 자바 메시지 서비스를 설치했으며, 통합 작업과 데이터 이동 작업을 돕기 위해 소닉 소프트웨어 사의 엔터프라이즈 서비스 버스를 사용하고 있다. 존슨은 그 서비스들이 웹서비스처럼 설계되어 있지만, 웹서비스 인터페이스들을 사용하고 있지는 않다고 말한다. 

SOA의 큰 이점 가운데 하나는 정확한 데이터를 필요한 사람이나 애플리케이션에 전달해 준다는 것이라고 존슨은 말한다. 예를 들면, 한 사용자가 ID를 사용해 로그인을 할 때, 시스템은 그 사용자가 누구인지를 확인한 후 그 사람이 볼 수 있도록 허용된 데이터(예를 들면, 지도와 업무 리스트)를 전달해 준다.



도전과제는 무엇인가?

보안이 가장 큰 과제다. “개방형 환경보다는 폐쇄형 환경을 보호하는 일이 항상 더 쉽다.”고 실크로드의 바스는 말한다. CIO는 웹서비스의 보안 표준들이 아직 확정되지 않았다는 점을 먼저 인지해야만 한다.<’계산된 위험(www.cio.com/archive/100103/risks.html)’ 박스 참조> 이런 보안 문제 가운데 몇 가지를 극복하려면, SOA를 구축할 때 높은 수준의 보안을 요구하지 않는 비즈니스 프로세스들에 우선 초점을 맞추는 식으로 천천히 진행하는 것이 좋다고 바스는 조언한다.

서비스 구성과 관련된 복잡한 일들을 관리하는 것 또한 까다로운 일이 될 수 있으며, 따라서 탄탄한 SOA 지배구조 모델이 필요하다고 바스는 말한다. 예를 들면, 서비스 중심적인 노드들을 네트웍에 갖고 있으며 100명의 사용자가 특정 인터페이스들을 사용하고 있을 경우, 만약 누군가 그 인터페이스를 변경한다는 결정을 내린다면 어떻게 다른 사용자들과 통신을 할 것인가? 

또 다른 이슈는 네트웍 모니터링이다. “SOA를 통해 복잡한 인터넷 중심의 비즈니스 프로세스들을 조율하는 능력을 갖춘다는 말은 동시에 복잡한 모니터링과 감사 역량도 갖춰야 한다는 말이다.”라고 바스는 말한다. 예를 들면, 서비스 중심 네트웍에서 거래처리 작업 하나가 잘못될 경우(이 경우 여러 서비스 제공업체가 관련될 가능성이 높은데), 무엇이 잘못된 것인지, 어디에서 그것이 잘못된 것인지, 또는 누군가 네트웍에 잘못된 정보를 입력한 것인지를 파악하는 일이 아주 어려울 수 있다. “현재의 웹서비스 기술 표준들은 겉으로 드러나는 사항들만 다루고 있을 뿐이어서, 이 서비스 중심의 이상적인 분산 협업, 프로세스 조율, 모니터링 목표를 현실로 만들기에는 아직 부족한 면이 많다.”고 바스는 말한다.

마지막으로 비용 문제가 있다. SOA를 구축하는 것은 결코 값싼 일이 아니다. 기존 시스템 아키텍처를 리엔지니어링하기 위해서는 상당한 돈이 들어갈 것이다. 또 상당한 수준의 인적자산이 필요할 것이다. 예를 들면, 비즈니스 프로세스를 설계하기 위한 비즈니스 분석가, 프로세스들을 설계도로 만들기 위한 시스템 아키텍트, 새로운 코드를 개발하기 위한 소프트웨어 기술자, 그 모든 사람을 조율하기 위한 프로젝트 매니저 등이다.



SOA를 구축하는데 있어 일반적으로 수용되는 베스트 프랙티스가 있는가?

말할 필요도 없는 것처럼 들릴지 모르지만, SOA를 위한 청사진을 확보하는 것은 정말 중요한 일이다. 기업, 특히 여러 비즈니스를 펼치고 있는 대기업에서 전반적인 계획 아래 어떻게 그것이 들어맞을 것인가를 고려하지 않고 신기술을 구매하거나 애플리케이션들을 통합하는 일은 다반사로 일어난다. 따라서 SOA를 구축하는 것과 관련해 가장 큰 과제 가운데 하나는 사람들(IT와 비즈니스 양측 모두)로 하여금 그 아키텍처 목표들에 초점을 맞추도록 만드는 것이다. 

그리고 CIO는 제공해야 할 정확한 수준의 서비스를 파악할 필요가 있다. 그리고 그런 서비스는 너무 가는 입자도를 가져서는 안된다. 그렇게 되면, 더 높은 비즈니스 프로세스 수준에서 기능을 발휘한다는 그 서비스의 목표가 훼손되기 때문이다. 다시 말해 초점을 너무 좁게 잡으면 더 많은 서비스가 필요하게 되고, 이것은 다시 개발 시간을 증가시킨다. 최악의 경우, 너무 많은 서비스가 네트웍에 흐를 수 있게 된다.

또한 CIO는 가장 큰 유용성을 보이는 곳에서 SOA를 사용해야 할 것이다. 바스는 SOA를 구현할 때 서비스 품질(QoS: quality of service)도 고려할 필요가 있다고 지적한다. 거의 실시간에 가까운 반응속도를 요구하지 않는 시스템에서는 느슨하게 연결된 아키텍처가 좋다고 바스는 말한다. 제시간에 필요한 정보를 얻지 못할 경우, 그 결과가 재앙이 아니라 사소한 문제로 그치는 그런 시스템을 골라 SOA를 적용한다.(예를 들면, SOA를 토대로 항공교통 제어 시스템을 구축한다는 것은 나쁜 생각이다.)



아키텍처에 대한 더 많은 정보

신기술에 대해, 그리고 SOA의 사촌인 웹서비스와 기타 협업 도구에 대해 더 많이 알고 싶다면, 태동기술 연구센터(Emerging Technology Research Center, 64.28.79.79/research/current/)를 참조

관련 정보

혼성 애플리케이션: 새로운 비즈니스 모델을 위한 자산 활용법(Composite Applications: Leveraging Assets for New Business Models, www2.cio.com/analyst/report1726.html)

휴위츠 앤 어쏘시에이츠 사가 이질적인 이익집단들 사이에서 새로운 비즈니스 프로세스를 창출하기 위해 혼성 애플리케이션을 사용하는 방법에 대해 보고하고 있다.

웹서비스: 보편적인 통합이 비즈니스 서비스에 파워를 더해 준다(Web Services: Universal Integration Powers Business Services, www2.cio.com/consultant/report1641.html)

액센추어가 엔터프라이즈 애플리케이션 통합(EAI) 기술에 대해 보고하고 있다.

SOA로의 오솔길(The pathway to a service-oriented architecture, www.computerworld.com/developmenttopics/
development/webservices/story/
0,10801,87771,00.html)



CIO들은 SOA에 대해 생각하고 있는가?

많은 CIO가 SOA에 대해 심각하게 고려중이다. 특히 웹서비스를 시험중인 CIO들이 그렇다. SOA의 잠재적 효과가 아주 매혹적이기 때문이다. 민첩성 증대, 통합 속도 증대/비용 절감, 기존 IT 자산의 활용, 비즈니스 프로세스에 대한 집중 등 그 이익은 아주 많다. 

물론 SOA를 구축하려면 상당한 투자를 해야 한다. 또 아직 성숙하지 않은 웹서비스 시장과 관련해 많은 문제가 해결되지 않고 있는 상태다. 하지만 최소한 SOA는 전략적 측면에서 계속 주목할 만한 가치가 있다



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

[javascript] 금액에 콤마붙이기  (0) 2016.10.03
[Delphi] 작업관리자에 내 프로세서 감추기  (0) 2016.10.03
SOA란 무엇인가  (0) 2016.10.03
[하드웨어] 메모리 용량 단위  (0) 2016.10.01
[php] getdate() 함수  (0) 2016.09.22
[php] 내장함수  (0) 2016.09.17
Posted by SB패밀리

[하드웨어] 메모리 용량 단위



메모리 용량 단위
Bit
Byte
Kilobytes
Megabytes
Gigabytes
Terabytes
Petabytes
Exabytes
Zettabytes


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

[Delphi] 작업관리자에 내 프로세서 감추기  (0) 2016.10.03
SOA란 무엇인가  (0) 2016.10.03
[하드웨어] 메모리 용량 단위  (0) 2016.10.01
[php] getdate() 함수  (0) 2016.09.22
[php] 내장함수  (0) 2016.09.17
[php] 문자열함수  (0) 2016.09.17
Posted by SB패밀리

[php] getdate() 함수



getdate
(PHP 3, PHP 4 , PHP 5)

getdate -- 날짜/시간 정보를 가져온다
설명
array getdate ( [int timestamp])


timestamp의 날짜 정보를 포함하는 연관 배열이나, timestamp가 주어지지 않는다면 현재 로컬 시간를 반환한다. 다음과 같은 배열 원소로 반환된다. 


표 1. 반환되는 연관 배열의 키 원소들

키 설명 Example returned values 
"seconds" 초의 숫자 표현 0 부터 59 
"minutes" 분의 숫자 표현 0 부터 59 
"hours" 시간의 숫자 표현 0 부터 23 
"mday" 일의 숫자 표현 1 부터 31 
"wday" 요일의 숫자 표현 0 (일요일) 부터 6 (토요일) 
"mon" 월의 숫자 표현 1 부터 12 
"year" 연도의 숫자표현, 4 자리 Examples: 1999 또는 2003 
"yday" 연도의 일차 0 부터 366 
"weekday" 요일, 완전한 문자 Sunday 부터 Saturday 
"month" 월, 완전한 문자, January 나 March January 부터 December 
0 유닉스 Epoch (January 1 1970 00:00:00 GMT)로부터의 초, time()에 의해 반환되는 값과 유사하고, date()에 의해서 사용된다.  시스템 의존적이다, 일반적으로 -2147483648 부터 2147483647.  


예 1. getdate() 예제코드 

<?php
$today = getdate(); 
print_r($today);
?>  

출력은 다음과 같을것이다: 

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)




참고: date(), time(), setlocale(). 


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

SOA란 무엇인가  (0) 2016.10.03
[하드웨어] 메모리 용량 단위  (0) 2016.10.01
[php] getdate() 함수  (0) 2016.09.22
[php] 내장함수  (0) 2016.09.17
[php] 문자열함수  (0) 2016.09.17
[windows XP] 지운 파일 되살리기  (0) 2016.09.17
Posted by SB패밀리

[php] 내장함수

IT - 개발 2016.09.17 16:21

[php] 내장함수


1. 날짜 및 시간 관련함수 

*time() 
-용도: 현재 시각을 timestamp값으로 구한다. 
-방법: time() 

*date() 
-용도: 사용자가 지정한 형태로 시간을 표시. 특정시간의 날짜와 요일등을 배열로 리턴한다. 
-방법: date("표시할 시간의 포맷형태","특정한 timestamp값") 

*mktime() 
-용도: 지정된 날짜를 timestamp값으로 변환한다. 
-방법: mktime(시,분,초,월,일,년) 

*checkdate() 
-용도: 날짜와 시간이 올바른 범위 안에 있는지 검사한다. 
-방법: checkdate(월,일,년) 

*getdate() 
-용도: 특정timestamp값으로 시간,요일,날짜정보를 배열로 반환한다. 
-방법: getdate(timestamp값) 또는 getdate() 

*gettimeofday() 
-용도: 현재 시스템의 현재 시간 정보를 배열로 리턴한다. 
-방법: gettimeofday() 

*gmmktime() 
-용도: 그리니치표준 시간으로 지정한 날짜의 timestamp값을 리턴한다. 
-방법: gmmktime(시,분,초,월,일,년) 

*strftime() 
-용도: 특정한 포맷으로 날짜 정보를 출력하는데 언어를 지정할수 있다. 
-방법: strftime("표시할 시간의 포맷형태","특정시간의 timestamp값") 

*microtime() 
-용도: 현재시간의 마이크로타임 값과 timestamp값을 표시한다. 
-방법: microtime() 

*localtime() 
-용도: 현재 서버의 로컬 타임을 표시 
-방법: localtime() 또는 localtime("timestamp값") 

2. 문자열 처리함수 

*addslashes() 
-용도: 작은따옴표 큰따옴표와 같은 특정문자 앞에 역슬래시 문자를 붙인다. 
-방법: addslashes() 

*stripslashes() 
-용도: allslashes로 역슬래시 처리된 문자를 원상태로 되돌린다. 
-방법: stripslashes() 

*htmlspecialchars() 
-용도: HTML코드를 소스 그대로 출력해준다. 
-방법: htmlspecialchars() 

*nl2br() 
-용도: 문자열에 포함된 개행 문자를 <br>태그로 모두 바꿔준다. 
-방법: nl2br() 

*echo() 
-용도: 문자열 출력 
-방법: echo("변수명" 또는 "문자열") 

*sprintf() 
-용도: 포맷 문자열을 통해 지정해 준 포맷으로 문자열을 표시한다. 
-방법: sprintf("포맷","변수명") 

*printf() 
-용도: 지정할 수 있는 포맷에 따라 문자열을 출력한다. 
-방법: printf("포맷","변수명") 

*explode() 
-용도: 문자열을 지정해준 구분자로 분리하여 배열에 저장한다. 
-방법: explode("구분자","문자열인수") 

*implode() 
-용도: 구분자로 나누어 배열에 담은 문자열을 다시 지정해준 구분자로 연결하여 전체 문자열을 반환한다. 
-방법: implode("구분자",배열변수명) 

*join() 
-용도: implode()와 동일한 기능을 수행한다. 
-방법: join("/", "배열변수명") 

*split() 
-용도: 주어진 문자열을 정규표현식의 패턴에 따라 분리하여 배열에 저장한다. 
-방법: implode("정규표현식","문자열") 

*strcmp() 
-용도: 두개의 문자열을 비교하여 참이면1, 거짓이면 0을 반환한다. 
-방법: strcmp("문자열","문자열") 또는 strcmp("문자열","변수명") 또는 strcmp(변수명, 변수명) 

*substr() 
-용도: 문자열에서 특정시작 문자부터 길이만큼의 문자열을 추출하여 반환한다. 
-방법: substr("문자열", 시작문자번호, 문자열의 길이) 

*strchr() 
-용도: 문자열이 처음으로 나타나는 위치부터 끝까지 반환 
-방법: strchr("문자열","찾을 문자열") 

*strstr() 
-용도:strchr()함수와 동일한 수행을 한다. 
-방법: strstr("문자열","찾을 문자열") 

*strrchr() 
-용도: 문자열이 마지막으로 나타나는 위치부터 끝까지 반환한다. 
-방법: strrchr("문자열","찾을문자열") 

*strpos() 
-용도: 문자열 대신 처음으로 나타나는 위치를 숫자로 반환, 이때 숫자는 0부터 시작. 
-방법: strpos("문자열","찾을 문자열") 

*strrpos() 
-용도: 찾고자 하는 문자열에서 마지막으로 나타나는 위치를 반환한다. 
-방법: strrpos("문자열", "찾을 문자열") 

*strlen() 
-용도: 문자열의 길이를 반환한다. 
-방법: strlen($변수명) 또는 strlen("문자열") 

*strtolower() 
-용도: 알파벳 대문자를 모두 소문자로 바꾸어 반환한다. 
-방법: strtolower("문자열") 

*strtoupper() 
-용도: 알파벳 대문자를 소문자로 바꾸어 반환한다. 
-방법: strtoupper("문자열") 

*ucfirst() 
-용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다. 
-방법: unfirst("문자열") 

*ucwords() 
-용도: 알파벳 문자열의 첫 글자를 대문자로 반환한다. 
-방법: ucwords("문자열") 

*strrev() 
-용도: 인자로 전달한 문자열의 순서를 역전시킨다. 
-방법: strrev("문자열") 

*strtr() 
-용도: 문자열에서 변경하고자 하는 문자열을 변경할문자열로 1:1 변경해준다. 
-방법: strtr("문자열","변경하고자하는 문자열","변경할 문자열") 

*str_replace 
-용도: 문자열 중에 변경하고자 하는 문자열을 찾아 변환한다. 
-방법: str_replace("찾을 문자열","변경할 문자열","문자열 원본") 

*chop() 
-용도: 문자열의 뒷부분의 공백 문자를 제거한 후 반환한다. 
-방법: chop("문자열") 

*trim() 
-용도: 문자열의 앞과 뒤에 있는 공백을 제거한 후 문자열을 반환한다. 
-방법: trim("문자열") 

*quotemeta() 
-용도: 메타문자 앞에 역슬래시를 붙인다. 
-방법: quotemeta() 

*ord/chr() 
-용도: ord()함수는 문자열에서 첫번째 문자에 아스키코드값을 반환하고 chr()함수는 아스키함수에 해당하는 문자를 반환한다. 
-방법: ord("문자열"), chr("아스키값") 

*parse_str() 
-용도: get방식과 같은 형태의 변수형을 변수와 값으로 받을 수 있게 해준다. 
-방법: parse_str(변수명) 

3.파일관련함수 

*fopen() 
-용도: 로컬경로의 파일이나 url경로의 파일을 읽기 모드나 쓰기 모드로 열어준다. 
-방법: fopen("절대경로명/파일", "모드")또는 fopen("url주소", "모드") 

*fclose() 
-용도: fopen으로 열린 파일을 닫는다. 
-방법: fclose($fp) 

*fread() 
-용도: 파일포인터가 가리키는 파일의 내용을 지정한 크기만큼 읽어 들인다. 
-방법:fread($fp,"읽어들일 바이트") 

*feof() 
-용도: 현재 파일 포인터가 파일의 끝인지를 알려주는 함수 
-방법: feof($fp) 

*fgets() 
-용도: 파일을 읽어올때 한줄씩 읽어온다. 
-방법: fgets($fp,"읽어들일 바이트") 

*fputs() 
-용도: 파일을 a 또는 w 모드로 열어 문자열을 파일에 기록한다. 
-방법: fputs($fp, "문자열") 

*fwirte() 
-용도: 파일을 기록한다. 
-방법: fwrite($fp, "문자열") 

*fpassthru() 
-용도: 파일포인터의 현재 위치에서 파일의 끝까지 읽어 들이도록 한다. 
-방법: fpassthru($fp) 

*readfile() 
-용도: fpassthru와 비슷하지만 fopen()없이 직접 바로 파일을 읽어들일 수 있다. 읽어들인 파일의 절대경로를 포함한다. 
-방법: readfile("파일의 절대경로 또는 상대경로/파일명") 

*fgetc() 
-용도: 파일로부터 한문자를 읽어들인다. 
-방법: fgetc($fp) 

*filesize() 
-용도: 파일의 크기를 바이트수로 반환한다. 
-방법: filesize("파일경로/파일명") 

*file_exists() 
-용도: 파일이름으로 지정한 파일이 존재하는지 검사한다. 
-방법: file_exists("파일경로/파일명") 

*is_file() 
-용도: 파일이름으로 지정한 이름이 파일면 true를 반환한다. 
-방법: is_file("파일경로/파일명") 

*is_dir() 
-용도: 파일이름으로 지정한 이름이 디렉토리일경우 true를 반환한다. 
-방법: is_dir("파일경로/파일명") 

*is_link() 
-용도: 파일이름으로 지정한 이름이 심볼릭 링크일경우 true를 반환한다. 
-방법: is_link("파일경로/파일명") 

*is_escutable() 
-용도: 파일이름으로 지정한 파일이 실행 가능한 파일이면 true를 반환한다. 
-방법: is_excutable("파일경로/파일명") 

*is_readable() 
-용도: 파일이름으로 지정한 파일이나 디렉토리가 읽기 가능한경우 true를 반환한다 
-방법: is_readable("파일경로/파일명 또는 디렉토리명") 

*is_writeable() 
-용도: 파일이름으로 지정한 파일이나 디렉토리가 쓰기 가능한 경우 true를 반환한다 
-방법: is_writeable("파일경로/파일명 또는 디렉토리명") 

*copy() 
-용도: 파일을 복사하고 제대로 수행이 되면 true를 반환한다. 
-방법: copy("파일경로/복사할 파일명", "파일경로/복사된 파일명") 

*rename() 
-용도: 파일을 이름을 바꾼다. 제대로 수행이 되면 true를 반환한다. 
-방법: rename("파일경로/변경할 파일명", "파일경로/변경후 파일명") 

*unlink() 
-용도: 파일을 삭제한다. 제대로 수행될 경우 true를 반환한다. 
-방법: unlink("파일경로/삭제할 파일명") 

*mkdir() 
-용도: 디렉토리를 생상하고 동시에 권한도 함께 지정할 수 있다. 
-방법: mkdir("경로/디렉토리명") 

*rmdir() 
-용도: 디렉토리 삭제 
-방법: rmdir("경로/디렉토리명") 

*basename() 
-용도: 경로명과 파일명을 받아 파일명만을 반환한다. 
-방법: basename("파일경로/파일명") 

*dirname() 
-용도: 경로명과 파일명을 받아 경로명만을 반환한다. 
-방법: dirname("파일경로/파일명") 

*file() 
-용도: 줄단위로 읽어서 각 줄으 문자열을 배열로 하여 반환한다. 
-방법: dirname("파일경로/파일명") 

4.디렉토리 관련함수 

*opendir() 
-용도: 지정한 디렉토리에 대한 핸들을 얻는다. 
-방법: opendir("디렉토리 경로") 

*closedir() 
-용도: opendir()함수 호출로 열어둔 디렉토리에 대한 핸들을 닫는다. 
-방법: closedir($od) 

*readdir() 
-용도: 디렉토리에 있는 모든 디렉토리 및 파일들의 이름을 읽어 배열의 형태로 반환 
-방법: readdir($od) 

*rewinddir() 
-용도: 디렉토리 핸들의 포인터 위치를 제일 처음으로 되돌린다. 
-방법: rewinddir($od) 

*chdir() 
-용도: 지저한 디렉토리로 바꾼다. 
-방법: chdir("경로명/디렉토리명") 

*dir() 
-용도: 디렉토리 관련 함수를 사용할 수 있는 클래스 
-방법: dir("경로/디렉토리명") 

5. URL관련함수 

*parse_url() 
-용도: url을 입력하면 해당 url에 대한 정보를 연관 배열로 저장하여 반환 
-방법: parse_url("URL주소") 

*urlencode() 
-용도: 데이터를 url인코딩해준다. 
-방법: urlencode("문자열") 

*urldecode() 
-용도: url을 통해 넘어온 값 중 인코딩된 문자열을 디코딩한다. 
-방법: urldecode("문자열") 

6.변수 및 수학 관련함수 

*gettype() 
-용도: 변수형을 반환한다. 
-방법: gettype("변수명") 

*settype() 
-용도: 변수형을 변환한다. 
-방법: settype("변수명", "변수타입") 

*intval() 
-용도: 변수값을 정수형 값으로 변환 
-방법: intval("변수값") 

*doubleval() 
-용도: 변수값을 실수형 값으로 변환한다. 
-방법: doubleval("변수값") 

*strval() 
-용도: 변수를 문자형 값으로 변환한다. 
-방법: strval("변수값") 

*isset() 
-용도: 변수가 존재하는지 확인한다. 
-방법: isset("변수명") 

*unset() 
-용도: 변수를 삭제한다. 
-방법: unset("변수명") 

*empty() 
-용도: 변수에 값이 존재하는지 확인하여 없으면 true를 있으면 false를 반환한다. 
-방법: empty("변수명") 

*is_array() 
-용도: 변수의 형이 배열인지 확인한다. 
-방법: is_array("변수명") 

*is_double 
-용도: 변수의 형이 더블형인지 확인한다. 
-방법: is_double("변수명") 

*abs() 
-용도: 변수의 절대값을 반환 
-방법: abs("변수명") 

*round() 
-용도: 변수의 반올림한 값을 구한다. 
-방법: round("변수명") 

*ceil() 
-용도: 변수 값의 무조건 올림 값을 구한다. 
-방법: ceil("변수명") 

*floor() 
-용도: 변수값의 무조건 내림 값을 구한다. 
-방법: floor("변수명") 

*pow() 
-용도: 인자 값만큼 제곱승 한 값을 구한다. 
-방법: pow("변수명", "제곱할 횟수") 

*max & min() 
-용도: 최대값과 최소값을 구한다. 
-방법: max("숫자값", "숫자값",...) min("숫자값", "숫자값",...) 

7.기타 알아두어야 할 함수 

*count()/sizeof() 
-용도: 배열의 크기를 구한다. 
-방법: count("변수명") sizeof("변수명") 

*each()/list() 
-용도: 배열의 내용을 출력할때 사용한다. 
-방법: each("배열변수명"), list("배열의 인자를 받을 변수명", "배열의 인자를 받을 변수명"...) 

*end()/next()/reset() 
-용도: 현재 배열의 포인터를 끝이나 다음으로 이동시킨다. reset은 배열포인터를 다시 처음으로 되돌린다. 
-방법: end("배열변수명") next("배열변수명") 

*exec() 
-용도: 리눅스 서버의 내부 명령어를 사용하게 한다. 
-방법: exec("리눅스명령어", "결과를 저장할 변수명" ,"에러발생시 저장할 변수명") 

*number_format() 
-용도: 천단위마다 ","를 붙여준다. 
-방법: number_format("변수명", "소수점자리수", "소수점 표시마크변경", "천단위 표시 마크변경") 

*show_source() / highlight_string() 
-용도: php파일의 소스를 보여준다. 
-방법: show_source("경로명/파일명") highlight_string("변수명") 

*uniqid() 
-용도: 유일한 아이디 값을 만들어준다 
-방법: uniqid() 



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

[하드웨어] 메모리 용량 단위  (0) 2016.10.01
[php] getdate() 함수  (0) 2016.09.22
[php] 내장함수  (0) 2016.09.17
[php] 문자열함수  (0) 2016.09.17
[windows XP] 지운 파일 되살리기  (0) 2016.09.17
[Mysql] 테이블 존재여부 확인하기  (0) 2016.09.06
Posted by SB패밀리

[php] 문자열함수


그나마 PHP에서 재미있는 함수라면 문자열 함수들이 아닐까 싶네요.



문자열 관련함수들이 



AddCSlashes -- C 형식으로 문자열에 슬래쉬를 덧붙입니다. 
addslashes -- 문자열에 슬래쉬를 덧붙입니다. 
bin2hex --  바이너리 데이터를 16진수 표현으로 바꿉니다. 
chop -- rtrim()의 별칭. 
chr -- 특정 문자를 반환합니다. 
chunk_split -- 문자열을 작은 조각으로 나눕니다. 
convert_cyr_string --  키릴 문자셋을 다른 것으로 변환합니다. 
convert_uudecode --  Decode a uuencoded string 
convert_uuencode --  Uuencode a string 
count_chars --  문자열 안에 사용한 문자에 대한 정보를 반환합니다. 
crc32 -- 문자열의 crc32값을 계산합니다. 
crypt -- 단방향 문자열 암호화(해슁). 
echo -- 하나 이상의 문자열을 출력합니다. 
explode -- 문자열을 주어진 문자열을 기준으로 분리합니다. 
fprintf -- 문자열을 형식화하여 스트림에 기록합니다. 
get_html_translation_table --  htmlspecialchars()와 htmlentities()에서 사용하는 변환표를 반환합니다. 
hebrev --  논리 헤브라이어 텍스트를 표시 텍스트로 변환합니다. 
hebrevc --  개행 문자를 포함하여 논리 헤브라이어 텍스트를 표시 텍스트로 변환합니다. 
html_entity_decode --  모든 HTML 엔티티를 해당하는 문자로 변환합니다. 
htmlentities --  해당하는 모든 문자를 HTML 엔티티로 변환합니다. 
htmlspecialchars --  특수 문자를 HTML 엔터티로 변환합니다. 
implode -- 문자열로 배열 요소를 결합합니다. 
join -- implode()의 별칭. 
levenshtein --  두 문자열 사이의 Levenshtein distance를 계산합니다. 
localeconv -- 숫자 형식화 정보를 얻습니다. 
ltrim --  문자열 시작 부분의 공백을 제거합니다. 
md5_file -- 주어진 파일명의 md5 해쉬를 계산합니다. 
md5 -- 문자열의 md5 해쉬를 계산합니다. 
metaphone -- 문자열의 메타폰 키를 계산합니다. 
money_format -- Formats a number as a currency string 
nl_langinfo --  언어와 로케일 정보를 얻습니다. 
nl2br --  문자열의 모든 줄바꿈 앞에 HTML 줄바꿈 태그를 삽입합니다. 
number_format -- Format a number with grouped thousands 
ord -- 문자의 아스키 값을 반환합니다. 
parse_str -- 문자열을 처리하여 변수를 생성합니다. 
print -- 문자열을 출력합니다. 
printf -- 형식화한 문자열을 출력합니다. 
quoted_printable_decode --  인용되어 있는 출력 가능 문자열을 8비트 문자열로 변환합니다. 
quotemeta -- 메타 문자를 인용합니다. 
rtrim --  문자열 끝 부분의 공백을 제거합니다. 
setlocale -- 지역적보를 지정한다. 
sha1_file -- 파일의 sha1 해쉬를 계산합니다. 
sha1 -- 문자열의 sha1 해쉬를 계산합니다. 
similar_text --  두 문자열 간의 유사성을 계산합니다. 
soundex -- 문자열의 soundex 키를 계산합니다. 
sprintf -- 형식화한 문자열을 반환합니다. 
sscanf --  문자열을 형식에 따라 처리합니다. 
str_ireplace --  대소문자를 구별하지 않는 str_replace(). 
str_pad --  문자열을 어떠한 길이가 되도록 다른 문자열로 채웁니다. 
str_repeat -- 문자열을 반복합니다. 
str_replace --  발견한 모든 검색 문자열을 치환 문자열로 교체합니다. 
str_rot13 -- 문자열에 rot13 변환을 수행합니다. 
str_shuffle -- 문자열을 랜덤하게 섞습니다. 
str_split --  문자열을 배열로 변환합니다. 
str_word_count --  문자열에서 사용한 단어에 대한 정보를 반환합니다. 
strcasecmp --  대소문자를 구별하지 않는 바이너리 호환 문자열 비교 
strchr -- strstr()의 별칭. 
strcmp -- 바이너리 호환 문자열 비교 
strcoll -- 로케일 기반 문자열 비교 
strcspn --  마스크에 매칭하지 않는 처음 세그먼트의 길이를 찾습니다. 
strip_tags -- 문자열에서 HTML과 PHP 태그를 제거합니다. 
stripcslashes --  addcslashes()로 처리한 문자열을 되돌립니다. 
stripos --  대소문자를 구별하지 않고 문자열이 처음 나타나는 위치를 찾습니다. 
stripslashes --  addslashes()로 처리한 문자열을 되돌립니다. 
stristr --  대소문자를 구별하지 않는 strstr() 
strlen -- 문자열의 길이를 구합니다. 
strnatcasecmp --  "natural order" 알고리즘을 이용한 대소문자를 구별하지 않는 문자열 비교. 
strnatcmp --  "natural order" 알고리즘을 이용한 문자열 비교 
strncasecmp --  대소문자를 구별하지 않는 처음 n 문자의 이진 호환 문자열 비교 
strncmp --  처음 n 문자의 이진 호환 문자열 비교 
strpbrk --  Search a string for any of a set of characters 
strpos --  문자열이 처음 나타나는 위치를 찾습니다. 
strrchr --  문자열에서 문자가 마지막으로 나오는 부분을 찾습니다. 
strrev -- 문자열을 뒤집습니다. 
strripos --  문자열에서 대소문자 구별 없이 문자열이 나타나는 마지막 위치를 찾습니다. 
strrpos --  문자열에서 마지막 문자의 위치를 찾습니다. 
strspn --  마스크에 매칭되는 초기 세그먼트의 길이를 찾는다. 
strstr -- 문자열이 처음으로 나타나는 부분을 찾습니다. 
strtok -- 문자열을 토큰화 합니다. 
strtolower -- 문자열을 소문자로 만듭니다. 
strtoupper -- 문자열을 대문자로 만듭니다. 
strtr -- 특정 문자를 번역한다. 
substr_compare --  Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters 
substr_count -- 부분문자열의 수를 센다 
substr_replace -- 문자열의 일부를 치환한다. 
substr -- 문자열의 일부를 반환한다. 
trim --  문자열의 처음과 끝에 있는 공백을 제거한다. 
ucfirst -- 문자열의 처음 글자를 대문자로 만든다. 
ucwords --  문자열에 있는 각 단어의 처음 글자를 대문자로 바꾼다. 
vprintf -- Output a formatted string 
vsprintf -- Return a formatted string 
wordwrap --  정지문자를 이용해 주어진 수 만큼의 문자를 래핑한다.  



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

[php] getdate() 함수  (0) 2016.09.22
[php] 내장함수  (0) 2016.09.17
[php] 문자열함수  (0) 2016.09.17
[windows XP] 지운 파일 되살리기  (0) 2016.09.17
[Mysql] 테이블 존재여부 확인하기  (0) 2016.09.06
[MS SQL] DB 테이블 존재여부 확인하기  (0) 2016.09.06
Posted by SB패밀리

[windows XP] 지운 파일 되살리기


지운 파일 되살리기
탐색기나 내 컴퓨터에서 실수로 중요한 파일을 지우기 십상이다. 하지만 걱정하지 않아도 된다. 도구 모음에 있는 ‘실행 취소’ 버튼을 누르면 사라졌던 것이 다시 나타나기 때문이다. 단축 키는 <Ctrl + Z>다. 
TR>  
‘실행취소’ 버튼을 누르면 방금 전 내린 명령이 무효가 된다. 


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

[php] 내장함수  (0) 2016.09.17
[php] 문자열함수  (0) 2016.09.17
[windows XP] 지운 파일 되살리기  (0) 2016.09.17
[Mysql] 테이블 존재여부 확인하기  (0) 2016.09.06
[MS SQL] DB 테이블 존재여부 확인하기  (0) 2016.09.06
[php] 파일 관련 함수  (0) 2016.09.04
Posted by SB패밀리

[Mysql] 테이블 존재여부 확인하기


Mysql 테이블 존재 유무 확인

1.

sptbl_qry = "select count(*) TotCount from INFORMATION_SCHEMA.tables where table_name='[table_name]'"



2.

function mysql_table_exists($table, $link) { 
$exists = mysql_query("SELECT 1 FROM `$table` LIMIT 0", $link); 
if ($exists) return true; 
return false; 


mysql_query는 query가 성공하면 true, 실패하면 false입니다.



Posted by SB패밀리

[MS SQL] DB 테이블 존재여부 확인하기




MS SQL SERVER 에서 DB 테이블 존재여부 확인하기

++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1
++++++++++++++++++++++++++++++++++++++++++++++++++

MS SQL 테이블 존재여부

sql = " IF object_id('테이블명') IS NOT NULL SELECT count(*) as count FROM 테이블명 where etc1='" & domain_addr & "' "

테이블이 있으명 실행


sql = sql & " IF object_id('테이블명')IS NULL SELECT count(*) as count FROM 다른테이블명 "

테이블이없으면 다른테이블 실행

++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2
++++++++++++++++++++++++++++++++++++++++++++++++++

MS SQL 테이블 존재 여부 확인방법 #2

테이블 존재 여부를 확인하는 다양한 방법들을 볼까요.
여기서는 기본적인 몇 가지만 살펴보겠습니다.
쿼리 분석기를 이용해서 테스트 해 보세요.

-- northwind DB에 orders 테이블을 테스트합니다.
USE northwind

-- 아래 코드는 SQL Server 스크립팅 엔진이 생성하는 일반적인 코드입니다.
IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id(N'dbo.orders')
     AND objectproperty(id, N'IsUserTable') = 1)
  SELECT '존재'

-- INFORMATION_SCHEMA owner의 TABLES 뷰를 이용해도 확인할 수 있죠.
IF EXISTS(SELECT * FROM information_schema.tables
     WHERE  table_name = 'orders' AND table_schema='dbo')
  SELECT '존재'

-- 가장 단순한 방법은 obejct_id 함수를 이용하는 방법입니다.
-- N'' 은 문자열이 유니코드형임을 나타내는 지시어입니다.
IF object_id(N'dbo.orders') IS NOT NULL
  SELECT '존재'

-- 이렇게도 가능하죠. 'U'는 sysobjects 테이블의 xtype 컬럼 값입니다.
IF object_id(N'dbo.orders', 'U') IS NOT NULL
  SELECT '존재'

-- 임시 테이블의 경우는 TEMPDB에 작성되므로 다음과 같이 사용할 수 있죠.
IF object_id(N'tempdb.dbo.#temptable') IS NOT NULL
  SELECT '존재'

/*
결론적으로 위의 모든 방법들은, sysobjects 시스템 테이블을 이용한다는
사실입니다.
sysobjects 시스템 테이블은 오브젝트의 가장 근본이 되는 중요한 테이블입니다.
이 시스템 테이블에 대해서 많은 공부 하시면 큰 도움이 되실겁니다.
*/
SELECT * FROM dbo.sysobjects
  WHERE id = object_id('dbo.orders')




SELECT COUNT(NAME) CNT FROM SYSOBJECTS WHERE TYPE = 'U' AND NAME='테이블이름'



count(name) > 0 이면 존재


출처 : 데브피아

++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3
++++++++++++++++++++++++++++++++++++++++++++++++++

MS SQL 2000 테이블 존재여부

테이블 존재여부 확인을 위한 최적의방안]

시스템 테이블을 이용하시는 방안이 있습니다. 

MSSQL2000의 각 DB마다 시스템관련 저장 프로시져를 가지고 있으며, 전체 DB 즉 master DB에서 전체 DB 및 전체 Column등 대부분을 관리를 하고있습니다.

use master
go

Select * From sysobjects where xtype = 'U' 를 하시면 사용자가 직접만든 테이블 목록이 촤르르 펼쳐집니다. 여기서 응용력을 발휘하셔서

SELECT *
FROM sysobjects
WHERE xtype = 'U' AND
name = '{알고자하는테이블명}' 

또는 

SELECT Count(*)
FROM sysobjects
WHERE xtype = 'U' AND
name = '{알고자하는테이블명}' 

을 지정하셔서 건수가 0건이면 없는것이며, 1건이면 존재하는 방식으로 체크하는 방안이 있습니다.

위 의 시스템DB를 뒤져서 체크하는 방안이 제일 안전한 방안이며, 통상 MSSQL을 사용하고 있는 기업중 대부분의 프로젝트상에서 위방식이 가장 안전한 방식이며, 단점은 DB Query를 해야하기때문에 네트워크 트래픽부분상 시간소모가 된다는 점입니다.( 약 0.001초 이내 )




Posted by SB패밀리

[php] 파일 관련 함수



fopen - 파일을 오픈 함 
file_exists - 파일이 존재 하는지 검사 
fileperms - 파일의 퍼미션을 구함 
filemtime - 파일의 마지막 수정 시간을 구함 
fileatime - 파일의 마지막 접근 시간을 구함 
filesize - 파일의 크기를 구함 
stat - 파일 정보를 가져옴 [1]

*************************************************

저장될 변수 = fopen ("파일명", "모드");

r
읽기전용
파일의 시작 위치
r+
읽기, 쓰기
파일의 시작 위치
w
쓰기전용, 파일이 없으면 새로 생성, 기존의 내용 삭제
파일의 시작 위치
w+
읽기, 쓰기, 파일이 없으면 새로 생성, 기존의 내용 삭제
파일의 시작 위치
a
쓰기전용, 파일이 없으면 새로 생성
파일의 마지막 위치
a+
읽기, 쓰기, 파일이 없으면 새로 생성
파일의 마지막 위치


$fp = fopen ("test.txt", "w"); // 현재 서버의 test.txt파일을 쓰기 전용으로 열기
$fp = fopen ("http://navyism.com", "r"); // http://navyism.com의 index를 읽기 전용으로 열기
$fp = fopen ("ftp://id@pass:navyism.com", "r"); // ftp://navyism.com을 읽기 전용으로 열기


++++++++++++++++++++++++++++++++++++++++++

file_exists함수는 어떤 파일이 존재 하는지를 알아보는 함수로, 존재 하는 파일일 경우에는 TRUE를 리턴하고 존재 하지 않을 경우에는 FALSE를 리턴한다.

file_exists ("파일이름");

예)
<?
echo file_exists ("test.txt");
?>

+++++++++++++++++++++++++++++++++++++

fileperms ("파일이름");

<?
$perms = fileperms ("test.txt");
echo base_convert ($perms, 10, 8);
?>


++++++++++++++++++++++++++++++++++++

filemtime ("파일이름");

filemtime함수는유닉스 타임 스탬프 형식으로 시간을 리턴하므로 date함수와 같이 사용해야 한다.

예)
<?
echo date ('Y-m-d H:i:s', filemtime ("test.txt"));
?>


++++++++++++++++++++++++++++++++++++++++

fileatime ("파일이름");

fileatime함수는 유닉스 타임 스탬프 형식으로 시간을 리턴하므로 date함수와 같이 사용해야 한다.

예)
<?
echo date ('Y-m-d H:i:s', fileatime ("test.txt"));
?>

+++++++++++++++++++++++++++++++++++

filesize ("파일이름");

예)
<?
echo filesize ("test.txt");
?>

     
++++++++++++++++++++++++++++++++++++++++

저장될 배열 = stat ("파일이름");

<?
$file = stat ("test.txt");
echo "
파일 크기 : $file[7] <br>
마지막 접근시간 : $file[8] <br>
마지막 수정시간 : $file[9]
";
?>





Posted by SB패밀리