2011의 게시물 표시

기업의 목적

경영을 하면서 경영학 공부를 열심히 했는데, "수익이라는 것이 기업 활동의 결과이지 목적이 아니다"고 말한 사람을 만났어요. 그 사람이 현대 경영학의 아버지라고 불리는 피터 드러커였어요. 그래서 이게 저 혼자만의 생각이 아니고 오히려 경영학 분야에서는 교과서에 나오는 아주 당연한 이야기라는 것을 알았어요. 오히려 '기업에 있어서 수익이라는 것이 목적이다'라고 하는 참고문헌을 찾지 못했어요. 그래서 나중에는 왜 이것이 상식이 되었는지 오히려 의문을 품게 되었어요. - 경영의 원칙 안철수

미적분과 차원

점을 적분하면 선이 되고, 선을 적분하면 면이 되고, 면을 적분하면 입체가 된다. 반대로 입체를 미분하면 면이 되고, 면을 미분하면 선이 되고, 선을 미분하면 점이 된다. 적분을 하면 차원이 하나씩 커지고, 미분을 하면 차원이 하나씩 작아진다. - 멋진 세상을 만든 수학

return null;

public class FooFactory { public static Foo createFoo() { try { Properties prop = new Properties("bi.properties"); return new Foo(prop); } catch (Exception e) { log.error(e, e); } return null; } } 이 코드의 문제점은 null이 리턴될 가능성이 있다는 것. ... public void 뿌잉뿌잉() { Foo foo = FooFactory.createFoo(); foo.process(); } ... 사용자는 이렇게 프로그래밍을 할것이다. 그런데 createFoo()가 null을 리턴할 수도 있다는 걸 알지 못한다. 만약 createFoo()에서 예외가 발생해 null을 리턴하게 되면 NullPointerException이 발생할 것이다. 좋은 코드는 아닌거 같은데 어떻게 하면 좀더 좋은 코드를 만들 수 있을까? 1. createFoo()라는 메쏘드명에 충실하자. Foo 객체만 생성해야 한다. null을 돌려줄 수 있다는 힌트는 어디에도 없다. 2. createFoo()를 실행 중에 예외가 발생하면 null을 리턴하지 말고 밖으로 예외를 던져서 알리는게 좋을 듯하다. 그래야 사용자가 예외 상황을 처리할 수 있다. 3. 이왕 던질거면 예외가 왜 발생했는지도 함께 넘겨주면 디버깅이 쉬워 진다. 적절한 메시지를 만들어서 보여주는 나만의 Exception을 하나 만들어 보자. 4. 그럼 이 때 RuntimeException으로 만들까 아니면 그냥 Checked Exception으로 만들까? 이 둘의 비교는 구글링하면 많이 나오므로 패쓰. Checked Exception을 사용하는 패턴은 지양

자바 로깅

간만에 Java Programming을 다시 시작했는데 Spring3.0을 보니 로깅이 모두 slf4j로 바뀌어져 있다. 음.. 그렇다. 요즘은 slf4j를 사용한다. 그럼 어떤 장점이 있어서 slf4j가 대세가 되었을까. commons-logging으로 로그를 남길 때 보통 아래 처럼 하게 된다. log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]" ); 위 코드는 무엇이 문제일까? 로깅레벨 설정을 error로 켜두면 debug 코드는 안찍는다. 하지만 비록 로그에 남지 않는다고 하더라고 실행은 된다. String끼리 더하기 연산도 실행되고 abc() 함수도 호출한다. 즉, 쓸 때없이 자원을 낭비하는게 첫번째 문제이다. 그래서 다음과 같이 할 수 있다. if (log.isDebugEnabled()) {     log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]"  ); } if(log.isDebugEnabled())를 집어 넣어서 로그 레벨이 debug가 아니라면 아예 건너뛰게 만들었다. log.isDebugEnabled()를 실행하는것도 리소스를 잡아 먹긴 하지만 부담이 큰 작업은 아니다. 하지만 이런식으로 하게 되면 코드가 지저분해진다. 게다가 로깅레벨이 여러단계일 때 if 문이 중첩될 수 있는 문제가 있다. 또 다른 문제는 로그 레벨이 debug로 설정되어 있을 때 발생한다. 로그 레벨이 debug일 때  if (log.isDebugEnabled())는 무의미한 코드가 되어 버린다. 작지만 리소스 낭비다. slf4j를 사용하면 아래처럼 바꿀 수 있다. log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ {} ]", abc(id)); 로그를 찍든 안찍든 String을 일단 더하고 보는 것과는 처리 방식이 다르다. {} 에는 abc(id)의 리턴값이 들어간다.

Javascript OOP - Prototype

prototype 이란 자바스크립트에 존재하는 모든 객체가 가지고 있는 속성이다. 빈 객체도 기본적으로 [[prototype]] 을 가진다.  (* [[prototype]] 은 internal property) 간단하게 확인하는 방법 구글 크롬을 실행해서 '개발자 도구'를 연다. 그리고 Console 창에 new Object() 라고 입력한 뒤 실행한다. 빈 객체지만 __proto__ 속성이 있는걸 볼 수 있다. * [[prototype]]이 어떻게 정의되어 있는지는 브라우저마다 다를 수 있다. Prototype 에 메쏘드 정의하기 function enlarge() { this.width *= 2; this.height *= 2; } // 생성자 함수 function Rectangle(w, h) { this.width = w; this.height = h; } //prototype에 정의 Rectangle.prototype.enlarge = enlarge; var rect = new Rectangle(100, 200); rect.enlarge(); // 모든 인스턴스에서 공유된다. 브라우저에서 지원하는 기본 내장 객체에 대해서도 prototype에 속성을 추가하거나 삭제할 수 있다. 익스플로어의 경우 배열 객체에 unshift 메쏘드가 없는데 아래 소스 코드는 unshift  메쏘드를 추가해서 다른 브라우저와 호환이 되게 한다. if(!Array.prototype.unshift) { // 객체 탐지 Array.prototype.unshift = function () { this.reverse(); var a = arguments, var i = a.length; while(i--) { this.push(a[i]); } this.reverse();

How to copy a list in Python

members = ['dog', 'cat', 'horse'] clones = members[:] Another way is clones = list(members)

Javascript OOP - 객체 생성 방법 2

객체를 생성하는 또 다른 방법은 생성자(constructor)를 사용하는 것이다. 객체가 하나만 필요할 경우 객체 리터럴을 사용해서 생성하면 되지만 여러개의 객체 인스턴스가 필요한 경우라면 객체 생성자 함수(Object Constructor function)를 사용해야 한다. 객체 정의하기 function Rectangle() {     this.width = 100;     this.height = 200; } 초기화 파라미터를 사용해서 인스턴스를 초기화할 수도 있다. function Rectangle(w, h) {     this.width = w;     this.height = h; } 메쏘드를 정의해서 객체에 삽입해 보자. function enlarge() {     this.width *= 2;     this.height *= 2; } function Rectangle(w, h) {     this.width = w;     this.height = h;     this.enlarge = enlarge;     this.area = function () {         return this.width * this.height;     }; } new 키워드를 사용해서 객체의 인스턴스를 생성해 보자. var r = new Rectangle(100, 200); r.enlarge(); r.area(); /* return 80000 */ 여기서 new가 동작하는 방식은 자바의 new와는 다르다. new는 먼저 빈 객체를 생성한다. 그리고 뒤 이어 나오는 객체의 생성자 함수를 호출해서 this가 생성된 인스턴스를 참조하게 한다.

About XHP and how to install on Mac OS X

XHP란 Facebook에서 개발한 PHP Extention이다. 자세한 설명은 아래 링크 참조..^^ http://durl.kr/772rm   XHP를 사용하면 첫째, 가독성이 좋은 PHP코드를 개발할 수 있다. 예를 들면 <?php if ($_POST['name']) { ?>     <span>Hello, <?=$_POST['name']?>.</span> <?php } else { ?>     <form method="post">     What is your name?<br>     <input type="text" name="name">     <input type="submit">     </form> <?php } 보통 이렇게 프로그래밍 하게 되는데 빨갛게 표시한 부분 때문에 머리가 아프다. 하지만 이것을 XHP를 사용해서 개발하면 아래처럼 된다. <?php // note: includes omitted if ($_POST['name']) {   echo <span>Hello, {$_POST['name']}</span>; } else {   echo     <form method="post">       What is your name?<br />       <input type="text" name="name" />       <input type="submit" />     </form>; } echo문을 사용해서 가독성이 많이 좋아 졌다. XHP가 HTML 문법을 이해할 수 있기 때문에 가능하다.

Javascript OOP - 객체 생성 방법 1

객체를 생성하는 가장 쉬운 방법은 객체 리터럴을 사용하는 것이다. var book = {title:'Javascript', price:30000}; 객체 리터럴은 자바스크립트 표현식으로 평가될 때마다 새로운 객체를 생성하고 초기화한다. 객체 프로퍼티 값에 접근하기 위해서는 마침표(.) 연산자를 사용한다. book.title; 자바스크립트 객체는 연관 배열이기 때문에 아래처럼 프로퍼티에 접근할 수도 있다. book['title']; 프로퍼티 이름을 문자열로 표현함으로써 아래와 같은 구문이 가능하다. for(i = 0; i < 10; i++) {      addToBookShelf(book[seriesName + i]); } 이런 접근 방식은 프로퍼티 생성, 삭제에 있어서 매우 유연성 있게 처리할 수 있다. 이것은 Java나 C++ 등 타입 제약이 엄격한 프로그래밍 언어에는 불가능하지만 자바스크립트는 타입 제약이 느슨하기 때문에 이러한 접근 방식이 가능하다. 자바스크립트 객체는 연관 배열(associative array)이기 때문에 프로퍼티들을 열거할 수 있다. (연관 배열은 key와 value가 쌍으로 이루어진 데이터라는 점에서 HashMap 또는 Dictionary와 같다.) for(var property in book) {     console.debug(property); } Object() 생성자를 사용하면 빈 객체를 생성할 수 있다. (생성자에 대한 자세한 내용은 다음에..) var book = new Object(); 이렇게 생성된 빈 객체에 프로퍼티를 동적으로 설정할 수 있다. book.title = 'Javascript'; book.price = 20000; book.sale = function () {     return book.price * 0.9; }; sale 함수는 아래처럼 호출할 수 있으며 리턴값은 18000이다. book.sale(); 객체는 중첩될 수

자전거 타는 즐거움 - 김훈(소설가)

카드 회사에서 날라온 잡지의 첫 페이지에 소설가 김훈이 쓴 '자전거 타는 즐거움'이라는 제목의 수필이 두 페이지에 걸쳐 실려 있었다. 잡지는 머지 않아 버려질 것이다. 그래서 문장 몇개를 백업해 둔다. 자전거를 타고 달릴 때, 자전거의 바퀴는 외부의 사물이 아니라 내 몸의 일부다. 자전거의 바퀴는 자동차의 바퀴나 기차의 바퀴와 다르다. 자전거의 바퀴는 내 몸에서 돋아난 바퀴다. 내 몸의 힘으로 이 바퀴를 굴려서 앞으로 나아갈 때, 나는 자유를 느낀다. 비탈을 오를 때는 힘이 든다. 비탈을 오를 때 자전거의 기어는 내 몸의 힘을 바퀴 구동축으로 집중시키는 것이 아니라 오히려 반대로 힘을 잘게 부수어서 분산시킨다. 분산된 힘이 조금씩 체인의 베어링 속으로 흘러 들어가면, 자전거는 겨우 고개를 넘어간다. 자동차의 엔진은 오르막에서 힘을 증폭시키지만, 자전거의 기어는 힘을 잘게 나누어서 인간의 몸에 전달해준다. 자동차는 기계이고 자전거는 인간이기 때문에 오르막에서 힘을 쓰는 방식이 다르다.  - 김훈 (소설가) -

Javascript 객체의 특징

자바스크립트는 객체 지향 프로그래밍(OOP)를 지원하는 언어이지만 Java나 Python 등 다른 OOP 언어와는 개념이나 구현 방법에 있어서 차이가 있다. 특히 객체를 상속하는 방법은 다른 언어들과 많이 다르므로 눈여겨 봐야 한다. 우선 자바스크립트 객체의 특징을 알아보자. 이름과 값으로 구성된 프로퍼티의 집합이다. 연관 배열로서의 객체 for/in 루프를 사용하여 열거할 수 있다. 함수도 객체이다. 객체를 생성하는 방법은 여러가지가 있다. 객체를 구성하는 프러퍼티는 동적으로 삽입 또는 삭제가 가능하다. 모든 객체는 생성자 함수(constructor 프로퍼티)를 가진다. 모든 객체는 프로토타입이라 불리는 내장 객체를 참조한다. 상속은 프로토타입을 통해 구현된다. 그럼 일단 이 정도로 정리하고 각 항목별로 자세한 설명은 다음 포스팅에 계속.. * 편의상 '클래스'라는 용어를 사용했지만 자바스크립트2.0의 클래스와는 다르다. 자바스크립트2.0은 스펙상으로만 존재하며 개발이 중단되었다. 지원하는 브라우저 또한 없다.

자전거로 출퇴근 하기

4월이 다가오고 있다. 요즘처럼 날씨도 좋고 공기도 상쾌한 때에 제주도 살면서 자가용으로 출퇴근 한다는 건 젊은 나에 대한 예의가 아니다. 그래서 어제부터 자전거로 출퇴근을 하기 시작했다. 아이폰 유저로써 자전거앱을 찾아 본건 당연지사!! 유료앱도 좋은게 많지만 더 좋은 무료앱이 있었다. 바로 endomondo. $3.99 짜리 PRO 버전이 있긴 하지만 이걸로도 충분하다. http://www.endomondo.com/workouts/user/1056968 모든 데이터를 웹에서 볼 수 있으니까 너무 좋다. 아~~ 나도 이런 사이트 한번 만들어 보고 싶은데..

Javascript Code Conventions

Javascript의 코딩 스타일은 Java와 거의 같다. camelcase 를 사용하며 underscore 는 특별한 경우가 아니면 사용하지 않는다. 객체 정의를 위한 function의 이름 첫글자는 대문자로 쓴다. function Person(name, age) {     this.name = name;     this.age = age;     // ... } 들여쓰기는 공백문자 네개를 사용한다. tab은 에디터 또는 사용자마다 다를 수 있으므로 사용하지 않는다. tab을 사용하는게 공백문자 네개를 사용하는것 보다 파일 싸이즈는 줄어들 수 있지만 compress를 해버리면 차이가 없어 진다. 자바스크립트는 변수 선언에 자유로운 언어이다. 즉, 선언하지 않아도 할당할 수 있다. 하지만 가독성, 잠재적인 버그 방지를 위해 변수 선언은 해주는것이 좋다. var i = 10; (function () {     for( var i = 0; i < 5; i++ ) {         console.debug(i);     } })(); console.debug(i); // 10이 출력된다. 만약 var가 없다면 5가 출력된다. 한줄에 여러개의 변수를 동시에 선언 및 할당을 할 수 있지만 혼란을 주어서는 안된다. var height = 166, weight = 50; var firstName; var lastName; 자바스크립트로 프로그래밍을 하다 보면 들여쓰기 레벨이 복잡해지는 경우가 많은데 아래처럼 코딩하면 된다. var collection = (function () {     var keys = [], values = [];     return {         get: function (key) {             var at = keys.indexOf(key);             if (at >= 0) {                 return values[at];

나의 일

쌀쌀한 날씨지만 사장님과 직원들의 표정은 밝다. 장갑과 작업복은 시꺼멓다. 얼굴에도 기름때가 묻어 있다. 난로가 있는 사무실이 조그맣게 있지만 그곳에 앉아 있을 만큼 한가해 보이지 않는다. 나의 단골 카센터는 늘 그렇게 분주하다. 나는 컴퓨터 앞에서 일한다. 남자손이 거칠지 않고 보드랍다. 사무실 안은 여름에는 시원하고 겨울에는 따뜻하다. 그렇다 보니 때때로 졸립기도 하고 의자에 기대서 잠을 자기도 한다. 그리고 때때로 불평을 늘어 놓는다. .. 난 지금껏 내 주변에 나보다 편하게 일하는 사람을 보지 못했다.  카센터에 갈 때마다 드는 생각이다.

테트리스 AI

Javascript(jQuery)를 사용해서 테트리스를 만들어 보았다. 추가할 기능이나 일부 버그가 있긴 하지만 그럭저럭 해볼만 하다. >  테트리스 게임 해보기 이제 정말 해보고 싶은것은 바로 테트리스 AI(Artificial Intelligence). 어떤 알고리즘 혹은 가중치 계산법이 필요한지 간략히 정리해 보았다. 블록(테트리미노)을 drop했을때 바닥부분이 닿는 면적 전체 쌓은 블록의 높이 이를 고려하지 않으면 전체 블록이 무작정 높아질 수 있음 블록을 가로로 눕힐지, 세로로 세울지를 결정할 수 있음 clear 할수 있는 라인의 유무 또는 갯수 블록을 내렸을 때 빈공간으로 남을 수 있는 부분의 크기  이 정도만 계산할 수 있어도 테스트를 통해 최적의 가중치를 찾아낼 수 있지 않을까 싶다.

draggable and resizable image using jQuery

you can do it without any jQuery plugins. <link type="text/css" href="css/ui-lightness/jquery-ui-1.8.9.custom.css" rel="stylesheet" />   <script type="text/javascript" src="js/jquery-1.4.4.min.js"></script> <script type="text/javascript" src="js/jquery-ui-1.8.9.custom.min.js"></script> <script type="text/javascript"> $(function() {     $("#image_container")         .resizable( {alsoResize:"#panther"} )         .draggable()         .css({'width': '500px', 'height': '500px'}) }); </script> <div id="image_container">     <img id="panther" src="panther.jpg" width="500px" height="500px" /> </div>

git tip

git diff 색깔 넣어서 출력하기 dit diff --color git diff --color-words 아래처럼 alias로 설정해서 사용한다. alias gitd='git diff --color' 또는 config 설정 git config --global color.diff auto git config --global color.diff always git log log를 한 줄로 간단하게 보기(title만 보여줌) git log --pretty=oneline commit history를 graphical하게 보기 git log --graph 위 두 옵션을 함께 사용하면 log 확인을 한눈에 할 수 있다. git log --pretty=oneline --graph 이것도 마찬가지로 alias를 만들어서 사용한다. git stash [시나리오] branch에서 새로운 기능을 개발 중인데 긴급한 수정사항이 생겼을 경우. 방법 1. 현재까지 작업한 파일들을 어딘가에 백업해두고 branch를 롤백한다. 그리고 긴급한 수정 사항을 처리한 후 백업해둔 파일들을 다시 가져와서 개발을 진행. 방법 2. 다른 디렉토리에서 현재 배포 버전을 받은 뒤 수정 사항을 처리하고 배포. 이 외에도 몇몇 꼼수가 있겠지만 git stash를 사용하면 간단히 해결할 수 있다. #현재 작업을 저장해두고 branch를 head로 돌린다.(git reset --hard) git stash save #저장되어 있는 stash들 보기 git stash list #stash를 꺼내와서 적용 #stash들은 stack에 저장된다. 따라서 가장 최근에 save한 stash가 현재 branch에 적용된다. git stash pop #git stash pop 과 비슷한 명령어지만 stash list에서 삭제하지 않는다는 점이 다르다. git stash apply #필

새해

서른이 되었다. 절박함을 느껴라. 올한해 잘해 보자.

영어 공부

작년 말, 그러니까 지금으로부터 한달전쯤 난 결심을 했다. 더 나이 먹기 전에 뉴질랜드나 한번 갔다 오자고 .. 그래서 일단 영어공부부터 시작하자는 생각에 사내영어교육, 요즘 말로 '인강'을 신청했다. 마지막주는 그동안 밀린거 하느라 하루에 두개씩 듣기도 했지만 어찌됐건 20번의 강의를 모두 들었다. 그리고 마지막날 테스트까지 완료!! 내가 받은 점수는 96점. 수업내용이 어려운 건 아니었지만 그래도 90점 넘으니 기분은 좋다. (100점 못받아서 화가 났다면 지금보다 좀 더 나은 내가 되었을까?) 비록 현실적인 문제와 미지근한 성격 때문에 모든걸 접고 뉴질랜드로 떠날수 있을지는 모르겠다. 하지만 뭔가를 한달동안 꾸준히 했다는 사실에 2011년 새해의 시작이 좋다는 느낌이다. 올해는 정말 좋은 일이 생기길..^^