2016년 2월 20일 토요일

후크(hook) 란?

추상클래스에 들어있는 아무 일도하지 않거나 기본 행동을 정의하는 메소드로, 서브클래스에서 오브라이드 할 수 있다.


public abstract class abcls{
      public action(){

      }
      public deafult_action(){
   
      }
}

public class concls extends abcls{
   
      @override
      public deafult_action(){
   
      }

}

2016년 2월 19일 금요일

chrome(크롬)에서 ES6(harmony) 사용하기

1.
크롬 url창에
chrome://flags/#enable-javascript-harmony
입력


2. [사용버튼] 클릭-> 그러면 사용중지로 바뀜(사용되는상태), 재시작 하라고 뜸


2016년 2월 18일 목요일

시멘틱 웹(semantic web)

네이트가 이용한 (시맨틱) 기술은 전산학에서 꽤 오래된 분야로서 텍스트 분석, 자연어 처리, 기계 학습과 같은 분야는 인공 지능 분야에서 시맨틱 기술

시맨틱 웹은 웹을 데이터 단위로 구조화 시켜상호 관계성을 파악하려는 시도 즉, 웹을 데이터베이스화 혹은 지식 기반으로 만들고 이를 기반으로 추론을 목표로 한다

LinkedData라고 불리는 이름으로 RDF 기반으로 데이터 웹을 구조화 시키거나 RDFa나 마이크로포맷 같은 방식으로 HTML 의미 마크업을 시도하고 있는 것이다. 




온톨로지란 특정 도메인(domain) 내에서 공유되는 데이터를 개념화한 형식적이고 명백한 규정이다. 이는 특정 분야에서 사용되는 표준 어휘들의 모음이라고 할 수 있으며, RDF와 OWL은 이런 온톨로지를 표현하는 언어다. 따라서 온톨로지 언어가 시맨틱 웹의 중심이 된다고는 할 수 있으나, 이를 웹과 접목시키는 일이 더 중요

온톨리지
웹에 있는 자원에 관한 메타 정보를 표현하기 위한 언어. RW3C의 가장 기본적 시맨틱 웹 언어로서 웹 자원을 표현하는데 기본이 되는 제목, 저자, 최종 수정일, 저작권과 같은 웹 문서에 관한 메타 데이터를 XML을 기반으로 매우 간단하게 표현한다. 기본적으로 주어, 동사, 목적어에 해당하는 것을 URI를 써서 대상들을 문장으로 구성하거나 노드와 화살표를 써서 도식적으로 표현하기도 한다.

RDF

웹에 있는 자원에 관한 메타 정보를 표현하기 위한 언어. RW3C의 가장 기본적 시맨틱 웹 언어로서 웹 자원을 표현하는데 기본이 되는 제목, 저자, 최종 수정일, 저작권과 같은 웹 문서에 관한 메타 데이터를 XML을 기반으로 매우 간단하게 표현한다. 기본적으로 주어, 동사, 목적어에 해당하는 것을 URI를 써서 대상들을 문장으로 구성하거나 노드와 화살표를 써서 도식적으로 표현하기도 한다.


한 사이트, domain을 테이블 정도로 생각하고 거대한 웹을 데이터 베이스로 생각하는
각 사이트 안에 태그 등 정보를 메타데이터화 시키는 것

검색엔진에서 페이지들을 분석할때 검색어에 맞는 단어 매칭과 같은 단순한 string search만이 아닌 데이터베이스 처럼 활용 가능하게 한 것.

다음은 SPARQL의 사용 예다.

 SELECT DISTINCT ?name ?home ?orgRole ?orgName ?orgHome
FROM <http://www.w3.org/People/Ivan/>
FROM <http://www.w3.org/Member/Mail/>
WHERE {
?foafPerson  foaf:mbox ?mail;
             foaf:homepage ?home.
}


시맨틱 웹의 본질은 시맨틱 처리
시맨틱 웹의 본질적인 변화는 없다. 다만, 지금까지 시맨틱 웹에 대해 대다수의 사람들이 인식하고 있는 것은 온톨로지였으며, 이와 관련한 기술 개발이 중심이 된 것은 사실이다. 하지만 더 중요한 것은 웹에서의 시맨틱 처리가 가능해야만 본질적인 시맨틱 웹이 가능해질 수 있다는 것이다. 이를 위한 노력이 W3C에서 진행 중이며, 실생활에서도 이와 같은 시맨틱 웹이 이용될 수 있다.
결론적으로, 국제적으로는 XHTML이 단순한 문서를 위한 웹페이지로서 이용되는 것이 아니라, 기계적 처리가 가능한 데이터 집합소로서의 역할도 수행하며, 데이터 통합의 주요 수단으로 이용될 수 있다. 또한 웹페이지에서 쉽고 편리한 방법으로 데이터를 교환하고 재사용할 수 있는 방법에 대한 연구도 진행되고 있음로, 국내 기술 개발도 이런 부분을 간과해서는 안될 것이다.



http://m.blog.naver.com/jeonghj66/140038064614


2016년 2월 17일 수요일

builder 패턴

기본 구성
director : 무엇을 빌딩하는지 정확히 못한채 객체를 빌드
builder : director 가 생성을 수행하기 위해 사용하는 인터페이스
concrete builder :director의 지시에 따라 product를 실제로 빌딩한다 보통 외부에서(client에 의해) 혹은 abstract factory에 의해 생성된다.
product : director의 지시하에 builder가 빌딩하는 객체



<!doctype html>
<html lang="en">
 <head>
  <title>builder pattern</title>
 </head>
 <body>
  <script>
 var director = function(product){  //무엇을 빌딩하는지 정확히 알지 못한채 빌딩
  product.concrete_builder_action1() //director의 지시에 따라 product를 빌딩된다;
  product.concrete_builder_action2()
  product.concrete_builder_action3()
 }

 function Builder(){  //공통 인터페이스 
  var common_value1 = this.common_value1 = 1; 
  var common_value2 = this.common_value2 = 2; 
  var common_value3 = this.common_value3 = 3; 

  this.concrete_builder_interface1 = function(){ //구현 인터페이스 
   this.concrete_builder_action1 = function(){
    console.log("interface1:"+common_value1);
   }
   this.concrete_builder_action2 = function(){
    console.log("interface1:"+common_value2);
   }
   this.concrete_builder_action3 = function(){
    console.log("interface1:"+common_value3);
   }
  };

  this.concrete_builder_interface2 = function(){
   this.concrete_builder_action1 = function(){
    console.log("interface2:"+common_value1);
   }
   this.concrete_builder_action2 = function(){
    console.log("interface2:"+common_value2);
   }
   this.concrete_builder_action3 = function(){
    console.log("interface2:"+common_value3);
   }
  }
  
 }

  var build = (new Builder);  //공통 인테페이스 생성 
  var concrete_build1 =  new build.concrete_builder_interface1;  //구현 인터페이스 생성
  var concrete_build2 =  new build.concrete_builder_interface2;
 
  var product1 = function(){
   director(concrete_build1);
  };

  var product2 = function(){
   director(concrete_build2);
  };
 
 product1();
 product2();

  </script>
 </body>
</html>

2016년 2월 16일 화요일

심버(semver) 에 대한 설명

유의미적인 버전 붙이기(semantic versioning), 짧게 줄여 심버(semver)다. 
새로운 버전의 소프트웨어를 옮길때 명시
버전 번호는 MAJOR.MINOR.PATCH 형태, 정수 integer로 표시
major번호가 변경되는 것은 하위호환성이 깨진다는 것을 의미

2016년 2월 13일 토요일

[책]소프트웨어 작동법 - 검색

원하는 데이터를 찾아내는 기술 - 검색

데이터를 모아둔 것 - 데이터 집합(data collection)
각 집합에 있는 개별 데이터 - 레코드(record)
하나의 레코드는 key에 의해 구분됨

검색

순차검색 - 순서없이 정렬되어 있음, 처음부터 모두 검색
소트(sort) - 데이터 집합을 특정 순서대로 정렬하는 것

선택소트 (selection sort)
1. 가장 작은 값 가져옴
2. 그다음 가장 작은 값 가져옴

퀵소트(quick sort)
* 피봇(pivot) : 목록 중 특정숫자
- 계산량과 처리속도를 줄인것
- 목록중 아무거나 하나 집고 그것을 기준으로 높은것과 낮은거 정렬
[2,10,1,3,7] ->(피봇:3) ->[ 2,1,3,10,7]->
3 을 기준으로 서브목록 1(2,1) 서브목록2(10,7) 생김
->서브목록1 피봇1->[[1,2],3,10,7]-> 서브목록2 피봇10 ->[[1,2],3,[7,10]]-> 정렬 완료

@ 피봇이 이렇게 가운데면 참 좋은데 한쪽으로 쏠리면 과도하게 많이 걸릴수도 있음
@ 일반적으로 레코드 수가 커질수록 퀵소트가 선택소트보다 성능이 좋음

이진검색 (binary search)
여기서 이진이란 (binary)를 뜻하는 것이 아니고 두개중 하나를 뜻한다.
* 찾고자 하는 데이터 48이라는 키를 갖고 있음
* 집합은 정렬되어 있다 가정함
1. 가운데 있는 레코드를 본다 (62) 9개 남음 [1,,,,62]
2. 가운데 있는 레코드를 본다 (23) 5개 남음 [23,,,62]
3. 가운데 있는 레코드를 본다 (47) 3개 남음 [47,48,62]
4. 가운데 있는 레코드를 본다 (48) 이때 48이 아닐경우 값이 없다 리턴

인덱싱
레코드는 실제 어딘가에 존재(메모리 혹은 하드디스크)

고정길이(fixed-size)방식
- 저장공간 낭비가 발생됨
- 성능상(검색 속도) 이득
-> 고정주소일 경우 특정 레코드의 주소를 찾기 쉽다
(길이가 20이고 주소가 1000부터 시작한다 하면 1000->1020->1040의 형태로 찾을수 있다)

가변길이(variable-size)방식
- 데이터의 길이에 맞춰 저장하는 방식
-> 검색할 경우 고정길이가 아니면 모든 레코드를 세는 수 밖에 없음

* 윈도우의 32, 64는 메인메모리 주소크기 (고정길이)

ex> 4개의 음악이 있다고 치면 실제 데이터 파일은 하드디스크에 저장 하고
한개의 제목과 실제 데이터 파일의 주소 값을 가진 키값을 고정길이 형태로 메모리에 저장


인덱스는 레코드 키와 주소로 구성된 테이블(목록)

슬롯(slot)
- 레코드 저장 위치

해싱
해시함수(hash function)를 통해 slot / 노래제목 / 데이터주소 형태로 저장
- 장점: 일일이 검색하지 않아도 해시 함수를 통해 한번에 접근 할 수 있음
- 단점 :  해시 키값이 중복, 즉 충돌이 발생
충돌 발생 시..
1. 다음슬롯에 채움
-> 그럼 해시 검색시 찾는것이 없으면 다음거부터 순차검색.. 다음 자리가 비어있으면
먼 슬롯까지 순차 검색을 하게 될것이고 굉장한 비효율 발생
2. 슬롯을 삭제 할경우 다음 슬롯에 저장된 것은 찾을수 없음
-> 해당 슬롯에 데이터 주소와 슬롯을 제외한 값은 비워둠(묘석)
==> 이러한 이유로 정기적으로 재해시를 해야됨, 그리고 중복이 발생하지 않도록 해시 알고리즘 중요

웹검색
- 구글의 인덱스 크기는 100페타바이트 == 1억기가 바이트

검색엔진은 로봇(robot)이라는 것을 사용한다.
- 사람의 간섭 없이 자동으로 인덱스를 만들어내는 프로그램

순위결과
- 인바운드 링크 : 외부홈페이지에서 내 홈페이지 페이지로 링크들.
이 인바운드 링크를 통해 순위를 매김

링크파밍(link farming)
- 이러한 인바운드 링크를 무료 호스트나 버려진 웹 사이트에 특정사이트 링크를 걸어인바운드 링크수를 고의적으로 늘리는 작업




2016년 2월 12일 금요일

커맨드 패턴 (command pattern)


커맨드 패턴(Command pattern)이란 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴이다. 

어떠한 행동에 대한 정의 들을 제어 할때 사용하면 좋다 .

- 명령(command), 수신자(receiver), 발동자(invoker), 클라이언트(client)의 네개의 용어가 항상 따른다.
-  요청과 수행을 분리시켜 느슨한 결합을 유지한다.

- 일련의 행동을 특정 Receiver하고 연결을 통해 캡슐화하고 execute()라는 메소드 하나만 외부에 공개한다.


장점
- 요청부분과 요청실행부분을 분리(낮은 결합도, 독립적 변경 가능)
- 실행취소, 보관, 로그 생성 가능

* 전략패턴(strategy pattern)과 비슷하지만 커맨드 패턴은 전달받은 객체가 하는 일에 대해 정확히 알지 못한다.

 - wiki 참조 -

// 자바스크립트로 구현 
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
 </head>
 <body>
  <script>
 // 커맨드 패턴
 // 리모컨 만들기
 // 1. 리시버에서 해당 기능 구현 
 // 2. command 에 interface 생성 
 // 3. command에 recevier에서 받은 객체를 실행하는 동작에 대해 execute에 정의
 // 4. invoker 에서 setcommand 명령에 대해 저장하는 처리
 // 5. invoker에 목적에 맞는 custom메서드를 생성 (ex> 리모컨켜기, 리모컨 끄기 등)

  function r(msg){
   return function(){
    document.body.innerHTML += (msg+"<br />");
   }
  }

  var client, recevier, invoker, command;
 
  function Light(){}  //recevier
  Light.prototype = {
   "on" : r("on"),
   "off" : r("off")
  };
  //(new Light).on();

  function lightOnCommand(receiver_obj){  //command
   this.execute = function(){
    receiver_obj.on();
   };
   this.undo = function(){
    receiver_obj.off();
   };
  }

  function lightOffCommand(receiver_obj){  //command
   this.execute = function(){
    receiver_obj.off();
   };
   this.undo = function(){
    receiver_obj.on();
   };
  }

  function RemoteControl(){    //invoker
   this.setCommand = function(cmd){
    this.obj = cmd;
   }
   this.press = function(){
    this.obj.execute();
    this.undocommand = this.obj;
   }
   this.undo = function(){
    this.undocommand.undo();
   }
  }


  client = function(){
   var light =  new Light;
   var lightOn = new lightOnCommand(light);
   var lightOff = new lightOffCommand(light);
   var remoteControl = new RemoteControl;
    remoteControl.setCommand(lightOn);
    remoteControl.press();
    remoteControl.undo();

    remoteControl.setCommand(lightOff);
    remoteControl.press();
    remoteControl.undo();

  }();

  </script>
 </body>
</html>