[[NSDeveloper alloc] initWithName:@"Just another developer"]
Posts tagged php
CakePHP에서 세션 사용하지 않기
Sep 18th
대형 포탈들이나 서비스 업체들에서는 세션을 사용할 수 없도록 정책을 정해놓은 곳들이 있다. 보안이나 성능 상의 위험을 막고자 함이다. 이 때, 암묵적인 사용금지 뿐만이 아니라 서버 상에서 세션 사용 자체를 막아버린 경우가 있는데, 이런 경우에 CakePHP는 문제를 일으킬 수 있다.
CakePHP에서 Session lib[fn]/cake/libs/session.php[/fn]와 이를 상속받은 Session component [fn]cake/libs/controller/components/session.php [/fn] 을 이용해 세션을 처리한다.
세션에 대한 설정은 core.php에서 이루어진다. core.php[fn]/app/config/core.php[/fn]는 CakePHP와 관련된 환경 변수들을 세팅해 두는 곳이다. core.php에서 AUTO_SESSION를 false로 해 둔다고 해서, 세션을 아예 사용하지 않는 것은 아니다.
어쨋든 Session lib가 호출되고, __startSession 메소드에서 session_start()를 호출하게 된다.
이건 버그라고 보기 힘든 면도 있지만.. 어쨋든 원인은 Session component를 강제로 항상 호출하는데 있다. /cake/libs/controller/component.php 파일에서 58번째 줄을 보면, controller에서 세션 컴포넌트를 항상 강제로 호출을 하는데, 이를 주석처리 하면 된다.
[code]
function init(&$controller) {
$this->__controller =& $controller;
if ($this->__controller->components !== false) {
$loaded = array();
// $this->__controller->components = array_merge(array('Session'), $this->__controller->components);
$loaded = $this->__loadComponents($loaded, $this->__controller->components);
[/code]
Simple OpenID의 Delegate OpenID 버그 수정하기
Feb 19th
PHP용 OpenID 라이브러리인 Simple OpenID는 파일 1개로만 이루어진 “인증전용” Consumer 라이브러리이다. Jan Rain의 라이브러리나 기타 다른 라이브러리보다 설정과 사용이 편리해, 많은 사람들이 사용하는 라이브러리 중 하나다.
나는 주로 Jan Rain의 라이브러리를 사용했었는데, 이번 OpenID 이벤트의 관리자 페이지에서는 Simple OpenID 를 사용했다. 그런데, 이 라이브러리에는 버그가 있었다. 글쎄, 어떻게 보면 버그가 아니라고 할 수도 있겠지만…
어쨋든, Simple OpenID를 사용하면, 간혹 델리게이션된 URL에서 OpenID를 찾지 못할 때가 있다. 즉, claimed ID에서 verified ID를 가져오지 못한다. 라이브러리를 디버깅해보니, “사소한[!]” 문제가 있었다.
아래는 class.openid.php의 HTML2OpenIDServer 함수이다.
[code]
function HTML2OpenIDServer($content) {
$get = array();
// Get details of their OpenID server and (optional) delegate
preg_match_all('/
]*rel="openid.server"[^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1);
preg_match_all('/
]*href="([^"]+)"[^>]*rel="openid.server"[^>]*\/?>/i', $content, $matches2);
$servers = array_merge($matches1[1], $matches2[1]);
preg_match_all('/
]*rel="openid.delegate"[^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1);
preg_match_all('/
]*href="([^"]+)"[^>]*rel="openid.delegate"[^>]*\/?>/i', $content, $matches2);
$delegates = array_merge($matches1[1], $matches2[1]);
$ret = array($servers, $delegates);
return $ret;
}
[/code]
뭔가 이상하지 않는가?
사용자가 제출한 OpenID URL에서 openid 정보를 가져오기 위해 위와 같은 정규표현식을 사용했는데, 여기에서는 rel=”openid.server”, href=” “, rel=”openid.delegate”, …와 같이 속성을 쌍따옴표(“)로 감쌌다고 가정하고 있다. 하지만, 사용자들이 모두 표준에 맞추어 쌍따옴표로 감싼다는 보장이 어디 있겠는가?
내 블로그(텍스트큐브)의 OpenID 플러그인에서도 다음과 같이 홑따옴표로 델리게이션 정보를 표기하고 있었다.
[code]
<link rel='openid.server' href='http://www.idtail.com/server'>
<link rel='openid.delegate' href='http://fribirdz.idtail.com/'>
[/code]
델리게이션을 사용하는 많은 사람들이 텍스트큐브를 사용할텐데, 에러를 종종 겪었을 거 같다. 요 부분은 텍스트큐브 측에 수정을 요청하였다. 티켓으로 올라갔으니, 1.6에서는 해결되리라 보인다.
그리고, 돌아가도록 정규표현식을 아래와 같이 (무식하게) 바꿨다.
[code]
function HTML2OpenIDServer($content) {
$get = array();
// Get details of their OpenID server and (optional) delegate
preg_match_all('/
]*rel=["\']openid.server["\'][^>]*href=["\']([^"\']+)["\'][^>]*\/?>/i', $content, $matches1); preg_match_all('/
]*href=["\']([^"\']+)["\'][^>]*rel=["\']openid.server["\'][^>]*\/?>/i', $content, $matches2);
$servers = array_merge($matches1[1], $matches2[1]);
preg_match_all('/
]*rel=["\']openid.delegate["\'][^>]*href=["\']([^"\']+)["\'][^>]*\/?>/i', $content, $matches1); preg_match_all('/
]*href=["\']([^"\']+)["\'][^>]*rel=["\']openid.delegate["\'][^>]*\/?>/i', $content, $matches2);
$delegates = array_merge($matches1[1], $matches2[1]);
$ret = array($servers, $delegates);
return $ret;
}
[/code]
결과는? 내 블로그에서도 델리게이션이 잘 된다.
혹시나 Simple OpenID를 사용하시는 분은, 위 함수를 바꿔주시면 잘 돌아갈 것이다.
Simple OpenID에서도 OpenID Spec. v2.0용 라이브러리를 발표했는데, 소스를 받아보니 다음과 같이 수정을 했더라. 근데, href는 여전히 쌍따옴표(“)로 감쌌다고 가정하고 있다. -.-;;
[code]
function HTML2OpenIDServer($content) {
$get = array();
// Get details of their OpenID server and (optional) delegate preg_match_all('/
]*rel=["|\']openid.server["|\'][^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1);
preg_match_all('/
]*href="([^"]+)"[^>]*rel=["|\']openid.server["|\'][^>]*\/?>/i', $content, $matches2);
$servers = array_merge($matches1[1], $matches2[1]);
preg_match_all('/ ]*rel=["|\']openid.delegate["|\'][^>]*href="([^"]+)"[^>]*\/?>/i', $content, $matches1); preg_match_all('/ ]*href="([^"]+)"[^>]*rel=["|\']openid.delegate["|\'][^>]*\/?>/i', $content, $matches2);
$delegates = array_merge($matches1[1], $matches2[1]);
$ret = array($servers, $delegates);
return $ret;
} [/code]
PS : 소스코드 깔끔하게 나오게 하기 힘들다 T_T 뭔가 엉키거나 인덴테이션이 조금씩 엉키네. 컴퓨터는 역시 어려워 -_-;;
Mac OSX에서 개발하기
Nov 25th
예전에 회사 팀블로그에 썼던 글 입니다. 부족한 부분이 많아서, 누군가에게는 도움이 될 수 있도록 내용을 정리한 후에 제 블로그에 다시 올리려고 했었는데, 게으름때문에 지금까지 미뤄져 왔네요. 일단은, 예전에 쓴 글을 그대로 퍼서 다시 올립니다.
레오퍼드도 나왔고, 덩달아 여러가지 변화도 있었으니 더 미루면 정말 쓸모없는 글이 될 거 같아서요. 다음주 즈음에 노트북하드를 새로 구입하고, 레오퍼드로 갈아탈 예정이니 쓸 거리가 많이 생길거라고 봅니다.
환경
아래 사진은 제 책상입니다. LCD 2대와 맥북이 놓여있죠. 책상 아래에는 윈도우가 깔려 있는 데스크탑이 있습니다. 오른쪽 LCD는 맥북과 연결되어 있고, 오른쪽 LCD는 데스크탑과 연결되어 있습니다. 즉, 1대의 랩탑과 1대의 데스크탑을 쓰고 있는 셈입니다. 2대의 컴퓨터를 Synergy를 통해 1개의 키보드/마우스로 쓰고 있습니다. 듀얼모니터의 생산성 향상에 대해서는 이미 많은 연구 결과들이 뒷받침해 주고 있습니다. 굳이 조엘 아저씨가 아니더라두요.
/XAzCzcSPyk.jpg” width=”600″ height=”399″ alt=”사용자 삽입 이미지” title=”" />
키보드는 3년동안 라이트 버전을 쓰다가, 얼마전 큰맘먹고 지른 해피해킹2프로입니다. 마우스는 개발도, 웹서핑도, FPS게임도 내 맘대로 움직여주는 MS 인텔리 옵티컬 1.1이고, 마우스패드는 위키북스 사장님이 선물해주신 X-Ray Thunder 8 입니다.
(쓸데없는 자랑모드-_-) 벽에 붙어 있는 것은 TextMate Cheat Sheats이고, 타이머는 Perky님 등 많은 분들이 쓰고 있는 모델이죠. 뒤에 보이는 플립시계는 C2 발표회때 받은 것입니다.
마우스/키보드 같이 쓰기 : Synergy
시너지는 운영체제에 상관없이 (리눅스, 유닉스, OS X, 윈도우 등), 키보드/마우스를 공유할 수 있는 오픈소스 솔루션입니다. 이미 많은 분들이 애용하고 있죠. 맥북을 시너지 클라이언트, 데스크탑을 시너지 서버로 설정했고, 당연히 키보드/마우스는 데스크탑에 연결 했습니다. 컴퓨터가 부팅되면 시너지 서버와 클라이언트는 자동으로 실행되기 때문에, 심리스하게(-_-) 사용할 수 있습니다.
윈도우와 OS X를 시너지로 연결할 때 Super(윈도우의 윈도우키, OS X의 커멘드 키)키와 Alt키가 뒤바껴 눌릴 수 있습니다. 이땐 시너지 서버의 Configure – Screen’s Edit – Modifier에서 Alt와 Super의 매칭을 바꿔주면 됩니다. OS X에서 한글 상위로 사용할 때 bus error가 날때는 이 글 을 참고하면 됩니다.
맥의 마우스 감도는 윈도우보다 많이 떨어집니다. 이를 보완할 수 있는 유틸리티나, MS/로지텍의 마우스 드라이버를 깔면 좀 괜찮아지지만, 민감한 분들은 견디기 힘들 수 있습니다. 저 역시 그래서 윈도우에 마우스를 연결했습니다. 하지만, OS X의 TextMate를 쓰는 경우에는 휠스크롤이 너무 느리게 동작한다는 문제점이 있습니다. 이는 외국에서도 몇몇 사람이 문제제기를 했으나, 아직 마땅한 해결책은 나오지 않았습니다. 이 점이 걸리신다면, 맥을 시너지 서버로 사용하는게 좋습니다.
텍스트 편집기 : TextMate
맥에는 TextMate라는 쿨-한 편집기가 있습니다. TextMate를 쓰기 위해 맥을 쓴다는 사람들이 있을만큼, 말 그대로 “The missing editor”라고 불릴만 합니다. 루비 온 레일스의 스크린캐스트 덕택에 더욱 유명해졌지요. 저 역시, 블로그 15분 만들기를 보고 사게 되었으니까요.
하지만, 한글을 제대로 표현해 주지 않는 등의 문제가 있습니다. 2바이트 언어권 문제는 레오퍼드 이후에 해결될 예정이니, 그 동안은 별도의 한글 글꼴을 사용해야 합니다.
TextMate에 대한 글들은 이곳과, Official Website의 Screencast를 보면 되겠습니다.
MAMP (Mac + Apache + Mysql + PHP)
펌핏과 IDTail은 APM(Apache, PHP, Mysql) 환경에서 개발되었습니다. 윈도우/리눅스에서 이를 APM이라 한다면, 맥에서는 앞에 Mac을 붙여 MAMP라고 합니다. 윈도우에 APM Setup이나 Autoset과 같은 APM통합 설치/운영이 있듯이, 맥에도 이러한 통합 솔루션이 있습니다. 가장 널리 사용되는 것은 MAMP와 XAMPP입니다. XAMPP는 Linux, Solaris, Windows 버전도 있지요.
MAMP가 가장 편리합니다. Cocoa기반의 GUI Tool도 제공이 됩니다. 자세한 설정사항은 정목님의 블로그를 참고하세요. MySQL 최신 버전을 사용하시려면 MAMP 1.5b를 받아야 합니다. 전 Mysql/Apache의 Port를 Default Port로 변경하고, htdocs 위치를 변경하고 다른 설정은 건드리지 않았습니다. (물론 아파치 설정은 조금 바꿨지요) mysql.sock 위치를 변경하는게 번거로워서 그냥 /var/tmp에 심볼릭 링크를 만들어 쓰고 있습니다.
하지만, MAMP는 SSL을 지원하지 않습니다. 잠깐 찾아보니, MAMP에서 사용하는 Apache는 SSL이 붙을 수 없는 빌드라고 합니다. IDTail에서는 ssl을 사용하기 때문에 제 환경을 XAMPP로 바꾸고 있습니다.
Mysql GUI Tools
루비 온 레일스로 블로그 15분 만에 만들기 에 등장했던 공개SW CocoaMySQL도 너무 예쁘고, 편리한 MySQL 관리 툴이지만, MySQL ‘공식’ 제공 툴이며, OS 상관없이 쓸 수 있는 Mysql GUI Tools를 쓰고 있습니다.
Safari, Firefox
개발을 사파리로 하고 있진 않습니다. 듀얼모니터의 이점을 살리기 위해서 입니다. 또, 맥에서 Firefox가 너무 느리고, 버그도 많아서 제대로 쓸 수도 없구요. 맥북의 LCD에는 메신저, 터미널, 콘솔, Query Browser, SVN Client 등을 띄워놓구요. 왼쪽 LCD는 TextMate를, 오른쪽 LCD(윈도우 머신)에는 firefox를 띄워놓습니다. firefox에 firebug, Web Developer를 깔아놓은 건 당연하지요. (아 이녀석들 없을 땐 대체 어떻게 개발했었는지.. 아찔합니다. -_-)
SVN
OS X를 처음 설치하면, Subversion은 1.2.x가 깔려 있습니다. 1.4.3을 사용하려면 직접 빌드하거나, OS X용으로 빌드된 녀석을 찾아야 합니다. Fink로도 최신버전을 찾을 수 없습니다. 미리 컴파일 후 패키징된 것을 까는게 편합니다.
SVN Client
터미널에서 작업하는게 더 명료하지만, 아무래도 귀찮죠. SvnX라는 괜찮은 SVN GUI Client가 있습니다. 커밋 계획을 ‘스마트 뷰’로 보는게 특히 편리합니다. 하지만, 한글 Log를 남기면 깨지는게 단점입니다. Zig Version이라는 맥답게 심플한 프로그램도 좋습니다. 한글도 깨지지 않아요. 하지만, diff에 연결할 에디터를 고를 수 없는 등의 단점이 있습니다. 몇몇 다른 클라이언트들도 있지만, 인터페이스가 복잡하고 좀 무겁습니다.
VI
TextMate를 쓴다고 해도 vi를 안쓸 수는 없겠죠. SVN과 마찬가지로 OS X를 처음 설치하면, vim 6.2가 깔려 있고 vim.org에서 맥용 vim 7.0을 공식 지원하진 않습니다. 이곳에서 파일을 받으면 됩니다. 따로 빌드해도 되구요. 아니면, 여기서 vim7.0.188-univ.tar.bz2 를 받고 적당한 곳에 복사를 하고, alias vi=”/Applications/OA/Vim.app/Contents/MacOS/Vim” 와 같은 식으로 추가해서 써도 되겠죠.
마치며
사실 맥으로 개발한다고 해서 완벽한 웹표준, 완벽한 크로스브라우징을 지키고 있진 못합니다. IDTail역시 사파리에선 깨지는 페이지들도 아직 남아 있구요. 차차 개선해 나가야지요.
맥으로 처음 웹 개발을 해보면서 겪었던 삽질들도 앞으로 하나씩 써보겠습니다. 맥이라서 해야했던 삽질도 있겠지만, 제가 잘 몰라서 했던 삽질들도 많겠죠. 어쨋든, 저처럼 무식한 삽질을 하는 분들을 한분이라도 막기 위해서 (흑흑… 있긴 있을까) 글을 써봅니다. 아, 벌써 9시가 다되가네요. -_- 집에 가야지