노무현 대통령 배너
 

Plan C.

7월 25, 2011
블로그에 글을 쓴 지 반년이 넘었다. 새로운 출발이라는 마음은 깨끗이 포기했다. 이유는 아주 간단하다. 한국에서 훌륭한 조직을 만든다는 것은 리더의 지원없이는 불가능하다는 것이다. 물론 가능할 수도 있으나 그 때가 되면 이미 내가 그 구성원이 되기에 늦었을 것 같다. 한마디로 비효율적이라는 것이다. 내가 처음부터 새 조직을 만드는 것이 더 빠르겠다는 판단이 든다.


the best case는 daum 등과 같은 훌륭한 회사에서 생각을 실천하는 것이었다. 그러나 그런 훌륭한 곳은 나를 받아주기엔 내가 너무 부족한가보다.
두번째 목표는 있는 조직은 훌륭한 조직으로 만드는 것이었다. 서두에 이야기한 것 처럼 효율면에서 좋지 않을 것으로 보인다.
세번째 계획은 내가 원하는 것들을 스스로 조금씩 만들어나가는 것이다.


훌륭한 기술을 좋은 사람이 잘 사용하면 분명 세상을 이롭게 할 수 있을 거라 믿는다. 결국 내가 하고 싶은 것 아닌가.  지치지 말고 하나씩 하나씩 만들어나갔으면 좋겠다. 내 자신을 칭찬하고 다독이면서, 때로는 다그치면서 생각을 실천해야겠다.

이직 결정. 새로운 출발을 앞두고.

12월 20, 2010


정말 정말 오랫동안 블로그를 나두고 있었습니다. 마지막 글이 2010년 11월 10일이네요. 이직을 한다는 것(재직중인 상태로)이 무척 어려운 일이군요. 이번에는 정말 심사숙고하고 여기저기 골라서 하다보니 더 그렇답니다.

올해 초부터 도전했었던 DAUM은 14번 낙방하고 기타 다른 포털도 모두 낙방했습니다. 크게 힘든 일도 아니고 계속 도전하는 거야! 라고 마음먹은 것인데도 정신적 쇼크는 오더군요. 생각보다 더 쓰라립니다. 연말이 다가오면서 10월 즈음인가 이직의 기준을 다시 세우고 방향을 좀 더 다양하게 바꾸었습니다. 일단 회사를 골라야 하는데, 첫번째 조건은 상장사(유가 증권, 코스닥)입니다. 제 “그 분”께선 안정성을 원하거든요. 뭐, 많은 아내들의 마음이 거의 그렇지만 맞벌이하는 저 아내도 그렇답니다. 두번째 조건은 제품 또는 자사 서비스가 있는냐 하는 것입니다. 브랜드죠. 자기 브랜드 즉, 알릴만한 이름을 갖고 있는 회사입니다. 브랜드가 있다면 “가치”에 대해서 소홀하게 생각하지 않을 거라는 추측에서 기인한 기준입니다.(어찌보면 무임승차가 아닌가 하는 생각이 들 정도로 도전적인 것과는 거리가 있군요. -_-;;) 세번째는 경영진이 생각하는 엔지니어에 대한 좋은 관점입니다. “기술이 사람을 이롭게 한다.”는 제 생각을 실천하려면 엔지니어가 우대받는 회사여야 할 거라는 추측이죠. 네번째는 재벌 대기업의 영향이 적은 회사입니다. 사실 이 네번째 기준이 꽤 어려운데요, 대한민국이 재벌민국이라는 건 누구나 알고 있으니까요. 그래도 되도록… 이라는 생각입니다. 이 네가지 기준들로 회사를 골라내니 그래도 꽤 많답니다. 한 50군데는 넘게 지원을 한 것 같군요.

위의 기준에 해당하는 회사들은 어느 정도의 규모도 있고, 대게 채용관련 시스템(웹)을 갖추고 있습니다. 그래서 이력서, 자기소개서 등의 서류를 작성할 때 웹을 사용하지요. 이게.. 엄청 불편해요. 포멧도 다 다르고, 질문도 서로 다르고 해서 매번 새로 써야 하거든요. 퇴근해서 집안일 쪼금에 아들 재우고 하면 밤 10시 반 전후인데 그 때 부터 이력서, 자기소개서를 작성하면 금새 새벽 2시가 되지요. 재미있는 일도 아니니 금방 지치고 해서 침대로 떡실신합니다. 다음 날 출근하고.. 또 반복이죠.

참 안타까운 것이 위의 기준에 해당하는 회사는 하나같이 서울에 위치하고 있습니다. 다음(제주)이나 NHN(춘천) 등 규모도 크고 지방에 연구/개발 시설(사무실)을 갖추는 곳도 있고, 대전, 대구, 부산 등 광역시에도 있기는 하지만 가뭄에 콩나듯이 있지요. 하여간 서울이라는 거죠. 제가 서울 태생이지만 서울에서 산다는 것을 끔찍히도 싫어하는데 결국 서울로 가게 되는군요.

11월 초 부터 면접일정이 하나 둘 잡혔습니다. 재직중이라고 양해를 구하면 안통하는 회사도 있고요, 주말에 시간을 내 주는 회사도 있고, 밤 늦게 까지 기다리는 회사도 있답니다. 거의 모든 주말에 면접일정으로 채워지고 평일 퇴근 후에도 부리나케 서울로 올라갔습니다. 면접은 10번 넘은 것 같네요. 게임 회사도 있었고, 통신회사도 있었고, 포털 등 면접 본 회사들은 꽤 다양했습니다. 회사는 저를 면접보고 저 또한 회사를 면접봅니다. 상장사라면 재무구조가 공개되어 있기 때문에 어느 정도 추측이 가능합니다.(물론 이중 장부 등 트릭을 쓰면 어쩔 수 없죠.) 여러번 떨어지다가 세 곳에서 적극적으로 저를 채용하려고 했고 결국 한 회사를 결정하였습니다. 결정하는데 고민을 많이 하게 됩니다. 한 곳에서 정년을 보고 싶은 마음도 있고, 가장의 무게도 있고, 제 꿈도 있으니까 쉬운 결정은 아닙니다. 그러나 쉽게 결정되더군요. “코스닥이잖아, 회사 건물도 있잖아.”

저는 서울 태생이지만 서울을 무척이나 싫어합니다. 그런데 서울로 가게 되는군요. 그리고 아마도 정착하게 될 것입니다. 당장은 집을 마련할 돈이 부족하기 때문에 주말부부/주말아빠를 해야 하지만 한 2년 후면 집을 구하여 정착할 예정입니다. 회사를 결정하는데 위에서 말한 간단한 이유보다는 더 큰 이유가 심리에 깔려있었습니다. 결정하기 하루 전 퇴근하는 버스에서 보게 된 저녁 주부 TV 프로그램에서 회사원에서 주부로, 그리고 유아용품 디자인 및 판매로 성공하고 있는 스토리를 보며 제가 정말 하고 싶은 일이 무엇인지를 또 생각하게 되었습니다.(수백번도 더 생각한 것인데 또 합니다.) 저는 한편으로 계속 게임을 만들고 싶었습니다. 게임을 만든다는 것은 IT 미디어의 총아이고 높은 난이도와 멋진 결과물을 만드는 것이죠. 그런데 그게 아니었습니다. 전 제 눈으로 동작하는 것을 보고 즐길 수 있는 것, 그리고 더 발전할 수 있는 것 중에서 “살아있는 로봇”을 만들고 싶었던 겁니다. 머리속에서 “로봇”을 그려보니 “아, 그렇구나.”하는 생각이 들었습니다. 많이 늦었을지도 모르지만 지금이라도 확실히 알 수 있다는 것에 감사합니다.

아무리 좋은 회사와 장미빛 미래라고 하더라도 막상 그 배에 오르게 되면 생각했던 것과 많이 다르겠지요. 그러나 확실한 방향과 건강한 몸과 마음, 그리고 지지해주는 가족이 있다면 지금까지보다는 내일이 더 즐거울 가능성이 높을 겁니다.

P.S 이제 블로깅도 더 많이 할 수 있겠지요.

WebGL 공부하다가 canvas 2D

10월 11, 2010

짬내서 WebGL을 들여다보는 도중에 갑자기 떠오른 게.. “3D도 되는데 2D는 안되나?” 하는 것이었습니다. 검색해보면 바로 나오는데요, 엄청 간단합니다.

1
2
3
4
5
6
7
var context = document.getElementById(canvas_id).getContext("2d");
context.beginPath();
context.moveTo(x1, y1);
context.lineTo(x2, y2);
context.stroke();
context.closePath();
context.arc(x, y, radius, start_angle, end_angle, anticlockwise);

이런 식이죠.

이미지도 추가할 수 있는데요.

1
2
3
4
5
6
var context = document.getElementById(canvas_id).getContext("2d");
var img = new Image();
img.onload = function() {
	context.drawImage(img, x, y, width, height);
};
img.src = image_url;

여기까지는 꽤 간단합니다만, 베지어곡선이나 여러가지 선을 이은 path까지 하고 알파채널을 사용하면 조금씩 복잡해집니다. 오늘은 라이브러리 구성까지도 못하고 돌아가는지만 확인했네요. 소스는 xp-dev의 WebGL 공부용 프로젝트(WebGL 공부중 포스팅 참조)에 넣어놨습니다. 보고 싶으신 분들은 언제나 checkout!

html 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>2D Lesson 1</title>
<script type="text/javascript" src="js/handler.js"></script>
<style>
input[type=text] {
	width: 30px;
}
canvas { border: 2px solid #ff00ff; float: left; margin-right: 20px; margin-bottom: 20px; background-color: #000000;}
</style>
</head>
<body onload="javascript:handler.init();" onkeydown="javascript:handler.keyHandler(event);">
<div id="interface_div">
<form name="interface_form">
	line : (<input type="text" name="line_x1" value="0"/>,<input type="text" name="line_y1" value="0"/>) to (<input type="text" name="line_x2" value="100"/>,<input type="text" name="line_y2" value="100"/>)<input type="button" onclick="javascript:handler.line_to_test();" value="line_to Text"/><br>
	circle : (x<input type="text" name="circle_x" value="30"/>,y<input type="text" name="circle_y" value="30"/>) radius<input type="text" name="circle_radius" value="20"/> (angle start<input type="text" name="circle_start_angle" value="0"/>,angle end<input type="text" name="circle_end_angle" value="360"/>)<input type="button" onclick="javascript:handler.draw_circle_test();" value="draw_circle test"/><br> 
	image : (x<input type="text" name="image_x" value="0"/>,y<input type="text" name="image_y" value="0"/>),(width<input type="text" name="image_width" value="100"/>,height<input type="text" name="image_height" value="100"/>)<input type="button" onclick="javascript:handler.draw_image_test();" value="image test"/><input type="button" onclick="javascript:handler.clear_rect_test();" value="clear rect test"/><br> 
	test : <input type="button" onclick="javascript:handler.test();" value="test"/> 
</form>
</div>
<canvas id="lesson1-canvas" width="500" height="500" border="3"></canvas>
</body>
</html>

자바스크립트 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
var KEY = { RIGHT:39, UP:38, LEFT:37, DOWN:40 };
 
var sa2d = {
	descript : ""
	, canvas : null
	, context : null
	, init : function(canvas_id) {
		sa2d.canvas = document.getElementById(canvas_id);
		sa2d.context = sa2d.canvas.getContext("2d");
	}
	, line_to : function(x1, y1, x2, y2) {
		var context = sa2d.context;
		context.beginPath();
		context.moveTo(x1, y1);
		context.lineTo(x2, y2);
		context.stroke();
		context.closePath();
	}
	, clearRect : function(x, y, width, height) {
		var context = sa2d.context;
		context.clearRect(x, y, width, height);
	}
	, draw_circle : function(x, y, radius, start_angle, end_angle, anticlockwise) {
		var context = sa2d.context;
		context.beginPath();
		context.arc(x, y, radius, start_angle, end_angle, anticlockwise);
		context.stroke(); //context.fill();
		context.closePath();
	}
	// https://developer.mozilla.org/en/Canvas_tutorial/Using_images
	, draw_image : function(image_url, x, y, width, height) {
		var context = sa2d.context;
		var img = new Image();
		img.onload = function() {
			context.drawImage(img, x, y, width, height);
		};
		img.src = image_url;
	}
};
 
var handler = {
	descript : ""
	, init : function() {
		if(sa2d.context === null) {
			sa2d.init("lesson1-canvas");
		}
	}
	, line_to_test : function() {
		var form = document.getElementsByName("interface_form")[0];
		var x1 = form.line_x1.value;
		var y1 = form.line_y1.value;
		var x2 = form.line_x2.value;
		var y2 = form.line_y2.value;
		sa2d.line_to(x1, y1, x2, y2);
	}
	, draw_circle_test : function() {
		var form = document.getElementsByName("interface_form")[0];
		var x = form.circle_x.value;
		var y = form.circle_y.value;
		var radius = form.circle_radius.value;
		var start_angle = form.circle_start_angle.value;
		var end_angle = (Math.PI * 2) / form.circle_end_angle.value;
		var anticlockwise = true;
		sa2d.draw_circle(x, y, radius, start_angle, end_angle, anticlockwise);
	}
	, draw_image_test : function() {
		var form = document.getElementsByName("interface_form")[0];
		var x = form.image_x.value;
		var y = form.image_y.value;
		var width = form.image_width.value;
		var height = form.image_height.value;
		sa2d.draw_image("images/pororo.jpg", x, y, width, height);
	}
	, clear_rect_test : function() {
		var form = document.getElementsByName("interface_form")[0];
		var x = form.image_x.value;
		var y = form.image_y.value;
		var width = form.image_width.value;
		var height = form.image_height.value;
		sa2d.clearRect(x, y, width, height);
	}
	, keyHandler : function(event) {
		var code = event.keyCode;
		switch(code) {
		case KEY.UP:
			sa2d.clearRect(0, 0, 10000, 10000);
			var form = document.getElementsByName("interface_form")[0];
			form.image_y.value = parseInt(form.image_y.value) - 10;
			handler.draw_image_test();
			break;
		case KEY.DOWN:
			sa2d.clearRect(0, 0, 10000, 10000);
			var form = document.getElementsByName("interface_form")[0];
			form.image_y.value = parseInt(form.image_y.value) + 10;
			handler.draw_image_test();
			break;
		case KEY.LEFT:
			sa2d.clearRect(0, 0, 10000, 10000);
			var form = document.getElementsByName("interface_form")[0];
			form.image_x.value = parseInt(form.image_x.value) - 10;
			handler.draw_image_test();
			break;
		case KEY.RIGHT:
			sa2d.clearRect(0, 0, 10000, 10000);
			var form = document.getElementsByName("interface_form")[0];
			form.image_x.value = parseInt(form.image_x.value) + 10;
			handler.draw_image_test();
			break;
		}
	}
	, test : function() {
 
	}
};

P.S 웃기는게 context.clearRect 함수는 영 안먹더군요. 위치나 크기가 다릅니다. 왜 그런지 알려주실분 계실까요? ~_~

이미 핑을 보냈습니다:

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org