_json파일을 만들어서, _bulk로 elastic에 데이타를 넣는게 가장 빠른것으로 보인다.

단, batch파일은 10만건 정도가 적당하고..

이렇게 할 경우 batch파일이 너무 많아지므로,

아래와 같이 shellscript를 만들어서 일괄 삽입하는 게 좋다.


윈도우즈의 경우는 git 윈도우용을 깔아서, git bash등에서 실행하는 걸 추천한다.




#!/bin/sh


for ((i=130;i<258;i++)); do

fName='@modonBatchElastic'$i

RUN_COMMAND='curl -u elastic:changeme -s -H Content-Type:application/x-ndjson 

                   -XPOST 210.92.91.234:9210/_bulk --data-binary '$fName

echo $RUN_COMMAND

echo `$RUN_COMMAND`

done




참고: json포맷 - 2줄당 data한건 삽입

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }

{ "field1" : "value1" }

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }

{ "field1" : "value2" }

Posted by yongary
,

이더리움 KeyStore

블록체인 2018. 5. 18. 09:31

REF


이더리움에서 private키는 KeyStore라는 파일을 이용해 암호화해서 관리한다.

물론 이렇게 하지 않아도 되지만 위험하므로, 일반적으로 안전성을 위해 이렇게 관리한다.


keyStore파일 + 패스워드조합을 통해  privateKey를 관리한다.

Posted by yongary
,

REF: 20분만에 토큰배포 영문사이트


truffle환경에서 zeppelin을 이용해 토큰을 생성하는 방법 및 예제. 



<Zeppelin>


Zeppelin기반으로 Token을 만들고 싶다면..

   1. npm방식으로 zeppelin을 설치하는 방법과

   2. ethpm방식으로 zeppelin을 설치하는 방법이 있는데..   



  1.1  $ npm  install  zepplin-solidity

       혹은   package.json 이용 추천:
      => node_modules/zepplin-solidity 폴더 생성됨.

     

아래처럼 package.json을 만들고..   $ npm intall로 설치함.

{
"name": "truffle",
"version": "0.1.0",
"private": true,
"dependencies": {
"zeppelin-solidity": "1.9.0"
},
"devDependencies": {},
"scripts": {} } 


  ==>   2. Token생성.으로 이동.


  1-2.ethpm방식 (현재 비추)

    딱 필요한 것만 받는 ethpm방식이 더 좋을 수도 있는데

현재 1.9.0을 못 받고, 1.3.0을 받아오는 문제가 있다..  (일단 pass)

아래와 같이 ethpm.json파일을 만들고

  

  ethpm.json 파일

{
"package_name": "zeppelin",
"version": "1.9.0",
"description": "Secure Smart Contract library for Solidity",
"authors": [
"Manuel Araoz <manuelaraoz@gmail.com>"
],
"keywords": [
"solidity",
"ethereum",
"smart",
"contracts",
"security",
"zeppelin"
],
"license": "MIT"
}

 




$truffle install zeppelin  하면 intalled_contracts밑에 패키지가 설치가 된다..    REF


토큰관련 코딩후에는 그냥 

$truffle compile -> $truffle migrate  로 다른 일반 contracts와 함께 개발/배포 함. 



($truffle publish는 아직은 필요없는거 같은데.. 이건 ROPSTEN용도이려나? .... 아직 미 test중)



2. 그 후 Token solidity생성.


pragma solidity ^0.4.23;


import "../node_modules/zeppelin-solidity/contracts/token/StandardToken.sol";



contract ATZToken is StandardToken{

uint public INITIAL_SUPPLY = 10000000; //100만개 나누기 decimals(10**decimals)으로 표시됨.
string public name = 'Test ATZ Token';
string public symbol = 'ATZ';
uint8 public decimals = 1; //토큰을 얼마나 잘게 나눌수 있느냐. 10**X
address owner;

bool public released = false;

function ATZToken(){
totalSupply_ = INITIAL_SUPPLY * 10 ** uint(decimals);
balances[msg.sender] = INITIAL_SUPPLY; //각 계정별 잔액 저장. 상속받아 자동생성
owner = msg.sender;
}

function transfer(address to, uint256 value) public returns (bool) {
super.transfer(to, value);
}
function allowance(address owner, address spender) public view returns (uint256) {
super.allowance(owner, spender);
}
function transferFrom(address from, address to, uint256 value) public returns (bool) {
super.transferFrom(from, to, value);
}
function approve(address spender, uint256 value) public returns (bool) {
super.approve(spender, value);
}

}

그 후에,
truffle/migrations 폴더 밑에
2. _deploy_contracts.js에 ATZToken을 추가하고

$ truffle compile
$ truffle migrate (--reset) 하면 ganache등에 배포가 된다.




 






3. 회원가입등의 process가 발생할 때마다, 특정 회원에게 Token을 보내기..작성예정. REF

Posted by yongary
,

springboot에 포함된 tomcat과 함께 배포해서 바로 서비스로 돌릴 수 있다.


jar파일을 묶어서 배포하면 되고, java -jar xxx.jar 로도 실행가능하며 tomcat까지 돌아간다.


혹시 서비스로 설정을 해서 돌리고 싶다면 여기참조: REF

Posted by yongary
,

reactstrap

React.js 2018. 4. 19. 21:27

react에서 사용하는 bootstrap4라고 보면 된다.

다양한 컴포넌트들이 만들어져 있어서 가져다 쓰기만 하면 된다.


 사전준비: 1. npm install bootstrap --save

                2.  index.js 에 import 'bootstrap/dist/css/bootstrap.min.css';  추가.




<개인적으로 맘에 드는 component들> 


Navbar: http://reactstrap.github.io/components/navbar/ 


Card : 상품나열


Carousel : 슬라이드 쇼같은 느낌.

Posted by yongary
,

js HashMap 정수용

javascript 2018. 4. 16. 17:40

예전에는 아래 방식이 좋다고 생각했었는데,

최근엔 그냥 json을 hashMap으로 써도 충분한것 같다. (좀 늦으려나?)

 

let hm = {}

hm['key1']  = 2

hm['key2'] = 3

 

==> 이렇게 하면 바로 hashMap처럼 사용가능.  hm = {key1:2, key2:3} 이며, 이렇게 저장해도 됨.

 

--------------- 아래 --------------

REF 를 수정해서 만듦.

<javascript용 정수를 자동 add해주는 HashMap>

 

Map = function(){

 this.map = new Object();

};   

Map.prototype = {   

    put : function(key, value){   

 if (typeof this.get(key) == 'undefined')

             this.map[key] = value;

       else

 this.map[key] = this.map[key]+value;

    },   

    get : function(key){   

        return this.map[key];

    },

   

    //밑에 함수들은 사실 별필요 없음, 검증도 필요하고..

    containsKey : function(key){    

     return key in this.map;

    },

    containsValue : function(value){    

     for(var prop in this.map){

      if(this.map[prop] == value) return true;

     }

     return false;

    },

    isEmpty : function(key){    

     return (this.size() == 0);

    },

    clear : function(){   

     for(var prop in this.map){

      delete this.map[prop];

     }

    },

    remove : function(key){    

     delete this.map[key];

    },

    keys : function(){   

        var keys = new Array();   

        for(var prop in this.map){   

            keys.push(prop);

        }   

        return keys;

    },

    values : function(){   

     var values = new Array();   

        for(var prop in this.map){   

         values.push(this.map[prop]);

        }   

        return values;

    },

    size : function(){

      var count = 0;

      for (var prop in this.map) {

        count++;

      }

      return count;

    }

};

 

var map = new Map();

map.put("ag", 5);

map.put("ag", 2);

map.get("ag");  ===> 7

Posted by yongary
,

pure compoennet, ref등

React.js 2018. 4. 15. 21:56

<주요키워드>

className : 리액트에선 class가 아니라 className으로 써야 한다. css도 적용될 듯.

props   : extends Component엔 자동으로 들어오고,   Functional Component는 선언시 꼭 인풋으로 선언한다.

this.state  :   this.setState로  state변수를 바꿔야 하며 이 setState함수를 통해 redraw(=Update)가 발생한다. 
                    처음 그릴땐 Mount라 부르고, 그 이후부터는 Update라 부른다.




<Unique ID>

react에서 <ul>과 같은 list들에선  일반적으로 unique한 ID가 필요하다. (향후 선택을 위해서..)

array 데이타를 ul안에서 사용할 경우 array의 index를 사용해도 된다.

데이타 세팅시에는 UniqueId를 많이 사용한다.  

 

import UniqueId from 'react-html-id';

class App extends Component {

constructor() {
super();
UniqueId.enableUniqueIds(this);

this.state = { //uniqueID를 쓰려면 this때문에 생성자에서?
users: [
{id:this.nextUniqueId(), name:'Kim', age:10},
{id:this.nextUniqueId(), name:'Lee', age:20}
]
}
//array.findIndex( )로 true리턴해서 쉽게 찾을수 있음.
}
render() {
return (
<div className="App">
<ul>
{
this.state.users.map((user,index) => {
return (<User age={user.age} id={user.id} index={index}>{user.name}</User>)
})
}
</ul>
</div>
);
}
}




<Router>  REF , youtube


react에선 java-spring의 controller처럼 url을 관리해주는 메커니즘이 router이다.

url을 파라미터로 받을 수도 있다.

Link, NavLink, Redirect, Prompt도 유사하다.


   dependeny 필요: react-router-dom


   props:   exact : 정확한 매치만 허용,  strict:마지막 슬래쉬 까지도 정확히 체크


   match:  마치 props를 사용하듯이, Router에서는 match를 사용해  파라미터를 받아서 사용할 수 있다.

     => const User = ({match})  => {}  에서  match.params.myVar 사용가능  (props와는 달리 {match}중괄호 필요)

     =>      <Route path="/user;:myVar"  component={User} /> 이렇게 선언해 놓아야 함.

    

      match.url도 이용가능.



<Fragment>

  div를 2개써야 한다던지 할때 그 외부를  또 div로 싸도 되긴 하지만

 일부러 이렇게 div를 넣지 않아도 되게, react에서 특별히 제공하는 태그이다.

 실제 렌더링 되지는 않고, 2개를 가상으로 묶어주기만 한다.




<pure component>    REF

일반적으로 Component를 상속해서 Mount와 Update가 발생하지만,

PureComponent를 상속하면 Mount만 발생한다. 

아주 간단한 .. 한번 만들면 update할 일이 없는 component는 PureComponent를 쓰는게 좋다.

- 하지만 조심할 필요는 있다.    




<ref>  REF : (onKeyUp 코드도 같이 있음.)

ref={(input) => { this.firstName = input; }}

를 정의하면 ${this.firstName.value}로 사용가능하다.

외부에서 App.firstName도 사용가능하다.


16.3.0 부터는 (생성자등에서) productNameRef = React.createRef(); 지원. 조금더 간단함.



<Type Check>    REF

(개인적으로는 아직, typeCheck가 많이 필요한지 필요성을 못 느끼고 있다.

백엔드를 다른 language로 하기 때문에 필요성을 못 느낀 걸 수도 있는데..

아래와 같이 3가지 type check가 존재하는 걸 보면 분명 필요성 있는 곳이 있는것 같다..)


1. 일반적으로 간단한 type check는 PropType으로 한다. 

2. 좀 더 복잡한 type check는   react-flow  (yarn을 이용한 설치)를 이용하며

3. 가장 복잡하면서 확실한 type check는 typeScript를 이용한다..확장자도 tsx로 바뀌는 만큼 무겁다.. 




Posted by yongary
,

복합Query

ElasticSearch 2018. 4. 6. 09:44

엘라스틱을 사용하다 보면 여러가지의 Query를 복합해서 사용해야 하는 경우가 있다.


잘 섞이는 Query는

  must, must_not, should  + (filter)이며 아래와 같이 "bool"로 연결한다.   REF


{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "range": { "date": { "gte": "2014-01-01" }} 
        }
    }
}


Posted by yongary
,

<truffle + react>

이더리움의 개발환경을 

truffle과 react.js를 이용해 개발환경을 구축해 보았으며

관련 소스는 여기참조 : https://github.com/frownder/graph/tree/master/react-truffle

- metamask이용 및  ganache를 이용한 로컬개발은 잘 된다.



여기에다가 토큰발행을 위해서  zeppelin-solidity 를 이용.


react+metamask 참고사이트: REF


import 'Web3' from 'web3';

// ...

componentDidMount() {

  // Check if Web3 has been injected by the browser (MetaMask).
  // (since 'web3' is global, we need to use 'window')
  if (window.web3 && window.web3.currentProvider.isMetaMask) {
    window.web3.eth.getAccounts((error, accounts) => {

      // Do whatever you need to.
      this.setState({wallet: accounts[0]});
    });
  } else {
    console.log('MetaMask account not detected :(');
  }
}



<truffle + zeppelin>

truffle과 zeppelin-solidity를 이용한 개발 예제는

이곳을 참조:  DNEXT-POST

Posted by yongary
,

몽고db

springBoot gradle 2018. 3. 26. 23:14

springBoot2.0에서

spring-boot-starter-data-mongodb 등장.

   (localhost 27017포트의 test DB로 자동 접속.)  SpringBoot2.0 tutorial


@Document나 @Id는 기존과 동일.


출처:

https://m.youtube.com/watch?v=UJn_aTbmk9o



윈도우용 mongoDB설치는 : http://solarisailab.com/archives/1605 


약간예전꺼지만 spring Query예제들:  mkyong



2014년 몽고db 문제점 한글로 적은 글: REF

Posted by yongary
,