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
,

화면에 존재하는 id가 item_table인 테이블의 자식들을 모두 지우고

순서를 변경해서 모두 다시 add 하는 예제. (가상의 data라는 정보를 이용해서 추가함)

(예쁘게 add하기 위해 colspan을 항상 조정 함.)


이 때, tr은 매번 만들어서 추가하는 방식 임.

테이블은 한 row당 4개의 항목 (th+td가 한항목)까지 max로 들어가므로 총 12개의 colspan을 이용해 추가함.



               var table = $('#item_table');

    var itemsTh = $('#item_table th');

var itemsTd = $('#item_table td');


//remove all

table.children().remove();

var items = []; //sorted MenuItem data

//sort

        for (var i = 1; i <= data.length; i++) { //itemOrd는 1부터 시작.

        for (var j = 0; j < data.length; j++)

        if(data[j].itemOrd == i && data[j].useYn == 'Y') //useYn도 여기서 check필요.

        items.push(data[j]);

        }

        var newTr = $('<tr> </tr>');

        var sumColspan = 0;

        var colspan;

        var tdIdx;

    //items 다시add to tr -> table

        for (var i = 0; i < items.length; i++) {

        //find th/td

        tdIdx = findTdNum(items[i].itemCd, itemsTd);

       

        //add to tr, td는 colspan setting max 12개 td기준. 

        itemsTh.eq(tdIdx).text(items[i].itemNm);

        sumColspan += 1;

        newTr.append(itemsTh[tdIdx]);

       

        colspan = getColspan(items[i].itemStep);

       

        //colspan 조정.(여분 tr을 꽉 채우기) max=12

        var nextColspan = getNextColspan(items.length, i+1, items );

        colspan = adjustColspan(colspan, sumColspan, nextColspan );

       

        sumColspan += colspan;

        itemsTd.eq(tdIdx).attr('colspan', colspan);

        newTr.append(itemsTd[tdIdx]);

       

        //tr이 꽉차면 add tr 2 table

        if (sumColspan >= 12) {

        table.append(newTr); //test

        newTr = $('<tr> </tr>');

        sumColspan = 0;

        }

        } //items LOOPS

       

        if (sumColspan != 0) {

        //마지막 colSpan정리

        var finalColspan = adjustColspan(colspan, sumColspan-colspan, 99);

        itemsTd.eq(tdIdx).attr('colspan', finalColspan); //마지막 colspan재설정.

        table.append(newTr); //마지막 남은 tr add

        }

Posted by yongary
,

.attr 호출시 dom.eq(idx)

jquery 2017. 12. 7. 15:26


상식적으로는 itemsTd[0].attr('id') 가 될 것 같은데, 안되고 attr is not a function 오류가 발생한다.


itemsTd는 DOM이라 동작하지 않고,  jquery Object를 가져와야 함.

==> .eq(idx) 이용.




var itemsTd = $('#item_table td');

console.log( itemsTd.eq(0).attr('id') );

Posted by yongary
,

ajax 예제 (jquery)

jquery 2017. 12. 6. 17:27

jquery를 이용한 ajax 예제입니다.


post 예제: ==> 이 경우 spring에서는 @RequestBody로 바로 받을 수 있음.


    $.ajax({

        url:'./misetStore.do',

        type: 'POST',

        contentType: 'application/json',

        data: JSON.stringify(itemList),    //JSON data를 string으로 넘기기. 

        success:function(data) { 

        alert('저장되었습니다');

        },

        fail:function(data) {

        alert('저장 오류');

        }

        

});//ajax



  get 메서드 일 경우에는, url만 기입하면 됨.

       url:'./getSubMenu.json?' + 'noMenuUp=' + noMenu,

Posted by yongary
,

Web Service-SOAP

IT 2017. 11. 28. 09:40

요즘은 REST가 대세이긴 하지만,

SOAP도 나름대로의 장점이 있다. 이 기종간 명확한 spec기반의 통신이 가능하다.


SOAP을 위해서, WSDL을 먼저 생성하는 게 좋은데

eclipse나 IDEA에서도 생성이 가능하지만


oXygen XML 에디터가 좋아보인다.



생성된 WSDL기반으로 테스트 하기에는 SOAP UI라는 툴이 좋아 보인다.  REF

다운로드는 https://www.soapui.org/  에서 Download로 들어가면 SoapUI OpenSource가 있다. 

Posted by yongary
,

login 관리

Spring 2017. 11. 20. 21:59

Login구현시에는 cookie + session을 섞어서 쓰는게 일반적이다. REF


쿠키는  날짜를 지정가능

세션은  id/비번등 주요정보 저장 가능.  단 브라우저 종료시 사라짐. 


즉,

세션이 브라우저 종료시 사라지는 문제가 있으므로, 

쿠키를 이용해 이를 보완해야 한다.  쿠키에 날짜/시간이 지정 가능하므로 이를 이용해서 세션ID등을 저장해 보완하면된다.




Posted by yongary
,

Column

Hadoop 2017. 11. 18. 20:42

 String은 ENCODING STRING으로

 숫자는   ENCODING BINARY로 하는 게 속도가 빠름.


REF

CREATE HBASE TABLE enc_str (
   ti TINYINT, si SMALLINT, i INT,
   bi BIGINT, b BOOLEAN, f FLOAT,
   d  DOUBLE, s1 STRING, s2 STRING,
   s3 STRING, s4 STRING, s5 STRING
) 
COLUMN MAPPING ( 
   KEY MAPPED BY (s1,ti,bi,i) ENCODING STRING,
   f1:a MAPPED BY (si,s2,f) ENCODING STRING, 
   f1:b MAPPED BY (d,b,s3) ENCODING STRING,
   f1:c MAPPED BY (s4,s5) ENCODING STRING
);


Posted by yongary
,

가벼운(lightweight) 확장가능한 data shippers.  data를 수집하고 shipping.

  (logstash가 무겁기 때문에 가볍게 만든 agent?)



Libbeat - 기본 라이브러리 

   Config

   Setup

   Run  - 데이타를 elasticSearch나  logstash로 전송. 

   CleanUp

   Stop  

   의 함수들을 구현(override)하면 새로운 beat을 만들 수 있음.



Packetbeat - 클라이언트에서 서버로 보내지는 데이타를 수집 

Topbeat - 시스템정보 수집

 -> 5.0부터 MetricBeat로 바뀜.


그외에도 각종 beat들이 만들어지고 있음.



  나만의 beats만들기 REF REFY



Posted by yongary
,

Pheonix

Hadoop 2017. 11. 16. 10:18

Hive가 batch오리엔티드인데 반해

Phoeix는 real-time Query도 수행하도록 만든 빠른 레이어이다.

  -query를 HBase scan으로 만들어 빠르게 수행한다. 

  -HBase API를 바로 사용도 가능. 

 ==> 그냥 jdbc 드라이버+SQL지원 정도의 용도로 많이 사용한다.



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

Phoenix : RDB 레이어 over hBase.

 - Query engine + Metadata 저장소.

 - JDBC driver 제공.


 - Hive와 같이 join등 제공. 


 <Secondary index 방식 3가지>

 - write only / + append 방식 

 - global for read-heavy mutable data

 - local for write-heavy mutable or immutable


각종 join모두 지원.


 

Phoenix Calcite ? 


----View생성 from HBase 테이블:  이름  transactions, ColumnFamily:transactions일때

 CREATE VIEW "TransactionHistory" (k VARCHAR primary key, "Transactions"."transactionId" VARCHAR);. 

 =>  Select "transactionId" from "Transactions" 

      그리고 ALTER VIEW명령어로 column추가 가능.   

  

  REF


======Sqlline 사용한 shell 이용 방법====

   $cd /usr/hdp/current/phoenix-client/bin/

   $./sqlline.py  

  pnix> !tables

  pnix> select * from MY.MY_TABLE


0: jdbc:phoenix:> help

!all                Execute the specified SQL against all the current connections

!autocommit         Set autocommit mode on or off

!batch              Start or execute a batch of statements

!brief              Set verbose mode off

!call               Execute a callable statement

!close              Close the current connection to the database

!closeall           Close all current open connections

!columns            List all the columns for the specified table

!commit             Commit the current transaction (if autocommit is off)

!connect            Open a new connection to the database.

!dbinfo             Give metadata information about the database

!describe           Describe a table

!dropall            Drop all tables in the current database

!exportedkeys       List all the exported keys for the specified table

!go                 Select the current connection

!help               Print a summary of command usage

!history            Display the command history

!importedkeys       List all the imported keys for the specified table

!indexes            List all the indexes for the specified table

!isolation          Set the transaction isolation for this connection

!list               List the current connections

!manual             Display the SQLLine manual

!metadata           Obtain metadata information

!nativesql          Show the native SQL for the specified statement

!outputformat       Set the output format for displaying results

                    (table,vertical,csv,tsv,xmlattrs,xmlelements)

!primarykeys        List all the primary keys for the specified table

!procedures         List all the procedures

!properties         Connect to the database specified in the properties file(s)

!quit               Exits the program

!reconnect          Reconnect to the database

!record             Record all output to the specified file

!rehash             Fetch table and column names for command completion

!rollback           Roll back the current transaction (if autocommit is off)

!run                Run a script from the specified file

!save               Save the current variabes and aliases

!scan               Scan for installed JDBC drivers

!script             Start saving a script to a file

!set                Set a sqlline variable

  => !set maxWitdh 200    :  Terminal 가로 출력 길이 세팅.


!sql                Execute a SQL command
!tables             List all the tables in the database
!typeinfo           Display the type map for the current connection
!verbose            Set verbose mode on


Posted by yongary
,

HBase & Hive

Hadoop 2017. 11. 14. 17:35

HBase는 ByteArray 베이스의 NoSQL이면서 [Columnal DBMS임]    RefY

  - MemStore와 HFile에 저장. 

  - Bloom Filter라는게 HFile마지막에 저장되면서 속도를 냄. (옵셔널)

  - ColumnFamily라는 개념이 존재. (prefix맞춰서 columnFamily로 만들면.., 자동으로 timestamp같은게 기록된다고라)

         sameID:  (cf:name  timestamp value=kim)
         sameID:  (cf:score timestamp value=50)    내부적으론 이런식으로 dup해서 기록된다고 하네요.. 흠. REFY

     ColumnFamily는 저장소 분리 및 압축에 사용됨. (유사한 type들을 모아놓아야 columnFam단위로 압축이 되거나 안되거나 함)

  

  - extremely Low Latency & Low time delay.. 

  - MapReduce와는 별도로 실행도 가능하고, 동시에 실행도 가능하다. (not mutually exclusive)


  실행) $sudo /etc/init.d/hadoop-hbase-master start

 

 ====hbase shell=============

         $hbase shell

           hbase> list   (ALL hbase Table listing)

           hbase> desc 'MY:TABLE' 

           hbase> scan 'MY:TABLE'   ( log라는 테이블 전체 조회)

           hbase> 


         

설계 룰: 

  - 가능한 적은 table을 만든다

  - up front디자인에 많은 시간 투자!

  - data loading은 최소한으로 한다.(모아서)   


(Java API 지원)

   Put = new Put()

   Get = new Get()




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

Hive 은 ETL(Extract, Transform, Load) 툴.-> query타임이 중요치 않을때 사용

Hbase 는 온라인 access가 가능한 DB. -> query타임이 중요할 때 사용.


hive 예제. $hive 이후에   REFY

         hive> add jar file:///usr/lib/hive-0.13.1-bin/lib/hive-contrib-0.13.1.jar;

         hive> load data inpath 'hdfs:/wiki-access.log'

         hive> select * from access;


                   ㅁ hBase/hive mapping된 테이블 생성

         

                                                          hive에는 hbase_table_access테이블을,  hbase에는 log테이블을 생성. 

Posted by yongary
,

hortonworks sandbox

Hadoop 2017. 11. 8. 17:31


실습REF   REF

===> hadoopexam.com 에 가면 각종 예제 많이 있음.

        아, 그리고 windows의 경우 BIOS셋업에서 Virtual Technology를 Enable시켜야 하는 경우 있음. 



hortonworks의 sandbox는  HDP(hortonworks Data Platform) 및 관련된 sw들이 모두 다 설치되어 있는 VM으로서

다운로드 받아서 VirtualBox같은 환경에서 실행만 하면  HDP의 모든 서비스를 바로 사용할 수 있다.


(용도는 test용일까, 상용일까?   상용도 가능하겠지요.. 이부분 공부 중.)



centOS환경으로 제공되며, 실행후에는

localHost와 여러 포트가 portMapping이 되어 있으므로


http://localhost:8888  or 8080(Ambari)  (maria_dev/maria_dev) 등으로 바로 실행가능하고, 

ssh root@localhost -p 2222  (root/hadoop)  로 접속도 가능하다.





Posted by yongary
,

Spring web Reactive

Spring 2017. 10. 30. 22:52

(spring에서 reactive 가능한 방식들)


1.  DeferredResult +  RxJava  + CompleteFuture   Ref


2. webFlux  using Mono or Flux 


===================================================

infoQ_lecture Ref1

  

  - WebFlux에서 사용하는 reactor프로젝트의 

    Mono는 backPressure도 지원한다.     (RxJava의 single은 지원하지 않음)


    Flux는 RxJava의 observable과 비슷.. 무한개의 데이타를 지원함..(메모리 안쓰니까..)



그리고, RxJava는 foundation Level이고

WebFlux는 Functional Level이라서 당연히 섞어서 쓸 수 있을 것 같다.(아직 미테스트)


spring-boot-start-webflux를 사용하면 웹서버가 tomcat이 아니고 netty네요. (async를 더 잘지원하기 때문)




utube-REF


(16:00)



(26:00)


                                                                                                                                   or Netty or UnderTow





Spring Web Flux - utubeRef




Posted by yongary
,

microService의 장단점

IT 2017. 10. 30. 22:25

REF


서비스를 잘게 쪼개서 별도의 서비스들로 만들고

서비스들간에 REST등의 방식으로 통신을 하게 하는 방식인데


이로인한, 장단점이 명확하다.



Posted by yongary
,

일반적으로 recursion(재귀함수)가 stack를 많이 사용하므로, 

tail recursion을 통해 stack을 적게 사용하는 방법이 좋다. 


간단한 factorial을 예로 든다면.. REF


int Factorial(int n)

{

return FactorialTail(n, 1);

}

int FactorialTail(int n, int acc)    // acc : accumulator의 약자

{

if (n == 1) return acc;

return FactorialTail(n - 1, acc * n);    //  일반 재귀에서의 n * Factorial(n-1)와 달리 반환값에서 추가 연산을 필요로 하지 않음

}




출처: http://bozeury.tistory.com/entry/꼬리-재귀-최적화Tail-Recursion [따..딱히 공부하려고 포스팅하는 건 아니니까..!]



하지만 java에서는 아직 tail recursion Optimization이 지원되지 않는다.

이유는 security등 각종 jdk코드에서 stack을 count한다던지,

 하는 이유때문이라고 하는데

자세한 내용은 여기: REF

Posted by yongary
,

Akka & actor

network개발 2017. 10. 17. 16:46

actor : ref

 

   -actor는 독립적인 경량프로세스이다. (메시지는 큐를 이용해 처리한다)

   -서로 독립적이고 actor간 통신은 비동기로 이루어지기 때문에 multi-thread환경에서 락등이 발생하지 않는다.

   ( scala로 개발되어 있으며, java용 API도 제공한다. )

  


akka

  - actor모델을 통해서 병렬처리를 할 수 있게 해준다.

  - RPC이므로, remote에 있는 actor를 local actor처럼 사용할 수 있다.

  


UntypedActor를 상속받을 경우   onReceive함수를 구현해야 한다.

Actor생성은 Actors.actorOf()로 생성.  

Posted by yongary
,

AWS Redshift

SDN,cloud,Puppet 2017. 10. 17. 16:18

REF


AWS에서 제공하는 대용량 관계형 data-warehouse 서비스.



Posted by yongary
,

ELK Stack

ElasticSearch 2017. 10. 17. 16:16

공식사이트: elastic.co

REF


기본적으로 elasticSearch가 근간인데

elasticSearch를  DB와 비교해서 가장 큰 차이점을 생각해 보면


   1. 속도가 빠르다.. DB는 B-tree인데 elastic은 hash를 사용.
       (물론 No-SQL DB중에는 redis등과 같이 hash사용하는 애들 있죠..)


   2. Fuzzy개념이 있다.
       (DB에서는 정확하게 입력한 query에 대한 결과가 나오지만,  

        elastic은 검색엔진 기반이다 보니,   Fuzzy하게 혹은 가중치있게 검색할 수 있다.. 적당히 알아서 유사한 것들이 검색된다) 



==============================================


elasticSearch에 data를 넣고,

kibana를 통해 그래프 형태로 조회 한다.


Logstash는 elasticSearch에 data를 대용량으로 넣을때 주로 사용한다.



<ElasticSearch>

키워드 : doc1, doc2 이러한 식으로 저장이 됨.  O(1)의 HashTable이라고 생각하면 됨. 

     ==> 따라서 search가 매우 빠름. (redis와 


Index - db (RDB용어)

Type - table

document - row

Mapping -scema


(실습)

$curl -XGET http://localhost:9200/classes
                                                         +  /class/1 -d  someData

$curl -XPUT localhost:9200/classes    (Update명령이지만, index생성시에는 PUT을 사용함)

                      

$curl -XPOST localhost:9200/classes/class/1 -d  @json파일          (INSERT) 
                                                             document생성은 POST로 하면 index와 함께 생성되기도 함.


?pretty : 이쁘게 출력해 줌.


    - geo_point같은 data를 type 매핑해주면 geo data로 관리가 되서, kibana 지도에서 쉽게 표시 가능.
    - 


<Kibana>

Discover메뉴 - 필드별 조회/검색 등.

Visualize에서 x 축 y축 고르면 쉽게 그래프로 표시할 수 있으며, 해당 링크만 이용할 수 있음.



<logstash>

 - (CSV)file, mySql, mongoDB, ActiveMQ등 data들을 포맷을 바꿔 elasticSearch에 넣을 수 있음.

 - .conf 파일을 이용함.  $sudo ./logstash -f logstash.conf 
          ( input  / filter / output을 지정. output을 주로 elasticSearch로 함 -  유투브 ELK스택 강의 18강 참고.



               


 






Posted by yongary
,

Q 1개를 main으로 하고, 임시 Q 하나를 더 이용해서

stack을 구현. 항상 Q를 다 비우고 꺼꾸로 즉(stack pop 대비순서)로 넣어 놓음.

REF

 

Queue<Integer> q = new LinkedList<Integer>();
Queue<Integer> tmp = new LinkedList<Integer>();


public void push(int d) {
    if (q.size() == 0) {
        q.add(d);
    }else {
        //deque q->tmp
        while (q.size() > 0) {
            tmp.add( q.poll() );
        }

        q.add(d);

        //tmp->q
        while (tmp.size() > 0 ){
            q.add(tmp.poll());
        }

    }
}

public Integer pop(){
    return q.poll();   //poll returns null,  while remove throws exception.
}

 

Posted by yongary
,

java 9 특징

java8~ 2017. 10. 12. 22:22

 REF1(KOR)     REF2(ENG)



AoT (Ahead of Time)컴파일러 도입.  안드로이드에선 이미  ART라는 이름으로 사용되고 있었으나 JDK에선 처음도입

  - application의 startup time 감소.


알파베틱 String을 1byte로 처리해서 메모리효율 + GC문제 감소


Modularity (Jigsaw프로젝트)

  - 키워드 module 을 package처럼 사용.. package 보단 밑.

  - 참고: 이 기능 때문에 기존코드 migration을 위해, java9에서만 한시적으로 illegal reflective access를 제공.


JShell (REPL : Real-Eval-Print-Loop) 제공.. shell에서 바로 문법테스트 등 가능



immutable Map/List/Set용 .of 함수 제공  (Guava좀 들 쓰겠군요)

Flow class (for Reactive) 제공 + CompletableFuture에 delayedExecute추가  (RxJava좀 들 쓰겠군요)


Stream API에  4개 API 추가

  -  takeWhile

  -  dropWhile

  

CodeCache 향상 - code cache가 segment단위로 되도록 함

JavaScript 서포트 향상 - Project Nashorn의 ECMAScript parser API추가


Optional::stream 추가.  

ProcessHandle class추가

Try with Resource 향상





----기타----  

Applet 제거

Http2 Client

Html5 Unicode지원 향상

Java platform Logging API & Service ?

Javadoc search? 


Posted by yongary
,

IP로 country판별

IT 2017. 8. 28. 10:27

 MaxMind의 Geolocation DB를 이용하면 된다.

GeoIP2-Country DB를 이용하는 게 좋고,  DB의 path를 "GeoIP2-Country.mmdb" 로 잡는다. REF

Posted by yongary
,


$ lsof -i :8080   (8080포트를 사용하고 있는 process id를 알려줌)



Posted by yongary
,

gulp & webpack & lodash

javascript 2017. 8. 21. 16:21

<gulp>

gulp는 빌드 및  dependency관리 툴이다. Node.js의 스트림기능을 이용한 streaming build System을 표방한다.  REF

 - gulp.task
 - gulp.src
 - gulp.dest
 - gulp.watch 

gulpfile.js 을 작성해서, plugin사용을 통해 html/css/js/image 등을 minify 한다.

sass 를 css로 컴파일 하는 기능도 수행.



<webpack> 

모듈쪼개기(번들러) 툴이다. 모듈간 import/include를 지원한다.   (javascript ES6에도 모듈이 있어 약간 쪼개기 가능) 
                                                                                                - REF:      import './style.sass';

webpack.config.js를 통해서 설정을 함. REF
  - entry 
  - CommonChunkPlugin을 통해 split함..
  (+inline  function)

- webpack-dev-server : 간단한 webserver 제공. REF

- webpack-stream: 주로 babel인데 gulp랑 함께 사용? (need to study)
  
  

- webpack-dev-middleware  (webpack-dev-server내부에서 사용)

- webpack Watch Mode : js가 하나라도 바뀌면 재컴파일.



<lodash>

그냥 js 라이브러리이다.  arrays, collections,  numbers, objects, strings 등을 유려하게 처리한다.  REF

_.every
_.filter
_.find  
_.forEach
_.includes
_.map 
_.reduce 






Posted by yongary
,

package.json안에서 사용되는 dependency js들 정리. 


<Babel>

ES6등으로 된 javascript를 현재 브라우저에서도 동작하게 낮은버전(ES5)등으로 변환해주는 도구

.babelrc파일만 작성하면 된다.

{
"presets": [
[ "env", { "modules": false } ]
]
}


<underscore> - lamda or function program과 유사한 함수들을 지원.  (음, lodash와 차이는?)

_.map
_.each 

_.filter

_.isEqual (A, B) : 두 Object간 동일한지 비교한다. 



<Tether> 

javascript로 webpage생성시,

포지션을 해주는 library이다.   REF


Attathment,

Offset,

pin,

to

등의 javascript tag 를 이용해 자유롭게 포지셔닝이 가능하다. 



====개발/Test용 js===========


chai : BDD, TDD assertion Library

cross-env :  bash/window등에 상관없이 환경제공. 주로 webpack.config.js안에서 사용.

del : 삭제용 js - 주로 gulpfile.js 안에서  gulp.task('clean')에 사용.


karma: karma.conf.js를 이용해서 test용  task를 생성시 사용.  

  karma-chai : 위의 chai와 결합
  karma-mocha : mocha (async한 test) 와 결합.. 주로 describe("blabla text", function() ) 형태를 많이 사용.


  karma-phantomJS:  phantomJs( Dom핸들링, CSS, JSON등 처리) 와 결합해서 브라우저 흉내를 제공.


requireJs : (AMD구현체  이해와 개발 글 참고- REF
   주로 js의 제일앞에 require()를 많이 사용했으나, function과 결합해 사용가능


runsequence : gulpfile.js안에서 default실행순서를 정의.
  



Posted by yongary
,