Monthly Archives: March 2008

Trac report #2 사용자별 최근변경사항

사용자별 최근 변경 사항 보는데 Trac report 만드는게 쉽지 않더군요. 더 쉬운 방법이 있는지 잘 모르겠지만… SQL 잘 하시는 분의 도움을 받아 만든 쿼리입니다. 저는 SQL을 잘게 짤라서 만드는 편인데, SQL 조금 복잡해지면 어렵고, 최적화도 어려워지죠.. 사용자 아이디와 출력되는 갯수가 하드코딩 되어야 해서 좀 그렇긴 하지만… 그래도 원하는대로 출력은 잘 해줍니다.

[code]
select
  p.value AS __color__,
  owner AS __group__,
  id AS ticket,
  (CASE status WHEN ‘assigned’ THEN owner||’ *’ ELSE owner END) AS owner,
  summary,
  component,
  priority,
  t.type AS type,
  status,
  time AS _created,
  changetime AS modified,
  description AS _description,
  reporter AS _reporter

from (

  select * from (SELECT * FROM ticket WHERE owner=’mix1009′ ORDER by changetime desc limit 0,5) u1

union

  select * from (SELECT * FROM ticket WHERE owner=’user2′ ORDER by changetime desc limit 0,5) u2

union

  select * from (SELECT * FROM ticket WHERE owner=’user3′ ORDER by changetime desc limit 0,5) u3

union

  select * from (SELECT * FROM ticket WHERE owner=’user4′ ORDER by changetime desc limit 0,5) u4

union

  select * from (SELECT * FROM ticket WHERE owner=’user5′ ORDER by changetime desc limit 0,5) u5

) t, enum p

where p.name = t.priority AND p.type = ‘priority’
order by owner, changetime desc
[/code]

CCCC – C and C++ Code Counter

cccc.sf.net 에 있는 오픈 소스 프로젝트입니다.

CI(Continuous Integration)에 대한 내용을 보면, 일차적으로 빌드 서버를 구축하여, 컴파일 오류등이 있을때 바로 개발자에게 피드백을 줍니다. 더 나아가, 테스트 케이스 등을 추가하여 테스트가 모두 통과하는지도 체크하고, 소스 구조 등을 체크하여 문제점을 점검하여 알려주도록 하고 있습니다. CI라는게 자바와 밀접한 관련이 있어서 대부분의 툴들이 자바를 위해서 개발되어 있습니다.

C++에서 사용할만한 소스 코드 체크 프로그램이 있나 찾다가 http://www.laatuk.com/tools/review_tools.html 에서 많은 정보를 얻을수 있었습니다. 많은 툴들이 있는데 종류도 좀 다양한 것 같습니다. 소스에서 문제점을 찾아주는 툴들도 있지만, 이런건 Numega Boundschecker를 사용하면 될거 같고, 자동으로 소스 코드의 문제점을 찾아주는 것은 한계가 있습니다.

여기 툴중에 CI에 통합해서 소스의 건전성을 나타내주는 잣대(metric) 정도로 활용할수 있는 툴을 골라봤습니다. CCCC의 이름을 보면 단순히 소스 라인수를 세는 툴 같지만 훨씬 더 많은 정보를 제공합니다. 아직 CI에 통합해서 쓸수 있을만큼 자유롭게 커스터마이징이 가능한지는 확인 못했지만, 여러가지 의미있는 분석 결과들이 나옵니다.

소스를 클래스별로 구분하여 소스라인수, 주석라인수, 복잡도 등을 분석하여 어떤 클래스가 일을 많이 하는지, 문서화가 덜 되어 있는지를 보여줍니다. 출력이 HTML로 나오는데 정렬이 안되는게 좀 아쉽네요. 액셀에 원하는 부분 붙여넣기하여 정렬하면 어느정도 편하게 결과를 볼수 있긴 합니다. 그리고, 클래스별로 정리해서 보여주기 때문에 전역 함수는 따로 봐야합니다. 전역 함수들은 anonymous 모듈에 들어갑니다.

분석 결과가 여러 항목별로 정리되어 나오는데, 아직까지는 Procedural Metrics Summary에 대한 내용만 대충 이해하고, 나머지는 좀더 연구해야 할것 같네요.

분석하면 5가지 항목으로 나누어 결과가 나옵니다.

  1. Project Summary : 전체 종합 정리입니다.
  2. Procedural Metrics Summary : 절차 중심 분석 (소스라인수, 주석라인수, 복잡도)
  3. Object Oriented Design : 얼만큼 객체 지향적으로 설계되었는지?
  4. Structural Metrics Summary: 각 모듈별 연관성을 분석
  5. Other Extents: 분석 실패한 부분에 대한 내용

여기서 나오는 약자와 용어들이 있는데…

  • NOM : Number of Modules 모듈수 (클래스수)
  • LOC : Line of Code (소스 라인수 – 주석 제외)
  • MVG : McCabe’s Cyclomatic Number (함수의 복잡도를 측정하는 단위)
  • Fan-out : 현재 모듈에서 사용하는 다른 모듈의 수 (현재 모듈에서 다른 모듈로 정보 전달)
  • Fan-in : 현재 모듈을 사용하는 다른 모듈의 수 (다른 모듈에서 현재 모듈로 정보 전달)
  • IF4 : Information Flow measure : 모듈간 정보 전달의 복잡도를 측정하는 단위

MVG나 IF4는 높을수록 복잡한겁니다. 낮게 해야 유지관리하기 편한 소스가 되겠죠.

MVG는 위키피디아에 잘 나와있으며, 복잡도 측정하는 단위로 소스에 얼마나 많은 실행 경로가 있는지를 분석하는 방법입니다. 분기가 전혀 없으면 1, if문이 하나 추가되면 2. 이런식으로 계산되는데 C에서 조건문 안의 (a && b)나 a?b:c 같은것도 분기에 해당하니 사람의 손으로 직접 계산하는 거는 쉽지 않습니다.

그럼 이제 CCCC의 사용방법을 보죠. 사용법은 간단합니다. 소스 분석 원하는 경로에서
유닉스라면 쉘에서

% find . | cccc –

윈도우즈에서는 CCCC Command Line에서

> dir /b/s | cccc –

하면 현재 디렉토리 밑의 모든 소스를 분석하여, .cccc 폴더 안에 cccc.html을 비롯하여 여러파일들이 출력됩니다. 종합 결과는 cccc.html에 있고, 각 클래스별로 html이 따로 생성되고 상세 정보를 포함하고 있습니다.

자세한 내용은 몰라도 빨간색과 노란색으로 문제 있는 부분을 보여줍니다.
위에서 언급한대로 필요한 부분 액셀로 복사해서 정렬해서 보고 있으며, 아직 Procedural Metrics Summary 부분만 유심히 보고 있습니다.