C# 2007/01/13 13:11

파일 카피 프로그램..

바이너리 형태로 파일을 읽어 들여 복사하는 프로그램이다. 카피 할때 스레드를 이용해서 복사를 하였고, 닷넷에서 지원해 주는 카피 매서드는 이용하지 않고 구현해 보았다.

using System;
using System.IO;
using System.Text;
using System.Threading;
public class BCopy
{
private string originalFile;
private string copyFile;
private FileStream rs = null;
private FileStream ws = null;
private long fileSize = 0;
public BCopy(string ofile,string cfile)
{
 this.originalFile = ofile;
 this.copyFile = cfile;
 try
 {
  this.rs = File.OpenRead(this.originalFile);
  this.ws = new FileStream(this.copyFile,FileMode.Create);
 }
 catch (Exception e)
 {
  Console.WriteLine(e.Message);
 }
}
~BCopy()
{
 rs.Close();
 ws.Close();
}
public void Copy()
{
 try
 {
  byte[] b = new byte[1024];
  int count = 0;
  while( (count = rs.Read(b,0,b.Length)) > 0)
  {
   ws.Write(b,0,count);
   this.fileSize += count;
  }
 }
 catch (Exception e)
 {
  Console.WriteLine(e.Message);
 }
 finally
 {
  Console.WriteLine("File size : " + this.fileSize);
 }
}
public static void Main(string[] args)
{
 if( args.Length != 2)
 {
  Console.WriteLine("Usang Args : app <orginal Filename> <copy Filename>");
  return;
 }
 try
 {
  BCopy fileCopy = new BCopy(args[0],args[1]);
  Thread copyThread = new Thread(new ThreadStart(fileCopy.Copy));
  copyThread.Start();
 }
 catch (Exception e)
 {
  Console.WriteLine(e.Message);
 }
}
}



솔직히 별로 한것은 없고 읽은것을 쓰는데 하는것을 좀 오래 찾았아 ㅡ.ㅡ;

MySql OleDb 를 사용하여 데이터 베이스에 데이터를 넣는 간단한 프로그램을 작성하였다.

using System;
using System.Data;
using System.Data.OleDb;
public class App
{
public static void Main()
{
string conStr = "Provider=MySQLProv;Data Source=csharp;" +
     "Location=localhost;User Id=root;Password=apmsetup";
string insert = "Insert into Address values(1,'김병수','서울')";
OleDbConnection conn = new OleDbConnection(conStr);
conn.Open();
OleDbCommand insertComm = new OleDbCommand(insert,conn);
insertComm.ExecuteNonQuery();
conn.Close();
}
}



위와 같은 프로그램을 작성 하고, 컴파일을 하였다. 아무 에러 없이 컴파일이 되었고 실행을 시켜 보니 다음과 같은 에러가 발생 했다.

처리되지 않은 예외: System.Data.OleDb.OleDbException: 오류 메시지 없이 'MySQLPro
v'이(가) 실패했습니다(결과 코드: E_FAIL(0x80004005)).
  위치: System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBP
ARAMS dbParams, Object& executeResult)
  위치: System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult
)
  위치: System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior,
Object& executeResult)
  위치: System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior be
havior, String method)
  위치: System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
  위치: App.Main()



일단 에러가 처리 되어서 무슨 에러인지 위의 메세지를 봤을때 잘몰르겠다. ^^;; 심각히 고민해 보다가 쿼리문에 잘못이 있나 하여서 한번 쿼리 문을 직접 sql문에다 실행을 시켜 보았는데 이게 왠걸 입력이 잘된다....

그렇다면 무슨 문제가 있는것이라는 얘기인데 이리 저리 궁리해 보다가 문제점을 찾았다. 소스를 아래와 같이 수정 하였다.

using System;
using System.Data;
using System.Data.OleDb;
public class App
{
public static void Main()
{
 string conStr = "Provider=MySQLProv;Data Source=csharp;" +
     "Location=localhost;User Id=root;Password=apmsetup";
 string insert = "Insert into Address values(1,'KimByoungSoo','Seoul')";
 OleDbConnection conn = new OleDbConnection(conStr);
 conn.Open();
 OleDbCommand insertComm = new OleDbCommand(insert,conn);
 insertComm.ExecuteNonQuery();
 conn.Close();
}
}



위와 같이 입력을 하고 실행을 시켜 보니 아무런 예외 처리가 나오지 않았고 sql을 검색 해보니 잘 들어가 있었다.

mysql> select * from address;
+------+--------------+--------+
| id      | name              | addr   |
+------+--------------+--------+
|    1    | 김삿갓             | 서울시 |
| NULL | NULL              | NULL   |
| NULL | NULL              | NULL   |
| NULL | NULL              | NULL   |
|    1    | 1                    | 1      |
| NULL | NULL              | NULL   |
|    1    | KimByoungSoo | Seoul  |
|    1    | KimByoungSoo | Seoul  |
+------+--------------+--------+
8 rows in set (0.00 sec)



그렇다면 문제점은 한글전송시 문제가 발생한다는 것이다. 음.. 이것을 해결할 방법은..... 찾아 봐야 겠다.

C# 2007/01/09 11:40

XML 정보 읽기

XML 관련 클래스를 가지고 본 블로그의 RSS의 데이터를 한번 읽어 보기 위해 시도 해보았다. XML의 두가지 형태 접근으로 순차 접근과 트리 접근이 있다. 그 방식중 일단 순차적으로 한번 읽어 보았다.

using System;
using System.Xml;
public class App
{
public static void Main()
{
XmlTextReader tr = new XmlTextReader("http://hahakbs.dothost.co.kr/rss");
while(tr.Read())
{
  if(tr.NodeType == XmlNodeType.Text)
   Console.WriteLine(tr.Value);
}
tr.Close();
}
}



위와 같은 소스로 병수 블로그의 RSS를 읽어 보았다 결과는 성공 결과물은 너무 길어서 생략 하겠슴..

그렇다면 트리형식의 접근 방법인 DOM 방식의 클래스 XMLDocument을 사용하여 한번 접근 해보았다.

using System;
using System.IO;
using System.Xml;
public class App
{
public static void Main()
{
XmlTextReader tr = new XmlTextReader("http://hahakbs.dothost.co.kr/rss");

XmlDocument xdoc = new XmlDocument();
xdoc.Load(tr);
DisplayTree(xdoc.DocumentElement);
tr.Close();
}
public static void DisplayTree(XmlNode node)
{
if(!node.HasChildNodes)
  Console.WriteLine(node.Value);
else
  Console.WriteLine("<" + node.Name + ">");
if(node.HasChildNodes)
{
  node = node.FirstChild;
  while(node != null)
  {
   DisplayTree(node);
   node = node.NextSibling;
  }
}
}
}



접근이 잘되었다. 위의 방법도 결과가 너무 길어 생략. 각 노드들을 보여 줄때는 재귀적인 방법으로 접근하여 모든 노드들을 접근하였다.  접근이 잘 되었다.

그렇다면 이번에는 검색해서 그 검색 결과를 한번 표현해 보겠다.

using System;
using System.Xml;
using System.Xml.XPath;
public class App
{
public static void Main()
{
XPathDocument doc = new XPathDocument("http://hahakbs.dothost.co.kr/rss");
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator iter = nav.Select("rss/channel/item/title");
while(iter.MoveNext())
  Console.WriteLine(iter.Current.Value);
}
}



결과

XML 이란..
Aspect Oriented Programming
Delegate를 함수의 매개변수로 넘기기
Visual Studio 사용하지 않고 Winform 만들기
애트리뷰트(Attribute)들.
catch 블럭과 finally 블럭 안에서의 예외처리는?
2006년 내머리속에는..
인덱서(Indexer)
오버라이딩의 두가지 방법
internal과 protected internal



위의 소스는 블로그의 타이틀만을 검색해서 검색결과를 출력해주는 간단한 프로그램을 작성 하였다. 검색은 이와 다른 매치 기능등이 있는데 그것들은 귀찮아서 생략 ^^;;

Programing 2007/01/08 16:36

XML 이란..

XML(eXtensible Markup Language)이란?

◈구조(Structure), 데이터(Data) 그리고 표현(Description)이 분리된 데이터 정의를 위한 언어

XML(eXtensible Markup Language)의 구성
◈구조(Structure) : DTD(Document Type Definition)
◈데이터(Data) : DTD에 의해서 트리형태의 XML 문서로 표현된다.
XSL (eXtensible Stylesheet Language) : 데이터를 표현하기 위한 방법을 제공한다.

User inserted image

▣XML의 주목적?

◈표준 데이터 교환에 있다.

▣그렇다면 XML문서를 프로그램적으로 이용하고자 할 때는 XML 문서를 핸들 하기 위한 두가지 방법이 있다.

◈DOM(Document Object Model)
◈SAX(Simple API for XML)

▣두가지 방법의 차이점은 DOM 방식은 XML의 저장된 형식인 tree 구조로 데이터를  핸들 하는 방법이고, SAX는 순차적인 스트림 방식이다.
오늘 좋은 세미나를 들었다. 절때 잊기 전에 정리 해두어야 한다. 정리 해서 내껏으로 만들놓아야 된다. ㅋㅋㅋ 그래야만 오늘 시간을 날리지 않게 될것이니깐.

Aspect Oriented Programming (관점 지향적 프로그램)

위에 놈은 무엇인가? 예를 들어 보자.

public class NetWorkClass : TCPProtocol
{
  public void SendMessage()
  {
       // Good Send Logic!!!
  }
}



위와 같은 클래스는 TCP 메세지를 전송하는데 있어서 완벽한 로직 제공 했고, 그것을 수행하는데 전혀 문제 없는 클래스이다. 한마디로 완벽하다고 할수 있다.

그런데 위 클래스를 사용하는 프로그램을 사용하다가 사용자가 이렇게 요구 할수도 있을 것이다. 메세지를 전송할때 로그를 남겨주세요. 그렇다면 우리는 다음과 같이 소스를 수정할 것이다.

public class NetWorkClass : TCPProtocol
{
  public void SendMessage()
  {
       LogClass log = new LogClass();
       // Good Send Logic!!!
       log.Write(message);
  }
}



첫번째 프로그램이 다음과 같이 수정되었다. 위와 같이 수정된 프로그램을 사용하다가 또 사용자가 메세지를 암호화 해서 보내게 해달라고 했을경우 또 다음과 같이 수정을 하게 될것이다.

public class NetWorkClass : TCPProtocol
{
  public void SendMessage()
  {
       LogClass log = new LogClass();
       SecurityClass sc = new SecurityClass();
       sc.Set(true);
       // Good Send Logic!!!
       sc.Set(false);
       log.Write(message);
  }
}



위와 같이 또 수정 될것이다. 그런데 이와 같은 요구가 계속 늘어나게 된다면 소스 코드가 계속 늘어 나게 되고 복잡해 지고, 엉키고 그렇게 된다. 그리고 원래의 클래스는 아주 이상적으나 후에 엉키게 되는 소스를 보고 사람들은 잘못된 프로그램이라고 말들이 많을 것이다.본래의 의도와는 상관 없이....

이런것을 해결하기 위해서 나온것이 Aspect Oriented Programming (관점 지향적 프로그램) 이다. 다음 소스를 보자.

public class NetWorkClass : TCPProtocol
{
  [Log]
  [Security]
  public void SendMessage()
  {
       // Good Send Logic!!!
  }
}



위와 같이 보내려는 메서드는 그대로이다. 원래의 메서드는 전혀 건들 필요 없이 추가하려는 기능들을 Attribute 로 포함 하여 필요한 기능들을 포함하고 나중에 기능이 필요 없을때에는 Attribute를 빼고 하면 처음보다 엉키지도 않고 알아보기도 쉽고 좋은 프로그램이 될것이다. 이렇게 하는것 이러한 개념이 Aspect Oriented Programming:관점 지향적 프로그램이다.


User inserted image

위의 그림과 같이 메세지를 보내는 기능은 그대로 이고 속성들을 추가하고 바꿀것은 바꾸고 이런것이다.
2007/01/05 22:35

자쿰 투구 득 ^^

User inserted image

메이플 스토리를 하는 사람이라면 누구나 먹고 싶은 투구 저 사기성 스텟치에 매료되지 않을수 없다. ^^ 메이플 한지 한 1년 됐나? 오늘 드디어 자투 먹었다. 옵이 조금은 구리다. 원래 옵이 15,15,15,15, 150,150, 20,20 이여야 보통이다 한개도 수치를 넘긴건 없다 ㅡ.ㅡ; 그래도 먹은게 어디냐 ㅋㅋ ^^ 좋다.

div>