Study Diary for 2015/Nov

2015-11-30

그날 그날 배운 것을 정리해두자. 오랜만에 학습일지!!! 배운 것 정리섹션은 이 블로그에 (혹은 github 코멘트나 위키 등에) 따로 포스팅한 것만 정리해두는 용도. 자잘한 것은 오늘 한 일에 정리하겠다.

2015/11/10 (화)

오늘 한 일

  • effective java 5장에서 진도가 나가지 않았다. 퇴근하고 더 봐야겠다.
  • chatting program을 짜기 시작했다. 오늘은 일단 intelliJ에 익숙해지고, Server, Client 프로그램을 간단히 돌려본 것으로 만족.

내일은 뭐 할 건가?

  • effective java 6장까지 읽자!
  • 북마크 해둔 chatting program 소스 보면서, 차근 차근 한 서버에 여러 클라이언트 붙어서 동시에 채팅할 수 있는 프로그램을 만들어보고 리팩토링 해본다. 그 후 코드리뷰를 받는다. - 다음 스텝으로 방만들어서 따로 따로 채팅하는 것을 해보자.
  • [이너게임]을 다 읽자!

배운 것 정리

2015/11/11 (수)

###오늘 한 일

  • 어제 찾은 채팅 프로그램 레퍼런스(여기) 보고 클라이언트가 쓴 것을 서버가 받아 그대로 다시 보내는 에코 프로그램을 만들었다. 레퍼런스에서는 DataInputStream, DataOutputStream을 이용하여 read, write 하는데, 내가 어제 처음 만든 프로그램에서 BufferedReader와 PrintWriter를 사용하여 read, write 해서 이것은 유지하고 에코 프로그램을 만들었다. 그런데 프로그램이 잘 동작하지 않았다. (클라이언트가 메세지를 입력하면 서버가 읽지 못하고 멈춰 있었다.) 그래서 레퍼런스처럼 DataInputStream, DataOutputStream 을 사용하도록 고치자 원하는대로 동작하였다.
  • 왜 이 전엔 동작하지 않았을까? 알기 위해 일단 debugging을 해봐야 했는데.. 네트워크 프로그램은 어떻게 디버깅할까 감이 오지 않았다 (이 부분은 내일 선배와 함께 디버깅 해 볼 예정). 그래서 FileWriter와 BufferedReader, DataInputStream, DataWriteStream은 과연 어떤 상황에 특화되어 쓸 수 있는지 공부해보기 위해, [Java I/O]라는 책을 찾아보았다.
  • 1장 보다 말았는데 ㅠㅠ 오늘 내용은 Stream에 전송되는 데이터 타입(byte, char)의 대략적인 특징과, byte 데이터 전송을 위해 있는 InputStream/OutputStream 과 char 데이터 전송을 위해 잇는 Reader/Writer 인터페이스 설명이 있었다.
  • effective java 2장 스터디를 하였다. 정리는 일단 에버노트 링크. @@ 붙은 게 스터디하면서 코멘트 해주신 것들~ 마크다운으로 정리해서 블로그와 github wiki에 올려두자.
  • 틈틈히 IntelliJ 단축기들을 외워두려하고 있다. auto import, 불필요한 import 정리, auto formatting, variable renaming. 근데 아직 불편함. 특히 renaming 단축키 너무 이상함;
  • 기술적인 것은 아니지만 [이너게임]을 본격적으로 읽기 시작했다. 전통적인 주입식, 통제식 학습 방법이 아닌 새로운 자율적 학습 방법에 대한 책이다. 천천히 소화하며 읽어보자! - 다음에 읽을 not 기술 서적 ([혼자 있는 시간의 힘], [린스타트업], 스크럼과 칸반 관련 책)

내일은 뭐 할 건가?

  • 일단 오늘 정리하지 못한 내용(effective java 2장 정리, IntelliJ 단축키 모음)을 마크다운으로 빠르게 정리하여 포스팅하자. (40분 소요 예상)
  • 오늘 디버깅 못한 부분 선배와 함께 IntelliJ로 디버깅해보기. - Java I/O 공부의 우선순위와 공부 범위에 대해 조언을 얻고, 우선순위가 높다면 Java I/O 공부 계획을 세워보자.
  • 현재 내가 이해해보고 있는 소스코드가 다음 단계를 thread를 사용하여 구현하는데, 내가 java에서 thread를 사용해보기만 했지 정확히 이해하고 있지는 않아서 이 레퍼런스로 계속 공부해도 될지, 공부한다면 쓰레드를 어느정도 공부해서 이해해야 할지도 조언을 구해보자.
  • 조언을 구한 것들 바탕으로 목표와 동기를 구체적으로 설정하고 network programming(코딩), Java I/0(공부), Java Thread(공부), effective java (책 읽기) 스케쥴링을 해보자.

2015/11/12 (목)

오늘 한 일

  • 아침에 늦게 일어남!!!! 벌써 이런 일이 생기다니 OTL… 알람시계를 준비하자! ㅠㅠ
  • 오전 시간은 전체 팀 미팅 + 자기소개. 기타연주를 했는데 부랴부랴 준비해서 기타 조율도 잘 안되고 준비가 잘 안되어있으니 긴장되고 마음에 들지 않았다. ㅠ.ㅠ 그래도 기특하게 여겨주셔서 영화티켓을 선물로 주심~ 감사하다 뀨ㅠㅠ
  • 오후 시간은 두시간정도 다른팀 세미나를 다녀왔다. 현재 이 팀이 연구하는 기술이 어느정도까지 진행되어 있는지 데모를 보고, 각 팀에 어떻게 적용할 수 있을지 생각해보는 시간이었다. 디지털이 아날로그 느낌을 점점 더 잘 흉내내는데, 아날로그화된 디지털이 아날로그를 대체할 수 있을까? 나는 어떤가? 영상통화를 하는 것보다 직접 대화하는 게 아직 훨씬 좋다. 글 쓰는 것은… 사실을 나열하는 것 같은 메마른 글은 키보드가 편하고, 뭔가 감성적이고 깊은 생각을 담고 싶을 땐 아직 펜을 들고 싶다.
  • 그리고 남은 시간엔 회사 게시판 둘러보고 이러다가 뭐 한 건지 모르게 훌렁 지나갔다;; 아침부터 정신 없이 시작해서 하루가 정신없이 끝난듯. 그나마 어제 하기로 했던 effective java 2장 정리, IntelliJ 단축키 모음 정리는 해서 다행.

배운 것 정리

내일은 뭐 할 건가?

  • 어제 “내일은 뭐 할 건가?” 의 남은 이슈들 처리하자. (네트워크 프로그래밍 디버깅)

2015/11/13 (금)

오늘 한 일

  • 네트워크 프로그램이 디버깅
  • 리퍼런스 소스 step2, step3 이해하면서 쓰레드가 어떻게 작동하는지 이해하였다. Thread를 생성하고, 그 Thread 객체의 start()함수를 호출하면 그 쓰레드는 소스코드의 run() 함수를 돈다.
  • Thread 구현 방법 2가지. Thread 를 상속하거나, Runnable을 구현하거나. 내가 본 게시판에서는 다중 상속할 필요가 없는 대부분의 경우엔 Thread를 상속하는 편이라고 설명하였으나, 선배들에게 물어보니까 아무래도 interface 쓰는 게 유연도가 높아서 이를 권장하셨다. 하지만 다른 분은, 이것도 트렌드여서 결국 내가 쓰고 싶은 걸 쓰면 된다고 하심. - 이게 가장 맞는 것 같다. 결국 내가 쓰는 이유를 정확히 설명할 수 있다면 어떤 것이든 써도 될 듯!

배운 것 정리

내일은 뭐 할 건가?

  • 참고 사이트의 step4 를 이해 -> 내가 이해한대로 구현하기 = 방 하나인 채팅 프로그램 완성

2015/11/16 (월)

오늘 한 일

  • 참고 사이트의 step 4 를 이해 (11/14 토요일)
  • 참고 사이트 step 4 를 바탕으로 내가 구조 잡아 리팩토링해보았다.
    • 처음엔 Server (acceptor) - ServerHandler (클라이언트와 연결된 소켓들을 관리하고 클라이언트에서 온 메세지를 handling) - ReaderWriter (Thread 여러개) / Client - ClientHandler - ReaderWriter 구조로 비슷하게 두 프로그램을 비슷한 구조로 가져가려고 했다. 그런데 막상 짜다보니 Server와 Client는 구조를 비슷하게 갈 수가 없었다. Server의 Reader와 Writer는 한 클래스에 다 들어가도 되고, reading 이벤트가 발생하면 handler 로직을 타서 writing이 callback처럼 실행되는 편이다. 반면 Client는 reading과 writing이 독립적으로 실행되어야 한다. 또한 Server는 클라이언트에는 없는 무한 루프 안의 accept 로직이 있고, accpet 하는 만큼 ReaderWriter의 Thread가 만들어져야 한다. Client는 독립적으로 돌아가는 Reader, Writer가 있되 하나씩만 있으면 된다.
    • 디버깅하면서 발견한 나의 실수는, Client에서 독립적으로 Reader와 Writer가 돌아가야 하는데 Thread.start()가 아닌 Reader.run(), Writer.run()을 순차적으로 실행했던 것이다. (링크참조) 이렇게 짜면 문제가 되는 이유는 Reader.run() 안에서 무한루프가 돌기 때문에 절대로 Writer.run()이 실행될 수가 없다. 무한루프가 도는 부분은 Thread.start()로 불러줘서 다음코드가 독립적으로 실행될 수 있도록 해야한다. - Server에도 무한루프도는 부분이 있는데… 이것은 하나뿐이라 상관 없긴 한데 나중의 로직 추가를 위해 Thread.start()로 바꿔야 할까?
  • 자잘한 건데, IntelliJ 열린 창 닫는 단축키가 너무 애매해서 cmd+W로 바꿔버렸다. 충돌나긴 했었는데 뭐 별로 잘 쓰지도 않는 단축키인 거 같아서 그냥 바꿔버림. renaming도 자주 쓰는데 shift+f6가 불편해서 바꿔버릴까 하다가 일단 익숙해져보기로…
  • [넥스트] Haskell 스터디 with 현욱 // slideshare 참고
    • 진도는 스터디 0 ~ 3 까지 나감.
    • 하스켈 언어의 특징 - 순수한 함수형 언어, 지연 계산, 정적 타입 및 타입 유추
    • 기본 문법 - 수식, 비교식 등, 함수 선언하기
    • list, tuple
    • type, typeclass - type class는 이름은 클래스지만.. 여러 타입을 포함하는 인터페이스 느낌. ex. Num, Integral

배운 것 정리

  • 위의 “오늘 한 일”에 정리됨.

내일 뭐 할 건가?

  • 내일은 일찍 일어나서 미리 토스트를 먹고 차를 마시러 가지 말자. (오늘은 너무 배고파서 어쩔 수 없었음 ㅠ.ㅠ)
  • user가 “.bye” 쳤을 때 클라이언트가 비정상작동하는 것 디버깅 & 해결하기
  • 기타 리팩토링
    • ServerThread에서 close()에 socket.close() 추가하기.
    • ServerThread와 ReaderWriter 합치자.. 별로 나눌 필요 없어보이는 듯.
    • class, method, variable naming 더 고민해보자. (고민 우선순위는 쓴 순서대로)
  • 선배님께 코드리뷰 받기 - 다음 스텝으로 방을 분리해보는 것을 해볼까?
  • effective java 3장 내용 및 질문 정리 - 스터디용으로…

2015/11/17 (화)

오늘 한 일

  • 네트워크 프로그래밍 디버깅, 리팩토링
    • .bye 문제 해결(원인은 github 이슈 코멘트 참고)
    • ReaderWriter, ServerThread 합치기? - ReaderWriter에 구체적인 전략이 들어가 있어서 빼는 것도 나쁘진 않은 것 같은데… 일단 내버려 둠.
    • 클래스 메소드 변수 네이밍
  • 선배님에게 github 주소 보냄.
  • 이펙티브 자바 내일 모레 스터디 준비 시작 - 3단원 정리 (Item 8 다시 읽고 정리)

배운 것 정리

  • effective java 3장의 item 8 정리한 것을 포스팅해야 하는데… 일단 3단원 전체 다 정리하고 포스팅하겠다.

내일 뭐 할 건가?

  • effective java 3장 item 9부터 다시 읽고 정리하기
  • 채팅 프로그램에서 방 만들어 채팅하기

2015/11/18 (수)

오늘 아침 30분 일찍 도착해서 QT를 했는데 적어두고 싶어서 살짝 적어둔다. 다니엘 1장 17절 ~ 21절 말씀이었는데, 다니엘과 세 친구가 왕의 음식을 거부하고 채식하면서 바벨론의 학문을 공부하였는데 느부갓네살이 대화해보니 이들의 지혜가 온나라 박수, 술객보다 열 배나 나았다는 이야기였다. 본문 설명에 이런 내용이 나온다.

다니엘과 세 친구는 그들에게 주어진 공부를 소홀히 하지 않았습니다. 왕이 주는 혜택은 단호하게 거부하되, 그들에게 주어진 공부는 열심으로 감당하였던 것입니다. 결국 다니엘은 ‘밥상은 밀어내고 책상은 받았다’고 할 수 있습니다.

그래서 나의 오늘의 기도는 이거~
“세상의 혜택들에 굴복하지 않되 세상을 섬기기 위한 배움에는 부지런하겠습니다. 하지만 배움에 절실하고 싶진 않고 즐길 겁니다.. :)”

cf) 큐티를 하면서 들은 찬양의 구절이 너무 좋다. “결국 내 주님과 함께 사는 것, 나의 영원한 소망. 주의 아름다움 안에 사는 것, 나의 영원한 기쁨” 결국, 결국. :)

오늘 한 일

  • effective java 3장 item 9부터 다시 읽고 정리하기
  • 채팅 프로그램에서 방 만들어 채팅하기…는 못함
  • 3장을 영어로 읽으면서 정리하다가 어제 하루를 거의 다 보내서 지난 번 스터디때 공부해오라 하신 weak reference 주제를 질문할 수 있을 정도로만 이해하고 질문드렸다. 근데 그렇게 공부하면 안된다고… ㅠ.ㅠ 맞는 말씀이시다. 공부하는데 게을렀음..! weak reference 관련해서 영어자료를 먼저 찾아보고, 예제도 구현해보고, jdk 소스도 다운받아서 보라고 하심! 개발자는 어떻게 공부해야하는지 조금씩 알아가는 중!

배운 것 정리

내일 뭐 할 건가?

  • IntelliJ에서 자바 소스코드 볼 수 있도록 설치하기
  • weak reference 관련해 자료 더 찾아보고 예제 작성해보기
  • LRU 캐시 구현해보기 시작

2015/11/19 (목)

오늘 한 일

  • IntelliJ에서 자바 소스코드 볼 수 있도록 설치하기
  • iTerm에서 zsh 설정
  • weak reference 관련해 자료 더 찾아보고 예제 작성해보기 - 영어 자료들 찾아보기만 함..

배운 것 정리

내일 뭐 할 건가?

  • weak reference 공부하고 예제 작성해보기!!
  • LRU 캐시 구현해보기 시작!!

2015/11/20 (금)

오늘 한 일

  • Weak, Soft, Phantom Reference 공부하고 예제 작성해보기
    • Difference between WeakReference vs SoftReference vs PhantomReference vs Strong reference in Java 읽기 - 여기는 weak reference 와 soft reference의 감만 잡음. phantom reference는 제대로 설명되어 있지 않았다.
    • Weak Reference 예제 코드 만들기 (github 참조) - 여기서 나온 이슈! primitive type, or primitive type 비슷한 녀석(String 리터럴)을 WeakReference로 감싸면 제대로 동작하지 않는다. - 처음엔 System.gc()가 Garbage collecting을 강제하지 않는다는 답변들만 봐서 당연히 GC가 잘 안도는 건가보다 하고 넘겼는데 그게 아니었지…
    • 예제 코드 돌려보면서 WeakHashMap의 소스코드를 파봤는데, Entry<K, V>가 WeakHashMap의 private inner class이고, WeakReference를 상속(extends)했는데 생성자를 살펴보면 super(key, queue)로 key만 weak reference로 감싼다는 것을 알 수 있었다. 즉, WeakHashMap에 (key, value)를 put해도 GC가 돌고 난 이후엔 (해당 key를 삭제하지 않았음에도 불구하고) key값으로 value를 찾을 수 없다. (map안의 해당 key 객체가 사라졌을 테니!)
    • WeakHashMap 소스코드 파면서 나온 질문 Entry<K,V> extends WeakReference<Object> (뒤 생략)에서 왜 WeakReference를 상속하지 않고 T 자리에 Object를 넣었을까? K를 넣어도 되지 않았나?
    • Naver D2 자료 정독 (이해 잘 안되는 부분 질문도 남김) => Weak Reference, Soft Reference, Phantom Reference, Reference Queue에 대해 좀 더 자세히 알게 됨. 하지만 여전히 Phantom Reference에 대해 잘 이해안되어서 자료를 더 볼 생각이다. (이거)

배운 것 정리

  • 위의 내용 참고
  • Weak, Soft, Phantom 내용 정리하자!

내일 뭐 할 건가?

  • Phantom Reference 관련 예제코드 좀 읽고 돌려보자. Soft Reference도 예제 코드 돌려보기!

남아있는 과제 중간 정리

  • LRU 캐시 구현 시 SoftReference로 구현해보고, WeakReference 로도 구현해보자.
  • 네트워크 프로그래밍
    • ThreadPoolExecuter 공부하고 이용해보기
    • 방만들고, 방에 들어가고(방 리스트 보여줘야 함), 방 떠나고, 방에서 파일 주고 받는 거까지 upgrade

2015/11/23 (월)

오늘 한 일

  • 금요일 내용 정리 시작 - 오늘 내용까지 덧붙여 포스팅할 생각.
  • Phantom Reference 가 finalize를 대체한다는 article(여기)를 읽고 예제를 돌려봄.
  • 나는 socket을 phantom reference로 감싸서 예제를 돌려봤는데, 얘가 언제 finalize 되는 지 모르니까 reference queue안에 들어온 phantom reference객체를 가지고 clean up 동작을 하려하는데 컨트롤하기가 어려웠다. (일단 실패..) finalize()를 대체하려고 만든 건데 finalize를 쓸 수도 없고. 스터디 시간에 선배들에게 여쭤보자.
  • LRU 캐시 쉽게 구현한 것 이해 here!
  • LRU 캐시를 SoftReference로 구현해볼까 해서 비슷한 느낌인 WeakHashMap을 팠다. WeakHashMap은 expungeStaleEntries 함수가 있는데, 이는 ReferenceQueue에 들어온 element들을 다 뽑아서 GC되도록 value 값을 null로 설정해둔다. (GC 를 도우는 정도) Map의 get, set 메소드 안에서 다 expungeStaleEntries가 간접적으로 불려진다. 근데 얘처럼 내가 HashMap을 구현할 수는 없는디… 그냥 HashMap<SoftReference, V> 이렇게 사용하면 되려나?
  • 참고. Reference Queue의 poll()과 remove()의 차이: poll(), remove() 둘 다 queue에서 원소를 빼는 것은 같은데, remove()는 뺄 원소가 있을 때까지 blocking하고 poll은 없으면 null을 리턴하고 끝남.
  • 현욱이의 Haskell study week2. 자료 4, 5 - 함수 안에서 쓰인 문법들(패턴매칭, where 등)이랑 고차 함수(curring, map, filter, fold) 배움.

배운 것 정리

내일 할 일

  • phantom reference, reference queue 관련해서 좀 더 정리하여 포스팅 update
  • Effective Java 4장 정리 (목표 13~18)
  • LRU 캐시 이건 어떡하지.

2015/11/24 (화)

오늘 한 일

  • phantom reference, reference queue 관련해서 포스팅 업데이트 완료
  • effective java 4장 정리 시작 (13, 14, 15 완료)

배운 것 정리

내일 할 일

  • 일찍 일어나서 오전 시간도 잘 활용해야겠다! 9시부터 12시 16~18장 정리 완료하자! - 그럼 집에서 늦어도 8시엔 출발해야 여유롭게 QT를 할 수 있다!
  • 12시 - 1시엔 기타! 내일은 비오니까 내일까지 승현언니 기타를 빌리도록 하자.
  • 1시에 빠르게 미정국수를 먹고오자! 그리고 조금 쉬는 시간을 갖고!
  • 2시 - 4시 남은 부분 정리
  • 4시 - 6시 LRU 캐시 구현해보기 - 1) HashMap<SoftReference, V> 형태로 2) 인터넷에서 찾은 자료로 심플하게 하나 구현
  • 6시 반 - 7시 반 스터디!
  • 승현언니와 저녁 약속 :)

내일은 할 일이 좀 많아서 시간순으로 정리를 해봤다! 저렇게 타이트하게 잡으면 꼭 늦어지곤 하는데.. 저 스케줄대로 맞추도록 최대한 노력해봐야겠다.

오늘 직장 선배의 집들이가 있었다. 집에 초대한다는 것은 자신의 삶의 모습을 보여주는 것이고 그만큼 마음을 연다는 뜻인데.. 이렇게 회사 동료끼리 서로 집들이도 가다니! 너무나 재밌고 또 따뜻한 시간이었다. 나도 기회가 된다면 동료들을 저녁식사에도 초대하고 나의 삶을 나눠야지! 돌아오면서 차를 태워주신 분께서 우리 회사의 간단한 역사와 회사에서 배워야할 것들에 대해 조언해주셨다. 개발자로서 기술도 기술이지만, 다양한 사람들의 의견을 듣고 문제를 바라보는 시각을 넓혀가는 것, 그것이 중요하다고 말씀해주셨다. 나는 기술적으로만 성장하면 되겠지 생각했는데 오늘 해주신 조언 역시 개발자로서의 내 목표에 대한 시각을 넓혀주신듯! :) 기회가 된다면 더욱 다양한 곳에서 일하면서 관점을 넓혀가야겠다! 다만 다양하게 의견을 듣되 그것을 그대로 받아들이지 않고, 다양한 조언들을 나의 가치관으로 생각해보고 받아들여야겠지! 주어진 일들을 빠릿하게 처리하고 있진 않지만.. 오늘도 한뼘 성장했으니 감사!

2015/11/25 (수)

오늘 한 일

  • 일찍일어나서 한 9시까지는 회사에 도착하려했으나! 10시에 차그룹컨소시엄 도착 ㅠ.ㅠ 아지트 보고 댓글 쓰고 하느라 11시 되어서야 정리 시작하였다.
  • 옥상달빛의 선물할게 바코드 들어감. 왼손 검지가 아프도록 눌렀는데도 아직 소리는 잘 나지 않는다.
  • Effective Java 4장 정리 완료
  • 중간에 스터디가 미뤄졌다는 말에… 조금 해이해져서 LRU 캐시는 구현 못함 ㅠ.ㅠ
  • 돌아와서 청첩장 파일 마무리 지었다! 모바일용 JPEG 파일도 만들었다. 뿌듯 :)

배운 것 정리

내일은 뭐 할 건가?

  • 청첩장용 봉투 주문
  • QT를 이틀이나 쉬었으니 오늘은 기필코!!! (어제 넥스트에서 놀 때 큐티할 시간 분명 있었다!!!)
  • 오전시간에 LRU 캐시 구현하는 것 마치고, 공부하면서 질문든 것 정리하자.
  • 오후시간엔 Effective Java 5장을 영어로 다시 읽고 정리해보자. 5장은 한글로 읽을 때 4시간 10분정도 예상하는데(쉬는 시간 없이), 영어로 읽으면 8시간 걸리려나 ㅠ.ㅠ 읽었던 부분은 최대한 빨리 훑어보자:) 목표는 조금 타이트하게 23-26장 정리해보는 것으로!

2015/11/26 (목)

오늘 한 일

  • LRU 캐시를 이미 구현되어 있는 HashMap + SoftReference로 구현해보려 했다가 낭패.
    • key를 SoftReference로 감싸는 경우엔 SoftReference의 equals() 메소드를 재정의해줘야 key에 대한 값을 찾을 수 있다. 또한 WeakHashMap의 expungeStaleEntries 메소드처럼 GC를 도와주기 위해 value를 null로 해주는 과정이 필요한데, 레퍼런스 큐에 들어온 레퍼런스 객체로 referent를 get하면 null이 나오기 때문에 Value에 대한 참조를 얻을 방법이 없다.
    • 그럼 value를 SoftReference로 감싸볼까? 이것도 불필요한 entry를 지우는 과정에 문제가 있다. ReferenceQue를 돌면서 레퍼런스 객체를 poll하여도 이미 value에 대한 참조를 잃어버린 상태이므로, 어떤 entry들이 불필요한 건지 알아낼 방법이 없다. value로 key를 알아낼 방법이 없음 (HashMap전체를 순회하지 않는이상.. 하지만 이거는 성능을 매우 저하시키겠지. HashMap을 썼다는 이유가 O(1)의 성능을 보장하기 위해서잖아.) 결국 get 할 때 SoftReference 객체는 나오나 get() 메소드를 통해 나온 referent가 null일 때 stale entry가 되었다고 판단하여 이 entry를 remove 하는 방법이 있긴 한데… 쓸모없는 데이터를 찾을 때만 메모리를 없애기 때문에 메모리를 효율적으로 사용할 수가 없다…
    • 결국 내가 원하는 걸 하려면 WeakHashMap 구현에서 Entry 가 WeakReference를 상속하는 게 아니라 SoftReference를 상속하게 해야함.
  • Reference Que 와 씨름 하는 과정 중에 다양한 물음이 생겼다. Weak, Soft Refernce가 GC에 의해 자동적으로 Reference Que에 들어가게 되었을 때, 언제 그 큐 안에서 poll()되는 걸까? 그리고 poll된 이후의 Reference 객체는 언제 garbage collected 될까? WeakHashMap의 expungeStaleEntries 구현을 보면 Reference Que에 들어갔다가 poll된 이후에도 Map의 링크드 리스트 안에 해당 reference 객체가 존재하고 있음을 알 수 있다. 그래서 결국 함수 안에서 prev.next = next 의 과정이 필요했다. 그래야 온전히 GC될 수 있나봄…
  • Reference Queue 관련해서 좀 명확하게 알려주는 문서를 찾고 싶은데 스택오버플로우에서 나름 추천한 블로그를 찾긴했는데 블로그 가독성이 너무 안좋고, 얘도 별로 명확한 정보를 줄 것 같지 않아서… 읽다가 지쳐버렸다. 읽어보긴 해야하는데 그냥 이 때부터 reference 관련해서 더이상 생각하고 싶지 않아짐..
  • 그래서 codewars 들어가서 javascript 문제랑 java 문제 하나씩 풀었다. 오늘 자바스크립트나 자바코드 문제의 best solution들은 모두 언어의 기본 함수들을 이용하여 간단히 풀어냈더라! 아직 나는 언어가 제공하는 기본적 기능조차 fully 이해하고 자유롭게 쓰지 못하구 있음을 느꼈다. 특히 자바의 람다에 더 익숙해져야겠다.
  • E언니와 인포뱅크에 가서 QT를 하고 개인기도하는 시간을 가졌다. 나의 직장에서의 삶과 동생을 위해, 또 넥스트 친구들을 위해 기도했다. 고등학교 때엔 친구 S를 통해, 대학교땐 동아리를 통해, 판교에서는 E언니와 다른 크리스쳔 언니들을 통해 나를 이끄시는 그분의 손길이 참 감사하다.
  • 내 개인 서버의 ghost 계정의 비밀번호를 잃어버렸는데 root 계정으로 비번을 바꿀 수 있더라!!!! root는 다른 super user 보다도 더 강력한 녀석이라는 것을 깨달음. ghost에 disqus를 붙였다! 시행착오가 있었는데, short name을 잘못 넣어서 고생하다가 바꿨더니 제대로 됨! :)

배운 것 정리

내일 할 일

  • 그냥 간단하게 LRU 캐시 구현해보고 끝내겠음. 쳇
  • thread pool execution 을 공부해보고 싶은데, effective java 5장도 정리해야하고… 뭐부터 할까 - 우선순위는 스터디 일정이 있으니 effective java 가 더 높은데 하고 싶은 건 코딩이로구나~ 코딩하고 싶다..

2015/11/27 (금)

이날 기록을 바로 해두지 않아서 11월 30일 월요일에 하고 있다. 그런데 금요일에 한 일이 잘 기억이 안나네.. 역시 그날 바로바로 해둬야한다.

오늘 한 일

  • LRU 캐시 구현 완료 github
    • 사이트 읽어보고 그냥 이해하는 것과, 이해한 것을 바탕으로 내가 구현하는 것은 또 다르다는 것을 배웠다. 내가 구현해볼 때 Doubly Linked List에 왜 key가 있어야할까 하여 key를 없애봤더니, key의 용도를 알게되었다. 리스트의 key는 map의 key와 같은 값을 저장하고 있는데, 캐시 capa를 초과하여 리스트의 원소 하나를 remove할 때 map에서도 원소를 지워줘야 해서 필요한 것이었다.
  • effective java를 미리 정리해둬야하는데 지루해서 또 안했다. Haskell로 퀵소트 구현하는 것 고민해봄. 해결 안됨.
  • 샌프란시스코 개발자, 강태훈 님의 번개 강연
    • 한달전 샌프란시스코에 다녀왔는데도, 그 때의 느낌과 생각들을 잊고 살았던 것 같다. 샌프란시스코의 문화를 강연에서 들으니 다시 그때의 기억이 새록새록 났다. 특히 자기가 발견한 문제를 해결하기 위해 일을 하고, 거기서 재미와 의미를 동시에 느낀다는 점에서 깨달음이 있었다. 나는 그동안 신입사원이라는 핑계로 스스로 의미를 발견해가기 보다는 밖에서 의미를 부여해주길 기다리고 있었다. 하지만 의미가 주기적으로 부여되지 않았고, 이 내용이 어디에 어떻게 쓰일지도 모른채 공부하는 나날들이 샇여가니 슬슬 지루해졌다. 나는 API 셀에 속해있지만, 아직 우리 API에 대해 잘 알지 못한다. 따라서 내가 이곳에서 재미와 의미를 찾으려면 내가 만들고 싶은 프로젝트에 API를 충분히 사용해봐야할 것이다. 내가 배우고 싶은 언어로 나만의 프로젝트를 진행해보자!
    • 인디언들이 기우제를 지내면 반드시 비가 온다고. 그들은 비가 올 때까지 기우제를 하기 때문. 변화가 일어나게 만드는 법은 끊임 없는 도전이다.
    • 이 분도 내가 facebook에서 만난 개발자처럼 공부하는 개발자가 아닌 노는 개발자셨다. 여가시간에 주로 놀고, meet up에 가서 핫한 주제들을 살피는 게 전부라고. 그래, 재밌게 살겠다아아아아아!

배운 것 정리

  • 샌프란시스코 강의를 정리

다음주에 할 일

  • 월요일에 4장 스터디, 수요일에 5,6장 스터디가 있다. 미리미리 5장 6장 정리를 해둬야 함.
  • 월요일 하스켈 스터디
  • 프로젝트 시작하기
    • swift로 친구들끼리 각자의 결심을 공유하고 서로 응원해주는 앱을 만들어보자! (NEXT 언니들과 하는 형태를 좀 더 발전시켜보자.)
    • 친구 리스트를 받아오고 싶지만 그건 제휴를 통해서나 가능한 것 같으니, 링크를 보내서 공유하는 것으로 해야겠다.
    • 공유하는 친구들끼리 어떤 한 친구가 완료했을 때 다른 친구들에게 완료했다고 푸쉬가 날아가면 사람들이 더 자극받겠지! 또 완료한 친구는 뿌듯하고!
  • 채팅 프로그램도 다시 시작해야한다.

2015/11/30 (월)

오늘 한 일

  • 지난 주 금요일 공부한 것 정리
  • 내가 테스트로 만들고 싶은 앱 기획
    • obti, Way of Life, Done, Swipes 앱들을 사용해보고 내가 만들 앱을 포스트잇에 프로토타이핑 해보았다.
  • 하스켈 스터디
    • 오늘은 현욱이 자료 6, 7 스터디 (2시간)
    • bst 자료구조를 간단히 만들어봄 github commit - insert, contains, == 함수만 됨.
  • iOS 교수님께 스위프트 앱 개발할 때 참고할만한 서적 추천받음 (핵심만 골라배우는 iOS8 프로그래밍)

내일 할 일

  • [네트워크 프로그래밍]ThreadPoolExecution 공부하기 -> 리팩토링
  • 근무시간에 시간 남으면 effective java 5장 정리 시작
  • 퇴근 후에 1시간 반 정도? [iOS 8 프로그래밍] 읽고 따라해보자. (목표는 12월 말엔 앱의 형태로 가장 기본적인 기능을 구현해보는 것으로!) - 이 앱이 나 스스로 정말 필요한 것인지 좀 더 동기부여를 할 필요도 있다. 재밌게 해보려면!

오늘은 QT도 못하고 퇴근후에 스터디하고서 책 주문하고 학습일지 쓴다고 벌써 11시가 되었다. 내일은 일찍 회사 가서 QT하고, 퇴근 후 밥 빨리 먹고 공부한 다음에 개인기도시간을 갖자!

다음 달 학습일지

학습일지를 한 곳에 계속 작성하면 글이 점점 밀려 수정할 때 글을 찾기도 쉽지 않고, 또 글이 너무 길어져 읽기 불편하기 때문에 월별로(monthly) 작성하겠다. 다음 학습일지는 여기에 있다!