Nullable Type

분류없음 2008.01.22 11:43

데이터베이스 프로그래밍을 할 때 어떤 필드가 null로 초기화 되어있을 경우, 가끔씩 Primitive type에 null값을 넣고 싶을 때가 있다. 예를 들면 이런 코드이다.

DataSet ds = GetDataSet();
object obj = ds.Tables[0].Rows[0]["NullField"];
int value = 0;

if(obj != null)
{
  value = (int)obj;
}

이럴 땐 Nullable타입을 사용하면 된다. 사용법은 간단하다.

DataSet ds = GetDataSet();
int? value = (int?)ds.Tables[0].Rows[0]["NullField"];

int?타입은 Nullable<T>를 상속받고 있다. 이런 형태의 Nullable타입은 bool이나 double과 같은 C#에서 사용 가능한 모든 타입들에 대해 구현되어 있다.

Nullable타입은 다음과 같은 프로퍼티와 메소드가 존재한다.

HasValue 값이 존재하는지 검사한다.
Value 값을 리턴한다. 만약 값이 없으면 Exception을 발생시킨다.
GetValueOrDefault(T defaultValue) 존재하는 값 또는 기본값을 리턴한다.

다음과 같이 쉽게 사용할 수 있다.

int? i = 10;
if (x.HasValue)
{
  Console.WriteLine(x.Value);
}
else
{
  Console.WriteLine("NullValue");
}

이렇게 매번 if나 GetValueOrDefault를 사용하면 코드가 복잡해 보일 수 있기 때문에, Nullable타입과 함께 추가된 ??연산자를 사용할 수도 있다.

int? i = null;
Console.WriteLine(i ?? 10);

??연산자는 C에서부터 계승되어 오던 ?연산자를 사용하는 (i == null) ? i : 0 형태를 축약한 것으로 보면 된다.

참고자료:
http://msdn2.microsoft.com/en-us/library/2cf62fcy.aspx

Posted by 신선한바람
TAG nullable
사용자 삽입 이미지

마소 9월호에 실렸던 사진..
표정이 간지..

http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=31621
Posted by 신선한바람

요즘은 인터넷이 재밋습니다. 웹 2.0이다 뭐다 해서 수많은 재밋는 사이트들이 쏟아져 나오고 있기 때문입니다. 이런 서비스들 중에선 미투데이와 같은 SNS서비스 뿐만 아니라 펌핏과 같은 이슈플랫폼도 있습니다. 혹시 이런 웹 2.0사이트들 중에서 Revu라는 사이트에 대해 들어 보셨는지요. 짧게 요약하자면 '세상 모든 것에 대한 리뷰'를 모토로 사용자들간의 리뷰를 공유하는 웹 2.0 서비스 입니다.

이것도 직업병에 해당하는지는 모르겠지만, 저도 나름 html을 끄적이고 있는지라 이런 훌륭한 서비스들을 볼 때마다 '이 부분은 어떻게 처리했을까?', '이 효과는 어떻게 준걸까?' 하는 생각을 많이 합니다. 그래서 이따금씩 따라해보곤 합니다. 뜬금없이 왠 '헛소리'라고 생각하셔도 좋습니다. 이번 주제는 Revu의 로그인 패널 만들기 이니까요. ^^

대부분의 사용자들이 로그인 패널을 페이지 상단이나 우측 위쪽에서 찾기 때문에 대부분의 로그인 패널은 그 위치에 자리잡게 됩니다. 이와 마찬가지로Revu의 로그인 버튼도 페이지 상단에 자리잡고 있습니다. 하지만 다른 사이트들과는 약간 다르게, 해당 버튼을 클릭하게 되면 로그인 페이지로 이동되는 것이 아닌 로그인 패널이 Slide down되면서 나타납니다.

저는 이 이펙트가 상당히 신선하다고 느껴졌습니다.

사용자 삽입 이미지

Revu의 로그인 패널

Revu의 로그인 패널의 이펙트는 script.aculo.us라는 Prototype기반의 UI라이브러리를 사용했습니다. (어떤 이유에선지는 모르겠지만 특이하게도 Revu가 사용하는 UI라이브러리는 상당히 많습니다. script.aculo.us뿐만 아니라, rico, YUI도 사용하고 있습니다. 이렇게 비슷한 역할을 하는 프레임웍을 중첩시켜서 사용하면 전체 시스템 복잡도는 자연히 높아질 수 밖에 없습니다. 그렇기 때문에 개인적으로는 별로 좋아하지 않습니다. ) script.aculo.us에는 Slide Up/Down외에도 쓸만한 이펙트들이 많이 있습니다. 더 자세한 정보를 원하시면http://script.aculo.us/ 를 방문해 보시길 바랍니다. (클릭하시면 데모사이트로 이동합니다.)

사용자 삽입 이미지

script.aculo.us데모


Slide Animation을 구현하기 위한 방법은 크게 두 가지로 요약할 수 있습니다.

  1. 여러장의 레이어를 겹쳐서 구현합니다. (간단하게 요약하자면 바닥을 깔고 로그인 박스를 위에 둔 후에 그 윗부분을 다른레이어로 덮는 방식입니다. )
  2. CSS의 Clip 프로퍼티를 이용합니다.

첫번째 방법은 여러장의 레이어를 제어해야 하기 때문에 구현하기 복잡하고, 모든 상황에 적용하기 힘듭니다. 두 번째 방법은 Clip영역으로 잘라내기 때문에 해당 오브젝트의 실제 크기와 화면에 출력되는 크기가 다르다는 단점이 있습니다. 어떤 방식을 사용하던 정답은 없습니다. 하지만 Clip영역을 사용하는 것이 다른 방법보다 훨씬 개발하기 쉽고, 어떤 상황에서던 유연하게 동작하기 때문에 이 방법을 선택하도록 하겠습니다.

Clip 프로퍼티는 4각형의 박스를 지정한 수치만큼 잘라내는 프로퍼티 입니다. Clip되는 박스는 반드시 { position: absolute; } 로 지정되어 있어야 합니다. CSS로 Clip영역을 주는 방법은 다음과 같습니다.

{
position: absolute; // 반드시 absolute로 지정되어 있어야 합니다.
clip: rect(0px, 10px, 10px, 0px); // top right bottom left의 순서입니다.
}

해제하시려면 { clip: rect(auto); } 로 지정하시면 됩니다. CSS와 Clip Property의 사용법에 대한 설명은 이 강좌의 범위를 넘는 부분이기 때문에, 더 자세한 설명을 원하시면 http://www.cadvance.org/?leftmenu=doc/include/total_menu.asp&mainpage=doc/css/positioning/clip.asp 를 방문해 보시길 바랍니다.

우선 화면에 100x200의 작은 박스를 만들겠습니다. 배경색은 red로 주시고, 화면에 떠 있어야 하기 때문에 {position: absolute; }를 설정해 둡니다. 좌표는 (100px, 100px) 정도면 괜찮겟네요. 그리고 마지막으로 clip영역을 {clip: rect(0px,100px,200px,0px);} 정도로 설정합니다.

코드는 다음과 같습니다.

<head>
<title>Slide Animation</title>
<style type="text/css">
#box {
    position: absolute; // 반드시 absolute로 지정되어 있어야 합니다.
    clip: rect(0px, 100px, 200px, 0px); // top right bottom left의 순서입니다.
    top: 100px;
    left: 100px;
    width: 100px;
    height: 200px;
    background-color: red;
}
</style>
</head>
<body>
   
<div id="box">
       
box
    </div>
</body>
</html>

사용자 삽입 이미지

실행결과


테스트는 http://66.232.144.57/suda/slide.htm 에서 하실 수 있습니다.

다음엔 이 div를 제어하는 script를 만들어 보도록 하겠습니다.

ps: 이거 code는 어떻게 붙여넣죠?? 컴맹이라-.-;

Posted by 신선한바람
(예병일의 경제노트, 2007.9.10)

지난 (2006년) 7월 중순의 어느 날 미국 네브래스카주 오마하. 올해 75세인 워런 버핏은 직접 차를 몰고 US뱅크 오마하 지점을 찾았다. 귀중품 보관함을 연 그는 1979년 날짜의 버크셔 A주식 12만여주에 대한 인증서를 꺼냈다. 현재 가치 110억 달러. 버핏의 전재산 440억 달러의 4분의 1을 차지하는 인증서다. 보관함에서 이 증서를 꺼냄으로써 그는 자신이 얼마전 발표했던 ‘기부’를 실천하는 첫 걸음을 내디뎠다.
"70년 전 내가 6살 때 아버지가 20달러로 처음 통장 계좌를 개설해 줬던 때가 생각났다. 그 20달러가 120달러가 되는데 5년이 걸렸다." 그날 버핏은 이렇게 말했다.
11살 때 114달러를 주고 씨티스 서비스 주식 3주를 사면서 처음 주식투자의 길에 들어섰던 한 소년이 60여년이 흐른 지금 37조원에 달하는 거액을 기부하는 칠순의 노신사가 되어 있었다.

지난 6월. 정치, 경제, 외교… 무엇 하나 시원스레 풀리는 것이 없어 답답해 하기만 하던 우리들에게 ‘상큼한’ 소식이 하나 날아왔다. 바쁜 일상을 멈추고, 일, 성취, 인생, 행복에 대해 생각하게 만들어준 ‘노블리스 오블리주’의 따뜻한 이야기. 바로 워런 버핏 스토리다.

워런 버핏 버크셔 해서웨이 회장. 그는 그 6월의 어느날 자기 재산의 85%인 370억 달러(약 37조원)를 자선기금으로 내놓겠다고 말했다. 놀라운 금액이다. 하지만 놀라운 것은 그가 내놓은 자선기금의 규모만은 아니었다. 그는 그 돈의 대부분을 자신의 재단이 아닌 남의 재단에 기부하겠다고 밝혔다. 기부라는 ‘선행’을 하면서도 최소한의 ‘명예욕’까지 버린 셈이다.
워런 버핏은 기부금 370억 달러 중 310억 달러를 MS의 빌 게이츠 회장(51)이 운영하는 '빌 & 멜린다 게이츠 재단'에 기부한다. 버핏에겐 이미 자신이 만든 가족 명의의 4개 자선재단이 있다. 자신의 이름을 따 새로운 재단을 만들 수도 있었을 게다. 그런데도 자신의 '명예'를 높여줄 수도 있는 자신의 재단에는 '적은 규모'인 60억 달러만 내고, 나머지 310억 달러를 게이츠 재단에 기부키로 한 것이다. 스스로를 낮추는, 정말로 쉽지 않았을 결정이다.

왜 그랬을까? 왜 그런 거금을 기부했을까? 아니 기부를 하더라도 자신의 재단에 기부하지, 다른 이의 재단에 기부했을까? 워런 버핏은 이렇게 설명했다.
"오랜 친구로서 그들의 자선활동을 지켜보다 열정과 에너지에 탄복했다. 내 가족이 운영하는 자선재단을 확대하기보다 게이츠 재단에 기부하는 것이 더 현명하다고 생각했다. 큰 돈이 걸린 내기 골프에서 누가 타이거 우즈에게 돈을 걸지 않겠는가."
한마디로 오랜 ‘친구’인 자선사업가로서의 게이츠에 대한 버핏의 믿음이 이런 결정을 가능하게 한 것이었다. 게이츠야말로 자신의 돈을 맡아 가장 잘 운영할 최적임자라고 생각했다는 얘기다.

세계 두 번째 부자 버핏과 세계 최고의 부자 게이츠. ‘노블리스 오블리주’를 실천하고 있는 그들은 스무 살이 넘는 나이 차에도 불구하고 ‘오랜 친구’이다. 그들은 1991년 처음 만나 계속 친구로 지냈다.
게이츠를 자선사업의 길로 인도한 이가 바로 버핏이다. 그는 게이츠에게 세계의 빈곤 문제를 분석한 세계은행 보고서를 읽어 보라고 권했다. 이 보고서를 읽고 게이츠는 후진국에 대한 자선에 눈을 떴다.
버핏은 게이츠에게 많은 경영상의 조언도 해주었다. 게이츠가 2003년에 버핏의 고향인 네브래스카주 오마하를 방문, 버핏의 단골 스테이크하우스에서 10달러대의 식사를 하면서 스톡옵션에 대한 충고를 들은 것은 유명하다. 이런 영향이었나. 게이츠는 버핏의 발표 며칠 전, 2년 뒤인 2008년 7월에 MS에서 은퇴하고 게이츠 재단에서 자선사업에 주력하겠다고 선언했다.

빌 게이츠가 만든 '빌 & 멜린다 게이츠 재단'의 자산은 291억 달러(29조원). 여기에 버핏이 기부할 310억 달러(37조원)를 합하면 60조원이 훨씬 넘는 기금이 된다. 외신들은 앞으로 게이츠 재단의 규모가 1000억 달러(100조원) 이상으로 커질 것으로 전망하고 있다. 두 명의 친구, 세계 부자 순위 1위와 2위가 힘을 합해 운영하는 세계 최대 규모의 자선사업이라니… 멋진 일이다.

워런 버핏, 그는 누구인가. 그는 '고수들'이 즐비한 미국 월가에서 '투자의 귀재', ‘오마하의 현자’로 불리는 사람이다. 미국 네브래스카주의 오마하에 있는 지주회사인 '버크셔 해서웨이'의 회장인 버핏은 여러 해 '세계의 부호' 순위에서 2위를 기록하고 있는 부자다.
‘버핏톨로지(Buffetology)’로 유명한 버핏의 투자전략은 수익성 높은 기업의 주식을 저가일 때 매입해 주가가 내재가치에 근접할 때까지 장기보유하는 것이다. 버핏은 적극적으로 연구개발에 나서고 수명이 긴 제품을 생산하거나 브랜드 가치가 높은 기업을 좋아한다. 그리고 그는 ‘주식’이 아닌 ‘기업’에 투자한다. 다시 말해 재무제표만 보는 것이 아니라 최고경영자(CEO)의 됨됨이와 기업의 무형자산 가치를 꼼꼼히 따진다는 얘기다.

기업의 내재가치를 중시하는 '가치투자'를 강조하는 그는 지난 2000년 '기술주' 열풍이 불었을 때도 이에 흔들리지 않고 '전통주'에만 투자하는 뚝심을 보이기도 했다. "내가 잘 아는 종목에만 투자한다"는 자신의 원칙을 고수했던 것이다.
“10년 동안 보유할 주식이 아니라면, 10분간이라도 보유해서는 안 된다.” 버핏의 투자철학을 대변하듯, 버크셔 해서웨이는 지금도 월마트나 코카콜라의 지분을 보유하고 있다.

이런 ‘투자의 귀재’ 워런 버핏은 매년 행해지는 ‘점심 경매’로도 유명하다. 그와 점심 한 끼를 같이하는 '버핏과의 점심'. 이 상품은 경매를 통해 올해에도 62만100달러(약 6억원)에 낙찰됐다. 45세의 중국인 사업가 돤융핑은 뉴욕 맨해튼의 유명한 스테이크 레스토랑 '스미스 앤 월렌스키'에서 버핏과 점심을 함께한다. 그리고 6억원이라는 큰 돈을 낸다. 버핏은 점심 자리에서 자신의 투자 비결에 대해 이야기하지만 구체적인 투자 종목은 말하지 않는다고 한다. 하지만 그 중국인 사업가는 점심식사 자리에서 버핏에게 주식투자보다 훨씬 소중한 ‘인생’에 대한 값진 조언을 들을 것 같다. 물론 버핏은 경매를 통해 번 수익금 전액을 샌프란시스코의 빈민구호단체 '글라이드 파운데이션'에 기부해 빈곤의 세습을 막는 데 쓴다.

버핏은 자수성가한 인물이다. 지금은 세계 두 번째 부자이지만, 그는 식료품 가게집의 아들로 태어났다. 오로지 자신의 힘으로 50여년 만에 40조원이 넘는 부를 일구어냈다.
그리고 버핏은 절약이 생활에 배어있는 부자이다. 세계에서 두 번째로 돈이 많은 부자인데도, 그의 생활은 검소한 일반인들의 모습과 비슷하다. 1958년 고향에서 3만1500달러(3600만원 상당)를 주고 산 집에서 계속 살고 있으며, 20달러짜리 스테이크 하우스를 즐겨 찾는다고 한다. 오래된 중고 자동차를 직접 몰고 다니고, 12달러짜리 이발소에서 머리를 깎고, 집 근처 편의점에 들러 신문을 사곤 한다.
물론 그가 오래된 중고차를 직접 몰고 다니는 것으로 절약할 수 있는 돈은 그의 재산에 비하면 그리 크지 않을 것이다. 하지만 그런 생활태도가 50년 동안 그의 다른 모든 행동에 영향을 미쳤을 것이고, 그 행동들이 모여서 지금의 성공을 가능하게 해주었을 것임에 틀림없다.

이런 버핏의 좌우명은 무엇일까? 그는 작년말 비즈니스2.0이라는 미국의 한 잡지가 인생의 철학, 좌우명, 성공의 비결(the secrets of their success)에 대해 묻자 이렇게 답했다.
“There Can't Be Two Yous.”
우리의 인생은 한 번 뿐. 버핏의 말 대로, '지금의 나'와 다른 또 다른 나는 존재하지 않다. "비록 지금은 이렇게 살고 있지만, 언젠가는 나도 새롭게 태어날 거야"라고 막연히 생각만 해서는 의미가 없다는 얘기다. 버핏의 좌우명을 마음속에 새기고 살아간다면, 전처럼 평상시처럼 안이하게 지낼 수는 없을 것 같다.

‘노블리스 오블리주’를 실천한 버핏은 자식교육도 남다르다. 그는 항상 "자식들에게 너무 많은 유산을 남겨주는 건 독이 된다"고 말해 왔다. 평생 아무것도 하지 않아도 될 정도로 많이 물려주면 자녀의 성취감을 빼앗기 때문에 '독'이 된다는 것. 부자인 부모를 만났다는 이유로 평생 공짜 식권(food stamp)을 받는 일은 반사회적일 수 있으며, 자녀들에게 해가 된다는 생각이다.
수지(52), 하워드(51), 피터(48). 이런 교육을 받고 자란 버핏의 세 자녀들은 그래서인지 아버지의 기부 결정을 전폭적으로 지지하고 있다고 한다. 버핏이 이들이 어렸을 때부터 많은 재산을 물려주지 않을 것이라고 말해 왔기 때문에, 애초에 큰 유산을 기대하지 않았다는 것. 세 자녀의 어린 시절은 평범했다고 한다. 이들을 인터뷰했던 뉴욕타임즈에 따르면, 큰딸인 수지는 어렸을 때 밤마다 아버지가 요람을 흔들어주며 '무지개 너머 어딘가에'라는 노래를 불러줬다고 기억했다. 대학에서 가정경제학을 전공했던 수지는 졸업 직전 월급 525달러의 사무직에 취업한다며 학업을 포기했다. 100만 평 규모의 농장을 소유하고 있는 하워드는 빈민 생활을 주로 찍는 사진작가로도 활동하고 있고, 피터는 뉴에이지 음악가라고 한다.
이 세 자녀는 현재 각자 사회복지재단을 운영하고 있다. 뉴욕타임스는 이들이 아동 조기 교육, 안전하게 마실 수 있는 물, 북미 원주민 지원 활동에 초점을 맞출 것이라고 보도했다.

버핏의 기부금을 운영할 빌 게이츠도 가족들 몫으로 남길 1000만 달러를 빼곤 나머지 재산을 모두 사회에 환원할 것이라고 여러 번 공언해왔다. 1000만 달러면 우리 돈으로 약 96억원. 큰 돈임에 틀림 없지만, '재벌' 수준은 아니다. 게다가 게이츠의 재산 500억 달러의 5천분의 1에 불과하다. 1백분의 1도 아니고 5천분의 1이다. 자신이 모은 재산 5000 중 1만 자녀에게 물려주고 나머지 4999를 기부하겠다는 의미다. 친구를 보면 그를 알 수 있다고 하더니, ‘유유상종’인 셈이다.

"돈을 제대로 쓰는 것은 돈을 버는 것보다 훨씬 어렵다. 재산을 사회에 환원키로 한 것은 돈을 제대로 쓰기 위해서다. 나는 매우 운이 좋아 많은 재산을 모을 수 있었다. 재산을 기부하기로 결정한 것은 이 같은 행운을 다른 사람들과 함께 나누기 위해서이다."
자선기금으로 37조원을 내놓은 약정식을 하면서 버핏은 이렇게 말했다. 옆에서는 그의 오랜 친구 빌 게이츠가 지켜보고 있었다.

식료품 가게집 아들로 태어나 자수성가, 당대에 세계 두 번째의 부자가 된 남자. 하지만 오래된 집에서 살며 중고차를 몰고 20달러짜리 단골 스테이크 하우스를 찾는 검소한 사나이. 그리고 마침내 37조원이라는 거금을, 그것도 대부분을 자신의 재단이 아닌 ‘친구’의 재단에 기부한 노신사.
이로서 버핏은 ‘주식투자의 귀재’에서 진정한 ‘오마하의 현자’가 되었다. ‘노블리스 오블리주’를 실천하는 이 시대의 현자 말이다.

예병일의 '성공과 부자에 대한 현자의 질문, 워런 버핏 스토리' 중에서 (p48, 국민은행 골드&와이즈, 2006.8)




지난주 들려온 워런 버핏의 집 이야기. 370억 달러(약 35조원)를 기부한 세계 2~3위의 부자인 그가, 6억원대의 낡은 집에서 50년째 살고 있었습니다.

제가 1년 전쯤 쓴 글을 찾아 소개해드립니다. 성공과 부, 삶과 인생을 다시 한번 생각해보게 해주는 워런 버핏의 스토리입니다.

멋진 가을입니다. 활기찬 월요일 시작하시기 바랍니다.



예병일의 경제노트는 매일아침마다 메일로 발송됩니다. 혹시 구독을 원하시는분은 제게 이름메일주소를 댓글로 남겨주시길 바랍니다.
Posted by 신선한바람

시작하기

Ajax.net 에서 Animation을 제어 할 수 있는 방법은 두 가지가 있습니다. 첫 번째는 AnimationExtender를 사용하는 방법이고, 다른 한 방법은 JavaScript 로 직접 제어 하는 방법입니다.

 

Ajax가 대중적으로 확산됨과 함께 Ajax.Net도 덩달아 많은 관심을 받고 있습니다. 이에 따라 AnimationExtender와 같은 ControlToolkit의 자료 또한 많이 공개되어 있습니다. 그래서 저는 JavaScript Animation을 직접 제어하는 방법을 설명하겠습니다.

 

Ajax.Net을 사용하기 위해선 다음과 같은 프로그램들이 설치되어 있어야 합니다.

 

1.     VisualStudio 2005 혹은 Visual WebDeveloper Express 2005 이상의 버전이 설치되어 있어야 합니다. (에서 무료로 다운로드 받을 수 있습니다.)

2.     ASP.NET Extension v1.0 이상의 버전이 설치되어 있어야 합니다. (에서 무료로 다운로드 받을 수 있습니다.).

3.     ASP.NET AJAX Control Toolkit이 설치되어 있어야 합니다. (에서 무료로 다운로드 받을 수 있습니다.)


Animation Hierarchy

Ajax.Net Animation은 다음과 같은 계층으로 구성되어 있습니다.

 

Animation --- Parent Animation   --- Parallel Animation      --- Move Animation
                                                                              --- Resize Animation

                                             --- Sequence Animation  --- Pulse Animation
                                            
--- Selection Animation   --- Condition Animation
                                                                              --- Case Animation

              --- Fade Animation      --- FadeIn Animation

                                             --- FadeOut Animation

              --- Property Animation --- Discrete Animation

                                             --- Interpolated Animation

              --- Color Animation   
             
--- Length Animation 
             
--- Scale Animation
              --- Action                 --- Enable Action

                                            --- Hide Action

                                            --- Style Action

                                            --- Opacity Action

                                            --- Script Action

 

 크게 3가지로 분리할 수 있는데, SequenceAnimation이나 parallelAnimation과 같이 Animation들의 순서를 제어할 수 있는 Container클래스와, Fade In/Out 과 같은 실질적으로 화면을 구성하는 클래스, 그리고 시간을 기준으로 동작하는 Animation과는 달리 실행한 그 시점. 단 한번만 효력을 발휘하는 Action이 있습니다.

 

다음 URL에서 각각의 Animation을 테스트 해 보십시오.

http://66.232.144.57/suda/animation.aspx

  

사용자 삽입 이미지

Animation Example

사용자 삽입 이미지

FadeIn, FadeOut, Color 실행결과













Hello Ajax

간단한 Hello Ajax라는 글씨를 FadeIn하는 Animation을 작성해 보도록 하겠습니다.

 

1.     새 웹 사이트 생성합니다.

2.     폼에 TookitScriptManager를 등록합니다. 혹시 ToolkitScriptManager가 없다면, 도구상자에서 우클릭 -> 항목선택 -> 다운받은 ControlToolkit 디렉토리안의 /SampleWebsite /Bin /AjaxControlToolkit.dll 을 선택하여 추가하십시오.

3.     폼에 아무런 ControlToolkitExtender가 없으면 Animation관련 자바스크립트가 로드되지 않기 때문에 임의로 아무 Extender나 폼에 올려둡니다.

<!-- AjaxControlToolkit 라이브러리를 사용하기 위해 아무 extender나 폼에 올려 두어야 함 -->

         <asp:Panel ID="Panel1" runat="server" Width="1px" Height="1px" Visible="false" />

        <cc1:AnimationExtender ID="AnimationExtender1" runat="server" TargetControlID="Panel1">

            <Animations>

                <OnHoverOver>

                    <FadeIn MinimumOpacity="0.1"/>

                </OnHoverOver>

            </Animations>

        </cc1:AnimationExtender>

4.     FadeIn시킬 Div를 추가하고 Text를 설정합니다.

<div id="fadein" style="opacity:0;">

<h2>Hello Ajax</h2>

</div>

5.     <head></head>태그 사이에 다음과 같은 자바 스크립트를 추가합니다.


<script language="javascript">

function FadeIn()

{

// Animation을 재생합니다.

    AjaxControlToolkit.Animation.FadeInAnimation.play($get('fadein'), 1, 25);}

 

function Initialize()

{

    $addHandler($get('fadein'),"click",FadeIn);

}

</script>

6.     Initialize를 호출하기 위해 body태그에 onload이벤트를 설정합니다.


<body onload="Initialize();">


코드설명

AjaxControlToolkit.Animation.FadeInAnimation.play()  

FadeInAnimation을 재생하는 메소드 입니다. Play외에도 Stop Pause와 같은 제어 메소드들과, onStart, onStep, onEnd와 같은 이벤트리스너들도 등록할 수 있습니다. API Reference는 다음 사이트를 참고하시길 바랍니다.

http://asp.net/AJAX/Control-Toolkit/Live/Walkthrough/AnimationReference.aspx

 

$get(‘fadein’)

 Sys.UI.DomElement.getElementById() 메소드의 축약 형태입니다. $get() 외에도 다른 축약형을 알고 싶으시면 다음 사이트를 참고하시길 바랍니다.

http://asp.net/AJAX/Documentation/Live/ClientReference/default.aspx

 

.play($get(‘fadein’), 1, 25)

 두 번째 인자인 1 duration입니다. Duration은 해당 Animation이 몇 초간 진행될 것인지를 결정하는 단위 입니다. 세 번째 인자인 25 fps입니다.

 

$addHandler($get(‘fadein’),”click”,FadeIn)

 $addHandler Sys.UI.DomEvent.addHandler()메소드의 축약형 입니다. 인자로 3개를 받는데, 첫 번째 인자는 이벤트를 핸들링할 DomObject입니다. 두 번째 인자는 이벤트의 이름입니다. 세 번째 인자는 이벤트가 발생할 시 호출할 함수 이름입니다.

 

 

결론

이것으로 대략적인 Javascript Animation을 제어하는 방법에 대해 알아 보았습니다. 혹시 제가 잘못 알고 있는 내용이나, 추가할 점이 있으시면 댓글 혹은 트랙백으로 남겨 주십시오.
Posted by 신선한바람

.Net으로 OpenID Library를 구현하시거나 찾아보신 분들은 생각보다 구현체가 없다는 사실에 놀랐을 것입니다.

 

이 글을 쓰는 시점으로 가장 많이 사용되는 라이브러리는 JanRain사에서 구현한 JanRain OpenID 라이브러리입니다. 현재 이미 RubyPython과 같은 언어에서 성공적으로 사용 된 바 있고, 6개 이상의 언어로 포팅되어 있으며 Cross Platform을 지원합니다.

 

물론 .Net용 구현체도 있습니다. 다만 개발 초기부터 Cross Platform 지원이 필수였기 때문에 .Net용 구현체는 다른 ASPControl과는 다음과 같은 차이가 있습니다.


1.       Boo 라는 언어로 구현되어 있습니다.

2.       Mono Framework을 사용합니다.

3.       Mono.security라는 Mono 전용 namespace가 사용되었습니다.

 

현재 OpenID스팩은 아직 완벽히 정립된 상태가 아니며 현재도 끊임없이 변경되고 있습니다. 이런 상황에서 순수 .Net이 아닌 Mono로 빌드되어 있고, Boo라는 독특한 언어로 구현되어 있다는 점은 유지보수성에서 마이너스 요소가 될 수 밖에 없습니다. 이런 문제점은 Toy-project처럼 간단한 테스트 프로젝트라면 상관없지만 실제 상용 프로젝트에 바로 적용시키기엔 무리가 있습니다.

 

제가 오늘 소개드릴 라이브러리는 ExtremeSwankOpenID Consumer입니다.

( http://extremeswank.com/aspnet_openid.html 에서 다운로드 하실 수 있습니다.

 

특징으로는 다음과 같습니다.

 

1.       C#ASP.Net으로 구현된 모든 소스가 공개되어 있습니다.

2.       OpenID 1.1 2.0Stateful Stateless 모드를 완벽히 지원합니다.

3.       구현체가 Stateless 만을 위한 Simple ConsumerFull Consumer 두 가지로 나뉘어 있습니다. 이는 실제 동작되는 서버의 성능상의 이점을 가져다 줍니다.

4.       사용하기 쉽도록 UserControl이 구현되어 있습니다.

5.       거의 유일하게 API Documentation이 만들어 져 있습니다. (!!!!!)

 

그럼 간단한 예제를 만들어 보겠습니다.

 

먼저 Visual StudioOpenID라는 이름의 웹 사이트를 생성합니다.
만약 Visual Studio가 없으면 다음 링크에서 WebDeveloper Express버전을 다운받으십시오.  
http://msdn2.microsoft.com/ko-kr/express/aa975050.aspx

 

1.       솔류션 익스플로러에서 우클릭 -> ASP.Net 폴더 추가 -> Bin 을 선택하여 참조 디렉터리를 생성합니다.

2.       Bin디렉토리에서 우클릭 -> 참조추가 -> 찾아보기 를 통해 다운받은 ExtremeSwank.Authentication.OpenID.dll을 추가합니다.

3.       작업중인 웹 디렉토리에 OpenIDControl.ascxOpenIDControl.ascx.cs 파일을 복사합니다.

4.       Default페이지에 추가한 컨트롤을 올려 놓습니다.

 

결과 화면은 다음과 같습니다.


사진을 클릭하시면 원본이미지로 좀 더 자세히 보실 수 있습니다.

 

사용자 삽입 이미지

Visual Studio 에서 오픈아이디 로그인폼을 만드는 모습


실행하면 다음과 같습니다.


 

사용자 삽입 이미지

웹브라우져에서 확인하는 로그인창

사용자 삽입 이미지

myid.net을 통한 로그인 시도


사용자 삽입 이미지

정상적으로 로그인 된 모습


ExtremeSwank의 라이브러리는 모든 소스가 공개되어 있고 API문서 또한 잘 정리되어 있기 때문에 사용하시는데 크게 어렵지 않을것이라 생각됩니다.

Posted by 신선한바람

지금 이 시간에도 수많은 사이트들이 생겨나고 또 사라지고 있습니다.

 

제가 보기엔 적어도 한국에서는 생겨나는 서비스보다 죽어가는 서비스가 더 많은 것 같습니다.

강한자가 살아 남는 것이 아니라, 살아 남은 자가 강한 것이라고 우리는 생존확률이 로또 맞는 것 보다 낮은 대한민국 웹 시장에서 조금이라도 더 오래 살아 남을 방법을 찾아야만 합니다.

바로 우리는 좋은 서비스를 만들었다.” 는 것을 증명하기 위해서죠.

그럼 제가 시작하기 전에 먼저 화두를 던지겠습니다.

 

좋은 서비스란 뭘까요?”

 

저는 이 글을 쓰기 위해 마이크로 소프트에서 만든 ms word를 사용해서 글을 작성하고 있습니다. 물론 제가 tistory의 에디터를 사용하여 바로 포스팅 할 수도 있겟지만, 굳이 귀찮게 ms word를 사용하는 이유는 맞춤법 검사기가 tistory의 그것보다 더 잘 동작하기 때문입니다. (그 외에도 tistory의 에디터엔 몇 가지 버그가 있습니다.)

 

제가 맞춤법 검사기가 잘 동작하지 않는 Tistory의 에디터보다 조금 더 훌륭한 ms word를 사용하듯이, 좋은 서비스란 사용하는 사람이 편한 서비스라고 생각합니다.

 

하지만 이런 질문도 있을 수 있습니다. 한국에는 총 3500만명이나 되는 엄청난 수의 인터넷 사용자가 있습니다. 적어도 열명중에 여덟명은 인터넷을 써 봤거나 쓰고 있다는 말이죠. 게다가 인터넷의 특성상 거리에 대한 제약이 없다는 점에선 전 세계를 상대로 서비스도 가능할 것입니다. 우리 팀 내에서도 음식에 대한 취향이 다른데 이렇게 어마어마하게 많은 사용자의 취향을 어떻게 다 맞춰주겠습니까?

 

그래서 우리는 반드시 기본으로 돌아가야 합니다.

 

지금까지의 서비스들의 가장 큰 목적은 기업의 이윤추구였습니다. 그래서 실제 세계와는 다른, 가상세계란 문화적 특수성을 재대로 이해 하지 못한 수많은 웹 비즈니스들이 2000년 블랙먼데이를 기점으로 무너지게 되었습니다. 잘 아시다시피 그 이후로 지금까지 인터넷 서비스의 암흑기가 진행되었고요.

 

많은 사람들이 지금과 같은 인터넷 서비스 암흑기의 타개책으로 웹 2.0을 꼽습니다. 그러면서 AJAX, RSS 혹은 SNS같은 이상한 개념들을 얘기하곤 하죠. 아마도 그 사람들은 지금 당장 동영상 UCC서비스를 만들면, 다시 예전의 벤처 황금기처럼 30배수 투자를 받을 수 있다는 생각을 하는 것 같습니다.

 

대한민국 정규 교육과정을 마치셨으면 르네상스라는 단어를 기억하고 있을 것입니다. 부활이라는 뜻이죠.

저는 웹 2.0사용자를 위한 웹 서비스라고 생각합니다. 14세기 암흑 같은 중세시대를 인간의 재 발견으로 벗어났듯이, 이 암울한 대한민국 웹 서비스들은 더 이상 기업의 관점이 아닌 사용자의 재 발견으로 부활해야 합니다.

 

단지 AJAX나 웹 표준 같은 기술적 개념들은 웹 2.0서비스를 만들기 위한 필요조건이 아니라 충분조건일 뿐입니다. 의미없는 화려함에 힘 쏟을 시간에 유저빌리티에 투자하고, 완성도를 조금 더 높이기 위해 노력해야 합니다.

 

기획자도 아니고 마케터도 아닌, 우리 같은 기술쟁이들은 평소보다 한번만 더 테스트하고, 남들보다 한번만 더 사용자 입장에서 생각하면 됩니다.

 

그게 전부입니다.

Posted by 신선한바람