CSharp2014.05.19 18:04




오랜 시간을 Log4net을 사용하였지만 항상 아쉬운 점이 있었는데, 상속을 사용한 구조를 만들 때 Base class에 Logger를 한번만 지정하고 파생 클래스에서는 다른 정의 없이 바로 사용하는 것이었습니다.

하지만 이런 구조에서의 문제는 로그가 발생했을 때 이것을 발생시킨 클래스를 알기가 쉽지 않았습니다. 그런데 다른 별도의 방법이 존재하는 군요.

App.config



  
    

 

Child.cs

using log4net;
namespace LogTest
{
    public class Child : Parent
    {
        protected static readonly ILog childlog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public Child()
        {
            //childlog.Info("Child constructed!");
            parentlog.Info("Child constructed -- By ParentLog");
            GrandFatherLog.Info("Child Constructed!-- By GrandFatherLog");
        }
    }
}

 

Parent.cs

using log4net;
using System.Diagnostics;
using System.Reflection;
namespace LogTest
{
    public class Parent : GrandFather
    {
        public Parent() 
        {
            parentlog.Info("Parent constructed!");
            GrandFatherLog.Info("Parent Constructed!-- By GrandFatherLog");
        }
        public static ILog parentlog
        {
            get
            {
                StackFrame sf = new StackFrame(1, false);
                MethodBase methodBase = sf.GetMethod();
                return LogManager.GetLogger(methodBase.DeclaringType);
            }
        }
    }
}

 

GrandFather.cs

using log4net;
using System.Diagnostics;
using System.Reflection;
namespace LogTest
{
    public class GrandFather
    {
        public GrandFather()
        {
            GrandFatherLog.Info("GrandFather Constructed!");
        }
        public static ILog GrandFatherLog
        {
            get
            {
                StackFrame sf = new StackFrame(1, false);
                MethodBase methodBase = sf.GetMethod();
                return LogManager.GetLogger(methodBase.DeclaringType);
            }
        }
    }
}

 

Program.cs

using log4net;
using System;
namespace LogTest
{
    class Program
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Test Start!");
            Child newChild = new Child();
            Console.ReadKey();
        }
    }
}

 





Posted by 금붕어70
Office2014.05.18 08:00




OS에 내장된 TTS를 엑셀에서 어떻게 사용할 수 있을까 고민하며 구글링을 해보니 정말로 의외의 자료들이 나왔습니다.

엑셀 객체에서 바로 TTS를 호출하여 작동하는 군요.

VBA 코드는 다음과 같습니다.

 

Sub SayHello()
    
    On Error GoTo handler
    Application.Speech.Speak ("Hello")
    
handler:
    If Err.Number = 1004 Then
        MsgBox "This macro requires Text to Speech to be installed."
    End If
End Sub
조금 더 응용을 해보면 바코드 스캐너로 창고에 있는 제품을 스캔하여 목록에 있는지 확인하고자 할때, Lookup 함수를 만들어서 연결하면 재미있을 것 같습니다.

 

Sub SayFoundIt(ByVal strFound As String)
    
    On Error GoTo handler
    
    'Application.Speech.Speak "Found, " + strFound, True
    Application.Speech.Speak strFound + "를 찾았습니다", True
    
    
handler:
    If Err.Number = 1004 Then
        MsgBox "This macro requires Text to Speech to be installed."
    End If
End Sub
        

Function MyLookup(ByVal rng As Range, ByVal strF As String)
Dim C As Range
Dim strFound As String

Set C = rng.Find(strF, Lookat:=xlWhole)
If Not C Is Nothing Then

        
    strFound = C.Offset(0, 0).Value
    
    MyLookup = strFound
    SayFoundIt strFound
    
Else
    MyLookup = ""
End If

End Function
MS Power Point에서 슬라이트 프리젠테이션의 설명을 아나운서가 할수도 있습니다.(http://support.microsoft.com/kb/287120/ko)

 

 

Sub demoTTS()
    
    'Declare and create an Excel object.
    Dim XL As Excel.Application
    Set XL = CreateObject("Excel.Application")
    
    ActivePresentation.SlideShowSettings.Run
 
    With SlideShowWindows(1).View
        'The following is said on the first slide:
        XL.Speech.Speak "Welcome to my presentation."
        'Change to slide 2, and then say the following two sentences:
        .Next
        XL.Speech.Speak "This is an example of how to create an Excel Application object."
        XL.Speech.Speak "We can use Excel's object model to invoke Text to Speech."
        
        'Close the Excel object and set the object to nothing.
        XL.Quit
        Set XL = Nothing
        
        'Exit the slideshow.
        .Exit
    End With
    
End Sub

'Office' 카테고리의 다른 글

[Excel]엑셀 객체를 이용한 TTS(Text-To-Speech) 구현  (0) 2014.05.18




Posted by 금붕어70
Database/MS SQL Server2014.05.16 09:04




SQL Server 에서 Tree 구조형 자료의 처리에 대해서 정리 합니다.

1. Tree 구조로 가져오는 기본형
2. 보모의 이름도 같이 가져오는 구조
3. 속성 정보를 사용한 추가 정보 설정 방법
4. 지정된 노드의 모든 부모들을 가져오는 방법
5. 지정된 노드의 최상위 보모를 가져오는 방법

 

USE tempdb;
GO

IF OBJECT_ID('dbo.tree') IS NOT NULL DROP TABLE dbo.tree
GO

CREATE TABLE dbo.tree
(
    ID INT PRIMARY KEY,
    name VARCHAR(32),
    ParentID INT FOREIGN KEY REFERENCES dbo.tree(ID)
);

INSERT dbo.tree 
SELECT 1, 'grandpa', NULL
UNION ALL SELECT 2, 'dad', 1
UNION ALL SELECT 3, 'me', 2
UNION ALL SELECT 4, 'mom', 1
UNION ALL SELECT 5, 'grandma', NULL;
GO

-- Tree 기본형
WITH cte AS
(
    -- anchor:
    SELECT ID, name, ParentID, [level] = 0
    FROM dbo.tree WHERE ParentID IS NULL
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = cte.[level] + 1
    FROM cte INNER JOIN dbo.tree AS t
    ON t.ParentID = cte.ID
)
SELECT ID, name, ParentID, [level] 
FROM cte
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO

-- Tree : 부모 이름도 가져오기...
WITH cte AS
(
    -- anchor:
    SELECT ID, name, ParentID, name parentName, [level] = 0
    FROM dbo.tree WHERE ParentID IS NULL
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, cte.name parentName, [level] = cte.[level] + 1
    FROM cte INNER JOIN dbo.tree AS t
    ON t.ParentID = cte.ID
)
SELECT ID, name, ParentID, parentName, [level] 
FROM cte
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO

-- Tree : 추가 정보 설정
WITH cte AS
(
    -- anchor:
    SELECT ID, name, ParentID, [level] = 0
    FROM dbo.tree WHERE ParentID IS NULL
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = cte.[level] + 1
    FROM cte 
	INNER JOIN dbo.tree AS t ON t.ParentID = cte.ID
)
SELECT distinct cteA.ID, cteA.name, cteA.ParentID, cteA.[level], CASE WHEN cteB.ParentID is not null THEN 'Folder' ELSE 'Node' END
FROM cte cteA
LEFT JOIN cte as cteB ON cteA.ID=cteB.ParentID
ORDER BY [level]
OPTION (MAXRECURSION 32)
GO


-- Tree : 지정된 노드에 대한  부모들의 정보를 가져오기
WITH cte AS
(
    -- anchor:
    SELECT ID, name, ParentID,  [level] = 0
    FROM dbo.tree WHERE ID = 3
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = cte.[level] + 1
    FROM cte INNER JOIN dbo.tree AS t
    ON t.ID = cte.ParentID
)
SELECT ID, name, ParentID, [level] 
FROM cte
ORDER BY [level]
OPTION (MAXRECURSION 32);
GO

-- Tree : 지정된 노드에 대한 최상위 부모의 정보를 가져오기
WITH cte AS
(
    -- anchor:
    SELECT ID, name, ParentID,  [level] = 0
    FROM dbo.tree WHERE ID = 3
    UNION ALL
    -- recursive:
    SELECT t.ID, t.name, t.ParentID, [level] = cte.[level] + 1
    FROM cte INNER JOIN dbo.tree AS t
    ON t.ID = cte.ParentID
)
SELECT cteA.ID, cteA.name, cteA.ParentID, cteA.[level] 
FROM cte cteA
WHERE cteA.level = (SELECT MAX(level) from cte)
OPTION (MAXRECURSION 32);
GO




Posted by 금붕어70