저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

리액터 윈도우


일정 개수로 묶어서 Flux 만들기: window(int), window(int, int)

Flux#window(int) 메서드를 사용하면 시퀀스가 발생시키는 데이터를 일정 개수로 묶을 수 있다. 다음은 예제 코드이다.


Flux<Flux<Integer>> windowSeq = 

        Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

             .window(4); // 4개 간격으로 4개씩 새로운 Flux로 묶음


windowSeq.subscribe(seq -> { // seq는 Flux<Integer>

    Mono<List<Integer>> monoList = seq.collectList();

    monoList.subscribe(list -> logger.info("window: {}", list));

});


위 코드에서 Flux#window(4)가 리턴하는 타입은 Flux<Flux<Integer>>이다. 즉 값이 Flux<Integer>인 Flux를 리턴한다. 이 시퀀스(Flux<Integer>)가 발생하는 값의 개수는 최대 4개이다. 위 코드의 실행 결과는 다음과 같다. 결과를 보면 4개씩 데이터를 묶어서 하나의 Flux로 만든 것을 알 수 있다.


01:19:52.388 [parallel-2] INFO batch.WindowTest - window: [5, 6, 7, 8]

01:19:52.388 [parallel-1] INFO batch.WindowTest - window: [1, 2, 3, 4]

01:19:52.391 [parallel-1] INFO batch.WindowTest - window: [9, 10]


Flux.window(int maxSize, int skip) 메서드를 사용하면 어느 간격으로 데이터를 묶을지 정할 수 있다. 두 번째 파라미터는 몇 개씩 건너서 데이터를 묶을 지 결정한다. 예를 들어 다음 코드를 보자.


Flux<Flux<Integer>> windowSeq =

        Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

                .window(4, 3); // 3개 간격마다 4개씩 새로운 Flux로 묶음


windowSeq.subscribe(seq -> { // seq는 Flux<Integer>

    Mono<List<Integer>> monoList = seq.collectList();

    monoList.subscribe(list -> logger.info("window: {}", list));

});


위 코드는 두 번째 인자로 3을 주었다. 이 경우 3개 데이터 간격으로 4개씩 데이터를 묶는다. 데이터를 묶는 간격이 데이터를 묶는 개수보다 작으므로 일부 데이터에 중복이 발생한다.


15:18:37.898 [main] INFO batch.WindowTest - window: [1, 2, 3, 4]

15:18:37.898 [main] INFO batch.WindowTest - window: [4, 5, 6, 7]

15:18:37.898 [main] INFO batch.WindowTest - window: [7, 8, 9, 10]

15:18:37.898 [main] INFO batch.WindowTest - window: [10]


다음과 같이 skip 파라미터 값으로 5를 주면 어떻게 될까? 데이터를 묶는 개수보다 간격이 더 크므로 일부 데이터에 누락이 발생할 것이다. 


Flux<Flux<Integer>> windowSeq2 =

        Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

                .window(4, 5); // 5개 간격마다 4개씩 새로운 Flux 묶음


// 첫 번째 Flux<Integer> : [1, 2, 3, 4]
// 두 번째 Flux<Integer> : [6, 7, 8, 9]



일정 시간 간격으로 묶어서 Flux 만들기: window(Duration), window(Duration, Duration)

Flux#window(Duration) 메서드를 사용하면 시퀀스가 발생시키는 데이터를 일정 시간마다 묶을 수 있다. 다음은 예제 코드이다.


Flux<Flux<Long>> windowSeq = Flux.interval(Duration.ofMillis(100))

      .window(Duration.ofMillis(500)); // 500밀리초 간격마다 500밀리초 동안 데이터 묶음


이 코드는 500밀리초(0.5초) 동안 발생한 데이터를 묶는다.


데이터를 묶기 시작하는 간격을 지정하고 싶다면 Flux#window(Duration, Duration) 메서드를 사용한다.


Flux<Flux<Long>> windowSeq = Flux.interval(Duration.ofMillis(100))

        // 400밀리초 간격마다 500밀리초 동안 데이터 묶음

        .window(Duration.ofMillis(500), Duration.ofMillis(400))



특정 조건에 다다를 때가지 묶어서 Flux 만들기: windowUntil(Predicate)

특정 조건을 충족하는 데이터를 만날 때까지 묶어서 Flux로 만들고 싶다면 windowUntil()을 사용한다. 다음은 사용 예이다.


Flux.just(1,1,2,3,3,4,5)

        .windowUntil(x -> x % 2 == 0)

        .subscribe((Flux<Integer> seq) -> {

            seq.collectList().subscribe(lst -> logger.info("window: {}", lst));

        });


위 코드는 2로 나눠서 나머지가 0인(즉 짝수인) 값을 만날 때까지 묶는다. 실제 실행 결과를 보면 다음과 같다.


01:19:27.166 [main] INFO batch.WindowTest - window: [1, 1, 2]

01:19:27.169 [main] INFO batch.WindowTest - window: [3, 3, 4]

01:19:27.169 [main] INFO batch.WindowTest - window: [5]


다음과 같이 마지막 데이터가 조건에 해당하면 어떻게 될까?


Flux.just(1,1,2,3,3,4)

        .windowUntil(x -> x % 2 == 0)

        .subscribe(seq -> {

            seq.collectList().subscribe(lst -> logger.info("window: {}", lst));

        });


결과를 보면 다음과 같이 마지막에 빈 Flux가 하나 더 발생되는 것을 알 수 있다.


17:23:22.724 [main] INFO batch.WindowTest - window: [1, 1, 2]

17:23:22.727 [main] INFO batch.WindowTest - window: [3, 3, 4]

17:23:22.727 [main] INFO batch.WindowTest - window: []


특정 조건을 충족하는 동안 묶어서 Flux 만들기: windowWhile(Predicate)

Flux#windowWhile(Predicate)은 해당 조건을 충족하지 않는 데이터가 나올 때까지 묶어서 Flux를 만든다. 조건을 충족하지 않는 데이터로 시작하거나 연속해서 데이터가 조건을 충족하지 않으면 빈 윈도우를 생성한다.


Flux.just(1,1,2,4,3,3,4,6,8,9,10)

        .windowWhile(x -> x % 2 == 0) // 짝수인 동안

        .subscribe(seq -> {

            seq.collectList().subscribe(lst -> logger.info("window: {}", lst));

        });


이 코드의 결과는 다음과 같다.


01:07:00.239 [main] INFO batch.WindowTest - window: []

01:07:00.242 [main] INFO batch.WindowTest - window: []

01:07:00.242 [main] INFO batch.WindowTest - window: [2, 4]

01:07:00.242 [main] INFO batch.WindowTest - window: []

01:07:00.242 [main] INFO batch.WindowTest - window: [4, 6, 8]

01:07:00.242 [main] INFO batch.WindowTest - window: [10]


Flux 대신 List로 묶기: buffer류 메서드

window류 메서드가 Flux로 묶는다면 buffer류 메서드는 Collection으로 묶는다. 메서드 이름이 window에서 buffer로 바뀔뿐 시그너쳐는 동일하다. 다음은 buffer류 메서드의 사용 예이다.


Flux<List<Integer>> bufferSeq = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).buffer(4);

bufferSeq.subscribe(list -> logger.info("window: {}", list));



관련글




Posted by 최범균 madvirus

댓글을 달아 주세요

윈도우8.1에서 파이썬을 이용해서 안드로이드 폰과 블루투스 통신을 해야 할 일이 생겨서 bluez를 설치했다.


설치 방법은 http://karulis.github.io/pybluez/ 문서를 참고해서 진행했다.


  • http://karulis.github.io/pybluez/ 에 방문해서 ZIP 파일을 다운로드 받는다.
  • 압축 받은 파일의 압축을 푼다.
  • 명령 프롬프트로 압축을 푼 폴더로 이동한다.
  • 다음 명령어를 실행하면 설치가 끝난다: python setup.py install
setup.py install을 실행할 때 아래와 비슷한 에러가 발생할 수 있다.

error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27

이 경우 놀라지 말고 콘솔에 찍힌 URL에서 파이썬용 VC++ 컴파일러를 다운로드받아 설치한 뒤에 다시 setup.py를 실행하면 된다.


Posted by 최범균 madvirus

댓글을 달아 주세요

  1. 감사합니다. 2017.05.05 19:37 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 게시물 감사합니다.
    python setup.py install를 하게되면,
    ' Could not find the Windows Platform SDK ' 이라는 에러메시지가 나오는데요..
    왜그럴까요??

    제 사용환경은
    파이썬 2.7.13 - 64bit
    윈도우10 - 64bit 입니다.

PHP를 이용해서 프로젝트를 할 가능성이 높아져서, 로컬에 PHP 개발을 시작할 수 있는 가장 기본적인 환경을 구축해봤다. PC가 윈도우 7이어서 이를 기준으로 정리한다.


아파치 웹 서버 설치


PHP를 실행하기 위한 웹 서버를 설치하는데 여기서는 아파치를 설치한다. 이 글을 쓰는 시점에 윈도우용 인스톨 버전은 2.2.25 버전이 나와 있다. (2.4 버전은 아직 윈도우용 인스톨 버전이 없다.) http://httpd.apache.org/download.cgi 사이트에서 httpd_2.2.25-win32-x86-openssl-0.9.8y.msi 파일(이름은 버전에 따라 다르다) 을 다운로드 받은 후 실행하면 설치가 진행된다.


설치 디렉토리를 변경하지 않으면 C:\Program Files\Apache Software\Apache2.2 디렉토리에 설치된다. 64비트 윈도우인 경우에는 C:\Program Files (x86)\Apache Software\Apache2.2 에 설치된다.


PHP 다운로드


다음으로 할 작업은 PHP를 다운로드 받아 설치하는 것이다. 설치 과정이라고 해서 대단한 건 없고, 파일을 다운로드 받아 압축만 풀면 된다.http://windows.php.net/download 에서 다운로드 받으면 되는데, 현 시점에서 아파치 2.2 버전에 맞는 윈도우 PHP 버전은 5.4.17 버전이기에 이 글에서는 이 버전의 파일인 php-5.4.17-Win32-VC9-x86.zip 를 다운로드 받았다. 이 파일의 압축을 알맞은 곳에 푼다. 여기서는 c:\devtool 에 풀었다고 가정하고 설정 부분을 진행한다.


php 파일 설정


php 설정 파일인 php.ini 파일을 다음의 두 곳 중에 한 곳에 생성해준다.

  • c:\windows
  • 아파치설치디렉토리

개발용 php.ini 파일은 php 압축을 푼 디렉토리에 포함되어 있는 php.ini-development 파일을 복사해서 사용하면 된다.


php가 확장 기능을 사용할 수 있도록 php.ini 파일에서 extension 경로를 알맞게 지정해 준다.


; On windows:

; extension_dir = "ext"

extension_dir = "C:\devtool\php-5.4.17-Win32-VC9-x86\ext"


...

...

extension=php_mysqli.dll <-- MySQL을 사용하려면 아래와 같이 주석 제거

extension=php_mysqli.dll



아파치 웹 서버 설정


PHP를 설치했으므로 그 다음으로 할 작업은 아파치 설정에 PHP 연동 부분을 추가해주는 것이다. 아파치 설치 디렉토리의 conf\httpd.conf 파일을 열어서 아래 줄을 추가한다.아래 설정에서 주의 할 점은 LoadModule 설정에서 파일 경로를 지정해 줄 때 \ 대신 / 를 사용한다는 점이다.


LoadModule php5_module "C:/devtool/php-5.4.17-Win32-VC9-x86/php5apache2_2.dll"


AddType application/x-httpd-php .php


설정이 올바르게 되었는지 확인하기 위해 명령행 프롬프트를 열고 아파치 설치 디렉토리로 이동한 뒤에 "httpd -t"  명령어를 실행하자. 이 명령어를 실행했을 때 Syntax OK 가 출력되면 설정이 올바르게 된 것이다.


c:\>cd [아파치설치디렉토리]\bin

c:\...\bin> httpd -t

Syntax OK


테스트


이제 남은 작업은 php를 작성해서 올바르게 동작하는지 확인해보는 것이다. 아래 파일을 [아파치디렉토리]\htdocs 디렉토리에 test.php 파일로 작성하자.


<?php

 

phpinfo();

 

phpinfo(INFO_MODULES);

 

?>


웹 브라우저를 열고 http://localhost/test.php 를 실행해보자. 아래 이미지와 비슷한 화면이 출력되면 정상적으로 실행된 것이다.





Posted by 최범균 madvirus

댓글을 달아 주세요

  1. 고슴도치 2013.07.31 14:12 신고  댓글주소  수정/삭제  댓글쓰기

    xampp 쓰시면 apache, php, mysql... 무려 xdebug 까지 한방에 설치 되용 ^^

    • 최범균 madvirus 2013.07.31 14:43 신고  댓글주소  수정/삭제

      현재는 로컬에 아파치, 톰캣, MySQL이 이미 설치되어 있어서 php만 따로 설치하느라 이렇게 했는데요, OS 다시 설치할 때, 이 패키지를 써 봐야 겠네요. 좋은 정보 고맙습니다.

  2. 오유경 2014.04.28 15:52 신고  댓글주소  수정/삭제  댓글쓰기

    Syntax OK
    까지 떴는데도

    http://localhost/test.php 를 실행하면
    test.php소스만 보이네요..왜이럴까요..

  3. 오유경 2014.04.28 16:11 신고  댓글주소  수정/삭제  댓글쓰기

    오..껐다가 다시 시작했더니 됐어요 감사합니다.

  4. 오유경 2014.05.08 09:34 신고  댓글주소  수정/삭제  댓글쓰기

    담아갈게요~

  5. 최은우 2014.07.26 03:19 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다~~
    "php 설치"로 검색하다가 들어왔는데
    덕분에 쉽게 PHP 설치 완료했습니다. ^^

  6. ㅜㅜ 설치가 매우 힘드네요ㅜㅜㅜ 2014.09.18 23:45 신고  댓글주소  수정/삭제  댓글쓰기

    ㅜㅜ 설치가 매우 힘드네요ㅜㅜㅜ
    The requested operation has failed! 이런 에러가 뜨네요 ㅜㅜㅜ

    httpd.exe: Syntax error on line 37 of C:경로 httpd.conf: ServerRoot must be a valid directory 이런 에러가 납니다

    문제가 뭔지,,,

  7. 질문자 2015.07.07 14:14 신고  댓글주소  수정/삭제  댓글쓰기

    syntex OK 메시지 까지 출력했는데 test.php 페이지를 못찾습니다 ㅜ

  8. 김수영 2015.08.12 22:28 신고  댓글주소  수정/삭제  댓글쓰기

    php 파일을 만들라는게 뭔소리인가요?? 그냥 텍스트로 만들고 .php 붙이면 되나요??