듣보잡(?) Web Framework 사용해보기 - 1

듣보잡(?) Web Framework 사용해보기 - 1

개요

백엔드 프레임워크로 사용할 수 있는 것 중 여기저기서 쓴다고 들어 본 것들은 .net, node, flask, django, sinatra, rails, play, spring 정도가 있는 것 같다. 지금 유명하지는 않지만 앞으로도 유명하지 않을 수도 있겠지만 빠른 성능을 가진 다른 프레임워크를 써보고 싶었다. https://www.techempower.com/benchmarks/ 에 가면 프레임워크-DB 별로 성능을 비교해 놓은 걸 볼 수 있는데, 얼마나 신뢰할 수 있는 자료인지는 모르겠지만 재미로 본다고 생각하고 슬쩍 훑어 보았다. 뭘 한번 써볼까?

read more

Spark 시작하기 1.3 - AWS EMR 로 인스턴스 5대 클러스터링 해서 Spark 돌려보기

Spark 시작하기 1.3 - AWS EMR 로 인스턴스 5대 클러스터링 해서 Spark 돌려보기

소스 받기

$ git pull https://github.com/yaboong/spark-study-project.git

개요

지금까지 spark 를 local machine 에서 standalone 으로만 돌렸다. 단순 스크립트로 54분이 걸리는 작업을 spark 로는 90초 밖에 걸리지 않는 것을 확인했다. 그러면 AWS EMR(Elastic Map Reduce) 의 도움을 받아 클러스터링 해서 돌리면 얼마나 더 빨라질까?

read more

Spark 시작하기 1.2 - 좀 더 큰 데이터 처리해보기 & 성능비교

Spark 시작하기 1.2 - 좀 더 큰 데이터 처리해보기 & 성능비교

소스 받기

$ git pull https://github.com/yaboong/spark-study-project.git

개요

이전 포스팅 에서 %Y%m%d (20171210) 형식의 date string 을 가진 .txt 파일을 input 으로 받아 일요일이 몇개 있는지 알아내는 코드를 짰다. 이 코드를 똑같이 사용하고, 총 175,310,001 (약 1억 7천 5백만) 개의 lines, 1.58 GB 크기로 이루어진 .txt 파일을 input 으로 받아서 일요일이 몇개 있는지 찾아 볼 것이다. 똑같이 local machine 에서 standalone 으로 돌려 볼 것이며, 같은 작업을 python script 로 돌렸을 때와 시간이 얼마나 차이 나는지 살펴 볼 것이다. python 과 scala 를 비교하거나 하는 것이 아니라, spark 를 어설프게라도 사용할 때와 사용하지 않을 때의 비교를 해 보는 것이다. 단순한 배치 스크립트를 짤 때 python 을 많이 사용했었기 때문에, 단순한 방식으로 처리할 때와 spark 라는 엔진을 사용해서 처리할 때의 성능비교를 해 보았다.

read more

What is functional programming? - 1

What is functional programming? - 1

What is functional programming? - 1

함수형 프로그래밍

프로그램을 오직 순수 함수(pure function) 들로만, 부수효과(side effect) 가 없는 함수들로만 구축한다는 것.

부수효과(side effect) 란 그냥 결과를 돌려주는 것 이외의 어떤 일을 수행하는 함수를 말한다. 아래는 부수효과의 예시들이다.

  • 변수를 수정한다
  • 자료구조를 제자리에서 수정한다
  • 객체의 필드를 설정한다
  • 예외를 던지거나 오류를 내면서 실행을 중단한다
  • 콘솔에 출력하거나 사용자의 입력을 읽어들인다
  • 파일에 기록하거나 파일에서 읽어들인다
  • 화면에 그린다

함수형 프로그래밍은 우리가 프로그램을 작성하는 방식에 대한 제약이지 표현 가능한 프로그램의 종류에 대한 제약은 아니다.

순수 함수들로 프로그램을 작성하면 모듈성(modularity)이 증가하고, 이 덕분에 순수 함수는 테스트, 재사용, 병렬화, 일반화, 분석이 쉽고 버그가 생길 여지가 훨씬 적다.

read more

Programming in Scala summary

CH2

  • val var 차이 var 은 재할당

CH3

  • p78 배열을 생성하는 방법 두가지
      new Array[String](3)
    
      Array("a", "b", "c") 
    
  • Array 에서는 팩토리메소드 apply 호출.
  • 배열을 생성 한 후 해당 배열에 대한 apply, update 메소드는 인스턴스 메소드인듯
  • Array 에 있는 apply, update 메소드
  • 임의의 개수 인자 받기 * 사용
  • List 에서
      val twoThree = List(2, 3)
      val oneTwoThree = 1 :: twoThree
    
    • 일반적으로 a * b 의 경우 a.*(b) 와 같이 왼쪽 피연산자의 메소드를 호출하는 것이다.
    • 하지만 메소드 이름이 콜론(:) 으로 끝나는 경우 연산자 방식으로 사용 시 오른쪽 피연산자에 대한 호출을 한다.
    • 따라서 1 :: twoThree 에서 twoThree 를 호출 대상 객체로 1을 인자로 받는 메소드 호출인 twoThree.::(1) 로 해석한다.
    • 그래서 리스트 끝에는 항상 Nil 이 필요하다.
      • 왜냐하면, 1 :: 2 :: 3 만을 사용해서 리스트를 만들었다면 1 :: (2 :: 3) 의 형태가 되는 것인데,
      • 여기서 :: 연산자(함수)는 오른쪽 피연산자에 대한 호출을 하므로 (2 :: 3) 은 3.::(2) 의 호출 형태를 보인다.
      • 3은 Int 이기 때문에 :: 이라는 함수가 없다.
      • :: 함수를 호출하기 위해서는 리스트 타입이 있어야 하는데, 이를 위해 스칼라에서는 Nil 을 List 클래스의 멤버로 둔 것이다.

        read more