[Hun]

무언가 좀 더 깔삼한 방법이 있을 것 같지만...


일단 우선 적으로 만든 것(Scala)


def thePouring(capapcities:Array[Int], bottles:Array[Int], fromId:Array[Int], toId:Array[Int]) : Array[Int] = {

for(nl <- 0 until fromId.length ) {
val fromNum = fromId(nl) //시작 넘버
val toNum = toId(nl) //to 넘버

val addJuice = bottles(toNum) + bottles(fromNum)

if(capapcities(toNum) - addJuice <0) {
bottles(toNum) = capapcities(toNum)
bottles(fromNum) = addJuice - capapcities(toNum)
} else {
bottles(fromNum) = 0
bottles(toNum) = addJuice
}
}

bottles
}


'Quiz > Answer' 카테고리의 다른 글

[A2/kyu] 즐거운 파티 (또 다른 방법)  (0) 2017.12.18
[A2/kyu] 즐거운 파티 (scala)  (0) 2017.12.18
[A2/hun] 2 Answer(Invite Party)  (0) 2017.12.15
[A1] 이런 답도 있다  (0) 2017.12.12
[A1/kyu] 키위쥬스 (Scala)  (0) 2017.12.11

키위쥬스

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 타로는 0 부터 N-1 이라 이름을 붙인 N개의 병에 키위 주스를 넣었습니다. 이때 i번째의 용량은 capacities[i] 리터이며 타로가 i 번째 병에 넣은 키위 주 스의 주스의 양을 bottle[i] 리터라고 합니다.

 타로는 병에 키위 주스를 재분배하려고 하며, 0부터 M-1까지 M회 조작합니다. i번째의 조작은 타로가 병 fromId[i]부터 병 toId[i]에 키위 주스를 넣는 것을 의미합니다. 병 fromId[i]가 비어 있거나 병 toId[i]가 꽉 차 있는 순간, 타로는 더 이상 키위 주스를 넣지 않습니다.


 N개의 요소를 가진 정수 배열 int[] 를 리턴해 주세요. 배열의 i 번째 요소는 모든 주스를 쏟는 작입이 완료되고  i번째 병에 남아 있는 키위 주스의 양입니다.


[정의 : 클래스와 함수 정의]


Class : KiwiJuiceEasy

Java : public int[] thePouring(int[] capacities, int[] bottles, int[] fromId, int[] toId)


[제약조건 : 매개변수 범위]

capacities -> 2~50개의 요소가 있는 배열입니다. 각 요소는 1~1000000 사이의 값을 갖습니다.

bottles     -> capacities와 같은 수의 요소가 있는 배열입니다. bottles[i]는 capacities[i]에 들어 있는 주스를 의미합니다.

fromId     -> 1~50개의 요소가 있는 배열입니다.

toId         -> fromId와 같은 수의 요소가 있는 배열입니다.


변수 fromId와 toId는 0~(N-1) 사이의 값입니다. 이때 N은 변수 capacities의 항목 개수입니다. 변수 fromId[i]와 toId[i]는 서로 다른 값을 갖습니다.


[예시 : 입력 데이터와 출력 데이터]

1. capacities = {20, 20}

bottles = {5,8}

fromId = {0}

toId = {1}

Returns :{0, 13}

2. capacities = {10, 10}

bottles = {5,8}

fromId = {0}

toId = {1}

Returns : {3,10}

3. capacities = {30, 20,10}

bottles = {10, 5,5}

fromId= {0,1,2}

toId = {1,2,0}

Returns : {10,10,0}

4. capacities = {14,35,86,58,25,62}

bottles = {6, 34, 27, 38, 9, 60}

fromId = {1,2,4,5,3,3,1,0}

toId ={0,1,2,4,2,5,3,1}

Returns : {0,14,65,35,25,35}


스칼라 언어로 프로그램 하시오

'Quiz > Question' 카테고리의 다른 글

[Q3] 암호  (0) 2017.12.19
[Q2] 즐거운 파티  (0) 2017.12.12

-FOR MAC OSX 
1.HOMEBREW를 설치 한다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.gollum git hub 사이트로 가서 설치 법을 확인! https://github.com/gollum/gollum/wiki 
3.brew install icu4c 
4.sudo gem install charlock_holmes -- --with-icu-dir=/usr/local/opt/icu4c 
5.sudo gem install gollum 
6.실행: gollum --port 8099 [폴더명] -> 폴더명을 지정해주지 않으면 실행하는 곳에 파일을 만든다. 
7.해당 폴더에 git init를 해주지 않으면 제대로 동작하지 않는다.
8.가끔

incompatible character encodings: UTF-8 and ASCII-8BIT 

에러가 발생한다.
9.나 같은 경우 집에서 윈도우로 이미 PUSH 한 데이터를 내려 받아 MAC에서 다시 PUSH 할 경우 이러한 문제가 발생했다.
10.gollum-rugged_adapter를 설치해 주면 된다.
11.brew install cmake
12.brew install pkg-config
13.sudo gem install gollum-rugged_adapter
14.gollum --adapter rugged

잘됨.

push git은 비공개인 비트버킷을 이용하여 백업한다.

source tree 앱을 활용 중

'Hun Site > IT' 카테고리의 다른 글

Hadoop DATANODE Java Heap Warning  (0) 2016.08.24
HIVE 성능 향상 방안  (0) 2016.08.18

윈도우10 시작프로그램을 설정하는 방법은 아래와 같다.


1. 키보드의 윈도우 + R을 눌러 '실행 프로그램'을 실행한다.

2. '실행 프로그램'에 shell:startup을 실행한다.

3. 시작 프로그램 폴더에 필요한 바로가기 파일(.lnk)을 넣는다.


클라이언트 코드

package com.blog.naver.fiesta77.client;

import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class ClientTest {
  private static final String CONN_HOST = "www.host.com";
  private static final int    CONN_PORT = 12345;
  public static void main(String[] args) {
    Socket socket = null;
    try {
      socket = new Socket(CONN_HOST, CONN_PORT);
      DataInputStrean in = new DataInputStream(socket.getInputStream());
      DataOutputStream out = new DataOutputStream(socket.getOutputStream());

      int message = in.readInt();
      System.out.printf("recv message is %d\n", message);
      message *= 10;
      out.writeInt(message);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (socket != null) try { socket.close(); } try (IOException e) {}
    }
  }
}


코드 분석


클라이언트 소켓 프로그래밍은 서버 소켓 프로그래밍과 별반 차이가 없다.
자바의 net 패키지가 워낙에 쉽게 소켓 프로그래밍을 할 수 있도록 만들어서인데
ServerSocket 대신 Socket 객체를 생성할 때 접속할 호스트와 포트만 넘겨주면 끝이다.
그 이후는 서버 프로그래밍과 마찬가지로 InputStream과 OutputStream으로 데이터를 넘겨주면 끝이다.
(Stream은 바이너리 형식이므로 만약 String을 사용할 예정이라면 Reader를 사용하면 된다.)

ServerSocket 소스

package com.blog.naver.kmdigit.server;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class TestServer {
  private static final int SERVER_PORT = 12345;

  public static void main(String[] args) {
    ServerSocket server = null;
    Socket       socket = null;
    try {
      server = new ServerSocket(SERVER_PORT);
      DataInputStream  in = null;
      DataOutputStream out = null;
      System.out.printf(">> server open port(%d)\n", SERVER_PORT);
      while ((socket = server.accept()) != null) {
        System.out.printf(">> accept socket host(%s)\n", socket.getInetAddress());
        int recv_message = in.readInt();
        int send_message = recv_message * 10;
        out.writeInt(send_message);
        socket.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (server != null) try { server.close(); } catch (IOException e) {}
    }
  }
};


소스 분석

JAVA에서 서버 프로그래밍을 하기 위해선 미리 만들어진 net 패키지의 ServerSocket과 Socket을 사용하면 된다.
ServerSocket의 생성자는 다양하지만 일반적으로 Listen 하는 PORT만 입력하여 사용한다.
후엔 accept 함수로 Listen 상태가 되어 클라이언트가 접속할 수 있는 준비를 한다.

accept 함수의 리턴 값은 접속한 클라이언트와 따로 통신할 수 있는 Socket 객체이다.
이제부터는 ServerSocket이 아닌 Socket 객체로 접속한 클라이언트와 통신하게 된다.
String을 주고받을 땐 Reader를 활용하면 되지만 일반적으로 String보단 Binary 통신을 훨씬 많이 하기 때문에
예제로 DataInputStream과 DataOutputStream을 사용하였다.

DataInputStream은 readXXX 함수를 통해 필요한 크기만큼의 값을 수신할 수 있으며
DataOutputStream은 writeXXX 함수를 통해 필요한 크기만큼의 값을 송신할 수 있다.
이때 DataInputStream이나 DataOutputStream을 close 시키면 안 되는데
이유는 Socket의 송/수신 채널이 막히기 때문이다.
더 이상 사용을 하지 않을 땐 DataInputStream과 DataOutputStream 대신 Socket 객체를 close 시키면 마무리된다.

자바에 없는 unsigned int 없다


자바에는 char를 제외하고 unsigned 키워드를 아예 없애버렸다.

그 이유는 자바를 만든 제임스 고슬링이 c++에서 unsigned로 인한 오류를 너무 많이 보고 겪었기 때문에

포함시키지 않기로 하였다.


자바 자체로는 unsigned를 사용하지 않아 문제없지만

네트워크를 통해 다른 언어와 통신하다보면 자연스럽게 unsigned 문제는 고스란히 나온다.

자바에서는 unsigned int를 지원하지 않으니 한 번에 캐스팅이 불가하여

자체적으로 처리를 해야하며 그 처리 방법은 아래와 같다.


public long unsigned32(int n) {
  return n & 0xFFFFFFFFL;
}

signed int로 넘어온 값을 long형으로 캐스팅하여 사용하는 방법이다.

42억정도의 값을 int로 받게 되면 앞자리가 1로 변경되어 자바에서는 자연스럽게 -20억대 값이 나오므로

이를 long형으로 형변환하여 정확히 원하는 값을 볼 수 있도록 하는 것이다.

String to int

String str_val = "123"
int int_val = 0;
int_val = Integer.parseInt(str_val);

int의 wrapper 클래스인 Integer의 parseInt 함수를 사용하면 String을 int로 쉽게 형변환 할 수 있다.


int to String

int int_val = 123;
String str_val = "";
str_val = Integer.toString(int_val);

String to int와 마찬가지로 Integer의 toString 함수를 사용하면 String으로 쉽게 형변환이 가능하다.

소스코드:

func maxParallelism() int 
  maxProcs := runtime.GOMAXPROCS(0)
  numCPU := runtime.NumCPU()
  if maxProcs < numCPU {
    return maxProcs
  }
  return numCPU
} 

설명:

기본으로 설정되어 있는 고루틴 개수와 CPU 개수와 비교하여 많은 걸 반환하는 함수.

만약 CPU 개수보다 더 많이 사용하고 싶다면 runtime.GOMAXPROCS 파라미터를 설정하면 된다.

'Nam Site > Go' 카테고리의 다른 글

[Go] File ReadLine (1)  (0) 2016.08.08
[Go] 변수타입 알아보기  (0) 2016.08.04

HDP 버젼을 2.4로 업데이트 이후


DATANODE JAVA HEAP WARNING을 자주 보게 되었다.



기존까지 별 문제 없다가 업데이트 이후 자주 보이고 있다.


결국은 GC 문제로 추정되는데


WARNING이 발생하더라도 나중에는 사라지게 된다.


DATANODE의 JAVA HEAP의 크기를 증가 시켜 줘도 똑 같은 현상이 발생하는 걸 보면


확실히 GC의 문제이다.


이 GC가 너무 자주 동작해도 문제고 너무 동작하지 않아서 FULL GC가 돌게 되어도 문제다.


어느 것이든 성능 이슈가 발생하게 된다.


일단 나의 이론이 맞는지 증명해 보기 위한 간단한 테스트!



"jcmd <DATANODE PID> GC.run"


명령으로 해당 DATANODE에 강제적으로 full garbage collect를 동작하게 해주면


위의 경고는 조금 후 사라지게 된다.


역시! GC 문제


JAVA의 고질 적인 문제인데...


해당 문제를 해결하기 위해 HORTONWORK Community Site를 기웃거리다.


역시 같은 문제를 가지고 있는 글을 보았다.



글을 보니


효과 적인 GC를 구동하기 위해 옵션을 설정해 줄수 있다!!!?



hadoop-env.sh 파일에


HADOOP_DATANODE_OPTS:

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=<percent>


여기서 percent를 70으로 해주면


문제 없이 동작을 한다고 한다.


결국은 상황에 자신의 상황에 맞게 설정을 해주면 될 듯하다.


그리고 이건 


garbase collection 설정에 관한 참조 할 만한 글이다. 


시간 날때 읽어 보면 좋을 듯 하다.


https://community.hortonworks.com/content/kbentry/14170/namenode-garbage-collection-configuration-best-pra.html


참조 사이트 


https://community.hortonworks.com/questions/39875/datanode-heap-exhaustion.html


'Hun Site > IT' 카테고리의 다른 글

개인 위키 gollum 위키 설정 for mac  (0) 2017.02.20
HIVE 성능 향상 방안  (0) 2016.08.18

+ Recent posts