2015년 6월 29일 월요일

더 지니어스 시즌4 1화 후기

몇 안되는 챙겨보는 예능 중의 하나인 더 지니어스가 시즌4를 시작했다. 1화를 다시보기로 보고 후기 몇개 챙겨보고 나도 후기를 올려 보기로 했다.

1. 본인의 플레이를 하지 못하는 김경훈
게임 초반인지, 게임 전의 인터뷰인지는 확실치 않지만, 분명 스스로 진실된 플레이를 하겠다고 이야기를 했었다. 그런데 게임 초반부터 양다리를 걸치는 행동을 하고, 결국에는 양쪽 모두의 눈치를 보다가 급한 마음에 이상민의 사형수 카드를 얻게(?)되는 행동을 한다. 결과론으로 이야기를 하지 안하도, 이런 플레이는 같은 연합의 플레이어들에게 예상하지 못하는 결과를 만들게 되고, 곧 본인의 신뢰도 하락으로 이어진다. 스스로의 판단을 하지 못하고 주변에서(특히 강한 카리스마를 가진 이로부터) 이렇게 해라 저렇게 해라는 요청을 받으면 그때그때의 상황을 모면하기 위해 반응하는 성향인 듯 하다.

2. 배신했지만 이해를 얻고 실리를 챙긴 이상민
반대로 같은 배신을 했지만, 욕을 먹으면서도 욕하는 사람이 이해가 되는 행동을 한 건 이상민이다. 얼떨결에 본인의 사형수 카드를 가져가면서 보다 더 많은 욕을 먹고 있는 김경훈이 불쌍한 나머지 마지막에 그를 구원해준 듯 하다. 그러면서 메인매치 우승과 가넷2개라는 실리를 취했고, 생명의 징표를 오현민에게 주면서 다음 라운드를 위한 디딤돌도 박아놨다. 게다가 사형수 카드를 직접 교환하여 전달한 최정문은 데스매치에서 제외되어 심리적으로도 미안한 마음은 좀 덜 부담하게 되었다.

3. 멘트는 맞지만 행동은 틀린 이준석
이준석은 "다수 연합이 너무 꼴보기 싫다"는 명언(?)을 남기면서 돌발 행동을 보여 주었다. 그의 생각에는 나도 동의한다. 그러나 꼴보기 싫어하는 다수 연합의 힘으로 승점 4점을 챙긴 상황에서 공용 카드를 들고 교환장소에서 빠져나간 것은 옳지 않은 행동으로 판단한다. 다수 연합을 깨고 싶었다면, 다수 연합이 그들의 작전대로 각자 승점 4점을 챙기도록 흘러가게 해두고, 본인은 임요환, 김경훈과 다른 작전을 더 수행해서 더 높은 점수를 챙기는 모습을 보여주어야 했다.

4. 계산기 오현민
승점이 공개되지 않는 상황에서 많은 인원이 같은 승점으로 공동 우승하도록 만들어야한다는 것이 그에게는 큰 부담감이었을 것이다. 그나다 공용 카드를 만들어서 공유한다는 생각(내 기억에는 오현민이 생각해낸 듯 한데 확실치 않다)으로 그나마 계산이 좀 편해졌을 듯. 초반부터 이상민에게 사형수 카드라는 고급 정보를 듣게 되면서 이상민이 부여한 전략/계산 역할을 더 충실히 하고자 했던 것이 아닐까 추측해본다. 너무 많은 사람들의 승점을 계산하느라 더 좋은 전략을 보여주지 못한 것이 아쉬운 점

5. 김유현, 임요환
이번 게임처럼 뛰어난 언변으로 사람들을 설득해서 연합을 만들어내는 것이 키포인트인 경우에는 눈에 띄는 플레이를 보여주지 못 하는 유형이다. 포커 플레이처럼 개인플레이가 가능한 게임에서만 그 능력을 보여줄 수 있을 듯 하다. 사족을 달면, 그런 면에서 김유현보다는 오현민이, 임요환보다는 홍진호가 낫다고 생각한다. 그리고 마지막에 이상민이 다른 카드로 공식 교환하는 것을 포착한 김유현이 방송에 나오는데, 내 의견은 "그래서 뭐?" 달라지는 것은 아무것도 없다.

6. 장동민, 홍진호, 최연승, 김경란, 임경선
이상민의 활약을 지켜만 볼 뿐...

7. 최정문
마지막 기지로 사형수 카드를 유정현에게 넘기는 장면이 없었다면 기억될 플레이가 없었다.

8. 유정현
가만히 있다가 얼떨결에 데스매치를 하고, 실력 부족으로 떨어졌다. 그나마 데스매치 상대로 이준석을 선택한 것이 이해가 되고, 기억에 남는 플레이였다.

아무래도 플레이어 중심으로 후기를 남기기 된다. 게임 룰에 대한 아쉬움이나, 내가 플레이어였다면 어떻게 했을까라는 생각도 드는데, 이건 다른 포스트에 남겨야 겠다.

2015년 6월 27일 토요일

나만의 개발환경

내가 좋아하는 개발환경 중에서 이클립스와 관련된 내용

1. 버전
별다른 특이사항이 없으면 최신 버전을 이용한다. 현재는 luna. 링크

2. Package
Eclipse IDE for Java EE Developers로 받아야 Web과 관련된 개발을 편하게 할 수 있다. 일반 Package를 받으면 HTML Editor도 없어서 html파일을 더블 클릭으로 열면 이클립스에 내장된 브라우저로 열린다 -.- 여기서 패키지별 기능 비교가 가능하다.

3. Workspace
root에 dev와 같은 특정 이름으로 디렉토리를 만들어서 그 안에 이클립스가 설치되는 폴더와 workplace 폴더를 만든다. 포맷을 대비하여 d 드라이브를 선호한다. root에 만드는 디렉토리는 이클립스를 설치하는 의도가 드러나도록 이름을 짓는다. 일부러 과거 버전의 이클립스를 쓰는 경우에는 kepler, indigo와 같은 이름으로 만들거나, 특정 프로젝트를 위한 개발환경이라면 해당 프로젝트 이름으로 만드는 식이다. root에 만드는 이유는 소스파일들의 전체 경로가 너무 길어지지 않게 하기 위해서 이다.

4. Perspective
기본적으로 Java Perspective를 사용하지만, 아래처럼 View 구성을 약간씩 변경한다. 

- 왼쪽 View에 JUnit View를 추가한다. JUnit을 돌리는 시점이라면 테스트 대상이 되는 Java 파일에만 집중하게 되므로 전체 트리 구조는 볼 필요 없기 때문이다.

- Server, Ant View를 왼쪽 아래에 넣는다. 둘다 위아래로 긴 목록이 나오지 않는 스타일의 View이지만, 자주 접근하게 되므로 왼쪽 아래에 필요한 만큼만 보이게 줄여서 넣는다.

- 오른쪽 View를 최소화한다. 기본 설정에 Task List와 Outline이 있는데 둘다 항상 보고 싶은 정보는 아니고, 특정 시점에 뭔가 있는지 궁금해지는 View이다. Task List는 Mylyn을 쓰지 않으면 제거하고, Tasks를 추가하여 넣는다.

- 아래쪽 View도 필요한 것만 남기고 제거한다. Problems, Console, Progress, Search만 남겨놓는다. Javadoc은 필요할때 마우스 오버해서 보는 편이다.

여기 까지 설정하면 아래 처럼 된다.


5. Colors
밝은 계열의 테마를 선호한다. 그래서 이클립스의 기본 설정색을 변경하지 않고 그냥 사용한다. 오히려 cmd.exe나 putty 사용할 때에 기본 설정인 검정색 바탕에 회색 글씨를 희색 바탕의 검정색 글씨로 변경해서 사용하는 편이다.

6. Fonts
글씨체는 무조건 나눔고딕코딩으로 변경한다. 개발하기에 이보다 좋은 폰트는 못 찾은 것 같다. 이 주제에 대해서 나름의 관심이 있어서 많은 Font를 써봤지만, 한글까지 정확하고 이쁘게 표현하는 Font는 나눔고딕코딩이 유일한 듯 한다. 그리고 큰 글씨를 선호하기 때문에 기본 크기도 14로 올려서 사용한다.

7. Keys
단축키도 몇가지를 추가한다. File Search에 Ctrl + Shift + F 를 지정해서 패키지 익스플로러에서 바로 Selected 범위로 파일내용을 찾기에 편하게 만든다. Copy Qualified Name에 Ctrl + Shift + C 를 지정해서 전체 경로를 폼함한 파일명이나 패키지명을 포함한 클래스명을 손휩게 복사할 수 있게 만든다.

... 더 있지만 블로그가 너무 길어지므로 여기까지...


JSON 문자열의 데이터를 HTML escape 할때 주의점

브라우저에서 AJAX로 JSON을 요청한 경우, 서버에서 JSON 문자열을 리턴해주는데, XSS 방지를 위해 특수문자 6개( & < > " ' / )는 HTML 엔티티로 변환해서 넘겨준다.

return input.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("\\\\\"", "&quot;")
.replaceAll("'", "&#x27;")
.replaceAll("/", "&#x2F;");

그런데 "의 경우에는 " 자체가 JSON에서 사용하는 특수문자이기 때문에 \"와 같이 표현되도록 JSON이 생성된다. 그래서 "를 &quot;로 변경하면 실제로는 \" 가 \&quot;가 되므로 escape 문자인 \가 데이터인 것처럼 변경된다. 그래서 \"를 &quot;로 변경해야 한다.

그런데 값이 \일때는 또다른 문제가 발생한다.

name이라는 항목의 실제값이 \ 라고 가정하면,
JSON인코딩 문자열은 {"name":"\\"} 가 된다.
이게 위 XSS 치환 로직을 거치면 {"name":"\&quot;}가 되면서 JSON 규칙에서 어긋나게된다.

JSON spec에 따르면 값(value)는 쌍따옴표(")로 둘러싸여져 있고, 값 바로뒤에는 특수문자 } , ]만 나올 수 있다. 쌍따옴표(")가 값(value)이 아닌 이름(name)일 수 도 있으므로 : 도 나올 수 있다. 그래서 정규식에 negative lookahead를 적용해서 \\\"(?!,|]|:|})를 &quot;로 변경하도록 적용하니 값이 \일때도 정상적으로 처리된다. 그리고 Java String의 escape 문자도 적용되어야 하니 Java String에 넣을려면 \\\\\"(?!,|]|:|}) 가 되어야 한다.
실제 데이터가 ":" 일 때는 \":\" 처럼 데이터가 생성된다. 그래서 위에 취소선을 그은 방법대로 하면 , } ] : 앞에 나타나는 "는 치환되지 않는다. 그래서 negative lookbehind를 적용해서 짝수개의 \\\\가 발생하고 바로 나타나는 \"에 대해서 치환하도록 정규식을 변경했더니 정상적으로 치환이 된다.
특정 패턴이 0번 혹은 짝수번 나타나는지를 확인하기 위해 negative lookbehind와 짝수번 패턴의 *를 사용했다. 참고 \\가 안나오고 \\\\가 0번이상 발생하는 패턴. 만들어진 정규식은 (?<!\\)(\\\\)*
Java String의 replaceAll 사용시 짝수번패턴은 치환하지 않고 그대로 유지하기 위해 치환할 부분을 제외한 전체부분은 그룹으로 묶고 치환해서 들어갈 문자열에 $1으로 지정. 참고


return input.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("((?<!\\\\)(\\\\\\\\)*)(\\\\\\\")", "$1&quot;")
.replaceAll("'", "&#x27;")
.replaceAll("/", "&#x2F;");