scala에서 커맨드 매개 변수를 처리하려고 보니..

scopt는 너무 복잡한 것 같다.

 

아래와 같이 단순하게 커맨드 라인 매개 변수 처리는 간단한 것이 좋은 것 같다. 

예제는 다음과 같다.

 

object App {
  def main(args: Array[String]): Unit = {

    def nextOption(map : Map[Symbol, Any], list: List[String]) : Map[Symbol, Any] = {
      list match {
        case Nil => map
        case "-broker" :: value :: tail =>
          nextOption(map ++ Map('broker -> value.toString), tail)
        case "-topic" :: value :: tail =>
          nextOption(map ++ Map('topic -> value.toString), tail)
        case "-schema_registry" :: value :: tail =>
          nextOption(map ++ Map('schema_registry -> value.toString), tail)
        case "-sink_jdbc_url" :: value :: tail =>
          nextOption(map ++ Map('sink_jdbc_url -> value.toString), tail)
        case "-sink_table" :: value :: tail =>
          nextOption(map ++ Map('sink_table -> value.toString), tail)
        case "-group_id" :: value :: tail =>
          nextOption(map ++ Map('group_id -> value.toString), tail)
        case option :: tail => println("Unknown option "+option)
          sys.exit(1)
      }
    }
    val options = nextOption(Map(), args.toList)
    println(options)

    val kafkaBroker = options.get('broker)
    val kafkaTopic = options.get('topic)
    val schemaRegistry = options.get('schema_registry)
    val sinkJdbcUrl = options.get('sink_jdbc_url)
    val sinkTable = options.get('sink_table)
    val consumerGroupId = options.get('group_id)

    println(s"$kafkaBroker")
    println(s"$kafkaTopic")
    println(s"$schemaRegistry")
    println(s"$sinkJdbcUrl")
    println(s"$sinkTable")
    println(s"$consumerGroupId")

  }
}

 

결과

 

Map('group_id -> mygroup, 'broker -> localhost:9092, 'sink_table -> user_sink, 'topic -> user, 'schema_registry -> localhost:8081, 'sink_jdbc_url -> jdbc_url)
Some(localhost:9092)
Some(user)
Some(localhost:8081)
Some(jdbc_url)
Some(user_sink)
Some(mygroup)

Posted by '김용환'
,

예시는 다음과 같다. ruby와 python과 비슷하다. 

 

주의할 점은 toString으로 변환할 때이다. 

 

val symbol1 = 'Symbol
val symbol2 = 'Symbol1
println(symbol1 eq symbol2) // false

val symbol3 = Symbol("symbol")
val symbol4 = Symbol("symbol")
println(symbol3 eq symbol4) // true

symbol3 match {
  case Symbol("symbol") => println("ok") // ok
  case _ => println("xx")
}

println('Symbol.toString == symbol1.toString) // true
println('Symbol.toString eq symbol1.toString) // false

자바 때문에 깜박할 수 있는데.

스칼라의 ==는 자바의 equals이다 (값 비교), 따로서 당연히 true

스칼라의 eq는 자바의 주소 값 비교이다. 따라서 당연히 false.

 

 

 

보통 scala에서는 java String을 intern한 값이기에 ==, eq 모두 같은 값이다.

 

val a = "a"
val b = "a"

println(a == b) // true
println(a eq b) // true
Posted by '김용환'
,

 

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791160073492&orderClick=LAG&Kc=

 

플랫폼의 생각법

구글, 페이스북, 아마존 등 공급자와 소비자라는 두 개...

www.kyobobook.co.kr

 

이 책은 대학생들과 IT 직장인이라면 보면 좋은 책 같다.

 

내게 감동이 있었던 것은 카카오 모빌리티를 통해서 택시 기사의 소득이 올라갔다는 점이다. 단순히 콜 호출 받기만, 조금 더 편해진 줄 알았는데, 수익까지 올라갔다는 것은 뺏는 시장이 아니라 서로 윈윈하는 시장이 되었다는 점이다.

 

우버나 리프트가 기존 택시 기사의 소득이 들어들게 하고 공급자가 저가 소득자가 된다면 공유 플랫폼이 정상적인지 다시 한번 생각하게 되는 좋은 책이었다. 그 전에는 플랫폼 사업자의 성공만 봤다면, 이 책을 통해 사업적 플랫폼 기업에 대해 다시 생각할 수 있게 되어서 좋았다

Posted by '김용환'
,