Who are you?


이동범(Dongbum Lee)


Microsoft Regional Director


Microsoft MVP - VB.net


MHVB.net 시삽

Wanna talk with me?

Here I am

Subscription

MSN 메신저를 통해 글이 갱신되면 알려드립니다.

Windows Live Alerts

Search

Navigation

Categories

.net (14) Ajax (1) asp.net (2) AxWebBrowser (1) blog (3) browser (1) das blog (1) dasBlog (2) DataGridView (1) Google (1) ie (1) iis (1) javascript (1) jQuery (1) Microsoft (14) Office (2) OOXML (1) Silverlight (1) Team System (2) UX (1) VB (3) vb.net (4) Vista (1) visual studio (5) visual studio 2010 (1) windows7 (1) Winform (3) WinFX (1) WPF (2) 독점 (1) 성산포 (1) 음악 (1) 일상 (8) 조용필 (1)

On this page

People.
Meat is MURDER
OOXML is approved
Source code of Visual Basic runtime has been released to public
AxWebBrowser 컨트롤을 사용하는 MDI 폼에서 Focus를 받을 수 없다구?
Linus Torvalds on Visual Basic
MS Silverlight를 이용한 검색사이트 Tafiti
DataGridView에서 Enter 키 입력시 다음 셀로 이동하기

Archive

Blogroll

Notice

알림
본 블로그는 저의 개인적인 의견을 담고 있습니다.
제가 몸담고 있는 조직의 공식적인 의견과는 다를 수 있습니다.

RSS 2.0 | Atom 1.0 | CDF Send mail to the author(s) E-mail

BlogStats

Total Posts: 41
This Year: 0
This Month: 0
This Week: 0
Comments: 9

Sign In

# Wednesday, August 20, 2008
Wednesday, August 20, 2008 10:18:19 PM (Korea Standard Time, UTC+09:00) ( 일상 )

8월 16일 아침 단식 67일차 기륭전자 2명의 조합원이 병원에 후송되었다고 한다.

3년이 넘는 기간동안 진행되어 온 지리한 싸움은 현재 우리사회의 비정규직 문제가 얼마나 심각한 지경인지를 보여주고 있다.

아래의 영상은 기륭전자 조합원들의 3년간에 걸친 투쟁의 과정을 EBS의 지식채널e 팀에서 제작한 것이다.

 

# Thursday, May 15, 2008
Thursday, May 15, 2008 10:32:35 AM (Korea Standard Time, UTC+09:00) ( 일상 )

처남의 노래.
지난 주 토요일 있었던 촛불집회에서 불렀단다.

"그래도 육즙많은 고기앞에선 아직도 약한 나 -.- "

[buzz]Meat_is_Murder.wma (1.84 MB)
Meat is Murder 다운받아 들어보기

Meat is Murder

작곡 'samples
편곡 'buzz
작사 'buzz

Meat is Murder
Meat is *bucker
Meat is Murder
Meat is bucker
그들의 고통이 다시 되돌려 갈지어다

*bucker 탄 사람을 떨어뜨리는 버릇이 있는 사나운 말

죄없는 눈빛으로 인간 안에 태어나
날카로운 손아귀에 거칠게 끌려가
축복과는 상관없는 운명 속에 살아갈
어미따윈 돈만 드는 수단이니

좁아터진 우리 속에 가능한 한 쳐넣어
빨리커라 자라나라 주사바늘 찔러너
코찌르는 화학사료 풍선처럼 살찌워
지갑 속 현금처럼 상품가치는 높아져

한 살이란 나이에도 몸은 어른이 돼
안 그래도 좁은 우리 몸을 꽉 매게해
갈 때까지 몸은 이미 만신창이
동료들은 미쳐만가 서로를 물어뜯고 있네

썩어가는 우리 속에 고인 눈물 속에
뼈 속까지 썩어드는 한탄 속에
좁은 천장사이 스며드는 하늘 줄기
흐릿해진 두 눈에도 선명하리

Meat is Murder 내 핏속에 흐르는 잔혹한 죽음의 그림자

Meat is bucker 내 혀끝에 몸부리쳐 죽어갔던 거친 생명의 눈물

Meat is Murder 내 손끝에 행해진 명백한 살인의 행위

Meat is bucker 그들의 고통이 다시 되돌려 갈지어다

식탁 위 기름진 고깃덩이
자비로운 하느님에 감사기도를 올려
혓바닥은 즉시 흥건히 젖어드네
도살장의 끈적한 핏물과 같이

단순한 소비자라 내 자신을 속여오며
혀끝의 살육 모른 척 하며
시체조각 강한향에 감각이 마비된 체
'어쩔 수 없잖아' 이미 가당치도 않은 소리

몸안 가득 뻗쳐있던 살육의 기운들과
잔혹하게 죽어갔던 생명의 독설들과
끊임없이 이어지는 대량의 학살
I can't look on the sharp cut anymore

필요에 의해 충족되는 순환의 고리
세포 속에 살아쉬는 원한의 고리
지금 당장 숨죽여 귀 기울여 보라
못들은 척 고개돌려 비웃지 마라

Meat is Murder 내 핏속에 흐르는 잔혹한 죽음의 그림자
Meat is bucker 내 혀끝에 몸부리쳐 죽어갔던 거친 생명의 눈물
Meat is Murder 내 손끝에 행해진 명백한 살인의 행위
Meat is bucker 신께선 그들의 고통을 다시 되돌려 주실지어다

관습이란 살해조차 신나는 Game
편견이란 관습 속에 비온 뒤 맨 땅
관습이란 누구보다 타협의 고수
편견이란 효과적인 절약의 술수

진실을 파헤치는 수고 필요도 없이
견해를 갖게하는 멋진 탁월한 방안
그 안 어떤 행위조차 정당한

고통의 절규 커칼수록

피로물든 축제는 무르익어 가네
붉게 물든 웃음꽃이 만발해 가네

# Friday, April 04, 2008
Friday, April 04, 2008 10:13:55 AM (Korea Standard Time, UTC+09:00) ( Microsoft | Office | OOXML )

OOXML이 많은 논란 끝에 2008년 3월 31일 가맹국들의 재 투표 결과 ISO 승인이 공식 결정 되었습니다.
(공식적인 결과 통보는 4월 2일에 있었습니다.)

의사결정국의 정족수 75%, 반대 14%로 공식 승인되었습니다.
표준의 논란 가운데 언제나 공적(公敵)이 되는 Microsoft 사 이기에 OOXML은 그 어느때보다 치열한
논쟁과 비난의 포화 한 가운데에 있었죠.

ODF진영(IBM을 필두로 하는), OOXML(Microsoft)간의 치열한 로비는 개발자들이 원하는 진정한 표준을 위한
가치를 제공하기 보다는 서로가 승인을 저지하고, 이를 뚫어 내려고 하는 보기 씁쓸한 모습들이 연출되어 왔습니다.

또한 개발자들 사이에서도 명확한 판단기준 보다는 단지 시장점유율이 높다는, 독점적 지위에 있다는 이유만으로 OOXML에 대한 맹목적 반대의 의견을 표명하는 아쉬운 모습도 볼 수 있었습니다.
( Office가 어떻게 이와 같은 시장점유율을 가지게 되었는지에 대해서는 많은 소프트웨어 개발사들이 MS를 벤치마킹 해 볼 필요가 있다고 생각합니다. Word Perfect와 Lotus-123의 독점적 시장을 어떻게 탈환했는지 말이죠 ^^ )

"본 고속도로를 이용하기 위해서는 반드시 '미쉐린타이어'가 장착된 자동차만이 이용할 수 있습니다"

보다는

"본 고속도로를 이용하기 위해서는 소정의 요건을 만족하는 인증된 타이어를 장착된 자동차들이 이용할 수 있습니다"

가 휠씬 자유로운 경쟁과 시장을 만들어 나갈 수 있지 않을까 생각합니다.

ODF도 좋고 OOXML도 좋으니 국내의 암묵적인 표준으로 자리잡은(?) 아래한글이 이들 중 한가지 만이라도 제대로 지원해 주었으면 하는 바램도 함께 가져 봅니다. <img alt=" src="smilies/happy.gif">

OOXML의 ISO 표준 승인을 환영합니다.

# Sunday, January 20, 2008
Sunday, January 20, 2008 10:00:25 PM (Korea Standard Time, UTC+09:00) ( .net | VB | vb.net | vb.net )

Visual Basic 런타임에 대한 소스수준의 디버깅이 가능해 졌습니다.
VB개발자들에게 있어서는 반가운 리소스가 되어 줄 것 같습니다.

VB Team 의 블로그에 디버깅을 위한 설정과 관련한 자세한 내용이 실려 있네요.

http://blogs.msdn.com/vbteam/archive/2008/01/19/source-code-of-visual-basic-runtime-has-been-released-to-public.aspx

# Thursday, December 13, 2007
Thursday, December 13, 2007 1:52:31 AM (Korea Standard Time, UTC+09:00) ( .net | AxWebBrowser | vb.net | Winform )

(MDI Childform contains AxWebBrowser control can not be focused(activated) when this control is selected.)

비따 회원의 질문 중에 흥미로운 것이 있어 옮겨 본다.
윈폼 개발 중 WebBrowser 컨트롤을 사용할 경우 부득 WebBrowser Control 대신 기존 방식처럼 AxWebBrowser컨트롤(AxImp를 통한 RCW 생성을 통해)을 만들어 사용하게 된다.

이 경우 해당 폼이 MDI Child로 사용될 경우, MDI Form 내부에서 해당 웹브라우저 컨트롤을 사용자가 클릭했음에도 불구하고 타이틀바를 클릭하지 않는 이상 폼이 활성화 되지 않는 황당한 경우가 발생한다. 아마도 제대로 웹브라우저 RCW 코드에서 메세지 처리를 완벽하게 못 만들어 내는 것 같다.

Reflector로 까 봐야 자세히 알겠지만, 귀찮아서 생략한다. 대신 직감으로 WM_MOUSEACTIVATE 메세지를 가로채 해당 이벤트에서 컨트롤이 담겨진 폼을 찾아 Focus 받도록 메서드 날려준다.

소스는 초 간단. RCW - AxWebBrowser 컨트롤을 상속받아 WndProc 메서드를 재정의 해 준다.

Public Class AxFocusedBrowser
    Inherits AxSHDocVw.AxWebBrowser

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = &H21 Then 'WM_MOUSEACTIVATE 
            Dim parentObject As Object = Me.Parent
            Do While Not (TypeOf parentObject Is System.Windows.Forms.Form)
                parentObject = parentObject.Parent
            Loop
            parentObject.Focus()
        End If
        MyBase.WndProc(m)
    End Sub
End Class

아.. 깔끔한 VB 코드.. 난 이 Object 타입에 아무렇지 않게 메서드와 프로퍼티를 지정해 줄 수 있는 융통성이 좋다.
Dynamic VB! <img alt=" src="smilies/happy.gif">

# Friday, November 30, 2007
Friday, November 30, 2007 8:39:40 AM (Korea Standard Time, UTC+09:00) ( VB )

Microsoft Hero Program 준비를 위해 자료를 찾던 중 참 반가운 글이 있어 옮겨 본다.
그 어떠한 언어 보다도 생산성 측면에서 보자면 VB만한 것이 없거늘...

많은 개발자들이 OOP 언어로 Procedural 코딩을 늘어놓는 안타까운 현실을 보고 있노라면 제대로 훈련된 VB개발자가 오히려 생산성 높고 안전한 바이너리를 만들어 낼 수 있다는 나의 생각은 지금도 변함이 없다.

토발즈 가라사대

“For example, I personally believe that Visual Basic did more for programming than “Object-Oriented Languages” did. Yet people laugh at Visual Basic and say it’s a bad language, and they’ve been talking about OO languages for decades.
And no, Visual Basic wasn’t a great language, but I think the easy DB interfaces in Visual Basic were fundamentally more important than object orientation is, for example.”

팽귄아빠가 참 옳은 소리 한거다. <img alt=" src="smilies/happy.gif">

# Saturday, August 25, 2007
Saturday, August 25, 2007 12:36:00 PM (Korea Standard Time, UTC+09:00) ( Microsoft | Silverlight )
image

지난 주 Microsoft에서는 Silverlight를 이용한 새로운 검색 사이트인 Tatifi Beta를 공개했다.
Tatifi가 뭐냐고? 스와힐리아어로 "Do Search" 라는 뜻이란다.

검색엔진은 MS Live Search를 이용했으며, 검색결과를 Clipping하여 해당 결과를
Tree 형태로 보여주는 기능을 가지고 있다.
이와 함께 RSS, Image, 신문, 도서 검색 기능이 제공된다.

사실 새로운 형식의 검색엔진이라는 의미 보다는 Silverlight를 활용한 사이트라는 점이 보다 부각된다.

이미 다른 것들은 기존에 제공되고 있었던 것들을 Mesh-up 한 것에 불과하다.
사실 이 사이트에서 제공되는 기능들 중 어느 하나도 Flash로 대체할 수 있는 기능들인데...
이미 이전 기술로도 충분히 구현할 수 있는 것들이라는 것이다.

오히려 새로운 플랫폼, 새로운 UX라고 하는 측면에서 MS가 "Silverlight란 새로운 UX환경을 이렇게 만들기 위해 개발된 것이다!" 라고 하는 것을 어필해 주었으면 한다.

엄밀히 Silverlight는 Flash의 아류는 절대 아니다!
하지만 MS 스스로 이러한 점을 잊지 않고 다른 개발자들에게 보다 UX라고 하는 관점을,
Flash적인 생각을 뛰어 넘을 수 있는 새로운 컨셉도 기술과 함께 제시해 주었으면 하는 아쉬움을 갖게한다.

# Thursday, August 23, 2007
Thursday, August 23, 2007 7:32:17 AM (Korea Standard Time, UTC+09:00) ( .net | DataGridView | Winform )

(Moving focus to next cell when 'Enter' key is pressed in DataGridView)

비따 회원 중 한분이 DataGridView에서 데이터를 편집시 Enter Key를 입력하면 왜 다음 셀로 이동하지 않고 다음 행으로 옮겨 가는지, 여간 불편하지 않다라는 질문을 해 왔다.

왜 DataGridView에서는 Enter키를 입력하면 다음 행의 셀로 이동하는 것일까?
해답을 찾기 위해 일단 Reflector를 통해 DataGridView에서 EnterKey가 입력될 때 수행하는 동작이 들어있는 DataGridView의 ProcessEnterKey 를 열어 보았다.

<SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Protected Function ProcessEnterKey(ByVal keyData As Keys) As Boolean
    Dim moved As Boolean = False
    Dim flag2 As Boolean = True
    Dim flag3 As Boolean = True
    If ((keyData And Keys.Control) = Keys.None) Then
        flag3 = False
        keyData = (keyData And Not Keys.Shift)
        flag2 = Me.ProcessDownKeyInternal(keyData, moved)
    End If
    If Not moved Then
        Dim dataGridViewCurrentCell As DataGridViewCell = Nothing
        If (Me.EditMode = DataGridViewEditMode.EditOnEnter) Then
            If (Me.ptCurrentCell.X <> -1) Then
                dataGridViewCurrentCell = Me.CurrentCellInternal
                Dim args As DataGridViewDataErrorEventArgs = _ 
                  Me.CommitEdit((dataGridViewCurrentCell), _
                  (DataGridViewDataErrorContexts.Commit Or _
                  DataGridViewDataErrorContexts.Parsing), _
                  DataGridViewValidateCellInternal.WhenChanged, _
                  False, False, False, False, False) If ((Not args Is Nothing) AndAlso args.ThrowException) Then Throw args.Exception End If End If Else Me.EndEdit((DataGridViewDataErrorContexts.Commit Or
            DataGridViewDataErrorContexts.Parsing), _
            DataGridViewValidateCellInternal.WhenChanged, False, False, _       
            False, False, False, True, True, True) End If If (Not flag3 OrElse Not Me.IsCurrentRowDirty) Then Return flag2 End If dataGridViewCurrentCell = Nothing Dim x As Integer = Me.ptCurrentCell.X Dim y As Integer = Me.ptCurrentCell.Y If Me.IsInnerCellOutOfBounds(x, y) Then Return flag2 End If If Me.OnRowValidating((dataGridViewCurrentCell), x, y) Then Return flag2 End If If Me.IsInnerCellOutOfBounds(x, y) Then Return flag2 End If Me.OnRowValidated((dataGridViewCurrentCell), x, y) End If Return flag2 End Function

다른 코딩들은 잘 분석해 보시고~ 여기서 붉은 색으로 표시되어 있는 부분을 살펴보면 짐작할 수 있듯 알아서~ 다음 행으로 CurrentCell을 이동시키는 코드가 들어있다.

 

이를 가로채기 위해서 일단 ProcessCmdKey 메서드를 Override 하기로 한다. ProcessCmdKey가 뭐냐구?
ProcessCmdKey 메서드란 컨트롤에서 명령키를 처리하기 위해 메세지를 전처리하는 동안 발생하는 메서드이다.(말이 어렵나? 나도 설명하기 어려워서 MSDN의 설명을 그대로 차용했다) 예기인 즉슨 컨트롤에 키가 입력되면 먼저 가로챌 수 있는 곳이라 생각하면 되겠다.

또 하나 처리해 줘야 할 메서드는 ProcessDataGridViewKey 이다. 해당 메서드는 DataGridView컨트롤에서 이동을 위한 키 입력시 입력된 키를 가로챌 수 있는 부분이다. 이 역시 앞서 설명한 ProceddCmdKey와 동일한 메서드이나, DataGridView에 특화된 메서드라 생각하자.

이 두개의 메서드에서 EnterKey가 입력으로 들어오면 기존에 정의된 ProcessDownKeyInternal 을 호출되기 때문에, EnterKey를 Right키로 가로채 바꿔치기를 하면 된다.

Public Class MyDataGridView
    Inherits System.Windows.Forms.DataGridView 

    Private isAutoCellMoved As Boolean = False
    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, _                                                 
                                                ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If (Me.CurrentCell.ColumnIndex <> Me.ColumnCount - 1) AndAlso (keyData = Keys.Enter) Then
            Return Me.ProcessRightKey(keyData)
        End If
        Try
            Return MyBase.ProcessCmdKey(msg, keyData)
        Finally
            If keyData = Keys.Enter Then
                If Me.Rows.Count <> Me.CurrentCell.RowIndex + 1 Then
                    Me.CurrentCell = Me(0, Me.CurrentCell.RowIndex + 1)
                    isAutoCellMoved = True
                End If
            End If
        End Try
    End Function 

    Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
        If isAutoCellMoved Then
            isAutoCellMoved = Not isAutoCellMoved
            Return True
        End If 

        If (Me.CurrentCell.ColumnIndex <> Me.ColumnCount - 1) AndAlso (e.KeyData = Keys.Enter) Then
            Return Me.ProcessRightKey(e.KeyData)
        End If
        Return MyBase.ProcessDataGridViewKey(e)
    End Function 

위의 코드를 잘 보면, EnterKey가 입력될 시, ProcessRightKey를 호출하여 마치 Right 키를 누른 것 처럼 메세지를 넘겨 버리는 것을 알 수 있다.
하지만 무작정 Enter를 친다고 Right Key가 눌려진 것 처럼만 한다면 어떻게 될까?

맨 마지막 컬럼에서 EnterKey를 치게 되면 원래 ProcessRightKey의 기본 행태인 다음 행의 동일한 컬럼으로 포커스가 이동되고 만다.
하지만 원래 우리가 원하는 것은 맨 마지막 컬럼까지 포커스가 이동했다면, 다음번 EnterKey에는 그 다음 행의 첫번째 컬럼으로 가는 것이 보기도 좋고,
기본적으로 어플리케이션 사용자들이 그리드에서 다수의 데이터를 입력하고자 할때 편의를 제공해 줄 수 있을 것이다.

그래서 일반적은 경우에는 ProcessRightKey를 호출하지만, CurrentCell이 마지막 컬럼에 위치하고 있을 경우에는 직접 CurrentCell을 다음 행의 첫번째
컬럼으로 이동시키게 하는 코드를 추가했다. 또 하나 CurrentCell이 맨 마지막 행, 마지막 컬럼에 위치하고 있다면? 그냥 둔다 <img alt=" src="smilies/happy.gif">

개발자들의 취향에 맞게 고쳐쓰면 될 듯 싶다.

상용 컴퍼넌트를 구매하지 않고 기본 컨트를을 통하여 우리의 입맛에 맞게 바꾸기 위해 이러저러한 궁리와 코딩을 하다보면, 컴퍼넌트 가격이 참 저렴하다라는 생각이 든다.

비싼 개발자들의 인건비를 100만원정도 하는 상용컨트롤 구매와 맞 바꾸려 하다니 -.-
개발자는 자고로 비지니스로직 구현에만 전념할 수 있도록 하면 되거늘... 

여전히 시장선 개발자의 인건비가 X 값이다

에휴우....