Archive for April, 2009

최근의 관심거리 JavaFX

자바스크립트를 본업으로 삼고 있는 입장에서는, 브라우저의 한계라는 것이 꽤 귀찮을 때가 있다. 예컨데, 업로드 프로세스를 다룰 수 없거나 로컬 파일을 다룰 수 없는 방법이 전혀 없다는 점은 매우 큰 단점 혹은 한계로 작용한다.

adobe-flash그간 이러한 한계를 극복할 가장 현실적인 대안으로는 Adobe Flash(이하 Flash)를 손꼽았고, 나 역시 관심을 가져왔었다. 실제로 현재 크로스 브라우징을 지원하는 대부분의 업로드 컨트롤은 Flash를 사용한다. 그렇다고 아쉬움이 없는 것은 아닌데, 몇 가지 예를 들자면 이렇다.

첫째, 업/다운로드한 폴더를 기억할 수 없다.
둘째, 이어보내기 / 이어받기가 안된다.
셋째, HTTP 외의 다른 프로토콜을 사용할 수 없다.
넷째, 바탕화면(혹은 데스크톱)에서 웹브라우저로 드래그해서 파일을 선택할 수 없다.

여기에 덧붙여 인쇄를 제어할 수 없다는 점도 한계로 느껴졌다(모르긴 몰라도 인쇄 제어까지 제대로 되는 크로스 브라우징 플랫폼이 나온다면 상당히 활용도가 높을 것이다).

몇 달전, JavaFX의 소식을 접했을 때 기대했던 부분이 바로 나의 이런 갈증을 해소해줄 수 있지 않을까 하는 것이었다. 마침 최근에 회사 내부적으로 개최한 JavaFX 세미나가 있어 두 차례 참석하게 되어 더 자세히 알아볼 수 있는 계기가 되었다. 첫번째에는 2,30여명의 인원이 있었고 처음 접하는 자리라 정말 궁금한 부분을 물어보지 못한 반면, 두번째에는 Sun에서 나오신 분들을 제하면 4명만 참석한 자리라 궁금한 것을 물어볼 수 있었다. 그 덕분에 일단은 JavaFX가 내 관심 영역에 들어오는데 성공할 수 있었다.

JavaFX

JavaFX

사실 JavaFX는 웹 초기에 유행하던 Java Applet과 유사하다. 배포하는 방식이나 실제로 할 수 있는 일을 보면 더욱 그렇다. 조금 다른 점이 있다면, 훨씬 쉬운 문법으로 훨씬 간편하게 만들 수 있다는 것 정도일 것이다. Java Applet과 배포 방식이 유사하다는 말은 꽤 불편하다는 의미도 된다. Flash 또는 Silverlight 정도의 편리함은 확보해주어야 적용할 웹사이트가 늘어날텐데, 아직까지는 불편한 것은 어쩔 수 없는 듯 했다. 다만, 다가오는 Java One에서 무언가 보여줄 준비를 하고 있다고 하니 배포 방식에 대한 개선도 기대해봄직하다.

웹 브라우저의 플러그인이 태생인 Flash와는 다르게 JavaFX는 시스템을 다루는 언어 Java에서 웹 브라우저로 옮겨온 경우다. 그래서, 비록 Sandbox 내에서라 해도 위에 말한 것과 같은 Flash에서의 아쉬움을 해결할 수 있지 않을까 하는 기대를 해본다. 웹 브라우저에서 실행하지만, 웹 브라우저와 별개의 프로세스로 구동할 수도 있는 플러그인이라 더욱 관심이 간다.

(그 외 똑같은 코드로 핸드폰, TV 등에도  사용할 수 있는 장점이 있지만, 웹 개발자 입장에서는 아직은 요원한 일일 뿐이라 언급하지 않았다)

Java는 아무리 해도 친해지기 어렵던데, 이번에 계획한 일들을 마무리하고 나면 공부해두어야겠다.

Rasmus의 특강 : Simple is Hard

PHP 창시자 Rasmus Lerdorf 의 특강이 2009년 4월 21일, 그러니까 어제 야후 코리아 사무실에서 있었습니다. 보다 많은 사람들과 공유하고자 간단하게 내용을 정리해봤습니다. 강의 자료는 http://talks.php.net/show/korea09 를 참고하세요.

슬라이드

슬라이드

강의는 전체 두 개 세션으로 진행되었습니다.

첫번째 세션에서는 단순함(Simplicity)을 강조했고, 두번째 세션에서는 보안(Security)을 강조했는데 XSS에 대한 내용이 주였습니다. 시간이나 진행 내용으로 봤을 때 Rasmus씨가 강조하고 싶었던 것은 전자인 듯 합니다.

아래는 제 기억에 의존해서 Rasmus씨의 강의를 대충 재구성해봤습니다(앞의 번호는 슬라이드 번호입니다). 아무래도 강의가 영어로 진행되다보니 전부 다 들은 것은 아니라 빠진 부분이 있을 수도 있습니다. 슬라이드를 참고해서 보시면 도움이 되리라 생각합니다.

  1. 어느 복잡한 어플리케이션의 구조. 뭐가 뭔지 알아보기 힘들다.
  2. 경험이 증가할수록 더욱 단순하게 만들려고 노력하지만, 대부분의 웹은 중간단계(복잡도가 증가하는)에 머물러 있다. 점점 더 복잡해지는 추세다. 야후에서 다른 사람들이 나에게 문제가 생겼다고 도움을 요청할 때마다 내가 하는 일은 코드를 지우는 것이었다.
  3. 복잡성이 증가함으로써 우리가 잃게 되는 것. Scalability, Performance, Security
  4. 어떤 것도 공유하지 않는 구조가 좋다. HTTP를 처음 봤을 때 그 단순함에 매료됐었다. 사람들이 Stateless한 HTTP에서 세션, 쿠키 등을 요구했었다. PHP에 그 기능을 추가하면서, 나는 그 부분을 아예 위임할 수 있도록 했다. “좋은 외부 솔루션이 많은데, 왜 내가 직접 만들어야 하지?” 그랬더니 사람들이 알아서 DB에도 붙이고(특히 단순한 MySQL이 많이 사용됐다) 그랬다. MVC 패턴은 정말 좋지 않은 생각이다. 왜 모든 것을 Controller가 제어해야 하는가? 야후 메일은 각각의 서버가 독립적으로 통신하도록 만들어져있다. (이 부분에서 특히 많은 말을 “빨리” 해서 놓친 부분이 많습니다. T^T)
  5. 웹 브라우저 자체가 이미 훌륭한 Front controller이다. 독립적으로 요청하고, 독립적으로 데이터를 수신할 수 있다.
  6. (지금부터는 Performance 얘기) 사용자들에게 0.2초 안에 어떤 반응이 일어나지 않으면 그 웹사이트는 문제가 생길 수 있다. 반응이 없어 클릭을 여러번 하면 여러번의 요청이 생긴다. 한번만 발생해야할 요청이 여러번 발생한다는 것이다. PHP는 느리지 않다. 대부분의 병목현상은 프론트엔드(front-end)에서 발생한다. (YSlow 시연 – 야후코리아, ㅈ신문사)
  7. Siege를 사용한 퍼포먼스 테스트
  8. APC를 사용한 성능 개선
  9. 웹 서버의 call 프로세스를 체크하고, System call을 줄인 사례(Directory index 순서를 조절하거나 적게 지정하도록)
  10. System call을 줄이기 위해 include 패스를 조절한 사례(.을 뒤로 두면 보안상 좋다는 것 같기도… -_-;;)
  11. 다시 벤치마킹
  12. apc 파라미터값 조정. stat는 파일의 변경을 자동으로 체크하도록 하는 인수
  13. include 구조를 파악할 수 있는 툴(솔루션의 복잡성을 파악하는데 도움이 된 듯)
  14. 의존성 제거
  15. Callgrind를 사용한 병목구간 체크 방법(직접 시연을 해주었는데 꽤 유용한 툴이었습니다. rasmus씨가 사용한 것은 kcallgrind라는 GUI 툴이었습니다)
  16. XDebug를 사용한 병목구간 체크 방법(XDebug에서 Callgrind를 지원해서 실은 거의 같았어요)
  17. 불필요한 코드 제거(여기서는 과도한 XMLWriter 호출 제거)
  18. 본인이 작성한 Twit
  19. Twit의 성능 – 1
  20. Twit의 성능 – 2
  21. Twit의 구조 (그러니까 빠르다… 이런 느낌?)
  22. Callgrind 체크
  23. 휴식

휴식 시간 이후로는 XSS에 대한 내용이었는데, 슬라이드만 봐도 어느 정도 이해할 것이라 생각합니다. 처리해야 할 게 너무 많더군요. -_-;;

그 외 기타사항으로는… Entry 포인트를 나누어라(index.php에서 다하려고 하지말고, 파일을 나누어라. 그게 웹 어플리케이션이 작동하는 방식이다), 클래스 구조를 과도하게 작성하는 것은 컴파일되는 언어에서나 해라(스크립트 언어는 그렇게 쓰라고 있는게 아니다), 클래스 상속구조가 어떻게 프레임웍이 어떻고 그건 개발자들의 자기 만족일 뿐(사용자들은 신경쓰지 않는다. 사용자들이 관심있는 것은 이 사이트가 얼마나 빨리 반응해주냐이다)… 정도가 있었습니다.

마지막에는 자신이 만들었다는(제가 듣기론?) XSS 스캐너 프로그램인 scannus 시연 장면을 보여주었습니다만, 검색해보니 공개된 것은 아닌가 봅니다. ^^;; 대신 예전에 ajaxian.com에서 봤던 XSS Rays라는 스캐너 프로그램을 링크합니다.

Slides: http://talks.php.net/show/korea09
YSlow:http://developer.yahoo.com/yslow
Siege:http://www.joedog.org/JoeDog/Siege
Xdebug Profiling: http://xdebug.org/docs/profiler
XHProf Profiling: http://pecl.php.net/xhprof
sla.ckers.org: http://sla.ckers.org/forum/list.php?3
Filter: http://php.net/filter

그리고 아래는 제가 아주 잘 나온 인증샷~

Rasmus의 특강 경청중!

Rasmus의 특강 경청중!

Scintilla 1.77 한국어 IME 패치

Scintilla 1.77 버전이 나왔는데, 아직 패치를 실행하신 분은 없는 듯 해서 직접 패치 후 컴파일 했습니다. 패치 방법은 codewiz님, BlUE’nLIVE님이 작성하신 방법도 있는데, 너무 수정할 게 많아서 sixmen님께 힌트를 얻어 제 나름대로 수정했습니다. 덕분에 토요일 오후가 사라졌네요. ;;

다루어야 하는 파일은 ScintillaWin.cxx 파일 하나뿐입니다. 패치방법을 기억하기 쉽도록 아래에 적어둡니다. 그냥 바이너리 파일만 필요하신 분은 바로 아래에 있는 링크에서 받으시면 됩니다. 하지만, 현재 이 DLL에는 버그가 있습니다. 사용상에 중대한 영향을 끼치는 것은 아니라고 생각하지만, 경우에 따라서는 중요해질 수도 있습니다. 꼭 이 글 제일 아래에 있는 버그를 확인 후 사용하세요. 저한테는 중요한 버그가 아니라 일단 그냥 쓰기로 했습니다. -_-;;

zip Scintilla 한국어패치 다운로드

패치 과정

아래의 모든 과정은 ScintillaWin.cxx 파일에서 이루어집니다.

1. case WM_IME_STARTCOMPOSITION: 를 찾습니다.
아래의 소스를 다음과 같이 수정합니다. 한글 키보드일 때만 작동하도록 되어있으며 이 부분은 sixmen님 소스를 그대로 사용했습니다.

case WM_IME_STARTCOMPOSITION:// dbcs
	ImeStartComposition();
	// 여기부터
	if (LOWORD(GetKeyboardLayout(0))==MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN)) {
		// if the current IME is the Korean IME, do not show the default IME window
		return 0;
	}
	// 여기까지가 추가된 부분입니다.

Read more

Page 1 of 212