Mesos 가 예제가 많길래 가장 영향력이 있는 줄 알았는데.



2016.9월.. docker cluster management할 수 있는 툴을 조사해봤다. 




구글의 Kubernetes, Docker Swarm, Apache Mesos, Hashicorp nomand, Coreos Fleet 정도가 있는 것 같다.



mesos가 많이 알려져 있어서 1등 인줄 알았건만, 현실은 역시 구글의 Kubernetes,


 2 등은 Docker swarm 이다. 





Posted by '김용환'
,



scala에서 main 메소드에서 아규먼트를 처리하고 싶을 때를 위한 예시이다. 


Array[String] 타입이라서 collection api를 사용할 수 있다. 


3개의 변수에 한 번에 할당할 수 있는 expression도 제공한다.

def main(args: Array[String]): Unit = {
args.foreach(arg => println(arg))

println(args(0))
println(args(1))
println(args(2))

val (first, second, third) = (args(0).toInt, args(1).toInt, args(2))
println(first)
println(second)
println(third)
println(third.getClass)

println(args.toList)


}






1

2

test

1

2

test

1

2

test

class java.lang.String
List(1, 2, test)


Posted by '김용환'
,

scala 에서 import 문을 쓸 때, java.lang.* 과 같이 쓸 수 있다. 



import java.lang._



한 번에 필요한 클래스만 import 문으로 쓸 수 있다.


import java.lang.{Float, Double, Integer}




특이한 것은 =>을 이용해서 나름 import rename 기능을 쓸 수 있다.


import java.lang.{Long => JLong}
val scalaLong : Long = 1L
println(scalaLong.getClass.getCanonicalName)

val javaLong : JLong = 1L
println(javaLong.getClass.getCanonicalName)


결과는 다음과 같다. scala long과 java long을 나눠 쉽게 쓸 수 있다.


long

java.lang.Long




또한, 여러 줄에 걸쳐 rename할 필요 없이 한 번에 사용할 수 있다.


import java.util.{Map ⇒ JMap, List ⇒ JList}





자바의 static import 기능은 짧게 static 없이 사용한다.


import java.lang.Math._



rename 기능과 static import을 합쳐서 커스텀 메소드도 만들어 낼 수 있다. 


import java.lang.Class.{ forName => classForName }
classForName("com/google/model/Member")






Posted by '김용환'
,

JVM의 safepoint

java core 2016. 9. 8. 17:33




JVM safepoint는 모든 쓰레드가 실행 상태에서 중지된 때의 시간을 의미한다. 즉, stop-the-world 중지 메커니즘이라 할 수 있다. 


safepoint는 stop-the-world 가비지 콜렉션을 포함해 전체 JVM 활동을 조정하기 위해 필요하다. 


자세한 내용은 아래 블로그를 참조한다. 간단하지만 중요한 내용이 있다. 


http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html



참고로, JVM 내부에 접근하지 못하는 외부 프로파일러와 대조적으로, Flight Recorder는 JVM safepoint 바깥에서 데이터를 접근할 수 있다.



Posted by '김용환'
,



JDK에는 Flight Recorder라는 훌륭한 프로파일러가 포함되어 있다. 진짜 괜찮은 프로파일러이다. 나는 JDK 8(101)을 쓰고 있다.


테스트를 위해서 CPU를 많으 쓰는  MyApp.java 를 생성한다. 



$ java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr MyApp

Started recording 1. The result will be written to:

..

디렉토리에 myrecoding.jfr 에 생성된다.


이제 설치된 java mission control을 실행한다.

$ jmc &


그리고, File - Open 을 클릭해서 myrecoding.jfr을 연다.



프로파일링 관련 다양한 정보를 보여준다.


Flight Recorder는 런타임에 JVM이 나타나는 이벤트를 기록할 수 있는 내부 JVM 후크(hook)를 사용하여 동작할 수 있도록 설계되었다. Flight Recorder가 캡처한 이벤트는 메모리 할당, 쓰레드 상태 변경, IO 동작, CPU 동작을 포함한다.



Flight Recorder는 비-상용 환경에서 무료로 사용할 수 있다. 상용 환경의 사용에 대해서 알려면, 오라클 라이선스-http://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/about.htm를 살펴본다.


문서를 보면, 다음과 같이 적혀 있다. 상용 환경에서 사용하려면 commercial license를 획득해야 한다.
Java Flight Recorder requires a commercial license for use in production. To learn more about commercial features and how to enable them please visit http://www.oracle.com/technetwork/java/javaseproducts/.


Flight Recorder는 JMC와 같은 Oracle Java SE Advanced & Suite Products 군에 속한다. 



자세한 내용은 아래를 참고한다. 


http://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/about.htm

Posted by '김용환'
,



educated guess의 뜻을 잘 설명한 싸이트



http://m.blog.naver.com/hankahn2008/130170627826




an educated guess - (학식과 경험을 기반으로 하는) 합리적은 추측 (= an informed guess)

a wild guess 막연한 추측

Posted by '김용환'
,

trait는 자바의 interface와 비슷하지만, 내부 구현상 상속을 받으면서 abstract class 역할도 담당한다. 

sealed trait라는 것이 있어서 trait와 비교했다.



model.scala 라는 파일을 다음처럼 생성했다. 



model.scala

sealed trait Order {
def id: Int
def price: Double
}

trait Member {
def id: Int
def name: String
}

case class MemberOrder(id: Int, price: Double) extends Order

case class MemberObject(id: Int, name: String) extends Member


trait는 해당 파일 또는 다른 파일에서 사용할 수 있지만, sealed trait는 c의 static 처럼 해당 파일에서만 사용할 수 있다. 에러가 발생하지 않는다. 





test.scala 파일

case class AnotherMemberObject(id: Int, name: String) extends Member
// case class AnotherMemberOrder(id: Int, name: Double) extends Order // 에러 발생


Order는 sealed trait이기 때문에 외부 파일에서는 상속받을 수 없다. 


Error:(12, 62) illegal inheritance from sealed trait Order

case class AnotherMemberOrder(id: Int, name: Double) extends Order







 scala 내부에서 사용할 trait 또는 class를 sealed modifier를 사용하고, 외부로 오픈할 클래스를 final case class로 연동하기도 한다.




<List>

sealed trait List[+A] {

}

final case class ::[A](head: A, tl: List[A]) extends List[A]

final case class Nil extends List[Nothing]




<Option>

sealed abstract class Option[+A] extends Product with Serializable {

}


final case class Some[+A](x: A) extends Option[A]



<Try>


sealed abstract class Try[+T] {

}

final case class Success[+T](value: T) extends Try[T] 

final case class Failure[+T](exception: Throwable) extends Try[T]




Posted by '김용환'
,




scala 콜렉션의 map은 변형의 의미를 가진다. collection map을 의미하지 않는다. ;;;


1. map 예시이다. 


예시 1- range의 모든 값에 10을 곱하기

예시 2-List[Int]를 List[String]으로 변환하기

예시 3-List[Int]에 내용 변경하기

예시 4-List[String]에 내용 변경하기

println((1 to 10).map(_*10))

val ints = List(3, 10, 15)
println(ints.getClass)
println(ints)

val strings = ints.map(_.toString())
println(strings)

val variants = ints.map {
x => x * 2 + 1
}
println(variants)

val variants2 = strings.map {
x => x * 2
}
println(variants2)



결과


Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

class scala.collection.immutable.$colon$colon

List(3, 10, 15)

List(3, 10, 15)

List(7, 21, 31)

List(33, 1010, 1515)




2.  flatten 예시이다.



flatten은 콜렉션을 펼쳐놓는 메소드이다.


예시 1 - List의 List를 List로 변환 

예시 2 - Array의 Array를 List로 변환

예시 3 - List의 List를 List로 변환하면서 동일 값은 하나로 모은다. 

val lists = List(List(1), List(2))
println(lists.flatten)

val arrays = Array(Array(3), Array(4))
println(arrays.flatten.toList)

val colleagues = List(List("Kyle", "Jonathan", "Daisy"), List("Kyle", "Ethan"))
println(colleagues.flatten)
println(colleagues.flatten.distinct)


결과는 다음과 같다.


List(1, 2)

List(3, 4)

List(Kyle, Jonathan, Daisy, Kyle, Ethan)

List(Kyle, Jonathan, Daisy, Ethan)




참고로 None을 flatten을 할 때, none은 다 날려준다.

val list = List(Some(1), None, None, Some(2))
println(list.flatten)

결과

List(1, 2)





collection map에도 flatten 메소드를 적용할 수 있다.


val maps = Map("A" -> 1, "B" -> 2)
println(maps.keys.flatten)


결과는 다음과 같다.


Set(A, B)




참고로, values에 대해서 flatten 메소드를 호출하면 어떻게 될까?


val maps = Map("A" -> 1, "B" -> 2)
println(maps.values) println(maps.values.flatten) // 에러 발생


결과이다. 

MapLike(1, 2)


Error:(20, 25) No implicit view available from Int => scala.collection.GenTraversableOnce[B].

    println(maps.values.flatten)



에러가 발생한다. 이유는 MapLike 클래스라서 flatten을 사용할 수 없다. List로 바꿔서 가든지. 그냥 가든지 해야 한다.



아래 코드는 잘 동작한다. 

val maps = Map("A" -> 1, "B" -> 2)
println(maps.values.toList)





collection map의 values에도 사용할 수 있다.

val maps = Map("A" -> List(1), "B" -> List(2))
println(maps.values.flatten)

결과는 다음과 같다. 


List(1, 2)






3. flatmap 예시이다.


flatmap은 map에 flatten을 합성한 메소드이다.


val lists = List(List(1), List(2))
println(lists.flatMap(x => x.map(_*2)))


결과는 다음과 같다. 


List(2, 4)



flatmap은 map와 flatten을 합친 모양인데, 아래와 같이 테스트해서 동작여부를 볼 수 있다. 먼저 map으로 데이터를 변형한 후, flatten을 사용한다.

println(lists.map(x => x.map(_*2)))
println(lists.map(x => x.map(_*2)).flatten)

결과는 동일하다.


List(2, 4)



Posted by '김용환'
,