Coding/Python 삽질기2020. 2. 29. 23:20

주말의 무료함을 달래고자, 파이썬으로 간단히 Timer 앱을 만들어 보았습니다.

https://github.com/chobocho/timer

 

chobocho/timer

simple timer for windows. Contribute to chobocho/timer development by creating an account on GitHub.

github.com

 

 

먼저 아래아 같이 간단히 User case diagram을 대충 그려 봅니다.

그리고 star uml을 사용해서 대충 class diagram을 그립니다.

그리고 star uml의 code generator 기능을 이용해 skeleton code를 생성 합니다.

실행파일:

chobotimer_tc3.zip
8.66MB

'Coding > Python 삽질기' 카테고리의 다른 글

[Python] venv 사용  (0) 2020.04.15
Minim / 간단한 메모관리 툴 (TK3)  (0) 2020.01.16
Minim / 간단한 메모관리 툴 (SL6)  (0) 2019.12.10
Posted by chobocho
Coding/Java 삽질기2020. 1. 23. 23:30

Android 제비뽑기 앱 만들기 (II)

간만에 마음에 여유가 생겨, 앱을 약간 수정하였습니다. ^^

결과물 
Source code:  https://github.com/chobocho/choose_one 
Play store:  https://play.google.com/store/apps/details?id=com.chobocho.chooseone 

앱의 목적 
  
2명이상의 사용자들 중 한 명을 뽑아 준다 (사다리 타기) 
  
사용 예:  커피 쏘기 
앱의 기본 동작 설계

 

앱의 요구 사항 분석 
  
앱을 실행 후 2명 이상이 화면에 손가락을 올리면, 3초 뒤에 한 명을 선택해 준다 
손가락을 올려 둔 상태에서 3초 안에 손가락을 떼거나, 추가하면 다시 3초를 센다 
손가락을 올려 둔 상태에서 3초 안에 손가락을 모두 떼면, 동작을 멈춘다 
60초 동안 아무도 손가락을 올리지 않으면 자동으로 앱이 종료 된다

  
기초 설계
 
앱의 동작을 위하여 내부적으로 IDLE, SELECTING, SELECTED 3개의 State를 가지는 State machie 을 구상하였다.
State의 변화는 아래와 같다. (편의 상 시간의 변화를 tick이란 단어로 표시했다.)

Posted by chobocho
Coding/Python 삽질기2020. 1. 16. 00:08

Minim은 간단한 메모 관리 앱니다.

어떻게 만들었나: https://chobocho.tistory.com/2461418

 

Posted by chobocho
Coding/JavsScript 삽질기2020. 1. 13. 01:04

소개 https://chobocho.tistory.com/2461396
실행하기 http://www.chobocho.com/javascript/painter.html
전체 소스코드 https://github.com/chobocho/painter

 

chobocho/painter

Painter written html5. Contribute to chobocho/painter development by creating an account on GitHub.

github.com

9.1 Undo/Redo 기능 구현

Undo/Redo 기능을 구현하기 위해서는 모든 사용자의 동작을 저장해야 합니다

그럼 사용자의 동작을 저장하기 위해서, 선을 그리거나, 원을 그리는 동작을

아래와 같이 커맨드로 정의 해야 합니다.

마우스로 그린 그림

color red 
color lightblue 
rect 8 6 713 356 F 
color white 
ellipse 190 116 93 44 F 
ellipse 456 115 87 42 F 
color black 
ellipse 226 116 31 31 F 
ellipse 489 113 29 30 F 
ellipse 420 277 0 0 F 

그리고 그 커맨드를 stack에 저장합니다.

 

Posted by chobocho

소개 https://chobocho.tistory.com/2461396
실행하기 http://www.chobocho.com/javascript/painter.html
전체 소스코드 https://github.com/chobocho/painter

8.1 저장하기

painter.html에 save를 위한 버튼을 추가 합니다.

<div>
  <a id="saveImage" download="image.png">
      <INPUT type="button" value="Save" onClick="saveImage()" />
  </a>
</div>

그리고, painter.js에 saveImage()함수를 추가합니다.

function saveImage() {
  console.log("saveImage()");
  var imageName = document.getElementById("title").value;
  console.log(imageName.lenght);
  if (imageName.length == 0) {
    imageName = "image";
  }
  imageName += ".png";
  var savedImage = document.getElementById("saveImage");
  var image = document
    .getElementById("canvas")
    .toDataURL("image/png")
    .replace("image/png", "image/octet-stream");
  savedImage.setAttribute("download", imageName);
  savedImage.setAttribute("href", image);
}

여기 까지 소스코드는 아래 링크를 참고 하시면 됩니다.

https://github.com/chobocho/painter/commit/dceabd6f3ace4d39e21260d593dc55a2d15e47df

Posted by chobocho
Coding/JavsScript 삽질기2019. 12. 25. 23:49

소개 https://chobocho.tistory.com/2461396
실행하기 http://www.chobocho.com/javascript/painter.html
전체 소스코드 https://github.com/chobocho/painter

 

chobocho/painter

Painter written html5. Contribute to chobocho/painter development by creating an account on GitHub.

github.com

 

7.1 Refactoring

선, 원등을 그릴때, 반복되는 코드를 preprocessMouseUp(), postprocessMouseUp() 으로 묶습니다.

function circleMouseMove(event) {
  if (!painter.isDraw()) {
    return;
  }
  var currentPos = getMousePosition(event);
  cvs.beginPath();
  // Need a delay
  cvs.clearRect(0, 0, canvas.width, canvas.height);
  cvs.drawImage(bufCanvas, 0, 0);

  cvs.strokeStyle = painter.getColor();

  var circle = {
    X: Math.round((painter.shape.point.x + currentPos.X) / 2),
    Y: Math.round((painter.shape.point.y + currentPos.Y) / 2),
    R: Math.round(Math.abs(currentPos.Y - painter.shape.point.y) / 2)
  };
  cvs.arc(circle.X, circle.Y, circle.R, 0, Math.PI * 2);
  cvs.closePath();
  cvs.stroke();
}

위의 코드를 아래와 같이 수정하였습니다. 기존 함수 내부를 preprocess()와 postprocess()로 나누어서 묶은 것입니다.

Shape.prototype.preprocessMouseUp = function() {
  bufCtx.beginPath();
  bufCtx.strokeStyle = painter.getColor();
}

Shape.prototype.postprocessMouseUp = function() {
  bufCtx.closePath();
  bufCtx.stroke();

  cvs.clearRect(0, 0, canvas.width, canvas.height);
  cvs.drawImage(bufCanvas, 0, 0);

  this.setDrawMode(false);
}

function circleMouseMove(event) {
  if (!painter.isDraw()) {
    return;
  }
  
  painter.preprocessMouseMove();
  
  var currentPos = getMousePosition(event);
  var circle = {
    X: Math.round((painter.shape.point.x + currentPos.X) / 2),
    Y: Math.round((painter.shape.point.y + currentPos.Y) / 2),
    R: Math.round(Math.abs(currentPos.Y - painter.shape.point.y) / 2)
  };
  cvs.arc(circle.X, circle.Y, circle.R, 0, Math.PI * 2);
  
  painter.postprocessMouseMove();
}

 

7.2 나머지 도형 구현

직선, 원과 같이 삼각형, 직사각형에 대해서도 mouseDown, mouseMove, mouseUp에 대한 이벤트를 정의하고

painter 객체에 추가해 줍니다.

 

여기까지의 참고 자료는 아래 링크를 참고 하시면 됩니다.

https://github.com/chobocho/painter/tree/master/doc/tutorial/007

Posted by chobocho
Coding/JavsScript 삽질기2019. 12. 17. 00:22

소개 (https://chobocho.tistory.com/2461396)
실행하기 http://www.chobocho.com/javascript/painter.html
전체 소스코드 https://github.com/chobocho/painter

 

chobocho/painter

Painter written html5. Contribute to chobocho/painter development by creating an account on GitHub.

github.com

6.1 원 그리기

원을 그리는 함수를 추가합니다.

circle = new Shape("Circle");
circle.mouseAction = new MouseAction(circleMouseUp, circleMouseDown, circleMouseMove);
function circleMouseDown(event) {
  console.log("circleMouseDown");
  if (painter.isDraw()) {
    return;
  }
  bufCtx.drawImage(canvas, 0, 0);
  var startPos = getMousePosition(event);
  painter.shape.point.x = startPos.X;
  painter.shape.point.y = startPos.Y;
  painter.setDrawMode(true);
}

function circleMouseMove(event) {
  if (!painter.isDraw()) {
    return;
  }
  var currentPos = getMousePosition(event);
  cvs.beginPath();
  // Need a delay
  cvs.clearRect(0, 0, canvas.width, canvas.height);
  cvs.drawImage(bufCanvas, 0, 0);

  cvs.strokeStyle = painter.getColor();

  var circle = {
    X: Math.round((painter.shape.point.x + currentPos.X) / 2),
    Y: Math.round((painter.shape.point.y + currentPos.Y) / 2),
    R: Math.round(Math.abs(currentPos.Y - painter.shape.point.y) / 2)
  };
  cvs.arc(circle.X, circle.Y, circle.R, 0, Math.PI * 2);
  cvs.closePath();
  cvs.stroke();
}

function circleMouseUp(event) {
  if (!painter.isDraw()) {
    return;
  }

  var currentPos = getMousePosition(event);
  bufCtx.beginPath();
  bufCtx.strokeStyle = painter.getColor();

  var circle = {
    X: Math.round((painter.shape.point.x + currentPos.X) / 2),
    Y: Math.round((painter.shape.point.y + currentPos.Y) / 2),
    R: Math.round(Math.abs(currentPos.Y - painter.shape.point.y) / 2)
  };
  bufCtx.arc(circle.X, circle.Y, circle.R, 0, Math.PI * 2);
  bufCtx.closePath();
  bufCtx.stroke();

  cvs.clearRect(0, 0, canvas.width, canvas.height);
  cvs.drawImage(bufCanvas, 0, 0);

  painter.setDrawMode(false);
}

 

6.2 도형의 선택

원과 선을 선택 할 수 있도록 html 파일에 함수를 연결 합니다.

[paint.js]

function selectShape(choosedShape) {
  console.log("selectShape:" + choosedShape);
  painter.setShape(choosedShape);
}

Painter 객체에 선, 원을 tools라는 자료형에 추가를 합니다.

Painter.prototype.init = function () {
  line = new Shape("Line");
  line.mouseAction = new MouseAction(lineMouseUp, lineMouseDown, lineMouseMove);
  this.tools[line.name] = line;

  circle = new Shape("Circle");
  circle.mouseAction = new MouseAction(circleMouseUp, circleMouseDown, circleMouseMove);
  this.tools[circle.name] = circle;

  this.shape = this.tools["Line"];
  this.color = "black";
}
function onLoadPage() {
  
  // ...

  painter = new Painter();
  painter.init();
}

6.3 기타 수정 사항

color 값은 모든 도형이 공통적으로 사용하므로,
shape 에서 painter 객체로 이동을 합니다.

Painter.prototype.init = function () {
  // ...
  this.color = "black";
}

 

여기까지 소스코드:

https://github.com/chobocho/painter/tree/master/doc/tutorial/006/src

 

chobocho/painter

Painter written html5. Contribute to chobocho/painter development by creating an account on GitHub.

github.com

 

공감과 댓글은 큰 도움이 됩니다.

Posted by chobocho
Coding/Python 삽질기2019. 12. 10. 23:57

chobomemo에서  약간의 버그를 고치고, 이름도 변경하였습니다.

다운로드:

minim_SL6.2.zip
8.52MB
`

Minim은 간단한 메모 관리 앱니다.

개인, 회사, 공공기관 어디에서도 되는 무료 앱입니다. 

어떻게 만들었나: https://chobocho.tistory.com/2461418



출처: https://chobocho.tistory.com/ [Do it now!]

Posted by chobocho
Coding/JavsScript 삽질기2019. 12. 10. 02:06

소개:  https://chobocho.tistory.com/2461396

실행하기: http://www.chobocho.com/javascript/painter.html

전체 소스코드: https://github.com/chobocho/painter

 

경고  

주인장은 자바스크립트 초보입니다.  

자바스크립트 고수의 비급을 원하시는 분은 다른 자료를 참고 하시기 바랍니다.  

과도한 기대는 과도한 실망을 가져옵니다.    

본 강의는 자바스크립트만 사용합니다.  

크롬에서의 동작만 보장 합니다.  

Canvas 기초 사용법은 구글링하시면 친절한 강의가 많습니다

 

5.1 색상 변경 기능 구현

아래와 같이 painter.html 의 각 색상 아이콘에 selectColor() 함수를 연결 합니다.

painter.js에 아래와 같이 selectColor() 함수를 구현 합니다.

function selectColor(choosedColor) {
  console.log("selectColor:" + choosedColor);
  painter.shape.setColor(choosedColor);
}
function Shape(name_) {
    this.name = name_;
    this.point = new Point(0, 0);
    this.color = "black";
    this.state = false;
    this.filled = false;
    this.mouseAction;
}

Shape.prototype.setColor = function(color) {
    this.color = color;
}

Shape.prototype.getColor = function() {
    return this.color;
} 

그럼 아래와 같이 선을 그릴 때, 색상을 변경 할 수 있습니다.

 

여기까지 구현된 소스는 아래와 같습니다.

https://github.com/chobocho/painter/commit/7a79b5edc328ac81706280188f9525d4e17f4c09

Posted by chobocho
Coding/Python 삽질기2019. 12. 10. 01:18

chobomemo에서  약간의 버그를 고치고, 이름도 변경하였습니다.

다운로드:

minim_SL5.zip
8.52MB

Minim은 간단한 메모 관리 앱니다.

개인, 회사, 공공기관 어디에서도 되는 무료 앱입니다. 

어떻게 만들었나: https://chobocho.tistory.com/2461418

Posted by chobocho