
사무실이 강변역 바로 옆이다. 그리고 집은 강변역에서 버스를 타고 간다. 늦은 시간까지 외부에서 다른 일을 보다 집에 갈때 버스를 타기 위해 강변역을 들려야 한다.. 하지만 지금처럼 다소 늦은 시간이면 집 대신 사무실로 발길을 돌린다..
저작권 침해에 따른 형사처벌 증가
한미 FTA 협정에 관련하여 오픈소스에 대한 라이선스 소송에 대한 글입니다.
한-미 FTA 협정 이행에 따른 저작권법 개정에 따르면, 저작권자가 저작권 이슈를 문제 삼지 않더라도(고소하지 않더라도), 그 침해가 영리를 목적으로 하거나 상습적이기만 하면, 형사처벌이 가능하게 되었다. 따라서 공개 SW를 도입하여 영리 또는 상습적으로 사용하는 기업 또는 개인 개발자들이 해당 라이선스 준수 의무를 지키지 아니하면, 공개 소프트웨어 커뮤니티에서 문제 삼고 있지 아니하더라도, 검찰 직권 또는 제3자 고발에 의하여 공소를 제기당할 수 있는 것이다. (이하 생략 …)
이 기사는 자작권 침해에 대한 고발이 비친고죄의 형태로 변경됨으로써 우려와 기대를 동시에 다룬내용입니다. 소스가 오픈되었다고 하여 라이선스의 본래 의미와 상관없이 마음대로 사용할 수 있다는 논리가 얼마나 잘못되었고 위험한지를 깨달았으면 좋겠습니다. 세계적으로.. 그리고 국내에서만 해도 무형의 가치를 생산해 내는 소프트웨어 개발자들의 수는 이미 유형의 산출물을 생산해 내는 생산자 수만큼이나 많습니다. 유형의 자산에 대해서는 그 가치를 인정하면서 무형의 가치에 대해서는 아직까지도 인정하지 못하는 몰지각함에 대한 자각이 있었으면 합니다.
말라 죽어버린 잎을 모두 잘라내다..
작년말.. 그러니까 12월에 회사를 옮길때.. 한겨울 너무 추운 날이라 그랬는지 행운목의 잎이 동상을 입어 말라 죽어갔습니다..

다행히 모든 잎이 말라 죽지 않고 몇개가 말랐고.. 마른 잎이 자연스럽게 떨어 지기를 기다릴 요량으로 건들지 않고 가만히 기다렸습니다.. 그러다가 오늘 말라 죽어가는 잎만을 골라 모두 다 잘라내었습니다..
죽은 잎을 잘라내고 행운목을 다시 보니.. 마치.. 머리를 덮수룩하게 기르다가 이제 방금 이발을 한 것처럼 말끔하고 더욱 생기있어 보입니다.. 진작에 잘라내 버릴 것을 그랬습니다… 올해에 들어 가장 잘한 일 같다는 생각마저 듭니다..
문득 지금까지 살아오며 내 생각들 중에.. 행운목의 말라 죽어버린.. 거추장스러운 잎처럼 나를 복잡하게 만드는 것은 무엇일까 하는 생각이 듭니다…. 말라 죽어버린 잎처럼 잘못된 생각들.. 또 내게는 맞지 않는 생각들이 있다면 과감히 잘라내야겠습니다..
.NET ListView 컨트롤의 가상모드(VirtualMode) 사용하기
.NET의 리스트뷰에는 가상모드를 지원합니다. 상당히 많은 수의 데이터를 리스트뷰의 항목으로 추가할때 속도면에서, 메모리 면에서 효율적으로 화면에 표시하기 위한 목적으로 사용할만한 매우 좋은 방법입니다.

위의 화면은 리스트뷰 컨트롤의 View 속성을 Details로 하여 그리드(Grid) 형태로 데이터를 표시하고 있습니다. 좀더 자세히 설명하면 SHP 파일에 대한 속성을 전체적으로 살펴볼 목적으로 만들어진 UI 입니다.
일반적으로 SHP 파일을 구성하는 레코드의 개수는 적게는 수십개에서 많게는 수천만개 정도됩니다. 개수가 매우 많을 경우 레코드를 한번에 리스트뷰 컨트롤에 올려 놓을 경우 UI이 얼어버리는(Freeze) 현상이 발생하고 스크롤시 매우 느린 경험을 하게 됩니다.
이럴때 가상모드를 활용해 언급한 문제를 말끔히 해결할 수 있습니다. 리스트뷰에서 가상모드를 사용하기 위해서 최소한 3가지 작업을 해줘야 합니다. 먼저 리스트뷰 컨트롤의 VirtualMode를 true로 지정하기와 다음으로 리스트뷰에서 표시할 항목의 정확한 개수를 지정하기 위한 리스트뷰 컨트롤의 VirtualListSize 값의 지정입니다. 사용자에게 제공해야할 항목의 개수가 백만개라면 이 VirtualListSize의 값을 백만으로 주면됩니다. 그리고 끝으로 실제 제공할 데이터를 필요할때 마다 그때 그때 제공해주는 RetrieveVirtualItem 이벤트 함수입니다.
private void lvAttributes_RetrieveVirtualItem(object sender,
RetrieveVirtualItemEventArgs e)
{
Xr.StopMapDrawing();
int FID = e.ItemIndex;
XrMapLib.AttributeRow Row = SML.AttributeTable.GetRow(FID);
if (Row != null && Row.Load())
{
e.Item = new ListViewItem();
e.Item.Text = FID.ToString();
int ToIndex = (lvAttributes.Columns.Count - 1);
for (int iField = 0; iField < ToIndex; iField++)
{
String FieldValue = Row.GetValueAsString(iField);
e.Item.SubItems.Add(FieldValue);
}
Row.Unload();
}
}
위의 코드 중 중요한 부분은 e.Item에 제공할 리스트뷰의 항목을 생성해 할당한다는 것입니다. 이정도의 코드만으로도 가상모드를 충분히 실무에서 적용해 활용할 수 있지만 이에더해 캐쉬 기법을 제공함으로써 더욱 속도를 향상시킬 수 있는 방법을 제공합니다.
끝으로, 가상모드가 항상 모든 경우에서 좋은 것은 아닙니다. 필요할때마다 그때 그때 데이터를 가져오므로 전체 항목에 대한 정렬과 같은 기능을 제공할 수 없다는 점 역시 주의하시기 바랍니다.
[JavaScript] 주의해야 할 ‘변수에 대한 호이스팅(hoisting)’
자바스크립트에서 변수에 대한 호이스팅이라는 개념이 있습니다. 함수 안에 정의된 모든 변수는 선언된 그 위치에 상관없이 함수의 윗부분으로 끌어올려(hoist)된다라는 개념입니다. 여기서 주의할 점은 자바스크립트에서 함수도 객체 변수이며 이 함수가 호이스팅될때입니다.. 함수를 정의하고 선언하는 방법을 크게 2가지로 구분할 수 있습니다.
- 표현식에 의한 정의
- 선언문에 의한 정의
먼저 표현식에 의한 정의의 예는 다음과 같습니다.
var bar = function() {
// 표현식에 의한 함수 정의
};
다음은 선언문에 의한 정의의 예입니다.
function foo() {
// 선언문에 의한 함수 정의
}
이러한 함수 정의가 함수 안에서 이루어질때 호이스팅에 차이가 발생하게 됩니다.
function test() {
alert(typeof foo);
alert(typeof bar);
function foo() {
// 선언문에 의한 함수 정의
}
var bar = function() {
// 표현식에 의한 함수 정의
};
}
test();
위의 코드를 실행해 보면 처음에는 “function”이라는 메세지가 표시되고 다음에는 “undefined”라는 메세지가 표시됩니다. 이는 표현식에 대한 함수 정의시에 함수 객체가 호이스팅될때 함수의 코드부분은 호이스팅되지 않지만 선언문으로 함수가 정의될 경우에는 함수의 코드부분까지도 호이스팅된다는 것을 알 수 있습니다.
