Archive for the ‘개소리’ Category

doctest-php

Saturday, February 9th, 2008

파이썬에는 doctest라는 모듈이 있습니다. 이게 무엇에 쓰는 물건인고 하니, 파이썬 코드 안에 있는 주석을 테스트를 하는 데에 쓰입니다. 간단한 예를 들어보겠습니다.

def factorial(n):
  """
  정수 n의 팩토리얼을 돌려줍니다.
  >>> factorial(0)
  1
  >>> factorial(5)
  120
  """
  if n == 0: return 1
  else: return n * factorial(n - 1)

import doctest; doctest.testmod()

factorial 함수의 선언 바로 다음에 나오는 주석을 docstring이라 부릅니다. 마지막 줄에서 doctest 모듈을 사용하여 현재 모듈을 테스트하도록 하면, docstring에 포함된 파이썬 코드가 실행되고 그 다음 줄에 있는 예상 실행 결과와 일치하는지 확인하여 잘못된 경우 오류를 보여줍니다.

이 테스트 방식의 이점은 새로운 API(XUnit 류의)를 익히지 않고도 손쉽게 단위 테스트를 할 수 있다는 것입니다. 문서가 곧 테스트이니, 이것은 BDD에서 말하는 ‘스펙’과도 같은 것입니다.

Ian Bicking의 글을 읽던 도중 감동(?)을 받아 PHP에서도 doctest를 할수 있게 하고 싶었습니다. (루비자바스크립트를 위한 것은 이미 있습니다.) 루비나 기타 언어에 비해 표현력이 떨어지는 PHP에서는 이런 식의 테스트가 더욱 더 강한 힘을 가질 것입니다.

그래서 연휴 마지막 날을 투자하여 PHP를 위한 doctest 라이브러리를 시험적으로 만들어 보았습니다. 이런 식으로 쓸 수 있습니다.

<?php
/**
 * 정수 $n의 팩토리얼을 돌려줍니다.
 *
 * php> factorial(0)
 * 1
 * php> factorial(5)
 * 120
 */
function factorial($n) {
	if ($n == 0) return 1;
	else return $n * factorial($n - 1);
}

require_once 'DocTest.php';
DocTest::testFile(__FILE__);
?>

간단하죠? 파이썬의 doctest와 별로 다를 것은 없습니다. 성공하면 아무런 메시지도 출력하지 않습니다. 이번에는 일부러 실패하도록 120을 720으로 바꿔 실행해봅시다.

File "example.php", line 7
Failed example:
        factorial(5)
Expected:
        720
Got:
        120

아직 간단한 기능만 지원합니다만, 추후 다음과 같은 기능을 추가할 예정입니다.

  • 콘솔이 아닌 웹 상에서의 테스트 인터페이스 제공
  • PHP 코드의 주석 외에, 일반 문서에 삽입된 코드를 테스트하는 기능
  • 자세한 출력을 제공하는 옵션
  • javadoc 스타일(/** */)이 아닌 형태의 주석 지원

서브버전 저장소에서 내려받을수 있습니다.

Code Golf: Choose

Thursday, January 17th, 2008

코드 골프는 주어진 문제를 누가 더 짧은 코드로 푸는지 겨루는 사이트입니다. 어제 새로운 문제가 올라와서 파이썬으로 풀어봤습니다. (현재 7등, 56바이트)

이번 문제의 제목은 Choose로, 두 개의 숫자가 주어지면 조합(Combination)을 구하는 것입니다. 처음 봤을 때는 쉬울 것 같았는데, 방법이 꽤 여러가지라 생각보다 어려웠습니다.

일단 입력은 이런 식으로 주어집니다.

100, 3

다른 문제는 대부분 파이썬이 입력에서 불리했는데, 이 문제는 입력 받기가 아주 쉽습니다. 파이썬 내장 함수 중에 input이 있는데, eval(raw_input())과 동일한 결과를 냅니다. 즉, 여기에서는 (100, 3) 튜플을 돌려받는 것이죠.

이제 입력을 받았으니 계산을 해봐야겠죠? 처음에는 팩토리얼을 구현한 뒤 그걸 가지고 정석적인 방법으로 풀어봤지만, 너무 길어서 순위권 안은 도저히 무리였습니다. 그래서 재귀적인 방법이 없나 생각해보다가 그걸 사용했습니다. (아래는 의사 코드)

f(n, k) = n * f(n - 1, k - 1)
f(n, 0) = 1

그게 성공한 코드 중에 가장 짧았습니다. 몇 가지 코드는 테스트에 실패했는데요, 재귀적인 방법과 같은 방식을 반복적인 것으로 풀어놨는데, int와 float의 타입 차이로 인해 1씩 오차가 생겨버려서 (2바이트 더 짧은데 ㅠㅠ) 어쩔 수가 없더군요. 무작위로 생성된 테스트 부분에서 실패하는 것도 아니라서…

대체 현재 1등인 39바이트는 어떻게 한 건지, 참 대단합니다.

안녕, PHP 4

Tuesday, July 17th, 2007

PHP 팀이 PHP 4의 개발 중단을 공식적으로 발표했습니다. 당장 개발이 중단되는 것은 아니고, 올해 말까지 계속 릴리즈를 하고 내년 8월 8일까지는 보안 문제가 발견되면 대처할 것이라고 합니다.

2004년 7월 13일에 PHP 5.0.0이 나온 이후 벌써 3년이 지났지만 우리나라건 해외 업체이건 대부분의 호스팅 서비스에서 여전히 PHP 4를 사용하고 있습니다. 하지만 PHP 5는 아주 약간의 차이점을 제외하면 4.x 버전과 하위 호환성을 유지하고 있습니다. 그럼에도 불구하고 PHP 5로 전환하는 업체는 거의 없었습니다.

PHP 팀은 PHP 4와 PHP 5, 거기에 현재 개발중인 PHP 6의 소스 트리 전체를 관리하고 있습니다. 이게 얼마나 큰 손실입니까? PHP 5.2는 향상된 객체 기반(object-oriented) 프로그래밍 지원과 더 나은 속도, 안정성을 제공하며, SimpleXML을 통한 손쉬운 XML 처리, PDO로 통일된 데이터베이스 접근 인터페이스를 사용할 수 있습니다.

이에 GoPHP5 운동(?)이 시작되었습니다. Gallery와 phpMyAdmin을 비롯한 다수의 프로젝트들이 PHP 5.2로의 전환을 약속하고 있습니다. 성공한 프로젝트들이 PHP 5.2로 전환하면서 많은 사용자들도 그 변화를 따라가게 될 것입니다. (하지만 저는 회의적입니다. 계속 기존 버전을 쓸 것 같은데?)

그러나 Wordpress의 리더 개발자 Matt처럼 강제로 PHP 5로 이주할 것을 요구하는 움직임에 대해 반발하는 사람들도 생기고 있습니다. 그는 GoPHP5 운동이 순전히 정치적이고 감정적인 것에서 비롯되었고, 사용자들의 노력만 들게 한다고 비판합니다. 물론 그의 말도 맞긴 하지만, 개발자의 입장에서 보기에는 잘 이해가 안되긴 합니다. (물론 Matt도 개발자이긴 하지만요.)

어느 한 쪽의 시각이 절대적으로 맞다고 할 수는 없지만, PHP 4의 개발이 중단되더라도 누군가는 계속 쓸 것이라는 생각이 듭니다. 어쨌든 저는 PHP 5로의 전환을 권합니다. 그게 더 손해일지라도 말이죠…