2007년 12월 4일 화요일

의욕상실입니다.

최근들어서 모든일에 대해서 의욕을 상실해 버렸습니다.
이제는 포기하렵니다.


바꿀수도 바꾸려고 하지도 않는다면 포기해야죠.

※ 답변 달아주셔서 감사합니다. (__)
※※ 마음편히 살기로 했습니다. (-_-b)

2007년 11월 25일 일요일

프랑크푸르트 콘티넨탈 호텔(싱글 룸)

스페인 여행 갔을 때 묶었던 프랑크푸르트의 콘티넨탈 호텔 사진입니다.
  • 싱글룸이였구요.
  • 비용은 정확히 기억이 나지 않는데 매우 저렴하였습니다. (다른 호텔에 비해서)
  • 프랑크푸르트 역 부근에 있어서 찾아가기 매우 쉽습니다.
  • 시설 수준은 보통이구요.
  • 갔을 때(9/27/2007)는 외부 공사중이여서 전망은 별로 였습니다.
  • TV는 있으나 시청 시 요금이 부과됩니다.
  • 조식 제공이었는데 새벽에 도착해서 먹어보지는 못했습니다.(식사류 평가는 높더군요)
사용자 삽입 이미지

보이기에는 허접이라도 나름 푹신한 침대입니다.


바깥 외벽 공사하느라 비계 등이 설치되어 있어서 많이 어둡더군요.
사용자 삽입 이미지

왼쪽 편 사진의 오른쪽 벽에 걸려 있는 청소기처럼 생긴게 헤어 드라이기더군요.
사용자 삽입 이미지사용자 삽입 이미지

샤워시설과 화장실은 깔끔히 잘 갖추어져 있습니다. 욕조가 없는게 매우 아쉬웠지만요.
가격대 성능비를 생각하시면 추천할만합니다. (프랑크푸르트 역주위만 보고 다른 곳으로의 이동을 생각하신다면 또 추천 ^^)
사용자 삽입 이미지

구글에서 검색한 화면입니다.

관련 링크:

2007년 11월 21일 수요일

포탈지향적 사고방식?

포탈지향적인 사고방식이 어떤게 있을까요?
  • 남들이 하는 (잘될 것 같은) 서비스는 우리도 제공해야한다. (이미 늦었다.)
  • 그 서비스는 우리가 개발해야한다. (인력 비용은?)
  • 문제는 기술력으로 극복해야한다. (뭐.. 기술력으로 극복해야할 수도 있다. 그러나, 기획 또는 디자인에서 반대로 생각하면 쉽게갈 수 있는 문제라고 생각할수도 있지 않을까?)
  • 이 사이트에서만 되는 기능 저 사이트에서만 되는 기능을 가져다가 우리는 다 구현해야한다고 주장한다. (저기요... 균형이란게 있지 않을까요?)
이런 걸 반대하는 개발자는 잘못된 것일까?

작은조직, 가벼우면서도 빠른 개발, 성과를 내는 조직.... 쉽지 않은 것 같다. 집중이라는 의미는 공부뿐만 아니라 서비스에도 마찬가지인것 같다.

투덜투덜투덜....

JavaScript의 파라미터를 어떻게 처리할 것인가?

Wait till I come!Sending Objects as parameters - good or bad?라는 글에서 JavaScript의 파라미터들을 어떻게 처리할 것인가에 대해서 다루었는데요.

JavaScript의 코드들을 살펴보면 파라미터가 여럿 사용된 코드들을 쉽게 찾아볼 수 있습니다.
function doLayerFloat(id, start, end, direction, speed, fade, whatelse, Iforgot) {
}
이러한 코드의 가장 큰 문제점은 이 함수를 호출할 때 파라미터의 개수와 순서를 항상 기억해야하는 문제점을 지니고 있습니다. 게다가 첫 파라미터를 제외와 마지막 파라미터만 값을 넘겨야 하는 경우 null 또는 ''의 값을 넘겨야 하는 문제점도 있죠.
doLayerFloat('myDIV', null, null, null, null, null, null, 'default') {
}
이러한 복잡함은 인자를 항상 받아야할 파라미터를 제외하고 나머지를 배열로 받음으로써 쉽게 해결할 수 있습니다. (배열을 사용하는 비용은 들겠지만요.)
function doLayerFloat(id, props) {
   var elm = typeof id !== 'string'? id: document.getElementById(id);
   for (var i in props) {
   }
   // 또는 || 연산을 사용하여 디폴트 값을 채워줄 수도 있구요.
   props = props || {};
   props.start = props.start || 100;
   ....
}
※ prototype.js를 사용하신다면 다음과 같은 방법도 사용할 수 있습니다.
function doLayerFloat(id, props) {
   var elm = $(id);
   props = Object.extend({
      start: 100,
      ...
   }, props || {});
}
※※ 파라미터가 함께 여러곳에 쓰인다면 Hash가 아닌 의미있는 클래스로 만들어버리는게 바꿔주는게 가장 적당하겠네요. -_-a

출처: Wait till I come!Sending Objects as parameters - good or bad?

2007년 11월 19일 월요일

Prototype 1.6.0의 addMethods()에대한 고찰

요즘에 회사에서 JavaScript OOP 주제로 스터디를 하고 있는데요. 최근에 정식버전이 나온 prototype 1.6.0의 상속기능에 대한 주제로 K과장님(실명을 밝혀도 되려나? ^^;;;)께서 발표를 하셨는데 그 때 잘이해가 안되던 Class.addMethods()에 대해서 다시 정리해보게 되었습니다.
사용자 삽입 이미지

※ 본 포스트에 사용된 Animal클래스는 http://prototypejs.org/api/class/addMethods에 나와있는 클래스입니다.

1. firebug를 실행시켜보면 addMethods의 파라미터(source)는 클래스가 넘어오고 properties는 클래스가 가지고 있는 프로퍼티인 클래스 메소드, Function의 메소드와 prototype 등의 배열이 됩니다.

Object.keys(Animal) 을 출력했을 때 다음의 결과를 얻었습니다.

addMethods, superclass, subclasses, prototype, argumentNames, bind,
 bindAsEventListener, curry, delay, wrap, methodize, defer

2.
ancestor: ancestor는 this.superclass && this.superclass.prototype이 되게 됩니다. 이 때 && 연산의 결과를 알아보기 위해서 http://prototypejs.org/api/class/addMethods의 Animal 클래스로 테스트를 해봤습니다.

Animal을 출력했을 때는

function klass() {this.initialize.apply(this, arguments);}

Animal.prototype을 출력했을 때는
({initialize:(function (name, sound) {this.name = name;this.sound = sound;}),
 speak:(function () {alert(this.name + " says: " + this.sound + "!");})})

의 값을 얻었습니다.

그리고, Animal && Animal.prototype의 결과로는 Animal.prototype의 결과 값을 얻었습니다.

({initialize:(function (name, sound) {this.name = name;this.sound = sound;}),
 speak:(function () {alert(this.name + " says: " + this.sound + "!");})})


(궁금증, 개인적으로는 연산 결과로 logical 연산 값인 true나 false가 나올 줄 알았습니다. 왜그런지 아시는 분 있으신가요?)


3. for문과 if문의 부분은 $super가 첫 번째 argument로 정의되어 있는 Function을 찾는 경우를 의미합니다. (부모 클래스로부터 자식이 function을 상속받아서 $super로 부모의 메소드를 호출할 수 있는 경우가 되겠죠)

4. 이제 가장 궁금했던 value 부분을 살펴볼 것인데요. 가장 바깥의 Object.extend를 호출하는 부분은 value에 toString과 valueOf 메소드를 추가해주는 코드입니다. Object.extend의 첫 번째 파라미터로 넘겨지는 부분만 따로 때어내면 다음과 같습니다.
            (
                function(m) {
                      return function() {
                          return ancestor[m].apply(this, arguments)
                      };
                }
            )(property).wrap(method),

(이 코드가 어떻게 호출되면 과연 부모의 코드를 호출하게 되는 것일까 많은 고민을 했었습니다. -_-;;)

5. 먼저, 가장 처음 실행되는 부분만 따로 때서 생각해보면 (function(m){...})(property) 부분은 인터프리터에서 코드가 읽히면서 실행이 되게 되는데요. 인자로 받은 property의 값은 function(m)의 파라미터인 m으로 넘어가게 됩니다.
Animal.prototype.speak = function () { alert(this.name + " says: " + this.sound + "!"); }
이 코드가 for 루프로 들어가게 되면 m의 값이 'speak'로 넘어오게 되고 ancestor[m]은 function () { alert(this.name + " says: " + this.sound + "!"); }이 되게 됩니다. 즉, 실행된 코드는 실행시점에서 받은 파라미터를 넘겨서 Animal의  speak를 호출하게됩니다. (이 값이 나중에 Animal을 상속받는 자식의 메소드로 저장됩니다.)

            (
               function(m) {
                     return function() {
                         return ancestor[m].apply(this, arguments)
                     };
               }
           )(property)

여기까지 실행된 값은
function () { return ancestor[m].apply(this, arguments); } 됩니다.

6. 이제 마지막으로 wrap메소드를 살펴보면 다음과 같은 메소드로 구성됩니다. 위의 코드의 wrap()이 호출될 때 인자로 넘겨지는 wrapper는 Animal 클래스의 speak 메소드(function () { alert(this.name + " says: " + this.sound + "!"); })가 됩니다.

    wrap: function(wrapper) {
        // 그리고, __method는 5에서 넘겨지는
        // function() {return ancestor[m].apply(this, arguments);}
        // 가 되게 됩니다.
        var __method = this;
        return function() {
            // 그리고, 이 부모의 메소드가 첫 번째 인자로 넘어가게 됩니다. $super의 파라미터 위치에
            // 부모 메소드가 넘겨지게 됩니다.
            return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
        }
    },

7. 그리고, 이 결과 값이 자식의 prototype[property]로 추가되게 됩니다.


P.S. 좀 정신사납게 적은 글입니다만, 참고용으로만 봐주세요. 전체 코드를 다 본게 아니라서.. 쿨헉~
(''  ;;; 언제 다 본 적 있냐고 물으시면 난감합니다.~~)

테스트 출력에 사용한 샘플 파일입니다. (허접이긴 하지만 참고용으로 올립니다. )

※  3에서 던진 질문의 답을 알아냈습니다. JavaScript에서는 Short-Circuit Evalation 연산을 사용하게 되는데요. (expression1) && (expression2)의 연산에서 앞의 expression1이 false면 뒤의 expression2의 연산을 실행하지 않는 것을 Short-Circuit Evaluation이라 합니다. (시험에도 나왔었던 기억이.. -_-;;;)

Animal && Animal.prototype의 경우에는 Animal이 reference 값이 있으므로 true의 값이 떨어지게 되는데요. 이 때 연산의 결과는 expression1의 값과 상관없이 expression2의 연산의 결과에만 의존하게 되므로 expression2의 연산을 boolean으로 값으로 evaluation하지 않습니다.
사용자 삽입 이미지
※ Wikipedia의 내용을 더 살펴보니 Short-Circuit Evaluation을 실행하는 경우 앞의 expression1이 true인 경우 뒤의 연산을 하지 않는, 즉 마지막 값을 그대로 넘겨주는 언어가 여럿 있군요 ^^

2007년 11월 16일 금요일

MoniWiki를 사용하다보니...

입력 창 우측 사이드바에 다음의 문구가 눈에 팍~ 뛰었다.
사용자 삽입 이미지

이런 의민가?
 오우~ 댁같이 MoniWiki 쓰는 사람은 일년이내에 장가갈거야~
--;;;; 과연?????? 아직도.. ㅅㄹ구나.. ㅠㅠ

2007년 11월 14일 수요일

Apache의 Default Host

403 Forbidden You don't have permission to access
Apache 설치 후 http.conf 파일에 VirtualHost를 설정하여서 사용하고 있었는데 *.domain.com 주소가 동작을 하지 않더군요. 이것저것 다 설정해보고 동료 분의 http.conf와 비교도 해봤는데 원인을 찾지 못했었는데 방금 '올빼미'님의 도움으로 해결했습니다. 해결방법은...(Virtual Host에서 주소를 찾지 못할 때도 403이 발생하더군요)

'http.conf의 VirtualHost들이 정의되어 있는 리스트에서 디폴트 동작을하는 VirtualHost 정의는 맨 처음에 위치해야 한다'입니다. (As a consequence, the first listed virtual host is the default virtual host.)

   NameVirtualHost *

<VirtualHost *>
ServerName *.domain.tld
DocumentRoot /www/domain
</VirtualHost>

<VirtualHost *>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
관련 링크 : Named-based Virtual Host Support

2007년 11월 5일 월요일

Apache/PHP 재설치할 때 발생한 문제들

여러가지 이유로 인하여 Apache와 PHP를 재설치하게 되었습니다. 이 과정에서 몇 가지 문제가 발생하였는데요.

1. Apache를 설치했을 때 이전과 달리 서비스에 등록이 되지 않더군요. '올빼미'님의 도움으로 확인해보니 서비스가 설치되지 않아서 발생한 문제라고 하더군요. 서비스 설치는 다음의 -k install을 사용하여 command 상에서 설치가 가능합니다.
Apache.exe -k install
2. 우여곡절 끝에 설치한 Apache에 PHP를 설치하다가 삽질을 또 하였습니다. php.net에서 Windows 버전의 인스톨러를 받아서 설치하는 경우 extension 설치 메시지가 나오는데요. 메시지에서 설치할 목록을 선택한 후 설치를 하였슴에도 불구하고 설치가 되지 않더군요. 그래서 5.0 버전대의 ext 버전을 사용했는데 버전이 달라서 에러가 나더군요.
사용자 삽입 이미지

버전 확인은 dll파일을 선택한 후 마우스 오른쪽 버튼을 눌러서 버전을 확인 할 수 있습니다.

3. 그리고, dll을 로딩하지 못한다는 메시지가 나온다면 php.ini의 include_path와 extension의 이름도 확인하는 것도 좋은 방법일 것 같습니다. (2에서 안되길래 모두 삭제한 후 5.0대 버전을 설치하였는데 php.ini를 5.2.4를 사용하니까 에러가 발생하더군요. 5.2.4에서는 php_http.dll이 php_http_5_2_3.dll로 이름이 바뀌어서 발생한 문제였습니다. -_-)

P.S. 정보공유 차원에서 올렸습니다. ^^;;;

2007년 10월 29일 월요일

escapeshellcmd

Description

string escapeshellcmd ( string $command )

escapeshellcmd()는 인자로 받는 $command가 실행되었을 때, 의도하지 않았던 shell 명령어를 실행하게하는 트릭을 방지하기위해서 트릭을 실행할 수 있는 특정 문자들을 제거하는 함수입니다. 이 함수는 사용자가 입력한 내용이 exec()system() 또는 backtick operator로 실행되기 전에 호출되어야하는 함수입니다.

호출이 되는 경우 다음의 문자들 앞에 backslash가 추가됩니다.

#&;`|*?~<>^()[]{}$\, \x0A and \xFF
'" 는 두 개가 쌍으로 사용되지 않은 경우에만 처리됩니다. 윈도우에서는 위의 문자들과 %가 공백으로 바뀝니다.

Parameters

command

금지된 문자들을 제거하기 위한 명령어를 인자로 받습니다.

Return Values

금지된 문자들이 제거된 명령어가 리턴됩니다.

[Safari] 디버깅할 때 onload가 호출되지 않는다면 태그를 확인해보세요.

Safari에서만 유독 onload가 호출되지 않아서 이것 저것 테스트를 했었는데 알고보니 </div> 태그가 하나 더 들어가 있더군요. (엄끼님 고생 많으셨습니다. (__)) Firefox나 IE에서는 태그 에러에 대한 예외 처리가 되어 있는데 Safarid에서는 onload 자체가 호출이 안되는군요.
오늘의 교훈
- Firefox나 IE에서는 잘 되던데 Safari나 Opera에서 onload가 호출되지 않으면 태그를 확인해보세요.
추가:
1. <div />와 같이 잘못된 태그가 들어간 경우 Safari에서는 아예 보여지지 않습니다.
<2. iframe src="about:blank"></iframe> about:blank에 ;가 잘못 들어간 경우도 처리가 안되네요.

내가 생각하는 서비스

'쟤시켜 알바'님의 개인적인 서비스의 특징에서 트랙백했습니다.

제가 생각하는 서비스는 다음과 같습니다.

1. 서비스는 균형이 잡혀야 합니다.
어떤 한 부분에 강점을 둔다면 다른 부분에 투입할 수 있는 자원은 줄어들겠죠. 모든 것을 추구하는 서비스는 특징이 사라지고, 무거워지다 두가지 목적을 달성 못 할 가능성이 높습니다.

2. 서비스가 추구하는 환경에 맞는 서비스여야 합니다.
서비스가 웹 환경에서 제공되는 서비스라면 디자인도 웹 환경에 맞는 디자인이 되어야하고 구성이나 동작도 웹환경에 맞게 제공되어야 하겠죠. Java라면 Java 환경에 맞게 Flash라면 Flash 환경에 맞게, 각 환경을 뛰어넘는 기능도 제공을 할 수도 있습니다. (예외없는 법칙은 있을 수 없습니다. -_-b 다만, 거기에 드는 비용에 대해서 생각도 안하고 무턱대고 구현하는 것은 절대 있을 수 없다고 생각합니다.)

3. 변화에 적응할 수 있는 서비스여야 합니다.
단위별로 분리할 수 있는 서비스여야겠죠. 2의 테두리에서 구현된 서비스에 단위별로 잘 나뉘어진 서비스라면 언제든지 변화에 잘 적응할 수 있다고 생각합니다. 다만, html, css, php, js 등등 각각의 모듈이 잘 나뉘어야 겠죠.

쓰다보니 공돌이가 원하는 서비스가 되었군요. 쩝~ -_-;;
결론은 한정된 자원을 얼마나 투입하고 얼마나 쓸지 균형이 안잡힌다면 서비스는 망한다입니다. -_-)//

사용자 삽입 이미지

2007년 10월 25일 목요일

모니터를 교체해야되는 이유!!

IT 업계 종사자로서 17인치 모니터를 들여다보며 코딩하는 고통을 더이상 겪기 싫기 때문이죠 -_-;;;
24인치 와이드에 회전까지 되는 모니터면.. 더 이상 이런 고통을 겪을 필요가 줄어들 것 같아요 ㅠㅠ

빈약한 지갑(?) 사정으로는 올해는 사기 힘들것 같은데 좀 뽑아주세요 ^^b

※ 본 포스팅은 BTC와 Buzz에서 하는 이벤트 참여용입니다. -_-v



2007년 10월 24일 수요일

다음에 [최훈의 만화 작가평]이라는 코너가 생겼더군요.

사용자 삽입 이미지

역시 최훈 작가의 만화
는 재밌다는 생각으로 한참 웃다가 생각해보니..
네이버에 삼국전투기, GM, MLB 카툰 업뎃이 안되어서 다음에 왔다는 기억이 아련하게 떠오르더군요.

"최훈 작가님, 삼국전투기 연재 계속되는거 맞죠?? -_-;;;;;"

ImageMagick

ImageMagick - GPL 라이센스, 이미지 타입변환, 크롭, 등등등 다양한 기능을 제공하고 있는 이미지 프로세싱 프로그램입니다. Command-line에서 실행할 수 있는 프로그램으로 다음과 같은 명령어들이 있습니다.
  • animate: animates an image sequence on any X server.
  • compare: mathematically and visually annotate the difference between an image and its reconstruction.
  • composite: overlaps one image over another.
  • conjure: interprets and executes scripts written in the Magick Scripting Language (MSL).
  • convert: 이미지의 포멧변환부터 크기조절, 썸네일, 필터링, 블루어(Blur), 크롭(Crop), 디더링(Dither), 그리기(Draw on), 이미지 합치기, GIF 프레임 처리 등등의 다양한 변환 작업을 (옵션을 사용하여 지정) 실행합니다.
  • display: displays an image or image sequence on any X server.
  • identify: 이미지 파일(들)의 포멧 또는 이미지 정보들을 표시해줍니다.
  • import: saves any visible window on an X server and outputs it as an image file. You can capture a single window, the entire screen, or any rectangular portion of the screen.
  • mogrify: resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. Mogrify overwrites the original image file, whereas, convert writes to a different image file.
  • montage: create a composite image by combining several separate images. The images are tiled on the composite image optionally adorned with a border, frame, image name, and more.
  • stream: a lightweight tool to stream one or more pixel components of the image or portion of the image to your choice of storage formats. It writes the pixel components as they are read from the input image a row at a time making stream desirable when working with large images or when you require raw pixel components.
이러한 명령어들과 명령어의 다양한 옵션(명령어를 클릭해서 들어가면 옵션을 보실 수 있습니다. )들로 이미지에 여러가지 효과를 줄 수가 있습니다.

Command line에서 실행은 명령어, 원본파일, 옵션명(옵션 값이 있으면 옵션 값을 같이 사용합니다.), 결과파일순으로 명령어를 입력한 후 실행시키면 됩니다.
C:\> convert src.gif -layers flatten dst.gif
위의 명령어는 움직이는 gif파일의 깜박임을 제거해주는 명령입니다.

관련링크 및 참고자료
※ 허접 포스팅입니다. ImageMagick 사용하기 위한 메모로 작성한 것이니 참고해주세요. -_-;;;

P.S.1. ImageMagick을 윈도우에서 설치할 때 Download로 들어가서 ImageMagick 외의 사이트에서 다운로드 받는 경우 바이너리 설치버전을 찾을 수 없더군요. 바이너리가 아닌 경우에는 컴파일해서 설치해야하는 복잡한 과정이 필요합니다.

P.S.2. php에서 exec()를 사용하여서 ImageMagick을 실행하는 경우, 세 번째 인자로 실행결과 값을 얻어올 수가 있습니다. 저의 경우 바이너리를 설치하고 바로 실행하였는데, 4가 리턴되면서 동작을 하지 않더군요. 고민 끝에 재부팅(!)을 하자 정상적으로 동작하더군요. -_-;;;;;

2007년 10월 22일 월요일

Barcelona TV의 아나운서?

Mercè 2007 행사 중계를 하고 있던 Barcelona TV 입니다.
아나운서가 생중계를 하고 있길래 카메라를 들이대고 찍었었죠. (나중에 생각해보니 TV 카메라 돌고 있었을 건데.. 미친짓을 했다는 생각이 =_=;;;)

사용자 삽입 이미지

외국이라서 존재가 들어나지 않는다는 생각에 참 뻘짓 많이 했다는 생각이 듭니다. =_=;;;;;;;

2007년 10월 20일 토요일

Wholinks2me

사용자 삽입 이미지
지민아빠 님의 포스트를 보고 저도 한번 해봤습니다.
역시 공돌이 포스트는 검색 순위에 상당히 영향을 주는군요 -_-b

2007년 10월 11일 목요일

투우

사용자 삽입 이미지

한 생명을 죽이는게 스포츠라고 할 수는 없지만... 투우사들의 동작 하나하나는 화려하였다.

7 Portes - 먹물빠에야

바르셀로나 떠나기 전에 시장에서 파는 빵이나 패스트푸드 또는 슈퍼마켓의 빵이 아닌 맛난 음식을 한 번 먹어야 겠다는 생각에, 7 Portes (민박집 주인 아저씨께서 강추하시더군요.)에 들렀습니다.
사용자 삽입 이미지

3시가 넘어간 시간임에도 불구하고 40분정도를 기다렸습니다. (8시 출발하는 비행기였으니 가슴 많이 졸였죠 -_-);
사용자 삽입 이미지

가게의 분위기는 오래된 가게의 전통답게 빈곤한 저의 지갑의 한도를 뛰어넘는 고급 레스토랑이더군요.
식사 전에 요리 따로 식사, 식사 후 디저트 따로 물 또는 음료수 따로 해서 기본으로 40유로 정도는 생각해야되겠더군요.
(그나마 가장 싼 요리가 먹물 빠에야-15유로였습니다. )

사용자 삽입 이미지

드디어 나온 먹물 빠에야!! 처음 먹을 때는 달콤하면서도 짠맛이 어우러진데다 부드럽게 씹히는 오징어 살은 가히.. 뭐랄까요.
오징어 특유의 질긴 느낌이 전혀 들지 않더군요. 생긴 것은 좀.. 지저분하게 생겼지만 맛은 일품입니다.
사용자 삽입 이미지

한 냄비에 두 접시 정도 나오는데 양은 상당히 많습니다. 두 번째 접시를 비울 때 쯤되니까 배부르면서도 짠맛이 강하더군요. 그래도.... 이 가격대의 레스토랑은 아마 올해안에 다시 갈일은 없겠죠. -_-;;;;;

여튼 바르셀로나 가신다면 꼭 한번 들러보세요. 혼자가시지는 말구요!!!

2007년 10월 7일 일요일

그라나다의 길냥이들

바르셀로나에서는 보지를 못했었는데 그라나다에는 길냥이들이 많이 있어서 찍어 보았습니다.
만...... 역시 줌렌즈 없이는 무리군요 ^^;;; istDS + 18~55mm 번들입니다.
사용자 삽입 이미지
처음 만난 길냥이는 보자말자 방향을 틀더군요. "난 너같은애 싫어~!"
사용자 삽입 이미지
두 번째로 만난 길냥이는 사진 찍던 말던 개의치 않더군요. 쓰다듬으면 부비부비 모드로 ~ ^^
왠지 자세가 나 좀 쓰다듬고가봐~ 하는 것 같지 않나요?
사용자 삽입 이미지
세 번째로 만난 이 분은 사진기를 들이대자말자 얼굴이 변하더군요. "아쒸 재수없어~ "
사용자 삽입 이미지
그러고선, 유연한 몸매로 길 가던 중 뒷다리로 얼굴을 긁는 중....... (멍멍이들이 자주 하는 행동 아니던가요? ^^;;;;;)
사용자 삽입 이미지
한바탕 긁은 다음에는 "빨리 가버려~"하면서 물만 한참을 먹더군요.
사용자 삽입 이미지
마지막으로 만났던 이 분도 매섭게 째려보시더군요. "뭘보니~~~"

역시.. 길냥이 찍으려면 줌 렌즈를 !!!!!


마법의 시작

사용자 삽입 이미지

바르셀로나의 Mercè 2007


Priority Pass Card

사용자 삽입 이미지
Priority Pass Card는 전 세계 공항의 라운지를 이용할 수 있는 카드입니다.
비행기 출발 시간 전까지 또는 비행기를 갈아탈 때 시간이 남는 경우, 라운지를 이용하면 상당히 편리하더군요.

제가 가본 곳은 인천국제공항의 KAL 라운지와 바르셀로나 공항의 Salida 라운지를 이용했습니다.
기본적으로 푹신한 쇼파, 유무선 인터넷에 음료수와 과자 정도를 제공하고 있고 각각의 라운지에 따라서는 침실 또는 샤워를 할 수 있는 시설도 있습니다.

가입하는 방법은 Priority Pass Card에 직접가입하거나 플래티넘 카드에서 혜택으로 주는 것 같습니다.
Priority Pass Card에 직접가입하는 경우에는 종류에 따라서 방문 시 비용 청구, 무료횟수 제한, 동반자 금액 청구 등의 제한 폭이 다르더군요. (자세한 사항은 여기를 참고)

플래티넘 카드의 경우에도 본인은 무료인데 동반자에 대해서는 금액을 따로 청구하는 카드들도 있으니 주의해서 신청을 하셔야될 것 같습니다.

사용자 삽입 이미지

KAL 라운지입니다.


이번 여행에서는 아시아나 항공을 이용했었는데 프랑크푸르트 공항에서는 라운지를 이용하지 못했습니다. 프랑크푸르트 공항의 경우 터미널이 1,2로 나뉘어져 있고 터미널 안에서도 A,B,C,D,E 게이트가 나위어져 있더군요. 아시아나 항공이 도착하는 1터미널의 B게이트에서는 라운지가 루프트한자의 라운지 밖에 없더군요.

돌아와서 확인해보니 스타얼라이언스 소속의 루프트한자나 아시아나 등의 항공사 라운지는 Priority Pass Card에서 지원이 안되는 것 같더군요. 반대로 스카이 팀에 속해있는 대한항공의 KAL 라운지나 KLM, 델타항공, 알리탈리아 항공사 부근에 대부분 라운지가 있더군요. Priority Pass Card를 이용하실 생각이라면 스카이팀의 항공사를 이용하는게 좋을 것으로 생각됩니다.

※ 본인만 이용이 가능합니다.
※※ Priority Pass Card를 이용할 때는 항공권과 Priority Pass Card를 확인합니다.
※※※ 공항에서 물이나 간단한 음식을 사먹는 비용을 생각한다면 Priority Pass Card가 지원되는 플래티넘 카드로 지르시는 것도 좋을 것 같군요 ^^a
※※※※ 인천공항의 KAL 라운지에서는 과일도 제공이 됩니다. -_-b

관련 링크: Priority Pass Card(한국어 페이지)

2007년 10월 5일 금요일

'Permission denied to call method XMLDocument.getElementsByTagName' 에러~

XML로 데이타를 주고 받는 프로그램을 작성하다 다음과 같은 에러가 발생하였습니다. 이름하여~
'Permission denied to call method XMLDocument.getElementsByTagName'
에러 내용대로 살펴보자면 XMLDocument의 getElementsByTagName에 접근할 수 없다는 얘기가 되는데... 발생한 이유를 몰라서 다시 확인을 해봤습니다.

  1. Firebug를 통해서 살펴보니 클라이언트, 서버간의 데이타 전송 및 수신은 정상적으로 처리가 되었습니다.
  2. 받은 XML 데이타를 확인해보니 정상입니다.
    <?xml version="1.0" encoding="utf-8" ?>
    <channel>
       <result>0</result>
       <message>값을 반드시 입력하셔야 합니다</message>
    </channel>
구글 검색으로 에러에 대해서 검색을 해보니 다음과 같은 것들이 원인이 될 수 있다고 합니다.
  1. synchrnous하게 Ajax 송수신을 해야하는데 asnychronous하게 호출한 경우 발생가능하다. (상관없더군요.)
  2. 리턴된 response의 http.open() 후 http.onreadystatechange를 할당해야한다.
    (prototype에서 잘 해주고 있습니다.)
  3. Cross-domain 스크립팅을 잘못 사용했다.
    (그런일 없더군요.)
결론은, JSON으로 하자로 결론을 내렸습니다. -_-;;; 받는 것은 정상적으로 되니깐요....
원인 아시는 분 있으신가요?

2007년 9월 13일 목요일

FC바르셀로나 표 예매하기

이번 휴가 때 FC바르셀로나의 경기를 보기 위해서 웹에서 찾아보았습니다.
FC 바르셀로나의 경기는 FC 바르셀로나의 홈페이지에 들어가시면 티켓을 사실 수가 있습니다.

1. FC 바르셀로나의 메인페이지의 메인 메뉴에서 Ticketing을 클릭합니다.
사용자 삽입 이미지

2. Ticketing으로 들어가게되면, 경기 일정에 따른 FC바르셀로나의 경기 리스트가 나옵니다.
사용자 삽입 이미지

3. 경기 일정을 확인한 후 선택하려는 경기의 Information & tickets를 클릭해서 들어갑니다.
사용자 삽입 이미지

4. 경기장 소개 및 경기장의 가격 등에 대한 정보 아래쪽에 Buy Tickets라는 버튼이 있습니다. 버튼을 누르고 들어가면 결제 대항하는 업체인 http://www.servicaixa.com/로 넘어가게 됩니다. 그리고, 첫 페이지에 키를 입력하라고 나오는 부분은 시즌권있는 사람에게 해당하는 얘기이므로 Continue를 누릅니다. (Firefox에서는 에러가 발생해서 넘어가지 않습니다. IE를 사용하셔야 합니다.)
사용자 삽입 이미지

5. 경기장에서 어디에서 볼 지를 선택합니다. 좌석까지 지정이 가능하더군요.
사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

2주나 남은 경기인데 벌써 꽉 차버렸습니다. 빨간 좌석 모두 예약이랍니다. -_-;;;;

해서.. 표가 없는 줄 알았는데 다행이 있어서 경기를 관람하게 되었답니다.
비싼 가격에 눈물을 머금었지만, 이번 아니면 언제 또 볼까해서 질렀답니다. (지름 밸리로 보내야하는 걸까요? )

※ 가격을 비교해보니 수요일 경기가 일요일 경기보다는 싼 것 같습니다. 리그 경기가 챔스경기보다는 싸구요. (레알과의 경기는 비싸겠죠? ^^;;;;;;)

2007년 9월 10일 월요일

비상식적인 nProtect...

Hiyen님의 블로그에 들어가게 되었다가 nProtect를 제거하는 사이트인 15660808.co.kr을 알게되었습니다.
15660808.co.kr에서 원격제어요청으로 들어가게되면 rsup.net으로 들어가면서ActiveX를 설치하게 됩니다.
사용자 삽입 이미지

상식적으로 nProtect의 제품을 제거하는 사이트라면 당연히 nProtect.com으로 들어가서 제거해야하는게 맞지 않나요? 처음에 봤을 때는,15660808.co.kr이 피싱사이트인 줄 알았습니다. -_-;;;

어떻게, 고객상담 전화번호를 도메인으로 사용해서 nProtect 프로그램 제거하는 사이트를 원격으로 실행할 생각을 했는지 참 납득이 되지 않네요.

사용자 삽입 이미지

만약, 피싱을 계획(?)하고 있으신 분은 다음의 정보가 유용할 지 모르겠습니다.
nProtect의 대표전화인 6220-8000에 해당하는 62208000.co.kr이 아직 남아있습니다.
빨리 구매하신 다음에 원격제어하면 상당히 효과(?)적일 것으로 생각되네요.

2007년 9월 9일 일요일

Alternative syntax for control structures

PHP에는 Alternative syntax for control structures가 제공되고 있습니다. Alternative syntax란 Control Structure의 복잡한 표현을 쉽게 표현하는 방법입니다.
열리는 {를 :으로 표현하고 닫치는 }를 endif; endwhile; endfor; endforeach; endswitch; 로 표현할 수 있는 방법입니다.
그렇다면, 어떤 면에서 쉽게 표현해주는 것일까요? 다음의 코드를 먼저 보겠습니다.
<?php
if(isAdmin()) {
    echo "<div class=\"admin_link\">";
    echo "   <a href=\"form.php\" class=\"add_link\">Add Link</a>";
    echo "</div>";
}
?>
일반적인 php의 관점으로 짜여진 코드이지만, php 코드와 HTML마크업이 섞여서 HTML마크업의 관점으로 보기 힘든 면이 있습니다.
이를 Alternative syntax로 표현하면 다음과 같이됩니다.
<?php if(isAdmin()): ?>
  <div class="admin_link">
     <a href="form.php" class="add_link">Add Link</a>
  </div>
<?php endif; ?>
php의 대부분 제어로직을 클래스 또는 function으로 분리한 다음에 View에 해당하는 php 및 html 마크업 코드를 분리했을 때, Alternative syntax를 사용한다면 명확하게 어떤 HTML 코드를 사용했는 지, 또는 디자인 변경에 따른 HTML수정도 쉽게 가능하겠죠.


출처 :  SimpleTest  via Manning, PHP in Action - 11장

2007년 9월 8일 토요일

인도음식점 - Sari

회사에서 점심식사 메뉴를 고민하다가 Sari를 가게 되었습니다.
사용자 삽입 이미지

포스코 더 2층에 있는데 올라가는 길이 찾기가 좀 어렵더군요.
사용자 삽입 이미지

카운터와 요리하는 곳이 같이 붙어있고 요리하는 것을 멀리서나마 볼 수 있게 되어있습니다.
사용자 삽입 이미지

사진이 어두워서 그렇지 분위기는 상당히 연인들이 가기에 좋게 꾸며진 것 같더군요.
사용자 삽입 이미지

식사 전의 테이블의 모습~
사용자 삽입 이미지

충격(?)을 받은 점심식사로 먹기에는 비싼 가격의 메뉴판 ㅠㅠ
카레가 14,000원~17,000원 밥이 2,000원 난이 4,000원입니다.
사용자 삽입 이미지

기본으로 나온 피클과 요구르트..
사용자 삽입 이미지

난이 드디어 나오고,
사용자 삽입 이미지

카레도 나왔습니다. 강냉이 님의 블로그에서보면 상당히 걸쭉하게 나왔는데 저희는 묽게 나왔더군요.
2명이서 카레 하나에 밥과 난을 각각 시키자 많이 준다고 했는데 물만 더 탄듯한 이 기분은 왠지~ ^^;;
사용자 삽입 이미지

밥도 드디어 나왔습니다. 노란색의 밥색깔과 초록색의 풀(?)을 약간 뿌렸는데 눈으로 보기에는 상당히 좋더군요.

그러나, 평범한 회사원으로서 점심식사로 2,500원~6,000원 사이의 식사를 하다가 이런 고급식당에서 밥을 먹으려하니 눈물이 앞을 가리더군요. 연인끼리면 좋을 것 같습니다.

※ 결제 하실 때 부과세는 따로 계산됩니다.
※※ 결제금액의 6%는 적립을 해드린다고 하네요. 명함을 꼭 챙기시기 바랍니다.
※※※ Sari는 인도 여성의 전통의 상을 뜻합니다. (출처: Wikipedia)

일식회집 - 다성

어제 신촌에 있는 일식회집 다성으로 회식을 갔습니다. 오랜만에 등푸른 생선(?)의 풍부한 영양소를 섭취하기 위해서 점심은 가볍게(?) 먹고 회식자리로 갔습니다. 시켰던 메뉴는 다성 생선회 정식(\29,000) 입니다. (일단은 회사돈이기 때문에 이런 높은 가격대의 음식도 먹는 거겠죠 -_-b)
사용자 삽입 이미지

시작은 가볍게 죽을 주시더군요. 순시간에 낼름 먹어주고~
사용자 삽입 이미지

두 번째로 나온 샐러드(?)도 가볍게 먹어주고~
사용자 삽입 이미지

세 번째로 나온 회무침도 가볍게 먹어주고(?) (4명이 있는 테이블에 장정4명이 앉아서 피튀기는 젖가락 신공을 보였죠.)
사용자 삽입 이미지

네 번째도 회는 안나오고 곁반찬(?)이 나오더군요. (술!안!주!)
사용자 삽입 이미지

다섯번째로 나온 메뉴도 회는 아니었습니다. -_-;;
사용자 삽입 이미지

그리고, 마지막으로 나온 구이.... (맛은 있었습니다만... 메인인 회가 너무 늦게 나오더군요 --;;)
이제부터는 날생선요리(?)가 시작됩니다. 쿠쿠
사용자 삽입 이미지

자세히 접시 위에 놓인 회의 옆 두께를 자세 들여다보시면 두껍게 썰린 입에 침이 가득 고이게 만드는 오늘의 메인요리인 회의 아름다운 자태를(?) 보실 수 있습니다.
사용자 삽입 이미지

자세히들 보시라고 큰 사진 하나 올립니다. -_-v
에~ 그리고 9월30일까지 이벤트로 제공된다는 메로요리도 나오더군요.
사용자 삽입 이미지

장어구이를 연상시키는 달콤한 맛과 생선살보다 부드러운 살의 눌림은 가히~ 음냠 군침이 넘어가는군요.
사용자 삽입 이미지

그리고, 초밥과 튀김도 나왔답니다.
사용자 삽입 이미지

메운탕도 나오기는 했지만, 역시 먹느라 바뻐서 찍지를 못했습니다. 몇 개 빠진 것도 있구요.
(늦게 나오기는 합니다만, 회를 비롯한 모든 음식이 리필이 된다고 합니다. 회 한접시랑 초밥, 튀김을 리필했는데 회랑 튀김만 더 먹었습니다. 초밥은 안나왔구요.)

오랜만에 배불리 먹었던 행복한 날이었던 것 같습니다.
이자리를 빌어서 탁월한 식당을 선택해주신 팀장님께 감사를 ^^

9월30일까지 이벤트로 메뉴판의 쿠폰을 출력해가면 할인도 해준다고 하는군요.


관련링크: 다성 via 메뉴판

※ 소주는 한 병에 5,000원이라서 좀 비싸더군요.
※※ 화이트 밸런스가 좋지 않아서 색보정을 했습니다.