어쩌다보니 그림판에 대한 기능을 구현하게 되었다.

성능 개선을 위해서 이것저것 다 해봤지만 결국은 Fail... 마음이 아프다.


Canvas 를 간단하게 설명해보자면 웹상에서 그래픽을 그리기 위한 하나의 엘리먼트라고 할 수 있다.


정확히는 Canvas 는 하나의 컨테이너일 뿐이고, 

컨테이너에 그리기 위해선 JavaScript 를 이용해서 그려줘야 한다.

(SVG 라고 다른 성향의 엘리먼트가 있다. 필요하면 찾아보자.)


Canvas 는 비트맵 기반, SVG 는 벡터 기반이니 참고하도록 하자.




간단한 예제를 통해서 캔버스의 사용을 익혀보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- canvas.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Canvas Painter</title>
    <style type="text/css">
        canvas{border: 1px solid black};
    </style>
</head>
<body>
    <div>
        <canvas id="canvas" width="500" height="500">
 
        </canvas>
    </div>
 
    <script src="canvas.js"></script>
</body>
</html>
cs


1
2
3
4
5
6
7
8
9
10
11
// canvas.js
window.onload = function(){
    var canvas = document.getElementById("canvas");
    draw(canvas);
}
function draw(canvas){
    var ctx = canvas.getContext("2d");
    ctx.moveTo(30100);
    ctx.lineTo(80100);
    ctx.stroke();
}
cs


HTML 파일에 대한 설명은 생략


코드를 보면 간단하게 예측할 수 있다.

직선을 그리는 법을 알았으니, 마우스 이벤트에 따라 선을 그려주는 펜 기능을 만들어보자.



먼저 canvas.js 의 뼈대를 만든다.

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
// canvas.js
var pos = {
    drawable: false,
    x: -1,
    y: -1
};
var canvas, ctx;
 
window.onload = function(){
    canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d");
 
    canvas.addEventListener("mousedown", listener);
    canvas.addEventListener("mousemove", listener);
    canvas.addEventListener("mouseup", listener);
    canvas.addEventListener("mouseout", listener);
}
 
function listener(event){
    switch(event.type){
        case "mousedown":
            initDraw(event);
            break;
 
        case "mousemove":
            if(pos.drawable)
                draw(event);
            break;
 
        case "mouseout":
        case "mouseup":
            finishDraw();
            break;
    }
}
cs

각각의 이벤트를 전부 설정했고, 각각 이벤트마다 행동을 정의하면


자 그럼 해당 이벤트마다 코드를 작성하자.


initDraw() : 클릭 했을 때 버튼을 누른 순간 down이벤트 발생하고, moveTo() 를 이용하여 해당 좌표로 pos 를 변경시켜준다.

draw() : down상태에서 이동을 하면 move이벤트가 발생하고, lineTo() 를 이용해서 라인을 그려준다.

finishDraw() : 마우스가 캔버스에서 벗어나면 out 이벤트, 버튼을 떼는 순간 up 이벤트가 발생하며, 그리기를 중지한다.


각 함수를 구현해본다.

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
function initDraw(event){
    ctx.beginPath();
    pos.drawable = true;
    var coors = getPosition(event);
    pos.X = coors.X;
    pos.Y = coors.Y;
    ctx.moveTo(pos.X, pos.Y);
}
 
function draw(event){
    var coors = getPosition(event);
    ctx.lineTo(coors.X, coors.Y);
    pos.X = coors.X;
    pos.Y = coors.Y;
    ctx.stroke();
}
 
function finishDraw(){
    pos.drawable = false;
    pos.X = -1;
    pos.Y = -1;
}
 
function getPosition(event){
    var x = event.pageX - canvas.offsetLeft;
    var y = event.pageY - canvas.offsetTop;
    return {X: x, Y: y};
}
cs

beginPath() 라는건 새로운 경로를 지정할때 사용한다.

pos.drawable 은 클릭 상태인지 확인하는 변수다.

(event 객체를 보면 button, buttons 라는 properties 가 있다. 현재는 좌,우 클릭 전부 가능하지만, 나중에는 저 properties 를 활용해서 다른 기능을 넣어보자.)




간단한 기능만 구현이 되었지만, 나머지도 응용의 연속이다.

사각형 그리기, 원 그리기, 되돌리기 등등 여러가지 기능을 직접 구현해보자.





캔버스 예제:


'Programing > Web' 카테고리의 다른 글

[Web Http] CORS 란 무엇인가 ?  (0) 2017.01.28


먼저 글을 읽으시기 전에 본문의 내용은 전부 저만의 주관적인 글이라고 말씀드립니다.

물론 정답도 없고, 이게 정답이라고 쓰는것도 아님 ..!



최근 참 많은 생각이 드는 것 같다. 


최근에 첫입사를 하게 되었고, 가장 생각이 많이 신경 쓰이는 것 중 하나가 커리어 관리인데 해당 글을 읽게 되었다.

http://www.ciokorea.com/news/32813



글을 읽어보면 결국 자신의 흥미가 떨어지다 보니 자연스레 나가 떨어진(?) 경우로 보인다.


뭐.. 이유는 글의 내용에도 있지만.. 정말 다양한 이유가 존재할거다.


당장 나라도 흥미가 떨어지면 자연스레 시간 투자나 학습에 소홀해질거 같다.


그렇다면 이런 경력의 막힘은 어떻게 해결할 하지 ?




다시 말하지만 본인의 주관적인 재해석이다.



1. 자신의 위치를 파악하고 기업에 필요 인사가 되어라.


이것은 기업의 니즈에 관련 된 걸로 보인다.

회사에 필요한 인재라면 얼마를 주던 고용하는건 당연하다.

하지만, 말이 쉽지..... 어떻게 변화를 해야될까 ?


코딩 부트캠프 핵 리엑터의 공동 창업자 숀 드로프트는 이렇게 말했다고 한다.

"일주일에 한시간만이라도 온전히 경력에 대한 고민을 하라"



근데.... 어떤 고민을 해야되지 ?


글의 내용에 따르면 본인의 나쁜 습관을 교정하라고 한다.


나 자신도 아직 장점보단 단점이 훨씬 많다고 생각한다.

이러한 단점을 커버하려고 열심히 노력은 하고 있지만.. 

잘 안되는 것 같다 ㅠㅠ


정답은 없어 보이지만.. 좀 더 좋은 선택을 하기 위한 고민이 필요하다는 건 알겠다.


그리고 겸손해지자 ..! 막상 다 아는것 같아도 모르는것 수두룩하다.

뭐.. 이 글을 읽는 모든 독자들은 공감할만한게

공부할수록 모르는게 많아진다는건 정말 신기한 경험이다 ...ㅋ





2. 스스로의 가치를 인식하라

이것도 역시 해석하기 나름일 듯 하지만.. 1번의 내용과 많이 겹치는걸로 보인다.

화법 얘기도 나오고 하지만.. 결국엔 기업의 니즈에 맞추라는 내용이 중점으로 보인다.


결국 기업의 니즈를 맞추라는 내용지만, 그 기업의 니즈란 무엇인가?

결국엔 같이 일하는 동료들의 평가나 인식이 중요해보인다.

진행하는 업무 또한 주도적인 인재가 된다면 회사의 영향력은 커질수밖에 없다.


결국 종합해보면 기업의 방향성을 제시하는 선두자가 되어라 !

능동적이고 주도적으로 진행 해보려 노력해보면 될 것 같다.


하지만, 필자도 그렇지만 다른 여러 사람들도 마찬가지일거라 생각되는 것 중 하나는 

어느 특정 기술 X에 꽂히면 그것만 주구장창 파는 경우가 생긴다 -_-...


글의 내용에는 흥미로운 기술적 문제를 발견하거나 다루는데 흥미를 느끼는 사람들을 예시로 드는데

딱 필자가 그렇다... ㅇㅇ....




3. 틀에서 벗어나라

음.. 이건 별 생각이 들지 않지만 결국 말하고자 하는건 거의 하나로 보인다.

회사에서 영향력이 커져라..!


작문 연습을 하란 소리도 있는데.... 

필자도 필력을 키우기 위한 이유로 블로그를 개설하고 포스팅을 하는것이었다 ㅠ

공부한단 핑계로 1년정도 운영 안한건 비밀...


커뮤니케이션 얘기도 많이 언급이 된다.

결국엔 동료의 평가나 인식으로 나 자신이 평가되기 때문에 이건 당연한 것 처럼 보인다.

       딸랑딸랑      

물론 저런 딸랑이 짓 하란건 아니다. 정말 잘한다면 해보는것도 ....?


나머지는 뭐 협상능력을 길러라, 균형 찾기 등 다양한 내용이 존재한다.


협상 능력이란건 이것저것 잘 재볼수 있는 시야를 가지란 소리로 들리는데, 

앞서 말했던 모든 내용의 종합판이라고 볼 수 있다.


종합해보면 자신의 가치를 인식하고 그 가치를 어필할 수 있어야 한다 라는 글이다.

부가적으로 그 가치를 어떻게 만들어낼까에 대한 내용도 있긴 하지만..


정답이 없기 때문에 판단은 각자 본인이 하도록 하자 



균형 찾기라는건 업무와 자신의 생활의 균형을 갖추라는 소리다.

뭐 당연히 일에 파묻혀 사는것보단 대부분의 경우 개인적인 시간을 갖는걸 선호하지 않는가 ?


그렇기 때문에 야근이 적은 회사를 가고 싶어하고 말이다.


필자도 야근은 능률과 직결되지 않는다고 보고 있다.

물론 물리적으로 야근이 필요하다면 해야하는건 당연하지만,

야근을 해서 업무 능률이 오른다곤 볼 수 없겠다 -_-..

\




갖다 붙이기 애매할 수 있겠지만 ..

Dan Pink 의 촛불문제를 보면 알 수 있다.

https://www.ted.com/talks/dan_pink_on_motivation?language=ko

https://brunch.co.kr/@jade/186


인센티브로 인한 동기부여 실험인 것인데,

작성자의 생각은 당근과 채찍과 같은 인센티브 제도보다는 주도성, 전문성, 목적 등의 이유로 인한 내적 동기부여가 

더 중요하다. 혹은 문제 해결에 도움이 된다. 라고 해석했다.


이게 뭔말인고... 하니 결국엔 자기 주도적이어야 능률 향상이 된다 라는것이다.


결국엔 야근도 자기 주도적으로 필요에 의해 해야지

과장님 퇴근 안하셨다고 옆에서 자리 지키고 축구 보는건 회사를 위한 것이 아니라는 소리다 -_-...


회사를 위하는 일이란 업무에 집중하고 능률을 올릴 방법을 생각해야 한다.

기업에 돈 많이 벌어 줘야 내가 돈을 많이 받지 ..!

'잡담' 카테고리의 다른 글

책 구입 예정 목록 !  (0) 2016.01.31
과제 꿀팁  (0) 2016.01.13
워게임 목록2  (0) 2015.12.26
Wordlist Download  (0) 2015.11.18
WarGame(워게임) 목록  (0) 2015.09.22


정말 오랜만에 들러서 포스팅을 하는 것 같다.


한동안 공부만 하고 정리를 안했더니 도저히 감당이 안된다..


각설은 그만하고, Git 이란 무엇인가? 먼저 살펴볼 필요가 있어 보인다.







Git 이란 프로그램 등의 소스코드 관리를 위한 분산 버전 관리 시스템이다. 라고 적혀있다.

출처 위키 : https://ko.wikipedia.org/wiki/%EA%B9%83_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)



그럼 분산 버전 관리 시스템이란 무엇인가 ?


버전관리란 ?

출처 위키 : https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC



간단하게 말을 하자면 버전 별로 관리를 해주는 프로그램이다. 라고 할 수 있을 것 같다.


하나의 프로그램에도 여러가지 기능을 추가하고 덧대다 보면 버전이 높아진다.


게임을 보더라도 그렇다. 대규모 업데이트가 이뤄지게 된다면 게임의 버전이 높아지지 않는가?


이와 같은 맥락이다.


당연히, 게임에만 적용되는게 아닌 여러가지에 전부 개념을 적용시킬 수 있다.



그렇다면 이 Git 이란 것이 무엇인가 더 살펴볼 필요가 있겠다.


자세한 내용을 보기 위해 영문 위키를 살펴보면

https://en.wikipedia.org/wiki/Git



리눅스의 창시자라고 불리우는 리누즈 토발즈가 만든 커널 버전 관리를 위해 만든 툴이라고 할 수 있다.


이 Git이란 걸 간단하게 보면 동일 파일을 수정하더라도, 버전별로 파일의 내용이 달라질 수 있다.

(일기장을 예로 들면 하루마다 일기가 추가되지 않는가 ?)


Git은 위와 같은 작업 파일들의 변화를 추적해준다.





이게 왜 좋은걸까 ?



다른 사람들과 협업을 할 때, 기능 추가라던지 기능 수정 등의 작업을 할 때

잘못 수정하여 버그가 생긴다던가, 빌드조차 안되는 경우가 있을 수 있고

이전버전으로 되돌아 간다던가, 실험적인 기능 추가 등등...

여러가지의 경우가 있겠지 ?


Git 은 이런 특성에 맞게 잘 만들어져 있다.


협업 시 작업 파일의 변화를 추적해주고, 각각의 작업들을 동기화를 해줄 수 있다.


물론, 오픈소스이며 Git 의 사용은 자유!









Git 이란게 뭔지 대충은 알겠는데 ...


그럼 Github, Gitlab, Bitbucket 등은 무슨 기능을 하는걸까 ?





한마디로 정의하면, 저장소라고 말할 수 있다.




Git 이란 프로그램을 통해 작업 파일들의 버전을 관리 한다고 말했는데,

버전들에 대한 정보를 저장할 저장소가 필요하지 않겠는가?


물론, 로컬에만 저장이 가능하긴 하다.


하지만 협업 시 USB 에 담아서 주고 받기는 너무 불편하지 않은가...? (그럴거면 Git은 왜써 !!!)


그래서 공통된 하나의 저장소를 만들고, 로컬의 버전들과 저장소의 버전들 동기화 해주며 작업하는 것이다.



저장소에는 public, private 두가지 형태의 저장소가 제공이 되는데


단어 그대로 public공개 저장소, private비공개 저장소를 뜻한다.



각 서비스 별로 라이센스가 다르다.


Github 의 경우 public 은 무료이지만, private 의 경우는 매달 결제를 해야 사용할 수 있다.


마찬가지로 Gitlab, Bitbucket 각각 조건이 다르다.



공홈에 가보기만 해도 각각 나오니 직접 확인 해보길 바란다!







'Programing > Basic' 카테고리의 다른 글

문자 인코딩  (0) 2016.01.15
기초) 컴퓨터 구조  (0) 2015.09.25
네트워크의 정의  (0) 2015.09.24

+ Recent posts