오늘은 부처님 오신날

부처님 오신날 여유 시간이 생겼다. 회사일 외에 다른 생각도 할 수 있어서 기쁘다.

오늘 이전에는 무엇을 하였나…

2010. 3. 복학 및 취업 준비
2010. 8. xx일 졸업
2010. 8. 30일 회사 취업
2010. 10.xx 간단한 회사 BI 프로젝트 투입
2011. 03 교육용 서비스 개발 회사 프로젝트 투입
2012. 05. 28 웹 서비스 개발중..

그 당시에는 어려서 그랬는지 최신 기술을 익혀야만 경쟁에서 살아남을 수 있다고 생각했다. 그리고 막연하게 음성 인식에 대한 공부를 해야 겠다고 생각했다. 아마 NxSoft 회사 면접에서 떨어진 것이 이유가 되었을 지도 모르지만 준비한 자가 기회를 가진다는 믿음은 변하지 않았기에 그랬는지도 모른다.

처음으로 산 책은 오일석 교수님의 패턴 인식이라는 책이다. 여러가지 알고리즘에 대해 분류되어 있는 책으로 읽는 내내 확률과 통계 책을 뒤져가며 공부했다.

인식도 머신 러닝 종류의 일종임을 인식하고 간단하게 할 수 있는 기계학습은 없는지 찾다가 검색이라는 분야에 대해 호기심이 생겼다.
그리고 우연히 고감자님의 블로그를 발견하게 되고 막연하게 검색을 공부해야 겠다고 생각함.

집단지성프로그래밍(Collective Intelligence programming) 책을 사서 공부를 시작하게 됨.
검색에 필요한 소프트웨어 및 기술들을 공부하면서 BI, Data Mining의 지식에 대한 욕구가 생김.

데이터들은 성격을 가지고 있으며 각 데이터의 흐름을 분석하기 위해서는 통계학 지식이 우선적으로 갖추어 져야 한다고 생각했으며 head first statistics를 공부하는 중이다.

회사 내에서도 최신 기술 및 스터디를 병행하고 있지만 크게 중요 하다고 생각되지 않는다. 필요하면 언제든지 참고해서 사용할 수 있는 기술은 하나의 일시적인 붐이나 흐름정도로 보인다. 요즘 이슈가 되고 있는 webkit이나 node.js에 대한 붐에 대한 개인적인 생각은 이렇다.

필자도 한때 최신 기술에 매료되어 Scala, R, WebSocket, Appengine, HTML5 등 다른 길에서 해메어 시간을 소모했다. 그러나 결론은 그래서? 어떠한 문제를 해결할 수 있는가?

세상에는 많은 문제들이 있지만 그 문제를 해결하기 원하는 출제자의 의도 및 domain knowledge를 모른다.

domain expert란 무엇이며 어떻게 되는 것일까? 소프트웨어 개발만 할 줄 알았지 정작 문제가 무엇인지 모르는 머리 없는 코더 같다는 느낌이다.

회사에서 시키는 일만 하면서 살지는 않을 것이다. 정말 일에 취해서 치여서 내가 정말 원하는 것이 무엇인지 망각하지 말자. 일바보가 되지 말자. 스마트하게 일을 하자.

묵묵히 자기 길을 가는 전문가의 어깨를 바라보며 나도 그분들의 높이에서 세상을 바라보고 싶다. 그리고 그분들과 인연을 만들며 즐거운 인생을 살고 싶다.

더 밝은 내일을 위해 1주일 동안 목표를 작성해 보자. 그리고 1주일 뒤에 몇개나 지켰는지 check도 해보자.

1. 회식이나 만남 이외에 일체 술을 하지 않는다.
2. 하루에 줄넘기 500개씩 한다.
3. 자신을 과대평가하지 않으며 업무에 대한 리소스 할당을 철저하게 한다.
가용한 시간의 78% 실제 업무, 22% 버퍼를 둔다.
하루에 Full Time으로 일할 수 있는 시간을 8시간이라 한다면 리소스는 6시간으로 할당한다. 그 이상의 시간 투자가 계속 된다면 일이 잘못 돌아가고 있는지 의심해 봐야 한다.
4. 음료수 대신에 물을 마신다.
5. 업무 시간 외에 남는 시간의 78%를 자기 개발에, 22%를 휴식이나 좋아하는 것에 사용한다.
6. 시간을 어디에 소모하고 있는지 시간 일지 및 통계를 작성한다.

정말 내가 해낼 수 있을지 궁금하다.

일단 오늘은 회고만 하는데 1시간 40분을 사용했다.

Javascript에서 Map 구현하기

/**
* The FreeBSD Copyright
*
* Copyright 1992-2012 The FreeBSD Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer. Redistributions in binary
* form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided
* with the distribution. THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of the FreeBSD Project.
*
* @author kipyung.sung
*/

function newMap() {
  var map = {};
  map.value = {};
  map.getKey = function(id) {
    return "k_"+id;
  };
  map.put = function(id, value) {
    var key = map.getKey(id);
    map.value[key] = value;
  };
  map.contains = function(id) {
    var key = map.getKey(id);
    if(map.value[key]) {
      return true;
    } else {
      return false;
    }
  };
  map.get = function(id) {
    var key = map.getKey(id);
    if(map.value[key]) {
      return map.value[key];
    }
    return null;
  };
  map.remove = function(id) {
    var key = map.getKey(id);
    if(map.contains(id)){
      map.value[key] = undefined;
    }
  };

  return map;
}

javascript에서 JSON 객체를 사용하여 정적 map을 구현할 수 있으나

동적 Map이 필요한 경우 다음과 같이 활용할 수 있다.

위 코드의 Key Point는 getKey

map.value가 데이터를 저장하는 JSON의 역할을 맡게 된다.

var map = newMap();

map.put(1, “hello world”);
map.put(2, “I Love NY”);

map.value의 상태는 다음과 같게 된다.

{“k_1″:”hello world”
, “k_2″:”I Love NY”}

map.value.k_1과 map.value[“k_1”] 표현식이 같은 원리를 이용하여 구현함.

위 코드를 카피 하거나 수정하거나 재사용하는 것은 허용하며
소스코드 사용 결과에 대해 책임을 지지 않음을 알려 드립니다.