August 27, 2009

유럽여행 그리고 작은 이야기

 

예전에 유럽여행을 친한친구 경환이와 간적이 있었다. 달랑 왕복 비행기표만 사가지고 갔었던 것이다. 보통 사람들은 가기 한달전부터 계획을 짜고 그러지만 우린 완전 무계획 이였다. 주위의 걱정과는 다르게 여행은 참으로 다이나믹했다. '오늘은 뭐할까?' 로 하루를 시작하게된다. 진정한 자유여행이였던것이었다. 지금 생각해도 정말 자유로웠던거 같다. 여행하면서 만났던 사람들도 부러워 할정도 였으니 , 그 사람들은 자신들은 기차예약시간 비행기예약시간에 쫓긴다고 이야기 했었다.

 

MSP(Microsoft Student Partners)를 하면서 최근 우리 팀의 새로운 팀원으로 한명의 친구가 들어왔다. 아마도 "Paris" 에 빠져 있는듯하다. 덕분에 나또한 예전 추억을 떠올릴 수 있는 기회가 되었다. 예전사진들을 보면서 녹화한 동영상을 보며 웃으면서 시간을 보내고 있으니 ... 역시 여행이구나 라는 생각이 든다.

 

다시 가고싶다...

 

(동영상은 세느강의 바토무슈에서 Eiffel Tower 의 야경을 찍은것으로 밤 10, 11, 12시에 발광(?)하는 장면입니다ㅋ)

August 24, 2009

C# and Excel (reading)

이전 포스트 였던 C#을 이용한 엑셀(쓰기) C# and Excel (writing) 에서 이 번 포스팅 에서는 엑셀(읽기)를 해보겠습니다.

이전 포스트와 같은 환경 Microsoft Visual Studio 2008 + Microsoft Office Excel 2007 이며 처음 참조추가 하는 부분은 같습니다. 혹시 이 글을 처음 보신다면 이전 글을 먼저 확인해 보세요^^.

 

역시 이번 포스팅도 상당히 간단하게 끝납니다. 역시 사용법을 몰랐을 뿐이죠…

string conStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\sample.xlsx;Extended Properties=""Excel 12.0;HDR=YES;""";
OleDbConnection excelConnection = new OleDbConnection(conStr);
excelConnection.Open();

string strSQL = "SELECT * FROM [Sheet1$]";
OleDbCommand dbCommand = new OleDbCommand(strSQL, excelConnection);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(dbCommand);

DataTable dTable = new DataTable();
dataAdapter.Fill(dTable);

dataGridView_excel_data.DataSource = dTable;

// dispose used objects
dTable.Dispose();
dataAdapter.Dispose();
dbCommand.Dispose();

excelConnection.Close();
excelConnection.Dispose();


1번째 줄에서는

Provider=Microsoft.ACE.OLEDB.12.0; 오피스 버전에 영향을 받습니다.
Data Source=c:\sample.xlsx; 파일경로 입니다.
Extended Properties="Excel 12.0;HDR=YES"; 엑셀을 가르키며, HDR 은 엑셀 데이터의 첫번째 row 를 columnname 으로 지정할지 하지 않을지 결정하게됩니다. YES 는 지정입니다.

2~11번째는 OleDb 커넥,명령 등입니다.

12번째 줄은 폼에서 생성한 DataGridView에 DataSource로 dTable 을 지정하는 부분입니다. 이부분을 지나게 되면 폼에서 DataGridView에 내용이 채워지게 됩니다.

14~20번째는 OleDb 커넥 종료와 Objects 들을 Dispose 하게 됩니다.

 

1번째 줄의 HDR=YES or NO 를 통해 어떻게 바뀌는지 확인해 보겠습니다.

우선 Excel File 윈 원본 데이터를 먼저 보겠습니다.

 

HDR=YES 로 설정한 경우는 아래와 같이 DataGridView 에 컬럼 제목으로 들어가게 됩니다.

 

반면 HDR=NO 로 설정하게 되면 컬럼명은 기본 셋팅값으로 바뀌고 원하던 바로 되지 않고 제목까지 데이터 쪽으로 내려가 버립니다.

 

이제부터는 원하는 부분을 읽어보도록 하겠습니다. (DataGridView 내용에서)

 

//DataGridView 에서 Rows 를 얻어옵니다.
DataGridViewRowCollection rowCollection = dataGridView_excel_data.Rows;
string getStr = rowCollection[1].Cells[3].Value.ToString();

 

row는 열을 가리키며 가로줄 입니다. 1줄에서 데이터그리드로 부터 Rows 를 얻어와 컬렉션에 집어 넣습니다. 이렇게 되면 rowCollection 을 통해 내용을 얻어 올 수 있습니다. 그리하여 다음줄에 인덱스연산을 통해 원하는 부분의 Value 를 얻어 올 수 있습니다.

 

어때요 참 쉽죠?ㅋ

 

또 한번의 간단한 포스팅이 끝났네요^^ㅎ 다음 포스팅에서는 인쇄 작업을 해보겠습니다.

 

 

 

 

 

August 18, 2009

C# and Excel (writing)

안녕하세요 LiveDK 입니다.

이번에 포스트 에서는 닷넷을 통해 엑셀화일을 만들어 보겠습니다.

우선 이번 프로젝트를 만들기위해서 제가 사용하는 프로그램은 다음과 같습니다.

Microsoft Visual Studio 2008 + Microsoft Office Excel 2007

 

처음으로, 윈폼을 하나 생성합니다. 참조추가 를 눌러 COM 탭을 눌러 Microsoft Excel 12.0 Object Library 를 선택하고 확인을 누릅니다.(여기서 저는 Office Excel 2007을 사용하기 때문에 12.0 버전이 나오게 되었습니다.)

 

 

다음으로 코드로 넘어와서 using 을 추가해주어야 합니다. (using 쪽에 아래 코드처럼 대입연산을 통해 하는 과정은 이번에 처음 배웠네요^^)

using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

이제 디자인으로 넘어와 버튼을 하나 추가하고 더블클릭을 통해 버튼 이벤트를 하나만듭니다. 버튼이 눌렀을경우 다음 코드를 실행하게 해보겠습니다.

Excel.Application xls;
Excel._Workbook wbook;
Excel._Worksheet wSheet;
try
{
   xls = new Excel.Application();

   wbook = (Excel._Workbook)(xls.Workbooks.Add(Missing.Value));
   wSheet = (Excel._Worksheet)wbook.ActiveSheet;

   wSheet.Cells[1, 1] = "Name";
   wSheet.Cells[1, 2] = "Location";

   string[,] saNames = new string[2, 2];

   saNames[0, 0] = "DKLEE";
   saNames[0, 1] = "Asan";
   saNames[1, 0] = "JHKWON";
   saNames[1, 1] = "Seoul";
                                
   wSheet.get_Range("A2", "B3").Value2 = saNames;
                                               
   xls.Visible = true;
   xls.UserControl = true;
}
catch (System.Exception ex)
{
   MessageBox.Show(ex.ToString());
}

 

내용은 다음과 같습니다. 엑셀 Application 을 하나 생성하고 Workbook , Worksheet 을 만들고 그곳에 데이터를 넣는 코드 입니다.  뭐든지 그렇듯이(?) 알기전까진 어렵지만 알고나면 참간단하다고 느끼내요^^

사실 기능이 너무 많이 있지만 간단하게 데이터를 넣는 부분만 해보았습니다.

너무간단히 포스팅이 끝나서 죄송한 마음이네요.

 

참고한 항목으로는 MSDN 입니다. 이곳을 가시면 더 자세한 내용을 확인해 볼 수 있습니다. 계산 그리고 그래프까지 가능하네요^^

C# 한글,영어 문자열 길이 알아보기

훈스닷넷(hoons.kr) 에서 Q&A 게시판을 보다가 한글과 영문길이 체크라는 글을보고 괜찮은 팁이라 생각해서 다시정리하게 되었습니다.

 

질문의 내용은...(원문)

윈폼에서 텍스트박스의 입력된 문자열의 길이를 체크하여 메시지를 띄워주는것입니다.

만약 DB에서 컬럼이 VarChar(10) 일경우 영문은 10자, 한글은 5자 밖에 입력이 되어야하는데...

 

따라서 문자열의 길이를 체크하여 메시지를 띄워주면 문제는 해결되지요

하지만 텍스트박스에 입력된 문자열이 영문인지 한글인지 특수문자인지 알 수 없기때문에

바이트단위로 문자열을 세야 합니다.

 

//영문 10자
string str_e = "abcdefghij";
//한글 5자
string str_k = "가나다라마";

int e, k;
e = str_e.Length;
k = str_k.Length;
//글자의 길이 출력
Console.WriteLine("E:{0} K:{1}", e, k);

e = Encoding.Default.GetByteCount(str_e);
k = Encoding.Default.GetByteCount(str_k);
//바이트단위 길이 출력
Console.WriteLine("E:{0} K:{1}", e, k);

 

 

 

결과는 위와 같습니다. 단순히 Length 를 쓴다면 우리 눈으로 보는 글자수를 출력해 주게됩니다. 하지만 적용해야될 환경의 단위와 다를때는  Encoding.Default.GetByteCount 요놈을 사용하여 글자수를 맞춰줘야 하겠습니다.

 

 

August 10, 2009

기술 트렌드 리포트 #1 - Zune & XNA

Zune & XNA

 

요즘 점점 Zune 에대해서 관심이 쏠리는거 같습니다. 가끔 요즘 뉴스를 보면 마이크로소프트(MS)가 만든 ZuneHD가 올 가을에 출시될 예정이라는 소식을 전해 들을 수 있습니다. ZuneHD 는 touchscreen, wi-fi, web browser 등의 기능을 갖추고 있는 멀티미디어 장치(휴대용) 입니다.

 

   (아래 사진은 ZuneHD)

 

Zune 이란?

 

Microsoft 에서 만든 멀티미디어 플레이어 입니다. 음악, 동영상, 라디오 는 물론 XNA 로 만든 game까지 넣어 사용 할 수 있고, wi-fi 를 통한 sync 기능을 통해 사용자끼리 공유도 가능합니다.

 

여기서 주목할점은 사용자가 자신이 직접 만든 프로그램을 삽입 할 수 있다는 것입니다. XNA Studio 를 통해 게임이나 소프트웨어를 만들수 있으며, 심지어는 Zune 운영체제(?) 실제 작동을 위한 기본 프로그램도 가능합니다.

 

현재까지 Zune 은 2세대 까지(가을에 ZuneHD 출시) 나와있습니다.  아직 한국에서는 아직 Zune 이 정식으로 들어오지 않았습니다. 따라서 실제로 사용을 하기 위해서는 ebay 나 해외 구매 대행 사이트를 통해 구입하여야 합니다. 들리는 소식으로는 ZuneHD 는 전세계 출시라고 하네요^^

 

 저도 최근 MP3 Player 가 고장나서 Zune 2세대를 ebay 를 통해 구입하였습니다. 배송에만 거의 2주가 걸리더군요...(가격은 십만원대 초중반 입니다. 기능에 비하면 상당히 저렴하다고 봅니다.)

 

저는 왼쪽에 있는 4G 짜리를 구입하였으며 이 제품은 플래시 메모리를 사용합니다. 우측에는 사이즈가 약간 더 크며 내장 HDD 를 사용한다고 합니다. 그리고 가운데 버튼은 터치방식입니다. Zune 또한 iPod의 iTunes 처럼 Zune Software 가 있으며 이 프로그램을 통해 컴퓨터와 Sync 하게 됩니다. 제가 Zune 을 구입한 이유는 물론 멀티미디어를 움직이면서 즐기기 위해서 이지만 가장 큰 이유는 바로 XNA 를 통해 직접 프로그래밍이 가능하다는 점입니다.

 

지금부터는 XNA 와 Zune 에 대해서 알아 보겠습니다.

 

우선 개발을 하기위해서는 개발 툴(Visual Studio 2008) 과 XNA Game Studio 가 설치되어야 합니다.

위의 링크를 따라 다운로드 받아 설치를 시작합니다.

 

설치가 완료되면 Visual Studio 를 실행하면 아래와 같이 확인해 볼 수 있습니다.

Zune Game 프로젝트를 하나 만들어 보지요^^

 

프로젝트가 완성되면 매뉴쪽에 장치를 추가할 수 있는 버튼이 생김니다. 만약 Zune 이 연결되어 있다면 아래와 같이 진행하면 장치를 설정 할 수 있습니다. 역시 Xbox 또한 개발 할 수 있습니다.

다음과 같이 저의 Zune 장치가 추가되었습니다.

 

테스트를 위해 간단하게 확인해보겠습니다.

Program.cs 에 추가합니다

static void Main(string[] args)
{
    using (Game1 game = new Game1())
    {
        game.Run();
        if(GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        {
           game.Exit();
        }
    }
}

위의 소스 내용은 Zune 장치의 뒤로가기 버튼을 눌렀을때 프로그램을 종료하는 소스  입니다. (너무 간단한가요?ㅎㅎ) 이제 이 프로젝트를 테스트 해보기위해 Debug 버튼을 누릅니다. 누르는 순간 프로젝트가 Zune 장치로 전송 되며 실제 Debug 가 가능해집니다. (이부분에서 정말 놀랐습니다) 다음은 동영상으로 실제 어떻게 작동 하는지 보시겠습니다.^^

 

 

동영상의 내용은 다음과 같습니다. Debug 모드로 실행을 하면 장치로 소프트웨어가 이식되고 잠시후 파란색 화면이 나오게 됩니다. Run 상태에서 왼쪽 버튼 (Back) 을 누르니 Visual Studio 창에서 Break Point 에 걸린 장면을 볼 수 있습니다. 다시 실행을(F5) 누르니 Zune 이 종료되어 다시 대기모드로 돌아간 것을 볼 수 있습니다.

 

지금은 비록 매우 간단한  Zune 의 모습을 보았지만 앞으로의 그 가능성은 끝이 없다고 봅니다. 빨리 한국에서도 정식 발매되어 많은 사람들이 사용하여 무한한 Zune 능력을 모두 체험해 보았으면 합니다.^^

 

뉴스 기사

MS '준HD' "아이팟터치 3세대 나와라"- ZDNet

아이팟 대항마 MS 준 HD, 아마존 떴다 - betanews

MS '준 HD' 가을 출시..아이팟터치 아성 도전 - 아시아투데이

MS, Zune HD에 엔비디아 Tegra 칩 내장 인정- kbench

 

Blog 검색

Zune HD video hands-on: chock-full of media edition

Hands-on with the Zune HD

August 7, 2009

ACCESS and LINQ

안녕하세요^^

최근 아르바이트로 프로젝트를 진행하던 도중 Access Database 를 사용하게 되었는데 기존 작업은 상당히 노가다성이 강해 .Net 의 Linq 를 통해 좀더 쉽게 Database 에 접근해보고 싶어서 시작하게 되었습니다.우선 작업환경은 .Net Framework 3.5 이상이며 Microsoft Office Access 2007 을 사용하였습니다.

 

우선 테스트를 위해 accdb 파일이 하나 필요 합니다. 아래와 같이 필드명속성을 지정해줍니다.

 

이렇게 accdb 파일을 하나 만들게 됩니다. (player.accdb)

이제는 프로그램을 통해 이 Database 를 가지고 놀아야 할때입니다.^^

 

이제 '콘솔 응용 프로그램'을 하나 생성하게 됩니다.(윈폼등 아무거나 가능)

생성후 참조 추가를 통해 .Net 탭에서 System.Data.Linq 를 추가하고 아래와 같이 추가해주면 됩니다.

using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Data.OleDb;

 

다음으로, 이번 스텁에서 중요한 부분인 클래스를 하나 추가해주는 부분입니다.

[Table(Name = "Player")]
public class Players
{
    [Column(IsPrimaryKey = true, Name = "name")]
     public string name { get; set; }

    [Column(Name = "age")]
     public int age { get; set; }
}

Table(Name="Player") 부분에서 Name 은 실제 accdb 에서 테이블 명을 말하는것이며 각 필드의 명도 소스와 같이 정확하게 적어주면 됩니다. 이부분에서 실수가 발생하게 되면 작동이 안될 수 도 있습니다. 보통 오류가 이부분을 정화하게 정해주지 않으면 발생하는것 같습니다.

 

다음은 accdb 에 있는 내용을 출력해보는 소스를 작성해 보겠습니다.

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\player.accdb");
DataContext dc = new DataContext(con);

Table tst = dc.GetTable();
            
var result = from w in tst select w;

foreach (Players stu in result)
{
    Console.WriteLine("{0} {1}", stu.name, stu.age);
}

첫줄의 Provider=Microsoft.ACE.OLEDB.12.0; 이부분은 Office 2007 을 사용하기 때문에 다음과 같이설정해주었습니다.

 

이제 출력까지 해보았으니 삽입을 해보겠습니다. 삽입은 더욱더 간단하더군요.

Players one = new Players();
one.name = "KOREA";
one.age = 100;
            
tst.InsertOnSubmit(one);
dc.SubmitChanges();

 

 

 

이상으로 LINQ 를 통하여 Access Database (accdb) 출력, 삽입을 마치겠습니다.^^

사실 하면서도 제대로 한건지 의문이 드네요ㅎ

 

앗!! 꼭 참고해야할 사항이 있습니다. 32비트 컴퓨터에선 모르겠지만 제가 사용하는 환경은 64비트 컴퓨터 이여서 처음에 오류때문에 고생을 했었습니다.

64비트 환경에서는 프로젝트 속성에서 플랫폼 대상을 Any CPU 에서 x86 으로 바꿔주셔야합니다.

 

August 6, 2009

Gmail Notifier

저는 이메일로 Gmail 을 주로 사용하고 있습니다.

매번 사이트를 들어가 확인하던것이 귀찮아 검색을 해보니

 Gmail Notifier 란것을 제공했더군요... 저만 몰랐나 봅니다ㅠㅠ

이 간단한 프로그램은 System Tray 에 위치하여 알림기능을 해주는군요

 

1. 기본 상태 입니다.

 

2. 메일이 오게 되면 아래와 같이 알려주게 됩니다.

 

Gmail Notifier

Gmail 을 주로 사용하시는 분은 사용해보세요^^

Timer / Counter (타이머 / 카운터)

Timer / Counter

입력으로 들어오는 펄스가 어디에 존재 하느냐에 따라 다릅니다.
Timer : 클럭의 소스가 MCU 내부에 있는 크리스탈에 의존
Counter : MCU 의 외부핀에 들어오는 펄스로 셈함

Timer / Counter 는 시간과 관련된 기능을 주로하며 시간 지연, 이벤트 카운팅, 펄스 폭 측정, 펄스폭 변조(PWM : Pulse Width Modulation), Input Capture, Output Capture 기능등 다양하게 응용됩니다.

 

MCU 마다 Timer / Counter 갯수는 각각 다르지만 일반적으로 많이 사용하는 ATmega128의 경우는 4개가 존재합니다.

Timer/Counter 0 , Timer/Counter 2 : 8비트

Timer/Counter 1 , Timer/Counter 3 : 16비트

16비트 타이머는 0000H ~ FFFFH 까지 셈을 할 수 있다는것이며 FFFFH -> 0000H 로 넘어가는 순간이 Overflow 가 발생하게 됩니다.