로그인

이메일
비밀번호
왼쪽에 걸리적 거리는 거 숨기기

'뻘짓'에 해당되는 글 4건

  1. 고용량 메모리 카드 #2 (3)

    2008/06/05
  2. 고용량 메모리 카드 (4)

    2008/06/03
  3. 새벽에 만든 클래스 흉내 코드 (4)

    2007/12/08
  4. 완전 개삽질 (7)

    2007/07/06

지난 번에 이런 글을 썼었는데
http://hooriza.com/1572


새로 다시 주문한 4G 메모리가 오늘 도착.
그래서 다시 내비에 꽂아봤더니 예전하고 똑같이 작동이 안된다;
분명 제품 설명에서 V7 season 2 지원한다고 했었는데;;

설마;
예전에 사용하던 메모리에 담긴 폴더 구조랑 비교해봤다.
4G 짜리에 디렉토리가 하나 빈다;

2G 짜리에 있는 디렉토리를 복사해 넣고 내비에 꽂아봤다.

잘 된다;

설마;
그전에 주문한 4G 에도 똑같이 해봤다.

잘 된다;

젠장 나 뭐한거임?
1.8만원짜리 메모리로도 잘 작동되는 거였는데
괜히 3.5만원짜리 메모리 추가구매한거임?

다행히 3.5만원짜리는 벌크로 와서 개봉하고 자시고 할 것도 없기 땜에 반품 가능할 것으로 보임.
안되면 어떡하지?;;
영양가 있는 포스팅인가요
(총 1분이 투표해서 5.0점) 5.0점
2008/06/05 21:57 2008/06/05 21:57

내비게이션 메모리 카드의 용량이 빡빡해서
4기가 SD 메모리를 질렀는데 (약 1.8만원)
내비게이션에서 지원을 안 하네?

이미 포장을 다 뜯어내서 반품할 수도 없고
다시 지원한다고 하는 4기가 SD 메모리 추가 주문 (약 3.5만원)

그래서 졸지에 4기가 메모리가 두개나 생겨버렸다.
이렇게 고용량 딱히 쓸데도 없는데;

어따쓰니 이거

영양가 있는 포스팅인가요
(총 1분이 투표해서 5.0점) 5.0점
2008/06/03 22:44 2008/06/03 22:44

어제 새벽에 자다 일어나서 만들었다가
치명적인 결함을 가졌다는 것을 알아내고 폐기하고자 한 코드-_-;
걍 지워버리기는 조금 아까운 생각이 들어서 올려본다.

이 코드는 내가 지금까지 본 자바스크립트로 만든 다른 클래스 흉내 코드와는 달리
다단계 상속(?) 형태에서 두 단계 이상의 상위 클래스 메쏘드에 접근 할 수 있도록 되어있다.

보통 자바스크립트에서 상속을 통한 상위 클래스 메쏘드를 실행할 수 있도록 할 때
this 가 인스턴스 자신을 가리키도록 apply(또는 call) 메쏘드의 첫번째 인자를 지정해주는데,
이 때문에 this 에 얽매여(?) 결국 두 단계 이상의 메쏘드까지 갈 수 가 없게된다.

아무튼... 내가 뭔 소릴 하는 건지-_-;
결론은 그래서 어찌어찌하기 위해 eval 을 썼는데 문제는 eval 내의 코드라서
디버깅하기가 곤란하다는 거다.

자신이 만든 코드에 버그가 결코 없을 꺼라는 확신이 있다면(!)
사용해도 문제가 없을 꺼고 매우 편하게 쓸 수 있을 꺼다.

(Language : javascript)
  1. /**
  2. * 2단계 이상의 상위 클래스 메쏘드 접근이 가능한 클래스 흉내 스크립트
  3. *
  4. * @author hooriza.com
  5. */
  6. function Class(classDef) {
  7.   var createMember = function(This, Super, member) {
  8.     if (typeof member != 'function') return member;
  9.     eval('var p = function() { return (' + member.toString() + ').apply(This, arguments); }');
  10.     return p;
  11.   };
  12.   var selfClass = function() {
  13.  
  14.     // var selfClass = arguments.callee; 有没有没关系
  15.     var selfDef = arguments.callee.prototype;
  16.     var supers = [];
  17.    
  18.     var superInstances = [];
  19.    
  20.     if (this.Super) { // 부모클래스에게 상속 받아야 되는 상황이면
  21.      
  22.       // 부모클래스들을 모두 배열에 담음
  23.       for (var s = this.Super; s; s = s.prototype.Super) {
  24.         supers[supers.length] = s;
  25.         superInstances.push({});
  26.       }
  27.      
  28.       var oMethods = {};
  29.        
  30.       // 배열에 담은 부모 클래스들을 한바퀴 돌면서
  31.       for (var i = supers.length - 1; i >= 0; i--) {
  32.  
  33.         var superInstance = superInstances[i];
  34.      
  35.         var superClass = supers[i];
  36.         var superDef = superClass.prototype;
  37.  
  38.         // 부모클래스의 멤버 변수/메쏘드 순회
  39.         for (var sKey in superDef) {
  40.          
  41.           if (typeof superDef[sKey] == 'function')
  42.             superInstance[sKey] = createMember(this, superInstances[i + 1], superDef[sKey]);
  43.  
  44.           if (sKey != 'Super' && sKey != 'initialize') oMethods[sKey] = superDef[sKey];
  45.          
  46.         }
  47.        
  48.       }
  49.  
  50.       for (var sKey in oMethods) {
  51.        
  52.         // 부모꺼를 다 받아들이되 자기 자신에게도 선언되어 있는건 제외
  53.         if (typeof selfClass.prototype[sKey] == 'undefined') {
  54.           this[sKey] = createMember(this, superInstances[0], oMethods[sKey]);
  55.         }
  56.        
  57.       }
  58.      
  59.     }
  60.    
  61.     for (var sKey in selfDef)
  62.       if (typeof selfDef[sKey] == 'function' && sKey != 'Super')
  63.         this[sKey] = createMember(this, superInstances[0], selfDef[sKey]);
  64.    
  65.     // 생성자 들을 한바퀴 돌면서 호출
  66.     for (var i = superInstances.length - 1 ; i >= 0; i--)
  67.       if (typeof superInstances[i].initialize != 'undefined')
  68.         superInstances[i].initialize.apply(this, arguments);
  69.     if (typeof this.initialize != 'undefined')
  70.       this.initialize.apply(this, arguments);
  71.      
  72.     return this;
  73.    
  74.   };
  75.   selfClass.prototype = classDef;
  76.   selfClass.extend = Class.extend;
  77.   return selfClass;
  78.  
  79. }
  80.  
  81. Class.extend = function(superClass) {
  82.   this.prototype.Super = superClass;
  83.   return this;
  84. };

사용방법은... 아 설명하기 귀찮은데-_-;
일반적으로 클래스 흉내 코드를 사용해서 아래와 같은 코드를 작성하면

(Language : javascript)
  1. var G = Class({
  2.   val : 'success!',
  3.   foo : function() {
  4.     setTimeout(this.run, 500);
  5.   },
  6.   run : function() {
  7.     alert('0.5초 지났음 : ' + this.val);
  8.   }
  9. });
  10.  
  11. var o = new G();
  12. o.foo();

원하는 결과(0.5 초후에 'success!' 라고 나오는)를 얻지 못하는데
이유는 run 안에서 this 가 o 인스턴스를 가리키지 못 하기 때문이다.
그래서 이를 해결하려면 여러가지 방법이 있지만 아래 같은 성가진 방법을 써야한다.

(Language : javascript)
  1. var G = Class({
  2.   val : 'success!',
  3.   foo : function() {
  4.     var dummy = this;
  5.     setTimeout(function() { dummy.run(); }, 500);
  6.   },
  7.   run : function() {
  8.     alert('0.5초 지났음 : ' + this.val);
  9.   }
  10. });
  11.  
  12. var o = new G();
  13. o.foo();

그치만 저 위의 코드를 쓰면 그냥 아래처럼 쓸 수 있다.

this 가 아니라 This 임에 유의 (Language : javascript)
  1. var G = Class({
  2.   val : 'success!',
  3.   foo : function() {
  4.     setTimeout(This.run, 500);
  5.   },
  6.   run : function() {
  7.     alert('0.5초 지났음 : ' + This.val);
  8.   }
  9. });
  10.  
  11. var o = new G();
  12. o.foo();

그리고 상속을 했을때 상위 클래스 메쏘드를 아래처럼 자유롭게 호출할 수 있다.

상위 클래스의 접근은 Super 로 (Language : javascript)
  1. var GrandPapa = Class({
  2.   value : 1,
  3.   foo : function() {
  4.     alert('GrandPapa : ' + This.value);
  5.     This.value++;
  6.   }
  7. });
  8.  
  9. var Papa = Class({
  10.   foo : function() {
  11.     Super.foo();
  12.     alert('Papa : ' + This.value);
  13.     This.value++;
  14.   }
  15. }).extend(GrandPapa);
  16.  
  17. var Child = Class({
  18.   foo : function() {
  19.     Super.foo();
  20.     alert('Child : ' + This.value);
  21.   }
  22. }).extend(Papa);
  23.  
  24. var o = new Child();
  25. o.foo();

뭐 아무튼 이래저래 클래스 구현에 편리한 기능을 갖추었지만
이걸로 만든 코드는 디버깅도 매우 힘들고, 참 그리고...
인스턴스를 생성하는데 기존의 일반적인 코드를 쓰는 것보다 속도가 무지 느리다.

특히 FF 에서 엄청 느린데 어제 대강 테스트 해 본 바로는 3단계 상속을 한 클래스의
인스턴스를 100개 만드는데 1초 가까이 걸리더라;
아마도 메쏘드 양이 많거나 코드 길이가 길면 더 걸릴 듯?

어찌됐든 느린거야 인스턴스 많이 안 만드는 경우에만 쓰면 되니까 너그럽게 생각할 수도
있겠지만 디버깅이 어렵다는 건 정말 치명적.

결론은 기능은 좋지만 쓰잘데기 없다는거.

젠장, 난 어제 새벽에 대체 뭘 한거야-_-;
영양가 있는 포스팅인가요
(총 1분이 투표해서 1.0점) 1.0점
2007/12/08 11:24 2007/12/08 11:24

오늘,
약속이 있다고 7시 땡치고 칼퇴해서 종로가는 버스를 탔다.
퇴근길이라서 무지 막히는 버스.
종로까지 가는데 무려 2시간 가까이 걸렸다.
도착하니 대략 9시...

도착해서 친구에게 전화를 걸었다.

후리자 : 어디야?
그인간 : 응? 왜?

왜? 왜라니? 설마?!?!

후리자 : 오늘 보자는거 아녔냐-┏
그인간 : 다음주 잖어 ㅂㅅ

다시 2시간 걸려서 집에 돌아왔다-_-
오늘 뭘 한거지-_-;;;

영양가 있는 포스팅인가요
(총 36분이 투표해서 4.5점) 4.5점
2007/07/06 23:52 2007/07/06 23:52