spring boot로 Web Project생성하기.


1. https://start.spring.io/  에 접속해서  maven/gradle을 선택하고 이름만 넣으면  springboot프로젝트를 생성할 수 있다.  

   => 일반 application이 생성된다.


  1.1  IDEA나 eclipse에서 import project를 해서 열어서 Run만 시키면 돌아간다. (아래과 같이 spring을 볼수 있다)

    .   ____          _            __ _ _

 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )

  '  |____| .__|_| |_|_| |_\__, | / / / /

 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::        (v1.5.9.RELEASE)



2. Build.gradle을 열어서  아래 한줄을 추가한다.   (JDK1.8기준)


compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.4.7.RELEASE'
(version: '1.4.7.RELEASE')

 

   ==> 자동으로 Web Application이 된다. 실행도 되고 localhost:8080 접속도 된다.


3.  jsp처리기능이 아직없으므로 이를 위해 2개 더 추가한다. (REF1, ) 

    

compile group: 'javax.servlet', name: 'jstl', version: '1.2'
compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.5.24'
compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '8.5.24'

   

     (그리고, resources밑에 있는 application.property에  아래 4번 경로와 suffix를 추가한다)

     


spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp



4.  src/main  밑에  /webapp/views  밑에    jsp생성  (REF2-jsp) 

     
  jsp첫줄에는 아래 한줄이 필요하고..

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

 그 후 <html> tag야 있으면 좋고..





별첨: 간단한 Junit4 Test코드.... + RestTemplate는 여기 참조:   REF

         Lombok사용시 - 설정에서 컴파일러 옵션 중 Annotation Process 체크필요.

Posted by yongary
,

MVC개념

springBoot gradle 2017. 12. 29. 21:56

      USER가 url을 요청한다던지 하는 action을 하면, controller가 받아서 

     Model을 조회/변경하고 그걸 다시
     View에서 그려준다.  


    3가지가 분리되어서 업무분리 개발분리가 가능해진다. 

Posted by yongary
,

1. 해시캐시 (HashCache)

   - 해시함수를 fn(X) = Y 로 표현한다면, X는 입력값 Y는 출력값이다.
     이 중에서 이쁜 Y를 만들기 위해 X를 바꿔가며 입력할 수 있는데, 
     이쁜 Y를 만든 X를 HashCache라고 부를 수 있다.
    

     그런데 X에는 자동으로 고정되는 값이 몇개 포함되어 있어야 하고, 
     사용자가 임의로 설정할 수 있는 값도 있어야 한다.

     즉, 수신자의 메일주소와 같이 바꿀 수 없는 값 + 사용자가 임의설정 가능한 카운터 = X로 했을때
     이쁜 Y를 만들 수 있는 X를  HashCache라고 부를 수 있다.


     (해시캐시의 개념은 스팸메일 필터링에서 나온 개념이므로 수신자의 메일주소를 주로 포함한다.

     90년대 국제표준에서는 Y의 앞자리20자리가 0이 되는 X값을 해쉬캐시로 정했었다.)



2. Nonce
   - 위 예제에서 사용자가 설정한 임의의 카운터를 Nonce라고 부를수 있다.  나머지 고정된 값들을 제외한 사용자가 

      고생을 해서 산출해야 하는 값이다.

   - 이쁜 Y라고 부르는 이유는, Y값의 범위를 정하거나 모양등을 정하므로서, 알고리듬의 복잡도가 탄생한다. 

      즉, Y값을 000000000xxxxxxx 이런식으로 고정한다면, 이를 위해서 사용자는 nonce를 여러번 생성해봐야지 적당한 nonce를 구할 수 있다.

   - 비트코인에서는 총32Byte(256bit) 중,  앞자리 40 bit가 0이어야 한다.



이러한 해시캐시(Nonce포함)개념으로 하나의 블록을 생성한다. 


3. 블록체인

  - 앞에서 설명한 하나의 블록을 여러개 연결한게 블록체인이다.

  - 연결방식은 뉴블록 = 직전블록의 Hash값 +  뉴데이타 + 뉴Nonce 이다.   

   - 뉴뉴블록 = 뉴블록 Hash값 + 뉴뉴data + 뉴뉴nonce로  항상 직전 Hash값만 포함한다.

     이것만으로도 이전의 모든 블록들을 마치 다 포함하는 것처럼, 앞 선 모든 블록들을 아무도 고치지 못하는 효과가 생긴다. 


 

  




Posted by yongary
,

이더리움

블록체인 2017. 12. 26. 11:57

비트코인 다음으로 인기가 많은 이더리움에선 다음과 같은 용어들이 사용된다.


Wei:   1ETH = 1000 0000 00 GWei. (1Gwei:0.001원 정도,  만개쓰면 10원.  1ETH가 100만원일 때)

          1 Ether = 1000000000000000000 Wei 


GasPrice: cost of computation - 계산비용으로서 모든 operation에 대한 계산비용이 trasaction originator에게 지불이 된다.

           :  Gas is a unit of measurement for computational steps. Every transaction is required to 

            include a gas limit and a fee  that it is willing to pay per gas (that is, pay per computation) 


GHOST (Greedy Heaviest Observed Subtree) - 기존 longest chain대비 heaviest chain개념을 도입하여

                   이를 기준으로 가장 계산이 많이 사용된 chain을 결정한다. 




SmartContract:  code is law라는 슬로건아래 코드에 적히면 모두 계약이 된다.


Solidity:  smartContract를 가능하게 하는 튜링완전성을 지닌 script언어 - REF



Bootstrap node:

mainnet vs testnet:  mainnet이 주 network이고 testnet은 개발용.

Whisper & Swarm : 분산 프로토콜 & 분산 디스크.



Geth (Go-Ethereum) :  brew tap ethereum/ethereum ->  brew install ethereum

JSON-RPC : https://github.com/ethereum/g o-ethereum/wiki/JavaScript-Console


 


Mist: 이더리움 client


casper: POS(proof-of-stake) 의 단점을 보완하는 프로토콜. 
            POS는 컴퓨팅파워가 아니라 지분에 비례한 확률로 next block이 선정된다.

           이더리움이 현재는 POW방식이지만 2018년 중에 POS로 바뀔 예정.


dApp: 

         개발환경을 SPA로 해서 웹기반으로 하는 경우가 많은데
        Meteor.js를  사용하기 좋다고 한다.  Meteor REF

        필자는 react.js + springBoot로 해볼 예정.

        


faucet:


truffle contract: 




parity + Aura protocol:  POA(Authority)를 지원하므로 private형태나 은행협의체 형태의 blockchain을 개발하고자 할때 유용하다.


Posted by yongary
,


kibana에서 


search 구문 예제: 

text:java AND NOT(text:hiring) AND users.some_count[500 to *] 

timelion 구문: ref

.es(q=(text:java)).divide(.es(q=(text:kotlin)).multiply(100)





========================만들기 =============================

REF- 웹강의 와 sample소스가 있음.   REF-개요페이지


      강의내용중 URL :  plugin 개발-UI Exports 



js로 

1. visController  class 를 만든다. (ES6 js일듯)

  - constructor

  - render

  - destory 함수가 있는데..   예제에선 text만 뿌리는 수준이다.


2. visualization class를 만든다.

  


To follow along during the webinar:

  • Set up your Kibana development environment (preferably the master branch)
  • Use sample code from the webinar to create your own visualizations
  • Reference Contributing to Kibana Github repo for any issues

Related Resources: 



멋진 그림을 그릴 수 있으려나...  스터디 중.



Posted by yongary
,

 elastic 을 설치한 후,  curl로 test를 하는게 약간 귀찮게 느껴 진다면


Sense 에디터를 이용해서 test하는 게 편하다.  (PUT data.json을 바로 이용하는 느낌으로 사용)

Sense는 Kibana의 일부(plugin) 이기 때문에 kibana설치 후 사용이 가능하다. REF


  ==> 요즘은 (5.x부터)  Kibana만 설치하면  Dev Tools메뉴에서 바로 사용 가능.

  

 query명령어는 여기를 참조해서 공부한다.  REF(elastic 영문사이트)





그리고 참,  혹시 elasticsearch에 data가 없다면  이 sample data를 이용한다. REF





Posted by yongary
,

Java Rest Client

ElasticSearch 2017. 12. 15. 17:40

ElasticSearch용 java client를 구현하는 방법은 여러가지가 있다.


app으로 REST를 구현해도 되고

jest를 이용하거나

spring-data-elasticsearch  를 이용해도 된다.



spring 이용해서 간단하게 해보고 싶으면 여기추천:  REF





하지만, 일단은 공식 java client를 먼저 검토추천 한다고 하는데..(개인적으론 아직 익숙치 않아서인지 불편해 보인다) 

(node간 통신시 binary포맷으로 바꾸어야할 필요성도 있다고 하는데? 그래서 공식 client가 좋은건가? 싶은데 검토필요)


공신 client 사이트는 : REF  javadoc


사용법은 

Map<String, String> params = Collections.emptyMap();
String jsonString = "{" +
            "\"user\":\"kimchy\"," +
            "\"postDate\":\"2013-01-30\"," +
            "\"message\":\"trying out Elasticsearch\"" +
        "}";
HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON);
Response response = restClient.performRequest("PUT", "/posts/doc/1", params, entity); 



이 예제   elastic core 를 이용하고 있군요.. javadoc

Posted by yongary
,

Aggregation

ElasticSearch 2017. 12. 15. 17:11



REF (한글개념)   REF(영문 aggregation)   


Elastic에서 복잡한 검색은 mongoDB에서처럼 aggregation이란 용어를 사용해서 수행한다.



- Metric Aggregation: 산술식 

    : script Aggregation:   map & reduce방식으로 script를 이용해 동작할 수 있다. ref

    : Cardinality Aggregation:   distinct count 느낌.  ref (cardinal=기수, 즉 1234에서 10진수 기수는 4개)



- Bucket Aggregation: 그루핑
   : filter Aggregation:  group by느낌이고  where절을 filter에서 거는 느낌으로 사용한다. ref

    


- Matrix  :  멀티Field.    단, scripting은 미지원.


- Pipeline   : aggregation + aggregation





Posted by yongary
,

블록체인

블록체인 2017. 12. 13. 21:27

블록체인 개념을 잡기 좋은 2가지 글.



1. Proof of Work개념도 : REF

  - 비트코인에서 처음으로 쓰인 용어로서, 거래의 시작(비트코인에서는 mine 채굴완성)을

    검증하기 위해 여러개의 core 클라이언트 노드에서 인증을 하는 프로세스를 의미.

   


2. Java소스로 설명: REF





비트코인 Node: P2P 네트워크를 이용하는데, 노드들은 2가지 종류가 있다.

  1. Full Node : Wallet, network라우팅 외에, mining기능, full blockChain저장 기능. 

  2. SPV node: Wallet기능과 network라우팅 기능만 수행.


코어node 스타트시: 
               ( 비트코인 core 클라이언트에 하드코딩되고, 비트코인 community멤버에 의해유지되는 DNS seeds를)
                  DNS 쿼리를 통해,  모든 core peer들을 찾는다.  




3. Conflict 해결 방법:

    80번 block이 최신버전인 상태에서,  동시에 약 3개의 81번 block이 peer들에서 생성이 된 경우, 어떤 로직으로 진짜 81을 선택하는가?


    비트코인에서는 Longest Chain Rule을 적용한다.

      - 81a, 81b, 81c 3개가 비슷한 시점에 들어왔다면 
      - 그 다음 82가 먼저 들어오는 block 즉 내가 81a+82a를 만들기전에  81b+82b를 본다면 82b를 채택해서
        83b를 만들면 된다.

      - 즉, 81a가 없어지고 83b가 되는 것이다. 이렇게 해서 Logest Chain을 구현한다.


    

4. Double Spend로직: (해킹이 어렵도록 하는 로직 중 하나)

   - payment 기록을 2개를 만든다. (하나는 online판매자용, 하나는 나를 위한 전용)

   - 판매자용 기록만 전송한다.

   - 기록이 honest block에 기록되면 일단 판매자는 상품을 전송하고, 나는 상품을 받는다.

   - 조용히(비밀리에) Longer Chain of block을 만드는데 이때는 판매자용 기록은 제외하고,
     나를 위한 기록을 추가한다.

   - Longer Chain을 publish한다.  Longest chain rule에 의해 기존 판매자용 기록은 없어지고,
     새로만들어진 chain으로 대체된다.

   

Posted by yongary
,

REF (ref에는 일반 javascript방식도 포함되어 있어요)

REF - window센터맞추기(dual포함)



팝업 뛰우기:


var witdh = 600;

var height = 400;

var left = (screen.width/2)-(witdh/2);

var top = (screen.height/2)-(height/2);

window.open('url','myTitle',

'top=' + top +',left='+ left +',width=' + width + ',height=' + height +  ',toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes');


크롬에서 size조절이 잘 안될 경우에는 아래 css 추가

<style>

html,body {overflow: hidden;}

</style>



그리고, 듀얼 스크린을 고려한 w/h는 

var w = 600;

var h = 550;

//dual

var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;

    var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;


    var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;

    var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;


    var left = ((width / 2) - (w / 2)) + dualScreenLeft;

    var top = ((height / 2) - (h / 2)) + dualScreenTop;





팝업에서 부모창에 값 전달하기

$("#parentId", opener.document).val(부모창으로 전달할 값);



부모창에서 값 가져오기

$("#parentId", opener.document).val();


사용빈도는 낮지만, 부모창에 존재하는 함수호출

$(opener.location).attr("href", "javascript:부모스크립트 함수명();");



부모창 Submit:

var form =  $('#searchForm', opener.document);

form.submit();



//팝업창 닫기

window.self.close();


//부모창 refresh

window.opener.document.location.reload();


Posted by yongary
,