2015년 12월 30일 수요일

Android MVP 개발패턴 예제

http://tosslab.github.io/android/2015/03/01/01.Android%20mvc%20mvvm%20mvp/

이미지 관련 라이브러리 - GLIDE

http://gun0912.tistory.com/17

2015년 12월 27일 일요일

일본어 유아용 교육자료

http://kids.nifty.com/

2015년 12월 20일 일요일

cookie encrypt - decript

$enc = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSalt, base64_decode($sCookieId), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));

 

$dec = trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSalt, $sCookieId, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));

2015년 12월 18일 금요일

Swift IBM test tool



http://swiftlang.ng.bluemix.net/?cm_mmc=developerWorks-_-dWdevcenter-_-swift-_-lp#/repl

2015년 12월 10일 목요일

2015년 12월 4일 금요일

http://www.sitepoint.com/mobile/android/

http://www.sitepoint.com/mobile/android/

2015년 11월 19일 목요일

Chrome 에서 이벤트 모니터 명령

http://stackoverflow.com/questions/10213703/how-do-i-view-events-fired-on-an-element-in-chrome-web-developer

 
monitorEvents($0) 모니터 On

unmonitorEvents($0) 

 

Android Home 화면에 Floting 띄우기

http://www.addictivetips.com/android/floata-add-a-floating-button-to-your-screen-to-tweet-from-any-app/

 

https://droidqd.wordpress.com/2015/01/07/how-to-make-a-floating-face-bubble-on-home-screen-in-android/

2015년 11월 13일 금요일

일본말 이런거 없다

愛してる보다 すきです 라고한다

귀엽게 보인다를 かわいそうだ라고 하면안됨

잘한다를 じょうだ 하지않고 得意라한다

친절한은 자기가즉 일때는優しだ

잘있나요 お元気ですか

입이 무거운건 口が堅い  口が軽い

그립다   사랑:恋し 사모:慕わしい 과거:懐かしい

섭섭하다 名残惜し( 주로 헤어지기섭섭)보다 水臭い

그냥싫을땐嫌だ  . 사람이싫을땐きらいだ

잘놀았을때 楽しかった

맛있다 속시원하다 솜씨가좋다うまい

스트레스등 일방적으로 받을때는 受ける

냄새바난다 においがある. でる아님

기르다 飼う 알아차리다気がつく

자칫하면 下手したら

助けるㄹ 위험한삼황에  手伝う는거들다

살았다.고마워요는 助かる

사람깔볼땐 馬鹿にする.사물은 無視する

공부가 잘한다는 上手가아니라できます때론 잘한다라는 뜻임

思いやり배려 望む원하다

寝る는 동침으로도 많이 쓰임.자고오다는 泊まって来た

교제술 담배등은 끊다 가 辞める

考える는지적인 생각 思う는 감정등

既に이미

切れる는 물건이 다팔려쓸때  쓰임

ついでに하는김에

모른다 知りません  しっていません이아님

택시잡다 タクシーを拾う

잘 만들었다 よくできていますね

희마은 ぜひ 결의는きっと

이루어지다 叶う 초조하다 焦る

이이상 もうこれ

새치기 割り込み

まぐれ우연히

おもいっきり마응껏

차라리 いっそ

일본어의 ヘルス 는 대표적인 섹스산업 .ジミ라고 함

非常に대단히  매우

つらい과롭다

ちなみに덕붙여서

2015년 11월 8일 일요일

JAVASCRIPT 상속 @,.@ 권장

http://chaospace.tistory.com/194 권장

2015년 11월 5일 목요일

자바스크립트 패턴스


  • 전역변수의 최소화. 필수

  •  var a=b=0; 이면 b 는 전역변수가 된다. <- 안티패턴

  • 암묵적 타입캐스팅 피하기 , 비교는 ===

  • eval() 피하기

  • parseInt 의 두번째 매개변수(진수선택)은 반드시 넣어야 한다. 왜냐면 0으로 시작되는 문자열을 8진수로 오해해서 가져올수 있기때문에. parseInt("06",10); 와 parseInt("06")은 다른거다.

  • javascript 에서는 중괄호는 앞의 명령문과 동일한 행에 두어야 한다. 그렇지 않으면 javascript 엔진에서 해당줄에 자동으로 세미콜론을 삽입하기 때문이다.(한줄 아래에 중괄호 두는 것은 자바스크립트에서는 금지)

  • new Object 로 객체 생성 <- 안티패턴

  • new Array로 배열생성 <- 안티패턴 (권장 : 대괄호로 생성)

  • 배열인지 판별은 Array.isArray(배열) 로 하는것을 권장

  • 설정객체패턴( 인자를 객체로 전달하는 방식)으로 하면 나중에 유지보수가 쉽다. 

  • 커링에 대해서도 이해하자.

  • 클로져로 비공개 멤버 구현가능
    function A(){ var privateValue ='pv'; this.getName=function(){return privateValue;}

  • 체이닝 패턴은 this 를 리턴하면됨.

  • 메쏘드 패턴도 이해하자.

  • 상속방법
    inherit(Child,Parent){ C.prototype = new P();} ...overriding?

  • 디자인패턴



  1. 싱글톤

    //싱글톤객체 즉시실행함수형태

    var Stone = (function(){

    var instance;

    function init() {

    function privateMethod(){

    console.log( "private  메쏘드" );

    }

    var privateVariable = "Private 멤버변수";

    return {

    publicMethod: function () {

    console.log( "public 메쏘드" );

    },

    publicProperty: public 멤버변수"

    };

    }; //init

     

    return {

    // getInstance() 하면 인스턴스가 없다면 생성하고 있다면 인스턴스를 리턴

    // 결국  instance 는 init() 함수 객체를 바라보게 된다.

    getInstance: function () {

    if ( !instance ) {

    instance = init();

    }

    return instance;

    }

    };

    })();

    var s1 = Stone.getInstance();

    var s2 = Stone.getInstance();

    console.log( s1 === s2 ); // true

    //s1.changepublic();

    s1.publicProperty="hey";

    console.log( s2.publicProperty ); // true

  2. factory pattern
    function Pizza_cheeze() {console.log('cheeze');

    }

    function Pizza_pineapple() {

    console.log('pineapple');

    }

    function PizzaFactory(whichStyle) {

    var pizza = this.createPizza(whichStyle);

     

    this.bake(pizza);

    this.boxing(pizza);

     

    return pizza;

    }

    PizzaFactory.prototype.pizzaClass = Pizza_cheeze;

    PizzaFactory.prototype.bake = function(pizza){

    console.log('bake');

    };

    PizzaFactory.prototype.boxing = function(pizza){

    console.log('boxing');

     

    };

    PizzaFactory.prototype.createPizza = function(whichStyle) {

    switch(whichStyle) {

    case 'cheeze':

    this.pizzaClass = Pizza_cheeze;

    break;

    case 'pineapple':

    this.pizzaClass = Pizza_pineapple;

    break;

     

    };

    return new this.pizzaClass;

    };

    var pizzacheeze = new PizzaFactory('cheeze');

    var pizzapineapple = new PizzaFactory('pineapple');

     

  3. Decorator Pattern
    //기본객체
      function Car() {

          console.log('car frame');

          this.price = 1000;


        }


      //가격정보얻기

      Car.prototype.getPrice = function() {

          return this.price;

      };

    //데코레이터 배열

        Car.CarDecorators = {};


      //파워윈도우 옵션질

      Car.CarDecorators.powerWindow = {

          getPrice : function() {

              var price = this._super.getPrice();

             price += price *5 /100;

              return price;

          }

      };

    //
      Car.prototype.decorate = function (decorator) {

          var F = function () {},

          overrides = this.constructor.CarDecorators[decorator],

          i,

          newobj;

          // Create prototype chain

          F.prototype = this;

          newobj = new F();

          newobj._super = F.prototype;

          // Mixin properties/methods of our decorator

          // Overriding the ones from our prototype

          for (i in overrides) {

              if (overrides.hasOwnProperty(i)) {

                  newobj[i] = overrides[i];

              }

          }

          return newobj;

      }

      var car2 = new Car(50);

      car2 = car2.decorate('powerWindow');

      console.log(car2.getPrice()); // outputs $CDN52.50


2015년 11월 3일 화요일

JAVASCRIPT 성능 최적화


  • 스크립트는 body 최하단

  • 자주쓰는 스코프 외부변수는 지연변수에 복사해서 쓰면 속도가 개선된다.

  • for .. in 은 느리다.

  • 대량 루프일때 반복횟수 줄이기 Duff's device , 제프 그린버그의 방법참고.

  • ..대략 아는내용

이펙티브 자바스크립트

이책은 사야됨 .정말로. 혼또우니~

  • == 비교는 절대금물, 자바스크립트는 지 맘대로 형변환을 하기때문에 == 비교는 절대 안됨. ===권장

  • 전역변수는 아예 사용하지마라. 단 플랫폼에 대한 프로퍼티를 참고 할때만 전역변수에 접근해라.

  • 지역변수 선언시 var 를 잊지마라. 잊는순간 전역변수가 될수도 있다.

  • Closure 는 이해하기 어렵지만 익숙해지면 좀더 유연한 프로그래밍이 가능하다.별도 게시물 준비.

  • 함수내에서 모든 변수는 호이스트 된다. !!

  • 지연변수 스코프(private 한 변수)를 만들기 위해서는 즉시함수를 이용하면된다.
    함수 또는 객체내에서 내부함수와 클로져를 이용할때, 변수의 호이스트로 인해서 변수에 아무리 변화를 줘도 최종값만 나오는 경우가 있다.
    따라서 이때는 즉시실행함수로 wrapping 시킨다음, 내부변수에 재할당을 통해서 지역변수 스코프를 만들수 있다.
    function A(arg1){  for(i=0;i<arg1.length,i++){ result[i]=function( arg1[i]; ); } }
    위의 코드에서 i 는 항상 호이스트 되기 떄문에 result[i] 는 항상 arg1의 마지막 값만 저장한다.
    따라서 (function(){ var j=i; result[i]=function( arg1[j]; )})(); 로 변경해야한다.IIFE??

  • 고차함수에 익숙해 져라. 공통된 로직은 고차함수로 리펙토링을 고려해 보자

  • 절대! argments 객체를 수정하지 마라.

  • 변수에 argments 의 참조를 저장해라.

  • 비공개 데이터를 저장/보전하기위해서 클로져를 사용해라.

  • 인스턴스 상태는 인스턴스 객체에 저장하라. 즉, 프로토타입에 변수나 배열등의 값을 배치하지마라. 프로토타입에는 프로토타입을 이용하는 객체들의 공유값만을 저장해라.

  • 따라서 하위 클래스(프로토타입)에서 상위(인스턴스)의 생성자를 호출할 필요가 있다.

  • 표준 클래스는 상속하지마라.

  • 순서사 정해진 컬렉션에는 딕셔너리 대신 배열을 사용해라(딕셔너리는 hash 배열이기 때문에 for in 으로 불러내도 순서가 보장되지 못한다.)

  • 배열을 반복할때 for...in 으로 하면 key 를 스트링으로 인식하여 순서가 보장되지 않으므로   for 반복문을 사용하라

  • 순서가 상관없다면 반복메서드(  object.forEach, map, filter) 등을 for (i......n) 대신에 이용하면 코드도 짧아지고 가독성도 좋아진다.

  • arguments 는  array 를 상송받지 않기 때문에 forEach 를 사용할수 없다. -> call 을 사용한다.

  • 또한 dom object 또한 array 를 상속받지 못한다. -> call 을 사용한다.

  • 배열 생성자 new 대신에 배열리터럴에 그냥 대입해서 배열을 만들자. 굳이 배열에 new 를 쓸필요는 없다는 것이다.

2015년 10월 31일 토요일

객체지향 자바스클립트의 원리

1장 원시타입과 참조타입

: 자바스크립트는 일급함수이다.
원시타입 : Boolean,Null,String,Number,Undefiend
참조타입 : 객체를 말함. 객체는 참조를 한다음 반드시  null 해주는게 좋다.

-프로퍼티의 접근 아래와 같은 경우도 가능하다.
var array = [];
var method = "push";
array[method](12345); <- 즉 array.push(12345) 와 같다. !!!!

-객체의 확인은 instansof 와  typeof 로 가능하다.

-원시래퍼 타입  : 자바스크립트엔진은 사실 간단한문자열 대입시에도 string 을 생성후 널처리 하기 때문에 스트링에 함수로 각종 처리를 할수 있다.

2.함수

:자바스크립트에서 함수는 객체다.

함수는 함수 선언(function delcaration)  과  함수표현식(function expresion) 이 있다.
함수선언: 은 hoist 되기 때문에 자바스크립트 엔진에서 함수를 최상단으로 끌어 올려 지게 된다.
result = add (1,2); // 아래 add 함수가 자바스크립트엔진에 의해 상단으로 올려지기 때문에 실행가능
function add( num1, num2){
return num1+num2;
}

함수표현식:
result=add(1,2); //이건 안됨. 함수표현식은 선언과 동시에 정의되기때문에 호이스트되지않는다.
var add = function add(num1,num2){
return num1+num2;
}

오버로딩:
오버로딩은 기본적으로 지원하지 않는다.

this :
this는 호출한 함수의 스코프를 가진다. 따라서 객체내에서 불려진 함수내에서의 this 는 호출한 함수이지만, wrapping 되지 않고 호출되는 함수는 그냥 전역이 this 이다.

call 메쏘드:
this 는 임의로 조작해서 전혀 다른 객체를 this 로 전달할수있는다.
실행한함수또는객체.call(this 또는 다른 객체를 this 로 지정,args);
즉, helloWorld.call(this,"happy"); 라고 하면 helloworld 함수를 호출하되, 함수내에서 this 를 호출하면 전역 this 를 불려지게 하고, happy 라는 인자를 전달한다 라는 것고 같다.
helloWorld.call(anotherWorld,"avatar"); 라고 하면 helloworld 함수내에서 this 는 anotherworld 가 되고, 인자로 아바타를 전달하고 실행한다.

apply 메쏘드:
call 과 같지만, 두번째 인수로 배열,객체등을 전달할수 있다.

bind 메쏘드:
this 를 아예 고정시켜준다.

3.객체의 이해

: 자바스크립트는 객체가 동적이기 때문에 제약이 없지만 이런점 때문에, 다소 소스 정리가 쉽지않고 이해하기가 난해한 부분이있다.
객체는 거의 key : value 식으로 구성된다.

-프로퍼티
.(점) 속성은 자바스크립에서는 언제든지 선언하여 바로 사용할수 있다. 이때 자바스크립트는 객체에 put 이라는 내부 메쏘드를 호출한다. 그리고 값을 할당하면 바로  set 이 호출되어 새로운 값으로 교체한다.
객체에 특정 프로퍼티가 있는지 체크하려면 객체에 속성이 있는지 if( "name" in person);  검증한다. 이때는 프로퍼티의 값을 검증하지는 않고 속성만 판탄하기 때문에 성능향상에 좋다.
다만 객체가 생성될때 기본적으로 자바스크립에서 부가적인 속성을 추가하기 때문에 , 사용자가 만든 고유의 속성인지 확인해 볼필요가 있을때는 .hasOwnProperty("name") 라고 해야 한다.

프로퍼티는 delete 연산자르 삭제해야 한다. 중요하다.

객체의 프로퍼티가 어떤게 있는지 보고 싶을때는
열거가능한 프로퍼티.즉 tostring 따위도 포함할경우  for( property in object) 식
고유의 프로퍼티 (var props = Object.keys(object); for(var i=0;i < props.length;i++))  으로 한다.

-프로퍼티의 종류
Data property 와 Accessor Property 로 나뉜다.
Data propery : put 메쏘드의 기본동작으로 생성된다. 값을 지정한다.
Accessor propety : get set 을 별도로 정의한다.

프로퍼티의 속성은 Object.defienProperty("객체","프로퍼티이름",프로퍼티 서술자)  로 바꿀수 있다.

Data property 는 value, writeable 속성을 추가로 바꿀수있다.

Object.defineProperty(person1,"name",{
value : "v1",
enumerable : true,
configurable:true,
writeable:true});

Data accessor property 는 get , set  을 변경할수 있다.

defienProperties 로 하면 여러개의 프로퍼티를 한번에 할수 있다.

프로퍼티 속성을 가져올때는 Object.getOwnPropertyDescriptor() 를 사용한다.

객체의 수정방지
객체 속성중 Extensible 을 false 로 하면 객체를 수정할수 없다.
Object.preventExtensions() 를 사용하면, 확장불가능한 객체로 만들수 있다.(엄격한 모드)

객체의 봉인
Object.seal()메쏘드를 하면 봉인할수 있다. 추가로 프로퍼티 추가나 제거는 불가능 하지만, 읽기나 쓰기는 가능하다.

객체의 동결
읽기 전용으로 만든다. Object.freeze(); 일종의 객체에 대한 스냅샷을 만든다고 생각하면 된다.

4.생성자와 프로트타입
생성자는 그냥 인자를 이용하면 됨.

프로토타입 
:어떤 함수를 이용하여 여러번 호출할때, 함수안에 정의된 내부함수객체를 별도의 빼내어 낸게 프로토타입이다.
Object.prototype 식으로 하며 ,보통  Object.prototype.myfunc = function(){};
더 나은 방법으로는
Object.prototype = {
whois : Person,
myfunc : function(){},
sayhello : function(){}
};

내장객체의 프로토타입
:내장객체의 프로토타입에 고유의 기능을 추가하면 꽤 유용한 경우가 있다.
Array.prototype.sum = fuction(){ return 1+1); array.sum();

5. 상속
6.객체 패턴
자바스크립트는 모두 public 이다.
따라서 Closure 를 이용해서 private 속성값을 만든다.

2015년 10월 30일 금요일

데이터베이스 설계와 구축

-PK 컬럼순서도 중요하다?

: where , join 절에서 인덱싱을 타기위한  pk 인덱스 순서도  중요하다.

복합인덱스의 경우에도 단순 스칼라 비교값이 먼저배치하고 between 등과 같은 연산이 필요한 컬럼등은 뒤로 배치하면 인덱스범위가 앞에서 부터 줄어든다.

-식별자와 비식별자

: 테이블을 식별자로만 설계하면 테이블간 강한 연결관계가 되어, 자식의 PK 에는 항상 부모의 PK 식별자가 있어야한다. 따라서 자식테이블에서는 식별자로만으로도 데이터를 얻어오는게 가능하다
:비식별자로만 되어 있으면 약한 연결관계가 되는데, 자식테이블은 부모테이블의 PK에 상관없이  선언하기 때문에, 자식은PK선언에 ㅂ비교적 독립적이며 자식테이블에서 자료를 얻어낼려면 부모와의 조인참조가 필요하다.

- Transaction

: ACID(Atomicity, Consistency, Isolation, Durability)
A: 업무를 처리하는 최소의 단위별로 작업해야 한다.
C:일관성
I:독립성(Lock 기능)
D:영구성

-정규화 와 반정규화...

: 중요하다..쩝..

작업중

2015년 10월 28일 수요일

PHP DesignPattern 예제는 여기..

http://www.php5dp.com/a-simple-php-design-pattern-the-factory-method/

http://designpatternsphp.readthedocs.org/en/latest/README.html 여긴좀...

실전사례로 보는 SQL튜닝방법-인사이트

SQL 튜닝 배우자.

정규화 반정규화도 튜닝 작업의 일환이다.

인덱스만 잘타도 기본적인 튜닝작업이 된다.

이 책은 인덱스로 시작해서 인덱스로 끝난다.ㅋ
실전사례는 많아서 좋다.

-옵티마이져

Parsing 에 대한 적절한 실행계획을 세우는것.

:Soft Parsing : SQL을 실행한 적이 있는지 메모리에서 검사해서 기존방식대로 실행하여 처리는것.
Hard Parsing : SQL에서 사용하고 있는 객체들에 대한 접근권한체크후 어떤 방식으로 처리할것인지 실행계획을 세우는 것

-옵티마이져 종류

1.규칙기반 (Rule Base Optimizer , ROB): 특정 규칙을 기반으로 실행계획을 세우는 방법
:Rank(1~15) 에 정해진 우선순위대로 규칙을 적용한다.
-힌트를 사용할수 없다.
-HASH JOIN 을 사용할수 없다.
-Partitioned table, iot, reverse key index , function based index등은 사용할수없다.
이러한 제약때문에 Oracle10g 부터는 규칙기반 옵티마이져를 사용하지 않는다.

2.비용기반 (Cose Base Optimize , COB): SQL 의 비용을 계산해서 최소의 비용(cost) 로 처리할수 있는 계획을 세우는 방법

---

 

---

힌트의 사용
임시로 적용해 보는 몇가지 힌트를 통해 튜닝에 도움을 줄수있다.

/*+ ALL_ROWS */ : 최소한의 자원을 최대로 빨리 가져오는 실행계획을 세운다.
/*+ INDEX(table_name index_name)*/ : 특정 인덱스를 사용하거나,  NO_INDEX 를 통해 인덱스를 사용하지 않는 결과를 본다.
( /*+ INDEX_ASC(table_name index_name)*/ 와 /*+ INDEX_DESC(table_name index_name)*/) 도 있음.
/*+ FULL(table_name) */ : FULL SCAN  하고자 할때 쓰인다. Index scan 하고의 비교 검증용이다.
/*+ INDEX_FFS(table_name index_name) */ : index fast full scan 을 유도한다. 컬럼들이 모두 인덱스에 있을때, 인덱스만으로도 검색이 가능한경우.

/*+ ORDERRED */ : 무조건 from 절에서 나열한 테이블 순서대로 처리를 진행한다. join 쿼리의 경우 순서도 영향을 끼지기 때문이다.
/*+ LEADING(table1 table2...) */ : 명시된 테이블 순서대로 처리한다.

/*+ USE_NL(table1 table2...) */ : nesteed loop join 을 사용한다.(!= NO_USE_NL)
/*+ USE_HASH(table1 table2...) */ : hash join 을 사용한다.

/*+ USE_CONCATE */ :조건절의 OR 를  UNION ALL 형식으로 변형하여 실행한다.(!= NO_EXPAND)
/*+ MERGE */ : 뷰가 메인쿼리와 merge 되지 않을때 강제로 merge 한다. (!= NO_MERGE)
/*+ UNNEST */ : 서브쿼리와 메인쿼리를 하나의 조인형태로 한다.(!= NO_UNNEST)

2015년 10월 27일 화요일

Eclipse 단축키등

http://blueskywithyou.tistory.com/39

2015년 10월 25일 일요일

Abstract Factory

공통의 Todo 목표를 가진 제품의 생산방식을 대표클래스를 통해 추상화하고, 하위 클라이언트 클래스에서는 이를 구현하기만 하면 되는 패턴이다.

예제

인터페이스 render{
구체화된 하위 클래스들이 공통적으로 구현 해야할 기능 (예.  render , user, paint,  등..)
}

각각 구체화된 하위 클래스 implement   render{
인터페이스 render 의 메쏘드를 각자 제각각 구현
}

추상 팩토리 객체 AbstractRenderFactory{
추상화된 생성객체를 생성해서 이  객체를 상속받아 생성하는 객체를 통해 render 방식을 결정
}

추상팩토리 객체의 하위 클래스 extend AbstractRenderFactory{
추상팩토리 객체에 정의된 생성메쏘드를 오버라이드 하고, 구체화된 하위클래스의  render 를 실행.
}

 

 

참고:

https://www.youtube.com/watch?v=soV1C6j9kkg
http://warmz.tistory.com/758 - 추천
http://alleysark.tistory.com/169  - 추천2
http://designpatternsphpko.readthedocs.org/ko/latest/Creational/AbstractFactory/README.html
http://dsheiko.com/weblog/design-patterns-by-php-and-js-es5-examples/#abstract-factory

Lifecycle of Fragment in Android

http://codemeaning.com/what-is-fragment/

2015년 10월 18일 일요일

초보자를 위한 분산 캐시 이야기

http://www.slideshare.net/OnGameServer/ss-10451675?related=3

[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기

http://www.slideshare.net/deview/d2-campus-seminar-45210063?related=2

JAVA PERFORMANCE TURNING

http://www.slideshare.net/ienvyou/java-performance-tuning-46792397?related=1

2015년 10월 16일 금요일

PHP 의존성 주입 예제

이해가 되는 슬라이드

http://www.slideshare.net/rifat/dependency-injection-10624875?qid=5def2560-b50b-4e50-8592-cb7d4d077516&v=qf1&b=&from_search=6

 

http://modernpug.github.io/php-the-right-way/#dependency_injection 에서 발췌

의존성 주입


위키백과에서 인용:
의존성 주입(Dependency Injection, DI)은 프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점에 주입하도록 하는 디자인 패턴 중의 하나이다.

위와 같은 설명은 실제보다 훨씬 어렵게 느껴지게 만드는 점이 있습니다. 의존성 주입이라는 것은 특정 컴포넌트의 의존 관계를, 생성자에서 주입하거나 메소드 호출 혹은 프로퍼티 설정을 하는 방식으로 지정할 수 있게 하는 것입니다. 간단한 얘기입니다.



기본 개념


간단한 예제를 통해서 기본적인 개념을 보여드리겠습니다.

아래 코드를 보면 데이터베이스와 통신하기 위한 어댑터를 필요로 하는 Database라는 클래스가 있습니다. 생성자에서 어댑터 인스턴스를 생성하는 방식으로 되어 있어서 두 클래스는 서로 강한 의존 관계를 가지고 있습니다. 그래서 Database 클래스를 테스트하기도 어렵습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}

class MysqlAdapter {}


아래와 같이 리팩터링하여 의존성 주입을 사용하도록 하면 의존 관계를 약화시킬 수 있습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct(MySqlAdapter $adapter)
{
$this->adapter = $adapter;
}
}

class MysqlAdapter {}


이제 Database는 내부에서 직접 의존 관계에 있는 클래스 인스턴스를 생성하지 않고, 외부에서 전달받게 되었습니다. 어댑터 인스턴스를 인자로 전달받는 메소드를 만들어서 해당 어댑터를 사용하도록 설정하는 방식을 적용하거나, $adapter 프로퍼티를public 으로 만들어서 프로퍼티를 직접 설정하게 할 수도 있을 것입니다.

PHP DesignPattern 2

http://www.fluffycat.com/PHP-Design-Patterns/

2015년 10월 15일 목요일

php design patterns

http://wafe.github.io/php-the-right-way/pages/Design-Patterns.html

http://www.phptherightway.com/pages/Design-Patterns.html

http://mytory.net/archives/1948/

 

https://sourcemaking.com/design_patterns/observer/php

 

http://designpatternsphpko.readthedocs.org/ko/latest/

 

http://dsheiko.com/weblog/design-patterns-by-php-and-js-es5-examples/

6. Factory pattern

http://arnakiel.blogspot.kr/2010/01/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%9D%98-%EB%84%A4%EB%B2%88%EC%A7%B8-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4factory-pattern-1.html

http://outliers.tistory.com/14

2015년 10월 12일 월요일

5.Decorator pattern

참고. http://warmz.tistory.com/757 (*발췌 ava.io 패키지에는 어마어마하게 많은 클래스들이 있지만, 많은 부분이 데코레이터 패턴을 바탕으로 만들어져 있다.)

http://stevenjsmin.tistory.com/73

http://donxu.tistory.com/96

http://code.tutsplus.com/tutorials/design-patterns-the-decorator-pattern--cms-22641

 

http://tiboy.tistory.com/entry/Decorator-Pattern%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4

http://warmz.tistory.com/entry/Decorator-Pattern-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4

2015년 10월 11일 일요일

시작하세요 AngularJS 프로그래밍

시작하세요! AngularJs  프로그래밍
AngularJS 는 오픈소스 자바 프레임워크 이다. 프레임워크이기 때문에 기본 뼈대만 있고, 사이트구축에 대한 응용은 알아서 해야한다.
하지만 AngularJS 에서 추가로 제공하는 라이브러리를 통해서 애니메이션,쿠기,로드,단위테스트,리소스관리,라우트,터치이벤트 등이 쉽게 구현가능하다.
angular-js , animate, cookies, loader, mocks, resource, toure, ssanitize, scenario, touch...

Tip: Bower.io 에서 클라이언트종속성을 편하게 가져올수 있도록 할수있다. 관련된 라이브러리를 편하게 선택해서 불러올수있다.
http://bower/angulra/angular.js

Tip: angular-batarang 프로젝트는 크롬브라우져의 웹인스펙터 확장팩형태로 제공되는 전용 디버깅 기능이다.

- Karma 와 Jasmine

karma 는 테스트러너이다. 실제 테스트를 위해선 jasmine (테스트 프레임워크)을 이용해서 작성해야 카르마가 테스트 할수 있다.
node 로 구현되는 것이기때문에 관련모듈을 설치할필요가 있다.
npm install karma  ,  karma-jasmine, karma-chrome-launcher
sudo npm install -g karma-cli : g 옵션으로 아무데서나 카르가 실행되도록 한다.

설치되었으면,

karma.conf.js 를 열어서 설정을 한다. 이때 autoWatch 를 true 로 하면 파일이 변경되면 바로 카르마가 실행되도록 한다.
자세한것은 PACKT 사의 MVC 패턴과 트위터부트스트랩을 이용한 AngulraJS 반응형 웹앱 개발과 성능 최적화 참고.
Angulra-seed 의 git 을 클론하면 기본 스캐폴더(폴더구성 및 관련파일구성)을 쉽게 할수있다.
이를 통해 가져온 스캐폴더에는  css,img,js,lib,partials 폴더가 있다.
AngularJS 주요기능
-양방향 데이터 바인딩
-MVC 구조
-지시자(Directive)를 이용한 확장
-의존관계 주입
-Singlepage WebApplication 을 위한 Router 구현
-$q 를 이용한 비동기 프로그래밍 지원
-테스팅 환경 지원

AngularJS 를 이용하기 위해서는 http://angular.js 만 지정하면 된다.
물론 이건 angularjs 프레임워크만 로드할것 뿐이다. html 페이지에서 적용하려면
<html ng-app> 이라고 태그 속성을 지정하면 그때부터 angularjs 가 html 소스를 먼저 해석하게된다.
이렇게 ng- 로 시작되는 많은 angularJS 만의 지시자들과 속성이 있는데 이를 디렉티브라고 한다.

디렉티브는 기본적으로 제공하는 이외에도 사용자가 직접 만들어서 추가하여 나만의 디렉티브를 구현할수 있다.

특정 태그블록에 기능을 추가하거나 변수값을 대입(대응)대도록 할수 있는데, 이를 위해서는 ng-controller 지시어를 사용한다.
먼저 코드블록에서 콘트롤러로 사용할 함수를 지정한다.

//$scope 는 AngularJS 의 전역변수이며 매직변수이다.
var myval = [{mval:"1",mcheck:false},{mval:"2",mcheck:true}];
function myTest($scope){
$scope.name = "My Angular Test";
$scope.myGval = myval; // angularJS 의 $scope 에 myval 변수를 추가한다.
}

이제 특정태그블록에서 콘트롤러를 지정하면된다.


{{appName}}

//appName 은 angularJS 의 변수

  • {{my.mval}}



div 태그블록을 ng-controller 로 하겠다고 지시자를 지정하고, myTest 함수를 콘트롤러 구현부로 하겠다고 선언한다.
ng-repeat 을 통해서 li 태그를 $scope.myGval 객체의 개수만큼 반복하면서 li 를 생성한다.
ng-model 은 "값"에 해당하는 것으로 input 박스의 값에 angularjs 의 사용자 지정 model 변수들을 연동할때 쓰인다.
-angularjs 부트스트랩
ng-app 을 통해서 angularjs 를 기동시키고 html 태그블록에서 angularjs 가 렌더링되도록 했다.
하지만 html 전체가 아닌 작게 나뉜 태그블록에서 ng-app 을 지정하고자 싶지만  ng-app 은 한번밖에 해석되지 않는데,
이때는 javascript 에서 angular.bootstrap(document.getElementById('id태그')) 를 통해서 여러번 실행가능한다.
-ng-init : 태크블록 내에서 초기화할 필요가 있는 변수나 기능 지정
-ng-repeat : 태그블록을 반복
-ng-switch="모델이름" :  하위테그에서 ng-switch-when="모델값의 밸류" 가 트루일때 화면에 보임
-ng-if : 참일때보임
-ng-show,hide
-input 태그블록에서는 ng-model, ng-required,ng-minlength,ng-maxlength,ng-pattern,ng-change 등이 있다.
-FormController 의 속성 메쏘드 알아보기
-NgModelController 속성과 메써드 알아보기

이벤트 지시자
ng-click, ng-dblclick, ng-ketdown, ng-ketpress, ng-keytup,ng-mousedown,ng-mouseenter,ngmouseleave, ng-mousemove,over,up,change,blur

스타일시트 클래스 지시가
ng-class, ng-style="$scope.스타일값"
Controller 로 정의한 중첩된 태그블록에서 하위 콘트롤러에서 상위 콘트롤러의 $scope 는 접근이 가능한다.

-모듈
ngmodules.org 에서 참고.
모듈을 나만의 directive (지시자)생성
angular.module('mytestApp',[]).directive('helloworld',funciton(){ return function(scope, iElement,iAttrs,controller){ iElement.html(" hello "+iAttrs.myname+"");
라고 선언되었을때

라고 가능.

-지시자 설정객체
지시자 설정함수에서 반환되는 객체를 말함.
지시자를 생성할때에 객체형으로 여러가지 속성을 지정하여 리턴할수 있다.
name,priority,terminal,scope,template,replace,transclude,restrict,controller:function(), compile 등..
이중 template_Url 을 통해서 외부파일에 해당 코드블록만 따로 템플릿화 시켜서 이용이 가능하다.
<h1>hello <span>{{worldname}}</span></h1>
단 해당 디렉티브를 여러번 호출할경우 지시자 속성중 scope 를 true 로 해서 각각의 scope 를 생성해야한다.

-scope 속성
scope 속성에 { myname : "@who" } 라고 되어 있으면,
 
해도 scope 가 엉키지 않는다.
---------------------------------------




</div>
</div>

angular.module('sampleApp',[]).controller('demoCtrl',['$scope',function($scope){

}]).directive('hello',function(){
return {
template:'<span>{{myname}}</span>',
restrict:"AE",
scope:{ myname:"@to"}
}
});
---------------------------------------

scope 속성에 { myname : "=who" } 라고 되어 있으면,
  하면 who 속성이 양방향 바인딩 된다.

-지시자 Directive
크게 네가지 형태로 지정가능한다.
1.요소의 속성
<span my-directive="exp"></span>
2.요소의 클래스
<span class="my-directive:exp"></span>
3.요소이름
<my-directive></my-directive>
4.코멘트호출
<!-- directiv: mydirective expression -->
Tip : 웹표준을 위해서 x-ng-click 등으로 한다.
Tip : IE 8 등에서는 Dom 이 먼저 생성되야 하므로 <!-- [if lte IE8]> document.createElement('my-directive');<![endif]--> 해준다.
-외존관계 주입
$provide  를 이용한 주입방법
-value
: angular.module('myapp',[]).value('AppName','myValue').controller('myctrl',function($scope,AppName){ $scope.printAppName = AppName);

-factory
: 188page 샘플 예제 2.38

-service
: 190page 샘플 예제 2.39

-provider
: value,factory,service 는 모두  provider 의 래퍼다.
,contrant

메서드별 차이점은 다른 서비스를 주입가능한지 등 화깅ㄴ필요.

$injector 에 의한 주입. 특정 서비스가 해당 모듈에 저의 되었는지 확인 가능.
예제 2.44

-$route 서비스
angular-route.js 라는 별도의 라우트 라이브러리를 연동해야 한다. 244 페이지
예제 3.1
angular.modle('myapp',['ngRoute']).config(functiuon($routeProvider){$routeProvider.
when('/home','tempalteUrl:'template/home.tmpl.html'})
when('/about','tempalteUrl:'template/about.tmpl.html'},controller:'aboutCtl')..
선언하고
<ng-view></ng-view> 에서 보여줌.
controller,controllerAs,template,templateUrl,resole,redirectTo,reloadOnSearch,caseInsentitiveMath 등의 속성이 있다.
-$http 서비스
-RESTful 웹서비스를 위한 $resource

2015년 10월 10일 토요일

4.adaptter pattern

유지보수 또는 향후 확장성 차원에서 어답터 라는 인터페이스를 통해서 추가로 발생되는 기능이나 기존의 기능에 유연하게 대처할수 있도록 해준다.

추상클래스를 상속받은 기존의 클래스에는  새로운 기능(220볼트 플러그인과같은)이 없기 때문에 , 애덥터 클래스를 새로 추가하여 그 안에 220 둥그런 돼지코 를 110 의 | | 돼지코로 호환되는 구현부를 만들어서 기존 클래스에서 하던방식대로 연결하는 패턴임.

http://tiboy.tistory.com/entry/Adapter-Pattern%EC%96%B4%EB%8E%81%ED%84%B0-%ED%8C%A8%ED%84%B4

http://warmz.tistory.com/763

http://blog.jdm.kr/11 <--쉽게 설명

http://outliers.tistory.com/18

php  예제 : http://redgolems.tistory.com/2

3.Template Method 패턴

상위클래스는 처리의 흐름이 정의 되어 있는 추상클래스이고 ,하위 클래스는 사우이클래스를 상속받아 구체적인 처리를 구현한 클래스가 된다.

따라서 상위 클래스는 하위 클래스가 실제적으로 어떤 구체적인 작업을 하는지 모르며, 서로 다른 하위 클래스들은 나름대로의 방식대로 구현하되 처리의 흐름은 상위 클래스에 정의된대로 따르게 된다.

즉, 탬플릿의 주체가 되는 콘트롤러 의 성격을 띄는 상위클래스에서 흐름을 관장하고, 상속받은 실제 하위 클래스에서는 상위클래스에서 정의된 순서와 규정에 맞게 오버라이딩 하고, 추가 기능등을 구현하게 된다.

따라서 일련의 상속받은 하위 클래스들은 모두 상위 클래스의 템플릿구성대로 구현과 실행하게 되는 패턴이다.

구조가 일관적인 형식의 제품이나 기능들을만들때 주로 사용하는 패턴이다.

Abstract  UpperClass {

abstract public function init();
abstract public function run();
abstract public function end();
final function showMain(){
this->init();
this->run();
this->end();

}
protected int sharedVal = 0; //하위 클래스에서 공통으로 공유하는 변수등.

}

추상클래스인 UpperClass 에는 오버라이디이 불가능한 final 인 showMain 에 정의된 초기와->실행->종료 라는 템플릿으로 하위 클래스에서 실행되도록 구현된것이다.

하위 클래스는 추상메쏘드 들을 각 상황에 맞에 오버라이딩 한다음 showMain() 을 실행하여 동일한 실행 프로세스를 가질수 있도록 했다.

 

http://copynull.tistory.com/124

http://egloos.zum.com/iilii/v/3806897

http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C8%EC%9E%A5-Template-Method-%ED%8C%A8%ED%84%B4

http://blog.jdm.kr/116

http://skmagic.tistory.com/entry/Template-Method-Pattern-Class-%EC%A0%95%EB%A6%AC%EB%B3%B8

http://darkneo.tistory.com/7

Git 분산관리 버젼 시스템 - 인사이트

1.저장소( repository) : 사용자가 변경한 모든 내용을 추적하는 공간.

2.저장소 만들기 :

  • mkdir mywebsite

  • cd mywebsite

  • git init

  • 후에

  • git add index.html

  • git commit -m "hehe first website"


3.branch  만들기

git branch RB_1.0 master

master 브랜치에서 RB_1.0  라는 브랜치를 생성한다. (서브비젼에서는 트렁크라고 했음)

4.원격저장소 복제해오기

git clone http://mysite myclonesite

5.파일무시하기

.gitignore : 저장소및 자신의 컴퓨터에서 파일무시

.git/info/exclude : 자신의 저장소에서만 파일무시

6.브랜치 활용

-깃에서는 모든게 브랜치 로 간주된다.

브랜치는 새로운 기능을 잠깐 만들어보려고 할떄나, 검증전의 새로운 기능추가, 리팩토링,버그수정 등의 별도의 과정을 하고자 할때 주로 생성한다. 새로운 기능은 베타버젼일수있으며 검증이 끝나면 다시 마스터와 통합하여 릴리즈 버젼으로 만들어 배포하는 수순이다.

git checkout -b newAlgo master

마스터로 부터 새로운 알고브랜치를 만든다.

6.1 병합

newAlgo 체크아웃상태에서

git add test.html -> git commit -m "for test" 하면 master 브랜치에서는 존재하지않는다.

따라서 합치고자 하는 브랜치로 전환해야 한다.

git checkout master

git merge --squash newAlgo

로 아까 추가한 것을  master 에 합친다.( squash 는 모든 커밋을 하나의 커밋으로 밀어넣는다.)

6.2 브랜치의 충돌

"브랜치1" 과 "브랜치2"를 먼저 추가후 "브랜치1"에서 내용을 추가한후

"브랜치2"에서 따로 내용 추가한다음

1의 파일을 다시 수정하고

git commit -> git checkout "브랜치1" -> git merge "브랜치2" 하면 충돌이 일어난다.

<<< : 현재 브랜치
>> : 다른브랜치

=== : 구분자

이때는 그냥 머지툴로 충돌 확인하고 적절한 수정을...쿨럭....같은 내용중에 어떤거를 남길수 판단은 인간이.

7.커밋 돌려놓기

git revert -n 5401434 -> git commit -m "revert"

8.원격 저장소를 이용

8.1 push

git origin mybranch:master 해서 로컬의 특정 브랜치를 원격에 저장할수 있다.

원격저장소에 대한 별칭은

git remote add 이름 저장소URL 이다.

git pull thkim HEAD 하면 별칭된 주소에서 가져온다.

2015년 9월 27일 일요일

PGSQL

http://dbrang.tistory.com/724

2015년 9월 15일 화요일

scrum 개발방법론

http://bcho.tistory.com/170

2015년 9월 14일 월요일

PostgreSQL 요약

-coffemix.net  하위 문서

http://coffeenix.net/doc/db/pgsql_sql_091a/pgsql_sql_091a-1.html

http://devx.tistory.com/entry/PostgreSQL%EC%9D%98-%EC%9E%A5%EC%A0%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95

-아래는 요약-

어느 DBMS에나 있는 query optimizer를 보자. rule base든 cost base든 이것도 얘기 꺼내면 시끌시끌 하지만 pgsql의 geqo(genetic query optimizer)는 어쨌든 뛰어난 옵티마이저이다.
단일 테이블 select 아무리 빠르면 뭐하나? 테이블 조인 서너개 하면 디스크 처음부터 끝까지 다 긁는다.
...
pgsql은 내가 아는 한 가장 똑똑한 옵티마이저를 가졌다.

다른 강력한 기능들.

하나의 row가 하나의 데이터가 된다면 어떨까?
composite type이라는 데이터 타입은 하나의 row처럼 여러 종류의 데이터 타입들을 하나의 필드에 넣을 수 있게 해준다. C의 구조체를 하나의 데이터 타입처럼 다루는 것이다.

pgsql이 지원하는 모든 데이터 타입은 [] 만 붙여주면 배열 타입으로 변한다.

리플리케이션.

pgpool-II: pgpool의 차세대(?) 버전으로 최대 128개의 pgsql을 리플리케이션 해주고 그리드형태의 분산 처리가 된다. select * from table idx between 0 and 100; 이런 쿼리가 들어오면 10대의 pgsql에 0..10, 11..20, 21..30 처럼 쿼리를 쪼개서 병렬 처리하게 한다. 보통의 클러스터보다 훨씬 좋은거다.

2015년 9월 9일 수요일

yslow.org 웹사이트 성능분석도구

yslow.org

2015년 8월 19일 수요일

서버 동기화 Lsync 설정시 암호 물어보지 않기 위해서..

http://blog.cjred.net/166

 

rsync={rsh="/usr/bin/ssh -i /root/.ssh/id_rsa -p22 -o StrictHostKeyChecking=no"}:

2015년 8월 17일 월요일

mysql replication 설명

http://gywn.net/2012/03/mysql-replication-3/

서버 동기화 LSYNCD

http://coffeenix.net/board_view.php?bd_code=1696

2015년 6월 4일 목요일

~하지말고 ~ないで ,~하지않아서~なくて

*동사~ないで : (상태,행동을)~ 하지말고 (지속형) 동사~なくて : (이유를)~하지않아서 (이렇게 되었다.)
* お酒をのまないでください。술을 마시지말아주세요
* お酒をのまにで。술 마시지마
*
* お酒を飲まなくて取らなかった。 술을 마시지 않아서 취하지 않았다.
* 気分がよくなくてお酒を飲んだ。 기분이 좋지않아서 술을 마셨다.

2015년 5월 12일 화요일

cocos2dx 튜토리얼 게임소스들.

http://cn.cocos2d-x.org/tutorial/lists?id=116

2015년 5월 8일 금요일

대학생을 위한 웹개발 공부 체크리스트?

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0PPwB&articleno=1437&categoryId=19&regdt=20141216143555

node,npm,grant 등 이해하기

http://skullacy.com/javascript/4668

2015년 5월 6일 수요일

android-libraries-use-every-project

http://blog.teamtreehouse.com/android-libraries-use-every-project

2015년 4월 17일 금요일

2.옵저버 패턴 (Observer Pattern)

하나의 객체가 변경사항이 생기면 다른객체에 전달하여 적절한 액션을 취할수 있도록 하는 패턴이다.

주로 발행한다. 는 의미가 강함

http://warmz.tistory.com/751 , http://wiki.gurubee.net/pages/viewpage.action?pageId=1507370 의 알람옵저버패턴을 보면이해가 될것이다.

http://hyeonstorage.tistory.com/165

http://tiboy.tistory.com/entry/Observer-Pattern

자바스트립트 옵저버 패턴? http://jsfiddle.net/vasco989k/HPsFp/

http://www.javajigi.net/display/SWD/ch02_observerpattern

object-c 옵저버패턴 http://kyejusung.com/2015/09/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-2-observer-pattern/

1.디자인패턴-strategy pattern( 전략,전술 패턴)

Stat 패턴과 차이점이 잇는데 , 패턴내부에서 스스로 객체로 변경하는 것은 state 패턴이고

외부에서 객체를 지정해줘야 상태변경이 가능한 것이 strategy 이다

-------------------------------

Strategy 패턴은 주요객체는 공통된 기능(메쏘드)을 상속공유한다는 전제로서, 각 객체의 행동이 독립적인 속성을 가지고자 할때 유용한 패턴이다.

또한 abstract  로 선언된 공통된 기능을 포함한 추상클래스에
고정적으로 선언된 독립된 인터페이스(또는 레퍼런스)를  통해 하위 속성을
지정하는 것만으로도 객체의 특징속성(차는 원래 굴러다니지만, 날개를 붙이면 날라다닐수도 있다)을
변경가능한것이 용이하다는 장점이 있다.

이를 통해 객체의 속성을 실시간으로 변경할수도 있다.

다만 최상위 클래스에서 미리 행동양식들을 계산하고 정의해야 되기때문에,
최상위 클래스를 어떻게 설계하고, 바뀔수 있는 각각의 독립적인 행동양식들을 구분해 내느냐가 관건이다.

게임을 만든다고 치자.

주인공은 처음에는 걷는것만 할수있지만, 점점 아이템을 장착함에 따라 빨리 뛰고,날수 있게된다.
따라서  NPC 에서 MOVE 액션에 걷기를 빨리뛰기로, 또 날개가 장착되었을때는 날라가기로 바꾸기만 하면 해당액션을 할수있다.

물론 상속으로도 해결되지만, 재상속에 의한 스트레스를 줄이기 위해선 그냥 전략패턴을 쓰는게 좋다.

-------------------------------

 

 

http://hyeonstorage.tistory.com/146

굳이 전략 이라는 단어에 끼워 맞춘다면 이렇다.

일단 공격일자는 정해져 있다.
다만 공격 아이템들은 보병,스나이퍼, 자동차, 탱크,오토바이, 비행기, 배 등 다양한다.
보통은 자동차 클래스 따로, 탱크 클래스 따로 따로 만들어서 제어하는게 맞다.

하지만 이렇게 하면 공격아이템들이 늘어날때마다(수륙양용 호버크래프트,드론등..)
같은 행동을 하는 클랙스를 생성해야 한다면 매우 귀찮을 것이다.

따라서 전략 패턴을 적용해서.!!!

일단 병기 라는 추상 클랙스를 만들자.
그리고 나서 병기가 가져야할 공통 부분을 뽑아내 보자. 단 뽑아낸 공통 부분이 각 병기에 따라서 다른 값과 행동으로 구분된다면 이를 별도의 클래스 로 구분할 생각을 하자.
그럼 공통된 부분은
이동
전투
휴식
자멸
등이 있겠다.
이중 이동,전투 는 동일하다. 다른 행동을 취하는 것은 휴식,자멸이다. 비행기나 배 등은 휴식이 없으니까..
따라서 휴식,자멸은 별도의 행동패턴이라고 치부하고, 별도의 클래스로 만들어서 해당되는 병기들에게만 적용한다.

결국 보병,자동차,오토바이 들은 병기 추상클래스의 휴식 인터페이스를 지정하여 주면된다. 인터페이스로 지정해 주었으므로 각 병기에 맞게 쉬는 형태를 설정하면된다.

쉰다 인터페이스

-> 보병:앉아서 메쏘드 ,
-> 자동차,오토바이:시동을 끈다

따른 애들은 지정 안하면 된다.

 

http://jongyoungcha.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-state-%ED%8C%A8%ED%84%B4%EA%B3%BC-strategy-%ED%8C%A8%ED%84%B4%EC%97%90-%EB%8C%80%ED%95%B4

2015년 4월 7일 화요일

유니티 최적화팁

http://www.slideshare.net/agebreak/141206-42456391

2015년 4월 5일 일요일

https://github.com/wasabeef/awesome-android-ui

https://github.com/wasabeef/awesome-android-ui

2015년 3월 18일 수요일

열두번째 날: MySQL을 NoSQL로 사용하기

http://advent.perl.kr/2012/2012-12-12.html

2015년 3월 16일 월요일

Node.js로 푸시서비스 구현하기 1. 아이폰(iOS) 푸시서버 구현하기

http://blog.saltfactory.net/215

get-todays-photo-from-album-in-ios

http://stackoverflow.com/questions/26320876/get-todays-photo-from-album-in-ios

2015년 3월 12일 목요일

일본인이 정리한 ios 기능 설명서

http://iphone-tora.sakura.ne.jp/index.html

cocos 강좌가 많이 있는 중국 사이트

http://cn.cocos2d-x.org/tutorial/lists?id=49&per_page=27

2015년 3월 11일 수요일

망할놈의 autolayout

http://minsone.github.io/mac/ios/nslayoutconstraint/

2015년 3월 10일 화요일

Listview에 헤더 구현

http://warmz.tistory.com/673

ImageView 라운드(둥근 테두리) 처리

http://warmz.tistory.com/740

UIActivityViewController를 이용하여 다른 앱과 컨텐츠 공유하기

http://warmz.tistory.com/825

[View Animation] Flip Left/Right, Curl Up/Down

http://warmz.tistory.com/827

[Tip] Universal App 개발시 현재 단말기가 아이폰인지 아이패드인지 구별하 는 방법

http://warmz.tistory.com/830

IOS GDC , BLOCK-Coding 아주 좋은글.

http://warmz.tistory.com/831

영상처리-수학-기본

http://moguwai.tistory.com/entry/%EC%98%81%EC%83%81%EC%B2%98%EB%A6%AC-%EC%88%98%ED%95%99-%EA%B8%B0%EB%B3%B8

[IOS] UUID 생성 및 키체인 저장

http://reysion.tistory.com/55

고급 오토레이아웃(auto layout) -AutoLayout Programmatically 사용하기

http://www.letmecompile.com/advanced-auto-layout/

animating-an-uiimageview-view-from-point-a-to-point-b-with-constraints-program

http://stackoverflow.com/questions/14913949/animating-an-uiimageview-view-from-point-a-to-point-b-with-constraints-program

2015년 3월 9일 월요일

xcode 에서 에러의 위치를 보여주지 않을때

http://leo81.tistory.com/5

xcode 에서 svn 연동하기

http://leo81.tistory.com/41

위처럼 한다음

checkout 에서  임포트했던 프로젝트를 선택한다음 , 다시 맥에서 새로운 폴더에 받으면

자동으로 xcode 가 열리면서 보임.

이제 작업하고 commit 하면 됨.

아이폰에서 화면터치 무시하기

http://dongss.tistory.com/entry/iOS-%EC%95%84%EC%9D%B4%ED%8F%B0-%EA%B0%9C%EB%B0%9C-%ED%99%94%EB%A9%B4%EC%83%81%EC%97%90%EC%84%9C-%ED%84%B0%EC%B9%98-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%9C%EC%83%9D%EC%8B%9C-View%EC%97%90%EC%84%9C-%EB%AC%B4%EC%8B%9C%ED%95%98%EA%B8%B0-%EB%B0%A9%EB%B2%95

cocos2dx 모노폴리 예제 > _ < -중국어

http://blog.csdn.net/lideguo1979/article/month/2015/03

NSURLRequest-서버에-POST-요청-쿠키정보까지 가능

http://xcode5.tistory.com/entry/NSURLRequest-%EC%84%9C%EB%B2%84%EC%97%90-POST-%EC%9A%94%EC%B2%AD

connecting-to-php-service-from-ios.html

http://divcode.blogspot.kr/2012/08/connecting-to-php-service-from-ios.html

NSThread 를 통한 데이터 병렬처리

http://yoogomja.tistory.com/entry/NSThread%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%ED%99%94%EB%A9%B4-%EC%A0%9C%EC%96%B4-%ED%8C%81

2015년 3월 4일 수요일

cocos2dx 동영상강좌 무료인곳

http://www.sonarlearning.co.uk/coursepage.php?topic=game&course=cocos2d-x-v3

iOS - Uploading image by HTTP POST

http://stackoverflow.com/questions/24182573/ios-uploading-image-by-http-post

http://parangma.tistory.com/109 -한글

screen 캡춰

http://redhan.tistory.com/37

ios webview 쿠키

http://www.picomax.net/xe/study/22881

ios multipart http post

http://stackoverflow.com/questions/8564833/ios-upload-image-and-text-using-http-post

http://stackoverflow.com/questions/24250475/post-multipart-form-data-with-objective-c

http://vulpecula.tistory.com/40 한글

2015년 3월 3일 화요일

collection view 에서 멀티셀렉트

http://www.appcoda.com/ios-collection-view-tutorial/

2015년 3월 2일 월요일

컬렉션 뷰(UICollectionView) #5. Layout, 그리고 Flow Layout-설명이잘되어 있는...

http://covelist.tistory.com/9

아이폰용 오픈소스 링크들

http://blueamor.tistory.com/818

아이폰 자잘한팁들

http://inhoda.blogspot.kr/2012/02/blog-post.html

2015년 3월 1일 일요일

[objc] 앨범에서 마지막으로 찍은 사진 가져오기

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];



    // Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.


    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group,BOOL *stop) {



        // Within the group enumeration block, filter to enumerate just photos.


        [group setAssetsFilter:[ALAssetsFilter allPhotos]];



        // Chooses the photo at the last index


        [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:([group numberOfAssets] - 1)]options:0 usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {



            // The end of the enumeration is signaled by asset == nil.


            if (alAsset) {


                ALAssetRepresentation *representation = [alAsset defaultRepresentation];


                UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];


                [latestPhoto resizeImageToWidth:50];



                if (latestPhoto){


                    [self.imgBtn setBackgroundImage:latestPhoto forState:UIControlStateNormal];


                    [self.imgBtn setBackgroundImage:latestPhoto forState:UIControlStateHighlighted];


                }


            }


        }];


    } failureBlock: ^(NSError *error) {


    }];

tableview 에 앨범 제목표시

http://www.appcoda.com/uitableview-tutorial-storyboard-xcode5/

http://www.mindfiresolutions.com/Using-Groups-How-to-retrieve-data-from-Photos-Application-in-iOS-device-1720.php

앨범에서 마지막 찍은 사진 가져오기

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];



    // Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.


    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group,BOOL *stop) {



        // Within the group enumeration block, filter to enumerate just photos.


        [group setAssetsFilter:[ALAssetsFilter allPhotos]];



        // Chooses the photo at the last index


        [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:([group numberOfAssets] - 1)]options:0 usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {



            // The end of the enumeration is signaled by asset == nil.


            if (alAsset) {


                ALAssetRepresentation *representation = [alAsset defaultRepresentation];


                UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];


                [latestPhoto resizeImageToWidth:50];



                if (latestPhoto){


                    [self.imgBtn setBackgroundImage:latestPhoto forState:UIControlStateNormal];


                    [self.imgBtn setBackgroundImage:latestPhoto forState:UIControlStateHighlighted];


                }


            }


        }];


    } failureBlock: ^(NSError *error) {


    }];

인스턴스 마다 의 공유 값들은 프로토타입에 저장

인스턴스 마다 의 공유 값들은 프로토타입에 저장

커링 함수에 bind 사용하기

bind 는 기존의 함수나  메소드 에 영향을 주지않고 임시로 추가적인 함수를 만들어서 기존의 함수에 적용 을 시킨다.

function SimpleURL(protocol, domain, path){
return protocol + "://"+domain+"/"+path;
}

1.ㅂㅏ인드를 ㅅㅏ용하지  않는 일반적인 방법

var urls=paths.map(function(path){
return SimpleURL("http",sitedomain,path);
});

2.바인드를 사용 하여 심플 하게 변경

기 존의 함수에 bind(this, arg,arg) 식으로 선언하면,  arg 개수 를 가진 무명의 함수를 생성하여 이를 리 턴하고 다시 원래의 함수 를 호출(위임)하여   준다.

아래 예제에서는 simpleURL 에서는 this 등이 사용되지  않기 때문에 null  을 첫번째 인자로,

protocol과 domain 을 두번쨰 인자로 취하여 bind 가 새로운 함수를  생성한다음 함수리턴을 하고,

리턴된  함수 의 마지막에 path(map 에 의해 추출된 변수..여기서는  무명변수) 를  인자로 붙여 simpleurl 을 실행한다.

var urls=paths.map(SimpleURL.bind(null,"http",sitedomain));

고차함수

익명함수를  이용한  고차함수

------------

var a=[3,1,4,5,6].sort(function(x,y){
if(x<y) {return -1;}
if(x>y) {return 1;}
return 0;
});
console.log(a);

----------------------

맵을 이용한 고차함수

var a=["Fred","Willar","Peblle"].map(function(name){

return name.toUpperCase();
});
console.log(a);

----------------------

callback 이용한 고차함수

var aIndex="a".charCodeAt(0);
function buildString(n,callback){
var result="";
for(var i=0;i<n;i++){
result +=callback(i);
}
return result;
}

var alphabet=buildString(26,function(i){
return String.fromCharCode(aIndex+i);
});
var digit=buildString(10,function(i){
return i;
});
console.log(alphabet);
console.log(digit);

this 에 대한 심플예제1

-  this  의 범위를 이용하여 공유변수등을 만들때

obj 의 this 는 obj2,obj3 에서 사용될 때  호이스트 규칙에 의해 자신 을 포함하는 객체가 된다.

var obj={
hello:function(){
return "hi,"+this.username;
},
username:"hehe"
};
var obj2={
hello:obj.hello,
username:"taeho"
};
var obj3={
hello:obj.hello,
username:"yejin"
};
console.log(obj2.hello());
console.log(obj3.hello());

지연변수 스코프를 만들기위해 즉시 실행함수 표현식 사용법

반복문등에서 클로져를  이용하 여 지역변수를 참조하려할때, 클로저에서 변수값을 복사가 아닌 참조를 ㅎㅏ는 특성때 문에 반복 문의 마지막 변수만 참조하는 문제점이 있다.

--------------

function wrapElements(a){
var result=[];
for(var i=0,n=a.length;i<n;i++){
result[i]=function(){return a[i];};
}

}
var wrapped=wrapElements([10,20,30]);
var f=wrapped[0];
f();

이때,클로 져를  즉시실행함수로 감싸서  즉 시 실행함수에서  별도의 변 수 에 반복문의 반복 변수등을 복사저장한다음 클로져를 사용하면 된다.

function wrapElements(a){
var result=[];
for(var i=0,n=a.length;i<n;i++){
//즉시실행함수에서 i 값을 j 로 복제한다.
(function(j){
//result[i] 값이 객체로 온다는 것 주의
result[i]=function(){return a[j];};
})(i);

}
return result;

}
var wrapped=wrapElements([10,20,30]);
//리턴
var f=wrapped[1];
console.log(f());

클로저 심플예제

클로저는 외부 변수의 값을 복사하지 않고 참조한다.


1.자바스크립트는 현재함수의 외부에 있는 변수를 가져와서 사용할수도 있다.


----------------------------------------


function makeSandwich(){
var magicIngredient="peanut butter";
function make(filling){
return magicIngredient + "and "+ filling;
}
return make;
}
var f=makeSandwich();


console.log(f("hehe"));
console.log(f("jelly"));
console.log(f("bananas"));


--------------------------------------


2.함수는 외부함수가 무언가ㄴ를 리턴한 이후에도 외부함수에 선언도니 변수를 참조할수 있다. 즉 함수내의 변수를 지속적으로 고정,공유할수 있다.


function makeSandwich(magicIngredient){
return function (filling){
return magicIngredient + " and "+ filling;
}
return make;
}
var f=makeSandwich("ham");


console.log(f("hehe"));
console.log(f("jelly"));


-----------------------------------


3.클로져는 외부 변수의 값을 변경할수 있다.


function box(){
var val=undefined;
return {
set:function(newVal){ val=newVal;},
get:function(){return val;},
type:function(){return typeof val;}
}

}
var b=box();
b.type();
b.set("76.1");
console.log(b.get());
console.log(b.type());

2015년 1월 20일 화요일

안드로이드 오픈소스 프로젝트들.

https://github.com/Trinea/android-open-project/tree/master/English%20Version