7/26/2015

MySQL Connection pool error : java.net.SocketException: Connection reset

서버가 안되더니 log를 보니 이런 문제가 있다. 일단 보이는 키워드는 MySQL, Connection, jdbc 알아보니 Connection pool 문제라고 한다. 

Connection pool은 DB에서 connection을 얻어 오는 부하를 줄이기 위해, pool이 connection을 가지고 있고 요청시 마다 빌려주는 형태라고 한다.

그럼 지금의 문제는 connection 이 요청보다 많거나, connection pool 에서 요청을 받아들이지 못하는 상태 둘 중 하나라고 가정하였다.

그런데 WAS가 하나는 잘붙고, 위 문제가 발생한 WAS는 붙질 않는다. java process를 잡아서 종료하려해도 계속 없다 나타났다하고, Glassfish service를 재시작하려해도 port가 사용 중이라 한다.

여기서는 두가지 접근 방법을 생각했는데,

  1. 이미 켜진 Glassfish가 제대로 작동을 하는지 확인하고 아니라면, java process를 kill하는 것이 아닌 다른 강제 종료 방법을 찾는 것
  2. MySQL 자체의 문제일 수도 있으니, log를 확인하고 다음 대처 방안을 생각 ( DB 서버 업체 쪽에서 재부팅으로 인한 문제일 수도 있다고... 정확한 이유는 모르겠지만)



이것저것 해보다 이런 문제가 났는데 감을 못잡겠어서, 일단 심플하게 2번으로 MySQL 재시작하고 WAS 2개를 다시 붙이니 잘 되었다.

이런 식으로 서버를 관리하면 안좋은 거 같은데 정확한 문제를 파악하기에는 시간이 걸릴거 같고...  기회가 있다면 확실히 해둬야겠다.

7/21/2015

Wrong merge sort

오늘 기술면접 때 쓴 Wrong merge sort.
주어진 과제는 def mergeSort(alist, blist): 를 완성하는 것. 내가 구현한건 merge sort가 아니였다!
nested for 문으로 시작했다가 아닌거 같아서 이런 식으로 작성하다 Timeout...
갑자기 Python 문법을 까먹었다 라 쓰고 공부하지 않는다로 읽는다
For statement에 ()를 써버려서 급하게 자바로 아래와 같은 로직의 코드를 짰다

다시 merge sort 만들면서 깨달은 것
  1. for statement에는 ()가 필요치 않다
  2. list add 기능은 append() 를 사용
  3. ++가 없다. +=1 을 사용
  4. random.shuffle은 return하지 않고 parameter를 섞음
  5. sorted는 new list를 return
  6. list copy는 alist[:]로 copy module 사용안하고 심플하게 가능


Updated


테스트 코드 포함! merge sort 코드는 여기를 참고



Outdated


아래의 코드에서 사용했던 예제에서 동작하지만, 실제로는 범위 검사를 먼저 안하면 비교에서 out of index error가 발생한다.
반복문을 줄이려면 이렇게하면 되겠지. 하지만 심플하게 나누는게 초기 접근에는 이와 같은 인덱스 문제를 줄일거 같다. 아무생각 없이 같은 로직이라고 축약했더니 이런 문제가.
더 큰 문제는 이게 merge sort가 아니라는거!



Outdated


리스트 한쪽이 먼저 끝났을 때의 처리 - out of index 문제 내포

나름 한다고 생각했었는데.. 기초가 너무 부족하다. 평소에도 계속 코딩을 해야된다는 생각을 하게되었다.

7/07/2015

[Python] 같은 이름을 가진 Parameter(파라미터)와 함수 내의 local variable(지역 변수)

결과적으로 다른 값을 가지면 다르고, 같은 값을 가지면 같은 것을 의미함

id 함수를 통해 이를 테스트 해볼 수 있다.

https://wikidocs.net/32 에서 id 항목을 참고
# id(변수명)은 메모리 위치를 출력, 이로 같은 위치에 있는 변수인지 확인


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def parameter_local_variable_test(a):
 print("init : ", hex(id(a)))
 a = 10
 print("assign 10 to a : ", hex(id(a)))
 a = 5
 print("assign different value : ", hex(id(a)))
 a = 5
 print("same value : " ,hex(id(a)))
 
# >>> test(10)
# init :  0x6f43c0a0
# assign 10 to a : 0x6f43c0a0    # If argument is same with 10, not changed
# assign different value : 0x6f43c050   # changed
# assign same value : 0x6f43c050        # not changed
 
# >>> test(2)
# init :  0x6f43c020
# assign 10 to a : 0x6f43c0a0    # if argument is different with 10, changed
# assign different value : 0x6f43c050   # changed
# assign same value : 0x6f43c050        # not changed


[추가 자료] 파이썬 변수에 대한 이해를 돕는 링크. 그림과 코드만 봐도 쉽게 이해가 됨

12/28/2014

Fragment onCreateView가 호출되지 않는 문제(not called)

Fragment 안의 fragment의 onCreateView가 호출되지 않는 문제로

Outer Fragment는 잘 호출된다.

ViewPager의 Fragment manager를 쓸 때 parent와 child가 구분되어 있기에 안쪽에서는 child fragment manager로 ViewPager를 만들어야 정상적으로 호출이 된다.

// In parent
pageAdapter = new ViewPagerAdapter(getFragmentManager()); 
// In child
pageAdapter = new ViewPagerAdapter(getChildFragmentManager());


Ref: http://stackoverflow.com/questions/6672066/fragment-inside-fragment

11/07/2014

Java - Type Casting vs valueOf

Java의 BufferWriter로 윈도우와 소켓통신을 하려는데 write 함수가 char array 을 데이터로 받는다.

int32나 uint64로 type으로 윈도우에서 받으려고 하는데, 내쪽에서 그냥 char로 casting 해서 보내면 default system encoding 으로 system dependency가 생길거 같아, 어떻게 해야할지 찾아보았다.

Just two different ways of doing the same thing. It may be a historical reason (can't remember if one came before the other).

큰 차이는 없다는 것 같기도 하면서

아래에 보면 Exception throw에서 차이가 있는 듯하다.

One huge difference is that if you invoke toString() in a null object you'll get a NullPointerException whereas, using String.valueOf() you may not check for null.


누구는 Integer가 null object가 없으니 valueOf 에서도 null check을 안한다고 하는데, 바로 아래에서는 된다고 하니 확인이 필요하다.



Ref: http://stackoverflow.com/questions/3335737/integer-tostringint-i-vs-string-valueofint-i




[Java] PrintWriter 와 BufferWriter 차이 그리고 Writer에서 print와 write의 차이

PrintWriter : system.out.print 처럼 쉽게 쓸수 있는게 장점. println 도 제공.

BufferWriter : 효율적으로 메모리를 사용할 수 있음.

두 Writer의 이점을 살릴려면, wrap 하여 객체를 생성한다.

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

Ref: http://stackoverflow.com/questions/1747040/difference-between-java-io-printwriter-and-java-io-bufferedwriter



Writer 에서

print : writer의 wrap function. 위에서 말한대로 system.out.print 처럼 쉽게 쓸 수 있음.

write: 입력할 길이 조정 가능
  This method cannot be inherited from the Writer class because it must suppress I/O exceptions.


Ref: http://www.coderanch.com/t/174675/java-Web-Component-SCWCD/certification/print-write-PrintWriter

10/13/2014

127.0.0.1 에 서버를 열면 아무도 접근을 못해요

0.0.0.0 으로 서버를 안열어서 4시간 버렸다.

왜 0.0.0.0 으로 해야하나면 all ip 에 bind 한다는 뜻임

127.0.0.1은 lo에만 bind되서 밖으로 못나감.

lo는 loopback interface.

Reference: http://stackoverflow.com/questions/1621457/about-ip-0-0-0-0-in-django