기본 콘텐츠로 건너뛰기

5월, 2015의 게시물 표시

scala 4. map

http://www.scala-lang.org/api/current/#scala.collection.Map array 할때 느끼긴 했지만, map에서도 scala가 java보다 메소드가 훨씬 많다. 예를들어 별도로 array들의 sum을 구하기위해 for문을 돌릴 필요가 없다. 즉, 코드 사용량이 줄어든다. 에러날 건덕지가 줄어든다. 뭐 이런 유익한 장점들이 map에서도 보인다. 1. map 선언 scala> var scores = Map ( "Alice" -> 10 , "Bob" -> 3 , "Cindy" -> 8 ) scores: scala.collection.immutable.Map [ String , Int ] = Map ( Alice -> 10 , Bob -> 3 , Cindy -> 8 ) map 선언구문이다. '->' 이란 연산자는 쌍을 만드는 역할을 한다. (java에서 처럼 ',' 을 사용해도 가능) var 으로 선언했지만 기본적으로 immutable 한 성격을 가지고 있다. (변경불가) 물론 mutable하게 선언하면 mutalbe하게 사용할 수 있으니 걱정은 안해도됨. 2. 원소 접근 array처럼 (key) 으로 가능하고, java처럼 .get(key) 형태로도 접근이 가능하다. 그런데 둘의 용도는 조금 다를 수 있다. scala> scores( "Alice" ) res6: Int = 10 scala> scores.get( "basdf" ) res7: Option [ Int ] = None get 메소드를 사용할 경우 'Option' 이라는 object가 등장하는데, 이놈의 뜻은 값이 있을수도 있고, 없을 수도 있다. 없다고 해서 예외를 뱉진 않겠다. 뭐 이런거라고 한다. 꽤나 유용할듯. val

[java] string pool

String s1 = "Cat" ; String s2 = "Cat" ; String s3 = new String ( "Cat" ); System . out . println( "s1 == s2 :" + (s1 == s2)); System . out . println( "s1 == s3 :" + (s1 == s3)); 의 결과는 s1 == s2 : true s1 == s3 : false 우선, '==' 과 'equal'의 차이를 한번더 짚고넘어가면, == : 주소값 비교 equal : 값 비교 즉, s1과 s2는 같은 주소를 가지고 있고, s3는 이들과 다른 주소값을 가진다는 얘기다. 그럼 왜 s1과 s2는 같은 주소를 바라보고 있는걸까, 그 답은 " " 이라는 쌍따옴표에 있다.  String은 "" 이나 new로 생성이 가능한데, "" 으로 생성했을 경우 Heap 내에 있는 Spring Pool이라는 곳에 저장이 된다. 만약 다른곳에서 똑같은 값을 가진 문자열을 사용할때, 별도의 메모리 사용없이 같은주소를 매핑해주면서 메모리를 절약할 수 있게끔 설계되어있다. 그러나 이를 모르고 동적으로 생성하는 문자열에서 사용해버리면, 쓸데없이 heap 메모리에 부담을 줄수도 있다. 참조  http://www.journaldev.com/797/what-is-java-string-pool

scala 3. 배열

scala에서 배열은 고정길이로 사용할건지, 가변으로 사용할건지로 구분을 둔다. 1. 고정길이 : Array scala > val nums = new Array[Int](10) nums : Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) int형 10칸짜리 array 초기화했다. 값을 설정하고 싶을때는, scala > val s = Array( "hello" , "world" ); s : Array[String] = Array(hello, world) 2. 가변길이 : ArrayBuffer 자바에서 ArrayList C++에서는 vector scala > val b = ArrayBuffer[Int]() b : scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() 원소를 추가하거나 삭제할때는 대강 이렇다. scala > b+=1 res3 : b.type = ArrayBuffer(1) scala > b+=(2,3,4,5) res4 : b.type = ArrayBuffer(1, 2, 3, 4, 5) scala > b+=(1,2,3) res5 : b.type = ArrayBuffer(1, 2, 3, 4, 5, 1, 2, 3) scala > b.trimEnd(3) scala > b res7 : scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) scala > b.insert(2,99) scala > b res9 : scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 99, 3, 4, 5) scala > b.remove(2) res10 : Int = 99 scala > b.remove(2,3) scala > b res1

scala 2. 제어구조와 함수

이번에는 가장많이 쓰는 조건,반복,함수에 대한 내용이다. 1. scala는 if문 자체가 값을 가진다. scala> val s = if(x > 0) 1 else -1 s: Int = 1 scala> x res31: Int = 1 보통의 언어에서는 이렇게 표현할것이다.  사소하지만 편하긴하다. if(x > 0) s= 1 else s= -1 위에서는 1이라는 int타입을 예제로 했지만, 어떤타입이 와도 상관없다. 이걸보니 조금 더 편한것 같은 생각도 든다. scala> val s = if(x > 0) "a" else "b" s: String = a 2. Unit  = 값없음  Unit는 값없음을 나타낼때 사용하는 타입이다. java에서 void같은 느낌이라고 생각하면 된다고 한다. 3. 구문종료, 세미콜론(;)  보통 문장의 끝을 세미콜론으로 장식한다.  scala에서도 세미콜론을 사용해도 문제는 없다.  그런데 세미콜론을 굳이 안써도 상관없어 보인다.  단, 한줄에서 여러줄의 문장을 작성할 경우  문맥상 라인이 바껴야 할때는 세미콜론을 표시해죠야 한다. scala> var r = 3 r: Int = 3 scala> var n = 2 n: Int = 2 scala> {r = r * n n -=1} <console>:1: error: ';' expected but integer literal found. {r = r * n n -=1} ^ scala> {r = r * n; n -=1} 4. 블럭{}도 값을가진다.  {}도 if문처럼 값을 가진다. scala> val s = { x * x } s: Int = 1 scala> x res37: Int = 1 만약 {}이 2줄이상일경우라면, 가장 마지막에 있는 수식의 결과값이 할당된

scala 1.기본

요새 okky에서 scala와 java가 조금 시끄러웠다. oracle이 java를 인수하면서 다소 폐쇄(?)적인 성향을 가지게 되었고, 신기술로 무장된 새로 생겨나는 언어들과 C와 같은 기존의 다른 언어들보다(모던C++) 발전속도가 느리다는게 요지인듯 하다. 그리고 그 대안중 하나가 scala였다. 요새 또 잘나가는 spark도 scala로 만들었다고 하니 겸사겸사 scala가 뭔지 좀 훑어보기로 했다. scala   http://www.scala-lang.org scala는 함수형언어+객체지향형 언어이다. 그리고 jvm에서 동작한다. 그렇다면 일단 java하고 비슷하다고 생각하면서, 함수형언어로써 뭐가 다른지 봐야할것 같다. 1. scala 변수 선언 var, val scala에서 변수를 선언하는 방법은 두가지다. var 그리고 val val : 변경불가, java의 final과 같은개념 var : 변경가능 val 으로 선언한 이후에 이것을 변경하려고 하면 error가 발생한다. scala> val x = 1 x: Int = 1 scala> var y = 1 y: Int = 1 scala> x = 2 <console>:14: error: reassignment to val x = 2 ^ scala> y = 2 y: Int = 2 var로 선언해서 int로 타입변환이 자동으로 이루어지는게 javascript와 유사하다. 2. RichInt,RichDouble,RichChar,StringOps scala가 가지고 있는 조금 특별한 클래스다, 용도는 int,double,char, string들에게 조금 더 많은 함수를 사용하기 위해 만들어진 클래스라고 한다. 즉 string 타입의 경우 stringOps의 함수를 사용할 수 있게끔 내부적으로 변환해준다. http://www.scala-lang.org/api/current/#scala.runtim

elasticsearch plugin 수동설치

elasticsearch의 plugin은 설치가 쉽다. 명령어 하나면된다. /$ES_HOME/bin/ 디렉토리에 있는 plugin 명령어를 사용하면 지가 알아서 다운을 받아 설치를 한다. plugin --install < org > / < user/component > / < version > 보통 기본적으로 다들 설치하는 plugin들은 아래와 같다. /elastisearch/bin/plugin -install mobz/elasticsearch-head /elastisearch/bin/plugin -install lukas-vlcek/bigdesk /elastisearch/bin/plugin -install enezes/elasticsearch-kopf 위에것들이 제대로 설치되면 elasticsearch의 상태를 제공하는 front-page를 접속할 수 있다. http://{elasticsearch 설치주소}:9200/_plugin_head/ 그런데, 방화벽이 막혀있으면 plugin 명령어를 사용을 할 수 없다. 그럴때는 어쩔수 없이 수동으로 설치를 해야 하는데, 검색이 잘안돼서, 눈칫껏 하다보니 되길래 적어본다. 1. 우선 각각 plugin들의 압축파일을 github에서 다운받는다. https://github.com/mobz/elasticsearch-head https://github.com/lukas-vlcek/bigdesk https://github.com/lmenezes/elasticsearch-kopf 2. elasticsearch/plugins/ 하위에 각각 plugin들의 디렉토리를 생성한다. 3. 각 plugin들의 하위 디렉토리에 ' _site ' 라는 디렉토리를 생성한다. 4. plugin의 압축파일들을 '_site' 하위로 이동한다. /elasticsearch/plugins/head/_site/ Gruntfile.js

해시함수 md5, sha256

해시함수   고정된 길이의 해쉬값을 출력하는 함수 md5를 사용했을때의 결과는 다음과 같다.    입력값이 "1"일때 -> c4ca4238a0b923820dcc509a6f75849b 입력값이   "adbklakdjrlyjlkwejlgkjsrjitpjhopeeojlkajslkdjfkjaskdfjglkdsjflkhawkejrpy pasjglkajerlkjy lkajsdlkfjlkasjdptggowrjytsjdllqqweqwe"  일때 - > cd274b08e463c7ef783bc659f8f8b6b2 입력값의 길이의상관없이 문자의 길이는 32자이다.  (md5 테스트 :  http://www.danstools.com/md5-hash-generator/ )   사용목적 보안을 위해 수신측이 입력값을 알지못해도 보내는 시점과 받는 시점의 해시값을 비교하고, 만약 그값이 동일하다면, 이값은 변조가 없었다.  라는 판단을 하는것이 목적 인증암호, 디지털서명 등에 사용한다. md5나, sha256이나 대강 살펴보면 입력값이받아서 base64처럼 적당한 블록단위로 쪼개고, 부족한부분은 패딩으로 채운뒤에  블록단위로 base64보다 훨씬 복잡하게 계산하는방식이다.  그리고 그 복잡도에 따라 명칭이 다르며 안정성도 역시 다를것이다. 이제 md5는 쓰지 말란다. 이미 털렸다고. 알고리즘은 굉장히 복잡하지만,  개발자가 갖다 쓰기에는 무척 간편하다. Algorithm and variant Output size (bits) Internal state size (bits) Block size (bits) Max message size (bits) Rounds Operations Security (bits) Example Performance [31] ( MiB /s) MD5 (as reference) 128 128 (4 × 32