티스토리 툴바


맥 사파리에서 사전 사용하기

컴퓨터 2011/09/17 01:08 Posted by 엑스터

웹 서핑 도중에 영어 단어의 뜻을 찾아보기에는 크롬이나 파이어폭스가 편했다.

단어에 마우스를 오래 대고 있으면 자동으로 툴팁으로 단어의 뜻이 뜨게 되므로 별 다른 동작없이도 사전 기능을 사용할 수 있다.

맥의 경우 최근 사파리 업데이트 이후에 사파리에서의 사용성이 많이 나아져서 사파리를 써볼까 생각 중인데, 사전 기능이 생각보다 중요한 점이어서 제대로 사용하지 못하는 상황이었다. 그러다가 사파리에서 맥의 사전 기능을 쓸 수 있는 방법을 찾았다. (맥에 사전 기능이 있는지도 몰랐다.)

모르는 단어에 마우스를 대고 Command + Control + D 를 누르면 노랗게 선택이 되면서 사전이 표시된다. 사파리에서 뿐 아니라 일반적인 코코아 어플리케이션에서는 다 사용할 수 있는 기능이라고 하니 쓸모있을 것 같다.

마우스 갖다 대고 기다리면 툴팁으로 나오는 것이 좀 더 편하고 좋은 것 같지만, 사파리의 여러가지 사용성 (전체 화면 기능, 제스쳐 기능, 확대 기능)을 포기하기에는 부족한 듯 하다.

오랜만의 엑스퍼 모임

개발 2011/08/26 10:11 Posted by 엑스터

몇 개월만인지는 모르겠지만 정말 오랜만에 엑스퍼 모임을 가졌다.

애자일 컨퍼런스의 참석 발표의 경우 구체적인 내용보다는 컨퍼런스 전체를 관통하는 흐름에 대한 내용과 세션에 대한 기본적인 감상, 추가로 찾아볼 수 있을만한 포인트 정도만 언급해주었는데, 개인적으로 대충 적어온 내용을 보면...

  • 메리 포펜딕 Design Thinking
  • Agile Game, Cup Cake
  • Team Traps
  • Visual Portfolio Management
  • Agile Mindset
  • Dear ?? 회고
  • 5 whys

새로운 회사로 옮긴지 얼마 되지는 않았지만, 만약 애자일의 내용들을 적용하고자 한다면, 우선 회고를 도입하도록 하고, 커뮤니케이션을 늘리는 것부터 해야 할 것 같다. 이전에는 회고에 대한 내용을 너무 무형식적으로 진행했는데 산으로 가는 경향이 있어서 좀 더 형식을 갖추어서 집중할 수 있는 방법을 사용해야 할 것 같아서 마지막의 회고에 대한 내용을 바탕으로 그 분야는 좀 더 잘 검토해 봐야겠다.

엑스퍼 모임에 참여한 것이 2년 가까이 되어 가는데 이제 사람들 얼굴이 조금씩 익어가고 말도 조금씩 더 나눌 수 있게 된 것 같은데, 이제 시작이라고 생각해야하나?

SQL Server 를 직접 사용해본 적이 없어서 클러스터드 인덱스와 넌클러스터드 인덱스에 대해서 제대로 알지 못하고 있었는데, 최근 MySQL 엔진들의 특성에 관한 세미나를 듣다가 이에 대한 이야기가 나왔고, 그 자리에서 엉뚱한 소리를 했다가 완전 멍청한 소리를 해 대는 바람에 조금 더 자세히 알아보자는 마음을 먹고 찾아봤다.

클러스터가 군집이라는 의미를 가지고 있 듯 (이전까지는 이 의미를 잘 몰랐다.) 클러스터드 인덱스는 인덱스의 순서대로 실제 레코드가 존재하는 것을 의미한다. MySQL 의 경우 InnoDB 등이 지원을 하고 있고 SQL Server 의 경우 인덱스 설정 시 지정할 수 있다. InnoDB 의 경우 인덱스의 말단 노드에 실제 레코드의 데이터가 같이 들어있다. 클러스터드 인덱스에 새로운 레코드를 추가할 경우 인덱스 순서에 따라 맨 마지막 부분에 레코드가 추가되면 큰 문제없이 데이터의 마지막에 레코드가 추가된다. 하지만 인덱스에 따라 중간에 레코드가 추가된다면 데이터의 순서를 재조정하게 되어 데이터 저장의 효율이 떨어지게 된다. 이 때 데이터 순서를 조정하기 위해서 페이지를 분리해야할 필요가 생기는데 이렇게 되면 한 페이지를 모두 쓰지 못하는 단편화 현상이 발생하게 된다. 데이터를 읽을 때는 인덱스와 레코드가 같이 페이지에 들어있기 때문에 한 번 페이지를 읽어서 데이터를 꺼낼 수 있게 되어 IO 에 이득을 얻을 수 있고, 인덱스의 순서대로 레코드가 정리되어 있기 때문에 특정 영역의 인덱스에 해당하는 데이터를 읽어야 할 경우에는 성능 상의 이득을 얻게 된다. 당연한 말이겠지만 클러스터드 인덱스의 경우 하나의 테이블에는 최대 한 개의 클러스터드 인덱스를 가질 수 있다. InnoDB 의 경우 레코드를 추가할 때 반드시 하나의 클러스터드 인덱스를 선택해서 레코드를 추가하게 된다.

InnoDB 의 클러스터드 인덱스 선택 방식은 다음에서 볼 수 있다. http://dev.mysql.com/doc/refman/5.1/en/innodb-index-types.html

간단히 정리히자면 다음과 같다.

  • 기본 키가 있으면 기본 키를 클러스터드 인덱스로 활용한다.
  • 기본 키가 없는 경우 가장 처음 나오는 기본 키로 활용할 수 있는 인덱스 (유니크 NOT NULL) 를 클러스터드 인덱스로 활용한다.
  • 위의 경우에도 해당되지 않는다면, 숨겨진 자동 인덱스를 하나 만들어서 클러스터드 인덱스로 활용하여, 입력된 순서대로 키와 레코드를 유지할 수 있게 한다.

넌클러스터드 인덱스의 경우 클러스터드 인덱스와는 다르게 인덱스의 순서와 데이터의 순서가 연관이 없는 경우이다. 데이터는 넌클러스터드 인덱스와는 상관없는 순서로 저장되게 되며, 인덱스에서는 데이터에 접근할 수 있는 정보를 가지게 된다. MySQL 의 경우는 MyISAM 의 모든 인덱스와 InnoDB 의 클러스터드 인덱스가 아닌 인덱스의 경우에 넌클러스터드 인덱스가 구성된다. MyISAM 엔진을 사용하는 경우 추가되는 레코드는 모두 기존의 데이터 뒤에 붙어서 저장된다. 따라서 클러스터드 인덱스를 따라서 레코드가 저장되는 InnoDB 와는 다르게 레코드 순서 재구성의 문제가 없어 빠르게 레코드를 추가할 수 있다. MyISAM 엔진의 인덱스에서는 실제 레코드를 찾기 위해서 레코드의 페이지 위치를 나타내는 정보를 가지고 있게 된다. InnoDB 의 경우 해당 레코드를 참조할 데이터로 클러스터드 인덱스의 값이 저장되어 있다. InnoDB 의 경우 클러스터드 인덱스로 사용되는 것의 인덱스 크기가 크게 되면, 그에 따라 넌클러스터드 인덱스에 저장되는 양도 커지게 된다. 또 넌클러스터드 인덱스를 찾은 후 다시 클러스터드 인덱스를 찾는 과정을 거쳐야 해서 약간의 손해가 있게 된다.

정말 DB 는 끝이 안 보이네.

저작자 표시
코드 퀄리티 관리

코드 퀄리티는 관리하기 어렵다. 특히 지속적으로 변경되는 코드는 청소와 같이 매일매일 지저분한 내용이 생기게 되고 이를 제대로 처리하지 못하면 쉽게 깨진 창문 효과를 일으키게 되며, 대규모의 라이브 게임의 경우 그 규모로 인해 슬럼화가 되어 버릴 수 있다. 코드 퀄리티가 나빠지는 건 결국 어쩔 수 없는 사실이라고 여겨야 한다. 하지만 관리를 위해 노력하는 정도에 따라서 망가지는 정도에는 차이가 크게 된다. 소스 코드를 변화하는 데이터로 생각해서 자동화와 시간에 대한 초점을 맞추어 관리를 해보도록 하자.

변동성

소스코드의 변동성이라는 것을 염두에 두고 각 프로그래밍 요소의 의존관계를 변동성이 낮은 쪽으로 가지고 갈 수 있도록 하게 되면 적절한 코드 퀄리티의 관리를 쉽게 할 수 있다. 많은 곳에서 이러한 변동성에 따른 의존관계 설정의 예를 볼 수 있다.
.cpp => .h
데이터 타입 =>알고리즘 (템플릿)
구현 => 인터페이스
로직 => 엔진
데이터 => 코드

변동성 측정

그렇다면 각 요소의 변동성을 가시화할 수 있다면 쉽게 관리해야할 영역을 선택할 수 있을 것이다. 이미 사용하고 있는 SCM 의 저장소 내용을 분석하여 변동성을 측정해보기로 한다.

가장 쉽게 할 수 있는 것은 단위 시간 별 파일의 변화량을 추출하여 분석할 수 있다. 가장 빈번히 변경되는 파일을 추출할 수 있고, 거의 변경이 없는 파일도 추출할 수 있다. 변경없는 요소는 라이브러리로 만들 수도 있고, 유니티 빌드에서 하나로 묶어서 빌드 시간을 단축시킬 수 있다. 빈번히 변경되는 파일 중에서도 의존 관계를 따져서 파급력이 큰 파일을 선택하게 되면 쉽게 문제가 되는 지점을 파악할 수 있다.

파일 레벨 외에도 함수별 변화량을 살펴볼 수도 있겠다. 각 라인을 diff 알고리즘으로 비교할 수도 있지만, 의미있는 값을 얻지는 못했다. 또 리비전 로그의 종류를 살펴보고 종류별 변화량을 파악할 수도 있다.

지속 가능성

코드 퀄리티의 지속적 관리를 위해서는 단 번에 개선을 시키는 것으로는 어렵다. 점진적으로 정리를 해 나가야 하고, 지속적으로 관리를 할 수 있어야 한다. 그러기 위해서는 공정에서의 개선이 필요하다. 공정 개선을 위한 팁으로는 다음과 같은 것이 있다.

Assert : Assert 를 다양하게 구성하여 문제가 될만한 것들을 쉽게 파악할 수 있도록 한다.
Validation : 서브버전 커밋 훅을 사용하여 문제의 여지가 있는 것을 미리 걸러낼 수 있다.

결론

재미있고 신선한 세션이었다. 이렇게 저렇게 이야기 되고 있던 내용이 변화량이라는 것으로 실체화되는 것도 재미있었고, 실제 게임의 각 저장소 내용을 분석한 결과도 재미있었다. 그냥 안 좋아보이는 곳을 바꾸는 것이 아닌 변화량과 파급력을 보고 가장 효과적인 부분을 수정하는 것이 좋다는 것과 다양한 기법을 이용해서 지속 가능하게 만드는 것에 대해서 적극적으로 적용해볼만할 것 같다.


저작자 표시
TAG NDC2011