php에서는 array()를 이용하여 배열을 만들어 쓸 수 있다. php의 배열에는 numeric과 associative의 두 가지 타입이 있는데, numeric은 Java나 C/C++에서의 array와 비슷하다고 보면 된다.

$names = array("Peter", "John", "Joe");

와 같이 선언하면 다음과 같이 for문을 이용하여 출력할 수 있다. 여기서 array의 크기를 알기 위해서 count()함수를 이용하였는데, sizeof()를 이용해도 된다.

for ($i = 0; $i < count($names); $i++)
echo $names[$i];

그러나 Java나 C/C++과는 달리 array_push()함수를 이용하여 element를 더 추가할 수도 있다. 이 때 여러 element를 한꺼번에 추가할 수도 있다.

array_push($names, "Doug", "Brian");

associative array는 hashtable과 비슷한데, 0부터 생성되는 숫자로 된 index가 아닌 임의의 숫자/문자열을 index로 쓸 수 있다. 다음과 같이 선언할 수 있다.

$ages = array("Peter" => 32, "John" => 24, "Joe" => 50);

이 경우 다음과 같이 출력할 수 있는데,

echo "Peter's age is ".$ages["Peter"];

이 경우 index로 쓰인 숫자/문자열을 모두 알고 있어야 한다. 만약 모르는 경우에는 다음과 같이 foreach문을 이용하여 iteration할 수 있다.

foreach($ages as $idx=>$val)
echo $idx."'s age is ".$val;

마지막으로 php의 array도 다차원으로 선언해 쓸 수 있는데, 선언하는 방법은 다음과 같다.

$families = array(
"Peter"=>array("George", "Lois", "Megan"),
"John"=>array("Glenn"),
"Joe"=>array("Cleveland", "Loretta", "Junior"));

물론 다음과 같이 할 수도 있다.

$families = array();
$families["Peter"] = array();
$families["John"] = array();
$families["Joe"] = array();
array_push($families["Peter"], "George", "Lois", "Megan");
array_push($families["John"], "Glenn");
array_push($families["Joe"], "Cleveland", "Loretta", "Junior");

출력할 때는 일반적인 다차원 배열에 접근하는 방법과 동일하다.

echo "Peter has ".$families["Peter"][0]." in his family";

참조:
http://www.w3schools.com/php/php_arrays.asp
http://www.plus2net.com/php_tutorial/array_size.php
http://kr2.php.net/manual/en/control-st ··· each.php
2008/06/09 00:49 2008/06/09 00:49
Tag // ,

프로젝트가 워낙 커서 rebuild all을 거의 하지 않고 (rebuild all을 하면 4시간이 걸린다. 8개 CPU를 모두 다 써서 병렬로 컴파일하면 그나마 2시간 정도로 줄어들긴 하지만...) 수정한 모듈만 컴파일 해서 테스트를 하는데, 갑자기 내가 전혀 손대지 않은 곳에서 에러가 난다. 이럴 때는 그냥 새로 전체 rebuild를 해 주는 게 정신 건강에 좋다. 많은 경우 그냥 rebuild all로 문제가 해결되곤한다.

2008/05/27 17:01 2008/05/27 17:01

지난 몇 주간 갑자기 발생한 에러때문에 디버깅으로 시간을 다 보냈다. 덕분에 가끔 미투데이에 남기는 글들 외 따로 블로그에 글을 올리지도 못했다.

이번 문제는 새롭게 빌드한 바이너리1의 성능을 측정하기 위해 벤치마크 테스트를 준비하던 중 발생했다. 보통의 경우에는 미리 만들어 둔 데이타 이미지를 사용해서 성능 측정을 했었는데, 이번 바이너리의 경우에는 이미지의 포맷이 변경되는 바람에 기존 이미지를 가져다 쓰지 못하고 새롭게 만들어야 했는데, 그 과정에서 발생한 것이다.

원인을 분석하고 해결책을 찾아야 했는데, 도무지 원인을 파악할 수가 없었다. 여러 팀이 나누어 구현하고 관리하는 바이너리라 책임 소재를 찾기도 힘들었다. 게다가 디버깅용으로 같이 만들어지는 슬로우 바이너리2를 이용하여 문제를 파악하려고 했더니 슬로우 바이너리에서는 해당 문제가 발생하지 않았다. 진퇴 양난. 결국 선택한 건 지금까지 릴리즈한 바이너리들을 전부 테스트해 보고 처음 문제가 발생하는 바이너리를 찾아서 해당 릴리즈에 수정된 코드를 추가한 사람에게 책임을 묻는 방법이었다.

먼저 지금까지 테스트를 위해 사용해 왔던 테스트 데이타 이미지를 생성한 릴리즈 바이너리를 찾았다. 그 바이너리에서는 문제가 발생하지 않았으므로, 그 때를 기준으로 현재 바이너리까지 릴리즈 된 녀석들을 대상으로 바이너리 서치를 수행했다. 결론은 캘린더 위크 07~09 사이에 추가된 코드에 문제가 있을 것이라는 것.

해당 기간 동안 수정 된 코드를 Perforce3에 서브밋한 사람들을 불러 모아서 각자 자신의 수정 사항을 제거한 바이너리를 캘린더 위크 09에 릴리즈한 바이너리의 버전에 맞춰 빌드해 달라고 요청하였다. 이렇게 해서 받은 바이너리들을 테스트해서 결국 에러의 원인이 된 수정 사항을 발견할 수 있었다.

가만히 하나하나 따져가며 논리적으로 문제가 발생하는 부분을 찾아낼 수도 있겠지만, 이렇게 수정 사항들을 하나씩 되돌려보는 무식한 방법이 더 빨리 문제를 해결해 주기도 한다.

  1. 1~2주마다 한 번씩 릴리즈 바이너리를 빌드하고, 해당 바이너리의 성능을 측정한다.
  2. 트레이싱 정보를 출력해주는 바이너리다. 아무래도 많은 정보를 출력하다보니 작업 수행이 느려지게 되므로 슬로우 바이너리라 부른다.
  3. 버전 관리 시스템으로 perforce를 사용하고 있다.
2008/05/07 18:48 2008/05/07 18:48

자바의 GregorianCalendar를 이용하여 date를 계산하는 과정에서 문제가 발생해서 한 동안 애를 먹었다. 평소에 그냥 아무 문제 없이 돌아가던 테스트가 갑자기 에러를 발생시킨 것이다. 문제는 그 이후에 다시 그 문제가 발생하지 않았는데, 그냥 그러려니 하고 넘어가기에는 이해가 안가는 부분이 있어서 에러를 발생시킨 원인에 대해 알아봤다.

문제의 에러는 GregorianCalendar에 현재 timestamp를 저장해 놓고 add() method를 이용해서 13일씩 빼 나가던 중 발생했다. 테스트 시점의 timestemp는 2008-03-18 00:39:51이었고, 다음의 code를 실행시켰다. (그 후에는 아무리 같은 테스트를 수행해도 한 시간이 더해지는 경우는 생기지 않았다. ㅡ.ㅡ;;)

GregorianCalendar cal = new GregorianCalendar();
GregorianCalendar cal1 = (GregorianCalendar) cal.clone();
cal.setTime(new java.util.Date()); // 2008-03-18 00:39:51 이 저장되었다.
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

int step = 13;
for (int i = 0; i < 8000; i += step)
{
cal1.setTime(cal.getTime());
cal1.add(Calendar.DAY_OF_YEAR, -i);
System.out.println(df.format(cal1.getTime()));
}

척 보기에도 아주 간단한 코드인데, 문제는 아래와 같이 결과가 나오던 중 1988-05-08 01:39:51이라는 엉뚱한 값이 나와버린 것이다. 도대체 저 한시간이 어디서 더해진거란 말인가? ㅡ.ㅡ;;

2008-03-18 00:39:51
2008-03-05 00:39:51
2008-02-21 00:39:51
2008-02-08 00:39:51
...
1988-06-03 00:39:51
1988-05-21 00:39:51
1988-05-08 01:39:51 <- 여기가 문제의 값이 출력된 부분이다.
1988-04-25 00:39:51
1988-04-12 00:39:51
...

도전 정신이 생기면 아래 more를 누르지말고 스스로 그 원인을 찾아보길~

more..

2008/04/15 15:06 2008/04/15 15:06

PHP programming in Windows

from Programming 2008/04/05 18:38

아는 사람의 부탁으로 간단한 웹 프로그램을 하나 짜게 됐다. 옛날에는 주로 자바를 이용해서 작업을 했었는데, 간단한 웹 페이지를 만드는거라 왠지 닭잡는데 소잡는 칼을 쓰는 느낌이라 그냥 php로 작업하고 있다.

데스크탑에서 돌리기 위한 거라 서버 까지도 필요 없고, 그냥 윈도우즈에서 돌아가면 되는데 예전에 XAMPP라는걸 본 기억이 나서 찾아봤더니 여전히 살아 있구나. 여러가지 버전이 있는데, 윈도우즈용 라이트 버전을 인스톨러를 쓰지 않고 그냥 압축만 풀어 쓰면 되는 놈으로 설치했다.

기본적으로 apache, mysql, php를 지원하도록 되어 있고, phpmyadmin도 포함되어 있어서 꽤 쓸만한 놈이다.

사용자 삽입 이미지

오랫만에 보는 php는 그다지 부담은 없는데, 오랫만에 해 보는 웹 프로그래밍 자체는 정말 귀찮은 작업이다. 소소하게 손가는 부분들이 참 많구나. html 작성하는 것도 꽤 귀찮은 일이네. 게다가 자바스크립트가 필요한 부분들도 꽤 되고보니 이것 저것 많이 건들게 된다. 그리고 한글 처리를 위해서 고생 좀 했다. 계속 해 오던 일이라면 그다지 고생하지도 않았을텐데 라는 생각을 계속 하면서 꽤나 이것 저것 자료를 뒤지고 테스트해 보면서 겨우 한 가지 방법을 알게 됐다. 다름 아닌 mb_convert_encoding1을 이용하는 것.

고생했던 이야기들은 너무 길어지는 것 같아서 그만둬야겠다.

  1. 이 함수 하나를 알기 위해서 무려 5시간동안 인터넷을 헤맸다. ㅡ.ㅡ;; 최근 php 책이라도 한 권 살 껄 그랬나 하는 고민을 잠깐 했다.
2008/04/05 18:38 2008/04/05 18:38
Tag // ,

원본: http://dodamdodam.org/tc/18

젠장. 덧글로 썼던 글이 너무 길어서 그냥 트랙백으로 하려다가 망했다. 내용을 복사한 후에 덧글을 삭제하고, 트랙백을 걸려고 트랙백을 누른 순간 트랙백 주소가 복사되면서 내 덧글 내용이 날아갔다. ㅡ.ㅡ;; 그냥 짧게 다시 쓰는 수 밖에...

현영이가 Eclipse에서 Vim을 쓰기 위해 고군분투한 내용이 있길래, 그에 대한 내 경험을 살짝 포스팅해 본다.

일단 Eclim이란 놈은 처음 본 놈인데, 실제로 깔아보기 전까지는 그 정체가 뭔지 살짝 헷갈리는 놈이었다. Eclim은 홈페이지에 나오는 말 그대로 Eclipse Integration in Vim을 표방하는 놈이다. 즉, Eclipse의 기능을 확장하기위한 플러그인이라고 보기 보다는 Eclipse의 기능을 Vim에서 쓰기 위한 플러그인인 셈이다. 그래서 Eclim은 Vim에서 동작한다. 물론 Eclipse의 기능을 쓰기 위한 Vim plugin도 같이 제공해준다. 다음 그림을 보면 Vim화면에서 Eclipse의 기능을 제공하고 있음을 쉽게 알 수 있다. (그림 출처는 SourceForge의 eclim project homepage)

사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

발상의 전환 (Vim in Eclipse가 아닌 Eclipse in Vim)도 재미있고, 나름 상큼한 느낌도 주지만, 결정적으로 모든 기능을 명령 모드에서 명령어로 입력해야 하는 불편함이 있다. (꽤 불편하다) 그리고, 생각 만큼 부드럽게 잘 동작하지는 않는다. 그 외에도 뭔가 어색함이 많아서, 솔직히 잘 이용하게 되지는 않을 것 같다. Eclim을 설치한 후에는 명령 모드에서 :E가 듣질 않는다. 절대 단점이다. 게다가 매번 Eclipse의 plugin폴더에 있는 eclimd.bat을 실행시켜줘야 한다. 이것도 귀찮다. 난 개인적으로 뭔가 저렇게 서버를 띄워 놓는걸 별로 좋아하질 않아서, 처음 실행시부터 좀 거부감이 있었던 것이 사실이다. 아무튼 결론은 나랑은 맞지 않는다는 것!!

VimPlugin은 나중에 계속 써야겠다. ㅡ.ㅡ;;

2008/03/31 14:35 2008/03/31 14:35
Tag // , ,

PHP나 Ruby를 이용해서 Web application을 작성할 때 가장 많이 사용되는 데이타베이스 시스템이 바로 MySQL일 것이다. MySQL을 설치할 경우, 가장 먼저 해 줘야 할 것들이 있다. MySQL을 좀 더 안전하게 만드는 것이 바로 그것이다. 예를 들면 네트웤을 통해서는 root로 로그인 할 수 없게 한다든지, localhost에서 root로 로그인 할 때 패스워드를 입력하게 한다든지 하는 것들이 그것이다. 그 외에도 설정해야 할 사항들이 더 많이 있는 것 같다. (난 앞의 두 가지 밖에 몰랐다. ㅡ.ㅡ;;)

http://www.securityfocus.com/infocus/1726 1

위 링크를 따라가서 내용을 살펴보고 내 MySQL을 반드시 안전하게 설정해 두자.


  1. 위 주소는 "Agile Web Development with Rails, 2nd Edition" 에서 가져왔다.
2008/03/27 01:30 2008/03/27 01:30
Tag //

5Fs for retrospectives

from Programming 2008/03/24 12:13

많은 분야에 적용시켜 볼 수 있는 개념인 것같다. 사실 프로젝트를 진행하든, 혼자 스터디를 하든, 직장에서 일을 하든 항상 중요한 것이 바로 어떻게 진행됐는지, 잘 수행됐는지, 잘 못됐는지 검토하고 반성하는 시간을 가지는 것이다. 그런데, 막상 끝나고나면 그게 잘 되지 않는다. 그냥 끝났다는 해방감에 들떠서 더 이상은 쳐다보기도 싫어지는 것이다.

http://agile.egloos.com/4122099

위 글을 보면 김창준씨는 그런 과정을 나름의 항목을 정하여 실천에 옮겨 왔었다고 한다. 그 항목들이란 바로 다음의 5Fs를 말한다.

  • Fact
  • Feeling
  • Finding
  • Future Action
  • Feedback

아무래도 항목들이 정해져 있으면 정리하기가 훨씬 수월하지 않을까 생각해본다. 그리고, 굳이 끝날 때까지 기다릴 필요도 없이 주말 마다 정리하는 시간 혹은 매일 정리하는 시간을 가지면서 위의 5가지를 생각해보고 작성하다보면 훌륭한 retrospective가 되지 않을까 생각된다.

김창준씨가 소개하고 있는 Retrospectives관련 책들

  • Project Retrospectives
  • Agile Retrospectives

2008/03/24 12:13 2008/03/24 12:13

C++ Optimization

from Programming/C&CPP 2008/03/08 01:49

C++ Optimization관련 글을 좀 읽어보고 공부해야 할 듯하다. 앞으로 일년간은 C/C++로 짜여진 코드의 성능을 향상시켜야 하는데, 로직이나 알고리즘을 바꿔서 성능 향상을 꾀할 수 있는 부분이 있는가 하면 언어적 특성을 고려하여 성능 향상을 꾀할 수 있는 부분도 있다. 예를 들면, 다음과 같은 코드가 있을 경우,

if ( error_case1 || error_case2 || error_case3 || error_case4 )
{
// error handling
}
else
{
// main routine
}

if 문 안에 여러 조건들이 있기 때문에 assembly code에서는 여러 jump 명령어를 사용하게 된다. 위 코드를 다음과 같이 바꾸면,

bool bIsNotError = !error_case1 && !error_case2 && !error_case3 && !error_case4;
if (bIsNotError)
{
// main routine
}
else
{
// error handling
}

if 문의 조건에 의한 여러 개의 jump 명령이 하나가 된다. 뿐만 아니라 에러 상황이 아닌 경우가 더 많으므로 main routine을 앞으로 오게 하여 좀 더 성능 향상을 꾀할 수 있다.

2008/03/08 01:49 2008/03/08 01:49

vi Cheat Sheet - captured

from Programming 2008/02/29 10:33

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

pdf 파일을 올릴까 하다가 그냥 캡쳐해서 올린다. 급할 때 이게 더 찾아보기 쉽지 않을까? ㅋㅋㅋ

2008/02/29 10:33 2008/02/29 10:33
Tag // ,