분류 전체보기 102

Scala, Map Collection의 withDefault, withDefaultValue 메소드

Scala의 Key-Value Collection인 Map에는 withDefault와 withDefaultValue 메소드가 있다. 이 메소드들은 Map에 Key가 없을 때의 기본 값을 지정해 준다. val baseMap = Map[String, String] ( "Hello" -> "World", // 기본적인 Map "One" -> "1", "Two" -> "2" ) withDefault 메소드는 부분 함수를 입력받아 Key가 없으면 부분 함수에서 매칭된 값을 반환하는 Map을 만들어 준다.val defaultMap1 = baseMap.withDefault { // withDefault 메소드는 부분 함수를 입력받는다. case "Number" => "numb" case _ => "None!" } p..

Scala 2017.05.09

Android 버전에 따라 실행되는 코드

안드로이드 어플리케이션의 하위 호환성을 위해 버전에 따라 기능을 제한할 필요가 있다. 그러기 위해서는 몇 가지 설정이 필요하다. 1. Build.gradle먼저 어플리케이션의 타겟 Sdk 버전과 지원가능한 최소 Sdk버전을 정해야 한다. 여기서 최소 Sdk 버전(minSdkVersion)에 따라 앱을 설치할 수 있는 최소 버전의 안드로이드가 정해지고 타겟 Sdk 버전(targetSdkVersion)에 따라 빌드할 때 앱에서 상위 버전 코드를 아예 제외할지 여부가 결정된다.minSdkVersion 18 targetSdkVersion 22 이렇게 설정하면 젤리빈MR2(Sdk 18)부터 설치가 가능하고 롤리팝(Sdk 22) 이후 버전에서 지원되는 기능은 모두 제외된 앱이 만들어진다. 2. 버전에 따른 실행 분..

Java | Android 2017.05.09

Java HTML parser, Jsoup로 원하는 값 얻어내기 - 로그인

이 포스트에서는 로그인이 필요한 사이트와 Request Header를 검사하는 사이트를 파싱하는 과정을 적어둔다. 0. 웹 사이트 로그인 먼저 웹 사이트에 로그인에 대해 다시 생각해 볼 필요가 있다. 최근 웹 사이트에서 사용되는 로그인 방법은 크게 두 가지로 볼 수 있다. 첫 번째는 세션을 이용한 방법이고, 두 번째는 Restful API에 주로 사용되는 토큰 인증이다. 발급 받은 토큰을 이용하는 방법은 이전 포스트에서 원하는 값을 Jsoup의 Document를 파싱해 얻어낸 것처럼 간단하게 얻어낼 수 있다. 물론 토큰이 HTML요소가 아니라 Script 요소로 있는 경우도 많지만 정규식이나 replace, split 같은 메소드를 이용하면 별 어려움이 없다. 다시 첫 번째, 세션 로그인으로 돌아가면 세..

Java | Android 2017.05.08

Java HTML parser, Jsoup로 원하는 값 얻어내기 - 기본

Jsoup는 아주 강력하고 재미있는 라이브러리다. 단순한 HTML 문서 파싱을 넘어 웹 사이트에 대한 Request, Response를 모두 처리할 수 있다. 덕분에 일부 특별한 경우(플래시, 애플릿, ActiveX같은 비표준이나 WebSocket)가 아니라면 브라우저로 사이트를 이용하는 상황을 그대로 재현해낼 수 있다. 다시 말해, 대부분의 사이트의 원하는 정보만 뽑아내는 '뷰어'를 만들 수 있다는 것이다. 몇 가지 간단한 예제를 통해 사이트에서 원하는 정보만 뽑아내는 과정을 적어보려 한다. 0. Gradle 디펜전시 추가compile group: 'org.jsoup', name: 'jsoup', version: '1.10.2'Maven Repository를 통해 간단하게 디펜전시를 추가 할 수 있다...

Java | Android 2017.05.04

Android Activity 스와이프해서 닫기(SwipeBackLayout)

최근 출시되는 대부분의 앱은 스와이프해서 액티비티를 닫는 기능을 지원한다. 사용자 측면에서 생각해도 엄지손가락에 힘주고 닫기버튼을 찾아 누르는 것보다 화면을 스와이프하는게 당연히 더 편하다. 아무튼, 액티비티를 스와이프해서 닫는 가장 기본적인 방법은 Layout에 onTouchEvent를 구현하는 방법이다. new View.OnTouchListener(){ private float x; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN : x = motionEvent.getX(); break; case MotionEv..

Java | Android 2017.05.04

Play Framework 2.5. Http 서비스 호출을 위한 WSClient

AJAX의 크로스도메인 제약을 넘어서기 위해 CORS가 제시되었지만 여러 이유로 아직까지 서버에서 다른 서버로 요청하고 그 결과를 클라이언트에게 전달하는 방법을 주로 구현한다. 그 구현에 사용되는 라이브러리도 다양한데, JSOUP같은 범용적인 라이브러리도 있지만 Spring에서 주로 RestTemplate를 사용해 Java Bean으로 결과를 매핑해 사용한다.Play Framework에서는 JSOUP와 유사한 WSClient를 사용하는 것을 권장하고 있다. 1. 기본WSClient를 사용하려면 먼저 디펜전시를 추가해야 한다.libraryDependencies ++= Seq(ws) 디펜전시를 추가하면 WSClient 객체를 주입 받아 바로 사용 할 수 있다.import play.api.mvc._ impor..

Play Framework 2.5. Action을 위한 Results Object

Play Framework의 컨트롤러의 함수는 RequestHeader를 입력받아 Result를 반환하는 함수인 Action을 전달받는다. 반환하는 Result는 Spring의 ResponseEntity 클래스의 객체와 마찬가지로 HttpStatus 코드를 담고있는 객체다. Play Framework에서는 Results Object에 구현되어 있는 함수를 이용하거나 직접 Result 객체를 만들 수 있다. Results Object에서 자주 사용되는 함수는 아래와 같다. Results 함수 Status내용 OK 200정상 BadRequest 400 잘못된 요청 Unauthorized 401 권한이 없음 Forbidden 403 요청 거부됨 NotFound 404 서버에 없는 페이지 InternalServ..

Play Framework 2.5. Json 변환

어노테이션으로 객체를 간편하게 Json 문자열로 바꿀 수 있는 Spring과 달리 Play Framework는 객체를 Json으로 바꾸는 암시적 함수를 구현해 두어야한다. 1. 기본먼저 Play Framework에서 사용되는 관련 구현체들을 이해할 필요가 있다. 1) JsValueJson 값을 위한 Trait이다. JsValue는 암시적으로 선언된 Writeable 클래스를 통해 String으로 변환되므로 Action에서 Results.Ok(jsValue)와 같이 반환 할 수 있다. JsValue는 Json을 표현하기 위한 다양한 하위 자료형을 가지는데, JsValue를 상속해 구현된 타입은 아래와 같다. JsObject "Key" -> "JsValue"를 가지고 있는 Map. JsArray Json에서..

Play Framework 2.5. Built-in Filters, CSRF Filter, Custom Filter

Filter는 특정 URL에 영향을 미치는 Action과 달리 Gzip을 이용한 HTTP 압축이나 로깅, 보안 헤더 등 사이트 전체에 필요한 요소를 정의한다. 공식 문서에서는 모든 경로에 필요한 작업이 아니라면 ActionBuilder를 이용해 만든 Action을 사용하는 것이 더 좋다고 소개하고 있다. 0. Dependency 추가filter를 사용하려면 build.sbt 파일의 libraryDependencies 항목에 filters를 추가해야 한다. 1. Built-in Http FiltersPlay Framework는 4개의 필터를 기본으로 제공한다. 기본으로 제공되는 필터들은 DefaultHttpFilters 클래스를 상속받은 필터 클래스에 주입 받아 DefaultHttpFilters 클래스의 ..

Scala의 Future의 map, for, recover

1. map, filter언젠가 값을 가지게 되는 Future에 고차함수를 적용하여 새로운 Future를 얻을 수 있다.import scala.concurrent.ExecutionContext.Implicits._ val future: Future[Int] = Future { // 2초 후 값 1을 가지게 된다. TimeUnit.SECONDS.sleep(2L) 1 } val futureMap: Future[Int] = future.map(_ * 2) // future가 완료되면 거기에 2를 곱한다 val futureFilter: Future[Int] = futureMap.filter(_ < 1) // futureMap이 완료되면 그 중 1보다 작은 값만을 골라낸다. 2. for스칼라 어디에든 쓰이는 fo..

Scala 2017.04.16