2011. 2. 11. 12:26
DB ConnectionString(DB 연결 문자열)을 xml형식의 config파일에서 저장하여 사용할 경우 
escape 문자를 사용할 경우 제대로 인식하지 못해 오류가 발생한다.
이러한 문자들이 포함된 문자는 아래 형식에 맞게 변환 해줘야 한다.

  Ampersand = & = &
  Greater Than = > = >
  Less Than = < = &lt;
  Apostrophe = ' = &apos;
  Quote = " = &quot;


또는

~~~; Password=<![CDATA[jack&jill]]>; ~~~~~~~

~~~; Password='jack;jill'; ~~~~~~~

~~~; Password="jack;jill"; ~~~~~~~


출처

Posted by CoolDragon
2010. 8. 5. 18:17
1. StackPanel
  - 자식요소가 수평으로(좌에서 우)으로 쌓이거나 위에서 아래로 쌓이게 하는 패널
  - 주요 프로퍼티
[결합속성]
Orientation
  - Vertical : 수직모드
  - Horizontal : 수평모드

2. Canvas
  - Canvas의 offset 값(Top, Left, Right, Bottom 속성값)에 따라 자식요소를 위치를 지정하는  패널
  - 주요 프로퍼티
[결합속성]
Canvas.Top="90"
   - 자식요소가 Canvas의 상단(Top)으로부터 얼마나 떨어질 것인지 설정 
Canvas.Left="90"
   - 자식요소가 Canvas의 왼쪽(Left)으로부터 얼마나 떨어질 것인지 설정
Canvas.Right="90"
   - 자식요소가 Canvas의 오른쪽(Right)으로부터 얼마나 떨어질 것인지 설정
Canvas.Bottom="90"
   - 자식요소가 Canvas의 하단(Bottom)으로부터 얼마나 떨어질 것인지 설정
  - Top, Left, Right, Bottom는 결합(Attach)속성로 자식요소에서 Canvas.Top="10" 형태로 설정한다.
  - 자식요소에 좌표를 지정하면 설정한 위치에 고정된다.
 
3. DockPanel
  - 자식요소의 DockPanel.Dock 결합속성값 설정에 따라서 위치가 결정
  - 주요 프로퍼티
[의존속성]
LastChildFill
   - 마지막 자식요소가 나머지 영역을 채우도록 설정한다. (true/false)
[결합속성]
DockPanel.Dock="Top"
   - 자식요소가 DockPanel의 상단으로 붙인다.
DockPanel.Dock="Left"
   - 자식요소가 DockPanel의 좌측으로 붙인다.
DockPanel.Dock="Right"
   - 자식요소가 DockPanel의 우측으로 붙인다.
DockPanel.Dock="Bottom"
   - 자식요소가 DockPanel의 바닥으로 붙인다.
 - DockPanel.Dock 설정을 하지 않은 자식요소는 DockPanel의 Content 영역, 즉 가운데에 붙인다.
 

4. Grid


5. UniformGrid


6. ViewBox


Posted by CoolDragon
2010. 7. 22. 10:25
WCF 서비스를 REST 방식으로 웹 서비스를 이용하고자 샘플을 만들어 보았으며
아래 샘플소스는 WCF + ASP.NET + jQuery 를 사용하였다.


간단히 HttpModule을 이용하여 URL Rewrite처리를 하여 .svc 의 URL을 주소에서 감추고자 하였다.
(IIS7은 URL Rewrite를 IIS에서 제공해주므로 구현 안하고 설정으로 사용 가능 할듯)
(IIS6은 HttpModule방식과 정규식과 web.config와 같은 설정파일에서 관리)

[실제URL]


참고 URL
1.
[Programming JSON with WCF in .NET Framework 3.5]

2.
[Rob Windsor on WCF with REST, JSON and RSS]

3.
[WCF and JQuery Using JSON]

4.
[Consuming JSON data in .NET with WCF]

5.
[클라이언트 페이지 json요청]
[서버 WCF 서비스  json요청 처리]

6.WCF REST 방식에서 .SVC를 제거하는 방법
Posted by CoolDragon
2010. 7. 21. 18:43
오늘에서야 알았다.

c#에서의 Replace 함수와 javascript의 replace함수는 같은듯 하지만 다르다란 걸 말이다.
그 차이점이 뭐냐하면.. 아래와 같다.

[c#]
string str = "?,?,?,?,?";
str = str.Replace("?", "TEST"); MessageBox.Show(str);
이렇게 하면 결과는 아래와 같이 출력된다.
TEST,TEST,TEST,TEST,TEST
[javascript]
var str = "?,?,?,?,?"; str = str.replace("?", "TEST"); alert(str);
이렇게 하면 결과는 아래와 같이 출력된다.
TEST,?,?,?,?

나 혼자만 몰랐나? 응응?? -_-;;
Posted by CoolDragon
2010. 5. 7. 17:35

관리하는 서버가 많을 경우 손쉽게 서버의 계정 비밀번호를 변경하고 싶을 수 있다.
이런 고민에서 시작해서 만들어 보았다. 
(여러 네트워크 환경에서 확인 해보지 못했고 동일 네트워크 환경에서는 정상적으로 동작하는 것을 확인했다.)

1. 이전 비밀번호를 알고 새 비밀번호로 변경하고자 할 경우
using System.DirectoryServices; // 참조추가를 해야 사용 가능하다.
...
string userPath = string.Format("WinNT://{0}/{1}", TargetServer, UserName);
using (DirectoryEntry userEntry = new DirectoryEntry(userPath))
{
object[] password = new object[] { this.txtOldPw.Text, this.txtNewPw.Text };
object ret = userEntry.Invoke("ChangePassword", password);
userEntry.CommitChanges();
}


2. 이전 비밀번호를 몰라도 새 비밀번호로 리셋하고 싶을 경우
string userPath = string.Format("WinNT://{0}/{1}", TargetServer , UserName);
using (DirectoryEntry userEntry = new DirectoryEntry(userPath))
{
object[] password = new object[] { this.txtNewPw2.Text };
object ret = userEntry.Invoke("SetPassword", password);
userEntry.CommitChanges();
}


참고로 TargetServer는 IP로 접근할 경우 오류가 발생하였고.. 컴퓨터명으로 접근해야 정상적으로 처리가 되었다.
그리고 administrator 계정의 비밀번호도 변경이 가능했다.

샘플

참고

Posted by CoolDragon
2010. 4. 30. 17:27
솔직히 지네릭은 기존에 있는것만 사용했지
내가 만들어 쓴적은 거의(?) 없는 듯 하다.
잘만하면 정말 괜찮은 녀석인데 ㅋㅋ

생각만 잘하면 확장성 있게 쓸 수 있지 않을까 싶다.
    public static T IIF<T>(bool compare, T a, T b)
    {
        return compare ? a : b;
    }
   (위 샘플은 3항 연산자를 써도 될듯 하지만 말이다...ㅋ)
Posted by CoolDragon
2010. 4. 29. 10:07
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNo=8&no=1228&ref=1228
--------------------------------------------------------------------------------------------------

//양력은 음력으로변환 테스트
private void button1_Click(object sender, EventArgs e)
{
    label1.Text =음력변환(2007, 1, 1);
    label2.Text = 음력변환(DateTime.Now);
}

//음력을 양력으로 변환 테스트
private void button2_Click(object sender, EventArgs e)
{
    label2.Text = 양력변환(2006,11,13,false).ToShortDateString();
}

private string 음력변환(DateTime dt)
{
    int n윤월;
    int n음력년, n음력월, n음력일;
    bool b윤달 = false;
    System.Globalization.KoreanLunisolarCalendar 음력 =
new System.Globalization.KoreanLunisolarCalendar();

    n음력년 = 음력.GetYear(dt);
    n음력월 = 음력.GetMonth(dt);
    n음력일 = 음력.GetDayOfMonth(dt);
    if (음력.GetMonthsInYear(n음력년) > 12)             //1년이 12이상이면 윤달이 있음..
    {
b윤달 = 음력.IsLeapMonth(n음력년, n음력월);     //윤월인지
n윤월 = 음력.GetLeapMonth(n음력년);             //년도의 윤달이 몇월인지?
if (n음력월 >= n윤월)                           //달이 윤월보다 같거나 크면 -1을 함 즉 윤8은->9 이기때문
   n음력월--;
    }
    return n음력년.ToString() + "-" + (b윤달 ? "*" : "") + n음력월.ToString() + "-" + n음력일.ToString();
}

private string 음력변환(int n양력년, int n양력월, int n양력일)
{
    DateTime dTemp = new DateTime(n양력년, n양력월, n양력일); //양력
    return 음력변환(dTemp);
}

private DateTime 양력변환(int n음력년, int n음력월, int n음력일, bool b달)
{
    int n윤월;
    System.Globalization.KoreanLunisolarCalendar 음력 =
new System.Globalization.KoreanLunisolarCalendar();

    if (음력.GetMonthsInYear(n음력년) > 12)
    {
n윤월 = 음력.GetLeapMonth(n음력년);
if (b달)
   n음력월++;
if (n음력월 > n윤월)
   n음력월++;
    }
    return 음력.ToDateTime(n음력년, n음력월, n음력일, 0, 0, 0, 0);
}



Posted by CoolDragon
2010. 4. 20. 12:17
공통모듈(컴포넌트)이 개발되면 여러 비지니스 로직에서 사용할 수 있다.

예를 들면 (COM+과 같은) 암호화 컴포넌트가 있는경우
암호화 컴포넌트는 asp, asp.net, sql server 2005(sqlclr을 통하여)에서 동일하게 사용이 가능하다.
성능상 로컬 라이브러리보다는 떨어지겠지만 개발생산성은 클 것이라 생각된다.

이러한 측면에서 SQLCLR은 개발자에게 이러한 것을 제공하며 제작하는 방법을 작성해본다~

1. VS2008 시작
2. 프로젝트 생성 
   C# > 데이터베이스 > SQL Server 프로젝트
3. SP 또는 Function을 개발 후 빌드
public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString Hello(string str)
    {
        // 여기에 코드를 입력합니다.
        return new SqlString("Hello " + str);
    }
};

4. SQL Server에서 어셈블리 등록
  1) clr 권한생성
EXEC sp_configure 'clr enabled' , '1' 
go 
reconfigure; 

  2) 어셈블리 등록
CREATE ASSEMBLY 등록명 FROM '경로\dll명'

  3) 개발 SP 또는 Function 등록
CREATE FUNCTION Hello 
@str NVARCHAR(1000)
RETURNS NVARCHAR(1000)
AS EXTERNAL NAME SqlServerProject1.UserDefinedFunctions.Hello

참고 URL
http://msdn.microsoft.com/en-us/library/ms345135(SQL.90).aspx
Posted by CoolDragon
2010. 4. 19. 16:35

dll 참조를 한다. (설치경로 참조)
 - Common.Logging.dll 1.2.0.0
 - Common.Logging.Log4Net.dll 1.2.0.2
 - log4net.dll 1.2.10.0

logging adaper에는 4가지의 로그를 설정할 수 있다.
 - NoOpLoggerFactoryAdapter : 설정없이 기본으로 사용된다.
 - ConsoleOutLoggerFactoryAdapter : console창에 로그가 나타난다.
 - TraceLoggerFactoryAdapter : System.Diagnostics.Trace for logging output 과 동일하다.
 - Log4NetLoggerFactoryAdapter : 

app.config 파일에서 아래와 같이 설정이 가능하다.

▲ configSection 설정
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler,              Common.Logging" />
    </sectionGroup>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
   ...
</configuration>


▲ Common.Logging.Simple.TraceLoggerFactoryAdapter, Common.Logging 설정방식
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections ...>
   ...
    <common>
      <logging>
        <factoryAdapter type="Common.Logging.Simple.TraceLoggerFactoryAdapter, Common.Logging">
          <arg key="level" value="DEBUG" />
          <arg key="showLogName" value="true" />
          <arg key="showDataTime" value="true" />
          <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff" />
        </factoryAdapter>
      </logging>
    </common>
   ...
</configuration>

▲ Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging 설정방식
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections ...>
   ...
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
        <arg key="level" value="DEBUG" />
        <arg key="showLogName" value="true" />
        <arg key="showDataTime" value="true" />
        <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>
   ...
</configuration>

▲ Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net 설정방식

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections ...>
   ...
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
        <!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
        <!-- otherwise BasicConfigurer.Configure is used   -->
        <!-- log4net configuration file is specified with key configFile-->
        <arg key="configType" value="INLINE" />
      </factoryAdapter>
    </logging>
  </common>
   ...
  <log4net debug="false">
    <root>
      <!-- TRACE, DEBUG, ERROR, FATAL, INFO, WARN -->
      <level value="ERROR"/>
      <appender-ref ref="RollingLogFileAppender_Piggy"/>
    </root>

    <logger name="HelloApp.Program">
      <level value="ERROR" />
    </logger>

    <logger name="Spring">
      <level value="INFO" />
    </logger>

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="Logs\Application.log.txt"/>
      <param name="datePattern" value="MM-dd HH:mm"/>
      <param name="AppendToFile" value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>                         </layout>
    </appender>
    <appender name="HttpTraceAppender" type="log4net.Appender.ASPNetTraceAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
    </appender>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Logs\Log.txt"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="MaximumFileSize" value="5MB"/>
      <param name="RollingStyle" value="Size"/>
      <param name="StaticLogFileName" value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
    </appender>
    <appender name="RollingLogFileAppender_Piggy"                                                      
                    type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Logs\ExceptionLog"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="MaximumFileSize" value="5MB"/>
      <param name="RollingStyle" value="Date"/>
      <param name="StaticLogFileName" value="false"/>
      <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
      </layout>
    </appender>
  </log4net>
   로그를 찍는방법에는 종류는 4가지가 있다.
        - INLINE
        - FILE
        - FILE-WATCH
        - EXTERNAL

▲  c#에서 사용
using Common.Logging;
.......
ILog Log = LogManager.GetLogger(네임스페이스.클래스명);
Log.Debug("Debug");
Log.Fatal("Fatal");
Log.Error("Error");
Log.Info("Info");
Log.Warn("Warn");

참고
Posted by CoolDragon
2010. 4. 19. 11:55
DI를 하기위한 spring.net에서 제공하는 object 기본 생성 방식은 아래같다.
아래와 같은 방법외에 더 있다면 있는데로 추가하도록 하겠다.

▲ dll 참조추가
 - Spring.Core

▲ configSection 설정
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
   ...
</configuration>


▲ object 설정

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections ...>

  <!-- 1. 같은 config 내에서 object 설정-->
  <spring>
    <context>
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
      <object name="name" type="namespace.class_name, assembly_name" singleton="true/false" />
      ...
    </objects>

  <!-- 2. 포함리소스 방식 -->
  <spring>
    <context>
      <resource uri="assembly://Spring.IocQuickStart.MovieFinder/
                         Spring.IocQuickStart.MovieFinder/AppContext.xml"/>
    </context>
  </spring>

  <!-- 3. object 별로 xml 분리하여 설정 -->
  <spring>
    <context>
      <resource uri="~/Config/CommonObjects.xml"/>

      <resource uri="~/Config/Production/Services.xml"/>

      <resource uri="file://%PROGRAMFILES%/myapp/ioc.config" />
    </context>
  </spring>

</configuration>

2번으로 할 경우는 필히 잊지말고 관련파일을 해당프로젝트(assembly)에 포함리소스로 변경해주어야 한다.



1,2,3을 혼용해서 사용이 가능한지 모르겠지만 개인적으로 3번처럼 구성하는게 좋아보인다.


▲ config에서 객체생성
  - 기본객체 생성
  - 프로퍼티 형식으로 객체 주입하여 생성
  - constructor의 생성자에 인자로 객체생성 방법

c#
using Spring.Context;
using Spring.Context.Support;
...
IApplicationContext ctx = ContextRegistry.GetContext();
IHello hello = (IHello)ctx.GetObject("MyHello");  // config의 object의 name과 일치
string result = hello.Say("CoolDragon");
Console.WriteLine(result);


Posted by CoolDragon