이전에 "대단한 PHP"란 글을 쓴적이 있다. 1년이 넘어선 지금, 우선 한가지 사실을 더 알았다. null이어도 동일하다. 즉 null 혹은 false인 벨류는 어떤 첨자로 엑세스를 하려 해도 null이 나온다.

$a = null; // or false
var_dump($a['anyIndex']);
 최근에 리뷰중 아래와 같은 코드를 봤다.
list($a, $b) = getSomeFunctionThatReturnArrayOrNull(...);
엄격한 검사를 요구하는(특히 세그폴이 잘나는) 언어를 쓰다보니 리턴값이 null일 때 문제가 없느냐고 질문하니 위의 이유로 인해 두 변수 모두 null로 셋팅이 잘 된다는 것이다. 즉 에러 케이스때 둘중 한 변수만 null 검사를 하면 구지 리턴값이 널인지 확인하고 각 변수에 어사인 할 필요 없이 위처럼 바로 쓸 수 있다는 것이다.

아무튼 그사람과는 워닝 한줄도 없이 저런 식의 처리가 가능한게 구려~ 라고 이야기 하다가 나눈 대화(대충 각색).

겐도 : 아닌거 같아요. PHP 언어에서 저 피쳐를 생각한 사람은 정말 대단할걸요?
상대방 : 어떤면에서요?
겐도 : 저 성격을 안다면 저의 많은 코드들이 상당히 간단하게 변경될 수 있겠군요. 함수 리턴이나 로직의 디자인만 잘한다면 쉬운 흐름의 로직을 작성할 수 있어요.
상대방 : 그런 부분이 있군요.
겐도 : 그럼 지금 까지 보아온 험블하다고 생각한 코드들이.. 사실 그 코드를 작성한 사람들은 저런 성질을 잘 알고 작성한 코드였군요!!! 오호.. 대단하여라.
상대방 : 정말 그런지는 며느리도 모르겠죠 :)

사실 위의 특성은 이런 장점보단 대충대충 짜도 에러케이스가 스무스 하게 넘어갈 수 있다는 성질이 있다. 마치 PHP의 magic_quote처럼 코더의 실수를 언어가 커버해 준다. 물론 다른 악영향이 많긴 하지만, 일단 컴파일 제대로 하는데 며칠씩 걸리는 어려운 언어 보다야 초보들이 접근하기 쉽게 한다.

~~~~~~~~~~

자신이 아는 만큼 세상(월드, 계)이 보이는 것이다.
자신의 밥줄로 쓸 만큼 잘 아는 언어라도, 오히려 밥줄이기에 매일 그 부분도 공부다!
  • NHN 웹표준팀의 고민: 어서 고민하지 마시고 주무세요. 최면술~~ 장황하게 글썼다가 지우길 반복, 결국 엉터리 답변달기 신공! 좋은 사람들은 다 NHN 갔다는 말이 맞는것 같기도 하다. 2008-03-11 01:50:15
  • 나름 대형 업체인데 이밤중에 회사일 고민하는 직원이 있다는 것은 둘중 하나이다. 회사가 운좋게 훌륭한 직원을 채용했거나 나보다도 더 악독한 팀장이 있거나. 2008-03-11 01:56:13
  • NHN도 DAUM처럼 현실에 안주한 나머지 쇠퇴의 길을 걷지 않을까 예상하던게 얼마되지 않은 것 같은데 위쪽의 소문이나 아래쪽의 소문을 들어볼 때 올해 뿐만이 아니라 적어도 2010까진 계속 독식하지 싶다. 그리고 시간이 지날수록 가능성은 더해만간다. 2008-03-11 01:59:07
  • 네이버 XHTML 1.0 Validated: 대형 사이트 첫페이지의 가장 힘든점은 소스제작 소스가 여러군데라는 점이다. 비록 전체는 아니지만 그래도 해냈다는 것은 정말 미친짓이다. 더구나 얼굴성형 아니 대공사를 지시한 책임자도 강심장이다. 2008-03-11 02:05:28
  • 아키텍트는 작품으로 말한다: 갑자기 눈물이 왈칵 쏟아진다. 2008-03-11 02:20:06
  • Mazda RX-8 Type RS: 7을 더 가지고 싶고(단종이 안습 ㅠ.ㅠ) NFS에서도 7만 타지만, 저차도 하악하악 2008-03-11 11:18:33
  • Your Company's APP : middle name 빠졌다. ㄲㄲㄲ 2008-03-11 11:26:08
  • 축 VAIO SZ38 배터리 또 사망. 또 과열보호회로 동작했나 보다. 무료AS 기간 지났는데 센터에서 뭐하 할려나 --? 안터진걸 다행으로 아셈? 2008-03-11 14:25:21
  • 11번가 촬영 스틸샷: 저도 언젠가는 나영양이랑 증거샷 찍을꺼에요. @.@; 2008-03-11 14:37:10
  • 콘솔게임 3종 비교: 무엇을 사겠냐고 물으신다면, Wii는 이미 있고 다음은 PS2를 3으로 업글하는 것이고 다음은 XBOX을 삼돌이로 업글하는 것이다. 현재 리시버가 Component 2개밖에 안되는데 3개 되는 거나 HDMI 지원되는 걸로 업글부터 해야 하는구나. 2008-03-11 14:40:31
  • 호모 엑스페르투스: 요즘 읽기 시작한 책인데 초반에 진화심리학적 이야기가 나온다. 남자는 여성의 육제적, 여성은 남성의 정신적 외도를 질투하는 것을 진화론적 관점에서 풀었는데.. 아무튼 나를 되돌아 보니 이러다가 자연의 선택에서 낙오되겠다. ㅠ.ㅠ 2008-03-11 14:58:17
  • 아마추어 테러리스트: 지금까지의 테러가 정치적인 이유였다면 이제는 취미생활의 시대가 곧 올것이다. 커피숍 하나 날릴정도의 폭발물과 타이머 개발에 두세달 정도면 가능할 것 같은데? (아악 갑자기 소형, 고효율 폭탄의 아이디어가 나올려 그런다 --; ) 2008-03-11 15:09:28
  • Six Apart Takes Aim At Wordpress Users; Wordpress Pissed: 체사마가 저런 글을 썼으면 어떻게 되었을가? WP나 MT나 모두 TC로 오세요~ 2008-03-11 17:59:00
  • 100명의 치어걸/ 실제링크: 10명에게 낚여 봤는데 90명 더 낚일거 생각하니 아스트랄하다. 더불어 맥북프로 시퓨 온도 80도 돌파! 2008-03-11 18:09:57
  • PHP5에서의 XML Reader (php) 2008-03-11 18:23:08
  • 브라우저별 렌더링 성능: 요즘 사파리를 자주 쓰는데 역시 빠르다라는 느낌이 정확했는지도. 앞으로 성능 테스트는 IE8에서 해야겠다. 2008-03-11 20:20:38
  • 속보 : 여수에서 또 유조선 충돌, 에헤라디야~ 2008-03-11 23:38:01

이 글은 gendoh님의 2008년 3월 11일의 미투데이 내용입니다.

TAG php
http://www.zend.com/forums/index.php?t=msg&goto=14058&S=fe276d5a44eb0605385298c10a840608

결론은 애플이 아파치를 정말 웹 공유용으로 만들어 줘서 익스텐션이 설치가 안된다는 것. 따라서 왕창 새로 깔아야 한다는 것이다. MAMP를 설치하는 것도 답일 수 있으나 왠지 Pro버전 돈내삼 하고 있어서 직접 설치해 보도록 하자.

해답을 찾는데 도움이 된 것은 PHP-GD 설치가 안된다는 글타래.
http://discussions.apple.com/thread.jspa?messageID=5693097
그리고 간만에 옛날 프로젝트 돌려보려니 난리나서 GD 설치기를 올려준 블로거분
http://www.postal-code.com/binarycode/2007/11/12/leopard-also-breaks-php/

우선 아파치 부터 설치하자
1. Download the Apache2 source from http://httpd.apache.org/download.cgi (latest version is 2.2.6) and extract it.
2. Open Terminal and go to that directory. If you extract sources into your Downloads folder, type “cd ~/Downloads/httpd-2.6.6″ and hit return
3. Type “
./configure –enable-layout=Darwin –enable-mods-shared=all
” and hit return
4. Wait for the process to complete and then type “make” and return
5. Wait for the process to complete and then type “sudo make install” and return
libpng와 libjpg가 필요한데 역시 손으로 들고와서 설치한다.
Install libjpeg ************************************
Get latest Stable SRC:
http://www.ijg.org/files/

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
cp /usr/share/libtool/config.sub .
cp /usr/share/libtool/config.guess .
./configure –enable-shared –enable-static
make
sudo make install
sudo ranlib /usr/local/lib/libjpeg.a

Install libpng ***
Get latest Stable SRC with config script
http://www.libpng.org/pub/png/libpng.html

tar jxvf libpng-1.2.22.tar.bz2
cd libpng-1.2.22
./configure
make
sudo make install
sudo ranlib /usr/local/lib/libpng.a
자 마지막으로 php를 설치해 봅시다. mysql은 http://dev.mysql.com/downloads/mysql/5.0.html 에서 받으시길.
Install PHP ********
download from php.net

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --infodir=/usr/share/info --with-apxs2=/usr/sbin/apxs --with-curl --with-gd --enable-exif --enable-fastcgi --enable-zip --with-jpeg-dir=/usr/src/libjpeg --with-ldap=/usr --with-kerberos=/usr --with-zlib=/usr --enable-ftp --enable-sockets --with-iodbc=/usr --with-config-file-path=/etc --with-openssl --with-xmlrpc --with-xsl=/usr --with-mysql=/usr/local/mysql --with-mysql-sock=/var/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config

팁 몇가지
아파치 리스타트 하는 방법 : 설정판 웹공유 껏다 켜는 것도 있으나
sudo apachectl -k restart
mysql은?
sudo /usr/local/mysql/lib/sypport-files/mysql.server restart
mysql에서 GUI 툴을 사용하는 것도 방법입니다.

아참 깜빡할뻔한 Zend_Debug 설치하기
http://downloads.zend.com/pdt/server-debugger/
여기서 다윈용 받아서 적당한 곳에 처박아 두고 php.ini에
[ZendDebugger]
zend_extension=/usr/lib/php/modules/ZendDebugger.so
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
so파일 위치는 설치한 곳으로 하세요.


사용자 삽입 이미지
일단 Eclipse에서 되는거 같고 Zend Neon에서도 돌려나;;;
현재 뭔가 꼬여서 브레이킹 포인트가 안먹네요.

PS.
이거 안되었으면 맥북프로 도로 팔아버릴뻔 했습니다. 이거 산 이유가 디버깅 때문이었는데;;;
우분투 설치할까도 잠시 고민을;;;

PS2.
26인치에서 풀사이즈도 아니고 적당히 키운건데(그림은 50% 리사이징) 꽤 넓죠? :)
회사엔 30인치를 한번 갖다놔 볼까나.
SEO Book Cover

from amazon.co.jp

http://www.amazon.co.jp/gp/product/0470100923/503-2159512-7057564
ISBN: 0470100923 or 978-0470100929
Wrox Press, Jaimie Sirovich and Cristian Darie
무려 한달만에 도착한 책, 아니 이 책이 발간 예정임을 안 것은 더 전일까나. 아무튼 일본의 골든위크에 택배사에서 해메다가 겨우 도착한 미국에서 온 책이다.
아침에 와서 이제 챕터 1 정도 가벼운 마음으로 본 상태에서의 Review.
지속적으로 SEO(Search Engine Optimization)를 해 온 사람이면 별 필요없는 가이드 북 정도랄까. 하지만 본인처럼 이세상에 고민할 것이 365만가지 이상 되는 사람이 그래도 SEO를 고려해야 할때 살짝 봐줄만한 책일 것이다. 사실 관련된 책이 그리 많은 편은 아니다.(그리고 별 내용이 있는 것도 아니다. -ㅅ-)
WROX 빨간 책에서는 Web 2.0 Programming의 상위에 있고 RIA와 더불어 권장하는 책이다. 참고로 같은 제목이지만 끝이 ASP.NET인 책도 있다.

SEO는 왜 고려하는 것일까. 단순히 검색엔진에 잘 걸려서 클릭광고율 올릴려고 한다면 적당한 블로그툴(TatterTools나 Tistory 강추. BGM 플러그인은 끄시고 -0-)을 사용하면 된다. 온갖 낚시 글로 도배하면 된다. 심각한 수준의 광고성이 아닌 경우 광고업체가 재제하지 않는다. 그보다는, 자신의 컨텐트가 이 세상에 잘 뿌려지는 방법이기 때문일 것이다.(따라서 뿌려져서는 안되는 A to Z 회사들은 써서는 안될 것이다. ^^)

사람이 직접 URL을 쳐서 사이트에 접속하던 시대는 이미 사라지지 않았나 한다. 사실 90년대 중반의 본인은 잡지에서 소개하는 이달의 웹사이트나 Yellow Book(전화책)에 적혀 있는 사이트 주소를 입력했다. 별사진이나 볼까 해서 미국 나사 홈페이지 주소를 한자한자 입력했다면 이후 디렉토리 서비스와 포탈이란 개념, 그리고 이제는 구글형님의 검색 서비스를 통해 사용자들은 인터넷에 접근하고 있을 것이다. 정보를 찾기 위해 전에는 사이트를 찾았다면 이젠 그 콘텐트 자체를 찾는다. N사의 "즐"서비스도 거기에 원동력이 있었지 않았나 한다.

개개인이 남기는 인터넷상의 흔적은 정성 들여 쓴 콘텐트가 아니라 휘갈겨 쓴 일상의 소소한 농담이라도 정보가 되어 누군가에게 전달될 가치가 있을 것이다. 많은 사람들이 검색을 만들고 메타를 만들고 있다. 그렇다면 누군가는 원천을 만들어야 할 것이다. SEO가 다분히 구글을 타겟팅 하고 있지만, 좀 넓게는 검색엔진을 타겟팅 하고 있지만 누군가는 검색 로봇이 아닌 다른 것을 만들어 낼 것이다. 아무튼 제대로 된 SEO가 지향 하는 것은 인간(알바생)이 아닌 프로그램이 처리하기 쉽도록 콘텐트를 구성하는것이다. 구글형님이 제대로 읽어 낼 수 있는 페이지라면, 남들도 할 수 있겠지만 믿음이 깔린다.

개인적으로 웹 서비스 프로젝트이 목적은 분명 다른 것이겠지만 마치 유저가 웹에서 접근한다라는 기본 전제처럼, 검색로봇이든 무엇이든 프로그램이 읽기 쉬운 구조를 만드는 것도 그런 가정사항으로 정하게 되었다. 나머지는 누군가 알아서 하겠지.

PS.
일본에는 QR코드로 기껏 한다는게 회사 홈페이지 주소 대신 입력해 주는 정도. 뭔가 200mg 택도 없이 부족하다. 제품 정보를 볼려고 하는데 왜 회사 홈피 첫대문이 나오냐고. -ㅅ-
TAG php, SEO

태터 제작 방법론

개발&Development/태터툴즈 2006/11/05 06:37 posted by 겐도
1.1 RC3을 출시하고는 (관련발표) 비가 그치기를 기다리면서 주절주절.

주로 내부 PHP 함수와 QA만을 전담하다 이번에 CSS와 JS까지 손보는 작업까지 하면서 나름대로 세운 기준들을 적어볼까 합니다.

1. Static과 Dynamic의 분리
이번에 사이드바 ajax 코드를 넣으면서 고민 되었던 것은 로딩 시간입니다. 최초 로딩이야 어쩔 수 없다지만 매번 10년씩 걸리면 문제가 생길 수 밖에 없죠. CSS도 커지고 JavsScript의 양도 데이터를 능가할 정도로 커졌습니다. 말 그대로 사이트가 2~3배 느려질 수 있는 요소입니다.
JS와 관련해서는 좀 쓸데없이 함수를 부르는 경향이 커지더라도 스태틱한 JS 부분을 만들어 외부 파일로 빼는 것이 좋은 것 같습니다. PHP에서 생성해야 하는 JS부분도 가능한한 인자로 뽑아서 브라우저상에서 도는 부분이 많도록 하는 것이 로딩 속도 개선에 도움이 될 것입니다. 역시 IO가 가장 느리죠.
다만 브라우징 컴퓨터에 부하가 높아져서 페이지의 변신과정을 0.5배속으로 보는 현상도 발생합니다. 적당한 트레이드 오프도 필요하겠지만 이경우 오히려 JS 없이도 모든 기능이 동작하게 하는 것도 방법입니다.

2. HTML, CSS, JS / Data, View, UI 삼권 분리
흔히들 시멘틱 웹이라 하면 CSS랑 JS를 꺼도 뭔가 보이는 웹페이지를 의미한다라고들 하지만 현재 저의 생각은 그렇게 하나 안하나 구글 로봇은 저의 테이블 떡칠 블로그도 잘 퍼간다입니다. 아무리 XHTML에 맞춰 데이터를 기술한다 해도 파싱이 쉬울 뿐 시멘틱의 발견은 전혀 다른 예기가 됩니다. 제 글중에서 책 그림, 제목, 서평을 찾아 내기 위해선 결국 데이터의 설명이 별도로 필요합니다. RSS나 다른 데이터 교환 스펙들이 오히려 정확합니다.
다시 CSS와 JS의 이야기로 돌아와서, CSS를 끄면 당연히 블로그 화면은 사람이 읽기 어려운 상태로 바뀔 것이고 JS를 끄면 몇가지 동작이 제한 될 것입니다. 어떤 사람들은 일부 브라우저 환경에서는 이것을 사용하지 못할 때도 있으니 없어도 동작하게 만들어야 한다고 하지만 이는 자칫 CSS로 해야 할 일을 HTML로 하게 되고 JS가 해야 할 일을 CSS로 하게 만드는 부분이라고 보입니다.
정확히 HTML 혹은 XHMTL를 출력할 때는 페이지에서 보여주어야 할 데이터에 대해 고민하고 CSS는 화면의 표시, 그리고 JS는 일반적인 HTML 컨트롤만 사용하는 제한적인 사용자 인터페이스를 좀더 다양하게 확장해 주는 역할을 해야 한다고 보입니다. 완전한 3개의 기능 분리가 일어나면 당연히 JS 없이도 대충 사용하는데 지장없고 CSS가 가출을 해도 사용자 CSS를 입히면 대애충 작동에 문제가 없게 되겠지만 그것을 노리고 삼권불리를 하는 것은 아닙니다.
실제로 이번에 작업을 해 보면서 데이터의 문제와 보여지는 문제, 그리고 사용자 인터페이스의 문제는 구분이 됩니다. 삼권 분리가 잘 된 상황에서는 해당하는 계층(Layer)만 손을 보면 되지만 태터의 "글목록"같이 데이터베이스까지 달려갔다 오는 곳의 경우 버그 하나에도 많은 시간이 소요되는 것은 물론이고 새로운 기능이 추가되려 할 때 상당한 복잡도를 가져다 줍니다. 더불어 QA 과정에서도 기능이 여러 레이어에 걸쳐 있는 것은 테스팅이나 검증에서도 악영향 입니다.
성격이 다른 레이어는 구분하는 것이 좋다는 것은 개발/유지 보수 측면에서 많은 장점들을 주고 비지니스 기회를 잡아나가는 데 적절한 대응을 할 수 있다는 것은 쉽게 예상할 수 있을 것입니다. JS를 끄고도 잘 동작하게 HTML을 개조하라는 것이 아닌 버튼을 누르면 폼 전송이 일어나는 것을 드래그엔 드랍으로 사용자가 쉽게 사용할 수 있도록 하는 것입니다.

3. inline style은 댓가를 치른다. 더불어 CSS의 id 기술자도 만만치 않다.
몇 웹 표준책을 보면 inline 스타일에 대해서 위급할 때 쓰게 되겠지만 이후에 댓가를 치른다는 말이 나옵니다. inline은 너무나 강력하여 inline이 아니고서는 그 효과를 변경할 수 없습니다. 그래서 태터도 많은 부분을 inline이 아닌 class로 스타일을 기술하도록 변경하였습니다. 헌데 CSS에서 ID의 사용도 만만치 않음을 알게 되었습니다.
CSS의 기술자(Specifier)에서 ID를 사용하는 것은 상당한 힘을 가지고 있습니다. 한번 이것으로 선언하면 다시 ID에 클래스 몇개를 더 붙여야 오버라이딩이 가능합니다. 반대로 ID는 한번에 자신이 원하는 엘리먼트를 정확히 집어내므로 쉽게 유혹에 빠집니다. 결과는 inline과 동일하게 important라는 극약 처방을 쓰게 됩니다.
최근에 생성된 페이지나 데코레이션의 경우 ID는 정말 마지막에 쓰도록 권장되었습니다. 가능하면 태그로 접근하고 큰 부분들을 클래스로 접근하도록 하였습니다. ID는 정말 특이한 놈이고 작은 단위인 경우에만 쓰며 반대로 HTML을 기술할 때 JS에서 접근하는 용도로나 선언되지 왠만해서는 class만 제공하는 식으로 하였습니다.
바퀴벌레를 잡는데 핵폭탄을 쓰는 편이 가장 확실할지 모르겠지만 역시 적절한 양의 살충제가 더 효율적이고 사이드 이펙트가 적겠죠.
이번에 실제로 작업하면서 많은 것들을 배웠고 아마 다음 개비(?)때 이런 것들이 반영되어 좀더 깔끔한 구조의 결과물들을 만들 수 있게 될것입니다.

보너스. href와 onclick
사실 이 글을 쓰게 된 것이 최근에 오베 들어간다는 사이트의 코드를 보고는 양복입고 스폿라이트를 받으면서 잘난채 하고 있는 영업/경영인들을 위해 날밤까고 있는 개발자 분이 생각나서 혹시나 도움이 될까 때문입니다.아직 제가 웹쪽을 시작한지 몇달 되지도 않아 도움이 될 가능성은 낮아 보이지만 저 코드들 다 디버깅 하고 안정하 시키려면;;; 무섭군요.
흔히 anchor element를 만들고 href는 엄한곳을 가르키게 하고는 onclick으로 많은 것을 합니다. 장점은 커서를 가져다 대면 밑줄도 그어주고 커서도 바뀐다라는 것들. 발표회 자료를 보니 CSS 꺼도 잘돈다 하길래 JS를 껏더니 거의 모든 기능 링크가 죽어버리더군요.
개인적인 견해는 href와 onclick은 항상 듀얼로 정상 동작하게 만드는 것이 좋다입니다. 우선 해당 버튼이 클릭되었을 때 어떤 화면이 보여져야 하는 것은 href가 가르키는 URI에서 명확히 할 수 있습니다. onclick을 통해서 HTTPRequest를 하고나서 화면을 성형수술 한 후 결과물은 바로 해당 링크의 결과물과 비슷해야 겠죠. JS가 꼬여서 문제가 발생한다 치면 onclick만 없애버리면 당장 서비스에 문제는 없습니다.(위에서 말한 삼권 분리와 연관됩니다.) 또한 간단한 변화가 아닌 "대 운하공사"급의 경우 URI의 결과물을 JS에서 이용할 수도 있습니다.
보너스로 상태줄에 링크가 표시된다라는 점, 그리고 어떤 이유에서든지 JS가 에러가 나서 더이상 수행이 불가능한 타이밍에도 기능이 동작될 수 있다라는 것을 들 수 있을 것입니다.
( 참고로 JS의 런타임 에러는 아무리 코드가 정상적이어도 통신 문제나 타이밍, 클라이언트의 다른 프로그램-백신이나 보안 설정등-에 의한 영향에 의해 쉽게 발생됩니다.)

PS.
이번에 1.1 RC3을 내면서 개발자로서 부끄럽다고 생각되는 부분이... JS에 문제가 생겨 사파리에서 파일 업로드가 안되게 되었다는 것. 사실 JS 걷어내면 오히려 업로드가 될지도 모르겠습니다. 오페라.. 한번도 테스트 못해봤습니다. 컴터에 깔아는 놨는데;;;
파폭은 한글입력과 관련하여 너무 문제가 많더군요. 특히 맥OS X상에서 FF는 몇가지 버그 현상을 일으킵니다. 도저히 못잡겠다는;;;

PS2.
위의 견해는 이제 막 웹프로그래밍 걸음마 때는 사람의 글이므로 공개적으로 망신 주셔도 괜찮습니다. 뭐 지금까지도 워낙 구박 받으며 살아온 인생이라;;;
잡담
아는 사람은 안다는 티스토리 내부 개비(?) 작업중. 외형적으로는 별 차이가 없는 것으로 보이겠지만 내부적인 엄청난 코드 변화가 티스토리에 일어나고 있다. 내부 개발서버에 수십번의 커밋이 일어나고 있고 테스트 해야 하는 양도 엄청나다. 어제는 SQL문을 다중 서브쿼리까지 써 가며 몇몇 부분의 로직을 새로 작성하였고 특정 상황에서 동작하지 않는 기능을 디버깅 하기 위해 DOM 문서와 자바스크립트 문법을 펴 두고 몇시간을 해메이기도 했다. 뭐 괜히 이회사 왔다가 대학시절 한학기에 언어 4~5개 배우고 플젝하던 악몽이 다시 생각나기도 하는 시절이다. 이노무 PHP는 뭐이리 어려운 언어인지..

Loosely Type Binding
Perl 혹은 PHP가 쉽다고 하는 사람들을 보면 정말 존경 스럽다. 아직 몇달밖에 되지 않은 초보 PHP 프로그래머인긴 하지만 오늘도 이 어려운 언어 때문에 고생 좀 했다.
'Gendoh' == 0
위의 문장이 참일까 거짓일까? 몇시간 전만 하더라도 난 저것은 당연히 '거짓'인줄 알았다. 허나 PHP는 참이란다. PHP를 좀 하신 분들은 저런것도 모르냐고 구박하실지 모르겠다. 하지만...
function A($a)
{
  if ($a == 'gendoh') ...
저 문제때문에 돌아 가시는 줄 알았다. PHP가 String Comparison을 지원하네 하면서 와 좋다하던 저 코드가 오동작의 원인이 될 줄은;;;; 매우매우 정리해서 저렇게 요약된거지 원래는 쿼드모니터의 도움이 없었으면 힘들었다.
스트링 컴패리즌에 0이 들어 있는 숫자 변수가 온다고 엄하게 동작하다니! PHP의 Losse와 Strict Comparision의 차이는 알고 있긴 했지만 매우 스페셜 한 것을 프리티한 코드로 표현하고 싶을때나 쓰나 보다 하고 있었는데 이건 아니었다. 까딱 잘못하면 원자력 발전소 뚜껑 열리고 인공위성 태양에 들이대는 거다.

더 멋있는 코드!
function A($a)
{
  if ($a == 0) ...
누군가 새로운 언어를 만들려는 사람이 있다면... 저얼대 type 맘대로 쓰는 시스템은 참아주시길...

Garbage Collecting
휴지는 휴지통에... 이런 시절이 좋았다. 동적으로 생성된 객체가 사용이 끝났다면 휴지통에 넣어주기. 분리수거도 가능해서 메모리 재활용 테크닉도 되고 Copy Constructor, Call by Rederance 놀이도 가능했다. 하지만 이제 그런 것이 불가능해 지면서 누구는 퇴근도 못하고 디버깅 중이다. 엄한 메모리 접근때문에 밤새던 걸 이제는 좀 안하게 되나 싶었더니 정 반대의 상황이.. ㅠ.ㅠ
GC가 프로그래머의 메모리 관리 노력을 줄여준다고 누가 말한다면 나는 답하리라. 쓰레기를 아무대나 버렸더니 침대밑에서 썩고 있는 우유팩을 찾을 수가 없다고...
GC는 레퍼런스가 끝나면 자동으로 객체가 사라진다. 따라서 이미 지워진 객체를 엑세스 할 일도 없고 지우는 노력도 필요없고 가장 중요한 지우는 타이밍을 알아서 계산해 준다라는 장점이 있다. 사실 이전에는 바로 이 '타이밍'을 쉽게 생각해 내는 사람이 메모리 관리와 관련하여 경험많은 사람이라 할 수 있을 것이다.
GC의 단점이라고 한다면 자신도 모르게 참조하고 있는 객체가 사라지지 않는 다는 것이다. 마시다 만 우유라고 마시지도 못할 썩은 우유가 침대 밑에 방치되는 것이다. 더 머리아프게 하는 것은 한번 이런 식으로 동작하기 시작하면 우유가 모이기 시작하고 왠지 모를 방안의 냄새로 두통에 시달리는 것이다.
(이와 관련하여.. 옛부터 건망증이 심한 나는 침대위에서 우유들고 뒹굴거리다가 있다 먹어야지 하면서 짱박은 여러개의 우유를 몇일 후에 발견하였다. 개봉된 우유가 상온에서 얼마나 변질이 잘 되는지에 대해서는.... 아우~~ @.@;)
웹 환경에서 DOM에 접근하면서 innerHTML을 바로 수정하거나 removeChild 등으로 나름대로 자식들을 깔끔하게 날려버리는 경우가 많은데 이게 가끔 잘 안되는 경우가 있다. 바로 레퍼런스가 살아 있는 경우이다. 쉴새없이 노드를 생성하고 삭제하는 욕나오는 사이트 들의 경우 잠시 밥먹고 왔는데 IE가 메모리 수십메가를 들고 있다거나.. 한숨 자고 일어났더니 IE가 뻗어버리는 경우도 발생할 수 있다.
GC에서 가장 짜증나는 부분이라고 한다면 구석에 짱박힌 객체는 대부분의 경우 외부에서의 연결이 매우 희미해 져서 아무리 Watch 창이나 DOM Browser로 찾아도 나오지 않는 경우가 많다. 또한 객체 사이즈가 작으면 작을수록 현상 자체를 인식하는 것 조차 힘들어 지기도 한다. 이게 윈도우 문제인지 IE 문제인지 알수가 있어야 말이지...
메모리가 대량으로 새지 않으면 별 문제 없지 않냐라는 이야기를 하는 사람도 있다. 요즘 운영체제는 프로세스가 종료되면 메모리가 완벽히 반환되니 delete 할 필요가 없다는 사람도 있는데 이보다는 양반이긴 하다. 뭐 가끔 개념없는 의사가 몸안에 메스 넣어 두고는 생명에 지장 없다고 하는데;;;; 반대로 티끌 메모리 누수가 이정도의 중요함이라는 것을 느끼기 바란다.

아무튼 이번에 특정 조건에서 메모리가 약간씩 흐르고 있음을 감지하였으나  나의 담당한 부분도 아닌데 PHP 3~4개를 지속적으로 호출하고 Flash 객체가 하나 끼어 있고 자바스크립트 파일도 여러개 되는 상황에서.. 나같은 JS는 여자이름 '지선'의 약자인가 하는 프로그래머로서는 쥐쥐다.

뭐 담당자에게 대충 조사결과 보고하고 잡으셈 하고 하겠지만... 정말 마지막 한톨까지 찾아내려면.. 쿼드 디스플레이로도 부족하고 헤테로 이상이 필요한지도;;;;;

잡담.
아무튼.. PHP라던지.. JS등은 사실 생산성적인 부분이 강화되어 언어가 디자인 되었는데 이것이 널리 쓰이고 상당히 핵심적인 요소가 되다 보니 태생적인 부작용이 나오는 지도 모르겠다. IE에 사이트 켜놓고 퇴근했다가 아침에 보면 컴터가 미쳐가고 있는 것도 가끔 보고... 몇몇 웹 어플들의 삽질도 보이고.. (태터도 뭐 몇몇의 머리속에만 들어있는 삽질의 부분이;;)

이런 식으로 가다간 프로그래머들의 월급이 더 줄어 들지도 모르겠다. 신입들의 진입 장벽은 낮아지고 대신 버그에 의한 손실로 IT의 이익을 많이 까먹으니... 정말 C++처럼 어려운 새로운 언어의 등장이 필요한 시기인지도 모르겠다.
밑에 코멘트를 보니 궁금하신 분들이 있으실 것 같아서..

저를 제외한 다른 개발자 분들은 다른 툴들을 이용하고 있습니다만 저는 아래의 툴들을 이용해서 태터툴스 및 곁가지 프로젝트(?)들을 하고 있습니다.

IDE - Visual Studio 2005
http://msdn.microsoft.com/vstudio/
오랫동안 VC++ 개발자였다 보니 가장 익숙한 툴이 이것입니다. 프로젝트 관리도 편하고 속도도 빠르고 등등. PHP를 개발함에 있어 ecl~~~라는 IDE 환경도 유명합니다만 저같이 성질 급한 사람은 약간 쓰기 힘들더군요.

PHP Environment - VS.PHP for VS2005
http://www.jcxsoftware.com/
MS의 VS2005는 공식적으로 PHP를 지원하지는 않습니다. 하지만 VS.PHP라는 애드온을 사용하면 가능합니다. 자체적으로 아파치와 PHP를 제공하여 로컬 디버깅도 가능하고 DBG를 설치하면 Remote 디버깅도 가능합니다.
허나 버그 투성이라 어느정도 버그에 익숙해 지지 않으면 화딱질 날 수도 있습니다. 돈주고 사면 발언권이 좀 커질까 했는데 아직도 불안불안.
그리고 물론 저도 가끔 노트패드나 ultraedit, vi등을 사용할 때도 있습니다.
Dreamweaver도 훌륭한 툴입니다만 치명적인 버그가 있다고 하죠. 특정 문자열을 특정 조건에서 만나면 임의로 변경해 버립니다. 그래서 가끔 태터툴즈가 오작동을 하기도 합니다.

Versioning Tool - TortoiseSVN
http://tortoisesvn.tigris.org/
윈도우에서 사용하기엔 이만한 놈도 없을 것 같습니다. 이전에 CVS 기반으로 형상관리를 할때는 TortoiseCVS를 썼었고 SerVersion으로 왔을땐 역시 이 툴이죠. Log를 검색하고 변경사항 추적까지 이 툴에 대한 의존도가 높습니다.
어떤 경우엔 Trac에서 제공하는 Web환경의 소스추적을 쓸 때도 있지만 역시 단순히 관람(?)이 아닌 실제 작업에서는 토토이스가 좋습니다.

Comparison Tool - Beyond Compare
http://www.scootersoftware.com/
30불짜리 프로그램에 평생라이센스를 지원하고 있지만 이 툴이 저에게 준 베네핏은 이미 3만불이 넘은 것이 아닌가 생각이 듭니다. 폴더 비교, 룰에 의한 비교(확장자에 따른 공백 무시 등)는 물론이고 머지 작업에 있어 강제 복사나 지정 영역 복사, 바로 편집 등등의 기능성은 최강이라고 평가하고 싶습니다.
Tortoise나 다른 툴들의 기본 비교 툴은 모두 이 툴로 지정을 하고 있습니다.

Database Management - Navicat MySQL
http://www.navicat.com/
이 툴을 처음 만난 것은 어떤 프로그램을 설치하다가 메뉴얼에 리눅스 서버에 설치하면서 윈도 환경의 클라이언트라면 이것으로 쉽게 셋팅할 수 있다고 하면서입니다. 한번 익숙해 지고 나니 게속 이 툴을 사용하고 있습니다. 심지어 PostgreSQL을 사용할 일이 있었는데 이대도 같은 회사제품을 사용할 정도였습니다.
사족을 약간 달자면... 그래도 가끔은 MS-SQL 환경이 그립곤 합니다. 특히 2005버전은...

Testing...
IE, FF,  저의 전화기 되겠습니다. ^^
애인도 없는 것이 요즘 전화요금이 부쩍부쩍.

APM(Apache+PHP+MySQL)의 문제

개발&Development/웹 2006/03/27 05:48 posted by 겐도
APM이라고 한다면 웹서버를 Apache, 비지니스 레이어를 PHP로 하고 데이터는 MySQL을 사용하는 플랫폼이다. 주로 Linux를 OS Platform으로 이용하지만 Windows도 사용된다. 이 블로그에 사용되는 Tattertools도 APM을 기반으로 한다.

최근에 새로운 프로젝트를 기획하면서 양대 산맥이라 할 수 있는 APM과 ASP.NET(IIS + ASP + MS-SQL)를 비교 검토해 본적이 있는데 나름대로 각각 충분한 기능성을 보유하고 있고 ASP는 Platform가격이 비싸다는 정도로 APM이 약간 우세한 감이 없지 않으나 다른 측면에서 문제점을 가지고 있다고 보고 있다. 태터가 격고 있는 문제이기도 하고 프로젝트를 새로 시작할 때도 가장 걱정되는 문제이기도 하다.

쉬운것이 좋은 것인가?
PHP의 장점이라고 한다면 쉽다라는 점을 가장 먼저 들어야 될 것이다. 변수 타입이 뭐냐는 생각할 필요없이 그냥 쓰면 돌아간다. 프로그래머에 따라서는 이 성질을 십분 발휘하는 다양한 테크닉을 사용할 수도 있겠지만 입문자 혹은 제대로 된 이해가 없는 경우 막 쓰게 된다. 본인의 경우 C/C++을 장기간 해 오면서 타입체크나 invalid에 대해 상당히 신경을 써 왔는데 PHP에선 도저히 감을 잡을 수 없을 정도의 자유로움(?)이 있다. 그리고 덕분에 많은 PHP의 공개된 코드들을 보면 상당히 위험해 보인다.

쉽게 원하는 기능성을 구현할 수 있는 대신 error에 대한 처리에 미숙할 수 밖에 없다. 이런 점은 magic_quote라는 해괴망칙한 옵션을 만들었고 이것은 아래서 설명할 다른 문제점을 만들어 버렸다.

타이트한 문법과 자유스러운 문법의 장단점이 아마 적용되는 부분일 것 같다. 기말레포트 쓰는데야 더할나위 없는 언어지만 대규모의 비지니스 어플레케이션을 작성함에 있어서는 QA(Quality Assurance)를 수행함에 머리아픔에 틀림없다. 마구마구 수용해 줌은 사소한 실수를 찾기 힘들게 만들고 이는 전체시스템의 안정성을 훼손시켜 버린다.

그때 그때 달라요
PHP는 현재 3, 4, 5 버전 정도가 돌아가고 주로 4를 많이 사용한다. 3에서 4로 그리고 4에서 5로 버전업을 하면서 많은 기능들이 추가되었다. 허나 3에 맞추어 작성하여도 4,5에서 다르게 동작하는 케이스가 있기도 하다. 가장 문제는 같은 4라 하더라도 서버의 설정(php.ini나 apache 설정)에 따라 전혀 다르게 동작을 해 버리는 상황이 종종 나온다. 대표적인 것이 위에 잠시 나왔던 magic_quote일 것이다. 일부 개발자들은 headache내지 hell이라고 까지 표현하고 있다. 제한된 환경이라면 자신의 서버 셋팅을 바꿔 버리면 되겠지만 TatterTools의 경우 웹호스팅 서버에 설치되는 경우도 존재하여 도저히 대응이 불가능에 가깝기도 하다. 일부 대응책이라고 나온 것 조차 동작하는 환경과 아닌 환경이 존재한다.

언어의 Semantics가 그때그때 달라져 버리면 어쩔 수 없는거 아닌가.

MySQL도 재미있는 것이.. SQL문의 동작이 버전별로 다른 경우가 있다. 또한 5에서의 경우 옵션에 따라서도 달라져 버린다.

아는 분은 아시겠지만 태터의 개발에 있어서 개발자에 직접 참여하고 있지는 않지만 테스팅을 서포팅 중인데 버젼의 다양성이야 다른 어플리케이션의 QA에서도 해온거지만 옵션을 다양하게 하기는 이번처럼 복잡한것도 처음이다. 그것도 플랫폼의 동작 옵션을 건드리고 있는 것이다. 특정 플랫폼에서만 에러가 나도 많은 작업들이 처음부터 이루어 지는데 이러한 PHP와 MySQL의 특성들이 태터의 릴리징을 상당히 느리게 만들고 겨우 통과해도 n%의 사용자들은 정상 동작하지 않아 사용을 못하게 된다.

이거 DBMS야 파일 시스템이야;;
MySQL을 실전에 거의 처음 사용하는 셈인데 나의 첫마디는 이거였다. "이것도 안되요?"
태터툴즈의 경우 버전 3를 기준으로 많은 쿼리들이 작성되다 보니 느리다. 심지어 서브쿼리조차(부조회) 사용을 하지 못하는 것이다. 새로운 프로젝트에서는 태터와는 다른 제약이 있어 4나 5를 검토해 보았는데 결론은 5.1은 되어야 DBMS라고 부를만 하다는 것이었다. 그리고 현 상태에서는 5.0까지 정식으로 나왔고 5.1은 아직 베타이다.
혹자는 ProgressSQL이 더 좋다고 한다. 실제로 써보니 MySQL은 DBMS인가라는 생각만 들 뿐이다. 대학때 프로젝트로 만들었던 것과 차이가 별반 없어 보인다.
사실 나는 DBMS로는 무조건 MS-SQL 2000내지 2005를 써왔다. 그러다가 MySQL을 보니 지금까지 그런 환경에서 어플리케이션을 작성해 온 사람들에게 경의감 까지 들 정도이다. 5.1이 나오면 기능성이 만족 될지 모르겠지만 아직 3,4가 판을 치는 상황에서 당분간은 DBMS를 MySQL로 사용하기엔 아찔하다.

코드와 디자인의 분이. 요원한 소원
ASP의 훌륭한 점이라고 한다면 디자인과 코드의 분리를 어느정도 구현했다는 점이다.(아직 완벽한 것은 아니다.) 그리고 곧 나올 ATLAS를 보고 있는데 AJAX를 구현함에 있어서도 이런 특성을 십분 발휘할 수 있지 않을가 기대를 하고 있다. 허나 우리의 PHP군. 애시당초 그런게 고려되었을리 만무하다.
이런점이 왜 필요한가? 간단한 프로그램 작성하는데는 필요없다. 하지만 규모가 커지고 이쁘장함과 기능성이 둘다 중요해 지는 시점에서 혼자서 두마리의 토끼를 잡기는 힘들다. 설사 능력이 있다 하더라도 한곳에 집중하는 편이 좋다. 그리고 보통은 둘다 잘하는 사람은 드물다.(사용하는 뇌의 영역이 다른듯)
현재 웹 아키텍쳐를 설계함에 있어 디자인과 코드를 분리하는 문제는 심각하게 고려하고 있다. 여기서 PHP는 단독으로는 불가능하다. 뭔가 끼어 들어야 한다. 사실 어거지로 뭔가 넣어야 한다. PHP는 그러라고 탄생된건 아닌거 같기 때문이다.

명필이 붓을 가리지는 않지만..
현재 신규 프로젝트에서 APM을 택할 가능성은 높은 것 같다. 개인적으론 ASP.NET을 추천하였지만 역시 APM도 무시할 수 없고 오히려 그쪽으로 결정될 가능성이 높다라고 보고 있다. 위에서 언급한 기술적인 문제를 제외하곤 다른 분야에선 APM이 오히려 높은 점수를 받고 있기 때문이다. 특히 가격.
나야 나름대로의 환경에서 개발을 해내야 하고 그것이 나의 능력이 되어야 겠지만, APM은 아직 보완해야 할 부분이 너무나 많은 것으로 보인다. 장점이 엄청 많다지만 결정적으로 발목을 잡고 있는 것들이 있다.

PS. 마비노기에 보면 "게임이 너무 쉬우면 재미없습니다"란 말이 중간에 나온다. 프로그래밍 언어도 그런것 같다. 너무 쉬운것도 문제가 되나 보다.

PS2. 프로그래밍을 시작하면서 PHP를 쓰는건 좀 위험하지 않나 싶다. 가능하면 좀 엄격한 언어를 먼저 접하고 PHP로 오는게 좋지 않나 생각이 든다. PHP가 언제까지 지금의 인기를 유지할지도 모르기 때문이기도 하고 다른 언어로의 적응에도 문제가 될지도 모른다는 생각이다.

PS3. 개인적인 의견이니 절대적으로 믿지도 마시고 나름대로의 의견을 트랙백으로 걸어주시면 매우 감사하겠습니다.
TAG APM, MySQL, php, 언어
이번 TatterTools 1.02와 더불어 등장한 Migrator.php를 뜯어보자. 우선 주의할 것은 케릭터셋 변환을 위한 데이터가 들어 있어서 어정쩡한 에디터로 읽었다간 파일이 망가질 수 있다. 가능하면 UTF-8로 읽어 내기를 권장한다.

주의! 여기의 내용은 상당히 위험한 방법일 수 있기 때문에 어느정도 프로그래밍이 가능하고 특별한 처리를 하기 위한 상황에서만 실제 적용을 하기 바랍니다. 초보자를 위한 FAQ같은 것은 아닙니다. 또한.. 언제나 잊지 말것은 Backup!

UTF 판별하기 함수
이전에 UTF8의 판별에 대해 적은 글이 있는데 그 방법의 결정판이 이 파일의 250번째줄 근처에 있는 isUTF8과 adjustUTF8 함수일 것이다. 허나 이 함수에서 주의할 점이 하나 있다. 나름대로 제너럴 하게, 그리고 무난하게 판단하고 변환을 시켜주고 있지만 자신의 데이터가 특별한 경우 가차없이 '?'로 변신 시키는 함수기도 하다. 특수한 언어 체계(?)를 사용중이라던가 컨텐트 중에 특수한 케릭터 변환이 필요하다면 이 함수를 약간 손봐줘야 할 것이다. 0.96 즉 euc-kr에서 변환하는 경우에 xml에서 import 도중 에러가 날때도 역시 여기를 고민해 봐야 할 수 도 있다.

특정 영역의 변환 문제
1.02로의 변환중 특정 영역에 euc-kr로 남아 있어서 문제라거나 utf-8로 변환되어 버려 문제가 생기는 경우, 그리고 특정 문자의 치환이 필요하다면 300라인쯤 부터 펼쳐지는 "각부분처리기"에서 수정할 수 있다.
우선 변환과 관련된 것은 iconver, 그리고 치환자는 str_replace를 사용하고 있다. 특정 글의 특정 부분에 이런것을 적용하거나 해제하고 싶다면 바로 이부분에서 수정할 수 있다. 특히 420번째즘 나오는 $post->content 영역의 경우 글에 들어 있는 스크립트를 1.02에서 사용하기 위해 태터 플러그인족에 공개된 PureCode를 사용하도록 수정할 수 있게 자동 변환할때 사용해야할 키워드일 것이다. "<script>"의 "<"를 "&lt;"로 변환하고 앞뒤로 PURE를 붙여주는 작업등을 할 수 있다. 본인의 경우 글이 100개밖에 안되서 대충 보고 문제되는 놈들은 0.96을 옆에 뛰우고는 에디터로 Copy&Paste를 하는 식으로 작업했지만 도저히 수작업으로 불가능 하다면 이 방법을 생각해 볼 수 있다.

마이그레이션 이후
0.96에서 바로 1.02로 점프한 나로서는 일종의 "플랫폼 변환"을 당하고 말았다. 체계도 달라지고 에디터도 다르고 글을 쓸때 정보도 다르다. "Borland C++ for Windows"를 쓰다가 "Visual Studio 98"로 넘어갈때의 느낌이랄까? 좋아진점도 있지만 나빠진 것도 많고 그보다 중요한 것은 새로운 것을 배워야 하고 적응해야 한다. 그리고 이런 이동에서 격어야 하는 어려움들... Tatter&Company의 개발자도 죽어라 디버깅 했겠지만 나도 이 이동을 위해 한달 전 부터 나름대로 준비를 해 왔다. 그래도 여전히 이동 당일날 약간의 트러블은 생기게 되고 아직도 FF에서는 배경의 격자가 보이지 않고 등등..

그러나, 아픈만큼 성숙해 지는 법이다.