잊지 않겠습니다.

이번에 ASP .NET 사이트에서 발표된 Chart control의 경우에는 지금까지 있었던 상용 Chart들을 완전히 뒤집어버릴 수준의 control을 제시하고 있다. 일반 2D Chart에서 3D Chart까지 거의 안되는 Chart가 없을 정도로 많은 표현을 제공하고 있는데, 한 3년전까지만 해도 chart 만드는 것때문에 엄청나게 고생하던 것을 생각하면 참 여러가지로 많은 생각이 들게 된다. (그때 만든 Chart DLL을 생각하면 눈물이 앞을.. T_T)

그런데, 일반 ASP .NET에서는 chart control을 server 객체로 만들어서 사용을 하는데, MVC에서는 서버 Control이 사용되지 않기 때문에 다른 방법으로 사용해줘야지 된다. 내용을 조금 뒤져본 결과, Chart.SaveImage 함수를 이용해서 Temp 파일로 저장하는 방법으로 해결 가능한 것을 알았다. View에서 저장되는 FileName을 표시해주면 간단하게 해결. 

Chart chart = new Chart();
chart.BackColor = Color.White;
chart.Height = 300;
chart.Width = 450;
chart.AntiAliasing = AntiAliasingStyles.All;
chart.ImageType = ChartImageType.Png;

chart.Titles.Add(new Title() {Text = "판매량", ForeColor = Color.Black});
chart.Legends.Add(new Legend());

Series series = chart.Series.Add("data1");
series.ChartType = SeriesChartType.Column;
series.YValueType = ChartValueType.Int32;
series.LegendText = "Dates";
series.BorderColor = Color.Azure;
series.ShadowOffset = 2;
series["DrawingStyle"] = "Cylinder";

Random rand = new Random();
int dataSize = rand.Next(10, 20);
for(int i = 0 ; i < dataSize ; i++)
{
    string legendText = String.Format("DP {0}", i);
    Double dblValue = (double) rand.Next(1000);
    series.Points.Add(new DataPoint() { YValues = new Double[] { dblValue }, LegendText = legendText });
}

Series series2 = chart.Series.Add("data2");
series2.ChartType = SeriesChartType.Column;
series2.YValueType = ChartValueType.Int32;
series2.LegendText = "Dates2";
series2.BorderColor = Color.Azure;
series2.ShadowOffset = 2;
series2.Color = Color.RosyBrown;
for(int i = 0; i < dataSize; i++)
{
    string legendText = String.Format("DP {0}", i);
    Double dblValue = (double)rand.Next(1000);
    series2.Points.Add(new DataPoint() { YValues = new Double[] { dblValue }, LegendText = legendText });
}


ChartArea chartArea = chart.ChartAreas.Add("Default");
chartArea.BackColor = Color.Transparent;
chartArea.BorderColor = Color.Red;
chartArea.AxisX.IsMarginVisible = true;
chartArea.Area3DStyle.Enable3D = false;

MemoryStream ms = new MemoryStream();
chart.SaveImage(Server.MapPath("~/img.png")); //Save 파일 Name

ms.Dispose();
chartArea.Dispose();
series.Dispose();
chart.Dispose();




Posted by Y2K
,

Singletone Pattern

.NET Framework 2009. 3. 31. 03:04
예전에 Design Pattern에서 언급되던 Singletone pattern에서 다른 언어들과 .NET에서 구현상의 큰 차이점이 발견되어서 적어두기. 

1. 다른 언어들.
    public sealed class SingletonOld
    {
        private static Object lockObj = new Object();
        private static SingletonOld singleObject;

        private SingletonOld()
        {
        }

        public static SingletonOld Value
        {
            get 
            {
                if(singleObject == null)
                {
                    lock(lockObj)
                    {
                        singleObject = new SingletonOld();
                    }
                }
                return singleObject;
            }
        }
    }


2. .NET
    public sealed class SIngletonNew
    {
        private SIngletonNew()
        {

        }
        private static SIngletonNew singleObject = new SIngletonNew();

        public static SIngletonNew Value
        {
            get { return singleObject; }
        }
    }

가장 큰 차이는 변수의 선언과 동시에 값의 할당. CLR에서는 변수의 선언과 동시에 값을 할당시켜주는 경우에 생성자의 inline code로 만들어서 넣어주기 때문에 가장 빠르고 static의 경우에는 Single Thread의 접근을 완벽하게 보장해준다. 그러나 예전의 방법대로 구현하게 되면 Thread의 동기화 lock에 의해서 효율성을 떨어뜨리는 구현이 된다. (불행하게도 Design Pattern 책에는 대부분 첫번째 방법으로 되어있다.;; 두번째 방법 비슷하게 private 의 생성자 구현을 만들어두고 이렇게 만들면 안되고 첫번째 방법으로 Thread의 lock을 유지시켜야지 된다는 친절한 설명이 있는 책도 있다.;; )




Posted by Y2K
,
1. FCL과 C# 기본 형식 value type에서 FCL을 사용 
ex : 
 C# 기본 형식 > byte , FCL > System.Byte
-> 조금은 생뚱맞아보이는 방법이긴 하지만, 각 언어들에서 정확한 데이터 형식에 mapping 되는 것을 도와줄 수 있다. 특히 int 값에 대해서 Int32, Int64, Int16 과 같이 다양한 데이터 크기가 있을때, 이에 대한 형식 mapping에서 에러가 발생할 수 있다.
unmanaged code를 사용하는 경우, 이와 같은 일들은 빈번하게 발생 될 수 있기 때문에, 전 code를 FCL로 사용하는 것이 좋다. 

-> 참조 형식과 값 형식에 대해서 명확한 구분이 가능하다. string과 String의 경우에 같은 형식이지만 visual studio에서 색상 설정에 따라서 다르게 보인다. 이는 reference type과 value type을 명확히 구분이 가능하도록 visual studio에서 설정되어있기 때문이다. 그렇지만, C# 기본 형식으로 표기를 할 경우에는 value type인 int와 reference type인 string의 표기가 같게 된다. 

2. Value type과 reference type의 사용에 있어 주의 
-> 기본으로 돌아가서, value type은 stack, reference type은 heap에 생성된다. data의 memory 위치에 따라서 GC의 동작 및 GC 수집의 횟수에 영향을 미치게 된다. 

3. \r\n 을 사용하는 것보다는 Environment.NewLine을 사용하라. 
-> Mono를 비롯하여 CLR의 다른 OS로의 포팅이 계속해서 지원되고 있다. 
: 언제나 다 되려나... 싶긴 하다만.;


FCL 부분의 경우에는 많은 논란이 있을 것 같은 부분이다. 일반적으로 사람들이 사용하는 코드와는 많은 차이를 줄 수 있으니까. 그렇지만, 직접 사용해본 결과로는 보다 더 코드를 알아보기에 편한 느낌이 든다. 무엇보다 Value type과 Reference type간의 눈으로 보이는 차이는, 형식의 선언에서 한번 더 생각해보는 계기를 가지고 오는 것 같다. 
Posted by Y2K
,

CLR via C#

.NET Framework 2009. 3. 24. 01:10
.NET을 사용해서 개발한지 4년정도가 되어가는 때에 딱 적당하게 찾아서 보고 있는 책이라는 느낌이 든다. 
이 책은 기본적으로 .NET을 사용하고 있는 개발자를 대상으로 하고 있는 책으로 대부분의 책에서 나오는 Hello World와 같은 실행되는 코드는 전혀 나오지를 않는다. 

한 언어 또는 Framework를 다루는 책중에서 이정도까지 코드가 나오지 않는 책이 있었는지.. 라는 생각이 무척 많이 들게 하는 책으로 .NET Framework의 밑바닥에서 어떤 일들이 일어나는지.. method로 정의가 될때와 property로 정의될때 JIT의 compile이 어떤 식으로 구현이 되는지와 event의 등록 및 해재가 일어날때, CLR에서 어떻게 처리가 되고 있는지에 대한 그 전에는 단지 '사용하고 있었던' 코드에 대한 밑바닥 지식을 제공한다. 

method를 만들고, property를 만들때 각각 어떤 상황에서 어떤 방법을 사용하면 좋을지에 대한 고민을 한번 심각하게 하게 만들고, 내가 가진 coding 습관중에서 몇가지를 바꿔야지 될 것들이 보인다. 조금은 특이할지 모르겠지만 이 책에서 이야기 하는 논리에 상당히 설득을 당한 상태이기도 하고. 약간... 아니 많은 코딩 습관에 대해서 다시 한번 질문을 던져주는 책이 되는 것 같다. 

그리고, 가장 중요한 것. value와 reference에 대한 고민을 한번 더 나한테 던지고 있다. 어떤 상황에서 어떤 type을 사용하는 것이 가장 좋은가. 라는 고민이 계속해서 생기게 된다. 과연 내가 개발을 할 때, 적정한 상황에서 적정한 type을 이용하고 있는 것일까? 라는 고민과 좀더 나은 방법으로 개발할 수 있는 방법은 무엇일까? 라는 고민들이 계속해서 내 머리속을 스쳐지나가고 있다. 

어떻게 하면 좋은 프로그램을 만들수 있을까? 라는 끝없는 고민을 던져 주면서, .NET Framework의 개발 이론에서 이런 부분이 있어서 이렇게 되었구나.. 하는 깨달음을 주는 책. 정독으로 읽어도 읽어도 계속해서 놓친 점이 나오고 있다. 

지금까지 읽었던 .NET 책중에서 최고라고 칠 수 있고, 내가 다른 사람들에게 추천을 한다면 .NET Gotcha를 읽어본 사람이 읽어볼 책으로 추천하고 싶다. 이 책은 물고기 잡는 법을 가르쳐주지를 않는다. 이 책은 물고기에 대해서 가르쳐주는 책이다. 
Posted by Y2K
,
CLR via C# 책에서 일반적인 통념을 부정하는 견해가 있어서 여기에서 간단히 소개. 

1. 컴파일 시에 JIT 컴파일러는 실행환경의 CPU type을 알 수 있기 때문에, 최적화된 지시어를 이용해서 Native code를 생성함으로써 성능의 향상이 가능

2. JIT 컴파일러는 특정 상황의 테스트값 혹은 논리 연산의 결과를 실행 전에 알아내서 좀 더 빠른 Native code의 생성이 가능하다. 

3. CLR은 appliaction의 실행 패턴을 Profile함으로써, 실행중인 IL code를 native code로 다시 컴파일 할 수 있다.

이상의 이유로.. managed code가 unmanaged code보다 성능이 우수하다.


  약간은 생뚱맞기도 하고, 절대로 공감할 수 없다는 사람들이 엄청나게 덤벼들 것이 뻔한 상황이지만.. 개인적으로 전에 C++로 작업하던 환경과 지금 C#으로 작업하는 환경에서 겪어본 상황을 생각하면 은근히 이 말이 맞다는 생각이 든다. 일단... 첫 실행 시간. JIT에 의해서 native code가 생성되는 그때는 절대적으로 unmanaged code가 성능이 더 우수하다. 그렇지만, JIT에 의해서 native code가 생성된 이후라면.. 이미 사용된 assembly의 내용을 재이용하는 상황에서는.. 속도가 비슷하거나, 내가 짠 C++코드보다 빨랐었던 경험이 분명히 있었다. -_-;; 
(내 코드가 문제였을거야.. 라는 생각도 하지만.;)

  .NET으로 만든 코드에 대한 자신감을 좀 더 갖고 이야기를 해도 괜찮을 것 같다. 잘 생각해보면.. 그렇게 성능이 중요하면 assembly로 짜라. 라는 말이 가장 막강하긴 하지만. ^^
Posted by Y2K
,
일주일에 두번이상은 가는 asp.net 에서 배신을 당했다. ㅋㅋ 
18일날 대강 상황을 본 기억인데. 그날 바로 Release가 나오다니.;

일단 검토해본 결과 Release version과 RC1, RC2 버젼간의 차이는 Bug Fix 이외에는 발견하지 못했다. 

MS의 전통상... 
RC가 나오면 개발을 하더라도 변경이 아애 없는 경우가 많아서, RC 버젼이 나왔을때 대처하는 것이 좀더 나았던 경험들이 많은 것 같다. 

일단, 개발자들을 좀더 즐겁게 해줄 수 있는 ASP .NET MVC를 환영하고.. ^^
장고같은 REST service framework로도 발전할 수 있기를. ^^


Posted by Y2K
,

도서구입

Book 2009. 3. 17. 22:48
kangcom.com 의 Mypage에서 지금까지 구입한 금액을 확인할 수 있는 페이지가 있어서 한번 들어가봤다. 
지금까지 구입한 책이 약 300만원어치..;; 

비전공자이기 때문에, 다른 사람들은 더 많이 알고 있을 내용을 난 거의 모르는 경우가 많아서, 책을 열심히 사서 봐야지 된다는 생각을 무척많이했었는데. 그동안 투자했던 것들이 나에게 도움이 어떻게 되었는지가 요즘들어 생각이 드는것 같다. 

일단, 이번 분기. (3~5 월)에 볼 책들.  구입도 했고... 이젠 배송을 기다려야지. ^^

1. CLR via C#
: .NET Framework의 내부를 건드린 국내에서는 거의 유일한 책이다. GC와 memory, dual core cpu에서의 동작 등이 나온 굉장히 기대하고 있는 책. 책의 독자구분이 중급/고급으로 되어있는 책이라서 더 기대가 되고있는 것 같다. ^^

2. Windows via c/c++
: Programming windows application을 지은 제프리의 책이다. 지금은 비록 잘 사용하지 않지만, C++, C로 win32 api를 콕콕 찍고, 윈도우의 동작원리를 설명한 책으로는 지금도 가끔씩 보는 Programming windows application의 버젼업 책이라고 보면 될것 같다. 굉장히 기대하면서 너무나 맘에 들것 같은 책.

3. Head First HTML
: HTML을 근간들어서 자주 사용하고 있는데, 좀더 깔끔한 HTML 코드를 만들어보고 싶어서.. 난 HTML에 관한 책은 단 한권도 없다.;

4. Head First javascript

: 요즘에는 그냥 jquery를 이용해서 javascript를 만들기 하지만, 그전에 인터넷 강의에서 javascript의 기본 구조를 이용해서 ajax call을 하는 것을 알고 javascript  framework 들을 볼때와 그렇지 않았을때의 차이점을 몸으로 느껴본 기억이 있어서, 무언가 계속 잡고 공부하기 보다는 훌~ 하고 읽어보는 목적으로 사용하고 싶은 책이다. Head First 책들에 대한 신뢰가 쌓인 상태라서 보이자마자 주문을 눌러버린 책. ^^

4권이니까.. 한 2달정도 잡아서 보는 것을 생각해봐야지 될 것 같다. 
가장 큰 문제는 저 windows via c/c++ 인데, 그 전판이라고 할 수 있는 programming windows application을 엄청나게 오래본 기억이 있어서.. 가장 많이 배우기도 한 책이지만, 내용이 정말로 깊긴 깊었다.; windows virtual memory, file memory등에 대해서 나온 책은 그책 이외에는 못봤으니까.;

끊임없이 재미를 가지면서. ^^
Posted by Y2K
,
소스보면서 역시 긁적긁적.

<!DOCTYPE html>
<html>
<head>
  <link type="text/css" href="http://jqueryui.com/latest/themes/base/ui.all.css" rel="stylesheet" />
  <script type="text/javascript" src="http://jqueryui.com/latest/jquery-1.3.2.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.draggable.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.resizable.js"></script>
  <script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.dialog.js"></script>
  <script type="text/javascript">
  /*
  $(document).ready(function(){
    $("#dialog1").dialog({
        modal:true,
        open:function() {
            $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").remove();           
        }
    });   
  }); 
  */
  $(function() {
      $("#clickMe").click(
          function(){
          $("#dialog1").dialog({modal:true,
              open:function() {
                $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").hide();// .remove();           
              },
              width:300
          });
          });   
  });
 
 
 
  </script>
</head>
<body style="font-size:62.5%;">

<div id="button">
    <a href="#" id="clickMe">Click Me</a>
</div>

<div id="dialog1" title="SYNCmail" style="display:none;text-align:center">   
    <img src="ajax-loader.gif"/><br/>
    잠시만 기다려주세요.
</div>

</body>
</html>

신기한 내용이 너무나 많음.;
Posted by Y2K
,
ASP .NET에서 각각 상태를 저장할 수 있는 방법이지만, 각기 사용 방법에 유의점이 많이 보이는 방법들. 

Cache
IIS 전역에 저장시키는 값으로, 전체 유저들이 공용으로 이용될 수 있는 값이다. 
Cache.Add 에서 보이듯이, Cache가 추가되고, 그 Cache가 Expired가 되는 시간을 항시 정해줘서 Cache를 관리하게 된다. 

Session
사용자에 따라 각기 다른 값을 갖는 상태변수. 
Cache값과 차이를 갖는것은 사용자 연결 Connection에 따라 각기 다른 값을 가지고 있는 차이를 가지고 있다. 그러나, IIS 6.0에서의 사용자 Session은 out-of-process와 in-of-process 차이에 따라서 갱신되는 시간 및 Process의 값의 차이가 생기게 된다. 

Cookie
사용자에 따라 각기 다른 값을 갖게 할 수 있는 client 단에 저장되는 상태 변수
일반적으로 browser에서 저장되는 상태변수값. 1024 byte까지 저장할 수 있고, 사용자가 변경을 해서 서버단에 해킹을 가할 수 있기 때문에 cookie 값을 사용하는데에 있어서 항시 보안을 고려해서 사용해줘야지 된다.


Posted by Y2K
,
회사에서 디자이너분이 필요하다고 해서 예제 간단히 뚝딱뚝딱.

<html>
<head>
<script src="jquery-1.2.6.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" language="javascript">
$(function(){
$('#clickMe1').click(function(){
$('#info').load('load.html #movie', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).attr("src", 'images\\00buy_05.gif');
$('#clickMe2').attr("src", "images\\00buy_19.gif");
});
$('#clickMe2').click(function() {
$('#info').load('load.html #music', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).attr("src", 'images\\00buy_21.gif');
$('#clickMe1').attr("src", "images\\00buy_03.gif");
});
$('#clickMe3').click(function(){
$('#info').load('load.html #poem', function() {
$(this).hide().appendTo('context').slideDown();
});
$(this).html("Changed Text");
});
});
</script>
<script type="text/javascript" language="javascript">
function show_alert(){
alert('show');
}
</script>
</head>

<body>
<img id="clickMe1" src="images\00buy_03.gif" onclick="javascript:show_alert();"/>
<img id="clickMe2" src="images\00buy_19.gif"/>
<a href="#" id="clickMe3">Click Me3</a>
<div id="info">
<div id="context">
</div>
</div>
</body>
</html>

재미있기도 하고, 너무나 동작하는 것이 신기한 jquery. ^^
Posted by Y2K
,