반응형
Javascript 함수

I. 메소드로서의 함수
    - 함수를 객체 프로퍼티에 할당하면 메소드로서 함수를 사용할 수 있다.
    - 함수를 메소드로서가 아니라 함수로 호출했다면 this 키워드는 전역 객체를 가리킨다.
    - 메소드로 호출된 함수는 호출한 객체를 this 라는 키워드로 받을 수 있다.
      그러나, 메소드로 호출된 메소드 안에서 중첩된 함수를 호출하면 중첩된 함수 내부에서 this 키워드는
      전역 객체를 가리킨다.

          var calculator = {
                operand1: 1,
                operand2: 1,
                compute: function() {
                    this.result = this.operand1 + this.operand2;    // this 는 calculator 객체를 나타낸다.
                }
          }; 
          calculator.compute();

II. apply()와 call() 메소드
    - call() 과 apply() 메소드를 사용하면 함수가 마치 다른 어떤 객체의 메소드 인 것 처럼 호출 할 수 있다.
    - call() 과 apply() 메소드의 첫번째 전달인자는 함수가 소속되어 호출될 객체를 나타내면 이 전달인자는
      함수 몸체 안에서 this 키워드의 값이 된다.

      아래의 코드는 함수 f()에 두 숫자를 전달하고 이 함수를 마치 객체 object 의 메소드인 것처럼 호출한다.
          f.call(object, 1, 2);

          object.m = f;
          object.m(1, 2);
          delete object.m;

    - apply() 메소드는 함수로 건네줄 전달인자를 배열로 지정한다.
        f.apply(object, [1, 2]);

III. 클로저(closure)
    - 중첩된 함수를 사용하고 반환할 수 있으며, 이렇게 중첩된 함수들은 closure라 불린다.
      아래 코드에서 o 는 객체, f 는 함수를 의미한다.
        function bindMethod( o, f ) {
            return function() { return f.apply(o, arguments); }     // 리턴되는 중첩된 anonymous 함수가 closure가 된다.
        }
        var person = { hello: function(arg) { alert(arg); } };
        var sum = bindMethod(person, hello);
        sum("Hello World");            // person 객체의 hello 메소드를 호출한다.


        function bindArguments( f, ) {
            var boundArgs = arguments;
            return function() {                            // 추가적인 전달인자와 합쳐서 호출된다. 이것을 currying 이라 부른다.
                var args = [];
                for (var i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
                for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
                return f.apply(this, args);
            }
        }
 


 
반응형
Posted by seungkyua@gmail.com
,
반응형
I. 일반 객체의 프로퍼티 존재 확인하기
    1. in 연산자 사용
        - 프로퍼티 "x"가 존재하면 값에 상관없이 1을 저장
            if ( "x" in o ) o.x = 1; 

    2. undefined 로 비교
        - 프로퍼티 "x"가 존재하고 값이 undefined가 아니라면 1을 저장 
            if ( o.x !== undefined ) o.x = 1; 

    3. null 로 비교
        - 프로퍼티 "x" 가 존재하고 이 값이 null 이나 undefined가 아니라면 1을 저장
            if ( o.x ) o.x = 1;

II. constructor 생성자 프로퍼티
    1. 모든 객체는 생성자 함수인 constructor 프로퍼티를 가지고 있다.
         var d = new Date();        // Date 라는 constructor 프로퍼티로 Date 객체를 생성
         if ( d.constructor == Date )   // 결과 값은 true
         if (  (typeof d == "object") && (d.constructor == Date) ) // 결과 값은 true

    2. instanceof 연산자는 constructor 프로퍼티의 값을 사용한다.
         if (  (typeof d == "object") && (d instanceof Date) ) // 결과 값은 true

III. hasOwnProperty() 메소드
    1. 객체가 해당 프로퍼티를 가지고 있는지 검사한다.
        프로퍼티가 상속받은 것이 아니고 객체 안에 지역적으로 정의되어 존재한다면 true 아니면 false
         var o = {};
         o.hasOwnProperty("undef");        // false; 정의되지 않은 프로퍼티
         o.hasOwnProperty("toString");    // false; 상속받은 프로퍼티
         Math.hasOwnProperty("cos");     // true; Math 객체에 cos 프로퍼티가 존재

IV. 모든 객체의 조상인 Object 클래스에 존재하는 최상의 프로퍼티들
    1. constructor 프로퍼티
    2. toString() 메소드
    3. toLocaleString() 메소드
    4. valueOf()  메소드
    5. hasOwnProperty() 메소드
    6. propertyIsEnumerable() 메소드
    7. isPrototypeOf() 메소드

V. 배열 객체
    1. 배열의 길이
        - 배열의 길이는 length 프로퍼티로 알 수 있으며, 배열 안에서 가장 큰 인덱스 값보다 하나 더 큰 수 이다.
        - 배열의 원소들도 undefined 값을 가질 수 있는 특징을 생각하면 위의 문장이 이해가 갈 듯.
            var a = new Array();       // a.length == 0
            a = new Array(10);         // a.length == 10
            a = new Array(1, 2, 3);   // a.length == 3
            a = [4, 5];                        // a.length == 2
            a[5] = 1;                          // a.length == 6
            a[49] = 0;                        // a.length == 50
 
    2. 배열의 메소드
        - join() 메소드
            . 배열의 모든 원소를 문자열로 변환하고 이어 붙여서 반환한다.
                var a = [1, 2, 3];
                var s = a.join();      // s = "1,2,3"
                s = a.join(", ");       // s = "1, 2, 3"
 
        - reverse() 메소드
            . 배열 안의 원소 순서를 반대로 정렬하여 반환한다.
                var a = new Array(1,2,3);    // a[0]=1, a[1]=2, a[2]=3
                a.reverse();                           // a[0]=3, a[1]=2, a[2]=1

        - sort() 메소드
            . 배열 안의 원소들을 정렬하여 반환한다.
                var a = new Array("banana", "cherry", "apple");
                a.sort();           // a[0]="apple", a[1]="banana", a[2]="cherry"

            . 배열 안의 undefined 원소는 배열의 끝 부분으로 정렬된다.
            . 배열 안의 원소들이 문자열이 아니라면 비교를 위해 임시로 문자열로 변환 작업이 수반된다.
            . 비교 함수를 전달인자로 하여 정렬할 수 있다. 비교 함수는 전달인자를 두 개 받는데,
              첫번째 전달인자가 두번째보다 먼저 나타나야 한다면 비교 함수는 0보다 작은 숫자를 반환해야 한다.
                var a = [33, 4, 1111, 222];
                a.sort();                                                   // 알파벳순 : 1111, 222, 33, 4
                a.sort( function(a, b) { return a-b; } );    // 번호순 : 4, 33, 222, 1111

        - concat() 메소드
            . 배열의 모든 원소에 전달인자들을 모두 이어 붙인 새로운 배열을 리턴한다.
                var a = [1, 2, 3];
                a.concat(3, 4, 5);   // [1, 2, 3, 4, 5] 를 리턴한다.

        - slice() 메소드
            . 배열의 일부분을 리턴한다.
                var a = [1, 2, 3, 4, 5];
                a.slice(0, 3);         // 0 번째 부터 3번째는 제외하고 그 이전까지 리턴  [1, 2, 3]
                a.slice(3);             // 3 번째 부터 끝까지 리턴 [4, 5]
                a.slice(1, -1);        // -1 은 맨 마지막 원소를 가리킨다. [2, 3, 4]

        - splice() 메소드
            . 배열의 원소를 삭제하거나 삽입할 때 
               var a = [1, 2, 3, 4, 5, 6, 7, 8];
               a.splice(4);           // [5, 6, 7, 8]을 리턴한다. a = [1, 2, 3, 4]
               a.splice(1, 2);       // 1번째에서 2개수 만큼 잘라낸다.  [2, 3]을 리턴한다. a = [1, 4]

        - push() 메소드
            . 배열의 끝 부분에 이어 붙이고 새로운 길이를 리턴한다.
               var stack = [];
               stack.push(1, 2);      // stack: [1, 2]     길이 2를 리턴한다.

        - pop() 메소드
            . 배열의 마지막 원소를 제거하고 배열의 길이를 감소시킨 후 배열에서 제거한 원소를 리턴한다.
               stack.pop();              // stack: [1]          원소 2를 리턴한다.
               
        - unshift() 메소드
            . 배열의 맨 앞에 원소를 삽입한 후 배열의 새로운 길이를 리턴한다.
               var a = [];
               a.unshift(1);             // a: [1]         길이 1을 리턴한다.
               a.unshift(22);           // a: [22, 1]   길이 2를 리턴한다.

        - shift() 메소드
            . 배열의 첫 번째 원소를 제거한 후, 나머지 배열 원소들을 전부 앞으로 옮기고 제거한 원소를 리턴한다.
               a.shift();                   // a: [1]         원소 22를 반환한다.

       

 
반응형
Posted by seungkyua@gmail.com
,
반응형
1. delete 연산자
    - 객체 프로퍼티, 배열 원소, 암묵적인 전역 변수를 삭제할 수 있다.
    - 객체 프로퍼티 삭제는 프로퍼티만 삭제될 뿐 참조되고 있는 객체가 삭제되지 않는다.
       delete object.name;
    - var 로 정의된 변수는 삭제할 수 없다.

2. typeof 연산자
    - 숫자 : "number"
    - 문자열 : "string"
    - 불리언 : "boolean"
    - null : "object"
    - 객체 : "object"
    - 배열 : "object"
    - 함수 : "function"
    - 정의되지 않음 : "undefined"
    - Wrapper 클래스 (Number, String, Boolean) : "object"
    - Date, RegExp 클래스 : "object" 

3. void 연산자
    - 무조건 undefined 를 반환한다.
    - 함수에서 return; 문만 써서 반환 할 때의 값도 undefined 이다.
    - 브라우저에 평가된 값을 표시하지 않으면서 표현식을 평가하고자 할 때 사용한다.
       <a href="javascript:void window.open();"> Open New Window</a>

 
반응형
Posted by seungkyua@gmail.com
,
반응형
자바스크립트의 데이터 타입

I.  원시 데이터 타입 (3가지)
   1. 숫자 (number)
       - 0, -1 ... , NaN
       - Wrapper 클래스는 Number

   2. 문자열 (string)
       - "" 으로 표현
       - Wrapper 클래스는 String 

   3. 불리언 (boolean)
       - true, false
       - Wrapper 클래스는 Boolean

II. 단순 데이터 타입 (2가지)
   1. null
       - 불리언 : false,  숫자 : 0, 문자열 : "null" 로 변환된다.

   2. undefined
       - 선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나, 존재하지 않는 객체 프로퍼티에 접근할 경우
         반환되는  값이다.
       - 불리언 : false, 숫자 : NaN, 문자열 : "undefined" 로 변환된다.

   ※ 동등 연산자 (==) 을 사용하면 null 과 undefined 는 같은 값으로 간주한다.
       my.prop == null;
       이 비교는 my.prop 프로퍼티가 존재하지 않거나, 존재하기는 하지만 null 값인 경우 true로 평가된다.
       null 과 undefined 값을 구별할려면 일치 연산자 (===) 나 typeof 연산자를 사용하면 된다.

III. 객체 타입 (4가지)
   1. 일반 객체 (Object)
       - 생성방법 2가지 : new 연산자, 객체 리터럴
          . new  연산자
              var point = new Object();
              point.x = 1.2;
              point.y = 1.2;

          . 객체 리터럴
              var point = { x:1.2, y:1.2 };
             
              ※ 객체 리터럴 내에서 사용되는 프로퍼티는 상수, 변수, 자바스크립트 표현식 모두 사용할 수 있다.
                  객체 리터럴 내의 프로퍼티 이름으로 식별자 뿐만 아니라 문자열도 사용가능하다.
                  var square = { "upperLeft": { x:point.x, y:point.y },
                                       'lowerRight': { x:(point.x + side), y:(point.y + side) } };

   2. 배열 (Array)
       - 생성방법 2가지 : new Array() 연산자, 배열 리터럴
          . new Array() 연산자
              var array = new Array();
              array[0] = 1.2;
              array[1] = "Hello World";
              array[2] = true;
              array[3] = { x:1, y:3 };

          . 배열 리터럴
              var array = [ 1.2, "Hello World", true;, { x:1, y:3 } ];

              ※ 배열 리터럴 내 요소는 상수, 변수, 자바스크립트 표현식 모두 사용할 수 있다.
                  var i = 1;
                  var count = [ i, i+1, i+2; i+3 ];

   3. 함수 (function)
       - 함수는 사실 자체가 값이며 데이터의 타입은 아니다.
         그러므로 함수를 변수나 배열, 객체에 저장할 수 있으며 다른 함수의 전달인자로 넘겨줄 수 있다. 

       - 정의방법 2가지 : 일반 정의 문법, 함수 리터럴
          . 일반 정의 문법 : function 키워드 + 함수명 + (전달인자 혹은 매개변수)
             function square(x) {
                 return x * x;
             }

          . 함수 리터럴
             var square = function(x) { return x * x; }

       ※ 함수 리터럴은 자바스크립트 표현식 내에 나타낼 수 있다.

   4. 내장 객체 (Date, RegExp, Error)
       - Date 객체
          var now = new Data();
          var xmas = new Date(2011, 11, 25);  // 월은 0 부터 시작하므로 11 이 12월을 나타낸다. 

       - RegExp 객체
          . 정의방법 2가지 : new RegExp(), 정규 표현식 리터럴
             var re = new RegExp('+s', 'g');
             var re = /+s/g;

       - Error 객체
          . try ~ catch 로 런타임 에러를 받는다.      



반응형
Posted by seungkyua@gmail.com
,
반응형
JPA사용시 EJB QL 이나 Hibernate QL을 사용하지 않고 순수 Native SQL 을 사용할 때 객체로 매핑하고자 한다면
SqlResultSetMapping을 정의해야 한다.

Unknown SqlResultSetMapping 에러가 발생하면 해당 Entity 클래스가 제대로 디플로이 되지 않은 것이다.
정상적으로 디플로이된 Entity 클래스에 넣어야 한다.
또한 조회되는 sql 컬럼명은 모든 Entity field 로 매핑해줘야 한다.

아래 내용은 순서적으로  Query결과를 Entity 로 2개, column Scalar 로 1개를 받는 것에 대한 내용이다. 

@Entity

@Table(name = "EM_TEMPLOYEE_DATA")

@SqlResultSetMapping(name="GetEmpRelation"

    entities = {

        @EntityResult(entityClass = ep.emprelation.entity.EmpInfo.class, fields={

            @FieldResult(name="id", column="sourceEpId"),

            @FieldResult(name="name", column="sourceName"),

            @FieldResult(name="orgCode", column="sourceOrgCode"),

            @FieldResult(name="orgName", column="sourceOrgName"),

            @FieldResult(name="subOrgCode", column="sourceSubOrgCode"),

            @FieldResult(name="subOrgName", column="sourceSubOrgName"),

            @FieldResult(name="deptCode", column="sourceDeptCode"),

            @FieldResult(name="deptName", column="sourceDeptName"),

            @FieldResult(name="titleCode", column="sourceTitleCode"),

            @FieldResult(name="titleName", column="sourceTitleName"),

            @FieldResult(name="mail", column="sourceMail"),

            @FieldResult(name="nickName", column="sourceNickName"),

            @FieldResult(name="mobile", column="sourceMobile"),

            @FieldResult(name="picture", column="sourcePicture")

        }),

        @EntityResult(entityClass = ep.emprelation.entity.EmpInfo.class, fields={

            @FieldResult(name="id", column="targetEpId"),

            @FieldResult(name="name", column="targetName"),

            @FieldResult(name="orgCode", column="targetOrgCode"),

            @FieldResult(name="orgName", column="targetOrgName"),

            @FieldResult(name="subOrgCode", column="targetSubOrgCode"),

            @FieldResult(name="subOrgName", column="targetSubOrgName"),

            @FieldResult(name="deptCode", column="targetDeptCode"),

            @FieldResult(name="deptName", column="targetDeptName"),

            @FieldResult(name="titleCode", column="targetTitleCode"),

            @FieldResult(name="titleName", column="targetTitleName"),

            @FieldResult(name="mail", column="targetMail"),

            @FieldResult(name="nickName", column="targetNickName"),

            @FieldResult(name="mobile", column="targetMobile"),

            @FieldResult(name="picture", column="targetPicture")

        })

    },

    columns = {

@ColumnResult(name="point")

    }

)

public class EmpInfo {.......}



다음은 DAO에서 객체를 매팅으로 받을 때

public EmpRelation findRelationById(final String targetId) {

return (EmpRelation) this.getJpaTemplate().execute(new JpaCallback<Object>() {

   

    String sql = " select A.sourceEpID sourceEpId, A.targetEpId targetEpId, A.point point, " +

                "   B.name sourceName, B.orgCode sourceOrgCode, B.orgName sourceOrgName,  " +

                "   B.subOrgCode sourceSubOrgCode, B.subOrgName sourceSubOrgName,  " +

                "   B.deptCode sourceDeptCode, B.deptName sourceDeptName,  " +

                "   B.titleCode sourceTitleCode, B.titleName sourceTitleName,  " +

                "   B.mail sourceMail, B.nickName sourceNickName,  " +

                "   B.mobile sourceMobile, B.picture sourcePicture, " +

                "   C.name targetName, C.orgCode targetOrgCode, C.orgName targetOrgName, " +

                "   C.subOrgCode targetSubOrgCode, C.subOrgName targetSubOrgName,  " +

                "   C.deptCode targetDeptCode, C.deptName targetDeptName,  " +

                "   C.titleCode targetTitleCode, C.titleName targetTitleName, " +

                "   C.mail targetMail, C.nickName targetNickName,  " +

                "   C.mobile targetMobile, C.picture targetPicture " +

              " from EM_TRELATION A, EM_TEMPLOYEE_DATA B, " +

              "      EM_TEMPLOYEE_DATA C " +

            " where A.sourceEpId = B.epId " +

              "  and A.targetEpId = C.epId " +

              "  and A.targetEpId = ? " +

            " order by A.point desc " +

            " limit 0, 10;";

   

    @Override

    public Object doInJpa(EntityManager em) {

EmpRelation result = new EmpRelation();

try {

    Query query = em.createNativeQuery(sql, "GetEmpRelation");

    query.setParameter(1, targetId);

    List<Object> results = query.getResultList();

   

    Object[] resultSet = null;

    EmpInfo source = null;

    EmpInfo target = null;

    long point = 0L;

   

    for (int i=0; i<results.size(); i++) {

resultSet = (Object[]) results.get(i);

if (resultSet.length > 0) {

    source = (EmpInfo) resultSet[0];

    result.addSource(source);

}

if (resultSet.length > 1) {

    target = (EmpInfo) resultSet[1];

    result.setTarget(target);

}

if (resultSet.length > 2) {

    point = ((BigInteger) resultSet[2]).longValue();

    result.setPoint(point);

}

result.setRowCount(String.valueOf(i));

result.setSuccess("true");

    }

} catch (Exception e) {

    result.setSuccess("false");

    log.debug(e.getMessage());

}

return result;

    }

});

   

    }



SQL문을 사용할 때 주의할 점은 SqlResultSetMapping은 순차적인 파라미터 세팅을 써야한다.
파라미터 이름으로 세팅할려고 하면 에러가 난다.

이정도면 모든 에러가 나올 수 있는 가능성에 대해서는 다 설명한 듯



반응형
Posted by seungkyua@gmail.com
,
반응형
처음 회사에 들어와서  Java 프로그래밍을 배우겠지..
개발환경은 Eclipse.. 이 툴은 좀 어렵군.. 그래도 한 번 세팅하면 편해.
그러다 어느 정도 API 에 익숙해 지면 Thread 라는 것을 배울거야.
하지만 속으로 이렇게 생각하겠지. '이걸 어디다 써먹어? 먹지도 못하는 것.'
남들이 만들어 놓은 프로그램 유지보수를 하면서 JSP 라는 것을 배우지.
서버단은 Spring 으로 되어 있네? 그러면서 도메인은 EJB3를 쓰고.
원리도 모르고 왜 쓰는지도 모르겠지만 Spring 문법을 배우고 EJB3 문법도 배우자.
여기서 너희들은 제일 중요한 J2EE SPEC 중에서 Servlet SPEC을 놓치고 넘어가지.
이걸 운좋게 공부할려고 맘먹었으면 6개월은 더 고생해야 돼.
공부하면서 Tomcat과 같은 Servlet Engine의 ClassLoader와 쓰레드의 원리를 알게되지.

1~2년 지나면 Spring 을 쓰다가 알게되는 Design Pattern을 보겠지.
아.. 이런게 있구나.. 하지만 백날 배워봤자 어디다가 응용해야 할지 모르지. 
사실 Design Pattern은 일부를 제외하고 클라이언트 프로그램에 더 잘 맞거든.

어느날 프로그램을 개선하다고 이전의 프로그램이 개판이라는 것을 알게 되지.
그 때 선배가 이야기하는거야. 프로그램을 고칠려면 Refactoring을 해야한다.
Refactoring을 할 때 제일 중요한 것은 안전성.. 그러면서 자연스럽게 Unit Test 를 배우지.
축하해.. 여기까지 공부했으면 이제 한 5년은 지났을 거야.

이제 2갈래로 나눠져야 돼.. 내가 웹 프로그래머로 살지.. 아니면 서버 프로그래머로 살지.
서버 프로그래머로 살려면 네트웍 프로그램을 알아야지..
오픈 소스를 검색하면 MINA가 나올거야. 하지만 Netty가 그 이후 버전이라는거.
기존에 공부한 Design Pattern 덕에 그나마 소스 분석은 가능하지.
Netty 는 JBOSS 커뮤니티에 속해서 Memcached 나 Infinispan 같은 서버 캐시도 관심을 갖게 되겠지.
그러다 어느날 다시 NoSQL 이라는 것을 만날거야.
축하해.. 그럼 요즘 화두가 되고 있는 Clound Computing을 만난거야.
Hadoop 도 있고 HBase도 있고. Thrift, Hive zooKeeper 등등을 만나지..
2억 5천명이 사용하고 있는 FaceBook의 서버 구조도 같다는 것을 만나게 되고. 

또 5년이 흘렀군.. 다행스러운 것은 Clound Computing은 현재라는 거야.
불행한 것은 지금 이글을 보고 있는 초보 개발자는 10년이 지나야 현재의 내 말을 이해한다는 거지.

웹 프로그래머로 살고 싶다고?
그럼 이제는 도메인 모델링이 궁금해 질거야.. 앞에서 공부한 EJB3지.
원리는 뭘까? 궁금하지? 그렇담 마틴파울러가 쓴 Enterprise Application Architecture Pattern이란 책을봐.
6개월을 꾸준히 공부해도 완벽하게 이해 못할테지만.

웹 프로젝트를 하다보면 고객이 이러지.. "내가 말한 시스템이랑 틀린데? 왜 이렇게 만들었어요?"
아.. 절망.. 도대체 고객이 요구하는 게 뭐야?
그걸 뭘 고민해? 먼저 조금씩 만들고 시스템을 자주 보여주면서 그 때 그 때 원하는 것을
수정해서 만들어 가면 되지. Extreme Programming 이라는 것이 그런거야.. 
근데.. 프로젝트를 자주 통합하라네? 어떻게 하지?
우선 소스를 관리해야지..뭐가 좋을까?
Subversion 으로 소스를 관리해. 컴파일은? Ant 나 Maven으로 해야지..
 옛날에 배운 Unit Test 를 써서 프로젝트를 해야지..

어느날 오픈한 시스템이 다운되지. 사용자가 많아서.. 이걸 어째?
Infra 영역인 L4, HA, Clustering 을 공부해야 할거야. 이건 기본이거든.
Queue도 배워야 하고.
아.. 쓰기도 힘들다..

불쌍하다. 후배들아.. 그렇게 공부하고도 아직도 월급과 대우는 그정도라니..
반응형
Posted by seungkyua@gmail.com
,
반응형
조선일보 위클리 비즈에 나온 파라슈라만(A. Parasuraman) 미국 마이애미대 석좌교수가 말하는 기업은 서비스에 투자하는데도 고객 만족도가 높지 않은 4가지 이유..

1. 시장 정보의 격차 (market information gap)
    - 고객과 경영진의 생각이 다른 경우
    - 고객이 정확히 무엇을 요구하는지 모르는 경우
    - 조그마한 간편한 서비스를 제공하는 것보다 근본적인것을 제공해야 하는 원리

2. 서비스 표준 격차 (service standard gap)
    - 경영진 생각과 업무지침이 다른 경우
    - 고객의 정확한 요구를 알고 있으나 요청이 다양하든지 해결할 수 없다고 생각하여 다른 서비스를 하는 경우

3. 서비스 실행 격차 (sercie performance gap)
    - 직원이 지침대로 하지 않는 경우
    - 좋은 매뉴얼과 프로세스 방법론이 있다 하더라고 그에 대한 인센티브가 없어 직원들은 굳이 지키지 않는다.

4. 내부 커뮤니케이션 격차 (internal communication gap)
    - 각 부서의 말이 서로 다를 때
    - 우리 시스템은 any os, any browser 에서도 제공된다고 하나 사실은 모든 os 는 아닌 경우
       영업은 그렇게 다 된다고 홍보하고 실제 개발팀은 제약사항이 있다는 것을 영업이 홍보하는 줄 안다.

정말 대단한 분석가.. ^^ 
반응형
Posted by seungkyua@gmail.com
,
반응형
3D 애니메이션 제작 과정

1. 트리트먼트 (treatment) : 기획안 제작, 아이디어 회의를 거쳐 캐릭터, 배경, 줄거리를 만든다.
2. 스토리보드 (story board) : 각본을 만들고 스토리 아티스트 (story artist)들이 이를 그림으로 표현한다.
3. 캐릭터 완성 : 캐릭터 디자이너가 캐릭터를 만든다.
4. 3D 모델 완성 : 모델러 (modeler)가 캐릭터를 3차원으로 만든다.
5. 움직임 프로그램 제작 : 리거 (rigger) 기술자가 뼈와 관절을 만들어 자연스럽게 움직을 수 있는
                                    컴퓨터 프로그램을 만든다.
6. 화면의 구도와 배경 완성 : 레이아웃 아티스트 (layout artist) 들이 화면의 구도와 배경을 만든다.
7. 캐릭터의 움직임을 표현 : 애니메이터 (animator)가 컴퓨터 프로그램을 이용하여 캐릭터의 움직임을 표현한다.
8. 목소리 및 빛, 그림자 입히기 : 성우는 목소리를, 라이터 (lighter)는 화면 속 사물에 빛과 그림자를 입힌다.

유니티로 개발하려면 캐릭터 디자이너와 3D 모델러가 필요하군요..
반응형
Posted by seungkyua@gmail.com
,
반응형
Java NIO의 ByteBuffer 는 mark, postion, limit, capacity로 구성이 됩니다.

buffer.clear() : position = 0, limit = capacity, mark = -1 로 세팅
inputChannel.read(buffer) : channel로 부터 읽어들어 buffer 에 넣는다. position 위치는 read 한 만큼 옮겨진다.
buffer.flip() : limit = position, position = 0, mark = -1 로 한다. 
outputChannel.write(buffer); buffer의 position 부터 limit 까지 읽어서 channel에 쓴다. 

반면에 Netty의 ChannelBuffer 는  readerIndex, writerIndex, capacity로 구성

channelBuffer.clear() : readerIndex = 0, writerIndex = 0 으로 세팅
channelBuffer.write(...) : buffer에 내용을 쓴다. writerIndex 의 값이 쓴 크기만큼 증가
channel.write(channelBuffer) : buffer의 readerIndex 부터 writerIndex 까지 읽어서 channel에 쓴다.

channelBuffer.readable() 이 true 라는 의미는 writerIndex - readerIndex > 0 으로 버퍼에 더 읽을 내용이 있다는  의미

반응형
Posted by seungkyua@gmail.com
,
반응형
macport 로 설치된 소프트웨어는 주로 /usr/share 에 설치됩니다.

maven 은 /usr/share/maven 이 설치 디렉토리입니다. 
반응형
Posted by seungkyua@gmail.com
,