목록스터디 (171)
오늘도 공부
Java for Dart Codelab다트는 타입이 있는 언어입니다.온라인에서 에디터를 실행 후 바로 테스팅이 가능합니다.https://dartpad.dartlang.org/다트를 특별하게 만드는 이유생성자를 만드는 방법매개 변수를 지정하는 다양한 방법getter , setter 를 만드는 방법 및 시기다트가 privacy 를 처리하는 방법팩토리를 만드는 방법다트에서 함수형 언어가 동작되는 방법다른 다트 콘셉 그럼 시작해보자.class Bicycle { int cadence; int speed; int gear; } void main() { } main 함수로 실행한다.만약 argument를 가지고 싶다면 main(List args) 를 사용할 수 있다.기본적으로 접근 제어자는 가지고 있지 않다. 예를 ..
Geth 설치 및 로컬에 세팅 (윈도우 기준)로컬 테스트넷에서 Geth 를 가동하기 위해선 두가지를 준비해야함데이터 디렉터리 ( chaindata )Genesis.json 파일윈도우 기반에서 진행한다.윈도우로 GETH 설치를 진행하자. https://geth.ethereum.org/downloads/genesis.json 을 만들자.{ "coinbase" : "0x0000000000000000000000000000000000000001", "difficulty" : "0x20000", "extraData" : "", "gasLimit" : "0x8000000", "nonce" : "0x0000000000000042", "mixhash" : "0x000000000000000000000000000000000..
2018년 3월 9일자 확인됨우분투에 서버 설치하기시작하기전 기본 설정EC2 기본형 올리기 (프리티어급)express 노드 앱이 준비 되어 있다는 가정putty나 맥을 통해서 터미널로 접속이 가능해야함 (pem 파일 이미 등록된 상태)DB는 AWS RDS 이용합니다.파일 서버는 S3 이용합니다.방화벽 설정하기aws ec2는 콘솔에서 설정가능참고 링크 :https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-16-04ufw allow 80 Nginx 설치일반적으로 우분투에 설치시 최신버전을 설치를 안한다. 그래서 저장소 키를 가져와서 직접 최신걸로 업데이트를 할 수 있다.참고내용 :https://..
배열과 연결된 리스트의 장단점2장에서는 주된 설명은 배열과 연결된 리스트에 대한 비교 설명이 있었다.배열은 검색이 빠른 반면 삽입이 느리다는 것연결된 리스트의 경우 삽입이 빠르지만 검색부분에선 배열보다 느리다는 장단점이 있다.선택정렬 (Selection Sort)2번째 알고리즘 문제이다.만약 주어진 배열이 있으면 그 배열을 정렬하고자 할 때 선택정렬을 사용할 수 있다.기본 흐름은 다음과 같다. (순차적 정렬시)배열에 가장 작은 값 검색가장 작은 값 위치 값 획득그 위치 값을 배열에서 제거 하고 새로운 배열에 하나씩 추가함그렇게 해서 최종 새로운 배열로 결과값을 보여줌Python3 으로 구현시 다음과 같다.def findSmallest(arr): smallest = arr[0] smallest_index ..
이진탐색 (Binary Search)시나리오1~1000개 숫자 의 배열에서 특정 숫자만 뽑아내고 싶을 경우 어떻게 해야 될까?리스트로 한개씩 넣어서 검색해서 운좋으면 빠른 시간안에 검색이 될 수 있으나 최악의 경우 1000번의 수행을 해야 한다.이진탐색 알고리즘을 통해서 전체의 반을 검색하고 다시 반을 검색하는 방법을 사용할 수 있다.예를 들어 100의 중간 50부터 시작되는 함수로 시작된다4번만에 답을 찾은 경우이다. 그럼 log2 16 = 4 이라고 표시한다.즉 로그는 거듭제곱의 반대말이다.지수표현이 잘 안됨..10^2^ = 100 -> log10100 = 210^3 = 100 -> log101000 = 32^3 = 8 -> log28 = 3 (결과값을 앞으로 보내면 된다.)2^4 = 16 -> lo..
Truffle를 활용한 Pet-Shop 튜터리얼 분석광고 클릭시 많은 힘이 됩니다. Truffle 튜터리얼 중 펫샵을 활용해서 프론트 까지 적용해서 어떤식으로 웹에서 연동되는지 살펴보자.아래 주소에 있는 내용은 깔끔하게 정리되어 있다. 따라해보는 걸 추천한다. http://truffleframework.com/tutorials/pet-shop여기 글은 펫샵에 사용되는 소스를 분석해보자 한다. 이더리움 플랫폼 위 DAPP개발 프레임워크 중 하나인 truffle사용시 개발시 순서는 다음과 같다.개발환경을 설정한다.truffle box( 보일러 플레이트처럼 만들어준다.)를 이용해서 pet-shop 을 해제스마트 계약 소스를 (.sol) 작성한다.컴파일 및 배포를 한다.Ganeche 를 통해 테스팅을 한다.웹 ..
Truffle기초 - 계약 디버깅과 테스팅광고 클릭시 큰 힘이 됩니다. 감사합니다. Truffle디버깅 및 테스팅 하는 방법을 알아보자.Truffle 은 DAPP 개발을 편하게 해주는 프레임워크이다. 테스팅 및 컴파일, 배포까지 쉽게 해준다.테스팅은 Ganache 를 이용한다. Ganache 은 개발모드에서 가상으로 테스팅 및 배포까지 하게 해주는 프레임워크다른 웹에서 쉽게 테스팅을 할시 http://remix.ethereum.org/ 에서 쉽게 가능하다.그리고 truffle에서도 지원한다.우선 작업 할 폴더를 구성하자.mkdif simple-contract cd simple-contract truffle을 초기화를 해서 기본 구성을 만들 수 있다.truffle init 기본 구성은 위와 같이 나온다.b..
광고 클릭시 많은 힘이 됩니다. 감사합니다. 혹시 크립토키티 라는 걸 듣어보셨나요? 이더리움상에서 DAPP 형태로 고양이를 랜덤으로 만들어서 거래까지 가능한 플랫폼이다.현재 매출은 1200억 달러를 넘어섰다고 한다. 관련 기사 모음블록체인으로 만든 게임, '크립토키티스' 다시금 화제이더리움 가능성 - 한계 보여준 고양이 게임이런 플랫폼 게임 개발시 필요한 DAPP 개발 지식을 무료로 튜터리얼식으로 만들어서 공유 하는 곳이 있다.크립토좀비 바로가기왼쪽에는 설명이 나오고 오른쪽은 코드 실습을 통해서 하나씩 배워나가는 방식이다. 개발 내용은 DAPP 개발시 필요한 솔리티디 언어로 진행한다. 레벨이 현재 5개로 나누어 (계속 추가될 예정) 지며 각각의 레벨과 함께 게임도 같이 만들어 나가는 재미도 있다. 이 글..
광고한번 눌러주시면 크게 힘이 됩니다. 이번 포스팅은 제 딸들 코인인 수지토큰 을 발행해보겠습니다.우선 토큰과 코인은 차이가 있습니다. 코인과 토큰의 차이점?? 그럼 시작해보겠습니다. 우선 결과물은 다음과 같습니다.이더리움에 올릴수 있는 토큰은 ERC20 규격으로 만들수 있다. 이 토큰을 가지고 ICO에 올려서 서로간의 거래를 할 수 있습니다. 그럼 시작해보자. ERC20 위키바로가기규격 인터페이스 형태는 다음과 같다. 12345678910111213141516171819contract ERC20Interface { //총 갯수 function totalSupply() public constant returns (uint); //주어진 토큰오너에 대한 잔액조회 function balanceOf(addre..
예제로 배우는 DAPP 개발해보기 - 복권편이더리움 블록체인 위에 어플리케이션 형태로 올려서 개발할 수 있는 DAPP을 예제로 배워보겠다. 처음 예제는 복권(Lottery) 이다. 내용은 최근 세미나 한 자료를 기준으로 진행한다. 예제 자료는 다음의 위치에서 볼 수 있다. https://github.com/bear2u/lottery_exam1 결과물은 오른쪽과 같다. 지갑을 우선 설치를 해보자. https://metamask.io/ 에서 크롬 확장 프로그램인 설치를 하자. 로그인을 비밀번호를 입력 후 하면 되는데 문자열이 모니크 키값으로 주어지는데 꼭 다른 곳에 저장을 해놓자. 로그인시 보유한 이더와 서버주소를 확인 할 수 있다. 테스트 서버를 우선 설정해보자. 왼쪽 하단 서버 선택을 Rinkeby Te..
Collection 함수들RxJava에서 자주 쓰이는 함수중 하나인 Collection형태를 알아보자.우선 toList() 이다.여러개의 배출을 하나의 리스트로 만들어주는 것이다. 주의점은 리턴값이 Single 인것을 유념하자.아주 간단한 예제를 보자.ToListfun testToList(){ Observable.just("Alpha" , "Beta" , "Gamma" , "Delta" , "Epslion") .toList() //Single로 배출 .subscribeBy( onSuccess = { println(it) } ) } ==================================== [Alpha, Beta, Gamma, Delta, Epslion] 정렬을 원할땐 ToSortedList를 사용..
그룹핑하나의 Observable을 여러개의 옵저버로 패턴에 맞게 분리하는 방법에 대해서 알아보자.+4개의 문자 배열이 있다.+"Alpha" , "Beta" , "Delat" , "Epsilon" 이걸 문자 길이에 맞게끔 분리를 해보자.+val source = Observable.just("Alpha" , "Beta" , "Delat" , "Epsilon") val lengthGroupObservable = source.groupBy { it.length } //groupBy 가 중요함 lengthGroupObservable.flatMapSingle { it.toList() } .subscribeBy( onNext = { println(it) } ) ====================== [Beta] [..
Combinelatest두개의 리스트를 비교하는 걸 구현한다고 가정했을때 여러 가지 방법이 있을테지만그중에 conbinelatest 를 사용해서 리스트와 각각의 값을 비교하는 방법으로 진행해보자.다이어그램은 다음과 같다.val observable1 = Observable.fromArray("A" , "B" , "C" , "D") val observable2 = Observable.fromArray("E" , "C" , "B" , "G","F") Observables.combineLatest( observable1.toList().toObservable() , observable2 ){ list , value -> println("$list $value") if(list.contains(value)) va..
Lift 연산자연산자 오버로딩 하는 방법 줌 RxJava에서는 compose 와 lift 가 대표적으로 사용된다.compose 는 전 내용에서 설명해놓은 내용이 있다.Compose 활용Compose with parameter그럼 lift는 차이점이 무엇인가.Lift는 연산자를 오버로딩해서 새로 만드는 걸 목적으로 하며compose는 여러 연산자를 하나의 연산자로 만드는게 주 목적이라고 생각된다.우선 lift 구현 동작 부터 확인해보자. interface ObservableOperator { /** * Applies a function to the child Observer and returns a new parent Observer. * @PARAM observer the child Observer in..
아키텍쳐 어소시에트 관련 자격증 공부 링크 모음비공식 AWS 공인 솔루션스 아키텍트 - 어소시에이트 수험 가이드https://github.com/serithemage/AWSCertifiedSolutionsArchitectUnofficialStudyGuide/blob/master/README.md AWS공식 문서들아래 링크들은 어떠한 내용이 있는지 정도만이라도 한번 훑어 보셔도 많은 도움이 됩니다. AWS Well-Architected 프레임워크(한글화된 문서와 강연영상)https://aws.amazon.com/ko/blogs/korea/aws-well-architected-framework-in-korean/ AWS 한국어 설명서 목록: AWS학습과 사용을 위해서 꼭 한번씩은 읽어 보셔야 하는 문서들 입..
Using코틀린에서 기본적으로 Use을 제공한다.myStream.use { // 자동으로 열고 닫는다. val line = readLine()}하지만 Rx에도 자원관리를 할 수 있는 방법이 있다. 바로 Using 이다.공식문서는 http://reactivex.io/documentation/operators/using.html 그럼 우선 RxKotlin 에서 어떻게 보이는 지 살펴보자.fun using(resourceSupplier: Callable, //첫번째 인자 (열고)sourceSupplier: Function, //세번째 인자 (닫기) disposer: Consumer): Observable { return using(resourceSupplier, sourceSupplier, disposer, ..
코틀린은 다음과 같은 길이를 가지고 있다.TypeWidthLong64Int32Short16Byte8Double64Float32테스트를 해보자val int = 123 val long = 123456L val double = 12.34 val float = 12.34F val hexadecimal = 0XAB val binary = 0b01010101 println( "$int , $long , $double , $float , $hexadecimal , $binary") ================== 123 , 123456 , 12.34 , 12.34 , 171 , 85 String 멀티 라인val rawString = """ 안녕하세요 반갑습니다. 코틀린입니다 """ print(rawString) =..
RxKotlin우선 dependencies을 추가를 하자. compile 'io.reactivex.rxjava2:rxjava:2.1.0' compile 'io.reactivex.rxjava2:rxkotlin:2.0.2' io.reactivex.rxjava2:rxkotlin 의 경우 코틀린으로 확장해서 따로 유틸을 만든 것이다.주소는 여기 클릭 해서 한번 보도록 하자.그리고 소스셋을 지정해서 폴더를 구분해주자.sourceSets { main.kotlin.srcDirs += 'src/main/kotlin' } 그럼 코틀린 파일을 새로 만들어서 테스트 해보자.1~10까지 돌면서 문자값으로 변경해주는 예제이다.import io.reactivex.Observable fun main(args : Array) { O..
쓰레드가 이어져서 나오는 걸 직렬화라고 한다.예를 보자.public static void main(String[] args) { Observable.range(1 , 10) .map(i -> intenseCalculation(i)) .subscribe(i->System.out.println("Received " + i + " " + LocalTime.now())); } public static T intenseCalculation(T value) { sleep(ThreadLocalRandom.current().nextInt(3000)); return value; } public static void sleep(int millis) { try { Thread.sleep(millis); } catch (In..
RxJava 2부터 Disposable 형태로 변경됐다.일반적인 형태로 많이 쓰는건 consumer 형태이다.예를 보자.Observable testObservable = Observable.range(1 , 10); Disposable disposable1 = testObservable .doOnDispose(() -> System.out.println("onDispse 1")) .doOnComplete(() -> System.out.println("onCompleted 1")) .subscribe(item -> System.out.println("emitted 1 -> " + item)); //consumer 로 진행 System.out.println( "isDisposed -> " + disposab..
Debugging 하는 방법RxJava 사용시 디버깅 라이버러리는frodo 를 사용하면 좋긴 한데 ( RxJava 1지원..ㅠ)https://github.com/android10/frodo.git일반적인 테스트 방법을 소개한다..doOnNext()를 활용하면 된다.예를 들어 다음과 같은 내용이 있다고 가정하자.주어진 3개의 내용에 알파벳을 뽑아내는 경우이다.TestObserver testObserver = new TestObserver(); Observable items = Observable.just("521934/2342/Foxtrot", "Bravo/12112/78886/Tango", "283242/4542/Whiskey/2348562"); items.concatMap( s -> Observable..
TestSchedulerTestObserver(or TestSubscriber)을 이용시await를 통해서 기다릴수 있지만 그러기엔 시간이 많이 걸릴수 있다.그래서 타임머신기능으로 시간을 미리 땡겨서 테스트가 가능하다.예를 들어 interval(10) 으로 10초뒤에 값을 체크를 하는 경우 10초를 기다리지 않고 10초 뒤로 시간 설정 후 바로 테스트 하게끔 하는 것이다.이 부분에 대해서 좀 더 공부가 필요해보인다.TestScheduler testScheduler = new TestScheduler(); TestObserver testObserver = new TestObserver(); Observable minTicker = Observable.interval(1, TimeUnit.MINUTES , ..
TestObserver , TestSubscriber이전 내용까지는 Blocking이 주된 내용이지만 이것만으로는 한계가 있다. 그래서 나온게 TestObserver 이다.TestObserver = Observable , Single , Maybe , Completable 에서 사용된다.TestSubscriber =Flowable 에서 사용된다.//우선 옵저버 생성 (5초동안 아이템을 배출) Observable source = Observable.interval(1, TimeUnit.SECONDS).take(5); TestObserver testObserver = new TestObserver(); //아직 구독이 안된건지 체크 testObserver.assertNotSubscribed(); //이제 구..
BlockingFirst() , BlockingSingle()이름 그대로 처음꺼만 가져오는 함수를 말한다.Observable source = Observable.just("Alpha", "Beta", "Gamma", "Delta", "Zeta"); String firstItem = source.filter( s -> s.length() == 5).blockingFirst(); String singleItem = source.filter( s -> s.length() == 4).take(1).blockingSingle(); assertTrue( firstItem.equals("Alpha")); assertTrue( singleItem.equals("Beta")); 결과 : SuccessBlocingSing..
일반적으로 Observable 을 테스트시 Blocking을 사용한다.먼저 일반 코드를 작성하면 다음과 같을겁니다.AtomicInteger hitcount = new AtomicInteger(); Observable source = io.reactivex.Observable.interval( 1 , TimeUnit.SECONDS).take(5); source.subscribe( i -> hitcount.incrementAndGet()); assertTrue( hitcount.get() == 5); 여기에서 5개를 가져오는 일반적인 코드이다. 결과는 실패이다.이유는 interval 함수를 보면 thread가 computation 이다. 그래서 가져올수 없다.@CheckReturnValue @Schedule..
실제 연산자를 사용자가 구현이 가능하다.관련해서 자세한 내용은영문 : http://reactivex.io/documentation/implement-operator.html한글 : http://reactivex.io/documentation/ko/implement-operator.html일단 구현해보자.아래 doOnEmpty는 빈값이 들어올때 함수가 실행되는 단순한 연산자이다.public static ObservableOperator doOnEmpty(Action action) { return observer -> new DisposableObserver() { boolean isEmpty = true; @Override public void onNext(T value) { isEmpty = false;..
자신만의 커스텀 함수를 만들어서 사용시 공유되는 이슈가 발생된다.예를 들어 보자.인덱스를 넣고 값을 저장하는 IndexedValue데이터 클래스를 먼저 만든다.static final class IndexedValue { final int index; final T value; IndexedValue(int index , T value){ this.index = index; this.value = value; } @Override public String toString() { return index + " - " + value; } } 그리고 compose에 들어갈 커스텀 함수를 추가한다.원하는 결과값은 index - value 을 나오는게 목표이다.static ObservableTransformer w..
파라미터를 통해서 compose를 활용하는 방법에 대해서 알아보자.우선 다음과 같은 내용이 있다.Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon") .collect( StringBuilder::new , (b,s) -> { if ( b.length() == 0) b.append(s); else b.append("/").append(s); }) .map(StringBuilder::toString) .subscribe(System.out::println); ==================================================================== Alpha/Beta/Gamma/Delta/Epsilon 주어진 문자열에 ..
중복되어 있는 걸 커스텀 공통 함수로 빼고 compose로 활용하는 방법에 대해서 알아보자.public static ObservableTransformer toImmutableList() { return upstream -> upstream.collect(ImmutableList::builder , ImmutableList.Builder::add) .map(ImmutableList.Builder::build) //반드시 Single 또는 Observable로 리턴해야한다. //Flowable -> toFlowable(); .toObservable(); } 일단 공통 함수를 작성한다. 내용은 간단하다.소스가 들어오면 collect로 imutableList로 변형해서 다시 옵저버 ( or Flowable)로..
ObservableTransformer우선 compose를 사용하는 방법에 대해서 알아보자.compose를 사용하는 주된 이유는 어떠한 공통된 일련의 동작을 커스텀해서 변형할수 있다.우선 사용하기 전 형태를 살펴보자.Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon") .collect(ImmutableList::builder , ImmutableList.Builder::add) .map(ImmutableList.Builder::build) .subscribe(System.out::println); Observable.range(1 , 15) .collect(ImmutableList::builder , ImmutableList.Builder::add..